diff --git a/.babelrc.json b/.babelrc.json new file mode 100644 index 0000000000..00ca841a4b --- /dev/null +++ b/.babelrc.json @@ -0,0 +1,16 @@ +{ + "sourceType": "unambiguous", + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "chrome": 100 + } + } + ], + "@babel/preset-typescript", + "@babel/preset-react" + ], + "plugins": [] +} diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000000..f172ac32de --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "0.27.3", + "commands": ["dotnet-csharpier"] + } + } +} diff --git a/.erb/configs/.eslintrc b/.erb/configs/.eslintrc new file mode 100644 index 0000000000..a6b6768bc1 --- /dev/null +++ b/.erb/configs/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off" + }, + "ignorePatterns": ["node_modules"] +} diff --git a/.erb/configs/webpack.config.base.ts b/.erb/configs/webpack.config.base.ts new file mode 100644 index 0000000000..fe8f6d01f2 --- /dev/null +++ b/.erb/configs/webpack.config.base.ts @@ -0,0 +1,114 @@ +/** Base webpack config used across other specific configs */ + +import webpack from 'webpack'; +import TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin'; +import webpackPaths from './webpack.paths'; +import { dependencies as externals } from '../../release/app/package.json'; + +let processType: string; +if ( + process.env.npm_lifecycle_script?.includes('webpack.config.renderer') || + process.env.npm_lifecycle_script?.includes('storybook') +) + processType = 'renderer'; +else if (process.env.npm_lifecycle_script?.includes('webpack.config.extension-host')) + processType = 'extension-host'; +else processType = 'main'; + +const configuration: webpack.Configuration = { + externals: [...Object.keys(externals || {})], + + stats: 'errors-only', + + module: { + rules: [ + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + use: { + loader: 'ts-loader', + options: { + // Remove this line to enable type checking in webpack builds + transpileOnly: true, + compilerOptions: { + module: 'esnext', + }, + }, + }, + }, + { + test: /.node$/, + loader: 'node-loader', + }, + ], + }, + + output: { + path: webpackPaths.srcPath, + // https://github.com/webpack/webpack/issues/1114 + library: { + type: 'commonjs2', + }, + }, + + /** Determine the array of extensions that should be used to resolve modules. */ + resolve: { + extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], + modules: [webpackPaths.srcPath, 'node_modules'], + // There is no need to add aliases here, the paths in tsconfig get mirrored + plugins: [new TsconfigPathsPlugins()], + fallback: { + crypto: false, + // We don't really need crypto in the browser/renderer at least for now, otherwise do: + // crypto: require.resolve('crypto-browserify'), + }, + }, + + plugins: [ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + }), + + new webpack.IgnorePlugin({ + checkResource(resource, context) { + // Don't include stuff from process folders in each others' packages. + // Ex: Don't include stuff from the main folder or @main... in renderer and renderer folder in main folder + + const isInMain = (res: string) => res.startsWith('@main') || res.includes('main/'); + const isInExtensionHost = (res: string) => + res.startsWith('@extension-host') || res.includes('extension-host/'); + const isInRenderer = (res: string) => + res.startsWith('@renderer') || + (res.includes('renderer/') && !res.includes('electron-log-preload')); + // Group of processes running in node: main, extension-host + const isInNode = (res: string) => res.startsWith('@node') || res.includes('node/'); + // Group of processes running as network clients: renderer, extension-host + const isInClient = (res: string) => res.startsWith('@client') || res.includes('client/'); + + let exclude = false; + switch (processType) { + case 'renderer': + exclude = isInMain(resource) || isInExtensionHost(resource) || isInNode(resource); + break; + case 'extension-host': + exclude = isInMain(resource) || isInRenderer(resource); + break; + default: // main + exclude = isInRenderer(resource) || isInExtensionHost(resource) || isInClient(resource); + break; + } + + // Log if a file is excluded just fyi + if (!context.includes('node_modules') && exclude) + console.log( + `${processType}: Resource ${resource}\n\tat context ${context}: ${ + exclude ? 'excluded' : 'included' + }`, + ); + return exclude; + }, + }), + ], +}; + +export default configuration; diff --git a/.erb/configs/webpack.config.eslint.ts b/.erb/configs/webpack.config.eslint.ts new file mode 100644 index 0000000000..3df7c1585d --- /dev/null +++ b/.erb/configs/webpack.config.eslint.ts @@ -0,0 +1,16 @@ +/* eslint import/no-unresolved: off, import/no-self-import: off */ +import webpack from 'webpack'; +import { merge } from 'webpack-merge'; +import webpackPaths from './webpack.paths'; +import rendererConfig from './webpack.config.renderer.dev'; + +const configuration: webpack.Configuration = { + resolve: { + // Must add extensions lib path here so eslint knows about the types provided by extensions + // Must add our special module config path so eslint knows about it as well + modules: [webpackPaths.extensionsLibPath, webpackPaths.srcDeclarationsPath], + }, +}; + +const eslintConfig = merge(rendererConfig, configuration); +export default eslintConfig; diff --git a/.erb/configs/webpack.config.extension-host.prod.ts b/.erb/configs/webpack.config.extension-host.prod.ts new file mode 100644 index 0000000000..db9a111f90 --- /dev/null +++ b/.erb/configs/webpack.config.extension-host.prod.ts @@ -0,0 +1,30 @@ +/** Webpack config for production extension-host process */ + +import path from 'path'; +import webpack from 'webpack'; +import merge, { mergeWithCustomize } from 'webpack-merge'; +import mainConfig from './webpack.config.main.prod'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + entry: { + 'extension-host': path.join(webpackPaths.srcExtensionHostPath, 'extension-host.ts'), + }, + + output: { + path: webpackPaths.distExtensionHostPath, + }, +}; + +const extensionHostConfig = mergeWithCustomize({ + customizeObject(a, b, key) { + if (key === 'entry') return b; + return merge(a, b); + }, +})(mainConfig, configuration); +export default extensionHostConfig; diff --git a/.erb/configs/webpack.config.main.prod.ts b/.erb/configs/webpack.config.main.prod.ts new file mode 100644 index 0000000000..97a3f7c147 --- /dev/null +++ b/.erb/configs/webpack.config.main.prod.ts @@ -0,0 +1,79 @@ +/** Webpack config for production electron main process */ + +import path from 'path'; +import webpack from 'webpack'; +import { merge } from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + devtool: 'source-map', + + mode: 'production', + + target: 'electron-main', + + entry: { + main: path.join(webpackPaths.srcMainPath, 'main.ts'), + preload: path.join(webpackPaths.srcMainPath, 'preload.ts'), + }, + + output: { + path: webpackPaths.distMainPath, + filename: '[name].js', + library: { + type: 'umd', + }, + }, + + optimization: { + minimizer: [ + new TerserPlugin({ + parallel: true, + }), + ], + }, + + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8888, + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and release builds + * + * NODE_ENV should be production so that modules do not perform certain development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + START_MINIMIZED: false, + }), + + new webpack.DefinePlugin({ + 'process.type': '"browser"', + }), + ], + + /** + * Disables webpack processing of __dirname and __filename. If you run the bundle in node.js it + * falls back to these values of node.js. https://github.com/webpack/webpack/issues/2010 + */ + node: { + __dirname: false, + __filename: false, + }, +}; + +const mainConfig = merge(baseConfig, configuration); +export default mainConfig; diff --git a/.erb/configs/webpack.config.preload.dev.ts b/.erb/configs/webpack.config.preload.dev.ts new file mode 100644 index 0000000000..92be8a222c --- /dev/null +++ b/.erb/configs/webpack.config.preload.dev.ts @@ -0,0 +1,69 @@ +import path from 'path'; +import webpack from 'webpack'; +import { merge } from 'webpack-merge'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + checkNodeEnv('development'); +} + +const configuration: webpack.Configuration = { + devtool: 'inline-source-map', + + mode: 'development', + + target: 'electron-preload', + + entry: path.join(webpackPaths.srcMainPath, 'preload.ts'), + + output: { + path: webpackPaths.dllPath, + filename: 'preload.js', + library: { + type: 'umd', + }, + }, + + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and release builds + * + * NODE_ENV should be production so that modules do not perform certain development checks + * + * By default, use 'development' as NODE_ENV. This can be overriden with 'staging', for example, + * by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + ], + + /** + * Disables webpack processing of __dirname and __filename. If you run the bundle in node.js it + * falls back to these values of node.js. https://github.com/webpack/webpack/issues/2010 + */ + node: { + __dirname: false, + __filename: false, + }, + + watch: true, +}; + +const preloadConfig = merge(baseConfig, configuration); +export default preloadConfig; diff --git a/.erb/configs/webpack.config.renderer.dev.dll.ts b/.erb/configs/webpack.config.renderer.dev.dll.ts new file mode 100644 index 0000000000..69d2759b44 --- /dev/null +++ b/.erb/configs/webpack.config.renderer.dev.dll.ts @@ -0,0 +1,72 @@ +/** Builds the DLL for development electron renderer process */ + +import webpack from 'webpack'; +import path from 'path'; +import { merge } from 'webpack-merge'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import { dependencies } from '../../package.json'; +import checkNodeEnv from '../scripts/check-node-env'; + +checkNodeEnv('development'); + +const dist = webpackPaths.dllPath; + +const configuration: webpack.Configuration = { + context: webpackPaths.rootPath, + + devtool: 'eval', + + mode: 'development', + + target: 'electron-renderer', + + externals: ['fsevents', 'crypto-browserify'], + + /** Use `module` from `webpack.config.renderer.dev.js` */ + module: require('./webpack.config.renderer.dev').default.module, + + entry: { + renderer: Object.keys(dependencies || {}), + }, + + output: { + path: dist, + filename: '[name].dev.dll.js', + library: { + name: 'renderer', + type: 'var', + }, + }, + + plugins: [ + new webpack.DllPlugin({ + path: path.join(dist, '[name].json'), + name: '[name]', + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and release builds + * + * NODE_ENV should be production so that modules do not perform certain development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + options: { + context: webpackPaths.srcPath, + output: { + path: webpackPaths.dllPath, + }, + }, + }), + ], +}; + +const rendererConfig = merge(baseConfig, configuration); +export default rendererConfig; diff --git a/.erb/configs/webpack.config.renderer.dev.ts b/.erb/configs/webpack.config.renderer.dev.ts new file mode 100644 index 0000000000..2895ed8a75 --- /dev/null +++ b/.erb/configs/webpack.config.renderer.dev.ts @@ -0,0 +1,262 @@ +import 'webpack-dev-server'; +import path from 'path'; +import fs from 'fs'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import chalk from 'chalk'; +import { merge } from 'webpack-merge'; +import { ChildProcess, execSync, spawn } from 'child_process'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + checkNodeEnv('development'); +} + +const port = process.env.PORT || 1212; +const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json'); +const skipDLLs = + module.parent?.filename.includes('webpack.config.renderer.dev.dll') || + module.parent?.filename.includes('webpack.config.eslint'); + +/** Warn if the DLL is not built */ +if (!skipDLLs && !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))) { + console.log( + chalk.black.bgYellow.bold( + 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"', + ), + ); + execSync('npm run postinstall'); +} + +const configuration: webpack.Configuration = { + devtool: 'inline-source-map', + + mode: 'development', + + target: ['web', 'electron-renderer'], + + entry: [ + `webpack-dev-server/client?http://localhost:${port}/dist`, + 'webpack/hot/only-dev-server', + path.join(webpackPaths.srcRendererPath, 'index.tsx'), + ], + + output: { + path: webpackPaths.distRendererPath, + publicPath: '/', + filename: 'renderer.dev.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(c|a)ss$/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?css$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + plugins: [ + ...(skipDLLs + ? [] + : [ + new webpack.DllReferencePlugin({ + context: webpackPaths.dllPath, + manifest: require(manifest), + sourceType: 'var', + }), + ]), + + new webpack.NoEmitOnErrorsPlugin(), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and release builds + * + * NODE_ENV should be production so that modules do not perform certain development checks + * + * By default, use 'development' as NODE_ENV. This can be overriden with 'staging', for example, + * by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + + new ReactRefreshWebpackPlugin(), + + new HtmlWebpackPlugin({ + filename: path.join('index.html'), + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + env: process.env.NODE_ENV, + isDevelopment: process.env.NODE_ENV !== 'production', + nodeModules: webpackPaths.appNodeModulesPath, + }), + + new webpack.DefinePlugin({ + 'process.type': '"renderer"', + 'webpackRenderer.isPackaged': 'false', + }), + ], + + node: { + __dirname: false, + __filename: false, + }, + + devServer: { + port, + compress: true, + hot: true, + headers: { 'Access-Control-Allow-Origin': '*' }, + static: { + publicPath: '/', + }, + historyApiFallback: { + verbose: true, + }, + setupMiddlewares(middlewares) { + type ChildProcessInfo = { process: ChildProcess | null; name: string }; + const childProcessInfos: ChildProcessInfo[] = []; + + console.log('Starting preload.js builder...'); + childProcessInfos.push({ + process: spawn('npm', ['run', 'start:preload'], { + shell: true, + stdio: 'inherit', + }), + name: 'Preload Builder', + }); + + console.log('Starting extensions builder...'); + childProcessInfos.push({ + process: spawn('npm', ['run', 'start:extensions'], { + shell: true, + stdio: 'inherit', + }), + name: 'Extension Builder', + }); + + console.log('Starting Main Process...'); + let args = ['run', 'start:main']; + if (process.env.MAIN_ARGS) { + args = args.concat(['--', ...process.env.MAIN_ARGS.matchAll(/"[^"]+"|[^\s"]+/g)].flat()); + } + childProcessInfos.push({ + process: spawn('npm', args, { + shell: true, + stdio: 'inherit', + }), + name: 'Main', + }); + + function tryKillChildProcess( + childProcessInfo: ChildProcessInfo, + code: number, + closingProcessName: string, + ) { + try { + if (childProcessInfo.process) childProcessInfo.process.kill(code); + } catch (e) { + console.error( + `${childProcessInfo.name} threw an error during closing of ${closingProcessName}! ${e}`, + ); + } + } + + // Link processes to each others' lifecycles + childProcessInfos.forEach((childProcessInfo, i) => { + if (childProcessInfo.process) + childProcessInfo.process + .on('close', (code: number) => { + console.log(`${childProcessInfo.name} is closing!`); + // Null to interact with external API + // eslint-disable-next-line no-null/no-null + childProcessInfo.process = null; + // Close all other child processes and exit the main process + childProcessInfos.forEach((otherProcessInfo, j) => { + // Kill all processes but the one that is closing + if (i !== j) tryKillChildProcess(otherProcessInfo, code, childProcessInfo.name); + }); + process.exit(code); + }) + .on('error', (spawnError) => console.error(spawnError)); + }); + + // When this process closes, make sure all other processes shut down + process.on('close', (code: number) => { + console.log('Renderer (parent process) is closing!'); + childProcessInfos.forEach((childProcessInfo) => + tryKillChildProcess(childProcessInfo, code, 'Renderer (parent process)'), + ); + }); + return middlewares; + }, + }, +}; + +const rendererConfig = merge(baseConfig, configuration); +export default rendererConfig; diff --git a/.erb/configs/webpack.config.renderer.prod.ts b/.erb/configs/webpack.config.renderer.prod.ts new file mode 100644 index 0000000000..54186d579e --- /dev/null +++ b/.erb/configs/webpack.config.renderer.prod.ts @@ -0,0 +1,139 @@ +/** Build config for electron renderer process */ + +import path from 'path'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import { merge } from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + devtool: 'source-map', + + mode: 'production', + + target: ['web', 'electron-renderer'], + + entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')], + + output: { + path: webpackPaths.distRendererPath, + publicPath: './', + filename: 'renderer.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(a|c)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?(a|c)ss$/, + use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + + optimization: { + minimize: true, + minimizer: [new TerserPlugin(), new CssMinimizerPlugin()], + }, + + plugins: [ + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and release builds + * + * NODE_ENV should be production so that modules do not perform certain development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + }), + + new MiniCssExtractPlugin({ + filename: 'style.css', + }), + + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8889, + }), + + new HtmlWebpackPlugin({ + filename: 'index.html', + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + isDevelopment: false, + }), + + new webpack.DefinePlugin({ + 'process.type': '"renderer"', + 'webpackRenderer.isPackaged': 'true', + }), + ], +}; + +const rendererConfig = merge(baseConfig, configuration); +export default rendererConfig; diff --git a/.erb/configs/webpack.paths.ts b/.erb/configs/webpack.paths.ts new file mode 100644 index 0000000000..75c33e78fe --- /dev/null +++ b/.erb/configs/webpack.paths.ts @@ -0,0 +1,53 @@ +const path = require('path'); + +const rootPath = path.join(__dirname, '../..'); + +const dllPath = path.join(__dirname, '../dll'); + +const srcPath = path.join(rootPath, 'src'); +const srcMainPath = path.join(srcPath, 'main'); +const srcExtensionHostPath = path.join(srcPath, 'extension-host'); +const srcRendererPath = path.join(srcPath, 'renderer'); +const srcSharedPath = path.join(srcPath, 'shared'); +const srcDeclarationsPath = path.join(srcPath, 'declarations'); + +const releasePath = path.join(rootPath, 'release'); +const appPath = path.join(releasePath, 'app'); +const appPackagePath = path.join(appPath, 'package.json'); +const appNodeModulesPath = path.join(appPath, 'node_modules'); +const srcNodeModulesPath = path.join(srcPath, 'node_modules'); + +const distPath = path.join(appPath, 'dist'); +const distMainPath = path.join(distPath, 'main'); +const distExtensionHostPath = path.join(distPath, 'extension-host'); +const distRendererPath = path.join(distPath, 'renderer'); + +const buildPath = path.join(releasePath, 'build'); + +const extensionsPath = path.join(rootPath, 'extensions'); +const extensionsDistPath = path.join(extensionsPath, 'dist'); +const extensionsLibPath = path.join(extensionsPath, 'lib'); + +const webpackPaths = { + rootPath, + dllPath, + srcPath, + srcMainPath, + srcExtensionHostPath, + srcRendererPath, + srcSharedPath, + srcDeclarationsPath, + releasePath, + appPath, + appPackagePath, + appNodeModulesPath, + srcNodeModulesPath, + distPath, + distMainPath, + distExtensionHostPath, + distRendererPath, + buildPath, + extensionsDistPath, + extensionsLibPath, +}; +export default webpackPaths; diff --git a/.erb/img/erb-banner.svg b/.erb/img/erb-banner.svg new file mode 100644 index 0000000000..f7ce670790 --- /dev/null +++ b/.erb/img/erb-banner.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.erb/img/erb-logo.png b/.erb/img/erb-logo.png new file mode 100644 index 0000000000..97a5661aeb Binary files /dev/null and b/.erb/img/erb-logo.png differ diff --git a/.erb/img/palette-sponsor-banner.svg b/.erb/img/palette-sponsor-banner.svg new file mode 100644 index 0000000000..c1abcfd277 --- /dev/null +++ b/.erb/img/palette-sponsor-banner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/.erb/mocks/file.mock.js b/.erb/mocks/file.mock.js new file mode 100644 index 0000000000..9559a6e43f --- /dev/null +++ b/.erb/mocks/file.mock.js @@ -0,0 +1,2 @@ +const fileMock = 'test-file-stub'; +export default fileMock; diff --git a/.erb/scripts/.eslintrc b/.erb/scripts/.eslintrc new file mode 100644 index 0000000000..35dc618d6f --- /dev/null +++ b/.erb/scripts/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off", + "import/no-extraneous-dependencies": "off" + } +} diff --git a/.erb/scripts/check-build-exists.ts b/.erb/scripts/check-build-exists.ts new file mode 100644 index 0000000000..649929572b --- /dev/null +++ b/.erb/scripts/check-build-exists.ts @@ -0,0 +1,24 @@ +// Check if the renderer and main bundles are built +import path from 'path'; +import chalk from 'chalk'; +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const mainPath = path.join(webpackPaths.distMainPath, 'main.js'); +const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js'); + +if (!fs.existsSync(mainPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The main process is not built yet. Build it by running "npm run build:main"', + ), + ); +} + +if (!fs.existsSync(rendererPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The renderer process is not built yet. Build it by running "npm run build:renderer"', + ), + ); +} diff --git a/.erb/scripts/check-native-dep.js b/.erb/scripts/check-native-dep.js new file mode 100644 index 0000000000..21bdac6b06 --- /dev/null +++ b/.erb/scripts/check-native-dep.js @@ -0,0 +1,48 @@ +import fs from 'fs'; +import chalk from 'chalk'; +import { execSync } from 'child_process'; +import { dependencies } from '../../package.json'; + +if (dependencies) { + const dependenciesKeys = Object.keys(dependencies); + const nativeDeps = fs + .readdirSync('node_modules') + .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`)); + if (nativeDeps.length === 0) { + process.exit(0); + } + try { + // Find the reason for why the dependency is installed. If it is installed + // because of a devDependency then that is okay. Warn when it is installed + // because of a dependency + const { dependencies: dependenciesObject } = JSON.parse( + execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString(), + ); + const rootDependencies = Object.keys(dependenciesObject); + const filteredRootDependencies = rootDependencies.filter((rootDependency) => + dependenciesKeys.includes(rootDependency), + ); + if (filteredRootDependencies.length > 0) { + const plural = filteredRootDependencies.length > 1; + console.log(` + ${chalk.whiteBright.bgYellow.bold('Webpack does not work with native dependencies.')} +${chalk.bold(filteredRootDependencies.join(', '))} ${ + plural ? 'are native dependencies' : 'is a native dependency' + } and should be installed inside of the "./release/app" folder. + First, uninstall the packages from "./package.json": +${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')} + ${chalk.bold('Then, instead of installing the package to the root "./package.json":')} +${chalk.whiteBright.bgRed.bold('npm install your-package')} + ${chalk.bold('Install the package to "./release/app/package.json"')} +${chalk.whiteBright.bgGreen.bold('cd ./release/app && npm install your-package')} + Read more about native dependencies at: +${chalk.bold( + 'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure', +)} + `); + process.exit(1); + } + } catch (e) { + console.log('Native dependencies could not be checked'); + } +} diff --git a/.erb/scripts/check-node-env.js b/.erb/scripts/check-node-env.js new file mode 100644 index 0000000000..6bf674baa1 --- /dev/null +++ b/.erb/scripts/check-node-env.js @@ -0,0 +1,16 @@ +import chalk from 'chalk'; + +export default function checkNodeEnv(expectedEnv) { + if (!expectedEnv) { + throw new Error('"expectedEnv" not set'); + } + + if (process.env.NODE_ENV !== expectedEnv) { + console.log( + chalk.whiteBright.bgRed.bold( + `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`, + ), + ); + process.exit(2); + } +} diff --git a/.erb/scripts/check-port-in-use.js b/.erb/scripts/check-port-in-use.js new file mode 100644 index 0000000000..398cbc179e --- /dev/null +++ b/.erb/scripts/check-port-in-use.js @@ -0,0 +1,16 @@ +import chalk from 'chalk'; +import detectPort from 'detect-port'; + +const port = process.env.PORT || '1212'; + +detectPort(port, (_err, availablePort) => { + if (port !== String(availablePort)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`, + ), + ); + } else { + process.exit(0); + } +}); diff --git a/.erb/scripts/clean.js b/.erb/scripts/clean.js new file mode 100644 index 0000000000..07c0bc2270 --- /dev/null +++ b/.erb/scripts/clean.js @@ -0,0 +1,14 @@ +import { rimrafSync } from 'rimraf'; +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const foldersToRemove = [ + webpackPaths.distPath, + webpackPaths.buildPath, + webpackPaths.dllPath, + webpackPaths.extensionsDistPath, +]; + +foldersToRemove.forEach((folder) => { + if (fs.existsSync(folder)) rimrafSync(folder); +}); diff --git a/.erb/scripts/delete-source-maps.js b/.erb/scripts/delete-source-maps.js new file mode 100644 index 0000000000..3c40d2d856 --- /dev/null +++ b/.erb/scripts/delete-source-maps.js @@ -0,0 +1,11 @@ +import fs from 'fs'; +import path from 'path'; +import { rimrafSync } from 'rimraf'; +import webpackPaths from '../configs/webpack.paths'; + +export default function deleteSourceMaps() { + if (fs.existsSync(webpackPaths.distMainPath)) + rimrafSync(path.join(webpackPaths.distMainPath, '*.js.map'), { glob: true }); + if (fs.existsSync(webpackPaths.distRendererPath)) + rimrafSync(path.join(webpackPaths.distRendererPath, '*.js.map'), { glob: true }); +} diff --git a/.erb/scripts/electron-rebuild.js b/.erb/scripts/electron-rebuild.js new file mode 100644 index 0000000000..1c89ba4445 --- /dev/null +++ b/.erb/scripts/electron-rebuild.js @@ -0,0 +1,15 @@ +import { execSync } from 'child_process'; +import fs from 'fs'; +import { dependencies } from '../../release/app/package.json'; +import webpackPaths from '../configs/webpack.paths'; + +if (Object.keys(dependencies || {}).length > 0 && fs.existsSync(webpackPaths.appNodeModulesPath)) { + const electronRebuildCmd = + '../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .'; + const cmd = + process.platform === 'win32' ? electronRebuildCmd.replace(/\//g, '\\') : electronRebuildCmd; + execSync(cmd, { + cwd: webpackPaths.appPath, + stdio: 'inherit', + }); +} diff --git a/.erb/scripts/link-modules.ts b/.erb/scripts/link-modules.ts new file mode 100644 index 0000000000..6cc31e6666 --- /dev/null +++ b/.erb/scripts/link-modules.ts @@ -0,0 +1,9 @@ +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const { srcNodeModulesPath } = webpackPaths; +const { appNodeModulesPath } = webpackPaths; + +if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) { + fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction'); +} diff --git a/.erb/scripts/notarize.js b/.erb/scripts/notarize.js new file mode 100644 index 0000000000..7daa3053df --- /dev/null +++ b/.erb/scripts/notarize.js @@ -0,0 +1,30 @@ +const { notarize } = require('@electron/notarize'); +const { build } = require('../../package.json'); + +exports.default = async function notarizeMacos(context) { + const { electronPlatformName, appOutDir } = context; + if (electronPlatformName !== 'darwin') { + return; + } + + if (process.env.CI !== 'true') { + console.warn('Skipping notarizing step. Packaging is not running in CI'); + return; + } + + if (!('APPLE_ID' in process.env && 'APPLE_APP_SPECIFIC_PASSWORD' in process.env)) { + console.warn( + 'Skipping notarizing step. APPLE_ID and APPLE_APP_SPECIFIC_PASSWORD env variables must be set', + ); + return; + } + + const appName = context.packager.appInfo.productFilename; + + await notarize({ + appBundleId: build.appId, + appPath: `${appOutDir}/${appName}.app`, + appleId: process.env.APPLE_ID, + appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD, + }); +}; diff --git a/.eslintignore b/.eslintignore index bdb2e12c0b..2fad96731d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,5 +1,3 @@ -# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore - # Please keep this file in sync with .prettierignore and .stylelintignore # Logs @@ -11,6 +9,10 @@ pids *.pid *.seed +# Coverage directory used by tools like istanbul +coverage +.eslintcache + # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules @@ -18,18 +20,34 @@ node_modules # OSX .DS_Store +release/app/dist +release/build +.erb/dll +dev-appdata + .idea npm-debug.log.* *.css.d.ts *.sass.d.ts *.scss.d.ts -# Built files +# Packager output dist -release -temp-build + +# eslint ignores hidden directories by default: +# https://github.com/eslint/eslint/issues/8429 +!.erb +!.storybook + +storybook-static + +# directories that have separate eslint project +lib/platform-bible-react +lib/platform-bible-utils +lib/papi-dts +extensions # generated files package-lock.json - -# #endregion +bin +obj diff --git a/.eslintrc.js b/.eslintrc.js index 279bb37dcd..4cc26fa7c6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,18 +1,17 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs - module.exports = { extends: [ // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb 'erb', + // https://github.com/storybookjs/eslint-plugin-storybook/blob/main/lib/configs/recommended.ts + 'plugin:storybook/recommended', // Make sure this is last so it gets the chance to override other configs. // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier 'plugin:prettier/recommended', ], rules: { - // Some rules in this following shared region are not applied since they are overridden in subsequent regions - // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs and https://github.com/paranext/paranext-extension-template/blob/main/.eslintrc.js except certain overrides // #region ERB rules @@ -94,52 +93,10 @@ module.exports = { // #endregion // #endregion - - // #region Overrides to rules from paranext-core - - 'import/no-unresolved': ['error', { ignore: ['@papi'] }], - - // #endregion }, globals: { globalThis: 'readonly', }, - overrides: [ - { - // Allow this file to have overrides to rules from paranext-core - files: ['.eslintrc.*js'], - rules: { - 'no-dupe-keys': 'off', - }, - }, - { - files: ['*.js'], - rules: { - strict: 'off', - }, - }, - { - // Don't require extensions to have a default export for "activate()" - files: ['*.ts'], - rules: { - 'import/prefer-default-export': 'off', - }, - }, - { - files: ['./lib/*', './webpack/*'], - rules: { - // These files are scripts not running in Platform.Bible, so they can't use the logger - 'no-console': 'off', - }, - }, - { - files: ['*.d.ts'], - rules: { - // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` - 'import/no-self-import': 'off', - }, - }, - ], parserOptions: { ecmaVersion: 2022, sourceType: 'module', @@ -150,14 +107,15 @@ module.exports = { plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], settings: { 'import/resolver': { - typescript: { - alwaysTryTypes: true, + // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below + node: {}, + webpack: { + config: require.resolve('./.erb/configs/webpack.config.eslint.ts'), }, + typescript: {}, }, 'import/parsers': { '@typescript-eslint/parser': ['.ts', '.tsx'], }, }, }; - -// #endregion diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..f8d3ba2886 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +* text eol=lf +*.exe binary +*.png binary +*.jpg binary +*.jpeg binary +*.ico binary +*.icns binary +*.eot binary +*.otf binary +*.ttf binary +*.woff binary +*.woff2 binary +*.ldml binary diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..93141f2bc3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,21 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. diff --git a/.github/ISSUE_TEMPLATE/improvement_request.md b/.github/ISSUE_TEMPLATE/improvement_request.md new file mode 100644 index 0000000000..ae6bbd9d43 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/improvement_request.md @@ -0,0 +1,16 @@ +--- +name: Improvement request +about: Suggest an idea for this project +title: '' +labels: enhancement, ux +assignees: '' +--- + +**User Story** +As a (insert role here), I want (insert summary here) so that (insert reason here). + +**Description** +Describe the details of the new improvement. + +**Implementation idea** +Describe the work needed for the new improvement. diff --git a/.github/assets/github-pages-index.html b/.github/assets/github-pages-index.html new file mode 100644 index 0000000000..88a56ae563 --- /dev/null +++ b/.github/assets/github-pages-index.html @@ -0,0 +1,47 @@ + + + + + + + Platform.Bible API + + + +

Platform.Bible API

+ Go to platform-bible-react + Go to platform-bible-utils + Go to papi-dts + + diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000000..aa78df4dfe --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,19 @@ +changelog: + exclude: + labels: + - ignore-for-release + authors: + - octocat + - dependabot + categories: + - title: Breaking Changes 🛠 + labels: + - Semver-Major + - breaking-change + - title: Exciting New Features 🎉 + labels: + - Semver-Minor + - enhancement + - title: Other Changes + labels: + - '*' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..18107b7795 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,85 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: 'CodeQL' + +on: + push: + branches: ['main'] + pull_request: + # The branches below must be a subset of the branches above + branches: ['main'] + schedule: + - cron: '44 16 * * 4' + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ['csharp', 'javascript'] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + + # Enable tmate debugging of manually-triggered workflows if the input option was provided + - name: Setup tmate session + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true diff --git a/.github/workflows/package-main.yml b/.github/workflows/package-main.yml new file mode 100644 index 0000000000..ecb0e5ab60 --- /dev/null +++ b/.github/workflows/package-main.yml @@ -0,0 +1,124 @@ +name: Package + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + publish: + name: Main on ${{ matrix.os }}, .Net ${{ matrix.dotnet_version }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + dotnet_version: [8.0.x] + + steps: + - name: Install MacPorts + if: ${{ matrix.os == 'macos-latest' }} + uses: melusina-org/setup-macports@v1 + + - name: Install icu4c on macOS + if: ${{ matrix.os == 'macos-latest' }} + run: | + sudo port -v install icu + + - name: Checkout git repo + uses: actions/checkout@v4 + + - name: Install .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.dotnet_version }} + + - name: Read package.json + id: package_json + uses: zoexx/github-action-json-file-properties@1.0.6 + with: + file_path: 'package.json' + + - name: Install Node and NPM + uses: actions/setup-node@v4 + with: + node-version: ${{ fromJson(steps.package_json.outputs.volta).node }} + cache: npm + + - name: Install and build + run: | + npm install + npm run build + + - name: Update release version + shell: bash + run: | + COMMIT_HASH=$(git rev-parse --short "$GITHUB_SHA") + cd ./release/app + CURRENT_VERSION=$(node -pe "require('./package.json').version") + NEW_VERSION="${CURRENT_VERSION}-commit.${COMMIT_HASH}" + echo "Updating version from ${CURRENT_VERSION} to ${NEW_VERSION}" + npm --no-git-tag-version version $NEW_VERSION + + - name: Publish releases - Windows + if: ${{ matrix.os == 'windows-latest' }} + run: | + npm exec electron-builder -- build --publish never --win + + - name: Publish releases - macOS + if: ${{ matrix.os == 'macos-latest' }} + # env: + # # These values are used for auto updates signing + # APPLE_ID: ${{ secrets.APPLE_ID }} + # APPLE_ID_PASS: ${{ secrets.APPLE_ID_PASS }} + # CSC_LINK: ${{ secrets.CSC_LINK }} + # CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + run: | + npm exec electron-builder -- build --publish never --mac + + - name: Publish releases - Linux + if: ${{ matrix.os == 'ubuntu-latest' }} + env: + # no hardlinks so dependencies are copied + USE_HARD_LINKS: false + run: | + npm exec electron-builder -- build --publish never --linux + + - name: Upload Windows artifacts + if: ${{ matrix.os == 'windows-latest' }} + uses: actions/upload-artifact@v4 + with: + name: app-windows + path: | + ./release/build/*.exe + !./release/build/*Setup*.exe + + - name: Upload macOS artifacts + if: ${{ matrix.os == 'macos-latest' }} + uses: actions/upload-artifact@v4 + with: + name: app-macos + path: | + ./release/build/*.dmg + + - name: Upload Linux artifacts + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: actions/upload-artifact@v4 + with: + name: app-linux + path: | + ./release/build/*.AppImage + + # Enable tmate debugging of manually-triggered workflows if the input option was provided + - name: Setup tmate session + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000000..114db62c64 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,59 @@ +name: Publish documentation + +on: + push: + branches: + - main + +jobs: + publish-docs: + runs-on: ubuntu-latest + + steps: + - name: Checkout git repo + uses: actions/checkout@v4 + + - name: Read package.json + id: package_json + uses: zoexx/github-action-json-file-properties@1.0.6 + with: + file_path: 'package.json' + + - name: Install Node and NPM + uses: actions/setup-node@v4 + with: + node-version: ${{ fromJson(steps.package_json.outputs.volta).node }} + cache: npm + + - name: Install and build + run: | + npm install + npm run build + + - name: Build documentation + run: | # need to specify --out so pages links at /{their name} instead of at /docs + cd lib/platform-bible-react + npm run build:docs -- --out platform-bible-react + cd ../platform-bible-utils + npm run build:docs -- --out platform-bible-utils + cd ../papi-dts + npm run build:docs -- --out papi-dts + cd ../../ + mkdir docs-for-pages + mv lib/platform-bible-react/platform-bible-react docs-for-pages + mv lib/platform-bible-utils/platform-bible-utils docs-for-pages + mv lib/papi-dts/papi-dts docs-for-pages + + - name: Add nojekyll # needed so that HTML pages that start with _ do not cause 404 + run: touch docs-for-pages/.nojekyll + + - name: Add landing page + run: | + cp .github/assets/github-pages-index.html docs-for-pages + mv docs-for-pages/github-pages-index.html docs-for-pages/index.html + + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4.5.0 + with: + branch: github-pages + folder: docs-for-pages diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000000..c27c311c50 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,96 @@ +name: Publish + +on: + push: + branches: [release/*] + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + publish: + name: Release on ${{ matrix.os }}, .Net ${{ matrix.dotnet_version }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + dotnet_version: [8.0.x] + + steps: + - name: Install MacPorts + if: ${{ matrix.os == 'macos-latest' }} + uses: melusina-org/setup-macports@v1 + + - name: Install icu4c on macOS + if: ${{ matrix.os == 'macos-latest' }} + run: | + sudo port -v install icu + + - name: Checkout git repo + uses: actions/checkout@v4 + + - name: Install .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.dotnet_version }} + + - name: Read package.json + id: package_json + uses: zoexx/github-action-json-file-properties@1.0.6 + with: + file_path: 'package.json' + + - name: Install Node and NPM + uses: actions/setup-node@v4 + with: + node-version: ${{ fromJson(steps.package_json.outputs.volta).node }} + cache: npm + + - name: Install and build + run: | + npm install + npm run build + + - name: Publish releases - Windows + # If the branch is labeled as a release version (e.g. "release/v1.2.3"), + if: ${{ matrix.os == 'windows-latest' && startsWith(github.ref, 'refs/heads/release/v') && contains(github.ref, '.') }} + env: + # This is used for uploading release assets to github + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: npm exec electron-builder -- --publish always --win + + - name: Publish releases - macOS + # If the branch is labeled as a release version (e.g. "release/v1.2.3"), + if: ${{ matrix.os == 'macos-latest' && startsWith(github.ref, 'refs/heads/release/v') && contains(github.ref, '.') }} + env: + # These values are used for auto updates signing + # APPLE_ID: ${{ secrets.APPLE_ID }} + # APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASS }} + # CSC_LINK: ${{ secrets.CSC_LINK }} + # CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + # This is used for uploading release assets to github + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: npm exec electron-builder -- --publish always --mac + + - name: Publish releases - Linux + # If the branch is labeled as a release version (e.g. "release/v1.2.3"), + if: ${{ matrix.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/heads/release/v') && contains(github.ref, '.') }} + env: + # no hardlinks so dependencies are copied + USE_HARD_LINKS: false + # This is used for uploading release assets to github + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: npm exec electron-builder -- --publish always --linux + + # Enable tmate debugging of manually-triggered workflows if the input option was provided + - name: Setup tmate session + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..b83d8dc9d9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,93 @@ +name: Test + +on: + push: + branches: ['main'] + pull_request: + # The branches below should be a subset of the branches above + branches: ['main'] + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + test: + name: Build on ${{ matrix.os }}, .Net ${{ matrix.dotnet_version }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + dotnet_version: [8.0.x] + + steps: + - name: Install MacPorts + if: ${{ matrix.os == 'macos-latest' }} + uses: melusina-org/setup-macports@v1 + + - name: Install icu4c on macOS + if: ${{ matrix.os == 'macos-latest' }} + run: sudo port -v install icu + + - name: Check out Git repository + uses: actions/checkout@v4 + + - name: Install .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.dotnet_version }} + + - name: Read package.json + id: package_json + uses: zoexx/github-action-json-file-properties@1.0.6 + with: + file_path: 'package.json' + + - name: Install Node.js and NPM + uses: actions/setup-node@v4 + with: + node-version: ${{ fromJson(steps.package_json.outputs.volta).node }} + cache: npm + + - name: npm install + run: npm install + + - name: Build + run: npm run build + + - name: dotnet unit tests + run: dotnet test c-sharp-tests/c-sharp-tests.csproj + + - name: npm unit tests + run: npm test + + - name: check dotnet formatting + run: | + cd c-sharp + dotnet tool restore + dotnet csharpier --check . + + - name: check JS/TS formatting + run: npm run format:check + + - name: check JS/TS linting + run: npm run lint + + - name: check packaging + env: + # no hardlinks so dependencies are copied + USE_HARD_LINKS: false + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: npm run package + + # Enable tmate debugging of manually-triggered workflows if the input option was provided + - name: Setup tmate session + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true diff --git a/.gitignore b/.gitignore index cb00ea28d2..0b3fdc414d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,47 @@ -# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore - # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* -node_modules -dist -release -dist-ssr -*.local +# Runtime data +pids +*.pid +*.seed + +# Coverage directory used by tools like istanbul +coverage # formatting and linting .eslintcache +.eslintConfig.json -# Editor directories and files -.idea +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX .DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -# Temporary intermediate build files -temp-build +release/app/dist +release/build +.erb/dll +storybook-static + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Extra VS Code workspaces +*.code-workspace + +# Extra Visual Studio files +launchSettings.json + +# Test development user appdata files +dev-appdata/ +c-sharp/**/*.BAK -# #endregion +# yalc +.yalc +yalc.lock diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000000..aa248530a5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,11 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +echo "Running Lint check..." + +# generate papi.d.ts as part of lint:staged +npm run lint:staged +echo "Lint check finished" + +echo "If the following fails run npm run editor:unlink" +npx yalc check diff --git a/.prettierignore b/.prettierignore index 69fb5a8ab5..540037a566 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,3 @@ -# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore - # Please keep this file in sync with .eslintignore and .stylelintignore # Logs @@ -11,6 +9,10 @@ pids *.pid *.seed +# Coverage directory used by tools like istanbul +coverage +.eslintcache + # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules @@ -18,18 +20,35 @@ node_modules # OSX .DS_Store +release/app/dist +release/build +.erb/dll +dev-appdata + .idea npm-debug.log.* *.css.d.ts *.sass.d.ts *.scss.d.ts -# Built files +# Packager output dist -release -temp-build + +# eslint ignores hidden directories by default: +# https://github.com/eslint/eslint/issues/8429 +!.erb +!.storybook + +storybook-static + +# directories that have separate eslint project +lib/platform-bible-react +lib/platform-bible-utils +lib/papi-dts +extensions # generated files package-lock.json +bin +obj -# #endregion diff --git a/.prettierrc.js b/.prettierrc.js index 01e5ca241c..314b4bdcfc 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,4 @@ -// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.prettierrc.js module.exports = { tabWidth: 2, @@ -7,7 +7,7 @@ module.exports = { singleQuote: true, // prettier-plugin-jsdoc options tsdoc: true, - plugins: ['prettier-plugin-jsdoc'], + plugins: ['prettier-plugin-jsdoc', 'prettier-plugin-tailwindcss'], overrides: [ { files: '*.json', diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 0000000000..7c976dddc4 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,85 @@ +import { dirname, join } from 'path'; +import type { StorybookConfig } from '@storybook/react-webpack5'; +import { mergeWithCustomize } from 'webpack-merge'; +import { RuleSetRule } from 'webpack'; + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + staticDirs: ['../src/stories/assets'], // static asset folder + addons: [ + getAbsolutePath('@storybook/addon-links'), + getAbsolutePath('@storybook/addon-essentials'), + getAbsolutePath('@storybook/addon-interactions'), + getAbsolutePath('@storybook/addon-webpack5-compiler-babel'), + ], + framework: { + name: getAbsolutePath('@storybook/react-webpack5'), + options: {}, + }, + docs: {}, + typescript: { + check: false, + checkOptions: {}, + reactDocgen: 'react-docgen-typescript', + reactDocgenTypescriptOptions: { + // speeds up storybook build time + // @ts-expect-error The following line is interpreted as an error even though it isn't + allowSyntheticDefaultImports: false, + // speeds up storybook build time + esModuleInterop: false, + }, + }, + + // Merge StorybookWebpackConfig with our WebpackRendererConfig + // See the current webpack configuration using npm run storybook -- --debug-webpack + // TODO: Make this work in production mode + webpackFinal: async (webpackConfig, { configType }) => { + const rendererConfig = + configType === 'PRODUCTION' + ? // Storybook is a build tool so this will not affect anything + // eslint-disable-next-line global-require + require('../.erb/configs/webpack.config.renderer.prod').default + : // eslint-disable-next-line global-require + require('../.erb/configs/webpack.config.renderer.dev').default; + // Remove configs that break stuff (https://storybook.js.org/docs/react/builders/webpack#extending-storybooks-webpack-config) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { devServer, entry, output, ...rendererConfigSanitized } = rendererConfig; + + // Remove the Storybook Webpack rules that we already have our own rules for + return mergeWithCustomize({ + customizeObject(wpConfig: object, rConfig: object, key: string) { + if (key === 'module') { + return mergeWithCustomize({ + customizeArray(wpModule: object[], rModule: object[], moduleKey: string) { + if (moduleKey === 'rules') { + const wpRules: RuleSetRule[] = wpModule; + const rRules: RuleSetRule[] = rModule; + return [ + ...wpRules.filter( + (rule) => + !rule || + !rule.test || + (rule.test.toString() !== /\.css$/.toString() && + rule.test.toString() !== /\.(mjs|tsx?|jsx?)$/.toString()), + ), + ...rRules, + ]; + } + + return undefined; + }, + })(wpConfig, rConfig); + } + return undefined; + }, + })(webpackConfig, rendererConfigSanitized); + }, +}; +export default config; + +// Using `any` so the output doesn't conflict when used in `config.framework.name` above that has +// type `FrameworkName`, which is complicated and not exported. +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function getAbsolutePath(value: string): any { + return dirname(require.resolve(join(value, 'package.json'))); +} diff --git a/.storybook/preview.ts b/.storybook/preview.ts new file mode 100644 index 0000000000..93209ed75b --- /dev/null +++ b/.storybook/preview.ts @@ -0,0 +1,19 @@ +import type { Preview } from '@storybook/react'; +import { fn } from '@storybook/test'; + +const preview: Preview = { + parameters: { + backgrounds: { + default: 'light', + }, + actions: { onClick: fn() }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + }, +}; + +export default preview; diff --git a/.stylelintignore b/.stylelintignore index 6d59d79515..1137c4acd8 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,5 +1,3 @@ -# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore - # Please keep this file in sync with .eslintignore and .prettierignore # Logs @@ -11,6 +9,10 @@ pids *.pid *.seed +# Coverage directory used by tools like istanbul +coverage +.eslintcache + # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules @@ -18,18 +20,34 @@ node_modules # OSX .DS_Store +release/app/dist +release/build +.erb/dll +dev-appdata + .idea npm-debug.log.* *.css.d.ts *.sass.d.ts *.scss.d.ts -# Built files +# Packager output dist -release -temp-build + +# eslint ignores hidden directories by default: +# https://github.com/eslint/eslint/issues/8429 +!.erb +!.storybook + +storybook-static + +# directories that have separate eslint project +lib/platform-bible-react +lib/platform-bible-utils +lib/papi-dts +extensions # generated files package-lock.json - -# #endregion +bin +obj diff --git a/.stylelintrc.js b/.stylelintrc.js index 70f5dd2d0e..04fb875540 100644 --- a/.stylelintrc.js +++ b/.stylelintrc.js @@ -1,4 +1,4 @@ -// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.stylelintrc.js module.exports = { extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 798b80874a..83bd92ec7f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,8 +1,14 @@ { "recommendations": [ + "bradlc.vscode-tailwindcss", + "csharpier.csharpier-vscode", "dbaeumer.vscode-eslint", "editorconfig.editorconfig", "esbenp.prettier-vscode", + "firsttris.vscode-jest-runner", + "formulahendry.dotnet-test-explorer", + "mrmlnc.vscode-json5", + "ms-dotnettools.csdevkit", "streetsidesoftware.code-spell-checker", "stylelint.vscode-stylelint" ] diff --git a/.vscode/launch.json b/.vscode/launch.json index fb0f3a08c0..435cae4b9c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,56 +1,67 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { - "name": "Watch and Build Extension", - "type": "node", + "name": "Debug .NET Core", + "type": "coreclr", "request": "launch", - "runtimeExecutable": "npm", - "skipFiles": ["/**"], - "runtimeArgs": ["run", "watch"] + "preLaunchTask": "npm: build:data", + "program": "${workspaceFolder}/c-sharp/bin/Debug/net8.0/ParanextDataProvider", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "justMyCode": false, + "windows": { + "program": "${workspaceFolder}/c-sharp/bin/Debug/net8.0/win-x64/ParanextDataProvider.exe" + }, + "linux": { + "program": "${workspaceFolder}/c-sharp/bin/Debug/net8.0/linux-x64/ParanextDataProvider" + }, + "osx": { + "program": "${workspaceFolder}/c-sharp/bin/Debug/net8.0/osx-x64/ParanextDataProvider" + } }, { - "name": "Build WebViews", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "skipFiles": ["/**"], - "runtimeArgs": ["run", "build:web-view"] + "name": "Attach to .NET Core", + "type": "coreclr", + "request": "attach", + "processName": "ParanextDataProvider", + "windows": { + "processName": "ParanextDataProvider.exe" + }, + "justMyCode": false }, { - "name": "Build Main", + "name": "Debug Platform Backend", "type": "node", "request": "launch", "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], "skipFiles": ["/**"], - "runtimeArgs": ["run", "build:main"] + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true", + "DEV_NOISY": "false" + }, + "autoAttachChildProcesses": true }, { - "name": "Build Extension", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "skipFiles": ["/**"], - "runtimeArgs": ["run", "build"] + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 }, { - "name": "Debug Platform with Extension", + "name": "Debug Extension Host", "type": "node", "request": "launch", "runtimeExecutable": "npm", - "runtimeArgs": ["run", "start"], + "runtimeArgs": ["run", "start:extension-host"], "skipFiles": ["/**"], "env": { - "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", "IN_VSCODE": "true" - }, - "presentation": { - "hidden": false, - "group": "", - "order": 1 } }, { @@ -61,12 +72,32 @@ "timeout": 15000 }, { - "name": "Attach to Renderer", - "type": "chrome", - "request": "attach", - "port": 9223, - "webRoot": "${workspaceFolder}", - "timeout": 15000 + "name": "Storybook", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "storybook"], + "skipFiles": ["/**"], + "autoAttachChildProcesses": true + }, + { + "name": "Debug building papi.d.ts", + "request": "launch", + "runtimeArgs": ["run", "build:types"], + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "type": "node" + } + ], + "compounds": [ + { + "name": "Debug Platform", + "configurations": ["Debug Platform Backend", "Attach to Renderer"], + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index cefc6be5ed..bd77250cdf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,11 @@ { + "dotnet.defaultSolution": "c-sharp/ParanextDataProvider.sln", + "dotnet-test-explorer.testProjectPath": "c-sharp-tests/c-sharp-tests.csproj", + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[csharp]": { + "editor.defaultFormatter": "csharpier.csharpier-vscode" + }, "editor.formatOnSave": true, "editor.rulers": [100], "editor.wordWrapColumn": 100, @@ -7,6 +13,7 @@ "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], "files.associations": { + "*.css": "tailwindcss", ".eslintignore": "ignore", ".prettierignore": "ignore", ".stylelintignore": "ignore" @@ -20,8 +27,11 @@ "search.exclude": { ".git": true, ".eslintcache": true, + ".erb/dll": true, + "release/{build,app/dist}": true, "node_modules": true, "npm-debug.log.*": true, + "test/**/__snapshots__": true, "package-lock.json": true, "*.{css,sass,scss}.d.ts": true }, diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..06b0d576f2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,536 @@ +# 0.3.0 (2024.9.13) + +## What's Changed + +### Other Changes + +- security update `@sillsdev/scripture` by @irahopkinson in https://github.com/paranext/paranext-core/pull/780 +- Merge v0.2.0 by @lyonsil in https://github.com/paranext/paranext-core/pull/784 +- Update actions workflows to node v20 by @irahopkinson in https://github.com/paranext/paranext-core/pull/783 +- update more GHA to node v20 by @irahopkinson in https://github.com/paranext/paranext-core/pull/785 +- Implementation of context menus (#707) and making grid menu use composed JSON menus (#424) by @tombogle in https://github.com/paranext/paranext-core/pull/746 +- 707, 424: Fixed alignment problem when some menu items have a leading icon and others don't by @tombogle in https://github.com/paranext/paranext-core/pull/786 +- 424: Changed id to command for menu items in Help menu by @tombogle in https://github.com/paranext/paranext-core/pull/787 +- Fix build problems by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/792 +- Use menu contributions to build menus by @lyonsil in https://github.com/paranext/paranext-core/pull/790 +- Added verse image generator localized string by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/800 +- Add settings validation functions by @lyonsil in https://github.com/paranext/paranext-core/pull/798 +- Fixed throwing error trying to remove extension menus that don't exist while reloading extensions by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/799 +- Fixed menu being unavailable on first startup by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/804 +- Added paratext.bible extension menu strings, made editor fill width by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/818 +- editor: handle changed Scripture data by @irahopkinson in https://github.com/paranext/paranext-core/pull/823 +- update `rc-dock` by @irahopkinson in https://github.com/paranext/paranext-core/pull/833 +- Update npm packages by @irahopkinson in https://github.com/paranext/paranext-core/pull/815 +- Update extensions from templates by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/843 +- Project settings validators by @jolierabideau in https://github.com/paranext/paranext-core/pull/816 +- #772: Incorporate hamburger menu in web view component by @tombogle in https://github.com/paranext/paranext-core/pull/793 +- Fixed top bar spacing, catch and explain data provider errors as a quick solution by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/848 +- fix .NET8 builds by @irahopkinson in https://github.com/paranext/paranext-core/pull/851 +- Fixed resource viewer image paths to use new lowerCamelCase by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/853 +- Read settings from extensions by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/852 +- Added IProjectDataProviderFactory for public documentation by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/855 +- Added extension project settings contributions by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/856 +- Quick fix for web view menus getting multiple copies of defaults by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/861 +- Allow read/write of project settings in C# by @lyonsil in https://github.com/paranext/paranext-core/pull/857 +- fix `tar` vulnerability by @irahopkinson in https://github.com/paranext/paranext-core/pull/863 +- Hooked up the resource viewer to change the verse ref and scroll to it by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/864 +- Fix lorem ipsum white space by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/868 +- update `platform-editor` by @irahopkinson in https://github.com/paranext/paranext-core/pull/869 +- disable macOS GHA builds by @irahopkinson in https://github.com/paranext/paranext-core/pull/871 +- Added platform-bible-react preview page, revised readmes by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/870 +- Add Shadcn/ui and a new BCV-control by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/858 +- Fix follow-up items for shadcn/ui BCV control by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/873 +- Fix a tiny bug in the BCV by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/874 +- 738 improve localization service (pull request on new fixed branch) by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/822 +- Split Resource Viewer into a Read-only Resource Viewer and an editable Scripture Editor by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/877 +- Fixed bcv selector problems - mainly that the dropdown was instantly closing when embedded in tab by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/875 +- Allow extensions to contribute localized strings by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/876 +- Changed extension names from kabob-case to camelCase by @tombogle in https://github.com/paranext/paranext-core/pull/879 +- Merge PSI functionality into PDPs by @lyonsil in https://github.com/paranext/paranext-core/pull/878 +- Revert "disable macOS GHA builds (#871)" by @irahopkinson in https://github.com/paranext/paranext-core/pull/872 +- Move all of the test webviews and commands behind an env var by @lyonsil in https://github.com/paranext/paranext-core/pull/886 +- Intl utility classes and functions by @jolierabideau in https://github.com/paranext/paranext-core/pull/883 +- #794: Implement C# project setting validators by @tombogle in https://github.com/paranext/paranext-core/pull/882 +- update `platform-editor` by @irahopkinson in https://github.com/paranext/paranext-core/pull/888 +- Fix docs related to `npm install` when running the first time by @lyonsil in https://github.com/paranext/paranext-core/pull/892 +- Resurrected ProjectDataProviderEngine class, moved some comments around by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/894 +- Switch `Button` and `TextField` to shadcn by @dewert99 in https://github.com/paranext/paranext-core/pull/891 +- Made PDPFE.createProjectDataProviderEngine asynchronous, finished hello world test project type including extension data and project settings by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/895 +- Quick fix existing platform-bible-react build errors by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/899 +- Fix paratext project settings getting default not working, update not working by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/907 +- Added platform.isEditable, filtered Open Scripture Editor and Open Resource Viewer dialogs by isEditable by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/903 +- Run basic checks dialog follow up by @jolierabideau in https://github.com/paranext/paranext-core/pull/897 +- 741 use localized strings hook by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/908 +- Hook in web view context into web view menu command call by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/901 +- add component hierarchy to the preview app by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/896 +- update `platform-editor` by @irahopkinson in https://github.com/paranext/paranext-core/pull/915 +- Fix PBR build after #896 by @irahopkinson in https://github.com/paranext/paranext-core/pull/916 +- Removed file-level disables of lint checks for react/prop-types by @tombogle in https://github.com/paranext/paranext-core/pull/917 +- preview app: better aligned input examples by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/921 +- Reworked projectType to projectInterfaces, reworked ParatextStandard file system format to match Paratext 9 by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/918 +- fix vertical tab ribbon + add more to preview app by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/925 +- preview app: add non-text tab trigger by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/926 +- Search bar fixes by @dewert99 in https://github.com/paranext/paranext-core/pull/924 +- Fix vulnerable dependencies by @irahopkinson in https://github.com/paranext/paranext-core/pull/927 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/935 +- Reworked PDPs to enable layering PDPs, added platform.base, added Scripture extender layering PDP, replaced name from ProjectMetadata with project setting platform.name by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/930 +- add shadcn table by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/932 +- Enable the .NET data provide on macOS by @lyonsil in https://github.com/paranext/paranext-core/pull/942 +- Bump icu.net version by @lyonsil in https://github.com/paranext/paranext-core/pull/943 +- fix components layout + enhance preview app by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/931 +- Resolved infinite loop between two layering PDPs, added new class to make resolving this easier by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/944 +- Fixed views not reopening on restart by fixing PlatformEventEmitter bug by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/947 +- Added settings to direct exports from papi, stopped trying to edit readonly projects by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/950 +- Added Epic issue template by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/966 +- Fully complete book, chapter, and verse for USFM/USJ/USX by @lyonsil in https://github.com/paranext/paranext-core/pull/952 +- Removed epic issue template by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/969 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/974 +- Remove button wrapper by @jolierabideau in https://github.com/paranext/paranext-core/pull/975 +- Used some more variables to help with white labeling by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/976 +- Update `@sillsdev/scripture` by @irahopkinson in https://github.com/paranext/paranext-core/pull/972 +- overwrite editor styles to fit better into frames by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/983 +- add CI format check by @irahopkinson in https://github.com/paranext/paranext-core/pull/984 +- add a draft Paratext10 theme to preview app by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/985 +- preview app: add pages: paratext, colors by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/988 +- fix dropdown styles by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/987 +- add Card, Alert, Slider, Switch by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/990 +- Add check running service and make extension activation order consistent by @lyonsil in https://github.com/paranext/paranext-core/pull/981 +- remove no longer needed font definition by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/995 +- fix twMerge to use our prefix by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/999 +- preview: intersected color preview for the theme colors page by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/996 +- break up preview app into more components by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/997 +- Fixed editor selection issues on typing or changing verse, other minor fixes and tweaks by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1008 +- Add character inventory UI that manages validCharacters and invalidCharacters in project settings by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/914 +- feat: added marketplace buttons and markdown renderer by @ssikande in https://github.com/paranext/paranext-core/pull/1009 +- Fixed parsing verse in dotnet so it does not always use verse value which may be null by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1010 +- preview app: fix, move marketplace buttons by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1013 +- fix: exported by @ssikande in https://github.com/paranext/paranext-core/pull/1015 +- Add pr-font-sans with preflight by @jolierabideau in https://github.com/paranext/paranext-core/pull/1016 +- Add "elevated privileges" to extensions and make managing extensions one by @lyonsil in https://github.com/paranext/paranext-core/pull/1012 +- update `@sillsdev/scripture` by @irahopkinson in https://github.com/paranext/paranext-core/pull/1017 +- Resolve tanstack dependency for DataTable by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1018 +- Add a few elevated privilege types to @papi/core by @lyonsil in https://github.com/paranext/paranext-core/pull/1021 +- Allow the extension host to restart as many times as desired by @lyonsil in https://github.com/paranext/paranext-core/pull/1022 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1023 +- #881: Implemented general Scripture list component and by @tombogle in https://github.com/paranext/paranext-core/pull/912 +- fix styles, preview: add and enhance examples by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1019 +- Create ComboBox from shadcn example by @dewert99 in https://github.com/paranext/paranext-core/pull/970 +- feat: updated buttons to conform to install, update, enable and disable by @ssikande in https://github.com/paranext/paranext-core/pull/1027 +- refactor: move components, rename folders by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1026 +- add shadcn dashboard example by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1029 +- #881: Moved component into advanced folder by @tombogle in https://github.com/paranext/paranext-core/pull/1025 +- feat:added customizable filter button by @ssikande in https://github.com/paranext/paranext-core/pull/1030 +- Fix filter by @ssikande in https://github.com/paranext/paranext-core/pull/1031 +- feat: added more components by @ssikande in https://github.com/paranext/paranext-core/pull/1034 +- Fix bug when all extensions are deactivated and reactived by @lyonsil in https://github.com/paranext/paranext-core/pull/1036 +- feat: make buttons inherit stuff by @ssikande in https://github.com/paranext/paranext-core/pull/1035 +- fix: `manageExtensions` provider correctly parses extension name on Windows by @captaincrazybro in https://github.com/paranext/paranext-core/pull/1040 +- feat: implemented papi event to indicate when file watcher finished reloading extensions by @captaincrazybro in https://github.com/paranext/paranext-core/pull/1041 +- feat: numbers shortened for reader legibility by @ssikande in https://github.com/paranext/paranext-core/pull/1043 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1044 +- Repeated Words Inventory (+ some basic inventory code refactoring) by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1020 +- preview: add more info about theming by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1054 +- improve table and inventory styles by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1048 +- fix direction for many components by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1049 +- fix text on preview app guide by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1056 +- fix border rounding on example layout by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1058 +- fix character inventory button style by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1059 +- move components into better suitable folders by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1061 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1068 +- Made extension contributions load in order, added spinner, updated ParatextData to 9.5.0.6, misc bug fixes and improvements by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1066 +- Provide the ability to run ParatextChecks and cleanup JSON serializing by @lyonsil in https://github.com/paranext/paranext-core/pull/1069 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1078 +- Hook up project and user settings tabs by @jolierabideau in https://github.com/paranext/paranext-core/pull/1070 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1086 +- Settings tabs- add scrolling and work without DEV_NOISY by @jolierabideau in https://github.com/paranext/paranext-core/pull/1087 +- Fix #1074 and part of #1075 by @lyonsil in https://github.com/paranext/paranext-core/pull/1089 +- Provide a way for extensions to start other processes by @lyonsil in https://github.com/paranext/paranext-core/pull/1093 +- Add documentation for inventory components, and add unit tests for inventory utils in platform-bible-react by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1091 +- Update logic to find repeated words by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1095 +- Update inventory preview by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1097 +- #454: Changed checking-results-list to be a webview by @tombogle in https://github.com/paranext/paranext-core/pull/1076 +- Added scroll group service, hook to use scroll groups, added to web views, added tab nav bar with simple UI by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1096 +- Fix rtl for NavigationContentSearch by @jolierabideau in https://github.com/paranext/paranext-core/pull/1108 +- Remove unused file by @irahopkinson in https://github.com/paranext/paranext-core/pull/1105 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1110 +- Create new extension to help manage comments by @lyonsil in https://github.com/paranext/paranext-core/pull/1112 +- Integrate Configure Checks web view by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1099 +- Update return of EnableCheck by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1115 +- update editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/1116 +- Fix bug in printing check feedback: Handle case where there is no feedback by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1117 +- Fixed scroll group selector sometimes having undefined key by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1106 +- Show Live Check Results by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/1114 +- add explanations to preview app by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1121 +- fix imports by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1122 +- fix more imports by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1123 +- bc control: essential color fix for dark mode by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1124 +- Added Verse Plain Text project interface by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1132 +- enable theming for Platform by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/1102 +- #1003: replaced old black box logo with new Platform logo by @tombogle in https://github.com/paranext/paranext-core/pull/1113 +- Various fixes and tweaks to prepare for demo by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1138 +- Support RTL for OHEBGRK by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/1140 + +## New Contributors + +- @dewert99 made their first contribution in https://github.com/paranext/paranext-core/pull/891 +- @ssikande made their first contribution in https://github.com/paranext/paranext-core/pull/1009 +- @captaincrazybro made their first contribution in https://github.com/paranext/paranext-core/pull/1040 + +**Full Changelog**: https://github.com/paranext/paranext-core/compare/v0.2.0...v0.3.0 + +# 0.2.0 (2024.2.27) + +## What's Changed + +### Exciting New Features 🎉 + +- #448 Open resource viewer to selected project by @tombogle in https://github.com/paranext/paranext-core/pull/606 +- Unconstrain project folder names (623) by @tombogle in https://github.com/paranext/paranext-core/pull/653 + +### Other Changes + +- Release v0.1.0 by @irahopkinson in https://github.com/paranext/paranext-core/pull/475 +- #253: created an IconButton component in papi-components by @tombogle in https://github.com/paranext/paranext-core/pull/474 +- Add a service to lookup projects on the file system by @lyonsil in https://github.com/paranext/paranext-core/pull/476 +- Fixed readDir unexpectedly giving undefined instead of empty array when there are no matching directories by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/516 +- Cleanup by @irahopkinson in https://github.com/paranext/paranext-core/pull/513 +- Run basic checks stub by @jolierabideau in https://github.com/paranext/paranext-core/pull/468 +- Add prototype GraphQL service on top of Paratext project data providers by @lyonsil in https://github.com/paranext/paranext-core/pull/520 +- Create some first-pass issue templates by @FoolRunning in https://github.com/paranext/paranext-core/pull/530 +- Stop doing cross builds and increase network timeout by @lyonsil in https://github.com/paranext/paranext-core/pull/535 +- Fix network object sharing race condition within the same process by @lyonsil in https://github.com/paranext/paranext-core/pull/537 +- Reworked ParatextStandard PDP to include USFM in data type names, wrote TypeScript types for potential Scripture and Project Note data by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/538 +- Stop doing cross builds on release by @irahopkinson in https://github.com/paranext/paranext-core/pull/539 +- 363 create use project data provider hook by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/546 +- Add web view state service and corresponding React hook by @lyonsil in https://github.com/paranext/paranext-core/pull/545 +- Fix resource viewer syntax/style by @irahopkinson in https://github.com/paranext/paranext-core/pull/554 +- Change import to conditional import when inside the renderer by @lyonsil in https://github.com/paranext/paranext-core/pull/555 +- Added dialog service for retrieving info from users. Select Project Dialog. `useDialogCallback` hook by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/553 +- 435 basic list by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/550 +- Settings dialog stub by @jolierabideau in https://github.com/paranext/paranext-core/pull/547 +- Add useDataProviderMulti hook by @lyonsil in https://github.com/paranext/paranext-core/pull/561 +- Create `useProjectData` hook by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/568 +- Fix accidental exception where closing a dialog tries to close the dialog again and throws an exception by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/575 +- #363 Fixed typo in comment in create-use-network-object-hook.util.ts by @tombogle in https://github.com/paranext/paranext-core/pull/565 +- Add eslint rules by @irahopkinson in https://github.com/paranext/paranext-core/pull/577 +- Fix potential bug on early return by @irahopkinson in https://github.com/paranext/paranext-core/pull/580 +- Made webview state not stringified entries while preserving check to make sure it is serializable by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/586 +- Enable webviews to change their title and icon url by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/583 +- Allow local projects with dashes in short name by @tombogle in https://github.com/paranext/paranext-core/pull/584 +- Add more modules to be shared at load time with extensions by @lyonsil in https://github.com/paranext/paranext-core/pull/588 +- Fix getMetadataForProject being the only thing using project ids that is case-sensitive by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/589 +- Fixed serializable check failing in useWebViewState when using complex objects like arrays by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/592 +- Revert MUI/emotion loading changes by @lyonsil in https://github.com/paranext/paranext-core/pull/595 +- 514 hook up select multiple projects dialog by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/593 +- #460 Make the Resource Viewer editable as a proof-of-concept Scripture editor by @FoolRunning in https://github.com/paranext/paranext-core/pull/556 +- Fix resource viewer race condition with use-data.hook by @lyonsil in https://github.com/paranext/paranext-core/pull/598 +- Fix race condition when creating the same PDP in multiple threads by @lyonsil in https://github.com/paranext/paranext-core/pull/599 +- Hooked up Open Text Collection command, multiple related fixes and tweaks by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/596 +- Add open word list menu item by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/602 +- 437 Restart extensions when extensions are added by @jolierabideau in https://github.com/paranext/paranext-core/pull/603 +- add Volta config by @irahopkinson in https://github.com/paranext/paranext-core/pull/605 +- Fix editing of the resource viewer by @FoolRunning in https://github.com/paranext/paranext-core/pull/612 +- Revised content security policy and added WebViewContentType.URL for url webviews by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/610 +- More C# tests and testing framework by @FoolRunning in https://github.com/paranext/paranext-core/pull/611 +- format JSDoc by @irahopkinson in https://github.com/paranext/paranext-core/pull/622 +- Loading new extensions not deactivate/activate all loaded extensions by @jolierabideau in https://github.com/paranext/paranext-core/pull/624 +- Fixed compiler warning by @FoolRunning in https://github.com/paranext/paranext-core/pull/628 +- Change button text run basic checks dialog by @jolierabideau in https://github.com/paranext/paranext-core/pull/627 +- Change Comboboxes to Selects in example setting components by @jolierabideau in https://github.com/paranext/paranext-core/pull/629 +- don't format JSDoc in papi.d.ts by @irahopkinson in https://github.com/paranext/paranext-core/pull/632 +- Improve PAPI imports by @jolierabideau in https://github.com/paranext/paranext-core/pull/634 +- Show `nav-operations` by @irahopkinson in https://github.com/paranext/paranext-core/pull/633 +- Improve resiliance of network request registration and error messages by @lyonsil in https://github.com/paranext/paranext-core/pull/635 +- Added `DataProviders` shared interface for data providers by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/630 +- Fix bug where iframe is not unmounted when tab is closed by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/638 +- Fixed not being able to access navigator, causing ComboBox dropdown and ... button to crash by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/639 +- Update the webview service to use the new service pattern by @lyonsil in https://github.com/paranext/paranext-core/pull/640 +- Settings content scroll by @jolierabideau in https://github.com/paranext/paranext-core/pull/643 +- Fix Scripture update events not causing data providers to re-fetch data by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/644 +- Added tests on Scripture update events by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/646 +- Improve JSDoc divider by @irahopkinson in https://github.com/paranext/paranext-core/pull/647 +- Fix inconsistent spelling of papi namespaces by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/648 +- Added some more C# tests (mainly for the PSI) by @FoolRunning in https://github.com/paranext/paranext-core/pull/654 +- Send network events when network objects are created by @lyonsil in https://github.com/paranext/paranext-core/pull/651 +- Add the network object status service by @lyonsil in https://github.com/paranext/paranext-core/pull/652 +- Add tooltips to app bar by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/657 +- Added `app://cache/extension-types` for extension type sharing by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/659 +- Generate and deploy documentation with Typedoc by @jolierabideau in https://github.com/paranext/paranext-core/pull/666 +- Replace most uses of null with undefined by @lyonsil in https://github.com/paranext/paranext-core/pull/667 +- Fix publish-docs workflow by @jolierabideau in https://github.com/paranext/paranext-core/pull/669 +- 650 refactor imports by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/668 +- Limit the node version in GHA by @irahopkinson in https://github.com/paranext/paranext-core/pull/676 +- 353 Update log levels by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/675 +- introduce common scss + style docking framework by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/665 +- Change comment headlines to regions by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/677 +- Update readme with GitHub Pages links by @jolierabideau in https://github.com/paranext/paranext-core/pull/673 +- Add ways to use WebSocket and XMLHttpRequest in the renderer by @lyonsil in https://github.com/paranext/paranext-core/pull/678 +- sync package-lock with package.json by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/682 +- Fix Jest test fail on papi-components by @jolierabideau in https://github.com/paranext/paranext-core/pull/684 +- Added internet objects to papi exports by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/685 +- Remove "dynamic" data type from all C# code by @lyonsil in https://github.com/paranext/paranext-core/pull/688 +- Updated MandatoryProjectDataType JSDoc to match current type enforcement by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/690 +- Populate local user dir with project by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/687 +- split platform-dock-layout by @Sebastian-ubs in https://github.com/paranext/paranext-core/pull/683 +- Remove redundant sender ID from the "registerRequest" command by @lyonsil in https://github.com/paranext/paranext-core/pull/692 +- Rework extensions folder to use `paranext-multi-extension-template` by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/693 +- #567: Turn on globbing in rimrafSync calls by @tombogle in https://github.com/paranext/paranext-core/pull/696 +- Extensions using `papi-shared-types` to share other methods by @jolierabideau in https://github.com/paranext/paranext-core/pull/699 +- Event more attributes about network objects when they are registered by @lyonsil in https://github.com/paranext/paranext-core/pull/698 +- Fixed clients thinking they failed to unregister request handlers by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/702 +- Log unhandled exceptions and highlight module loading oddity by @lyonsil in https://github.com/paranext/paranext-core/pull/703 +- Revised `usePromise`, `useData`, `useProjectData`, and `useDialogCallback` by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/701 +- Retain `null` JSON properties as `undefined` when deserializing by @lyonsil in https://github.com/paranext/paranext-core/pull/705 +- Freeze PAPI and the objects going into it by @lyonsil in https://github.com/paranext/paranext-core/pull/706 +- Implement get set reset pattern for useSetting and useWebViewState by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/697 +- Replace papi-components with two new libraries by @jolierabideau in https://github.com/paranext/paranext-core/pull/704 +- Follow up to replace `papi-components` with two libraries by @jolierabideau in https://github.com/paranext/paranext-core/pull/716 +- Add reset function to useWebViewState by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/717 +- fix `vite` vulnerability by @irahopkinson in https://github.com/paranext/paranext-core/pull/727 +- Revised useSetting and useWebViewState by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/728 +- Deduped `@emotion/react` by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/730 +- Create localization service by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/725 +- Add a placeholder overview page to Storybook by @merchako in https://github.com/paranext/paranext-core/pull/732 +- Update npm packages by @irahopkinson in https://github.com/paranext/paranext-core/pull/733 +- Fix small bug in localization regex by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/745 +- 326 add aliases by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/734 +- Fixed some inaccuracies in the ParatextStandard expanded data provider by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/749 +- Add JSON document combining logic by @lyonsil in https://github.com/paranext/paranext-core/pull/744 +- Move menus schema to `platform-bible-utils` for react components by @lyonsil in https://github.com/paranext/paranext-core/pull/750 +- Fix typedoc build problems by @lyonsil in https://github.com/paranext/paranext-core/pull/751 +- Create menu store service by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/747 +- use the BiblioNexus Foundation shared Scripture editor by @irahopkinson in https://github.com/paranext/paranext-core/pull/753 +- Allow sending general requests from C# by @lyonsil in https://github.com/paranext/paranext-core/pull/755 +- fix editor scripts by @irahopkinson in https://github.com/paranext/paranext-core/pull/757 +- Add menu JSON to the manifest file by @lyonsil in https://github.com/paranext/paranext-core/pull/756 +- Add settings and project settings contribution files by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/759 +- Updated Uri scheme documentation by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/760 +- Updated papi.d.ts with new Uri scheme documentation that I missed before by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/761 +- editor: improve note node by @irahopkinson in https://github.com/paranext/paranext-core/pull/762 +- Improve extension host & dotnet service shutdown by @irahopkinson in https://github.com/paranext/paranext-core/pull/764 +- Async settings service by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/752 +- Fix the build by @lyonsil in https://github.com/paranext/paranext-core/pull/766 +- Added project settings service and `useProjectSetting` hook by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/758 +- Update to .NET v8 and update our assembly dependencies by @lyonsil in https://github.com/paranext/paranext-core/pull/765 +- Update .NET version in GitHub actions by @lyonsil in https://github.com/paranext/paranext-core/pull/768 +- Added `helloWorld` TypeScript test PDP by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/769 +- Support surrogate pairs by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/773 +- Updated to node 20.11.1 LTS, replaced ts-node with tsx in the necessary places as a temporary fix for https://github.com/TypeStrong/ts-node/issues/1997 by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/778 +- Add missing function to stop script import by @lyonsil in https://github.com/paranext/paranext-core/pull/779 +- Fixed platform-bible-utils not being available on backend by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/782 + +## New Contributors + +- @Sebastian-ubs made their first contribution in https://github.com/paranext/paranext-core/pull/665 +- @merchako made their first contribution in https://github.com/paranext/paranext-core/pull/732 + +**Full Changelog**: https://github.com/paranext/paranext-core/compare/v0.1.0...v0.2.0 + +# 0.1.0 (2023.9.29) + +## What's Changed + +### Exciting New Features 🎉 + +- Created MUI-based checkbox component by @tombogle in https://github.com/paranext/paranext-core/pull/130 + +### Other Changes + +- Abstract console.log by @irahopkinson in https://github.com/paranext/paranext-core/pull/42 +- Switch to `electron-log` by @irahopkinson in https://github.com/paranext/paranext-core/pull/64 +- Added extension host process that launches from main process by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/29 +- Added docking panel support by @FoolRunning in https://github.com/paranext/paranext-core/pull/43 +- Load extensions from file, add very primitive webviews by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/67 +- Fix production logger by @irahopkinson in https://github.com/paranext/paranext-core/pull/76 +- Updates from `electron-react-boilerplate` by @irahopkinson in https://github.com/paranext/paranext-core/pull/71 +- Added events and emitters, added useEvent hook, tweaked docking framework css by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/72 +- Pull out `electron-builder` config by @irahopkinson in https://github.com/paranext/paranext-core/pull/82 +- Fixed extension host crashing in production, reformatted logs, temporarily removed auto updater by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/80 +- Update dependencies by @irahopkinson in https://github.com/paranext/paranext-core/pull/84 +- Shim internet access out of extensions on extension host and in web view by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/93 +- Update VS Code Extension recommendations by @irahopkinson in https://github.com/paranext/paranext-core/pull/94 +- Added NetworkObjectService to share objects between processes by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/95 +- Print eslint effective config by @irahopkinson in https://github.com/paranext/paranext-core/pull/97 +- Enable C# code quality checks by @irahopkinson in https://github.com/paranext/paranext-core/pull/99 +- Add CSharpier formatting by @irahopkinson in https://github.com/paranext/paranext-core/pull/100 +- Pair incoming responses to the original requests (#61) by @lyonsil in https://github.com/paranext/paranext-core/pull/102 +- Add C# tool restore to prepare script by @irahopkinson in https://github.com/paranext/paranext-core/pull/108 +- Storybook components by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/96 +- Make log level obvious by @irahopkinson in https://github.com/paranext/paranext-core/pull/111 +- Lint: add member-ordering by @irahopkinson in https://github.com/paranext/paranext-core/pull/118 +- Fix dev after PR #118 by @irahopkinson in https://github.com/paranext/paranext-core/pull/128 +- Bump GHA node version by @irahopkinson in https://github.com/paranext/paranext-core/pull/129 +- Fix eslint running "forever" by @irahopkinson in https://github.com/paranext/paranext-core/pull/127 +- Move thread ownership from Main to PapiClient by @lyonsil in https://github.com/paranext/paranext-core/pull/107 +- Add hoisting ESLint rule by @irahopkinson in https://github.com/paranext/paranext-core/pull/131 +- Send/receive events and add unit tests (#58) by @lyonsil in https://github.com/paranext/paranext-core/pull/124 +- Add a new thread for message sending due to web socket requirements by @lyonsil in https://github.com/paranext/paranext-core/pull/140 +- Use .. filename convention by @irahopkinson in https://github.com/paranext/paranext-core/pull/142 +- Create Data Provider API by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/122 +- Misc cleanup by @irahopkinson in https://github.com/paranext/paranext-core/pull/152 +- Add retry logic to adding webViews and increase a startup delay in main by @lyonsil in https://github.com/paranext/paranext-core/pull/153 +- Changed shutdown to properly wait for sub-processes to shutdown by @FoolRunning in https://github.com/paranext/paranext-core/pull/155 +- Update the network object service to modify the objects passed in by @lyonsil in https://github.com/paranext/paranext-core/pull/156 +- Add Table component by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/157 +- Remove "info" from data provider and network object names by @lyonsil in https://github.com/paranext/paranext-core/pull/159 +- Make VSCode stop complaining due to missing NUnit assertion logic by @lyonsil in https://github.com/paranext/paranext-core/pull/160 +- Drop the I in some interface names after reviewing with Ira by @lyonsil in https://github.com/paranext/paranext-core/pull/162 +- Added Vite/TypeScript/React to extensions, created papi.d.ts, shared types between extensions and main by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/161 +- Misc cleanup by @irahopkinson in https://github.com/paranext/paranext-core/pull/165 +- Streamlined a number of npm scripts by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/164 +- Adjusted Network Object and Data Provider Types by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/163 +- security: fix yaml vulnerability by @irahopkinson in https://github.com/paranext/paranext-core/pull/168 +- Extension install directory file reading and user file reading/writing by @lyonsil in https://github.com/paranext/paranext-core/pull/169 +- WebView API by @irahopkinson in https://github.com/paranext/paranext-core/pull/167 +- Implement WebView panels and floats by @irahopkinson in https://github.com/paranext/paranext-core/pull/173 +- Improve fragile `isTab` function. by @irahopkinson in https://github.com/paranext/paranext-core/pull/183 +- Allow webviews to load static assets from extensions by @lyonsil in https://github.com/paranext/paranext-core/pull/182 +- Split Vite build into two steps to enable WebView debugging and library imports by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/187 +- Replace NODE_ENV on WebViews in Vite by @irahopkinson in https://github.com/paranext/paranext-core/pull/188 +- Fixed circular dependency between papi and webview service causing im… by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/192 +- Retry network requests to temporary startup race conditions by @lyonsil in https://github.com/paranext/paranext-core/pull/201 +- Replace {unsubscriber, promise} with Promise by @lyonsil in https://github.com/paranext/paranext-core/pull/202 +- Fix race condition in data provider registration by @lyonsil in https://github.com/paranext/paranext-core/pull/204 +- Scripture reference selector by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/189 +- Add Testing section to README by @irahopkinson in https://github.com/paranext/paranext-core/pull/205 +- Add color to node console logs. by @irahopkinson in https://github.com/paranext/paranext-core/pull/210 +- Misc cleanup by @irahopkinson in https://github.com/paranext/paranext-core/pull/212 +- Enable webview styles by @irahopkinson in https://github.com/paranext/paranext-core/pull/207 +- Finish shimming require & others in extension host by @irahopkinson in https://github.com/paranext/paranext-core/pull/213 +- Pass through warnings from extension host by @irahopkinson in https://github.com/paranext/paranext-core/pull/214 +- Add lint `no-public` for classes by @irahopkinson in https://github.com/paranext/paranext-core/pull/217 +- Specify node version in README by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/221 +- Fix vite security vulnerability by @irahopkinson in https://github.com/paranext/paranext-core/pull/226 +- Add .NET C# Dev Kit recommended VS Code extension by @irahopkinson in https://github.com/paranext/paranext-core/pull/238 +- Create WebViewProvider API, allowing webviews to persist across refreshes by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/225 +- Stabilize Web Views by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/242 +- Fixed extensions using papi-dts in TypeScript 5.1 by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/243 +- Add Data Type functions to Data Provider API by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/206 +- Close all processes together by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/246 +- Add support for creating data providers in C# and apply a few Resharper suggestions by @lyonsil in https://github.com/paranext/paranext-core/pull/241 +- 172 split papi by @irahopkinson in https://github.com/paranext/paranext-core/pull/247 +- Split papi.d.ts by @irahopkinson in https://github.com/paranext/paranext-core/pull/251 +- 181 paratext data linux support by @FoolRunning in https://github.com/paranext/paranext-core/pull/216 +- Cleanup after #172 by @irahopkinson in https://github.com/paranext/paranext-core/pull/252 +- Added tool bar (#223) by @tombogle in https://github.com/paranext/paranext-core/pull/239 +- Snackbar component by @jolierabideau in https://github.com/paranext/paranext-core/pull/249 +- Fixed extension type discovery for papi-dts by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/262 +- Upgrade TypeScript by @irahopkinson in https://github.com/paranext/paranext-core/pull/263 +- 158 Use checkbox and textfield in table by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/245 +- Add a PAPI data provider that reads scripture using ParatextData by @lyonsil in https://github.com/paranext/paranext-core/pull/261 +- Fixed constant redraws caused by reference comparison instead of value comparison by @FoolRunning in https://github.com/paranext/paranext-core/pull/269 +- Wrapped MenuItem component and used it in menu by @jolierabideau in https://github.com/paranext/paranext-core/pull/265 +- Add event to signal when messaging is complete and modify .net logging by @lyonsil in https://github.com/paranext/paranext-core/pull/271 +- 254 update render edit cell api by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/256 +- Remove unexisting 'message' prop control by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/273 +- Remove all lower level threading types and replace them with Task-based types by @lyonsil in https://github.com/paranext/paranext-core/pull/272 +- Add 'npm stop' script and clean up some more processes by @lyonsil in https://github.com/paranext/paranext-core/pull/274 +- 258 replace bible api with usfm by @lyonsil in https://github.com/paranext/paranext-core/pull/276 +- 257 css injection by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/278 +- Use `@sillsdev/scripture` by @irahopkinson in https://github.com/paranext/paranext-core/pull/284 +- Fixed dependency conflicts from stylelint bump from dependabot by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/286 +- Fix `papi-components` install by @irahopkinson in https://github.com/paranext/paranext-core/pull/287 +- Cleanup `scripture-utils` by @irahopkinson in https://github.com/paranext/paranext-core/pull/289 +- Use interfaces to get JSDoc comments to work with papi in VSCode by @lyonsil in https://github.com/paranext/paranext-core/pull/288 +- Standalone extensions, bundled extensions, and Core share types by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/281 +- Tweaked jsdoc generation-specific code by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/293 +- Add assembly information to C# project by @lyonsil in https://github.com/paranext/paranext-core/pull/294 +- Update debug logging to include the path to the log call by @lyonsil in https://github.com/paranext/paranext-core/pull/295 +- Fix dock height by @irahopkinson in https://github.com/paranext/paranext-core/pull/296 +- Fix flickering tab groups ellipsis button by @irahopkinson in https://github.com/paranext/paranext-core/pull/303 +- Change some dependencies from dev to peer to eliminate runtime issues by @lyonsil in https://github.com/paranext/paranext-core/pull/302 +- Flickering ellipsis button - related fixes by @irahopkinson in https://github.com/paranext/paranext-core/pull/307 +- Fix the production build for the .NET Data Provider by @lyonsil in https://github.com/paranext/paranext-core/pull/308 +- Security update by @irahopkinson in https://github.com/paranext/paranext-core/pull/309 +- Update electron by @irahopkinson in https://github.com/paranext/paranext-core/pull/312 +- Enable comment propagation to properties of objects using custom script by @lyonsil in https://github.com/paranext/paranext-core/pull/310 +- Changed extension bundling from Vite to webpack by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/311 +- Removed data url support since paranext does not support them by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/325 +- Move unsubscribers from activate() return values to context objects by @lyonsil in https://github.com/paranext/paranext-core/pull/324 +- Fix closing the menu by @irahopkinson in https://github.com/paranext/paranext-core/pull/329 +- Menu item to restart extension host by @irahopkinson in https://github.com/paranext/paranext-core/pull/330 +- Debug production by @irahopkinson in https://github.com/paranext/paranext-core/pull/334 +- Prevented extensions from removing sandboxing from iframes or adding scripts to renderer document to do bad things by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/338 +- Added Scripture reference selection control to the main toolbar by @tombogle in https://github.com/paranext/paranext-core/pull/266 +- Mending BCV in toolbar by @jolierabideau in https://github.com/paranext/paranext-core/pull/348 +- add value to slider by @jolierabideau in https://github.com/paranext/paranext-core/pull/352 +- Load extensions from ZIP files by @lyonsil in https://github.com/paranext/paranext-core/pull/349 +- add id to components by @jolierabideau in https://github.com/paranext/paranext-core/pull/354 +- Allow relative paths for `--extensions` by @irahopkinson in https://github.com/paranext/paranext-core/pull/355 +- Reload extensions when they change by @irahopkinson in https://github.com/paranext/paranext-core/pull/377 +- Fix issues with reference selector component by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/346 +- Minor adjustments after PR #377 by @irahopkinson in https://github.com/paranext/paranext-core/pull/382 +- Fix snackbar component children by @jolierabideau in https://github.com/paranext/paranext-core/pull/376 +- Moved app dir to home/.platform.bible and restructured some files in there, named UnsubscriberAsyncLists by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/384 +- Improve lint performance by @irahopkinson in https://github.com/paranext/paranext-core/pull/385 +- menu removing shift modifier on close by @jolierabideau in https://github.com/paranext/paranext-core/pull/379 +- Create open project dialog by @jolierabideau in https://github.com/paranext/paranext-core/pull/387 +- 60 resource viewer v2 by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/380 +- 343 storage mock for verseref by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/386 +- Create download/update project dialog by @jolierabideau in https://github.com/paranext/paranext-core/pull/390 +- Use ScriptureReference type more consistently by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/392 +- Create open multiple projects dialog by @jolierabideau in https://github.com/paranext/paranext-core/pull/393 +- Make MenuItem functional outside of GridMenu by @jolierabideau in https://github.com/paranext/paranext-core/pull/395 +- Add Project Data Provider Factories and associated types by @lyonsil in https://github.com/paranext/paranext-core/pull/389 +- Setup linting rules for .(S)CSS by @rolfheij-sil in https://github.com/paranext/paranext-core/pull/397 +- Create stub for extension toggle by @jolierabideau in https://github.com/paranext/paranext-core/pull/400 +- Security Updates by @irahopkinson in https://github.com/paranext/paranext-core/pull/404 +- 344 current ref resource viewer by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/399 +- Remove local ref control from resource viewer by @katherinejensen00 in https://github.com/paranext/paranext-core/pull/416 +- Make resource viewer take whole webview width, prevent extension name '..' by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/426 +- Adjust Extension Toggle by @jolierabideau in https://github.com/paranext/paranext-core/pull/417 +- Add C# project data support by @lyonsil in https://github.com/paranext/paranext-core/pull/427 +- Update the icons with the new official icon. Removed pt-summit icon. by @FoolRunning in https://github.com/paranext/paranext-core/pull/414 +- Package on main by @irahopkinson in https://github.com/paranext/paranext-core/pull/442 + +## New Contributors + +- @lyonsil made their first contribution in https://github.com/paranext/paranext-core/pull/102 +- @rolfheij-sil made their first contribution in https://github.com/paranext/paranext-core/pull/96 +- @dependabot made their first contribution in https://github.com/paranext/paranext-core/pull/116 +- @tombogle made their first contribution in https://github.com/paranext/paranext-core/pull/130 +- @jolierabideau made their first contribution in https://github.com/paranext/paranext-core/pull/249 +- @katherinejensen00 made their first contribution in https://github.com/paranext/paranext-core/pull/380 + +**Full Changelog**: https://github.com/paranext/paranext-core/compare/v0.0.2...v0.1.0 + +# 0.0.2 (2023.2.28) + +## What's Changed + +### Other Changes + +- Update release instructions by @irahopkinson in https://github.com/paranext/paranext-core/pull/20 +- Added websocket communication between main and renderer, improved build process and dev experience by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/24 +- Add Code Spell Checker by @irahopkinson in https://github.com/paranext/paranext-core/pull/33 +- Create C# client for handling requests for existing Paratext data. by @FoolRunning in https://github.com/paranext/paranext-core/pull/28 +- Run the dotnet Data Provider from electron by @irahopkinson in https://github.com/paranext/paranext-core/pull/36 + +## New Contributors + +- @FoolRunning made their first contribution in https://github.com/paranext/paranext-core/pull/28 + +**Full Changelog**: https://github.com/paranext/paranext-core/compare/v0.0.1...v0.0.2 + +# 0.0.1 (2023.2.4) + +## What's Changed + +### Other Changes + +- First part of issue#2: Add electron-react-boilerplate by @irahopkinson in https://github.com/paranext/paranext-core/pull/2 +- Configure publishing to GH by @irahopkinson in https://github.com/paranext/paranext-core/pull/3 +- Fix release by @irahopkinson in https://github.com/paranext/paranext-core/pull/4 +- Fix Linux release by @irahopkinson in https://github.com/paranext/paranext-core/pull/10 +- Fix Lint warnings by @irahopkinson in https://github.com/paranext/paranext-core/pull/13 +- Add debugging to GHA workflows by @irahopkinson in https://github.com/paranext/paranext-core/pull/11 +- Fix ReadMe icon by @irahopkinson in https://github.com/paranext/paranext-core/pull/12 +- Added proper icon files by @tjcouch-sil in https://github.com/paranext/paranext-core/pull/17 +- Prepare release by @irahopkinson in https://github.com/paranext/paranext-core/pull/18 + +## New Contributors + +- @irahopkinson made their first contribution in https://github.com/paranext/paranext-core/pull/2 +- @tjcouch-sil made their first contribution in https://github.com/paranext/paranext-core/pull/17 + +**Full Changelog**: https://github.com/paranext/paranext-core/commits/v0.0.1 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..e3ba440a2f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at electronreactboilerplate@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/LICENSE b/LICENSE index 59882a9250..f50e3d31a7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) +Copyright © 2022-2024 SIL International Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index da9c1c1fb2..d6acf60c8a 100644 --- a/README.md +++ b/README.md @@ -1,163 +1,313 @@ -# paranext-extension-template +# paranext-core -Basic extension template for Platform.Bible +Extensible Bible translation software - +
+ Platform icon +
-## Template Info +
-This is a webpack project template pre-configured to build a Platform.Bible extension. It contains the bare minimum of what an extension needs. Note that the `*.web-view.*` files and the `public/assets` folder mentioned in [Summary](#summary) are not present in this template. For inspiration on what these could look like, refer to any extension that is built using this template. An example would be the [Text Collection extension](https://github.com/paranext/paranext-extension-text-collection). +[![Build Status][github-actions-status]][github-actions-url] +[![CodeQL][gitghub-codeql-status]][gitghub-codeql-url] +[![Github Tag][github-tag-image]][github-tag-url] -There is also [a template pre-configured to build an arbitrary number of Platform.Bible extensions in one repo](https://github.com/paranext/paranext-multi-extension-template). +
-### Customize extension details +## Summary + +Platform.Bible is extensible Bible translation software. Its functionality is provided almost completely by extensions in order to be very powerful and flexible, giving developers the freedom to create and to share their desired Bible translation experience. + +This repository contains the core Platform.Bible software (Electron client, extension host including "PAPI", and .NET library) and the extensions that come bundled with it. There are many other repositories containing additional extensions. -Follow these instructions to customize the template to be your own Platform.Bible extension. This section is a more compact version of the [`Your first extension` guide](https://github.com/paranext/paranext-extension-template/wiki/Your-First-Extension). +## Users -#### Install and hook up to the template +This software is not yet ready for users. We'll update here with where you can install it when it is ready. -Note: please skip this section and continue with [Replace placeholders](#replace-placeholders) if you are following these instructions as part of [creating an extension within `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#to-create-a-new-extension-in-this-repo). +If you would still like to try it, you can [download early releases here on GitHub](https://github.com/paranext/paranext-core/releases). -To make the process of customizing from the template as smooth as possible, we recommend you do the following before anything else: +### Linux Users -- [Install and set up this repo](#to-install) -- [Update this extension from the template](#to-update-this-extension-from-the-template) +To use `.AppImage` files in Linux, [install FUSE](https://github.com/AppImage/AppImageKit/wiki/FUSE) (you only need to do this once), for example, on Ubuntu (>= 22.04): + +```bash +sudo apt install libfuse2 +``` -#### Replace placeholders +Then simply [execute/run](https://github.com/AppImage/AppImageKit/wiki) the `.AppImage` file, which you can download from [Releases](https://github.com/paranext/paranext-core/releases). -- At the top of this `README.md`: +### Mac Users - - Replace the first line `# paranext-extension-template` with `# your-extension-name` - - Below the first line, replace the extension description with your own description - - In the [Summary](#summary) section, replace `src/types/paranext-extension-template.d.ts` with `src/types/.d.ts` +If you download and run the ARM release of Platform.Bible from [a computer running Apple Silicon](https://support.apple.com/en-us/116943), you will likely encounter a warning from Apple's Gatekeeper stating that "Platform.Bible is damaged and can't be opened. You should move it to the Trash." or something very similar: -- In `manifest.json`: +![mac-arm-damaged-warning](doc-meta/mac-arm-damaged-warning.png) - - Replace `paranext-extension-template` with `your-extension-name` (2 occurrences) - - Update ownership information and other relevant fields as desired +Unfortunately, this is the message Apple chose to display for ARM applications that are not signed (including Platform.Bible, since we have not yet set up application code signing on Mac). -- In `package.json`: +If you trust Platform.Bible and would like to run it even though it is not code signed, you will need to run the following terminal command every time you install a new version of it: - - Replace `paranext-extension-template` with `your-extension-name` (2 occurrences) - - Update ownership information and other relevant fields as desired +`xattr -c /Applications/Platform.Bible.app` -- In `assets/displayData.json`: +[`xattr -c` clears all attributes on the provided file](https://ss64.com/mac/xattr.html). Running this command removes all attributes on the currently-installed Platform.Bible application file including the quarantine flag Gatekeeper puts on unsigned ARM applications downloaded from the internet. - - If your extension has an icon, update the `icon` value to point towards the icon file (for example: `assets/icon.svg`) - - Update the `moreInfoUrl` field to web URL to a page where users can find out more information about you / your organization / your extension. - - Update the `supportUrl` field to web URL to a support page where users can request help and report issues with your extension. - - Update the `en` entry of `localizedDisplayInfo` so that: +## Developer Install - - `displayName` contains a human-readable name for your extension (i.e. `Your Extension Name`). - - `shortSummary` contains a short, few sentence summary of what your extension does. - - `description` points to a Markdown (`.md`) file containing the full description of your extension (similar to what you would put in a `README`). +Set up pre-requisites for building: - - If your extension supports multiple languages, add another entry to `localizedDisplayInfo` by copying and pasting the `en` entry, changing `en` to the [BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) of the language you want to support, and translating the `displayName`, `shortSummary`, and `description` fields appropriately. We recommend naming your description files `description-.md`. +### Linux Development Pre-requisites -- In `LICENSE`: +Add the system libraries needed for Electron, [Build Instructions (Linux)](https://www.electronjs.org/docs/latest/development/build-instructions-linux). - - Adjust as desired (feel free to choose a different license) - - If you choose to stay with the current license, update the copyright statement +### macOS Development Pre-requisites -- Rename `src/types/paranext-extension-template.d.ts` to `src/types/.d.ts` +macOS doesn't come preinstalled with all the +[icu4c](https://unicode-org.github.io/icu/userguide/icu4c/) libraries. They must be +installed separately to provide Unicode support to our .NET code. Platform.Bible is +configured to expect those libraries to be installed using +[MacPorts](https://www.macports.org/). The +[icu package on MacPorts](https://ports.macports.org/port/icu/) has the icu4c +libraries needed for icu.net to run properly. - - In this renamed file, replace `paranext-extension-template` with `your-extension-name` +The build processes are configured to automatically download and package icu4c +libraries with the application, but for development this has to be done manually. -- In `src/main.ts`, replace `Extension template` with `Your Extension Name` (2 occurrences) +The .NET data provider is configured to automatically copy the icu4c `dylib`s into +its build output directory. If for some reason you need to disable that, you will +need to set an environment variable for the OS to find them. For example: -#### Customize the extension manifest and package information +```bash +export DYLD_FALLBACK_LIBRARY_PATH="$HOME/lib:/usr/local/lib:/usr/lib:/opt/local/lib" +``` -The `manifest.json` and `package.json` files contain information specific to your extension. Add your extension's details in these two files as needed. See more information on the `manifest.json` and `package.json` files in [Extension Anatomy](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#extension-manifest). +If you need to set environment variables like the above, consider adding them to +your `.zprofile` so you don't have to remember to do it manually. -#### Hide Template Info +### All Platforms Development Pre-requisites -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Install [`Node.js` version >=18.0.0](https://nodejs.org/) (18.0.0 or greater is required for using `fetch`). We recommend using [Volta](#javascript-tool-manager). -Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. +Install `dotnet` [.NET 8 SDK from here](https://learn.microsoft.com/en-us/dotnet/core/install/). - +To check if `dotnet` is installed run (ensure you have a v8 SDK): -## Summary +```bash +dotnet --version +dotnet --list-sdks +``` + +### Cloning and installing dependencies (all platforms) + +Clone the repo and install dependencies: + +```bash +git clone https://github.com/paranext/paranext-core.git +cd paranext-core +npm install +``` + +To build the declaration type file `papi.d.ts` for extensions to use, run the following: + +```bash +npm run build:types +``` + +## Starting Development + +Start the app in the `dev` environment: + +```bash +npm start +``` + +After you run `npm start` (or, in VSCode, launch `Debug Paranext Core`), you can edit the code, and the relevant processes will hot reload. + +### Developing Extensions + +Paranext Core extensions are found in the `extensions` folder. Please follow the instructions in +`extensions/README.md` to develop extensions. + +Please see the [Extension Template wiki](https://github.com/paranext/paranext-extension-template/wiki) for guides on developing extensions. + +## GitHub Pages + +**[Platform.Bible API Documentation](https://paranext.github.io/paranext-core/papi-dts)** + +- Explore the declarations of types available on the PAPI. + +**[Platform.Bible React Components and Hooks Documentation](https://paranext.github.io/paranext-core/platform-bible-react)** + +- Check out the React components and hooks available to use. + +**[Platform.Bible Utilities Documentation](https://paranext.github.io/paranext-core/platform-bible-utils)** + +- Check out the utility functions, types, and classes available to use. + +## JavaScript Tool Manager + +You can use [Volta](https://volta.sh/) with this repo to use the right version of tools such as **node** and **npm**. -The general file structure is as follows: +If you don't use Volta just look at the `volta` property in [package.json](https://github.com/paranext/paranext-core/blob/main/package.json) to see the right tool versions to install in your preferred way. -- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder -- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder -- `src/` contains the source code for the extension - - `src/main.ts` is the main entry file for the extension - - `src/types/paranext-extension-template.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder - - `*.web-view.tsx` files will be treated as React WebViews - - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) -- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder - - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file - - `assets/descriptions/` contains textual descriptions of the extension in various languages - - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` -- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest -- `public/` contains other static files that are copied into the build folder -- `dist/` is a generated folder containing the built extension files -- `release/` is a generated folder containing a zip of the built extension files +## Packaging for Production -## To install +To package apps for the local platform: -### Install dependencies: +```bash +npm run package +``` + +## Publishing + +1. Create a branch of the form `release/*`, e.g. `release/v1.2.3`, or `release/v1.2.3-rc1`. +2. Update the _version_ in your project's `release/app/package.json`, e.g.: + ```bash + cd ./release/app + npm version 1.2.3 + ``` +3. Create a new draft [GitHub **Release**](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). Ensure the following are included: + - a _Tag version_, e.g. `v1.2.3`, choose _Create new tag on publish_. + - set the **Target** to the release branch. + - a copy of the change log. Click **Generate release notes** as a starting point. + - Click **Save draft**. +4. Update `CHANGELOG.md` with changes in this release from the GitHub draft **Release**. +5. Commit these changes to your release branch and push the commit to GitHub. +6. Once the GitHub build **Action** has finished, it will add build artifact files to the draft release. Remove the `.blockmap` files and leave the `.yml` files and the installers and executable, e.g. `.exe` on Windows. +7. Publish the release on GitHub. +8. Merge the release branch back into **main** with a merge commit. + +## Testing + +The following tests run automatically on each GitHub PR (see [test.yml](https://github.com/paranext/paranext-core/blob/main/.github/workflows/test.yml)). + +To run C# unit tests: + +```bash +cd c-sharp-tests +dotnet test +``` + +To run C# unit tests watching for file changes: + +```bash +cd c-sharp-tests +dotnet watch test +``` + +To run all TS unit tests: + +```bash +npm test +``` + +To run an individual TS unit test watching for file changes: -1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). -2. In this repo, run `npm install` to install local and published dependencies +```bash +npm test -- --watch +``` -### Configure paths to `paranext-core` repo +You can also use the [recommended VS Code extensions](#vs-code-extension-options) to run tests there. -In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: +## Storybook -1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. -2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. +To run Storybook locally: -## To run +```bash +npm run storybook +``` -### Running Platform.Bible with this extension +To build Storybook: -To run Platform.Bible with this extension: +```bash +npm run storybook:build +``` -`npm start` +To run Storybook as a web app, after it was built successfully: -Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. +```bash +npx http-server ./storybook-static +``` -### Building this extension independently +## Windows Development with WSL2 -To watch extension files (in `src`) for changes: +On Windows, you can install [WSL](https://learn.microsoft.com/en-us/windows/wsl/) (Windows Subsystem for Linux) so you can test cross-platform compatibility on Linux (as well as Windows). You'll need to use a Linux distribution with WSL2 (rather than WSL1) so the X-Server windows can be opened for Electron. -`npm run watch` +1. Here is how to [install Linux on Windows with WSL](https://learn.microsoft.com/en-us/windows/wsl/install). +2. You'll want to follow that by setting up to use **VS Code**, **Git** and **NodeJS** with WSL. See the various [tutorials](https://learn.microsoft.com/en-us/windows/wsl/setup/environment). +3. In the WSL distribution, add system libraries needed for Electron, see [Linux Development Pre-requisites](#linux-development-pre-requisites) above. +4. In the WSL distribution, clone the repo as described above under [Developer Install](#developer-install). -To build the extension once: +You'll be running a copy of the repo in both Windows and WSL so make sure they are both up-to-date. -`npm run build` +You can use VS Code from your host to access code in your WSL repo clone using the Microsoft [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) VS Code extension. -## To package for distribution +## VS Code Extension Options -To package this extension into a zip file for distribution: +Extensions highly recommended for this repo are already displayed in VS Code through the [Extensions Recommendations settings](https://github.com/paranext/paranext-core/blob/main/.vscode/extensions.json). These are optional extensions that our developers enjoy using: -`npm run package` +- [TODO Highlight](https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight) +- [Version Lens](https://marketplace.visualstudio.com/items?itemName=pflannery.vscode-versionlens) -## To update this extension from the template +## Formatting and Linting -This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. +Formatting happens automatically when you commit. If you use VS Code with this repo's recommended extensions it will format when you save. -To set up this extension to be updated from the template, run the following command once after cloning this repo: +To check TypeScript for readability, maintainability, and functionality errors, and to check a few other files for proper formatting, run the following from the repo root (or just use VS Code with this repo's recommended extensions) ```bash -git remote add template https://github.com/paranext/paranext-extension-template +npm run format +npm run lint ``` -To update this extension from the template, make sure your repo has no working changes. Then run the following commands: +To check C# for readability, maintainability, and functionality errors, run the following from the repo root (or just use VS Code with this repo's recommended extensions) ```bash -git fetch template -git merge template/main --allow-unrelated-histories +cd c-sharp +dotnet tool restore +dotnet csharpier . ``` -For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). +## Documentation in `papi.d.ts` + +VSCode renders JSDoc comments in the UI to make it easier for developers to use functions and properties as intended. However, those comments do not always propagate from modules to the `d.ts` type definition file when those modules are re-exported. To help with this problem in `papi.d.ts` that we export for extensions to reference, we added some custom functionality. + +If you want comments to be copied from one location in `papi.d.ts` to another, do the following: + +- In the JSDoc comments that you want copied elsewhere, add "JSDOC SOURCE myServiceName" (must have a blank line after) in the JSDoc comments like this: + +```typescript +/** + * JSDOC SOURCE myService + * + * myService is amazing. Here are more details about it. + * ... + */ +const myService = { + ... +} +``` + +- In the location where you want the docs copied, add "JSDOC DESTINATION myServiceName" like this: + +```typescript +const papi = { + ... + /** JSDOC DESTINATION myService */ + myService, +``` + +## Thanks + +Some important decisions in this project were inspired by the work done in [Visual Studio Code](https://code.visualstudio.com/api). Thanks VS Code developers for some great ideas! + +## License -**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. +MIT © [SIL International](https://www.sil.org/) -## Special features in this project + -This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. +[github-actions-status]: https://github.com/paranext/paranext-core/workflows/Test/badge.svg +[github-actions-url]: https://github.com/paranext/paranext-core/actions +[gitghub-codeql-status]: https://github.com/paranext/paranext-core/actions/workflows/codeql-analysis.yml/badge.svg +[gitghub-codeql-url]: https://github.com/paranext/paranext-core/actions/workflows/codeql-analysis.yml +[github-tag-image]: https://img.shields.io/github/tag/paranext/paranext-core.svg?label=version +[github-tag-url]: https://github.com/paranext/paranext-core/releases/latest diff --git a/assets-excluded/README.md b/assets-excluded/README.md new file mode 100644 index 0000000000..a2eadfce09 --- /dev/null +++ b/assets-excluded/README.md @@ -0,0 +1,6 @@ +# Currently Excluded Assets + +This folder's contents: + +- Folder of logos not currently used. +- `custom.sty` file containing the custom milestone used to mark comment anchors. Currently you must add this file (or append its content if the file already exists) to a project to enable comments to be anchored. diff --git a/assets-excluded/custom.sty b/assets-excluded/custom.sty new file mode 100644 index 0000000000..d9dcea3fc5 --- /dev/null +++ b/assets-excluded/custom.sty @@ -0,0 +1,20 @@ +# ******************************************************************** +# * custom.sty is the custom stylesheet for this Paratext project * +# * using USFM markup. * +# * Latest documentation and stylesheets are maintained at: * +# * http://markups.paratext.org/usfm * +# ******************************************************************** + +# WARNING: Using a custom stylesheet will likely make it more difficult to publish your project +# or submit it to the Digital Bible Library (DBL), especially if you add any custom markers. + +# You must copy this file to the project directory (e.g. c:\My Paratext 9 Projects\XYZ) +# for it to take effect. + +\Marker zmsc-s +\Endmarker zmsc-e +\Name Custom - Platform.Bible comment anchor start/end +\Description For anchoring comments (revision notes) +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\StyleType Milestone +\Attributes ?who ?sid ?eid diff --git a/assets-excluded/logo/react-256.icns b/assets-excluded/logo/react-256.icns new file mode 100644 index 0000000000..9e7d39a6b3 Binary files /dev/null and b/assets-excluded/logo/react-256.icns differ diff --git a/assets-excluded/logo/react-256.ico b/assets-excluded/logo/react-256.ico new file mode 100644 index 0000000000..623cea58da Binary files /dev/null and b/assets-excluded/logo/react-256.ico differ diff --git a/assets-excluded/logo/react-256.png b/assets-excluded/logo/react-256.png new file mode 100644 index 0000000000..33fab1354f Binary files /dev/null and b/assets-excluded/logo/react-256.png differ diff --git a/assets-excluded/logo/react.png b/assets-excluded/logo/react.png new file mode 100644 index 0000000000..5ef63f3605 Binary files /dev/null and b/assets-excluded/logo/react.png differ diff --git a/assets/Lockup Inline.svg b/assets/Lockup Inline.svg new file mode 100644 index 0000000000..5c1b00136d --- /dev/null +++ b/assets/Lockup Inline.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/assets.d.ts b/assets/assets.d.ts new file mode 100644 index 0000000000..a0b0c4c4c3 --- /dev/null +++ b/assets/assets.d.ts @@ -0,0 +1,35 @@ +type Styles = Record; + +declare module '*.svg' { + import React from 'react'; + + export const ReactComponent: React.FC>; + + const content: string; + export default content; +} + +declare module '*.png' { + const content: string; + export default content; +} + +declare module '*.jpg' { + const content: string; + export default content; +} + +declare module '*.scss' { + const content: Styles; + export default content; +} + +declare module '*.sass' { + const content: Styles; + export default content; +} + +declare module '*.css' { + const content: Styles; + export default content; +} diff --git a/assets/entitlements.mac.plist b/assets/entitlements.mac.plist new file mode 100644 index 0000000000..dad3e20e6a --- /dev/null +++ b/assets/entitlements.mac.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-jit + + + diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000..54092c67a7 Binary files /dev/null and b/assets/icon.png differ diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 0000000000..ca69efdab9 --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/localization/en.json b/assets/localization/en.json new file mode 100644 index 0000000000..52b1970fea --- /dev/null +++ b/assets/localization/en.json @@ -0,0 +1,48 @@ +{ + "%product_name%": "Platform.Bible", + "%about_versionLabel_format%": "Version: {version}", + "%about_licenseLabel_format%": "License: {license}", + "%insertNote%": "Insert Note", + "%mainMenu_about%": "About Platform.Bible", + "%mainMenu_downloadSlashInstallResources%": "Download/Install Resources", + "%mainMenu_downloadSlashUpdateProject%": "Download/Update Project", + "%mainMenu_exit%": "Exit", + "%mainMenu_help%": "Help", + "%mainMenu_layout%": "Layout", + "%mainMenu_openProject%": "Open Project", + "%mainMenu_project%": "Project", + "%mainMenu_settings%": "Settings", + "%mainMenu_visitSupportBible%": "Visit Support.Bible", + "%mainMenu_window%": "Window", + "%some_localization_key%": "This is the English text for %some_localization_key%.", + "%submitButton%": "Submit", + "%scrollGroup_undefined%": "Ø", + "%scrollGroup_0%": "A", + "%scrollGroup_1%": "B", + "%scrollGroup_2%": "C", + "%scrollGroup_3%": "D", + "%scrollGroup_4%": "E", + "%webView_edit%": "Edit", + "%webView_openProjectSettings%": "Open Project Settings", + "%webView_project%": "Project", + "%webView_projectAssignmentsAndProgress%": "Assignments and Progress", + "%wordList%": "Word List", + "%settings_platform_group1_label%": "Platform Settings", + "%settings_platform_group1_description%": "Settings pertaining to the software overall", + "%settings_platform_verseRef_label%": "Current Verse Reference for Scroll Group A (Deprecated)", + "%settings_platform_verseRef_description%": "Current Verse Reference for Scroll Group A. Deprecated - please use `papi.scrollGroups` and `useWebViewScrollGroupScrRef`", + "%settings_platform_interfaceLanguage_label%": "Interface Language", + "%settings_platform_interfaceLanguage_description%": "List of locales to use when localizing the interface. First in the list receives highest priority. 'en' (English) is always added at the end, so everything localizes to English if it does not have a localization in a higher-priority locale.", + "%settings_platform_ptxUtilsMementoData_label%": "PtxUtils Memento Data", + "%settings_platform_paratextDataLastRegistryDataCachedTimes_label%": "ParatextData Last Registry Data Cached Times", + "%project_settings_platform_group1_label%": "Platform Settings", + "%project_settings_platform_group1_description%": "Project settings pertaining to the software overall", + "%project_settings_platform_name_label%": "Project Short Name", + "%project_name_missing%": "_NoName_", + "%project_settings_platform_fullName_label%": "Project Full Name", + "%project_full_name_missing%": "*Name Missing*", + "%project_language_missing%": "*Language Missing*", + "%project_settings_platform_language_label%": "Project Primary Language", + "%project_settings_platform_isEditable_label%": "Is Editable", + "%project_settings_platform_isEditable_description%": "Whether this project is editable. A project that is not editable is sometimes called a resource." +} diff --git a/assets/localization/es.json b/assets/localization/es.json new file mode 100644 index 0000000000..c6ee1ad7ec --- /dev/null +++ b/assets/localization/es.json @@ -0,0 +1,27 @@ +{ + "%about_versionLabel_format%": "Versión: {version}", + "%about_licenseLabel_format%": "Licencia: {license}", + "%insertNote%": "Insertar Nota", + "%mainMenu_aboutPlatformBible%": "Acerca de Platform.Bible", + "%mainMenu_downloadSlashInstallResources%": "Descargar/instalar recursos", + "%mainMenu_downloadSlashUpdateProject%": "Descargar/actualizar proyecto", + "%mainMenu_exit%": "Salir", + "%mainMenu_help%": "Ayuda", + "%mainMenu_layout%": "Diseño", + "%mainMenu_openProject%": "Abrir proyecto", + "%mainMenu_project%": "Proyecto", + "%mainMenu_settings%": "Configuración", + "%mainMenu_visitSupportBible%": "Visitar Support.Bible", + "%mainMenu_window%": "Ventana", + "%some_localization_key%": "Esto es el texto en español para %some_localization_key%.", + "%submitButton%": "Enviar", + "%webView_edit%": "Editar", + "%webView_openProjectSettings%": "Abrir configuraciones del proyecto", + "%webView_project%": "Proyecto", + "%webView_projectAssignmentsAndProgress%": "Asignaciones y progreso", + "%wordList%": "Lista de palabras", + "%settings_platform_group1_label%": "Configuraciones de Platform", + "%settings_platform_group1_description%": "Configuraciones generales del software fundamental", + "%settings_platform_interfaceLanguage_label%": "Idioma de interfaz", + "%settings_platform_interfaceLanguage_description%": "Lista de locales usados al localizar la interfaz en orden descendente de prioridad. 'en' (inglés) siempre se añade al final, de modo que si no se encuentra una traducción en ninguno de los idiomas especificados, aparecerá en inglés." +} diff --git a/assets/localization/fr.json b/assets/localization/fr.json new file mode 100644 index 0000000000..bd3147e528 --- /dev/null +++ b/assets/localization/fr.json @@ -0,0 +1,5 @@ +{ + "%some_localization_key%": "Ceci est le texte en français pour %some_localization_key%.", + "%submitButton%": "Soumettre", + "%Book.Gen%": "Genèse" +} diff --git a/assets/localization/km.json b/assets/localization/km.json new file mode 100644 index 0000000000..f3070478f8 --- /dev/null +++ b/assets/localization/km.json @@ -0,0 +1,90 @@ +{ + "%LocalizedId.BEL%": "ព្រះបែល", + "%LocalizedId.BLT%": "BLT", + "%LocalizedId.CNC%": "CNC", + "%LocalizedId.COL%": "កូឡ", + "%LocalizedId.DAG%": "DAG", + "%LocalizedId.DAN%": "ដន", + "%LocalizedId.DEU%": "ទក", + "%LocalizedId.DNT%": "DNT", + "%LocalizedId.ECC%": "សស", + "%LocalizedId.ENO%": "ENO", + "%LocalizedId.EPH%": "អភ", + "%LocalizedId.ESG%": "ESG", + "%LocalizedId.EST%": "អធ", + "%LocalizedId.EXO%": "នក", + "%LocalizedId.EZA%": "EZA", + "%LocalizedId.EZK%": "អគ", + "%LocalizedId.EZR%": "អរ", + "%LocalizedId.FRT%": "FRT", + "%LocalizedId.GAL%": "កាឡ", + "%LocalizedId.GEN%": "លប", + "%LocalizedId.GLO%": "GLO", + "%LocalizedId.HAB%": "ហគ", + "%LocalizedId.HAG%": "ហក", + "%LocalizedId.HEB%": "ហប", + "%LocalizedId.HOS%": "ហស", + "%LocalizedId.INT%": "INT", + "%LocalizedId.ISA%": "អស", + "%LocalizedId.JAS%": "យក", + "%LocalizedId.JDB%": "JDB", + "%LocalizedId.JDG%": "ចហ", + "%LocalizedId.JDT%": "JDT", + "%LocalizedId.JER%": "យរ", + "%LocalizedId.JHN%": "យហ", + "%LocalizedId.JOB%": "យ៉ូប", + "%LocalizedId.JOL%": "យអ", + "%LocalizedId.JON%": "យណ", + "%LocalizedId.JOS%": "យស", + "%LocalizedId.JSA%": "JSA", + "%LocalizedId.JUB%": "JUB", + "%LocalizedId.JUD%": "យដ", + "%LocalizedId.LAM%": "បរ", + "%LocalizedId.LAO%": "LAO", + "%LocalizedId.LBA%": "LBA", + "%LocalizedId.LEV%": "លវ", + "%LocalizedId.LJE%": "LJE", + "%LocalizedId.LUK%": "លក", + "%LocalizedId.MAL%": "មគ", + "%LocalizedId.MAN%": "MAN", + "%LocalizedId.MAT%": "មថ", + "%LocalizedId.MIC%": "មីក", + "%LocalizedId.MRK%": "មក", + "%LocalizedId.NAM%": "ណហ", + "%LocalizedId.NDX%": "NDX", + "%LocalizedId.NEH%": "នហ", + "%LocalizedId.NUM%": "ជគ", + "%LocalizedId.OBA%": "អឌ", + "%LocalizedId.ODA%": "ODA", + "%LocalizedId.OTH%": "OTH", + "%LocalizedId.PHM%": "ភល", + "%LocalizedId.PHP%": "ភីល", + "%LocalizedId.PRO%": "សុភ", + "%LocalizedId.PS2%": "PS2", + "%LocalizedId.PS3%": "PS3", + "%LocalizedId.PSA%": "ទំន", + "%LocalizedId.PSS%": "PSS", + "%LocalizedId.REP%": "REP", + "%LocalizedId.REV%": "វវ", + "%LocalizedId.ROM%": "រ៉ូម", + "%LocalizedId.RUT%": "រស់", + "%LocalizedId.S3Y%": "S3Y", + "%LocalizedId.SIR%": "SIR", + "%LocalizedId.SNG%": "បច", + "%LocalizedId.SST%": "SST", + "%LocalizedId.SUS%": "SUS", + "%LocalizedId.TBS%": "TBS", + "%LocalizedId.TDX%": "TDX", + "%LocalizedId.TIT%": "ទត", + "%LocalizedId.TOB%": "TOB", + "%LocalizedId.WIS%": "WIS", + "%LocalizedId.XXA%": "XXA", + "%LocalizedId.XXB%": "XXB", + "%LocalizedId.XXC%": "XXC", + "%LocalizedId.XXD%": "XXD", + "%LocalizedId.XXE%": "XXE", + "%LocalizedId.XXF%": "XXF", + "%LocalizedId.XXG%": "XXG", + "%LocalizedId.ZEC%": "សក", + "%LocalizedId.ZEP%": "សផ" +} diff --git a/assets/localization/metadata.json b/assets/localization/metadata.json new file mode 100644 index 0000000000..e88230030c --- /dev/null +++ b/assets/localization/metadata.json @@ -0,0 +1,9 @@ +{ + "%yes%": { + "notes": "A confirmation word used in many places. For example, this may be used as the label on a button on a dialog.", + "fallbackKey": "%confirm%" + }, + "%submit%": { + "fallbackKey": "%yes%" + } +} diff --git a/assets/localization/zh-hans.json b/assets/localization/zh-hans.json new file mode 100644 index 0000000000..de1b69ce10 --- /dev/null +++ b/assets/localization/zh-hans.json @@ -0,0 +1,125 @@ +{ + "%Book.GEN%": "创", + "%Book.EXO%": "出", + "%Book.LEV%": "利", + "%Book.NUM%": "民", + "%Book.DEU%": "申", + "%Book.JOS%": "书", + "%Book.JDG%": "士", + "%Book.RUT%": "得", + "%Book.1SA%": "撒上", + "%Book.2SA%": "撒下", + "%Book.1KI%": "王上", + "%Book.2KI%": "王下", + "%Book.1CH%": "代上", + "%Book.2CH%": "代下", + "%Book.EZR%": "拉", + "%Book.NEH%": "尼", + "%Book.EST%": "斯", + "%Book.JOB%": "伯", + "%Book.PSA%": "诗", + "%Book.PRO%": "箴", + "%Book.ECC%": "传", + "%Book.SNG%": "歌", + "%Book.ISA%": "赛", + "%Book.JER%": "耶", + "%Book.LAM%": "哀", + "%Book.EZK%": "结", + "%Book.DAN%": "但", + "%Book.HOS%": "何", + "%Book.JOL%": "珥", + "%Book.AMO%": "摩", + "%Book.OBA%": "俄", + "%Book.JON%": "拿", + "%Book.MIC%": "弥", + "%Book.NAM%": "鸿", + "%Book.HAB%": "哈", + "%Book.ZEP%": "番", + "%Book.HAG%": "该", + "%Book.ZEC%": "亚", + "%Book.MAL%": "玛", + "%Book.MAT%": "太", + "%Book.MRK%": "可", + "%Book.LUK%": "路", + "%Book.JHN%": "约", + "%Book.ACT%": "徒", + "%Book.ROM%": "罗", + "%Book.1CO%": "林前", + "%Book.2CO%": "林后", + "%Book.GAL%": "加", + "%Book.EPH%": "弗", + "%Book.PHP%": "腓", + "%Book.COL%": "西", + "%Book.1TH%": "帖前", + "%Book.2TH%": "帖后", + "%Book.1TI%": "提前", + "%Book.2TI%": "提后", + "%Book.TIT%": "多", + "%Book.PHM%": "门", + "%Book.HEB%": "来", + "%Book.JAS%": "雅", + "%Book.1PE%": "彼前", + "%Book.2PE%": "彼后", + "%Book.1JN%": "约壹", + "%Book.2JN%": "约贰", + "%Book.3JN%": "约叁", + "%Book.JUD%": "犹", + "%Book.REV%": "启", + "%Book.TOB%": "多俾亚传", + "%Book.JDT%": "友弟德传", + "%Book.ESG%": "艾斯德尔传(希腊语)", + "%Book.WIS%": "智慧篇", + "%Book.SIR%": "德训篇", + "%Book.BAR%": "巴路克", + "%Book.LJE%": "耶肋米亚书信", + "%Book.S3Y%": "三童歌", + "%Book.SUS%": "苏珊拿传", + "%Book.BEL%": "彼勒与大龙", + "%Book.1MA%": "玛加伯上", + "%Book.2MA%": "玛加伯下", + "%Book.3MA%": "玛加伯三", + "%Book.4MA%": "玛加伯四", + "%Book.1ES%": "厄斯德拉一书(希腊语)", + "%Book.2ES%": "厄斯德拉二书(拉丁语)", + "%Book.MAN%": "玛拿西祷文", + "%Book.PS2%": "诗篇 151 篇", + "%Book.ODA%": "所罗门颂诗", + "%Book.PSS%": "所罗门诗篇", + "%Book.JSA%": "约书亚记 - 抄本 A 版本 *已不使用*", + "%Book.JDB%": "士师记 - 抄本 B 版本 *已不使用*", + "%Book.TBS%": "多俾亚传 - 抄本 S 版本 *已不使用*", + "%Book.SST%": "苏珊拿传 - Theodotian 版本 *已不使用*", + "%Book.DNT%": "但以理书 - Theodotian 版本 *已不使用*", + "%Book.BLT%": "彼勒与大龙 - Theodotian 版本 *已不使用*", + "%Book.XXA%": "附加 A", + "%Book.XXB%": "附加 B", + "%Book.XXC%": "附加 C", + "%Book.XXD%": "附加 D", + "%Book.XXE%": "附加 E", + "%Book.XXF%": "附加 F", + "%Book.XXG%": "附加 G", + "%Book.FRT%": "前页附属资料", + "%Book.BAK%": "书后附属资料", + "%Book.OTH%": "其他附属资料", + "%Book.3ES%": "厄斯德拉三书 *已不使用*", + "%Book.EZA%": "厄斯德拉启示录", + "%Book.5EZ%": "以斯拉五书(拉丁文序言)", + "%Book.6EZ%": "以斯拉六书(拉丁文后记)", + "%Book.INT%": "简介", + "%Book.CNC%": "汇编", + "%Book.GLO%": "词汇表", + "%Book.TDX%": "主题索引", + "%Book.NDX%": "名字索引", + "%Book.DAG%": "但以理书(希腊语)", + "%Book.PS3%": "诗篇 152-155 篇", + "%Book.2BA%": "巴路克二书(天启文学)", + "%Book.LBA%": "巴路克书信", + "%Book.JUB%": "禧年书", + "%Book.ENO%": "以诺书", + "%Book.1MQ%": "玛加伯上(埃塞俄比亚)", + "%Book.2MQ%": "玛加伯下(埃塞俄比亚)", + "%Book.3MQ%": "玛加伯三(埃塞俄比亚)", + "%Book.REP%": "Reproof(箴言 25-31)", + "%Book.4BA%": "巴路克四书(巴路克的其余部分)", + "%Book.LAO%": "老底嘉书" +} diff --git a/assets/localization/zh-hant.json b/assets/localization/zh-hant.json new file mode 100644 index 0000000000..6a9522f936 --- /dev/null +++ b/assets/localization/zh-hant.json @@ -0,0 +1,125 @@ +{ + "%Book.GEN%": "創", + "%Book.EXO%": "出", + "%Book.LEV%": "利", + "%Book.NUM%": "民", + "%Book.DEU%": "申", + "%Book.JOS%": "書", + "%Book.JDG%": "士", + "%Book.RUT%": "得", + "%Book.1SA%": "撒上", + "%Book.2SA%": "撒下", + "%Book.1KI%": "王上", + "%Book.2KI%": "王下", + "%Book.1CH%": "代上", + "%Book.2CH%": "代下", + "%Book.EZR%": "拉", + "%Book.NEH%": "尼", + "%Book.EST%": "斯", + "%Book.JOB%": "伯", + "%Book.PSA%": "詩", + "%Book.PRO%": "箴", + "%Book.ECC%": "傳", + "%Book.SNG%": "歌", + "%Book.ISA%": "賽", + "%Book.JER%": "耶", + "%Book.LAM%": "哀", + "%Book.EZK%": "結", + "%Book.DAN%": "但", + "%Book.HOS%": "何", + "%Book.JOL%": "珥", + "%Book.AMO%": "摩", + "%Book.OBA%": "俄", + "%Book.JON%": "拿", + "%Book.MIC%": "彌", + "%Book.NAM%": "鴻", + "%Book.HAB%": "哈", + "%Book.ZEP%": "番", + "%Book.HAG%": "該", + "%Book.ZEC%": "亞", + "%Book.MAL%": "瑪", + "%Book.MAT%": "太", + "%Book.MRK%": "可", + "%Book.LUK%": "路", + "%Book.JHN%": "約", + "%Book.ACT%": "徒", + "%Book.ROM%": "羅", + "%Book.1CO%": "林前", + "%Book.2CO%": "林後", + "%Book.GAL%": "加", + "%Book.EPH%": "弗", + "%Book.PHP%": "腓", + "%Book.COL%": "西", + "%Book.1TH%": "帖前", + "%Book.2TH%": "帖後", + "%Book.1TI%": "提前", + "%Book.2TI%": "提後", + "%Book.TIT%": "多", + "%Book.PHM%": "門", + "%Book.HEB%": "來", + "%Book.JAS%": "雅", + "%Book.1PE%": "彼前", + "%Book.2PE%": "彼後", + "%Book.1JN%": "約壹", + "%Book.2JN%": "約貳", + "%Book.3JN%": "約叄", + "%Book.JUD%": "猶", + "%Book.REV%": "啟", + "%Book.TOB%": "多比傳", + "%Book.JDT%": "猶滴傳", + "%Book.ESG%": "以斯帖記(希臘語)", + "%Book.WIS%": "所羅門智訓篇", + "%Book.SIR%": "便西拉智訓", + "%Book.BAR%": "巴錄書", + "%Book.LJE%": "耶利米書信", + "%Book.S3Y%": "三童歌", + "%Book.SUS%": "蘇撒拿傳", + "%Book.BEL%": "彼勒與大龍", + "%Book.1MA%": "馬加比一書", + "%Book.2MA%": "馬加比二書", + "%Book.3MA%": "馬加比三書", + "%Book.4MA%": "馬加比四書", + "%Book.1ES%": "以斯拉一書(希臘語)", + "%Book.2ES%": "以斯拉二書(拉丁語)", + "%Book.MAN%": "瑪拿西禱文", + "%Book.PS2%": "詩篇 151 篇", + "%Book.ODA%": "所羅門頌詩", + "%Book.PSS%": "所羅門詩篇", + "%Book.JSA%": "約書亞記 - 抄本 A 版本 *已不使用*", + "%Book.JDB%": "士師記 - 抄本 B 版本 *已不使用*", + "%Book.TBS%": "多比傳 - 抄本 S 版本 *已不使用*", + "%Book.SST%": "蘇撒拿傳 - Theodotian 版本 *已不使用*", + "%Book.DNT%": "但以理書 - Theodotian 版本 *已不使用*", + "%Book.BLT%": "彼勒與大龍 - Theodotian 版本 *已不使用*", + "%Book.XXA%": "附加 A", + "%Book.XXB%": "附加 B", + "%Book.XXC%": "附加 C", + "%Book.XXD%": "附加 D", + "%Book.XXE%": "附加 E", + "%Book.XXF%": "附加 F", + "%Book.XXG%": "附加 G", + "%Book.FRT%": "前頁附屬資料", + "%Book.BAK%": "書後附屬資料", + "%Book.OTH%": "其他附屬資料", + "%Book.3ES%": "以斯拉三書 *已不使用*", + "%Book.EZA%": "以斯拉啟示錄", + "%Book.5EZ%": "以斯拉五書(拉丁文序言)", + "%Book.6EZ%": "以斯拉六書(拉丁文後記)", + "%Book.INT%": "簡介", + "%Book.CNC%": "彙編", + "%Book.GLO%": "詞彙表", + "%Book.TDX%": "主題索引", + "%Book.NDX%": "名字索引", + "%Book.DAG%": "但以理書(希臘語)", + "%Book.PS3%": "詩篇 152-155 篇", + "%Book.2BA%": "巴錄二書(天啟文學)", + "%Book.LBA%": "巴錄書信", + "%Book.JUB%": "禧年書", + "%Book.ENO%": "以諾書", + "%Book.1MQ%": "馬加比一書(埃塞俄比亞)", + "%Book.2MQ%": "馬加比二書(埃塞俄比亞)", + "%Book.3MQ%": "馬加比三書(埃塞俄比亞)", + "%Book.REP%": "Reproof(箴言 25-31)", + "%Book.4BA%": "巴錄四書(巴錄書其餘的部分)", + "%Book.LAO%": "老底嘉書" +} diff --git a/c-sharp-tests/.gitignore b/c-sharp-tests/.gitignore new file mode 100644 index 0000000000..8ff25832a2 --- /dev/null +++ b/c-sharp-tests/.gitignore @@ -0,0 +1,398 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +# *.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml \ No newline at end of file diff --git a/c-sharp-tests/Checks/CheckInputRangeTests.cs b/c-sharp-tests/Checks/CheckInputRangeTests.cs new file mode 100644 index 0000000000..97198f5c33 --- /dev/null +++ b/c-sharp-tests/Checks/CheckInputRangeTests.cs @@ -0,0 +1,75 @@ +using Paranext.DataProvider.Checks; +using SIL.Scripture; + +namespace TestParanextDataProvider.Checks; + +public class CheckInputRangeTests +{ + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 1, 4, true)] // In range (single book) + [TestCase("pid1", "GEN 1:1", "EXO 10:1", "pid1", 1, 4, true)] // In range (multiple books) + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid2", 1, 4, false)] // Different project + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 2, 4, false)] // Book outside range (single book) + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 1, 11, false)] // Chapter after range + [TestCase("pid1", "GEN 2:1", "GEN 10:1", "pid1", 1, 1, false)] // Chapter before range + [TestCase("pid1", "GEN 1:1", null, "pid1", 1, 11, true)] // No end, normal in range + [TestCase("pid1", "GEN 1:1", null, "pid1", 2, 11, false)] // No end, different book + [TestCase("pid1", "GEN 1:1", "LEV 10:1", "pid1", 5, 1, false)] // Book after range (multiple books) + [TestCase("pid1", "EXO 1:1", "LEV 10:1", "pid1", 1, 1, false)] // Book before range (multiple books) + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 0, 4, true)] // Book 0, chapter in range + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 0, 20, true)] // Book 0, chapter outside of range + [TestCase("pid1", "GEN 1:1", "GEN 10:1", "pid1", 1, 0, true)] // Book in range, Chapter 0 + public void IsWithinRange_IdentifiesOutOfRange( + string verseRefProjectId, + string verseRefStart, + string? verseRefEnd, + string projectId, + int bookNum, + int chapterNum, + bool expectedResult + ) + { + VerseRef vrefStart = new(verseRefStart); + VerseRef? vrefEnd = string.IsNullOrEmpty(verseRefEnd) ? null : new VerseRef(verseRefEnd); + CheckInputRange checkInputRange = new(verseRefProjectId, vrefStart, vrefEnd); + Assert.That( + checkInputRange.IsWithinRange(projectId, bookNum, chapterNum), + Is.EqualTo(expectedResult) + ); + } + + [TestCase(null, 1, 1, 1, 1, "projectId")] + [TestCase("", 1, 1, 1, 1, "empty string")] + [TestCase("projectId", 1, 0, 1, 10, "start.ChapterNum must be > 0")] + [TestCase("projectId", 1, 1, 1, 0, "end.ChapterNum must be > 0")] + [TestCase("projectId", 3, 1, 1, 1, "end must come after start")] + public void CheckInputRange_Constructor_ThrowsWithBadInputs( + string? projectId, + int bookNumStart, + int chapterNumStart, + int? bookNumEnd, + int? chapterNumEnd, + string expectedPartialMessage + ) + { + string exceptionMessage = string.Empty; + try + { + var checkInputRange = new CheckInputRange( + projectId!, + new VerseRef(bookNumStart, chapterNumStart, 1), + bookNumEnd.HasValue && chapterNumEnd.HasValue + ? new VerseRef(bookNumEnd.Value, chapterNumEnd.Value, 1) + : null + ); + + // This line is to just get linters to not complain about unused variables + checkInputRange.ToString(); + } + catch (ArgumentException ex) + { + exceptionMessage = ex.Message; + } + + Assert.That(exceptionMessage, Does.Contain(expectedPartialMessage)); + } +} diff --git a/c-sharp-tests/Checks/CheckLocationTests.cs b/c-sharp-tests/Checks/CheckLocationTests.cs new file mode 100644 index 0000000000..4ffad5d893 --- /dev/null +++ b/c-sharp-tests/Checks/CheckLocationTests.cs @@ -0,0 +1,27 @@ +using Paranext.DataProvider.Checks; +using SIL.Scripture; + +namespace TestParanextDataProvider.Checks; + +public class CheckLocationTests +{ + [TestCase("GEN 1:1", 2, "GEN 1:1", 2, true)] + [TestCase("GEN 1:1", 2, "NUM 1:1", 2, false)] + [TestCase("GEN 1:1", 1, "GEN 1:1", 2, false)] + public void Equality_Objects_ComparedByValue( + string verseRef1, + int offset1, + string verseRef2, + int offset2, + bool expectedResult + ) + { + VerseRef vref1 = new(verseRef1); + CheckLocation item1 = new(vref1, offset1); + VerseRef vref2 = new(verseRef2); + CheckLocation item2 = new(vref2, offset2); + Assert.That(item1 == item2, Is.EqualTo(expectedResult)); + Assert.That(item1.Equals(item2), Is.EqualTo(expectedResult)); + Assert.That(item1.GetHashCode() == item2.GetHashCode(), Is.EqualTo(expectedResult)); + } +} diff --git a/c-sharp-tests/Checks/CheckRunResultTests.cs b/c-sharp-tests/Checks/CheckRunResultTests.cs new file mode 100644 index 0000000000..131be63e88 --- /dev/null +++ b/c-sharp-tests/Checks/CheckRunResultTests.cs @@ -0,0 +1,46 @@ +using Paranext.DataProvider.Checks; +using SIL.Scripture; + +namespace TestParanextDataProvider.Checks; + +public class CheckRunResultTests +{ + [TestCase("checkId", "projectId", "message", "GEN 1:1", 1, "GEN 1:2", 5, true)] + [TestCase("ABC", "projectId", "message", "GEN 1:1", 1, "GEN 1:2", 5, false)] + [TestCase("checkId", "ABC", "message", "GEN 1:1", 1, "GEN 1:2", 5, false)] + [TestCase("checkId", "projectId", "ABC", "GEN 1:1", 1, "GEN 1:2", 5, false)] + [TestCase("checkId", "projectId", "message", "GEN 1:2", 1, "GEN 1:2", 5, false)] + [TestCase("checkId", "projectId", "message", "GEN 1:1", 2, "GEN 1:2", 5, false)] + [TestCase("checkId", "projectId", "message", "GEN 1:1", 1, "GEN 1:3", 5, false)] + [TestCase("checkId", "projectId", "message", "GEN 1:1", 1, "GEN 1:2", 7, false)] + public void Equality_Objects_ComparedByValue( + string checkId2, + string projectId2, + string message2, + string verseRefStart2, + int offsetStart2, + string verseRefEnd2, + int offsetEnd2, + bool expectedResult + ) + { + VerseRef vrefStart1 = new("GEN 1:1"); + CheckLocation start1 = new(vrefStart1, 1); + VerseRef vrefEnd1 = new("GEN 1:2"); + CheckLocation end1 = new(vrefEnd1, 5); + CheckRunResult checkRunResult1 = new("checkId", "projectId", "message", start1, end1); + + VerseRef vrefStart2 = new(verseRefStart2); + CheckLocation start2 = new(vrefStart2, offsetStart2); + VerseRef vrefEnd2 = new(verseRefEnd2); + CheckLocation end2 = new(vrefEnd2, offsetEnd2); + CheckRunResult checkRunResult2 = new(checkId2, projectId2, message2, start2, end2); + + Assert.That(checkRunResult1 == checkRunResult2, Is.EqualTo(expectedResult)); + Assert.That(checkRunResult1.Equals(checkRunResult2), Is.EqualTo(expectedResult)); + Assert.That( + checkRunResult1.GetHashCode() == checkRunResult2.GetHashCode(), + Is.EqualTo(expectedResult) + ); + } +} diff --git a/c-sharp-tests/Checks/ParatextCheckDetailsTests.cs b/c-sharp-tests/Checks/ParatextCheckDetailsTests.cs new file mode 100644 index 0000000000..8737a92a17 --- /dev/null +++ b/c-sharp-tests/Checks/ParatextCheckDetailsTests.cs @@ -0,0 +1,21 @@ +using Paranext.DataProvider.Checks; +using Paranext.DataProvider.JsonUtils; +using Paratext.Data.Checking; + +namespace TestParanextDataProvider.Checks; + +public class ParatextCheckDetailsTests +{ + [Test] + public void Serialization_Json_MatchesExpectations() + { + var checkDetails = new ParatextCheckDetails(CheckType.Capitalization); + checkDetails.EnabledProjectIds.Add("testProjectId"); + Assert.That( + checkDetails.SerializeToJson(), + Is.EqualTo( + """{"checkName":"Capitalization","checkDescription":"Capitalization","checkId":"Capitalization","enabledProjectIds":["testProjectId"]}""" + ) + ); + } +} diff --git a/c-sharp-tests/DummyLocalParatextProjects.cs b/c-sharp-tests/DummyLocalParatextProjects.cs new file mode 100644 index 0000000000..b586046d85 --- /dev/null +++ b/c-sharp-tests/DummyLocalParatextProjects.cs @@ -0,0 +1,21 @@ +using System.Diagnostics.CodeAnalysis; +using Paranext.DataProvider.Projects; +using Paratext.Data; + +namespace TestParanextDataProvider +{ + [ExcludeFromCodeCoverage] + internal class DummyLocalParatextProjects : LocalParatextProjects + { + public void FakeAddProject(ProjectDetails details, ScrText? scrText = null) + { + scrText ??= new DummyScrText(details); + ScrTextCollection.Add(scrText, true); + } + + public override void Initialize(bool shouldIncludePT9ProjectsOnWindows) + { + // Nothing to do + } + } +} diff --git a/c-sharp-tests/DummyPapiClient.cs b/c-sharp-tests/DummyPapiClient.cs new file mode 100644 index 0000000000..03b7737825 --- /dev/null +++ b/c-sharp-tests/DummyPapiClient.cs @@ -0,0 +1,258 @@ +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.Services; + +namespace TestParanextDataProvider +{ + [ExcludeFromCodeCoverage] + internal class DummyPapiClient : PapiClient + { + private readonly Dictionary> _eventHandlers = new(); + private readonly Dictionary< + string, + List<(string newValue, string oldValue)> + > _validSettings = new(); + + public Stack EventMessages { get; } = new(); + + /// + /// Fakes a message coming from the server for the PapiClient to handle + /// + /// The message to fake + /// The messages that would be returned back to the server + public IEnumerable FakeMessageFromServer(Message message) + { + if (!_messageHandlersByMessageType.TryGetValue(message.Type, out var handler)) + { + Trace.TraceWarning($"No message handler for type {message.Type}"); + return Enumerable.Empty(); + } + + return handler.HandleMessage(message); + } + + public void AddSettingValueToTreatAsValid( + string pbSettingName, + string newValue, + string oldValue + ) + { + if (!_validSettings.TryGetValue(pbSettingName, out var values)) + { + _validSettings[pbSettingName] = values = + new List<(string newValue, string oldValue)>(); + } + values.Add((newValue, oldValue)); + } + + #region Overrides of PapiClient + public override Task ConnectAsync() + { + return Task.FromResult(true); // Pretend we succeeded + } + + public override Task DisconnectAsync() + { + // Nothing to do + return Task.CompletedTask; + } + + public override Task RegisterRequestHandler( + string requestType, + Func requestHandler, + int responseTimeoutInMs = 5000 + ) + { + var responder = (MessageHandlerRequestByRequestType) + _messageHandlersByMessageType[MessageType.REQUEST]; + try + { + responder.SetHandlerForRequestType(requestType, requestHandler); + } + catch (ArgumentException) + { + return Task.FromResult(false); + } + + return Task.FromResult(true); + } + + public override void RegisterEventHandler( + string eventType, + Func eventHandler + ) + { + _eventHandlers.Add(eventType, eventHandler); + } + + public override void SendEvent(MessageEvent message) + { + if (!_eventHandlers.TryGetValue(message.EventType, out var handler)) + return; + + Message? result = handler(message); + EventMessages.Push(result); + } + + public override void SendRequest( + string requestType, + object requestContents, + Action responseCallback + ) + { + Task.Delay(1) + .ContinueWith(async _ => + { + bool success = false; + object? result = null; + + // Try to run registered request handlers + var responder = (MessageHandlerRequestByRequestType) + _messageHandlersByMessageType[MessageType.REQUEST]; + var requestMessage = + (requestContents is JsonElement jse) + ? new MessageRequest(requestType, 0, jse) + : new MessageRequest(requestType, 0, requestContents); + var response = responder.HandleMessage(requestMessage); + // There should be just one response message + if (response.Count() > 1) + throw new Exception( + $"Somehow there were multiple response messages for request {requestType}" + ); + // If there were no responses, there isn't a registered request handler + if (response.Count() == 1) + { + if (response.First() is MessageResponse messageResponse) + { + success = messageResponse.Success; + result = messageResponse.Contents; + } + else + { + throw new Exception( + $"Somehow the message handler for {requestType} responded with a message that was not a MessageResponse" + ); + } + } + // Special hard-coded request handlers. We should probably try to get rid of these over time + else if ( + (requestType == "object:ProjectSettingsService.function") + && (requestContents is object[] details) + && (details.Length >= 2) + ) + { + // If this is a setting known to both Platform.Bible and Paratext, do the + // translation from the Paratext settings key to the PB setting id. + // If it's a custom settings key, then perhaps it's one we've registered to + // handle, and no translation is needed. + var ourSettingName = (string)details[1]; + var pbSettingName = + ProjectSettingsNames.GetPlatformBibleSettingNameFromParatextSettingName( + ourSettingName + ); + + if (ourSettingName != null) + { + switch (details[0]) + { + case "isValid": + if (details.Length == 5) + { + success = true; + // Might be a setting we've registered to handle. + var isValidRequestContents = new[] + { + // From ProjectSettingsService.IsValid + // new value + details[2], + // current value + details[3], + // all changes? + details[4] + }; + if ( + TryValidationUsingRegisteredHandler( + isValidRequestContents, + ourSettingName, + out var isValid + ) + ) + { + result = isValid; + } + else if (pbSettingName == null) + { + // Per comment in isValid (in + // project-settings.service-host.ts), if there is no + // validator just let the change go through + result = true; + } + else + { + result = + _validSettings.TryGetValue( + pbSettingName, + out var validValues + ) + && validValues.Any(vv => + vv.newValue == (string)details[2] + && vv.oldValue == (string)details[3] + ); + } + } + break; + case "getDefault": + if (details.Length == 2 && pbSettingName != null) + { + success = true; + result = $"default value for {pbSettingName}"; + } + break; + default: + break; + } + } + } + // Otherwise we didn't find a request handler, so it should just be a request + // failure. Can keep the original values + + await Task.Run( + () => responseCallback(success, result.SerializeToJsonElement()) + ); + }); + } + + private bool TryValidationUsingRegisteredHandler( + object[] requestContents, + string settingName, + out bool isValid + ) + { + isValid = true; + if (!_messageHandlersByMessageType.TryGetValue(MessageType.REQUEST, out var responder)) + return false; + + var msgRequest = new MessageRequest( + ProjectSettingsService.GetValidatorKey(settingName), + GetRequestId(), + requestContents + ); + var responseMsg = responder + .HandleMessage(msgRequest) + .OfType() + .FirstOrDefault(); + + if (responseMsg == null) + return false; + + isValid = responseMsg.Success; + return true; + } + #endregion + } +} diff --git a/c-sharp-tests/DummyParatextProjectDataProvider.cs b/c-sharp-tests/DummyParatextProjectDataProvider.cs new file mode 100644 index 0000000000..c7c4422909 --- /dev/null +++ b/c-sharp-tests/DummyParatextProjectDataProvider.cs @@ -0,0 +1,101 @@ +using System.Diagnostics.CodeAnalysis; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.Projects; + +namespace TestParanextDataProvider +{ + [ExcludeFromCodeCoverage] + internal class DummyParatextProjectDataProvider : ParatextProjectDataProvider + { + private readonly Dictionary _inMemoryFiles = new(); + + public DummyParatextProjectDataProvider( + string name, + PapiClient papiClient, + ProjectDetails projectDetails, + LocalParatextProjects paratextProjects + ) + : base(name, papiClient, projectDetails, paratextProjects) { } + + protected override IProjectStreamManager CreateStreamManager(ProjectDetails projectDetails) + { + return new InMemoryStreamManager(this); + } + + #region InMemoryStreamManager class + + private sealed class InMemoryStreamManager : IProjectStreamManager + { + private readonly DummyParatextProjectDataProvider _owner; + + public InMemoryStreamManager(DummyParatextProjectDataProvider owner) + { + _owner = owner; + } + + #region Implementation of IProjectStreamManager + + public void Initialize() + { + // Nothing to do + } + + public string[] GetExistingDataStreamNames() + { + throw new NotImplementedException(); + } + + public Stream? GetDataStream(string streamName, bool createIfNotExists = false) + { + if (_owner._inMemoryFiles.TryGetValue(streamName, out byte[]? existingFile)) + return new InMemoryFile(_owner, streamName, existingFile); + + return createIfNotExists ? new InMemoryFile(_owner, streamName) : null; + } + + public bool DeleteDataStream(string streamName) + { + throw new NotImplementedException(); + } + + #endregion + } + + #endregion + + #region InMemoryFile class + + private sealed class InMemoryFile : MemoryStream + { + private readonly DummyParatextProjectDataProvider _owner; + private readonly string _streamName; + + public InMemoryFile( + DummyParatextProjectDataProvider owner, + string streamName, + byte[] existingData + ) + : base(existingData) + { + _owner = owner; + _streamName = streamName; + } + + public InMemoryFile(DummyParatextProjectDataProvider owner, string streamName) + { + _owner = owner; + _streamName = streamName; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + _owner._inMemoryFiles[_streamName] = ToArray(); + + base.Dispose(disposing); + } + } + + #endregion + } +} diff --git a/c-sharp-tests/DummyScrLanguage.cs b/c-sharp-tests/DummyScrLanguage.cs new file mode 100644 index 0000000000..3bd140862a --- /dev/null +++ b/c-sharp-tests/DummyScrLanguage.cs @@ -0,0 +1,46 @@ +using Paratext.Data.Languages; +using Paratext.Data; +using PtxUtils; +using SIL.WritingSystems; +using System.Diagnostics.CodeAnalysis; + +namespace TestParanextDataProvider +{ + /// + /// Replaces a ScrLanguage for use in testing. Does not use the file system to save/load data. + /// + /// Shamelessly copied from Paratext tests. + [ExcludeFromCodeCoverage] + public class DummyScrLanguage : ScrLanguage + { + public DummyScrLanguage(ScrText scrText) : base(null, ProjectNormalization.Undefined, scrText) + { + } + + protected override WritingSystemDefinition LoadWsDef(ScrText scrText) + { + // Don't load anything from disk for testing and just return the one we already have + return wsDef; + } + + public override void Save(ScrText? scrText, string? newFileName = null) + { + // Don't save anything to disk for testing + string id = wsDef.GetLanguageId().Id; + if (WritingSystemRepository.TryGet(id, out _)) + WritingSystemRepository.Remove(id); + + WritingSystemRepository.Set(wsDef); + } + + public void SetLanguageId(LanguageId langId) + { + wsDef.LanguageTag = langId.Id; + } + + public void ForceSaveLdml(ScrText scrText) + { + WriteLdmlFile(scrText, wsDef, false); + } + } +} diff --git a/c-sharp-tests/DummyScrStylesheet.cs b/c-sharp-tests/DummyScrStylesheet.cs new file mode 100644 index 0000000000..4c6d2bada7 --- /dev/null +++ b/c-sharp-tests/DummyScrStylesheet.cs @@ -0,0 +1,95 @@ +using Paratext.Data; +using System.Diagnostics.CodeAnalysis; + +namespace TestParanextDataProvider +{ + /// + /// In-memory stylesheet used for testing + /// + /// Shamelessly stolen from Paratext tests and simplified + [ExcludeFromCodeCoverage] + internal class DummyScrStylesheet : ScrStylesheet + { + /// + /// Creates a DummyScrStylesheet with basic style definitions. + /// + public DummyScrStylesheet() : base("Dummy Style Sheet") + { + AddTag("v", TextProperties.scVerse | TextProperties.scPublishable, ScrTextType.scVerseText, + ScrStyleType.scCharacterStyle, + "li li1 li2 li3 li4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr q q1 q2 q3 q4 qc qr qm qm1 qm2 qm3 qm4 " + + "tr tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 s3 d sp"); + + AddTag("id", + TextProperties.scParagraph | TextProperties.scNonpublishable | TextProperties.scNonvernacular | + TextProperties.scBook, + ScrTextType.scOther, ScrStyleType.scParagraphStyle, ""); + AddTag("ip", + TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scOther, ScrStyleType.scParagraphStyle, "id"); + AddTag("nb", + TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scVerseText, ScrStyleType.scParagraphStyle, "c"); + AddTag("mt", TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scTitle, ScrStyleType.scParagraphStyle, "id"); + AddTag("c", TextProperties.scChapter | TextProperties.scPublishable, ScrTextType.scOther, + ScrStyleType.scParagraphStyle, "id"); + AddTag("cp", TextProperties.scParagraph, ScrTextType.scOther, ScrStyleType.scParagraphStyle, "c"); + AddTag("p", TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scVerseText, ScrStyleType.scParagraphStyle, "c"); + AddTag("s", + TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular | + TextProperties.scLevel_1, + ScrTextType.scSection, ScrStyleType.scParagraphStyle, "c"); + AddTag("rem", TextProperties.scParagraph | TextProperties.scNonpublishable | TextProperties.scNonvernacular, + ScrTextType.scOther, ScrStyleType.scParagraphStyle, "id ide c"); + + AddTag("w", TextProperties.scParagraph | TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scVerseText, ScrStyleType.scCharacterStyle, + "ip im li li1 li2 li3 li4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr d q q1 q2 q3 q4 " + + "qc qr qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 " + + "s s1 s2 s3 s4 NEST", "w*", "?lemma ?strong ?srcloc"); + AddTag("em", TextProperties.scPublishable | TextProperties.scVernacular, + 0 /* no specific text type*/, ScrStyleType.scCharacterStyle, + "ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d " + + "li li1 li2 li3 li4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr q q1 q2 q3 q4 qc qr " + + "qm qm1 qm2 qm3 sp tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe ef NEST", + "em*"); + AddTag("nd", TextProperties.scPublishable | TextProperties.scVernacular, + ScrTextType.scVerseText, ScrStyleType.scCharacterStyle, + "ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d li li1 li2 li3 " + + "li4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr q q1 q2 q3 q4 qc qr qm qm1 qm2 qm3 tr th1 th2 th3 " + + "th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe ef NEST", + "nd*"); + } + + /// + /// Add a tag for style with the specified properties. + /// + private void AddTag(string marker, TextProperties textProps, ScrTextType textType, + ScrStyleType styleType, string occursUnder, string endMarker = "", string? rawAttributes = null) + { + ScrTag newTag = new() + { + Marker = marker, + TextProperties = textProps, + TextType = textType, + StyleType = styleType + }; + if (!string.IsNullOrEmpty(endMarker)) + newTag.Endmarker = endMarker; + if (!string.IsNullOrEmpty(occursUnder)) + newTag.OccursUnder = occursUnder; + if (!string.IsNullOrEmpty(rawAttributes)) + newTag.RawAttributes = rawAttributes; + AddTag(newTag); + } + + private void AddTag(ScrTag tag) + { + AddTagInternal(tag); + if (!string.IsNullOrEmpty(tag.Endmarker)) + AddTagInternal(new ScrTag(tag.Endmarker) { StyleType = ScrStyleType.scEndStyle }); + } + } +} diff --git a/c-sharp-tests/DummyScrText.cs b/c-sharp-tests/DummyScrText.cs new file mode 100644 index 0000000000..6f8a694aa3 --- /dev/null +++ b/c-sharp-tests/DummyScrText.cs @@ -0,0 +1,314 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text; +using System.Xml; +using Paranext.DataProvider.Projects; +using Paratext.Data; +using Paratext.Data.Languages; +using Paratext.Data.ProjectFileAccess; +using Paratext.Data.ProjectSettingsAccess; +using Paratext.Data.Users; +using PtxUtils; + +namespace TestParanextDataProvider +{ + [ExcludeFromCodeCoverage] + internal class DummyScrText : ScrText + { + private readonly HexId _id; + + public DummyScrText(ProjectDetails projectDetails) + : base( + new ProjectName + { + ShortName = projectDetails.Name, + ProjectPath = projectDetails.HomeDirectory + }, + RegistrationInfo.DefaultUser + ) + { + _id = HexId.FromStr(projectDetails.Metadata.Id); + projectName = new ProjectName + { + ShortName = projectDetails.Name + _id, + ProjectPath = projectDetails.HomeDirectory + }; + + Settings.Editable = true; + Settings.UsfmVersion = UsfmVersionOption.Version3; + + cachedDefaultStylesheet.Set(new DummyScrStylesheet()); + cachedFrontBackStylesheet.Set(cachedDefaultStylesheet); + + LanguageId langId = new("dmy", null, null, null); + DummyScrLanguage language = new(this); + language.SetLanguageId(langId); + language.Save(null); + + Settings.LanguageID = langId; + language.ForceSaveLdml(this); + } + + public DummyScrText() + : this( + new ProjectDetails( + "Dummy", + new ProjectMetadata(HexId.CreateNew().ToString(), []), + "" + ) + ) { } + + protected override void Load(bool ignoreLoadErrors = false) + { + // Nothing to do + } + + protected override ProjectFileManager CreateFileManager() + { + return new InMemoryFileManager(this); + } + + protected override ProjectSettings CreateProjectSettings(bool ignoreFileMissing) + { + ProjectSettings settings = + new(this, true) + { + FullName = "Test ScrText", + MinParatextDataVersion = ParatextInfo.MinSupportedParatextDataVersion, + Guid = _id + }; + + return settings; + } + + #region InMemoryFileManager class + private sealed class InMemoryFileManager : ProjectFileManager + { + private static readonly Encoding s_utf8NoBOM = new UTF8Encoding(false); + private readonly Dictionary _fileSystem = new(); + + public InMemoryFileManager(ScrText scrText) + : base(scrText) { } + + // Implementation shamelessly stolen from the Paratext test code and then simplified + + #region Implementation of ProjectFileManager + public override bool IsWritable => true; + + public override bool Exists(string relFilePath) + { + return _fileSystem.ContainsKey(relFilePath); + } + + public override void Delete(string relFilePath) + { + _fileSystem.Remove(relFilePath); + } + + public override void DeleteDirectory(string relDirPath) + { + string[] filesToBeRemoved = _fileSystem + .Keys.Where(k => Path.GetDirectoryName(k) == relDirPath) + .ToArray(); + foreach (string file in filesToBeRemoved) + Delete(file); + } + + public override void MoveFile(string relFilePath, string newRelPath) + { + byte[] fileContents = GetFile(relFilePath); + Delete(relFilePath); + _fileSystem[newRelPath] = new InMemoryFile(fileContents); + } + + public override void CopyFile(string absSourceFilePath, string dstRelPath) + { + throw new NotImplementedException(); + } + + public override IEnumerable ProjectFiles( + string searchPattern, + string? relDirPath = null + ) + { + return Enumerable.Empty(); + } + + public override IEnumerable ProjectDirectories( + string searchPattern, + string? relDirPath = null + ) + { + return Enumerable.Empty(); + } + + public override void WriteFileCreatingBackup( + string relFilePath, + Action writeFile, + Action? validateFile = null + ) + { + writeFile(relFilePath); + } + + public override TextReader OpenFileForRead( + string relFilePath, + Encoding? encoding = null + ) + { + // ENHANCE: Keep track of file locking via a custom reader to further increase testing accuracy. + if (encoding == null) + encoding = s_utf8NoBOM; + return new StreamReader(new MemoryStream(GetFile(relFilePath)), encoding); + } + + public override BinaryReader OpenFileForByteRead(string relFilePath) + { + // ENHANCE: Keep track of file locking via a custom reader to further increase testing accuracy. + return new BinaryReader(new MemoryStream(GetFile(relFilePath))); + } + + public override XmlTextReader OpenFileForXmlRead(string relFilePath) + { + return new XmlTextReader(new MemoryStream(GetFile(relFilePath))); + } + + public override TextWriter OpenFileForWrite( + string relFilePath, + Encoding? encoding = null + ) + { + if (encoding == null) + encoding = s_utf8NoBOM; + return new DummyStreamWriter(this, relFilePath, encoding); + } + + public override BinaryWriter OpenFileForByteWrite(string relFilePath) + { + return new DummyBinaryWriter(this, relFilePath); + } + + public override void SetXml(T obj, string relFilePath) + { + _fileSystem[relFilePath] = new InMemoryFile( + s_utf8NoBOM.GetBytes(Memento.ToXmlString(obj)) + ); + } + + public override T GetXml(string relFilePath) + { + if (!_fileSystem.TryGetValue(relFilePath, out InMemoryFile? file)) + return default!; + + // For some reason, FromXmlString fails miserably when there is a BOM at the start of the string + string strData = s_utf8NoBOM.GetString(file.Data); + if (strData.StartsWith('\uFEFF')) + strData = strData.Substring(1); + + return Memento.FromXmlString(strData); + } + + public override DateTime GetLastWriteTime(string relFilePath) + { + if (!_fileSystem.TryGetValue(relFilePath, out InMemoryFile? file)) + return new DateTime(1601, 1, 1, 0, 0, 0); // This is what .Net does if the file does not exist + return file.WriteTime; + } + + public override void CreateDirIfNotExist(string relDirPath) + { + // ENHANCE: Mimic the real file system where the directory must exist before creating a file to further increase testing accuracy. + _fileSystem[relDirPath] = new InMemoryFile(new byte[0]); + } + + public override string MakeSureFigureIsAccessible(string fileName) + { + return Path.Combine(figuresFolder, fileName); + } + #endregion + + #region Private helper methods + private byte[] GetFile(string relFilePath) + { + if (!_fileSystem.TryGetValue(relFilePath, out InMemoryFile? file)) + throw new FileNotFoundException("File could not be found: " + relFilePath); + return file.Data; + } + #endregion + + #region DummyStreamWriter class + /// + /// Helper class so that the fake text file can be stored in our fake file system when the writer is closed + /// + private sealed class DummyStreamWriter : StreamWriter + { + private readonly InMemoryFileManager _owner; + private readonly string _relFilePath; + + public DummyStreamWriter( + InMemoryFileManager owner, + string relFilePath, + Encoding encoding + ) + : base(new MemoryStream(), encoding) + { + _owner = owner; + _relFilePath = relFilePath; + } + + protected override void Dispose(bool disposing) + { + Flush(); + + _owner._fileSystem[_relFilePath] = new InMemoryFile( + ((MemoryStream)BaseStream).ToArray() + ); + + base.Dispose(disposing); + } + } + #endregion + + #region DummyBinaryWriter class + /// + /// Helper class so that the fake binary file can be stored in our fake file system when the writer is closed + /// + private sealed class DummyBinaryWriter : BinaryWriter + { + private readonly InMemoryFileManager _owner; + private readonly string _relFilePath; + + public DummyBinaryWriter(InMemoryFileManager owner, string relFilePath) + : base(new MemoryStream()) + { + _owner = owner; + _relFilePath = relFilePath; + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + _owner._fileSystem[_relFilePath] = new InMemoryFile( + ((MemoryStream)BaseStream).ToArray() + ); + } + } + #endregion + + #region InMemoryFile class + private sealed class InMemoryFile + { + public readonly DateTime WriteTime; + + public readonly byte[] Data; + + public InMemoryFile(byte[] data) + { + Data = data ?? throw new ArgumentNullException(nameof(data)); + WriteTime = DateTime.Now; + } + } + #endregion + } + #endregion + } +} diff --git a/c-sharp-tests/JsonUtils/MessageConverterTests.cs b/c-sharp-tests/JsonUtils/MessageConverterTests.cs new file mode 100644 index 0000000000..fe05fb5dec --- /dev/null +++ b/c-sharp-tests/JsonUtils/MessageConverterTests.cs @@ -0,0 +1,82 @@ +using System.Diagnostics.CodeAnalysis; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.Messages; + +namespace TestParanextDataProvider.JsonUtils; + +[ExcludeFromCodeCoverage] +public class MessageConverterTests +{ + [Test] + public void Deserialize_Event_SenderIdIsCorrect() + { + string messageToDecode = """ + {"type":"event","eventType":"does-not-matter","senderId":12345,"event":{"also-does-not-matter":""}} + """; + var msg = DeserializeMessageEvent(messageToDecode); + Assert.That(msg.SenderId, Is.EqualTo(12345)); + } + + [Test] + public void Deserialize_ClientConnect_StronglyTypedContentsAreCorrect() + { + string messageToDecode = """ + {"type":"event","eventType":"network:onDidClientConnect","senderId":0,"event":{"clientId":3,"didReconnect":false}} + """; + var msg = DeserializeMessageEvent(messageToDecode); + Assert.That(msg.Event.ClientId, Is.EqualTo(3)); + Assert.That(msg.Event.DidReconnect, Is.False); + } + + [Test] + public void Deserialize_ClientDisconnect_StronglyTypedContentsAreCorrect() + { + string messageToDecode = """ + {"type":"event","eventType":"network:onDidClientDisconnect","senderId":0,"event":{"clientId":123}} + """; + var msg = DeserializeMessageEvent(messageToDecode); + Assert.That(msg.Event.ClientId, Is.EqualTo(123)); + } + + [Test] + public void Deserialize_ObjectDispose_StronglyTypedContentsAreCorrect() + { + string messageToDecode = """ + {"type":"event","eventType":"object:onDidDisposeNetworkObject","senderId":0,"event":"test-main"} + """; + var msg = DeserializeMessageEvent(messageToDecode); + Assert.That(msg.Event, Is.EqualTo("test-main")); + } + + [Test] + public void Deserialize_UnknownEventType_ProducesMessageEvent() + { + string messageToDecode = """ + {"type":"event","eventType":"no-such-event","senderId":0,"event":"What type am I?"} + """; + var msg = DeserializeMessageEvent(messageToDecode); + Assert.That(msg.Event!.ToString(), Is.EqualTo("What type am I?")); + } + + private static MessageType DeserializeMessageEvent(string messageToDecode) + where MessageType : MessageEvent + { + var msg = messageToDecode.DeserializeFromJson(); + Assert.That(msg, Is.Not.Null); + Assert.That(msg!.Event, Is.Not.Null); + + string reserializedMessage = msg.SerializeToJson(); + var msg2 = reserializedMessage.DeserializeFromJson(); + Assert.That(msg2, Is.Not.Null); + Assert.That(msg2!.Event, Is.Not.Null); + + // Make sure that we get the same event contents when doing a round trip through serialization/deserialization + if (msg.GetType() == typeof(MessageEvent)) + // Short cut to check equality of JsonElements + Assert.That(msg.Event!.ToString(), Is.EqualTo(msg2.Event!.ToString())); + else + Assert.That(msg.Event, Is.EqualTo(msg2.Event)); + + return msg; + } +} diff --git a/c-sharp-tests/JsonUtils/TupleTreeTests.cs b/c-sharp-tests/JsonUtils/TupleTreeTests.cs new file mode 100644 index 0000000000..b606799cb6 --- /dev/null +++ b/c-sharp-tests/JsonUtils/TupleTreeTests.cs @@ -0,0 +1,42 @@ +using Paranext.DataProvider.JsonUtils; + +namespace TestParanextDataProvider.JsonUtils +{ + internal class TupleTreeTests + { + private static List<(string key, string val)> ConvertStringsToTuples(params string[] pairs) + { + var retVal = new List<(string key, string val)>(); + if (pairs.Length % 2 != 0) + throw new ArgumentException("keys and values must be provided in pairs"); + for (int i = 0; i < pairs.Length; i += 2) + { + retVal.Add((pairs[i], pairs[i + 1])); + } + return retVal; + } + + [TestCase(new[] { "a", "b" }, new[] { "2" })] + [TestCase(new[] { "a", "b", "c", "d" }, new[] { "2" })] + [TestCase(new[] { "a", "b", "c", "d", "e", "f" }, new[] { "3" })] + [TestCase(new[] { "g", "h" }, new[] { "1" })] + [TestCase(new[] { "y", "z" }, new[] { "4" })] + [TestCase(new[] { "a", "b", "y", "z" }, new[] { "2", "4" })] + [TestCase(new[] { "a", "b", "c", "d", "y", "z" }, new[] { "2", "4" })] + [TestCase(new[] { "a", "b", "c", "d", "e", "f", "y", "z" }, new[] { "3", "4" })] + [TestCase(new string[0], new[] { "1" })] + public void TupleTree_FindAllResults_IsAccurate(string[] nameValuePairs, string[] expected) + { + var tree = new TupleTree("1"); + var values = new List<(string val1, string val2)> { ("a", "b") }; + tree.Add(values, "2"); + values = new List<(string val1, string val2)> { ("a", "b"), ("c", "d"), ("e", "f") }; + tree.Add(values, "3"); + values = new List<(string val1, string val2)> { ("y", "z") }; + tree.Add(values, "4"); + var results = tree.FindAllResults(ConvertStringsToTuples(nameValuePairs)); + var resultsList = results.ToArray(); + Assert.That(resultsList, Is.EquivalentTo(expected)); + } + } +} diff --git a/c-sharp-tests/MessageHandlers/MessageHandlerEventTests.cs b/c-sharp-tests/MessageHandlers/MessageHandlerEventTests.cs new file mode 100644 index 0000000000..29914059b8 --- /dev/null +++ b/c-sharp-tests/MessageHandlers/MessageHandlerEventTests.cs @@ -0,0 +1,91 @@ +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using System.Diagnostics.CodeAnalysis; + +namespace TestParanextDataProvider.MessageHandlers; + +[ExcludeFromCodeCoverage] +public class MessageHandlerEventTests +{ + [Test] + public void HandleMessage_NoHandlers_NothingHappens() + { + MessageHandlerEvent mhe = new(); + + VerifyResults(mhe.HandleMessage(TestMessage), 0); + } + + [Test] + public void HandleMessage_OneHandler_RegistrationWorks() + { + MessageHandlerEvent mhe = new(); + + mhe.RegisterEventHandler(TestEventType, ProcessEvent1); + VerifyResults(mhe.HandleMessage(TestMessage), 1); + + mhe.RegisterEventHandler(TestEventType, ProcessEvent1); + VerifyResults(mhe.HandleMessage(TestMessage), 1); + + mhe.UnregisterEventHandler(TestEventType, ProcessEvent1); + VerifyResults(mhe.HandleMessage(TestMessage), 0); + } + + [Test] + public void HandleMessage_SeveralHandlers_RegistrationWorks() + { + MessageHandlerEvent mhe = new(); + + mhe.RegisterEventHandler(TestEventType, ProcessEvent1); + mhe.RegisterEventHandler(TestEventType, ProcessEvent2); + VerifyResults(mhe.HandleMessage(TestMessage), 2); + + mhe.UnregisterEventHandler(TestEventType, ProcessEvent2); + VerifyResults(mhe.HandleMessage(TestMessage), 1); + + mhe.RegisterEventHandler(TestEventType, ProcessEvent2); + mhe.RegisterEventHandler(TestEventType, ProcessEvent3); + VerifyResults(mhe.HandleMessage(TestMessage), 3); + + mhe.RegisterEventHandler(TestEventType, ProcessEvent1); + VerifyResults(mhe.HandleMessage(TestMessage), 3); + } + + private static void VerifyResults(IEnumerable messages, int expectedCount) + { + var messageList = new List(messages); + Assert.That(messageList, Has.Count.EqualTo(expectedCount)); + + if (expectedCount == 0) + return; + + List messageContents = new(); + foreach (var msg in messageList) + { + messageContents.Add(((MessageEvent)msg).Event!.ToString()!); + } + messageContents.Sort(); + for (int i = 0; i < expectedCount; i++) + { + Assert.That(messageContents[i], Is.EqualTo((i + 1).ToString())); + } + } + + private static string TestEventType => EventType.OBJECT_DISPOSE; + + private static MessageEvent TestMessage => new MessageEventObjectDisposed("test"); + + private static Message ProcessEvent1(MessageEvent messageEvent) + { + return new MessageEventObjectDisposed("1"); + } + + private static Message ProcessEvent2(MessageEvent messageEvent) + { + return new MessageEventObjectDisposed("2"); + } + + private static Message ProcessEvent3(MessageEvent messageEvent) + { + return new MessageEventObjectDisposed("3"); + } +} diff --git a/c-sharp-tests/NetworkObjects/DummySettingsService.cs b/c-sharp-tests/NetworkObjects/DummySettingsService.cs new file mode 100644 index 0000000000..24f4dbdd79 --- /dev/null +++ b/c-sharp-tests/NetworkObjects/DummySettingsService.cs @@ -0,0 +1,50 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json.Nodes; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.NetworkObjects; +using Paranext.DataProvider.Services; + +namespace TestParanextDataProvider; + +[ExcludeFromCodeCoverage] +internal class DummySettingsService : DataProvider +{ + private readonly Dictionary _settingValues = []; + private readonly List _supportedFunctions = ["get"]; + + public DummySettingsService(PapiClient papiClient) + : base(SettingsService.SETTINGS_SERVICE_NAME, papiClient) { } + + public void AddSettingValue(string key, object value) + { + _settingValues.Add(key, value); + } + + public void ClearSettingValues() + { + _settingValues.Clear(); + } + + protected override Task StartDataProvider() + { + return Task.CompletedTask; + } + + protected override List GetFunctionNames() + { + return _supportedFunctions; + } + + protected override ResponseToRequest HandleRequest(string functionName, JsonArray args) + { + return functionName switch + { + "get" + => _settingValues.ContainsKey(args[0]!.ToString()) + ? ResponseToRequest.Succeeded(_settingValues[args[0]!.ToString()]) + : ResponseToRequest.Failed($"Could not find value for setting {args[0]}"), + _ => ResponseToRequest.Failed($"Unexpected function: {functionName}") + }; + } +} diff --git a/c-sharp-tests/PapiTestBase.cs b/c-sharp-tests/PapiTestBase.cs new file mode 100644 index 0000000000..14333d2621 --- /dev/null +++ b/c-sharp-tests/PapiTestBase.cs @@ -0,0 +1,341 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Web; +using System.Xml.Linq; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.Projects; +using Paratext.Data; + +namespace TestParanextDataProvider +{ + [TestFixture] + [ExcludeFromCodeCoverage] + internal abstract class PapiTestBase + { + #region Member variables + private DummyPapiClient? _client; + private DummyLocalParatextProjects? _projects; + #endregion + + #region Test setup/teardown + [SetUp] + public virtual Task TestSetup() + { + _projects = new DummyLocalParatextProjects(); + _client = new DummyPapiClient(); + + return Task.CompletedTask; + } + + [TearDown] + public virtual void TestTearDown() + { + List projects = ScrTextCollection + .ScrTexts(IncludeProjects.Everything) + .ToList(); + + foreach (ScrText project in projects) + ScrTextCollection.Remove(project, false); + + _client?.Dispose(); + } + #endregion + + #region Properties + protected DummyPapiClient Client + { + get + { + if (_client == null) + throw new InvalidOperationException( + "Can not access Client before test setup is run" + ); + return _client; + } + } + + protected DummyLocalParatextProjects ParatextProjects + { + get + { + if (_projects == null) + throw new InvalidOperationException( + "Can not access Projects before test setup is run" + ); + return _projects; + } + } + #endregion + + #region Helper methods to create test data + /// + /// Creates a new dummy project for testing purposes + /// + protected static DummyScrText CreateDummyProject() + { + DummyScrText scrText = new(); + return scrText; + } + + /// + /// Creates project details from the specified project + /// + protected static ProjectDetails CreateProjectDetails(ScrText scrText) + { + return CreateProjectDetails(scrText.Guid.ToString(), scrText.Name); + } + + /// + /// Creates fake project details to fake the existence of a project + /// + /// + protected static ProjectDetails CreateProjectDetails( + string id, + string name, + List? projectInterfaces = null + ) + { + ProjectMetadata metadata = new(id, projectInterfaces ?? []); + return new ProjectDetails(name, metadata, "testDirectoryThatDoesNotExist"); + } + + /// + /// Creates JSON that represents a verse reference having the specified parameters + /// + protected static JsonNode CreateVerseRefNode(int bookNum, int chapterNum, int verseNum) + { + return JsonNode.Parse( + "{ \"versification\":\"English\", " + + $"\"_bookNum\":{bookNum}, \"_chapterNum\":{chapterNum}, \"_verseNum\":{verseNum} }}" + )!; + } + + /// + /// Creates JSON that represents a verse reference having the specified parameters in full + /// serialization. + /// + protected static JsonNode CreateFullSerializationVerseRefNode( + string book, + int chapterNum, + int verseNum + ) + { + var jsonObject = new JsonObject + { + ["book"] = book, + ["chapterNum"] = chapterNum, + ["verseNum"] = verseNum, + ["versificationStr"] = "English", + }; + return jsonObject; + } + + /// + /// Creates JSON that represents a verse reference having the specified parameters in full + /// serialization. + /// + /// Includes the `verse: undefined` property from @sillsdev/scripture v2.0.0 + /// https://github.com/sillsdev/scripture/blob/209054a89652ba9f6aec6bd142aba439cd952bc5/src/verse-ref.ts#L491 + /// + protected static JsonNode CreateFullSerializationVerseRefNodev2_0_0( + string book, + int chapterNum, + int verseNum + ) + { + var jsonObject = new JsonObject + { + ["book"] = book, + ["chapterNum"] = chapterNum, + ["verse"] = null, + ["verseNum"] = verseNum, + ["versificationStr"] = "English", + }; + return jsonObject; + } + + /// + /// Creates a JSON string node with the specified data + /// + protected static JsonNode CreateJsonString(string data) + { + JsonNode node = JsonNode.Parse( + $"{{ \"data\":\"{HttpUtility.JavaScriptStringEncode(data)}\" }}" + )!; + return node.Root["data"]!; + } + + /// + /// Replicates the creation of the JsonElement that is given to requests when + /// coming from the server. + /// + protected static JsonElement CreateRequestMessage( + string function, + params object[] parameters + ) + { + StringBuilder jsonBldr = new StringBuilder(); + jsonBldr.Append("{ \"value\":["); + jsonBldr.Append("\"").Append(function).Append("\""); + if (parameters.Length > 0) + jsonBldr.Append(", "); + + for (var i = 0; i < parameters.Length; i++) + { + if (i > 0) + jsonBldr.Append(", "); + + object param = parameters[i]; + switch (param) + { + case string str: + jsonBldr + .Append("\"") + .Append(HttpUtility.JavaScriptStringEncode(str)) + .Append("\""); + break; + case JsonNode node: + jsonBldr.Append(node.ToJsonString()); + break; + default: + jsonBldr.Append(param); + break; + } + } + + jsonBldr.Append("] }"); + + JsonDocument serverMessage = JsonDocument.Parse(jsonBldr.ToString()); + return serverMessage.RootElement.GetProperty("value"); + } + + /// + /// Creates a Data Scope node that is given to requests when + /// coming from the server. + /// + protected static JsonNode CreateDataScope( + string extensionName, + string dataQualifier, + string? dataType = null + ) + { + // NOTE: projectId and projectName are usually automatically supplied + + return JsonNode.Parse( + $"{{ \"extensionName\":\"{extensionName}\", " + + $"\"dataQualifier\":\"{dataQualifier}\" }}" + + (dataType != null ? $"\"dataType\":\"{dataType}\"" : "") + )!; + } + #endregion + + #region Helper methods to verify data + /// + /// Asserts that the two snippets of USFM are the same. This function normalizes both snippets + /// to ensure maximum compatibility between them. + /// + protected static void VerifyUsfmSame( + string usfm1, + string usfm2, + ScrText scrText, + int bookNum + ) + { + usfm1 = UsfmToken.NormalizeUsfm(scrText, bookNum, usfm1); + usfm2 = UsfmToken.NormalizeUsfm(scrText, bookNum, usfm2); + + Assert.That(usfm1, Is.EqualTo(usfm2)); + } + + /// + /// Asserts that the two snippets of USX are the same. This function normalizes both snippets + /// to ensure maximum compatibility between them. + /// + protected static void VerifyUsxSame(string usx1, string usx2) + { + XDocument doc1; + using (TextReader reader1 = new StringReader(usx1)) + doc1 = XDocument.Load(reader1); + + XDocument doc2; + using (TextReader reader2 = new StringReader(usx2)) + doc2 = XDocument.Load(reader2); + + Assert.That( + doc1.Root!.ToString().Replace("\r", "").Replace("\n", ""), + Is.EqualTo(doc2.Root!.ToString().Replace("\r", "").Replace("\n", "")) + ); + } + + /// + /// Verifies the contents of a server response message + /// + protected static void VerifyResponse( + Message message, + string? expectedErrorMessage, + string expectedResponseType, + int expectedRequestId, + object? expectedContents + ) + { + Assert.Multiple(() => + { + VerifyResponseExceptContents( + message, + expectedErrorMessage, + expectedResponseType, + expectedRequestId + ); + Assert.That(((MessageResponse)message).Contents, Is.EqualTo(expectedContents)); + }); + } + + /// + /// Verifies the contents of a server response message ignoring the contents + /// + protected static void VerifyResponseExceptContents( + Message message, + string? expectedErrorMessage, + string expectedResponseType, + int expectedRequestId + ) + { + Assert.Multiple(() => + { + Assert.That(message.Type, Is.EqualTo(MessageType.RESPONSE)); + + MessageResponse response = (MessageResponse)message; + Assert.That(response.ErrorMessage ?? "", Does.Contain(expectedErrorMessage ?? "")); + Assert.That( + response.Success, + Is.EqualTo(string.IsNullOrEmpty(expectedErrorMessage)) + ); + Assert.That(response.RequestType, Is.EqualTo(expectedResponseType)); + Assert.That(response.RequestId, Is.EqualTo(expectedRequestId)); + }); + } + + /// + /// Verifies a ResponseToRequest from a PDP call + /// + protected static void VerifyResponseToRequest( + ResponseToRequest response, + string? expectedErrorMessage, + string? expectedContents + ) + { + Assert.Multiple(() => + { + Assert.That(response.ErrorMessage, Is.EqualTo(expectedErrorMessage)); + Assert.That(response.Success, Is.EqualTo(expectedErrorMessage == null)); + string? contents = response.Contents as string; + Assert.That(contents, Is.EqualTo(expectedContents)); + }); + } + + #endregion + } +} diff --git a/c-sharp-tests/ParatextDataConnectionTests.cs b/c-sharp-tests/ParatextDataConnectionTests.cs new file mode 100644 index 0000000000..eb9465a5d9 --- /dev/null +++ b/c-sharp-tests/ParatextDataConnectionTests.cs @@ -0,0 +1,99 @@ +using System.ComponentModel; +using System.Configuration; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using Paranext.DataProvider.ParatextUtils; +using Paratext.Data; +using PtxUtils; + +namespace TestParanextDataProvider +{ + [ExcludeFromCodeCoverage] + internal class ParatextDataConnectionTests + { + // Work around a known issue where NUnit doesn't pick up config files + // https://github.com/nunit/nunit3-vs-adapter/issues/356 + private static void EnsureIcuConfigFileIsInPlace() + { + string appConfigFile = ConfigurationManager + .OpenExeConfiguration(ConfigurationUserLevel.None) + .FilePath; + string? appConfigDirectory = Path.GetDirectoryName(appConfigFile); + string icuConfigFile = Path.Join(appConfigDirectory, "icu.net.dll.config"); + if (!File.Exists(icuConfigFile)) + { + // It's a bit hacky to hard code the config file here, but there isn't a great + // source that we can reliably get to from within a test. + File.WriteAllText( + icuConfigFile, + @" + + + +" + ); + } + } + + /// + /// This test is to try figure out if ParatextData will work on Linux and Mac. + /// It may be removed in the future for a more useful test. + /// + [Test] + public void LoadPackagedWEB_LoadsProject() + { + Alert.Implementation = new DummyAlert(); + EnsureIcuConfigFileIsInPlace(); + + Console.WriteLine(Assembly.GetExecutingAssembly().Location); + ParatextGlobals.Initialize("assets"); + + ScrText scrText = ScrTextCollection.Find("WEB"); + Assert.Multiple(() => + { + Assert.That(scrText, Is.Not.Null); + Assert.That(scrText.Name, Is.EqualTo("WEB")); + Assert.That(scrText.Settings.BooksPresentSet.Count, Is.EqualTo(83)); + }); + } + + #region DummyAlert class + private sealed class DummyAlert : Alert + { + protected override AlertResult ShowInternal( + IComponent? owner, + string text, + string caption, + AlertButtons alertButtons, + AlertLevel alertLevel, + AlertDefaultButton defaultButton, + bool showInTaskbar + ) + { + if (text.Contains("unable to find a language definition file for English")) + return AlertResult.Positive; + + Assert.Fail("Unexpected dialog box:\n" + text); + return AlertResult.Negative; + } + + protected override void ShowLaterInternal( + string text, + string caption, + AlertLevel alertLevel + ) + { + ShowInternal( + null, + text, + caption, + AlertButtons.Ok, + alertLevel, + AlertDefaultButton.Button1, + false + ); + } + } + #endregion + } +} diff --git a/c-sharp-tests/Projects/FixtureSetup.cs b/c-sharp-tests/Projects/FixtureSetup.cs new file mode 100644 index 0000000000..2b287ee1ca --- /dev/null +++ b/c-sharp-tests/Projects/FixtureSetup.cs @@ -0,0 +1,36 @@ +using System.Diagnostics.CodeAnalysis; +using Paranext.DataProvider.ParatextUtils; + +namespace TestParanextDataProvider.Projects +{ + [SetUpFixture] + [ExcludeFromCodeCoverage] + public class FixtureSetup + { + private static readonly string s_testFolder = Path.Combine( + Path.GetTempPath(), + "Platform.Bible.Tests" + ); + + public static string TestFolderPath => s_testFolder; + + [OneTimeSetUp] + public void RunBeforeAnyTests() + { + // Create folder for test running. Shouldn't actually be used, but ParatextData + // throws an error if the directory doesn't exist. + if (!Directory.Exists(s_testFolder)) + Directory.CreateDirectory(s_testFolder); + + ParatextGlobals.Initialize(s_testFolder); + } + + [OneTimeTearDown] + public void RunAfterAnyTests() + { + // Clean up after the tests are run. + if (Directory.Exists(s_testFolder)) + Directory.Delete(s_testFolder, true); + } + } +} diff --git a/c-sharp-tests/Projects/LocalParatextProjectsTests.cs b/c-sharp-tests/Projects/LocalParatextProjectsTests.cs new file mode 100644 index 0000000000..aa96f23d50 --- /dev/null +++ b/c-sharp-tests/Projects/LocalParatextProjectsTests.cs @@ -0,0 +1,60 @@ +using System.Diagnostics.CodeAnalysis; +using Paranext.DataProvider.ParatextUtils; +using Paranext.DataProvider.Projects; + +namespace TestParanextDataProvider.Projects; + +[ExcludeFromCodeCoverage] +[TestFixture] +public class LocalParatextProjectsTests +{ + private LocalParatextProjects _localProjects; + + [SetUp] + public void SetUp() + { + _localProjects = new TestLocalParatextProjectsInTempDir(); + } + + [TearDown] + public void TearDown() + { + if (_localProjects is IDisposable disposable) + disposable.Dispose(); + } + + [TestCase("-ABC_441f1e41ffb8d319650847df35f4ffb78f12914e", "HIMOM", "1234")] + [TestCase("-_441f1e41ffb8d319650847df35f4ffb78f12914e", "MONKEY", "abc123")] + [TestCase("ABC@_441f1e41ffb8d319650847df35f4ffb78f12914e", "ABC@_441", "abe5")] + [TestCase("A_B_C", "123", "affff00990")] + [TestCase("ABC_", "123", "a236")] + [TestCase("_441f1e41ffb8d319650847df35f4ffb78f12914e", "abs", "0626")] + [TestCase("ABC", "sdlkfjasdf", "1606")] + public void Initialize_SingleProject_ProjectIsRetrievable(string folder, string name, string id) + { + CreateTempProject(folder, CreateParatextProjectDetails(folder, name, id)); + + _localProjects.Initialize(false); + var details = _localProjects.GetAllProjectDetails().Single(); + Assert.That(details, Is.EqualTo(_localProjects.GetProjectDetails(id))); + Assert.That(details.HomeDirectory, Does.EndWith(folder)); + // ScrText always prioritizes the folder name over the Name setting as the "name" even when + // accessing scrText.Settings.Name. So basically name here doesn't get set to anything. + Assert.That(details.Name, Is.EqualTo(folder)); + Assert.That(details.Metadata.Id.Equals(id, StringComparison.OrdinalIgnoreCase)); + } + + private void CreateTempProject(string folder, ProjectDetails details) + { + ((TestLocalParatextProjectsInTempDir)_localProjects).CreateTempProject(folder, details); + } + + private static ProjectDetails CreateParatextProjectDetails( + string folder, + string name, + string id + ) + { + return new ProjectDetails(name, new ProjectMetadata(id, ["paratext"]), folder); + } +} diff --git a/c-sharp-tests/Projects/MinimalParatextProjectSettings.cs b/c-sharp-tests/Projects/MinimalParatextProjectSettings.cs new file mode 100644 index 0000000000..e627c31506 --- /dev/null +++ b/c-sharp-tests/Projects/MinimalParatextProjectSettings.cs @@ -0,0 +1,13 @@ +using System.Xml.Serialization; + +namespace TestParanextDataProvider.Projects +{ + [XmlRoot("ScriptureText")] + public class MinimalParatextProjectSettings + { + public string? Name { get; set; } + public string? Guid { get; set; } + public string? LanguageIsoCode { get; set; } + public string? MinParatextVersion { get; set; } + } +} diff --git a/c-sharp-tests/Projects/ParatextDataProviderTests.cs b/c-sharp-tests/Projects/ParatextDataProviderTests.cs new file mode 100644 index 0000000000..62e6d06068 --- /dev/null +++ b/c-sharp-tests/Projects/ParatextDataProviderTests.cs @@ -0,0 +1,704 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Nodes; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.Projects; +using Paranext.DataProvider.Services; +using Paratext.Data; +using Paratext.Data.ProjectSettingsAccess; +using SIL.Scripture; +using static Paranext.DataProvider.Projects.ParatextProjectDataProvider; + +namespace TestParanextDataProvider.Projects +{ + [ExcludeFromCodeCoverage] + internal class ParatextDataProviderTests : PapiTestBase + { + private const string PdpName = "soup"; + private const string PdpDataRequest = "object:soup-pdp-data.function"; + private const string PdpDataUpdateEvent = "soup-pdp-data:onDidUpdate"; + + private ScrText _scrText = null!; // Will be non-null when the test runs + private ProjectDetails _projectDetails = null!; // Will be non-null when the test runs + + [SetUp] + public override async Task TestSetup() + { + await base.TestSetup(); + _scrText = CreateDummyProject(); + + _projectDetails = CreateProjectDetails(_scrText); + ParatextProjects.FakeAddProject(_projectDetails, _scrText); + + var settingsService = new DummySettingsService(Client); + await settingsService.RegisterDataProvider(); + settingsService.AddSettingValue(Settings.INCLUDE_MY_PARATEXT_9_PROJECTS, true); + } + + [TearDown] + public void TearDown() + { + _scrText?.Dispose(); + } + + [TestCase("getBookUSFM")] + [TestCase("getChapterUSFM")] + [TestCase("getVerseUSFM")] + [TestCase("getChapterUSX")] + [TestCase("setChapterUSX")] + public async Task GetFunctions_MissingParameter(string function) + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage(function); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + // TODO: Handle this better + VerifyResponse( + result, + "Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')", + requestType, + requesterId, + null + ); + } + + [TestCase("unknownFunction", 5, 1, 0, "Unknown function: unknownFunction")] + [TestCase( + "getBookUSFM", + 0, + 1, + 0, + "SIL.Scripture.VerseRefException: BookNum must be greater than zero and less than or equal to last book" + )] + [TestCase( + "getChapterUSFM", + 2, + -1, + 0, + "SIL.Scripture.VerseRefException: ChapterNum can not be negative" + )] + [TestCase( + "getVerseUSFM", + 2, + 1, + -1, + "SIL.Scripture.VerseRefException: VerseNum can not be negative" + )] + public async Task GetFunctions_InvalidParameters( + string function, + int bookNum, + int chapterNum, + int verseNum, + string expectedError + ) + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateVerseRefNode(bookNum, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, expectedError, requestType, requesterId, null); + } + + [TestCase("unknownFunction", "DEU", 1, 0, "Unknown function: unknownFunction")] + [TestCase( + "getBookUSFM", + "***", // bookNum: 0 + 1, + 0, + "SIL.Scripture.VerseRefException: BookNum must be greater than zero and less than or equal to last book" + )] + public async Task GetFunctions_FullSerialization_InvalidParameters( + string function, + string book, + int chapterNum, + int verseNum, + string expectedError + ) + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateFullSerializationVerseRefNode(book, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, expectedError, requestType, requesterId, null); + } + + [TestCase( + "getBookUSFM", + "***", // bookNum: 0 + 1, + 0, + "SIL.Scripture.VerseRefException: BookNum must be greater than zero and less than or equal to last book" + )] + public async Task GetFunctions_FullSerializationv2_0_0_InvalidParameters( + string function, + string book, + int chapterNum, + int verseNum, + string expectedError + ) + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateFullSerializationVerseRefNodev2_0_0(book, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, expectedError, requestType, requesterId, null); + } + + [TestCase("getVerseUSFM", 1, 1, 0, @"\id GEN \ip intro \c 1 ")] + [TestCase("getVerseUSFM", 1, 2, 1, @"\v 1 verse one ")] + [TestCase("getVerseUSFM", 1, 2, 6, @"\v 6 verse six ")] + [TestCase("getVerseUSFM", 1, 2, 10, "")] // Missing verse + [TestCase("getVerseUSFM", 1, 6, 1, "")] // Missing chapter + [TestCase("getVerseUSFM", 3, 5, 3, "")] // Missing book + [TestCase("getChapterUSFM", 1, 1, 0, @"\id GEN \ip intro \c 1 \v 1 some text")] + [TestCase( + "getChapterUSFM", + 1, + 2, + 0, + @"\c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven" + )] + [TestCase("getChapterUSFM", 1, 3, 0, @"\c 3 \p \v 1 bla")] + [TestCase("getChapterUSFM", 1, 5, 0, "")] // Missing chapter + [TestCase("getChapterUSFM", 3, 5, 0, "")] // Missing book + [TestCase( + "getBookUSFM", + 1, + 2, + 0, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla" + )] + [TestCase("getBookUSFM", 3, 2, 0, "")] // Missing book + public async Task GetFunctions_ValidResults( + string function, + int bookNum, + int chapterNum, + int verseNum, + string expectedResult + ) + { + Random random = new(); + int requesterId = random.Next(); + + _scrText.PutText( + 1, + 0, + false, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla", + null + ); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateVerseRefNode(bookNum, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponseExceptContents(result, null, requestType, requesterId); + string? stringContents = (string?)((MessageResponse)result).Contents; + VerifyUsfmSame(stringContents!, expectedResult, _scrText, 1); + } + + [TestCase("getVerseUSFM", "GEN", 1, 0, @"\id GEN \ip intro \c 1 ")] + [TestCase("getVerseUSFM", "GEN", 2, 1, @"\v 1 verse one ")] + [TestCase("getVerseUSFM", "GEN", 2, 6, @"\v 6 verse six ")] + [TestCase("getVerseUSFM", "GEN", 2, 10, "")] // Missing verse + [TestCase("getVerseUSFM", "GEN", 6, 1, "")] // Missing chapter + [TestCase("getVerseUSFM", "LEV", 5, 3, "")] // Missing book + [TestCase("getChapterUSFM", "GEN", 1, 0, @"\id GEN \ip intro \c 1 \v 1 some text")] + [TestCase( + "getChapterUSFM", + "GEN", + 2, + 0, + @"\c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven" + )] + [TestCase("getChapterUSFM", "GEN", 3, 0, @"\c 3 \p \v 1 bla")] + [TestCase("getChapterUSFM", "GEN", 5, 0, "")] // Missing chapter + [TestCase("getChapterUSFM", "LEV", 5, 0, "")] // Missing book + [TestCase( + "getBookUSFM", + "GEN", + 2, + 0, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla" + )] + [TestCase("getBookUSFM", "LEV", 2, 0, "")] // Missing book + public async Task GetFunctions_FullSerialization_ValidResults( + string function, + string book, + int chapterNum, + int verseNum, + string expectedResult + ) + { + Random random = new(); + int requesterId = random.Next(); + + _scrText.PutText( + 1, + 0, + false, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla", + null + ); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateFullSerializationVerseRefNode(book, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponseExceptContents(result, null, requestType, requesterId); + string? stringContents = (string?)((MessageResponse)result).Contents; + VerifyUsfmSame(stringContents!, expectedResult, _scrText, 1); + } + + [TestCase("getVerseUSFM", "GEN", 1, 0, @"\id GEN \ip intro \c 1 ")] + [TestCase("getVerseUSFM", "GEN", 2, 1, @"\v 1 verse one ")] + [TestCase("getVerseUSFM", "GEN", 2, 6, @"\v 6 verse six ")] + [TestCase("getVerseUSFM", "GEN", 2, 10, "")] // Missing verse + [TestCase("getVerseUSFM", "GEN", 6, 1, "")] // Missing chapter + [TestCase("getVerseUSFM", "LEV", 5, 3, "")] // Missing book + [TestCase("getChapterUSFM", "GEN", 1, 0, @"\id GEN \ip intro \c 1 \v 1 some text")] + [TestCase( + "getChapterUSFM", + "GEN", + 2, + 0, + @"\c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven" + )] + [TestCase("getChapterUSFM", "GEN", 3, 0, @"\c 3 \p \v 1 bla")] + [TestCase("getChapterUSFM", "GEN", 5, 0, "")] // Missing chapter + [TestCase("getChapterUSFM", "LEV", 5, 0, "")] // Missing book + [TestCase( + "getBookUSFM", + "GEN", + 2, + 0, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla" + )] + [TestCase("getBookUSFM", "LEV", 2, 0, "")] // Missing book + public async Task GetFunctions_FullSerializationv2_0_0_ValidResults( + string function, + string book, + int chapterNum, + int verseNum, + string expectedResult + ) + { + Random random = new(); + int requesterId = random.Next(); + + _scrText.PutText( + 1, + 0, + false, + @"\id GEN \ip intro \c 1 \v 1 some text \c 2 \p \v 1 verse one \v 6 verse six \v 7 verse seven \c 3 \p \v 1 bla", + null + ); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonElement serverMessage = CreateRequestMessage( + function, + CreateFullSerializationVerseRefNodev2_0_0(book, chapterNum, verseNum) + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponseExceptContents(result, null, requestType, requesterId); + string? stringContents = (string?)((MessageResponse)result).Contents; + VerifyUsfmSame(stringContents!, expectedResult, _scrText, 1); + } + + [TestCase( + 1, + 4, + 0, + @"" + + @"a whole new chapter!", + @"\id GEN \ip intro \c 2 \p \v 1 verse one \v 7 verse seven \c 3 \p \v 1 bla \c 4 \p \v 3 a whole new chapter!" + )] + [TestCase( + 1, + 2, + 0, + @"" + + @"New chapter text.", + @"\id GEN \ip intro \c 2 \p \v 2 New chapter text. \c 3 \p \v 1 bla" + )] + public async Task SetChapterUsx_ValidResults( + int bookNum, + int chapterNum, + int verseNum, + string newValue, + string expectedResult + ) + { + Random random = new(); + int requesterId = random.Next(); + + _scrText.PutText( + 1, + 0, + false, + @"\id GEN \ip intro \c 2 \p \v 1 verse one \v 7 verse seven \c 3 \p \v 1 bla", + null + ); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + // Set up an event listener to listen for the update + List updateEvents = new(); + string dataUpdateEvent = PdpDataUpdateEvent; + Client.RegisterEventHandler( + dataUpdateEvent, + (e) => + { + updateEvents.Add(e); + return null; + } + ); + + JsonElement serverMessage = CreateRequestMessage( + "setChapterUSX", + CreateVerseRefNode(bookNum, chapterNum, verseNum), + newValue + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, null, requestType, requesterId, AllScriptureDataTypes); + + // Verify an update event was sent out properly + Assert.That(updateEvents.Count, Is.EqualTo(1)); + Assert.That(updateEvents[0].Event, Is.EqualTo(AllScriptureDataTypes)); + + // Verify the new text was saved to disk + VerseRef reference = + new(bookNum, chapterNum, verseNum, _scrText.Settings.Versification); + VerifyUsfmSame(_scrText.GetText(reference, false, false), expectedResult, _scrText, 1); + + // Verify getting the same reference gets the new data (make sure no caching problems) + JsonElement serverMessage2 = CreateRequestMessage( + "getChapterUSX", + CreateVerseRefNode(bookNum, chapterNum, verseNum), + newValue + ); + Message result2 = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage2)) + .First(); + VerifyResponseExceptContents(result2, null, requestType, requesterId); + string? stringContents = (string?)((MessageResponse)result2).Contents; + VerifyUsxSame(stringContents!, newValue); + } + + [TestCase( + 1, + 4, + 0, + @"\c 4 \p \v 3 a whole new chapter!", + @"\id GEN \ip intro \c 2 \p \v 1 verse one \v 7 verse seven \c 3 \p \v 1 bla \c 4 \p \v 3 a whole new chapter!" + )] + [TestCase( + 1, + 2, + 0, + @"\c 2 \p \v 2 New chapter text.", + @"\id GEN \ip intro \c 2 \p \v 2 New chapter text. \c 3 \p \v 1 bla" + )] + public async Task SetChapterUsfm_ValidResults( + int bookNum, + int chapterNum, + int verseNum, + string newValue, + string expectedResult + ) + { + Random random = new(); + int requesterId = random.Next(); + + _scrText.PutText( + 1, + 0, + false, + @"\id GEN \ip intro \c 2 \p \v 1 verse one \v 7 verse seven \c 3 \p \v 1 bla", + null + ); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + // Set up an event listener to listen for the update + List updateEvents = new(); + string dataUpdateEvent = PdpDataUpdateEvent; + Client.RegisterEventHandler( + dataUpdateEvent, + (e) => + { + updateEvents.Add(e); + return null; + } + ); + + JsonElement serverMessage = CreateRequestMessage( + "setChapterUSFM", + CreateVerseRefNode(bookNum, chapterNum, verseNum), + newValue + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, null, requestType, requesterId, AllScriptureDataTypes); + + // Verify an update event was sent out properly + Assert.That(updateEvents.Count, Is.EqualTo(1)); + Assert.That(updateEvents[0].Event, Is.EqualTo(AllScriptureDataTypes)); + + // Verify the new text was saved to disk + VerseRef reference = + new(bookNum, chapterNum, verseNum, _scrText.Settings.Versification); + VerifyUsfmSame(_scrText.GetText(reference, false, false), expectedResult, _scrText, 1); + + // Verify getting the same reference gets the new data (make sure no caching problems) + JsonElement serverMessage2 = CreateRequestMessage( + "getChapterUSFM", + CreateVerseRefNode(bookNum, chapterNum, verseNum), + newValue + ); + Message result2 = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage2)) + .First(); + VerifyResponseExceptContents(result2, null, requestType, requesterId); + string? stringContents = (string?)((MessageResponse)result2).Contents; + VerifyUsfmSame(stringContents!, newValue, _scrText, 1); + } + + [TestCase(null, "myFile.txt", "Must provide an extension name")] + [TestCase("", "myFile.txt", "Must provide an extension name")] + [TestCase("myExtension", null, "Must provide a data qualifier")] + [TestCase("myExtension", "", "Must provide a data qualifier")] + public async Task GetExtensionData_InvalidParameters_ReturnsError( + string? extensionName, + string? dataQualifier, + string? expectedError + ) + { + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + ResponseToRequest response = provider.GetExtensionData( + new ProjectDataScope + { + ExtensionName = extensionName, + DataQualifier = dataQualifier + } + ); + + VerifyResponseToRequest(response, expectedError, null); + } + + [TestCase(null, "myFile.txt", "Must provide an extension name")] + [TestCase("", "myFile.txt", "Must provide an extension name")] + [TestCase("myExtension", null, "Must provide a data qualifier")] + [TestCase("myExtension", "", "Must provide a data qualifier")] + public async Task SetExtensionData_InvalidParameters_ReturnsError( + string? extensionName, + string? dataQualifier, + string? expectedError + ) + { + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + ResponseToRequest response = provider.SetExtensionData( + new ProjectDataScope + { + ExtensionName = extensionName, + DataQualifier = dataQualifier + }, + "Random data" + ); + + VerifyResponseToRequest(response, expectedError, null); + } + + [Test] + public async Task GetExtensionData_NoData_ReturnsError() + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonNode scope = CreateDataScope("myExtension", "myFile.txt"); + JsonElement serverMessage = CreateRequestMessage("getExtensionData", scope); + + string requestType = new(PdpDataRequest); + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, "Extension data not found", requestType, requesterId, null); + } + + [Test] + public async Task SetAndGetExtensionData_SavesAndGetsData() + { + Random random = new(); + int requesterId = random.Next(); + + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + JsonNode scope = CreateDataScope("myExtension", "myFile.txt"); + JsonElement serverMessage = CreateRequestMessage( + "setExtensionData", + scope, + CreateJsonString("Random file contents") + ); + + string requestType = PdpDataRequest; + Message result = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage)) + .First(); + + VerifyResponse(result, null, requestType, requesterId, "ExtensionData"); + + // Verify the data was updated by reading it right away + JsonElement serverMessage2 = CreateRequestMessage("getExtensionData", scope); + Message result2 = Client + .FakeMessageFromServer(new MessageRequest(requestType, requesterId, serverMessage2)) + .First(); + + VerifyResponse(result2, null, requestType, requesterId, "Random file contents"); + } + + /// + /// Tests that the ParatextProjectDataProvider has successfully registered a validator for + /// the Validity property and that the validator is called to determine that the new value + /// for that property is indeed valid. + /// + [Test] + public async Task SetProjectSetting_ValidVisibility_Succeeds() + { + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + var result = provider.SetProjectSetting( + VisibilitySettingName.SerializeToJson(), + ProjectVisibility.Public.ToString().SerializeToJson() + ); + + Assert.That(result.Success, Is.True); + } + + /// + /// Tests that the ParatextProjectDataProvider has successfully registered a validator for + /// the Validity property and that the validator is called to determine that the new value + /// for that property is indeed invalid. + /// + [Test] + public async Task SetProjectSetting_InvalidVisibility_DoesNotSucceed() + { + DummyParatextProjectDataProvider provider = + new(PdpName, Client, _projectDetails, ParatextProjects); + await provider.RegisterDataProvider(); + + var result = provider.SetProjectSetting( + VisibilitySettingName.SerializeToJson(), + 89.SerializeToJson() + ); + + Assert.That(result.Success, Is.False); + } + } +} diff --git a/c-sharp-tests/Projects/ParatextProjectDataProviderFactoryTests.cs b/c-sharp-tests/Projects/ParatextProjectDataProviderFactoryTests.cs new file mode 100644 index 0000000000..81d63cfdd2 --- /dev/null +++ b/c-sharp-tests/Projects/ParatextProjectDataProviderFactoryTests.cs @@ -0,0 +1,159 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.Projects; +using Paranext.DataProvider.Services; + +namespace TestParanextDataProvider.Projects +{ + [ExcludeFromCodeCoverage] + internal class ParatextProjectDataProviderFactoryTests : PapiTestBase + { + private const string PDB_FACTORY_GET_REQUEST = + $"object:platform.{ParatextProjectDataProviderFactory.PDPF_NAME}-pdpf.function"; + + [SetUp] + public override async Task TestSetup() + { + await base.TestSetup(); + + var settingsService = new DummySettingsService(Client); + await settingsService.RegisterDataProvider(); + settingsService.AddSettingValue(Settings.INCLUDE_MY_PARATEXT_9_PROJECTS, true); + } + + [TestCase("0000", "Paratext.Data.ProjectNotFoundException: Project not found: 0000")] + // HexId-related problems + [TestCase("12345", "System.ArgumentException: Input must have even number of characters")] + [TestCase( + "abcdefgh", + "System.ArgumentException: String must contain only hexadecimal characters: ABCDEFGH" + )] + public async Task InvalidProjectId_ReturnsError(string projectId, string startOfError) + { + const int requesterId = 47192; + + ParatextProjectDataProviderFactory factory = new(Client, ParatextProjects); + await factory.Initialize(); + + JsonElement serverMessage = CreateRequestMessage("getProjectDataProviderId", projectId); + + Message result = Client + .FakeMessageFromServer( + new MessageRequest(PDB_FACTORY_GET_REQUEST, requesterId, serverMessage) + ) + .First(); + + Assert.That(result.Type, Is.EqualTo(MessageType.RESPONSE)); + MessageResponse response = (MessageResponse)result; + Assert.That(response.ErrorMessage, Does.StartWith(startOfError)); + Assert.That(response.RequestId, Is.EqualTo(requesterId)); + Assert.That(response.Contents, Is.Null); + } + + [Test] + public async Task WrongNumberOfParameters_ReturnsError() + { + const string projId = "ABC123"; + const int requesterId = 47281; + + ParatextProjects.FakeAddProject(CreateProjectDetails(projId, "Monkey Soup")); + + ParatextProjectDataProviderFactory factory = new(Client, ParatextProjects); + await factory.Initialize(); + + JsonElement serverMessage = CreateRequestMessage("getProjectDataProviderId"); + + Message result = Client + .FakeMessageFromServer( + new MessageRequest(PDB_FACTORY_GET_REQUEST, requesterId, serverMessage) + ) + .First(); + + Assert.That(result.Type, Is.EqualTo(MessageType.RESPONSE)); + MessageResponse response = (MessageResponse)result; + Assert.That( + response.ErrorMessage != null + && response.ErrorMessage.StartsWith("System.ArgumentOutOfRangeException"), + Is.True + ); + Assert.That(response.RequestId, Is.EqualTo(requesterId)); + Assert.That(response.Contents, Is.Null); + } + + [Test] + public async Task InvalidFunction_ReturnsError() + { + const string projId = "CDE539"; + const int requesterId = 47192; + + ParatextProjects.FakeAddProject(CreateProjectDetails(projId, "Monkey Soup")); + + ParatextProjectDataProviderFactory factory = new(Client, ParatextProjects); + await factory.Initialize(); + + JsonElement serverMessage = CreateRequestMessage("unknownFunction", projId); + + Message result = Client + .FakeMessageFromServer( + new MessageRequest(PDB_FACTORY_GET_REQUEST, requesterId, serverMessage) + ) + .First(); + + Assert.That(result.Type, Is.EqualTo(MessageType.RESPONSE)); + MessageResponse response = (MessageResponse)result; + Assert.That( + response.ErrorMessage, + Is.EqualTo("Unknown function call: unknownFunction") + ); + Assert.That(response.RequestId, Is.EqualTo(requesterId)); + Assert.That(response.Contents, Is.Null); + } + + [Test] + public async Task GetProjectDataProviderID_ReturnsIdForProvider() + { + const string projId = "305531"; + const int requesterId1 = 47281; + const int requesterId2 = 18542; + + ParatextProjects.FakeAddProject(CreateProjectDetails(projId, "Monkey Soup")); + + ParatextProjectDataProviderFactory factory = new(Client, ParatextProjects); + await factory.Initialize(); + + JsonElement serverMessage = CreateRequestMessage("getProjectDataProviderId", projId); + + Message result1 = Client + .FakeMessageFromServer( + new MessageRequest(PDB_FACTORY_GET_REQUEST, requesterId1, serverMessage) + ) + .First(); + + Assert.That(result1.Type, Is.EqualTo(MessageType.RESPONSE)); + MessageResponse response1 = (MessageResponse)result1; + Assert.That(response1.ErrorMessage, Is.Null); + Assert.That(response1.RequestId, Is.EqualTo(requesterId1)); + Assert.That(response1.Contents, Is.TypeOf()); + + string originalId = response1.Contents as string ?? ""; + + // Make sure another request for the same provider gets the same ID + Message result2 = Client + .FakeMessageFromServer( + new MessageRequest(PDB_FACTORY_GET_REQUEST, requesterId2, serverMessage) + ) + .First(); + + Assert.That(result2.Type, Is.EqualTo(MessageType.RESPONSE)); + MessageResponse response2 = (MessageResponse)result2; + Assert.That(response2.ErrorMessage, Is.Null); + Assert.That(response2.RequestId, Is.EqualTo(requesterId2)); + Assert.That( + response2.Contents, + Is.EqualTo(originalId), + "Did not get the same ID when requesting the same PDP" + ); + } + } +} diff --git a/c-sharp-tests/Projects/TestLocalParatextProjectsInTempDir.cs b/c-sharp-tests/Projects/TestLocalParatextProjectsInTempDir.cs new file mode 100644 index 0000000000..a2cf32f6b3 --- /dev/null +++ b/c-sharp-tests/Projects/TestLocalParatextProjectsInTempDir.cs @@ -0,0 +1,47 @@ +using Paranext.DataProvider.Projects; +using Paratext.Data; +using SIL.TestUtilities; +using SIL.Xml; + +namespace TestParanextDataProvider.Projects +{ + internal class TestLocalParatextProjectsInTempDir : LocalParatextProjects, IDisposable + { + private TemporaryFolder _folder; + + public TestLocalParatextProjectsInTempDir() + { + _folder = new TemporaryFolder(TestContext.CurrentContext.Test.ID); + } + + public void Dispose() + { + _folder.Dispose(); + // Reset ScrTextCollection's folder to be the global test project folder + ParatextData.Initialize(FixtureSetup.TestFolderPath, false); + } + + protected override string ProjectRootFolder => _folder.Path; + + public string TestProjectRootFolder => _folder.Path; + + internal void CreateTempProject(string folder, ProjectDetails projectDetails) + { + var folderPath = Path.Combine(ProjectRootFolder, folder); + CreateDirectory(folderPath); + var settings = new MinimalParatextProjectSettings + { + Name = projectDetails.Name, + Guid = projectDetails.Metadata.Id, + // Baked-in functional language code. Just needed something that worked for ScrText + // to load. Feel free to change this for testing purposes + LanguageIsoCode = "en:::", + // Baked-in functional Paratext version. Just needed something that worked for ScrText + // to load. Feel free to change this for testing purposes + MinParatextVersion = "8.0.100.76" + }; + var settingsPath = Path.Join(folderPath, "Settings.xml"); + XmlSerializationHelper.SerializeToFileWithWriteThrough(settingsPath, settings); + } + } +} diff --git a/c-sharp-tests/Services/ProjectSettingsServicesTests.cs b/c-sharp-tests/Services/ProjectSettingsServicesTests.cs new file mode 100644 index 0000000000..969ba21eea --- /dev/null +++ b/c-sharp-tests/Services/ProjectSettingsServicesTests.cs @@ -0,0 +1,178 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using Paranext.DataProvider.JsonUtils; +using TestParanextDataProvider; + +namespace Paranext.DataProvider.Services.Tests +{ + [ExcludeFromCodeCoverage] + public class ProjectSettingsServicesTests + { + [Test] + public void IsValid_ValidLanguage_ReturnsTrue() + { + DummyPapiClient papiClient = new(); + var newValueJson = "Spanish".SerializeToJson(); + var currentValueJson = "German".SerializeToJson(); + papiClient.AddSettingValueToTreatAsValid( + ProjectSettingsNames.PB_LANGUAGE, + newValueJson, + currentValueJson + ); + var result = ProjectSettingsService.IsValid( + papiClient, + newValueJson, + currentValueJson, + ProjectSettingsNames.PT_LANGUAGE, + "" + ); + + Assert.That(result, Is.True); + } + + [Test] + public void IsValid_InvalidSetting_ReturnsFalse() + { + DummyPapiClient papiClient = new DummyPapiClient(); + var newValueJson = "Spanish".SerializeToJson(); + var currentValueJson = "German".SerializeToJson(); + var result = ProjectSettingsService.IsValid( + papiClient, + newValueJson, + currentValueJson, + ProjectSettingsNames.PT_LANGUAGE, + "" + ); + + Assert.That(result, Is.False); + } + + [Test] + public void GetDefault_KnownProperty_ReturnsDefaultValue() + { + DummyPapiClient papiClient = new DummyPapiClient(); + var result = ProjectSettingsService.GetDefault( + papiClient, + ProjectSettingsNames.PT_LANGUAGE + ); + + Assert.That( + result, + Is.EqualTo($"default value for {ProjectSettingsNames.PB_LANGUAGE}") + ); + } + + [Test] + public void GetDefault_UnknownProperty_ReturnsNull() + { + DummyPapiClient papiClient = new DummyPapiClient(); + var result = ProjectSettingsService.GetDefault(papiClient, "wonky.setting"); + + Assert.That(result, Is.Null); + } + + [Test] + public void RegisterValidator_NewProperty_ReturnsTrue() + { + const string settingKey = "testScripture.MonkeyCount"; + (bool result, string? error) MonkeyCountValidator( + (string newValueJson, string currentValueJson, string allChangesJson) data + ) + { + try + { + var value = data.newValueJson.DeserializeFromJson(); + var result = true; + string? error = null; + if (value == null) + { + result = false; + error = "New value must be an integer. It cannot be null"; + } + else if (value <= 4) + { + result = false; + error = + "Mama called the doctor, and the doctor said, you must have at" + + "least 4 monkeys jumping on the bed!"; + } + return (result, error); + } + catch (Exception ex) + { + return (false, ex.Message); + } + } + + DummyPapiClient papiClient = new DummyPapiClient(); + + // Before registering the validator, IsValid should return true. + Assert.That( + ProjectSettingsService.IsValid( + papiClient, + 2.SerializeToJson(), + 5.SerializeToJson(), + settingKey, + "" + ), + Is.True + ); + + var result = ProjectSettingsService.RegisterValidator( + papiClient, + settingKey, + MonkeyCountValidator + ); + + Assert.That(result, Is.EqualTo(true)); + + Assert.That( + ProjectSettingsService.IsValid( + papiClient, + 1.SerializeToJson(), + 5.SerializeToJson(), + settingKey, + "" + ), + Is.False + ); + Assert.That( + ProjectSettingsService.IsValid( + papiClient, + 6.SerializeToJson(), + 5.SerializeToJson(), + settingKey, + "" + ), + Is.True + ); + } + + [Test] + public void RegisterValidator_ExistingProperty_ReturnsFalse() + { + const string settingKey = "testScripture.Oops"; + (bool result, string? error) OopsValidator( + (string newValueJson, string currentValueJson, string allChangesJson) data + ) + { + return (false, "The Oops property has no valid values. Ha Ha!"); + } + + DummyPapiClient papiClient = new DummyPapiClient(); + + var result = ProjectSettingsService.RegisterValidator( + papiClient, + settingKey, + OopsValidator + ); + + Assert.That(result, Is.EqualTo(true)); + + Assert.That( + ProjectSettingsService.RegisterValidator(papiClient, settingKey, OopsValidator), + Is.EqualTo(false) + ); + } + } +} diff --git a/c-sharp-tests/Services/SettingsServiceTests.cs b/c-sharp-tests/Services/SettingsServiceTests.cs new file mode 100644 index 0000000000..1792a6acce --- /dev/null +++ b/c-sharp-tests/Services/SettingsServiceTests.cs @@ -0,0 +1,51 @@ +using System.Diagnostics.CodeAnalysis; +using TestParanextDataProvider; + +namespace Paranext.DataProvider.Services.Tests; + +[ExcludeFromCodeCoverage] +public class SettingsServiceTests +{ + #region Member variables + private DummyPapiClient _client = null!; // Will be non-null when the test runs + private DummySettingsService _settingsService = null!; // Will be non-null when the test runs + #endregion + + #region Test setup/teardown + [SetUp] + public virtual async Task TestSetup() + { + _client = new DummyPapiClient(); + _settingsService = new DummySettingsService(_client); + await _settingsService.RegisterDataProvider(); + } + + [TearDown] + public virtual void TestTearDown() + { + _client.Dispose(); + } + #endregion + + [TestCase()] + public void GetSettingValue_Boolean_ReturnsValue() + { + var settingKey = "isTest"; + var settingValue = true; + _settingsService.AddSettingValue(settingKey, settingValue); + + var retrievedSettingValue = SettingsService.GetSettingValue(_client, settingKey); + Assert.That(retrievedSettingValue, Is.EqualTo(settingValue)); + } + + [TestCase()] + public void GetSettingValue_Integer_ReturnsValue() + { + var settingKey = "testNum"; + var settingValue = 15; + _settingsService.AddSettingValue(settingKey, settingValue); + + var retrievedSettingValue = SettingsService.GetSettingValue(_client, settingKey); + Assert.That(retrievedSettingValue, Is.EqualTo(settingValue)); + } +} diff --git a/c-sharp-tests/Usings.cs b/c-sharp-tests/Usings.cs new file mode 100644 index 0000000000..a2ef4115a6 --- /dev/null +++ b/c-sharp-tests/Usings.cs @@ -0,0 +1,2 @@ +global using NUnit.Framework; + diff --git a/c-sharp-tests/c-sharp-tests.csproj b/c-sharp-tests/c-sharp-tests.csproj new file mode 100644 index 0000000000..57f2a208f4 --- /dev/null +++ b/c-sharp-tests/c-sharp-tests.csproj @@ -0,0 +1,33 @@ + + + + net8.0 + enable + enable + + false + true + TestParanextDataProvider + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/c-sharp/.config/dotnet-tools.json b/c-sharp/.config/dotnet-tools.json new file mode 100644 index 0000000000..92ed07676b --- /dev/null +++ b/c-sharp/.config/dotnet-tools.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "0.23.0", + "commands": ["dotnet-csharpier"] + } + } +} diff --git a/c-sharp/.csharpierrc.yml b/c-sharp/.csharpierrc.yml new file mode 100644 index 0000000000..dc445f02a3 --- /dev/null +++ b/c-sharp/.csharpierrc.yml @@ -0,0 +1,7 @@ +printWidth: 100 +useTabs: false +tabWidth: 4 +preprocessorSymbolSets: + - '' + - 'DEBUG' + - 'DEBUG,CODE_STYLE' diff --git a/c-sharp/.gitignore b/c-sharp/.gitignore new file mode 100644 index 0000000000..8ff25832a2 --- /dev/null +++ b/c-sharp/.gitignore @@ -0,0 +1,398 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +# *.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml \ No newline at end of file diff --git a/c-sharp/.lintstagedrc.yml b/c-sharp/.lintstagedrc.yml new file mode 100644 index 0000000000..bf6bd61175 --- /dev/null +++ b/c-sharp/.lintstagedrc.yml @@ -0,0 +1 @@ +'*.cs': 'dotnet csharpier .' diff --git a/c-sharp/AssemblyInfo.cs b/c-sharp/AssemblyInfo.cs new file mode 100644 index 0000000000..2598f24440 --- /dev/null +++ b/c-sharp/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("c-sharp-tests")] diff --git a/c-sharp/Checks/CheckFactory.cs b/c-sharp/Checks/CheckFactory.cs new file mode 100644 index 0000000000..5f0af562eb --- /dev/null +++ b/c-sharp/Checks/CheckFactory.cs @@ -0,0 +1,45 @@ +using Paratext.Checks; +using Paratext.Checks.Checks; +using Paratext.Data.Checking; + +namespace Paranext.DataProvider.Checks; + +/// +/// Creates check objects based on checkIds (which are the low-level enum values of +/// s) +/// +public static class CheckFactory +{ + // Note that CheckType.Schema is not available outside Paratext itself due to dependencies + // It cannot be easily copied, either, without some refactoring + private static readonly Dictionary> s_checkConstructors = + new() + { + { CheckType.Capitalization.InternalValue, () => new CapitalizationCheck() }, + { CheckType.ChapterVerse.InternalValue, () => new ChapterVerseCheck() }, + { CheckType.Character.InternalValue, () => new CharactersCheck() }, + { CheckType.Marker.InternalValue, () => new MarkerCheck() }, + { CheckType.MatchedPairs.InternalValue, () => new MatchedPairsCheck() }, + { CheckType.Numbers.InternalValue, () => new NumberCheck() }, + { + CheckType.ParagraphFinalPunctuation.InternalValue, + () => new ParagraphFinalPunctuationCheck() + }, + { CheckType.Punctuation.InternalValue, () => new PunctuationCheck() }, + { CheckType.Quotation.InternalValue, () => new QuotationCheck() }, + { CheckType.QuotationTypes.InternalValue, () => new QuotationTypesCheck() }, + { CheckType.QuotedText.InternalValue, () => new QuotedTextCheck() }, + { CheckType.Reference.InternalValue, () => new CrossReferencesCheck() }, + { CheckType.RepeatedWord.InternalValue, () => new RepeatedWordsCheck() }, + }; + + public static ScriptureCheckBase CreateCheck(string checkId, ChecksDataSource dataSource) + { + if (!s_checkConstructors.TryGetValue(checkId, out var constructor)) + throw new ArgumentException($"Unknown checkId: {checkId}"); + + var check = constructor(); + check.Initialize(dataSource); + return check; + } +} diff --git a/c-sharp/Checks/CheckInputRange.cs b/c-sharp/Checks/CheckInputRange.cs new file mode 100644 index 0000000000..4aafec5bd9 --- /dev/null +++ b/c-sharp/Checks/CheckInputRange.cs @@ -0,0 +1,75 @@ +using SIL.Scripture; + +namespace Paranext.DataProvider.Checks; + +/// +/// Represents a range of text within a project that checks can target. This class must +/// serialize/deserialize to the CheckInputRange type defined in TypeScript. +///
+/// A could cover entire books or just a few verses within a book. +/// If is null, then the range concludes at the end of the book indicated in +/// . +///
+/// Note that Paratext checks cannot be run on less than an entire book because of the definition of +/// . The class allows defining a +/// range that is more granular than an entire book because that is how Platform.Bible's interfaces +/// work, and we need to serialize and deserialize these structures when communicating with the +/// platform. Whenever a Paratext check is given a range, though, it can only target entire books. +///
+/// See the TypeScript check data types for more details. +///
+public sealed class CheckInputRange +{ + public CheckInputRange(string projectId, VerseRef start, VerseRef? end) + { + ArgumentException.ThrowIfNullOrEmpty(projectId); + + if (start.ChapterNum <= 0) + throw new ArgumentOutOfRangeException(nameof(start), "start.ChapterNum must be > 0"); + + if (end.HasValue && end.Value.ChapterNum <= 0) + throw new ArgumentOutOfRangeException(nameof(end), "end.ChapterNum must be > 0"); + + if (end.HasValue && (start > end.Value)) + throw new ArgumentException("end must come after start"); + + ProjectId = projectId; + Start = start; + End = end; + } + + public string ProjectId { get; } + public VerseRef Start { get; } + public VerseRef? End { get; } + + /// + /// Determines if a given location in scripture is within the range of this object. Note that + /// an integer book number is used instead of a book name/ID because ScrText's TextChanged event + /// provides the book number and chapter number of what scripture just changed in the project. + /// The purpose of this function is to determine if a scripture update event indicates that text + /// changed within the range of this object. Since the event uses book numbers, this method uses + /// book numbers, too. + /// + /// ID of the project being tested + /// Book number being tested. 0 is a special value that is always + /// considered to be within range. + /// Chapter number being tested. 0 is a special value that is always + /// considered to be within range. + /// true if the inputs are considered within range, false otherwise + public bool IsWithinRange(string projectId, int bookNum, int chapterNum) + { + if (projectId != ProjectId) + return false; + if (bookNum == 0) + return true; + if (End == null) + return bookNum == Start.BookNum && (chapterNum == 0 || chapterNum >= Start.ChapterNum); + if (bookNum < Start.BookNum || bookNum > End.Value.BookNum) + return false; + if (bookNum == Start.BookNum && chapterNum > 0 && chapterNum < Start.ChapterNum) + return false; + if (bookNum == End.Value.BookNum && chapterNum > End.Value.ChapterNum) + return false; + return true; + } +} diff --git a/c-sharp/Checks/CheckLocation.cs b/c-sharp/Checks/CheckLocation.cs new file mode 100644 index 0000000000..d6b0b9aed1 --- /dev/null +++ b/c-sharp/Checks/CheckLocation.cs @@ -0,0 +1,54 @@ +using SIL.Scripture; + +namespace Paranext.DataProvider.Checks; + +/// +/// Represents a specific location in project text. This class must serialize/deserialize +/// to the CheckLocation type defined in TypeScript. +///
+/// This differs from a in that this represents a single point that +/// may be in the middle of project text (e.g., partway through a verse). A +/// can only refer to points in the text that are at a book, chapter, +/// or verse boundary. Also, a always represents a range, while a +/// always represents a single point. +///
+/// Note that in TypeScript, a may be represented as a +/// and offset or as a JsonPath and offset. Paratext knows +/// nothing about USJ and JsonPath, so we can only create +/// representations in this class. See the TypeScript check data types for more details. +///
+public sealed class CheckLocation(VerseRef verseRef, int offset): IEquatable +{ + public VerseRef VerseRef { get; } = verseRef; + public int Offset { get; } = offset; + + public override bool Equals(object? obj) + { + return obj is CheckLocation checkLocation && Equals(checkLocation); + } + + public bool Equals(CheckLocation? other) + { + if (ReferenceEquals(other, null)) + return false; + + return VerseRef.BBBCCCVVV == other.VerseRef.BBBCCCVVV + && VerseRef.Versification == other.VerseRef.Versification + && Offset == other.Offset; + } + + public static bool operator ==(CheckLocation a, CheckLocation b) + { + return a.Equals(b); + } + + public static bool operator !=(CheckLocation a, CheckLocation b) + { + return !(a == b); + } + + public override int GetHashCode() + { + return HashCode.Combine(VerseRef.BBBCCCVVV, VerseRef.Versification, Offset); + } +} diff --git a/c-sharp/Checks/CheckResultsRecorder.cs b/c-sharp/Checks/CheckResultsRecorder.cs new file mode 100644 index 0000000000..03290e5274 --- /dev/null +++ b/c-sharp/Checks/CheckResultsRecorder.cs @@ -0,0 +1,82 @@ +using Paratext.Checks; +using Paratext.Data; +using Paratext.Data.Checking; +using Paratext.Data.Find; +using PtxUtils; +using SIL.Scripture; + +namespace Paranext.DataProvider.Checks; + +/// +/// This class implements which is needed to call +/// on each check. Checks use +/// objects for reporting problems to the user. This class is essentially an adapter for storing a +/// list of problems from checks. +/// +public sealed class CheckResultsRecorder(string checkId, string projectId) : IRecordCheckError +{ + public int CurrentBookNumber { get; set; } = 0; + + public void RecordError( + ITextToken token, + int offset, + int length, + Enum checkType, + string message, + Enum messageId, + VerseListItemType type = VerseListItemType.Error + ) + { + var chapterVerse = token.ScrRefString.Split(":"); + int chapterNumber = int.Parse(chapterVerse[0]); + int verseNumber = GetVerseNumber(chapterVerse[1]); + VerseRef verseRef = new (CurrentBookNumber, chapterNumber, verseNumber); + CheckRunResults.Add(new CheckRunResult( + checkId, + projectId, + message, + new CheckLocation(verseRef, offset), + new CheckLocation(verseRef, offset + length))); + } + + public void RecordError( + VerseRef vref, + string text, + int selectionStart, + string message, + Enum checkType, + Enum messageId, + VerseListItemType type = VerseListItemType.Error + ) + { + CheckRunResults.Add(new CheckRunResult( + checkId, + projectId, + message, + new CheckLocation(vref, selectionStart), + new CheckLocation(vref, selectionStart + text.Length))); + } + + public List CheckRunResults { get; } = []; + + private static int GetVerseNumber(string verseNumber) + { + ArgumentException.ThrowIfNullOrWhiteSpace(verseNumber); + if (!IsDigit(verseNumber[0])) + throw new ArgumentException($"verseNumber must start with an integer: {verseNumber}"); + + int lastIndex = 1; + while (lastIndex < verseNumber.Length) + { + if (!IsDigit(verseNumber[lastIndex])) + break; + lastIndex++; + } + return int.Parse(verseNumber[..lastIndex]); + } + + private static bool IsDigit(char c) + { + return c >= '0' && c <= '9'; + } +} diff --git a/c-sharp/Checks/CheckRunResult.cs b/c-sharp/Checks/CheckRunResult.cs new file mode 100644 index 0000000000..dbf82278ed --- /dev/null +++ b/c-sharp/Checks/CheckRunResult.cs @@ -0,0 +1,52 @@ +namespace Paranext.DataProvider.Checks; + +/// +/// Represents a single error/issue flagged by a check in a given project. This class must +/// serialize/deserialize to the CheckRunResult type defined in TypeScript. +/// +public sealed class CheckRunResult( + string checkId, + string projectId, + string messageFormatString, + CheckLocation start, + CheckLocation end) + : IEquatable +{ + public string CheckId { get; } = checkId; + public string ProjectId { get; } = projectId; + public string MessageFormatString { get; } = messageFormatString; + public CheckLocation Start { get; } = start; + public CheckLocation End { get; } = end; + + public override bool Equals(object? obj) + { + return obj is CheckRunResult checkRunResult && Equals(checkRunResult); + } + + public bool Equals(CheckRunResult? other) + { + if (ReferenceEquals(other, null)) + return false; + + return CheckId == other.CheckId + && ProjectId == other.ProjectId + && MessageFormatString == other.MessageFormatString + && Start == other.Start + && End == other.End; + } + + public static bool operator ==(CheckRunResult a, CheckRunResult b) + { + return a.Equals(b); + } + + public static bool operator !=(CheckRunResult a, CheckRunResult b) + { + return !(a == b); + } + + public override int GetHashCode() + { + return HashCode.Combine(CheckId, ProjectId, MessageFormatString, Start, End); + } +} diff --git a/c-sharp/Checks/CheckRunner.cs b/c-sharp/Checks/CheckRunner.cs new file mode 100644 index 0000000000..4a27a1df66 --- /dev/null +++ b/c-sharp/Checks/CheckRunner.cs @@ -0,0 +1,322 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.Projects; +using Paratext.Checks; +using Paratext.Data; +using Paratext.Data.Checking; + +namespace Paranext.DataProvider.Checks; + +/// +/// This class is intended to be a singleton that registers a data provider on the PAPI network. +/// The data provider implements the ICheckRunner interface that is defined in TypeScript. See the +/// definition of ICheckRunner and its related types in TypeScript for more details. +/// +internal class CheckRunner(PapiClient papiClient) + : NetworkObjects.DataProvider("dotNetCheckRunner", papiClient, "checkRunner") +{ + #region Internal classes + + private sealed class CheckForProject(ScriptureCheckBase check, string checkId, string projectId) + { + public ScriptureCheckBase Check { get; } = check; + public CheckResultsRecorder ResultsRecorder { get; } = new (checkId, projectId); + } + + #endregion + + #region Consts and member variables + + private const string DATA_TYPE_AVAILABLE_CHECKS = "AvailableChecks"; + private const string DATA_TYPE_ACTIVE_RANGES = "ActiveRanges"; + private const string DATA_TYPE_CHECK_RESULTS = "CheckResults"; + + // Note that CheckType.Schema is not available outside Paratext itself due to dependencies + // It cannot be easily copied, either, without some refactoring + private readonly Dictionary _checkDetailsByCheckId = new() + { + { CheckType.Capitalization.InternalValue, new (CheckType.Capitalization) }, + { CheckType.ChapterVerse.InternalValue, new (CheckType.ChapterVerse) }, + { CheckType.Character.InternalValue, new (CheckType.Character) }, + { CheckType.Marker.InternalValue, new (CheckType.Marker) }, + { CheckType.MatchedPairs.InternalValue, new (CheckType.MatchedPairs) }, + { CheckType.Numbers.InternalValue, new (CheckType.Numbers) }, + { CheckType.ParagraphFinalPunctuation.InternalValue, new (CheckType.ParagraphFinalPunctuation) }, + { CheckType.Punctuation.InternalValue, new (CheckType.Punctuation) }, + { CheckType.Quotation.InternalValue, new (CheckType.Quotation) }, + { CheckType.QuotationTypes.InternalValue, new (CheckType.QuotationTypes) }, + { CheckType.QuotedText.InternalValue, new (CheckType.QuotedText) }, + { CheckType.Reference.InternalValue, new (CheckType.Reference) }, + { CheckType.RepeatedWord.InternalValue, new (CheckType.RepeatedWord) }, + }; + private CheckInputRange[] _activeRanges = []; + private readonly Dictionary _dataSourcesByProjectId = []; + private readonly Dictionary<(string checkId, string projectId), CheckForProject> _checksByIds = []; + private readonly object _dataProviderLock = new(); + + #endregion + + #region DataProvider methods + + // Must provide all functions that are part of ICheckRunner in TS + protected override List GetFunctionNames() + { + return + [ + "disableCheck", + "enableCheck", + "getActiveRanges", + "getAvailableChecks", + "getCheckResults", + "setActiveRanges", + ]; + } + + protected override Task StartDataProvider() + { + return Task.CompletedTask; + } + + protected override ResponseToRequest HandleRequest(string functionName, JsonArray args) + { + lock (_dataProviderLock) + { + Console.WriteLine($"Calling {functionName} with args {args}"); + + return functionName switch + { + "disableCheck" => DisableCheck(args[0].Deserialize() ?? "", args.Count > 1 ? args[1].Deserialize() : null), + "enableCheck" => EnableCheck(args[0].Deserialize() ?? "", args[1].Deserialize() ?? ""), + "getActiveRanges" => GetActiveRanges(), + "getAvailableChecks" => GetAvailableChecks(), + "getCheckResults" => GetCheckResults(), + "setActiveRanges" => SetActiveRanges(CheckInputRangeConverter.CreateCheckInputRangeArray(args[1])), + _ => ResponseToRequest.Failed($"Unknown function: {functionName}"), + }; + } + } + + #endregion + + #region CheckRunner methods + + private ResponseToRequest GetAvailableChecks() + { + return ResponseToRequest.Succeeded(new List(_checkDetailsByCheckId.Values)); + } + + private ResponseToRequest GetActiveRanges() + { + return ResponseToRequest.Succeeded(_activeRanges); + } + + private ResponseToRequest SetActiveRanges(CheckInputRange[]? ranges) + { + ArgumentNullException.ThrowIfNull(ranges); + + foreach (var range in ranges) + { + if (range.End.HasValue && range.Start.BookNum != range.End.Value.BookNum) + throw new ArgumentException("Ranges cannot span between books"); + } + + foreach(var projectId in _activeRanges.Select(range => range.ProjectId).Distinct()) + GetOrCreateDataSource(projectId).ScrText.TextChanged -= RerunChecks; + foreach(var projectId in ranges.Select(range => range.ProjectId).Distinct()) + GetOrCreateDataSource(projectId).ScrText.TextChanged += RerunChecks; + _activeRanges = ranges; + + bool notifyOfUpdatedCheckResults = false; + foreach (var projectId in ranges.Select(range => range.ProjectId).Distinct()) + { + bool producedNewOrDifferentResults = RunChecksForProject(projectId); + notifyOfUpdatedCheckResults |= producedNewOrDifferentResults; + } + + List updateEvents = [ DATA_TYPE_ACTIVE_RANGES ]; + if (notifyOfUpdatedCheckResults) + updateEvents.Add(DATA_TYPE_CHECK_RESULTS); + + SendDataUpdateEvent(updateEvents); + return ResponseToRequest.Succeeded(updateEvents); + } + + private ResponseToRequest GetCheckResults() + { + var retVal = new List(); + foreach (var check in _checksByIds.Values) + retVal.AddRange(check.ResultsRecorder.CheckRunResults); + if (retVal.Count > 1000) + { + var fullCount = retVal.Count; + retVal.RemoveRange(1000, fullCount - 1000); + retVal.TrimExcess(); + Console.WriteLine($"Trimming {fullCount} check results to 1000"); + } + Console.WriteLine($"Returning {retVal.Count} check results"); + return ResponseToRequest.Succeeded(retVal); + } + + private ResponseToRequest EnableCheck(string checkId, string projectId) + { + ArgumentException.ThrowIfNullOrEmpty(checkId); + ArgumentException.ThrowIfNullOrEmpty(projectId); + + List updateEvents = []; + + var enabledProjectIds = _checkDetailsByCheckId[checkId].EnabledProjectIds; + if (enabledProjectIds.Contains(projectId)) + Console.WriteLine($"Check {checkId} for project {projectId} was already enabled"); + else + { + updateEvents.Add(DATA_TYPE_AVAILABLE_CHECKS); + enabledProjectIds.Add(projectId); + var check = CheckFactory.CreateCheck(checkId, GetOrCreateDataSource(projectId)); + _checksByIds.Add((checkId, projectId), new CheckForProject(check, checkId, projectId)); + Console.WriteLine($"Enabled check {checkId} for project {projectId}"); + if (RunChecksForProject(projectId)) + updateEvents.Add(DATA_TYPE_CHECK_RESULTS); + } + + if (updateEvents.Count > 0) + SendDataUpdateEvent(updateEvents); + return ResponseToRequest.Succeeded(); + } + + private ResponseToRequest DisableCheck(string checkId, string? projectId) + { + ArgumentException.ThrowIfNullOrEmpty(checkId); + + List updateEvents = [ DATA_TYPE_AVAILABLE_CHECKS ]; + var checkDetails = _checkDetailsByCheckId[checkId]; + + if (string.IsNullOrEmpty(projectId)) + { + Console.WriteLine($"Disabled check {checkId} for all projects"); + checkDetails.EnabledProjectIds.Clear(); + bool resultsRemoved = false; + foreach (var ids in _checksByIds.Keys.Where(ids => ids.checkId == checkId)) + { + resultsRemoved |= _checksByIds[ids].ResultsRecorder.CheckRunResults.Count > 0; + _checksByIds.Remove(ids); + } + if (resultsRemoved) + updateEvents.Add(DATA_TYPE_CHECK_RESULTS); + + SendDataUpdateEvent(updateEvents); + return ResponseToRequest.Succeeded(updateEvents); + } + + var projectIds = checkDetails.EnabledProjectIds; + int resultsCount = _checksByIds[(checkId, projectId)].ResultsRecorder.CheckRunResults.Count; + _checksByIds.Remove((checkId, projectId)); + Console.WriteLine(projectIds.Remove(projectId) + ? $"Disabled check {checkId} for project {projectId}" + : $"Project {projectId} was not enabled for check {checkId}"); + if (resultsCount > 0) + updateEvents.Add(DATA_TYPE_CHECK_RESULTS); + + SendDataUpdateEvent(updateEvents); + return ResponseToRequest.Succeeded(updateEvents); + } + + private void RerunChecks(object? sender, TextChangedEventArgs e) + { + var projectId = _dataSourcesByProjectId.First((kvp) => kvp.Value.ScrText == e.ScrText).Key; + if (string.IsNullOrEmpty(projectId)) + { + Console.WriteLine($"Attempted to run checks on project {e.ScrText.Guid} but couldn't find its project ID"); + return; + } + + bool notifyOfNewOrDifferentResults = false; + + // Only run the checks if we have some range active that includes the text that changed + if (_activeRanges.Any((range) => range.IsWithinRange(projectId, e.BookNum, e.ChapterNum))) + notifyOfNewOrDifferentResults = RunChecksForProject(projectId); + + if (notifyOfNewOrDifferentResults) + SendDataUpdateEvent(DATA_TYPE_CHECK_RESULTS); + } + + /// + /// Run all enabled checks on a project for books within active ranges + /// + /// true if some check produced any new or different results, false otherwise + private bool RunChecksForProject(string projectId) + { + bool retVal = false; + + // Text has to be tokenized for the checks before the checks can run + var enabledChecksForProject = _checksByIds + .Where((kvp) => kvp.Key.projectId == projectId) + .Select((kvp) => kvp.Value.Check); + CheckDataFormat neededDataFormat = 0; + foreach (var check in enabledChecksForProject) + neededDataFormat |= check.NeededFormat; + + foreach (var range in _activeRanges.Where((range) => range.ProjectId == projectId)) + { + // "GetText" will tokenize the text for checks to use + // "0" chapter number means all chapters + _dataSourcesByProjectId[projectId].GetText(range.Start.BookNum, 0, neededDataFormat); + + foreach (var checkId in _checkDetailsByCheckId.Values + .Where((checkDetails) => checkDetails.EnabledProjectIds.Contains(projectId)) + .Select((checkDetails) => checkDetails.CheckId)) + { + var check = _checksByIds[(checkId, projectId)].Check; + bool newResultsReturned = RunCheck(checkId, check, range); + retVal |= newResultsReturned; + } + } + return retVal; + } + + /// + /// Returns true if the check produced any new or different results, false otherwise. + /// + private bool RunCheck(string checkId, ScriptureCheckBase check, CheckInputRange range) + { + CheckResultsRecorder recorder; + if (!_checksByIds.TryGetValue((checkId, range.ProjectId), out var data)) + { + var checkData = new CheckForProject(check, checkId, range.ProjectId); + _checksByIds.Add((checkId, range.ProjectId), checkData); + recorder = checkData.ResultsRecorder; + } + else + recorder = data.ResultsRecorder; + + var removedItems = recorder.CheckRunResults.FindAll((result) => result.Start.VerseRef.BookNum == range.Start.BookNum); + recorder.CheckRunResults.RemoveAll((result) => result.Start.VerseRef.BookNum == range.Start.BookNum); + int totalBeforeRunning = recorder.CheckRunResults.Count; + recorder.CurrentBookNumber = range.Start.BookNum; + check.Run(range.Start.BookNum, GetOrCreateDataSource(range.ProjectId), recorder); + int totalAfterRunning = recorder.CheckRunResults.Count; + + if (totalAfterRunning == totalBeforeRunning) + return removedItems.Count != 0; + + if (totalAfterRunning != totalBeforeRunning + removedItems.Count) + return true; + + return removedItems.Exists(item => !recorder.CheckRunResults.Contains(item)); + } + + private ChecksDataSource GetOrCreateDataSource(string projectId) + { + if (!_dataSourcesByProjectId.TryGetValue(projectId, out var dataSource)) + { + var scrText = LocalParatextProjects.GetParatextProject(projectId); + dataSource = new ChecksDataSource(scrText); + _dataSourcesByProjectId.Add(projectId, dataSource); + } + return dataSource; + } + + #endregion +} diff --git a/c-sharp/Checks/ParatextCheckDetails.cs b/c-sharp/Checks/ParatextCheckDetails.cs new file mode 100644 index 0000000000..32c0cb2941 --- /dev/null +++ b/c-sharp/Checks/ParatextCheckDetails.cs @@ -0,0 +1,16 @@ +using Paratext.Data.Checking; +using PtxUtils; + +namespace Paranext.DataProvider.Checks; + +/// +/// Represents metadata about an individual check. This class must serialize/deserialize to the +/// CheckRunnerCheckDetails type defined in TypeScript. +/// +public sealed class ParatextCheckDetails(Enum checkType) +{ + public string CheckName { get; } = checkType.ToString(); + public string CheckDescription { get; } = checkType.ToLocalizedString(); + public string CheckId { get; } = checkType.InternalValue; + public List EnabledProjectIds { get; } = []; +} diff --git a/c-sharp/JsonUtils/CheckInputRangeConverter.cs b/c-sharp/JsonUtils/CheckInputRangeConverter.cs new file mode 100644 index 0000000000..ff8fe905b5 --- /dev/null +++ b/c-sharp/JsonUtils/CheckInputRangeConverter.cs @@ -0,0 +1,35 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Paranext.DataProvider.Checks; +using SIL.Scripture; + +namespace Paranext.DataProvider.JsonUtils; + +internal static class CheckInputRangeConverter +{ + public static CheckInputRange[] CreateCheckInputRangeArray(JsonNode? inputNode) + { + ArgumentNullException.ThrowIfNull(inputNode); + + var retVal = new List(); + foreach (var node in inputNode.AsArray()) + { + if (node == null) + throw new ArgumentException("All input ranges must be non-null"); + + string? projectId = node["projectId"]?.Deserialize(); + string? startJson = node["start"]?.ToJsonString(); + string? endJson = node["end"]?.ToJsonString(); + + if (string.IsNullOrEmpty(projectId) || string.IsNullOrEmpty(startJson)) + throw new ArgumentException("projectId and start must not be null"); + + VerseRef start = startJson.DeserializeFromJson(); + VerseRef? end = string.IsNullOrEmpty(endJson) + ? null + : endJson.DeserializeFromJson(); + retVal.Add(new CheckInputRange(projectId, start, end)); + } + return [.. retVal]; + } +} diff --git a/c-sharp/JsonUtils/JsonMessageDeserializationAttribute.cs b/c-sharp/JsonUtils/JsonMessageDeserializationAttribute.cs new file mode 100644 index 0000000000..b3160b428e --- /dev/null +++ b/c-sharp/JsonUtils/JsonMessageDeserializationAttribute.cs @@ -0,0 +1,25 @@ +namespace Paranext.DataProvider.JsonUtils +{ + [AttributeUsage(AttributeTargets.Class)] + public class JsonMessageDeserializationAttribute : Attribute + { + /// + /// Keys and values from a flat array converted into string tuples + /// + public List<(string key, string value)> KeyValuePairs { get; } + + public JsonMessageDeserializationAttribute(params string[] pairs) + { + KeyValuePairs = new List<(string key, string value)>(); + if (pairs.Length % 2 != 0) + throw new ArgumentException( + "JSON deserialization keys and values must be provided in pairs" + ); + + for (int i = 0; i < pairs.Length; i += 2) + { + KeyValuePairs.Add((pairs[i], pairs[i + 1])); + } + } + } +} diff --git a/c-sharp/JsonUtils/MessageConverter.cs b/c-sharp/JsonUtils/MessageConverter.cs new file mode 100644 index 0000000000..9b25699958 --- /dev/null +++ b/c-sharp/JsonUtils/MessageConverter.cs @@ -0,0 +1,73 @@ +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; +using Paranext.DataProvider.Messages; +using SIL.Extensions; + +namespace Paranext.DataProvider.JsonUtils; + +/// +/// Handles serialization and deserialization of Messages +/// +internal sealed class MessageConverter : JsonConverter +{ + private static readonly JsonSerializerOptions s_jsonOptions = + SerializationOptions.CreateSerializationOptions(); + + // Rules are in the form of (key, value) pairs => Type to deserialize + // The default type if nothing else matches is "Message" + private static readonly TupleTree s_deserializationRules = + new(typeof(Message)); + + static MessageConverter() + { + // Eliminate recursion where this converter calls itself + s_jsonOptions.Converters.RemoveAll(converter => converter is MessageConverter); + + foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) + { + var attribute = type.GetCustomAttribute(false); + if (attribute != null) + s_deserializationRules.Add(attribute.KeyValuePairs, type); + } + } + + public override bool CanConvert(Type typeToConvert) => + typeof(Message).IsAssignableFrom(typeToConvert); + + public override Message Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + // Copy the current state of the reader because we will need it again + var readerClone = reader; + var propertyNamesAndValues = new HashSet<(string key, string value)>(); + using (var jsonDocument = JsonDocument.ParseValue(ref readerClone)) + { + foreach (var jsonProperty in jsonDocument.RootElement.EnumerateObject()) + { + // For now we only need string properties from messages. This could be expanded. + if (jsonProperty.Value.ValueKind == JsonValueKind.String) + propertyNamesAndValues.Add((jsonProperty.Name, jsonProperty.Value.ToString())); + } + } + // If we want to be picky, we could look for more matching types and throw/warn if any are seen. + // That would mean the protocol itself is busted, though, which is really a design problem. + var messageType = s_deserializationRules.FindAllResults(propertyNamesAndValues).First(); + + // Technically we should copy the options given to us and remove any MessageConverters + // Practically speaking using these static options does the exact same thing but faster + return (Message)JsonSerializer.Deserialize(ref reader, messageType, s_jsonOptions)!; + } + + public override void Write( + Utf8JsonWriter writer, + Message message, + JsonSerializerOptions options + ) + { + JsonSerializer.Serialize(writer, message, message.GetType(), s_jsonOptions); + } +} diff --git a/c-sharp/JsonUtils/PrivateConstructorResolver.cs b/c-sharp/JsonUtils/PrivateConstructorResolver.cs new file mode 100644 index 0000000000..8e190c7dde --- /dev/null +++ b/c-sharp/JsonUtils/PrivateConstructorResolver.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization.Metadata; + +namespace Paranext.DataProvider.JsonUtils; + +/// +/// Type resolver for creation objects that have a private default constructor +/// +internal class PrivateConstructorResolver : DefaultJsonTypeInfoResolver +{ + public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options) + { + JsonTypeInfo jsonTypeInfo = base.GetTypeInfo(type, options); + + if (jsonTypeInfo is { Kind: JsonTypeInfoKind.Object, CreateObject: null }) + { + if ( + jsonTypeInfo.Type + .GetConstructors(BindingFlags.Public | BindingFlags.Instance) + .All(c => c.GetParameters().Length > 0) + ) + { + // The type doesn't have a public default constructor + jsonTypeInfo.CreateObject = () => + Activator.CreateInstance(jsonTypeInfo.Type, true)!; + } + } + + return jsonTypeInfo; + } +} diff --git a/c-sharp/JsonUtils/SerializationExtensionMethods.cs b/c-sharp/JsonUtils/SerializationExtensionMethods.cs new file mode 100644 index 0000000000..d35369fc05 --- /dev/null +++ b/c-sharp/JsonUtils/SerializationExtensionMethods.cs @@ -0,0 +1,49 @@ +using System.Text.Json; + +namespace Paranext.DataProvider.JsonUtils; + +public static class SerializationExtensionMethods +{ + private static readonly JsonSerializerOptions s_papiOptions = + SerializationOptions.CreateSerializationOptions(); + + /// + /// Calls with + /// that are configured to work with PAPI types. If you + /// need to call other versions of Deserialize, consider calling + /// to create an appropriate + /// options object to pass in. + /// + /// A TValue representation of the JSON value. + public static T? DeserializeFromJson(this string json) + { + return JsonSerializer.Deserialize(json, s_papiOptions); + } + + /// + /// Calls with + /// that are configured to work with PAPI types. If you + /// need to call other versions of Serialize, consider calling + /// to create an appropriate + /// options object to pass in. + /// + /// A JSON string representation of the value. + public static string SerializeToJson(this T value) + { + return JsonSerializer.Serialize(value, s_papiOptions); + } + + /// + /// Calls + /// with + /// that are configured to work with PAPI types. If you + /// need to call other versions of SerializeToElement, consider calling + /// to create an appropriate + /// options object to pass in. + /// + /// A JsonDocument representation of the JSON value. + public static JsonElement SerializeToJsonElement(this T value) + { + return JsonSerializer.SerializeToElement(value, s_papiOptions); + } +} diff --git a/c-sharp/JsonUtils/SerializationOptions.cs b/c-sharp/JsonUtils/SerializationOptions.cs new file mode 100644 index 0000000000..5a6d136632 --- /dev/null +++ b/c-sharp/JsonUtils/SerializationOptions.cs @@ -0,0 +1,27 @@ +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Unicode; + +namespace Paranext.DataProvider.JsonUtils; + +internal static class SerializationOptions +{ + /// + /// Creates new serialization options used for communicating with the PAPI. + /// + public static JsonSerializerOptions CreateSerializationOptions() + { + JsonSerializerOptions options = + new() + { + TypeInfoResolver = new PrivateConstructorResolver(), // Deserialize objects with private default constructors + Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), // Don't escape non-ASCII characters + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // Allow properties to be upper-case while JSON contains lower-case + WriteIndented = false, // No need to waste bytes with nice formatting + IgnoreReadOnlyProperties = false, // Need types to be serialized + }; + options.Converters.Add(new MessageConverter()); + options.Converters.Add(new VerseRefConverter()); + return options; + } +} diff --git a/c-sharp/JsonUtils/TupleTree.cs b/c-sharp/JsonUtils/TupleTree.cs new file mode 100644 index 0000000000..2d65091893 --- /dev/null +++ b/c-sharp/JsonUtils/TupleTree.cs @@ -0,0 +1,98 @@ +namespace Paranext.DataProvider.JsonUtils; + +/// +/// This class represents a tree data structure whose children are identified by a unique Tuple<T1, T2>. +/// Each node may contain a value of type TResult. The root node and leaf nodes must contain TResult values. +/// +internal class TupleTree + where T1 : IEquatable + where T2 : IEquatable + where TResult : class +{ + private class ChildNode + { + public TResult? Result { get; set; } + public TupleTree? SubTree { get; set; } + } + + private readonly TResult? _defaultValue; + private readonly Dictionary<(T1 val1, T2 val2), ChildNode> _children = new(); + + private TupleTree() { } + + public TupleTree(TResult defaultValue) + { + _defaultValue = defaultValue; + } + + /// + /// Add an ordered set of tuples as a new path in the tree with a given result + /// + /// Ordered list of tuples that will each represent a node in the tree + /// Result value to store for the final item in the list + /// An exception will be thrown if the given path already has a value + public void Add(IList<(T1 val1, T2 val2)> tuples, TResult result) + { + var firstTuple = tuples.First(); + if (!_children.TryGetValue(firstTuple, out var childNode)) + { + childNode = new ChildNode(); + _children[firstTuple] = childNode; + } + + if (tuples.Count == 1) + { + if (childNode.Result != null) + throw new Exception( + $"Value \"{childNode.Result}\" already exists for {firstTuple}, cannot change it to \"{result}\"" + ); + childNode.Result = result; + } + else + { + childNode.SubTree ??= new TupleTree(); + childNode.SubTree.Add(tuples.Skip(1).ToList(), result); + } + } + + /// + /// Find all values in the tree that match the given set of tuples. + /// For paths that don't fully match, values from the closest interior node of the tree are used. + /// For example, take a path A* -> B* -> C -> D* that exists on a tree, where A, B, and D have values assigned. + /// If the given tuples match C but not D, then the value of B will be returned. + /// + public IEnumerable FindAllResults(IEnumerable<(T1 val1, T2 val2)> tuples) + { + return FindAllResultsInternal(new HashSet<(T1 val1, T2 val2)>(tuples)); + } + + private IEnumerable FindAllResultsInternal(IReadOnlySet<(T1 val1, T2 val2)> tuples) + { + bool foundReturnValue = false; + foreach (var child in _children.Where(child => tuples.Contains(child.Key))) + { + if (child.Value.SubTree != null) + { + foreach (var returnValue in child.Value.SubTree.FindAllResultsInternal(tuples)) + { + foundReturnValue = true; + yield return returnValue; + } + } + else if (child.Value.Result != null) + { + foundReturnValue = true; + yield return child.Value.Result; + } + + if (!foundReturnValue && (child.Value.Result != null)) + { + foundReturnValue = true; + yield return child.Value.Result; + } + } + + if (!foundReturnValue && _defaultValue != null) + yield return _defaultValue; + } +} diff --git a/c-sharp/JsonUtils/VerseRefConverter.cs b/c-sharp/JsonUtils/VerseRefConverter.cs new file mode 100644 index 0000000000..51a69e3e1e --- /dev/null +++ b/c-sharp/JsonUtils/VerseRefConverter.cs @@ -0,0 +1,118 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using SIL.Scripture; + +namespace Paranext.DataProvider.JsonUtils; + +public class VerseRefConverter : JsonConverter +{ + private const string BOOK_NUM = "bookNum"; + private const string UNDERSCORE_BOOK_NUM = "_bookNum"; + private const string CHAPTER_NUM = "chapterNum"; + private const string UNDERSCORE_CHAPTER_NUM = "_chapterNum"; + private const string VERSE_NUM = "verseNum"; + private const string UNDERSCORE_VERSE_NUM = "_verseNum"; + + private const string BOOK = "book"; + private const string VERSE = "verse"; + private const string VERSIFICATION = "versification"; + private const string VERSIFICATION_STR = "versificationStr"; + + public override VerseRef Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + int? bookNum = null; + int? chapterNum = null; + int? verseNum = null; + string? bookName = null; + string? verse = null; + string? versification = null; + string? lastPropertyName = null; + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonTokenType.StartObject: + case JsonTokenType.EndObject: + case JsonTokenType.StartArray: + case JsonTokenType.EndArray: + break; + case JsonTokenType.PropertyName: + lastPropertyName = reader.GetString(); + break; + case JsonTokenType.True: + case JsonTokenType.False: + lastPropertyName = null; + break; + case JsonTokenType.Number: + switch (lastPropertyName) + { + case BOOK_NUM: + case UNDERSCORE_BOOK_NUM: + bookNum = reader.GetInt32(); + break; + case CHAPTER_NUM: + case UNDERSCORE_CHAPTER_NUM: + chapterNum = reader.GetInt32(); + break; + case VERSE_NUM: + case UNDERSCORE_VERSE_NUM: + verseNum = reader.GetInt32(); + break; + } + lastPropertyName = null; + break; + case JsonTokenType.String: + switch (lastPropertyName) + { + case BOOK: + bookName = reader.GetString(); + break; + case VERSE: + verse = reader.GetString(); + break; + case VERSIFICATION: + case VERSIFICATION_STR: + versification = reader.GetString(); + break; + } + lastPropertyName = null; + break; + } + } + + if (!chapterNum.HasValue) + throw new JsonException("VerseRef missing chapterNum"); + + if (!verseNum.HasValue && string.IsNullOrEmpty(verse)) + throw new JsonException("VerseRef missing verseNum and verse"); + + if (!bookNum.HasValue && string.IsNullOrEmpty(bookName)) + throw new JsonException("VerseRef missing bookNum and bookName"); + + return string.IsNullOrEmpty(bookName) + ? new VerseRef(bookNum!.Value, chapterNum.Value, verseNum ?? 0) + : new VerseRef( + bookName, + chapterNum.Value.ToString(), + verse ?? verseNum!.Value.ToString(), + new ScrVers(versification) + ); + } + + public override void Write(Utf8JsonWriter writer, VerseRef value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + writer.WriteString(BOOK, value.Book); + writer.WriteNumber(CHAPTER_NUM, value.ChapterNum); + writer.WriteNumber(VERSE_NUM, value.VerseNum); + if (!string.IsNullOrEmpty(value.Verse)) + writer.WriteString(VERSE, value.Verse); + if (value.Versification.Type != ScrVersType.Unknown) + writer.WriteString(VERSIFICATION_STR, value.VersificationStr); + writer.WriteEndObject(); + } +} diff --git a/c-sharp/MessageHandlers/IMessageHandler.cs b/c-sharp/MessageHandlers/IMessageHandler.cs new file mode 100644 index 0000000000..6dc32bf955 --- /dev/null +++ b/c-sharp/MessageHandlers/IMessageHandler.cs @@ -0,0 +1,13 @@ +using Paranext.DataProvider.Messages; + +namespace Paranext.DataProvider.MessageHandlers; + +internal interface IMessageHandler +{ + /// + /// Handle an incoming message, and optionally respond with another message + /// + /// Incoming message to handle + /// Optional responses to the incoming message + public IEnumerable HandleMessage(Message message); +} diff --git a/c-sharp/MessageHandlers/MessageHandlerEvent.cs b/c-sharp/MessageHandlers/MessageHandlerEvent.cs new file mode 100644 index 0000000000..9115a6682c --- /dev/null +++ b/c-sharp/MessageHandlers/MessageHandlerEvent.cs @@ -0,0 +1,80 @@ +using Paranext.DataProvider.Messages; +using PtxUtils; + +namespace Paranext.DataProvider.MessageHandlers; + +using PapiEventHandler = Func; + +/// +/// Handler for "Event" messages +/// +internal class MessageHandlerEvent : IMessageHandler +{ + private readonly Dictionary _handlers = new(); + private readonly object _handlersLock = new(); + + public void RegisterEventHandler(string eventType, PapiEventHandler handler) + { + lock (_handlersLock) + { + if (_handlers.TryGetValue(eventType, out PapiEventHandler? existingDelegate)) + { + // Remove and add the handler to ensure it isn't included twice + PapiEventHandler? newDelegate = existingDelegate - handler; + if (newDelegate != null) + { + newDelegate += handler; + _handlers[eventType] = newDelegate; + } + } + else + { + _handlers[eventType] = handler; + } + } + } + + public void UnregisterEventHandler(string eventType, PapiEventHandler handler) + { + lock (_handlersLock) + { + if (_handlers.TryGetValue(eventType, out PapiEventHandler? existingDelegate)) + { + PapiEventHandler? newDelegate = existingDelegate - handler; + if (newDelegate != null) + _handlers[eventType] = newDelegate; + else + _handlers.Remove(eventType, out _); + } + } + } + + public IEnumerable HandleMessage(Message message) + { + if (message == null) + throw new ArgumentNullException(nameof(message)); + + if (message is not MessageEvent evt) + throw new ArgumentException("Incorrect message type", nameof(message)); + + Console.WriteLine($"Event received: {StringUtils.LimitLength(evt.ToString(), 180)}"); + + Delegate[]? handlersToRun; + lock (_handlersLock) + { + if (!_handlers.TryGetValue(evt.EventType, out PapiEventHandler? handlersForEventType)) + yield break; + + // The returned array and the functions in it will not change after this call + // even if Register/Unregister is called while we are invoking the handlers + handlersToRun = handlersForEventType.GetInvocationList(); + } + + foreach (var handler in handlersToRun) + { + var msg = handler.DynamicInvoke(evt); + if (msg != null) + yield return (Message)msg; + } + } +} diff --git a/c-sharp/MessageHandlers/MessageHandlerInitClient.cs b/c-sharp/MessageHandlers/MessageHandlerInitClient.cs new file mode 100644 index 0000000000..d07272d26a --- /dev/null +++ b/c-sharp/MessageHandlers/MessageHandlerInitClient.cs @@ -0,0 +1,29 @@ +using Paranext.DataProvider.Messages; + +namespace Paranext.DataProvider.MessageHandlers; + +/// +/// Handler for "Response" messages +/// +internal class MessageHandlerInitClient : IMessageHandler +{ + private readonly Action _clientIdCallback; + + public MessageHandlerInitClient(Action clientIdCallback) + { + _clientIdCallback = clientIdCallback; + } + + public IEnumerable HandleMessage(Message message) + { + if (message == null) + throw new ArgumentNullException(nameof(message)); + + if (message is not MessageInitClient initClientMsg) + throw new ArgumentException("Incorrect message type", nameof(message)); + + int clientId = initClientMsg.ConnectorInfo.ClientId; + _clientIdCallback(clientId); + yield return new MessageClientConnect(clientId); + } +} diff --git a/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs b/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs new file mode 100644 index 0000000000..aaf1a30221 --- /dev/null +++ b/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs @@ -0,0 +1,67 @@ +using Paranext.DataProvider.Messages; +using System.Collections.Concurrent; +using System.Text.Json; + +namespace Paranext.DataProvider.MessageHandlers; + +using RequestHandler = Func; + +/// +/// Handler for "Request" messages that assumes there should be 1 way to respond to each RequestType +/// +internal class MessageHandlerRequestByRequestType : IMessageHandler +{ + private readonly ConcurrentDictionary _handlersByRequestType = new(); + + /// + /// Sets the handler to be called in response to the given request type + /// + /// Attempt to set handler for a request type that already + /// has a handler. + /// This is intended to be called only by PapiClient.RegisterRequestHandler. In + /// production, the argument exception should therefore be impossible, since the server should + /// be checking to prevent duplicates. + public void SetHandlerForRequestType(string requestType, RequestHandler handler) + { + if (!_handlersByRequestType.TryAdd(requestType, handler)) + throw new ArgumentException( + "Attempt to set handler for a request type that already has a handler.", + nameof(requestType) + ); + } + + public IEnumerable HandleMessage(Message message) + { + if (message == null) + throw new ArgumentNullException(nameof(message)); + + if (message is not MessageRequest request) + throw new ArgumentException("Incorrect message type", nameof(message)); + + if (!_handlersByRequestType.TryGetValue(request.RequestType, out RequestHandler? handler)) + { + Console.Error.WriteLine($"Unable to process request type: {request.RequestType}"); + yield break; + } + + var response = handler(request.Contents); + if (response.Success) + { + yield return MessageResponse.Succeeded( + request.RequestType, + request.RequestId, + request.SenderId, + response.Contents + ); + } + else + { + yield return MessageResponse.Failed( + request.RequestType, + request.RequestId, + request.SenderId, + response.ErrorMessage ?? "Unspecified error" + ); + } + } +} diff --git a/c-sharp/MessageHandlers/MessageHandlerResponse.cs b/c-sharp/MessageHandlers/MessageHandlerResponse.cs new file mode 100644 index 0000000000..9b49d613d6 --- /dev/null +++ b/c-sharp/MessageHandlers/MessageHandlerResponse.cs @@ -0,0 +1,40 @@ +using Paranext.DataProvider.Messages; + +namespace Paranext.DataProvider.MessageHandlers; + +/// +/// Handler for "Response" messages +/// +internal class MessageHandlerResponse : IMessageHandler +{ + private readonly MessageRequest _originalRequest; + private readonly Action _messageProcessingCallback; + + public MessageHandlerResponse(MessageRequest originalRequest, Action callback) + { + _originalRequest = originalRequest; + _messageProcessingCallback = callback; + } + + public MessageHandlerResponse(MessageRequest originalRequest) + : this(originalRequest, DoNothing) { } + + private static void DoNothing(bool success, object? message) { } + + public IEnumerable HandleMessage(Message message) + { + if (message == null) + throw new ArgumentNullException(nameof(message)); + + if (message is not MessageResponse response) + throw new ArgumentException("Incorrect message type", nameof(message)); + + if (!response.Success) + Console.Error.WriteLine( + $"Request failed: \"{_originalRequest}\" with error message \"{response.ErrorMessage ?? ""}\"" + ); + + _messageProcessingCallback(response.Success, response.Contents); + yield break; + } +} diff --git a/c-sharp/MessageHandlers/ResponseToRequest.cs b/c-sharp/MessageHandlers/ResponseToRequest.cs new file mode 100644 index 0000000000..28711365a4 --- /dev/null +++ b/c-sharp/MessageHandlers/ResponseToRequest.cs @@ -0,0 +1,36 @@ +namespace Paranext.DataProvider.MessageHandlers; + +/// +/// Internally represents a response we generated to an incoming request +/// +public sealed record ResponseToRequest +{ + private ResponseToRequest(bool success, object? contents, string? errorMessage) + { + Success = success; + Contents = contents; + ErrorMessage = errorMessage; + } + + /// + /// Response when successful + /// + public static ResponseToRequest Succeeded(object? contents = null) + { + return new ResponseToRequest(true, contents, null); + } + + /// + /// Response when there was an error + /// + public static ResponseToRequest Failed(string errorMessage) + { + return new ResponseToRequest(false, null, errorMessage); + } + + public bool Success { get; } + + public string? ErrorMessage { get; } + + public object? Contents { get; } +} diff --git a/c-sharp/MessageTransports/PapiClient.cs b/c-sharp/MessageTransports/PapiClient.cs new file mode 100644 index 0000000000..ac952259e5 --- /dev/null +++ b/c-sharp/MessageTransports/PapiClient.cs @@ -0,0 +1,583 @@ +using System.Collections.Concurrent; +using System.Net.WebSockets; +using System.Text; +using System.Text.Json; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; + +namespace Paranext.DataProvider.MessageTransports; + +/// +/// Class to facilitate communication to the Paranext server via the PAPI +/// +internal class PapiClient : IDisposable +{ + #region Delegates/Constants/Member variables + + private const int RECEIVE_BUFFER_LENGTH = 2048; + private const int MAX_OUTGOING_MESSAGES = 10; + private static readonly Encoding s_utf8WithoutBom = new UTF8Encoding(); + private static readonly Uri s_connectionUri = new("ws://localhost:8876"); + + protected readonly Dictionary _messageHandlersByMessageType = new(); + protected readonly ConcurrentDictionary _messageHandlersForMyRequests = + new(); + private readonly ClientWebSocket _webSocket = new(); + private readonly Task _incomingMessageTask; + private readonly Task _outgoingMessageTask; + private readonly TimeSpan _connectTimeout = TimeSpan.FromSeconds(30); + private readonly TimeSpan _disconnectTimeout = TimeSpan.FromSeconds(2); + private readonly TaskCompletionSource _clientInitializationComplete = new(); + private readonly BlockingCollection _outgoingMessages = new(MAX_OUTGOING_MESSAGES); + private readonly CancellationTokenSource _cancellationTokenSource = new(); + private readonly CancellationToken _cancellationToken; + private int _clientId = MessageInitClientConnectorInfo.CLIENT_ID_UNSET; + private int _nextRequestId = 1; + private bool _isDisposed = false; + + #endregion + + #region Constructors + + public PapiClient() + { + _cancellationToken = _cancellationTokenSource.Token; + + _incomingMessageTask = new Task(HandleIncomingMessages, _cancellationToken); + _outgoingMessageTask = new Task(HandleOutgoingMessages, _cancellationToken); + + _messageHandlersByMessageType[MessageType.EVENT] = new MessageHandlerEvent(); + _messageHandlersByMessageType[MessageType.INIT_CLIENT] = new MessageHandlerInitClient( + (int clientId) => + { + if (_clientInitializationComplete.Task.IsCompletedSuccessfully) + throw new InvalidOperationException("Reinitializing client is not allowed"); + + _clientId = clientId; + _clientInitializationComplete.TrySetResult(true); + } + ); + _messageHandlersByMessageType[MessageType.REQUEST] = + new MessageHandlerRequestByRequestType(); + } + + #endregion + + #region Dispose + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool isDisposing)' method + Dispose(isDisposing: true); + // ReSharper disable once GCSuppressFinalizeForTypeWithoutDestructor + GC.SuppressFinalize(this); + } + + // Override finalizer only if 'Dispose(bool isDisposing)' has code to free unmanaged resources + // https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose + // ~PapiClient() + // { + // // Do not change this code. Put cleanup code in 'Dispose(bool isDisposing)' method + // Dispose(isDisposing: false); + // } + + private void Dispose(bool isDisposing) + { + if (_isDisposed) + return; + + if (isDisposing) + { + _webSocket.Dispose(); + _clientInitializationComplete.TrySetResult(false); + _clientInitializationComplete.Task.Dispose(); + _cancellationTokenSource.Dispose(); + _outgoingMessages.Dispose(); + } + + _messageHandlersByMessageType.Clear(); + _messageHandlersForMyRequests.Clear(); + + _isDisposed = true; + } + + #endregion + + #region Properties + + /// + /// Gets whether a connection is open to the server + /// + public bool Connected => !_isDisposed && _webSocket.State == WebSocketState.Open; + + /// + /// Gets a task that completes once incoming and outgoing message handling is finished + /// + public Task MessageHandlingCompleteTask => + _isDisposed ? Task.CompletedTask : Task.WhenAll(_incomingMessageTask, _outgoingMessageTask); + + #endregion + + #region Public methods + + /// + /// Open and initialize a connection with the server. + /// If true is returned, then should be called before for a proper cleanup of resources. + /// If false is returned, then there is no need to call before calling . + /// + /// that will resolve to true if the connection initialized properly, false otherwise + public virtual async Task ConnectAsync() + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + Console.WriteLine("PapiClient connecting"); + + await _webSocket.ConnectAsync(s_connectionUri, _cancellationToken); + _incomingMessageTask.Start(); + _outgoingMessageTask.Start(); + + if ( + !await IsTaskCompleted( + _clientInitializationComplete.Task, + _connectTimeout, + _cancellationToken + ) + ) + { + Console.WriteLine("PapiClient did not connect"); + await DisconnectAsync(); + return false; + } + + Console.WriteLine("PapiClient connected successfully"); + return true; + } + + /// + /// Attempt to close the connection to the server gracefully. + /// After calling this method, the PapiClient object should not be used for anything. If you want to reconnect, create a new object. + /// + public virtual async Task DisconnectAsync() + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + Console.WriteLine("PapiClient disconnecting"); + + SignalToBeginGracefulDisconnect(); + + if (!await IsTaskCompletedNoCancellation(MessageHandlingCompleteTask, _disconnectTimeout)) + Console.WriteLine("Message handling tasks did not shut down properly"); + + if (Connected) + { + await _webSocket.CloseAsync( + WebSocketCloseStatus.NormalClosure, + string.Empty, + CancellationToken.None + ); + } + } + + /// + /// Send a request to the server. The response (if any) will be handled asynchronously by calling . + /// + /// Type of request intended for the server + /// If the object is a , it will be used as-is in the request. + /// Otherwise the object will be serialized into a then sent. + /// Callback for the response to this request being sent. + /// The first argument indicates whether the request was successful. + /// The second argument is the optional contents of the response message. + public virtual void SendRequest( + string requestType, + object requestContents, + Action responseCallback + ) + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + int requestId = GetRequestId(); + var requestMessage = + (requestContents is JsonElement jse) + ? new MessageRequest(requestType, requestId, jse) + : new MessageRequest(requestType, requestId, requestContents); + _messageHandlersForMyRequests[requestId] = new MessageHandlerResponse( + requestMessage, + responseCallback + ); + QueueOutgoingMessage(requestMessage); + } + + /// + /// Register a request handler with the server. + /// + /// The request type to register + /// Method that is called when a request of the specified type is received from the server + /// Number of milliseconds to wait for the registration response to be received + /// that will resolve to true if registration was successful, false otherwise + public virtual async Task RegisterRequestHandler( + string requestType, + Func requestHandler, + int responseTimeoutInMs = 5000 + ) + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + Console.WriteLine($"Registering handler for request type {requestType}..."); + bool registrationSucceeded = false; + TaskCompletionSource registrationSource = new(); + using Task registrationTask = registrationSource.Task; + + SendRequest( + "server:registerRequest", + new object[] { requestType, _clientId }, + (bool success, object? _) => + { + if (!success) + { + Console.WriteLine( + $"Failed to register request type \"{requestType}\" with the server" + ); + } + else + { + var responder = (MessageHandlerRequestByRequestType) + _messageHandlersByMessageType[MessageType.REQUEST]; + responder.SetHandlerForRequestType(requestType, requestHandler); + Console.WriteLine( + $"Request type \"{requestType}\" successfully registered with the server" + ); + registrationSucceeded = true; + } + + if (!registrationSource.TrySetResult()) + Console.WriteLine("Couldn't signal that registration is complete"); + } + ); + + var timeout = TimeSpan.FromMilliseconds(responseTimeoutInMs); + if (!await IsTaskCompleted(registrationTask, timeout, _cancellationToken)) + { + Console.WriteLine($"No response when registering request type \"{requestType}\""); + registrationSource.TrySetCanceled(); + } + + return registrationSucceeded; + } + + /// + /// Configure PapiClient to call whenever an event of type is received. + /// + /// Event type to monitor + /// Function that accepts an event message and optionally returns messages to send + public virtual void RegisterEventHandler( + string eventType, + Func eventHandler + ) + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + var msgHandler = (MessageHandlerEvent)_messageHandlersByMessageType[MessageType.EVENT]; + msgHandler.RegisterEventHandler(eventType, eventHandler); + Console.WriteLine($"Handler for event type \"{eventType}\" successfully registered"); + } + + /// + /// Configure PapiClient to no longer call whenever an event of type is received. + /// + /// Event type to monitor + /// Same function reference previously passed to RegisterEventHandler + public virtual void UnregisterEventHandler( + string eventType, + Func eventHandler + ) + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + var msgHandler = (MessageHandlerEvent)_messageHandlersByMessageType[MessageType.EVENT]; + msgHandler.UnregisterEventHandler(eventType, eventHandler); + Console.WriteLine($"Handler for event type \"{eventType}\" successfully unregistered"); + } + + /// + /// Send an event message to the server. + /// + /// Event message to send + public virtual void SendEvent(MessageEvent message) + { + ObjectDisposedException.ThrowIf(_isDisposed, this); + + QueueOutgoingMessage(message); + } + + #endregion + + #region Protected Methods + protected int GetRequestId() => Interlocked.Increment(ref _nextRequestId); + #endregion + + #region Private helper methods for any thread to call + + /// + /// Queues the specified message to be sent to the server + /// + /// Message to send + private void QueueOutgoingMessage(Message message) + { + _outgoingMessages.Add(message, _cancellationToken); + } + + /// + /// This should signal anything that is waiting on potential new data to stop waiting + /// + private void SignalToBeginGracefulDisconnect() + { + Console.WriteLine( + $"SignalToBeginGracefulDisconnect: webSocketState={_webSocket.State}, closeStatus={_webSocket.CloseStatus}, closeStatusDescription=\"{_webSocket.CloseStatusDescription}\"" + ); + + // This should shut down the socket and messaging threads + _cancellationTokenSource.Cancel(); + + // This will make sure anything else blocked on the queue is freed + _outgoingMessages.CompleteAdding(); + } + + /// + /// Check if the given task has completed. If not, give it until the timeout to complete. + /// + /// Task to verify + /// How long to wait for the task to complete + /// that will resolve to true if the given task completed, false otherwise + private static Task IsTaskCompletedNoCancellation(Task task, TimeSpan timeout) + { + return IsTaskCompleted(task, timeout, CancellationToken.None); + } + + /// + /// Check if the given task has completed. If not, give it until the timeout to complete. + /// + /// Task to verify + /// How long to wait for the task to complete + /// Cancellation token that could interrupt waiting + /// that will resolve to true if the given task completed, false otherwise + private static async Task IsTaskCompleted( + Task task, + TimeSpan timeout, + CancellationToken cancellationToken + ) + { + if (task.IsCompleted) + return true; + + try + { + if (!cancellationToken.IsCancellationRequested) + await task.WaitAsync(timeout, cancellationToken); + } + catch (TimeoutException) { } + + return task.IsCompleted; + } + + #endregion + + #region Private methods for the outgoing messaging task to use exclusively + + /// + /// Entry point for the outgoing messaging task + /// Pulls messages out of the queue and sends them to the server + /// + private async void HandleOutgoingMessages() + { + try + { + Console.WriteLine("PapiClient HandleOutgoingMessages starting"); + + do + { + try + { + Message message = _outgoingMessages.Take(_cancellationToken); + await SendOutgoingMessageAsync(message); + } + catch (OperationCanceledException) + { + break; + } + catch (Exception ex) + { + Console.WriteLine($"Exception while sending outgoing messages: {ex}"); + } + } while (!_cancellationToken.IsCancellationRequested && Connected); + } + catch (ObjectDisposedException) { } + finally + { + Console.WriteLine( + $"PapiClient HandleOutgoingMessages finishing: cancel={_cancellationToken.IsCancellationRequested}, connected={Connected}" + ); + } + } + + private async Task SendOutgoingMessageAsync(Message message) + { + message.SenderId = _clientId; + string jsonData = message.SerializeToJson(); + /* Helpful for debugging + Console.WriteLine( + "Sending message over websocket: {0}", + StringUtils.LimitLength(jsonData, 180) + ); + */ + byte[] data = s_utf8WithoutBom.GetBytes(jsonData); + await _webSocket.SendAsync(data, WebSocketMessageType.Text, true, _cancellationToken); + } + + #endregion + + #region Private methods for the incoming messaging task to use exclusively + + /// + /// Entry point for the incoming messaging task + /// Receives and processes messages coming from the server + /// + private async void HandleIncomingMessages() + { + try + { + Console.WriteLine("PapiClient HandleIncomingMessages starting"); + + do + { + try + { + Message? message = await ReceiveIncomingMessageAsync(); + // Handle each message asynchronously so we can keep receiving more messages + _ = Task.Run( + () => + { + HandleIncomingMessage(message); + }, + _cancellationToken + ); + } + catch (OperationCanceledException) + { + break; + } + catch (Exception ex) + { + Console.WriteLine($"Exception while handling messages: {ex}"); + } + } while (!_cancellationToken.IsCancellationRequested && Connected); + } + catch (ObjectDisposedException) { } + finally + { + Console.WriteLine( + $"PapiClient HandleIncomingMessages finishing: cancel={_cancellationToken.IsCancellationRequested}, connected={Connected}" + ); + } + } + + private async Task ReceiveIncomingMessageAsync() + { + using MemoryStream message = new(RECEIVE_BUFFER_LENGTH); + byte[] buffer = new byte[RECEIVE_BUFFER_LENGTH]; + Memory bufferMemory = new(buffer); + ValueWebSocketReceiveResult result; + do + { + result = await _webSocket.ReceiveAsync(bufferMemory, _cancellationToken); + switch (result.MessageType) + { + case WebSocketMessageType.Text: + message.Write(buffer, 0, result.Count); + break; + case WebSocketMessageType.Binary: + throw new InvalidOperationException("Can't handle binary data yet."); + case WebSocketMessageType.Close: + SignalToBeginGracefulDisconnect(); + return null; + default: + throw new Exception($"Unknown WebSocketMessageType: {result.MessageType}"); + } + } while (!result.EndOfMessage); + + string jsonData = s_utf8WithoutBom.GetString(message.GetBuffer(), 0, (int)message.Position); + /* Helpful for debugging + Console.WriteLine( + "Received message over websocket: {0}", + StringUtils.LimitLength(jsonData, 180) + ); + */ + return jsonData.DeserializeFromJson(); + } + + #endregion + + #region Private methods for thread pool threads to use exclusively + + /// + /// Entry point for thread pool threads + /// Message handler for any kind of message + /// + private void HandleIncomingMessage(Message? message) + { + try + { + if (message is null) + { + if (!_cancellationToken.IsCancellationRequested) + Console.WriteLine("Received null message!"); + return; + } + + if (message is MessageResponse messageResponse) + { + HandleIncomingMessageResponse(messageResponse); + return; + } + + if (_messageHandlersByMessageType.TryGetValue(message.Type, out var messageHandler)) + { + foreach (var messageToSend in messageHandler.HandleMessage(message)) + { + QueueOutgoingMessage(messageToSend); + } + } + else + { + Console.WriteLine($"No handler registered for message type: {message.Type}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Exception while handling message: {ex}"); + } + } + + /// + /// Message handler for a response to a request we previously sent + /// + private void HandleIncomingMessageResponse(MessageResponse response) + { + // Remove, don't just get, the response handler since the request is complete + if (_messageHandlersForMyRequests.TryRemove(response.RequestId, out var messageHandler)) + { + foreach (var messageToSend in messageHandler.HandleMessage(response)) + { + QueueOutgoingMessage(messageToSend); + } + } + else + { + Console.WriteLine( + $"No handler registered for response from request ID: {response.RequestId}" + ); + } + } + + #endregion +} diff --git a/c-sharp/Messages/EventType.cs b/c-sharp/Messages/EventType.cs new file mode 100644 index 0000000000..6198079646 --- /dev/null +++ b/c-sharp/Messages/EventType.cs @@ -0,0 +1,13 @@ +namespace Paranext.DataProvider.Messages; + +/// +/// These are well known event types, but there isn't a fixed set of all possible event types +/// +public static class EventType +{ + public const string UNKNOWN = "UNKNOWN"; + public const string CLIENT_CONNECT = "network:onDidClientConnect"; + public const string CLIENT_DISCONNECT = "network:onDidClientDisconnect"; + public const string OBJECT_DISPOSE = "object:onDidDisposeNetworkObject"; + public const string OBJECT_CREATE = "object:onDidCreateNetworkObject"; +} diff --git a/c-sharp/Messages/Message.cs b/c-sharp/Messages/Message.cs new file mode 100644 index 0000000000..bf301e6dbe --- /dev/null +++ b/c-sharp/Messages/Message.cs @@ -0,0 +1,42 @@ +namespace Paranext.DataProvider.Messages; + +/// +/// Base class for messages sent over the websocket connection +/// +public class Message +{ + private Message() + { + SenderId = UNKNOWN_SENDER_ID; + Type = MessageType.UNKNOWN; + } + + protected Message(string messageType) + { + SenderId = UNKNOWN_SENDER_ID; + Type = messageType; + } + + protected Message(string messageType, int senderId) + { + SenderId = senderId; + Type = messageType; + } + + public const int UNKNOWN_SENDER_ID = -1; + + /// + /// Message type + /// + public string Type { get; protected set; } + + /// + /// ID (as assigned by the server) of the original sender of this message + /// + public int SenderId { get; set; } + + public override string ToString() + { + return $"MessageType: {Type} from {SenderId}"; + } +} diff --git a/c-sharp/Messages/MessageClientConnect.cs b/c-sharp/Messages/MessageClientConnect.cs new file mode 100644 index 0000000000..a4a3a46730 --- /dev/null +++ b/c-sharp/Messages/MessageClientConnect.cs @@ -0,0 +1,19 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +/// +/// Message responding to the server to let it know this connection is ready to receive messages +/// +[JsonMessageDeserialization(MessageField.MESSAGE_TYPE, MessageType.CLIENT_CONNECT)] +public sealed class MessageClientConnect : Message +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageClientConnect() + : base(MessageType.CLIENT_CONNECT) { } + + public MessageClientConnect(int senderId) + : base(MessageType.CLIENT_CONNECT, senderId) { } +} diff --git a/c-sharp/Messages/MessageEvent.cs b/c-sharp/Messages/MessageEvent.cs new file mode 100644 index 0000000000..834f2fc071 --- /dev/null +++ b/c-sharp/Messages/MessageEvent.cs @@ -0,0 +1,39 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +/// +/// Message events to/from the server. +/// +[JsonMessageDeserialization(MessageField.MESSAGE_TYPE, MessageType.EVENT)] +public class MessageEvent : Message +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEvent() + : base(MessageType.EVENT) + { + EventType = Messages.EventType.UNKNOWN; + Event = null; + } + + public MessageEvent(string eventType, object? eventContents) + : base(MessageType.EVENT) + { + EventType = eventType; + Event = eventContents; + } + + public string EventType { get; set; } + + /// + /// Weakly typed event contents - subclasses hide this with a strongly typed property + /// + public object? Event { get; set; } + + public override string ToString() + { + return base.ToString() + $", EventType = {EventType}"; + } +} diff --git a/c-sharp/Messages/MessageEventClientConnect.cs b/c-sharp/Messages/MessageEventClientConnect.cs new file mode 100644 index 0000000000..e4c6b477ba --- /dev/null +++ b/c-sharp/Messages/MessageEventClientConnect.cs @@ -0,0 +1,40 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.CLIENT_CONNECT +)] +public sealed class MessageEventClientConnect + : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventClientConnect() + : base(Messages.EventType.CLIENT_CONNECT, null!) { } + + public MessageEventClientConnect(int clientId, bool didReconnect) + : base( + Messages.EventType.CLIENT_CONNECT, + new MessageEventClientConnectContents + { + ClientId = clientId, + DidReconnect = didReconnect + } + ) { } +} + +public sealed record MessageEventClientConnectContents +{ + public int ClientId { get; set; } + public bool DidReconnect { get; set; } + + public override string ToString() + { + return $"ClientId = {ClientId}, DidReconnect = {DidReconnect}"; + } +} diff --git a/c-sharp/Messages/MessageEventClientDisconnect.cs b/c-sharp/Messages/MessageEventClientDisconnect.cs new file mode 100644 index 0000000000..18bb437942 --- /dev/null +++ b/c-sharp/Messages/MessageEventClientDisconnect.cs @@ -0,0 +1,35 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.CLIENT_DISCONNECT +)] +public sealed class MessageEventClientDisconnect + : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventClientDisconnect() + : base(Messages.EventType.CLIENT_DISCONNECT, null!) { } + + public MessageEventClientDisconnect(int clientId) + : base( + Messages.EventType.CLIENT_DISCONNECT, + new MessageEventClientDisconnectContents { ClientId = clientId } + ) { } +} + +public sealed record MessageEventClientDisconnectContents +{ + public int ClientId { get; set; } + + public override string ToString() + { + return $"ClientId = {ClientId}"; + } +} diff --git a/c-sharp/Messages/MessageEventGeneric.cs b/c-sharp/Messages/MessageEventGeneric.cs new file mode 100644 index 0000000000..a0b44ec4bc --- /dev/null +++ b/c-sharp/Messages/MessageEventGeneric.cs @@ -0,0 +1,41 @@ +namespace Paranext.DataProvider.Messages; + +/// +/// Message events to/from the server. +/// +public class MessageEventGeneric : MessageEvent +{ + private TContents _contents; + + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventGeneric() + : base(Messages.EventType.UNKNOWN, default) + { + _contents = default!; + } + + public MessageEventGeneric(string eventType, TContents eventContents) + : base(eventType, eventContents) + { + _contents = eventContents; + } + + public new TContents Event + { + get => _contents; + // When we update the strongly typed event variable, + // also update the weakly typed one owned by MessageEvent + set + { + _contents = value; + base.Event = _contents!; + } + } + + public override string ToString() + { + return base.ToString() + $", Event = {Event}"; + } +} diff --git a/c-sharp/Messages/MessageEventObjectCreated.cs b/c-sharp/Messages/MessageEventObjectCreated.cs new file mode 100644 index 0000000000..25b1d2073f --- /dev/null +++ b/c-sharp/Messages/MessageEventObjectCreated.cs @@ -0,0 +1,42 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.OBJECT_CREATE +)] +public sealed class MessageEventObjectCreated + : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventObjectCreated() + : base(Messages.EventType.OBJECT_CREATE, null!) { } + + public MessageEventObjectCreated(string id, string objectType, string[] functions) + : base( + Messages.EventType.OBJECT_CREATE, + new MessageEventObjectCreatedContents + { + Id = id, + ObjectType = objectType, + Functions = functions + } + ) { } +} + +public sealed record MessageEventObjectCreatedContents +{ + public string? Id { get; set; } + public string? ObjectType { get; set; } + public string[]? Functions { get; set; } + + public override string ToString() + { + return $"Id = {Id}, ObjectType = {ObjectType}, Functions = {(Functions != null ? string.Join(',', Functions) : "[null]")}"; + } +} diff --git a/c-sharp/Messages/MessageEventObjectDisposed.cs b/c-sharp/Messages/MessageEventObjectDisposed.cs new file mode 100644 index 0000000000..c608ee711c --- /dev/null +++ b/c-sharp/Messages/MessageEventObjectDisposed.cs @@ -0,0 +1,21 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.OBJECT_DISPOSE +)] +public sealed class MessageEventObjectDisposed : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventObjectDisposed() + : base(Messages.EventType.OBJECT_DISPOSE, null!) { } + + public MessageEventObjectDisposed(string objectName) + : base(Messages.EventType.OBJECT_DISPOSE, objectName) { } +} diff --git a/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs b/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs new file mode 100644 index 0000000000..cadcb74f68 --- /dev/null +++ b/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs @@ -0,0 +1,61 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.OBJECT_CREATE, + MessageField.OBJECT_TYPE, + NetworkObjectType.PROJECT_DATA_PROVIDER +)] +public sealed class MessageEventProjectDataProviderCreated + : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventProjectDataProviderCreated() + : base(Messages.EventType.OBJECT_CREATE, null!) { } + + public MessageEventProjectDataProviderCreated( + string id, + string[] functions, + string projectID, + List projectInterfaces + ) + : base( + Messages.EventType.OBJECT_CREATE, + new MessageEventProjectDataProviderCreatedContents + { + Id = id, + ObjectType = NetworkObjectType.PROJECT_DATA_PROVIDER, + Functions = functions, + Attributes = new ProjectDataProviderAttributes + { + ProjectId = projectID, + ProjectInterfaces = projectInterfaces, + } + } + ) { } +} + +public sealed record MessageEventProjectDataProviderCreatedContents +{ + public string? Id { get; set; } + public string? ObjectType { get; set; } + public string[]? Functions { get; set; } + public ProjectDataProviderAttributes? Attributes { get; set; } + + public override string ToString() + { + return $"Id = {Id}, ObjectType = {ObjectType}, Functions = {(Functions != null ? string.Join(',', Functions) : "[null]")}, ProjectID = {Attributes?.ProjectId}, ProjectInterfaces = {(Attributes?.ProjectInterfaces != null ? string.Join(',', Attributes.ProjectInterfaces) : "")}"; + } +} + +public sealed record ProjectDataProviderAttributes +{ + public string? ProjectId { get; set; } + public List? ProjectInterfaces { get; set; } +} diff --git a/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs b/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs new file mode 100644 index 0000000000..9a61b2975a --- /dev/null +++ b/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs @@ -0,0 +1,58 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +[JsonMessageDeserialization( + MessageField.MESSAGE_TYPE, + MessageType.EVENT, + MessageField.EVENT_TYPE, + Messages.EventType.OBJECT_CREATE, + MessageField.OBJECT_TYPE, + NetworkObjectType.PROJECT_DATA_PROVIDER_FACTORY +)] +public sealed class MessageEventProjectDataProviderFactoryCreated + : MessageEventGeneric +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageEventProjectDataProviderFactoryCreated() + : base(Messages.EventType.OBJECT_CREATE, null!) { } + + public MessageEventProjectDataProviderFactoryCreated( + string id, + string[] functions, + List projectInterfaces + ) + : base( + Messages.EventType.OBJECT_CREATE, + new MessageEventProjectDataProviderFactoryCreatedContents + { + Id = id, + ObjectType = NetworkObjectType.PROJECT_DATA_PROVIDER_FACTORY, + Functions = functions, + Attributes = new ProjectDataProviderFactoryAttributes + { + ProjectInterfaces = projectInterfaces, + } + } + ) { } +} + +public sealed record MessageEventProjectDataProviderFactoryCreatedContents +{ + public string? Id { get; set; } + public string? ObjectType { get; set; } + public string[]? Functions { get; set; } + public ProjectDataProviderFactoryAttributes? Attributes { get; set; } + + public override string ToString() + { + return $"Id = {Id}, ObjectType = {ObjectType}, Functions = {(Functions != null ? string.Join(',', Functions) : "[null]")}, ProjectInterfaces = {(Attributes?.ProjectInterfaces != null ? string.Join(',', Attributes.ProjectInterfaces) : "")}"; + } +} + +public sealed record ProjectDataProviderFactoryAttributes +{ + public List? ProjectInterfaces { get; set; } +} diff --git a/c-sharp/Messages/MessageField.cs b/c-sharp/Messages/MessageField.cs new file mode 100644 index 0000000000..4fd0596fc4 --- /dev/null +++ b/c-sharp/Messages/MessageField.cs @@ -0,0 +1,8 @@ +namespace Paranext.DataProvider.Messages; + +internal static class MessageField +{ + public const string MESSAGE_TYPE = "type"; + public const string EVENT_TYPE = "eventType"; + public const string OBJECT_TYPE = "objectType"; +} diff --git a/c-sharp/Messages/MessageInitClient.cs b/c-sharp/Messages/MessageInitClient.cs new file mode 100644 index 0000000000..229b5162d6 --- /dev/null +++ b/c-sharp/Messages/MessageInitClient.cs @@ -0,0 +1,63 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +/// +/// Message sent to the client to give it ConnectorInfo +/// +[JsonMessageDeserialization(MessageField.MESSAGE_TYPE, MessageType.INIT_CLIENT)] +public sealed class MessageInitClient : Message +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageInitClient() + : base(MessageType.INIT_CLIENT) + { + ConnectorInfo = new MessageInitClientConnectorInfo( + MessageInitClientConnectorInfo.CLIENT_ID_UNSET + ); + ClientGuid = null!; + } + + public MessageInitClient(MessageInitClientConnectorInfo connectorInfo) + : base(MessageType.INIT_CLIENT) + { + ConnectorInfo = connectorInfo; + ClientGuid = string.Empty; + } + + public MessageInitClientConnectorInfo ConnectorInfo { get; set; } + + public string ClientGuid { get; set; } + + public override string ToString() + { + return base.ToString() + $", ConnectorInfo={ConnectorInfo}, ClientGuid={ClientGuid}"; + } +} + +public sealed class MessageInitClientConnectorInfo +{ + public const int CLIENT_ID_UNSET = -1; + + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageInitClientConnectorInfo() + { + ClientId = CLIENT_ID_UNSET; + } + + public MessageInitClientConnectorInfo(int clientId) + { + ClientId = clientId; + } + + public int ClientId { get; set; } + + public override string ToString() + { + return $"ClientId={ClientId}"; + } +} diff --git a/c-sharp/Messages/MessageRequest.cs b/c-sharp/Messages/MessageRequest.cs new file mode 100644 index 0000000000..571949521a --- /dev/null +++ b/c-sharp/Messages/MessageRequest.cs @@ -0,0 +1,48 @@ +using System.Text.Json; +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +/// +/// Message requests to/from the server. +/// +[JsonMessageDeserialization(MessageField.MESSAGE_TYPE, MessageType.REQUEST)] +public sealed class MessageRequest : Message +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageRequest() + : base(MessageType.REQUEST) + { + RequestType = null!; + Contents = new JsonElement(); + } + + public MessageRequest(string requestType, int requestId, object contents) + : base(MessageType.REQUEST) + { + RequestType = requestType; + RequestId = requestId; + Contents = contents.SerializeToJsonElement(); + } + + public MessageRequest(string requestType, int requestId, JsonElement contents) + : base(MessageType.REQUEST) + { + RequestType = requestType; + RequestId = requestId; + Contents = contents; + } + + public string RequestType { get; set; } + + public int RequestId { get; set; } + + public JsonElement Contents { get; set; } + + public override string ToString() + { + return $"Request: {RequestType} ({RequestId}) from {SenderId}"; + } +} diff --git a/c-sharp/Messages/MessageResponse.cs b/c-sharp/Messages/MessageResponse.cs new file mode 100644 index 0000000000..094b6b510d --- /dev/null +++ b/c-sharp/Messages/MessageResponse.cs @@ -0,0 +1,76 @@ +using Paranext.DataProvider.JsonUtils; + +namespace Paranext.DataProvider.Messages; + +/// +/// Message responses from/to the server - It is the result of sending/getting a request +/// +[JsonMessageDeserialization(MessageField.MESSAGE_TYPE, MessageType.RESPONSE)] +public sealed class MessageResponse : Message +{ + /// + /// ONLY FOR DESERIALIZATION + /// + private MessageResponse() + : base(MessageType.RESPONSE) + { + RequestType = string.Empty; + } + + /// + /// Response when there was an error - no contents + /// + public static MessageResponse Failed( + string requestType, + int requestId, + int requesterId, + string errorMessage + ) + { + return new MessageResponse + { + RequestType = requestType, + RequestId = requestId, + RequesterId = requesterId, + Success = false, + ErrorMessage = errorMessage + }; + } + + /// + /// Response when successful + /// + public static MessageResponse Succeeded( + string requestType, + int requestId, + int requesterId, + object? contents + ) + { + return new MessageResponse + { + RequestType = requestType, + RequestId = requestId, + RequesterId = requesterId, + Success = true, + Contents = contents + }; + } + + public string RequestType { get; set; } + + public bool Success { get; set; } + + public string? ErrorMessage { get; set; } + + public int RequestId { get; set; } + + public int RequesterId { get; set; } + + public object? Contents { get; set; } + + public override string ToString() + { + return $"Response: {RequestType} from {SenderId} to {RequesterId} ({(Success ? "Successful" : "Failed")})"; + } +} diff --git a/c-sharp/Messages/MessageType.cs b/c-sharp/Messages/MessageType.cs new file mode 100644 index 0000000000..39b42d741e --- /dev/null +++ b/c-sharp/Messages/MessageType.cs @@ -0,0 +1,14 @@ +namespace Paranext.DataProvider.Messages; + +/// +/// This should represent all possible message types +/// +public static class MessageType +{ + public const string UNKNOWN = "UNKNOWN"; + public const string INIT_CLIENT = "init-client"; + public const string CLIENT_CONNECT = "client-connect"; + public const string REQUEST = "request"; + public const string RESPONSE = "response"; + public const string EVENT = "event"; +} diff --git a/c-sharp/Messages/NetworkObjectType.cs b/c-sharp/Messages/NetworkObjectType.cs new file mode 100644 index 0000000000..6848fb9cfb --- /dev/null +++ b/c-sharp/Messages/NetworkObjectType.cs @@ -0,0 +1,9 @@ +namespace Paranext.DataProvider.Messages; + +public static class NetworkObjectType +{ + public const string DATA_PROVIDER = "dataProvider"; + public const string OBJECT = "object"; + public const string PROJECT_DATA_PROVIDER_FACTORY = "pdpFactory"; + public const string PROJECT_DATA_PROVIDER = "pdp"; +} diff --git a/c-sharp/NetworkObjects/DataProvider.cs b/c-sharp/NetworkObjects/DataProvider.cs new file mode 100644 index 0000000000..60c6d6f9cd --- /dev/null +++ b/c-sharp/NetworkObjects/DataProvider.cs @@ -0,0 +1,194 @@ +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; +using System.Collections.Concurrent; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace Paranext.DataProvider.NetworkObjects; + +internal abstract class DataProvider : NetworkObject +{ + // This is an internal class because nothing else should be instantiating it directly + private class MessageEventDataUpdated : MessageEventGeneric + { + // A parameterless constructor is required for serialization to work + // ReSharper disable once UnusedMember.Local + public MessageEventDataUpdated() + : base(Messages.EventType.UNKNOWN, default!) { } + + public MessageEventDataUpdated(string eventType, object dataScope) + : base(eventType, dataScope) { } + } + + private readonly string _eventType; + private readonly ConcurrentDictionary _updateEventsByScope = + new(); + + protected DataProvider( + string name, + PapiClient papiClient, + string dataProviderType = NetworkObjectType.DATA_PROVIDER + ) + : base(papiClient) + { + // "-data" is the suffix used by PAPI for data provider names + DataProviderName = name + "-data"; + + DataProviderType = dataProviderType; + + // "onDidUpdate" is the event name used by PAPI for data providers to notify consumers of updates + _eventType = $"{DataProviderName}:onDidUpdate"; + } + + /// + /// Name/ID of the data provider as registered on the network + /// + public string DataProviderName { get; } + + /// + /// Data provider type to be shared on the network + /// + public string DataProviderType { get; } + + /// + /// Register this data provider on the network so that other services can use it + /// + public async Task RegisterDataProvider() + { + await RegisterNetworkObject( + DataProviderName, + GetDataProviderCreatedEvent(), + FunctionHandler + ); + await StartDataProvider(); + } + + // An array of strings serialized as JSON will be sent here. + // The first item in the array is the name of the function to call. + // All remaining items are arguments to pass to the function. + // Data providers must provide "get" and "set" functions. + private ResponseToRequest FunctionHandler(JsonElement request) + { + string functionName; + JsonArray jsonArray; + try + { + jsonArray = request.Deserialize()!.AsArray(); + if (jsonArray.Count == 0) + return ResponseToRequest.Failed( + $"No function name provided when calling data provider {DataProviderName}" + ); + functionName = (string)jsonArray[0]!; + jsonArray.RemoveAt(0); + } + catch (Exception e) + { + Console.Error.WriteLine(e.ToString()); + return ResponseToRequest.Failed("Invalid function call data"); + } + + return HandleRequest(functionName, jsonArray); + } + + /// + /// Create an event that tells the network details about the data provider that is being created + /// + protected virtual MessageEvent GetDataProviderCreatedEvent() + { + var functionNames = GetFunctionNames(); + functionNames.Sort(); + return new MessageEventObjectCreated( + DataProviderName, + DataProviderType, + functionNames.ToArray() + ); + } + + /// + /// Notify all processes on the network that this data provider has new data. + /// + /// This method transforms the data scope in the same way that `data-provider`service.ts`'s + /// `mapUpdateInstructionsToUpdateEvent` does + /// + /// Indicator of what data changed in the provider. Can be '*' for all + /// updates, a `string` to update one data type, or a `List<string>` of data types to update. + /// If dataScope is null, nothing happens. + protected void SendDataUpdateEvent(object? dataScope) + { + if (dataScope == null) + return; + + // The final computed data scope to send out in the update event. Based on dataScope + object dataScopeResult; + + if ((dataScope is string s) && !string.IsNullOrWhiteSpace(s)) + { + // If we are returning "*", just pass it as a string. Otherwise we have to provide a list of strings. + // Presumably this will change as part of https://github.com/paranext/paranext-core/issues/443 + dataScopeResult = (s == "*") ? s : new List { s }; + } + else if (dataScope is List dataScopeList) + { + if (dataScopeList.Count > 0) + dataScopeResult = dataScope; + // Empty list means no data type updates + else + { + Console.WriteLine("Did not send data update event. dataScope is an empty list"); + return; + } + } + else + { + Console.WriteLine( + "Did not send data update event. dataScope is not a string or list of strings" + ); + return; + } + + // a string representation of the data scope result to use when finding an existing message + // for the event + string dataScopeKey; + switch (dataScopeResult) + { + case string sR: + dataScopeKey = sR; + break; + case List dataScopeListR: + dataScopeKey = string.Join(',', dataScopeListR); + break; + default: + Console.WriteLine( + $"dataScopeResult {dataScopeResult} was not string or list of strings. Unable to send data update event" + ); + return; + } + + var dataUpdateEventMessage = _updateEventsByScope.GetOrAdd( + dataScopeKey, + (scope, result) => new MessageEventDataUpdated(_eventType, result), + dataScopeResult + ); + PapiClient.SendEvent(dataUpdateEventMessage); + } + + /// + /// Provide the list of functions that can be called on this data provider + /// + /// Array of strings containing all the functions that are callable on this data provider + protected abstract List GetFunctionNames(); + + /// + /// Once a data provider has started, it should send out update events whenever its data changes. + /// + protected abstract Task StartDataProvider(); + + /// + /// Handle a request from a service using this data provider + /// + /// This would typically be "getXYZ" or "setXYZ", where "XYZ" is a type of data handled by this provider + /// Optional arguments provided by the requester for the function indicated + /// ResponseToRequest value that either contains a response for the function or an error message + protected abstract ResponseToRequest HandleRequest(string functionName, JsonArray args); +} diff --git a/c-sharp/NetworkObjects/NetworkObject.cs b/c-sharp/NetworkObjects/NetworkObject.cs new file mode 100644 index 0000000000..f8c9a490b9 --- /dev/null +++ b/c-sharp/NetworkObjects/NetworkObject.cs @@ -0,0 +1,55 @@ +using System.Text.Json; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; + +namespace Paranext.DataProvider.NetworkObjects; + +internal abstract class NetworkObject +{ + private MessageEvent? _registrationEvent = null; + + protected NetworkObject(PapiClient papiClient) + { + PapiClient = papiClient; + } + + protected PapiClient PapiClient { get; } + + /// + /// Notify PAPI services we have a new network object they can use + /// + /// Services access this network object using this name + /// Event for notifying the network that the object was registered + /// Function that will handle calls from services to this network object + /// Throws if the network object could not be registered properly + protected async Task RegisterNetworkObject( + string networkObjectName, + MessageEvent registrationEvent, + Func requestHandler + ) + { + if (_registrationEvent != null) + throw new Exception($"{networkObjectName} has already been registered on the network"); + + // PAPI requires network objects to expose "get" and "function" requests + var getReqType = $"object:{networkObjectName}.get"; + var functionReqType = $"object:{networkObjectName}.function"; + + if (!await PapiClient.RegisterRequestHandler(getReqType, HandleGet)) + throw new Exception($"Could not register GET for {networkObjectName}"); + + if (!await PapiClient.RegisterRequestHandler(functionReqType, requestHandler)) + throw new Exception($"Could not register FUNCTION for {networkObjectName}"); + + // Notify the network that we registered this network object + _registrationEvent = registrationEvent; + PapiClient.SendEvent(registrationEvent); + } + + private ResponseToRequest HandleGet(JsonElement getRequest) + { + // Respond that this network object exists along with its registration details + return ResponseToRequest.Succeeded(_registrationEvent); + } +} diff --git a/c-sharp/NetworkObjects/TimeDataProvider.cs b/c-sharp/NetworkObjects/TimeDataProvider.cs new file mode 100644 index 0000000000..007493f5f2 --- /dev/null +++ b/c-sharp/NetworkObjects/TimeDataProvider.cs @@ -0,0 +1,47 @@ +using System.Text.Json.Nodes; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using SIL.Extensions; + +namespace Paranext.DataProvider.NetworkObjects; + +/// +/// This is a sample data provider for demonstration purposes +/// +internal class TimeDataProvider : DataProvider +{ + // Fire an event that says our "time data" updated once per second + private readonly System.Timers.Timer _timer = new(TimeSpan.FromSeconds(1)); + + private readonly List _supportedFunctions = new() { "getTime" }; + + public TimeDataProvider(PapiClient papiClient) + : base("current-time", papiClient) { } + + protected override Task StartDataProvider() + { + _timer.Elapsed += (_, _) => + { + SendDataUpdateEvent("*"); + }; + _timer.AutoReset = true; + _timer.Enabled = true; + return Task.CompletedTask; + } + + protected override List GetFunctionNames() + { + return _supportedFunctions; + } + + protected override ResponseToRequest HandleRequest(string functionName, JsonArray args) + { + return functionName switch + { + "getTime" + => ResponseToRequest.Succeeded(DateTime.Now.ToISO8601TimeFormatWithUTCString()), + "setTime" => ResponseToRequest.Failed("Cannot set the time"), + _ => ResponseToRequest.Failed($"Unexpected function: {functionName}") + }; + } +} diff --git a/c-sharp/ParanextDataProvider.csproj b/c-sharp/ParanextDataProvider.csproj new file mode 100644 index 0000000000..97d6cb2a51 --- /dev/null +++ b/c-sharp/ParanextDataProvider.csproj @@ -0,0 +1,73 @@ + + + + Exe + net8.0 + enable + enable + Paranext.DataProvider + true + SIL International + SIL International + sillsdev + Paratext Data Provider for Platform.Bible + Paratext Data Provider for Platform.Bible + 0.1.0 + $([System.DateTime]::UtcNow.ToString(`yyyyMMddHHmmss`)) + icon.ico + icon.png + https://github.com/paranext + https://github.com/paranext/paranext-core + MIT + + + + + + + + + + + + + + + + + + Always + + + + + + + PreserveNewest + + + + + + Always + + + + + + + True + \ + + + + diff --git a/c-sharp/ParanextDataProvider.sln b/c-sharp/ParanextDataProvider.sln new file mode 100644 index 0000000000..fa49fce6a4 --- /dev/null +++ b/c-sharp/ParanextDataProvider.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ParanextDataProvider", "ParanextDataProvider.csproj", "{EE68E4D7-DBB2-40F7-96B5-CF5C70BAEA40}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c-sharp-tests", "..\c-sharp-tests\c-sharp-tests.csproj", "{47318C23-C03D-4FE1-9900-9C78CA7E4894}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EE68E4D7-DBB2-40F7-96B5-CF5C70BAEA40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE68E4D7-DBB2-40F7-96B5-CF5C70BAEA40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE68E4D7-DBB2-40F7-96B5-CF5C70BAEA40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE68E4D7-DBB2-40F7-96B5-CF5C70BAEA40}.Release|Any CPU.Build.0 = Release|Any CPU + {47318C23-C03D-4FE1-9900-9C78CA7E4894}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47318C23-C03D-4FE1-9900-9C78CA7E4894}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47318C23-C03D-4FE1-9900-9C78CA7E4894}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47318C23-C03D-4FE1-9900-9C78CA7E4894}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CD6D816A-CEBB-4E98-B233-211EE526F0FE} + EndGlobalSection +EndGlobal diff --git a/c-sharp/ParanextDataProvider.sln.DotSettings b/c-sharp/ParanextDataProvider.sln.DotSettings new file mode 100644 index 0000000000..4c16aefdef --- /dev/null +++ b/c-sharp/ParanextDataProvider.sln.DotSettings @@ -0,0 +1,19 @@ + + ID + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True diff --git a/c-sharp/ParatextUtils/AlertStub.cs b/c-sharp/ParatextUtils/AlertStub.cs new file mode 100644 index 0000000000..b15ace93c5 --- /dev/null +++ b/c-sharp/ParatextUtils/AlertStub.cs @@ -0,0 +1,42 @@ +using System.ComponentModel; +using PtxUtils; + +namespace Paranext.DataProvider.ParatextUtils +{ + internal sealed class AlertStub : Alert + { + protected override AlertResult ShowInternal( + IComponent? owner, + string text, + string caption, + AlertButtons alertButtons, + AlertLevel alertLevel, + AlertDefaultButton defaultButton, + bool showInTaskbar + ) + { + if (text.Contains("unable to find a language definition file for English")) + return AlertResult.Positive; + + Console.WriteLine("Unexpected dialog box:\n" + text); + return AlertResult.Negative; + } + + protected override void ShowLaterInternal( + string text, + string caption, + AlertLevel alertLevel + ) + { + ShowInternal( + null, + text, + caption, + AlertButtons.Ok, + alertLevel, + AlertDefaultButton.Button1, + false + ); + } + } +} diff --git a/c-sharp/ParatextUtils/ParatextGlobals.cs b/c-sharp/ParatextUtils/ParatextGlobals.cs new file mode 100644 index 0000000000..030e25f01b --- /dev/null +++ b/c-sharp/ParatextUtils/ParatextGlobals.cs @@ -0,0 +1,49 @@ +using System.Text; +using Paratext.Data; +using PtxUtils; + +namespace Paranext.DataProvider.ParatextUtils +{ + internal static class ParatextGlobals + { + private static readonly object s_locker = new(); + private static bool s_initialized = false; + + public static void Initialize(string dataFolderPath) + { + if (s_initialized) + { + // Update the paratext data path to make sure we're using the latest path passed in + // For now, this is only used in tests + SetParatextDataPath(dataFolderPath); + return; + } + + lock (s_locker) + { + if (s_initialized) + return; + + // Required for the Paratext.Data.Encodings.StringEncoders static constructor + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + // Required for non-Windows platforms + Alert.Implementation = new AlertStub(); + RegistryU.Implementation = new RegistryStub(); + + // Required for ICU.NET + ICUDllLocator.Initialize(false, false); + + // Now tell Paratext.Data to use the specified folder + SetParatextDataPath(dataFolderPath); + } + } + + private static void SetParatextDataPath(string dataFolderPath) + { + dataFolderPath = Path.GetFullPath(dataFolderPath); // Make sure path is rooted + ParatextData.Initialize(dataFolderPath, false); + s_initialized = true; + } + } +} diff --git a/c-sharp/ParatextUtils/RegistryStub.cs b/c-sharp/ParatextUtils/RegistryStub.cs new file mode 100644 index 0000000000..634206bf78 --- /dev/null +++ b/c-sharp/ParatextUtils/RegistryStub.cs @@ -0,0 +1,66 @@ +using PtxUtils; + +namespace Paranext.DataProvider.ParatextUtils +{ + internal sealed class RegistryStub : RegistryU + { + protected override string? GetStringInternal(string registryPath) + { + return null; + } + + protected override string? GetStringInternal(string basekey, string path, string key) + { + return null; + } + + protected override object? GetValInternal(string registryPath) + { + return null; + } + + protected override object? GetValInternal(string baseKey, string subKey, string key) + { + return null; + } + + protected override object? GetValIfExistsInternal(string registryPath) + { + return null; + } + + protected override bool HasWritePermissionInternal(string registryPath) + { + return false; + } + + protected override bool KeyExistsInternal(string registryPath) + { + return false; + } + + // TODO: If this is needed, it might cause problems since it references RegistryKey + //protected override bool KeyExistsInternal(RegistryKey key, string subKey) + //{ + // return false; + //} + + protected override bool ValueExistsInternal(string registryPath) + { + return false; + } + + protected override void SetValInternal(string registryPath, object theValue) { } + + protected override void SetValInternal( + string baseKey, + string subKey, + string key, + object theValue + ) { } + + protected override void DelKeyInternal(string registryPath) { } + + protected override void DelKeyInternal(string baseKey, string subKey) { } + } +} diff --git a/c-sharp/Program.cs b/c-sharp/Program.cs new file mode 100644 index 0000000000..aa02829d9f --- /dev/null +++ b/c-sharp/Program.cs @@ -0,0 +1,82 @@ +using System.Text.Json; +using Paranext.DataProvider.Checks; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.NetworkObjects; +using Paranext.DataProvider.Projects; +using Paranext.DataProvider.Services; +using Paratext.Data; +using PtxUtils; + +namespace Paranext.DataProvider; + +public static class Program +{ + public static async Task Main() + { + Console.WriteLine("Paranext data provider starting up"); + Thread.CurrentThread.Name = "Main"; + + using PapiClient papi = new(); + try + { + if (!await papi.ConnectAsync()) + { + Console.WriteLine("Paranext data provider could not connect"); + return; + } + + var paratextProjects = new LocalParatextProjects(); + + // Adapted from Paratext's `Program.StaticInitialization` + ParatextDataSettings.Initialize(new PersistedParatextDataSettings(papi)); + PtxUtilsDataSettings.Initialize(new PersistedPtxUtilsSettings(papi)); + + var paratextFactory = new ParatextProjectDataProviderFactory(papi, paratextProjects); + var checkRunner = new CheckRunner(papi); + await Task.WhenAll(paratextFactory.Initialize(), checkRunner.RegisterDataProvider()); + + // Things that only run in our "noisy dev mode" go here + var noisyDevModeEnvVar = Environment.GetEnvironmentVariable("DEV_NOISY"); + var isNoisyDevMode = noisyDevModeEnvVar != null && noisyDevModeEnvVar == "true"; + if (isNoisyDevMode) + { + var tdp = new TimeDataProvider(papi); + await Task.WhenAll( + tdp.RegisterDataProvider(), + //TODO: Delete this once we stop including test objects in the builds + papi.RegisterRequestHandler("command:test.addOne", RequestAddOne) + ); + } + + Console.WriteLine( + $"Paranext data provider ready! {(isNoisyDevMode ? " (noisy dev mode)" : "")}" + ); + await papi.MessageHandlingCompleteTask; + Console.WriteLine("Paranext data provider message handling complete"); + } + finally + { + await papi.DisconnectAsync(); + } + + Console.WriteLine("Paranext data provider shutting down"); + } + + #region Request handlers + + private static ResponseToRequest RequestAddOne(JsonElement element) + { + if (element.GetArrayLength() != 1) + return ResponseToRequest.Failed("Unexpected data in request: " + element); + + int intVal = ErrorUtils.IgnoreErrors( + "Trying to parse data from server", + () => element[0].GetInt32() + ); + + return ResponseToRequest.Succeeded(intVal + 1); + } + + #endregion +} diff --git a/c-sharp/Projects/IProjectStreamManager.cs b/c-sharp/Projects/IProjectStreamManager.cs new file mode 100644 index 0000000000..6ded33e56d --- /dev/null +++ b/c-sharp/Projects/IProjectStreamManager.cs @@ -0,0 +1,34 @@ +namespace Paranext.DataProvider.Projects; + +/// +/// Used to work with data for a project in terms of streams +/// Implementations could provide streams for storage locations like files in a directory, entries in a ZIP file, blobs in cloud storage, etc. +/// +internal interface IProjectStreamManager +{ + /// + /// Prepare to get any data streams requested + /// + void Initialize(); + + /// + /// Get a list of all data streams current part of the project + /// + /// + string[] GetExistingDataStreamNames(); + + /// + /// Get a read/write data stream for project data providers to use + /// + /// Name associated with a data stream + /// Determines whether to create the stream if it doesn't already exist + /// Unique stream that is associated with the given stream name + Stream? GetDataStream(string streamName, bool createIfNotExists = false); + + /// + /// Delete a data stream with the given name + /// + /// Name of the stream to delete + /// true if the stream was deleted, false otherwise + bool DeleteDataStream(string streamName); +} diff --git a/c-sharp/Projects/LocalParatextProjects.cs b/c-sharp/Projects/LocalParatextProjects.cs new file mode 100644 index 0000000000..d429989be9 --- /dev/null +++ b/c-sharp/Projects/LocalParatextProjects.cs @@ -0,0 +1,279 @@ +using System.Xml; +using Paranext.DataProvider.ParatextUtils; +using Paratext.Data; +using Paratext.Data.Users; + +namespace Paranext.DataProvider.Projects; + +/// +/// Direct access methods to the file system for Paratext project directories +/// +internal class LocalParatextProjects +{ + #region Constructors, consts, and fields + + // Inside each project's "home" directory, these are the subdirectories and files + protected const string PROJECT_SETTINGS_FILE = "Settings.xml"; + + /// + /// Directory inside a project's root directory where Platform.Bible's extension data is stored + /// + public const string EXTENSION_DATA_SUBDIRECTORY = "shared/platform.bible/extensions"; + + private bool _isInitialized = false; + private readonly object _initializationLock = new(); + + private readonly List _requiredProjectRootFiles = ["usfm.sty", "Attribution.md"]; + + private static readonly List s_paratextProjectInterfaces = [ + ProjectInterfaces.BASE, + ProjectInterfaces.USFM_BOOK, + ProjectInterfaces.USFM_CHAPTER, + ProjectInterfaces.USFM_VERSE, + ProjectInterfaces.USX_BOOK, + ProjectInterfaces.USX_CHAPTER, + ProjectInterfaces.USX_VERSE, + ProjectInterfaces.PLAIN_TEXT_VERSE]; + + public LocalParatextProjects() + { + ProjectRootFolder = Path.Join( + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + ".platform.bible", + "projects", + "Paratext 9 Projects" + ); + + Paratext9ProjectsFolder = Path.Join(Path.GetPathRoot(Environment.CurrentDirectory), "My Paratext 9 Projects"); + } + + #endregion + + #region Public properties and methods + + public virtual void Initialize(bool shouldIncludePT9ProjectsOnWindows) + { + if (_isInitialized) + return; + + lock (_initializationLock) + { + if (_isInitialized) + return; + + // Make sure the necessary directory and files exist for the project root folder + SetUpProjectRootFolder(); + + // Set up the ScrTextCollection and read the projects in that folder + ParatextGlobals.Initialize(ProjectRootFolder); + + Console.WriteLine( + $"Projects loaded from {ProjectRootFolder}: {string.Join(",", GetScrTexts().Select(scrText => scrText.Name))}"); + + // Read the projects in any locations other than project root folder + IEnumerable otherProjectDetails = + LoadOtherProjectDetails(shouldIncludePT9ProjectsOnWindows); + + if (otherProjectDetails.Any()) + Console.WriteLine( + $"Projects found in other locations: {string.Join(",", otherProjectDetails.Select(projectDetails => projectDetails.Name))}"); + + foreach (ProjectDetails projectDetails in otherProjectDetails) + { + try + { + AddProjectToScrTextCollection(projectDetails); + Console.WriteLine($"Loaded project details: {projectDetails}"); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to load project for {projectDetails}: {ex}"); + } + } + + // If there are no projects available anywhere, throw in the sample WEB one + if (!GetScrTexts().Any()) + { + Console.WriteLine("No projects found. Setting up sample WEB project"); + SetUpSampleProject(); + + ScrTextCollection.RefreshScrTexts(); + } + + _isInitialized = true; + } + } + + public IEnumerable GetAllProjectDetails() + { + return GetScrTexts().Select(scrText => scrText.GetProjectDetails()); + } + + public ProjectDetails GetProjectDetails(string projectId) + { + return GetParatextProject(projectId).GetProjectDetails(); + } + + public static ScrText GetParatextProject(string projectId) + { + return ScrTextCollection.GetById(HexId.FromStr(projectId)); + } + + public static List GetParatextProjectInterfaces() + { + return [..s_paratextProjectInterfaces]; + } + + #endregion + + #region Protected properties and methods + + protected virtual string ProjectRootFolder { get; } + protected virtual string Paratext9ProjectsFolder { get; } + + protected static void CreateDirectory(string dir) + { + if (Directory.Exists(dir)) + return; + + if (OperatingSystem.IsWindows()) + Directory.CreateDirectory(dir); + else + Directory.CreateDirectory( + dir, + UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute + ); + } + + #endregion + + #region Private properties and methods + + private static IEnumerable GetScrTexts() { + return ScrTextCollection.ScrTexts(IncludeProjects.ScriptureOnly); + } + + private static void AddProjectToScrTextCollection(ProjectDetails projectDetails) + { + var projectPath = projectDetails.HomeDirectory; + + var projectName = new ProjectName + { + ShortName = projectDetails.Name, + ProjectPath = projectPath + }; + ScrTextCollection.Add(new ScrText(projectName, RegistrationInfo.DefaultUser)); + } + + /// + /// Return projects that are available on disk on the local machine + /// + /// Enumeration of (ProjectMetadata, project directory) tuples for all projects + private IEnumerable LoadOtherProjectDetails(bool shouldIncludePT9ProjectsOnWindows) + { + // Get project info for projects outside the normal project root folder + List nonPT9ProjectRootFolders = []; + if (OperatingSystem.IsWindows() && shouldIncludePT9ProjectsOnWindows && Directory.Exists(Paratext9ProjectsFolder)) nonPT9ProjectRootFolders.Add(Paratext9ProjectsFolder); + + foreach (var rootFolder in nonPT9ProjectRootFolders) + { + foreach (var dir in Directory.EnumerateDirectories(rootFolder)) + { + // There are a lot of folders with underscores in the name that we should ignore in + // My Paratext 9 Projects + if (rootFolder == Paratext9ProjectsFolder && Path.GetFileNameWithoutExtension(dir).StartsWith('_')) continue; + + ProjectDetails? projectDetails; + string errorMessage; + try + { + projectDetails = LoadProjectDetails(dir, out errorMessage); + } + catch (Exception ex) + { + Console.WriteLine($"Error while getting project details from {dir}: {ex}"); + continue; + } + + if (projectDetails == null) + Console.WriteLine(errorMessage); + else + yield return projectDetails; + } + } + } + + private static ProjectDetails? LoadProjectDetails( + string projectHomeDir, + out string errorMessage + ) + { + string settingsFilePath = Path.Combine(projectHomeDir, PROJECT_SETTINGS_FILE); + if (!File.Exists(settingsFilePath)) + { + errorMessage = $"Ignoring project without Settings.xml file: {projectHomeDir}"; + return null; + } + + var settings = new XmlDocument(); + settings.Load(settingsFilePath); + + // ScrText always prioritizes the folder name over the Name setting as the "name" even when + // accessing scrText.Settings.Name. So we're copying Paratext's functionality here and using + // the folder name instead of Settings.Name. + // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrText.cs#L258 + // Removing extension twice because file may be in form name.id.ext to match Paratext + // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrTextCollection.cs#L1661 + var shortName = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(projectHomeDir)); + + var idNode = settings.SelectSingleNode("/ScriptureText/Guid"); + if (idNode == null) + { + errorMessage = $"Could not find Guid in Settings.xml of {projectHomeDir}"; + return null; + } + var id = idNode.InnerText; + + var metadata = new ProjectMetadata(id, GetParatextProjectInterfaces()); + + var details = new ProjectDetails(shortName, metadata, projectHomeDir); + + errorMessage = ""; + return details; + } + + private void SetUpProjectRootFolder() + { + CreateDirectory(ProjectRootFolder); + + // Add usfm.sty and Attribution.md + foreach (string requiredFile in _requiredProjectRootFiles) + { + var dest = Path.Join(ProjectRootFolder, requiredFile); + if (!File.Exists(dest)) + File.Copy(Path.Join("assets", requiredFile), dest); + } + } + + private void SetUpSampleProject() + { + string projectName = "WEB"; + string projectFolderName = projectName; + string projectFolder = Path.Join(ProjectRootFolder, projectFolderName); + + CreateDirectory(Path.Join(projectFolder)); + + foreach (string filePath in Directory.GetFiles("assets/" + projectName, "*.*")) + { + File.Copy( + filePath, + filePath.Replace( + "assets/" + projectName, + Path.Join(projectFolder) + ) + ); + } + } + + #endregion +} diff --git a/c-sharp/Projects/ParatextProjectDataProvider.cs b/c-sharp/Projects/ParatextProjectDataProvider.cs new file mode 100644 index 0000000000..d604f85b50 --- /dev/null +++ b/c-sharp/Projects/ParatextProjectDataProvider.cs @@ -0,0 +1,640 @@ +using System.Text; +using System.Text.Json.Nodes; +using System.Xml; +using System.Xml.Linq; +using System.Xml.XPath; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.Services; +using Paratext.Data; +using Paratext.Data.ProjectSettingsAccess; +using SIL.Scripture; + +namespace Paranext.DataProvider.Projects; + +internal class ParatextProjectDataProvider : ProjectDataProvider +{ + #region Constants / Member variables + + // All data types related to Scripture editing. Changes to any portion of Scripture should send + // out updates to all these data types + public static readonly List AllScriptureDataTypes = + [ + ProjectDataType.BOOK_USFM, + ProjectDataType.CHAPTER_USFM, + ProjectDataType.VERSE_USFM, + ProjectDataType.BOOK_USX, + ProjectDataType.CHAPTER_USX, + ProjectDataType.VERSE_USX, + ProjectDataType.VERSE_PLAIN_TEXT, + ]; + + private readonly LocalParatextProjects _paratextProjects; + + #endregion + + #region Constructors + + public ParatextProjectDataProvider( + string name, + PapiClient papiClient, + ProjectDetails projectDetails, + LocalParatextProjects paratextProjects + ) + : base(name, papiClient, projectDetails) + { + _paratextProjects = paratextProjects; + Getters.Add("getBookUSFM", GetBookUsfm); + Setters.Add("setBookUSFM", SetBookUsfm); + Getters.Add("getChapterUSFM", GetChapterUsfm); + Setters.Add("setChapterUSFM", SetChapterUsfm); + Getters.Add("getVerseUSFM", GetVerseUsfm); + + Getters.Add("getBookUSX", GetBookUsx); + Setters.Add("setBookUSX", SetBookUsx); + Getters.Add("getChapterUSX", GetChapterUsx); + Setters.Add("setChapterUSX", SetChapterUsx); + Getters.Add("getVerseUSX", GetVerseUsx); + + Getters.Add("getVersePlainText", GetVersePlainText); + + Getters.Add("getSetting", GetProjectSetting); + Setters.Add("setSetting", SetProjectSetting); + + RegisterSettingsValidators(); + } + + #endregion + + #region Data Provider methods + + protected override Task StartDataProvider() + { + bool? shouldIncludePT9ProjectsOnWindows = false; + if (OperatingSystem.IsWindows()) + { + shouldIncludePT9ProjectsOnWindows = SettingsService.GetSettingValue(PapiClient, Settings.INCLUDE_MY_PARATEXT_9_PROJECTS); + if (!shouldIncludePT9ProjectsOnWindows.HasValue) + throw new InvalidDataException($"Setting {Settings.INCLUDE_MY_PARATEXT_9_PROJECTS} was null!"); + } + _paratextProjects.Initialize(shouldIncludePT9ProjectsOnWindows.Value); + return Task.CompletedTask; + } + + protected override ResponseToRequest HandleRequest(string functionName, JsonArray args) + { + try + { + return functionName switch + { + "resetSetting" => ResetProjectSetting(args[0]!.ToJsonString()), + _ => base.HandleRequest(functionName, args) + }; + } + catch (Exception e) + { + Console.Error.WriteLine(e.ToString()); + return ResponseToRequest.Failed(e.ToString()); + } + } + + #endregion + + #region Extension Data + + public override ResponseToRequest GetExtensionData(ProjectDataScope scope) + { + if (string.IsNullOrEmpty(scope.ExtensionName)) + return ResponseToRequest.Failed("Must provide an extension name"); + if (string.IsNullOrEmpty(scope.DataQualifier)) + return ResponseToRequest.Failed("Must provide a data qualifier"); + + Stream? dataStream; + try + { + dataStream = GetExtensionStream(scope, false); + } + catch (ArgumentException ex) + { + return ResponseToRequest.Failed(ex.Message); + } + + if (dataStream == null) + return ResponseToRequest.Failed("Extension data not found"); + + using (dataStream) + { + using TextReader textReader = new StreamReader(dataStream, Encoding.UTF8); + return ResponseToRequest.Succeeded(textReader.ReadToEnd()); + } + } + + public override ResponseToRequest SetExtensionData(ProjectDataScope scope, string data) + { + if (string.IsNullOrEmpty(scope.ExtensionName)) + return ResponseToRequest.Failed("Must provide an extension name"); + if (string.IsNullOrEmpty(scope.DataQualifier)) + return ResponseToRequest.Failed("Must provide a data qualifier"); + + Stream? dataStream; + try + { + dataStream = GetExtensionStream(scope, true); + } + catch (ArgumentException ex) + { + return ResponseToRequest.Failed(ex.Message); + } + + if (dataStream == null) + return ResponseToRequest.Failed("Unable to create extension data"); + + ScrText scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + try + { + RunWithinLock( + WriteScope.EntireProject(scrText), + writeLock => + { + if (!writeLock.Active) + throw new InvalidOperationException("Write lock is not active"); + dataStream.SetLength(0); + using TextWriter textWriter = new StreamWriter(dataStream, Encoding.UTF8); + textWriter.Write(data); + textWriter.Flush(); + } + ); + // The value of returned string is case-sensitive and cannot change unless data provider subscriptions change + return ResponseToRequest.Succeeded("ExtensionData"); + } + catch (Exception e) + { + return ResponseToRequest.Failed(e.ToString()); + } + } + + private Stream? GetExtensionStream(ProjectDataScope scope, bool createIfNotExists) + { + ProjectDetails projectDetails = _paratextProjects.GetProjectDetails(scope.ProjectID!); + + IProjectStreamManager extensionStreamManager = CreateStreamManager(projectDetails); + return extensionStreamManager.GetDataStream( + $"{LocalParatextProjects.EXTENSION_DATA_SUBDIRECTORY}/{scope.ExtensionName}/{scope.DataQualifier}", + createIfNotExists + ); + } + + protected virtual IProjectStreamManager CreateStreamManager(ProjectDetails projectDetails) + { + return new RawDirectoryProjectStreamManager(projectDetails); + } + + #endregion + + #region Settings + + public static string VisibilitySettingName => Setting.Visibility.ToString(); + private void RegisterSettingsValidators() + { + ProjectSettingsService.RegisterValidator(PapiClient, VisibilitySettingName, + VisibilityValidator); + + (bool result, string? error) VisibilityValidator(( + string newValueJson, + string currentValueJson, + string allChangesJson) data) + { + try + { + var value = data.newValueJson.DeserializeFromJson(); + var result = true; + string? error = null; + if (value == null) + { + result = false; + error = $"New {VisibilitySettingName} value cannot be null."; + } + else if (!Enum.TryParse(value, out _)) + { + result = false; + error = $"New {VisibilitySettingName} value is not valid."; + } + return (result, error); + } + catch (Exception ex) + { + return (false, ex.Message); + } + } + } + + public ResponseToRequest GetProjectSetting(string jsonKey) + { + var settingName = jsonKey.DeserializeFromJson() + ?? throw new InvalidDataException($"No project setting provided: {jsonKey}"); + var paratextSettingName = + ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName(settingName) ?? + settingName; + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + + // ScrText always prioritizes the folder name over the Name setting as the "name" even when + // accessing scrText.Settings.Name. So we're copying Paratext's functionality here and using + // the folder name instead of Settings.Name. + // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ProjectSettingsAccess/ProjectSettings.cs#L1438 + if (paratextSettingName == ProjectSettingsNames.PT_NAME) + return ResponseToRequest.Succeeded(scrText.Name); + + if (scrText.Settings.ParametersDictionary.TryGetValue(paratextSettingName, out string? settingValue)) { + // Paratext project setting value found, so return the value with the appropriate type + if (ProjectSettingsNames.IsParatextSettingABoolean(paratextSettingName)) + { + return settingValue switch + { + "T" => ResponseToRequest.Succeeded(true), + "F" => ResponseToRequest.Succeeded(false), + _ => ResponseToRequest.Failed($"Failed to convert Paratext setting {settingName} to boolean. Value was not T or F"), + }; + } + return ResponseToRequest.Succeeded(settingValue); + } + + // Setting not found, so get the default value + string? defaultValue = ProjectSettingsService.GetDefault( + PapiClient, + settingName + ); + if (defaultValue == null) + return ResponseToRequest.Failed($"Default value for {settingName} was null"); + + return ResponseToRequest.Succeeded(defaultValue); + } + + public ResponseToRequest SetProjectSetting(string jsonKey, string value) + { + var settingName = jsonKey.DeserializeFromJson() + ?? throw new InvalidDataException($"No project setting provided: {jsonKey}"); + + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + + // If there is no Paratext setting for the name given, we'll create one lower down + var currentValueResponse = GetProjectSetting(jsonKey); + + // Make sure the value we're planning to set is valid + var currentValueJson = currentValueResponse.Success + ? currentValueResponse.Contents.SerializeToJson() + : ""; + if (!ProjectSettingsService.IsValid( + PapiClient, + value, + currentValueJson, + settingName, + "")) + return ResponseToRequest.Failed($"Validation failed for {settingName}"); + + // Figure out which setting name to use + var paratextSettingName = ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName( + settingName) ?? settingName; + + // Now actually write the setting + string? errorMessage = null; + + // ScrText always prioritizes the folder name over the Name setting as the "name" even when + // accessing scrText.Settings.Name. So we're copying Paratext's functionality here and using + // the folder name instead of Settings.Name. + // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrText.cs#L259 + if (paratextSettingName == ProjectSettingsNames.PT_NAME) + { + // Lock the whole project because this is literally moving the whole folder (chances + // this will actually succeed are very slim as the project must only have Settings.xml + // and the ldml file for this not to instantly throw) + // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrText.cs#L1793 + RunWithinLock( + WriteScope.EntireProject(scrText), + _ => { + try + { + scrText.Name = value; + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + }); + } + else + { + RunWithinLock( + WriteScope.EntireProject(scrText), + _ => { + try + { + scrText.Settings.SetSetting(paratextSettingName, value); + // We are notifying when we release our lock, so don't automatically + // notify in `Save` + scrText.Settings.Save(false); + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + }); + } + + return (errorMessage != null) + ? ResponseToRequest.Failed(errorMessage) + : ResponseToRequest.Succeeded(ProjectDataType.SETTING); + } + + // Typically for "reset" we would want to erase the setting and then call "getDefault" if a + // setting is not present when "get" is called. Since we're using PT settings as the backing + // store here, though, we want to keep all properties filled in inside of Settings.xml files + public ResponseToRequest ResetProjectSetting(string jsonKey) + { + string settingName = jsonKey.DeserializeFromJson() + ?? throw new InvalidDataException($"No setting name provided: {jsonKey}"); + string? defaultValue = ProjectSettingsService.GetDefault( + PapiClient, + settingName + ); + if (defaultValue == null) + return ResponseToRequest.Failed($"Default value for {settingName} was null"); + var retVal = SetProjectSetting(jsonKey, defaultValue); + SendDataUpdateEvent(retVal.Contents); + return retVal; + } + + #endregion + + #region Scripture-related methods + + /// + /// Send an event on the PAPI announcing that all the Scripture data has changed. This is used + /// for reloading all the Scripture, settings, etc. after a project has been S/Red. + /// + public void SendFullProjectUpdateEvent() + { + SendDataUpdateEvent("*"); + } + + #endregion + + #region USFM + + public ResponseToRequest GetBookUsfm(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, false, true)); + } + + public ResponseToRequest GetChapterUsfm(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, true, true)); + } + + public ResponseToRequest GetVerseUsfm(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.Parser.GetVerseUsfmText(verseRef)); + } + + public ResponseToRequest SetBookUsfm(string jsonString, string data) + { + var verseRef = jsonString.DeserializeFromJson(); + verseRef.ChapterNum = 0; + try + { + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + RunWithinLock( + WriteScope.EntireProject(scrText), + _ => + { + BookSet localBooksPresentSet = scrText.Settings.LocalBooksPresentSet; + if (!localBooksPresentSet.IsSelected(verseRef.BookNum) && !scrText.Creatable(verseRef.BookNum)) + throw new InvalidOperationException($"{verseRef.Book} cannot be created"); + if (!scrText.Writable(verseRef.BookNum, 0)) + throw new InvalidOperationException($"{verseRef.Book} is not writable"); + if (!scrText.Settings.Editable) + throw new InvalidOperationException($"{verseRef.Book} is not editable"); + byte[] rawData = scrText.Settings.Encoder.Convert(data, out string errorMessage); + if (!string.IsNullOrEmpty(errorMessage)) + throw new InvalidOperationException(errorMessage); + string bookFilePath = scrText.Settings.BookFileName(verseRef.BookNum, true); + File.WriteAllBytes(bookFilePath, rawData); + scrText.Reload(); + } + ); + } + catch (Exception e) + { + return ResponseToRequest.Failed(e.ToString()); + } + + // The value of returned strings are case-sensitive and cannot change unless data provider subscriptions change + return ResponseToRequest.Succeeded(AllScriptureDataTypes); + } + + public ResponseToRequest SetChapterUsfm(string jsonString, string data) + { + var verseRef = jsonString.DeserializeFromJson(); + try + { + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + RunWithinLock( + WriteScope.EntireProject(scrText), + writeLock => + { + scrText.PutText( + verseRef.BookNum, + verseRef.ChapterNum, + false, + data, + writeLock + ); + } + ); + } + catch (Exception e) when (e is ArgumentException or ProjectNotFoundException) + { + return ResponseToRequest.Failed($"Project with ID '{ProjectDetails.Metadata.Id}' was not found"); + } + + // The value of returned strings are case-sensitive and cannot change unless data provider subscriptions change + return ResponseToRequest.Succeeded(AllScriptureDataTypes); + } + + #endregion + + #region USX + + public ResponseToRequest GetBookUsx(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, false)); + } + + public ResponseToRequest GetChapterUsx(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, true)); + } + + public ResponseToRequest GetVerseUsx(string jsonString) + { + return GetFromScrText(jsonString, ExtractVerseUsx); + } + + public ResponseToRequest SetBookUsx(string jsonString, string data) + { + var verseRef = jsonString.DeserializeFromJson(); + try + { + // Don't need to take a write lock in this function because SetBookUsfm will do it + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + string usfm = ConvertUsxToUsfm(scrText, verseRef, data); + return SetBookUsfm(jsonString, usfm); + } + catch (Exception e) + { + return ResponseToRequest.Failed(e.ToString()); + } + } + + public ResponseToRequest SetChapterUsx(string jsonString, string data) + { + var verseRef = jsonString.DeserializeFromJson(); + string? failedMessage = null; + try + { + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + RunWithinLock( + WriteScope.EntireProject(scrText), + writeLock => + { + var usfm = ConvertUsxToUsfm(scrText, verseRef, data); + scrText.PutText(verseRef.BookNum, verseRef.ChapterNum, true, usfm, writeLock); + }); + } + catch (Exception e) when (e is ArgumentException or ProjectNotFoundException) + { + failedMessage = $"Project with ID '{ProjectDetails.Metadata.Id}' was not found"; + } + + return failedMessage != null + ? ResponseToRequest.Failed(failedMessage) + : ResponseToRequest.Succeeded(AllScriptureDataTypes); + } + + #endregion + + #region Plain Text + + public ResponseToRequest GetVersePlainText(string jsonString) + { + return GetFromScrText(jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetVerseText(verseRef)); + } + + #endregion + + #region Private helper methods + + private ResponseToRequest GetFromScrText(string verseRefJson, Func getTextFromScrText) + { + var verseRef = verseRefJson.DeserializeFromJson(); + try + { + var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); + return ResponseToRequest.Succeeded(getTextFromScrText(scrText, verseRef)); + } + catch (Exception e) when (e is ArgumentException or ProjectNotFoundException) + { + return ResponseToRequest.Failed($"Project with ID '{ProjectDetails.Metadata.Id}' was not found"); + } + } + + private static string ConvertUsfmToUsx(ScrText scrText, VerseRef verseRef, bool chapterOnly) + { + var scrStylesheet = scrText.ScrStylesheet(verseRef.BookNum); + string usfmData = scrText.GetText(verseRef, chapterOnly, true) ?? string.Empty; + XmlDocument xmlDoc = UsfmToUsx.ConvertToXmlDocument(scrStylesheet, usfmData, false); + return xmlDoc.OuterXml; + } + + private static string ConvertUsxToUsfm(ScrText scrText, VerseRef verseRef, string usxData) + { + XDocument doc; + using (TextReader reader = new StringReader(usxData)) + doc = XDocument.Load(reader, LoadOptions.PreserveWhitespace); + + if (doc.Root?.Name != "usx") + throw new InvalidDataException($"Invalid USX: {usxData}"); + + UsxFragmenter.FindFragments( + scrText.ScrStylesheet(verseRef.BookNum), + doc.CreateNavigator(), + XPathExpression.Compile("*[false()]"), + out string usfm + ); + + return UsfmToken.NormalizeUsfm(scrText, verseRef.BookNum, usfm); + } + + // This does an imperfect job at extracting a verse's USX because the USX standard itself may + // split the text so that portions are in a child or parent node while others are just in text + // following the verse node. It's probably worth revisiting. + private static string ExtractVerseUsx(ScrText scrText, VerseRef vRef) + { + // Here is an XPath expression that represents a different approach that was abandoned + // $"//chapter[@number=\"{verseRef.ChapterNum}\"]/following::verse[@number=\"{verseRef.VerseNum}\"][1]/following::node()[preceding::chapter[1]/@number=\"{verseRef.ChapterNum}\"][preceding-sibling::verse[1]/@number=\"{verseRef.VerseNum}\"][not(self::verse)]"; + // It's more likely that a successful approach would require walking the XmlDocument DOM + + var scrStylesheet = scrText.ScrStylesheet(vRef.BookNum); + string usfmData = scrText.GetText(vRef, true, true) ?? string.Empty; + XmlDocument usxData = UsfmToUsx.ConvertToXmlDocument(scrStylesheet, usfmData, false); + var chapterNode = usxData.SelectSingleNode(VerseXPath(vRef.ChapterNum, 1)); + if (chapterNode == null) + return string.Empty; + var verseNode = usxData.SelectSingleNode(VerseXPath(vRef.ChapterNum, vRef.VerseNum)); + if (verseNode == null) + return string.Empty; + var nextVerseNode = + usxData.SelectSingleNode(VerseXPath(vRef.ChapterNum, vRef.VerseNum + 1)) + ?? usxData.SelectSingleNode(VerseXPath(vRef.ChapterNum + 1, 1)); + string allXmlData = usxData.OuterXml; + int chapterIndex = + allXmlData.IndexOf(chapterNode.OuterXml, StringComparison.InvariantCulture); + int verseIndex = allXmlData.IndexOf(verseNode.OuterXml, chapterIndex, + StringComparison.InvariantCulture); + int nextVerseIndex = nextVerseNode == null + ? allXmlData.Length + : allXmlData.IndexOf(nextVerseNode.OuterXml, chapterIndex, + StringComparison.InvariantCulture); + + // Wrap the verse text in a usx element so it is a whole valid usx document + return $"{allXmlData.Substring(verseIndex, nextVerseIndex - verseIndex)}"; + } + + private static string VerseXPath(int chapterNum, int verseNum) + { + return $"//chapter[@number=\"{chapterNum}\"]/following::verse[@number=\"{verseNum}\"][preceding::chapter[1]/@number=\"{chapterNum}\"]"; + } + + private static void RunWithinLock(WriteScope writeScope, Action action) + { + var myLock = + WriteLockManager.Default.ObtainLock(writeScope) + ?? throw new InvalidOperationException("Unable to obtain write lock"); + try + { + action.Invoke(myLock); + } + finally + { + myLock.ReleaseAndNotify(); + } + } + + #endregion +} diff --git a/c-sharp/Projects/ParatextProjectDataProviderFactory.cs b/c-sharp/Projects/ParatextProjectDataProviderFactory.cs new file mode 100644 index 0000000000..44a1f409a9 --- /dev/null +++ b/c-sharp/Projects/ParatextProjectDataProviderFactory.cs @@ -0,0 +1,110 @@ +using System.Collections.Concurrent; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.Services; + +namespace Paranext.DataProvider.Projects; + +internal class ParatextProjectDataProviderFactory : ProjectDataProviderFactory +{ + internal const string PDPF_NAME = "Paratext"; + private readonly LocalParatextProjects _paratextProjects; + private readonly ConcurrentDictionary _pdpMap = new(); + private readonly object _creationLock = new(); + private readonly Random _random = new((int)DateTime.Now.Ticks); + + public ParatextProjectDataProviderFactory( + PapiClient papiClient, + LocalParatextProjects paratextProjects + ) + : base(LocalParatextProjects.GetParatextProjectInterfaces(), PDPF_NAME, papiClient) + { + _paratextProjects = paratextProjects; + } + + protected override Task StartFactory() + { + bool? shouldIncludePT9ProjectsOnWindows = false; + if (OperatingSystem.IsWindows()) + { + shouldIncludePT9ProjectsOnWindows = SettingsService.GetSettingValue( + PapiClient, + Settings.INCLUDE_MY_PARATEXT_9_PROJECTS + ); + if (!shouldIncludePT9ProjectsOnWindows.HasValue) + throw new Exception($"Setting {Settings.INCLUDE_MY_PARATEXT_9_PROJECTS} was null!"); + } + _paratextProjects.Initialize(shouldIncludePT9ProjectsOnWindows.Value); + return Task.CompletedTask; + } + + protected override ResponseToRequest GetAvailableProjects() + { + var projectMetadata = _paratextProjects + .GetAllProjectDetails() + .Select(pd => pd.Metadata) + .ToList(); + return ResponseToRequest.Succeeded(projectMetadata); + } + + protected override ResponseToRequest GetProjectDataProviderID(string projectID) + { + projectID = projectID.ToUpperInvariant(); + + // If we already have a PDP for this project, just return it + if (_pdpMap.TryGetValue(projectID, out var existingPdp)) + return ResponseToRequest.Succeeded(existingPdp.DataProviderName); + + // Prevent multiple threads from trying to create PDPs at the same time + // This could probably be relaxed to be scoped per project ID, but this is more conservative + lock (_creationLock) + { + // If the PDP was created while we were locked, use it + if (_pdpMap.TryGetValue(projectID, out var existingPdpInLock)) + return ResponseToRequest.Succeeded(existingPdpInLock.DataProviderName); + + ProjectDetails details; + try + { + details = _paratextProjects.GetProjectDetails(projectID); + } + catch (KeyNotFoundException) + { + return ResponseToRequest.Failed("Unknown project ID: " + projectID); + } + + // Create a random 30 character string containing letters A-Z + var name = new string( + Enumerable.Range(0, 30).Select(_ => (char)_random.Next(65, 90)).ToArray() + ); + + // Create and store the PDP in the map for future lookups + var newPdp = new ParatextProjectDataProvider( + name, + PapiClient, + details, + _paratextProjects + ); + if (!_pdpMap.TryAdd(projectID, newPdp)) + return ResponseToRequest.Failed("Internal error adding project data provider"); + + // Once the PDP has been registered, return the name of it so callers can get it + newPdp.RegisterDataProvider().Wait(); + return ResponseToRequest.Succeeded(newPdp.DataProviderName); + } + } + + /// + /// Get an existing PDP if it exists for a project id + /// + /// + /// + public ParatextProjectDataProvider? GetExistingProjectDataProvider(string projectID) + { + projectID = projectID.ToUpperInvariant(); + + if (_pdpMap.TryGetValue(projectID, out var existingPdp)) + return existingPdp; + return null; + } +} diff --git a/c-sharp/Projects/ProjectDataProvider.cs b/c-sharp/Projects/ProjectDataProvider.cs new file mode 100644 index 0000000000..754d4ad79e --- /dev/null +++ b/c-sharp/Projects/ProjectDataProvider.cs @@ -0,0 +1,126 @@ +using System.Text.Json.Nodes; +using Paranext.DataProvider.JsonUtils; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; + +namespace Paranext.DataProvider.Projects; + +/// +/// Manages reading/writing to a project +/// Subclasses are expected to define and add get/set methods to the Getters/Setters +/// ProjectDataProviders are meant to be created/owned by ProjectDataProviderFactory instances +/// +internal abstract class ProjectDataProvider : NetworkObjects.DataProvider +{ + protected ProjectDataProvider(string name, PapiClient papiClient, ProjectDetails projectDetails) + : base(name + "-pdp", papiClient, NetworkObjectType.PROJECT_DATA_PROVIDER) + { + ProjectDetails = projectDetails; + Getters.Add("getExtensionData", GetExtensionData); + Setters.Add("setExtensionData", SetExtensionData); + } + + protected ProjectDetails ProjectDetails { get; } + + /// + /// Upon success, getters should return a ResponseToRequest that contains the requested data. + /// + protected Dictionary> Getters { get; } = new(); + + /// + /// Upon success, setters should return a ResponseToRequest that contains data scope used to notify the network about data changes. + /// If there is only a single scope to the data (i.e., it is not partitioned), return a ResponseToRequest containing "*". + /// + protected Dictionary> Setters { get; } = new(); + + private ProjectDataScope ExtractDataScope(string jsonString) + { + ProjectDataScope? dataScope = + jsonString.DeserializeFromJson() + ?? throw new InvalidDataException("No data scope provided"); + dataScope.ProjectID = ProjectDetails.Metadata.Id; + dataScope.ProjectName = ProjectDetails.Name; + return dataScope; + } + + protected override List GetFunctionNames() + { + var functionNames = new List(); + functionNames.AddRange(Getters.Keys); + functionNames.AddRange(Setters.Keys); + return functionNames; + } + + protected override MessageEvent GetDataProviderCreatedEvent() + { + var functionNames = GetFunctionNames(); + functionNames.Sort(); + return new MessageEventProjectDataProviderCreated( + DataProviderName, + functionNames.ToArray(), + ProjectDetails.Metadata.Id, + ProjectDetails.Metadata.ProjectInterfaces + ); + } + + protected override ResponseToRequest HandleRequest(string functionName, JsonArray args) + { + // TODO: Handle wrong number of parameters (e.g. none) more gracefully + + try + { + if (functionName.StartsWith("get")) + return Getters[functionName](args[0]!.ToJsonString()); + + if (functionName.StartsWith("set")) + { + var setReturn = Setters[functionName](args[0]!.ToJsonString(), args[1]!.ToString()); + SendDataUpdateEvent(setReturn.Contents); + return setReturn; + } + + return ResponseToRequest.Failed($"Unknown function: {functionName}"); + } + catch (Exception e) + { + Console.Error.WriteLine(e.ToString()); + return ResponseToRequest.Failed(e.ToString()); + } + } + + private ResponseToRequest GetExtensionData(string jsonScope) + { + try + { + return GetExtensionData(ExtractDataScope(jsonScope)); + } + catch (Exception ex) + { + return ResponseToRequest.Failed(ex.ToString()); + } + } + + private ResponseToRequest SetExtensionData(string jsonScope, string data) + { + try + { + var retVal = SetExtensionData(ExtractDataScope(jsonScope), data); + return retVal; + } + catch (Exception ex) + { + return ResponseToRequest.Failed(ex.ToString()); + } + } + + /// + /// Get an extension's data in a project identified by . + /// + public abstract ResponseToRequest GetExtensionData(ProjectDataScope scope); + + /// + /// Set an extension's data in a project identified by . + /// + public abstract ResponseToRequest SetExtensionData(ProjectDataScope scope, string data); +} diff --git a/c-sharp/Projects/ProjectDataProviderFactory.cs b/c-sharp/Projects/ProjectDataProviderFactory.cs new file mode 100644 index 0000000000..6ffb84122d --- /dev/null +++ b/c-sharp/Projects/ProjectDataProviderFactory.cs @@ -0,0 +1,93 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; +using Paranext.DataProvider.NetworkObjects; + +namespace Paranext.DataProvider.Projects; + +/// +/// Provides a ProjectDataProvider object for a specified set of projectInterfaces +/// +internal abstract class ProjectDataProviderFactory : NetworkObject +{ + private readonly List _projectInterfaces; + private readonly string _pdpfName; + + protected ProjectDataProviderFactory(List projectInterfaces, string pdpfName, PapiClient papiClient) + : base(papiClient) + { + _projectInterfaces = projectInterfaces; + _pdpfName = pdpfName; + } + + public async Task Initialize() + { + await StartFactory(); + var name = $"platform.{_pdpfName}-pdpf"; + await RegisterNetworkObject( + name, + new MessageEventProjectDataProviderFactoryCreated( + name, + ["getAvailableProjects", "getProjectDataProviderId"], + _projectInterfaces + ), + FunctionHandler + ); + } + + // An array of strings serialized as JSON will be sent here. + // The first item in the array is the name of the function to call. + // All remaining items are arguments to pass to the function. + // Data providers must provide "get" and "set" functions. + private ResponseToRequest FunctionHandler(JsonElement request) + { + string functionName; + JsonArray jsonArray; + try + { + jsonArray = request.Deserialize()!.AsArray(); + if (jsonArray.Count == 0) + return ResponseToRequest.Failed( + $"No function name provided when calling {_pdpfName} PDP Factory" + ); + functionName = (string)jsonArray[0]!; + jsonArray.RemoveAt(0); + } + catch (Exception e) + { + Console.Error.WriteLine(e.ToString()); + return ResponseToRequest.Failed("Invalid function call data"); + } + + try + { + return functionName switch + { + "getAvailableProjects" => GetAvailableProjects(), + "getProjectDataProviderId" => GetProjectDataProviderID((string)jsonArray[0]!), + _ => ResponseToRequest.Failed($"Unknown function call: {functionName}"), + }; + } + catch (Exception e) + { + return ResponseToRequest.Failed(e.ToString()); + } + } + + /// + /// Perform all work needed to be able to respond to PDP requests + /// + protected abstract Task StartFactory(); + + /// + /// Return project metadata for all projects available through this PDP factory + /// + protected abstract ResponseToRequest GetAvailableProjects(); + + /// + /// Return the name of the PDP network object that corresponds to the given project ID + /// + protected abstract ResponseToRequest GetProjectDataProviderID(string projectID); +} diff --git a/c-sharp/Projects/ProjectDataScope.cs b/c-sharp/Projects/ProjectDataScope.cs new file mode 100644 index 0000000000..311e117381 --- /dev/null +++ b/c-sharp/Projects/ProjectDataScope.cs @@ -0,0 +1,32 @@ +namespace Paranext.DataProvider.Projects; + +/// +/// Represents the scope of a get/set call for project data +/// +internal class ProjectDataScope +{ + /// + /// Project ID + /// + public string? ProjectID { get; set; } + + /// + /// Project short name + /// + public string? ProjectName { get; set; } + + /// + /// This is the name of an extension that should remain constant whenever the platform is restarted + /// + public string? ExtensionName { get; set; } + + /// + /// Examples: Book, Chapter, Verse, Notes, etc. + /// + public string? DataType { get; set; } + + /// + /// Specifies what specific data is in scope given the value of DataType + /// + public string? DataQualifier { get; set; } +} diff --git a/c-sharp/Projects/ProjectDataType.cs b/c-sharp/Projects/ProjectDataType.cs new file mode 100644 index 0000000000..48899386d3 --- /dev/null +++ b/c-sharp/Projects/ProjectDataType.cs @@ -0,0 +1,13 @@ +namespace Paranext.DataProvider.Projects; + +public sealed class ProjectDataType +{ + public const string BOOK_USFM = "BookUSFM"; + public const string BOOK_USX = "BookUSX"; + public const string CHAPTER_USFM = "ChapterUSFM"; + public const string CHAPTER_USX = "ChapterUSX"; + public const string SETTING = "Setting"; + public const string VERSE_USFM = "VerseUSFM"; + public const string VERSE_USX = "VerseUSX"; + public const string VERSE_PLAIN_TEXT = "VersePlainText"; +} diff --git a/c-sharp/Projects/ProjectDetails.cs b/c-sharp/Projects/ProjectDetails.cs new file mode 100644 index 0000000000..377b663017 --- /dev/null +++ b/c-sharp/Projects/ProjectDetails.cs @@ -0,0 +1,28 @@ +namespace Paranext.DataProvider.Projects; + +/// +/// All information about a project we want to store and pass around internally +/// +internal class ProjectDetails +{ + public ProjectDetails(string name, ProjectMetadata metadata, string homeDirectory) + { + Name = name; + Metadata = metadata; + HomeDirectory = homeDirectory; + } + + public string Name { get; } + + public ProjectMetadata Metadata { get; } + + /// + /// Directory where everything we know about a project is stored + /// + public string HomeDirectory { get; } + + public override string ToString() + { + return $"[{HomeDirectory}] = {Metadata}"; + } +} diff --git a/c-sharp/Projects/ProjectInterfaces.cs b/c-sharp/Projects/ProjectInterfaces.cs new file mode 100644 index 0000000000..983c9ac122 --- /dev/null +++ b/c-sharp/Projects/ProjectInterfaces.cs @@ -0,0 +1,20 @@ +namespace Paranext.DataProvider.Projects; + +/// +/// Standardized set of methods exposed by a Project Data Provider for a project +/// +public static class ProjectInterfaces +{ + /// + /// The name of the `projectInterface` representing the essential methods every Base Project Data + /// Provider must implement + /// + public const string BASE = "platform.base"; + public const string USFM_BOOK = "platformScripture.USFM_Book"; + public const string USFM_CHAPTER = "platformScripture.USFM_Chapter"; + public const string USFM_VERSE = "platformScripture.USFM_Verse"; + public const string USX_BOOK = "platformScripture.USX_Book"; + public const string USX_CHAPTER = "platformScripture.USX_Chapter"; + public const string USX_VERSE = "platformScripture.USX_Verse"; + public const string PLAIN_TEXT_VERSE = "platformScripture.PlainText_Verse"; +} diff --git a/c-sharp/Projects/ProjectMetadata.cs b/c-sharp/Projects/ProjectMetadata.cs new file mode 100644 index 0000000000..815a8974f3 --- /dev/null +++ b/c-sharp/Projects/ProjectMetadata.cs @@ -0,0 +1,26 @@ +namespace Paranext.DataProvider.Projects; + +/// +/// Low-level information describing a project that Platform.Bible directly manages and uses to load +/// project data +/// +/// Returned from Project Data Provider Factories in order to inform others about what projects they +/// support in what form. +/// +public class ProjectMetadata(string id, List projectInterfaces) +{ + /// + /// ID of the project (must be unique and case-insensitive) + /// + public string Id { get; } = id.ToUpperInvariant(); + + /// + /// Indicates what sort of project this is which implies its data shape (e.g., what data streams should be available) + /// + public List ProjectInterfaces { get; } = projectInterfaces; + + public override string ToString() + { + return $"[({Id}): {string.Join(',', ProjectInterfaces)}]"; + } +} diff --git a/c-sharp/Projects/RawDirectoryProjectStreamManager.cs b/c-sharp/Projects/RawDirectoryProjectStreamManager.cs new file mode 100644 index 0000000000..9c56a4728d --- /dev/null +++ b/c-sharp/Projects/RawDirectoryProjectStreamManager.cs @@ -0,0 +1,116 @@ +using System.Text; + +namespace Paranext.DataProvider.Projects; + +/// +/// Converts between files in the file system and named streams +/// +internal class RawDirectoryProjectStreamManager : IProjectStreamManager +{ + private const UnixFileMode UNIX_FILE_MODE = + UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute; + + private readonly ProjectDetails _projectDetails; + + // This is the directory that is intended for reading/writing project data + private readonly string _writableRootDir; + + public RawDirectoryProjectStreamManager(ProjectDetails projectDetails) + { + _projectDetails = projectDetails; + _writableRootDir = projectDetails.HomeDirectory; + } + + public void Initialize() // TODO: This doesn't seem to be used + { + if (!Directory.Exists(_projectDetails.HomeDirectory)) + throw new InvalidDataException( + $"Project contents missing for {_projectDetails.Name} ({_projectDetails.Metadata.Id})" + ); + } + + public string[] GetExistingDataStreamNames() // TODO: This doesn't seem to be used + { + var files = Directory.GetFiles( + _writableRootDir, + "*", + new EnumerationOptions + { + MatchType = MatchType.Simple, + RecurseSubdirectories = true, + ReturnSpecialDirectories = false + } + ); + + DirectoryInfo projectDirectory = new(_writableRootDir); + List retVal = new(); + foreach (var file in files) + { + FileInfo fileInfo = new(file); + StringBuilder streamName = new(fileInfo.Name); + DirectoryInfo? walkingUp = fileInfo.Directory; + while (walkingUp != null && walkingUp.FullName != projectDirectory.FullName) + { + streamName.Insert(0, Path.DirectorySeparatorChar); + streamName.Insert(0, walkingUp.Name); + walkingUp = walkingUp.Parent; + } + retVal.Add(streamName.ToString()); + } + + return retVal.ToArray(); + } + + public Stream? GetDataStream(string streamName, bool createIfNotExists = false) + { + var fileName = GetFileNameFromStreamName(streamName); + if (!File.Exists(fileName) && !createIfNotExists) + return null; + + var dirName = Path.GetDirectoryName(fileName); + if (!Directory.Exists(dirName)) + { + if (createIfNotExists && dirName != null) + { + if (OperatingSystem.IsWindows()) + Directory.CreateDirectory(dirName); + else + Directory.CreateDirectory(dirName, UNIX_FILE_MODE); + } + else + return null; + } + + var fileMode = createIfNotExists ? FileMode.OpenOrCreate : FileMode.Open; + var retVal = File.Open(fileName, fileMode, FileAccess.ReadWrite); + return retVal; + } + + public bool DeleteDataStream(string streamName) // TODO: This doesn't seem to be used + { + var fileName = GetFileNameFromStreamName(streamName); + if (!File.Exists(fileName)) + return false; + + try + { + File.Delete(fileName); + return File.Exists(fileName); + } + catch (Exception e) + { + Console.Error.WriteLine(e); + return false; + } + } + + private string GetFileNameFromStreamName(string streamName) + { + if (string.IsNullOrEmpty(streamName) || streamName.Contains("..")) + throw new ArgumentException("Invalid stream name", nameof(streamName)); + + streamName = streamName.Replace('/', Path.DirectorySeparatorChar); + streamName = streamName.Replace('\\', Path.DirectorySeparatorChar); + return Path.Join(_writableRootDir, streamName); + } +} diff --git a/c-sharp/Projects/ScrTextExtensions.cs b/c-sharp/Projects/ScrTextExtensions.cs new file mode 100644 index 0000000000..c41a20b35f --- /dev/null +++ b/c-sharp/Projects/ScrTextExtensions.cs @@ -0,0 +1,18 @@ +using Paratext.Data; + +namespace Paranext.DataProvider.Projects; + +internal static class ScrTextExtensions +{ + internal static ProjectDetails GetProjectDetails(this ScrText scrText) + { + return new( + scrText.Name, + new( + scrText.Guid.ToString().ToUpperInvariant(), + LocalParatextProjects.GetParatextProjectInterfaces() + ), + scrText.Directory + ); + } +} diff --git a/c-sharp/README.md b/c-sharp/README.md new file mode 100644 index 0000000000..0c4eb9437e --- /dev/null +++ b/c-sharp/README.md @@ -0,0 +1,19 @@ +# Helpful Tips + +## Messages + +To add a new message type to C#: + +1. Create a new Enum\ value for it [here](/c-sharp/Messages/MessageType.cs). +2. Create a new class for it that derives from [Message](/c-sharp/Messages/Message.cs). +3. Add it to the TS code if not already there. [Here](/src/shared/data/NetworkConnectorTypes.ts) is a good place to look. +4. If C# needs to receive this type of message, create a [MessageHandler](/c-sharp/MessageHandlers/IMessageHandler.cs). Add that new MessageHandler to [the constructor of PapiClient](/c-sharp/MessageTransports/PapiClient.cs) + +## Events + +To add a new event type to C#: + +1. Create a new Enum\ value for it [here](/c-sharp/Messages/EventType.cs). +2. Create a new class for it that derives from [MessageEventGeneric](/c-sharp/Messages/MessageEventGeneric.cs). +3. Add it to the TS code if not already there. +4. If C# needs to handle this type of event, add code to call [RegisterEventHandler in PapiClient](/c-sharp/MessageTransports/PapiClient.cs). diff --git a/c-sharp/Services/LocalizationService.cs b/c-sharp/Services/LocalizationService.cs new file mode 100644 index 0000000000..488d2daf9c --- /dev/null +++ b/c-sharp/Services/LocalizationService.cs @@ -0,0 +1,70 @@ +using System.Diagnostics; +using System.Text.Json; +using Paranext.DataProvider.MessageTransports; + +namespace Paranext.DataProvider.Services; + +internal static class LocalizationService +{ + public const string SETTINGS_SERVICE_NAME = "platform.localizationDataServiceDataProvider"; + private const string SETTINGS_SERVICE_REQUEST = $"object:{SETTINGS_SERVICE_NAME}-data.function"; + + /// + /// Get a localized string value + /// + /// + /// localized string key `%something%` + /// Default value if the key comes back as the value or the request fails + /// if set to `true`, will throw errors instead of ignoring and returning default value. Defaults to `false` + /// + public static string GetLocalizedString(PapiClient papiClient, string key, string? defaultValue = null, bool shouldThrowErrors = false) + { + string value = defaultValue ?? key; + TaskCompletionSource taskSource = new(); + using var getSettingTask = taskSource.Task; + + papiClient.SendRequest( + SETTINGS_SERVICE_REQUEST, + new object[] { "getLocalizedString", new LocalizationSelector(key) }, + (bool success, object? returnValue) => + { + try + { + if (success) + { + var result = (JsonElement?)returnValue; + if (result.HasValue) + { + var resultString = result.Value.Deserialize(); + if (resultString != null && resultString != key) + value = resultString; + } + } + + taskSource.TrySetResult(); + } + catch (Exception ex) + { + if (shouldThrowErrors) + taskSource.TrySetException(ex); + else { + Trace.TraceError(ex.Message); + taskSource.TrySetResult(); + } + } + } + ); + + using var cts = new CancellationTokenSource(); + getSettingTask.Wait(cts.Token); + return value; + } +} + +public class LocalizationSelector(string localizeKey) +{ + /// + /// ID of the project (must be unique and case-insensitive) + /// + public string LocalizeKey { get; } = localizeKey; +} diff --git a/c-sharp/Services/PersistedParatextDataSettings.cs b/c-sharp/Services/PersistedParatextDataSettings.cs new file mode 100644 index 0000000000..f64c71389d --- /dev/null +++ b/c-sharp/Services/PersistedParatextDataSettings.cs @@ -0,0 +1,22 @@ +using Paranext.DataProvider.MessageTransports; +using Paratext.Data; +using PtxUtils; + +namespace Paranext.DataProvider.Services; + +internal class PersistedParatextDataSettings(PapiClient papiClient) : IParatextDataSettings +{ + public SerializableStringDictionary LastRegistryDataCachedTimes { get; set; } = SettingsService.GetSettingObject( + papiClient, + Settings.PARATEXT_DATA_LAST_REGISTRY_DATA_CACHED_TIMES + ) ?? []; + + public void SafeSave() + { + SettingsService.SetSetting( + papiClient, + Settings.PARATEXT_DATA_LAST_REGISTRY_DATA_CACHED_TIMES, + LastRegistryDataCachedTimes + ); + } +} diff --git a/c-sharp/Services/PersistedPtxUtilsSettings.cs b/c-sharp/Services/PersistedPtxUtilsSettings.cs new file mode 100644 index 0000000000..63c21ba916 --- /dev/null +++ b/c-sharp/Services/PersistedPtxUtilsSettings.cs @@ -0,0 +1,29 @@ +using Paranext.DataProvider.MessageTransports; +using PtxUtils; + +namespace Paranext.DataProvider.Services; + +internal class PersistedPtxUtilsSettings(PapiClient papiClient) : IPtxUtilsSettings +{ + public SerializableStringDictionary MementoData { get; set;} = SettingsService.GetSettingObject( + papiClient, + Settings.PTX_UTILS_MEMENTO_DATA + ) ?? []; + + public bool UpgradeNeeded + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public bool EnableFormSnapping + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public void SafeSave() + { + SettingsService.SetSetting(papiClient, Settings.PTX_UTILS_MEMENTO_DATA, MementoData); + } +} diff --git a/c-sharp/Services/ProjectSettingsNames.cs b/c-sharp/Services/ProjectSettingsNames.cs new file mode 100644 index 0000000000..4fa972f982 --- /dev/null +++ b/c-sharp/Services/ProjectSettingsNames.cs @@ -0,0 +1,92 @@ +namespace Paranext.DataProvider.Services; + +public sealed class ProjectSettingsNames +{ + public const string PB_BOOKS_PRESENT = "platformScripture.booksPresent"; + public const string PT_BOOKS_PRESENT = "BooksPresent"; + + public const string PB_NAME = "platform.name"; + public const string PT_NAME = "Name"; + + public const string PB_FULL_NAME = "platform.fullName"; + public const string PT_FULL_NAME = "FullName"; + + public const string PB_LANGUAGE = "platform.language"; + public const string PT_LANGUAGE = "Language"; + + public const string PB_VERSIFICATION = "platformScripture.versification"; + public const string PT_VERSIFICATION = "Versification"; + + public const string PB_IS_EDITABLE = "platform.isEditable"; + public const string PT_IS_EDITABLE = "Editable"; + + public const string PB_VALID_CHARACTERS = "platformScripture.validCharacters"; + public const string PT_VALID_CHARACTERS = "ValidCharacters"; + + public const string PB_INVALID_CHARACTERS = "platformScripture.invalidCharacters"; + public const string PT_INVALID_CHARACTERS = "InvalidCharacters"; + + public const string PB_REPEATABLE_WORDS = "platformScripture.repeatableWords"; + public const string PT_REPEATABLE_WORDS = "RepeatableWords"; + + public const string PB_NONREPEATABLE_WORDS = "platformScripture.nonRepeatableWords"; + public const string PT_NONREPEATABLE_WORDS = "NonRepeatableWords"; + + /// + /// Paratext setting names that are either T or F and need to be converted to booleans + /// + private static readonly HashSet s_ptSettingBooleans = ["Editable", "MatchBasedOnStems", "AllowReadAccess", "AllowSharingWithSLDR", ]; + + // Make sure this dictionary gets updated whenever new settings are added + private static readonly Dictionary s_platformBibleToParatextSettingsNames = + new() + { + { PB_BOOKS_PRESENT, PT_BOOKS_PRESENT }, + { PB_FULL_NAME, PT_FULL_NAME }, + { PB_LANGUAGE, PT_LANGUAGE }, + { PB_NAME, PT_NAME }, + { PB_VERSIFICATION, PT_VERSIFICATION }, + { PB_IS_EDITABLE, PT_IS_EDITABLE }, + { PB_VALID_CHARACTERS, PT_VALID_CHARACTERS }, + { PB_INVALID_CHARACTERS, PT_INVALID_CHARACTERS }, + { PB_REPEATABLE_WORDS, PT_REPEATABLE_WORDS }, + { PB_NONREPEATABLE_WORDS, PT_NONREPEATABLE_WORDS }, + }; + + private static readonly Dictionary s_paratextToPlatformBibleSettingsNames = + s_platformBibleToParatextSettingsNames.ToDictionary((i) => i.Value, (i) => i.Key); + + /// + /// Convert project setting names from Platform.Bible terminology to Paratext terminology + /// + /// Setting name in Platform.Bible terminology + /// Setting name in Paratext terminology if a mapping exists + public static string? GetParatextSettingNameFromPlatformBibleSettingName(string pbSettingName) + { + return s_platformBibleToParatextSettingsNames.TryGetValue(pbSettingName, out string? retVal) + ? retVal + : null; + } + + /// + /// Convert project setting names from Paratext terminology to Platform.Bible terminology + /// + /// Setting name in Paratext terminology + /// Setting name in Platform.Bible terminology if a mapping exists + public static string? GetPlatformBibleSettingNameFromParatextSettingName(string ptSettingName) + { + return s_paratextToPlatformBibleSettingsNames.TryGetValue(ptSettingName, out string? retVal) + ? retVal + : null; + } + + /// + /// Determines whether a Paratext Setting is expected to be a boolean ("T" or "F" only) + /// + /// + /// + public static bool IsParatextSettingABoolean(string ptSettingName) + { + return s_ptSettingBooleans.Contains(ptSettingName); + } +} diff --git a/c-sharp/Services/ProjectSettingsService.cs b/c-sharp/Services/ProjectSettingsService.cs new file mode 100644 index 0000000000..9a5f0684bd --- /dev/null +++ b/c-sharp/Services/ProjectSettingsService.cs @@ -0,0 +1,177 @@ +using System.Text.Json; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.MessageTransports; + +namespace Paranext.DataProvider.Services +{ + internal static class ProjectSettingsService + { + private const string PROJECT_SETTINGS_SERVICE = "object:ProjectSettingsService.function"; + private const string PROJECT_SETTING_VALIDATOR = "extensionProjectSettingValidator:"; + + internal static string GetValidatorKey(string settingKey) => + PROJECT_SETTING_VALIDATOR + settingKey; + + /// + /// Calls registered project settings validators to determine whether or not a (Paratext) + /// project setting change is valid. + /// + /// The proxy to facilitate communication to the Paranext server + /// via the PAPI + /// The new value requested to set the project setting value to, + /// serialized as a JSON string + /// The current project setting value, serialized as a JSON + /// string + /// The (Paratext) project setting key being set (this will probably + /// always be different from the corresponding key known to Platform.Bible) + /// A JSON object containing the keys and values of + /// all the settings being changed as part of an atomic operation (i.e., a single batch of + /// changes) + /// true if change is valid, false otherwise + public static bool IsValid( + PapiClient papiClient, + string newValueJson, + string currentValueJson, + string key, + string allChangesJson + ) + { + bool requestSucceeded = false; + TaskCompletionSource taskSource = new(); + using var validationTask = taskSource.Task; + + papiClient.SendRequest( + PROJECT_SETTINGS_SERVICE, + new object[] { "isValid", key, newValueJson, currentValueJson, allChangesJson, }, + (bool success, object? returnValue) => + { + try + { + if (success) + { + var result = (JsonElement?)returnValue; + if (result.HasValue) + requestSucceeded = result.Value.GetBoolean(); + } + + taskSource.TrySetResult(); + } + catch (Exception ex) + { + requestSucceeded = false; + taskSource.TrySetException(ex); + } + } + ); + + using var cts = new CancellationTokenSource(); + validationTask.Wait(cts.Token); + return requestSucceeded; + } + + /// + /// Gets the default value for a project setting + /// + /// The proxy to facilitate communication to the Paranext server + /// via the PAPI + /// The (Paratext) project setting key for which to get the default value + /// (this will probably always be different from the corresponding key known to + /// Platform.Bible) + /// + /// Every Project Data Provider **must** run this function when it receives a + /// request to get a project setting if the project does not have a value for the project + /// setting requested. It should return the response from this function directly, either + /// the returned default value or throw. + public static string? GetDefault(PapiClient papiClient, string key) + { + string? defaultValue = null; + TaskCompletionSource taskSource = new(); + using var getDefaultTask = taskSource.Task; + + papiClient.SendRequest( + PROJECT_SETTINGS_SERVICE, + new object[] { "getDefault", key }, + (bool success, object? returnValue) => + { + try + { + if (success) + { + var result = (JsonElement?)returnValue; + if (result.HasValue) + defaultValue = result.Value.ToString(); + } + + taskSource.TrySetResult(); + } + catch (Exception ex) + { + taskSource.TrySetException(ex); + } + } + ); + + using var cts = new CancellationTokenSource(); + getDefaultTask.Wait(cts.Token); + return defaultValue; + } + + /// + /// Registers a function that validates whether a new setting value is allowed to be set. + /// + /// The proxy to facilitate communication to the Paranext server + /// via the PAPI + /// The id of the setting in Platform.Bible for which the validator is to + /// be registered + /// Function to call to validate the new setting value. See + /// for a complete + /// explanation of the input parameters to this function. + /// + /// true if the validator was successfully registered, false + /// otherwise + public static bool RegisterValidator( + PapiClient papiClient, + string key, + Func< + (string newValueJson, string currentValueJson, string allChangesJson), + (bool result, string? error) + > validatorCallback + ) + { + ResponseToRequest requestHandler(JsonElement jsonElement) + { + // Check if the JsonElement is an array + if ( + jsonElement.ValueKind != JsonValueKind.Array || jsonElement.GetArrayLength() < 3 + ) + { + return ResponseToRequest.Failed( + $"Validator for {key} expected a JSON array with 3 items: newValueJson" + + "currentValueJson, allChangesJson" + ); + } + + string newValueJson = jsonElement[0].GetString() ?? ""; + string currentValueJson = jsonElement[1].GetString() ?? ""; + string allChangesJson = jsonElement[2].GetString() ?? ""; + + var validationResponse = validatorCallback( + (newValueJson, currentValueJson, allChangesJson) + ); + return validationResponse.result + ? ResponseToRequest.Succeeded() + : ResponseToRequest.Failed( + validationResponse.error + ?? "Parameter validation failed for {key}. Error response provided no details." + ); + } + ; + + var t = papiClient.RegisterRequestHandler(GetValidatorKey(key), requestHandler); + + using var cts = new CancellationTokenSource(); + t.Wait(cts.Token); + return t.Result; + } + } +} diff --git a/c-sharp/Services/Settings.cs b/c-sharp/Services/Settings.cs new file mode 100644 index 0000000000..ce23658631 --- /dev/null +++ b/c-sharp/Services/Settings.cs @@ -0,0 +1,11 @@ +namespace Paranext.DataProvider.Services; + +public sealed class Settings +{ + public const string PARATEXT_DATA_LAST_REGISTRY_DATA_CACHED_TIMES = + "platform.paratextDataLastRegistryDataCachedTimes"; + public const string PTX_UTILS_MEMENTO_DATA = "platform.ptxUtilsMementoData"; + + public const string INCLUDE_MY_PARATEXT_9_PROJECTS = + "platformScripture.includeMyParatext9Projects"; +} diff --git a/c-sharp/Services/SettingsService.cs b/c-sharp/Services/SettingsService.cs new file mode 100644 index 0000000000..37544d4e11 --- /dev/null +++ b/c-sharp/Services/SettingsService.cs @@ -0,0 +1,107 @@ +using System.Text.Json; +using Paranext.DataProvider.MessageTransports; + +namespace Paranext.DataProvider.Services; + +internal static class SettingsService +{ + public const string SETTINGS_SERVICE_NAME = "platform.settingsServiceDataProvider"; + private const string SETTINGS_SERVICE_REQUEST = $"object:{SETTINGS_SERVICE_NAME}-data.function"; + + public static JsonElement? GetSettingRaw(PapiClient papiClient, string key) + { + JsonElement? value = null; + TaskCompletionSource taskSource = new(); + using var getSettingTask = taskSource.Task; + + papiClient.SendRequest( + SETTINGS_SERVICE_REQUEST, + new object[] { "get", key }, + (bool success, object? returnValue) => + { + try + { + if (success) + { + var result = (JsonElement?)returnValue; + if (result.HasValue) + value = result.Value; + } + + taskSource.TrySetResult(); + } + catch (Exception ex) + { + taskSource.TrySetException(ex); + } + } + ); + + using var cts = new CancellationTokenSource(); + getSettingTask.Wait(cts.Token); + return value; + } + + public static T? GetSettingObject(PapiClient papiClient, string key) + where T : class + { + return GetSettingRaw(papiClient, key)?.Deserialize(); + } + + public static T? GetSettingValue(PapiClient papiClient, string key) + where T : struct + { + return GetSettingRaw(papiClient, key)?.Deserialize(); + } + + public static bool SetSetting(PapiClient papiClient, string key, object? settingData) + { + TaskCompletionSource taskSource = new(); + using var getSettingTask = taskSource.Task; + + var didChangeData = false; + + papiClient.SendRequest( + SETTINGS_SERVICE_REQUEST, + new object?[] { "set", key, settingData }, + (bool success, object? returnValue) => + { + try + { + if (success) + { + var result = (JsonElement?)returnValue; + if (result.HasValue) + { + try + { + if (result.Value.Deserialize()) + didChangeData = true; + else + didChangeData = false; + } + catch (JsonException) + { + // If they sent a string data type name or an array of them, it will + // fail to deserialize. Interpret that as `didChangeData` true + // because pretty much anything but `false` means the data changed. + // See `DataProviderUpdateInstructions` for more info + didChangeData = true; + } + } + } + + taskSource.TrySetResult(); + } + catch (Exception ex) + { + taskSource.TrySetException(ex); + } + } + ); + + using var cts = new CancellationTokenSource(); + getSettingTask.Wait(cts.Token); + return didChangeData; + } +} diff --git a/c-sharp/assets/Attribution.md b/c-sharp/assets/Attribution.md new file mode 100644 index 0000000000..a13cabcaa3 --- /dev/null +++ b/c-sharp/assets/Attribution.md @@ -0,0 +1,4 @@ +# Attribution + +`usfm.sty` comes from https://github.com/ubsicap/usfm/tree/master/sty +All other files in `/WEB` come from https://ebible.org/ diff --git a/c-sharp/assets/WEB/01GENengWEBUS.SFM b/c-sharp/assets/WEB/01GENengWEBUS.SFM new file mode 100644 index 0000000000..2a734c687a --- /dev/null +++ b/c-sharp/assets/WEB/01GENengWEBUS.SFM @@ -0,0 +1,1584 @@ +\id GEN Syriac Peshitta +\c 1 +\v 1 ܒܪܫܝܬ ܒܪܐ ܐܠܗܐ. ܝܬ ܫܡܝܐ ܘܝܬ ܐܪܥܐ. +\v 2 ܐܪܥܐ ܗܘܬ ܬܘܗ ܘܒܘܗ. ܘܚܫܘܟܐ ܥܠ ܐ̈ܦܝ ܬܗܘܡܐ. ܘܪܘܚܗ ܕܐܠܗܐ ܡܪܚܦܐ ܥܠ ܐ̈ܦܝ ܡ̈ܝܐ. +\v 3 ܘܐܡ̣ܪ ܐܠܗܐ ܢܗܘܐ ܢܘܗܪܐ. ܘܗܘ̣ܐ ܢܘܗܪܐ. +\v 4 ܘܚ̣ܙܐ ܐܠܗܐ ܠܢܘܗܪܐ ܕܫܦܝܪ. ܘܦ̣ܪܫ ܐܠܗܐ ܒܝܬ ܢܘܗܪܐ ܠܚܫܘܟܐ. +\v 5 ܘܩ̣ܪܐ ܐܠܗܐ ܠܢܘܗܪܐ ܐܝܡܡܐ. ܘܠܚܫܘܟܐ ܩ̣ܪܐ ܠܠܝܐ. ܘܗܘ̣ܐ ܪܡܫܐ ܘܗܘܐ ܨܦܪܐ ܝܘܡܐ ܚܕ. +\v 6 ܘܐܡ̣ܪ ܐܠܗܐ ܢܗܘܐ ܐܪܩܝܥܐ ܒܡܨܥܬ ܡ̈ܝܐ. ܘܢܗܘܐ ܦܪܫ̇ ܒܝܬ ܡ̈ܝܐ ܠܡ̈ܝܐ. +\v 7 ܘܥܒ̣ܕ ܐܠܗܐ ܐܪܩܝܥܐ. ܘܦ̣ܪܫ ܒܝܬ ܡ̈ܝܐ ܕܠܬܚܬ ܡܢ ܐܪܩܝܥܐ. ܘܒܝܬ ܡ̈ܝܐ ܕܠܥܠ ܡܢ ܐܪܩܝܥܐ. ܘܗܘ̣ܐ ܗܟܢܐ. +\v 8 ܘܩ̣ܪܐ ܐܠܗܐ ܠܐܪܩܝܥܐ ܫܡܝܐ. ܘܗܘ̣ܐ ܪܡܫܐ ܘܗܘܐ ܨܦܪܐ ܝܘܡܐ ܕܬܪ̈ܝܢ. +\v 9 ܘܐܡ̣ܪ ܐܠܗܐ ܢܬܟܢܫܘܢ ܡ̈ܝܐ ܕܠܬܚܬ ܡܢ ܫܡܝܐ ܠܐܬܪܐ ܚܕ ܘܬܬܚܙܐ ܝܒܝܫܬܐ. ܘܗܘ̣ܐ ܗܟܢܐ. +\v 10 ܘܩ̣ܪܐ ܐܠܗܐ ܠܝܒܝܫܬܐ ܐܪܥܐ. ܘܠܟܢܫܐ ܕܡ̈ܝܐ ܩ̣ܪܐ ܝܡ̈ܡܐ. ܘܚ̣ܙܐ ܐܠܗܐ ܕܫܦܝܪ. +\v 11 ܘܐܡ̣ܪ ܐܠܗܐ ܬܦܩ ܐܪܥܐ ܬܕܐܐ ܥܣܒܐ ܕܡܙܕܪܥ ܙܪܥܐ ܠܓܢܣܗ. ܘܐܝܠܢܐ ܕܦܐܪ̈ܐ ܕܥܒ̇ܕ ܦܐܪ̈ܐ ܠܓܢܣܗ ܕܢܨܒܬܗ ܒܗ ܥܠ ܐܪܥܐ. ܘܗ̣ܘܐ ܗܟܢܐ. +\v 12 ܘܐܦ̣ܩܬ ܐܪܥܐ ܬܕܐܐ. ܥܣܒܐ ܕܡܙܕܪܥ ܙܪܥܐ ܠܓܢܣܗ. ܘܐܝܠܢܐ ܕܥܒ̇ܕ ܦܐܪ̈ܐ ܕܢܨܒܬܗ ܒܗ ܠܓܢܣܗ. ܘܚ̣ܙܐ ܐܠܗܐ ܕܫܦܝܪ. +\v 13 ܘܗܘ̣ܐ ܪܡܫܐ ܘܗܘ̣ܐ ܨܦܪܐ. ܝܘܡܐ ܕܬܠܬܐ. +\v 14 ܘܐܡ̣ܪ ܐܠܗܐ. ܢܗܘܘܢ ܢܗܝܪ̈ܐ ܒܐܪܩܝܥܐ ܕܫܡܝܐ. ܠܡܦܪܫ ܒܝܬ ܐܝܡܡܐ †ܠܠܠܝܐ†\f a \fr 1.14\fr* \fk ܠܠܝܐ\fk* \ft 7a1\ft*\f*. ܘܢܗܘܘܢ ܠܐܬܘ̈ܬܐ ܘܠܙܒ̈ܢܐ. ܘܠܝ̈ܘܡܬܐ ܘܠܫ̈ܢܝܐ. +\v 15 ܘܢܗܘܘܢ ܡܢܗܪ̈ܝܢ ܒܐܪܩܝܥܐ ܕܫܡܝܐ ܠܡܢܗܪܘ ܥܠ ܐܪܥܐ. ܘܗܘ̣ܐ ܗܟܢܐ. +\v 16 ܘܥܒ̣ܕ ܐܠܗܐ ܬܪ̈ܝܢ ܢܗܝܪ̈ܐ ܪ̈ܘܪܒܐ. ܢܗܝܪܐ ܪܒܐ ܠܫܘܠܛܢܐ ܕܐܝܡܡܐ. ܘܢܗܝܪܐ ܙܥܘܪܐ ܠܫܘܠܛܢܐ ܕܠܠܝܐ ܘܟܘܟ̈ܒܐ. +\v 17 ܘܝܗ̣ܒ ܐܢܘܢ ܐܠܗܐ ܒܐܪܩܝܥܐ ܕܫܡܝܐ. ܠܡܢܗܪܘ ܥܠ ܐܪܥܐ. +\v 18 ܘܠܡܫܠܛ ܒܐܝܡܡܐ ܘܒܠܠܝܐ. ܘܠܡܦܪܫ ܒܝܬ ܢܘܗܪܐ ܠܚܫܘܟܐ. ܘܚ̣ܙܐ ܐܠܗܐ ܕܫܦܝܪ. +\v 19 ܘܗܘ̣ܐ ܪܡܫܐ ܘܗܘ̣ܐ ܨܦܪܐ ܝܘܡܐ ܕܐܪ̈ܒܥܐ. +\v 20 ܘܐܡ̣ܪ ܐܠܗܐ. ܢܪܚܫܘܢ ܡ̈ܝܐ ܪܚܫܐ ܢܦܫܐ ܚܝܬܐ. ܘܦܪܚܬܐ ܬܦܪܚ ܥܠ ܐܪܥܐ ܥܠ ܐ̈ܦܝ ܐܪܩܝܥܐ ܕܫܡܝܐ. +\v 21 ܘܒܪ̣ܐ ܐܠܗܐ ܬܢܝ̈ܢܐ ܪ̈ܘܪܒܐ. ܘܟܠ ܢܦܫܐ ܚܝܬܐ ܕܪܚܫܐ ܕܐܪܚܫܘ ܡ̈ܝܐ ܠܓܢܣܗܘܢ. ܘܟܠ ܦܪܚܬܐ ܕܓܦܐ ܠܓܢܣܗ̇. ܘܚ̣ܙܐ ܐܠܗܐ ܕܫܦܝܪ. +\v 22 ܘܒ̇ܪܟ ܐܢܘܢ ܐܠܗܐ. ܘܐܡ̣ܪ ܠܗܘܢ ܦܪܘ ܘܣܓܘ ܘܡ̣ܠܘ ܡ̈ܝܐ ܕܒܝܡ̈ܡܐ. ܘܦܪܚܬܐ ܬܣܓܐ ܒܐܪܥܐ. +\v 23 ܘܗܘ̣ܐ ܪܡܫܐ ܘܗܘ̣ܐ ܨܦܪܐ. ܝܘܡܐ ܕܚܡܫܐ. +\v 24 ܘܐܡ̣ܪ ܐܠܗܐ. ܬܦܩ ܐܪܥܐ ܢܦܫܐ ܚܝܬܐ ܠܓܢܣܗ̇. ܒܥܝܪ̈ܐ ܘܪܚܫܐ ܘܚܝܘܬܐ ܕܐܪܥܐ ܠܓܢܣܗ̇. ܘܗܘ̣ܐ ܗܟܢܐ. +\v 25 ܘܥܒ̣ܕ ܐܠܗܐ ܚܝܘܬܐ ܕܐܪܥܐ ܠܓܢܣܗ̇. ܘܒܥܝܪܐ ܠܓܢܣܗ̇. ܘܟܠܗ ܪܚܫܐ ܕܐܪܥܐ ܠܓܢܣ̈ܘܗܝ. ܘܚ̣ܙܐ ܐܠܗܐ ܕܫܦܝܪ. +\v 26 ܘܐܡ̣ܪ ܐܠܗܐ ܢܥܒܕ ܐܢܫܐ ܒܨܠܡܢ ܐܝܟ ܕܡܘܬܢ. ܘܢܫܠܛܘܢ ܒܢ̈ܘܢܝ ܝܡܐ ܘܒܦܪܚܬܐ ܕܫܡܝܐ. ܘܒܒܥܝܪ̈ܐ\f b \fr 1.26\fr* \fk ܘܒܥܝܪ̈ܐ\fk* \ft U\ft*\f* ܘܒܟܠܗ̇ ܚܝܘܬܐ ܕܐܪܥܐ\f c \fr 1.26\fr* \fk ܐܪܥܐ\fk* \ft 8.5b1\ft*\f*. ܘܒܟܠܗ ܪܚܫܐ ܕܪܚܫ ܥܠ ܐܪܥܐ. +\v 27 ܘܒܪ̣ܐ ܐܠܗܐ ܠܐܕܡ ܒܨܠܡܗ. ܒܨܠܡ ܐܠܗܐ ܒܪܝܗܝ. ܕܟܪ ܘܢܩܒܐ ܒܪܐ ܐܢܘܢ. +\v 28 ܘܒ̇ܪܟ ܐܢܘܢ ܐܠܗܐ ܘܐܡ̣ܪ ܠܗܘܢ ܐܠܗܐ\f d \fr 1.28\fr* \fk ܐܠܗܐ\fk* \ft om. 7k4c, 8.5b1\ft*\f*. ܦܪܘ ܘܣܓܘ ܘܡܠܘ ܐܪܥܐ ܘܟܘܒܫ̣ܘܗ̇. ܘܫܠܛܘ ܒܢ̈ܘܢܝ ܝܡܐ ܘܒܦܪܚܬܐ ܕܫܡܝܐ ܘܒܒܥܝܪ̈ܐ. ܘܒܟܠܗ̇ ܚܝܘܬܐ ܕܪܚܫܐ ܥܠ ܐܪܥܐ. +\v 29 ܘܐܡ̣ܪ ܐܠܗܐ. ܗܐ ܝܗ̇ܒܬ ܠܟܘܢ ܟܠܗ ܥܣܒܐ ܕܙܪܥܐ ܕܡܙܕܪܥ ܥܠ ܐ̈ܦܝ ܟܠܗ̇\f e \fr 1.29\fr* \fk ܟܠܗ̇\fk* \ft om. 7h5\ft*\f* ܐܪܥܐ. ܘܟܠ ܐܝܠܢ ܕܐܝܬ ܒܗ ܦܐܪ̈ܝ. ܐܝܠܢܗ ܕܙܪܥܗ ܡܙܕܪܥ ܠܟܘܢ ܢܗܘܐ ܠܡܐܟܘܠܬܐ. +\v 30 ܘܠܟܠܗ̇ ܚܝܘܬܐ ܕܕܒܪܐ\f f \fr 1.30\fr* \fk ܕܐܪܥܐ\fk* \ft 8.5b1\ft*\f*. ܘܠܟܠܗ̇ ܦܪܚܬܐ ܕܫܡܝܐ. ܘܠܟܠ ܕܪܚܫ ܥܠ ܐܪܥܐ ܕܐܝܬ ܒܗ ܢܦܫܐ ܚܝܬܐ. ܘܟܠܗ ܝܘܪܩܐ ܕܥܣܒܐ ܠܡܐܟܘܠܬܐ. ܘܗܘܐ ܗܟܢܐ. +\v 31 ܘܚ̣ܙܐ ܐܠܗܐ ܟܠ ܕܥܒ̣ܕ. ܘܗܐ ܛܒ ܫܦܝܪ. ܘܗܘ̣ܐ ܪܡܫܐ. ܘܗܘܐ ܨܦܪܐ. ܝܘܡܐ ܕܫܬܐ. +\c 2 +\v 1 ܘܫܠ̣ܡܘ ܫܡܝܐ ܘܐܪܥܐ ܘܟܠܗ ܚܝܠܗܘܢ. +\v 2 ܘܫ̇ܠܡ ܐܠܗܐ ܒܝܘܡܐ ܫܬܝܬܝܐ ܥܒ̈ܕܘܗܝ ܕܥܒ̣ܕ. ܘܐܬܬܢܝܚ ܒܝܘܡܐ ܫܒܝܥܝܐ ܡܢ ܟܠܗܘܢ ܥܒ̈ܕܘܗܝ ܕܥܒ̣ܕ. +\v 3 ܘܒ̇ܪܟ ܐܠܗܐ ܠܝܘܡܐ ܫܒܝܥܝܐ ܘܩܕܫ̣ܗ. ܡܛܠ ܕܒܗ ܐܬܬܢܝܚ ܡܢ ܟܠܗܘܢ ܥܒ̈ܕܘܗܝ ܕܒܪܐ ܐܠܗܐ ܠܡܥܒܕ. +\v 4 ܗܠܝܢ ܬܘ̈ܠܕܬܐ ܕܫܡܝܐ ܘܕܐܪܥܐ ܟܕ ܐܬܒܪܝܘ. ܒܝܘܡܐ ܕܥܒ̣ܕ ܡܪܝܐ ܐܠܗܐ ܫܡܝܐ ܘܐܪܥܐ. +\v 5 ܘܟܠܗܘܢ ܐ̈ܝܠܢܐ ܕܚܩܠܐ ܥܕܟܝܠ ܠܐ ܗܘܘ ܒܐܪܥܐ. ܘܟܠܗ ܥܣܒܐ ܕܚܩܠܐ ܥܕܟܝܠ ܠܐ ܐܝܥܐ. ܡܛܠ ܕܠܐ ܐܚܬ ܡܪܝܐ ܐܠܗܐ ܡܛܪܐ ܥܠ\f a \fr 2.5\fr* \fk ܐ̈ܦܝ\fk* \ft add. 10b1, 10g1, 12a1, M, U, L\ft*\f* ܐܪܥܐ. ܘܐܕܡ ܠܝܬ ܠܡܦܠܚ ܒܐܪܥܐ. +\v 6 ܘܡܒܘܥ̣ܐ ܣ̇ܠܩ ܗܘܐ ܡܢ ܐܪܥܐ. ܘܡܫܩ̣ܐ ܗܘܐ †ܠܟܠ†\f b \fr 2.6\fr* \fk ܟܠ\fk* \ft 7a1\ft*\f* ܐ̈ܦܝ ܐܪܥܐ. +\v 7 ܘܓܒ̣ܠ ܡܪܝܐ ܐܠܗܐ ܠܐܕܡ ܥܦܪܐ ܡܢ ܐܕܡܬܐ. ܘܢܦ̣ܚ ܒܐ̈ܦܘܗܝ ܢܫܡܬܐ ܕܚ̈ܝܐ. ܘܗܘ̣ܐ ܐܕܡ ܠܢܦܫ ܚܝ̣ܐ. +\v 8 ܘܢܨ̣ܒ ܡܪܝܐ ܐܠܗܐ ܦܪܕܝܣܐ ܒܥܕܢ ܡܢ ܩܕܝܡ. ܘܣܡ ܬܡܢ ܠܐܕܡ ܕܓܒܠ. +\v 9 ܘܐܘܥܝ ܡܪܝܐ ܐܠܗܐ. ܡܢ ܐܪܥܐ. ܟܠ ܐܝܠܢ ܕܐܪܓܝܓ ܠܡܚܙܐ ܘܫܦܝܪ ܠܡܐܟܠ. ܘܐܝܠܢܐ ܕܚ̈ܝܐ ܒܡܨܥܬܗ ܕܦܪܕܝܣܐ. ܘܐܝܠܢܐ ܕܝܕܥܬܐ ܕܛܒܬܐ ܘܕܒܝܫܬܐ. +\v 10 ܘܢܗܪܐ ܢܦܩ̇ ܗܘܐ ܡܢ ܥܕܢ ܠܡܫܩܝܘܬܗ ܠܦܪܕܝܣܐ. ܘܡܢ ܬܡܢ ܦ̇ܪܫ ܘܗܘ̇ܐ\f c \fr 2.10\fr* \fk ܘܗܘ̇ܐ\fk* \ft om. 12a1\ft*\f* ܠܐܪ̈ܒܥܐ ܪ̈ܫܝܢ. +\v 11 ܫܡܗ ܕܚܕ ܦܝܫܘܢ. ܗ̇ܘ ܕܚ̇ܕܪ ܠܟܠܗ̇ ܐܪܥܐ ܕܚܘܝܠܐ. ܕܬܡ̇ܢ ܕܗܒܐ. +\v 12 ܘܕܗܒܗ̇ ܕܐܪܥܐ ܗ̇ܝ ܛܒ. ܬܡܢ ܒܪ̈ܘܠܚܐ ܘܟܐ̈ܦܐ ܕܒܪܘܠܐ. +\v 13 ܘܫܡܗ ܕܢܗܪܐ ܬܢܝܢܐ ܓܝܚܘܢ. ܗ̇ܘ ܕܚ̇ܕܪ ܠܟܠܗ̇ ܐܪܥܐ ܕܟܘܫ. +\v 14 ܘܫܡܗ ܕܢܗܪܐ ܕܬܠܬܐ ܕܩܠܬ. ܗ̇ܘ ܕܐ̇ܙܠ ܠܘܩܒܠ ܐܬܘܪ. ܘܢܗܪܐ ܕܐܪܒܥܐ ܗ̣ܘ ܦܪܬ. +\v 15 ܘܕܒ̣ܪ ܡܪܝܐ ܐܠܗܐ ܠܐܕܡ. ܘܫܒܩܗ ܒܦܪܕܝܣܐ ܕܥܕܢ. ܕܢܦܠܚܝܘܗܝ ܘܢܛܪܝܘܗܝ. +\v 16 ܘܦܩ̇ܕ ܡܪܝܐ ܐܠܗܐ ܠܐܕܡ ܘܐܡ̣ܪ ܠܗ. ܡܢ ܟܠܗܘܢ ܐ̈ܝܠܢܐ ܕܒܦܪܕܝܣܐ ܡܐܟܠ ܬܐܟܘܠ. +\v 17 ܘܡܢ ܐܝܠܢܐ ܕܝܕܥܬܐ ܕܛܒܬܐ ܘܕܒܝܫܬܐ. ܠܐ ܬܐܟܘܠ ܡܢܗ. ܡܛܠ ܕܒܝܘܡܐ ܕܬܐܟܘܠ ܡܢܗ ܡܘܬܐ ܬܡܘܬ. +\v 18 ܘܐܡ̣ܪ ܡܪܝܐ ܐܠܗܐ. ܠܐ ܫܦܝܪ ܕܢܗܘܐ ܐܕܡ ܒܠܚܘܕܘܗܝ. ܐܥܒܕ ܠܗ ܡܥܕܪܢܐ ܐܟܘܬܗ. +\v 19 ܘܓܒ̣ܠ ܡܪܝܐ ܐܠܗܐ ܡܢ ܐܪܥܐ. ܟܠܗ̇ ܚܝܘܬܐ ܕܕܒܪܐ ܘܟܠܗ̇ ܦܪܚܬܐ ܕܫܡܝܐ. ܘܐܝܬܝ ܐܢܘܢ ܠܘܬ ܐܕܡ ܕܢܚܙܐ ܡܢܐ ܩ̇ܪܐ ܠܗܘܢ. ܘܟܠ ܕܩ̣ܪܐ ܠܗܘܢ ܐܕܡ ܢܦܫܐ ܚܝܬܐ ܗ̇ܘ ܗ̣ܘ ܫܡܗ. +\v 20 ܘܩ̣ܪܐ ܐܕܡ ܫܡ̈ܗܐ ܠܟܠܗ̇ ܒܥܝܪ̈ܐ. ܘܠܟܠܗ̇ ܦܪܚܬܐ ܕܫܡܝܐ. ܘܠܟܠܗ̇ ܚܝܘܬܐ ܕܐܪܥܐ\f d \fr 2.20\fr* \fk ܕܕܒܪܐ\fk* \ft 12a1\ft*\f*. ܘܠܐܕܡ ܠܐ ܐܫܬܟܚ ܠܗ\f e \fr 2.20\fr* \fk ܠܗ\fk* \ft om. U\ft*\f* ܡܥܕܪܢܐ ܐܟܘܬܗ. +\v 21 ܘܐܪܡܝ ܡܪܝܐ ܐܠܗܐ ܫܠܝܐ ܥܠ ܐܕܡ ܘܕܡܟ. ܘܢܣ̣ܒ ܚܕܐ ܡܢ ܐ̈ܠܥܘܗܝ. ܘܐܘܚܕ ܒܣܪܐ ܚܠܦܝܗ̇. +\v 22 ܘܬܩ̇ܢ ܡܪܝܐ ܐܠܗܐ. ܐܠܥܐ ܕܢܣ̣ܒ ܡܢ ܐܕܡ ܠܐܢܬܬܐ ܘܐܝܬܝܗ̇ ܠܐܕܡ. +\v 23 ܘܐܡ̣ܪ ܐܕܡ. ܗܢܐ ܙܒܢܐ. ܓܪܡܐ ܡܢ ܓܪ̈ܡܝ ܘܒܣܪܐ ܡܢ ܒܣܪܝ. ܗܕܐ ܬܬܩܪܐ ܐܢܬܬܐ. ܡܛܠ ܕܡܢ ܓܒܪܐ ܢܣܝܒܐ. +\v 24 ܡܛܠ ܗܢܐ ܢܫܒܘܩ ܓܒܪܐ ܠܐܒܘܗܝ ܘܠܐܡܗ ܘܢܩ̣ܦ ܠܐܢܬܬܗ. ܘܢܗܘܘܢ ܬܪ̈ܝܗܘܢ ܚܕ ܒܣܪ. +\v 25 ܘܗܘܘ ܬܪ̈ܝܗܘܢ ܥܪܛܠܝܝܢ. ܐܕܡ ܘܐܢܬܬܗ ܘܠܐ ܒܗܬܝܢ. +\c 3 +\v 1 ܘܚܘܝܐ ܥܪܝܡ ܗܘܐ. ܡܢ ܟܠܗ̇ ܚܝܘܬܐ ܕܕܒܪܐ ܕܥܒ̣ܕ ܡܪܝܐ ܐܠܗܐ. ܘܐܡ̣ܪ ܚܘܝܐ ܠܐܢܬܬܐ. ܫܪܝܪܐܝܬ ܐܡ̣ܪ ܐܠܗܐ. ܕܠܐ ܬܐܟܠܘܢ ܡܢ ܟܠ ܐ̈ܝܠܢܝ ܦܪܕܝܣܐ. +\v 2 ܘܐܡ̣ܪܬ ܐܢܬܬܐ ܠܚܘܝܐ. ܕܡܢ\f a \fr 3.2\fr* \fk ܡܢ\fk* \ft L\ft*\f* ܦܐܪ̈ܝ ܐ̈ܝܠܢܐ ܕܒܦܪܕܝܣܐ ܟܠܗܘܢ ܢܐܟܘܠ. +\v 3 ܘܡܢ ܦܐܪ̈ܝ ܐܝܠܢܐ ܕܒܡܨܥܬܗ ܕܦܪܕܝܣܐ. ܐܡ̣ܪ ܐܠܗܐ ܕܠܐ ܬܐܟܠܘܢ ܡܢܗ. ܘܠܐ ܬܬ̇ܩܪܒܘܢ ܠܗ ܕܠܐ ܬܡܘܬܘܢ. +\v 4 ܘܐܡ̣ܪ ܚܘܝܐ ܠܐܢܬܬܐ. ܠܐ ܡܡܬ ܬܡܘܬܘܢ. +\v 5 ܡܛܠ ܕܝܕܥ ܐܠܗ̇ܐ. ܕܒܝܘܡܐ ܕܐܟܠܝܢ ܐܢܬܘܢ ܡܢܗ. ܡܬܦܬ̈ܚܢ ܥܝܢܝ̈ܟܘܢ. ܘܗܘܝܬܘܢ ܐܝܟ ܐ̈ܠܗܐ. ܝܕ̈ܥܝ ܛܒܬܐ ܘܒܝܫܬܐ. +\v 6 ܘܚܙܬ ܐܢܬܬܐ ܕܫܦܝܪ ܐܝܠܢܐ ܠܡܐܟܠ. ܘܪܓܬܐ ܗܘ ܠܥܝ̈ܢܐ. ܘܪܓܝܓ ܐܝܠܢܐ ܠܡܚܪ ܒܗ. ܘܢܣ̣ܒܬ ܡܢ ܦܐܪ̈ܘܗܝ ܘܐܟ̣ܠܬ. ܘܝܗ̣ܒܬ ܐܦ ܠܒܥܠܗ̇ ܥܡܗ̇ ܘܐܟ̣ܠ. +\v 7 ܘܐܬ̇ܦܬܚ ܥܝܢ̈ܐ ܕܬܪ̈ܝܗܘܢ. ܘܝܕܥܘ ܕܥܪ̈ܛܠܝܝܢ ܐܢܘܢ. ܘܕܒܩ̇ܘ ܛܪ̈ܦܐ ܕܬܐ̈ܢܐ. ܘܥܒܕܘ ܠܗܘܢ ܦܪ̈ܙܘܡܐ. +\v 8 ܘܫܡܥܘ ܩܠܗ ܕܡܪܝܐ ܐܠܗܐ. ܡܗܠܟ\f b \fr 3.8\fr* \fk ܕ\fk* \ft M, U, L\ft*\f* ܒܦܪܕܝܣܐ ܠܦܢܝܗ ܕܝܘܡܐ. ܘܐܬܛܫܝܘ ܐܕܡ ܘܐܢܬܬܗ ܡܢ ܩܕܡ ܡܪܝܐ ܐܠܗܐ. ܒܓܘ ܐ̈ܝܠܢܐ ܕܒܦܪܕܝܣܐ. +\v 9 ܘܩ̣ܪܐ ܡܪܝܐ ܐܠܗܐ ܠܐܕܡ ܘܐܡ̣ܪ ܠܗ. ܐܝܟܐ ܐܢܬ ܐܕܡ. +\v 10 ܘܐܡ̣ܪ ܩܠܟ ܫܡ̇ܥܬ ܒܦܪܕܝܣܐ. ܘܚ̇ܙܝܬ ܕܥܪܛܠܝ ܐܢܐ ܘܐܬ̇ܛܫܝܬ. +\v 11 ܘܐܡ̣ܪ ܠܗ ܡܪܝܐ. ܡܢܘ ܚܘܝܟ ܕܥܪܛܠܝ ܐܢܬ. ܗܐ ܡܢ ܐܝܠܢܐ ܕܦܩܕܬܟ ܕܠܐ ܬܐܟܘܠ ܡܢܗ ܐܟ̣ܠܬ. +\v 12 ܘܐܡ̣ܪ ܐܕܡ ܐܢܬܬܐ ܕܝܗ̣ܒܬ\f c \fr 3.12\fr* \fk ܠܝ\fk* \ft add. L\ft*\f* ܥܡܝ. ܗ̣ܝ ܝܗ̣ܒܬ ܠܝ ܡܢ ܐܝܠܢܐ ܘܐ̇ܟܠܬ. +\v 13 ܘܐܡ̣ܪ ܡܪܝܐ ܐܠܗܐ ܠܐܢܬܬܐ. ܡܢܘ ܗܢܐ ܕܥܒܕܬܝ. ܘܐܡ̣ܪܬ ܐܢܬܬܐ ܚܘܝܐ ܐܛܥܝܢܝ ܘܐ̇ܟܠܬ. +\v 14 ܘܐܡ̣ܪ ܡܪܝܐ ܐܠܗܐ ܠܚܘܝܐ. ܥܠ ܕܥܒ̣ܕܬ ܗܕܐ. ܠܝܛ ܐܢܬ ܡܢ ܟܠܗ̇ ܒܥܝܪܐ. ܘܡܢ ܟܠܗ̇ ܚܝܘܬܐ ܕܕܒܪܐ. ܘܥܠ ܟܪܣܟ ܬܗܠܟ. ܘܥܦܪܐ ܬܐܟܘܠ ܟܠ ܝܘ̈ܡܝ ܚܝ̈ܝܟ. +\v 15 ܘܒܥܠܕܒܒܘܬܐ ܐܣܝܡ ܒܝܢܝܟ ܠܐܢܬܬܐ. ܘܒܝܬ ܙܪܥܟ ܠܙܪܥܗ̇. ܗ̣ܘ ܢܕܘܫ ܪܫܟ. ܘܐܢܬ ܬܡܚܝܘܗܝ ܒܥܩܒܗ. +\v 16 ܘܠܐܢܬܬܐ ܐܡ̣ܪ. ܡܣܓܝܘ ܐܣܓܐ ܟܐ̈ܒܝܟܝ ܘܒܛܢܝ̈ܟܝ. ܘܒܟܐ̈ܒܐ ܬܐܠܕܝܢ ܒܢ̈ܝܐ. ܘܥܠ ܒܥܠܟܝ ܬܬܦܢܝܢ. ܘܗ̣ܘ ܢܫܬܠܛ ܒܟܝ. +\v 17 ܘܠܐܕܡ ܐܡ̣ܪ. ܥܠ ܕܫܡܥܬ ܒܩܠܗ̇ ܕܐܢܬܬܟ. ܘܐܟ̣ܠܬ ܡܢ ܐܝܠܢܐ ܕܦܩܕܬܟ. ܘܐܡ̇ܪܬ ܠܟ ܕܠܐ ܬܐܟܘܠ ܡܢܗ. ܠܝܛܐ ܐܪܥܐ ܡܛܠܬܟ. ܒܟܐ̈ܒܐ ܬܐܟܠܝܗ̇ ܟܠ ܝܘܡ̈ܝ ܚܝܝ̈ܟ. +\v 18 ܟܘܒ̈ܐ ܘܕܪ̈ܕܪܐ ܬܘܥܐ ܠܟ. ܘܬܐܟܘܠ ܥܣܒܐ ܕܚܩܠܐ. +\v 19 ܘܒܕܘܥܬܐ ܕܐ̈ܦܝܟ ܬܐܟܘܠ ܠܚܡܐ. ܥܕܡܐ ܕܬܗܦܘܟ ܠܐܪܥܐ ܕܡܢܗ̇ ܐܬܢ̣ܣܒܬ. ܡܛܠ ܕܥܦܪܐ ܐܢܬ ܘܠܥܦܪܐ ܬܗܦܘܟ. +\v 20 ܘܩ̣ܪܐ ܐܕܡ ܫܡܗ̇ ܕܐܢܬܬܗ ܚܘܐ. ܡܛܠ ܕܗ̣ܝ ܗܘܬ ܐܡܐ ܕܟܠ ܕܚܝ. +\v 21 ܘܥܒ̣ܕ ܡܪܝܐ ܐܠܗܐ ܠܐܕܡ ܘܠܐܢܬܬܗ ܟܘܬܝܢܝ̈ܬܐ ܕܡܫܟܐ ܘܐܠܒܫ ܐܢܘܢ. +\v 22 ܘܐܡ̣ܪ ܡܪܝܐ ܐܠܗܐ. ܗܐ ܐܕܡ ܗܘܐ ܐܝܟ ܚܕ ܡܢܢ. ܠܡܕܥ ܛܒܬܐ ܘܒܝܫܬܐ. ܗܫܐ ܕܠܡܐ ܢܘܫܛ ܐܝܕܗ ܘܢܣܒ ܐܦ ܡܢ\f d \fr 3.22\fr* \fk ܡܢ\fk* \ft om. L\ft*\f* ܐܝܠܢܐ ܕܚ̈ܝܐ. ܘܢܐܟܘܠ ܘܢܚ̣ܐ ܠܥܠܡ. +\v 23 ܘܫܕܪܗ ܡܪܝܐ ܐܠܗܐ ܡܢ ܦܪܕܝܣܐ ܕܥܕܢ ܠܡܦܠܚ ܐܪܥܐ ܕܐܬܢܣܒ ܡܢ ܬܡܢ. +\v 24 ܘܐܦܩܗ ܡܪܝܐ ܐܠܗܐ. ܘܐܟܪܟ ܡܢ ܡܕܢܚ ܠܦܪܕܝܣܐ\f e \fr 3.24\fr* \fk ܡ̈ܕܢܚܝ ܦܪܕܝܣܐ\fk* \ft 8.5b1, 10b1, 10g1, 12a1, 12b1, L, M, U\ft*\f* ܕܥܕܢ. ܟܪܘܒܐ ܘܫܢܢܐ ܕܚܪܒܐ ܕܡܬܗܦܟܐ ܠܡܛܪ ܐܘܪܚܐ ܕܐܝܠܢܐ ܕܚ̈ܝܐ. +\c 4 +\v 1 ܘܐܕܡ ܚܟ̣ܡ ܠܚܘܐ ܐܢܬܬܗ. ܘܒܛܢ̣ܬ ܘܝܠ̣ܕܬ ܠܩܐܝܢ. ܘܐܡ̣ܪܬ ܩ̇ܢܝܬ ܓܒܪܐ ܠܡܪܝܐ. +\v 2 ܘܐܘܣܦܬ ܠܡܐܠܕ ܠܐܚܘܗܝ ܗܒܝܠ. ܘܗܘ̣ܐ ܗܒܝܠ ܪܥ̇ܐ ܥܢܐ. ܘܩܐܝܢ ܗܘ̣ܐ ܦ̇ܠܚ †ܒܐܪܥܐ†\f a \fr 4.2\fr* \fk ܒܐܘܥܐ\fk* \ft 7a1\ft*\f*. +\v 3 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܝܘܡ̈ܬܐ. ܘܐܝܬܝ ܩܐܝܢ ܡܢ ܦܐܪ̈ܐ ܕܐܪܥܗ. ܩܘܪܒܢܐ ܠܡܪܝܐ. +\v 4 ܘܗܒܝܠ ܐܝܬܝ ܐܦ ܗ̣ܘ ܡܢ ܒܘܟܪ̈ܐ ܕܥܢܗ ܘܡܢ ܫ̈ܡܝܢܝܗܘܢ. ܘܐܨܛܒܝ ܡܪܝܐ ܒܗܒܝܠ ܘܒܩܘܪܒܢܗ. +\v 5 ܘܒܩܐܝܢ ܘܒܩܘܪܒܢܗ ܠܐ ܐܨܛܒܝ. ܘܐܬܒܐܫ ܠܩܐܝܢ ܛܒ. ܘܐܬܟܡܪ ܐ̈ܦܘܗܝ. +\v 6 ܘܐܡ̣ܪ ܡܪܝܐ ܠܩܐܝܢ. ܠܡܢܐ ܐܬܒܐܫ ܠܟ. ܘܠܡܢܐ ܐܬܟܡܪ ܐ̈ܦܝܟ. +\v 7 ܗܐ ܐܢ ܬܫܦܪ ܩܒ̇ܠܬ. ܘܐܠܐ ܬܫ̣ܦܪ. ܥܠ ܬܪܥܐ ܚܛܗܐ ܪܒܝܥ. ܐܢܬ ܬܬܦܢܐ ܠܘܬܗ ܘܗ̣ܘ ܢܫܬܠܛ ܒܟ. +\v 8 ܘܐܡ̣ܪ ܩܐܝܢ ܠܗܒܝܠ ܐܚܘܗܝ. ܢܪܕܐ ܠܦܩܥܬܐ. ܘܗܘ̣ܐ ܕܟܕ ܗ̣ܢܘܢ ܒܚܩܠܐ\f b \fr 4.8\fr* \fk ܒܦܩܥܬܐ\fk* \ft 12a1, L\ft*\f*. ܩܡ ܩܐܝܢ ܥܠ ܗܒܝܠ ܐܚܘܗܝ ܘܩܛܠܗ. +\v 9 ܘܐܡ̣ܪ ܡܪܝܐ ܠܩܐܝܢ. ܐܝܟܐ ܗܘ ܗܒܝܠ ܐܚܘܟ. ܘܐܡ̣ܪ ܠܐ ܝܕܥ ܐܢܐ. ܢܛܘܪܗ ܐܢܐ ܓܝܪ ܕܐܚܝ. +\v 10 ܘܐܡ̣ܪ †ܠܗ ܡܪܝܐ†\f c \fr 4.10\fr* \fk †ܠܗ ܡܪܝܐ†\fk* \ft om. 7a1\ft*\f*. ܡܢܐ ܥܒ̣ܕܬ. ܩܠܐ ܕܕܡܗ ܕܐܚܘܟ ܓܥ̇ܐ ܠܘܬܝ ܡܢ ܐܪܥܐ. +\v 11 ܡܟܝܠ ܠܝܛ ܐܢܬ ܡܢ ܐܪܥܐ. ܕܦܬ̣ܚܬ ܦܘܡܗ̇ ܘܩܒ̣ܠܬ ܕܡܗ ܕܐܚܘܟ ܡܢ ܐ̈ܝܕܝܟ. +\v 12 ܟܕ ܬܦܠܘܚ ܒܐܪܥܐ. ܠܐ ܬܘܣܦ ܕܬܬܠ\f d \fr 4.12\fr* \fk ܬܬܠ\fk* \ft L\ft*\f* ܠܟ ܚܝܠܗ̇. ܙܐܥ ܘܢܐܕ ܬܗܘܐ ܒܐܪܥܐ. +\v 13 ܘܐܡ̣ܪ ܩܐܝܢ ܠܡܪܝܐ. ܪܒܐ ܗܝ ܣܟܠܘܬܝ ܡܢ ܕܠܡܫܒܩ. +\v 14 ܗܐ ܐܦܩܬܢܝ ܝܘܡܢܐ ܡܢ ܐ̈ܦܝ ܐܪܥܐ. ܘܡܢ ܩܕܡܝܟ ܐܬ̇ܛܫܐ. ܘܐܗܘܐ ܙܐܥ ܘܢܐܕ ܒܐܪܥܐ ܘܟܠ ܡ̇ܢ ܕܢܫܟܚܢܝ ܢܩܛܠܢܝ. +\v 15 ܘܐܡ̣ܪ ܠܗ ܡܪܝܐ ܠܐ ܗܟܢܐ ܟܠ ܩܛ̇ܘܠܐ. ܩܐܝܢ\f e \fr 4.15\fr* \fk ܕ\fk* \ft M, U, L\ft*\f* ܚܕ ܒܫܒܥܐ ܢܬܦܪܥ. ܘܣܡ ܡܪܝܐ ܐܬܐ ܒܩܐܝܢ ܕܠܐ ܢܩܛܠܝܘܗܝ ܟܠ ܡ̇ܢ ܕܡܫܟܚ ܠܗ. +\v 16 ܘܢܦ̣ܩ ܩܐܝܢ ܡܢ ܩܕܡ ܡܪܝܐ. ܘܝܬ̣ܒ ܒܐܪܥܐ ܕܢܘܕ ܡܢ ܡܕܢܚܝܗ̇ ܕܥܕܢ. +\v 17 ܘܚ̣ܟܡ ܩܐܝܢ ܠܐܢܬܬܗ. ܘܒܛܢ̣ܬ ܘܝܠ̣ܕܬ. ܠܚܢܘܟ ܘܗܘ̣ܐ ܒ̇ܢܐ ܩܪܝܬܐ. ܘܩ̣ܪܐ ܫܡܗ̇ ܕܩܪܝܬܐ ܥܠ ܫܡ ܒܪܗ ܚܢܘܟ. +\v 18 ܘܐܬܝܠܕ ܠܚܢܘܟ ܥܝܕܪ. ܘܥܝܕܪ ܐܘܠܕ ܠܡܚܘܐܝܠ. ܘܡܚܘܐܝܠ ܐܘܠܕ ܠܡܬܘܫܝܠ. ܘܡܬܘܫܝܠ ܐܘܠܕ ܠܠܡܟ. +\v 19 ܘܠܡܟ ܢܣܒ ܠܗ\f f \fr 4.19\fr* \fk ܠܗ\fk* \ft om. L\ft*\f* ܬܪ̈ܬܝܢ ܢܫ̈ܝܢ. ܫܡܗ̇ ܕܚܕܐ ܥܕܐ. ܘܫܡܗ̇ ܕܐܚܪܬܐ ܨܠ̣ܐ. +\v 20 ܘܝܠ̣ܕܬ ܥܕܐ ܠܝܒܠ. ܗ̣ܘ ܗܘ̣ܐ ܐܒܐ ܠܥܡܪ̈ܝ ܡܫܟܢܐ ܘܩܢܝ̈ܝ\f g \fr 4.20\fr* \fk ܘܠ\fk* \ft 8.5b1\ft*\f* ܩܢܝܢܐ. +\v 21 ܘܫܡܐ ܕܐܚܘܗܝ ܝܘܒܠ. ܗ̣ܘ ܗܘܐ ܐܒܐ ܠܟܠ ܕܐܚܝܕ ܩܝܬܪܐ ܘܟܢܪܐ. +\v 22 ܘܨܠ̣ܐ ܐܦ ܗ̣ܝ ܝܠ̣ܕܬ ܠܬܘܒܠܩܝܢ. ܐܘܡܢ ܒܟܠ ܥܒ̇ܕ ܕܢܚܫܐ ܘܕܦܪܙܠܐ. ܘܚܬܗ ܕܬܘܒܠܩܝܢ ܢܥܡܐ. +\v 23 ܘܐܡ̣ܪ ܠܡܟ ܠܢܫ̈ܘܗܝ. ܥܕܐ ܘܨܠܐ ܫܡܥܝܢ ܩܠܝ. ܢܫ̈ܝ ܠܡܟ ܨܘܬܝܢ ܠܡܐܡܪܝ. ܡܛܠ ܕܓܒܪܐ ܩ̇ܛܠܬ ܒܨ̈ܘܠܦܬܝ ܘܛܠܝܐ ܒܫ̈ܘܩܦܝ. +\v 24 ܡܛܠ ܕܚܕܒܫܒܥܐ ܢܬܦܪܥ ܩܐܝܢ. ܘܠܡܟ ܠܫܒܥܝܢ ܘܫܒܥܐ. +\v 25 ܘܚ̣ܟܡ ܐܕܡ ܬܘܒ ܠܚܘܐ ܐܢܬܬܗ. ܘܒܛܢ̣ܬ ܘܝܠ̣ܕܬ ܒܪܐ. ܘܩܪܬ ܫܡܗ ܫܝܬ. ܡܛܠ ܕܝܗ̣ܒ ܠܝ ܐܠܗܐ ܙܪܥܐ ܐܚܪܢܐ ܚܠܦ ܗܒܝܠ ܕܩܛܠܗ ܩܐܝܢ. +\v 26 ܘܠܫܝܬ ܐܦ ܠܗ ܐܬܝܠܕ ܠܗ\f h \fr 4.26\fr* \fk ܠܗ\fk* \ft om. 8.5b1\ft*\f* ܒܪܐ. ܘܩ̣ܪܐ ܫܡܗ ܐܢܘܫ. ܗܝܕܝܢ ܫ̇ܪܝ ܠܡܩܪܐ ܒܫܡܗ ܕܡܪܝܐ. +\c 5 +\v 1 ܗܢܘ ܣܦܪ ܬ̈ܘܠܕܬܗ ܕܐܕܡ. ܒܝܘܡܐ ܕܒ̣ܪܐ ܐܠܗܐ ܠܐܕܡ ܒܕܡܘܬ ܐܠܗܐ ܒܪܝܗܝ. +\v 2 ܕܟܪ ܘܢܩܒܐ ܒ̣ܪܐ ܐܢܘܢ. ܘܒ̇ܪܟ ܐܢܘܢ ܐܠܗܐ\f a \fr 5.2\fr* \fk ܐܠܗܐ\fk* \ft om. 8.5b1\ft*\f*. ܘܩ̣ܪܐ ܫܡܗܘܢ ܐܕܡ ܒܝܘܡܐ ܕܒ̣ܪܐ ܐܢܘܢ. +\v 3 ܘܚ̣ܝܐ ܐܕܡ ܡܐܐ ܘܬܠܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒܕܡܘܬܗ ܐܝܟ ܨܠܡܗ. ܘܩ̣ܪܐ ܫܡܗ ܫܝܬ. +\v 4 ܘܚ̣ܝܐ ܐܕܡ\f b \fr 5.4\fr* \fk ܘܗܘܘ ܝܘܡ̈ܘܗܝ ܕܐܕܡ\fk* \ft 8.5b1\ft*\f* ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܫܝܬ. ܬܡܢܡܐܐ ܫܢܝ̈ܢ. ܘܐܘܠܕ ܒܢܝ̈ܐ ܘܒܢ̈ܬܐ. +\v 5 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ\f c \fr 5.5\fr* \fk ܝܘܡ̈ܝ ܚܝ̈ܘܗܝ\fk* \ft 12a1, L\ft*\f* ܕܐܕܡ ܕܚ̣ܝܐ ܬܫܥܡܐܐ ܘܬܠܬܝܢ ܫܢܝ̈ܢ ܘܡܝܬ. +\v 6 ܘܚ̣ܝܐ ܫܝܬ ܡܐܐ ܘܚܡܫ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܐܢܘܫ. +\v 7 ܘܚ̣ܝܐ ܫܝܬ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܐܢܘܫ. ܬܡܢܡܐܐ ܘܫܒܥ ܫ̈ܢܝܢ. ܘܐܘ̣ܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 8 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܫܝܬ. ܬܫܥܡܐܐ ܘܬܪ̈ܬܥܣܪܐ ܫܢܝ̈ܢ ܘܡܝܬ. +\v 9 ܘܚ̣ܝܐ ܐܢܘܫ ܬܫܥܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܩܝܢܢ. +\v 10 ܘܚ̣ܝܐ ܐܢܘܫ ܡܢ ܒܬܪ ܕܐ̇ܘܠܕ ܠܩܝܢܢ. ܬܡܢܡܐܐ ܘܚܡܫܥܣܪܐ ܫܢ̈ܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 11 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܐܢܘܫ ܬܫܥܡܐܐ ܘܚܡܫ ܫܢ̈ܝܢ ܘܡܝܬ. +\v 12 ܘܚ̣ܝܐ ܩܝܢܢ ܫܒܥܝܢ ܫܢ̈ܝܢ. ܘܐܘܠܕ ܠܡܗܠܠܐܝܠ. +\v 13 ܘܚ̣ܝܐ ܩܝܢܢ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܡܗܠܠܐܝܠ. ܬܡܢܡܐܐ ܘܐܪ̈ܒܥܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 14 ܘܗܘܘ ܟܘܠ\f d \fr 5.14\fr* \fk ܟܘܠ\fk* \ft om. 10g1\ft*\f* ܝܘܡ̈ܘܗܝ ܕܩܝܢܢ. ܬܫܥܡܐܐ ܘܥܣܪ ܫ̈ܢܝܢ ܘܡ̣ܝܬ. +\v 15 ܘܚ̣ܝܐ ܡܗܠܠܐܝܠ ܫܬܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܝܪܕ. +\v 16 ܘܚ̣ܝܐ ܡܗܠܠܐܝܠ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܝܪܕ ܬܡܢܡܐܐ ܘܬܠܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 17 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܡܗܠܠܐܝܠ. ܬܡܢܡܐܐ ܘܬܫܥܝܢ ܘܚܡܫ ܫ̈ܢܝܢ ܘܡܝܬ. +\v 18 ܘܚܝܐ ܝܪܕ ܡܐܐ ܘܫܬܝܢ ܘܬܪ̈ܬܝܢ ܫܢܝ̈ܢ. ܘܐܘܠܕ ܠܚܢܘܟ. +\v 19 ܘܚ̣ܝܐ ܝܪܕ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܚܢܘܟ. ܬܡܢܡܐܐ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 20 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܝܪܕ. ܬܫܥܡܐܐ ܘܫܬܝܢ ܘܬܪ̈ܬܝܢ ܫ̈ܢܝܢ ܘܡܝܬ. +\v 21 ܘܚ̣ܝܐ ܚܢܘܟ ܫܬܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܡܬܘܫܠܚ. +\v 22 ܘܫܦ̣ܪ ܚܢܘܟ ܠܐܠܗܐ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܡܬܘܫܠܚ. ܬܠܬܡܐܐ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 23 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܚܢܘܟ. ܬܠܬܡܐܐ ܘܫܬܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. +\v 24 ܘܫܦ̣ܪ ܚܢܘܟ ܠܐܠܗܐ ܘܠܝܬܘܗܝ. ܡܛܠ ܕܢܣܒܗ ܐܠܗܐ. +\v 25 ܘܚܝܐ ܡܬܘܫܠܚ ܡܐܐ ܘܬܡܢܐܝܢ ܘܫܒܥ ܫܢ̈ܝܢ. ܘܐܘܠܕ ܠܠܡܟ. +\v 26 ܘܚ̣ܝܐ ܡܬܘܫܠܚ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܠܡܟ. ܫܒܥܡܐܐ ܘܬܡܢܐܝܢ ܘܬܪ̈ܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 27 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܡܬܘܫܠܚ. ܬܫܥܡܐܐ ܘܫܬܝܢ ܘܬܫܥ ܫ̈ܢܝܢ ܘܡܝܬ. +\v 28 ܘܚ̣ܝܐ ܠܡܟ ܡܐܐ ܘܬܡܢܐܝܢ ܘܬܪ̈ܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒܪܐ. +\v 29 ܘܩ̣ܪܐ ܫܡܗ ܢܘܚ. ܘܐܡ̣ܪ. ܗܢܐ ܢܒܝܐܢ ܡܢ ܥܒ̈ܕܝܢ ܘܡܢ ܥܡܠܐ ܕܐ̈ܝܕܝܢ. ܘܡܢ ܐܪܥܐ ܕܠܛܗ̇ ܡܪܝܐ. +\v 30 ܘܚ̣ܝܐ ܠܡܟ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܢܘܚ. ܚܡܫܡܐܐ ܘܬܫܥܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒܢܝ̈ܐ ܘܒܢ̈ܬܐ. +\v 31 ܘܗܘܘ ܟܠ ܝܘܡ̈ܘܗܝ ܕܠܡܟ. ܫܒܥܡܐܐ ܘܫܒܥܝܢ ܘܫܒܥ\f e \fr 5.31\fr* \fk ܘܫܒܥ\fk* \ft om. 12b1\ft*\f* ܫ̈ܢܝܢ ܘܡܝܬ. +\v 32 ܘܗܘ̣ܐ ܢܘܚ ܒܪ ܚܡܫܡܐܐ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܢܘܚ ܠܫܝܡ ܘܠܚܡ ܘܠܝܦܬ. +\c 6 +\v 1 ܘܗܘܐ ܕܟܕ ܫܪܝܘ ܒܢ̈ܝ ܐܢܫܐ ܠܡܣܓܐ ܥܠ ܐ̈ܦܝ\f a \fr 6.1\fr* \fk ܐ̈ܦܝ\fk* \ft om. 8.5b1, 12b1\ft*\f* ܐܪܥܐ. ܘܒܢܬ̈ܐ ܐܬܝܠܕ ܠܗܘܢ. +\v 2 ܚܙܘ ܒܢ̈ܝ ܐܠܘܗܝܡ\f b \fr 6.2\fr* \fk ܕܝܢ̈ܐ\fk* \ft 8.5b1\ft*\f* ܠܒܢ̈ܬ ܐܢܫܐ ܕܫܦܝܪ̈ܢ ܐܢܝ̈ܢ. ܘܢܣܒܘ ܐ̈ܢܝܢ ܠܗܘܢ ܢܫ̈ܐ. ܡܢ ܟܠ ܕܓܒܘ. +\v 3 ܘܐܡ̣ܪ ܡܪܝܐ. ܠܐ ܬܥܡ̣ܪ ܪܘܚܝ ܒܐܢܫܐ ܠܥܠܡ. ܡܛܠ ܕܒܣܪܐ ܗܘ. ܘܢܗܘܘܢ ܝܘܡ̈ܬܗ ܡܐܐ ܘܥܣܪ̈ܝܢ ܫ̈ܢܝܢ. +\v 4 ܘܓܢܒܪ̈ܐ ܗܘܘ ܒܐܪܥܐ ܒܝܘ̈ܡܬܐ ܗ̇ܢܘܢ. ܘܐܦ ܡܢ ܒܬܪܟܢ. ܡܛܠ ܕܥܠܘ ܒܢ̈ܝ ܐܠܘܗܝܡ\f c \fr 6.4\fr* \fk ܕܝܢ̈ܐ\fk* \ft 8.5b1\ft*\f* ܥܠ ܒܢ̈ܬ ܐܢܫܐ. ܘܝܠܕ ܠܗܘܢ ܓܢܒܪ̈ܐ ܕܡܢ ܥܠܡ ܓܢܒܪ̈ܐ ܕܫܡ̈ܗܬܐ. +\v 5 ܘܚ̣ܙܐ ܡܪܝܐ ܕܣ̣ܓܝܬ ܒܝܫܬܐ ܕܐܢܫܐ ܒܐܪܥܐ. ܘܟܠ ܝܨܪܐ ܕܡܚܫܒܬܐ ܕܠܒܗ ܒܝܫ ܒܟܠ ܝܘܡ. +\v 6 ܘܐܬܬܘܚ\f d \fr 6.6\fr* \fk ܘܐܬܬܘܝ\fk* \ft 8.5b1\ft*\f* ܡܪܝܐ ܥܠ ܕܥܒ̣ܕ ܠܐܕܡ ܒܐܪܥܐ. ܘܟ̣ܪܝܬ ܒܠܒܗ. +\v 7 ܘܐܡ̣ܪ ܡܪܝܐ. ܐܥܛܐ ܠܒ̈ܢܝ ܐܢܫܐ ܕܒ̇ܪܝܬ ܡܢ ܐ̈ܦܝ ܐܪܥܐ. ܡܢ ܒܢ̈ܝ ܐܢܫܐ\f e \fr 6.7\fr* \fk ܐܢܫܐ\fk* \ft 8.5b1\ft*\f* ܘܥܕܡܐ ܠܒܥܝܪ̈ܐ. ܘܥܕܡܐ ܠܪܚܫܐ ܘܥܕܡܐ ܠܦܪܚܬܐ ܕܫܡܝܐ. ܡܛܠ ܕܐܬܬܘܚܬ\f f \fr 6.7\fr* \fk ܕܐܬܬܘܝܬ\fk* \ft 8.5b1, 11.9b1mg\ft*\f* ܕܥܒ̇ܕܬ ܐܢܘܢ. +\v 8 ܘܢܘܚ ܐܫܟܚ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝ ܡܪܝܐ. +\v 9 ܘܗܠܝܢ ܬ̈ܘܠܕܬܗ ܕܢܘܚ. ܢܘܚ ܓܒܪ ܙܕܝܩ ܘܬܡܝܡ ܗܘܐ ܒܕܪ̈ܘܗܝ. ܘܫ̣ܦܪ ܢܘܚ ܠܐܠܗܐ. +\v 10 ܘܐܘܠܕ ܢܘܚ ܬܠܬܐ ܒ̈ܢܝܢ. ܠܫܝܡ ܘܠܚܡ ܘܠܝܦܬ. +\v 11 ܘܐܬܚܒܠܬ ܐܪܥܐ ܩܕܡ ܐܠܗܐ. ܘܐܬܡ̣ܠܝܬ ܐܪܥܐ ܥܘ̣ܠܐ. +\v 12 ܘܚ̣ܙܐ ܐܠܗܐ ܠܐܪܥܐ ܕܐܬܚ̣ܒܠܬ. ܡܛܠ ܕܚ̇ܒܠ ܟܠ ܒܣܪ ܐܘܪܚܗ ܥܠ ܐܪܥܐ. +\v 13 ܘܐܡ̣ܪ ܐܠܗܐ ܠܢܘܚ. ܩ̣ܨܐ ܕܟܠ ܒܣܪ ܥܠ ܩܕܡܝ. ܡܛܠ ܕܐܬܡ̣ܠܝܬ ܐܪܥܐ ܥܘ̣ܠܐ ܡܢ ܩܕܡܝܗܘܢ. ܗܐ ܡ̇ܚܒܠ ܐܢܐ ܠܗܘܢ ܥܡ ܐܪܥܐ. +\v 14 ܥܒ̣ܕ ܠܟ ܩܒܘܬܐ ܕܩܝܣܐ ܕܥܪܩܐ. ܡܕܝܪ̈ܐ ܥܒܕܝܗ̇ ܠܩܒܘܬܐ. ܘܫܘܥܝܗ̇ ܡܢ ܠܒܪ ܘܡܢ ܠܓܘ ܒܟܘܦܪܐ. +\v 15 ܘܗܟܢܐ ܥܒܕܝܗ̇. ܬܠܬܡܐܐ ܐܡ̈ܝܢ ܐܘܪܟܗ̇ ܕܩܒܘܬܐ. ܘܚܡܫܝܢ ܐܡ̈ܝܢ ܦܬܝܗ̇. ܘܬܠܬܝܢ ܐܡ̈ܝܢ ܪܘܡܗ̇. +\v 16 ܘܙܘܝ̈ܕܢܐ ܥܒ̣ܕ ܠܩܒܘܬܐ. ܘܥܠ ܐܡܐ ܣܝܟܝܗ̇ ܡܢ ܠܥܠ. ܘܬܪܥܗ̇ ܕܩܒܘܬܐ ܒܣܛܪܗ̇ ܥܒ̣ܕ. ܡܕܝܪܐ ܬܚܬܝܐ ܘܬܢܝܢܐ ܘܬܠܝܬܝܐ ܥܒ̇ܕܝܗ̇. +\v 17 ܘܐܢܐ ܗܐ ܡ̇ܝܬܐ ܐܢܐ ܛܘܦܢܐ ܡ̈ܝܐ\f g \fr 6.17\fr* \fk ܕ\fk* \ft M, U, L\ft*\f* ܥܠ ܐܪܥܐ. ܠܡܚܒܠܘ ܟܠ ܒܣܪ ܕܐܝܬ ܒܗ ܪܘܚܐ ܕܚ̈ܝܐ ܡܢ ܬܚܝܬ ܫܡܝܐ. ܘܟܠ ܕܒܐܪܥܐ ܗ̣ܘ\f h \fr 6.17\fr* \fk ܗ̣ܘ\fk* \ft om. 8.5b1\ft*\f* †ܢܣܘܦ†. +\v 18 ܘܐܩܝܡ ܩܝܡܝ ܥܡܟ. ܘܬܥܘܠ ܠܩܒܘܬܐ ܐܢܬ ܘܒܢܝ̈ܟ. ܘܐܢܬܬܟ ܘܢܫ̈ܐ ܕܒܢܝ̈ܟ †ܥܡܟ†\f i \fr 6.18\fr* \fk ܕ\fk* \ft 7a1\ft*\f*. +\v 19 ܘܡܢ ܟܠ ܕܚܝ ܡܢ ܟܠ ܒܣܪ. ܬܪ̈ܝܢ ܬܪ̈ܝܢ\f j \fr 6.19\fr* \fk ܡܢ ܟܠ\fk* \ft add. 8.5b1\ft*\f* ܐܥܠ ܠܩܒܘܬܐ ܠܡܐܚܝܘ ܥܡܟ. ܕܟܪ̈ܐ ܘܢܩ̈ܒܬܐ ܢܗܘܘܢ. +\v 20 ܡܢ ܦܪܚܬܐ ܠܓܢܣܗ̇. ܘܡܢ ܒܥܝܪܐ ܠܓܢܣܗ̇. ܘܡܢ ܟܠܗ ܪܚܫܐ ܕܐܪܥܐ ܠܓܢܣ̈ܘܗܝ. ܬܪ̈ܝܢ ܬܪ̈ܝܢ ܡܢ ܟܠ ܢܥܠܘܢ ܥܡܟ ܠܡܐܚܐ. +\v 21 ܘܐܢܬ ܣܒ ܠܟ ܡܢ ܟܠ ܡܐܟܠܐ ܕܡܬܐܟܠ ܘܚܡܘܠ ܠܘܬܟ. ܘܢܗܘܐ ܠܟ ܘܠܗܘܢ ܠܡܐܟܘܠܬܐ. +\v 22 ܘܥܒ̣ܕ ܢܘܚ ܟܠ\f k \fr 6.22\fr* \fk ܐܝܟ\fk* \ft 8.5b1\ft*\f* ܕܦܩܕܗ ܐܠܗܐ ܗܟܢܐ ܥܒ̣ܕ. +\c 7 +\v 1 ܘܐܡ̣ܪ ܐܠܗܐ\f a \fr 7.1\fr* \fk ܡܪܝܐ\fk* \ft 8.5b1\ft*\f* ܠܢܘܚ. ܥܘܠ ܐܢܬ ܘܟܠܗ ܒܝܬܟ ܠܩܒܘܬܐ. ܡܛܠ ܕܠܟ ܚ̇ܙܝܬ ܕܙܕܝܩ ܐܢܬ ܩܕܡܝ ܒܕܪܐ ܗܢܐ. +\v 2 ܘܡܢ ܟܠܗ̇ ܒܥܝܪܐ ܕܟܝܬܐ. ܣܒ ܠܟ ܫܒܥܐ ܫܒܥܐ ܕܟܪ̈ܐ ܘܢܩܒ̈ܬܐ. ܘܡܢ ܒܥܝܪ̈ܐ ܕܠܐ ܗܘܬ ܕܟܝܐ. ܬܪ̈ܝܢ ܬܪ̈ܝܢ ܕܟܪ̈ܐ ܘܢܩܒ̈ܬܐ. +\v 3 ܘܐܦ ܡܢ ܦܪܚܬܐ ܕܫܡܝܐ\f b \fr 7.3\fr* \fk ܕܟܝܬܐ\fk* \ft E, W, L, M, U\ft*\f*. ܫܒܥܐ ܫܒܥܐ ܕܟܪ̈ܐ ܘܢܩܒ̈ܬܐ. ܠܡܐܚܝܘ ܙܪܥܐ ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. +\v 4 ܡܛܠ ܕܡܟܐ ܠܫܒܥܐ ܝܘܡ̈ܝܢ ܡ̇ܚܬ ܐܢܐ ܡܛܪܐ ܥܠ ܐܪܥܐ. ܐܪ̈ܒܥܝܢ ܐܝܡ̈ܡܝܢ ܘܐܪ̈ܒܥܝܢ ܠܝ̈ܠܘܢ. ܘܥ̇ܛܐ ܐܢܐ †ܟܠ†\f c \fr 7.4\fr* \fk ܠܟܠ\fk* \ft 7a1\ft*\f* ܕܩܐܡ ܕܥܒ̇ܕܬ ܡܢ ܐ̈ܦܝ ܐܪܥܐ. +\v 5 ܘܥܒ̣ܕ ܢܘܚ ܟܠ ܕܦܩܕܗ ܡܪܝܐ. +\v 6 ܘܢܘܚ ܒܪ ܫܬܡܐܐ\f d \fr 7.6\fr* \fk ܗܘܐ\fk* \ft 8.5b1\ft*\f* ܫ̈ܢܝܢ. ܘܛܘܦܢܐ ܗܘ̣ܐ ܡ̈ܝܐ ܥܠ ܐܪܥܐ. +\v 7 ܘܥܠ ܢܘܚ ܘܒ̈ܢܘܗܝ. ܘܐܢܬܬܗ ܘܢܫ̈ܐ ܕܒܢ̈ܘܗܝ ܥܡܗ ܠܩܒܘܬܐ. ܡܢ ܩܕܡ ܡ̈ܝܐ ܕܛܘܦܢܐ. +\v 8 ܘܡܢ ܒܥܝܪܐ ܕܟܝܬܐ ܘܡܢ ܒܥܝܪܐ ܕܠܐ ܗܘܬ ܕܟܝܐ. ܘܡܢ ܦܪܚܬܐ ܘܡܢ ܟܠ ܕܪܚܫ ܥܠ ܐܪܥܐ. +\v 9 ܬܪ̈ܝܢ ܬܪ̈ܝܢ ܥܠܘ ܥܡ ܢܘܚ ܠܩܒܘܬܐ. ܕܟܪ̈ܐ ܘܢܩܒ̈ܬܐ. ܐܝܟ ܕܦܩ̇ܕ ܐܠܗܐ ܠܢܘܚ. +\v 10 ܘܗܘܐ ܠܫܒܥܐ ܝܘܡ̈ܝܢ. ܘܡ̈ܝܐ ܕܛܘܦܢܐ ܗܘܘ ܥܠ ܐܪܥܐ. +\v 11 ܒܫܢܬ ܫܬܡܐܐ ܫ̈ܢܝܢ ܠܚܝ̈ܘܗܝ ܕܢܘܚ. ܒܝܪܚܐ ܕܬܪ̈ܝܢ ܒܫܒܥܣܪ̈ܐ ܒܝܪܚܐ. ܒܗ ܒܝܘܡܐ ܗܢܐ. ܐܬܬܪܥܘ ܟܠ ܡܒ̈ܘܥܝ ܬܗܘܡܐ ܪܒܐ. ܘܢܣ̈ܟܐ ܕܫܡܝܐ ܐܬ̇ܦܬܚܘ. +\v 12 ܘܗܘ̣ܐ ܡܛܪܐ ܥܠ ܐܪܥܐ ܐܪ̈ܒܥܝܢ ܐܝܡ̈ܡܝܢ ܘܐܪ̈ܒܥܝܢ ܠܝ̈ܠܘܢ. +\v 13 ܒܗ ܒܝܘܡܐ ܗܢܐ. ܥܠ ܢܘܚ ܘܫܝܡ ܘܚܡ ܘܝܦܬ ܒܢ̈ܝ ܢܘܚ. ܘܐܢܬܬܗ ܕܢܘܚ ܘܬܠܬ ܢܫ̈ܐ ܕܒ̈ܢܘܗܝ ܥܡܗ ܠܩܒܘܬܐ. +\v 14 ܗ̣ܢܘܢ ܘܟܠܗ̇ ܚܝܘܬܐ ܠܓܢܣܗ̇. ܘܟܠܗ̇ ܒܥܝܪܐ ܠܓܢܣܗ̇. ܘܟܠܗ ܪܚܫܐ ܕܪܚܫ ܥܠ ܐܪܥܐ ܠܓܢܣ̈ܘܗܝ. ܘܟܠܗ̇ ܦܪܚܬܐ ܠܓܢܣܗ̇. ܘܟܠ ܨܦܪ ܘܟܠ ܓܦ. +\v 15 ܥܠܘ ܥܡ ܢܘܚ ܠܩܒܘܬܐ. ܬܪ̈ܝܢ ܬܪ̈ܝܢ ܡܢ ܟܠ ܒܣܪ ܕܐܝܬ ܒܗܘܢ ܪܘܚܐ ܕܚ̈ܝܐ. +\v 16 ܘܕܥܠܘ ܕܟܪ̈ܐ ܘܢܩܒ̈ܬܐ ܡܢ ܟܠ ܒܣܪ ܥܠܘ\f e \fr 7.16\fr* \fk ܥܠܘ\fk* \ft om. 10g1\ft*\f* [-]\f f \fr 7.16\fr* \fk ܥܡܗ\fk* \ft 7a1\ft*\f*. ܐܝܟ ܕܦܩܕܗ ܐܠܗܐ\f g \fr 7.16\fr* \fk ܡܪܝܐ\fk* \ft 8.5b1\ft*\f*. ܘܐܚ̣ܕ ܡܪܝܐ ܒܐ̈ܦܘܗܝ. +\v 17 ܘܗܘ̣ܐ ܛܘܦܢܐ ܐܪ̈ܒܥܝܢ ܝܘܡ̈ܝܢ ܥܠ ܐܪܥܐ. ܘܣܓܝܘ ܡ̈ܝܐ ܘܫܩܠܘܗ̇ ܠܩܒܘܬܐ. ܘܐܬܬܪܝܡܬ ܡܢ ܐܪܥܐ. +\v 18 ܘܥܫܢܘ ܡ̈ܝܐ ܘܣܓܝܘ ܛܒ ܥܠ ܐܪܥܐ. ܘܡܗܠܟܐ ܗܘܬ\f h \fr 7.18\fr* \fk ܗܘܬ\fk* \ft om. 8.5b1\ft*\f* ܩܒܘܬܐ ܥܠ ܐ̈ܦܝ ܡ̈ܝܐ. +\v 19 ܘܡ̈ܝܐ ܥܫܢܘ ܛܒ ܛܒ\f i \fr 7.19\fr* \fk ܛܒ\fk* \ft om. 8.5b1\ft*\f* ܥܠ ܐܪܥܐ. ܘܐܬܟܣܝܘ ܟܠܗܘܢ ܛܘܪ̈ܐ ܪ̈ܡܐ ܕܬܚܝܬ ܟܠ ܫܡܝܐ. +\v 20 ܚܡܫܥܣܪ̈ܐ ܐ̈ܡܝܢ ܡܢ ܠܥܠ ܥܫܢܘ ܡ̈ܝܐ. ܘܐܬܟܣܝܘ ܛܘܪ̈ܐ\f j \fr 7.20\fr* \fk ܪ̈ܡܐ\fk* \ft add. E, W, M, U, L\ft*\f*. +\v 21 ܘܣܦ ܟܠ ܒܣܪ ܕܪܚ̇ܫ ܥܠ ܐܪܥܐ. ܦܪܚܬܐ ܘܒܥܝܪ̈ܐ ܘܚܝܘܬܐ ܘܟܠܗ ܪܚܫܐ ܕܪܚܫ ܥܠ ܐܪܥܐ. ܘܟܠܗܘܢ ܒܢ̈ܝ ܐܢܫܐ. +\v 22 ܟܠ ܕܢܫܡܬܐ ܕܪܘܚܐ ܕܚ̈ܝܐ ܒܐ̈ܦܘܗܝ. ܡܢ ܟܠ ܕܒܝܒܫܐ ܡܝܬܘ. +\v 23 ܘܥ̣ܛܐ ܠܟܘܠ ܕܩܐܡ ܥܠ ܐ̈ܦܝ ܐܪܥܐ. ܡܢ ܒܢܝܢܫ̈ܐ ܘܥܕܡܐ ܠܒܥܝܪܐ ܘܥܕܡܐ ܠܪܚܫܐ ܘܥܕܡܐ ܠܦܪܚܬܐ ܕܫܡܝܐ. ܐܬܥܛܝܘ ܡܢ ܐܪܥܐ. ܘܐܫܬܚܪ ܢܘܚ ܘܕܥܡܗ ܒܩܒܘܬܐ. +\v 24 ܘܥܫ̣ܢܘ ܡ̈ܝܐ ܥܠ ܐܪܥܐ. ܡܐܐ ܘܚܡܫܝܢ ܝܘܡ̈ܝܢ. +\c 8 +\v 1 ܘܐܬ̇ܕܟܪ ܐܠܗܐ ܠܢܘܚ. ܘܠܟܠܗ̇ ܚܝܘܬܐ ܘܠܟܠܗ̇ ܒܥܝܪܐ. ܘܠܟܠܗ̇ ܦܪܚܬܐ\f a \fr 8.1\fr* \fk ܘܠܟܠܗ̇ ܦܪܚܬܐ\fk* \ft om. 5b1\ft*\f* ܕܥܡܗ ܒܩܒܘܬܐ. ܘܐܥܒܪ ܐܠܗܐ ܪܘܚܐ ܥܠ ܐܪܥܐ. ܘܐܬܬܢܝܚܘ ܡ̈ܝܐ. +\v 2 ܘܐܣܬܟܪ̈ܘ ܡܒ̈ܘܥܐ ܕܬܗܘܡܐ ܘܢܣ̈ܟܐ ܕܫܡܝܐ. ܘܐܬܟܠܝ ܡܛܪܐ ܡܢ ܫܡܝܐ. +\v 3 ܘܗܦܟܘ ܡ̈ܝܐ ܡܢ ܐܪܥܐ. ܐܙܠܝܢ ܘܗܦܟܝܢ. ܘܚܣܪܘ ܡ̈ܝܐ ܡܢ ܒܬܪ ܡܐܐ ܘܚܡܫܝܢ ܝܘܡ̈ܝܢ. +\v 4 ܘܐܬܬܢܝ̣ܚܬ ܩܒܘܬܐ ܒܝܪܚܐ ܫܒܝܥܝܐ. ܒܫܒܥܣܪ̈ܐ ܒܗ ܒܝܪܚܐ ܥܠ ܛܘܪ̈ܝ ܩܪܕܘ. +\v 5 ܘܡ̈ܝܐ ܐܙܠܝܢ ܗܘܘ ܘܚܣܪܝܢ. ܥܕܡܐ ܠܝܪܚܐ ܥܣܝܪܝܐ\f b \fr 8.5\fr* \fk ܕܥܣܪܐ\fk* \ft 5b1\ft*\f*. ܒܚܕ ܒܝܪܚܐ ܥܣܝܪܝܐ. ܐܬܚܙܝܘ ܪ̈ܫܝ ܛܘܪ̈ܐ. +\v 6 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܐܪ̈ܒܥܝܢ ܝܘܡ̈ܝܢ. ܦܬ̣ܚ ܢܘܚ ܟܘܬܐ ܕܩܒܘܬܐ ܕܥܒ̣ܕ. +\v 7 ܘܫܕܪ ܠܥܘܪܒܐ. ܘܢܦ̣ܩ ܡܦܩ\f c \fr 8.7\fr* \fk ܡܦܩ\fk* \ft om. 5b1*\ft*\f* ܘܠܐ ܗ̣ܦܟ. ܥܕܡܐ ܕܝܒܫܘ ܡ̈ܝܐ ܡܢ\f d \fr 8.7\fr* \fk ܐ̈ܦܝ\fk* \ft add. E, W, M, U, L\ft*\f* ܐܪܥܐ. +\v 8 ܘܫܕܪ ܠܝܘܢܐ ܡܢ ܠܘܬܗ. ܕܢܚܙܐ ܐܢ ܩܠܘ ܡ̈ܝܐ ܡܢ ܐ̈ܦܝ ܐܪܥܐ. +\v 9 ܘܠܐ ܐܫܟ̣ܚܬ ܠܗ̇\f e \fr 8.9\fr* \fk ܠܗ̇\fk* \ft om. 5b1\ft*\f* ܝܘܢܐ ܢܝܚܐ ܠܦܣܬ ܪܓܠܗ̇. ܘܗܦܟ̣ܬ ܠܘܬܗ ܠܩܒܘܬܐ. ܡܛܠ ܕܡ̈ܝܐ ܐܝܬ ܗܘܘ ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. ܘܐܘܫܛ ܐܝܕܗ ܘܢܣܒܗ̇. ܘܐܥܠܗ̇ ܠܘܬܗ ܠܩܒܘܬܐ. +\v 10 ܘܦ̣ܫ ܬܘܒ ܫܒܥܐ ܝܘܡ̈ܝܢ ܐܚܪ̈ܢܝܢ. ܘܗ̣ܦܟ ܘܫܕܪܗ̇ ܠܝܘܢܐ ܡܢ ܩܒܘܬܐ. +\v 11 ܘܐܬܬ ܠܘܬܗ ܝܘܢܐ ܠܥܕܢ ܪܡܫܐ. ܘܗܐ ܛܪܦܐ ܕܙܝܬܐ ܐܚܝܕܐ ܒܦܘܡܗ̇. ܘܝܕܥ ܢܘܚ ܕܩܠܘ ܡ̈ܝܐ ܡܢ ܐ̈ܦܝ ܐܪܥܐ. +\v 12 ܘܦܫ ܬܘܒ ܫܒܥܐ ܝܘ̈ܡܝܢ ܐܚܪ̈ܢܝܢ. ܘܫܕܪܗ̇ ܠܝܘܢܐ. ܘܠܐ ܐܘܣ̣ܦܬ ܬܘܒ ܝܘܢܐ\f f \fr 8.12\fr* \fk ܝܘܢܐ\fk* \ft om. 5b1\ft*\f* ܠܡܗܦܟ ܠܘܬܗ. +\v 13 ܘܗܘ̣ܐ ܒܫܢܬ ܫܬܡܐܐ ܘܚܕܐ. ܒܚܕ ܒܝܪܚܐ ܩܕܡܝܐ. ܝܒܫܘ ܡ̈ܝܐ ܡܢ ܐܪܥܐ. ܘܐܥܒ̣ܪ ܢܘܚ ܟܣܝܐ ܕܩܒܘܬܐ ܘܚ̣ܙܐ ܘܗܐ ܝܒ̣ܫ ܐ̈ܦܝ ܐܪܥܐ. +\v 14 ܘܒܝܪܚܐ ܕܬܪ̈ܝܢ ܒܫܒܥܐ ܘܥܣܪ̈ܝܢ ܒܗ ܒܝܪܚܐ. ܝܒ̣ܫܬ ܐܪܥܐ. +\v 15 ܘܡܠܠ ܐܠܗܐ ܥܡ ܢܘܚ ܘܐܡ̣ܪ ܠܗ. +\v 16 ܦܘܩ ܡܢ ܩܒܘܬܐ ܐܢܬ ܘܐܢܬܬܟ. ܘܒ̈ܢܝܟ ܘܢܫ̈ܐ ܕܒ̈ܢܝܟ ܥܡܟ. +\v 17 ܘܟܠܗ̇ ܚܝܘܬܐ ܕܥܡܟ ܡܢ ܟܠ ܒܣܪ. †ܘܦܪܚܬܐ† ܘܒܥܝܪܐ. ܘܟܠܗ ܪܚܫܐ ܕܪܚܫ ܥܠ ܐܪܥܐ ܐܦܩ ܥܡܟ. ܘܢܘܠܕܘܢ ܒܐܪܥܐ. ܘܢܦܪܘܢ ܘܢܣܓܘܢ ܥܠ ܐܪܥܐ. +\v 18 ܘܢܦ̣ܩ ܢܘܚ ܘܐܢܬܬܗ ܘܒܢ̈ܘܗܝ. ܘܢܫ̈ܐ ܕܒܢ̈ܘܗܝ ܥܡܗ. +\v 19 ܘܟܠܗ̇ ܚܝܘܬܐ ܘܟܠܗ̇ ܒܥܝܪܐ\f g \fr 8.19\fr* \fk ܪܚܫܐ\fk* \ft 5b1\ft*\f* ܘܟܠܗ̇ ܦܪܚܬܐ. ܘܟܠ ܕܪܚܫ ܥܠ ܐܪܥܐ ܠܫܪ̈ܒܬܗܘܢ. ܢܦܩܘ ܡܢ ܩܒܘܬܐ. +\v 20 ܘܒܢ̣ܐ ܢܘܚ ܡܕܒܚܐ ܠܡܪܝܐ. ܘܢܣ̣ܒ ܡܢ ܟܠܗ̇ ܚܝܘܬܐ\f h \fr 8.20\fr* \fk ܒܥܝܪܐ\fk* \ft 5b1\ft*\f* ܕܟܝܬܐ. ܘܡܢ ܟܠܗ̇\f i \fr 8.20\fr* \fk ܟܠܗ̇\fk* \ft om. 12b1\ft*\f* ܦܪܚܬܐ ܕܟܝܬܐ. ܘܐܣܩ ܝܩܕܐ ܥܠ ܡܕܒܚܐ. +\v 21 ܘܐܪܝܚ ܡܪܝܐ ܪܝܚܐ ܕܣܘܬܐ\f j \fr 8.21\fr* \fk ܪܝܚܐ ܕܣܘܬܐ\fk* \ft om. 5b1\ft*\f* ܪܝܚܐ ܕܢܝܚܐ. ܘܐܡ̣ܪ ܡܪܝܐ ܒܠܒܗ. ܠܐ ܐܘܣܦ ܬܘܒ ܠܡܠܛܗ̇ ܠܐܪܥܐ ܡܛܠ ܒܪ ܐܢܫܐ. ܡܛܠ ܕܝܨܪܐ ܕܠܒܗ ܕܒܪ ܐܢܫܐ ܒܝܫ ܡܢ ܛܠܝܘܬܗ. ܘܠܐ ܐܘܣܦ ܬܘܒ ܠܡܡܚܐ ܠܟܠ ܕܚܝ ܐܝܟ ܕܥܒ̇ܕܬ. +\v 22 ܘܡܟܝܠ ܟܠܗܘܢ ܝܘܡ̈ܬܐ ܕܐܪܥܐ. ܙܪܥܐ ܘܚܨܕܐ. ܥܪܝܐ ܘܚܘܡܐ. ܩܝܛܐ ܘܣܬܘܐ. ܐܝܡܡܐ ܘܠܠܝܐ ܠܐ ܢܒܛܠܘܢ. +\c 9 +\v 1 ܘܒ̇ܪܟ ܐܠܗܐ ܠܢܘܚ ܘܠܒܢ̈ܘܗܝ. ܘܐܡ̣ܪ ܠܗܘܢ ܦܪܘ ܘܣܓܘ ܘܡ̣ܠܘ ܐܪܥܐ. +\v 2 ܘܕܚܠܬܟܘܢ ܘܙܘܥܬܟܘܢ ܬܗܘܐ ܥܠ ܟܠܗ̇ ܚܝܘܬܐ ܕܐܪܥܐ\f a \fr 9.2\fr* \fk ܕܕܒܪܐ\fk* \ft 12a1\ft*\f*. ܘܥܠ ܟܠܗ̇ ܦܪܚܬܐ ܕܫܡܝܐ. ܘܥܠ ܟܘܠ ܕܡܪܚܫܐ ܐܪܥܐ. ܘܟܠܗܘܢ ܢܘܢ̈ܐ ܕܝܡܐ ܒܐ̈ܝܕܝܟܘܢ ܢܫܬܠܡܘܢ. +\v 3 ܘܟܠ ܪܚܫܐ ܕܚܝ ܠܟܘܢ ܢܗܘܐ ܠܡܐܟܘܠܬܐ. ܐܝܟ ܝܘܪܩܐ ܕܥܣܒܐ ܝܗ̇ܒܬ ܠܟܘܢ ܟܠ. +\v 4 ܒܠܚܘܕ ܒܣܪܐ ܕܒܢܦܫܗ ܕܡܗ ܠܐ ܬܐܟܠܘܢ. +\v 5 ܘܒܪܡ ܕܡܟܘܢ ܕܢܦܫ̈ܬܟܘܢ ܐܬܒܥ. ܡܢ ܝܕ ܟܠ ܚܝܘܬܐ ܐܬܒܥܝܘܗܝ †ܡܢ† ܐܝܕܐ ܕܐܢܫܐ. ܘܡܢ ܐܝܕܐ ܕܓܒܪܐ ܘܐܚܘܗܝ ܐܬܒܥ ܢܦܫܐ ܕܐܢܫܐ. +\v 6 ܡ̇ܢ ܕܢܐܫܘܕ ܕܡܐ ܕܐܢܫܐ ܒܐܢܫܐ ܕܡܗ ܢܬܐܫܕ. ܡܛܠ ܕܒܨܠܡ ܐܠܗܐ ܥܒܝܕ ܐܕܡ. +\v 7 ܘܐܢܬܘܢ ܦܪܘ ܘܣܓܘ. ܘܐܘܠܕܘ ܒܐܪܥܐ ܘܣܓܘ ܒܗ̇. +\v 8 ܘܐܡ̣ܪ ܐܠܗܐ ܠܢܘܚ ܘܠܒܢ̈ܘܗܝ ܥܡܗ. +\v 9 ܐܢܐ ܗܐ ܡܩܝܡ ܐܢܐ ܩܝܡܝ ܥܡܟܘܢ. ܘܥܡ ܙܪܥܟܘܢ ܒܬܪܟܘܢ. +\v 10 ܘܥܡ ܟܠܗ̇ ܢܦܫܐ ܚܝܬܐ ܕܥܡܟܘܢ. ܘܥܡ ܦܪܚܬܐ ܘܥܡ ܒܥܝܪ̈ܐ. ܘܥܡ ܟܠܗ̇ ܚܝܘܬܐ ܕܐܪܥܐ ܕܥܡܟܘܢ. ܡܢ ܟܘܠ ܢܦܩ̈ܝ ܩܒܘܬܐ. ܘܥܡ ܟܠܗ̇ ܚܝܘܬܐ ܕܐܪܥܐ. +\v 11 ܘܐܩܝܡ ܩܝܡܝ ܥܡܟܘܢ. ܘܠܐ ܢܣܘܦ ܟܠܒܣܪ ܬܘܒ ܡܢ ܡ̈ܝܐ ܕܛܘܦܢܐ. ܘܠܐ ܢܗܘܐ ܬܘܒ ܛܘܦܢܐ ܠܡܚܒܠܘ ܠܐܪܥܐ\f b \fr 9.11\fr* \fk ܐܪܥܐ\fk* \ft 5b1\ft*\f*. +\v 12 ܘܐܡ̣ܪ ܐܠܗܐ ܠܢܘܚ. ܗܕܐ ܐܬܐ ܕܩܝܡܐ ܕܝܗ̇ܒ ܐܢܐ ܒܝܢܝ ܘܠܟܘܢ. ܘܒܝܬ\f c \fr 9.12\fr* \fk ܘܒܝܢܬ\fk* \ft L\ft*\f* ܟܠ ܢܦܫܐ ܚܝܬܐ ܕܥܡܟܘܢ ܠܕܪ̈ܝ ܥܠܡܐ. +\v 13 ܩܫܬܝ ܝܗ̇ܒܬ ܒܥܢ̈ܢܐ ܘܬܗܘܐ ܐܬܐ ܕܩܝܡܐ ܒܝܢܝ ܠܐܪܥܐ. +\v 14 ܘܢܗܘܐ ܡܐ ܕܡܣܩ ܐܢܐ ܥܢ̈ܢܐ ܥܠ ܐܪܥܐ. ܘܬܬܚܙܐ ܩܫܬܐ ܒܥܢ̈ܢܐ. +\v 15 ܐܬܕܟܪ ܩܝܡܝ ܕܒܝܢܝ\f d \fr 9.15\fr* \fk ܒܝܢܝ\fk* \ft 8.5b1\ft*\f* ܘܠܟܘܢ. ܘܒܝܬ ܟܠ ܢܦܫܐ ܚܝܬܐ ܕܥܡܟܘܢ. ܘܒܝܬ ܟܠ ܒܣܪ. ܘܠܐ ܢܗܘܘܢ ܬܘܒ ܡ̈ܝܐ ܕܛܘܦܢܐ ܠܡ̇ܚܒܠܘ ܟܠܒܣܪ. +\v 16 ܘܬܗܘܐ ܩܫܬܐ ܒܥܢ̈ܢܐ. ܘܐܚܙܝܗ̇ ܠܕܘܟܪܢܐ ܕܩܝܡܐ ܕܠܥܠܡ\f e \fr 9.16\fr* \fk ܕܥܠܡ\fk* \ft 5b1\ft*\f*. ܒܝܬ ܐܠܗܐ ܠܒܝܬ ܟܠ ܢܦܫܐ ܚܝܬܐ ܕܟܠ ܒܣܪ ܕܥܠ ܐܪܥܐ. +\v 17 ܘܐܡ̣ܪ ܐܠܗܐ ܠܢܘܚ. ܗܕܐ ܗܝ ܐ̇ܬܐ ܕܩܝܡܐ. ܕܐܩܝ̇ܡܬ ܒܝܢܝ ܠܒܝܬ ܟܠ ܒܣܪ ܕܥܠ ܐܪܥܐ. +\v 18 ܘܗܘܘ ܒܢ̈ܝ ܢܘܚ ܕܢܦܩܘ ܡܢ ܩܒܘܬܐ. ܫܝܡ ܘܚܡ ܘܝܦܬ. ܚܡ ܗ̣ܘ ܐܒܘܗܝ ܕܟܢܥܢ. +\v 19 ܬܠܬܐ ܗܠܝܢ ܒܢ̈ܝ ܢܘܚ. ܘܡܢ ܗܠܝܢ ܐ̇ܬܒܕܪܘ ܒܟܠܗ̇ ܐܪܥܐ. +\v 20 ܘܫ̇ܪܝ ܢܘܚ ܥܒ̇ܕܐ ܒܐܪܥܐ. ܘܢܨ̣ܒ ܟܪܡܐ. +\v 21 ܘܐܫܬܝ ܡܢ ܚܡܪܗ ܘܪܘܝ ܘܐܬܓܠܝ ܒܓܘ ܡܫܟܢܗ. +\v 22 ܘܚ̣ܙܐ ܚܡ ܐܒܘܗܝ ܕܟܢܥܢ ܥܪܛܠܝܘܬܐ ܕܐܒܘܗܝ. ܘܚܘܝ ܠܬܪ̈ܝܢ ܐܚ̈ܘܗܝ. +\v 23 ܘܢܣܒܘ ܫܝܡ ܘܝܦܬ ܡܪܛܘܛܐ. ܘܐܪܡܝܘ ܥܠ ܟܬ̈ܦܬܐ ܕܬܪ̈ܝܗܘܢ. ܘܗܠܟܘ ܒܪ ܒܣܬܪܐܝܬ. ܘܟܣܝܘ ܥܪܛܠܝܘܬܐ ܕܐܒܘܗܘܢ. ܘܐ̈ܦܝܗܘܢ ܠܒܣܬܪܗܘܢ. ܘܥܪܛܠܝܘܬܐ ܕܐܒܘܗܘܢ ܠܐ ܚܙܘ. +\v 24 ܘܐܬܬܥܝܪ ܢܘܚ ܡܢ ܚܡܪܗ. ܘܝܕܥ ܟܠ ܕܥܒ̣ܕ ܠܗ ܒܪܗ ܙܥܘܪܐ. +\v 25 ܘܐܡ̣ܪ ܠܝܛ ܟܢܥܢ. ܥܒ̣ܕ ܥܒ̈ܕܝܢ ܢܗܘܐ ܠܐܚ̈ܘܗܝ. +\v 26 ܘܐܡ̣ܪ. ܒܪܝܟ ܡܪܝܐ ܐܠܗܗ ܕܫܝܡ. ܘܢܗܘܐ ܟܢܥܢ ܥܒ̣ܕܐ ܠܗܘܢ. +\v 27 ܢܦܬܐ ܐܠܗܐ ܠܝܦܬ. ܘܢܫܪܐ ܒܡܫܟܢܗ ܕܫܝܡ. ܘܢܗܘܐ ܟܢܥܢ ܥܒܕܐ ܠܗܘܢ. +\v 28 ܘܚ̣ܝܐ ܢܘܚ ܡܢ ܒܬܪ ܛܘܦܢܐ. ܬܠܬܡܐܐ ܘܚܡܫܝܢ ܫܢܝ̈ܢ. +\v 29 ܘܗܘܘ ܟܘܠ ܝܘܡ̈ܘܗܝ ܕܢܘܚ. ܬܫܥܡܐܐ ܘܚܡܫܝܢ ܫ̈ܢܝܢ ܘܡܝܬ. +\c 10 +\v 1 ܘܗܠܝܢ ܬܘ̈ܠܕܬܐ ܕܒܢ̈ܝ ܢܘܚ. ܫܝܡ ܘܚܡ ܘܝܦܬ. ܘܐܬܝܠܕܘ ܠܗܘܢ ܒܢ̈ܝܐ ܡܢ ܒܬܪ ܛܘܦܢܐ. +\v 2 ܒܢ̈ܝ ܝܦܬ. ܓܡ̇ܪ ܘܡܓܘܓ. ܘܡܕܝ ܘܝܘܢ. ܘܬܘܒܝܠ. ܘܡܫܟ ܘܬܝܪܣ. +\v 3 ܘܒܢ̈ܝ ܓܡ̇ܪ. ܐܫܟܢܙ ܘܕܝܦܪ ܘܬܘܓܪܡܐ. +\v 4 ܘܒܢ̈ܝ ܝܘܢ. ܐܠܝܫܐ ܘܬܪܫܝܫ. ܘܟܬܝܡ ܘܕܘܪܢܝܡ. +\v 5 ܘܡܢ ܗܠܝܢ ܐܬܦܪܫܘ ܒܓܙܪ̈ܬܐ ܕܥܡ̈ܡܐ ܒܐܪ̈ܥܬܗܘܢ. ܓܒܪ ܠܠܫܢܗ\f a \fr 10.5\fr* \fk ܠܠܫܢܝܗܘܢ\fk* \ft 8.5b1\ft*\f* ܠܫܪ̈ܒܬܗܘܢ ܒܥܡ̈ܡܝܗܘܢ. +\v 6 ܘܒܢ̈ܝ ܚܡ. ܟܘܫ ܘܡܨܪܝܡ. ܘܦܘܛ ܘܟܢܥܢ. +\v 7 ܘܒܢ̈ܝ ܟܘܫ. ܫܒܐ ܘܚܘܝܠܐ. ܘܣܒܬܐ ܘܪܥܡܐ ܘܣܒܬܟܐ ܘܒܢ̈ܝ ܪܥܡܐ. ܫܒܐ ܘܕܪܢ. +\v 8 ܘܟܘܫ ܐܘܠܕ ܠܢܡܪܘܕ. ܗ̣ܘ ܫܪܝ ܠܡܗܘܐ ܓܢܒܪܐ ܒܐܪܥܐ. +\v 9 ܗ̣ܘ ܗܘ̣ܐ ܓܢܒܪܐ ܢܚܫܝܪܬܢܐ ܩܕܡ ܡܪܝܐ. ܡܛܠ ܗܢܐ ܡܬܐܡ̣ܪ. ܐܝܟ ܢܡܪܘܕ ܓܢܒܪܐ ܢܚܫܝܪܬܢܐ ܩܕܡ ܡܪܝܐ. +\v 10 ܘܗܘܬ ܪܝܫ ܡܠܟܘܬܗ ܒܒܠ. ܘܐܪܟ ܘܐܟܪ ܘܟܠܝܐ ܒܐܪܥܐ ܕܣܢܥܪ. +\v 11 ܡܢ ܐܪܥܐ ܗ̇ܝ ܢܦ̣ܩ ܐܬܘܪܝܐ ܘܒܢ̣ܐ ܠܢܝܢܘܐ ܘܠܪܚܒܘܬ ܩܪܝܬܐ. ܘܠܟܠܚ. +\v 12 ܘܠܪܣܢ ܕܒܝܬ ܢܝܢܘܐ. ܘܒܝܬ ܟܠܚ ܗܝ ܗܝ ܩܪܝܬܐ ܪܒܬܐ. +\v 13 ܘܡܨܪܝܡ ܐܘܠܕ ܠܠܘܕܝܡ. ܘܠܝܥܒܝܡ ܘܠܠܗܒܝܡ. ܘܠܝܦܬܘܚܝܡ. +\v 14 ܘܠܦܬܪܘܣܝܡ ܘܠܟܣܠܘܚܝܡ. ܕܢܦܩ̣ܘ ܡܢ ܬܡܢ ܦܠܫ̈ܬܝܐ ܘܩܦܘܕܩ̈ܝܐ. +\v 15 ܘܟܢܥܢ ܐܘܠܕ ܠܨܝܕܘܢ ܒܘܟܪܗ. ܘܠܚ̈ܬܝܐ ܘܠܝܒ̈ܘܣܝܐ. +\v 16 ܘܠܐܡܘܪ̈ܝܐ ܘܠܓܪ̈ܓܘܣܝܐ. +\v 17 ܘܠܚ̈ܘܝܐ ܘܠܥܪ̈ܩܝܐ ܘܠܣ̈ܝܢܝܐ. +\v 18 ܘܠܐܪ̈ܘܕܝܐ. ܘܠܨܡܪ̈ܝܐ ܘܠܚ̈ܡܬܝܐ. ܘܡܢ ܒܬܪܟܢ ܐܬܒܕܪ ܫܪ̈ܒܬܐ ܕܟܢ̈ܥܢܝܐ. +\v 19 ܘܗܘ̣ܐ ܬܚܘܡܐ ܕܟܢ̈ܥܢܝܐ. ܡܢ ܨܝܕܘܢ ܕܒܡܥܠܢܐ ܕܓܕܪ. ܘܥܕܡܐ ܠܥܐܙܐ ܕܒܡܥܠܢܐ ܕܣܕܘܡ ܘܕܥܡܘܪܐ. ܘܕܐܕܡܐ ܘܕܨܒܘܐܝܡ ܥܕܡܐ ܠܠܫܥ. +\v 20 ܗܠܝܢ ܒܢ̈ܝ ܚܡ ܠܫܪ̈ܒܬܗܘܢ. ܠܠܫ̈ܢܝܗܘܢ ܒܐܪ̈ܥܬܗܘܢ ܒܥܡ̈ܡܝܗܘܢ. +\v 21 ܘܫܝܡ ܐܘܠܕ ܐܦ ܗ̣ܘ. ܐܒܘܗܘܢ ܕܟܠ ܒܢ̈ܝ ܥܒ̇ܪ. ܐܚܘܗܝ ܕܝܦܬ ܪܒܐ. +\v 22 ܒܢ̈ܝ ܫܝܡ. ܥܝܠܡ ܘܐܫܘܪ ܘܐܪܦܟܫܪ\f b \fr 10.22\fr* \fk ܘܐܪܦܟܫܝ\fk* \ft M\ft*\f*. ܘܠܘܕ ܘܐܪܡ. +\v 23 ܘܒܢ̈ܝ ܐܪܡ. ܥܘܨ ܘܚܘܠ. ܘܓܬܪ ܘܡܫ. +\v 24 ܘܐܪܦܟܫܪ ܐܘܠܕ ܠܫ̇ܠܚ. ܘܫܠܚ ܐܘܠܕ ܠܥܒ̇ܪ. +\v 25 ܘܠܥܒ̇ܪ ܐܬܝܠܕܘ ܬܪ̈ܝܢ ܒܢܝ̈ܢ. ܫܡܗ ܕܚܕ ܦܠܓ. ܡܛܠ ܕܒܝܘ̈ܡܘܗܝ ܐܬ̣ܦܠܓܬ ܐܪܥܐ. ܘܫܡܐ ܕܐܚܘܗܝ ܝܩܛܢ. +\v 26 ܘܝܩܛܢ ܐܘܠܕ ܠܐܠܡܘܕܕ. ܘܠܫ̇ܠܦ ܘܠܚܨܪܡܘܬ. ܘܠܝܪܚ. +\v 27 ܘܠܗܕܘܪܡ. ܘܠܐܘܙܠ ܘܠܕܩܠܐ. +\v 28 ܘܠܥܘܒܠ ܘܠܐܒܝܡܠ. ܘܠܫܒܐ. +\v 29 ܘܠܐܘܦܝܪ. ܘܠܚܘܝܠܐ ܘܠܝܘܒܒ. ܟܠܗܘܢ ܗܠܝܢ ܒܢ̈ܘܗܝ ܕܝܩܛܢ. +\v 30 ܘܗܘ̣ܐ ܡܘܬܒܗܘܢ ܡܢ ܡܢܫܐ ܕܒܡܥܠܢܐ ܕܣܦܪܘܝܡ ܛܘܪܐ ܒܡܕܢܚܐ. +\v 31 ܗܠܝܢ ܒܢ̈ܝ ܫܝܡ ܠܫܪ̈ܒܬܗܘܢ ܠܠܫ̈ܢܝܗܘܢ ܒܐܪ̈ܥܬܗܘܢ ܒܥܡ̈ܡܝܗܘܢ. +\v 32 ܗܠܝܢ ܫܪ̈ܒܬܐ ܕܒܢ̈ܝ ܢܘܚ. ܠܬܘ̈ܠܕܬܗܘܢ ܠܫܪ̈ܒܬܗܘܢ\f c \fr 10.32\fr* \fk ܒ\fk* \ft 12b1\ft*\f* ܒܥܡ̈ܡܝܗܘܢ. ܘܡܢ ܗܠܝܢ ܐܬܦ̣ܪܫܘ ܥܡ̈ܡܐ ܒܐܪܥܐ. ܡܢ ܒܬܪ ܛܘܦܢܐ. +\c 11 +\v 1 ܘܗܘܬ ܟܠܗ̇ ܐܪܥܐ. ܠܫܢܐ ܚܕ ܘܡܡܠܠܐ ܚܕ. +\v 2 ܘܗ̣ܘܐ ܕܟܕ ܫܩܠܘ ܡܢ ܡܕܢܚܐ. ܐܫܟܚܘ ܦܩܥܬܐ ܒܐܪܥܐ ܕܣܢܥܪ ܘܝܬܒܘ ܬܡܢ\f a \fr 11.2\fr* \fk ܒܗ̇\fk* \ft 10b1*\ft*\f*. +\v 3 ܘܐܡܪܘ ܓܒܪ ܠܚܒܪܗ. ܬܘ ܢܪܡܐ ܠܒܢ̈ܐ ܘܢܘܩܕ ܐ̈ܢܝܢ ܒܢܘܪܐ. ܘܗܘܝܐ ܠܗܘܢ ܠܒܬܐ ܠܟܐܦܐ. ܘܣܝܕܐ ܗ̇ܘܐ ܠܗܘܢ ܠܡ̇ܠܛܐ. +\v 4 ܘܐܡܪܘ. ܬܘ ܢܒܢܐ ܠܢ ܩܪܝܬܐ. ܘܡܓܕܠܐ ܕܪܫܗ ܒܫܡܝܐ. ܘܢܥܒܕ ܠܢ ܫܡܐ. ܕܠܡܐ\f b \fr 11.4\fr* \fk ܕܠܐ\fk* \ft 8.5b1\ft*\f* ܢܬܒܕܪ ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. +\v 5 ܘܢܚ̣ܬ ܡܪܝܐ †ܠܡܚܙܐ†\f c \fr 11.5\fr* \fk ܕܢܚܙܐ\fk* \ft 7a1, 7h5\ft*\f* ܩܪܝܬܐ. ܘܡܓܕܠܐ ܕܒ̇ܢܝܢ ܒ̈ܢܝܢܫܐ. +\v 6 ܘܐܡ̣ܪ ܡܪܝܐ. ܗܐ ܥܡܐ ܚܕ ܘܠܫܢܐ ܚܕ ܠܟܠܗܘܢ. ܘܗܟܢܐ ܐܬܚܫܒܘ ܠܡܥܒܕ. ܡܟܝܠ ܠܐ ܢܬܒܨܪ ܡܢܗܘܢ ܟܠܡܕܡ\f d \fr 11.6\fr* \fk ܟܠ ܡܐ\fk* \ft 8.5b1\ft*\f* ܕܐܬܚܫܒܘ ܠܡܥܒܕ. +\v 7 ܬܘ ܢܚܘܬ ܘܢ̇ܦܠܓ ܬܡ̇ܢ ܠܫ̈ܢܐ. ܕܠܐ ܢܫܡܥܘܢ ܓܒܪ ܠܫܢ ܚܒܪܗ. +\v 8 ܘܒ̇ܕܪ ܐܢܘܢ ܡܪܝܐ †ܡܢ ܬܡܢ†\f e \fr 11.8\fr* \fk †ܡܢ ܬܡܢ†\fk* \ft om. 7a1, 12a1\ft*\f* ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. ܘܦܫܘ ܡܢ ܕܠܡܒܢܐ ܩܪܝܬܐ. +\v 9 ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܫܡܗ̇ ܒܒܠ. ܡܛܠ ܕܬܡ̇ܢ ܒܠܒܠ ܡܪܝܐ ܠܫ̈ܢܐ ܕܟܠܗ̇ ܐܪܥܐ. ܘܡܢ ܬܡ̇ܢ ܒ̇ܕܪ ܐܢܘܢ ܡܪܝܐ ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. +\v 10 ܘܗܠܝܢ ܬܘ̈ܠܕܬܗ ܕܫܝܡ. ܫܝܡ ܒܪ ܡܐܐ\f f \fr 11.10\fr* \fk ܗܘܐ\fk* \ft add. 10.5b1\ft*\f* ܫܢ̈ܝܢ.\f g \fr 11.10\fr* \fk ܟܕ\fk* \ft add. 10.5b1\ft*\f* ܐܘܠܕ ܠܐܪܦܟܫܪ. ܬܪ̈ܬܝܢ ܫ̈ܢܝܢ ܡܢ ܒܬܪ ܛܘܦܢܐ. +\v 11 ܘܚܝ̣ܐ ܫܝܡ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܐܪܦܟܫܪ ܚܡܫܡܐܐ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 12 ܘܐܪܦܟܫܪ ܚ̣ܝܐ ܬܠܬܝܢ ܘܚܡܫ ܫܢܝܢ. ܘܐܘܠܕ ܠܫܠܚ. +\v 13 ܘܚ̣ܝܐ ܐܪܦܟܫܪ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܫܠܚ. †ܐܪ̈ܒܥܡܐܐ† ܘܬܠܬ\f h \fr 11.13\fr* \fk ܘܬܠܬܝܢ\fk* \ft 12b1\ft*\f* ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 14 ܘܫܠܚ ܚܝܐ ܬܠܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܥܒ̇ܪ. +\v 15 ܘܚ̣ܝܐ ܫܠܚ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܥܒ̇ܪ ܐܪ̈ܒܥܡܐܐ ܘܬܠܬ ܫܢܝ̈ܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 16 ܘܚܝܐ ܥ̇ܒܪ ܬܠܬܝܢ ܘܐܪ̈ܒܥ\f i \fr 11.16\fr* \fk ܡܐܐ\fk* \ft add. U\ft*\f* ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܦܠܓ. +\v 17 ܘܚ̣ܝܐ ܥܒܪ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܦܠܓ. †ܐܪ̈ܒܥܡܐܐ† ܘܬܠܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒܢ̈ܝܐ ܘܒܢ̈ܬܐ. +\v 18 ܘܚܝ̣ܐ ܦܠܓ ܬܠܬܝܢ ܫܢܝ̈ܢ. ܘܐܘܠܕ ܠܐܪܥܘ. +\v 19 ܘܚܝ̣ܐ ܦܠܓ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܐܪܥܘ. ܡܐܬܝܢ ܘܬܫܥ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 20 ܘܚܝ̣ܐ ܐܪܥܘ ܬܠܬܝܢ ܘܬܪ̈ܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܣܪܘܓ. +\v 21 ܘܚ̣ܝܐ ܐܪܥܘ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܣܪܘܓ ܡܐܬܝܢ ܘܫܒܥ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 22 ܘܚ̣ܝܐ ܣܪܘܓ ܬܠܬܝܢ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܢܚܘܪ. +\v 23 ܘܚ̣ܝܐ ܣܪܘܓ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܢܚܘܪ. ܡܐܬ̈ܝܢ ܫܢ̈ܝܢ. ܘܐܘܠܕ ܒ̈ܢܝܐ ܘܒܢ̈ܬܐ. +\v 24 ܘܚ̣ܝܐ ܢܚܘܪ ܥܣܪ̈ܝܢ ܘܬܫܥ ܫܢܝ̈ܢ. ܘܐܘܠܕ ܠܬܪܚ. +\v 25 ܘܚܝ̣ܐ ܢܚܘܪ ܡܢ ܒܬܪ ܕܐܘܠܕ ܠܬܪܚ. ܡܐܐ ܘܬܫܥܣܪܐ ܫ̈ܢܝܢ. ܘܐܘܠܕ ܒܢ̈ܝܐ ܘܒܢ̈ܬܐ. +\v 26 ܘܚ̣ܝܐ ܬܪܚ ܫܒܥܝܢ ܘܚܡܫ\f j \fr 11.26\fr* \fk ܘܚܡܫ\fk* \ft om. 10.5b1\ft*\f* ܫ̈ܢܝܢ. ܘܐܘܠܕ ܠܐܒܪܡ ܘܠܢܚܘܪ. ܘܠܗܪܢ. +\v 27 ܘܗܠܝܢ ܬ̈ܘܠܕܬܗ ܕܬܪܚ. ܬܪܚ ܐܘܠܕ ܠܐܒܪܡ. ܘܠܢܚܘܪ ܘܠܗܪܢ. ܘܗܪܢ ܐܘܠܕ ܠܠܘܛ. +\v 28 ܘܡܝܬ ܗܪܢ ܒܚ̈ܝܝ ܬܪܚ ܐܒܘܗܝ. ܒܐܪܥܐ ܕܐܬܝܠܕ ܒܗ̇ ܒܐܘܪ ܕܟ̈ܠܕܝܐ. +\v 29 ܘܢܣܒ̣ܘ ܠܗܘܢ ܐܒܪܡ ܘܢܚܘܪ ܢܫ̈ܐ. ܫܡ ܐܢܬܬܗ ܕܐܒܪܡ ܣܪܝ. ܘܫܡ ܐܢܬܬܗ ܕܢܚܘܪ ܡܠ̣ܟܐ ܒܪܬ ܗܪܢ. ܐܒܘܗ̇ ܕܡܠ̣ܟܐ ܘܐܒܘܗ̇ ܕܐܣܟܐ. +\v 30 ܘܗܘܬ ܣܪܝ ܥܩܪܬܐ. ܘܠܐ ܗ̇ܘܝܢ ܠܗ̇ ܒ̈ܢܝܐ. +\v 31 ܘܕܒ̣ܪ ܬܪܚ ܠܐܒܪܡ ܒܪܗ ܘܠܠܘܛ ܒܪ ܗܪܢ ܒܪ ܒܪܗ. ܘܠܣܪܝ ܟܠܬܗ ܐܢܬܬ ܐܒܪܡ ܒܪܗ. ܘܢܦܩ̣ܘ ܥܡܗܘܢ ܡܢ ܐܘܪ ܕܟ̈ܠܕܝܐ ܠܡܐܙܠ ܠܐܪܥܐ ܕܟܢܥܢ. ܘܐܬܘ ܥܕܡܐ ܠܚܪܢ ܘܝܬܒܘ ܬܡܢ. +\v 32 ܘܗܘܘ ܝܘܡ̈ܬܗ ܕܬܪܚ. ܡܐܬܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. ܘܡܝܬ ܬܪܚ\f k \fr 11.32\fr* \fk ܬܪܚ\fk* \ft om. 12a1\ft*\f* ܒܚܪܢ. +\c 12 +\v 1 ܘܐܡ̣ܪ ܡܪܝܐ ܠܐܒܪܡ. ܙܠ ܠܟ ܡܢ ܐܪܥܟ ܘܡܢ ܐܝܡܟܐ ܕܐܬܝܠܕܬ. ܘܡܢ ܒܝܬ ܐܒܘܟ ܠܐܪܥܐ ܕܐܚܘܝܟ. +\v 2 ܘܐܥܒܕܟ ܠܥܡܐ ܪܒܐ. ܘܐܒܪܟܟ ܘܐܘܪܒ ܫܡܟ ܘܗܘܝ ܒܪܝܟ. +\v 3 ܘܐܒܪܟ ܡܒܪ̈ܟܢܝܟ ܘܡ̈ܠܝܛܢܝܟ ܐܠܘܛ. ܘܢܬܒܪ̈ܟܢ ܒܟ ܟܠܗܝܢ ܫܪ̈ܒܬܐ ܕܐܪܥܐ ܘܒܙܪܥܟ. +\v 4 ܘܥܒ̣ܕ ܐܒܪܡ ܐܝܟ ܕܐܡ̣ܪ ܠܗ ܡܪܝܐ. ܘܐܙܠ ܥܡܗ ܠܘܛ. ܘܐܒܪܡ ܒܪ ܫܒܥܝܢ ܗܘܐ ܘܚܡܫ ܫ̈ܢܝܢ. ܟܕ ܢܦ̣ܩ ܡܢ ܚܪܢ. +\v 5 ܘܕܒ̣ܪ ܐܒܪܡ ܠܣܪܝ ܐܢܬܬܗ. ܘܠܠܘܛ ܒܪ ܐܚܘܗܝ ܘܠܟܘܠܗ ܩܢܝܢܗܘܢ ܕܩܢܘ. ܘܢܦܫ̈ܬܐ ܕܥܒ̣ܕܘ ܒܚܪܢ. ܘܢܦܩܘ ܠܡܐܙܠ ܠܐܪܥܐ ܕܟܢܥܢ. ܘܐܬܘ ܠܐܪܥܐ ܕܟܢܥܢ. +\v 6 ܘܥܒ̣ܪ ܐܒܪܡ ܒܐܪܥܐ. ܥܕܡܐ ܠܐܬܪܐ ܕܫܟܝܡ. ܘܥܕܡܐ ܠܒܠܘܛܐ ܕܡܡܪܐ. ܘܟܢܥ̈ܢܝܐ ܥܕܟܝܠ ܝܬܒܝܢ\f a \fr 12.6\fr* \fk ܝܬܒܝܢ\fk* \ft om. 10.5b1\ft*\f* ܒܐܪܥܐ. +\v 7 ܘܐܬܓܠܝ ܡܪܝܐ ܥܠ ܐܒܪܡ ܘܐܡ̣ܪ ܠܗ. ܠܙܪܥܟ ܐܬܠܝܗ̇ ܐܪܥܐ ܗܕܐ ܘܒܢ̣ܐ ܬܡ̇ܢ ܡܕܒܚܐ ܠܡܪܝܐ ܕܐܬܓܠܝ ܥܠܘܗܝ. +\v 8 ܘܫ̇ܢܝ ܡܢ ܬܡ̇ܢ ܠܛܘܪܐ. ܡܢ ܡܕܢܚܐ ܠܒܝܬ ܐܝܠ. ܘܢܩ̣ܫ ܡܫܟܢܗ ܒܝܬ ܐܝܠ ܡܢ ܡܥܪܒܐ ܘܥܝ ܡܢ ܡܕܢܚܐ. ܘܒܢ̣ܐ ܬܡ̇ܢ ܡܕܒܚܐ ܠܡܪܝܐ. ܘܩ̣ܪܐ ܒܫܡܗ ܕܡܪܝܐ. +\v 9 ܘܫ̣ܩܠ ܐܒܪܡ ܘܐܙ̣ܠ. ܘܡܫܩܠܢܗ ܠܬܝܡܢܐ. +\v 10 ܘܗܘ̣ܐ ܟܦܢܐ ܒܐܪܥܐ. ܘܢܚ̣ܬ ܐܒܪܡ ܠܡܨܪܝܢ. ܠܡܥܡܪ ܬܡܢ. ܡܛܠ ܕܥܫܢ ܟܦܢܐ ܛܒ ܒܐܪܥܐ. +\v 11 ܘܗܘ̣ܐ ܕܟܕ ܩܪܝܒ ܠܡܥܠ ܠܡܨܪܝܢ. ܐܡ̣ܪ ܠܣܪܝ ܐܢܬܬܗ. ܗܐ ܝܕܥ ܐܢܐ ܕܐܢܬܬܐ ܫܦܝܪܬ †ܒܚܙܘܐ† ܐܢܬܝ. +\v 12 ܘܟܕ ܢܚܙܘܢܟܝ ܡܨܪ̈ܝܐ. ܢܐܡܪܘܢ ܐܢܬܬܗ ܗܝ ܗܕܐ. ܩܛܠܝܢ ܠܝ ܘܠܟܝ ܡܚܝܢ. +\v 13 ܐܡܪܝ ܕܚܬܗ ܐܢܐ. ܡܛܠ ܕܢܛܐܒ ܠܝ ܡܛܠܬܟܝ. ܘܬܚ̣ܐ ܢܦܫܝ ܡܛܠܬܟܝ. +\v 14 ܘܗܘ̣ܐ ܕܟܕ ܥܠ ܐܒܪܡ ܠܡܨܪܝܢ. ܚܙܐܘܗ̇ ܡܨܪ̈ܝܐ ܠܐܢܬܬܗ ܕܫܦܝܪܐ ܗܝ ܛܒ. +\v 15 ܘܚܙܐܘܗ̇ ܪ̈ܘܪܒܢܝ ܦܪܥܘܢ. ܘܫܒܚܘܗ̇ ܩܕܡ ܦܪܥܘܢ. ܘܐܬܕܒ̣ܪܬ ܐܢܬܬܐ ܠܒܝܬ ܦܪܥܘܢ. +\v 16 ܘܠܐܒܪܡ ܛܐܒ ܡܛܠܬܗ̇ ܘܗܘܘ ܠܗ ܥܢܐ ܘܬܘܪ̈ܐ ܘܚܡܪ̈ܐ. ܘܥܒ̈ܕܐ ܘܐ̈ܡܗܬܐ. ܘܐܬ̈ܢܐ ܘܓܡ̈ܠܐ. +\v 17 ܘܡܚ̣ܐ ܡܪܝܐ ܠܦܪܥܘܢ ܡܚ̈ܘܬܐ ܪ̈ܘܪܒܬܐ ܠܗ ܘܠܒ̈ܢܝ ܒܝܬܗ. ܡܛܠ ܣܪܝ ܐܢܬܬܗ ܕܐܒܪܡ. +\v 18 ܘܩ̣ܪܐ ܦܪܥܘܢ ܠܐܒܪܡ ܘܐܡ̣ܪ ܠܗ. ܡܢܘ ܗܢܐ ܕܥܒ̣ܕܬ ܠܝ. ܠܡܢܐ ܠܐ ܚܘܝܬܢܝ ܕܐܢܬܬܟ ܗܝ. +\v 19 ܘܠܡܢܐ ܐܡ̣ܪܬ ܕܚܬܝ ܗܝ. ܘܢܣܒܬܗ̇ ܠܝ ܐܢܬܬܐ. ܗܫܐ ܗܐ ܐܢܬܬܟ ܕܒ̣ܪ ܘܙܠ. +\v 20 ܘܦܩ̇ܕ ܥܠܘܗܝ ܦܪܥܘܢ ܓܒܪ̈ܐ. ܘܫܕܪܗ ܠܗ ܘܠܐܢܬܬܗ ܘܠܟܠ ܕܐܝܬ ܠܗ. +\c 13 +\v 1 ܘܣܠ̣ܩ ܐܒܪܡ ܡܢ ܡܨܪܝܢ. ܗ̣ܘ ܘܐܢܬܬܗ ܘܟܠ ܕܐܝܬ ܠܗ. ܘܠܘܛ ܥܡܗ ܠܬܝܡܢܐ. +\v 2 ܘܐܒܪܡ ܥܬܪ ܛܒ ܒܩܢܝܢܐ ܘܒܣܐܡܐ\f a \fr 13.2\fr* \fk ܘܒܟܣܦܐ\fk* \ft 10.5b1\ft*\f* ܘܒܕܗܒܐ. +\v 3 ܘܐܙܠ ܠܡܫܩ̈ܠܢܘܗܝ ܡܢ ܬܝܡܢܐ ܘܥܕܡܐ ܠܒܝܬ ܐܝܠ. ܥܕܡܐ ܠܐܬܪܐ ܕܢܩܫ ܗܘܐ ܬܡܢ ܡܫܟܢܗ ܡܢ ܩܕܝܡ. ܒܝܢܬ ܒܝܬ ܐܝܠ ܠܒܝܬ\f b \fr 13.3\fr* \fk ܘ\fk* \ft 10.5b1\ft*\f* ܥܝ. +\v 4 ܠܐܬܪܐ ܕܡܕܒܚܐ ܕܥܒ̣ܕ ܗܘܐ\f c \fr 13.4\fr* \fk ܗܘܐ\fk* \ft om. 10.5b1\ft*\f* ܬܡܢ ܒܩܕܡܝܬܐ. ܘܩ̣ܪܐ ܬܡܢ\f d \fr 13.4\fr* \fk ܬܡܢ\fk* \ft om. 7h5\ft*\f* ܐܒܪܡ ܒܫܡܗ ܕܡܪܝܐ. +\v 5 ܘܐܦ ܠܠܘܛ ܕܐܙܠ ܥܡ ܐܒܪܡ. ܐܝܬ ܗܘܘ ܥܢܐ ܘܬܘܪ̈ܐ. ܘܡܫ̈ܟܢܐ ܣܘܓܐܐ ܕܛܒ. +\v 6 ܘܠܐ ܡܣܝܒܪܐ ܗܘܬ ܠܗܘܢ ܐܪܥܐ ܗ̇ܝ\f e \fr 13.6\fr* \fk ܗ̇ܝ\fk* \ft om. 10.5b1\ft*\f* ܠܡܬܒ ܐܟܚܕܐ. ܡܛܠ ܕܣܓܝ ܗܘܐ ܩܢܝܢܗܘܢ ܛܒ\f f \fr 13.6\fr* \fk ܛܒ\fk* \ft om. 10.5b1\ft*\f*. ܘܠܐ ܡܫܟܚܝܢ ܗܘܘ ܠܡܬܒ ܐܟܚܕܐ. +\v 7 ܘܗܘܬ ܡܨܘܬܐ ܒܝܬ ܪ̈ܥܘܬܐ ܕܩܢܝܢܗ ܕܐܒܪܡ. ܠܒܝܬ ܪ̈ܥܘܬܐ ܕܩܢܝܢܗ ܕܠܘܛ. ܘܟܢܥ̈ܢܝܐ ܘܦܪ̈ܙܝܐ ܥܕܟܝܠ ܝܬܒܝܢ ܒܐܪܥܐ. +\v 8 ܘܐܡ̣ܪ ܐܒܪܡ ܠܠܘܛ. ܠܐ ܬܗܘܐ ܡܨܘܬܐ ܒܝܢܝ ܘܠܟ. ܘܒܝܬ ܪ̈ܥܘܬܝ ܠܪ̈ܥܘܬܟ. ܡܛܠ ܕܓܒܪ̈ܐ ܐܚ̈ܐ ܚܢܢ. +\v 9 ܗܐ ܟܠܗ̇ ܐܪܥܐ ܩܕܡܝܟ. ܦܪܘܫ ܡܢܝ. ܐܢ ܐܢܬ ܠܝܡܝܢܐ ܐܢܐ ܠܣܡܠܐ. ܘܐܢ ܐܢܬ ܠܣܡܠܐ ܐܢܐ ܠܝܡܝܢܐ. +\v 10 ܘܐܪܝܡ ܠܘܛ ܥܝܢ̈ܘܗܝ. ܘܚ̣ܙܐ ܟܠܗ̇ ܐܪܥܐ ܕܝܘܪܕܢܢ. ܕܟܠܗ̇ ܒܝܬ ܫܩܝܐ ܗܝ. ܩܕܡ ܕܢܚܒܠ ܡܪܝܐ\f g \fr 13.10\fr* \fk ܐܠܗܐ\fk* \ft E, W, M, U\ft*\f* ܠܣܕܘܡ ܘܠܥܡܘܪܐ ܐܝܟ ܦܪܕܝܣܗ ܕܐܠܗܐ. ܘܐܝܟ ܐܪܥܐ ܕܡܨܪܝܢ ܕܒܡܥܠܢܐ ܕܨܥܢ\f h \fr 13.10\fr* \fk ܕܨܥܪ\fk* \ft 10.5b1\ft*\f*. +\v 11 ܘܓܒ̣ܐ ܠܗ ܠܘܛ ܟܠܗ̇ ܐܪܥܐ ܕܝܘܪܕܢܢ. ܘܫ̣ܩܠ ܠܘܛ ܡܢ ܡܕܢܚܐ. ܘܦܪܫܘ ܓܒܪ ܡܢ ܐܚܘܗܝ. +\v 12 ܐܒܪܡ ܝܬ̣ܒ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܠܘܛ ܝܬ̣ܒ ܒܩܘܪ̈ܝܐ ܕܟܟܪ. ܘܝܪܬ ܥܕܡܐ ܠܣܕܘܡ. +\v 13 ܘܐܢܫܐ ܕܣܕܘܡ ܒܝܫ̈ܝܢ ܘܚ̈ܛܝܝܢ ܛܒ ܩܕܡ ܡܪܝܐ. +\v 14 ܘܐܡ̣ܪ ܡܪܝܐ ܠܐܒܪܡ. ܡܢ ܒܬܪ ܕܦܪܫ ܠܘܛ ܡܢ ܠܘܬܗ. ܐܪܝܡ ܥܝܢ̈ܝܟ ܘܚܙܝ ܡܢ ܐܬܪܐ ܕܐܢܬ ܒܗ. ܠܓܪܒܝܐ ܘܠܬܝܡܢܐ ܘܠܡܕܢܚܐ ܘܠܡܥܪܒܐ. +\v 15 ܡܛܠ ܕܟܠܗ̇ ܐܪܥܐ ܕܚ̇ܙܐ ܐܢܬ. ܠܟ †ܐܬܠܝܗ̇ ܘܠܙܪܥܟ† ܥܕܡܐ ܠܥܠܡ. +\v 16 ܘܐܥܒܕܝܘܗܝ ܠܙܪܥܟ ܐܝܟ ܥܦܪܐ ܕܐܪܥܐ. ܕܐܢ ܡܫܟܚ ܐܢܬ ܠܡܡܢܐ ܥܦܪܐ ܕܐܪܥܐ. ܐܦ ܙܪܥ̇ܟ ܢܬܡܢܐ. +\v 17 ܩܘܡ ܗܠܟ ܒܐܪܥܐ ܠܐܘܪܟܗ̇ ܘܠܦܬܝܗ̇. ܡܛܠ ܕܠܟ ܐܬܠܝܗ̇. +\v 18 ܘܐܬ̣ܐ ܐܒܪܡ. ܘܥܠ ܘܝܬ̣ܒ ܒܝܬ ܒܠܘܛܐ ܕܡܡܪܐ ܐܡܘܪܝܐ\f i \fr 13.18\fr* \fk ܐܡܘܪܝܐ\fk* \ft om. 5b1\ft*\f*. ܕܒܚܒܪܘܢ. ܘܒܢ̣ܐ ܬܡܢ ܡܕܒܚܐ ܠܡܪܝܐ. +\c 14 +\v 1 ܘܗܘܐ ܒܝ̈ܘܡܘܗܝ ܕܐܡܪܦܠ ܡ̇ܠܟܐ ܕܣܢܥܪ. ܘܐܪܝܘܟ ܡ̇ܠܟܐ ܕܕܠܣܪ. ܘܟܪܕܠܥܡܪ ܡ̇ܠܟܐ ܕܥܝܠܡ. ܘܬܪܥܠ ܡ̇ܠܟܐ ܕܓ̈ܠܝܐ. +\v 2 ܥܒܕܘ ܩܪܒܐ ܥܡ ܒܪܥ ܡ̇ܠܟܐ ܕܣܕܘܡ. ܘܥܡ ܒܪܫܥ ܡ̇ܠܟܐ ܕܥܡܘܪܐ. ܘܫܢܐܒ ܡ̇ܠܟܐ ܕܐܕܡܐ. ܘܫܡܐܝܪ ܡ̇ܠܟܐ ܕܨܒܘܐܝܡ. ܘܡ̇ܠܟܐ ܕܒܠܥ ܗ̣ܝ ܗܝ ܨܥܪ. +\v 3 ܟܠܗܘܢ ܗܠܝܢ ܐܬܟܢܫܘ ܠܥܘܡܩܐ ܕܣ̈ܕܘܡܝܐ. ܗ̣ܘ ܝܡܐ ܕܡܠܚܐ. +\v 4 ܬܪ̈ܬܥܣܪܐ ܫ̈ܢܝܢ ܦܠܚܘ ܠܟܪܕܠܥܡܪ. ܘܒܕܬܠܬܥܣܪ̈ܐ\f a \fr 14.4\fr* \fk ܘܕ\fk* \ft 5b1*\ft*\f* ܫ̈ܢܝܢ ܡܪܕܘ. +\v 5 ܘܒܫܢܬ ܐܪ̈ܒܥܣܪܐ ܫ̈ܢܝܢ\f b \fr 14.5\fr* \fk ܫ̈ܢܝܢ\fk* \ft om. 5b1\ft*\f*. ܐܬ̣ܐ ܟܪܕܠܥܡܪ ܘܡ̈ܠܟܐ ܕܥܡܗ. ܘܡܚܘ ܠܓܢܒܪ̈ܐ ܕܒܥܣܬܪܘܬ ܩܘܪܢܝܡ ܘܠܥܫܝ̈ܢܐ ܕܒܗܝܢ. ܘܠܐܡ̈ܢܐ ܕܒܫܘܐ ܩܘܪܝܬܝܡ. +\v 6 ܘܠܚܘܪ̈ܝܐ\f c \fr 14.6\fr* \fk ܘܠܚ̈ܘܝܐ\fk* \ft 5b1\ft*\f* ܕܒܛܘܪ̈ܝ ܣܥܝܪ ܥܕܡܐ ܠܒܛܡܬܐ ܕܦܪܢ ܕܒܡܕܒܪܐ. +\v 7 ܘܗܦܟܘ ܘܐܬܘ ܠܥܝܢ ܕܝܢ̣ܐ. ܗ̣ܝ\f d \fr 14.7\fr* \fk ܕ\fk* \ft L\ft*\f* ܗ̣ܝ ܪܩܡ. ܘܚܪܒܘ ܟܘܠ ܪ̈ܫܢܐ ܕܥܡ̈ܠܩܝܐ. ܘܐܦ ܠܐܡܘܪ̈ܝܐ ܕܝܬܒܝܢ ܒܥܝܢ ܓܕ. +\v 8 ܘܢܦ̣ܩ ܡ̇ܠܟܐ ܕܣܕܘܡ. ܘܡ̇ܠܟܐ ܕܥܡܘܪܐ. ܘܡ̇ܠܟܐ ܕܐܕܡܐ. ܘܡ̇ܠܟܐ ܕܨܒܘܐܝܡ. ܘܡ̇ܠܟܐ ܕܒ̇ܠܥ ܗ̣ܝ ܗܝ ܨܥܪ. ܟܠܗܘܢ ܗܠܝܢ ܥܒܕܘ ܩܪܒܐ ܒܥܘܡܩܐ ܕܣ̈ܕܘܡܝܐ. +\v 9 ܥܡ ܟܪܕܠܥܡܪ ܡ̇ܠܟܐ ܕܥܝܠܡ. ܘܬܪܥܠ ܡ̇ܠܟܐ ܕܓ̈ܠܝܐ. ܘܐܡܪܦܠ ܡ̇ܠܟܐ ܕܣܢܥܪ. ܘܐܪܝܘܟ ܡ̇ܠܟܐ ܕܕܠܣܪ. ܐܪ̈ܒܥܐ ܡ̈ܠܟܝܢ ܥܡ ܚܡܫܐ. +\v 10 ܘܥܘܡܩܐ ܕܣܕܘ̈ܡܝܐ ܒܪ̈ܐ ܒܪ̈ܐ ܕܩܝܪܐ. ܘܥܪ̣ܩ ܡ̇ܠܟܐ ܕܣܕܘܡ. ܘܡ̇ܠܟܐ ܕܥܡܘܪܐ. ܘܢܦܠܘ ܬܡܢ. ܘܕܐܫܬܚܪܘ ܠܛܘܪܐ ܥܪܩܘ. +\v 11 ܘܢܣܒܘ ܟܠܗ ܩܢܝܢܐ ܕܣܕܘܡ ܘܕܥܡܘܪܐ. ܘܟܠܗ̇ ܡܐܟܘܠܬܗܘܢ ܘܐܙܠܘ. +\v 12 ܘܕܒܪܘ ܠܠܘܛ ܒܪ ܐܚܘܗܝ ܕܐܒܪܡ ܘܠܩܢܝܢܗ ܘܐܙܠܘ. ܘܗ̣ܘ ܝܬ̇ܒ ܒܣܕܘܡ. +\v 13 ܘܐܬܐ ܡܢ ܕܐܬ̇ܦܠܛ ܘܚܘܝ ܠܐܒܪܡ ܥܒܪܝܐ. ܘܗ̣ܘ ܫ̣ܪܐ ܗܘܐ ܒܝܬ ܒܠܘܛܐ ܕܡܡܪܐ ܐܡܘܪܝܐ. ܐܚܘܗܝ ܕܥܢܝܪ ܘܐܚܘܗܝ ܕܐܫܟܘܠ. ܘܗ̣ܢܘܢ ܒ̈ܥܠܝ ܩܝܡܗ ܕܐܒܪܡ. +\v 14 ܘܫܡ̣ܥ ܐܒܪܡ ܕܐܫܬܒܝ ܒܪ ܐܚܘܗܝ. ܘܙܝܢ ܥܠܝܡ̈ܘܗܝ ܝ̈ܠܝܕܝ ܒܝܬܗ. ܬܠܬܡܐܐ ܘܬܡܢܬܥܣܪ. ܘܪܕܦ ܒܬܪܗܘܢ\f e \fr 14.14\fr* \fk ܒܬܪܗܘܢ\fk* \ft om. 5b1\ft*\f* ܥܕܡܐ ܠܕܢ. +\v 15 ܘܐܬܦܠܓ ܥܠܝܗܘܢ ܒܠܠܝܐ ܗ̣ܘ ܘܥܒ̈ܕܘܗܝ. ܘܡܚܘ ܐܢܘܢ ܘܪܕܦܘ ܐܢܘܢ ܥܕܡܐ ܠܚܘܒܐ ܕܡܢ ܣܡܠܗ̇ ܕܕܪܡܣܘܩ. +\v 16 ܘܐܗܦܟܘ ܟܠܗ ܩܢܝܢܐ. ܘܐܦ ܠܠܘܛ ܒܪ ܐܚܘܗܝ ܘܠܩܢܝܢܗ\f f \fr 14.16\fr* \fk ܐܦ ܠ\fk* \ft 12b2\ft*\f* ܐܗܦܟ\f g \fr 14.16\fr* \fk ܐܗܦܟ\fk* \ft om. 10g1\ft*\f*. ܐܦ ܠܢܫ̈ܐ ܐܦ ܠܥܡܐ. +\v 17 ܘܢܦ̣ܩ ܡ̇ܠܟܐ ܕܣܕܘܡ ܠܐܘܪܥܗ ܡܢ ܒܬܪ ܕܗܦ̣ܟ. ܟܕ ܚ̣ܪܒ ܠܟܪܕܠܥܡܪ ܘܠܡ̈ܠܟܐ ܕܥܡܗ. ܒܥܘܡܩܐ ܕܫܘܐ. ܗ̣ܘ ܥܘܡܩܐ ܕܡ̈ܠܟܐ. +\v 18 ܘܡܠܟܝܙܕܩ ܡܠܟ ܫܠܝܡ. ܐܦܩ ܠܚܡܐ ܘܚܡܪܐ. ܘܗ̣ܘ ܟܘܡܪܐ ܗܘܐ ܕܐܠܗܐ ܡܪܝܡܐ. +\v 19 ܘܒܪܟܗ ܘܐܡ̣ܪ. ܒܪܝܟ ܐܒܪܡ ܠܐܠܗܐ ܡܪܝܡܐ ܩܢ̣ܐ ܫܡܝܐ ܘܐܪܥܐ. +\v 20 ܘܒܪܝܟ ܗ̣ܘ\f h \fr 14.20\fr* \fk ܗ̣ܘ\fk* \ft om. 5b1\ft*\f* ܐܠܗܐ ܡܪܝܡܐ. ܕܐܫ̣ܠܡ ܒ̈ܥܠܕܒܒܝܟ ܒܐܝ̈ܕܝܟ. ܘܝܗ̣ܒ ܠܗ ܡܥܣܪ̈ܐ ܡܢ ܟܠ. +\v 21 ܘܐܡ̣ܪ ܡ̇ܠܟܐ ܕܣܕܘܡ ܠܐܒܪܡ. ܗܒ ܠܝ ܢܦܫ̈ܬܐ ܘܩܢܝܢܐ ܣܒ ܠܟ. +\v 22 ܘܐܡ̣ܪ ܐܒܪܡ ܠܡ̇ܠܟܐ ܕܣܕܘܡ. ܐ̇ܪܝܡܬ ܐܝ̈ܕܝ ܠܘܬ ܐܠܗܐ ܡܪܝܡܐ ܕܩܢܝܢܗ ܫܡܝܐ ܘܐܪܥܐ. +\v 23 ܐܢ ܡܢ ܚܘܛܐ ܘܥܕܡܐ ܠܥܪܩܬܐ ܕܡܣܢܐ. ܐܢ ܐܣܒ ܡܢ ܟܠܡܕܡ\f i \fr 14.23\fr* \fk ܡܕܡ\fk* \ft 5b1\ft*\f* ܕܐܝܬ ܠܟ. ܕܠܐ ܬܐܡܪ ܕܐܢܐ ܐܥܬܪܬ ܠܐܒܪܡ. +\v 24 ܣܛܪ ܡܢ ܡܕܡ ܕܐܟܠܘ ܥܠܝ̈ܡܐ. ܘܡܢ̈ܘܬܐ ܕܓܒܪ̈ܐ ܕܐܙܠܘ\f j \fr 14.24\fr* \fk ܕܐܬܘ\fk* \ft 12a1, L\ft*\f* ܥܡܝ. ܥܢܝܪ ܘܐܫܟܘܠ ܘܡܡܪܐ. ܗ̣ܢܘܢ ܢܣܒܘܢ ܡܢ̈ܘܬܗܘܢ. +\c 15 +\v 1 ܒܬܪ ܦܬ̈ܓܡܐ ܗܠܝܢ. ܗܘ̣ܐ ܦܬܓܡܗ ܕܡܪܝܐ ܥܠ ܐܒܪܡ ܒܚܙܘܐ ܘܐܡ̣ܪ ܠܗ. ܠܐ ܬܕܚܠ ܐܒܪܡ. ܐܢܐ ܐܣܝܥܟ ܐܓܪܟ ܛܒ ܣܓܝ. +\v 2 ܘܐܡ̣ܪ ܐܒܪܡ. ܡܪܝܐ ܐܠܗܐ. ܡܢܐ ܬܬܠ ܠܝ. ܕܐܢܐ ܐ̇ܙܠ ܐܢܐ ܕܠܐ ܒ̈ܢܝܢ. ܘܐܠܝܥܙܪ ܕܪܡܘܣܩܝܐ ܒܪ ܒܝܬܝ ܗ̣ܘ\f a \fr 15.2\fr* \fk ܗ̣ܘ\fk* \ft om. 11.9b1\ft*\f* ܝܪܬ̇ ܠܝ. +\v 3 ܘܐܡ̣ܪ ܐܒܪܡ. ܗܐ ܠܝ ܠܐ ܝܗ̣ܒܬ ܒܪܐ. ܘܗܐ ܒܪ ܒܝܬܝ ܝܪܬ̇ ܠܝ. +\v 4\f b \fr 15.4\fr* \fk ܘܗܘܐ ܦܬܓܡܗ ܕܡܪܝܐ ܥܠ ܐܒܪܡ\fk* \ft add. 5b1\ft*\f* ܘܐܡ̣ܪ ܠܗ ܡܪܝܐ\f c \fr 15.4\fr* \fk ܡܪܝܐ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܢܐܪܬܟ ܗܢܐ. ܐܠܐ ܒܪܟ\f d \fr 15.4\fr* \fk ܡ̇ܢ\fk* \ft 5b1\ft*\f* ܕܢܦܩ̇ ܡܢ ܚܨܟ ܗ̣ܘ ܢܐܪܬܟ. +\v 5 ܘܐܦܩܗ ܠܒܪ ܘܐܡ̣ܪ ܠܗ. ܚܘܪ ܒܫܡܝܐ ܘܡܢܝ ܟܘܟܒ̈ܐ. ܐܢ ܡ̇ܫܟܚ ܐܢܬ ܠܡܡܢܐ ܐܢܘܢ. ܘܐܡ̣ܪ ܠܗ. ܗܟܢܐ ܢܗܘܐ ܙܪܥܟ. +\v 6 ܘܗܝܡܢ ܐܒܪܡ ܒܐܠܗܐ ܘܐܬܚܫܒܬ ܠܗ ܠܙܕܝܩܘ. +\v 7 ܘܐܡ̣ܪ ܠܗ\f e \fr 15.7\fr* \fk ܐܠܗܐ\fk* \ft add. 5b1\ft*\f*. ܐܢܐ ܐܢܐ ܡܪܝܐ [-]\f f \fr 15.7\fr* \fk ܐܠܗܟ\fk* \ft 7a1, 7h5, 12b2\ft*\f* ܕܐܦܩܬܟ ܡܢ ܐܘܪ ܕܟ̈ܠܕܝܐ. ܠܡܬܠ ܠܟ ܐܪܥܐ ܗܕܐ ܠܡܐܪܬܗ̇. +\v 8 ܘܐܡ̣ܪ ܐܒܪܡ ܡܪܝܐ ܐܠܗܐ. ܒܡܢܐ ܐܕܥ ܕܝܪܬ̇ ܐܢܐ ܠܗ̇. +\v 9 ܘܐܡ̣ܪ ܠܗ. ܣܒ ܠܟ ܥܓܠܐ ܬܘܠܬܐ ܘܕܟܪܐ ܬܘܠܬܐ ܘܥܙܐ ܬܘܠܬܐ. ܘܫܘܦܢܝܢܐ ܘܒܪ ܝܘܢܐ. +\v 10 ܘܢܣ̣ܒ ܠܗ ܗܠܝܢ ܟܠܗܘܢ. ܘܦ̇ܠܓ ܐܢܘܢ ܫܘܝܐܝܬ. ܘܣܡ ܗܕܡܐ ܠܘܩܒܠ ܚܒܪܗ. ܘܦܪܚܬܐ ܠܐ ܦ̇ܠܓ. +\v 11 ܘܢܚܬܐ ܗܘܬ ܛܝܪܐ ܥܠ †ܦܓܪ̈ܐ†\f g \fr 15.11\fr* \fk ܦܪܚܬܐ\fk* \ft 7a1\ft*\f*. ܘܡ̇ܟܫ ܗܘܐ ܠܗ̇ ܐܒܪܡ. +\v 12 ܘܗܘ̣ܐ ܫܡܫܐ ܠܡܥܪܒ. ܘܫܠܝܐ ܢܦܠ ܥܠ ܐܒܪܡ. ܘܗܐ ܕܚܠܬܐ ܘܚܫܘܟܐ ܪܒܐ ܢܦܠ ܥܠܘܗܝ. +\v 13 ܘܐܡ̣ܪ ܠܐܒܪܡ. ܡܕܥ ܬܕܥ. ܕܥܡܘܪܐ ܢܗܘܐ ܙܪܥܟ ܒܐܪܥܐ ܕܠܐ ܕܝܠܗܘܢ. ܘܢܦܠܚܘܢ ܒܗܘܢ ܘܢܫܥܒܕܘܢ\f h \fr 15.13\fr* \fk ܢܫܡܫܘܢ\fk* \ft 12b2\ft*\f* ܐܢܘܢ ܐܪ̈ܒܥܡܐܐ ܫ̈ܢܝܢ. +\v 14 ܘܐܦ ܠܥܡܐ ܕܢܦܠܚܘܢ ܕܐܢ ܐܢܐ. ܘܒܬܪܟܝܢ ܢܦܩܘܢ ܒܩܢܝܢܐ ܪܒܐ. +\v 15 ܘܐܢܬ ܬܬܚܡܠ ܠܘܬ ܐ̈ܒܗܝܟ ܒܫܠܡܐ. ܘܬܬܩܒܪ ܒܣܝܒܘܬܐ ܛܒܬܐ. +\v 16 ܘܕܪܐ ܐܪܒܝܥܝܐ ܢܗܦܟܘܢ ܠܗܪܟܐ. ܡܛܠ ܕܠܐ ܥܕܟܝܠ ܫܠܡܘ ܚ̈ܘܒܝܗܘܢ ܕܐܡܘܪ̈ܝܐ. +\v 17 ܘܗܘܐ ܫܡܫܐ ܠܡܥܪܒ. ܘܥܡܛܢܐ ܗܘܐ. ܘܗܐ ܬܢܘܪܐ ܕܬܐܢ. ܘܠܡܦܐܕܐ ܕܢܘܪܐ ܕܥܒ̇ܪ ܒܝܬ ܦ̈ܠܓܐ ܗܠܝܢ. +\v 18 ܒܝܘܡܐ ܗ̇ܘ. ܐܩܝܡ ܡܪܝܐ ܥܡ ܐܒܪܡ ܩܝܡܐ ܘܐܡ̣ܪ ܠܗ. ܠܙܪܥܟ ܐܬܠܝܗ̇ ܐܪܥܐ ܗܕܐ. ܡܢ ܢܗܪܐ\f i \fr 15.18\fr* \fk ܐܪܥܐ\fk* \ft 5b1\ft*\f* ܕܡܨܪܝܢ ܘܥܕܡܐ ܠܢܗܪܐ ܪܒܐ ܢܗܪܐ ܦܪܬ. +\v 19 ܠܩܝܢ̈ܝܐ ܘܠܩܢ̈ܙܝܐ ܘܠܩܕܡ̈ܘܢܝܐ. +\v 20 ܘܠܚ̈ܬܝܐ ܘܠܦܪ̈ܙܝܐ ܘܠܓܢܒܪ̈ܐ\f j \fr 15.20\fr* \fk ܘܚ̈ܬܝܐ ܘܦܪ̈ܙܝܐ ܘܓܢܒܪ̈ܐ\fk* \ft 5b1\ft*\f*. +\v 21 ܘܠܐܡܘܪ̈ܝܐ ܘܠܟܢ̈ܥܢܝܐ ܘܠܓܪ̈ܓܘܣܝܐ ܘܠܝܒ̈ܘܣܝܐ\f k \fr 15.21\fr* \fk ܘܐܡܘܪ̈ܝܐ ܘܟܢ̈ܥܢܝܐ ܘܓܪ̈ܓܘܣܝܐ ܘܝܒ̈ܘܣܝܐ\fk* \ft 5b1\ft*\f*. +\c 16 +\v 1 ܘܣܪܝ ܐܢܬܬܗ ܕܐܒܪܡ ܠܐ ܝܠ̣ܕܬ ܠܗ. ܘܐܝܬ ܗܘܬ ܠܗ̇ ܐܡܬܐ ܡܨܪܝܬܐ ܘܫܡܗ̇ ܗܓܪ. +\v 2 ܘܐܡ̣ܪܬ ܣܪܝ ܠܐܒܪܡ. ܗܐ ܟܠܢܝ ܡܪܝܐ ܡܢ ܝܠܕܐ. ܥܘܠ ܥܠ ܐܡܬܝ. ܟܒܪ ܐܬܒܝܐ ܡܢܗ̇. ܘܫܡ̣ܥ ܐܒܪܡ ܒܩܠܗ̇ ܕܣܪܝ. +\v 3 ܘܕܒ̣ܪܬ ܣܪܝ ܐܢܬܬܗ ܕܐܒܪܡ ܠܗܓܪ ܡܨܪܝܬܐ ܐܡܬܗ̇. ܡܢ ܒܬܪ ܥܣܪ̈ ܫ̈ܢܝܢ ܕܝܬ̣ܒ ܐܒܪܡ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܝܗܒܬܗ̇ ܐܢܬܬܐ\f a \fr 16.3\fr* \fk ܣܪܝ\fk* \ft 5b1\ft*\f* ܠܐܒܪܡ ܒܥܠܗ̇. +\v 4 ܘܥܠ ܥܠ ܗܓܪ ܘܒܛܢ̣ܬ. ܘܟܕ ܚܙܬ ܕܒ̣ܛܢܬ. ܙܠܬ ܡܪܬܗ̇ ܒܥܝܢ̈ܝܗ̇. +\v 5 ܘܐܡ̣ܪܬ ܣܪܝ ܠܐܒܪܡ. ܥܘܠܒܢܝ ܥܠܝܟ. ܐܢܐ ܝܗ̇ܒܬ ܐܡܬܝ ܒܥܘܒܟ. ܘܟܕ ܚܙܬ ܕܒܛܢ̣ܬ ܙ̇ܠܬ ܒܥܝܢ̈ܝܗ̇. ܢܕܘܢ ܡܪܝܐ ܒܝܢܝ ܘܠܟ. +\v 6 ܘܐܡ̣ܪ ܐܒܪܡ ܠܣܪܝ ܐܢܬܬܗ\f b \fr 16.6\fr* \fk ܐܢܬܬܗ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܐܡܬܟܝ ܡܫܠܡܐ ܒܐ̈ܝܕܝܟܝ. ܥܒܕܝ ܠܗ̇ ܡܕܡ ܕܫܦܝܪ ܒܥܝܢ̈ܝܟܝ. ܘܨܥܪܬܗ̇ ܣܪܝ ܡܪܬܗ̇\f c \fr 16.6\fr* \fk ܡܪܬܗ̇\fk* \ft om. 5b1\ft*\f*. ܘܥܪܩܬ ܡܢ ܩܕܡܝܗ̇. +\v 7 ܘܐܫܟܚܗ̇ ܡܠܐܟܗ ܕܡܪܝܐ ܥܠ ܥܝܢܐ ܕܡ̈ܝܐ ܒܡܕܒܪܐ ܒܐܘܪܚܐ ܕܓܕܪ. +\v 8 ܘܐܡ̣ܪ ܠܗ̇. ܗܓܪ ܐܡܬܗ̇ ܕܣܪܝ. ܡܢ\f d \fr 16.8\fr* \fk ܡܢ\fk* \ft om. 5b1\ft*\f* ܐܝܡܟܐ ܐܬܝܐ ܐܢܬܝ ܘܠܐܝܟܐ ܐܙܠܐ ܐܢܬܝ. ܘܐܡ̣ܪܬ ܡܢ ܩܕܡ ܣܪܝ ܡܪܬܝ ܥܪܩܐ ܐܢܐ. +\v 9 ܘܐܡ̣ܪ ܠܗ̇ ܡܠܐܟܗ ܕܡܪܝܐ. ܗܦܘܟܝ ܠܘܬ ܡܪܬܟܝ ܘܐܫܬܥܒܕܝ ܬܚܝܬ ܐܝܕܗ̇. +\v 10 ܘܐܡ̣ܪ ܠܗ̇ ܡܠܐܟܗ ܕܡܪܝܐ. ܡܣܓܝܘ ܐܣܓܐ ܙܪܥܟܝ. ܘܠܐ ܢܬܡܢܐ ܡܢ ܣܘܓܐܗ. +\v 11 ܘܐܡ̣ܪ ܠܗ̇ ܡܠܐܟܗ ܕܡܪܝܐ. ܗܐ ܒܛܢܬܝ ܘܝܠܕܐ ܐܢܬܝ ܒܪܐ. ܘܬܩܪܝܢ ܫܡܗ ܐܝܫܡܥܝܠ. ܡܛܠ ܕܫܡ̣ܥ ܡܪܝܐ\f e \fr 16.11\fr* \fk ܐܠܗܐ\fk* \ft 12b2\ft*\f* ܒܫܘܥܒܕܟܝ. +\v 12 ܘܗ̣ܘ ܢܗܘܐ ܥܪܕܐ ܕܒܢ̈ܝ ܐܢܫܐ. ܐܝܕܗ ܥܠ ܟܠ ܘܐܝܕܐ ܕܟܠ ܒܗ. ܘܥܠ ܬܚܘܡܐ ܕܟܠܗܘܢ ܐ̈ܚܘܗܝ ܢܫܪܐ. +\v 13 ܘܩ̣ܪܬ ܫܡܗ ܕܡܪܝܐ ܕܡܠܠ ܥܡܗ̇. ܘܐܡ̣ܪܬ ܐܢܬ ܗ̣ܘ ܐܠܗܐ ܒܚܙܘܐ. ܡܛܠ ܕܐܡ̣ܪܬ. ܕܗܐ ܐܦ ܚܙܘܐ ܚ̇ܙܝܬ ܡܢ ܒܬܪ ܕܚܙܢܝ. +\v 14 ܡܛܠ ܗܢܐ ܩܪܬ ܠܒܪܐ ܗ̇ܝ\f f \fr 16.14\fr* \fk ܗ̇ܝ\fk* \ft om. 5b1*\ft*\f* ܒܪܐ ܕܚܝܐ ܚܙܢܝ. ܗܐ ܗ̣ܝ ܒܝܬ ܪܩܡ ܠܒܝܬ ܓܕܪ. +\v 15 ܘܝܠ̣ܕܬ ܗܓܪ ܠܐܒܪܡ ܒܪܐ. ܘܩ̣ܪܐ ܐܒܪܡ ܫܡ ܒܪܗ ܕܐܬܝܠܕ ܠܗ\f g \fr 16.15\fr* \fk ܕܐܬܝܠܕ ܠܗ\fk* \ft om. 5b1, M, U, L\ft*\f* ܕܝܠ̣ܕܬ ܠܗ\f h \fr 16.15\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܗܓܪ ܐܝܫܡܥܝܠ. +\v 16 ܘܐܒܪܡ ܒܪ ܬܡܢܐܝܢ ܗܘܐ ܘܫܬ ܫ̈ܢܝܢ. ܟܕ ܝܠ̣ܕܬ ܗܓܪ ܐܝܫܡܥܝܠ\f i \fr 16.16\fr* \fk ܠ\fk* \ft Ai\ft*\f* ܠܐܒܪܡ. +\c 17 +\v 1 ܘܗܘ̣ܐ ܐܒܪܡ ܒܪ ܬܫܥܝܢ ܘܬܫܥ ܫ̈ܢܝܢ. ܘܐܬܓܠܝ ܡܪܝܐ ܥܠ ܐܒܪܡ ܘܐܡ̣ܪ ܠܗ. ܐܢܐ ܐܢܐ ܐܠܫܕܝ\f a \fr 17.1\fr* \fk ܐܠܫܕܝ\fk* \ft om. 5b1\ft*\f* ܐܠܗܐ. ܫܦ̣ܪ ܩܕܡܝ ܘܗܘܝ ܕܠܐ ܡܘܡ. +\v 2 ܘܐܬܠ ܩܝܡܝ ܒܝܢܝ ܘܠܟ. ܘܐܣܓܝܟ ܛܒ ܛܒ\f b \fr 17.2\fr* \fk ܛܒ\fk* \ft om. 5b1\ft*\f*. +\v 3 ܘܢܦ̣ܠ ܐܒܪܡ ܥܠ ܐ̈ܦܘܗܝ. ܘܡܠܠ ܥܡܗ ܐܠܗܐ ܘܐܡ̣ܪ ܠܗ. +\v 4 ܐܢܐ ܗܐ ܡܩܝܡ ܐܢܐ ܩܝܡܝ ܥܡܟ. ܘܬܗܘܐ ܐܒܐ ܠܣܘܓܐܐ ܕܥܡ̈ܡܐ. +\v 5 ܘܠܐ ܢܬܩܪܐ ܬܘܒ ܫܡܟ ܐܒܪܡ. ܐܠܐ ܢܗܘܐ ܫܡܟ ܐܒܪܗܡ. ܡܛܠ ܕܐܒܐ ܠܣܘܓܐܐ ܕܥܡ̈ܡܐ ܝܗܒܬܟ. +\v 6 ܘܐܦܪܝܟ ܘܐܣܓܝܟ ܛܒ ܛܒ\f c \fr 17.6\fr* \fk ܛܒ\fk* \ft om. 5b1\ft*\f*. ܘܐܬܠܟ ܠܥܡ̈ܡܐ ܘܡ̈ܠܟܐ ܡܢ ܚܨܟ\f d \fr 17.6\fr* \fk ܡܢܟ\fk* \ft 5b1\ft*\f* ܢܦܩܘܢ. +\v 7 ܘܐܩܝܡ ܩܝܡܝ ܒܝܢܝ ܘܠܟ. ܘܒܝܬ ܙܪܥܟ ܡܢ ܒܬܪܟ ܠܕܪ̈ܝܗܘܢ. ܠܩܝܡܐ ܕܠܥܠܡ. ܘܐܗܘܐ ܠܟ ܐܠܗܐ ܘܠܙܪܥܟ ܡܢ ܒܬܪܟ. +\v 8 ܘܐܬܠ ܠܟ ܘܠܙܪܥ̇ܟ ܡܢ ܒܬܪܟ. ܐܪܥܐ ܕܡܥܡܪܟ. ܟܠܗ̇ ܐܪܥܐ ܕܟܢܥܢ ܠܝܘܪܬܢܐ ܕܠܥܠܡ. ܘܐܗܘܐ ܠܗܘܢ ܐܠܗܐ. +\v 9 ܘܐܡ̣ܪ ܐܠܗܐ ܠܐܒܪܗܡ. ܐܢܬ ܩܝܡܝ ܛܪ. ܐܢܬ ܘܙܪܥܟ ܡܢ ܒܬܪܟ ܠܕܪ̈ܝܗܘܢ. +\v 10 ܗܢܘ ܩܝܡܝ ܕܬܛܪܘܢ ܒܝܢܝ ܘܠܟܘܢ. ܘܒܝܬ ܙܪܥܟ ܡܢ ܒܬܪܟ. ܕܬܓܙܪܘܢ ܟܠ ܕܟܪܐ. +\v 11 ܘܬܓܙܪܘܢ ܒܣܪܐ ܕܥܘܪܠܘܬܟܘܢ. ܘܬܗܘܐ ܐܬܐ ܕܩܝܡܐ ܒܝܢܝ ܘܠܟܘܢ. +\v 12 ܘܒܪ ܬܡܢܝܐ ܝܘܡ̈ܝܢ ܢܓܙܘܪ ܡܢܟܘܢ ܟܠ ܕܟܪܐ ܠܕܪ̈ܝܟܘܢ. ܝܠܝܕ ܒܝܬܐ ܘܙܒܝܢ ܟܣܦܐ. ܡܢ ܟܠ ܒܪ ܢܘܟܪ̈ܝܐ ܕܠܐ ܗܘ̣ܐ ܡܢ ܙܪܥܟ. +\v 13 ܡܓܙܪ ܢܓܙܘܪ. ܝܠܝܕ ܒܝܬܟ ܘܙܒܝܢ ܟܣܦܟ. ܘܢܗܘܐ ܩܝܡܝ ܒܒܣܪܟܘܢ ܠܩܝܡܐ ܕܠܥܠܡ. +\v 14 ܘܥܘܪܠܐ ܕܟܪܐ ܕܠܐ ܢܓܙܘܪ ܒܣܪܐ ܕܥܘܪܠܘܬܗ. ܬܐܒܕ ܢܦܫܐ ܗ̇ܝ ܡܢ ܥܡܗ̇. ܩܝܡܝ\f e \fr 17.14\fr* \fk ܕ\fk* \ft 5b1c\ft*\f* ܒ̇ܛܠܬ. +\v 15 ܘܐܡ̣ܪ ܐܠܗܐ ܠܐܒܪܗܡ. ܣܪܝ ܐܢܬܬܟ ܠܐ ܬܩܪܐ ܫܡܗ̇ ܣܪܝ. ܡܛܠ ܕܣܪܐ ܫܡܗ̇. +\v 16 ܘܐܒܪܟܝܗ̇ ܘܐܦ ܐܬܠ ܠܟ ܡܢܗ̇ ܒܪܐ. ܘܐܒܪܟܝܘܗܝ ܘܢܗܘܐ ܠܥܡ̈ܡܐ. ܘܡ̈ܠܟܐ ܕܥܡ̈ܡܐ ܡܢܗ ܢܗܘܘܢ. +\v 17 ܘܢܦ̣ܠ ܐܒܪܗܡ ܥܠ ܐ̈ܦܘܗܝ ܘܓܚܟ. ܘܐܡ̣ܪ ܒܠܒܗ. ܠܒܪ ܡܐܐ ܫܢܝ̈ܢ ܢܬܝܠܕ ܒܪܐ. ܐܘ ܣܪܐ ܒܪܬ ܬܫܥܝܢ ܫ̈ܢܝܢ ܬܐܠܕ. +\v 18 ܘܐܡ̣ܪ ܐܒܪܗܡ ܠܐܠܗܐ. ܐܫܬܘܦ ܕܝܢ ܐܝܫܡܥܝܠ ܢܚ̣ܐ ܩܕܡܝܟ. +\v 19 ܘܐܡ̣ܪ ܐܠܗܐ ܠܐܒܪܗܡ\f f \fr 17.19\fr* \fk ܠܐܒܪܗܡ\fk* \ft om. 5b1\ft*\f* ܫܪܝܪܐܝܬ ܣܪܐ ܐܢܬܬܟ ܝܠܕܐ ܠܟ ܒܪܐ. ܘܩ̇ܪܐ ܐܢܬ ܫܡܗ ܐܝܣܚܩ. ܘܐܩܝܡ ܩܝܡܝ ܥܡܗ ܠܩܝܡܐ ܕܠܥܠܡ. ܘܠܙܪܥܗ\f g \fr 17.19\fr* \fk ܘܥܡ ܙܪܥܗ\fk* \ft 12b1\ft*\f* ܡܢ ܒܬܪܗ. +\v 20 ܘܥܠ ܐܝܫܡܥܝܠ ܫܡܥܬܟ. ܗܐ ܒܪܟܬܗ ܘܐܣܓܝܬܗ. ܘܐܟܒܪܬܗ ܛܒ ܛܒ. ܬܪܥܣܪ̈ ܪ̈ܘܪܒܢܝܢ ܢܘܠܕ ܘܐܬܠܝܘܗܝ ܠܥܡܐ ܪܒܐ. +\v 21 ܘܩܝܡܝ ܐܩܝܡ †ܥܡ†\f h \fr 17.21\fr* \fk ܥܠ\fk* \ft 7a1\ft*\f* ܐܝܣܚܩ. ܕܬܐܠܕ ܠܟ ܣܪܐ ܠܙܒܢܐ ܗܢܐ ܠܫܢܬܐ ܐܚܪܬܐ. +\v 22 ܘܟܕ ܫ̇ܠܡ ܠܡܡܠܠܘ ܥܡܗ. ܐܬܪܝܡ ܐܠܗܐ ܡܢ ܐܒܪܗܡ. +\v 23 ܘܕܒ̣ܪ ܐܒܪܗܡ ܠܐܝܫܡܥܝܠ ܒܪܗ. ܘܠܟܠ ܝ̈ܠܝܕܝ ܒܝܬܗ ܘܠܟܠ ܙܒܝܢ̈ܝ ܟܣܦܗ. ܟܠ ܕܟܪܐ ܒܐܢܫ̈ܝ ܒܝܬ ܐܒܪܗܡ. ܘܓܙ̣ܪ ܒܣܪܐ †ܕܥܘܪܠܘܬܗܘܢ† ܒܗ ܒܝܘܡܐ ܗܢܐ. ܐܝܟ ܕܡܠܠ ܥܡܗ ܐܠܗܐ. +\v 24 ܘܐܒܪܗܡ ܒܪ ܬܫܥܝܢ ܗܘܐ ܘܬܫܥ ܫ̈ܢܝܢ. ܟܕ ܓܙܪ ܒܣܪܐ ܕܥܘܪܠܘܬܗ. +\v 25 ܘܐܝܫܡܥܝܠ ܒܪܗ ܒܪ ܬܠܬܥܣܪܐ ܗܘܐ ܫ̈ܢܝ̣ܢ. ܟܕ ܓܙܪ ܒܣܪܐ ܕܥܘܪܠܘܬܗ. +\v 26 ܒܗ ܒܝܘܡܐ ܗܢܐ. ܓܙܪ ܐܒܪܗܡ ܠܐܝܫܡܥܝܠ ܒܪܗ. +\v 27 ܘܠܟܠܗܘܢ ܐܢܫ̈ܝ ܒܝܬܗ. ܝ̈ܠܝܕܝ ܒܝܬܗ ܘܙܒܝܢ̈ܝ ܟܣܦܗ. ܘܐܦ ܡܢ ܒܢ̈ܝ ܢܘܟܪ̈ܝܐ ܓܙܪ ܥܡܗ. +\c 18 +\v 1 ܘܐܬܓܠܝ ܥܠܘܗܝ ܡܪܝܐ ܒܝܬ ܒܠܘܛܐ ܕܡܡܪܐ ܘܗ̣ܘ ܝܬ̇ܒ ܒܬܪܥܐ ܕܡܫܟܢܐ. ܟܕ ܚܡ ܝܘܡܐ. +\v 2 ܘܐܪܝܡ ܥܝܢ̈ܘܗܝ ܘܚ̣ܙܐ. ܘܗܐ ܬܠܬܐ ܓܒܪ̈ܝܢ ܩܝܡܝܢ ܠܥܠ ܡܢܗ. ܘܚ̣ܙܐ ܐܢܘܢ ܘܪܗܛ ܠܐܘܪܥܗܘܢ ܡܢ ܬܪܥܐ ܕܡܫܟܢܐ. ܘܣܓ̣ܕ ܥܠ ܐܪܥܐ. +\v 3 ܘܐܡ̣ܪ ܡܪܝܐ ܐܢ ܐܫ̇ܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ. ܠܐ ܬܥܒܪ ܡܢ ܥܒ̣ܕܟ. +\v 4 ܐܣܒ ܩܠܝܠ ܡ̈ܝܐ ܘܐܫܝܓܘ ܪ̈ܓܠܝܟܘܢ. ܘܐܣܬܡܟܘ ܬܚܝܬ ܐܝܠܢܐ. +\v 5 ܘܣܒܘ ܦܬܬܐ ܕܠܚܡܐ ܘܣܡܘܟܘ ܠܒܟܘܢ. ܘܒܬܪ ܟܝܢ ܬܥܒܪܘܢ. ܡܛܠ ܕܗܟܢܐ ܥܒܪܬܘܢ ܥܠ ܥܒܕܟܘܢ. ܘܐܡܪܘ. ܗܟܢܐ ܬܥܒܕ ܐܝܟ ܕܐܡ̣ܪܬ. +\v 6 ܘܐܣܬܪܗܒ ܐܒܪܗܡ. ܘܪܗܛ\f a \fr 18.6\fr* \fk ܘܪܗܛ\fk* \ft om. 5b1\ft*\f* ܠܡܫܟܢܐ\f b \fr 18.6\fr* \fk ܠܡܫܟܢܐ\fk* \ft om. 12a1*\ft*\f* ܠܘܬ ܣܪܐ ܘܐܡ̣ܪ. ܒܥܓܠ ܬܠܬ ܣܐ̈ܝܢ ܩܡܚܐ ܢܫܝܦܐ. ܠܘܫܝ ܘܥܒܕܝ ܪܥܦܐ. +\v 7 ܘܠܒܩܪܐ ܪܗܛ ܐܒܪܗܡ. ܘܢܣ̣ܒ ܥܓܠܐ ܚܕ ܕܫܡܝܢ ܘܛܒ. ܘܝܗܒܗ ܠܛܠܝܐ ܘܣܪܗܒ ܕܢܥܒܕܝܘܗܝ. +\v 8 ܘܢܣ̣ܒ ܚܐܘܬܐ ܘܚܠܒܐ ܘܥܓܠܐ ܕܥܒ̣ܕ ܘܣܡ ܩܕܡܝܗܘܢ. ܘܗ̣ܘ ܩܐܡ\f c \fr 18.8\fr* \fk ܗܘܐ\fk* \ft add. E, W, M\ft*\f* ܠܥܠ ܡܢܗܘܢ ܬܚܝܬ ܐܝܠܢܐ ܘܐܟܠܘ. +\v 9 ܘܐܡܪܘ ܠܗ. ܐܝܟܐ ܗܝ ܣܪܐ ܐܢܬܬܟ. ܘܐܡ̣ܪ ܗܐ ܒܡܫܟܢܐ. +\v 10 ܘܐܡ̣ܪ ܠܗ\f d \fr 18.10\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܡܗܦܟ ܐܗܦܘܟ ܠܘܬܟ\f e \fr 18.10\fr* \fk ܠܘܬܟ\fk* \ft om. 11.9b1*\ft*\f* ܠܙܒܢܐ ܗܢܐ ܟܕ ܗ̣ܝ ܚܝܐ. ܘܢܗܘܐ ܒܪܐ ܠܣܪܐ ܐܢܬܬܟ. ܘܣܪܐ ܫܡ̣ܥܬ ܒܬܪܥܐ ܕܡܫܟܢܐ. ܘܗ̣ܘ ܒܣܬܪܗ̇. +\v 11 ܘܐܒܪܗܡ ܘܣܪܐ ܣܐܒܘ ܘܥܠܘ ܒܫܢ̈ܝܐ. ܥܒܪ ܡܢ ܕܠܡܗܘܐ ܠܣܪܐ ܐܘܪܚܐ ܕܢܫ̈ܐ. +\v 12 ܘܓܚ̣ܟܬ ܣܪܐ ܒܠܒܗ̇ ܘܐܡ̣ܪܬ.\f f \fr 18.12\fr* \fk ܡܢ\fk* \ft add. W, E, M\ft*\f* ܒܬܪ ܕܒ̇ܠܝܬ ܗܘܝܐ ܠܝ ܥܠܝܡܘܬܐ. ܘܡܪܝ ܣܐܒ. +\v 13 ܘܐܡ̣ܪ ܡܪܝܐ ܠܐܒܪܗܡ. ܠܡܢܐ ܓܚ̣ܟܬ ܣܪܐ ܘܐܡ̣ܪܬ. ܫܪܝܪܐܝܬ ܐܠܕ ܐܢܐ ܕܣܐܒܬ. +\v 14 ܪܒܐ ܗܝ ܨܒܘܬܐ ܡܢ ܡܪܝܐ. ܕܠܙܒܢܐ ܗܢܐ ܐܗܦܘܟ †ܠܘܬܟ†\f g \fr 18.14\fr* \fk †ܠܘܬܟ†\fk* \ft om. 7a1\ft*\f* ܟܕ ܗ̣ܝ ܚܝܐ. ܘܢܗܘܐ ܒܪܐ ܠܣܪܐ ܐܢܬܬܟ\f h \fr 18.14\fr* \fk ܐܢܬܬܟ\fk* \ft om. 5b1*\ft*\f*. +\v 15 ܘܟܦ̣ܪܬ ܣܪܐ ܘܐܡ̣ܪܬ. ܠܐ ܓܚ̇ܟܬ. ܡܛܠ ܕܕܚ̣ܠܬ. ܘܐܡ̣ܪ\f i \fr 18.15\fr* \fk ܠܗ̇\fk* \ft add. 5b1\ft*\f*. ܠܐ ܒܪܡ ܓܚ̣ܟܬܝ. +\v 16 ܘܩܡܘ ܡܢ ܬܡܢ ܓܒܪ̈ܐ. ܘܚܪܘ ܠܐ̈ܦܝ ܣܕܘܡ. ܘܐܒܪܗܡ ܐܙ̣ܠ ܥܡܗܘܢ ܕܢܠܘܐ ܐܢܘܢ. +\v 17 ܘܡܪܝܐ ܐܡ̣ܪ ܡܟܣ̇ܐ ܐܢܐ ܡܢ ܥܒܕܝ ܐܒܪܗܡ. ܡܕܡ ܕܥܒ̇ܕ ܐܢܐ. +\v 18 ܘܐܒܪܗܡ ܡܗܘܐ ܢܗܘܐ ܠܥܡܐ ܪܒܐ ܘܣܓܝܐܐ. ܘܢܬܒܪܟܘܢ ܒܗ ܟܠܗܘܢ ܥܡ̈ܡܐ ܕܐܪܥܐ. +\v 19 ܡܛܠ ܕܝܕܥ ܐܢܐ ܠܗ ܕܡܦܩ̇ܕ ܠܒܢ̈ܘܗܝ ܘܠܒ̈ܢܝ ܒܝܬܗ. ܡܢ ܒܬܪܗ ܕܢܛܪܘܢ ܐܘܪ̈ܚܬܗ ܕܡܪܝܐ ܠܡܥܒܕ ܙܕܝܩܘܬܐ ܘܕܝܢ̣ܐ. ܡܛܠ ܕܢܝܬܐ ܡܪܝܐ ܥܠ ܐܒܪܗܡ ܡܕܡ\f j \fr 18.19\fr* \fk ܟܘܠ\fk* \ft 5b1\ft*\f* ܕܐܡ̣ܪ ܥܠܘܗܝ. +\v 20 ܘܐܡ̣ܪ ܡܪܝܐ. ܓܥܬܐ ܕܣܕܘܡ ܘܕܥܡܘܪܐ ܥܠ̣ܬ\f k \fr 18.20\fr* \fk ܣܓܝܬ\fk* \ft 5b1\ft*\f* ܩܕܡܝ\f l \fr 18.20\fr* \fk ܩܕܡܝ\fk* \ft om. 5b1\ft*\f*. ܘܚ̈ܛܗܝܗܘܢ ܛܒ ܥܫܢܘ. +\v 21 ܐܚܘܬ ܐܚܙܐ ܐܢ ܐܝܟ ܓܥܬܐ ܕܥܠ̣ܬ ܠܘܬܝ\f m \fr 18.21\fr* \fk ܩܕܡܝ\fk* \ft 12a1\ft*\f* ܥܒܕܘ ܘܫܡܠܝܘ. ܘܐܠܐ ܐܕܥ. +\v 22 ܘܐܬܦܢܝܘ ܡܢ ܬܡܢ ܓܒܪ̈ܐ. ܘܐܙܠܘ ܠܣܕܘܡ. ܘܐܒܪܗܡ ܥܕܟܝܠ ܩܐܡ ܗܘܐ ܩܕܡ ܡܪܝܐ\f n \fr 18.22\fr* \fk ܐܠܗܐ\fk* \ft 5b1\ft*\f*. +\v 23 ܘܩ̣ܪܒ ܐܒܪܗܡ ܘܐܡ̣ܪ. ܒܚܕ ܪܘܓܙܐ ܡܘܒܕ ܐܢܬ ܙܕܝܩ̈ܐ ܥܡ ܚ̈ܛܝܐ. +\v 24 †ܐܢ† ܐܝܬ ܚܡܫܝܢ ܙܕܝܩ̈ܝܢ ܒܓܘ ܩܪܝܬܐ. ܒܪܘܓܙܐ ܚܕ ܡܘܒܕ ܐܢܬ. ܘܠܐ ܫܒ̇ܩ ܐܢܬ ܠܐܬܪܐ ܡܛܠ ܚܡܫܝܢ ܙܕܝܩ̈ܝܢ ܕܒܓܘܗ. +\v 25 ܚܣ ܠܟ ܕܬܥܒܕ\f o \fr 18.25\fr* \fk ܐܝܟ\fk* \ft add. 5b1\ft*\f* ܦܬܓܡܐ ܗܢܐ. ܕܬܩܛܘܠ ܙܟܝܐ ܥܡ\f p \fr 18.25\fr* \fk ܐܝܟ\fk* \ft 7h5\ft*\f* ܚܝ̇ܒܐ. ܘܢܗܘܐ ܙܟܝܐ ܐܝܟ ܚܝ̇ܒܐ. ܚܣ ܠܟ ܕܝ̇ܢܐ ܕܟܠܗ̇ ܐܪܥܐ. ܠܐ ܢܬܥܒܕ ܕܝܢ̣ܐ ܗܢܐ. +\v 26 ܘܐܡ̣ܪ ܡܪܝܐ. ܐܢ ܐܫܟܚ ܒܣܕܘܡ ܚܡܫܝܢ ܙܕܝ̈ܩܝܢ ܒܓܘ ܩܪܝܬܐ ܐܫܒܘܩ ܠܟܠܗ ܐܬܪܐ ܡܛܠܬܗܘܢ. +\v 27 ܘܥܢ̣ܐ ܐܒܪܗܡ ܘܐܡ̣ܪ. ܗܐ ܫ̇ܪܝܬ ܠܡܡܠܠܘ ܩܕܡ ܡܪܝܐ. ܘܐܢܐ ܥܦܪܐ ܐܢܐ ܘܩܛܡܐ. +\v 28 ܘܐܢ ܚܣܝܪ̈ܝܢ ܡܢ ܚܡܫܝܢ ܙܕܝܩ̈ܝܢ ܚܡܫܐ. ܡ̇ܚܒܠ ܐܢܬ ܡܛܠ ܚܡܫܐ ܟܠܗ̇\f q \fr 18.28\fr* \fk ܠ\fk* \ft 12b1\ft*\f* ܩܪܝܬܐ. ܘܐܡ̣ܪ ܠܐ ܐܚ̇ܒܠ. ܐܢ ܐܫܟܚ ܬܡ̇ܢ ܐܪ̈ܒܥܝܢ ܘܚܡܫܐ. +\v 29 ܘܐܘܣܦ ܬܘܒ ܐܒܪܗܡ ܠܡܐܡܪ ܠܗ. ܘܐܢ ܡܫܬܟܚܝܢ ܬܡܢ\f r \fr 18.29\fr* \fk ܬܡܢ\fk* \ft om. 5b1\ft*\f* ܐܪ̈ܒܥܝܢ. ܘܐܡ̣ܪ. ܠܐ ܐܚܒܠ ܐܢ ܐܫܟܚ ܬܡ̇ܢ ܐܪ̈ܒܥܝܢ. +\v 30 ܘܐܡ̣ܪ. ܠܐ ܢܬܒܐܫ ܠܡܪܝܐ ܘܐܡܠܠ. ܘܐܢ ܡܫܬܟܚܝܢ ܬܡ̇ܢ ܬܠܬܝܢ. ܘܐܡ̣ܪ. ܠܐ ܐܚܒܠ ܐܢ ܐܫܟܚ ܬܡܢ ܬܠܬܝܢ. +\v 31 ܘܐܡ̣ܪ\f s \fr 18.31\fr* \fk ܐܒܪܗܡ\fk* \ft add. 5b1\ft*\f*. ܗܐ ܫ̇ܪܝܬ ܠܡܡܠܠܘ ܩܕܡ ܡܪܝܐ. ܘܐܢ ܡܫܬܟܚܝܢ ܬܡ̇ܢ ܥܣܪ̈ܝܢ. ܘܐܡ̣ܪ. ܠܐ ܐܚ̇ܒܠ ܡܛܠ ܥܣܪ̈ܝܢ. +\v 32 ܘܐܡ̣ܪ. ܠܐ ܢܬܒܐܫ ܠܡܪܝܐ ܘܐܡܠܠ. ܒܠܚܘܕ ܙܒܢܬܐ ܗܕܐ. ܘܐܢ ܡܫܬܟܚܝܢ ܬܡ̇ܢ ܥܣܪܐ. ܘܐܡ̣ܪ. ܠܐ ܐܚ̇ܒܠ ܡܛܠ ܥܣܪܐ. +\v 33 ܘܐܙ̣ܠ ܡܪܝܐ ܟܕ ܫ̇ܠܡ ܠܡܡܠܠܘ ܥܡ ܐܒܪܗܡ. ܘܐܒܪܗܡ ܗܦ̣ܟ ܠܐܬܪܗ. +\c 19 +\v 1 ܘܐܬܘ ܬܪ̈ܝܢ ܡܠܐ̈ܟܝܢ ܠܣܕܘܡ ܒܪܡܫܐ. ܘܠܘܛ ܝܬ̇ܒ ܒܬܪܥܐ ܕܣܕܘܡ. ܘܚ̣ܙܐ ܐܢܘܢ ܠܘܛ ܘܩܡ ܠܐܘܪܥܗܘܢ. ܘܣܓ̣ܕ ܥܠ ܐ̈ܦܘܗܝ ܥܠ ܐܪܥܐ. +\v 2 ܘܐܡܪ ܒܥ̇ܐ ܐܢܐ ܡܢܟܘܢ ܡܪ̈ܝ. ܣܛܘ ܠܒܝܬ ܥܒܕܟܘܢ. ܘܒܘܬܘ ܘܐܫܝܓܘ ܪ̈ܓܠܝܟܘܢ. ܘܩ̇ܕܡܘ ܙܠܘ ܠܐܘܪܚܟܘܢ ܘܐܡܪܘ. ܠܐ ܒܫܘܩܐ ܢܒܘܬ. +\v 3 ܘܐ̣ܠܨ ܐܢܘܢ ܠܘܛ\f a \fr 19.3\fr* \fk ܠܘܛ\fk* \ft om. 5b1, M\ft*\f* ܛܒ. ܘܣܛܘ ܠܘܬܗ ܘܥܠܘ ܠܒܝܬܗ. ܘܥܒ̣ܕ ܠܗܘܢ ܡܫܬܝܐ. ܘܦܛܝܪܐ ܐܦܐ ܠܗܘܢ ܘܠܥܣܘ. +\v 4 ܘܥܕܟܝܠ ܠܐ ܕܡ̣ܟܘ. ܘܐܢܫ̈ܝ ܩܪܝܬܐ ܐܢܫ̈ܝ ܣܕܘܡ ܐܬܟܪ̈ܟܘܗܝ ܠܒܝܬܐ. ܡܢ ܥ̈ܠܝܡܐ ܘܥܕܡܐ ܠܣܒ̈ܐ. ܘܟܠܗ ܥܡܐ ܡܢ ܣܟܗ. +\v 5 ܘܩܪܘ ܠܠܘܛ ܘܐܡܪܘ ܠܗ. ܐܝܟܐ ܐܢܘܢ ܓܒܪ̈ܐ ܕܐܬܘ ܠܘܬܟ ܒܠܠܝܐ. ܐܦܩ ܐܢܘܢ ܠܢ\f b \fr 19.5\fr* \fk ܠܘܬܢ\fk* \ft 12a1\ft*\f* ܘܢܕܥ ܐܢܘܢ. +\v 6 ܘܢܦ̣ܩ ܠܘܛ ܠܘܬܗܘܢ ܠܬܪܥܐ. ܘܬܪܥܐ ܐܚܕܘ ܒܬܪܗ. +\v 7 ܘܐܡ̣ܪ ܠܗܘܢ ܠܘܛ\f c \fr 19.7\fr* \fk ܠܘܛ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܬܒܐܫܘܢ ܐܚ̈ܝ. +\v 8 ܗܐ ܐܝܬ ܠܝ ܬܪ̈ܬܝܢ ܒ̈ܢܢ. ܕܠܐ ܝܕܥ ܐܢܝ̈ܢ ܓܒܪ. ܐܦܩ ܐܢܝ̈ܢ ܠܟܘܢ. ܘܥܒܕܘ ܠܗܝܢ ܐܝܟܢܐ\f d \fr 19.8\fr* \fk ܐܝܟ\fk* \ft 12a1, L\ft*\f* ܕܫܦܝܪ ܒܥܝܢ̈ܝܟܘܢ. ܒܠܚܘܕ ܠܓܒܪ̈ܐ ܗܠܝܢ ܠܐ ܬܥܒܕܘܢ ܡܕܡ. ܡܛܠ ܕܥܠܘ ܠܛܠܠܐ ܕܩܪ̈ܝܬܝ. +\v 9 ܘܐܡ̣ܪܘ ܦܪܘܩ ܠܗܠ. ܘܐܡܪܘ. ܚܕ ܐܬ̣ܐ ܠܡܬܬܘܬܒܘ ܥܡܢ ܘܗܐ ܕܐ̇ܢ ܠܢ ܕܝܢ̈ܐ. ܗܫܐ ܢܒ̣ܐܫ ܠܟ ܡܢ ܕܠܗܘܢ. ܘܐܬܟܬܫ ܥܡ ܓܒܪ̈ܐ ܠܘܛ ܛܒ. ܘܩܪܒܘ ܠܡܬܒܪ ܬܪܥܐ. +\v 10 ܘܐܘܫܛܘ ܓܒܪ̈ܐ ܐ̈ܝܕܝܗܘܢ. ܘܐܥܠܘ ܠܠܘܛ ܠܘܬܗܘܢ\f e \fr 19.10\fr* \fk ܠܘܬܗܘܢ\fk* \ft om. 12a1*\ft*\f* ܠܒܝܬܐ. ܘܬܪܥܐ ܐܚܕܘ. +\v 11 ܘܓܒܪ̈ܐ ܕܒܬܪܥܐ ܕܒܝܬܐ. ܒܠܥܘ ܒܫܪ̈ܓܪܓܝܬܐ. ܡܢ ܙܥܘܪܐ ܘܥܕܡܐ ܠܪܒܐ. ܘܠܐܝܘ ܠܡܫܟܚܘ ܬܪܥܐ\f f \fr 19.11\fr* \fk ܠ\fk* \ft 5b1\ft*\f*. +\v 12 ܘܐܡܪܘ ܓܒܪ̈ܐ ܠܠܘܛ. ܡܢܐ ܥܒ̇ܕ ܐܢܬ\f g \fr 19.12\fr* \fk ܡܟܝܠ\fk* \ft add. 5b1\ft*\f* ܗܪܟܐ. ܚ̈ܬܢܝܟ ܘܒܢܝ̈ܟ ܘܒܢ̈ܬܟ. ܘܟܠ ܕܐܝܬ ܠܟ ܒܩܪܝܬܐ. ܐܦܩ ܡܢ ܐܬܪܐ ܗܢܐ. +\v 13 ܡܛܠ ܕܡܚܒܠܝܢܢ ܠܗ ܠܐܬܪܐ ܗܢܐ. ܡܛܠ ܕܣܠܩܬ ܓܥܬܗܘܢ ܩܕܡ ܡܪܝܐ. ܘܫܕܪܢ ܡܪܝܐ ܠܡܚܒܠܘܬܗ. +\v 14 ܘܢܦ̣ܩ ܠܘܛ ܘܡܠܠ ܥܡ ܚ̈ܬܢܘܗܝ ܢܣ̈ܒܝ ܒܢ̈ܬܗ. ܘܐܡ̣ܪ ܠܗܘܢ\f h \fr 19.14\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܩܘܡܘ ܦܘܩܘ ܡܢ ܐܬܪܐ ܗܢܐ. ܡܛܠ ܕܡܚܒܠ ܠܗ ܡܪܝܐ. ܘܗܘܐ ܐܝܟ ܡ̇ܓܚܟ ܒܥܝܢ̈ܝ ܚ̈ܬܢܘܗܝ. +\v 15 ܘܟܕ ܣܠ̣ܩ ܫܦܪܐ\f i \fr 19.15\fr* \fk ܨܦܪܐ\fk* \ft 5b1\ft*\f*. ܐܠܨܘܗܝ ܡܠܐ̈ܟܐ ܠܠܘܛ ܘܐܡܪ̈ܝܢ ܠܗ. ܩܘܡ ܕܒ̣ܪ ܐܢܬܬܟ\f j \fr 19.15\fr* \fk ܠ\fk* \ft 12b1\ft*\f* ܘܬܪ̈ܬܝܢ ܒܢܬ̈ܟ ܕܐܫܬܟܚ ܕܠܡܐ ܬܒܠܥ ܒܚ̈ܛܗܝܗ̇ ܕܩܪܝܬܐ. +\v 16 ܘܐܫܬܘܚܪ ܠܘܛ. ܘܐܚܕܘ ܡܠܐ̈ܟܐ\f k \fr 19.16\fr* \fk ܓܒܪ̈ܐ\fk* \ft 5b1\ft*\f* ܒܐܝܕܗ ܘܒܐܝܕܐ ܕܐܢܬܬܗ ܘܒܐܝܕܐ ܕܬܪ̈ܬܝܢ ܒܢ̈ܬܗ. ܡܛܠ ܕܚܣ ܡܪܝܐ ܥܠܘܗܝ. ܘܐܦܩܘܗܝ ܘܐܫܪܝܘܗܝ ܠܒܪ ܡܢ ܩܪܝܬܐ. +\v 17 ܘܟܕ ܐܦܩܘ ܐܢܘܢ ܠܒܪ ܐܡܪ̈ܝܢ ܠܗ ܦ̇ܠܛ ܢܦܫܟ †ܠܐ† ܬܬܦܢ̣ܐ ܠܒܣܬܪܟ. ܘܠܐ ܬܩܘܡ ܒܟܠܗ̇ ܦܩܥܬܐ. ܠܛܘܪܐ ܐܬ̇ܦܠܛ ܕܠܐ ܬܐܒܕ. +\v 18 ܘܐܡ̣ܪ ܠܗܘܢ\f l \fr 19.18\fr* \fk ܠܗܘܢ\fk* \ft om. 11.9b1\ft*\f* ܠܘܛ\f m \fr 19.18\fr* \fk ܠܘܛ\fk* \ft om. 12b1\ft*\f*. ܒ̇ܥܐ ܐܢܐ ܡܢܟܘܢ ܡܪ̈ܝ. +\v 19 ܗܐ ܐܫܟܚ ܥܒ̣ܕܟ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ. ܘܣܓܝܐܐ ܗܝ ܛܝܒܘܬܟ ܕܥܒ̣ܕܬ ܥܡܝ. ܠܡܚܝܘ ܢܦܫܝ. ܘܐܢܐ ܠܐ ܡ̇ܫܟܚ ܐܢܐ ܠܡܬܦܠܛܘ ܠܛܘܪܐ. ܕܠܡܐ ܬܕܪܟܢܝ ܒܝܫܬܐ ܘܐܡܘܬ. +\v 20 ܗܐ ܩܪܝܬܐ ܗܕܐ ܩܪܝܒܐ ܗܝ\f n \fr 19.20\fr* \fk ܗܝ\fk* \ft om. 5b1\ft*\f*\f o \fr 19.20\fr* \fk ܠܝ\fk* \ft 7h5\ft*\f* ܠܡܥܪܩ ܠܬܡܢ. ܘܗ̣ܝ\f p \fr 19.20\fr* \fk ܘܗܐ\fk* \ft 5b1*\ft*\f* ܙܥܘܪܝܐ ܗܝ\f q \fr 19.20\fr* \fk ܗܝ\fk* \ft om. 5b1\ft*\f* ܐܬܦܠܛ ܠܬܡܢ. ܗܐ ܙܥܘܪܝܐ ܗܝ ܘܬܚܐ ܢܦܫܝ. +\v 21 †ܘܐܡܪ† ܠܗ. ܗܐ ܢܣ̇ܒܬ ܒܐ̈ܦܝܟ ܐܦ ܒܦܬܓܡܐ ܗܢܐ. ܕܠܐ ܐܗܦܘܟ ܩܪܝܬܐ ܕܐܡ̣ܪܬ. +\v 22 ܒܥܓܠ ܐܬܦܠܛ ܠܬܡܢ. ܡܛܠ ܕܠܐ ܡܫܟܚ ܐܢܐ ܕܐܥܒ̣ܕ ܡܕܡ ܥܕܡܐ ܕܥܐ̇ܠ ܐܢܬ ܠܬܡܢ. ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܫܡܗ̇ ܕܩܪܝܬܐ ܨܥܪ. +\v 23 ܫܡܫܐ ܢܦܩ ܥܠ ܐܪܥܐ. ܘܠܘܛ ܥܠ ܠܨܥܪ. +\v 24 ܘܡܪܝܐ ܐܚܬ ܥܠ ܣܕܘܡ ܘܥܠ ܥܡܘܪܐ. †ܟܒܪܝܬܐ ܘܢܘܪܐ† ܡܢ ܩܕܡ ܡܪܝܐ ܡܢ ܫܡܝܐ. +\v 25 ܘܗ̣ܦܟ ܠܩܘܪ̈ܝܐ ܗܠܝܢ. ܘܠܟܠܗ̇ ܦܩܥܬܐ ܘܠܟܠܗܘܢ ܝܬ̈ܒܝ ܐܪܥܐ\f r \fr 19.25\fr* \fk ܩܘܪ̈ܝܐ\fk* \ft 5b1\ft*\f* ܘܠܡܘܥܝܬܗ̇ ܕܐܪܥܐ. +\v 26 ܘܐܬܦܢܝܬ ܐܢܬܬܗ ܡܢ ܒܣܬܪܗ. ܘܗܘܬ ܩܝܡܬܐ ܕܡܠܚܐ. +\v 27 ܘܩܕܡ ܐܒܪܗܡ ܒܨܦܪܐ. ܠܐܬܪܐ ܕܩܐܡ ܗܘܐ ܬܡ̇ܢ ܩܕܡ ܡܪܝܐ. +\v 28 ܘܚܪ ܠܐ̈ܦܝ ܣܕܘܡ ܘܥܡܘܪܐ. ܘܠܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ ܕܦܩܥܬܐ. ܘܚ̣ܙܐ ܘܗܐ ܣ̇ܠܩ ܬܢܢܗ̇ ܕܐܪܥܐ. ܐܝܟ ܬܢܢܐ ܕܐܬܘܢܐ. +\v 29 ܘܗܘ̣ܐ ܕܟܕ ܚ̇ܒܠ ܐܠܗܐ ܩܘܪ̈ܝܐ\f s \fr 19.29\fr* \fk ܠ\fk* \ft 5b1\ft*\f* ܕܦܩܥܬܐ ܐܬܕܟܪ ܐܠܗܐ\f t \fr 19.29\fr* \fk ܡܪܝܐ\fk* \ft 5b1\ft*\f* ܠܐܒܪܗܡ. ܘܫܕܪ ܠܠܘܛ ܡܢ ܓܘ ܗܦܝܟܬܐ. ܟܕ ܗܦ̣ܟ ܩܘܪ̈ܝܐ ܕܝܬ̇ܒ ܗܘܐ ܒܗܝܢ ܠܘܛ. +\v 30 ܘܣܠ̣ܩ ܠܘܛ ܡܢ ܨܥܪ. ܘܝܬ̣ܒ ܒܛܘܪܐ. ܗ̣ܘ ܘܬܪ̈ܬܝܢ ܒܢ̈ܬܗ ܥܡܗ. ܡܛܠ ܕܕܚ̣ܠ ܠܡܬܒ ܒܨܥܪ. ܘܝܬ̣ܒ ܒܡܥܪܬܐ ܗ̣ܘ\f u \fr 19.30\fr* \fk ܗ̣ܘ\fk* \ft om. 5b1\ft*\f* ܘܬܪ̈ܬܝܢ ܒ̈ܢܬܗ. +\v 31 ܘܐܡ̣ܪܬ ܩܫܝܫܬܐ ܠܙܥܘܪܬܐ. ܗܐ ܐܒܘܢ ܣܐܒ. ܘܓܒܪܐ ܠܝܬ ܒܐܪܥܐ\f v \fr 19.31\fr* \fk ܒܐܬܪܐ\fk* \ft 12a1\ft*\f* ܕܢܥܘܠ ܥܠܝܢ. ܐܝܟ ܐܘܪܚܐ ܕܟܠܗ̇ ܐܪܥܐ. +\v 32 ܬܝ ܢܫܩܐ ܠܐܒܘܢ ܚܡܪܐ. ܘܢܕܡܟ ܥܡܗ. ܘܢܩܝܡ ܡܢ ܐܒܘܢ ܙܪܥܐ. +\v 33 ܘܐܫܩܝ ܒܠܠܝܐ ܗ̇ܘ ܠܐܒܘܗܝܢ ܚܡܪܐ. ܘܥܠ̣ܬ ܩܫܝܫܬܐ ܘܕܡܟ̣ܬ ܥܡ ܐܒܘܗ̇. ܘܠܐ ܝܕܥ ܒܡܕܡܟܗ̇ ܘܒܡܩܡܗ̇. +\v 34 ܘܗܘ̣ܐ ܠܒܬܪ ܝܘܡܐ. ܘܐܡ̣ܪܬ ܩܫܝܫܬܐ ܠܙܥܘܪܬܐ. ܗܐ ܕܡ̇ܟܬ ܒܪܡܫܐ ܥܡ ܐܒܝ. ܢܫܩܝܘܗܝ ܚܡܪܐ ܐܦ ܒܠܠܝܐ ܗܢܐ. ܘܥܘܠܝ ܕܡܟܝ ܥܡܗ. ܘܢܩܝܡ ܡܢ ܐܒܘܢ ܙܪܥܐ. +\v 35 ܘܐܫܩܝܝܗܝ ܐܦ ܒܠܠܝܐ ܗ̇ܘ ܠܐܒܘܗܝܢ ܚܡܪܐ. ܘܥܠܬ ܙܥܘܪܬܐ ܘܕܡܟ̣ܬ ܥܡܗ. ܘܠܐ ܝܕܥ ܒܡܕܡܟܗ̇ ܘܒܡܩܡܗ̇. +\v 36 ܘܒܛܢ ܬܪ̈ܬܝܗܝܢ ܒܢ̈ܬܗ ܕܠܘܛ ܡܢ ܐܒܘܗܝܢ. +\v 37 ܘܝܠ̣ܕܬ ܩܫܝܫܬܐ ܒܪܐ. ܘܩܪܬ ܫܡܗ ܡܘܐܒ. ܗܘܝܘ ܐܒܘܗܘܢ ܕܡܘܐ̈ܒܝܐ ܥܕܡܐ ܠܝܘܡܢܐ. +\v 38 ܘܙܥܘܪܬܐ ܐܦ ܗ̣ܝ ܝܠ̣ܕܬ ܒܪܐ. ܘܩܪܬ ܫܡܗ ܒܪ ܥܡܝ. ܗܘܝܘ ܐܒܘܗܘܢ ܕܒܢ̈ܝ ܥܡܘܢ ܥܕܡܐ ܠܝܘܡܢܐ. +\c 20 +\v 1 ܘܫܩ̣ܠ ܡܢ ܬܡܢ ܐܒܪܗܡ ܠܐܪܥܐ ܕܬܝܡܢܐ. ܘܝܬܒ ܒܝܬ ܪܩܡ ܠܒܝܬ ܓܕܪ\f a \fr 20.1\fr* \fk ܠܓܕܪ\fk* \ft 12a1, 12b1mg\ft*\f*. ܘܥܡ̣ܪ ܐܒܪܗܡ ܒܓܕܪ. +\v 2 ܘܐܡ̣ܪ ܐܒܪܗܡ ܥܠ ܣܪܐ ܐܢܬܬܗ ܕܚܬܝ ܗܝ. ܘܫܕܪ ܐܒܝܡܠܟ ܡ̇ܠܟܐ ܕܓܕܪ ܘܕܒܪܗ̇ ܠܣܪܐ. +\v 3 ܘܐܬ̣ܐ ܐܠܗܐ ܥܠ ܐܒܝܡܠܟ ܒܚܠܡܐ ܕܠܠܝܐ ܘܐܡ̣ܪ ܠܗ. ܗܐ ܡܐܬ ܐܢܬ ܥܠ ܐ̈ܦܝ ܐܢܬܬܐ ܕܕܒ̣ܪܬ. ܡܛܠ ܕܐܢܬܬ ܓܒܪܐ ܗܝ. +\v 4 ܘܐܒܝܡܠܟ ܠܐ ܩ̣ܪܒ ܠܗ̇. ܘܐܡ̣ܪ ܐܒܝܡܠܟ. ܡܪܝܐ\f b \fr 20.4\fr* \fk ܐܠܗܐ\fk* \ft add. 5b1\ft*\f* ܐܦ ܥܡܐ ܙܟܝܐ ܩ̇ܛܠ ܐܢܬ. +\v 5 ܗܐ ܗ̣ܘ ܐܡ̣ܪ\f c \fr 20.5\fr* \fk ܠܝ\fk* \ft add. 5b1\ft*\f* ܕܚܬܝ ܗܝ. ܘܐܦ ܗ̣ܝ ܐܡ̣ܪܬ ܕܐܚܝ ܗ̣ܘ. †ܒܬܡܝܡܘܬ† ܠܒܝ ܘܒܕܟܝܘܬܐ ܕܐ̈ܝܕܝ ܥܒ̇ܕܬ ܗܕܐ. +\v 6 ܘܐܡ̣ܪ ܠܗ ܐܠܗܐ ܒܚܠܡܐ. ܘܐܦ ܐܢܐ ܝܕܥ ܐܢܐ. ܕܒܬܡܝܡܘܬ ܠܒܟ ܥܒ̣ܕܬ ܗܕܐ. ܘܚܣܟܬܟ ܐܦ ܐܢܐ ܕܠܐ ܬܚܛܐ ܠܝ. ܡܛܠ ܗܢܐ ܠܐ ܫܒܩܬܟ ܠܡܩܪܒ ܠܗ̇. +\v 7 ܗܫܐ ܐܗܦܟ ܐܢܬܬ ܓܒܪܐ. ܡܛܠ ܕܢܒܝܐ ܗܘ. ܘܢܨܠܐ ܥܠܝܟ ܘܬܚܐ. ܘܐܢ ܠܐ ܡܗܦܟ ܐܢܬ. ܕܥ ܕܡܡܬ ܡܐܬ ܐܢܬ. ܐܢܬ ܘܟܠ ܕܐܝܬ ܠܟ. +\v 8 ܘܩ̇ܕܡ\f d \fr 20.8\fr* \fk ܘܩܡ\fk* \ft 12a1\ft*\f* ܐܒܝܡܠܟ ܒܫܦܪܐ\f e \fr 20.8\fr* \fk ܒܨܦܪܐ\fk* \ft 5b1\ft*\f*. ܘܩ̣ܪܐ ܠܟܠܗܘܢ ܥܒ̈ܕܘܗܝ. ܘܡܠܠ ܟܠܗܝܢ ܡ̈ܠܐ ܗܠܝܢ ܒܐ̈ܕܢܝܗܘܢ. ܘܕܚܠܘ ܐܢܫܐ ܛܒ. +\v 9 ܘܩ̣ܪܐ ܐܒܝܡܠܟ ܠܐܒܪܗܡ ܘܐܡ̣ܪ ܠܗ. ܡܢܐ ܥܒ̇ܕܬ ܠܟ ܘܡܢܐ ܚܛܝܬ ܠܟ. ܕܐܝܬܝܬ ܥܠܝ ܘܥܠ ܡܠܟܘܬܝ ܚܛܗܐ ܪܒܐ. ܥܒ̈ܕܐ ܕܠܐ ܡܬܥܒܕܝܢ ܥܒ̣ܕܬ ܥܡܝ. +\v 10 ܘܐܡ̣ܪ ܐܒܝܡܠܟ ܠܐܒܪܗܡ. ܡܢܐ ܚ̣ܙܝܬ ܕܥܒ̣ܕܬ ܦܬܓܡܐ ܗܢܐ. +\v 11 ܘܐܡ̣ܪ ܐܒܪܗܡ. ܡܛܠ ܕܐܡ̇ܪܬ. ܕܠܡܐ ܠܝܬ ܕܚܠܬܗ ܕܐܠܗܐ ܒܐܬܪܐ ܗܢܐ. ܘܢܩܛܠܘܢܢܝ ܥܠ ܐ̈ܦܝ ܐܢܬܬܝ. +\v 12 ܒܪܡ ܫܪܝܪܐܝܬ ܚܬܝ ܗܝ. ܒܪܬ ܐܒܝ ܘܠܐ ܒܪܬ ܐܡܝ. ܘܗܘܬ ܠܝ ܐܢܬܬܐ. +\v 13 ܘܗܘ̣ܐ ܕܟܕ\f f \fr 20.13\fr* \fk ܘܟܕ\fk* \ft 5b1\ft*\f* ܐܦܩܢܝ ܐܠܗܐ ܡܢ ܒܝܬ ܐܒܝ. ܐܡ̇ܪܬ ܠܗ̇\f g \fr 20.13\fr* \fk ܕܥܝ ܐܢܬܝ\fk* \ft add. 12b2\ft*\f*. ܗܕܐ ܛܝܒܘܬܐ ܕܬܥܒܕܝܢ ܥܡܝ. ܒܟܠ ܐܬܪ ܕܐܙܠܝܢ ܚܢܢ ܠܬܡܢ. ܐܡܪܝ ܥܠܝ ܕܐܚܝ ܗܘ. +\v 14 ܘܕܒ̣ܪ ܐܒܝܡܠܟ ܥܢܐ ܘܬܘܪ̈ܐ ܘܥܒ̈ܕܐ ܘܐ̈ܡܗܬܐ. ܘܝܗ̣ܒ ܠܐܒܪܗܡ ܘܦܢܝ ܠܗ ܠܣܪܐ ܐܢܬܬܗ. +\v 15 ܘܐܡ̣ܪ ܐܒܝܡܠܟ ܠܐܒܪܗܡ\f h \fr 20.15\fr* \fk ܠܐܒܪܗܡ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܐܪܥܝ ܩܕܡܝܟ. ܟܪ ܕܫܦܝܪ\f i \fr 20.15\fr* \fk ܕܫܦ̇ܪ\fk* \ft U\ft*\f* ܒܥܝܢ̈ܝܟ ܬܒ. +\v 16 ܘܠܣܪܐ ܐܡ̣ܪ. ܗܐ ܝܗ̇ܒܬ ܐܠܦ ܕܟܣܦ ܠܐܚܘܟܝ. ܘܗܐ ܐܦ\f j \fr 20.16\fr* \fk ܐܦ\fk* \ft om. 5b1, 7k4\ft*\f* ܗ̣ܘ ܝܗܝܒ ܠܟܝ. ܚܠܦ ܕܚܦܝܬܝ ܥܝ̈ܢܐ ܕܟܠ ܕܥܡܝ. ܘܥܠ ܟܠ ܡܕܡ\f k \fr 20.16\fr* \fk ܟܠ\fk* \ft 5b1\ft*\f* ܐܟܣܬܝܢܝ. +\v 17 ܘܨܠܝ ܐܒܪܗܡ ܩܕܡ ܐܠܗܐ. ܘܐܣܝ ܐܠܗܐ ܠܐܒܝܡܠܟ ܘܠܐܢܬܬܗ ܘܠܐ̈ܡܗܬܗ ܘܝܠ̣ܕ. +\v 18 ܡܛܠ ܕܡܐܚܕ ܐܚܕ ܡܪܝܐ ܒܐ̈ܦܝ ܟܠ ܡܪܒܥܐ ܕܒܝܬ ܐܒܝܡܠܟ. ܡܛܠ ܣܪܐ ܐܢܬܬܗ ܕܐܒܪܗܡ. +\c 21 +\v 1 ܘܡܪܝܐ ܐܬܕܟܪ ܠܣܪܐ ܐܝܟ ܕܐܡ̣ܪ. ܘܥܒ̣ܕ ܡܪܝܐ ܠܣܪܐ ܐܝܟ ܕܡܠܠ\f a \fr 21.1\fr* \fk ܕܐܡܪ\fk* \ft 12b2txt\ft*\f*. +\v 2 ܘܒܛܢ̣ܬ ܣܪܐ ܘܝܠܕܬ †ܠܐܒܪܗܡ ܒܪܐ† ܠܣܝܒܘܬܗ. ܠܙܒܢܐ ܕܡܠܠ ܥܡܗ ܐܠܗܐ. +\v 3 ܘܩ̣ܪܐ ܐܒܪܗܡ ܫܡ ܒܪܗ ܕܐܬܝܠܕ ܠܗ ܕܝܠ̣ܕܬ ܠܗ ܣܪܐ ܐܝܣܚܩ. +\v 4 ܘܓܙܪ ܐܒܪܗܡ ܠܐܝܣܚܩ ܒܪܗ ܒܪ ܬܡܢܝܐ ܝܘܡ̈ܝܢ. ܐܝܟ ܕܦܩܕܗ ܐܠܗܐ. +\v 5 ܘܐܒܪܗܡ ܒܪ ܡܐܐ ܗܘܐ ܫ̈ܢܝܢ. ܟܕ ܐܬܝܠܕ ܠܗ ܐܝܣܚܩ ܒܪܗ. +\v 6 ܘܐܡ̣ܪܬ ܣܪܐ. ܚܕܘܬܐ ܪܒܬܐ\f b \fr 21.6\fr* \fk ܪܒܬܐ\fk* \ft om. 5b1\ft*\f* ܥܒ̣ܕ ܠܝ ܐܠܗܐ ܝܘܡܢܐ\f c \fr 21.6\fr* \fk ܝܘܡܢܐ\fk* \ft om. 5b1\ft*\f*. ܟܠ ܕܫ̇ܡܥ ܢܚܕܐ ܠܝ. +\v 7 ܘܐܡ̣ܪܬ\f d \fr 21.7\fr* \fk ܣܪܝ\fk* \ft add. 5b1\ft*\f*. ܡ̇ܢ †ܐܡܪ† ܠܐܒܪܗܡ ܕܬܝܢܩ ܒ̈ܢܝܐ ܣܪܐ. ܕܝܠ̣ܕܬ ܠܗ ܒܪܐ ܠܣܝܒܘܬܗ. +\v 8 ܘܪܒܐ ܛܠܝܐ ܘܐܬܚܣܠ. ܘܥܒ̣ܕ ܐܒܪܗܡ ܡܫܬܝܐ ܪܒܐ\f e \fr 21.8\fr* \fk ܪܒܐ\fk* \ft om. U\ft*\f* ܒܝܘܡܐ ܕܐܬܚܣܠ ܐܝܣܚܩ. +\v 9 ܘܚܙܬ ܣܪܐ ܠܒܪ ܗܓܪ ܡܨܪܝܬܐ ܕܝܠ̣ܕܬ ܠܐܒܪܗܡ ܡܓܚܟ. +\v 10 ܘܐܡܪܬ ܠܐܒܪܗܡ. ܐܦܩܝܗ̇ ܠܐܡܬܐ ܗܕܐ ܘܠܒܪܗ̇. ܡܛܠ ܕܠܐ ܢܐܪܬ ܒܪ ܐܡܬܐ ܗܢܐ ܥܡ ܒܪܝ ܐܝܣܚܩ. +\v 11 ܘܐܬܒܐܫ ܦܬܓܡܐ ܛܒ. ܒܥܝܢ̈ܝ ܐܒܪܗܡ ܥܠ ܨܒܘܬܐ ܕܒܪܗ. +\v 12 ܘܐܡ̣ܪ ܐܠܗܐ ܠܐܒܪܗܡ. ܠܐ ܢܬܒܐܫ ܒܥܝܢ̈ܝܟ ܥܠ ܛܠܝܐ ܘܥܠ ܐܡܬܟ. ܟܠ ܕܐܡܪܐ ܠܟ ܣܪܐ ܫܡ̣ܥ ܒܩܠܗ̇. ܡܛܘܠ ܕܒܐܝܣܚܩ ܢܬܩܪܐ ܠܟ ܙܪܥܐ. +\v 13 ܘܐܦ ܒܪܗ̇ ܕܐܡܬܐ ܠܥܡܐ ܪܒܐ\f f \fr 21.13\fr* \fk ܪܒܐ\fk* \ft om. 5b1\ft*\f* ܐܥܒܕܝܘܗܝ. ܡܛܠ ܕܙܪܥܟ ܗ̣ܘ. +\v 14 ܘܩ̇ܕܡ ܐܒܪܗܡ ܒܨܦܪܐ. ܘܢܣ̣ܒ ܠܚܡܐ ܘܪܩܒܐ ܕܡ̈ܝܐ ܘܝܗ̣ܒ ܠܗܓܪ. ܘܣܡ ܥܠ ܟܬܦܗ̇ ܘܠܛܠܝܐ ܘܫܕܪܗ̇ ܘܐܙ̣ܠܬ. ܘܛܥ̣ܬ ܒܡܕܒܪܐ ܕܒܪܫܒܥ. +\v 15 ܘܓܡܪܘ ܡ̈ܝܐ ܡܢ ܪܩܒܐ. ܘܐܪܡܝܬܗ ܠܛܠܝܐ ܬܚܝܬ ܚܕ ܡܢ ܣܝܚ̈ܐ. +\v 16 ܘܐܙ̣ܠܬ ܘܝܬ̣ܒܬ\f g \fr 21.16\fr* \fk ܝܬܒܬ ܠܗ̇\fk* \ft 5b1\ft*\f* ܡܢ ܩܒܘܠ. ܐܪܚܩܬ ܐܝܟ ܡܫܕܐ ܒܩܫܬܐ. ܡܛܠ ܕܐܡ̣ܪܬ ܕܠܐ ܐܚܙܐ ܒܡܘܬܗ ܕܛܠܝܐ. ܘܝܬ̣ܒܬ ܡܢ ܩܒܘܠ ܘܐܪܝܡ̣ܬ ܩܠܗ̇ ܘܒܟ̣ܬ. +\v 17 ܘܫܡ̣ܥ ܐܠܗܐ ܒܩܠܗ ܕܛܠܝܐ. ܘܩ̣ܪܐ ܡܠܐܟܗ ܕܐܠܗܐ ܠܗܓܪ ܡܢ ܫܡܝܐ ܘܐܡ̣ܪ ܠܗ̇. ܡܐ ܠܟܝ ܗܓܪ ܠܐ ܬܕܚܠܝܢ. ܡܛܠ ܕܫܡ̣ܥ ܐܠܗܐ ܒܩܠܗ ܕܛܠܝܐ ܐܬܪ ܕܗ̣ܘ\f h \fr 21.17\fr* \fk ܕܬܡܢ ܗܘ\fk* \ft 5b1\ft*\f*. +\v 18 ܩܘܡܝ ܫܩܘܠܝ ܠܛܠܝܐ ܘܚܡܣܢܝ ܐ̈ܝܕܝܟܝ ܒܗ. ܡܛܠ ܕܠܥܡܐ ܪܒܐ ܐܥܒܕܝܘܗܝ. +\v 19 ܘܦܬ̣ܚ ܐܠܗܐ ܥܝܢ̈ܝܗ̇. ܘܚܙܬ ܒܪܐ ܕܡ̈ܝܐ. ܘܐܙܠ̣ܬ ܘܡ̣ܠܬ ܪܩܒܐ †ܡ̈ܝܐ†\f i \fr 21.19\fr* \fk ܕ\fk* \ft 5b1, 7a1\ft*\f* ܘܐܫܩܝܬܗ ܠܛܠܝܐ. +\v 20 ܘܗܘܐ ܐܠܗܐ ܥܡܗ ܥܡ ܛܠܝܐ. ܘܪܒ̣ܐ ܘܝܬ̣ܒ ܒܡܕܒܪܐ ܕܦܪܢ. ܘܝ̇ܠܦ ܗܘܐ ܩܫܬܐ. +\v 21 ܒܡܕܒܪܐ ܕܦܪܢ. ܘܢܣܒܬ ܠܗ ܐܡܗ ܐܢܬܬܐ ܡܢ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 22 ܘܗܘ̣ܐ ܒܙܒܢܐ ܗ̇ܘ. ܘܐܡ̣ܪ ܐܒܝܡܠܟ ܘܦܝܟܠ ܪܒ ܚܝܠܗ ܠܐܒܪܗܡ. ܐܠܗܐ ܥܡܟ ܒܟܠ ܕܥܒ̇ܕ ܐܢܬ. +\v 23 ܘܗܫܐ ܝܡܝ ܠܝ ܒܐܠܗܐ ܗܪܟܐ. ܕܠܐ ܬܕܓܠ ܒܝ ܘܒܛܘܗܡܝ ܘܒܫܪܒܬܝ. ܘܐܝܟ ܛܝܒܘܬܐ ܕܥܒ̇ܕܬ ܥܡܟ ܥܒ̣ܕ ܥܡܝ. ܘܥܡ ܐܪܥܐ ܕܥܡ̣ܪܬ ܒܗ̇. +\v 24 ܘܐܡ̣ܪ ܐܒܪܗܡ ܐܢܐ ܐܡܐ. +\v 25 ܘܐܟܣ ܐܒܪܗܡ ܠܐܒܝܡܠܟ ܥܠ ܨܒܘܬܐ ܕܒܪܐ ܕܡ̈ܝܐ. ܕܚܦܪܘ ܥܒ̈ܕܘܗܝ ܕܐܒܪܗܡ ܘܫܩܠܘܗ̇ ܥܒ̈ܕܘܗܝ ܕܐܒܝܡܠܟ. +\v 26 ܘܐܡ̣ܪ ܐܒܝܡܠܟ. ܠܐ ܝܕܥ̇ܬ ܡܢܘ ܥܒ̣ܕ ܦܬܓܡܐ ܗܢܐ. ܘܐܦ ܐܢܬ ܠܐ ܚܘܝܬܢܝ. ܘܐܦ ܐܢܐ ܠܐ ܫܡ̇ܥܬ. ܐܠܐ ܐܢ ܝܘܡܢܐ. +\v 27 ܘܕܒ̣ܪ ܐܒܪܗܡ ܥܢܐ ܘܬܘܪ̈ܐ. ܘܝܗ̣ܒ ܠܐܒܝܡܠܟ. ܘܐܩܝܡܘ ܬܪ̈ܝܗܘܢ ܩܝܡܐ. +\v 28 ܘܐܩܝܡ ܐܒܪܗܡ ܫܒܥ ܦܪ̈ܬܐ ܕܥܢܐ ܒܠܚܘܕܝܗܝܢ. +\v 29 ܘܐܡ̣ܪ ܐܒܝܡܠܟ ܠܐܒܪܗܡ. ܡܢܐ ܐ̈ܢܝܢ ܗܠܝܢ ܫܒܥ ܦܪ̈ܬܐ ܕܥܢܐ\f j \fr 21.29\fr* \fk ܥܢܐ\fk* \ft U\ft*\f* ܕܐܩܝܡܬ ܒܠܚܘܕܝܗܝܢ. +\v 30 ܘܐܡ̣ܪ [-]\f k \fr 21.30\fr* \fk ܐܒܪܗܡ\fk* \ft 7a1, 7k4\ft*\f* ܕܫܒܥ ܦܪ̈ܬܐ ܬܣܒ\f l \fr 21.30\fr* \fk ܕ\fk* \ft U\ft*\f* ܡܢ ܐ̈ܝܕܝ. ܡܛܠ ܕܬܗܘܐ ܠܝ ܣܗܕܘܬܐ\f m \fr 21.30\fr* \fk ܠ\fk* \ft U, M\ft*\f* ܕܚܦܪܬ ܒܪܐ ܗܕܐ. +\v 31 ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܠܐܬܪܐ ܗ̇ܘ ܒܪܫܒܥ. ܡܛܠ ܕܬܡܢ ܝܡܘ ܬܪ̈ܝܗܘܢ. +\v 32 ܘܐܩܝ̣ܡܘ ܩܝܡܐ ܒܒܪܫܒܥ. ܘܩܡ ܐܒܝܡܠܟ ܘܦܝܟܠ ܪܒ ܚܝܠܗ. ܘܗܦܟܘ ܠܐܪܥܐ ܕܦܠܫ̈ܬܝܐ. +\v 33 ܘܢ̣ܨܒ ܐܒܪܗܡ ܢܨܒܬܐ ܒܒܪܫܒܥ. ܘܩ̣ܪܐ ܬܡܢ ܒܫܡܗ\f n \fr 21.33\fr* \fk ܫܡܗ\fk* \ft 11.9b1\ft*\f* ܕܡܪܝܐ ܐܠܗܐ ܕܥܠܡ̈ܐ. +\v 34 ܘܥܡ̣ܪ ܐܒܪܗܡ ܒܐܪܥܐ ܕܦܠܫ̈ܬܝܐ ܝܘܡ̈ܬܐ ܣ̈ܓܝܐܐ. +\c 22 +\v 1 ܘܗܘܐ ܡܢ ܒܬܪ ܦܬ̈ܓܡܐ ܗܠܝܢ. ܐܠܗܐ ܢܣܝ ܠܐܒܪܗܡ ܘܐܡ̣ܪ ܠܗ ܐܒܪܗܡ\f a \fr 22.1\fr* \fk ܐܒܪܗܡ\fk* \ft add. 8.5b1\ft*\f*. ܘܐܡ̣ܪ ܗܐ ܐܢܐ. +\v 2 ܘܐܡ̣ܪ ܠܗ. ܕܒ̣ܪ ܠܒܪܟ ܠܐܝܚܝܕܟ ܕܪܚ̇ܡ ܐܢܬ ܠܐܝܣܚܩ. ܘܙܠ ܠܟ ܠܐܪܥܐ ܕܐܡܘܪ̈ܝܐ. ܘܐܣܩܝܗܝ ܬܡ̇ܢ ܠܥܠܬܐ ܥܠ ܚܕ ܡܢ ܛܘܪ̈ܐ ܕܐܡ̣ܪ ܠܟ. +\v 3 ܘܩ̇ܕܡ ܐܒܪܗܡ ܒܨܦܪܐ. ܘܐܪܡܝ ܥܠ ܚܡܪܗ. ܘܕܒ̣ܪ ܠܬܪ̈ܝܢ ܥ̈ܠܝܡܘܗܝ\f b \fr 22.3\fr* \fk ܥܒ̈ܕܘܗܝ\fk* \ft 12a1\ft*\f* ܥܡܗ. ܘܠܐܝܣܚܩ ܒܪܗ. ܘܨ̇ܠܚ ܩܝ̈ܣܐ ܠܥ̇ܠܬܐ. ܘܩܡ †ܐܙܠ† ܠܐܬܪܐ ܕܐܡ̣ܪ ܠܗ ܐܠܗܐ. +\v 4 ܘܠܝܘܡܐ\f c \fr 22.4\fr* \fk ܘܒ\fk* \ft 8.5b1\ft*\f* ܬܠܝܬܝܐ. ܐܪܝܡ ܐܒܪܗܡ ܥܝܢ̈ܘܗܝ. ܘܚܙܝܗܝ ܠܐܬܪܐ ܗܘ\f d \fr 22.4\fr* \fk ܗܘ\fk* \ft om. 8.5b1\ft*\f* ܡܢ ܪܘܚܩܐ. +\v 5 ܘܐܡ̣ܪ ܠܥܠܝܡ̈ܘܗܝ ܦܘܫܘ ܠܟܘܢ ܗܪܟܐ ܠܘܬ ܚܡܪܐ. ܘܐܢܐ ܘܛܠܝܐ ܢܐܙܠ ܥܕܡܐ ܠܗܪܟܐ. †ܢܣܓܘܕ† ܘܢܗܦܘܟ ܠܘܬܟܘܢ. +\v 6 †ܘܢܣܒ ܐܒܪܗܡ ܩܝ̈ܣܐ ܠܥܠܬܐ̣†\f e \fr 22.6\fr* \fk †ܘܢܣܒ ܐܒܪܗܡ ܩܝ̈ܣܐ ܠܥܠܬܐ̣†\fk* \ft om. 7a1\ft*\f*\f f \fr 22.6\fr* \fk ܕ\fk* \ft 8.5b1\ft*\f*. †ܘܣܡ ܥܠ ܐܝܣܚܩ ܒܪܗ†\f g \fr 22.6\fr* \fk †ܘܣܡ ܥܠ ܐܝܣܚܩ ܒܪܗ†\fk* \ft om. 7a1\ft*\f*. ܘܢܣ̣ܒ ܒܐܝܕܗ ܢܘܪܐ ܘܣܟܝܢܐ ܘܐܙܠܘ ܬܪ̈ܝܗܘܢ ܐܝܟ ܚܕܐ. +\v 7 ܘܐܡ̣ܪ ܐܝܣܚܩ ܠܐܒܪܗܡ ܐܒܘܗܝ ܘܐܡ̣ܪ\f h \fr 22.7\fr* \fk ܘܐܡ̣ܪ\fk* \ft om. 8.5b1\ft*\f* ܐܒܐ. ܘܐܡ̣ܪ ܗܐ ܐܢܐ ܒܪܝ. ܘܐܡ̣ܪ ܠܗ\f i \fr 22.7\fr* \fk ܠܗ\fk* \ft om. 8.5b1\ft*\f* ܗܐ ܢܘܪܐ ܘܩܝ̈ܣܐ. ܐܝܟܘ ܐܡܪܐ ܠܥ̇ܠܬܐ. +\v 8 ܘܐܡ̣ܪ ܐܒܪܗܡ. ܐܠܗܐ ܢܚܙܐ ܠܗ\f j \fr 22.8\fr* \fk ܠܗ\fk* \ft om. L\ft*\f* ܐܡܪܐ ܠܥܠܬܐ ܒܪܝ. ܘܐܙܠܘ ܬܪ̈ܝܗܘܢ ܐܟܚܕܐ. +\v 9 ܘܐܬܘ ܠܐܬܪܐ ܕܐܡ̣ܪ ܠܗ ܐܠܗܐ. ܘܒܢ̣ܐ ܬܡܢ ܐܒܪܗܡ ܡܕܒܚܐ. ܘܣܕܪ ܩܝܣ̈ܐ. ܘܦܟܪܗ ܠܐܝܣܚܩ ܒܪܗ. ܘܣܡܗ ܥܠ ܡܕܒܚܐ ܠܥܠ ܡܢ ܩܝ̈ܣܐ\f k \fr 22.9\fr* \fk ܠܥܠ ܡܢ ܩܝ̈ܣܐ\fk* \ft om. 12a1\ft*\f*. +\v 10 ܘܐܘܫܛ ܐܝܕܗ ܐܒܪܗܡ. ܘܢܣ̣ܒ ܣܟܝܢܐ †ܠܡܟܣܗ†\f l \fr 22.10\fr* \fk ܠܡܢܟܣܗ\fk* \ft 7a1\ft*\f* ܠܒܪܗ. +\v 11 ܘܩ̣ܪܐ ܠܗ ܡܠܐܟܗ ܕܐܠܗܐ\f m \fr 22.11\fr* \fk ܕܡܪܝܐ\fk* \ft 8.5b1\ft*\f* ܡܢ ܫܡܝܐ ܘܐܡ̣ܪ ܐܒܪܗܡ ܐܒܪܗܡ. ܘܐܡ̣ܪ ܗܐ ܐܢܐ. +\v 12 ܘܐܡ̣ܪ\f n \fr 22.12\fr* \fk ܠܗ\fk* \ft add. W, E, M, U, L\ft*\f*. ܠܐ ܬܘܫܛ ܐܝܕܟ ܥܠ ܛܠܝܐ. ܘܠܐ ܬܥܒܕ ܠܗ ܡܕܡ. ܡܛܠ ܕܗܫܐ ܐܘܕܥ̣ܬ ܕܕܚܠܗ ܐܢܬ ܕܐܠܗܐ. ܕܠܐ ܚܣܟ̣ܬ ܠܒܪܟ ܠܐܝܚܝܕܟ ܡܢܝ. +\v 13 ܘܐܪܝܡ †ܐܒܪܗܡ†\f o \fr 22.13\fr* \fk †ܐܒܪܗܡ†\fk* \ft om. 7a1, 8.5b1\ft*\f* ܥܝܢ̈ܘܗܝ\f p \fr 22.13\fr* \fk ܐܒܪܗܡ\fk* \ft add. 8.5b1\ft*\f* ܘܚܙܐ. ܘܗܐ\f q \fr 22.13\fr* \fk ܘܗܐ\fk* \ft om. 8.5b1\ft*\f* ܕܟܪܐ ܚܕ ܐܚܝܕ ܒܣܘܟܬܐ ܒܩܪ̈ܢܬܗ. ܘܐܙܠ ܐܒܪܗܡ ܘܢܣܒܗ ܠܕܟܪܐ. ܘܐܣܩܗ ܠܥܠܬܐ ܚܠܦ ܒܪܗ. +\v 14 ܘܩ̣ܪܐ ܐܒܪܗܡ ܫܡܗ ܕܐܬܪܐ ܗ̇ܘ ܡܪܝܐ ܢܚܙܐ. ܕܐܬܐܡܪ ܝܘܡܢܐ ܒܛܘܪܐ ܗܢܐ ܡܪܝܐ ܢܚܙܐ. +\v 15 ܘܩ̣ܪܐ ܡܠܐܟܗ ܕܐܠܗܐ ܠܐܒܪܗܡ ܕܬܪ̈ܬܝܢ ܙܒܢܝ̈ܢ ܡܢ ܫܡܝܐ. +\v 16 ܘܐܡ̣ܪ ܒܝ ܝܡ̇ܝܬ ܐܡ̇ܪ ܡܪܝܐ. ܚܠܦ ܕܥܒ̣ܕܬ ܦܬܓܡܐ ܗܢܐ. ܘܠܐ ܚܣ̣ܟܬ ܠܒܪܟ ܠܐܝܚܝܕܟ ܡܢܝ. +\v 17 ܡܒܪܟܘ ܐܒܪܟܟ. ܘܡܣܓܝܘ ܐ̇ܣܓܐ ܙܪܥܟ. ܐܝܟ ܟܘܟ̈ܒܝ ܫܡܝܐ. ܘܐܝܟ ܚܠܐ ܕܥܠ ܣܦܬܗ ܕܝܡܐ ܘܢܐܪܬ ܙܪܥܟ ܐܪ̈ܥܬܐ ܕܒ̈ܥܠܕܒܒܘܗܝ. +\v 18 ܘܢܬܒܪܟܘܢ ܒܙܪܥܟ ܟܠܗܘܢ ܥܡ̈ܡܐ ܕܐܪܥܐ. ܚܠܦ ܕܫܡ̣ܥܬ ܒܩܠܝ. +\v 19 ܘܗ̣ܦܟ ܐܒܪܗܡ ܠܘܬ ܥܠܝܡ̈ܘܗܝ. ܘܩܡܘ ܘܐܙܠܘ ܐܟܚܕܐ ܠܒܪܫܒܥ. ܘܝܬܒ ܐܒܪܗܡ ܒܒܪܫܒܥ. +\v 20 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܦܬ̈ܓܡܐ ܗܠܝܢ. ܘܐܬܚܘܝ ܠܐܒܪܗܡ ܘܐܡܪܘ ܠܗ. ܗܐ ܝܠܕܬ ܡܠ̣ܟܐ ܐܦ ܗ̣ܝ ܒܢܝ̈ܐ ܠܢܚܘܪ ܐܚܘܟ. +\v 21 ܠܥܘܨ ܒܘܟܪܗ ܘܠܒܘܙ ܐܚܘܗܝ. ܘܠܩܡܘܐܝܠ ܐܒܘܗܝ ܕܐܪܡ. +\v 22 ܘܠܟܣܪ ܘܠܚܙܘ ܘܠܦܠܪܫ ܘܠܝܪܠܦ ܘܠܒܬܘܐܝܠ. +\v 23 ܘܒܬܘܐܝܠ ܐܘܠܕ ܠܪܦܩܐ. ܬܡܢܝܐ ܗܠܝܢ ܝܠ̣ܕܬ ܡܠ̣ܟܐ ܠܢܚܘܪ ܐܚܘܗܝ ܕܐܒܪܗܡ. +\v 24 ܘܕܪܘܟܬܗ ܫܡܗ̇ ܪܘܡܐ. ܘܝܠ̣ܕܬ ܐܦ ܗ̣ܝ ܠܛܒܚ ܘܠܓܚܡ ܘܠܬܚܫ ܘܠܡܥܟܐ. +\c 23 +\v 1 ܘܗܘܘ ܚܝ̈ܝܗ̇ ܕܣܪܐ. ܡܐܐ ܘܥܣܪ̈ܝܢ ܘܫܒܥ ܫ̈ܢܝܢ. ܫ̈ܢܝܐ ܕܚܝ̣ܬ ܣܪܐ. +\v 2 ܘܡܝܬܬ ܣܪܐ ܒܩܘܪܝܬ ܓܢܒܪ̈ܐ. ܗ̣ܝ ܗ̣ܝ ܚܒܪܘܢ ܕܒܐܪܥܐ ܕܟܢܥܢ. ܘܐܬ̣ܐ ܐܒܪܗܡ ܠܡܪܩܕܘ ܥܠ ܣܪܐ ܘܠܡܒܟܝܗ̇. +\v 3 ܘܩܡ ܐܒܪܗܡ ܡܢ ܩܕܡ ܡܝܬܬܗ. ܘܡܠܠ ܥܡ ܒܢ̈ܝ ܚܝܬ ܘܐܡ̣ܪ ܠܗܘܢ. +\v 4 ܥܡܘܪܐ ܐܢܐ ܘܬܘܬܒܐ ܥܡܟܘܢ. ܗܒܘ ܠܝ ܝܪܬܘܬܐ ܕܩܒܪܐ ܥܡܟܘܢ. ܘܐܩܒܘܪ ܡܝܬܬܝ ܡܢ ܩܕܡܝ. +\v 5 ܘܥܢܘ ܒܢܝ̈ ܚܝܬ ܘܐܡܪܘ ܠܐܒܪܗܡ. +\v 6 ܫܡܥܝܢ ܡܪܢ. ܪܒܐ ܐܢܬ ܕܐܠܗܐ ܒܝܢܬܢ. ܒܓܒܝܐ ܕܩܒܪ̈ܝܢ ܩܒܘܪ ܡܝܬܬܟ. ܐܢܫ ܡܢܢ ܠܐ ܢܟܠ̣ܐ ܩܒܪܗ ܡܢܟ ܠܡܩܒܪ ܡܝܬܬܟ. +\v 7 ܘܩܡ ܐܒܪܗܡ ܘܣܓ̣ܕ ܠܥܡܐ ܕܐܪܥܐ ܠܒܢ̈ܝ ܚܝܬ. +\v 8 ܘܡܠܠ ܥܡܗܘܢ ܘܐܡܪ ܠܗܘܢ. ܐܢ ܨܒܝܢ ܢܦܫ̈ܬܟܘܢ ܕܐܩܒܘܪ ܡܝܬܬܝ ܡܢ ܩܕܡܝ. ܫܘܡܥܘܢܝ. ܘܒܥܘ ܠܝ ܡܢ ܥܦܪܘܢ ܒܪ ܨܚܪ. +\v 9 ܘܢܬܠ ܠܝ ܡܥܪܬܐ ܐܥܝܦܬܐ ܕܝܠܗ ܕܒܣܛܪ ܚܩܠܗ. ܒܟܣܦܐ ܫܠܡܐ ܢܬܠܝܗ̇ ܠܝ ܒܝܢܬܟܘܢ. ܠܝܘܪܬܢܐ ܕܩܒܪܐ. +\v 10 ܘܥܦܪܘܢ ܝܬ̇ܒ ܒܓܘ ܒܢ̈ܝ ܚܝܬ. ܘܥܢ̣ܐ ܥܦܪܘܢ ܚܬܝܐ ܘܐܡ̣ܪ\f a \fr 23.10\fr* \fk ܘܐܡ̣ܪ\fk* \ft om. 5b1\ft*\f* ܠܐܒܪܗܡ ܩܕܡ ܒܢ̈ܝ ܚܝܬ. ܘܩܕܡ ܟܠ ܥܐ̈ܠܝ ܬܪܥܐ ܕܩܪܝܬܗ ܘܐܡ̣ܪ\f b \fr 23.10\fr* \fk ܘܐܡ̣ܪ\fk* \ft om. 12a1\ft*\f*\f c \fr 23.10\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f*. +\v 11 ܠܐ ܡܪܝ ܫܡܥܝܢܝ ܚܩܠܐ ܝܗ̇ܒܬ ܠܟ. ܘܡܥܪܬܐ ܕܒܗ̇ ܠܟ ܝܗܒܬܗ̇. ܩܕܡ ܒܢ̈ܝ ܥܡܝ ܝܗܒܬܗ̇ ܠܟ ܩܒܘܪ ܡܝܬܬܟ. +\v 12 ܘܣ̣ܓܕ ܐܒܪܗܡ ܩܕܡ ܥܡܐ ܕܐܪܥܐ. +\v 13 ܘܐܡ̣ܪ ܠܥܦܪܘܢ ܩܕܡ\f d \fr 23.13\fr* \fk ܟܠ\fk* \ft add. E, W, U\ft*\f* ܥܡܐ ܕܐܪܥܐ. ܐܢ ܨܒܐ ܐܢܬ ܫܡܥܝܢܝ. ܐܬܠ ܠܟ\f e \fr 23.13\fr* \fk ܠܟ\fk* \ft om. 5b1\ft*\f* ܟܣܦܐ ܕܡ̈ܝ ܚܩܠܐ. ܣܒ ܡܢܝ\f f \fr 23.13\fr* \fk ܐܬܠ ܠܟ\fk* \ft 12a1\ft*\f* ܘܐܩܒܘܪ ܡܝܬܬܝ ܬܡܢ. +\v 14 ܘܥܢ̣ܐ ܥܦܪܘܢ ܘܐܡ̣ܪ ܠܐܒܪܗܡ. +\v 15 ܡܪܝ ܫܡܥܝܢܝ. ܐܪܥܐ ܐܪ̈ܒܥܡܐܐ ܐܢܘܢ ܡܬܩ̈ܠܝܢ ܕܟܣܦܐ. ܒܝܢܝ ܘܠܟ ܡܢܐ ܗܝ. ܘܡܝܬܬܟ ܩܒܘܪ. +\v 16 ܘܫܡܥ ܐܒܪܗܡ ܠܥܦܪܘܢ. ܘܬܩ̣ܠ ܐܒܪܗܡ ܠܥܦܪܘܢ\f g \fr 23.16\fr* \fk ܠܥܦܪܘܢ\fk* \ft om. 5b1\ft*\f* ܟܣܦܐ ܕܡܠܠ ܩܕܡ ܒܢ̈ܝ ܚܝܬ. ܐܪ̈ܒܥܡܐܐ ܡܬ̈ܩܠܝܢ ܕܟܣܦܐ ܕܢܦ̇ܩ ܠܬܓܪܐ. +\v 17 ܘܩܡܬ ܚܩܠܐ ܕܥܦܪܘܢ ܕܒܐܥܝܦܬܐ ܕܩܕܡ ܡܡܪܐ. ܚܩܠܐ ܕܡܥܪܬܐ\f h \fr 23.17\fr* \fk ܕܒ\fk* \ft 5b1\ft*\f* ܘܡܥܪܬܐ ܕܒܗ̇. ܘܟܠܗܘܢ ܐ̈ܝܠܢܐ ܕܒܚܩܠܐ ܕܒܬܚܘܡܐ\f i \fr 23.17\fr* \fk ܕܒܟܘܠܗ ܬܚܘܡܗ̇\fk* \ft 5b1\ft*\f* ܟܕ ܚܕܪܐ. +\v 18 ܠܐܒܪܗܡ ܐܙܕܒܢܘ ܩܕܡ ܒܢ̈ܝ ܚܝܬ. ܘܩܕܡ ܟܠ ܥܐ̈ܠܝ ܬܪܥܐ ܕܩܪܝܬܗ. +\v 19 ܘܡܢ ܒܬܪܟܢ ܩܒܪ ܐܒܪܗܡ ܠܣܪܐ ܐܢܬܬܗ ܒܡܥܪܬܐ ܕܒܚܩܠܐ ܐܥܝܦܬܐ ܕܩܕܡ ܡܡܪܐ. ܗ̣ܝ ܗܝ ܚܒܪܘܢ ܕܒܐܪܥܐ ܕܟܢܥܢ. +\v 20 ܘܩܡܬ ܚܩܠܐ ܕܡܥܪܬܐ\f j \fr 23.20\fr* \fk ܕܡܥܪܬܐ\fk* \ft om. 5b1\ft*\f* ܘܡܥܪܬܐ ܕܒܗ̇ ܠܐܒܪܗܡ ܠܝܘܪܬܢܐ ܕܩܒܪܐ ܡܢ ܠܘܬ\f k \fr 23.20\fr* \fk ܠܘܬ\fk* \ft om. 7k4\ft*\f* ܒܢ̈ܝ ܚܝܬ. +\c 24 +\v 1 ܘܐܒܪܗܡ ܣܐܒ ܘܥܠ ܒܫ̈ܢܝܐ. ܘܡܪܝܐ ܒܪܟ ܠܐܒܪܗܡ ܒܟܠ\f a \fr 24.1\fr* \fk ܘܡܪܝܐ ܒܪܟ ܠܐܒܪܗܡ ܒܟܠ\fk* \ft om. 7k4\ft*\f*. +\v 2 ܘܩ̣ܪܐ\f b \fr 24.2\fr* \fk ܘܐܡܪ\fk* \ft 5b1\ft*\f* ܐܒܪܗܡ ܠܥܒ̣ܕܗ ܣܒܐ\f c \fr 24.2\fr* \fk ܣܒܐ\fk* \ft om. 12b2*\ft*\f* ܪܒ ܒܝܬܗ ܕܫܠܝܛ ܒܟܠ ܕܐܝܬ ܠܗ. ܘܐܡ̣ܪ ܠܗ\f d \fr 24.2\fr* \fk ܘܐܡ̣ܪ ܠܗ\fk* \ft om. 5b1\ft*\f*. ܣܝܡ ܐܝܕܟ ܬܚܝܬ ܚܨܝ. +\v 3 ܘܐܘܡܝܟ ܒܡܪܝܐ ܐܠܗܐ ܕܫܡܝܐ ܘܐܠܗܐ ܕܐܪܥܐ. ܕܠܐ ܬܣܒ ܐܢܬܬܐ ܠܒܪܝ ܡܢ ܒܢ̈ܬ ܟܢܥܢ̈ܝܐ ܕܝܬ̇ܒ ܐܢܐ ܒܝܢܬܗܘܢ. +\v 4 ܐܠܐ ܠܐܪܥܝ ܘܠܬܘ̈ܠܕܬܝ ܙܠ. ܘܣܒ ܐܢܬܬܐ ܠܒܪܝ ܐܝܣܚܩ. +\v 5 ܘܐܡ̣ܪ ܠܗ ܥܒ̣ܕܐ ܘܐܢ ܠܐ ܬܨܒܐ ܐܢܬܬܐ ܠܡܐܬܐ ܒܬܪܝ ܠܐܪܥܐ ܗܕܐ. ܡܗܦܟܘ ܐܗܦܟܝܘܗܝ ܠܒܪܟ ܠܐܪܥܐ ܕܢܦ̣ܩܬ ܡܢ ܬܡܢ. +\v 6 ܘܐܡ̣ܪ ܠܗ ܐܒܪܗܡ. ܐܙܕܗܪ ܠܟ ܕܠܡܐ ܬܗܦܟ ܠܒܪܝ ܠܬܡܢ. +\v 7 ܡܪܝܐ ܐܠܗܐ ܕܫܡܝܐ ܕܕܒܪܢܝ ܡܢ ܬܡܢ ܡܢ ܒܝܬ ܐܒܝ. ܡܢ ܐܪܥܐ ܕܬ̈ܘܠܕܬܝ. ܘܕܐܡ̣ܪ ܠܝ ܘܕܐܩܝܡ ܠܝ ܕܠܙܪܥܟ\f e \fr 24.7\fr* \fk ܕܠܟ\fk* \ft 5b1\ft*\f* ܐܬܠܝܗ̇ ܐܪܥܐ ܗܕܐ. ܗ̣ܘ ܢܫܕܪ ܡܠܐܟܗ ܩܕܡܝܟ. ܘܬܣܒ ܐܢܬܬܐ ܠܒܪܝ ܡܢ ܬܡܢ. +\v 8 ܘܐܢ ܠܐ ܬܬܛܦܝܣ ܐܢܬܬܐ ܠܡܐܬܐ ܥܡܟ. ܗܘ̣ܝܬ ܙܟܝ ܡܢ ܡܘܡ̈ܬܝ ܗܕܐ. ܒܠܚܘܕ ܠܒܪܝ ܠܐ ܬܗܦܟ ܠܬܡܢ. +\v 9 ܘܣܡ ܥܒ̣ܕܐ ܐܝܕܗ ܬܚܝܬ ܚܨܗ ܕܐܒܪܗܡ ܡܪܗ. ܘܝܡ̣ܐ ܠܗ ܥܠ ܦܬܓܡܐ ܗܢܐ. +\v 10 ܘܕܒ̣ܪ ܥܒ̣ܕܐ ܥܣܪܐ ܓܡ̈ܠܝܢ ܡܢ ܓܡ̈ܠܐ ܕܡܪܗ ܘܐܙܠ. ܘܡܢ ܟܠ\f f \fr 24.10\fr* \fk ܘܟܘܠ\fk* \ft 5b1\ft*\f* ܛܘܒܐ ܕܡܪܗ ܒܐܝܕܗ. ܘܩܡ ܘܐܙܠ ܠܐܪܡ̇ ܢܗܪܝܢ. ܠܩܪܝܬܐ ܕܢܚܘܪ. +\v 11 ܘܐܒܪܟ ܓܡ̈ܠܘܗܝ ܠܒܪ ܡܢ ܩܪܝܬܐ. ܥܠ ܒܪܐ ܕܡ̈ܝܐ. ܠܥܕܢ ܪܡܫܐ ܠܥܕܢ ܕܢܦܩܢ ܡܠܝܬ ܡ̈ܝܐ. +\v 12 ܘܨܠܝ\f g \fr 24.12\fr* \fk ܘܨܠܝ\fk* \ft om. 5b1\ft*\f* ܘܐܡ̣ܪ\f h \fr 24.12\fr* \fk ܥܒܕܐ\fk* \ft add. 5b1\ft*\f*. ܡܪܝܐ\f i \fr 24.12\fr* \fk ܐܠܗܐ\fk* \ft add. 5b1\ft*\f* ܐܠܗܗ ܕܡܪܝ ܐܒܪܗܡ. ܛ̇ܝܒ ܩܕܡܝ ܝܘܡܢܐ. ܘܥܒ̣ܕ ܛܝܒܘܬܐ ܥܡ ܡܪܝ ܐܒܪܗܡ. +\v 13 ܗܐ ܐܢܐ ܩܐܡ ܐܢܐ ܥܠ ܒܪܐ\f j \fr 24.13\fr* \fk ܥܝܢܐ\fk* \ft 5b1\ft*\f* ܕܡ̈ܝܐ. ܘܒܢ̈ܬ ܐܢܫ̈ܝ ܩܪܝܬܐ ܢܦܩ̈ܢ ܠܡܡܠܐ ܡ̈ܝܐ. +\v 14 ܘܥܠܝܡܬܐ ܕܐܡ̣ܪ ܠܗ̇ ܐܪܟܢܝ\f k \fr 24.14\fr* \fk ܕ\fk* \ft 7k4\ft*\f* ܠܝ ܩܘܠܬܟܝ ܐܫܬܐ\f l \fr 24.14\fr* \fk ܕ\fk* \ft 7k4, 8a1, E, W, M, U, L\ft*\f*. ܘܬܐܡܪ ܠܝ ܐܫܬܝ\f m \fr 24.14\fr* \fk ܕ\fk* \ft 7k4.12, 10g1\ft*\f* ܘܐܦ ܠܓܡ̈ܠܝܟ ܐܫܩܐ. ܗ̇ܝ ܗܝ ܕܛܝܒ̣ܬ ܠܥܒܕܟ ܐܝܣܚܩ. ܘܒܗܕܐ ܐܕܥ ܕܥܒ̇ܕ ܐܢܬ ܛܝܒܘܬܐ ܘܩܘܫܬܐ\f n \fr 24.14\fr* \fk ܘܩܘܫܬܐ\fk* \ft om. 5b1\ft*\f* ܥܡ ܡܪܝ. +\v 15 ܘܗ̣ܘ ܥܕܟܝܠ ܠܐ ܫ̇ܠܡ ܠܡܡܠܠܘ. ܘܗܐ ܪܦܩܐ ܢܦܩ̣ܬ ܕܐܬܝ̣ܠܕܬ ܠܒܬܘܐܝܠ ܒܪ ܡ̣ܠܟܐ ܐܢܬܬ ܢܚܘܪ. ܐܚܘܗܝ ܕܐܒܪܗܡ ܘܩܘܠܬܐ ܥܠ ܟܬܦܗ̇. +\v 16 ܘܥܠܝܡܬܐ ܫܦܝܪܐ ܗܘܬ ܒܚܙܘܗ̇ ܛܒ. ܒܬܘܠܬܐ ܕܓܒܪܐ\f o \fr 24.16\fr* \fk ܘܓܒܪܐ\fk* \ft 7k12\ft*\f* ܠܐ ܝܕܥܗ̇. ܘܢܚ̣ܬܬ ܠܒܪܐ\f p \fr 24.16\fr* \fk ܠܥܝܢܐ\fk* \ft 5b1\ft*\f*. ܘܡܠ̣ܬ ܩܘܠܬܗ̇ ܘܣܠܩ̣ܬ. +\v 17 ܘܪܗ̣ܛ ܥܒܕܐ ܠܐܘܪܥܗ̇ ܘܐܡ̣ܪ ܠܗ̇\f q \fr 24.17\fr* \fk ܠܗ̇\fk* \ft om. 5b1\ft*\f*. ܐܫܩܐܝܢܝ ܩܠܝܠ ܡ̈ܝܐ ܡܢ ܩܘܠܬܟܝ. +\v 18 ܘܐܡ̣ܪܬ\f r \fr 24.18\fr* \fk ܘܐܡ̣ܪܬ\fk* \ft om. 12a1*\ft*\f* ܠܗ\f s \fr 24.18\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܐܫܬܝ ܡܪܝ\f t \fr 24.18\fr* \fk ܐܫܬܝ ܡܪܝ\fk* \ft om. 12a1*\ft*\f*. ܘܐܣ̣ܬܪܗܒܬ ܘܐܚܬܬ ܩܘܠܬܗ̇ ܥܠ ܐ̈ܝܕܝܗ̇\f u \fr 24.18\fr* \fk ܐܪܥܐ\fk* \ft 7k12\ft*\f* ܘܐܫܩܝܬܗ. +\v 19 ܘܓܡ̣ܪܬ ܠܡܫܩܝܘܬܗ ܘܐܡ̣ܪܬ. ܐܦ ܠܓܡ̈ܠܝܟ ܐܡܠ̣ܐ ܥܕܡܐ ܕܢܫܠܡܘܢ ܠܡܫܬܐ. +\v 20 ܘܐܣܬܪܗܒܬ ܘܢܦ̣ܨܬ ܩܘܠܬܗ̇ ܠܫܩܝܐ. ܘܪܗ̣ܛܬ ܬܘܒ ܠܒܪܐ ܠܡܡܠܐ. ܘܡܠ̣ܬ ܠܟܠܗܘܢ ܓܡ̈ܠܘܗܝ. +\v 21 ܘܓܒܪܐ ܡܫ̣ܩܐ\f v \fr 24.21\fr* \fk ܗܘܐ\fk* \ft add. 5b1, 7k12\ft*\f* ܘܡܬܒܩܐ ܒܗ̇. ܘܡܟ̇ܬܪ ܠܡܕܥ ܐܢ ܐܨܠܚ ܡܪܝܐ ܐܘܪܚܗ ܐܘ ܠܐ. +\v 22 ܘܟܕ ܓܡ̇ܪܘ ܓܡ̈ܠܐ ܠܡܫܬܐ. ܢܣ̣ܒ ܥܒ̣ܕܐ ܩܕܫ̣ܐ ܕܕܗܒܐ ܡܬܩܠܐ ܡܬܩܠܗ. ܘܬܪ̈ܝܢ ܫܐܪ̈ܝܢ ܥܠ ܐܝ̈ܕܝܗ̇. ܡܢ ܥܣܪܐ ܕܕܗܒܐ ܡܬܩܠܗܘܢ. +\v 23 ܘܐܡ̣ܪ ܠܗ̇. ܒܪܬ ܡ̇ܢ †ܐܢܬܝ† ܚܘܐܝܢܝ. ܐܢ ܐܝܬ ܠܢ ܐܬܪܐ ܒܝܬ ܐܒܘܟܝ ܠܡܒܬ. +\v 24 ܘܐܡ̣ܪܬ ܠܗ. ܒܪܬ ܒܬܘܐܝܠ ܐܢܐ ܒܪ ܡܠ̣ܟܐ ܕܝܠܕܬ ܠܢܚܘܪ. +\v 25 ܘܐܡ̣ܪܬ ܠܗ. ܘܐܦ ܬܒܢܐ ܘܐܦ ܟܣܬܐ ܣܓܝ ܠܢ. ܘܐܦ ܐܬܪܐ ܠܡܒܬ. +\v 26 ܘܒܪܟ ܓܒܪܐ ܥܠ ܐܪܥܐ\f w \fr 24.26\fr* \fk ܘܩܥܕ ܥܒܕܐ\fk* \ft 5b1\ft*\f*. ܘܣܓ̣ܕ ܠܡܪܝܐ. +\v 27 ܘܐܡ̣ܪ ܒܪܝܟ ܗ̣ܘ ܡܪܝܐ ܐܠܗܗ ܕܡܪܝ ܐܒܪܗܡ. ܕܠܐ ܟܠ̣ܐ ܛܝܒܘܬܗ ܘܩܘܫܬܗ ܡܢ ܡܪܝ. ܐܠܐ ܒܐܘܪܚܐ ܕܒܪܢܝ ܡܪܝܐ ܠܒܝܬ ܐܚܘܗܝ ܕܡܪܝ. ܠܡܣܒ ܒܪܬ ܐܚܘܗܝ ܕܡܪܝ ܠܒܪܗ\f x \fr 24.27\fr* \fk ܠܡܣܒ ܒܪܬ ܐܚܘܗܝ ܕܡܪܝ ܠܒܪܗ\fk* \ft om. 5b1\ft*\f*. +\v 28 ܘܪܗܛܬ ܛܠܝܬܐ ܘܚܘܝܬ ܠܒܝܬ ܐܒܘܗ̇\f y \fr 24.28\fr* \fk ܐܡܗ̇\fk* \ft 5b1\ft*\f* ܡ̈ܠܐ ܗܠܝܢ. +\v 29 ܘܠܪܦܩܐ ܐܝܬ ܗܘܐ ܐܚܐ ܘܫܡܗ ܠܒܢ. ܘܪܗܛ ܠܒܢ ܠܘܬ ܓܒܪܐ ܠܒܪ ܠܘܬ ܒܪܐ\f z \fr 24.29\fr* \fk ܠܥܝܢܐ\fk* \ft 5b1\ft*\f*. +\v 30 ܟܕ ܚ̣ܙܐ ܩܕܫ̈ܐ ܘܫܐܪ̈ܐ ܒܐ̈ܝܕܝ ܚܬܗ. ܘܟܕ ܫܡ̣ܥ ܡ̈ܠܝܗ̇ ܕܪܦܩܐ ܚܬܗ ܕܐܡ̣ܪܬ. ܕܗܟܢܐ\f { \fr 24.30\fr* \fk ܗܟܢܐ\fk* \ft 5b1\ft*\f* ܐܡ̣ܪ ܠܝ ܓܒܪܐ. ܘܐܬ̣ܐ ܠܘܬ ܓܒܪܐ. ܘܗܐ\f | \fr 24.30\fr* \fk ܘܗܘ\fk* \ft 5b1\ft*\f* ܩܐܡ ܠܘܬ ܓܡ̈ܠܐ ܥܠ ܒܪܐ\f } \fr 24.30\fr* \fk ܥܝܢܐ\fk* \ft 5b1\ft*\f*. +\v 31 ܘܐܡ̣ܪ ܠܗ\f ~ \fr 24.31\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܥܘܠ ܒܪܝܟܗ ܕܡܪܝܐ. ܠܡܢܐ ܩܐܡ ܐܢܬ ܒܫܘܩܐ. ܘܐܢܐ ܬܩ̇ܢܬ ܒܝܬܐ ܘܕܘܟܬܐ ܠܓܡ̈ܠܐ. +\v 32 ܘܥܠ ܓܒܪܐ ܠܒܝܬܐ ܘܫ̣ܪܐ ܡܢ ܓܡ̈ܠܐ. ܘܐܪܡܝ ܬܒܢܐ ܘܟܣܬܐ ܠܓܡ̈ܠܐ. ܘܡ̈ܝܐ ܠܡܫܓܘ ܪ̈ܓܠܘܗܝ ܘܪ̈ܓܠܐ ܕܓܒܪ̈ܐ ܕܥܡܗ. +\v 33 ܘܣܡܘ ܩܕܡܝܗܘܢ ܠܡܠܥܣ\f  \fr 24.33\fr* \fk ܠܡܐܟܠ\fk* \ft L\ft*\f*. ܘܐܡ̣ܪ ܠܐ ܠܥܣ̇ ܐܢܐ ܥܕܡܐ ܕܐܡ̣ܪ ܡ̈ܠܝ. ܐܡܪ̈ܝܢ ܠܗ\f € \fr 24.33\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܐܡ̣ܪ. +\v 34 ܘܐܡ̣ܪ\f  \fr 24.34\fr* \fk ܠܗܘܢ\fk* \ft add. 5b1\ft*\f*. ܥܒ̣ܕܐ\f ‚ \fr 24.34\fr* \fk ܕ\fk* \ft 12b2\ft*\f* ܐܢܐ ܕܐܒܪܗܡ. +\v 35 ܘܡܪܝܐ ܒ̇ܪܟ ܠܡܪܝ ܘܝܪܒ ܛܒ. ܘܗܘܘ ܠܗ ܥܢܐ ܘܬܘܪ̈ܐ ܘܣܐܡܐ\f ƒ \fr 24.35\fr* \fk ܘܟܣܦܐ\fk* \ft 5b1\ft*\f* ܘܕܗܒܐ. †ܘܥܒ̈ܕܐ†\f „ \fr 24.35\fr* \fk ܘܥܢܐ\fk* \ft 7a1\ft*\f* ܘܐ̈ܡܗܬܐ. ܘܐܬ̈ܢܐ\f … \fr 24.35\fr* \fk ܘܐܬ̈ܢܐ\fk* \ft om. 5b1\ft*\f* ܘܓܡ̈ܠܐ ܘܚܡܪ̈ܐ. +\v 36 ܘܝܠ̣ܕܬ ܣܪܐ ܐܢܬܬܗ ܕܡܪܝ ܒܪܐ ܠܡܪܝ ܡܢ ܒܬܪ ܕܣܐܒܬ. ܘܝܗ̣ܒ ܠܗ ܟܠ ܡܕܡ ܕܐܝܬ ܠܗ. +\v 37 ܘܐܘܡܝܢܝ ܡܪܝ ܘܐܡ̣ܪ ܠܝ. ܠܐ\f † \fr 24.37\fr* \fk ܕ\fk* \ft 7k12\ft*\f* ܬܣܒ ܐܢܬܬܐ ܠܒܪܝ ܡܢ ܒܢ̈ܬ ܟܢܥ̈ܢܝܐ. ܕܝܬܒ ܐܢܐ ܒܐܪܥܗܘܢ\f ‡ \fr 24.37\fr* \fk ܒܝܢܬܗܘܢ\fk* \ft 5b1\ft*\f*. +\v 38 ܐܠܐ ܙܠ\f ˆ \fr 24.38\fr* \fk ܠܟ\fk* \ft add. 5b1\ft*\f* ܠܒܝܬ ܐܒܝ ܘܠܫܪܒܬܝ. ܘܣܒ ܐܢܬܬܐ ܠܒܪܝ ܡܢ ܬܡܢ\f ‰ \fr 24.38\fr* \fk ܡܢ ܬܡܢ\fk* \ft om. 5b1\ft*\f*. +\v 39 ܘܐܡ̇ܪܬ ܠܡܪܝ. ܘܕܠܡܐ ܠܐ ܬܨܒܐ ܐܢܬܬܐ ܠܡܐܬܐ ܥܡܝ. +\v 40 ܘܐܡ̣ܪ ܠܝ ܡܪܝ\f Š \fr 24.40\fr* \fk ܡܪܝ\fk* \ft om. 5b1\ft*\f*. ܡܪܝܐ ܕܦܠܚ̇ܬ ܩܕܡܘܗܝ. ܗ̣ܘ\f ‹ \fr 24.40\fr* \fk ܗ̣ܘ\fk* \ft om. 5b1\ft*\f* ܢܫܕܪ ܡܠܐܟܗ ܥܡܟ ܘܢܬܩܢ ܐܘܪܚܟ. ܘܬܣܒ ܐܢܬܬܐ ܠܒܪܝ ܡܢ ܫܪܒܬܝ. ܘܡܢ ܒܝܬ ܐܒܝ. +\v 41 ܘܗ̇ܝܕܝܢ ܬܬܚܣܐ ܡܢ ܡ̈ܘܡܬܝ ܟܕ ܬܐܙܠ ܠܫܪܒܬܝ. ܘܐܢ ܠܐ\f Œ \fr 24.41\fr* \fk ܕܐܠܐ\fk* \ft 7k12\ft*\f* ܢܬܠܘܢ ܠܟ. ܗܘܝܬ ܡܚ̣ܣܝ ܡܢ ܡܘ̈ܡܬܝ. +\v 42 ܘܐܬܝܬ ܝܘܡܢܐ ܠܘܬ ܒܪܐ\f  \fr 24.42\fr* \fk ܠܥܝܢܐ\fk* \ft 5b1\ft*\f* ܘܐܡ̇ܪܬ. ܡܪܝܐ ܐܠܗܗ ܕܡܪܝ ܐܒܪܗܡ. ܐܢ ܐܬܩܢܬ ܐܘܪܚܝ ܕܐ̇ܬܝܬ\f Ž \fr 24.42\fr* \fk ܕܐܙܠ ܐܢܐ\fk* \ft 5b1\ft*\f* ܥܠܝܗ̇. +\v 43 ܗܐ ܐܢܐ\f  \fr 24.43\fr* \fk ܐܢܐ\fk* \ft om. 5b1\ft*\f* ܩܐܡ ܐܢܐ ܥܠ ܒܪܐ\f  \fr 24.43\fr* \fk ܥܝܢܐ\fk* \ft 5b1\ft*\f* ܕܡ̈ܝܐ. ܘܥܠܝܡܬܐ ܕܢܦܩܐ ܠܡܡܠܐ ܡ̈ܝܐ\f ‘ \fr 24.43\fr* \fk ܡ̈ܝܐ\fk* \ft om. 5b1\ft*\f*. ܘܐܡ̣ܪ ܠܗ̇. ܐܫܩܐܝܢܝ ܩܠܝܠ ܡ̈ܝܐ ܡܢ ܩܘܠܬܟܝ. +\v 44 ܘܬܐܡܪ ܠܝ ܐܦ\f ’ \fr 24.44\fr* \fk ܕ\fk* \ft 7k12\ft*\f* ܐܢܬ ܐܫܬܝ ܐܦ ܠܓܡ̈ܠܝܟ ܐܡܠܐ. ܗ̇ܝ ܗ̣ܝ ܐܢܬܬܐ\f “ \fr 24.44\fr* \fk ܐܢܬܬܐ\fk* \ft om. 12b2\ft*\f* ܕܛܝܒ ܡܪܝܐ ܠܒܪ ܡܪܝ. +\v 45 ܘܐܢܐ ܥܕܟܝܠ ܠܐ ܫ̇ܠܡܬ\f ” \fr 24.45\fr* \fk ܓܡܪܬ\fk* \ft 5b1\ft*\f* ܠܡܡܠܠܘ ܒܠܒܝ\f • \fr 24.45\fr* \fk ܒܠܒܝ\fk* \ft om. 12a1\ft*\f*. ܘܗܐ ܪܦܩܐ ܢܦܩ̣ܬ ܘܩܘܠܬܐ ܥܠ ܟܬܦܗ̇. ܘܢܚܬܬ ܠܥܝܢܐ ܘܡܠ̣ܬ. ܘܐܡ̇ܪܬ ܠܗ̇. ܐܫܩܐܝܢܝ ܩܠܝܠ\f – \fr 24.45\fr* \fk ܩܠܝܠ\fk* \ft om. 5b1\ft*\f* †ܡ̈ܝܐ†\f — \fr 24.45\fr* \fk †ܡ̈ܝܐ†\fk* \ft om. 5b1, 7a1\ft*\f* ܡܢ ܩܘܠܬܟܝ\f ˜ \fr 24.45\fr* \fk ܡܢ ܩܘܠܬܟܝ\fk* \ft om. 5b1\ft*\f*. +\v 46 ܘܐܣܬ̣ܪܗܒܬ ܘܐܚ̣ܬܬ ܩܘܠܬܗ̇ ܡܢܗ̇. ܘܐܡ̣ܪܬ ܠܝ\f ™ \fr 24.46\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f* ܐܫܬܝ ܘܐܦ ܠܓܡ̈ܠܝܟ ܐܫܩܐ. ܘܐܫܬܝܬ ܘܐܦ ܠܓܡ̈ܠܝ ܐܫܩܝܬ. +\v 47 ܘܫܐܠܬܗ̇ ܘܐܡ̇ܪܬ ܠܗ̇. ܒܪܬ ܡ̇ܢ ܐܢܬܝ. ܘܐܡ̣ܪܬ ܒܪܬ ܒܬܘܐܝܠ ܐܢܐ ܒܪ ܢܚܘܪ ܕܝܠ̣ܕܬ ܠܗ ܡܠ̣ܟܐ. ܘܐܪܡ̇ܝܬ ܫܐܪ̈ܐ ܒܐ̈ܝܕܝܗ̇ ܘܩܕܫ̈ܐ ܒܐ̈ܕܢܝܗ̇. +\v 48 ܘܩܥ̇ܕܬ ܘܣ̇ܓܕܬ ܠܡܪܝܐ. ܘܒ̇ܪܟܬ ܠܡܪܝܐ ܐܠܗܗ ܕܡܪܝ ܐܒܪܗܡ. ܕܕܒܪܢܝ ܒܐܘܪܚܐ ܕܩܘܫܬܐ ܠܒܝܬ ܐܚܘܗܝ ܕܡܪܝ\f š \fr 24.48\fr* \fk ܠܒܝܬ ܐܚܘܗܝ ܕܡܪܝ\fk* \ft om. 5b1\ft*\f*. ܠܡܣܒ ܒܪܬ ܐܚܘܗܝ ܕܡܪܝ ܠܒܪܗ. +\v 49 ܘܗܫܐ ܐܢ ܥܒܕܝܢ ܐܢܬܘܢ ܛܝܒܘܬܐ ܘܩܘܫܬܐ ܥܡ ܡܪܝ. ܚܘܐܘܢܝ ܘܐܠܐ ܚܘܐܘܢܝ ܘܐܬܦܢܐ ܠܝܡܝܢܐ ܐܘ ܠܣܡܠܐ\f › \fr 24.49\fr* \fk ܘܠܣܡܠܐ\fk* \ft 5b1, 7k12\ft*\f*. +\v 50 ܘܥܢܘ ܠܒܢ ܘܒܬܘܐܝܠ ܘܐܡ̣ܪܘ. ܡܢ ܡܪܝܐ ܢܦܩ̣ܬ ܡܠܬܐ\f œ \fr 24.50\fr* \fk ܗܕܐ\fk* \ft add. 12b2\ft*\f*. ܠܐ ܡܫܟܚܝܢ ܚܢܢ ܠܡܐܡܪ ܠܟ\f  \fr 24.50\fr* \fk ܠܟ\fk* \ft om. 10b1*\ft*\f* ܛܒܬܐ ܐܘ ܒܝܫܬܐ. +\v 51 ܗܐ ܪܦܩܐ ܩܕܡܝܟ ܕܒܪ ܘܙܠ. ܘܬܗܘܐ ܐܢܬܬܐ ܠܒܪ ܡܪ̈ܝܟ. ܐܝܟܢܐ\f ž \fr 24.51\fr* \fk ܐܝܟ\fk* \ft 5b1\ft*\f* ܕܐܡ̣ܪ ܡܪܝܐ. +\v 52 ܘܟܕ ܫܡ̣ܥ ܥܒ̣ܕܐ ܕܐܒܪܗܡ ܡ̈ܠܝܗܘܢ. ܣܓܕ ܥܠ ܐܪܥܐ ܩܕܡ ܡܪܝܐ. +\v 53 ܘܐܦܩ ܥܒ̣ܕܐ ܡܐ̈ܢܐ ܕܕܗܒܐ ܘܡܐ̈ܢܐ ܕܣܐܡܐ\f Ÿ \fr 24.53\fr* \fk ܕܟܣܦܐ\fk* \ft 5b1\ft*\f* ܘܠܒܘܫ̈ܐ. ܘܝܗ̣ܒ ܠܪܦܩܐ. ܘܡܘܗ̈ܒܬܐ ܝܗ̣ܒ ܠܐܚ̈ܝܗ̇ ܘܠܐܡܗ̇. +\v 54 ܘܠܥ̣ܣܘ ܘܐܫܬܝܘ. ܗ̣ܘ ܘܓܒܪ̈ܐ ܕܥܡܗ ܘܒܬܘ. ܘܩ̇ܕܡ ܒܫܦܪܐ\f   \fr 24.54\fr* \fk ܒܨܦܪܐ\fk* \ft 5b1\ft*\f* ܘܐܡ̣ܪ ܠܗܘܢ\f ¡ \fr 24.54\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܫܕܪܘܢܝ\f ¢ \fr 24.54\fr* \fk ܐܙܠ\fk* \ft add. E, W, M, U\ft*\f* ܠܘܬ ܡܪܝ. +\v 55 ܘܐܡ̣ܪܘ ܠܗ ܐ̈ܚܝܗ̇ ܘܐܡܗ̇. ܬܬܒ ܥܠܝܡܬܐ ܥܡܢ ܝܪܚ ܝܘܡ̈ܝܢ\f £ \fr 24.55\fr* \fk ܥܕܢ ܒܥܕܢ ܐܘ ܥܣܪ̈ܐ ܝܪ̈ܚܝܢ\fk* \ft 5b1\ft*\f*. ܘܗܝܕܝܢ\f ¤ \fr 24.55\fr* \fk ܘܒܬܪܟܢ\fk* \ft 5b1\ft*\f* ܬܐܙܠ. +\v 56 ܐܡ̇ܪ ܠܗܘܢ ܠܐ ܬܫܘܚܪܘܢܢܝ. ܕܡܪܝܐ ܐܬܩܢ ܐܘܪܚܝ. ܫܕܪܘܢܝ ܘܐܙܠ ܠܘܬ ܡܪܝ. +\v 57 ܘܐܡܪܘ. ܢܩܪܐ ܠܛܠܝܬܐ. ܘܢܫܐܠ ܡܢ ܦܘܡܗ̇. +\v 58 ܘܩܪܐܘܗ̇ ܠܪܦܩܐ ܘܐܡܪܘ ܠܗ̇. ܐܙܠܐ ܐܢܬܝ ܥܡ ܓܒܪܐ ܗܢܐ. ܘܐܡ̣ܪܬ ܐܙܠܐ ܐܢܐ. +\v 59 ܘܫܕܪܘܗ̇ ܠܪܦܩܐ ܚܬܗܘܢ ܘܠܡܝܢܩܬܗ̇. ܘܠܥܒ̣ܕܐ ܕܐܒܪܗܡ ܘܠܓܒܪ̈ܘܗܝ. +\v 60 ܘܒܪܟܘܗ̇ ܠܪܦܩܐ ܚܬܗܘܢ\f ¥ \fr 24.60\fr* \fk ܚܬܗܘܢ\fk* \ft om. 5b1\ft*\f* ܘܐܡ̣ܪܘ ܠܗ̇. ܚܬܢ ܐܢܬܝ ܗܘܝ ܠܐ̈ܠܦܐ ܘܠܪ̈ܒܘܬܐ. ܘܢܐܪܬ ܙܪܥܟܝ ܐܪ̈ܥܬܐ ܕܒ̈ܥܠܕܒܒܘܗܝ. +\v 61 ܘܩܡܬ ܪܦܩܐ ܘܥ̈ܠܝܡܬܗ̇. ܘܝܬ̣ܒ ܥܠ ܓܡ̈ܠܐ. ܘܐܙ̣ܠ ܒܬܪ ܓܒܪܐ. ܘܕܒ̣ܪ ܥܒ̣ܕܐ ܠܪܦܩܐ ܘܐܙ̣ܠ. +\v 62 ܘܐܝܣܚܩ ܐܬ̇ܐ ܡܐܬܐ\f ¦ \fr 24.62\fr* \fk ܡܐܬܐ\fk* \ft om. 7k12\ft*\f* ܡܢ ܒܪܐ ܕܚܝܐ ܚܙܢܝ. ܘܗ̣ܘ ܝܬ̇ܒ ܒܐܪܥܐ ܕܬܝܡܢܐ. +\v 63 ܘܢܦ̣ܩ ܐܝܣܚܩ ܠܡܗܠܟܘ ܒܚܩܠܐ ܥܕܢ\f § \fr 24.63\fr* \fk ܠ\fk* \ft 7k12\ft*\f*\f ¨ \fr 24.63\fr* \fk ܒ\fk* \ft 12a1\ft*\f* ܪܡܫܐ. ܘܐܪܝܡ ܥܝܢ̈ܘܗܝ ܘܚ̣ܙܐ. ܘܗܐ ܓܡ̈ܠܐ ܐܬ̇ܝܢ. +\v 64 ܘܐܪܝܡ̣ܬ ܪܦܩܐ ܥܝܢ̈ܝܗ̇ ܘܚܙܬ ܠܐܝܣܚܩ. ܘܐܬܪܟܢܬ\f © \fr 24.64\fr* \fk ܘܢܦܠܬ\fk* \ft 5b1\ft*\f* ܥܠ ܓܡܠܐ. +\v 65 ܘܐܡ̣ܪܬ ܠܥܒ̣ܕܐ ܡܢܘ ܓܒܪܐ ܗܢܐ. ܕܐܬ̇ܐ ܒܚܩܠܐ ܠܐܘܪܥܢ. ܘܐܡ̣ܪ ܥܒ̣ܕܐ ܗܘܝܘ ܡܪܝ. ܘܢܣܒܬ ܐܪܕܝܕܐ ܘܐܬܟܣܝܬ. +\v 66 ܘܐܫ̣ܬܥܝ ܥܒ̣ܕܐ ܠܐܝܣܚܩ ܟܠܗܘܢ ܦܬ̈ܓܡܐ ܕܥܒ̣ܕܬ. +\v 67 ܘܐܥܠܗ̇ ܐܝܣܚܩ ܠܡܫܟܢܐ ܕܣܪܐ ܐܡܗ. ܘܢܣܒܗ̇ ܠܪܦܩܐ ܘܗܘܬ ܠܗ ܐܢܬܬܐ ܘܪܚܡܗ̇. ܘܐܬܒܝܐ ܐܝܣܚܩ ܒܬܪ ܐܡܗ. +\c 25 +\v 1 ܘܐܘܣܦ ܐܒܪܗܡ ܘܢܣܒ ܐܢܬܬܐ. ܘܫܡܗ̇ ܩܢܛܘܪܐ. +\v 2 ܘܝܠ̣ܕܬ ܠܗ ܠܙܡܪܢ ܘܝܩܫܢ. ܘܡܕܢ ܘܡܕܝܢ. ܘܐܫܒܩ ܘܫܘܚ. +\v 3 ܘܝܩܫܢ ܐܘܠܕ ܠܫܒܐ ܘܠܕܪܢ. ܘܒܢ̈ܝ ܕܪܢ ܗܘܘ. ܐܫܘܕܝܡ ܘܠܛܫܝܡ ܘܐܡܝܡ. +\v 4 ܘܒܢ̈ܝ ܡܕܝܢ. ܥܦܐ ܘܚܦܪ. ܘܚܢܘܟ ܘܐܒܝܕܥ ܘܐܠܕܥܐ. ܟܠܗܘܢ ܗܠܝܢ ܒ̈ܢܝ ܩܢܛܘܪܐ. +\v 5 ܘܝܗ̣ܒ ܐܒܪܗܡ ܟܠܡܕܡ\f a \fr 25.5\fr* \fk ܟܠ ܡܐ\fk* \ft 12a1, L\ft*\f* ܕܐܝܬ ܠܗ ܠܐܝܣܚܩ ܒܪܗ. +\v 6 ܘܠܒܢ̈ܝ ܕܪܘܟܬܗ ܕܐܒܪܗܡ. ܝܗ̣ܒ ܐܒܪܗܡ ܡܘܗ̈ܒܬܐ. ܘܫܕܪ ܐܢܘܢ ܡܢ ܠܘܬ ܐܝܣܚܩ ܒܪܗ. ܥܕ ܗ̣ܘ ܚܝ ܩܕܡܝܬ ܠܐܪܥܐ\f b \fr 25.6\fr* \fk ܠܐܬܪܐ\fk* \ft 12a1, L\ft*\f* ܕܡܕܢܚܐ. +\v 7 ܘܗܠܝܢ ܝܘܡ̈ܝ ܫ̈ܢܝ ܚܝ̈ܘܗܝ ܕܐܒܪܗܡ ܕܚ̣ܝܐ. ܡܐܐ ܘܫܒܥܝܢ ܘܚܡܫ ܫ̈ܢܝܢ. +\v 8 ܘܐܬܟܪܗ ܘܡܝܬ ܐܒܪܗܡ ܒܣܝܒܘܬܐ ܛܒܬܐ. ܣܐܒ ܘܣܒ̣ܥ ܝܘܡ̈ܬܗ ܘܐܬܟܢܫ ܠܘܬ ܥܡܗ. +\v 9 ܘܩܒܪܘܗܝ ܐܝܣܚܩ ܘܐܝܫܡܥܝܠ ܒܢ̈ܘܗܝ. ܒܡܥܪܬܐ ܐܥܝܦܬܐ ܕܒܚܩܠܐ ܕܥܦܪܘܢ ܒܪ ܨܚܪ ܚܬܝܐ ܕܩܕܡ ܡܡܪܐ. +\v 10 ܚܩܠܐ ܕܙܒܢ ܐܒܪܗܡ ܡܢ ܒ̈ܢܝ ܚܝܬ ܠܝܘܪܬܢܐ ܕܩܒܪܐ\f c \fr 25.10\fr* \fk ܠܝܘܪܬܢܐ ܕܩܒܪܐ\fk* \ft om. 5b1\ft*\f*. ܬܡܢ ܐܬܩܒܪ ܐܒܪܗܡ ܘܣܪܐ ܐܢܬܬܗ. +\v 11 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܕܡܝܬ ܐܒܪܗܡ. ܒܪܟ ܐܠܗܐ ܠܐܝܣܚܩ ܒܪܗ. ܘܝܬ̣ܒ ܐܝܣܚܩ ܥܠ ܓܢܒ ܒܪܐ ܕܚܝܐ ܚܙܢܝ ܕܚܝܐ\f d \fr 25.11\fr* \fk ܕܚܝܐ\fk* \ft om. 10g1\ft*\f*. +\v 12 ܘܗܠܝܢ ܬܘܠܕܬ̈ܗ ܕܐܝܫܡܥܝܠ ܒܪ ܐܒܪܗܡ. ܕܝܠ̣ܕܬ ܗܓܪ ܡܨܪܝܬܐ ܐܡܬܗ̇ ܕܣܪܐ ܠܐܒܪܗܡ. +\v 13 ܘܗܠܝܢ ܫܡ̈ܗܐ ܕܒܢ̈ܝ ܐܝܫܡܥܝܠ ܒܫܡ̈ܗܝܗܘܢ ܠܬ̈ܘܠܕܬܗܘܢ. ܒܘܟܪܗ ܕܐܝܫܡܥܝܠ ܢܒܝܘܬ. ܘܩܕܪ ܘܐܪܒܠ. ܘܡܒܣܡ. +\v 14 ܘܡܫܡܥ. ܘܪܘܡܐ ܘܡܣܐ. +\v 15 ܘܚܕܪ ܘܬܝܡܐ ܘܢܛܘܪ ܘܢܦܫ. ܘܩܕܡ. +\v 16 ܗܠܝܢ ܐܢܘܢ ܒܢ̈ܘܗܝ ܕܐܝܫܡܥܝܠ. ܘܗܠܝܢ ܫ̈ܡܗܝܗܘܢ †ܒܕܝܪ̈ܝܗܘܢ† ܘܒܛܝܪ̈ܝܗܘܢ. ܬܪܥܣܪ̈ ܪܘܪ̈ܒܢܝܢ ܠܐܡ̈ܘܬܗܘܢ. +\v 17 ܘܗܠܝܢ ܫ̈ܢܝ ܚܝ̈ܘܗܝ ܕܐܝܫܡܥܝܠ. ܡܐܐ ܘܬܠܬܝܢ ܘܫܒܥ ܫ̈ܢܝܢ. ܘܐܬܟܪܗ ܘܡܝܬ ܘܐܬܟܢܫ ܠܘܬ ܥܡܗ. +\v 18 ܘܫܪܘ ܡܢ ܚܘܝܠܐ ܘܥܕܡܐ ܠܫܘܕ ܕܩܕܡ ܡܨܪܝܢ. ܕܒܡܥܠܢܐ ܕܐܬܘܪ. ܥܠ ܬܚܘܡܐ ܕܟܠܗܘܢ ܐܚ̈ܘܗܝ ܫ̣ܪܐ. +\v 19 ܘܗܠܝܢ ܬܘ̈ܠܕܬܗ ܕܐܝܣܚܩ ܒܪ ܐܒܪܗܡ. ܐܒܪܗܡ ܐܘܠܕ ܠܐܝܣܚܩ. +\v 20 ܘܗܘܐ ܐܝܣܚܩ ܒܪ ܐܪ̈ܒܥܝܢ ܫ̈ܢܝܢ. ܟܕ ܢܣ̣ܒ ܠܪܦܩܐ ܒܪܬ ܒܬܘܐܝܠ ܐܪܡܝܐ ܡܢ ܦܕܢ ܕܐܪܡ. ܚܬܗ ܕܠܒܢ ܐܪܡܝܐ ܠܗ ܐܢܬܬܐ. +\v 21 ܘܨܠܝ ܐܝܣܚܩ ܩܕܡ ܡܪܝܐ ܡܛܠ ܐܢܬܬܗ ܕܥܩܪܬܐ ܗܝ. ܘܥܢܝܗܝ ܡܪܝܐ ܘܒܛܢܬ ܪܦܩܐ ܐܢܬܬܗ. +\v 22 ܘܐܠܨܝܢ ܒ̈ܢܝܗ̇ ܒܟܪܣܗ̇. ܘܐܡ̣ܪܬ ܐܢ ܗܟܢܐ ܗܘ ܠܡܢܐ ܚܝܐ ܐܢܐ. ܘܐܙܠ̣ܬ ܠܡܫܐܠ ܡܢ ܡܪܝܐ. +\v 23 ܘܐܡ̣ܪ ܠܗ̇ ܡܪܝܐ. ܬܪ̈ܝܢ ܥܡ̈ܡܝܢ ܒܡ̈ܥܝܟܝ. ܘܬܪ̈ܬܝܢ ܐ̈ܡܘܢ ܡܢ ܡ̈ܥܝܟܝ ܢܬܦܪܫܢ. ܘܐܘܡܬܐ ܡܢ ܐܘܡܬܐ ܬܥܫܢ. ܘܪܒܐ ܢܫܬܥܒܕ ܠܙܥܘܪܐ. +\v 24 ܘܫܠ̣ܡܘ ܝܘܡ̈ܬܗ̇ ܠܡܐܠܕ. ܘܗܐ ܬܡ̈ܐ ܒܟܪܣܗ̇. +\v 25 ܘܢܦܩ ܩܕܡܝܐ ܣܡܩܪܝ. ܘܟܠܗ ܥܙܩ̈ܬܐ ܕܣܥܪܐ. ܘܩ̣ܪܐ ܫܡܗ ܥܣܘ. +\v 26 ܘܒܬܪܗ\f e \fr 25.26\fr* \fk ܘܒܬܪܟܢ\fk* \ft 5b1\ft*\f* ܢܦ̣ܩ ܐܚܘܗܝ. ܘܐܝܕܗ ܐܚܝܕܐ ܒܥܩܒܗ ܕܥܣܘ. ܘܩ̣ܪܐ ܫܡܗ ܝܥܩܘܒ. ܘܐܝܣܚܩ ܒܪ ܫܬܝܢ ܗܘܐ ܫ̈ܢܝܢ. ܟܕ ܝܠ̣ܕܬ ܐܢܘܢ ܘܪܒܘ ܛ̈ܠܝܐ. +\v 27 ܘܗܘ̣ܐ ܥܣܘ ܓܒܪܐ ܝܕܥ ܨܝܕܐ ܓܒܪܐ ܕܒܪܐ. ܘܝܥܩܘܒ ܓܒܪ ܬܡܝܡ ܘܥܡ̇ܪ ܒܡܫܟܢܐ. +\v 28 ܘܪܚ̣ܡ ܐܝܣܚܩ ܠܥܣܘ. ܡܛܠ ܕܨܝܕܗ ܒܦܘܡܗ. ܘܪܦܩܐ ܪܚ̣ܡܬ ܠܝܥܩܘܒ. +\v 29 ܘܒܫ̇ܠ ܝܥܩܘܒ ܒܘܫܠܐ. ܘܗܐ ܥܣܘ ܐܚܘܗܝ ܐܬ̣ܐ\f f \fr 25.29\fr* \fk ܘܐܬܐ ܥܣܘ\fk* \ft 5b1\ft*\f* ܡܢ ܚܩܠܐ. ܘܗ̣ܘ ܡ̣ܛܪܦ. +\v 30 ܘܐܡ̣ܪ ܥܣܘ ܠܝܥܩܘܒ. ܐܛܥܡܝܢܝ ܡܢ ܣܘܡ̈ܩܐ ܣܘܡܩܐ ܗܢܐ. ܡܛܠ ܕܡ̣ܛܪܦ ܐܢܐ. ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܫܡܗ ܐܕܘܡ. +\v 31 ܐܡ̇ܪ ܠܗ\f g \fr 25.31\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܝܥܩܘܒ. ܙܒ̇ܢ ܠܝ ܝܘܡܢܐ ܒܘܟܪܘܬܟ. +\v 32 ܘܐܡ̣ܪ ܥܣܘ ܒܠܒܗ\f h \fr 25.32\fr* \fk ܒܢܦܫܗ\fk* \ft 12b1mg, L\ft*\f*. ܗܐ ܐܢܐ ܐ̇ܙܠ ܐܢܐ\f i \fr 25.32\fr* \fk ܐܢܐ\fk* \ft om. 7h5\ft*\f* ܠܡܡܬ. ܠܡܢܐ\f j \fr 25.32\fr* \fk ܡܢܐ\fk* \ft L\ft*\f* ܐܙܠܐ ܠܝ ܒܘܟܪܘܬܐ. +\v 33 ܐܡ̇ܪ ܠܗ\f k \fr 25.33\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܝܥܩܘܒ. ܝܡܝ ܠܝ ܝܘܡܢܐ ܘܝܡܐ ܠܗ. ܘܙܒܢ ܒܘܟܪܘܬܗ ܠܝܥܩܘܒ. +\v 34 ܘܝܥܩܘܒ ܝܗ̣ܒ ܠܥܣܘ\f l \fr 25.34\fr* \fk ܠܗ\fk* \ft 12b2\ft*\f* ܠܡܠܥܣ ܠܚܡܐ ܘܒܘܫܠܐ ܕܛܠܦܚ̈ܐ. ܘܠܥܣ ܘܐܫܬܝ ܘܩܡ ܐܙܠ. ܘܒܣ̇ܪ ܥܣܘ ܥܠ ܒܘܟܪܘܬܐ. +\c 26 +\v 1 ܘܗܘܐ ܟܦܢܐ ܒܐܪܥܐ. ܣܛܪ ܡܢ ܟܦܢܐ ܩܕܡܝܐ ܕܗܘ̣ܐ ܒܝܘ̈ܡܝ ܐܒܪܗܡ. ܘܐܙ̣ܠ ܐܝܣܚܩ ܠܘܬ ܐܒܝܡܠܟ ܡ̇ܠܟܐ ܕܦܠܫ̈ܬܝܐ ܠܓܕܪ. +\v 2 ܘܐܬܚܙܝ ܠܗ ܡܪܝܐ ܘܐܡ̣ܪ ܠܗ. ܠܐ ܬܚܘܬ ܠܡܨܪܝܢ. ܫ̣ܪܝ ܒܐܪܥܐ ܕܐܡ̣ܪ ܠܟ. +\v 3 ܥܡ̣ܪ ܒܐܪܥܐ ܗܕܐ. ܘܐ̇ܗܘܐ ܥܡܟ ܘܐܒܪܟܟ. ܡܛܠ ܕܠܟ ܘܠܙܪܥܟ ܐܬܠ ܟܘܠܗܝܢ ܡ̈ܠܟܘܬܐ\f a \fr 26.3\fr* \fk ܐܪ̈ܥܬܐ\fk* \ft 5b1\ft*\f* ܗܠܝܢ. ܘܐܩܝܡ ܡ̈ܘܡܬܐ ܕܝܡ̇ܝܬ ܠܐܒܪܗܡ ܐܒܘܟ. +\v 4 ܘܐܣܓܐ ܙܪܥܟ ܐܝܟ ܟܘܟܒ̈ܝ ܫܡܝܐ. ܘܐܬܠ ܠܙܪܥܟ ܟܠܗܝܢ ܐܪ̈ܥܬܐ ܗܠܝܢ. ܘܢܬܒܪܟܘܢ ܒܙܪܥܟ ܟܠܗܘܢ ܥܡ̈ܡܐ ܕܐܪܥܐ. +\v 5 ܚܠܦ ܕܫܡ̣ܥ ܐܒܪܗܡ ܒܩܠܝ. ܘܢܛܪ ܢܛܘܪ̈ܬܝ ܘܦܘܩ̈ܕܢܝ ܘܩܝ̈ܡܝ ܘܢܡܘ̈ܣܝ. +\v 6 ܘܝܬ̣ܒ ܐܝܣܚܩ ܒܓܕܪ. +\v 7 ܘܫܐܠܘܗܝ ܐܢܫ̈ܝ ܐܬܪܐ ܥܠ ܐܢܬܬܗ. ܘܐܡ̣ܪ ܚܬܝ\f b \fr 26.7\fr* \fk ܕ\fk* \ft 12a1, 12b1\ft*\f* ܗܝ. ܡܛܠ ܕܕܚ̣ܠ ܕܢܐܡܪ ܕܐܢܬܬܝ ܗ̣ܝ. ܕܠܡܐ ܢܩܛܠܘܢܗ ܐܢܫ̈ܝ ܐܬܪܐ ܡܛܠ ܪܦܩܐ ܕܫܦܝܪܐ ܗܝ ܒܚܙܘܗ̇. +\v 8 ܘܗܘܐ ܕܟܕ\f c \fr 26.8\fr* \fk ܟܕ\fk* \ft 5b1\ft*\f* ܢܓ̣ܪܘ ܠܗ ܬܡܢ ܝܘܡ̈ܬܐ. ܐܕܝܩ ܐܒܝܡܠܟ ܡ̇ܠܟܐ ܕܦܠܫܬ̈ܝܐ ܡܢ ܟܘܬܐ. ܘܚܙܝܗܝ ܠܐܝܣܚܩ ܟܕ ܡܓܚܟ ܥܡ ܪܦܩܐ ܐܢܬܬܗ. +\v 9 ܘܩ̣ܪܐ ܐܒܝܡܠܟ ܠܐܝܣܚܩ ܘܐܡ̣ܪ ܠܗ. ܗܐ ܐܢܬܬܟ ܗܝ. ܐܝܟܢܐ ܐܡ̇ܪ ܗܘܝ̣ܬ ܕܚܬܝ ܗܝ. ܐܡ̇ܪ ܠܗ ܐܝܣܚܩ. ܡܛܠ ܕܐܡ̇ܪܬ ܕܠܡܐ ܐܡܘܬ ܡܛܠܬܗ̇. +\v 10 ܐܡ̇ܪ ܠܗ\f d \fr 26.10\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܐܒܝܡܠܟ. ܡܢܘ ܗܢܐ ܕܥܒ̣ܕܬ ܠܢ. ܥܕ ܩܠܝܠ ܕܡ̇ܟ ܗܘ̣ܐ ܚܕ ܡܢ ܥܡܐ ܥܡ ܐܢܬܬܟ. ܘܡ̇ܝܬܐ ܗܘܝ̣ܬ ܥܠܝܢ ܚܛܗܐ. +\v 11 ܘܦܩ̇ܕ ܐܒܝܡܠܟ ܠܟܠܗ ܥܡܐ ܘܐܡ̣ܪ. ܡ̇ܢ ܕܡ̇ܗܪ ܠܓܒܪܐ ܗܢܐ ܘܠܐܢܬܬܗ ܡܬܩܛܠܘ ܢܬܩܛܠ. +\v 12 ܘܙܪܥ ܐܝܣܚܩ ܒܐܪܥܐ\f e \fr 26.12\fr* \fk ܗ̇ܝ\fk* \ft add. 5b1\ft*\f*. ܘܐܫܟܚ ܒܫܢܬܐ ܗ̇ܝ ܡܐܐ ܕܣܥܪ̈ܐ. ܘܒܪܟܗ ܡܪܝܐ. +\v 13 ܘܝܪ̣ܒ ܓܒܪܐ. ܘܐܙ̇ܠ ܡܐܙܠ ܥܕܡܐ ܕܝܪ̣ܒ ܛܒ. +\v 14 ܘܗܘ̣ܐ ܠܗ ܩܢܝܢܐ ܕܥܢܐ. ܘܩܢܝܢܐ ܕܬܘܪ̈ܐ ܘܥܒܕܬܐ ܪܒܬܐ. ܘܛܢܘ ܒܗ ܦܠܫܬ̈ܝܐ. +\v 15 ܘܟܠܗܝܢ ܒܪ̈ܐ ܕܚܦܪܘ ܥܒ̈ܕܝ ܐܒܘܗܝ. ܒܝ̈ܘܡܘܗܝ ܕܐܒܪܗܡ ܐܒܘܗܝ. ܛܡܡܘ ܐ̈ܢܝܢ ܦܠܫ̈ܬܝܐ. ܘܡܠܘ ܐ̈ܢܝܢ ܥܦܪܐ. +\v 16 ܘܐܡ̣ܪ ܐܒܝܡܠܟ ܠܐܝܣܚܩ. ܙܠ ܠܟ ܡܢ ܠܘܬܢ. ܡܛܠ ܕܥܫ̣ܢܬ ܡܢܢ ܛܒ. +\v 17 ܘܐܙ̣ܠ ܡܢ ܬܡܢ ܐܝܣܚܩ. ܘܫ̣ܪܐ ܒܢܚܠܐ ܕܓܕܪ. ܘܝܬ̣ܒ ܬܡܢ. +\v 18 ܘܗ̣ܦܟ ܐܝܣܚܩ ܘܚܦ̣ܪ ܒܪ̈ܐ ܕܡ̈ܝܐ. ܕܚܦܪܘ ܥܒ̈ܕܝ ܐܒܘܗܝ. ܒܝ̈ܘܡܘܗܝ ܕܐܒܪܗܡ ܐܒܘܗܝ. ܘܛܡܡܘ ܐܢܝ̈ܢ ܦܠܫ̈ܬܝܐ. ܡܢ ܒܬܪ ܕܡܝܬ ܐܒܪܗܡ\f f \fr 26.18\fr* \fk ܐܒܘܗܝ\fk* \ft 12b2\ft*\f*. ܘܩ̣ܪܐ ܠܗܝܢ ܫ̈ܡܗܐ ܐܝܟ ܫܡ̈ܗܐ ܕܩ̇ܪܐ ܗܘܐ ܠܗܝܢ ܐܒܘܗܝ. +\v 19 ܘܚܦܪܘ ܥܒ̈ܕܘܗܝ ܕܐܝܣܚܩ ܒܢܚܠܐ. ܘܐܫܟܚܘ ܬܡܢ ܒܪܐ ܕܡ̈ܝܐ ܚ̈ܝܐ. +\v 20 ܘܢܨܘ ܪ̈ܥܘܬܐ ܕܓܕܪ ܥܡ ܪ̈ܥܘܬܐ ܕܐܝܣܚܩ ܘܐܡܪܘ. ܕܝܠܢ ܐܢܘܢ ܡ̈ܝܐ. ܘܩ̣ܪܐ ܫܡܗ̇ ܕܒܪܐ [-]\f g \fr 26.20\fr* \fk ܗ̇ܝ\fk* \ft 7a1\ft*\f* ܥܣܩܐ. ܡܛܠ ܕܐܬܥܣܩܘ ܥܡܗ. +\v 21 ܘܚܦܪܘ ܒܪܐ ܐܚܪܬܐ. ܘܢܨܘ ܐܦ\f h \fr 26.21\fr* \fk ܐܦ\fk* \ft om. 5b1*\ft*\f* ܥܠܝܗ̇. ܘܩ̣ܪܐ [-]\f i \fr 26.21\fr* \fk ܐܦ\fk* \ft 7a1\ft*\f* ܫܡܗ̇ ܣܛܢܐ. +\v 22 ܘܫ̣ܢܝ ܡܢ ܬܡ̇ܢ. ܘܚܦܪܘ ܒܪܐ ܐܚܪܬܐ ܘܠܐ ܢܨܘ ܥܠܝܗ̇. ܘܩ̣ܪܐ ܫܡܗ̇\f j \fr 26.22\fr* \fk ܘܩܪܗ̇\fk* \ft 12b1\ft*\f* ܪܚܒܘܬ. ܘܐܡ̣ܪ. ܗܫܐ ܐܪܘܚ ܠܢ ܡܪܝܐ ܘܣܓܝܢ ܒܐܪܥܐ. +\v 23 ܘܣܠ̣ܩ ܡܢ ܬܡ̇ܢ ܠܒܪܫܒܥ. +\v 24 ܘܐܬܓܠܝ ܥܠܘܗܝ ܡܪܝܐ ܒܠܠܝܐ ܗ̇ܘ ܘܐܡ̣ܪ ܠܗ. ܐܢܐ ܐܢܐ ܐܠܗܗ ܕܐܒܪܗܡ ܐܒܘܟ. ܠܐ ܬܕܚܠ ܡܛܠ ܕܥܡܟ ܐܢܐ. ܘܐܒܪܟܟ ܘܐܣܓܐ ܙܪܥܟ. ܡܛܠ ܐܒܪܗܡ ܥܒܕܝ. +\v 25 ܘܒܢ̣ܐ ܬܡ̇ܢ ܡܕܒܚܐ. ܘܩ̣ܪܐ ܒܫܡܗ ܕܡܪܝܐ. ܘܢܩ̣ܫ ܬܡܢ ܡܫܟܢܗ. ܘܚܦܪܘ ܬܡ̇ܢ ܥܒ̈ܕܘܗܝ ܕܐܝܣܚܩ ܒܪܐ. +\v 26 ܘܐܒܝܡܠܟ ܐܬ̣ܐ ܠܘܬܗ ܡܢ ܓܕܪ. ܘܐܚܙܘܬ ܪܚܡܗ ܘܦܝܟܠ ܪܒ ܚܝܠܗ. +\v 27 ܘܐܡ̣ܪ ܠܗܘܢ ܐܝܣܚܩ. ܡܢܐ ܐܬܝ̣ܬܘܢ ܠܘܬܝ. ܐܢܬܘܢ ܣܢܝܬܘܢܢܝ ܘܫܕܪܬܘܢܢܝ ܡܢ ܠܘܬܟܘܢ. +\v 28 ܘܐܡܪܘ ܠܗ\f k \fr 26.28\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܡܚܙܐ ܚܙܝܢ ܕܗܘܐ ܡܪܝܐ ܥܡܟ. ܘܐܡܪܢ ܕܬܗܘܐ ܡܘ̈ܡܬܐ ܒܝܢܝܢ ܘܠܟ. ܘܢܩܝܡ ܩܝܡܐ ܥܡܟ. +\v 29 ܕܠܐ ܬܥܒܕ ܠܢ ܒܝܫܬܐ. ܐܝܟܢܐ ܕܠܐ ܐܗܪܢܟ. ܘܐܝܟܢܐ\f l \fr 26.29\fr* \fk ܘܐܝܟ\fk* \ft 5b1\ft*\f* ܕܥܒܕܢ ܠܘܬܟ ܫܦܝܪܬܐ ܘܫܕܪܢܟ ܒܫܠܡܐ. ܐܢܬ ܗ̣ܘ ܗܫܐ ܒܪܝܟܗ ܕܡܪܝܐ. +\v 30 ܘܥܒ̣ܕ ܠܗܘܢ ܡܫܬܝܐ. ܘܠܥܣܘ ܘܐܫܬܝܘ. +\v 31 ܘܩ̇ܕܡܘ ܒܨܦܪܐ ܘܝܡܘ ܓܒܪ ܠܐܚܘܗܝ\f m \fr 26.31\fr* \fk ܠܚܒܪܗ\fk* \ft 5b1\ft*\f*. ܘܫܕܪ ܐܢܘܢ ܐܝܣܚܩ. ܘܐܙܠܘ ܡܢ ܠܘܬܗ ܒܫܠܡܐ. +\v 32 ܘܗܘ̣ܐ ܒܝܘܡܐ ܗ̇ܘ ܘܐܬܘ ܥܒ̈ܕܘܗܝ ܕܐܝܣܚܩ. ܘܚܘܝܘܗܝ ܥܠ ܨܒܘܬܐ ܕܒܪܐ ܕܚܦܪܘ. ܘܐܡܪܘ ܠܗ ܐܫܟܚܢ ܡ̈ܝܐ. +\v 33 ܘܩ̣ܪܐ ܫܡܗ̇ ܣܒܥܐ. ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܫܡܗ̇ ܕܩܪܝܬܐ ܒܪܣܒܥ. ܥܕܡܐ ܠܝܘܡܢܐ. +\v 34 ܘܗܘ̣ܐ ܥܣܘ ܒܪ ܐܪ̈ܒܥܝܢ ܫ̈ܢܝܢ. ܘܢܣ̣ܒ ܐܢܬܬܐ ܠܝܗܘܕܝܬ ܒܪܬ ܒܪܝ ܚܬܝܐ. ܘܠܒܣܡܬ ܒܪܬ ܐܠܘܢ ܚܘܝܐ. +\v 35 ܘܗ̈ܘܝ ܡܡܪ̈ܢ ܠܪܘܚܗ ܕܐܝܣܚܩ ܘܕܪܦܩܐ. +\c 27 +\v 1 ܘܗܘ̣ܐ ܕܟܕ ܣܐܒ ܐܝܣܚܩ ܘܝܩ̣ܪ ܥܝܢ̈ܘܗܝ ܠܡܚܙܐ. ܩ̣ܪܐ ܠܥܣܘ ܒܪܗ ܪܒܐ ܘܐܡ̣ܪ ܠܗ ܒܪܝ. ܘܐܡ̣ܪ ܗܐ ܐܢܐ. +\v 2 ܘܐܡ̣ܪ ܠܗ ܐܝܣܚܩ\f a \fr 27.2\fr* \fk ܠܗ ܐܝܣܚܩ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܐܢܐ ܣܐ̇ܒܬ. ܘܠܐ ܝܕܥ ܐܢܐ ܝܘܡܐ ܕܡܐܬ ܐܢܐ ܒܗ. +\v 3 ܗܫܐ ܣܒ ܡܐ̈ܢܝܟ ܣܝܦܟ ܘܩܫܬܟ. ܘܦܘܩ ܠܕܒܪܐ. ܘܨܘܕ\f b \fr 27.3\fr* \fk ܠܝ\fk* \ft add. 5b1\ft*\f* ܨܝܕܐ. +\v 4 ܘܥܒ̣ܕ\f c \fr 27.4\fr* \fk ܠܝ\fk* \ft add. 5b1\ft*\f* ܒܘܫܠܐ ܐܝܟ ܕܪܚ̇ܡܬ. ܘܐܝܬܐ ܠܝ ܐܟܘܠ. ܡܛܠ ܕܬܒܪܟܟ ܢܦܫܝ ܥܕܠܐ ܐܡܘܬ. +\v 5 ܘܪܦܩܐ ܫܡܥ̣ܬ ܟܕ ܐܡ̣ܪ ܐܝܣܚܩ ܠܥܣܘ ܒܪܗ. ܘܐܙ̣ܠ ܥܣܘ ܠܚܩܠܐ ܠܡܨܕ ܨܝܕܐ ܠܡܝܬܝܘ. +\v 6 ܘܪܦܩܐ ܐܡ̣ܪܬ ܠܝܥܩܘܒ ܒܪܗ̇. ܗܐ ܫܡ̇ܥܬ ܠܐܒܘܟ ܕܐܡ̣ܪ ܠܥܣܘ ܐܚܘܟ. +\v 7 ܐܝܬܐ ܠܝ ܨܝܕܐ ܘܥܒ̣ܕ ܠܝ ܒܘܫܠܐ. ܘܐܟܘܠ ܘܐܒܪܟܟ ܩܕܡ ܡܪܝܐ ܩܕܡ ܡܘܬܝ. +\v 8 ܗܫܐ ܒܪܝ ܫܡ̣ܥ ܒܩܠܝ\f d \fr 27.8\fr* \fk ܠ\fk* \ft 12b1txt\ft*\f* ܠܡܕܡ ܕܡܦܩܕܐ ܐܢܐ ܠܟ. +\v 9 ܙܠ ܠܥܢܐ ܘܣܒ ܠܝ ܡܢ ܬܡܢ ܬܪ̈ܝܢ ܓܕ̈ܝܐ ܕܥܙ̈ܐ ܕܛܒܝ̈ܢ. ܘܐܥܒܕ ܐܢܘܢ ܒܘܫܠܐ ܠܐܒܘܟ ܐܝܟ ܕܪܚ̇ܡ. +\v 10 ܘܐܥܠ ܠܐܒܘܟ ܘܢܐܟܘܠ. ܘܢܒܪܟܟ ܩܕܡ ܡܪܝܐ ܡܢ\f e \fr 27.10\fr* \fk ܩܕܡ ܡܪܝܐ ܡܢ\fk* \ft om. 5b1\ft*\f* ܩܕܡ ܡܘܬܗ. +\v 11 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܪܦܩܐ ܐܡܗ. ܗܐ ܥܣܘ ܐܚܝ ܓܒܪ ܣܥܪ. ܘܐܢܐ ܓܒܪ ܫܥܥ. +\v 12 ܕܠܡܐ ܢܡܘܫܢܝ ܐܒܝ ܘܐܗܘܐ ܒܥܝܢ̈ܘܗܝ ܐܝܟ ܡܒܙܚܢܐ. ܘܬܝܬܝܢ ܥܠܝ ܠܘ̈ܛܬܐ ܘܠܐ ܒܘܪ̈ܟܬܐ. +\v 13 ܘܐܡ̣ܪܬ ܠܗ ܐܡܗ. ܥܠܝ ܠܘ̈ܛܬܟ ܒܪܝ. ܒܠܚܘܕ\f f \fr 27.13\fr* \fk ܒܪܡ\fk* \ft 5b1\ft*\f* ܫܡܥ ܒܩܠܝ ܘܙܠ ܣܒ ܠܝ. +\v 14 ܘܐܙܠ ܢܣ̣ܒ ܘܐܝܬܝ ܠܐܡܗ. ܘܥܒ̣ܕܬ ܐܡܗ ܒܘܫܠܐ ܐܝܟܢܐ\f g \fr 27.14\fr* \fk ܐܝܟ\fk* \ft 5b1\ft*\f* ܕܪܚ̇ܡ ܐܒܘܗܝ. +\v 15 ܘܢܣ̣ܒܬ ܪܦܩܐ ܡܐ̈ܢܐ ܕܥܣܘ ܒܪܗ̇ ܪܒܐ\f h \fr 27.15\fr* \fk ܪܒܐ\fk* \ft om. 5b1\ft*\f*. ܐܪ̈ܓܝܓܐ ܕܐܝܬ ܥܡܗ̇ ܒܒܝܬܐ. ܘܐܠܒ̣ܫܬ ܠܝܥܩܘܒ ܒܪܗ̇ ܙܥܘܪܐ. +\v 16 ܘܡܫ̈ܟܐ ܕܓ̈ܕܝܐ ܕܥܙ̈ܐ. ܐܠܒ̣ܫܬ ܥܠ ܐ̈ܝܕܘܗܝ ܘܥܠ ܫܥܥܘܬܐ ܕܨܘܪܗ. +\v 17 ܘܝܗ̣ܒܬ ܒܘܫܠܐ ܘܠܚܡܐ. ܕܥܒ̣ܕܬ ܠܝܥܩܘܒ ܒܪܗ̇. +\v 18 ܘܐܥܠ ܠܐܒܘܗܝ ܘܐܡ̣ܪ ܐܒܝ. ܘܐܡ̣ܪ. ܗܐ ܐܢܐ. ܘܐܡ̣ܪ. ܡ̇ܢ ܐܢܬ ܒܪܝ. +\v 19 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܐܒܘܗܝ. ܐܢܐ ܗ̣ܘ ܒܪܟ\f i \fr 27.19\fr* \fk ܒܪܟ\fk* \ft om. 5b1\ft*\f* ܒܘܟܪܟ ܥܣܘ. ܥܒ̇ܕܬ ܐܝܟ ܕܐܡ̣ܪܬ ܠܝ. ܩܘܡ ܬܒ ܘܐܟܘܠ ܡܢ ܨܝܕܝ. ܡܛܠ ܕܬܒܪܟܢܝ ܢܦܫܟ. +\v 20 ܘܐܡ̣ܪ ܐܝܣܚܩ ܠܒܪܗ. ܡܢܘ ܗܢܐ ܕܒܥܓܠ ܐܫܟܚܬ ܒܪܝ. ܘܐܡ̣ܪ\f j \fr 27.20\fr* \fk ܠܐܒܘܗܝ\fk* \ft add. 7k12\ft*\f*. ܡܕܡ ܕܛܝܒ ܡܪܝܐ ܐܠܗܟ ܩܕܡܝ. +\v 21 ܘܐܡ̣ܪ\f k \fr 27.21\fr* \fk ܠܗ\fk* \ft add. 7k12\ft*\f* ܐܝܣܚܩ ܠܝܥܩܘܒ ܒܪܗ\f l \fr 27.21\fr* \fk ܒܪܗ\fk* \ft om. 5b1\ft*\f*. ܩܪܘܒ †ܢܐ†\f m \fr 27.21\fr* \fk †ܢܐ†\fk* \ft om. 10g1\ft*\f* ܐܡ̇ܘܫܟ ܒܪܝ. ܐܢ ܐܢܬ ܗ̣ܘ ܒܪܝ ܥܣܘ ܐܘ ܠܐ. +\v 22 ܘܩ̣ܪܒ ܝܥܩܘܒ ܠܘܬ ܐܝܣܚܩ ܐܒܘܗܝ ܘܡܫܗ. ܘܐܡ̣ܪ\f n \fr 27.22\fr* \fk ܐܝܣܚܩ\fk* \ft add. 7k12\ft*\f* ܩܠܐ ܕܝܥܩܘܒ ܘܓܫ̣ܬ ܐ̈ܝܕܝܐ ܕܥܣܘ. +\v 23 ܘܠܐ ܐܫܬܘܕܥܗ. ܡܛܠ ܕܗ̈ܘܝ ܐܝ̈ܕܘܗܝ ܐܝܟ ܐ̈ܝܕܝ ܥܣܘ ܐܚܘܗܝ ܣܥܪ̈ܢ ܘܒܪܟܗ. +\v 24 ܘܐܡ̣ܪ ܐܢܬ ܗ̣ܘ ܗܢܐ ܒܪܝ ܥܣܘ. ܘܐܡ̣ܪ ܐܢܐ ܗܘ. +\v 25 ܘܐܡ̣ܪ ܠܗ\f o \fr 27.25\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܩ̇ܪܒ ܠܝ ܐܟܘܠ ܡܢ ܨܝܕܐ ܕܒܪܝ. ܡܛܠ ܕܬܒܪܟܟ ܢܦܫܝ. ܘܩ̇ܪܒ ܠܗ ܘܠܥܣ. ܘܐܥܠ ܠܗ ܚܡܪܐ ܘܐܫܬܝ. +\v 26 ܘܐܡ̣ܪ ܠܗ ܐܝܣܚܩ ܐܒܘܗܝ. ܩܪܘܒ ܘܫܘܩܝܢܝ ܒܪܝ. +\v 27 ܘܩ̣ܪܒ ܘܢܫ̣ܩܗ. ܘܐܪܝܚ ܪܝܚܐ ܕܡܐ̈ܢܘܗܝ. ܘܒܪܟܗ ܘܐܡ̣ܪ. ܚܙܘ ܪܝܚܗ ܕܒܪܝ. ܐܝܟ ܪܝܚܐ ܕܚܩ̣ܠܐ ܕܒܪܟܗ̇ ܡܪܝܐ. +\v 28 ܢܬܠ ܠܟ ܐܠܗܐ ܡܢ ܛܠܐ ܕܫܡܝܐ ܘܡܢ ܫܘܡܢܗ̇ ܕܐܪܥܐ. ܘܣܘܓܐܐ ܕܥܒܘܪܐ ܘܕܚܡܪܐ. +\v 29 ܢܦܠܚܘܢܟ ܥܡ̈ܡܐ ܘܢܣ̈ܓܕܢ ܠܟ ܐ̈ܡܘܬܐ. ܗܘܝ ܪܫܐ ܠܐ̈ܚܝܟ. ܘܢܣܓܕܘܢ ܠܟ ܒܢ̈ܝ ܐܡܟ. ܠܝܛܝ̈ܟ ܠܝ̈ܛܝܢ ܘܒܪ̈ܟܝܟ ܒܪ̈ܝܟܝܢ. +\v 30 ܘܟܕ ܫ̇ܠܡ\f p \fr 27.30\fr* \fk ܓܡܪ\fk* \ft 5b1\ft*\f* ܐܝܣܚܩ ܠܡܒܪܟܘܬܗ ܠܝܥܩܘܒ. ܘܢܦ̣ܩ ܝܥܩܘܒ ܡܢ ܠܘܬ ܐܝܣܚܩ ܐܒܘܗܝ. ܘܗܐ ܥܣܘ\f q \fr 27.30\fr* \fk ܘܥܣܘ\fk* \ft 5b1\ft*\f* ܐܚܘܗܝ ܐܬܐ ܡܢ ܨܝܕܗ. +\v 31 ܘܥܒ̣ܕ ܐܦ ܗ̣ܘ ܒܘܫܠܐ. ܘܐܥܠ\f r \fr 27.31\fr* \fk ܘܐܘܒܠ\fk* \ft 10g1\ft*\f* ܠܐܒܘܗܝ. ܘܐܡ̣ܪ ܠܐܒܘܗܝ. ܢܩܘܡ ܐܒܝ ܘܢܠܥܣ ܡܢ ܨܝ̣ܕܐ ܕܒܪܗ\f s \fr 27.31\fr* \fk ܕܨܕ ܒܪܗ\fk* \ft 10g1\ft*\f*. ܡܛܠ ܕܬܒܪܟܢܝ ܢܦܫܟ. +\v 32 ܐܡ̇ܪ ܠܗ ܐܝܣܚܩ ܐܒܘܗܝ. ܡ̇ܢ ܐܢܬ. ܘܐܡ̣ܪ. ܐܢܐ ܗܘ ܒܪܟ ܒܘܟܪܟ ܥܣܘ. +\v 33 ܘܬܘܗ̇ ܐܝܣܚܩ ܬܘܗܬܐ ܪܒܬܐ ܘܥܫܝܢܬܐ\f t \fr 27.33\fr* \fk ܘܥܫܝܢܬܐ\fk* \ft om. 5b1\ft*\f* ܕܛܒ. ܘܐܡ̣ܪ ܡܢܘ ܟܝ ܗ̇ܘ ܕܨܕ ܨܝܕܐ ܘܐܝܬܝ ܠܝ. ܘܠܥܣ̇ܬ ܡܢ ܟܠ ܥܕܠܐ ܬܐܬܐ. ܘܒܪܟܬܗ ܘܐܦ ܒܪܝܟ ܢܗܘܐ. +\v 34 ܘܟܕ ܫܡܥ ܥܣܘ ܡ̈ܠܘܗܝ ܕܐܒܘܗܝ. ܐܝܠܠ ܐܝܠܠܬܐ ܪܒܬܐ ܘܡܪܝܪܬܐ ܕܛܒ. ܘܐܡ̣ܪ ܠܐܒܘܗܝ. ܒܪܟܝܢܝ ܐܦ ܠܝ ܐܒܝ. +\v 35 ܐܡ̇ܪ ܠܗ\f u \fr 27.35\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܐܒܘܗܝ\f v \fr 27.35\fr* \fk ܐܒܘܗܝ\fk* \ft om. 5b1, 7h5, 7k4\ft*\f*. ܥܠ ܐܚܘܟ ܒܢܟܠܐ ܘܩ̇ܒܠ ܐܢܝ̈ܢ\f w \fr 27.35\fr* \fk ܐܢܝ̈ܢ\fk* \ft om. 5b1\ft*\f* ܒܘܪ̈ܟܬܟ. +\v 36 ܘܐܡ̣ܪ ܥܣܘ. ܫܪܝܪܐܝܬ ܐܬܩܪܝ ܫܡܗ ܝܥܩܘܒ. ܕܢܟܠܢܝ ܗܐ\f x \fr 27.36\fr* \fk ܗܐ\fk* \ft om. 5b1\ft*\f* ܬܪ̈ܬܝܢ ܙܒ̈ܢܝܢ. ܒܘܟܪܘܬܝ ܢܣ̣ܒ. ܘܗܫܐ ܗܐ ܩ̇ܒܠ ܒܘܪ̈ܟܬܝ. ܘܐܡ̣ܪ ܥܣܘ ܠܐܒܘܗܝ\f y \fr 27.36\fr* \fk ܥܣܘ ܠܐܒܘܗܝ\fk* \ft om. 5b1\ft*\f*. ܠܝ ܠܐ ܫܒ̣ܩܬ ܒܘܪܟܬܐ. +\v 37 ܥܢ̣ܐ ܐܝܣܚܩ ܘܐܡ̣ܪ ܠܥܣܘ. ܗܐ ܪܫܐ ܥܒܕܬܗ ܠܟ. ܐܦ ܟܠܗܘܢ ܐ̈ܚܘܗܝ ܝܗ̇ܒܬ ܠܗ ܥܒ̈ܕܐ. ܘܒܥܒܘܪܐ ܘܒܚܡܪܐ ܣܡܟܬܗ. ܘܠܟ ܗܟܝܠ ܡܢܐ ܐܥܒܕ ܒܪܝ. +\v 38 ܘܐܡ̣ܪ ܥܣܘ ܠܐܒܘܗܝ\f z \fr 27.38\fr* \fk ܠܐܒܘܗܝ\fk* \ft om. 5b1\ft*\f*. ܒܘܪܟܬܐ ܚܕܐ ܗܝ ܠܟ ܐܒܝ\f { \fr 27.38\fr* \fk ܒܘܪܟܬܐ ܚܕܐ ܗܝ ܠܟ ܐܒܝ\fk* \ft om. 7h5\ft*\f*. ܒܪܟܝܢܝ ܐܦ ܠܝ ܐܒܝ. ܘܐܪܝܡ ܥܣܘ ܩܠܗ ܘܒܟ̣ܐ. +\v 39 ܥܢ̣ܐ ܐܝܣܚܩ ܐܒܘܗܝ ܘܐܡ̣ܪ ܠܗ. ܗܐ ܒܫܘܡܢܗ̇ ܕܐܪܥܐ ܢܗܘܐ ܡܘܬܒܟ. ܘܡܢ ܛܠܐ ܕܫܡܝܐ ܡܢ ܠܥܠ. +\v 40 ܘܥܠ ܚܪܒܟ ܬܚܐ. ܘܠܐܚܘܟ ܬܦܠܘܚ. ܘܐܢ ܬܬܘܒ ܢܥܒܪ ܢܝܪܗ ܡܢ ܨܘܪܟ. +\v 41 ܘܣܩ̣ܪ ܥܣܘ ܠܝܥܩܘܒ ܥܠ ܒܘܪ̈ܟܬܐ ܕܒܪܟܗ ܐܒܘܗܝ. ܘܐܡ̣ܪ ܥܣܘ ܒܠܒܗ. ܢܩ̣ܪܒܘܢ ܝܘܡ̈ܬܐ ܕܒܝܬ ܒܟ̈ܘܗܝ ܕܐܒܝ. ܘܐܩܛܠܝܘܗܝ ܠܝܥܩܘܒ ܐܚܝ. +\v 42 ܘܐܬܐܡܪ ܠܪܦܩܐ ܡ̈ܠܘܗܝ ܕܥܣܘ ܒܪܗ̇ ܩܫܝܫܐ. ܘܫ̣ܕܪܬ ܩ̣ܪܬ ܠܝܥܩܘܒ ܒܪܗ̇ ܙܥܘܪܐ ܘܐܡ̣ܪܬ ܠܗ. ܗܐ ܥܣܘ ܐܚܘܟ ܡܬܠܚܡ ܠܟ ܠܡܩܛܠܟ. +\v 43 ܗܫܐ ܒܪܝ ܫܡ̣ܥ ܒܩܠܝ. ܘܩܘܡ ܙܠ †ܠܟ†\f | \fr 27.43\fr* \fk †ܠܟ†\fk* \ft om. 7a1\ft*\f* ܠܘܬ ܠܒܢ ܐܚܝ ܠܚܪܢ. +\v 44 ܘܬܒ ܬܡ̇ܢ ܝܘܡ̈ܬܐ ܙܥܘܪ̈ܐ. ܥܕܡܐ ܕܢܬܬܢܝܚ ܪܘܓܙܗ ܕܐܚܘܟ. +\v 45 ܘܥܕܡܐ ܕܢܥܒܪ\f } \fr 27.45\fr* \fk ܕܢܗܦܘܟ\fk* \ft 5b1\ft*\f* ܪܘܓܙܗ ܕܐܚܘܟ ܡܢܟ. ܘܢܛܥܐ ܡܕܡ ܕܥܒ̣ܕܬ ܠܗ. ܘܐܫܕܪ ܐܕܒܪܟ ܡܢ ܬܡ̇ܢ. ܕܠܡܐ ܐܬܓܙܐ ܐܦ ܡܢ ܬܪ̈ܝܟܘܢ ܒܝܘܡܐ ܚܕ. +\v 46 ܘܐܡ̣ܪܬ ܪܦܩܐ ܠܐܝܣܚܩ. ܥܩ̣ܬ ܠܝ ܒܚܝ̈ܝ ܡܢ ܩܕܡ ܒܢ̈ܬ ܚܝܬ. ܐܢ ܢܣܒ ܝܥܩܘܒ ܐܢܬܬܐ ܡܢ ܒܢ̈ܬ ܚܝܬ. ܐܝܟ ܗܠܝܢ ܒܢ̈ܬ ܐܪܥܐ ܠܡܢܐ ܐܙܠܝܢ ܠܝ ܚ̈ܝܐ. +\c 28 +\v 1 ܘܩ̣ܪܐ ܐܝܣܚܩ ܠܝܥܩܘܒ\f a \fr 28.1\fr* \fk ܒܪܗ\fk* \ft add. 7k12\ft*\f*. ܘܒܪܟܗ ܘܦܩܕܗ ܘܐܡ̣ܪ ܠܗ. ܠܐ ܬܣܒ ܐܢܬܬܐ ܡܢ ܒܢ̈ܬ ܟܢܥܢ. +\v 2 ܩܘܡ ܙܠ ܠܟ ܠܦܕܢ ܕܐܪܡ. ܠܒܝܬ\f b \fr 28.2\fr* \fk ܠܘܬ\fk* \ft 5b1, 7h5, 12b1\ft*\f* ܒܬܘܐܝܠ ܐܒܘܗ̇ ܕܐܡܟ. ܘܣܒ ܠܟ ܡܢ ܬܡܢ\f c \fr 28.2\fr* \fk ܡܢ ܬܡܢ\fk* \ft om. 12a1\ft*\f* ܐܢܬܬܐ. ܡܢ ܒܢ̈ܬ ܠܒܢ ܐܚܘܗ̇ ܕܐܡܟ. +\v 3 ܘܐܝܠܫܕܝ ܢܒܪܟܟ\f d \fr 28.3\fr* \fk ܘܐܠܗܐ\fk* \ft 5b1\ft*\f*. ܘܢܟܒܪܟ\f e \fr 28.3\fr* \fk ܘܢܟܒܪܟ\fk* \ft om. 7k4\ft*\f* ܘܢܣܓܝܟ. ܘܬܗܘܐ ܠܟܢܫܐ ܕܥܡ̈ܡܐ. +\v 4 ܘܢܬܠ ܠܟ ܒܘܪ̈ܟܬܗ ܕܐܒܪܗܡ ܠܟ ܘܠܙܪܥܟ ܥܡܟ. ܘܢܘܪܬܟ ܐܪܥܐ ܕܡܥܡܪܟ. ܕܝܗ̣ܒ ܐܠܗܐ ܠܐܒܪܗܡ. +\v 5 ܘܫܕܪܗ ܐܝܣܚܩ ܠܝܥܩܘܒ. ܘܐܙ̣ܠ ܠܦܕܢ ܕܐܪܡ ܠܘܬ ܠܒܢ †ܒܪ† ܒܬܘܐܝܠ ܐܪܡܝܐ. ܐܚܘܗ̇ ܕܪܦܩܐ ܐܡܗ ܕܝܥܩܘܒ ܘܕܥܣܘ. +\v 6 ܘܚ̣ܙܐ ܥܣܘ ܕܒܪܟܗ ܐܝܣܚܩ ܠܝܥܩܘܒ ܐܚܘܗܝ. ܘܫܕܪܗ ܠܦܕܢ ܕܐܪܡ ܠܡܣܒ ܠܗ ܡܢ ܬܡܢ ܐܢܬܬܐ. ܟܕ ܒܪܟܗ ܘܦܩܕܗ ܘܐܡ̣ܪ ܠܗ. ܠܐ\f f \fr 28.6\fr* \fk ܕ\fk* \ft U\ft*\f* ܬܣܒ ܐܢܬܬܐ ܡܢ ܒܢ̈ܬ ܟܢܥܢ. +\v 7 ܘܫܡ̣ܥ ܝܥܩܘܒ ܠܐܒܘܗܝ ܘܠܐܡܗ. ܘܐܙ̣ܠ ܠܦܕܢ ܕܐܪܡ. +\v 8 ܘܚ̣ܙܐ ܥܣܘ ܕܒܝܫܢ ܒܢ̈ܬ ܟܢܥܢ ܒܥܝܢ̈ܝ ܐܝܣܚܩ ܐܒܘܗܝ. +\v 9 ܘܐܙܠ ܥܣܘ ܠܘܬ ܐܝܫܡܥܐܝܠ. ܘܢܣ̣ܒ ܠܒܣܡܬ ܒܪܬ ܐܝܫܡܥܝܠ ܒܪ ܐܒܪܗܡ ܚܬܗ ܕܢܒܝܘܬ ܥܠ ܢܫ̈ܘܗܝ ܠܗ ܐܢܬܬܐ. +\v 10 ܘܢܦ̣ܩ ܝܥܩܘܒ ܡܢ ܒܪܫܒܥ ܕܢܐܙܠ ܠܚܪܢ. +\v 11 ܘܦܓ̣ܥ ܒܐܬܪܐ ܘܒܬ ܬܡܢ. ܡܛܠ ܕܥܪܒ̣ܬ ܫܡܫܐ. ܘܢܣ̣ܒ ܡܢ ܟܐ̈ܦܐ ܕܐܬܪܐ ܘܣܡ ܐ̈ܣܕܘܗܝ. ܘܕܡ̣ܟ ܒܗ̇ܘ ܐܬܪܐ. +\v 12 ܘܚ̣ܙܐ ܒܚܠܡܗ. ܘܗܐ ܣܒܠܬܐ ܩܝܡܐ ܒܐܪܥܐ. ܘܪܫܗ̇ ܡ̇ܛܐ ܠܫܡܝܐ. ܘܗܐ ܡܠܐ̈ܟܘܗܝ ܕܐܠܗܐ ܣܠܩܝܢ ܘܢܚܬܝܢ ܒܗ̇. +\v 13 ܘܗܐ ܡܪܝܐ ܩܐܡ ܠܥܠ ܡܢܗ̇. ܘܐܡ̣ܪ ܐܢܐ ܐܢܐ ܡܪܝܐ ܐܠܗܗ ܕܐܒܪܗܡ ܐܒܘܟ. ܘܐܠܗܗ ܕܐܝܣܚܩ. ܐܪܥܐ ܕܕܡ̇ܟ ܐܢܬ ܥܠܝܗ̇ ܠܟ ܐܬܠܝܗ̇ ܘܠܙܪܥܟ. +\v 14 ܘܢܗܘܐ ܙܪܥܟ ܐܝܟ ܥܦܪܐ ܕܐܪܥܐ. ܘܬܣܓܐ ܠܡܕܢܚܐ ܘܠܡܥܪܒܐ. ܘܠܓܪܒܝܐ ܘܠܬܝܡܢܐ. ܘܢܬܒܪ̈ܟܢ ܒܟ ܟܠܗܝܢ ܫܪ̈ܒܬܐ ܕܐܪܥܐ ܘܒܙܪܥܟ. +\v 15 ܘܗܐ ܐܢܐ ܥܡܟ. ܘܐܛܪܟ ܠܐܝܟܐ ܕܬܐܙܠ ܘܐܗܦܟܟ ܠܐܪܥܐ ܗܕܐ. ܘܠܐ ܐܫܒܩܟ ܥܕܡܐ ܕܐܥܒܕ ܡܕܡ ܕܐܡ̇ܪܬ ܠܟ. +\v 16 ܘܐܬܬܥܝܪ ܝܥܩܘܒ ܡܢ ܫܢܬܗ ܘܐܡ̣ܪ. ܫܪܝܪܐܝܬ ܐܝܬ ܡܪܝܐ ܒܐܬܪܐ ܗܢܐ. ܘܐܢܐ ܠܐ ܝܕܥ̇ܬ. +\v 17 ܘܕܚܠ ܝܥܩܘܒ ܕܚܠܬܐ ܪܒܬܐ\f g \fr 28.17\fr* \fk ܝܥܩܘܒ ܕܚܠܬܐ ܪܒܬܐ\fk* \ft om. 5b1\ft*\f* ܘܐܡ̣ܪ. ܡܐ ܕܚܝܠ ܗܘ\f h \fr 28.17\fr* \fk ܗܘ\fk* \ft om. 5b1\ft*\f* ܐܬܪܐ ܗܢܐ ܝܘܡܢܐ\f i \fr 28.17\fr* \fk ܝܘܡܢܐ\fk* \ft om. 5b1\ft*\f*. ܠܝܬܘܗܝ ܗܢܐ ܐܠܐ ܐܢ\f j \fr 28.17\fr* \fk ܐܢ\fk* \ft om. 5b1\ft*\f* ܒܝܬܗ ܕܐܠܗܐ. ܘܗܢܘ\f k \fr 28.17\fr* \fk ܗܘ\fk* \ft add. 12b2c\ft*\f* ܬܪܥܗ̇ ܕܫܡܝܐ. +\v 18 ܘܩ̇ܕܡ ܝܥܩܘܒ ܒܫܦܪܐ\f l \fr 28.18\fr* \fk ܒܨܦܪܐ\fk* \ft 5b1\ft*\f*. ܘܢܣ̣ܒ ܟܐܦܐ ܕܣܡ ܐ̈ܣܕܘܗܝ. ܘܥܒ̣ܕܗ̇ ܩܝܡܬܐ. ܘܢܣ̣ܟ ܡܫܚܐ ܒܪܫܗ̇. +\v 19 ܘܩ̣ܪܐ ܝܥܩܘܒ\f m \fr 28.19\fr* \fk ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f* ܫܡܗ ܕܐܬܪܐ ܗ̇ܘ ܒܝܬ ܐܝܠ. ܒܪܡ ܠܘܙ ܫܡܗ ܗܘܐ ܠܐܬܪܐ\f n \fr 28.19\fr* \fk ܕ\fk* \ft 12a1\ft*\f* ܗ̇ܘ ܡܢ ܩܕܝܡ. +\v 20 ܘܢܕܪ ܝܥܩܘܒ ܢܕܪܐ ܘܐܡ̣ܪ. ܐܢ\f o \fr 28.20\fr* \fk ܐܢ\fk* \ft om. U\ft*\f* ܢܗܘ̣ܐ ܐܠܗܐ ܥܡܝ. ܘܢܢܛܪܢܝ ܒܐܘܪܚܐ ܗܕܐ ܕܐ̇ܙܠ ܐܢܐ ܒܗ̇\f p \fr 28.20\fr* \fk ܒܗ̇\fk* \ft om. 5b1\ft*\f*. ܘܢܬܠ ܠܝ\f q \fr 28.20\fr* \fk ܐܠܗܐ\fk* \ft add. 5b1\ft*\f* ܠܚܡܐ ܠܡܐܟܠ ܘܠܒܘܫܐ ܠܡܠܒܫ. +\v 21 ܘܐܗܦܘܟ ܒܫܠܡܐ ܠܒܝܬ\f r \fr 28.21\fr* \fk ܠܘܬ\fk* \ft 10g1\ft*\f* ܐܒܝ. ܢܗܘܐ ܠܝ ܡܪܝܐ ܐܠܗܐ. +\v 22 ܘܟܐܦܐ ܗܕܐ ܕܥܒ̇ܕܬ ܩܝܡܬܐ. ܬܗܘܐ ܒܝܬܗ ܕܐܠܗܐ. ܘܟܠ ܕܬܬܠ\f s \fr 28.22\fr* \fk ܕܐܝܬ\fk* \ft 7h5\ft*\f* ܠܝ ܡܥܣܪܘ ܐܥܣܪ ܠܟ. +\c 29 +\v 1 ܘܐܪܝܡ ܝܥܩܘܒ ܪ̈ܓܠܘܗܝ. ܘܐܙܠ ܠܐܪܥܐ ܕܒ̈ܢܝ ܡܕܢܚܐ. +\v 2 ܘܚ̣ܙܐ ܘܗܐ ܒܪܐ ܒܚܩܠܐ. ܘܬܡܢ ܬܠܬܐ ܓܙܪ̈ܝܢ ܕܥܢܐ †ܪ̈ܒܝܥܝܢ† ܥܠܝܗ̇. ܡܛܠ ܕܡܢ ܒܪܐ ܗ̇ܝ ܫܬܝܢ ܓܙܪ̈ܐ. ܘܟܐܦܐ ܪܒܬܐ ܥܠ ܦܘܡܗ̇ ܕܒܪܐ. +\v 3 ܘܡܬܟܢܫܝܢ ܠܬܡܢ ܟܠܗܘܢ ܓܙܪ̈ܐ. ܘܡܥܓܠܝܢ ܟܐܦܐ ܡܢ ܦܘܡܗ̇ ܕܒܪܐ ܘܡܫܩܝܢ ܥܢܐ\f a \fr 29.3\fr* \fk ܓܙܪ̈ܐ\fk* \ft 12a1, L\ft*\f*. ܘܡܗܦܟܝܢ ܟܐܦܐ ܠܦܘܡܗ̇ ܕܒܪܐ ܠܕܘܟܬܗ̇. +\v 4 ܐܡ̇ܪ ܠܗܘܢ ܝܥܩܘܒ. ܐ̈ܚܝ ܐܝܡܟܐ ܐܢܬܘܢ. ܐܡܪܝܢ ܠܗ ܡܢ ܚܪܢ ܚܢܢ. +\v 5 ܐܡ̇ܪ ܠܗܘܢ. ܝܕܥܝܢ ܐܢܬܘܢ\f b \fr 29.5\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f* ܠܠܒܢ ܒܪ ܢܚܘܪ. ܐܡܪ̈ܝܢ ܠܗ\f c \fr 29.5\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܝܕܥܝܢܢ. +\v 6 ܐܡ̇ܪ ܠܗܘܢ\f d \fr 29.6\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f* ܫ̣ܠܡ ܗܘ. ܐܡܪܝܢ ܠܗ\f e \fr 29.6\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܫܠܡ\f f \fr 29.6\fr* \fk ܗܘ\fk* \ft add. 8b1\ft*\f*. ܘܗܐ ܪܚܝܠ ܒܪܬܗ ܐܬܝܐ ܥܡ ܥܢܐ. +\v 7 ܐܡ̇ܪ ܠܗܘܢ ܝܥܩܘܒ\f g \fr 29.7\fr* \fk ܠܗܘܢ ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܗܐ\f h \fr 29.7\fr* \fk ܗܐ\fk* \ft om. 5b1\ft*\f* ܥܕܟܝܠ ܝܘܡܐ ܩܝܡ. ܠܐ ܗܘ̣ܐ ܙܒܢܐ ܠܡܟܢܫ ܒܥܝܪ̈ܐ\f i \fr 29.7\fr* \fk ܥܢܐ\fk* \ft 5b1\ft*\f*. ܐܫܩܘ ܥܢܐ ܘܙܠܘ ܐܪܥܘ. +\v 8 ܐܡܪܝܢ ܠܗ\f j \fr 29.8\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܡܫܟܚܝܢܢ ܥܕܡܐ ܕܡܬܟܢܫܝܢ ܟܠܗܘܢ ܓܙܪ̈ܐ. ܘܡܥܓܠܝܢ ܟܐܦܐ ܡܢ ܦܘܡܗ̇ ܕܒܪܐ. ܘܡܫܩܝܢ ܚܢܢ ܥܢܐ. +\v 9 ܘܥܕ\f k \fr 29.9\fr* \fk ܘܟܕ\fk* \ft 12a1\ft*\f* ܗ̣ܘ ܡܡܠܠ ܥܡܗܘܢ. ܪܚܝܠ ܐܬܬ ܥܡ ܥܢܐ ܕܐܒܘܗ̇ ܡܛܠ ܕܪܥܝܬܐ ܗܝ. +\v 10 ܘܟܕ ܚܙܗ̇ ܝܥܩܘܒ ܠܪܚܝܠ. ܒܪܬ ܠܒܢ ܐܚܘܗ̇ ܕܐܡܗ. ܘܠܥܢܐ ܕܠܒܢ ܐܚܘܗ̇ ܕܐܡܗ. ܩܪ̣ܒ ܝܥܩܘܒ ܘܥܓܠ ܟܐܦܐ ܡܢ ܦܘܡܗ̇ ܕܒܪܐ. ܘܐܫܩܝ ܠܥܢܐ ܕܠܒܢ ܐܚܘܗ̇ ܕܐܡܗ. +\v 11 ܘܢܫܩܗ̇ ܝܥܩܘܒ ܠܪܚܝܠ. ܘܐܪܝܡ ܩܠܗ ܘܒܟ̣ܐ. +\v 12 ܘܚܘܝ ܝܥܩܘܒ ܠܪܚܝܠ ܕܐܚܐ ܗܘ ܕܐܒܘܗ̇. ܘܕܒܪ ܪܦܩܐ ܗܘ. ܘܪܗ̣ܛܬ ܘܚ̣ܘܝܬ ܠܐܒܘܗ̇\f l \fr 29.12\fr* \fk ܠܒܝܬ ܐܒܘܗ̇\fk* \ft 8b1\ft*\f*. +\v 13 ܘܟܕ ܫܡ̣ܥ ܠܒܢ ܫܡܥܐ ܕܝܥܩܘܒ ܒܪ ܚܬܗ. ܪܗ̣ܛ ܠܐܘܪܥܗ ܘܥܦܩܗ ܘܢܫܩܗ. ܘܐܝܬܝܗ ܠܒܝܬܗ. ܘܐܫܬܥܝ ܠܠܒܢ ܟܠܗܝܢ ܡ̈ܠܐ ܗܠܝܢ. +\v 14 ܐܡ̇ܪ ܠܗ ܠܒܢ. ܫܪܝܪܐܝܬ ܓܪܡܝ ܐܢܬ ܘܒܣܪܝ. ܘܝܬ̣ܒ ܠܘܬܗ ܝܪܚ ܝܘܡ̈ܝܢ. +\v 15 ܘܐܡ̣ܪ ܠܒܢ ܠܝܥܩܘܒ. ܫܪܝܪܐܝܬ ܐܚܝ ܐܢܬ. ܬܦܠܚܢܝ ܡܓܢ. ܚܘܢܝ ܡܢܘ ܐܓܪܟ. +\v 16 ܘܠܠܒܢ ܐܝܬ ܗ̈ܘܝ ܬܪ̈ܬܝܢ ܒܢ̈ܢ. ܫܡܗ̇ ܕܩܫܝܫܬܐ ܠܝܐ. ܘܫܡܗ̇ ܕܙܥܘܪܬܐ ܪܚܝܠ. +\v 17 ܘܥܝܢ̈ܝܗ̇ ܕܠܝܐ ܪ̈ܟܝܟܢ\f m \fr 29.17\fr* \fk ܗ̈ܘܝ\fk* \ft add. 12a1, 12b1c, L\ft*\f*. ܘܪܚܝܠ ܫܦܝܪܐ ܗܘܬ ܒܚܙܘܗ̇. ܘܝܐܐ\f n \fr 29.17\fr* \fk ܘܫܦܝܪ\fk* \ft 5b1\ft*\f* ܩܘܒܠܠܗ̇. +\v 18 ܘܪܚ̣ܡ ܝܥܩܘܒ ܠܪܚܝܠ ܘܐܡ̣ܪ. ܐܦܠܚܟ ܫܒܥ ܫ̈ܢܝܢ ܒܪܚܝܠ ܒܪܬܟ ܙܥܘܪܬܐ. +\v 19 ܐܡ̇ܪ ܠܗ\f o \fr 29.19\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܠܒܢ. ܦܩܚ ܕܐܬܠܝܗ̇ ܠܟ ܡܢ ܕܐܬܠܝܗ̇ ܠܐܢܫ ܐܚܪܝܢ. ܬܒ ܥܡܝ. +\v 20 ܘܦܠ̣ܚ ܝܥܩܘܒ ܒܪܚܝܠ ܫܒܥ ܫ̈ܢܝܢ. ܘܗ̈ܘܝ ܒܥܝܢ̈ܘܗܝ ܐܝܟ ܝܘܡ̈ܬܐ ܙܥܘܪ̈ܐ. ܡܛܠ ܕܪܚ̇ܡ ܗܘ̣ܐ ܠܗ̇. +\v 21 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܠܒܢ. ܗܒ ܠܝ ܐܢܬܬܝ. ܡܛܠ ܕܫܠܡܘ [-]\f p \fr 29.21\fr* \fk ܠܗܘܢ\fk* \ft add. 7a1\ft*\f* ܝܘܡ̈ܬܐ. ܘܐܥܘܠ ܠܘܬܗ̇. +\v 22 ܘܟ̇ܢܫ ܠܒܢ ܠܟܠܗܘܢ ܐܢܫ̈ܝ ܐܬܪܐ. ܘܥܒ̣ܕ ܡܫܬܝܐ. +\v 23 ܘܟܕ ܗܘ̣ܐ ܪܡܫܐ. ܕܒ̣ܪ ܠܠܝܐ ܒܪܬܗ ܘܐܥܠܗ̇ ܠܘܬܗ. ܘܥܠ ܥܠܝܗ̇. +\v 24 ܘܝܗ̣ܒ ܠܗ̇ ܠܒܢ ܠܠܝܐ ܒܪܬܗ. ܠܙܠܦܐ ܐܡܬܗ ܐܡܬܐ. +\v 25 ܘܟܕ ܗܘ̣ܐ ܨܦܪܐ ܘܚܙܐ ܕܠܝܐ ܗܝ. ܐܡ̣ܪ [-]\f q \fr 29.25\fr* \fk ܝܥܩܘܒ\fk* \ft add. 7a1, 7h5, 12b2\ft*\f* ܠܠܒܢ. ܡܢܐ ܗܘ ܗܢܐ ܕܥܒ̣ܕܬ ܠܝ. ܗܐ ܒܪܚܝܠ ܦܠܚ̇ܬ ܥܡܟ. ܠܡܢܐ ܢܟܠܬܢܝ. +\v 26 ܘܐܡ̣ܪ ܠܒܢ ܠܝܥܩܘܒ\f r \fr 29.26\fr* \fk ܠܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܡܬܥܒܕ ܗܟܢܐ ܒܐܬܪܢ. ܠܡܬܠ ܙܥܘܪܬܐ ܩܕܡ ܩܫܝܫܬܐ. +\v 27 ܫ̇ܠܡ ܡܫܬܘܬܗ̇ ܕܗܕܐ. ܘܐܬܠ ܠܟ ܐܦ ܗ̇ܝ ܒܦܘܠܚܢܐ ܕܬܦܠܘܚ ܥܡܝ. ܬܘܒ ܫܒܥ ܫ̈ܢܝܢ ܐܚܪ̈ܢܝܢ. +\v 28 ܘܥܒ̣ܕ ܝܥܩܘܒ ܗܟܢܐ. ܘܡ̇ܠܝ\f s \fr 29.28\fr* \fk ܘܫܠܡ\fk* \ft 8b1\ft*\f* ܡܫܬܘܬܗ̇ ܕܗ̇ܝ. ܘܝܗܒ ܠܗ ܠܪܚܝܠ ܒܪܬܗ ܐܢܬܬܐ. +\v 29 ܘܝܗ̣ܒ [-]\f t \fr 29.29\fr* \fk ܠܗ\fk* \ft 7a1, 12b2\ft*\f* ܠܒܢ ܠܪܚܝܠ ܒܪܬܗ. ܠܒܠܗܐ ܐܡܬܗ ܐܡܬܐ. +\v 30 ܘܥܠ ܐܦ ܥܠ ܪܚܝܠ. ܘܪܚܡܗ̇ ܐܦ ܠܪܚܝܠ ܡܢ ܠܝܐ. ܘܦܠܚ ܥܡܗ ܬܘܒ ܫܒܥ ܫ̈ܢܝܢ ܐܚܪ̈ܢܝܢ. +\v 31 ܘܚ̣ܙܐ ܡܪܝܐ ܕܣܢܝܐ ܗܝ ܠܝܐ ܘܦܬ̣ܚ ܡܪܒܥܗ̇. ܘܪܚܝܠ ܥܩܪܬܐ\f u \fr 29.31\fr* \fk ܗܝ\fk* \ft add. 8b1\ft*\f*. +\v 32 ܘܒ̣ܛܢܬ ܠܝܐ ܘܝܠ̣ܕܬ ܒܪܐ. ܘܩܪܬ ܫܡܗ ܪܘܒܝܠ ܘܐܡ̣ܪܬ. ܡܛܠ ܕܚ̣ܙܐ ܐܠܗܐ ܫܘܥܒܕܝ. ܗܫܐ ܢܪܚܡܢܝ ܒܥܠܝ. +\v 33 ܘܒܛܢ̣ܬ ܬܘܒ ܘܝ̣ܠܕܬ ܒܪܐ ܘܐܡ̣ܪܬ. ܡܛܠ ܕܫ̣ܡܥ ܡܪܝܐ ܕܣܢܝܐ ܐܢܐ ܝܗ̣ܒ ܠܝ ܐܦ ܗܢܐ. ܘܩܪܬ ܫܡܗ ܫܡܥܘܢ. +\v 34 ܘܒ̣ܛܢܬ ܬܘܒ ܘܝܠ̣ܕܬ ܒܪܐ ܘܐܡ̣ܪܬ. ܙܒܢܬܐ ܗܕܐ ܢܬܠܘܐ ܠܝ ܒܥܠܝ. ܡܛܠ ܕܝ̇ܠܕܬ ܠܗ ܬܠܬܐ ܒܢܝ̈ܢ. ܡܛܠ ܗܢܐ ܩܪܬ ܫܡܗ ܠܘܝ. +\v 35 ܘܒܛܢ̣ܬ ܬܘܒ ܘܝܠ̣ܕܬ ܒܪܐ ܘܐܡ̣ܪܬ. ܙܒܢܐ ܗܢܐ ܐܘܕܐ ܠܡܪܝܐ. ܡܛܠ ܗܢܐ ܩܪܬ ܫܡܗ ܝܗܘܕܐ. ܘܩܡܬ ܡܢ ܝܠܕܐ. +\c 30 +\v 1 ܘܚܙܬ ܪܚܝܠ ܕܠܐ ܝܠܕܐ ܠܝܥܩܘܒ. ܘܛܢܬ ܒܚܬܗ̇ ܘܐܡ̣ܪܬ ܠܝܥܩܘܒ. ܗܒ ܠܝ ܒ̈ܢܝܐ ܘܐܠܐ ܡܝܬܐ ܐܢܐ. +\v 2 ܘܐܬ̣ܚܡܬ ܪܘܓܙܗ ܕܝܥܩܘܒ ܥܠ ܪܚܝܠ ܘܐܡ̣ܪ ܠܗ̇\f a \fr 30.2\fr* \fk ܠܗ̇\fk* \ft om. 5b1\ft*\f*. ܚܠܦ ܐܠܗܐ ܐܢܐ. ܕܟܠ̣ܐ ܡܢܟܝ ܦܐܪ̈ܐ ܕܟܪܣܐ. +\v 3 ܘܐܡ̣ܪܬ ܠܗ\f b \fr 30.3\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܐܡܬܝ ܒܠܗܐ. ܥܘܠ ܥܠܝܗ̇ ܘܬܐܠܕ ܥܠ ܒܘܪ̈ܟܝ. ܘܐܬܒܝܐ ܐܦ ܐܢܐ ܡܢܗ̇. +\v 4 ܘܝܗ̣ܒܬ ܠܗ ܠܒܠܗܐ ܐܡܬܗ̇ ܐܢܬܬܐ. ܘܥܠ ܥܠܝܗ̇\f c \fr 30.4\fr* \fk ܝܥܩܘܒ\fk* \ft add. 5b1\ft*\f*. +\v 5 ܘܒܛܢ̣ܬ ܒܠܗܐ ܘܝܠ̣ܕܬ ܠܝܥܩܘܒ ܒܪܐ. +\v 6 ܘܐܡ̣ܪܬ ܪܚܝܠ ܕܚܝ ܐܠܗܐ ܘܐܦ ܫܡ̣ܥ ܒܩܠܝ. ܘܝܗ̣ܒ ܠܝ ܒܪܐ. ܡܛܠ ܗܢܐ ܩܪܬ ܫܡܗ ܕܢ. +\v 7 ܘܒ̣ܛܢܬ ܬܘܒ ܒܠܗܐ ܐܡܬܗ̇ ܕܪܚܝܠ. ܘܝܠܕܬ ܒܪܐ ܐܚܪܢܐ ܠܝܥܩܘܒ. +\v 8 ܘܐܡ̣ܪܬ ܪܚܝܠ. ܒܥܝ̇ܬ ܡܢ ܡܪܝܐ ܘܐܬ̇ܟܫܦܬ ܥܡ ܚܬܝ. ܘܐܦ ܐܫ̇ܟܚܬ ܘܩ̣ܪܬ ܫܡܗ ܢܦܬܠܝ. +\v 9 ܘܚܙܬ ܠܝܐ ܕܩܡܬ ܡܢ ܝܠܕܐ. ܘܕܒ̣ܪܬ ܠܙܠܦܐ ܐܡܬܗ̇ ܘܝܗܒܬܗ̇ ܐܢܬܬܐ ܠܝܥܩܘܒ. +\v 10 ܘܝܠ̣ܕܬ ܙܠܦܐ ܐܡܬܗ̇ ܕܠܝܐ ܠܝܥܩܘܒ ܒܪܐ. +\v 11 ܘܐܡ̣ܪܬ ܠܝܐ ܐܬ̣ܐ ܓܕܝ. ܘܩܪܬ ܫܡܗ ܓܕ. +\v 12 ܘܝܠ̣ܕܬ ܙܠܦܐ ܐܡܬܗ̇ ܕܠܝܐ ܒܪܐ ܕܬܪ̈ܝܢ ܠܝܥܩܘܒ. +\v 13 ܘܐܡ̣ܪܬ ܠܝܐ. ܒܬܫܒܘܚܬܝ ܕܫܒܚܢܝ †ܒܢ̈ܬܐ†\f d \fr 30.13\fr* \fk ܒܝܬܐ\fk* \ft A, W, E\ft*\f*. ܘܩܪܬ ܫܡܗ ܐܫܝܪ. +\v 14 ܘܐܙ̣ܠ ܪܘܒܝܠ ܒܝ̈ܘܡܝ ܚܨܕܐ ܕܚ̈ܛܐ ܘܐܫܟܚ ܝܒܪ̈ܘܚܐ ܒܚܩܠܐ. ܘܐܝܬܝ ܐܢܘܢ ܠܠܝܐ ܐܡܗ. ܘܐܡ̣ܪܬ ܪܚܝܠ ܠܠܝܐ. ܗܒܝ ܠܝ ܡܢ ܝܒܪ̈ܘܚܐ ܕܒܪܟܝ. +\v 15 ܘܐܡ̣ܪܬ ܠܗ̇ ܠܝܐ\f e \fr 30.15\fr* \fk ܠܝܐ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܟܕܘ ܠܟܝ ܕܕܒܪܬܝ ܒܥܠܝ. ܐܠܐ ܐܦ ܕܬܣܒܝܢ ܝܒܪ̈ܘܚܐ ܕܒܪܝ. ܘܐܡ̣ܪܬ ܪܚܝܠ. ܡܛܠ ܗܢܐ ܢܕܡܟ ܥܡܟܝ ܒܠܠܝܐ ܗܢܐ\f f \fr 30.15\fr* \fk ܗܢܐ\fk* \ft om. 5b1\ft*\f* ܚܠܦ ܝܒܪ̈ܘܚܐ ܕܒܪܟܝ. +\v 16 ܘܥܠ ܝܥܩܘܒ ܡܢ ܚܩܠܐ ܒܪܡܫܐ. ܘܢܦ̣ܩܬ ܠܝܐ ܠܐܘܪܥܗ †ܘܐܡ̣ܪܬ†\f g \fr 30.16\fr* \fk ܠܗ\fk* \ft add. 7a1, 7h5\ft*\f*. ܠܘܬܝ ܥܐܠ ܐܢܬ. ܡܛܠ ܕܡܐܓܪ ܐܓܪܬܟ ܒܝܒܪ̈ܘܚܐ ܕܒܪܝ. ܘܕܡ̣ܟ ܥܡܗ̇ ܒܠܠܝܐ ܗ̇ܘ. +\v 17 ܘܫܡܥܗ̇ ܐܠܗܐ ܠܠܝܐ. ܘܒ̣ܛܢܬ ܘܝܠ̣ܕܬ ܠܝܥܩܘܒ ܒܪܐ ܕܚܡܫܐ. +\v 18 ܘܐܡ̣ܪܬ ܠܝܐ. ܝܗ̣ܒ ܐܠܗܐ ܐܓܪܝ ܕܝܗ̇ܒܬ ܐܡܬܝ ܠܒܥܠܝ ܘܩܪܬ ܫܡܗ ܐܝܣܟܪ. +\v 19 ܘܒܛܢ̣ܬ ܬܘܒ ܠܝܐ. ܘܝܠ̣ܕܬ ܒܪܐ ܕܫܬܐ ܠܝܥܩܘܒ. +\v 20 ܘܐܡܪܬ̇ ܠܝܐ. ܙܒܕܢܝ ܐܠܗܐ ܙܒܕܐ ܛܒܐ. ܙܒܢܐ ܗܢܐ ܢܬ̇ܢܩܦ ܠܝ ܒܥܠܝ. ܡܛܠ ܕܝ̇ܠܕܬ ܠܗ ܫܬܐ ܒ̈ܢܝܢ. ܘܩܪܬ ܫܡܗ ܙܒܘܠܘܢ. +\v 21 ܘܒܬܪܟܢ ܝܠ̣ܕܬ ܒܪܬܐ. ܘܩܪܬ ܫܡܗ̇ ܕܝܢ̣ܐ. +\v 22 ܘܐܬܕܟܪܗ̇ ܐܠܗܐ ܠܪܚܝܠ. ܘܫܡܥܗ̇ ܐܠܗܐ ܘܦܬ̣ܚ ܡܪܒܥܗ̇. +\v 23 ܘܒ̣ܛܢܬ ܘܝܠܕܬ ܒܪܐ ܘܐܡ̣ܪܬ. ܐܥܒܪ ܐܠܗܐ ܚܣܕܝ. +\v 24 ܘܩܪܬ ܫܡܗ ܝܘܣܦ ܘܐܡ̣ܪܬ. ܢܘܣܦ ܠܝ ܐܠܗܐ ܒܪܐ ܐܚܪܢܐ. +\v 25 ܘܟܕ ܝܠ̣ܕܬ ܪܚܝܠ ܠܝܘܣܦ. ܐܡ̣ܪ ܝܥܩܘܒ ܠܠܒܢ. ܫܕܪܝܢܝ ܐܙܠ ܠܐܬܪܝ ܘܠܐܪܥܝ. +\v 26 ܗܒ ܠܝ ܢܫ̈ܝ ܘܒܢ̈ܝ ܕܦܠܚܬܟ ܒܗܘܢ ܘܐܙ̣ܠ. ܡܛܠ ܕܐܢܬ ܝܕܥ ܐܢܬ ܦܘܠܚܢܐ ܕܦܠܚܬܟ. +\v 27 ܘܐܡ̣ܪ ܠܒܢ ܠܝܥܩܘܒ\f h \fr 30.27\fr* \fk ܠܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܐܢ ܐܫ̇ܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ ܢܣ̇ܝܬ ܕܒܪܟܢܝ ܡܪܝܐ ܡܛܠܬܟ. +\v 28 ܘܐܡ̣ܪ\f i \fr 30.28\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f* ܦܪܘܫ ܐܓܪܟ ܥܠܝ ܘܐܬܠ. +\v 29 ܐܡ̇ܪ ܠܗ ܝܥܩܘܒ. ܐܢܬ ܝܕܥ ܐܢܬ ܦܘܠܚܢܐ ܕܦܠܚܬܟ. ܘܕܗܘܐ ܩܢܝܢܟ ܥܡܝ. +\v 30 ܡܛܠ\f j \fr 30.30\fr* \fk ܡܛܠ\fk* \ft om. 5b1\ft*\f* ܕܩܠܝܠ ܐܝܬ ܗܘܐ ܠܟ ܩܕܡܝ ܘܣ̣ܓܝ ܛܒ. ܘܒܪܟܟ ܡܪܝܐ ܡܛܠܬܝ\f k \fr 30.30\fr* \fk ܒܪܓܠܝ\fk* \ft 5b1\ft*\f*. ܘܗܫܐ ܡܢܐ ܐܥܒܕ †ܘܐܦ† ܐܢܐ ܠܒܝܬܝ. +\v 31 ܐܡ̇ܪ ܠܗ\f l \fr 30.31\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܠܒܢ\f m \fr 30.31\fr* \fk ܠܒܢ\fk* \ft om. 5b1, 8b1\ft*\f* ܡܢܐ ܐܬܠ ܠܟ. ܐܡ̇ܪ ܠܗ\f n \fr 30.31\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܝܥܩܘܒ. ܠܐ ܬܬܠ ܠܝ ܡܕܡ. ܐܢ ܬܥܒܕ ܠܝ\f o \fr 30.31\fr* \fk ܠܝ\fk* \ft om. 7h5, 12b1\ft*\f* ܦܬܓܡܐ [-]\f p \fr 30.31\fr* \fk ܗܢܐ\fk* \ft 5b1, 7a1\ft*\f* ܕܐܡ̇ܪ ܐܢܐ ܠܟ\f q \fr 30.31\fr* \fk ܕܐܡ̇ܪ ܐܢܐ ܠܟ\fk* \ft om. 5b1\ft*\f*. ܐܗܦܘܟ ܐܪܥܐ ܥܢܟ ܘܐܛܪ. +\v 32 ܐܥܒܪ ܒܟܠܗ̇ ܥܢܟ ܝܘܡܢܐ. ܘܐܦܪܘܫ ܠܝ\f r \fr 30.32\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f* ܡܢ ܬܡܢ ܟܠ ܐܡܪܐ ܕܩܪܚ ܘܦܝܣܟܝ. ܘܟܠ ܐܡܪܐ ܕܐ̇ܟܡ ܒܚܘܪ̈ܬܐ ܘܦܝܣܟܝ ܘܩܪܚ ܒܥ̈ܙܐ ܘܢܗܘܐ ܐܓܪܝ. +\v 33 ܘܬܣܗܕ ܥܠܝ ܙܟܘܬܝ ܐܝܟ ܕܝܘܡܢܐ. ܕܡܚܪ ܟܕ ܬܥܘܠ ܥܠ ܐܓܪܝ ܩܕܡܝܟ. ܟܠ ܕܠܐ ܗܘܐ ܩܪܚ ܘܦܝܣܟܝ ܒܥ̈ܙܐ. ܘܐ̇ܟܡ ܒܚܘܪ̈ܬܐ ܓܢܝܒܐ ܗ̣ܘ ܠܝ. +\v 34 ܐܡ̇ܪ ܠܗ\f s \fr 30.34\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܠܒܢ. ܐܝܢ ܢܗܘܐ ܐܝܟ ܡܠܬܟ. +\v 35 ܘܦܪ̣ܫ ܒܝܘܡܐ ܗ̇ܘ. ܬܝܫ̈ܐ ܩܪ̈ܚܐ ܘܦܝܣ̈ܟܝܐ. ܘܟܠܗܝܢ ܥ̈ܙܐ ܩܪ̈ܚܬܐ ܘܦܝܣ̈ܟܝܬܐ. ܘܟܠ ܕܐܝܬ ܒܗܝܢ ܚܘܪܐ. ܘܟܠ ܕܐ̇ܟܡ ܒܚܘܪ̈ܬܐ. ܘܝܗ̣ܒ ܒܝܕ ܒܢ̈ܘܗܝ. +\v 36 ܘܥܒ̣ܕ ܡܪܕܐ ܬܠܬܐ ܝܘܡ̈ܝܢ ܒܝܢܘܗܝ ܠܠܒܢ. ܘܝܥܩܘܒ ܪܥ̣ܐ ܥܢܗ ܕܠܒܢ ܗ̇ܝ ܕܐܫܬ̣ܚܪܬ. +\v 37 ܘܢܣ̣ܒ ܠܗ ܝܥܩܘܒ ܙܩ̈ܬܐ ܚܘܪ̈ܬܐ ܪ̈ܛܝܒܬܐ. ܕܠܘܙܐ ܘܕܕܘܠܒܐ. ܘܩܠ̣ܦ ܒܗܝܢ ܩ̈ܠܦܐ ܚܘܪ̈ܬܐ. ܘܡܚܘܪ ܚܘܪܐ ܕܒܙܩ̈ܬܐ. +\v 38 ܘܕܥ̣ܨ ܐܢܝ̈ܢ ܠܙܩ̈ܬܐ ܕܩܠ̣ܦ ܒܪ̈ܗܛܐ ܕܡ̈ܝܐ. ܒܝܬ ܡܫܬܝܐ. ܟܪ ܕܐܬܝܢ ܥܢܐ ܠܡܫܬܐ. ܠܘܩܒܠ ܥܢܐ. ܘܚܡܝܢ ܡܐ ܕܐܬܝܢ ܠܡܫܬܐ. +\v 39 ܘܚ̇ܡܢ ܥܢܐ ܥܠ ܙܩ̈ܬܐ. ܘܝ̈ܠܕܢ ܥܢܐ\f t \fr 30.39\fr* \fk ܐܡܪ̈ܐ\fk* \ft add. E, W, M, U, L\ft*\f* ܩܪ̈ܚܐ ܘܦܝܣ̈ܟܝܐ\f u \fr 30.39\fr* \fk ܘܐܡܪ̈ܐ\fk* \ft add. 5b1\ft*\f*\f v \fr 30.39\fr* \fk ܒܪ̈ܕܐ\fk* \ft add. 8b1\ft*\f*. +\v 40 ܘܦ̣ܪܫ ܝܥܩܘܒ ܘܝܗ̣ܒ ܩܕܡ ܥܢܐ ܐܡܪ̈ܐ ܩܪ̈ܚܐ ܘܦܝܣ̈ܟܝܐ\f w \fr 30.40\fr* \fk ܘܦܝܣ̈ܟܝܐ\fk* \ft om. 5b1\ft*\f*. ܘܟܠ ܕܐ̇ܟܡ ܒܥܢܗ ܕܠܒܢ. ܘܥܒ̣ܕ ܠܗ ܓܙܪܐ ܒܠܚܘܕܘܗܝ. ܘܠܐ ܚܠ̣ܛ ܐܢܘܢ ܒܥܢܗ ܕܠܒܢ. +\v 41 ܘܒܟܠ †ܫܥܐ†\f x \fr 30.41\fr* \fk ܫܢܐ\fk* \ft Ai, E, W, M, U, L\ft*\f* ܕܚ̇ܡܐ ܥܢܐ ܒܟܝܪܝܬܐ. ܣܐܡ ܝܥܩܘܒ ܙܩ̈ܬܐ ܩܕܡ ܥܢܐ. ܒܪ̈ܗܛܐ ܕܢܚܡܝܢ ܒܙܩ̈ܬܐ. +\v 42 ܘܒܠܩܝ̈ܫܝܐ ܕܥܢܐ ܠܐ ܣܐܡ ܗܘ̣ܐ. ܘܗܘܝܢ ܠܩܝܫ̈ܝܐ ܠܠܒܢ. ܘܒܟܝܪ̈ܝܐ ܠܝܥܩܘܒ. +\v 43 ܘܥܬ̣ܪ ܓܒܪܐ ܛܒ ܛܒ\f y \fr 30.43\fr* \fk ܛܒ\fk* \ft om. 5b1\ft*\f*. ܘܗܘܬ ܠܗ ܥܢܐ ܣܓܝܐܬܐ. ܘܥܒ̈ܕܐ ܘܐܡ̈ܗܬܐ ܘܐ̈ܬܢܐ\f z \fr 30.43\fr* \fk ܘܐ̈ܬܢܐ\fk* \ft om. 5b1\ft*\f* ܘܓܡ̈ܠܐ ܘܚܡܪ̈ܐ. +\c 31 +\v 1 ܘܫܡ̣ܥ ܝܥܩܘܒ ܡ̈ܠܝܗܘܢ ܕܒܢ̈ܝ ܠܒܢ ܕܐܡܪ̈ܝܢ. ܢܣ̣ܒ ܝܥܩܘܒ ܟܠ ܕܐܝܬ ܗܘܐ ܠܐܒܘܢ. ܘܡܢ ܕܐܒܘܢ ܩܢ̣ܐ ܗܢܐ †ܩܢܝܢܐ ܟܠܗ†. +\v 2 ܘܚ̣ܙܐ ܝܥܩܘܒ ܐ̈ܦܘܗܝ ܕܠܒܢ. ܕܠܐ ܗ̈ܘܝ ܥܡܗ. ܐܝܟ ܕܐܬܡܠܝ ܘܐܝܟ ܕܡܢܬܡܠܝ. +\v 3 ܘܐܡ̣ܪ ܡܪܝܐ ܠܝܥܩܘܒ. ܗܦܘܟ ܠܐܪܥܐ ܕܐܒ̈ܗܝܟ ܘܠܬܘ̈ܠܕܬܟ ܘܐܗܘܐ ܥܡܟ. +\v 4 ܘܫܕܪ ܝܥܩܘܒ ܩ̣ܪܐ ܠܪܚܝܠ ܘܠܠܝܐ ܠܚܩܠܐ. ܠܘܬ ܥܢܗ. +\v 5 ܘܐܡ̣ܪ ܠܗܝܢ. ܚ̇ܙܐ ܐܢܐ ܐ̈ܦܘܗܝ ܕܐܒܘܟܝܢ. ܕܠܐ ܗ̈ܘܝ ܠܘܬܝ ܐܝܟ ܕܐܬܡܠ̣ܝ ܘܐܝܟ ܕܡܢܬܡܠܝ. ܘܐܠܗܗ ܕܐܒܝ ܗܘ̣ܐ ܥܡܝ. +\v 6 ܘܐܢܬܝܢ ܝܕ̈ܥܢ ܐܢܬܝܢ ܕܒܟܠܗ ܚܝܠܝ ܦܠܚ̇ܬ ܠܐܒܘܟܝܢ. +\v 7 ܘܐܒܘܟܝܢ ܕܓ̇ܠ ܒܝ. ܘܚ̇ܠܦ ܐܓܪܝ ܥܣܪ ܙܒܢܝ̈ܢ. ܘܠܐ ܫܒܩܗ ܐܠܗܐ ܕܢܒܐܫ ܠܝ. +\v 8 ܐܢ ܗܟܢܐ ܢܐܡܪ ܕܩܪ̈ܚܐ ܢܗܘܐ ܐܓܪܟ. ܝ̈ܠܕܢ ܟܠܗܝܢ ܥܢܐ ܩܪ̈ܚܐ. ܘܐܢ ܢܐܡܪ ܕܦܝܣ̈ܟܝܐ ܢܗܘܐ ܐܓܪܟ. ܝ̈ܠܕܢ ܟܠܗܝܢ ܥܢܐ ܦܝܣ̈ܟܝܐ. +\v 9 ܘܦܪܫ ܐܠܗܐ ܡܢ ܩܢܝܢܐ ܕܐܒܘܟܝܢ ܘܝܗ̣ܒ ܠܝ. +\v 10 ܘܒܙܒܢܐ ܕܚܡܐ ܥܢܐ. ܐܪܝܡ̇ܬ ܥܝܢ̈ܝ ܘܚ̇ܙܝܬ [-] ܒܚܠܡܐ. ܘܗܐ ܬܝܫ̈ܐ ܣܠܩܝܢ ܥܠ ܥܢܐ. ܩܪ̈ܚܐ ܘܦܝܣ̈ܟܝܐ ܘܒܪ̈ܕܐ. +\v 11 ܘܐܡ̣ܪ ܠܝ ܡܠܐܟܗ ܕܐܠܗܐ ܒܚܠܡܐ. ܝܥܩܘܒ. ܘܐܡ̇ܪܬ ܗܐ ܐܢܐ. +\v 12 ܘܐܡ̣ܪ ܠܝ\f a \fr 31.12\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f*. ܐܪܝܡ ܥܝܢ̈ܝܟ. ܘܚܙܝ ܟܘܠ ܬܝܫ̈ܐ ܕܣܠܩܝܢ ܥܠ ܥܢܐ. ܩܪ̈ܚܐ ܘܦܝܣ̈ܟܝܐ ܘܒܪ̈ܕܐ. ܡܛܠ ܕܚ̇ܙܝܬ ܟܠ ܕܥܒ̣ܕ ܠܟ ܠܒܢ. +\v 13 ܐܢܐ ܐܢܐ ܐܠܗܐ ܕܒܝܬ ܐܝܠ. ܕܡܫ̣ܚܬ ܠܝ ܬܡܢ ܩܝܡܬܐ. ܘܢ̣ܕܪܬ ܠܝ ܬܡ̇ܢ ܢܕܪܐ. ܗܫܐ ܩܘܡ ܦܘܩ ܡܢ ܐܪܥܐ ܗܕܐ. ܘܗܦܘܟ ܠܐܪܥܐ ܕܬ̈ܘܠܕܬܟ. +\v 14 ܘܥܢ̣ܝ ܪܚܝܠ ܘܠܝܐ ܘܐܡܪ̈ܢ\f b \fr 31.14\fr* \fk ܠܗ\fk* \ft add. 5b1, 12b1, M, U, L\ft*\f*. ܬܘܒ ܠܝܬ ܠܢ ܡܢܬܐ ܘܝܪܬܘܬܐ ܒܝܬ\f c \fr 31.14\fr* \fk ܥܡ\fk* \ft 12a1\ft*\f* ܐܒܘܢ. +\v 15 ܗܐ ܐܝܟ ܢܘܟܪ̈ܝܬܐ ܚܫ̈ܝܒܢ ܚܢܢ ܠܗ. ܡܛܠ ܕܙܒܢܢ †ܐܦ† ܐܟ̣ܠ ܟܣܦܢ. +\v 16 ܡܛܠ ܕܟܠܗ ܥܘܬܪܐ ܕܦ̣ܪܫ ܐܠܗܐ ܡܢ ܕܐܒܘܢ\f d \fr 31.16\fr* \fk ܐܒܘܢ\fk* \ft 5b1, 11.9b1\ft*\f* ܕܝܠܢ ܗܘ ܘܕܒܢ̈ܝܢ. ܘܗܫܐ ܟܠ ܕܐܡ̇ܪ ܠܟ ܡܪܝܐ ܥܒ̣ܕ. +\v 17 ܘܩܡ ܝܥܩܘܒ ܘܫܩ̣ܠ ܠܒܢ̈ܘܗܝ ܘܠܢܫ̈ܘܗܝ ܥܠ ܓܡ̈ܠܐ. +\v 18 ܘܕܒ̣ܪ ܟܠܗ̇ ܒܥܝܪܗ ܘܟܠܗ ܩܢܝܢܗ ܕܩܢ̣ܐ ܒܦܕܢ ܕܐܪܡ. ܠܡܐܬܐ ܠܘܬ ܐܝܣܚܩ ܐܒܘܗܝ ܠܐܪܥܐ ܕܟܢܥܢ. +\v 19 ܘܠܒܢ ܐܙ̣ܠ ܠܡܓܙ ܥܢܗ. ܘܓܢܒ̣ܬ ܪܚܝܠ ܨܠܡ̈ܐ ܕܐܒܘܗ̇. +\v 20 ܘܓܢ̣ܒ ܝܥܩܘܒ ܠܒܗ ܕܠܒܢ ܐܪܡ̇ܝܐ. ܡܛܠ ܕܠܐ ܚܘܝܗ ܕܐ̇ܙܠ. +\v 21 ܘܥ̣ܪܩ ܗ̣ܘ ܘܟܘܠ ܕܐܝܬ ܠܗ. ܘܩܡ ܘܥܒ̣ܪ ܢܗܪܐ. ܘܣܡ ܐ̈ܦܘܗܝ ܠܛܘܪ ܓܠܥܕ. +\v 22 ܘܐܬܐܡܪ\f e \fr 31.22\fr* \fk ܠܗ\fk* \ft add. 7h5\ft*\f* ܠܠܒܢ ܒܝܘܡܐ\f f \fr 31.22\fr* \fk ܠ\fk* \ft 5b1\ft*\f* ܕܬܠܬܐ ܕܥ̣ܪܩ ܠܗ ܝܥܩܘܒ. +\v 23 ܘܕܒ̣ܪ ܠܐ̈ܚܘܗܝ ܥܡܗ. ܘܪܕܦ ܒܬܪܗ ܡܪܕܐ ܫܒܥܐ ܝܘܡ̈ܝܢ. ܘܐܕܪܟܗ ܒܛܘܪܐ ܕܓܠܥܕ. +\v 24 ܘܐܬ̣ܐ ܐܠܗܐ ܥܠ ܠܒܢ ܐܪܡܝܐ ܒܚܠܡܐ ܕܠܠܝܐ ܘܐܡ̣ܪ ܠܗ. ܐܙܕܗܪ ܠܟ ܕܠܡܐ ܬܡܠܠ ܥܡ ܝܥܩܘܒ ܡܢ ܛܒܬܐ ܘܥܕܡܐ ܠܒܝܫܬܐ. +\v 25 ܘܐܕܪܟ ܠܒܢ ܠܝܥܩܘܒ. ܘܝܥܩܘܒ ܢܩ̣ܫ ܡܫܟܢܗ ܒܛܘܪܐ. ܘܠܒܢ ܐܫܪܝ ܐ̈ܚܘܗܝ ܒܛܘܪܐ ܕܓܠܥܕ. +\v 26 ܘܐܡ̣ܪ ܠܒܢ ܠܝܥܩܘܒ. ܡܢܐ ܥܒ̇ܕܬ ܠܟ\f g \fr 31.26\fr* \fk ܠܟ\fk* \ft om. 5b1\ft*\f* ܕܓܢܒ̣ܬ ܠܒܝ. ܘܕܒ̣ܪܬ ܠܒܢ̈ܬܝ ܐܝܟ ܫܒܝ̈ܬܐ ܕܚܪܒܐ. +\v 27 ܠܡܢܐ ܐܬ̇ܛܫܝܬ ܠܡܥܪܩ ܘܐܬܓܢ̣ܒܬ ܡܢܝ\f h \fr 31.27\fr* \fk ܡܢܝ\fk* \ft om. 12b1\ft*\f* ܘܠܐ ܚܘܝܬܢܝ. ܫܕܪܬܟ ܕܝܢ ܒܚܕܘܬܐ ܘܒܙܡܪܐ. ܘܒܟܢܪ̈ܐ ܘܒ̈ܦܠܓܐ. +\v 28 ܘܠܐ ܫܒܩܬܢܝ ܠܡܢܫܩܘ ܠܒ̈ܢܝ ܘܠܒܢ̈ܬܝ. ܗܫܐ ܐܣܟܠ̣ܬ ܒܡܕܡ ܕܥܒ̣ܕܬ\f i \fr 31.28\fr* \fk ܥܒ̣ܕܬ\fk* \ft 7h5\ft*\f*. +\v 29 ܡ̇ܛܐ ܗܘܐ ܒܐ̈ܝܕܝ ܕܐܥܒܕ ܠܟܘܢ ܒܝܫܬܐ. ܘܐܠܗܐ ܕܐܒܘܟܘܢ ܒܪܡܫܐ ܐܡ̣ܪ ܠܝ. ܐܙܕܗܪ\f j \fr 31.29\fr* \fk ܠܟ\fk* \ft E, W\ft*\f* ܕܠܡܐ ܬܡܠܠ ܥܡ ܝܥܩܘܒ. ܡܢ ܛܒܬܐ ܘܥܕܡܐ ܠܒܝܫܬܐ. +\v 30 ܘܗܫܐ\f k \fr 31.30\fr* \fk ܘܗܫܐ\fk* \ft om. 5b1\ft*\f* ܡܐܙܠ ܐܙܠ ܐܢܬ. ܡܛܠ ܕܡܬܪܓܪܓܘ ܐܬܪܓܪܓܬ ܠܒܝܬ ܐܒܘܟ. ܠܡܢܐ ܓܢܒ̣ܬ ܐ̈ܠܗܝ. +\v 31 ܘܥܢ̣ܐ ܝܥܩܘܒ ܘܐܡ̣ܪ ܠܠܒܢ. ܡܛܠ ܕܕܚ̇ܠܬ ܘܐܡ̇ܪܬ. ܕܕܠܡܐ\f l \fr 31.31\fr* \fk ܕܠܡܐ\fk* \ft 8b1, 12b2\ft*\f* ܬܕܒ̣ܪ ܒܢ̈ܬܟ ܡܢܝ. +\v 32 ܠܘܬ ܡ̇ܢ ܕܢܫܬܟܚܘܢ ܐ̈ܠܗܝܟ ܠܐ ܢܚܐ. ܩܕܡ ܐ̈ܚܝܢ ܐܫܬܘܕܥ ܕܝܠܟ. ܡܢܐ ܐܝܬ ܠܘܬܝ ܘܣܒ ܠܟ. ܘܠܐ ܝܕܥ ܝܥܩܘܒ ܕܪܚܝܠ ܓܢܒ̣ܬ ܐܢܘܢ. +\v 33 ܘܥܠ ܠܒܢ ܠܡܫܟܢܐ ܕܝܥܩܘܒ ܘܠܡܫܟܢܐ ܕܠܝܐ ܘܠܡܫܟܢܐ ܕܬܪ̈ܬܝܢ ܐ̈ܡܗܬܐ ܘܠܐ ܐܫܟܚ. †ܘܢܦ̣ܩ†\f m \fr 31.33\fr* \fk †ܘܢܦ̣ܩ†\fk* \ft om. 7a1\ft*\f* ܡܢ ܡܫܟܢܐ ܕܠܝܐ ܘܥܠ ܠܡܫܟܢܐ ܕܪܚܝܠ. +\v 34 ܘܪܚܝܠ ܢܣ̣ܒܬ ܨ̈ܠܡܐ. ܘܣܡܬ ܐܢܘܢ ܒܥܒܝܛܐ ܕܓܡܠܐ. ܘܝܬ̣ܒܬ ܥܠܝܗܘܢ. ܘܡܫ ܠܒܢ ܟܠܗ\f n \fr 31.34\fr* \fk ܒ\fk* \ft 5b1\ft*\f* ܡܫܟܢܐ ܘܠܐ ܐܫܟܚ. +\v 35 ܘܐܡ̣ܪܬ ܪܚܝܠ ܠܐܒܘܗ̇. ܠܐ ܢܬܒܐܫ ܒܥܝܢ̈ܝ ܡܪܝ. ܡܛܠ ܕܠܐ ܡܫܟܚܐ ܐܢܐ ܠܡܩܡ ܡܢ ܩܕܡܝܟ. ܡܛܠ ܕܐܘܪܚܐ ܠܝ ܕܢܫ̈ܐ. ܘܒ̣ܨܐ ܘܠܐ ܐܫܟܚ ܨ̈ܠܡܐ. +\v 36 ܘܐܬܐܒܫ ܠܝܥܩܘܒ ܘܢ̣ܨܐ ܥܡ ܠܒܢ. ܘܥܢ̣ܐ ܝܥܩܘܒ ܘܐܡ̣ܪ ܠܠܒܢ. ܡܢܐ ܗܝ ܣܟܠܘܬܝ ܘܡܢܘ ܣܘܪܚܢܝ ܕܪܕܦ̣ܬ ܒܬܪܝ. +\v 37 ܗܐ ܡܫܬ ܟܠܗܘܢ ܡܐ̈ܢܝ. ܡܢܐ ܐܫܟܚܬ ܡܢ ܟܠܗܘܢ ܡܐ̈ܢܝ ܒܝܬܟ. ܣܝܡ ܗܪܟܐ ܩܕܡ ܐ̈ܚܝ. ܘܐܚ̈ܝܟ ܘܢ̇ܟܣܘܢ ܒܝܬ ܬܪ̈ܝܢ. +\v 38 ܗܐ ܥܣܪ̈ܝܢ\f o \fr 31.38\fr* \fk ܠܝ\fk* \ft add. 5b1\ft*\f* ܫ̈ܢܝܢ ܥܡܟ ܐܢܐ\f p \fr 31.38\fr* \fk ܐܢܐ\fk* \ft om. 5b1\ft*\f*. ܢܩ̈ܘܬܟ ܘܥ̈ܙܝܟ ܠܐ ܓܝܙ. ܘܕܟܪ̈ܐ ܕܥܢܟ ܠܐ ܐ̇ܟܠܬ. +\v 39 ܘܕܬܒܝܪܐ ܠܐ ܐܝܬ̇ܝܬ ܠܟ. ܐܢܐ ܡ̇ܢܛܪ ܗܘ̇ܝܬ ܠܗ̇. ܕܡܢ ܐ̈ܝܕܝ ܬܒ̇ܥ ܗܘ̣ܝܬ ܠܗ̇. ܕܡܬܓܢܒ ܒܐܝܡܡܐ ܘܕܡܬܓܢܒ\f q \fr 31.39\fr* \fk ܡܬܓܢܒ\fk* \ft L\ft*\f* ܒܠܠܝܐ. +\v 40 ܗܘܝܬ ܒܐܝܡܡܐ ܐܟܠܢܝ ܫܘܒܐ. ܘܐܓܠܝܕܐ ܒܠܠܝܐ. ܦܪܕܬ ܫܢܬܝ ܡܢ ܥܝ̈ܢܝ. +\v 41 ܗܐ ܥܣܪ̈ܝܢ ܠܝ ܫ̈ܢܝܢ ܒܒܝܬܟ. ܦܠܚܬܟ ܐܪ̈ܒܥܣܪܐ ܫ̈ܢܝܢ ܒܬܪ̈ܬܝܢ ܒܢ̈ܬܟ. ܘܫܬ ܫ̈ܢܝܢ ܒܥܢܟ. ܘܚ̣ܠܦܬ ܐܓܪܝ ܥܣ̣ܪ̈ ܙܒ̈ܢܝܢ. +\v 42 ܘܐܠܘ ܠܐ ܐܠܗܗ ܕܐܒܝ. ܐܠܗܗ ܕܐܒܪܗܡ ܘܕܚܠܬܗ ܕܐܝܣܚܩ ܩܡ ܠܝ. ܗܫܐ ܣܪܝܩܐܝܬ ܡܫܕܪ ܗܘܝܬ ܠܝ. ܥܡܠܝ ܘܠܐܘܬܐ ܕܐܝ̈ܕܝ ܚ̣ܙܐ ܐܠܗܐ ܘܐܟܣܟ ܒܪܡܫܐ. +\v 43 ܘܥܢ̣ܐ ܠܒܢ ܘܐܡ̣ܪ ܠܝܥܩܘܒ. ܒܢ̈ܬܐ ܒܢ̈ܬܝ. ܘܒ̈ܢܝܐ ܒܢ̈ܝ. ܘܥܢܐ ܥܢܝ. ܘܟܠ ܕܚ̇ܙܐ ܐܢܬ ܕܝܠܝ ܗ̣ܘ. ܘܠܒܢ̈ܬܝ ܗܠܝܢ ܡܢܐ ܐܥܒܕ ܠܗܝܢ ܝܘܡܢܐ. ܐܘ ܠܒܢ̈ܝܗܝܢ ܕܝܠ̣ܕ. +\v 44 ܘܗܫܐ ܬܐ ܢܩܝܡ ܩܝܡܐ ܐܢܐ ܘܐܢܬ. ܘܢܗܘܐ ܣܗܕܐ ܒܝܢܝ ܘܠܟ. +\v 45 ܘܢܣ̣ܒ ܝܥܩܘܒ ܟܐܦܐ ܘܐܪܝܡܗ̇ ܩܝܡܬܐ. +\v 46 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܐ̈ܚܘܗܝ ܠܩ̇ܛܘ ܟܐ̈ܦܐ. ܘܢܣܒܘ ܟܐ̈ܦܐ ܘܥܒܕܘ ܝܓܪܐ. ܘܐܟܠܘ ܬܡܢ ܥܠ ܝܓܪܐ. +\v 47 ܘܩܪܝܗܝ ܠܒܢ ܝܓܪܐ ܕܣܗܕܘܬܐ. ܘܝܥܩܘܒ ܩܪܝܗܝ ܓܠܥܕ. +\v 48 ܘܐܡ̣ܪ ܠܒܢ. ܝܓܪܐ ܗܢܐ ܣܗ̇ܕ ܒܝܢܝ ܘܠܟ ܝܘܡܢܐ. ܡܛܠ ܗܢܐ ܩܪܐ ܫܡܗ ܓܠܥܕ. +\v 49 ܘܕܘܩܐ ܕܐܡ̣ܪ\f r \fr 31.49\fr* \fk ܘ\fk* \ft 5b1\ft*\f* ܢܚܙܐ ܡܪܝܐ ܒܝܢܝ ܘܠܟ. ܡܛܠ ܕܦܪܫܝܢܢ ܓܒܪ ܡܢ ܐܚܘܗܝ\f s \fr 31.49\fr* \fk ܚܒܪܗ\fk* \ft 5b1\ft*\f*. +\v 50 ܐܢ ܬܨܥܪ ܠܒܢ̈ܬܝ. ܘܐܢ ܬܣܒ ܢܫ̈ܐ ܥܠ ܒܢ̈ܬܝ. ܠܝܬ ܐܢܫ ܥܡܢ. ܚܙܝ ܕܐܠܗܐ ܣܗ̇ܕ ܒܝܢܝ ܘܠܟ. +\v 51 ܘܐܡ̣ܪ ܠܒܢ ܠܝܥܩܘܒ. ܗܐ ܝܓܪܐ ܗܢܐ ܘܗܐ ܩܝܡܬܐ ܗܕܐ ܕܐܩܝܡܬ ܒܝܢܝ ܘܠܟ. +\v 52 ܣܗ̇ܕ ܝܓܪܐ ܗܢܐ ܘܣܗܕܐ ܩܝܡܬܐ ܗܕܐ. ܕܐܢܐ ܠܐ ܐܥܒܪ ܥܠܝܟ ܝܓܪܐ ܗܢܐ. ܘܐܦ ܐܢܬ ܠܐ ܬܥܒܪ ܥܠ ܝܓܪܐ ܗܢܐ ܘܩܝܡܬܐ ܗܕܐ ܠܒܝܫܬܐ. +\v 53 ܐܠܗܗ ܕܐܒܪܗܡ ܐܠܗܗ ܕܢܚܘܪ ܢܕܘܢ ܒܝܢܬܢ ܐܠܗܐ ܕܐ̈ܒܗܬܢ. ܘܝܡ̣ܐ ܝܥܩܘܒ ܒܕܚܠܬܐ ܕܐܒܘܗܝ ܐܝܣܚܩ. +\v 54 ܘܕܒ̇ܚ ܝܥܩܘܒ ܕܒܚܬܐ ܒܛܘܪܐ. ܘܩܪܐ ܠܐ̈ܚܘܗܝ ܠܡܐܟܠ ܠܚܡܐ. ܘܐܟܠܘ ܠܚܡܐ ܘܒܬܘ ܒܛܘܪܐ. +\c 32 +\v 1 ܘܩ̇ܕܡ ܠܒܢ ܒܫܦܪܐ\f a \fr 32.1\fr* \fk ܒܨܦܪܐ\fk* \ft 5b1\ft*\f*. ܘܢܫ̇ܩ ܠܒܢ̈ܘܗܝ ܘܠܒܢ̈ܬܗ ܘܒ̇ܪܟ ܐܢܘܢ. ܘܗ̣ܦܟ ܠܒܢ ܘܐܙ̣ܠ ܠܐܬܪܗ. +\v 2 ܘܐܦ ܝܥܩܘܒ ܘܝܥܩܘܒ\f b \fr 32.2\fr* \fk ܘܝܥܩܘܒ\fk* \ft om. 5b1, 8b1\ft*\f* ܐܙ̣ܠ ܠܐܘܪܚܗ. ܘܦܓܥܘ ܒܗ ܡܠܐ̈ܟܘܗܝ ܕܐܠܗܐ. +\v 3 ܘܐܡ̣ܪ ܝܥܩܘܒ ܟܕ ܚ̣ܙܐ ܐܢܘܢ. ܡܫܪܝܬܐ ܗܝ ܕܐܠܗܐ ܗܕܐ. ܘܩ̣ܪܐ ܫܡܗ ܕܐܬܪܐ ܗ̇ܘ ܡܚܢܝܡ. +\v 4 ܘܫܕܪ ܝܥܩܘܒ ܐܝܙ̈ܓܕܐ ܩܕܡܘܗܝ ܠܘܬ ܥܣܘ ܐܚܘܗܝ. ܠܐܪܥܐ ܕܣܥܝܪ ܠܚܩܠܐ ܕܐܕܘܡ. +\v 5 ܘܦܩ̇ܕ ܐܢܘܢ ܘܐܡ̣ܪ ܠܗܘܢ. ܗܟܢܐ ܬܐܡܪܘܢ ܠܡܪܝ ܥܣܘ. ܗܟܢܐ ܐܡ̇ܪ ܥܒ̣ܕܟ ܝܥܩܘܒ. ܥܡ ܠܒܢ ܥܡ̇ܪܬ. ܘܐ̇ܘܚܪܬ ܥܕܡܐ ܠܝܘܡܢܐ\f c \fr 32.5\fr* \fk ܠܗܫܐ\fk* \ft 5b1\ft*\f*. +\v 6 ܘܗܘܘ ܠܝ ܬܘܪ̈ܐ ܘܚܡܪ̈ܐ. ܘܥܢܐ ܘܥܒ̈ܕܐ ܘܐܡܗ̈ܬܐ. ܘܫ̇ܕܪܬ ܠܡܚܘܝܘ ܠܡܪܝ ܕܐܫܟܚ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ. +\v 7 ܘܗܦܟܘ ܐܝܙ̈ܓܕܐ ܠܘܬ ܝܥܩܘܒ ܘܐܡ̣ܪܘ ܠܗ. ܐܙܠܢ ܠܘܬ ܥܣܘ ܐܚܘܟ. ܘܗܐ ܐܦ ܗ̣ܘ ܐܬ̇ܐ ܠܐܘܪܥܟ. ܘܐܪ̈ܒܥܡܐܐ ܓܒܪ̈ܝܢ ܥܡܗ. +\v 8 ܘܕܚ̣ܠ ܝܥܩܘܒ ܘܥܩ̣ܬ ܠܗ ܛܒ. ܘܦ̇ܠܓ ܥܡܐ ܕܥܡܗ. ܘܥܢܐ ܘܬܘܪ̈ܐ ܘܓܡ̈ܠܐ ܠܬܪ̈ܬܝܢ ܡܫܪ̈ܝܢ. +\v 9 ܘܐܡ̣ܪ ܝܥܩܘܒ\f d \fr 32.9\fr* \fk ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܐܢ ܢܐܬܐ ܥܣܘ ܐܚܝ ܥܠ ܡܫܪܝܬܐ ܚܕܐ ܘܢܚܪܒܝܗ̇. ܡܫܪܝܬܐ ܕܡܫܬܚܪܐ ܡܬܦܠܛܐ. +\v 10 ܘܨܠܝ\f e \fr 32.10\fr* \fk ܘܨܠܝ\fk* \ft om. 5b1\ft*\f*\f f \fr 32.10\fr* \fk ܝܥܩܘܒ\fk* \ft add. E, W, M, U, L\ft*\f* ܘܐܡ̣ܪ\f g \fr 32.10\fr* \fk ܝܥܩܘܒ\fk* \ft add. 5b1\ft*\f*. ܐܠܗܗ ܕܐܒܝ ܐܒܪܗܡ. ܐܠܗܗ ܕܐܒܝ ܐܝܣܚܩ. ܡܪܝܐ ܕܐܡ̣ܪ ܠܝ. ܗܦܘܟ ܠܐܪܥܐ ܕܐܒ̈ܗܝܟ\f h \fr 32.10\fr* \fk ܠܐܪܥܟ\fk* \ft 5b1\ft*\f* ܘܠܬܘ̈ܠܕܬܟ ܘܐܛܐܒ ܠܟ. +\v 11 ܒܨܝܪ ܐܢܐ ܡܢ ܟܠܗܝܢ ܛܝܒ̈ܘܬܟ. ܘܡܢ ܟܠܗ ܩܘܫܬܐ ܕܥܒ̣ܕܬ ܥܡ ܥܒܕܟ. ܡܛܠ ܕܒܚܘܛܪܝ ܥܒ̇ܪܬ ܝܘܪܕܢܢ ܗܢܐ. ܘܗܫܐ ܗܘܝܬ ܠܬܪ̈ܬܝܢ ܡܫܪ̈ܝܢ. +\v 12 ܦܨܢܝ ܡܢ ܐ̈ܝܕܘܗܝ ܕܥܣܘ ܐܚܝ. ܡܛܠ ܕܕܚ̇ܠ ܐܢܐ ܡܢܗ ܕܠܡܐ\f i \fr 32.12\fr* \fk ܕ\fk* \ft 5b1\ft*\f* ܢܐܬܐ ܘܢܡܚܝܢܝ ܐܡܐ ܥܡ ܒܢ̈ܝܗ̇. +\v 13 ܘܐܢܬ ܐܡ̣ܪܬ ܡܛܐܒ̣ܘ\f j \fr 32.13\fr* \fk ܕ\fk* \ft 5b1, W, E, M, U, L\ft*\f* ܐܛܐܒ ܠܟ. ܘܐܥܒܕ ܙܪܥܟ ܐܝܟ ܚܠܐ ܕܝܡܐ. ܕܠܐ ܡܬܡܢܐ ܡܢ ܣܘܓܐܗ. +\v 14 ܘܒܬ ܬܡܢ ܒܠܠܝܐ ܗ̇ܘ. ܘܢܣ̣ܒ ܡܢ ܡܕܡ ܕܐܝܬܝ ܒܐܝܕܗ ܩܘܪܒܢܐ ܠܥܣܘ ܐܚܘܗܝ. +\v 15 ܥ̈ܙܐ ܡܐܬ̈ܝܢ. ܘܬܝܫ̈ܐ ܥܣܪ̈ܝܢ. ܢܩܘ̈ܬܐ ܡܐܬܝܢ. ܘܕܟܪ̈ܐ ܥܣܪ̈ܝܢ. +\v 16 ܓܡ̈ܠܐ ܡܝܢܩ̈ܬܐ ܘܒܢܝ̈ܗܝܢ ܬܠܬܝܢ. ܬܘܪ̈ܬܐ ܐܪ̈ܒܥܝܢ ܘܬܘܪ̈ܐ ܥܣܪܐ. ܐܬ̈ܢܐ ܥܣܪ̈ܝܢ ܘܥ̈ܝܠܐ ܥܣܪܐ. +\v 17 ܘܝܗ̣ܒ ܒܐܝܕܐ ܕܥܒ̈ܕܘܗܝ ܓܙܪܐ ܓܙܪܐ ܒܠܚܘܕ. ܘܐܡ̣ܪ ܠܥܒ̈ܕܘܗܝ. ܥܒܪܘ ܩܕܡܝ. ܘܐܪܘܚܬܐ ܥܒܕܘ ܒܝܬ ܓܙܪܐ ܠܓܙܪܐ. +\v 18 ܘܦܩ̇ܕ ܠܩܕܡܝܐ ܘܐܡ̣ܪ ܠܗ. ܕܟܕ ܢܦܓܥ ܒܟ ܥܣܘ ܐܚܝ. ܘܢܫܐܠܟ ܘܢܐܡܪ ܠܟ. ܕܡ̇ܢ ܐܢܬ ܘܠܐܝܟܐ ܐ̇ܙܠ ܐܢܬ. ܘܕܡ̇ܢ ܗܠܝܢ ܕܩܕܡܝܟ. +\v 19 ܐܡ̣ܪ ܠܗ ܕܥܒܕܟ ܝܥܩܘܒ. ܩܘܪܒܢܐ ܕܫܕܪ ܠܡܪܝ ܥܣܘ. ܘܗܐ ܐܦ ܗ̣ܘ ܐܬ̇ܐ ܒܬܪܢ. +\v 20 ܘܦܩ̇ܕ ܠܬܢܝܢܐ †ܘܐܦ† ܠܬܠܝܬܝܐ. ܘܐܦ ܠܟܠ ܕܐܙܠܝܢ ܒܬܪ ܓܙܪ̈ܐ ܠܡܐܡܪ. ܐܝܟ ܦܬܓܡܐ ܗܢܐ ܬܐܡܪܘܢ ܠܥܣܘ ܡܐ ܕܐܫܟܚܬܘܢܝܗܝ. +\v 21 ܘܬܐܡܪܘܢ ܠܗ\f k \fr 32.21\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܕܗܐ\f l \fr 32.21\fr* \fk ܗܐ\fk* \ft 5b1\ft*\f* ܐܦ ܥܒܕܟ ܝܥܩܘܒ ܒܬܪܢ. ܡܛܠ ܕܐܡ̣ܪ. ܕܐܢܝܚ ܪܘܓܙܗ ܒܩܘܪܒܢܐ ܕܐ̇ܙܠ ܩܕܡܝ. ܘܒܬܪܟܢ ܐ̇ܚܙܐ ܐܦܘ̈ܗܝ. ܟܒܪ ܢܣ̣ܒ ܒܐ̈ܦܝ. +\v 22 ܘܥ̣ܒܪ ܩܘܪܒܢܐ ܩܕܡܘܗܝ. ܘܗ̣ܘ ܒܬ ܒܠܠܝܐ ܗ̇ܘ ܒܡܫܪܝܬܐ. +\v 23 ܘܩ̇ܕܡ ܒܠܠܝܐ\f m \fr 32.23\fr* \fk ܗ̇ܘ\fk* \ft add. 5b1\ft*\f*. †ܘܕܒܪ†\f n \fr 32.23\fr* \fk ܘܐܥܒܪ\fk* \ft Ai\ft*\f* ܬܪ̈ܬܝܢ\f o \fr 32.23\fr* \fk ܠ\fk* \ft 12a1, L\ft*\f* ܢܫ̈ܘܗܝ ܘܬܪ̈ܬܝܢ ܐܡܗ̈ܬܗ. ܘܚܕܥܣܪ ܒܢ̈ܘܗܝ ܘܐܥܒܪ ܐܢܘܢ ܠܡܕܒܪܐ ܕܝܒܩ. +\v 24 ܘܕܒ̣ܪ ܐܢܘܢ ܘܐܥܒܪ ܐܢܘܢ ܢܚܠܐ\f p \fr 32.24\fr* \fk ܠ\fk* \ft 5b1\ft*\f*. ܘܐܥܒܪ ܟܠ ܕܐܝܬ ܠܗ. +\v 25 ܘܦܫ ܝܥܩܘܒ ܒܠܚܘܕܘܗܝ. ܘܐܬܟܬܫ ܓܒܪܐ ܥܡܗ ܥܕܡܐ ܕܣܠ̣ܩ ܫܦܪܐ\f q \fr 32.25\fr* \fk ܨܦܪܐ\fk* \ft 5b1\ft*\f*. +\v 26 ܘܚ̣ܙܐ ܕܠܐ ܡܬܡܨܐ ܚܝܠܗ ܘܩܪ̣ܒ ܠܚܪܘܬܗ. ܘܫ̣ܢܬ ܚܪܘܬܗ ܕܝܥܩܘܒ ܟܕ ܐܬܟܬܫ ܥܡܗ. +\v 27 ܘܐܡ̣ܪ ܠܗ\f r \fr 32.27\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܫܕܪܝܢܝ ܡܛܠ ܕܣܠ̣ܩ ܫܦܪܐ\f s \fr 32.27\fr* \fk ܨܦܪܐ\fk* \ft 5b1\ft*\f* ܘܐܡ̣ܪ. ܠܐ ܐܫܕܪܟ ܐܠܐ ܐܢ ܒܪܟܬܢܝ. +\v 28 ܘܐܡ̣ܪ ܠܗ. ܐܝܟܢܐ ܫܡܟ. ܘܐܡ̣ܪ ܝܥܩܘܒ. +\v 29 ܘܐܡ̣ܪ ܠܗ\f t \fr 32.29\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܝܥܩܘܒ ܢܬܩܪܐ ܬܘܒ ܫܡܟ ܐܠܐ ܐܝܣܪܝܠ. ܡܛܘܠ ܕܐܫ̣ܬܪܪܬ ܥܡ ܡܠܐܟܐ ܘܥܡ ܓܒܪܐ ܘܐܬܡܨܝ̣ܬ ܚܝܠܐ. +\v 30 ܘܫܐܠܗ ܝܥܩܘܒ ܘܐܡ̣ܪ. ܚܘܢܝ ܫܡܟ. ܐܡ̇ܪ ܠܗ\f u \fr 32.30\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܠܡܢܐ ܫܐ̇ܠ ܐܢܬ ܥܠ ܫܡܝ. ܘܒܪܟܗ ܬܡܢ. +\v 31 ܘܩ̣ܪܐ ܝܥܩܘܒ ܫܡܗ ܕܐܬܪܐ ܗ̇ܘ ܦܢܘܐܝܠ. ܡܛܠ ܕܚ̇ܙܝܬ ܡܠܐܟܐ ܐ̈ܦܝܢ ܠܘܩܒܠ ܐ̈ܦܝܢ ܘܐܬܦ̣ܨܝܬ ܢܦܫܝ. +\v 32 ܘܕܢ̣ܚܬ ܠܗ ܫܡܫܐ ܟܕ ܥܒ̣ܪ ܠܦܢܘܐܝܠ. ܘܗ̣ܘ ܡ̇ܣܡܐ ܗܘܐ ܡܢ ܚܪܘܬܗ. +\v 33 ܡܛܠ ܗܢܐ ܠܐ ܐܟܠܝܢ ܒܢ̈ܝ ܐܝܣܪܝܠ. ܓܝܕܐ ܕܓܢܫܝܐ ܕܒܚܪܘܬܐ ܕܥܛܡܐ ܥܕܡܐ ܠܝܘܡܢܐ. ܡܛܠ ܕܩ̣ܪܒ ܠܚܪܘܬܐ ܕܥܛܡܗ ܕܝܥܩܘܒ ܠܓܢܫܝܐ. +\c 33 +\v 1 ܘܐܪܝܡ ܝܥܩܘܒ ܥܝܢ̈ܘܗܝ ܘܚ̣ܙܐ ܘܗܐ ܥܣܘ ܐܬ̇ܐ\f a \fr 33.1\fr* \fk ܠܐܘܪܥܗ\fk* \ft add. 5b1\ft*\f*. ܘܥܡܗ ܐܪܒܥܡܐܐ ܓܒܪ̈ܝܢ. ܘܦ̇ܠܓ ܛ̈ܠܝܐ ܥܠ ܠܝܐ ܘܥܠ ܪܚܝܠ. ܘܥܠ ܬܪ̈ܬܝܢ ܐܡܗ̈ܬܐ. +\v 2 ܘܥܒ̣ܕ\f b \fr 33.2\fr* \fk ܘܥܒ̣ܪ\fk* \ft U, M\ft*\f* ܠܐܡܗ̈ܬܐ ܘܠܒܢܝ̈ܗܝܢ ܩܕܡܝܬ. ܘܠܠܝܐ ܘܠܒ̈ܢܝܗ̇ ܒܬܪܗܝܢ. ܘܠܪܚܝܠ ܘܠܝܘܣܦ ܒܚܪܬܐ. +\v 3 ܘܗ̣ܘ ܥܒ̣ܪ ܩܕܡܝܗܘܢ. ܘܣܓ̣ܕ ܥܠ ܐܪܥܐ ܫܒܥ ܙܒ̈ܢܝܢ. ܥܕܡܐ ܕܩܪܒ ܠܘܬ [-]\f c \fr 33.3\fr* \fk ܥܣܘ\fk* \ft 7a1\ft*\f* ܐܚܘܗܝ. +\v 4 ܘܪܗܛ ܥܣܘ ܠܐܘܪܥܗ. ܘܥܦܩܗ ܘܢܦܠ ܥܠ ܨܘܪܗ. ܘܢܫܩܗ ܘܒܟܘ. +\v 5 ܘܐܪܝܡ ܥܣܘ\f d \fr 33.5\fr* \fk ܥܣܘ\fk* \ft om. 5b1\ft*\f* ܥܝܢ̈ܘܗܝ. ܘܚ̣ܙܐ ܢܫ̈ܐ ܘܛ̈ܠܝܐ ܘܐܡ̣ܪ. ܐܝܡܟܐ ܠܟ ܗܠܝܢ ܘܐܡ̣ܪ\f e \fr 33.5\fr* \fk ܠܗ ܝܥܩܘܒ\fk* \ft add. E, W, 11.10g1, M, U, L\ft*\f*. ܛ̈ܠܝܐ ܐܢܘܢ ܕܝܗ̣ܒ ܐܠܗܐ ܠܥܒ̣ܕܟ. +\v 6 ܘܩܪܒ ܐܡܗ̈ܬܐ ܗ̈ܢܝܢ ܘܒ̈ܢܝܗܝܢ ܘܣܓ̣ܕܘ. +\v 7 ܘܩ̣ܪܒܬ ܐܦ\f f \fr 33.7\fr* \fk ܐܦ\fk* \ft om. 12a1\ft*\f* ܠܝܐ ܘܒ̈ܢܝܗ̇ ܘܣܓ̣ܕܘ. ܘܒܬܪܟܢ ܩܪܒܘ ܐܦ ܪܚܝܠ ܘܝܘܣܦ ܘܣܓ̣ܕܘ. +\v 8 ܘܐܡܪ [-]\f g \fr 33.8\fr* \fk ܠܗ\fk* \ft 7a1, 7h5, 11.10g1, 12b2\ft*\f* ܥܣܘ\f h \fr 33.8\fr* \fk ܥܣܘ\fk* \ft om. 5b1\ft*\f*\f i \fr 33.8\fr* \fk ܠܝܥܩܘܒ\fk* \ft add. E, W, M, U, L\ft*\f*. ܐܝܡܟܐ ܠܟ †ܗܕܐ ܟܠܗ̇ ܡܫܪܝܬܐ† ܕܦܓܥܬ ܒܝ. ܘܐܡ̣ܪ ܠܗ ܝܥܩܘܒ\f j \fr 33.8\fr* \fk ܠܗ ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܡܛܠ ܕܐܫ̇ܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝ ܡܪܝ. +\v 9 †ܘܐܡܪ† ܠܗ\f k \fr 33.9\fr* \fk ܠܗ\fk* \ft om. 5b1, 8b1, 11.10g1\ft*\f* ܥܣܘ\f l \fr 33.9\fr* \fk ܥܣܘ\fk* \ft om. 5b1\ft*\f*. ܐܝܬ ܠܝ ܘܣ̇ܓܝ ܠܝ. ܐܚܝ ܩܕܐ ܕܝܠܟ. +\v 10 ܐܡ̇ܪ ܠܗ\f m \fr 33.10\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܝܥܩܘܒ. ܐܢ ܐܫ̇ܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ. ܣܒ\f n \fr 33.10\fr* \fk ܩܒܠ\fk* \ft L\ft*\f* ܩܘܪܒܢܝ ܡܢ ܐ̈ܝܕܝ. ܡܛܠ ܕܗܫܐ ܚ̇ܙܝܬ ܐ̈ܦܝܟ. ܐܝܟ ܚܙܘܐ ܕܐ̈ܦܝ ܡܠܐܟܐ ܘܐܨܛܒܝܬ ܒܝ. +\v 11 ܣܒ ܒܘܪܟܬܝ ܕܐܝܬ̇ܝܬ ܠܟ. ܡܛܠ ܕܪܚ̇ܡ ܥܠܝ ܐܠܗܐ. ܘܡܛܠ ܕܐܝܬ ܠܝ ܟܠ. ܘܐܠܨܗ ܘܩ̇ܒܠ. +\v 12 ܐܡܪ ܠܗ ܥܣܘ. ܢܫܩܘܠ ܘܢܐܙܠ. ܘܐܙܠ ܠܩܘܒܠܟ. +\v 13 ܐܡ̇ܪ ܠܗ ܝܥܩܘܒ. ܡܪܝ ܝܕܥ ܕܛ̈ܠܝܐ ܛܠ̣ܝܢ. ܘܥܢܐ ܘܬܘܪ̈ܐ ܡܝܢܩܢ ܥܠܝ. ܘܐܢ ܪܕܦ̇ ܐܢܐ ܠܗܘܢ ܚܕ ܝܘܡ. ܡܝܬܐ ܟܘܠܗ̇ ܥܢܐ. +\v 14 ܢܥܒܪ ܡܪܝ ܩܕܡ ܥܒܕܗ. ܘܐܢܐ ܐܗܠܟ ܪܟܝܟܐܝܬ ܠܪܓܠ ܥܒܕܬܐ ܕܩܕܡܝ ܘܠܪܓܠ ܛ̈ܠܝܐ. ܥܕܡܐ ܕܐܬܐ †ܠܘܬ† ܡܪܝ ܠܣܥܝܪ. +\v 15 ܐܡ̇ܪ ܠܗ\f o \fr 33.15\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܥܣܘ. ܐܫܒܘܩ ܠܘܬܟ ܡܢ ܥܡܐ ܕܥܡܝ. ܘܐܡ̣ܪ ܝܥܩܘܒ\f p \fr 33.15\fr* \fk ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f*. ܠܡܢܐ ܗ̇ܘܐ ܠܝ ܐܫܟܚ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝ ܡܪܝ. +\v 16 ܘܗ̣ܦܟ ܥܣܘ ܒܝܘܡܐ ܗ̇ܘ ܠܐܘܪܚܗ. ܠܣܥܝܪ. +\v 17 ܘܝܥܩܘܒ ܫܩܠ ܠܣܟܘܬ. ܘܒܢ̣ܐ ܠܗ ܒܝܬܐ. ܘܠܒܥܝܪܗ ܥܒ̣ܕ ܡܛܠܠܐ. ܡܛܠ ܗܢܐ ܩ̣ܪܐ ܫܡܗ ܕܐܬܪܐ ܗ̇ܘ ܣܟܘܬ. +\v 18 ܘܐܬܐ ܝܥܩܘܒ ܠܫܠܝܡ ܩܪܝܬܐ ܕܫܟܝܡ ܕܒܐܪܥܐ\f q \fr 33.18\fr* \fk ܒܐܬܪܐ\fk* \ft 12a1\ft*\f* ܕܟܢܥܢ. ܟܕ ܐܬܐ ܡܢ ܦܕܢ ܕܐܪܡ ܘܫ̣ܪܐ ܠܩܘܒܠܗ̇ ܕܩܪܝܬܐ. +\v 19 ܘܙܒܢ ܡܢܬܐ ܕܚܩܠܐ ܡܢ ܒܢ̈ܝ ܚܡܘܪ ܐܒܘܗܝ ܕܫܟܝܡ ܒܡܐܐ ܢܩ̈ܘܢ. ܘܢܩ̣ܫ ܬܡ̇ܢ ܡܫܟܢܗ. +\v 20 ܘܐܩܝܡ ܬܡܢ ܡܕܒܚܐ. ܘܩܪܝܗܝ ܐܝܠ ܐܠܗܐ ܕܐܝܣܪܝܠ. +\c 34 +\v 1 ܘܢܦܩ̣ܬ ܕܝܢ̣ܐ ܒܪܬ ܠܝܐ. ܕܐܬܝ̣ܠܕܬ ܠܝܥܩܘܒ ܠܡܚܙܐ ܒܢ̈ܬ ܐܬܪܐ. +\v 2 ܘܚܙܗ̇\f a \fr 34.2\fr* \fk ܠܕܝܢܐ\fk* \ft add. L\ft*\f* ܫܟܝܡ ܒܪ ܚܡܘܪ ܚܘܝܐ ܪܒܐ ܕܐܪܥܐ. ܘܕܒܪܗ̇ ܘܕܡ̣ܟ ܥܡܗ̇ ܘܨܥܪܗ̇. +\v 3 ܘܢܦ̣ܩܬ ܢܦܫܗ ܒܬܪ ܕܝܢ̣ܐ ܒܪܬ ܝܥܩܘܒ. ܘܪܚܡܗ̇ ܠܛܠܝܬܐ. ܘܡܠ̣ܐ ܒܠܒܗ̇ ܕܛܠܝܬܐ. +\v 4 ܘܐܡ̣ܪ ܫܟܝܡ ܠܚܡܘܪ ܐܒܘܗܝ. ܣܒ ܠܝ ܛܠܝܬܐ ܗܕܐ ܐܢܬܬܐ. +\v 5 ܘܝܥܩܘܒ ܫܡ̣ܥ ܕܛ̇ܡܐܘ ܠܕܝܢ̣ܐ ܒܪܬܗ. ܘܒܢ̈ܘܗܝ ܥܡ ܒܥܝܪ̈ܐ ܗܘܘ ܒܚܩܠܐ. ܘܫܬ̣ܩ ܝܥܩܘܒ ܥܕܡܐ ܕܐܬܘ. +\v 6 ܘܢܦ̣ܩ ܚܡܘܪ ܐܒܘܗܝ ܕܫܟܝܡ ܠܘܬ ܝܥܩܘܒ ܠܡܡܠܠܘ ܥܡܗ. +\v 7 ܘܒ̈ܢܝ ܝܥܩܘܒ ܐܬܘ ܡܢ ܚܩܠܐ. ܘܟܕ ܫܡܥܘ ܟ̣ܪܝܬ ܠܗܘܢ ܠܓܒܪ̈ܐ. ܘܐܬܐܒܫ ܠܗܘܢ ܛܒ. ܡܛܠ\f b \fr 34.7\fr* \fk ܡܛܠ\fk* \ft om. 5b1\ft*\f* ܕܥܒܕܘ ܛܡܐܘܬܐ ܒܐܝܣܪܝܠ ܘܨܥܪܘ ܠܒܪܬ ܝܥܩܘܒ. ܘܗܟܢܐ ܠܐ ܡܬܥܒܕ. +\v 8 ܘܡܠܠ ܚܡܘܪ ܥܡܗܘܢ ܘܐܡ̣ܪ ܠܗܘܢ\f c \fr 34.8\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܫܟܝܡ ܒܪܝ ܨܒܬ ܢܦܫܗ ܒܒܪܬܟܘܢ. ܗܒܘܗ̇ ܠܗ ܐܢܬܬܐ. +\v 9 ܘܐܬܚܬܢܘ ܥܡܢ. ܒܢ̈ܬܟܘܢ ܗܒܘ ܠܢ. ܘܒܢܬ̈ܢ ܣܒܘ ܠܟܘܢ. +\v 10 ܘܥܡܢ ܬܒܘ. ܘܐܪܥܐ ܗܐ ܩܕܡܝܟܘܢ. ܬܒܘ ܘܐܬܬܓܪܘ ܘܝܪܬܘ ܒܗ̇. +\v 11 ܘܐܡ̣ܪ ܫܟܝܡ ܠܐܒܘܗ̇ ܘܠܐܚ̈ܝܗ̇. ܐܫܟܚ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟܘܢ. ܘܟܠ ܕܬܐܡܪܘܢ ܠܝ ܐܬܠ. +\v 12 ܐܣܓܘ ܥܠܝ ܛܒ ܡܗܪܐ ܘܡܘܗ̈ܒܬܐ. ܘܐܬܠ ܐܝܟܢܐ\f d \fr 34.12\fr* \fk ܐܬܠ ܐܝܟ\fk* \ft 5b1\ft*\f* ܕܬܐܡܪܘܢ ܠܝ. ܘܗܒܘ ܠܝ ܛܠܝܬܐ ܗܕܐ ܐܢܬܬܐ. +\v 13 ܘܥܢܘ ܒܢ̈ܝ ܝܥܩܘܒ ܠܫܟܝܡ ܘܠܚܡܘܪ ܐܒܘܗܝ. ܘܐܡܪܘ ܠܗ\f e \fr 34.13\fr* \fk ܡܠܠܘ\fk* \ft 5b1\ft*\f* ܒܢܟܠܐ. ܥܠ ܕܛܡܐܘ ܠܕܝܢ̣ܐ ܚܬܗܘܢ. +\v 14 ܘܐܡܪܘ\f f \fr 34.14\fr* \fk ܘܐܡܪܘ\fk* \ft om. 12b1\ft*\f* ܠܐ ܡܫܟܚܝܢܢ ܠܡܥܒܕ ܦܬܓܡܐ ܗܢܐ. ܠܡܬܠ ܚܬܢ\f g \fr 34.14\fr* \fk ܠ\fk* \ft L\ft*\f* ܠܓܒܪܐ ܕܐܝܬ ܠܗ ܥܘܪܠܘܬܐ. ܡܛܠ ܕܚܣܕܐ ܗܘ ܠܢ. +\v 15 ܒܪܡ ܒܗܕܐ ܢܬ̣ܛܦܝܣ ܠܟܘܢ. ܐܢܗ̣ܘ ܕܬܗܘܘܢ ܐܟܘܬܢ. ܘܬܓܙܪܘܢ ܟܠ ܕܟܪܐ ܐܝܟܢܐ ܕܚܢܢ ܓܙܝܪ̈ܝܢ\f h \fr 34.15\fr* \fk ܐܝܟܢܐ ܕܚܢܢ ܓܙܝܪ̈ܝܢ\fk* \ft om. 5b1\ft*\f*\f i \fr 34.15\fr* \fk ܓܙܝܪ̈ܝܢܢ\fk* \ft 12b1, L\ft*\f*. +\v 16 ܢܬܠ ܠܟܘܢ ܒܢ̈ܬܢ. ܘܒܢ̈ܬܟܘܢ ܢܣܒ ܠܢ. ܘܢܬܒ ܥܡܟܘܢ ܘܢܗܘܐ ܥܡܐ ܚܕ. +\v 17 ܘܐܢ ܠܐ †ܬܫܡܥܘܢܢ† ܠܡܓܙܪ. ܢܕܒ̣ܪ ܒܪܬܢ ܘܢܐܙܠ. +\v 18 ܘܫ̣ܦܪ ܡ̈ܠܝܗܘܢ ܒܥܝܢ̈ܝ ܚܡܘܪ ܘܒܥܝ̈ܢܝ ܫܟܝܡ ܒܪܗ. +\v 19 ܘܠܐ ܫܘܚܪ ܛܠܝܐ ܠܡܥܒܕܗ̇ ܠܥܒܝܕܬܐ\f j \fr 34.19\fr* \fk ܥܒܝܕܬܐ\fk* \ft 5b1\ft*\f*. ܡܛܘܠ ܕܐܨܛܒܝ ܗܘܐ\f k \fr 34.19\fr* \fk ܗܘܐ\fk* \ft om. 5b1\ft*\f* ܒܒܪܬ ܝܥܩܘܒ. ܘܗ̣ܘ ܝܩܝܪ ܗܘܐ ܡܢ ܟܘܠܗ ܒܝܬ ܐܒܘܗܝ. +\v 20 ܘܐܬܐ ܚܡܘܪ ܘܫܟܝܡ ܒܪܗ ܠܬܪܥܐ ܕܩܪܝܬܗܘܢ. ܘܡܠܠܘ ܥܡ ܐܢܫ̈ܐ ܕܩܪܝܬܗܘܢ. ܘܐܡܪܘ ܠܗܘܢ. +\v 21 ܓܒܪ̈ܐ ܗܠܝܢ ܫܠܡܝܢ ܐܢܘܢ ܥܡܢ. ܢܬܒܘܢ ܒܐܪܥܐ ܘܢܬܬܓܪܘܢ ܒܗ̇. ܘܐܪܥܐ ܗܐ ܪܘܚܬܐ\f l \fr 34.21\fr* \fk ܗ̇ܝ\fk* \ft add. 5b1\ft*\f* ܕܐ̈ܝܕܝܐ ܩܕܡܝܗܘܢ. ܒܢ̈ܬܗܘܢ ܢܣܒ ܠܢ ܢܫ̈ܐ. ܘܒܢ̈ܬܢ ܢܬܠ ܠܗܘܢ. +\v 22 ܒܪܡ ܒܗܕܐ ܡܬܛܦܝܣܝܢ ܠܢ ܓܒܪ̈ܐ ܕܢܬܒܘܢ ܥܡܢ. ܘܢܗܘܐ ܥܡܐ ܚܕ ܡܐ ܕܓܙܪܢ ܟܠ ܕܟܪܐ ܐܝܟܢܐ ܕܗ̣ܢܘܢ ܓܙܝܪ̈ܝܢ. +\v 23 ܢܟܣ̈ܝܗܘܢ ܘܩܢܝܢܗܘܢ ܘܟܠܗ̇ ܒܥܝܪܗܘܢ. ܗܐ ܕܝܠܢ ܐܢܘܢ. ܒܪܡ ܢܬܛܦܝܣ ܠܗܘܢ ܘܢܬܒܘܢ ܥܡܢ. +\v 24 ܘܫܡܥܘ ܡܢ ܫܟܝܡ\f m \fr 34.24\fr* \fk ܚܡܘܪ\fk* \ft 5b1\ft*\f*. ܘܡܢ ܚܡܘܪ ܐܒܘܗܝ\f n \fr 34.24\fr* \fk ܫܟܝܡ ܒܪܗ\fk* \ft 5b1\ft*\f* ܟܠ ܢܦܩ̈ܝ ܬܪܥܐ ܕܩܪܝܬܗ. ܘܓܙܪܘ ܟܠ ܕܟܪܐ ܟܘܠ ܢܦܩ̈ܝ ܬܪܥܐ ܕܩܪܝܬܗ. +\v 25 ܘܗܘ̣ܐ ܒܝܘܡܐ ܬܠܝܬܝܐ ܟܕ ܚܣܢܘ ܟܐ̈ܒܝܗܘܢ. ܢܣ̣ܒܘ ܬܪ̈ܝܢ ܒܢ̈ܘܗܝ ܕܝܥܩܘܒ ܫܡܥܘܢ ܘܠܘܝ ܐܚ̈ܝܗ̇ ܕܕܝܢ̣ܐ ܓܒܪ ܚܪܒܗ. ܘܥܠܘ ܥܠ ܩܪܝܬܐ ܒܫܠܝܐ. ܘܩ̇ܛܠܘ ܟܠ ܕܟܪܐ. +\v 26 ܘܠܚܡܘܪ ܘܠܫܟܝܡ ܒܪܗ. ܩ̣ܛܠܘ ܒܦܘܡܐ ܕܚܪܒܐ. ܘܕܒܪܘܗ̇ ܠܕܝܢ̣ܐ\f o \fr 34.26\fr* \fk ܚܬܗܘܢ\fk* \ft add. E, W, M, U, L\ft*\f* ܡܢ ܒܝܬ ܫܟܝܡ ܘܢܦܩܘ. +\v 27 ܘܒܢ̈ܝ ܝܥܩܘܒ ܥܠܘ ܥܠ ܩ̈ܛܝܠܐ ܘܒܙܘ ܠܩܪܝܬܐ\f p \fr 34.27\fr* \fk ܩܪܝܬܐ\fk* \ft 5b1\ft*\f*. ܥܠ ܕܛܡܐܘ ܠܕܝܢܐ\f q \fr 34.27\fr* \fk ܠܕܝܢܐ\fk* \ft om. 5b1\ft*\f* ܚܬܗܘܢ\f r \fr 34.27\fr* \fk ܠܚܬܗܘܢ\fk* \ft add. 5b1\ft*\f*. +\v 28 ܘܥܢܗܘܢ ܘܬܘܪ̈ܝܗܘܢ †ܘܚܡܪ̈ܗܘܢ† ܕܒܩܪܝܬܐ ܘܕܒܚܩܠܐ\f s \fr 34.28\fr* \fk ܘܒ\fk* \ft 12b2\ft*\f* ܕܒܪܘ. +\v 29 ܘܟܠܗܘܢ ܢܟܣ̈ܝܗܘܢ ܘܟܠܗ̇ ܝܩܪܬܗܘܢ ܘܠܢܫ̈ܝܗܘܢ ܫܒܘ. ܕܒܙܘ\f t \fr 34.29\fr* \fk ܘ\fk* \ft M, U, L\ft*\f* ܟܠ ܕܐܝܬ ܒܩܪܝܬܐ. +\v 30 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܫܡܥܘܢ ܘܠܠܘܝ. ܐܗܪܬܘܢܢܝ ܕܬܒܐܫܘܢ ܠܝ ܒܝܬ ܥܡܘܪ̈ܝܗ̇ ܕܐܪܥܐ. ܒܝܬ ܟܢܥ̈ܢܝܐ ܘܒܝܬ ܦܪ̈ܙܝܐ ܘܐܢܐ ܩܠܝܠ ܐܢܐ ܒܡܢܝܢܐ. ܘܡܬܟܢܫܝܢ ܥܠܝ ܘܡܚܝܢ ܠܝ. ܘܐ̇ܒܕ ܐܢܐ ܐܢܐ ܘܒܝܬܝ. +\v 31 ܘܐܡܪܘ ܐܝܟ ܙܢܝܬܐ ܐܬܥܒܕ ܠܚܬܢ. +\c 35 +\v 1 ܘܐܡ̣ܪ ܡܪܝܐ\f a \fr 35.1\fr* \fk ܐܠܗܐ\fk* \ft 5b1, E, W, M, U, L\ft*\f* ܠܝܥܩܘܒ. ܩܘܡ ܣܩ ܠܒܝܬ ܐܝܠ ܘܬܒ ܬܡܢ. ܘܥܒ̣ܕ ܬܡ̇ܢ ܡܕܒܚܐ ܠܐܝܠ ܕܐܬܓܠܝ ܥܠܝܟ. ܟܕ ܥ̇ܪܩ ܐܢܬ ܡܢ ܩܕܡ ܥܣܘ ܐܚܘܟ. +\v 2 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܒ̈ܢܝ ܒܝܬܗ. ܘܠܟܠ ܕܥܡܗ. ܐܥܒܪܘ ܐ̈ܠܗܐ ܢܘܟܪ̈ܝܐ ܕܒܝܢܬܟܘܢ\f b \fr 35.2\fr* \fk ܡܢ ܒܝܢܬܟܘܢ\fk* \ft E, W, M, U, L\ft*\f*. †ܘܐܬܕܟܘ† ܘܚܠܦܘ ܢܚ̈ܬܝܟܘܢ. +\v 3 ܘܩܘܡܘ ܢܣܩ ܠܒܝܬ ܐܝܠ. ܘܐܥܒܕ ܬܡ̇ܢ ܡܕܒܚܐ ܠܐܠܗܐ ܕܥܢܢܝ ܒܝܘܡܐ ܕܐܘܠܨܢܝ. ܘܗܘ̣ܐ ܥܡܝ ܒܐܘܪܚܐ ܕܐ̇ܙܠܬ. +\v 4 ܘܝܗܒܘ ܠܝܥܩܘܒ ܟܠܗܘܢ ܐ̈ܠܗܐ ܢܘܟܪ̈ܝܐ\f c \fr 35.4\fr* \fk ܢܘܟܪ̈ܝܐ\fk* \ft om. 12a1\ft*\f* ܕܒܐ̈ܝܕܝܗܘܢ ܘܩ̈ܕܫܐ †ܕܒܐ̈ܕܢܝܗܘܢ†. ܘܛܡ̣ܪ ܐܢܘܢ ܝܥܩܘܒ ܬܚܝܬ ܒܛܡܬܐ ܕܥܡ ܫܟܝܡ. +\v 5 ܘܫܩ̣ܠܘ ܘܗܘܬ ܕܚܠܬܗ ܕܐܠܗܐ\f d \fr 35.5\fr* \fk ܕܡܪܝܐ\fk* \ft 8b1\ft*\f* ܥܠ ܩܘܪ̈ܝܐ ܕܒܚܕܪ̈ܝܗܘܢ. ܘܠܐ ܪܕܦܘ ܒܬܪ ܝܥܩܘܒ ܘܒܬܪ ܒܢ̈ܘܗܝ. +\v 6 ܘܐܬ̣ܐ ܝܥܩܘܒ ܠܠܘܙ ܕܒܐܪܥܐ ܕܟܢܥܢ. ܗ̣ܝ ܗܝ ܒܝܬ ܐܝܠ. ܗ̣ܘ\f e \fr 35.6\fr* \fk ܗ̣ܘ\fk* \ft om. 8b1\ft*\f* ܘܟܠܗ ܥܡܐ ܕܥܡܗ. +\v 7 ܘܒܢ̣ܐ ܬܡ̇ܢ ܡܕܒܚܐ. ܘܩܪܝܗܝ ܠܐܬܪܐ ܗ̇ܘ\f f \fr 35.7\fr* \fk ܗ̇ܘ\fk* \ft om. 5b1*\ft*\f* ܒܝܬ ܐܝܠ. ܡܛܠ ܕܬܡ̇ܢ ܐܬܓܠܝ ܥܠܘܗܝ ܐܠܗܐ. ܟܕ ܥܪܩ̇ ܗܘܐ\f g \fr 35.7\fr* \fk ܗܘܐ\fk* \ft om. 5b1, 8a1*\ft*\f* ܡܢ ܩܕܡ\f h \fr 35.7\fr* \fk ܩܕܡ\fk* \ft om. 5b1\ft*\f* ܥܣܘ\f i \fr 35.7\fr* \fk ܥܣܘ\fk* \ft om. 5b1, 7h5, 8b1\ft*\f* ܐܚܘܗܝ. +\v 8 ܘܡܝܬܬ ܕܒܘܪܐ ܡܝܢܩܬܗ̇ ܕܪܦܩܐ\f j \fr 35.8\fr* \fk ܕܪܚܝܠ\fk* \ft 12b1\ft*\f*. ܘܐܬܩܒ̣ܪܬ ܠܬܚܬ ܡܢ ܒܝܬ ܐܝܠ ܬܚܝܬ ܒܛܡܬܐ. ܘܩ̣ܪܐ ܫܡܗ̇ ܒܛܡܬܐ ܕܒܟܬܐ. +\v 9 ܘܐܬܓܠܝ ܬܘܒ\f k \fr 35.9\fr* \fk ܬܘܒ\fk* \ft om. 5b1\ft*\f*\f l \fr 35.9\fr* \fk ܬܡܢ\fk* \ft 12a1\ft*\f* ܐܠܗܐ ܥܠ ܝܥܩܘܒ\f m \fr 35.9\fr* \fk ܬܘܒ\fk* \ft add. 5b1\ft*\f*. ܟܕ ܐܬ̇ܐ ܡܢ ܦܕܢ ܕܐܪܡ ܘܒܪܟܗ. +\v 10 ܘܐܡ̣ܪ ܠܗ ܐܠܗܐ. ܠܐ ܢܬܩܪܐ ܬܘܒ\f n \fr 35.10\fr* \fk ܬܘܒ\fk* \ft om. 11.10g1\ft*\f* ܫܡܟ ܝܥܩܘܒ. ܐܠܐ ܢܗܘܐ\f o \fr 35.10\fr* \fk ܢܬܩܪܐ\fk* \ft 8b1\ft*\f* ܫܡܟ ܐܝܣܪܝܠ. ܘܩ̣ܪܐ ܫܡܗ ܐܝܣܪܝܠ. +\v 11 ܘܐܡ̣ܪ ܠܗ ܐܠܗܐ. ܐܢܐ ܐܢܐ ܐܝܠܫܕܝ ܐܠܗܐ\f p \fr 35.11\fr* \fk ܐܠܗܐ\fk* \ft om. 5b1\ft*\f*. ܟܒܪ ܘܣܓܝ ܥܡܐ. ܘܟܢܫܐ ܕܥܡ̈ܡܐ ܡܢܟ ܢܗܘܘܢ. ܘܡ̈ܠܟܐ ܡܢ ܚܨܟ ܢܦܩܘܢ. +\v 12 ܘܐܪܥܐ ܕܝܡ̇ܝܬ ܠܐܒܪܗܡ ܘܠܐܝܣܚܩ ܠܟ ܐܬܠܝܗ̇. ܘܠܙܪܥܟ ܡܢ ܒܬܪܟ ܐܬܠܝܗ̇ ܐܪܥܐ. +\v 13 ܘܐܬܬܪܝܡ ܡܢܗ ܐܠܗܐ ܒܐܬܪܐ ܕܡܠܠ ܥܡܗ. +\v 14 ܘܐܩܝܡ ܝܥܩܘܒ ܩܝܡܬܐ ܒܐܬܪܐ ܕܡܠܠ ܥܡܗ ܩܝܡܬܐ ܕܟܐܦܐ. ܘܢܩܝ ܥܠܝܗ̇ ܢܘܩܝܐ. ܘܢܣܟ ܥܠܝܗ̇ ܡܫܚܐ. +\v 15 ܘܩ̣ܪܐ ܝܥܩܘܒ ܫܡܗ ܕܐܬܪܐ\f q \fr 35.15\fr* \fk ܗ̇ܘ\fk* \ft add. E, W, M, U, L\ft*\f* ܕܡܠܠ ܥܡܗ ܬܡܢ\f r \fr 35.15\fr* \fk ܬܡܢ\fk* \ft om. 12b2\ft*\f* ܐܠܗܐ ܒܝܬ ܐܝܠ. +\v 16 ܘܫܩ̣ܠ ܡܢ ܒܝܬ ܐܝܠ. ܘܪܕܐ ܬܘܒ ܐܝܟ ܡܪܕܐ\f s \fr 35.16\fr* \fk ܡܪܕܐ\fk* \ft om. 5b1\ft*\f* ܦܪܣܚܐ ܕܐܪܥܐ\f t \fr 35.16\fr* \fk ܕܐܪܥܐ\fk* \ft om. 7h5\ft*\f* ܠܡܥܠ ܠܐܦܪܬ. ܘܝܠ̣ܕܬ ܪܚܝܠ ܘܚܣ̣ܢܬ ܟܕ ܝܠܕܐ. +\v 17 ܘܗܘ̣ܐ ܕܟܕ ܚܣܢ̣ܬ. ܐܡ̣ܪܬ ܠܗ̇ ܚܝܬܐ. ܠܐ ܬܕܚܠܝܢ. ܡܛܠ ܕܐܦ ܗܢܐ ܒܪܐ ܗܘ ܠܟܝ. +\v 18 ܘܗܘܐ ܕܟܕ ܢܦܩܐ ܢܦܫܗ̇ ܘܡܝܬܐ. ܩܪܬ ܫܡܗ ܒܪ ܟܐ̈ܒܝ. ܘܐܒܘܗܝ ܩܪܝ̣ܗܝ †ܒܢܝܡܝܢ†. +\v 19 ܘܡܝܬܬ ܪܚܝܠ ܘܐܬܩܒܪܬ ܒܐܘܪܚܐ ܕܐܦܪܬ. ܗ̣ܝ ܗܝ ܒܝܬ ܠܚܡ. +\v 20 ܘܐܩܝܡ ܝܥܩܘܒ ܩܝܡܬܐ ܥܠ ܩܒܪܗ̇ ܕܪܚܝܠ\f u \fr 35.20\fr* \fk ܕܪܚܝܠ\fk* \ft om. 5b1\ft*\f*. ܗ̣ܝ ܗܝ ܩܝܡܬܐ ܕܩܒܪܗ̇\f v \fr 35.20\fr* \fk ܩܝܡܬܗ̇\fk* \ft 12a1\ft*\f* ܕܪܚܝܠ ܥܕܡܐ ܠܝܘܡܢܐ. +\v 21 ܘܫܩ̣ܠ ܐܝܣܪܝܠ ܘܢܩ̣ܫ ܡܫܟܢܗ ܡܢ ܬܡܢ ܠܡܓܕܠܐ ܕܓܕܪ. +\v 22 ܘܗܘ̣ܐ ܕܟܕ ܫ̣ܪܐ ܐܝܣܪܝܠ ܒܐܪܥܐ ܗ̇ܝ. ܐܙܠ ܪܘܒܝܠ ܘܫܟ̣ܒ ܥܡ ܒܠܗܐ ܕܪܘܟܬܗ ܕܐܒܘܗܝ. ܘܫܡ̣ܥ ܐܝܣܪܝܠ ܘܗܘܘ ܒܢ̈ܘܗܝ ܕܝܥܩܘܒ †ܬܪܥܣܪ̈†\f w \fr 35.22\fr* \fk †ܬܪܥܣܪ̈†\fk* \ft om. 7a1\ft*\f*. +\v 23 ܒܢ̈ܝܗ̇ ܕܠܝܐ. ܒܘܟܪܗ ܕܝܥܩܘܒ ܪܘܒܝܠ ܘܫܡܥܘܢ ܘܠܘܝ. ܘܝܗܘܕܐ ܘܐܝܣܟܪ ܘܙܒܘܠܘܢ. +\v 24 ܘܒܢ̈ܝܗ̇ ܕܪܚܝܠ. ܝܘܣܦ ܘܒܢܝܡܝܢ. +\v 25 ܘܒܢ̈ܝܗ̇ ܕܒܠܗܐ ܐܡܬܗ̇ ܕܪܚܝܠ. ܕܢ ܘܢܦܬܠܝ. +\v 26 ܘܒܢ̈ܝܗ̇ ܕܙܠܦܐ ܐܡܬܗ̇ ܕܠܝܐ. ܓܕ ܘܐܫܝܪ. ܗܠܝܢ ܒܢ̈ܘܗܝ ܕܝܥܩܘܒ ܕܐܬܝܠܕܘ ܠܗ ܒܦܕܢ ܕܐܪܡ. +\v 27 ܘܐܬ̣ܐ ܝܥܩܘܒ ܠܘܬ ܐܝܣܚܩ ܐܒܘܗܝ ܠܡܡܪܐ ܩܘܪܝܬ ܓܢܒܪ̈ܐ. ܗܝ ܗܝ ܚܒܪܘܢ ܕܒܐܪܥܐ ܕܟܢܥܢ\f x \fr 35.27\fr* \fk ܕܒܐܪܥܐ ܕܟܢܥܢ\fk* \ft om. 5b1\ft*\f*. ܕܥܡ̣ܪ ܬܡܢ ܐܒܪܗܡ ܘܐܝܣܚܩ. +\v 28 ܘܗܘܘ ܝܘܡ̈ܘܗܝ ܕܐܝܣܚܩ. ܡܐܐ ܘܬܡܢܐܝܢ ܫ̈ܢܝܢ. +\v 29 ܘܐܬܟܪܗ ܐܝܣܚܩ ܘܡܝܬ. ܘܐܬܟܢܫ ܠܘܬ ܥܡܗ. ܣܐܒ ܘܣܒܥ ܝܘܡ̈ܬܗ. ܘܩܒܪܘܗܝ ܥܣܘ ܘܝܥܩܘܒ ܒܢ̈ܘܗܝ. ܒܩܒܪܐ ܕܙܒ̣ܢ ܐܒܪܗܡ ܐܒܘܗܝ\f y \fr 35.29\fr* \fk ܒܩܒܪܐ ܕܙܒ̣ܢ ܐܒܪܗܡ ܐܒܘܗܝ\fk* \ft om. 5b1\ft*\f*. +\c 36 +\v 1 ܘܗܠܝܢ ܬ̈ܘܠܕܬܗ ܕܥܣܘ. ܥܣܘ\f a \fr 36.1\fr* \fk ܥܣܘ\fk* \ft om. 5b1\ft*\f* ܗܘܝܘ\f b \fr 36.1\fr* \fk ܕܗ̇ܘ\fk* \ft 5b1\ft*\f* ܐܕܘܡ. +\v 2 ܥܣܘ ܢܣ̣ܒ ܢܫ̈ܘܗܝ ܡܢ ܒܢ̈ܬ ܟܢܥܢ. ܠܥܕܐ ܒܪܬ ܐܠܘܢ ܚܬܝܐ. †ܘܠܐܗܠܝܒܡܐ† ܒܪܬ ܥܢܐ ܒܪ ܨܒܥܘܢ ܚܘܝܐ. +\v 3 ܘܠܒܣܡܬ ܒܪܬ ܐܝܫܡܥܝܠ ܚܬܗ ܕܢܒܝܘܬ. +\v 4 ܘܝܠܕܬ ܥܕܐ ܠܥܣܘ ܠܐܠܝܦܙ ܘܒܣܡܬ ܝܠ̣ܕܬ ܠܪܥܘܐܝܠ. +\v 5 ܘܐܗܠܝܒܡܐ ܝܠ̣ܕܬ ܠܝܥܘܫ ܘܠܝܥܠܢ\f c \fr 36.5\fr* \fk ܘܠܥܝܠܡ\fk* \ft 5b1\ft*\f* ܘܠܩܘܪܚ. ܗܠܝܢ ܒܢ̈ܘܗܝ ܕܥܣܘ. ܕܐܬܝܠܕܘ ܠܗ ܒܐܪܥܐ ܕܟܢܥܢ. +\v 6 ܘܕܒ̣ܪ ܥܣܘ ܢܫ̈ܘܗܝ ܘܒܢ̈ܘܗܝ ܘܒܢ̈ܬܗ. ܘܟܠ ܢܦܫ̈ܬܐ ܕܒܝܬܗ\f d \fr 36.6\fr* \fk ܘܢܟ̈ܣܘܗܝ\fk* \ft add. 5b1\ft*\f*. ܘܟܠܗ̇ ܒܥܝܪܗ. ܘܟܠܗ ܩܢܝܢܗ ܕܩܢ̣ܐ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܐܙܠ ܠܐܪܥܐ ܕܣܥܝܪ ܡܢ ܩܕܡ ܝܥܩܘܒ ܐܚܘܗܝ. +\v 7 ܡܛܠ ܕܣ̇ܓܝ ܗܘܐ ܩܢܝܢܗܘܢ ܠܡܬܒ ܐܟܚܕܐ. ܘܠܐ ܡܘܦܝܐ ܗܘܬ ܐܪܥܐ ܕܡܥܡܪܗܘܢ ܠܡܣܝܒܪܘ ܐܢܘܢ ܡܛܠ ܩܢܝܢܗܘܢ. +\v 8 ܘܝܬ̣ܒ ܥܣܘ ܒܛܘܪܐ ܕܣܥܝܪ. ܥܣܘ ܗܘܝܘ ܐܕܘܡ. +\v 9 ܘܗܠܝܢ ܬܘ̈ܠܕܬܗ ܕܥܣܘ ܐܒܘܗܘܢ ܕܐ̈ܕܘܡܝܐ ܒܛܘܪܐ ܕܣܥܝܪ. +\v 10 ܘܗܠܝܢ ܫܡ̈ܗܐ ܕܒܢ̈ܝ ܥܣܘ. †ܪܥܘܐܝܠ ܒܪ ܒܣܡܬ ܐܢܬܬܗ ܕܥܣܘ†\f e \fr 36.10\fr* \fk †ܪܥܘܐܝܠ ܒܪ ܒܣܡܬ ܐܢܬܬܗ ܕܥܣܘ†\fk* \ft om. 7a1\ft*\f*. ܐܠܝܦܙ ܒܪ ܥܕܐ ܐܢܬܬܗ ܕܥܣܘ. +\v 11 ܘܗܘܘ ܒܢ̈ܘܗܝ ܕܐܠܝܦܙ. ܬܝܡܢ ܘܐܘܡܪ ܘܨܦܘ ܘܓܥܬܡ ܘܩܢܙ. +\v 12 ܘܬܡܢܥ ܗܘܬ ܕܪܘܟܬܐ ܠܐܠܝܦܙ ܒܪ ܥܣܘ. ܘܝܠ̣ܕܬ ܠܐܠܝܦܙ ܠܥܡܠܝܩ. ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܥܕܐ ܐܢܬܬܗ ܕܥܣܘ. +\v 13 ܘܗܠܝܢ ܒܢ̈ܝ ܪܥܘܐܝܠ. ܢܚ̇ܬ ܘܙܪܚ. ܘܫܡ̇ܐ ܘܡܙܐ. ܗܠܝܢ ܒ̈ܢܝ ܒܣܡܬ ܐܢܬܬܗ ܕܥܣܘ. +\v 14 ܘܗܠܝܢ ܒܢ̈ܝ ܐܗܠܝܒܡܐ ܒܪܬ ܥܢܐ ܒܪ\f f \fr 36.14\fr* \fk ܒܪܬ\fk* \ft L\ft*\f* ܨܒܥܘܢ ܐܢܬܬܗ ܕܥܣܘ. ܘܝܠ̣ܕܬ ܠܥܣܘ. ܠܝܥܘܫ ܘܠܝܥܠܢ\f g \fr 36.14\fr* \fk ܝܥܘܫ ܘܝܥܠܢ\fk* \ft 8b1\ft*\f*\f h \fr 36.14\fr* \fk ܘܠܥܝܠܡ\fk* \ft 5b1\ft*\f* ܘܠܩܘܪܚ. +\v 15 ܘܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܒܢ̈ܝ ܥܣܘ. ܒܢ̈ܝ ܐܠܝܦܙ ܒܘܟܪܗ ܕܥܣܘ. ܪܒܐ ܬܝܡܢ. ܪܒܐ ܐܘܡܪ. ܪܒܐ ܨܦܘ. ܪܒܐ ܩܢܙ. +\v 16 ܪܒܐ ܓܥܬܡ. ܪܒܐ ܩܘܪܚ. ܪܒܐ ܥܡܠܝܩ. ܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܐܠܝܦܙ ܒܐܪܥܐ ܕܐܕܘܡ. ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܥܕܐ. +\v 17 ܘܗܠܝܢ ܒ̈ܢܝ ܪܥܘܐܝܠ ܒܪ ܥܣܘ. ܪܒܐ ܢܚ̇ܬ. ܪܒܐ ܙܪܚ. ܪܒܐ ܫܡܐ. ܪܒܐ ܡܙܐ. ܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܪܥܘܐܝܠ ܒܐܪܥܐ ܕܐܕܘܡ. ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܒܣܡܬ ܐܢܬܬܗ ܕܥܣܘ. +\v 18 ܘܗܠܝܢ ܒܢ̈ܝ ܐܗܠܝܒܡܐ ܐܢܬܬܗ ܕܥܣܘ. ܪܒܐ ܝܥܘܫ. ܪܒܐ ܝܥܠܢ\f i \fr 36.18\fr* \fk ܝܥܠܡ\fk* \ft 5b1\ft*\f*. ܪܒܐ ܩܘܪܚ. ܗܠܝܢ ܒܢ̈ܝ ܐܗܠܝܒܡܐ ܒܪܬ ܥܢܐ ܐܢܬܬܗ ܕܥܣܘ. +\v 19 ܗܠܝܢ ܒܢ̈ܝ ܥܣܘ ܘܗܠܝܢ ܪ̈ܘܪܒܢܝܗܘܢ. ܥܣܘ ܗܘܝܘ ܐܕܘܡ. +\v 20 ܘܗܠܝܢ ܒܢ̈ܝ ܣܥܝܪ ܚܘܪ̈ܝܐ\f j \fr 36.20\fr* \fk ܚܘ̈ܝܐ\fk* \ft 5b1\ft*\f* ܝܬ̈ܒܝ ܐܪܥܐ. ܠܘܛܢ ܘܫܘܒܠ. ܘܨܒܥܘܢ ܘܥܢܐ. +\v 21 ܘܕܝܫܘܢ ܘܐܨܪ ܘܕܝܫܢ. ܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܚܘܪ̈ܝܐ\f k \fr 36.21\fr* \fk ܕܚܘ̈ܝܐ\fk* \ft 5b1\ft*\f*. ܒܢ̈ܝ ܣܥܝܪ ܒܐܪܥܐ ܕܐܕܘܡ. +\v 22 ܘܗܘܘ\f l \fr 36.22\fr* \fk ܘܗܠܝܢ\fk* \ft 8b1\ft*\f* ܒ̈ܢܝ ܠܘܛܢ. ܚܘܪܝ ܘܗܘܡܡ. ܘܚܬܗ ܕܠܘܛܢ ܬܡܢܥ. +\v 23 ܘܗܠܝܢ ܒ̈ܢܝ ܫܘܒܠ. ܐܠܘܢ\f m \fr 36.23\fr* \fk ܥܠܘܢ\fk* \ft M, L\ft*\f* ܘܡܢܚ̣ܬ ܘܥܘܒܠ ܘܫ̇ܦܪ\f n \fr 36.23\fr* \fk ܘܫܟܝܡ\fk* \ft 5b1\ft*\f* ܘܐܘܝܡ. +\v 24 ܘܗܠܝܢ ܒܢ̈ܝ ܨܒܥܘܢ ܐܢܐ ܘܥܢܐ. ܗ̇ܘ ܥܢܐ ܕܐܫܟܚ ܠܗ ܡ̈ܝܐ ܒܡܕܒܪܐ. ܟܕ ܪܥ̇ܐ ܗܘܐ ܚܡܪ̈ܐ ܕܨܒܥܘܢ ܐܒܘܗܝ. +\v 25 ܘܗܠܝܢ ܒܢ̈ܝ ܥܢܐ. ܕܝܫܘܢ ܘܐܗܠܝܒܡܐ. +\v 26 ܘܗܠܝܢ ܒܢ̈ܝ ܕܝܫܘܢ. ܚܡܪܢ ܘܐܫܒܢ. ܘܝܬܪܢ ܘܟܪܢ. +\v 27 ܘܗܠܝܢ ܒܢ̈ܝ ܐܨܪ. ܟܠܗܢ\f o \fr 36.27\fr* \fk ܒܠܗܢ\fk* \ft U\ft*\f* ܘܙܥܘܢ\f p \fr 36.27\fr* \fk ܘܙܥܘܢ\fk* \ft om. 5b1\ft*\f* ܘܥܩܢ. +\v 28 ܘܗܠܝܢ ܒ̈ܢܝ ܕܝܫܢ ܥܘܨ †ܘܐܪܢ†\f q \fr 36.28\fr* \fk ܘܐܪܡ\fk* \ft 5b1, 7a1\ft*\f*. +\v 29 ܘܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܚܘܪ̈ܝܐ\f r \fr 36.29\fr* \fk ܚܘܪ̈ܝܐ\fk* \ft L\ft*\f*\f s \fr 36.29\fr* \fk ܕܚܘ̈ܝܐ\fk* \ft 5b1\ft*\f*. ܪܒܐ ܠܘܛܢ. ܪܒܐ ܫܘܒܠ. ܪܒܐ ܨܒܥܘܢ. ܪܒܐ ܥܢܐ. +\v 30 ܪܒܐ ܕܝܫܘܢ. ܪܒܐ ܐܨܪ. ܪܒܐ ܕܝܫܢ. ܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܚܘܪ̈ܝܐ\f t \fr 36.30\fr* \fk ܕܚܘ̈ܝܐ\fk* \ft 5b1\ft*\f* ܠܪ̈ܘܪܒܢܝܗܘܢ ܒܐܪܥܐ ܕܣܥܝܪ. +\v 31 ܘܗܠܝܢ ܡ̈ܠܟܐ ܕܐܡܠܟܘ ܒܐܪܥܐ ܕܐܕܘܡ. ܩܕܡ ܕܢܡܠܟ ܡ̇ܠܟܐ ܠܒ̈ܢܝ ܐܝܣܪܝܠ. +\v 32 ܐܡܠܟ ܒܐܕܘܡ ܒܠܥ ܒܪ ܒܥܘܪ. ܘܫܡܐ ܕܩܪܝܬܗ ܕܝܗܒ. +\v 33 ܘܡܝܬ ܒܠܥ. ܘܐܡܠܟ ܒܬܪܗ\f u \fr 36.33\fr* \fk ܒܬܪܗ\fk* \ft om. U\ft*\f* ܝܘܒܒ ܒܪ ܙܪܚ ܡܢ ܒܘܨܪ. +\v 34 ܘܡܝܬ ܝܘܒܒ. ܘܐܡܠܟ ܒܬܪܗ ܚܫ̣ܘܡ ܡܢ ܐܪܥܐ ܕܬܝܡܢܐ. +\v 35 ܘܡܝܬ ܚܫܘܡ ܘܐܡܠܟ ܒܬܪܗ ܗܕܕ ܒܪ ܒܕܕ. ܕܩ̣ܛܠ ܠܡܕܝܢ̈ܝܐ ܒܚܩ̈ܠܬܐ ܕܡܘܐܒ. ܘܫܡܐ ܕܩܪܝܬܗ ܓܘܝܬ. +\v 36 ܘܡܝܬ ܗܕܕ ܘܐܡܠܟ ܒܬܪܗ ܣܡܠܐ ܡܢ ܡܣܪܩܐ. +\v 37 ܘܡܝܬ ܣܡܠܐ. ܘܐܡܠܟ ܒܬܪܗ ܫܐܘܠ ܡܢ ܪܚܒܘܬ ܢܗܪܐ. +\v 38 ܘܡܝܬ ܫܐܘܠ. ܘܐܡܠܟ ܒܬܪܗ ܒܥܠܚܢܢ ܒܪ ܥܒܟܘܪ. +\v 39 ܘܡܝܬ ܒܥܠܚܢܢ ܒܪ ܥܒܟܘܪ. ܘܐܡܠܟ ܒܬܪܗ ܗܕܕ ܘܫܡܐ ܕܩܪܝܬܗ ܦܥܘ. ܘܫܡܐ ܕܐܢܬܬܗ ܡܗܛܒܐܝܠ ܒܪܬ ܡܛܪܝܕ ܒܪ ܡܝܙܗܒ. +\v 40 ܘܗܠܝܢ ܫ̈ܡܗܐ ܕܪ̈ܘܪܒܢܐ ܕܥܣܘ ܠܫܪ̈ܒܬܗܘܢ ܠܬܘ̈ܠܕܬܗܘܢ\f v \fr 36.40\fr* \fk ܠܐܬܪܘ̈ܬܗܘܢ\fk* \ft 5b1\ft*\f* ܒܫ̈ܡܗܝܗܘܢ ܪܒܐ ܬܡܢܥ. ܪܒܐ ܥܢܘܐ. ܪܒܐ ܐܝܬܝܬ. +\v 41 ܪܒܐ ܐܗܠܝܒܡܐ. ܪܒܐ ܐܝܠܐ\f w \fr 36.41\fr* \fk ܐܝܠܘܢ\fk* \ft 5b1\ft*\f*. ܪܒܐ ܦܝܢܘܢ. +\v 42 ܪܒܐ ܩܢܙ. ܪܒܐ ܬܝܡܢ. ܪܒܐ ܡܒ̣ܨܪ. +\v 43 ܪܒܐ ܡܓܕܝܠ ܪܒܐ ܓܝܪܡ. ܗܠܝܢ ܪ̈ܘܪܒܢܐ ܕܐ̈ܕܘܡܝܐ ܒܝܬ ܡܥܡܪܗܘܢ. ܒܐܪܥܐ †ܕܝܪܬܘܬܗܘܢ†\f x \fr 36.43\fr* \fk ܕܝܘܪܬܢܗܘܢ\fk* \ft 7a1\ft*\f* ܗܘܝܘ ܥܣܘ ܐܒܘܗܘܢ ܕܐ̈ܕܘܡܝܐ. +\c 37 +\v 1 ܘܝܬ̣ܒ ܝܥܩܘܒ ܒܐܪܥܐ ܕܡܥܡܪܗ ܕܐܒܘܗܝ ܒܐܪܥܐ ܕܟܢܥܢ. +\v 2 ܘܗܠܝܢ ܬܘ̈ܠܕܬܗ ܕܝܥܩܘܒ. ܝܘܣܦ ܒܪ ܫܒܥܣܪܐ ܫ̈ܢܝܢ. ܪܥ̇ܐ ܗܘܐ ܥܡ ܐܚ̈ܘܗܝ ܥܢܐ. ܘܗܘ ܪܒ̇ܐ ܗܘܐ ܥܡ ܒܢ̈ܝ ܙܠܦܐ ܘܥܡ ܒܢ̈ܝ ܒܠܗܐ. ܢܫ̈ܘܗܝ ܕܐܒܘܗܝ. ܘܐܝܬܝ ܝܘܣܦ ܛܒܗܘܢ ܒܝܫܐ ܠܐܒܘܗܘܢ. +\v 3 ܘܐܝܣܪܝܠ ܪܚ̇ܡ ܗܘܐ ܠܗ\f a \fr 37.3\fr* \fk ܠܗ\fk* \ft om. 5b1, 12b2\ft*\f* ܠܝܘܣܦ ܝܬܝܪ ܡܢ ܟܠܗܘܢ ܒܢ̈ܘܗܝ. ܡܛܠ ܕܒܪ ܣܝܒܘܬܐ ܗܘܐ ܠܗ. ܘܥܒܕ ܠܗ ܟܘܬܝܢܐ ܕܦܕܝ̈ܬܐ. +\v 4 ܘܚܙܘ ܐ̈ܚܘܗܝ ܕܠܗ ܪܚ̇ܡ ܗܘܐ ܐܒܘܗܘܢ. ܝܬܝܪ ܡܢ ܟܠܗܘܢ\f b \fr 37.4\fr* \fk ܒܢ̈ܘܗܝ\fk* \ft add. 5b1\ft*\f* ܘܣܢܐܘܗܝ. ܘܠܐ ܐܫܟܚܘ ܠܡܡܠܠܘ ܥܡܗ ܫܠܡܐ. +\v 5 ܘܚ̣ܠܡ ܝܘܣܦ ܚܠܡܐ ܘܚܘܝܗ ܠܐ̈ܚܘܗܝ. ܘܐܘܣܦܘ\f c \fr 37.5\fr* \fk ܬܘܒ\fk* \ft add. 5b1\ft*\f* ܠܡܣܢܝܗ. +\v 6 ܘܐܡ̣ܪ ܠܗܘܢ. ܫܡ̣ܥܘ ܚܠܡܐ ܗܢܐ ܕܚ̇ܠܡܬ. +\v 7 ܗܐ ܚܢܢ ܐ̇ܣܪܝܢܢ ܟ̈ܦܐ ܒܓܘ ܚܩܠܐ. ܘܗܐ ܩܡܬ ܟܦܝ ܘܐܙܕܩ̣ܦܬ. ܘܗܐ ܚܕܪ̈ܢ ܟܦܝ̈ܟܘܢ ܘܣܓܕܢ ܠܟܦܝ. +\v 8 ܘܐܡܪܘ ܠܗ ܐܚ̈ܘܗܝ. ܡܡܠܟܘ ܡܡܠܟ ܐܢܬ ܥܠܝܢ ܐܘ ܡܫ̇ܬܠܛܘ ܡܫܬ̇ܠܛ ܐܢܬ ܒܢ. ܘܐܘܣܦܘ ܬܘܒ\f d \fr 37.8\fr* \fk ܬܘܒ\fk* \ft om. 12b2\ft*\f* ܠܡܣܢܝܗ ܥܠ ܚ̈ܠܡܘܗܝ ܘܥܠ ܦܬ̈ܓܡܘܗܝ. +\v 9 ܘܚ̣ܠܡ ܬܘܒ ܚܠܡܐ ܐܚܪܢܐ. ܘܐܫܬܥܝܗ ܠܐ̈ܚܘܗܝ ܘܐܡ̣ܪ ܠܗܘܢ\f e \fr 37.9\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܚܠܡܐ ܚ̇ܠܡܬ ܬܘܒ. ܘܗܐ ܫܡܫܐ ܘܣܗܪܐ ܘܚܕܥܣܪ ܟܘܟܒ̈ܝܢ ܣܓܕܝܢ ܠܝ. +\v 10 ܘܐܫܬܥܝ ܠܐܒܘܗܝ ܘܠܐܚ̈ܘܗܝ. ܘܟܐܐ ܒܗ ܐܒܘܗܝ ܘܐܡ̣ܪ ܠܗ. ܡܢܘ ܚܠܡܐ ܗܢܐ ܕܚ̣ܠܡܬ. ܡܐܬܐ ܢܐܬܐ ܐܢܐ ܘܐܡܟ ܘܐܚ̈ܝܟ ܠܡܣܓܕ ܠܟ ܥܠ ܐܪܥܐ. +\v 11 ܘܛܢܘ ܒܗ ܐ̈ܚܘܗܝ. ܘܐܒܘܗܝ ܢ̇ܛܪ ܗܘܐ ܦܬܓܡ̈ܐ. +\v 12 ܘܐܙܠܘ ܐܚ̈ܘܗܝ ܕܝܘܣܦ\f f \fr 37.12\fr* \fk ܕܝܘܣܦ\fk* \ft om. 5b1\ft*\f* ܠܡܪܥܐ ܥܢܐ ܕܐܒܘܗܘܢ ܒܫܟܝܡ. +\v 13 ܘܐܡ̣ܪ ܐܝܣܪܝܠ ܠܝܘܣܦ. ܗܐ ܐ̈ܚܝܟ ܪܥ̇ܝܢ ܒܫܟܝܡ. ܬܐ ܐܫܕܪܟ ܠܘܬܗܘܢ. ܘܐܡ̣ܪ ܠܗ ܗܐ ܐܢܐ. +\v 14 ܘܐܡ̣ܪ ܠܗ ܐܒܘܗܝ\f g \fr 37.14\fr* \fk ܐܒܘܗܝ\fk* \ft om. 5b1\ft*\f*. ܙܠ ܚܙܝ ܫܠܡܐ ܕܐ̈ܚܝܟ ܘܫܠܡܐ ܕܥܢܐ ܘܐܬܝܒܝܢܝ ܦܬܓܡܐ. ܘܫܕܪܗ ܝܥܩܘܒ ܡܢ ܥܘܡܩܐ ܕܚܒܪܘܢ\f h \fr 37.14\fr* \fk ܚܒܪܘܢ\fk* \ft 5b1\ft*\f* ܘܐܬ̣ܐ ܠܫܟܝܡ. +\v 15 ܘܐܫܟܚܗ ܓܒܪܐ ܟܕ ܛܥ̇ܐ ܒܚܩܠܐ. ܘܫܐܠܗ ܓܒܪܐ ܗ̇ܘ\f i \fr 37.15\fr* \fk ܗ̇ܘ\fk* \ft om. 5b1, 8b1\ft*\f* ܘܐܡ̣ܪ ܠܗ\f j \fr 37.15\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܡܢܐ ܒ̇ܥܐ ܐܢܬ. +\v 16 ܘܐܡ̣ܪ ܠܐܚ̈ܝ ܒ̇ܥܐ ܐܢܐ. ܚܘܢܝ ܐܝܟܐ ܪܥ̇ܝܢ. +\v 17 ܐܡ̇ܪ ܠܗ\f k \fr 37.17\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܓܒܪܐ. ܫܩ̣ܠܘ ܠܗܘܢ ܡܟܐ. ܘܫܡ̇ܥܬ ܕܐܡܪ̈ܝܢ. ܢܐܙܠ ܠܕܘܬܢ. ܘܐ̣ܙܠ ܝܘܣܦ ܒܬܪ ܐܚ̈ܘܗܝ. ܘܐܫܟܚ ܐܢܘܢ ܒܕܘܬܢ. +\v 18 ܘܚܙܐܘܗܝ ܡܢ ܪܘܚܩܐ. ܘܥܕܠܐ ܢܬܩܪܒ ܠܘܬܗܘܢ. ܡܬܚܫܒܝܢ ܗܘܘ ܥܠܘܗܝ ܠܡܩܛܠܗ. +\v 19 ܘܐܡܪܘ ܓܒܪ ܠܐܚܘܗܝ. ܗܐ ܚ̇ܠܡ ܚ̈ܠܡܐ ܗܘ ܐܬ̇ܐ. +\v 20 ܬܘ ܢܩܛ̣ܠܝܘܗܝ ܘܢܪܡܝܘܗܝ ܒܚܕ ܡܢ ܓܘܒ̈ܐ. ܘܢܐܡܪ ܕܚܝܘܬܐ ܒܝܫܬܐ ܐܟܠܬܗ. ܘܢܚܙܐ ܡܢܐ ܗ̇ܘܐ ܠܚ̈ܠܡܘܗܝ. +\v 21 ܘܫܡ̣ܥ ܪܘܒܝܠ ܘܦܨܝܗ ܡܢ ܐ̈ܝܕܝܗܘܢ. ܘܐܡ̣ܪ ܠܗܘܢ\f l \fr 37.21\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܢܩܛܘܠ ܢܦܫܐ. +\v 22 ܘܐܡ̣ܪ ܠܗܘܢ ܪܘܒܝܠ. ܠܐ ܬܐܫܕܘܢ ܕܡܐ\f m \fr 37.22\fr* \fk ܐܠܐ\fk* \ft add. 8b1\ft*\f*. ܐܪܡܐܘܗܝ ܒܓܘܒܐ ܗܢܐ ܕܒܡܕܒܪܐ. ܘܐܝܕܐ ܠܐ ܬܘܫܛܘܢ ܒܗ. ܕܢܦܨܝܘܗܝ ܡܢ ܐ̈ܝܕܝܗܘܢ ܘܢܗܦܟܝܘܗܝ ܠܐܒܘܗܝ. +\v 23 ܘܟܕ ܐܬ̣ܐ ܝܘܣܦ ܠܘܬ ܐ̈ܚܘܗܝ. ܐܫܠܚܘܗܝ ܟܘܬܝܢܐ ܕܦܕܝ̈ܬܐ ܕܠܒܝܫ ܗܘܐ. +\v 24 ܘܢܣܒܘܗܝ ܘܐܪܡܝܘܗܝ ܒܓܘܒܐ. ܘܓܘܒܐ ܣܪܝܩ ܗܘܐ ܘܠܝܬ\f n \fr 37.24\fr* \fk ܗܘܐ\fk* \ft add. 8b1, 11.9b1\ft*\f* ܒܗ ܡ̈ܝܐ. +\v 25 ܘܝܬܒܘ ܠܡ̣ܐܟܠ ܠܚܡܐ. ܘܐܪܝܡܘ ܥܝܢ̈ܝܗܘܢ ܘܚܙܝܢ. ܘܗܐ ܫܝܪܬܐ ܕܥܪ̈ܒܝܐ †ܐܬܝܐ†\f o \fr 37.25\fr* \fk ܕ\fk* \ft 11.10g1\ft*\f* ܡܢ ܓܠܥܕ ܘܓܡ̈ܠܝܗܘܢ ܛܥܝܢܝܢ. ܪ̈ܗܛܢܐ ܘܨܪܘܐ ܘܒ̈ܛܡܐ. ܘܐܙܠܝܢ ܠܡܘܒܠܘ ܠܡܨܪܝܢ. +\v 26 ܘܐܡ̣ܪ ܝܗܘܕܐ ܠܐ̈ܚܘܗܝ. ܡܢܐ ܝܘܬܪܢܐ ܕܢܩܛܘܠ ܠܐܚܘܢ. ܘܢܟܣܐ ܕܡܗ. +\v 27 ܬܘ ܢܙܒܢܝܘܗܝ ܠܥܪ̈ܒܝܐ. ܘܐܝܕܢ ܠܐ ܬܗܘܐ ܒܗ. ܡܛܠ ܕܐܚܘܢ ܗܘ ܘܒܣܪܢ. ܘܫܡܥܘ ܡܢܗ ܐ̈ܚܘܗܝ. +\v 28 ܘܥܒܪܘ ܓܒܪ̈ܐ ܬܓܪ̈ܐ ܡܕܝܢ̈ܝܐ. ܘܢܓ̣ܕܘ ܐܣܩܘܗܝ ܠܝܘܣܦ ܡܢ ܓܘܒܐ. ܘܙܒܢܘܗܝ ܠܝܘܣܦ ܠܥܪ̈ܒܝܐ ܒܥܣܪ̈ܝܢ ܕܟܣܦܐ. ܘܐܝܬܝܘܗܝ ܠܡܨܪܝܢ. +\v 29 ܘܗ̣ܦܟ ܪܘܒܝܠ ܠܓܘܒܐ. ܘܗܐ ܠܝܬ ܒܗ ܝܘܣܦ. ܘܨܪܝ ܠܒ̣ܘܫ̈ܘܗܝ. +\v 30 ܘܗܦܟ ܠܘܬ ܐ̈ܚܘܗܝ. ܘܐܡ̣ܪ ܠܗܘܢ\f p \fr 37.30\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܛܠܝܐ ܐܝܟܘ\f q \fr 37.30\fr* \fk ܠܝܬܘܗܝ\fk* \ft 5b1\ft*\f*. ܐܢܐ ܠܐܝܟܐ ܐ̇ܙܠ ܐܢܐ. +\v 31 ܘܢܣܒܘܗ̇ ܠܟܘܬܝܢܗ ܕܝܘܣܦ. ܘܢܟܣܘ ܨܦܪܝܐ ܕܥܙ̈ܐ. ܘܦܠܦܠܘܗ̇ ܠܟܘܬܝܢܐ ܒܕܡܗ. +\v 32 ܘܫܕܪܘܗ̇\f r \fr 37.32\fr* \fk ܘܫܩܠܘܗ̇\fk* \ft 12b1mg\ft*\f* ܠܟܘܬܝܢܐ ܕܦܕ̈ܝܬܐ. ܘܐܝܬܝܘܗ̇ ܠܐܒܘܗܘܢ. ܘܐܡܪܘ ܗܕܐ ܐܫܟܚܢ. ܐܫܬܘܕܥ ܟܘܬܝܢܐ ܐܢ ܕܒܪܟ ܗܝ ܐܘ ܠܐ. +\v 33 †ܘܐܫܬܘܕܥܗ̇† ܘܐܡ̣ܪ. ܟܘܬܝܢܐ ܕܒܪܝ ܗܝ. ܚܝܘܬܐ ܒܝܫܬܐ ܐܟܠܬܗ. ܡܬܒܪ ܬܒܝܪ ܝܘܣܦ ܒܪܝ. +\v 34 ܘܨܪܝ ܝܥܩܘܒ ܠܒ̈ܘܫܘܗܝ ܘܐܣܪ ܣܩܐ ܒܚܨ̈ܘܗܝ. ܘܐܬܐܒܠ ܥܠ ܒܪܗ ܝܘܡ̈ܬܐ ܣ̈ܓܝܐܐ. +\v 35 ܘܩܡܘ ܟܠܗܘܢ ܒܢ̈ܘܗܝ ܘܟܠܗܝܢ ܒܢ̈ܬܗ ܠܡܒܝܐܘܬܗ. ܘܠܐ ܨܒ̣ܐ ܠܡܬܒܝܐܘ ܘܐܡ̣ܪ. ܐܚܘܬ ܥܠ ܒܪܝ ܟܕ ܐܒܝܠ ܐܢܐ ܠܫܝܘܠ. ܘܒܟܝܗܝ ܐܒܘܗܝ. +\v 36 ܘܡܕܝܢ̈ܝܐ ܙܒܢܘܗܝ ܒܡܨܪܝܢ. ܠܦܘܛܝܦܪ ܡܗܝܡܢܐ ܪܒ ܕܚܫ̈ܐ ܕܦܪܥܘܢ. +\c 38 +\v 1 ܘܗܘ̣ܐ ܒܙܒܢܐ ܗ̇ܘ. ܘܢܚ̣ܬ ܝܗܘܕܐ ܡܢ ܠܘܬ ܐܚ̈ܘܗܝ. ܘܣ̣ܛܐ ܠܘܬ ܓܒܪܐ ܥܪܠܡܝܐ ܘܫܡܗ ܚܝܪܐ. +\v 2 ܘܚ̣ܙܐ ܬܡܢ\f a \fr 38.2\fr* \fk ܬܡܢ\fk* \ft om. 5b1\ft*\f* ܝܗܘܕܐ ܒܪܬ ܓܒܪܐ ܟܢܥܢܝܐ. ܘܫܡܗ̇ ܫܘܥ. ܘܢܣܒܗ̇ ܘܥܠ ܠܘܬܗ̇. +\v 3 ܘܒܛ̣ܢܬ ܘܝܠ̣ܕܬ ܠܗ\f b \fr 38.3\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܒܪܐ. ܘܩܪܐ ܫܡܗ ܥܝܪ. +\v 4 ܘܒ̣ܛܢܬ ܬܘܒ ܘܝܠܕܬ ܒܪܐ. ܘܩ̣ܪܐ ܫܡܗ ܐܘܢܢ. +\v 5 ܘܐܘܣ̣ܦܬ ܬܘܒ ܘܝܠ̣ܕܬ ܒܪܐ. ܘܩ̣ܪܐ ܫܡܗ ܫܠܐ. ܘܦܣ̣ܩܬ ܗܘܬ ܟܕ ܝܠܕܬܗ. +\v 6 ܘܢܣ̣ܒ ܝܗܘܕܐ ܐܢܬܬܐ ܠܥܝܪ ܒܘܟܪܗ. ܘܫܡܗ̇ ܬܡܪ. +\v 7 ܘܗܘ̣ܐ ܥܝܪ ܒܘܟܪܗ ܕܝܗܘܕܐ ܒܝܫ ܩܕܡ ܡܪܝܐ. ܘܐܡܝܬܗ ܡܪܝܐ. +\v 8 ܘܐܡ̣ܪ ܝܗܘܕܐ ܠܐܘܢܢ ܒܪܗ\f c \fr 38.8\fr* \fk ܒܪܗ\fk* \ft om. 5b1\ft*\f*. ܥܘܠ ܥܠ ܐܢܬܬ ܐܚܘܟ ܘܝܒܡܝܗ̇. ܘܐܩܝܡ ܙܪܥܐ ܠܐܚܘܟ. +\v 9 ܘܝܕܥ ܐܘܢܢ ܕܠܗ ܠܐ ܗ̇ܘܐ ܙܪܥܐ. ܘܡܐ ܕܥܐ̇ܠ ܗܘܐ ܥܠ ܐܢܬܬ ܐܚܘܗܝ. ܡ̇ܚܒܠ ܗܘܐ ܥܠ ܐܪܥܐ ܕܠܐ ܢܩܝܡ ܙܪܥܐ ܠܐܚܘܗܝ. +\v 10 ܘܐܬܐܒܫ ܩܕܡ ܡܪܝܐ ܡܕܡ ܕܥܒ̣ܕ ܘܐܡܝܬܗ ܐܦ ܠܗ. +\v 11 ܘܐܡ̣ܪ ܝܗܘܕܐ ܠܬܡܪ ܟܠܬܗ. ܬܒܝ ܒܐܪܡܠܘܬܐ ܒܝܬ ܐܒܘܟܝ. ܥܕܡܐ ܕܢܪܒܐ ܫܠܐ ܒܪܝ. ܡܛܠ ܕܐܡ̣ܪ. ܕܠܡܐ ܢܡܘܬ ܐܦ ܗ̣ܘ ܐܝܟ ܐܚ̈ܘܗܝ. ܘܐܙܠ̣ܬ ܬܡܪ ܘܝܬ̣ܒܬ ܒܝܬ ܐܒܘܗ̇. +\v 12 ܘܣܓܝܘ ܝܘܡ̈ܬܐ. ܘܡܝܬܬ ܒܪܬ ܫܘܥ\f d \fr 38.12\fr* \fk ܒܬܫܘܥ\fk* \ft 8b1, E, 11.10g1\ft*\f* ܐܢܬܬܗ ܕܝܗܘܕܐ. ܘܐܬܒܝܐ ܝܗܘܕܐ. ܘܣܠ̣ܩ ܠܘܬ ܓܙܝ̈ ܥܢܗ. ܗ̣ܘ ܘܚܝܪܐ ܪܚܡܗ ܥܪܠܡܝܐ ܠܬܡܢܬ. +\v 13 ܘܚܘܝܘ ܠܬܡܪ ܘܐܡܪܘ ܠܗ̇. ܗܐ ܚܡܘܟܝ ܣ̇ܠܩ ܠܬܡܢܬ ܠܡܓܙ ܥܢܗ. +\v 14 ܘܐܥܒ̣ܪܬ ܠܒܘ̈ܫܝ ܐܪܡܠܘܬܗ̇ ܡܢܗ̇. ܘܐܬܟܣܝܬ ܒܐܪܕܝܕܐ\f e \fr 38.14\fr* \fk ܐܪܕܝܕܐ\fk* \ft 5b1\ft*\f* ܘܐܨܛܒܬܬ ܘܝܬ̣ܒܬ ܒܦܠܫܬ ܐܘܪ̈ܚܬܐ. ܕܒܐܘܪܚܐ\f f \fr 38.14\fr* \fk ܕܒܐܘܪܚܐ\fk* \ft om. U\ft*\f*\f g \fr 38.14\fr* \fk ܒܐܘܪܚܐ\fk* \ft 8b1\ft*\f* ܕܬܡܢܬ. ܡܛܠ ܕܚܙܬ ܕܪܒܐ ܫܠܐ. ܘܗ̣ܝ ܠܐ ܡܬܝܗܒܐ ܠܗ\f h \fr 38.14\fr* \fk ܐܢܬܬܐ\fk* \ft add. 5b1\ft*\f*. +\v 15 ܘܚܙܗ̇ ܝܗܘܕܐ ܘܚܫܒܗ̇ ܐܝܟ ܙܢܝܬܐ. ܡܛܠ ܕܟܣ̣ܝܬ ܐ̈ܦܝܗ̇. +\v 16 ܘܣ̣ܛܐ ܠܘܬܗ̇ ܠܐܘܪܚܐ ܘܐܡ̣ܪ ܠܗ̇\f i \fr 38.16\fr* \fk ܠܗ̇\fk* \ft om. 5b1\ft*\f*. ܬܝ ܐܥܘܠ ܠܘܬܟܝ. ܡܛܠ ܕܠܐ ܝܕܥ ܗܘܐ ܕܟܠܬܗ ܗܝ. ܘܐܡ̣ܪܬ ܠܗ\f j \fr 38.16\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܡܢܐ ܝܗ̇ܒ ܐܢܬ\f k \fr 38.16\fr* \fk ܠܝ\fk* \ft add. 5b1\ft*\f* ܕܥܐ̇ܠ ܐܢܬ ܠܘܬܝ. +\v 17 ܘܐܡ̣ܪ ܐܢܐ ܐܫܕܪ ܓܕܝܐ ܕܥ̈ܙܐ ܡܢ ܥܢܐ. ܘܐܡ̣ܪܬ ܐܢ ܬܬܠ ܠܝ\f l \fr 38.17\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f* ܡܫܟܢܐ ܥܕܡܐ ܕܡܫܕܪ ܐܢܬ. +\v 18 ܘܐܡ̣ܪ ܡܢܐ ܡܫܟܢܐ ܐܬܠ ܠܟܝ. ܘܐܡ̣ܪܬ ܥܙܩܬܟ ܘܫܘܫܦܟ ܘܚܘܛܪܟ ܕܒܐܝܕܟ. ܘܝܗ̣ܒ ܠܗ̇ ܘܥܠ ܠܘܬܗ̇. ܘܒ̣ܛܢܬ ܡܢܗ. +\v 19 ܘܩܡܬ ܘܐܙܠ̣ܬ. ܘܐܥܒ̣ܪܬ ܐܪܕܝܕܐ ܡܢܗ̇. ܘܠܒܫ̣ܬ ܠܒܘܫ̈ܝ ܐܪܡܠܘܬܗ̇. +\v 20 ܘܫܕܪ ܝܗܘܕܐ ܓܕܝܐ ܕܥ̈ܙܐ ܒܝܕ ܪܚܡܗ ܥܪܠܡܝܐ. ܠܡܣܒ ܡܫܟܢܐ ܡܢ ܐ̈ܝܕܝܗ̇ ܕܐܢܬܬܐ ܘܠܐ ܐܫܟܚܗ̇. +\v 21 ܘܫܐ̇ܠ ܠܐܢܫ̈ܝ ܐܬܪܐ ܘܐܡ̣ܪ. ܐܝܟܐ ܗܝ ܙܢܝܬܐ ܕܝܬܒܐ ܒܦܠܫܬ ܐܘܪ̈ܚܬܐ ܘܐܡܪܘ. ܠܝܬ ܗܪܟܐ ܙܢܝܬܐ. +\v 22 ܘܗ̣ܦܟ ܠܘܬ ܝܗܘܕܐ ܘܐܡܪ. ܠܐ ܐܫܟܚܬܗ̇. ܘܐܦ ܐܢܫ̈ܝ ܐܬܪܐ ܐܡܪ̈ܝܢ. ܠܝܬ ܗܪܟܐ ܙܢܝܬܐ. +\v 23 ܘܐܡ̣ܪ ܝܗܘܕܐ. ܬܣܒ ܠܗ̇ ܕܠܡܐ ܐܗܘܐ ܓܘܚܟܐ. ܗܐ ܫ̇ܕܪܬ ܓܕܝܐ ܗܢܐ ܘܐܢܬ ܠܐ\f m \fr 38.23\fr* \fk ܘܠܐ\fk* \ft 12b2\ft*\f* ܐܫܟܚܬܗ̇. +\v 24 ܘܗܘ̣ܐ ܡܢ\f n \fr 38.24\fr* \fk ܡܢ\fk* \ft om. 5b1\ft*\f* ܒܬܪ ܬܠܬܐ ܝܪ̈ܚܝܢ. ܘܐܬܚܘܝ ܠܝܗܘܕܐ ܘܐܡܪܘ ܠܗ. ܙܢܝܬ ܬܡܪ ܟܠܬܟ. ܘܗܐ ܡܢ ܙܢܝܘܬܐ ܒܛܢܐ. ܘܐܡ̣ܪ ܝܗܘܕܐ. ܐܦܩܘܗ̇ ܘܬܐܩܕ. +\v 25 ܘܟܕ ܗ̣ܢܘܢ ܡܦܩܝܢ ܠܗ̇. ܫܠܚܐ ܠܚܡܘܗ̇\f o \fr 38.25\fr* \fk ܘܐܡܪܐ\fk* \ft add. 5b1\ft*\f*. ܡܢ ܓܒܪܐ ܕܗܠܝܢ ܕܝܠܗ ܡܢܗ ܒܛܢܐ ܐܢܐ ܘܐܡܪܬ. ܐܫܬܘܕܥ ܕܡ̇ܢ ܗܝ ܥܙܩܬܐ ܘܫܘܫܦܐ ܘܚܘܛܪܐ ܗܠܝܢ. +\v 26 ܘܗ̣ܘ ܐܫܬܘܕܥ ܘܐܡ̣ܪ ܝܗܘܕܐ. ܙܟܝܐ ܗܝ ܡܢܝ. ܡܛܠ ܗܢܐ ܠܐ ܝܗܒܬܗ̇ ܠܫܠܐ ܒܪܝ. ܘܠܐ ܐܘܣܦ ܬܘܒ ܠܡܕܥܗ̇. +\v 27 ܘܗܘ̣ܐ ܙܒܢ ܡܘܠܕܗ̇. ܘܗܐ ܬܐ̈ܡܐ ܒܟܪܣܗ̇. +\v 28 ܘܗܘ̣ܐ ܕܟܕ ܝܠܕܐ ܝܗ̣ܒ ܐܝܕܗ. ܘܢܣ̣ܒܬ ܚܝܬܐ ܚܘܛܐ ܕܙܚܘܪܝܬܐ. ܘܩܛܪܬ ܥܠ ܐܝܕܗ ܘܐܡ̣ܪܬ. ܗܢܐ ܢܦܘܩ ܩܕܡܝܬ. +\v 29 ܘܟܕ ܐܗܦܟ ܐܝܕܗ ܢܦ̣ܩ ܐܚܘܗܝ ܘܐܡ̣ܪܬ. ܡܐ ܐܬܬܪܥ̣ܬ ܥܠܝܟܝ ܬܘܪܥܬܐ ܘܩܪܬ ܫܡܗ ܦܪܨ. +\v 30 ܘܒܬܪܟܢ ܢܦ̣ܩ ܐܚܘܗܝ ܕܥܠ ܐܝܕܗ ܚܘܛܐ ܕܙܚܘܪܝܬܐ. ܘܩܪܬ ܫܡܗ ܙܪܚ. +\c 39 +\v 1 ܘܠܝܘܣܦ ܐܚܬܘܗܝ ܡܕܝܢ̈ܝܐ ܠܡܨܪܝܢ. ܘܙܒܢܗ ܦܘܛܝܦܪ ܡܗܝܡܢܐ ܪܒ ܕܚܫ̈ܐ ܕܦܪܥܘܢ. ܓܒܪܐ ܡܨܪܝܐ ܡܢ ܐܝܕܐ ܕܥܪ̈ܒܝܐ. ܕܐܚܬܘܗܝ ܠܬܡܢ. +\v 2 ܘܗܘ̣ܐ ܡܪܝܐ ܥܡ ܝܘܣܦ. ܘܗܘ̣ܐ ܓܒܪܐ ܡܨܠܚ ܒܝܬ ܡܪܗ ܡܨܪܝܐ. +\v 3 ܘܚ̣ܙܐ ܡܪܗ ܕܡܪܝܐ ܥܡܗ. ܘܟܠ ܕܥܒ̇ܕ ܡܪܝܐ ܡ̣ܨܠܚ ܒܐܝܕܗ. +\v 4 ܘܐܫܟܚ ܝܘܣܦ ܪ̈ܚܡܐ ܒܥܝܢ̈ܘܗܝ ܘܫܡܫܗ. ܘܐܫܠܛܗ ܥܠ ܒܝܬܗ. ܘܟܠ ܕܐܝܬ ܠܗ ܝܗ̣ܒ ܒܐ̈ܝܕܘܗܝ. +\v 5 ܘܗܘ̣ܐ ܡܢ ܙܒܢܐ ܕܐܫܠܛܗ ܥܠ ܒܝܬܗ ܘܥܠ ܟܠ ܕܐܝܬ ܠܗ. ܒ̇ܪܟ ܡܪܝܐ ܠܒܝܬܗ ܕܡܨܪܝܐ ܡܛܠ ܝܘܣܦ. ܘܗܘܬ ܒܘܪܟܬܗ ܕܡܪܝܐ ܒܟܠ ܕܐܝܬ ܠܗ ܒܒܝܬܐ ܘܒܚܩܠܐ. +\v 6 ܘܫܒ̣ܩ ܟܠܡܕܡ\f a \fr 39.6\fr* \fk ܟܠ\fk* \ft 5b1\ft*\f* ܕܐܝܬ ܠܗ ܒܝܕ ܝܘܣܦ. ܘܠܐ ܝܕܥ ܥܡܗ ܡܕܡ. ܐܠܐ ܐܢ ܠܚܡܐ ܕܐ̇ܟܠ ܗܘܐ. ܘܝܘܣܦ ܫܦܝܪ ܗܘܐ ܚܙܘܗ\f b \fr 39.6\fr* \fk ܒ\fk* \ft 8b1, 11.10g1\ft*\f* ܘܝܐܐ ܗܘܐ\f c \fr 39.6\fr* \fk ܗܘܐ\fk* \ft om. 8b1, E, W, M, U, L\ft*\f* ܩܘܒܠܠܗ. +\v 7 ܘܗܘܐ ܡܢ ܒܬܪ ܦ̈ܬܓܡܐ\f d \fr 39.7\fr* \fk ܡ̈ܠܐ\fk* \ft 5b1\ft*\f* ܗܠܝܢ. ܐܪܡ̣ܝܬ ܐܢܬܬ ܡܪܗ ܥܝܢܗ̇ ܥܠ ܝܘܣܦ. ܘܐܡ̣ܪܬ ܠܗ ܕܡ̣ܟ ܥܡܝ. +\v 8 ܘܠܐ ܨܒ̣ܐ ܘܐܡ̣ܪ ܠܐܢܬܬ ܡܪܗ. ܗܐ ܡܪܝ ܠܐ ܝܕܥ ܥܡܝ ܡܢܐ ܐܝܬ ܒܒܝܬܗ. ܘܟܠ ܕܐܝܬ ܠܗ ܐܫܠܛ ܒܐ̈ܝܕܝ. +\v 9 ܘܠܝܬ ܕܪܒ ܒܒܝܬܐ ܗܢܐ ܡܢܝ. ܘܠܐ ܚܣܟ ܡܢܝ ܡܕܡ. ܐܠܐ ܐܢ ܠܟܝ ܕܐܢܬܬܗ ܐܢܬܝ. ܘܐܝܟܢܐ ܐܥܒܕ ܒܝܫܬܐ ܗܕܐ ܪܒܬܐ. ܘܐܚܛܐ ܠܐܠܗܐ. +\v 10 ܘܟܕ ܐܡܪܐ ܗܘܬ ܠܗ ܟܠܝܘܡ\f e \fr 39.10\fr* \fk ܠܝܘܣܦ\fk* \ft add. 5b1\ft*\f* ܘܠܐ ܫܡ̇ܥ ܗܘܐ ܠܗ̇. ܠܡܕܡܟ ܠܘܬܗ̇ ܘܠܡܗܘܐ ܥܡܗ̇. +\v 11 ܘܗܘ̣ܐ ܒܚܕ ܡܢ\f f \fr 39.11\fr* \fk ܒܬܪ\fk* \ft 5b1\ft*\f* ܝܘܡ̈ܬܐ. ܘܥܠ ܝܘܣܦ\f g \fr 39.11\fr* \fk ܝܘܣܦ\fk* \ft om. 8b1\ft*\f* ܠܒܝܬܐ ܠܡܥܒܕ ܥܒ̇ܕܐ ܘܠܝܬ ܐܢܫ ܡܢ ܐܢܫ̈ܝ ܒܝܬܐ ܬܡܢ ܒܒܝܬܐ. +\v 12 ܘܐܚܕܬܗ ܒܠܒܫܗ ܘܐܡ̣ܪܬ ܠܗ\f h \fr 39.12\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܕܡ̣ܟ ܥܡܝ. ܘܫܒܩܗ ܠܒܫܗ ܒܐ̈ܝܕܝܗ̇. ܘܥ̣ܪܩ ܢܦ̣ܩ ܠܗ ܠܫܘܩܐ. +\v 13 ܘܗܘ̣ܐ ܕܟܕ ܚܙܬ ܕܫܒܩܗ ܠܒܫܗ ܒܐ̈ܝܕܝܗ̇ ܘܥ̣ܪܩ\f i \fr 39.13\fr* \fk ܢܦܩ ܠܗ\fk* \ft add. 8b1\ft*\f* ܠܫܘܩܐ. +\v 14 ܩ̣ܪܬ ܠܐܢܫ̈ܝ ܒܝܬܗ̇ ܘܐܡ̣ܪܬ ܠܗܘܢ. ܚܙܘ ܕܐܝܬܝ ܠܢ ܥܒ̣ܕܐ ܥܒܪܝܐ ܠܡܓܚܟ ܥܠܝܢ. ܥܠ ܥܠܝ ܠܡܕܡܟ ܥܡܝ. ܘܩܥ̇ܝܬ ܒܩܠܐ ܪܡܐ\f j \fr 39.14\fr* \fk ܪܒܐ\fk* \ft 12a1\ft*\f*. +\v 15 ܘܟܕ ܫܡ̣ܥ ܕܐܪܝܡ̇ܬ ܩܠܝ ܘܩ̇ܥܝܬ\f k \fr 39.15\fr* \fk ܘܩܪܝܬ\fk* \ft 5b1\ft*\f*. ܫܒܩܗ ܠܒܫܗ ܠܘܬܝ\f l \fr 39.15\fr* \fk ܒܐ̈ܝܕܝ\fk* \ft E, W, M, U, L\ft*\f*. ܘܥ̣ܪܩ ܢܦ̣ܩ ܠܗ ܠܫܘܩܐ. +\v 16 ܘܣܡܬܗ ܠܒܫܗ ܠܘܬܗ̇. ܥܕܡܐ ܕܥܠ ܡܪܗ ܠܒܝܬܐ. +\v 17 ܘܐܡ̣ܪܬ ܠܗ ܐܝܟ ܡ̈ܠܐ ܗܠܝܢ. ܥܠ ܥܠܝ ܥܒ̣ܕܐ ܥܒܪܝܐ ܕܐܝܬܝܬ ܠܢ ܠܡܓܚܟܘ ܒܢ. +\v 18 ܘܟܕ ܐܪܝܡ̇ܬ ܩܠܝ ܘܩ̇ܥܝܬ. ܫܒܩܗ ܠܒܫܗ ܒܐ̈ܝܕܝ ܘܥܪ̣ܩ ܢܦ̣ܩ ܠܗ ܠܫܘܩܐ. +\v 19 ܘܟܕ ܫܡ̣ܥ ܡܪܗ ܡ̈ܠܝܗ̇ ܕܐܢܬܬܗ ܕܐܡ̣ܪܬ ܠܗ. ܕܐܝܟ ܡ̈ܠܐ ܗܠܝܢ ܥܒ̣ܕ ܠܝ ܥܒ̣ܕܟ. ܐܬܚܡ̣ܬ ܪܘܓܙܗ. +\v 20 ܘܕܒܪܗ ܡܪܗ\f m \fr 39.20\fr* \fk ܠܝܘܣܦ\fk* \ft add. 5b1\ft*\f* ܘܐܪܡܝܗ ܒܝܬ ܐܣܝܪ̈ܐ. ܐܬܪ ܕܐܣܝܪ̈ܝ ܡ̇ܠܟܐ ܐܣܝܪ̈ܝܢ ܗܘܘ\f n \fr 39.20\fr* \fk ܗܘܘ\fk* \ft om. 5b1\ft*\f*. ܘܗܘ̣ܐ ܬܡ̇ܢ ܒܝܬ ܐܣܝܪ̈ܐ. +\v 21 ܘܗ̣ܘܐ ܡܪܝܐ ܥܡ ܝܘܣܦ. ܘܐܪܡܝ ܥܠܘܗܝ ܚܣܕܐ. ܘܝܗܒܗ ܠܪ̈ܚܡܐ ܒܥܝ̈ܢܝ ܪܒ ܒܝܬ ܐܣܝܪ̈ܐ. +\v 22 ܘܐܫܠܡ ܪܒ\f o \fr 39.22\fr* \fk ܒܝܬ\fk* \ft add. 5b1, E, W, M, U, L\ft*\f* ܐܣܝܪ̈ܐ ܒܝܕ ܝܘܣܦ ܟܠܗܘܢ ܐܣܝܪ̈ܐ ܕܒܒܝܬ ܐܣܝܪ̈ܐ. ܘܟܠ ܕܥܒܕܝܢ ܗܘܘ ܬܡ̇ܢ ܗ̣ܘ ܥܒ̇ܕ ܗܘܐ. +\v 23 ܘܪܒ\f p \fr 39.23\fr* \fk ܒܝܬ\fk* \ft add. 5b1, E, W, M, U, L\ft*\f* ܐܣܝܪ̈ܐ ܠܐ ܚ̇ܙܐ ܗܘ̣ܐ ܡܕܡ ܒܐܝܕܗ. ܡܛܠ ܕܡܪܝܐ\f q \fr 39.23\fr* \fk ܗܘܐ\fk* \ft add. 5b1, Ei, W, M, U, L\ft*\f* ܥܡܗ. ܘܟܠ ܡܕܡ\f r \fr 39.23\fr* \fk ܘܡܕܡ\fk* \ft 5b1\ft*\f* ܕܥܒ̇ܕ ܗܘܐ ܡܪܝܐ ܡܨܠܚ. +\c 40 +\v 1 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܦܬ̈ܓܡܐ ܗܠܝܢ. ܚܛܘ ܪܒ ܫܩ̈ܘܬܐ ܕܡ̇ܠܟܐ ܕܡܨܪܝܢ ܘܪܒ ܢܚ̈ܬܘܡܐ ܠܡܪܗܘܢ ܡ̇ܠܟܐ ܕܡܨܪܝܢ. +\v 2 ܘܪܓܙ ܦܪܥܘܢ ܥܠ ܬܪ̈ܝܢ ܡܗܝܡܢ̈ܘܗܝ. ܥܠ ܪܒ ܫܩ̈ܘܬܐ ܘܥܠ ܪܒ\f a \fr 40.2\fr* \fk ܘܪܒ\fk* \ft 12b1\ft*\f* ܢܚ̈ܬܘܡܐ. +\v 3 ܘܐܪܡܝ ܐܢܘܢ ܒܝܬ ܐܣܝܪ̈ܐ. ܒܝܬ ܪܒ ܕܚܫ̈ܐ\f b \fr 40.3\fr* \fk ܒܝܬ ܐܣܝܪ̈ܐ\fk* \ft add. 5b1*\ft*\f*. ܒܐܬܪܐ ܕܝܘܣܦ ܐܣܝܪ\f c \fr 40.3\fr* \fk ܗܘܐ\fk* \ft add. 11.10g1\ft*\f* ܬܡ̇ܢ. +\v 4 ܘܐܫܠܛ ܪܒ ܕܚܫ̈ܐ ܠܝܘܣܦ ܥܠܝܗܘܢ ܘܫܡܫ ܐܢܘܢ. ܘܗܘܘ ܝܘܡ̈ܬܐ ܒܝܬ ܐܣܝܪ̈ܐ. +\v 5 ܘܚ̣ܠܡܘ ܚ̈ܠܡܐ ܬܪ̈ܝܗܘܢ. ܓܒܪ ܚܠܡܗ ܒܠܠܝܐ ܚܕ ܓܒܪ ܐܝܟ ܦܫܪ ܚܠܡܗ [-]. ܫܩܝܐ ܘܢܚܬܘܡܐ ܕܡ̇ܠܟܐ ܕܡܨܪܝܢ ܕܐܣܝܪ̈ܝܢ ܒܝܬ ܐܣܝܪ̈ܐ. +\v 6 ܘܥܠ ܠܘܬܗܘܢ ܝܘܣܦ ܒܨܦܪܐ ܘܚ̣ܙܐ ܐܢܘܢ. ܘܗܐ ܟܡܝܪ̈ܝܢ. +\v 7 ܘܫܐ̇ܠ ܠܡܗ̈ܝܡܢܝ ܦܪܥܘܢ ܕܥܡܗ ܒܚܒܘܫܝܐ ܒܝܬ ܡܪܗ ܘܐܡ̣ܪ ܠܗܘܢ\f d \fr 40.7\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܠܡܢܐ ܟܡܝܪ̈ܢ ܐ̈ܦܝܟܘܢ ܝܘܡܢܐ. +\v 8 ܘܐܡܪܘ ܠܗ. ܚܠܡܐ ܚܠܡܢ ܘܦܫܘܪܐ ܠܝܬ ܠܗ. ܐܡ̇ܪ ܠܗܘܢ ܝܘܣܦ. ܗܐ ܕܐܠܗܐ ܐܢܘܢ ܦܫܪ̈ܐ. ܐܫܬܥܘ ܠܝ\f e \fr 40.8\fr* \fk ܓܒܪ ܚܠܡܗ\fk* \ft add. 8b1\ft*\f*. +\v 9 ܘܐܫܬܥܝ\f f \fr 40.9\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f* ܪܒ ܫܩ̈ܘܬܐ ܚܠܡܗ ܠܝܘܣܦ. ܘܐܡ̣ܪ ܠܗ. ܒܚܠܡܝ ܗܐ ܓܦܬܐ ܩܕܡܝ. +\v 10 ܘܒܓܦܬܐ ܬܠܬ ܫܒܫ̈ܬܝܢ. ܘܗ̣ܝ ܟܕ ܦܪܥ̣ܬ. ܝܥܘ\f g \fr 40.10\fr* \fk ܥܠܘ\fk* \ft M\ft*\f* ܛܪ̈ܦܝܗ̇ ܘܒܫܠܘ ܣ̈ܓܘܠܝܗ̇. ܗܘܘ ܥܢ̈ܒܐ. +\v 11 ܘܟܣܐ ܕܦܪܥܘܢ ܒܐ̈ܝܕܝ. ܘܢܣ̇ܒܬ ܥܢ̈ܒܐ ܘܥܨܪܬ ܐܢ̈ܝܢ ܒܟܣܗ ܕܦܪܥܘܢ. ܘܝܗ̇ܒܬ ܟܣܐ ܠܐ̈ܝܕܝ ܦܪܥܘܢ. +\v 12 ܐܡ̇ܪ ܠܗ ܝܘܣܦ. ܗܢܘ ܦܫܪܗ ܕܚܠܡܟ\f h \fr 40.12\fr* \fk ܕܚܠܡܟ\fk* \ft om. 5b1\ft*\f*. ܬܠܬ ܫܒܫ̈ܬܝܢ ܬܠܬܐ ܐܢܘܢ ܝܘܡ̈ܝܢ. +\v 13\f i \fr 40.13\fr* \fk ܡܢ\fk* \ft add. E, W, U, L\ft*\f* ܒܬܪ\f j \fr 40.13\fr* \fk ܒܬܪ\fk* \ft om. 12b1*\ft*\f* ܬܠܬܐ ܝܘܡ̈ܝܢ ܢܬܕܟܪܟ ܦܪܥܘܢ. ܘܢܗܦܟܟ ܥܠ ܫܕܬܟ. ܘܬܬܠ ܟܣܐ ܠܦܪܥܘܢ ܒܐܝܕܗ. ܐܝܟ ܢܡܘܣܐ ܩܕܡܝܐ ܕܡܫ̇ܩܐ ܗܘ̣ܝܬ ܠܗ. +\v 14 ܐܠܐ ܐܬܕܟܪܝܢܝ ܥܡܟ ܟܕ ܢܛܐܒ ܠܟ. ܘܥܒ̣ܕ ܥܡܝ ܛܝܒܘܬܐ ܘܩܘܫܬܐ. ܘܐܬܕܟܪܝܢܝ ܩܕܡ ܦܪܥܘܢ. ܘܐܦܩܝܢܝ ܡܢ ܒܝܬ ܐܣܝܪ̈ܐ ܗܢܐ. +\v 15 ܡܛܠ ܕܡܓܢܒ ܓܢܝܒ ܐܢܐ ܡܢ ܐܪܥܐ ܕܥܒܪ̈ܝܐ. ܘܐܦ ܗܪܟܐ ܡܕܡ ܠܐ ܥܒ̇ܕܬ. ܕܐܪܡܝܘܢܝ ܒܓܘܒܐ\f k \fr 40.15\fr* \fk ܒܝܬ ܐܣܝܪ̈ܐ\fk* \ft E, W, M, U, L\ft*\f*. +\v 16 ܘܚ̣ܙܐ\f l \fr 40.16\fr* \fk ܘܟܕ ܚܙܐ\fk* \ft 8a1*, 11.10g1\ft*\f* ܪܒ ܢܚ̈ܬܘܡܐ ܕܫܦܝܪ ܦܫ̣ܪ. ܘܐܡ̣ܪ ܠܝܘܣܦ. ܘܐܦ ܐܢܐ ܒܚܠܡܝ. ܘܗܐ ܬܠܬܐ ܣ̈ܠܐ ܕܚܘܪ̈ܬܐ ܥܠ ܪܫܝ. +\v 17 ܘܒܣܠܐ ܥܠܝܐ ܡܢ ܟܠ ܡܐܟܠܗ ܕܦܪܥܘܢ. ܥܒ̇ܕܐ ܕܢܚܬܘܡܐ. ܘܚܝܘܬ ܟܢܦܐ ܐܟܠܐ ܠܗܘܢ ܡܢ ܣܠܐ ܡܢ ܠܥܠ ܡܢ ܪܫܝ. +\v 18 ܥܢ̣ܐ ܝܘܣܦ ܘܐܡ̣ܪ †ܠܗ†\f m \fr 40.18\fr* \fk †ܠܗ†\fk* \ft om. 5b1\ft*\f*\f n \fr 40.18\fr* \fk ܠܪܒ ܢܚ̈ܬܘܡܐ\fk* \ft 7a1\ft*\f*. ܗܢܘ ܦܫܪܗ ܕܚܠܡܟ. ܬܠܬܐ ܣ̈ܠܝܢ ܬܠܬܐ ܐܢܘܢ ܝܘܡ̈ܝܢ. +\v 19\f o \fr 40.19\fr* \fk ܡܢ\fk* \ft add. 11.10g1, 12b2\ft*\f* ܒܬܪ ܬܠܬܐ ܝܘܡ̈ܝܢ. ܢܣ̣ܒ ܦܪܥܘܢ ܪܫܟ ܡܢܟ ܘܢܙܩܦܟ ܥܠ ܩܝܣܐ. ܘܬܐܟܘܠ ܦܪܚܬܐ ܒܣܪܟ ܡܢܟ. +\v 20 ܘܗܘܐ ܒܝܘܡܐ ܬܠܝܬܝܐ ܒܝܘܡܐ ܕܒܝܬ ܝܠܕܗ ܕܦܪܥܘܢ. ܥܒ̣ܕ ܦܪܥܘܢ\f p \fr 40.20\fr* \fk ܦܪܥܘܢ\fk* \ft om. 5b1, L\ft*\f* ܡܫܬܝܐ ܠܟܠܗܘܢ ܥܒ̈ܕܘܗܝ. ܘܐܬܕܟܪ ܠܪܒ ܫܩ̈ܘܬܐ ܘܠܪܒ ܢܚܬ̈ܘܡܐ ܒܓܘ ܥܒ̈ܕܘܗܝ. +\v 21 ܘܐܩܝܡ ܠܪܒ ܫ̈ܩܘܬܐ ܥܠ ܫܕܬܗ. ܘܝܗ̣ܒ ܟܣܐ ܥܠ ܐܝ̈ܕܝ\f q \fr 40.21\fr* \fk ܠܐܝ̈ܕܝ\fk* \ft 8b1\ft*\f* ܦܪܥܘܢ. +\v 22 ܘܠܪܒ ܢܚܬ̈ܘܡܐ ܙܩܦ ܐܝܟ ܕܦܫ̣ܪ ܠܗܘܢ ܝܘܣܦ. +\v 23 ܘܠܐ ܐܬܕܟܪ ܪܒ ܫܩ̈ܘܬܐ ܠܝܘܣܦ ܘܛܥܝܗܝ. +\c 41 +\v 1 ܘܗܘܐ ܡܢ ܒܬܪ ܬܪ̈ܬܝܢ ܫ̈ܢܝܢ. ܘܦܪܥܘܢ ܚܠ̣ܡ †ܚܠܡܐ†\f a \fr 41.1\fr* \fk †ܚܠܡܐ†\fk* \ft om. Ai\ft*\f*. ܘܗܐ ܩܐܡ ܥܠ ܢܗܪܐ. +\v 2 ܘܗܐ ܡܢ ܢܗܪܐ ܣ̈ܠܩܢ ܫܒܥ ܬܘܪ̈ܢ. ܫܦܝܪ̈ܢ ܒܚܙܘܗܝܢ ܘܫܡܝܢܢ ܒܒܣܪܗܝܢ ܘܪܥܝܢ ܒܡܪܓܐ. +\v 3 ܘܗܐ ܫܒܥ ܬܘܪ̈ܬܐ ܐܚܪ̈ܢܝܬܐ ܣ̈ܠܩܢ ܒܬܪܗܝܢ ܡܢ ܢܗܪܐ. ܒܝܫ̈ܢ ܒܚܙܘܗܝܢ ܘܡܚܝܠܢ ܒܒܣܪܗܝܢ. ܘܩܡ ܥܠ ܓܢܒ ܬܘܪ̈ܬܐ ܥܠ\f b \fr 41.3\fr* \fk ܕ\fk* \ft 5b1\ft*\f* ܣܦܬ ܢܗܪܐ. +\v 4 ܘܐܟ̣ܠ ܬܘܪ̈ܬܐ ܕܒܝܫ̈ܢ ܒܚܙܘܗܝܢ\f c \fr 41.4\fr* \fk ܒܚܙܘܗܝܢ\fk* \ft om. 5b1\ft*\f* ܘܡܚܝ̈ܠܢ ܒܒܣܪܗܝܢ\f d \fr 41.4\fr* \fk ܒܣܪܗܝܢ\fk* \ft 5b1\ft*\f*. ܠܫܒܥ ܬܘܪ̈ܬܐ ܕܫܦܝܪ̈ܢ ܒܚܙܘܗܝܢ ܘܫܡܝ̈ܢܢ ܒܒܣܪܗܝܢ. ܘܐܬܬܥܝܪ ܦܪܥܘܢ. +\v 5 ܘܕܡ̣ܟ ܘܚܠܡ ܕܬܪ̈ܬܝܢ ܙܒܢܝ̈ܢ. ܘܗܐ ܫܒܥ ܫܒ̈ܠܝܢ ܣ̈ܠܩܢ ܒܩܢܝܐ ܚܕ. †ܡ̈ܠܝܢ† ܘܛܒ̈ܢ. +\v 6 ܘܗܐ ܫܒܥ ܫܒ̈ܠܝܢ\f e \fr 41.6\fr* \fk ܐܚܪ̈ܢܝܢ\fk* \ft add. 12b1\ft*\f* ܩ̈ܛܝܢܢ ܘܫܩܝܦܢ ܠܪܘܚܐ ܕܫܘܒܐ ܝܥܝܢ ܒܬܪܗܝܢ. +\v 7 ܘܒܠܥ ܫܒ̈ܠܐ ܩܛܝܢ̈ܬܐ ܠܫܒܥ ܫܒ̈ܠܐ ܫܡܝܢ̈ܬܐ ܘܡܠܝ̈ܬܐ. ܘܐܬܥܝܪ ܦܪܥܘܢ ܘܗܐ ܚܠܡܐ ܗܘ. +\v 8 ܘܗܘܐ ܒܨܦܪܐ. ܘܐܬܛܪܦܬ ܪܘܚܗ ܕܦܪܥܘܢ\f f \fr 41.8\fr* \fk ܕܦܪܥܘܢ\fk* \ft om. 5b1\ft*\f*. ܘܫܕܪ ܩ̣ܪܐ ܠܟܠܗܘܢ ܚܪ̈ܫܐ ܘܠܟܠܗܘܢ †ܚܟܝ̈ܡܝܗ̇† ܕܡܨܪ̈ܝܢ. ܘܐܫܬܥܝ ܠܗܘܢ †ܦܪܥܘܢ ܚ̈ܠܡܘܗܝ†. ܘܠܝܬ\f g \fr 41.8\fr* \fk ܐܢܫ\fk* \ft add. 5b1, E, W, M, U, L\ft*\f* ܕܦܫ̇ܪ ܠܗܘܢ ܠܦܪܥܘܢ\f h \fr 41.8\fr* \fk ܚ̈ܠܡܘܗܝ\fk* \ft 12b2\ft*\f*. +\v 9 ܘܡܠܠ ܪܒ ܫܩ̈ܘܬܐ ܩܕܡ ܦܪܥܘܢ. ܘܐܡ̣ܪ ܣܘܪܚܢܝ †ܡܕܟܪ† ܐܢܐ ܝܘܡܢܐ. +\v 10 ܦܪܥܘܢ ܪܓܙ ܥܠ ܥܒ̈ܕܘܗܝ. ܘܐܪܡܝܢ ܒܝܬ ܐܣܝܪ̈ܐ ܒܝܬ ܪܒ ܕܚܫ̈ܐ. ܠܝ ܘܠܪܒ ܢܚ̈ܬܘܡܐ. +\v 11 ܘܚܠܡܢ ܚ̈ܠܡܐ ܒܠܠܝܐ ܚܕ ܐܢܐ ܘܗ̇ܘ. ܓܒܪ ܐܝܟ ܦܫܪ ܚܠܡܗ ܚܠܡܢ. +\v 12 ܘܬܡܢ ܥܡܢ ܥܠܝܡܐ ܥܒܪܝܐ ܥܒ̣ܕܐ\f i \fr 41.12\fr* \fk ܗܘ\fk* \ft add. 12b2\ft*\f* ܕܪܒ ܕܚܫ̈ܐ ܘܐܫܬܥܝܢ ܠܗ. ܘܦܫ̣ܪ ܠܢ ܚ̈ܠܡܝܢ. ܐܢܫ ܐܝܟ ܚܠܡܗ ܦܫܪ. +\v 13 ܘܐܝܟ\f j \fr 41.13\fr* \fk ܘܐܝܟܢܐ\fk* \ft 5b1, 11.10g1\ft*\f* ܕܦܫ̣ܪ ܠܢ ܗܟܢܐ ܗܘܐ ܠܢ\f k \fr 41.13\fr* \fk ܠܢ\fk* \ft om. 5b1\ft*\f*. ܠܝ ܐܗܦܟ ܥܠ ܫܕܬܝ\f l \fr 41.13\fr* \fk ܠ\fk* \ft 12a1\ft*\f* ܘܠܗ̇ܘ ܙܩܦ. +\v 14 ܘܫܕܪ ܦܪܥܘܢ ܘܩܪܝܗܝ ܠܝܘܣܦ ܘܐܪܗܛܘܗܝ ܡܢ ܓܘܒܐ. ܘܓ̣ܪܥ ܘܚ̇ܠܦ ܢܚ̈ܬܘܗܝ. ܘܥܠ\f m \fr 41.14\fr* \fk ܩܡ\fk* \ft add. 12b2\ft*\f* ܩܕܡ ܦܪܥܘܢ. +\v 15 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܚܠܡܐ ܚ̇ܠܡܬ ܘܦܫܘܪܐ ܠܝܬ ܠܗ. ܘܐܢܐ ܫܡ̇ܥܬ ܥܠܝܟ. ܕܫܡ̇ܥ ܐܢܬ ܚܠܡܐ ܘܦܫܪ ܐܢܬ ܠܗ. +\v 16 ܥܢ̣ܐ ܝܘܣܦ ܘܐܡ̣ܪ ܠܦܪܥܘܢ. ܕܠܡܐ ܣ̇ܒܪ ܐܢܬ ܕܒܠܥܕ [-]\f n \fr 41.16\fr* \fk ܡܢ\fk* \ft 7a1\ft*\f* ܐܠܗܐ ܢܥܢܐ ܫܠܡܐ ܠܦܪܥܘܢ. +\v 17 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܒܚܠܡܝ ܗܐ ܩܐܡ ܐܢܐ ܥܠ ܣܦܬ ܢܗܪܐ. +\v 18 ܘܗܐ ܡܢ ܢܗܪܐ ܣܠܩܢ ܫܒܥ ܬܘܪ̈ܬܐ. ܫܡܝ̈ܢܢ ܒܒܣܪܗܝܢ ܘܫܦܝܪ ܚܙܘܗܝܢ ܘܪܥܝܢ ܒܡܪܓܐ. +\v 19 ܘܗܐ ܫܒܥ ܬܘܪ̈ܢ ܐܚܪ̈ܢܝܢ ܣܠܩܢ ܒܬܪܗܝܢ. ܒܨܝܪ̈ܢ ܘܒܝܫ ܚܙܘܗܝܢ\f o \fr 41.19\fr* \fk ܒ\fk* \ft 12b2\ft*\f*. ܘܡܚܝܠ ܒܣܪܗܝܢ ܛܒ. ܘܠܐ ܚ̇ܙܝܬ ܕܒܝܫ̈ܢ ܐܟܘܬܗܝܢ ܒܟܘܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 20 ܘܐܟ̣ܠ ܬܘܪ̈ܬܐ ܡܚܝ̈ܠܬܐ ܘܒܝܫ̈ܬܐ ܠܫܒܥ ܬܘܪ̈ܬܐ ܩܕܡܝ̈ܬܐ ܫܡܝ̈ܢܬܐ. +\v 21 ܘܥܠ ܠܓܘܗܝܢ ܘܠܐ ܐܬܝܕܥ ܕܥܠ ܠܓܘܗܝܢ. ܘܚܙܘܗܝܢ ܒܝܫ ܐܝܟ ܕܒܩܕܡܝܬܐ. ܘܐܬ̇ܬܥܝܪܬ. +\v 22 ܘܬܘܒ ܚܙܝ̇ܬ ܒܚܠܡܝ. ܘܗܐ ܫܒܥ ܫܒ̈ܠܝܢ ܣ̈ܠܩܢ ܒܩܢܝܐ ܚܕ. ܡ̈ܠܝܢ ܘܛܒ̈ܢ. +\v 23 ܘܗܐ ܫܒܥ ܫܒ̈ܠܝܢ ܩܛܝ̈ܢܢ ܘܫܩܝ̈ܦܢ ܠܪܘܚܐ ܕܫܘܒܐ ܝܥܝܢ ܒܬܪܗܝܢ. +\v 24 ܘܒܠ̣ܥ ܫܒ̈ܠܐ ܩܛܝܢܬ̈ܐ ܠܫܒܥ ܫܒ̈ܠܐ ܛܒܬ̈ܐ. ܘܐܡ̇ܪܬ ܠܚܪ̈ܫܐ ܘܠܝܬ ܕܡܚܘܐ ܠܝ. +\v 25 ܘܐܡ̣ܪ ܝܘܣܦ ܠܦܪܥܘܢ. ܚܠܡܐ ܦܪܥܘܢ ܚܕ ܗ̣ܘ. ܡܕܡ ܕܐܠܗܐ ܥܒ̇ܕ ܚܘܝ ܠܦܪܥܘܢ. +\v 26 ܫܒܥ ܬܘܪ̈ܬܐ ܛܒܬ̈ܐ ܫܒܥ ܐܢܝ̈ܢ ܫ̈ܢܝܢ. ܘܫܒܥ ܫ̈ܒܠܐ ܛܒ̈ܬܐ ܫܒܥ ܐܢܝ̈ܢ ܫ̈ܢܝܢ. ܚܠܡܐ ܚܕ ܗ̣ܘ. +\v 27 ܘܫܒܥ ܬܘܪ̈ܬܐ ܡܚܝ̈ܠܬܐ ܘܒܝܫ̈ܬܐ ܕܣ̈ܠܩܢ ܒܬܪܗܝܢ ܫܒܥ ܐܢܝ̈ܢ ܫ̈ܢܝܢ. ܘܫܒܥ ܫ̈ܒܠܐ ܩܛܝܢ̈ܬܐ ܕܫܩܝܦܢ ܠܪܘܚܐ ܕܫܘܒܐ. ܢܗܘܝܢ ܫܒܥ ܫ̈ܢܝܢ ܟܦܢܐ. +\v 28 ܗ̇ܘ ܦܬܓܡܐ ܕܐܡ̇ܪܬ ܠܦܪܥܘܢ. ܐܝܠܝܢ ܕܐܠܗܐ ܥܒ̇ܕ ܚܘܝ ܠܦܪܥܘܢ. +\v 29 ܗܐ\f p \fr 41.29\fr* \fk ܗܫܐ\fk* \ft 5b1\ft*\f* ܫܒܥ ܫ̈ܢܝܢ ܐܬ̈ܝܢ. ܣܒܥܐ ܪܒܐ ܒܟܠܗ̇ ܐܪܥܐ\f q \fr 41.29\fr* \fk ܒܐܪܥܐ\fk* \ft 5b1\ft*\f* ܕܡܨܪܝܢ. +\v 30 ܘܢܩܘܡܢ ܫܒܥ ܫ̈ܢܝܢ ܕܟܦܢܐ ܒܬܪܗܝܢ. ܘܢܬܛܥܐ ܟܠܗ ܣܒܥܐ ܕܗܘ̣ܐ ܒܟܘܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. ܘܢܣܝܦ ܟܦܢܐ ܠܐܪܥܐ. +\v 31 ܘܠܐ ܢܬܝܕܥ ܣܒܥܐ ܒܐܪܥܐ. ܡܛܠ ܟܦܢܐ ܗ̇ܘ ܕܡܢ ܒܬܪܟܝܢ ܕܥܫܝܢ ܗ̣ܘ ܛܒ. +\v 32 ܘܕܐܬܬܢܝ ܚܠܡܐ ܠܦܪܥܘܢ ܕܬܪ̈ܬܝܢ ܙܒ̈ܢܝܢ. ܕܡܛܝܒ ܦܬܓܡܐ ܡܢ ܩܕܡ ܐܠܗܐ. ܘܡܣܪܗܒ ܐܠܗܐ ܠܡܥܒܕܗ. +\v 33 ܗܫܐ ܢܚܙܐ ܦܪܥܘܢ ܓܒܪܐ ܚܟܝܡܐ ܘܣܟܘܠܬܢܐ. ܘܢܩܝܡܝܘܗܝ ܥܠ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 34 ܘܢܥܒܪ\f r \fr 41.34\fr* \fk ܘܢܥܒܕ\fk* \ft 5b1, 12b1mg.2, M, L\ft*\f* ܦܪܥܘܢ ܘܢܩܝܡ ܫ̈ܠܝܛܐ ܥܠ ܐܪܥܐ ܕܡܨܪܝܢ\f s \fr 41.34\fr* \fk ܕܡܨܪܝܢ\fk* \ft om. 5b1\ft*\f*. ܘܢܣܒܘܢ ܚܕ ܡܢ ܚܡܫܐ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܒܫܒܥ ܫ̈ܢܝܐ ܕܣܒܥܐ. +\v 35 ܘܢܟ̇ܢܫܘܢ ܟܠܗ ܥܒܘܪܐ\f t \fr 41.35\fr* \fk ܕܐܝܬ\fk* \ft add. 12b2\ft*\f* ܕܫ̈ܢܝܐ ܗܠܝܢ ܛܒ̈ܬܐ ܕܐ̇ܬܝܢ. ܘܢܚܡܠܘܢ ܥܒܘܪܐ ܬܚܝܬ ܐܝܕܐ ܕܦܪܥܘܢ. ܥܒܘܪܐ ܒܩܘܪ̈ܝܐ ܢܛܪܘܢ. +\v 36 ܘܢܗܘܐ ܥܒܘܪܐ ܢܛܝܪ ܠܐܪܥܐ. ܠܫܒܥ ܫ̈ܢܝܐ ܕܟܦܢܐ ܕܢܗ̈ܘܝܢ ܒܐܪܥܐ ܟܠܗ̇\f u \fr 41.36\fr* \fk ܟܠܗ̇\fk* \ft om. 5b1, E, W, M, U, L\ft*\f* ܕܡܨܪܝܢ. ܘܠܐ ܬܣܘܦ ܐܪܥܐ ܒܟܦܢܐ. +\v 37 ܘܫ̣ܦܪ ܦܬܓܡܐ ܒܥܝܢ̈ܝ ܦܪܥܘܢ. ܘܒܥܝܢ̈ܝ ܥܒ̈ܕܘܗܝ. +\v 38 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܥܒ̈ܕܘܗܝ. ܡܫܬܟܚ ܐܝܟ\f v \fr 41.38\fr* \fk ܕ\fk* \ft 10b1\ft*\f* ܗܢܐ ܓܒܪܐ ܕܪܘܚܐ ܕܐܠܗܐ ܐܝܬ ܒܗ. +\v 39 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܡܢ ܒܬܪ ܕܐܘܕܥܟ ܐܠܗܐ\f w \fr 41.39\fr* \fk ܥܠ\fk* \ft add. 8b1\ft*\f* ܗܕܐ ܟܠܗ̇. ܠܝܬ ܕܚܟܝܡ ܘܣܟܘܠܬܢ ܐܟܘܬܟ. +\v 40 ܐܢܬ ܬܗܘܐ ܥܠ ܒܝܬܝ. ܘܥܠ †ܡܠܬ† ܦܘܡܟ ܢܣ̣ܒ ܕܝܢ̣ܐ ܟܠܗ ܥܡܝ. ܒܠܚܘܕ ܟܘܪܣܝܐ ܐܪܒ ܡܢܟ. +\v 41 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܚܙܝ ܕܐܫܠܛܬܟ ܥܠ ܟܠܗ̇ ܐܪܥܐ ܕܡܨܪ̈ܝܢ. +\v 42 ܘܫܩ̣ܠ ܦܪܥܘܢ ܥܙܩܬܗ ܡܢ ܐܝܕܗ. ܘܣܡܗ̇ ܒܐܝܕܗ ܕܝܘܣܦ. ܘܐܠܒܫܗ ܠܒܘܫܐ ܕܒܘܨܐ. ܘܐܪܡܝ ܗܡܢܝܟܐ ܕܕܗܒܐ ܒܨܘܪܗ. +\v 43 ܘܐܘܬܒܗ ܒܡܪܟܒܬܐ\f x \fr 41.43\fr* \fk ܥܠ ܡܪܟܒܬܐ\fk* \ft 8a1*\ft*\f* ܐܚܪܬܐ ܕܝܠܗ. ܘܩ̣ܪܐ ܩܕܡܘܗܝ ܐܒܐ ܘܫܠܝܛܐ. ܘܐܫܠܛܗ ܥܠ ܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 44 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܐܢܐ ܦܪܥܘܢ ܦܩ̇ܕܬ. ܕܒܠܥܕܝܟ ܐܢܫ ܠܐ ܢܪܝܡ ܐܝܕܗ ܘܪܓܠܗ\f y \fr 41.44\fr* \fk ܐܘ ܪܓܠܗ\fk* \ft E, W, M, U, L\ft*\f* ܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 45 ܘܩ̣ܪܐ ܦܪܥܘܢ ܫܡܗ ܕܝܘܣܦ ܨܦܢܬ ܦܥܢܚ ܕܟܣܝ̈ܬܐ ܓܠܝܢ ܠܗ. ܘܝܗ̣ܒ ܠܗ ܠܐܣܝܬ ܒܪܬ ܦܘܛܝܦܪܥ ܟܘܡܪܐ ܕܐܘܢ ܐܢܬܬܐ. ܘܢܦ̣ܩ ܝܘܣܦ ܥܠ ܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 46 ܘܝܘܣܦ ܒܪ ܬܠܬܝܢ ܗܘܐ ܫ̈ܢܝܢ. ܟܕ ܩܡ ܩܕܡ ܦܪܥܘܢ ܡ̇ܠܟܐ ܕܡܨܪܝܢ. ܘܢܦ̣ܩ ܝܘܣܦ ܡܢ ܩܕܡ ܦܪܥܘܢ. ܘܥ̣ܒܪ ܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 47 ܘܚܡ̣ܠܬ ܐܪܥܐ ܒܫܒܥ ܫ̈ܢܝܐ ܕܣܒܥܐ ܒܐܘܨܪ̈ܐ. +\v 48 ܘܚܡ̣ܠ ܟܠܗ ܥܒܘܪܐ ܕܒܫܒܥ\f z \fr 41.48\fr* \fk ܕܫܒܥ\fk* \ft 8a1, E, W, M, U, L\ft*\f* ܫ̈ܢܝܐ ܕܣܒܥܐ\f { \fr 41.48\fr* \fk ܕܣܒܥܐ\fk* \ft om. 5b1\ft*\f* ܕܗ̈ܘܝ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܘܝܗ̣ܒ ܥܒܘܪܐ ܒܩܘܪ̈ܝܐ. ܥܒܘܪܐ ܕܚܩ̈ܠܬܐ ܕܩܪܝܬܐ ܘܕܚܕܪ̈ܝܗ̇ ܚܡܠ ܒܓܘܗ̇. +\v 49 ܘܚܡ̣ܠ ܝܘܣܦ ܥܒܘܪܐ ܐܝܟ ܚܠܐ ܕܝܡܐ. ܣܘܓܐܐ ܕܛܒ ܥܕܡܐ ܕܠܐܝ ܠܡܡܢܐ ܕܠܐ ܡܢܝܢܐ. +\v 50 ܘܠܝܘܣܦ ܐܬܝܠܕܘ ܠܗ ܬܪ̈ܝܢ ܒܢ̈ܝܢ. ܥܕܠܐ ܬܥܘܠ ܫܢܬܐ ܕܟܦܢܐ. ܕܝܠ̣ܕܬ ܠܗ\f | \fr 41.50\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܐܣܝܬ ܒܪܬ ܦܘܛܝܦܪܥ ܟܘܡܪܐ ܕܐܘܢ. +\v 51 ܘܩ̣ܪܐ ܝܘܣܦ ܫܡ ܒܪܗ\f } \fr 41.51\fr* \fk ܒܪܗ\fk* \ft om. 5b1\ft*\f* ܒܘܟܪܗ ܡܢܫܐ. ܡܛܠ ܕܐܢܫܝܢܝ ܐܠܗܐ ܟܠܗ\f ~ \fr 41.51\fr* \fk ܒ\fk* \ft 5b1\ft*\f* ܥܡܠܝ ܘܟܠܗ ܒܝܬ ܐܒܝ. +\v 52 ܘܫܡܗ ܕܐܚܪܢܐ ܩ̣ܪܐ ܐܦܪܝܡ. ܡܛܠ ܕܐܦܪܝܢܝ ܐܠܗܐ ܒܐܪܥܐ ܕܫܘܥܒܕܝ. +\v 53 ܘܓܡ̣ܪ ܫܒܥ ܫܢ̈ܝܐ ܕܣܒܥܐ ܕܗ̈ܘܝ ܒܐܪܥܐ\f  \fr 41.53\fr* \fk ܒܟܘܠܗ̇ ܐܪܥܐ\fk* \ft 8b1\ft*\f* ܕܡܨܪܝܢ. +\v 54 ܘܫ̇ܪܝ ܫܒܥ ܫ̈ܢܝܐ ܕܟܦܢܐ ܠܡܐܬܐ. ܐܝܟ ܕܐܡ̣ܪ ܝܘܣܦ. ܘܗܘ̣ܐ ܟܦܢܐ ܒܟܠܗܝܢ ܐܪ̈ܥܬܐ. ܘܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ ܠܐ ܗܘ̣ܐ ܠܚܡܐ. +\v 55 ܘܟܦܢ̣ܬ ܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. ܘܡܒܓܢܝܢ ܥܡܐ ܥܠ ܦܪܥܘܢ ܥܠ ܠܚܡܐ. ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܟܠܗܘܢ ܡܨܪ̈ܝܐ. ܙܠܘ ܠܘܬ ܝܘܣܦ. ܘܡܕܡ ܕܐܡ̇ܪ ܠܟܘܢ ܬܥܒܕܘܢ. +\v 56 ܘܟܦܢܐ ܗܘ̣ܐ ܥܠ ܐ̈ܦܝ ܟܠܗ̇ ܐܪܥܐ. ܘܦܬ̣ܚ ܝܘܣܦ ܐܘܨܪ̈ܐ. ܘܙܒ̇ܢ ܠܡܨܪ̈ܝܐ. ܘܥܫ̣ܢ ܟܦܢܐ ܒܐܪܥܐ ܕܡܨܪܝܢ. +\v 57 ܘܟܠܗ̇ ܐܪܥܐ ܐܬܘ ܠܡܨܪܝܢ ܠܡܡ̇ܪ\f € \fr 41.57\fr* \fk ܥܒܘܪܐ\fk* \ft add. 8b1\ft*\f* ܡܢ ܝܘܣܦ. ܡܛܠ ܕܥܫܢ ܟܦܢܐ ܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ\f  \fr 41.57\fr* \fk ܕܡܨܪܝܢ\fk* \ft om. 5b1\ft*\f*. +\c 42 +\v 1 ܘܚ̣ܙܐ\f a \fr 42.1\fr* \fk ܘܫܡܥ\fk* \ft 7h5\ft*\f* ܝܥܩܘܒ ܕܐܝܬ ܥܒܘܪܐ ܒܡܨܪܝܢ ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܒܢ̈ܘܗܝ. ܠܐ ܬܕܚܠܘܢ. +\v 2 ܗܐ\f b \fr 42.2\fr* \fk ܗܐ\fk* \ft om. 12a1vid\ft*\f* ܫܡ̇ܥܬ ܕܐܝܬ ܥܒܘܪܐ ܒܡܨܪܝܢ. ܚܘܬܘ ܠܬܡܢ ܘܡܘܪܘ ܠܢ ܡܢ ܬܡ̇ܢ. ܘܢܚ̣ܐ ܘܠܐ ܢܡܘܬ. +\v 3 ܘܢܚܬܘ ܐ̈ܚܘܗܝ ܕܝܘܣܦ ܥܣܪܐ ܠܡܡܪ ܥܒܘܪܐ ܡܢ ܡܨܪܝܢ. +\v 4 ܘܠܒܢܝܡܝܢ ܐܚܘܗܝ ܕܝܘܣܦ. ܠܐ ܫܕܪ ܝܥܩܘܒ ܥܡ ܐܚ̈ܘܗܝ. ܡܛܠ ܕܐܡ̣ܪ ܕܠܡܐ ܢܓܕܫ ܠܗ ܩܐܪܣܐ\f c \fr 42.4\fr* \fk ܩܐܪܚܐ\fk* \ft L\ft*\f*. +\v 5 ܘܐܬܘ ܒܢ̈ܝ ܐܝܣܪܝܠ ܠܡܡܪ ܥܡ ܐܝܠܝܢ ܕܐܙܠܝܢ. ܡܛܠ ܕܥܫ̣ܢ ܟܦܢܐ ܒܐܪܥܐ ܕܟܢܥܢ. +\v 6 ܘܝܘܣܦ ܗܘܝܘ ܫܠܝܛ ܥܠ ܐܪܥܐ. ܘܗ̣ܘ ܡܡܝܪ ܠܟܠܗ ܥܡܐ ܕܐܪܥܐ. ܘܐܬܘ ܐ̈ܚܘܗܝ ܕܝܘܣܦ. ܘܣܓܕܘ ܠܗ ܥܠ ܐ̈ܦܝܗܘܢ ܥܠ ܐܪܥܐ. +\v 7 ܘܚ̣ܙܐ ܝܘܣܦ ܠܐܚ̈ܘܗܝ ܘܐܫܬܘܕܥ ܐܢܘܢ. ܘܐܬܢܟܠ ܥܠܝܗܘܢ. ܘܡܠܠ ܥܡܗܘܢ ܩܫܝܐܝܬ. ܘܐܡ̣ܪ ܠܗܘܢ. ܡܢ\f d \fr 42.7\fr* \fk ܡܢ\fk* \ft om. 5b1\ft*\f* ܐܝܡܟܐ ܐܢܬܘܢ. ܘܐܡܪܘ ܡܢ ܐܪܥܐ ܕܟܢܥܢ ܐܬܝܢ ܠܡܡܪ ܥܒܘܪܐ. +\v 8 ܘܐܫܬܘܕܥ ܝܘܣܦ ܠܐܚ̈ܘܗܝ\f e \fr 42.8\fr* \fk ܘܐܫܬܘܕܥ ܝܘܣܦ ܠܐܚ̈ܘܗܝ\fk* \ft om. 12a1*\ft*\f*. ܘܗ̣ܢܘܢ ܠܐ ܐܫܬܘܕܥܘܗܝ\f f \fr 42.8\fr* \fk ܘܗ̣ܢܘܢ ܠܐ ܐܫܬܘܕܥܘܗܝ\fk* \ft om. 12a1*\ft*\f*. +\v 9 ܘܐܬܕܟܪ ܝܘܣܦ ܚ̈ܠܡܐ ܕܚ̣ܠܡ ܠܗܘܢ. ܘܐܡܪ ܠܗܘܢ ܓܫ̈ܘܫܐ ܐܢܬܘܢ. ܘܠܡܚܙܐ ܗܘ\f g \fr 42.9\fr* \fk ܗܘ\fk* \ft om. 5b1\ft*\f* ܛܒܗ̇ ܕܐܪܥܐ ܐܬܝܬܘܢ. +\v 10 ܘܐܡܪܘ\f h \fr 42.10\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f* ܠܐ ܡܪܢ. ܥܒ̈ܕܝܟ ܐܬܘ ܠܡܡܪ ܥܒܘܪܐ. +\v 11 ܟܠܢ ܒܢ̈ܝ ܚܕ ܚܢܢ ܓܒܪ. ܘܟܐ̈ܢܐ ܚܢܢ. ܘܠܐ ܗܘܘ ܓܫ̈ܘܫܐ ܥܒ̈ܕܝܟ. +\v 12 ܐܡ̇ܪ ܠܗܘܢ ܝܘܣܦ\f i \fr 42.12\fr* \fk ܝܘܣܦ\fk* \ft om. 5b1\ft*\f*. ܠܐ ܗܘܐ\f j \fr 42.12\fr* \fk ܗܘܐ\fk* \ft om. 5b1\ft*\f* ܗܟܢܐ. ܛܒܗ̇ ܗܘ ܕܐܪܥܐ ܐܬܝܬܘܢ ܠܡܚܙܐ. +\v 13 ܘܐܡ̣ܪܘ ܠܗ. ܬܪ̈ܥܣܪ ܚܢܢ ܐܚ̈ܐ ܥܒ̈ܕܝܟ ܒܢܝ̈ ܓܒܪܐ ܚܕ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܙܥܘܪܐ ܗܐ ܠܘܬ ܐܒܘܢ ܗܘ ܝܘܡܢܐ. ܘܚܕ ܠܝܬܘܗܝ. +\v 14 ܐܡ̇ܪ ܠܗܘܢ ܝܘܣܦ\f k \fr 42.14\fr* \fk ܝܘܣܦ\fk* \ft om. 7h5\ft*\f*. ܗܢܘ ܕܐܡ̇ܪܬ ܠܟܘܢ. ܓܫ̈ܘܫܐ ܐܢܬܘܢ. +\v 15 ܒܗܕܐ ܬܬܒܩܘܢ. ܠܐ ܚܝ̈ܘܗܝ ܕܦܪܥܘܢ ܠܐ ܬܦܩܘܢ ܡܟܐ. ܐܠܐ ܐܢ ܐܬ̣ܐ ܐܚܘܟܘܢ ܙܥܘܪܐ ܠܗܪܟܐ. +\v 16 ܫܕܪܘ ܚܕ ܡܢܟܘܢ ܢܕܒܪ ܠܐܚܘܟܘܢ. ܘܐܢܬܘܢ ܐܬܐܣܪܘ. ܘܢܬܒܩܝܢ ܡ̈ܠܝܟܘܢ ܐܢ ܒܩܘܫܬܐ ܐܡܪܬܘܢ. ܘܐܠܐ ܚܝ̈ܘܗܝ ܕܦܪܥܘܢ. ܐܠܐ ܓܫܘ̈ܫܐ ܐܢܬܘܢ. +\v 17 ܘܐܪܡܝ ܐܢܘܢ ܒܝܬ ܚܒܘܫܝܐ ܬܠܬܐ ܝܘܡ̈ܝܢ. +\v 18 ܘܐܡ̣ܪ ܠܗܘܢ ܝܘܣܦ\f l \fr 42.18\fr* \fk ܠܐ̈ܚܘܗܝ\fk* \ft add. 5b1\ft*\f* ܒܝܘܡܐ ܬܠܝܬܝܐ. ܗܕܐ ܥܒ̣ܕܘ ܘܚܝܘ. ܠܐܠܗܐ ܕܚ̇ܠ ܐܢܐ. +\v 19 ܐܢ ܟܐ̈ܢܐ ܐܢܬܘܢ ܐܚܘܟܘܢ ܚܕ ܢܬܐܣܪ ܒܝܬ ܚܒܘܫܝܟܘܢ. ܘܐܢܬܘܢ ܙܠܘ ܐܘܒܠܘ ܥܒܘܪܐ ܠܟܦܢ̈ܐ ܕܐܝܬ ܒܒ̈ܬܝܟܘܢ\f m \fr 42.19\fr* \fk ܕܒܒ̈ܬܝܟܘܢ\fk* \ft 5b1\ft*\f*. +\v 20 ܘܠܐܚܘܟܘܢ ܙܥܘܪܐ ܐܝܬܘ ܠܘܬܝ\f n \fr 42.20\fr* \fk ܠܝ\fk* \ft 5b1\ft*\f*. ܘܢܬܗܝܡܢܢ ܡ̈ܠܝܟܘܢ ܘܠܐ ܬܡܘܬܘܢ. ܘܥܒ̣ܕܘ ܗܟܢܐ. +\v 21 ܘܐܡܪܘ ܓܒܪ ܠܐܚܘܗܝ. ܫܪܝܪܐܝܬ ܚܝ̇ܒܝܢܢ ܥܠ ܐܚܘܢ. ܕܚ̣ܙܝܢ ܒܛܘܪܦܐ ܕܢܦܫܗ. ܟܕ ܡܬܟܫܦ ܗܘܐ ܠܢ ܘܠܐ ܫܡܥܢܝܗܝ. ܡܛܠ ܗܢܐ ܐܬܬ ܥܠܝܢ ܥܩܬܐ ܗܕܐ. +\v 22 ܘܥܢ̣ܐ ܪܘܒܝܠ ܘܐܡ̣ܪ ܠܗܘܢ. ܠܐ ܐܡ̇ܪܬ ܠܟܘܢ\f o \fr 42.22\fr* \fk ܠܟܘܢ\fk* \ft om. 5b1\ft*\f* ܕܠܐ ܬܚܛܘܢ ܒܛܠܝܐ. ܘܠܐ ܫܡܥܬܘܢ. ܘܐܦ ܕܡܗ ܗܐ ܡܬܬܒܥ. +\v 23 ܘܗ̣ܢܘܢ ܠܐ ܝܕܥܝܢ ܗܘܘ ܕܫܡ̇ܥ ܝܘܣܦ. ܡܛܠ ܕܬܪܓܡܢܐ ܩܐܡ ܗܘܐ ܒܝܢܬܗܘܢ. +\v 24 ܘܐܬܦܢܝ ܡܢ ܠܘܬܗܘܢ ܘܒܟ̣ܐ. ܘܗ̣ܦܟ ܠܘܬܗܘܢ ܘܡܠܠ ܥܡܗܘܢ. ܘܕܒ̣ܪ ܡܢܗܘܢ ܠܫܡܥܘܢ ܘܐܣܪܗ ܠܥܢܝ̈ܗܘܢ. +\v 25 ܘܦܩ̣ܕ ܝܘܣܦ ܘܡܠܘ ܡܐ̈ܢܝܗܘܢ ܥܒܘܪܐ. ܘܠܡܗܦܟܘ †ܟܣܦܗܘܢ† ܓܒܪ ܒܣܩܗ. ܘܠܡܬܠ ܠܗܘܢ ܙܘ̈ܕܐ ܠܐܘܪܚܐ. ܘܥܒܕܘ ܠܗܘܢ ܗܟܢܐ. +\v 26 ܘܫ̣ܩܠܘ ܥܒܘܪܗܘܢ ܥܠ ܚܡܪܗܘܢ ܘܐܙܠܘ ܡܢ ܬܡ̇ܢ. +\v 27 ܘܦܬ̣ܚ ܚܕ ܡܢܗܘܢ ܣܩܗ ܠܡܪܡܝܘ ܟܣܬܐ ܠܚܡܪܗ ܒܝܬ ܒܘܬܐ. ܘܚ̣ܙܐ [-]\f p \fr 42.27\fr* \fk ܘܗܐ\fk* \ft 7a1, 8a1*\ft*\f* ܟܣܦܗ ܣܝܡ\f q \fr 42.27\fr* \fk ܕ\fk* \ft 5b1\ft*\f* ܒܦܘܡ ܛܥܢܗ. +\v 28 ܘܐܡ̣ܪ ܠܐ̈ܚܘܗܝ. ܐܬܦܢܝ ܟܣܦܝ. ܘܗܐ ܗ̣ܘ ܒܦܘܡ ܛܥܢܝ. ܘܙܥ ܠܒܗܘܢ. ܘܬܡܗܘ ܓܒܪ ܒܐܚܘܗܝ ܘܐܡܪܘ. ܡܢܐ ܗܝ ܗܕܐ ܕܥܒ̣ܕ ܠܢ ܐܠܗܐ. +\v 29 ܘܐܬܘ ܠܘܬ ܝܥܩܘܒ ܐܒܘܗܘܢ ܠܐܪܥܐ ܕܟܢܥܢ. ܘܚܘܝܘܗܝ ܟܠ ܕܓ̣ܕܫ ܠܗܘܢ. ܘܐܡܪܘ ܠܗ\f r \fr 42.29\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. +\v 30 ܡܠܠ ܓܒܪܐ ܡܪܗ̇ ܕܐܪܥܐ ܥܡܢ ܩܫܝܐܝܬ. ܘܚܫܒܢ ܐܝܟ ܓܫܘ̈ܫܐ ܕܐܪܥܐ. +\v 31 ܘܐܡܪܢ ܠܗ. ܟܐ̈ܢܐ\f s \fr 42.31\fr* \fk ܕ\fk* \ft 7h5\ft*\f* ܚܢܢ ܘܠܐ ܗܘ̣ܝܢ ܓܫ̈ܘܫܐ. +\v 32 ܬܪ̈ܥܣܪ ܚܢܢ ܐܚܝ̈ܢ ܒܢ̈ܝ ܐܒܘܢ. ܘܚܕ ܠܝܬܘܗܝ. ܘܙܥܘܪܐ\f t \fr 42.32\fr* \fk ܗܘ\fk* \ft add. 12b2\ft*\f* ܠܘܬ ܐܒܘܢ ܗܘ ܝܘܡܢܐ ܒܐܪܥܐ ܕܟܢܥܢ. +\v 33 ܘܐܡ̣ܪ ܠܢ ܓܒܪܐ ܡܪܗ̇ ܕܐܪܥܐ. ܒܗܕܐ ܐܕܥ ܕܟܐ̈ܢܐ ܐܢܬܘܢ. ܐܚܘܟܘܢ ܚܕ ܫܒܘܩܘ ܠܘܬܝ. ܘܥܒܘܪܐ ܠܟܦ̈ܢܐ ܕܒܒ̈ܬܝܟܘܢ ܣܒܘ ܘܙܠܘ. +\v 34 ܘܐܝܬܘ ܠܐܚܘܟܘܢ ܙܥܘܪܐ ܠܘܬܝ. ܘܐܕܥ ܕܠܐ ܗܘܝܬܘܢ ܓܫܘ̈ܫܐ. ܐܠܐ ܟܐ̈ܢܐ ܐܢܬܘܢ. ܘܠܐܚܘܟܘܢ ܐܬܠ ܠܟܘܢ ܘܒܐܪܥܐ ܬܬ̇ܓܪܘܢ. +\v 35 ܘܗܘ̣ܐ ܕܟܕ ܗ̣ܢܘܢ ܡܣܪܩܝܢ\f u \fr 42.35\fr* \fk ܡܣܦܩܝܢ\fk* \ft 5b1\ft*\f* ܣܩ̈ܝܗܘܢ ܗܐ ܨܪܪܐ ܕܟܣܦܗ ܕܓܒܪܐ ܒܦܘܡ ܛܥܢܗ. ܘܚܙܘ ܨܪ̈ܪܝ ܟܣܦܗܘܢ ܗ̣ܢܘܢ ܘܐܒܘܗܘܢ ܘܕܚܠܘ. +\v 36 ܐܡ̇ܪ ܠܗܘܢ ܝܥܩܘܒ ܐܒܘܗܘܢ. ܠܝ ܓܙܝ̣ܬܘܢ. ܝܘܣܦ ܠܝܬܘܗܝ. ܘܫܡܥܘܢ ܠܝܬܘܗܝ. ܘܠܒܢܝܡܝܢ ܬܕܒܪܘܢ. ܥܠܝ ܫ̣ܠܡ ܟܠܗܝܢ. +\v 37 ܘܐܡ̣ܪ ܪܘܒܝܠ ܠܐܒܘܗܝ. ܠܬܪ̈ܝܢ\f v \fr 42.37\fr* \fk ܬܪ̈ܝܢ\fk* \ft 12b1\ft*\f* ܒܢ̈ܝ ܬܡܝܬ ܐܠܐ ܐܝܬܝܘܗܝ ܠܟ. ܐܫܠܡܝܗܝ ܠܝ\f w \fr 42.37\fr* \fk ܗܒܝܗܝ ܥܠ ܐܝ̈ܕܝ\fk* \ft 5b1\ft*\f* ܘܐܢܐ ܐܗܦܟܝܘܗܝ ܠܟ. +\v 38 ܘܐܡ̣ܪ ܠܐ ܢܚ̇ܬ ܒܪܝ ܥܡܟܘܢ. ܡܛܠ ܕܐܚܘܗܝ ܡܝܬ. ܘܗ̣ܘ ܒܠܚܘܕܘܗܝ ܐܫܬܚܪ ܠܐܡܗ\f x \fr 42.38\fr* \fk ܠܐܡܗ\fk* \ft om. 5b1\ft*\f*. ܘܢܓܕܫ ܠܗ ܩܐܪܣܐ\f y \fr 42.38\fr* \fk ܘܢܐܪܥܝܘܗܝ ܣܩܘܒܠܐ\fk* \ft 5b1\ft*\f*. ܒܐܘܪܚܐ ܕܬܐܙܠܘܢ\f z \fr 42.38\fr* \fk ܒܗ̇\fk* \ft add. 5b1\ft*\f*. ܘܬܚܬܘܢ ܣܝܒܘܬܝ ܒܕܐܘܘܢܐ ܠܫܝܘܠ. +\c 43 +\v 1 ܘܟܦܢܐ ܥܫ̣ܢ ܒܐܪܥܐ. +\v 2 ܘܟܕ ܓܡ̇ܪܘ ܠܡܐܟܠ ܥܒܘܪܐ ܕܐܝܬܝܘ ܡܢ ܡܨܪܝܢ. ܐܡ̣ܪ ܠܗܘܢ ܝܥܩܘܒ ܐܒܘܗܘܢ. ܚܘܬܘ ܡܘܪܘ ܠܢ ܩܠܝܠ ܥܒܘܪܐ. +\v 3 ܐܡ̇ܪ ܠܗ ܝܗܘܕܐ. ܡܣ̇ܗܕܘ ܣ̇ܗܕ ܒܢ ܓܒܪܐ ܘܐܡ̣ܪ. ܠܐ ܬܚܙܘܢ ܐ̈ܦܝ ܐܠܐ ܟܕ ܐܚܘܟܘܢ ܥܡܟܘܢ. +\v 4 ܐܢ ܡܫܕܪ ܐܢܬ ܠܐܚܘܢ ܥܡܢ. ܢܚܘܬ ܘܢܡܘܪ ܠܢ ܥܒܘܪܐ. +\v 5 ܘܐܢ ܠܐ ܡܫܕܪ ܐܢܬ. ܠܐ ܢܚܬܝܢܢ. ܡܛܠ ܕܓܒܪܐ ܐܡ̣ܪ ܠܢ. †ܕܠܐ†\f a \fr 43.5\fr* \fk ܠܐ\fk* \ft 5b1, 7a1, 12b2\ft*\f* ܬܚܙܘܢ ܐ̈ܦܝ. ܐܠܐ ܟܕ ܐܚܘܟܘܢ ܥܡܟܘܢ. +\v 6 ܐܡ̇ܪ ܠܗܘܢ\f b \fr 43.6\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f* ܐܝܣܪܝܠ ܐܒܘܗܘܢ\f c \fr 43.6\fr* \fk ܐܒܘܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܠܡܢܐ ܐܒܐܫܬܘܢ ܠܝ ܘܚܘܝܬܘܢ ܠܓܒܪܐ ܐܢ ܐܝܬ\f d \fr 43.6\fr* \fk ܕܐܝܬ\fk* \ft L\ft*\f* ܠܟܘܢ ܐܚܐ. +\v 7 ܘܐܡܪܘ ܡܫܐܠܘ ܫܐ̇ܠ ܓܒܪܐ ܥܠܝܢ ܘܥܠ ܫܪܒܬܢ. ܘܐܡ̣ܪ ܥܕܟܝܠ ܐܒܘܟܘܢ ܚܝ. ܘܐܝܬ ܠܟܘܢ ܐܚܐ. ܘܚܘܝܢܝܗܝ ܡܛܠ ܡ̈ܠܐ ܗܠܝܢ. ܡܕܥ\f e \fr 43.7\fr* \fk ܓܝܪ\fk* \ft add. 11.10g1, 12b2\ft*\f* ܝܕܥܝܢ ܗܘܝܢ ܕܐܡ̇ܪ\f f \fr 43.7\fr* \fk ܠܢ\fk* \ft add. E, W, M, U, L\ft*\f* ܐܚܬܘ\f g \fr 43.7\fr* \fk ܐܝܬܘ\fk* \ft 12a1\ft*\f* ܠܐܚܘܟܘܢ. +\v 8 ܘܐܡ̣ܪ ܝܗܘܕܐ ܠܐܝܣܪܝܠ ܐܒܘܗܝ. ܫܕܪ ܛܠܝܐ ܥܡܢ. ܘܢܩܘܡ ܘܢܐܙܠ ܘܢܚ̣ܐ ܘܠܐ ܢܡܘܬ. ܐܦ ܚܢܢ ܐܦ ܐܢܬ ܐܦ ܝܩܪܬܢ. +\v 9 ܐܢܐ ܥ̇ܪܒ ܐܢܐ ܒܗ. ܡܢ ܐ̈ܝܕܝ ܬܒܥܝܗܝ. ܐܢ ܠܐ ܐܝܬܝܘܗܝ ܠܟ ܘܐܩܝܡܝܘܗܝ ܩܕܡܝܟ. ܐܚܛܐ ܠܐܒܝ ܟܠܗܘܢ ܝܘܡ̈ܬܐ. +\v 10 ܘܐܦ ܐܠܘ\f h \fr 43.10\fr* \fk ܘܐܠܘ\fk* \ft 5b1\ft*\f* ܠܐ ܐܫܬܘܚܪܢ. ܟܒܪ ܕܝܢ ܗܦܟܢ ܕܬܪ̈ܬܝܢ\f i \fr 43.10\fr* \fk ܬܪ̈ܬܝܢ\fk* \ft 5b1\ft*\f* ܙܒ̈ܢܝܢ. +\v 11 ܘܐܡ̣ܪ ܠܗܘܢ ܐܝܣܪܝܠ ܐܒܘܗܘܢ. ܐܢ ܗܟܢܐ ܗܘ ܗܕܐ ܥܒܕܘ. ܣܒܘ ܡܢ ܛܘܒܗ̇ ܕܐܪܥܐ ܒܡܐ̈ܢܝܟܘܢ. ܘܐܚܬܘ ܠܓܒܪܐ ܩܘܪܒܢܐ. ܩܠܝܠ ܨܪܘܐ ܘܩܠܝܠ ܕܒܫܐ. ܘܐܪ̈ܗܛܢܐ ܘܠܛܡ̈ܐ. ܘܒܛܡ̈ܐ ܘܫܓܪ̈ܐ\f j \fr 43.11\fr* \fk ܘܫܓ̈ܕܐ\fk* \ft M, L\ft*\f*. +\v 12 ܘܟܣܦܐ ܐܥܦܐ ܣܒܘ ܒܐ̈ܝܕܝܟܘܢ. ܘܟܣܦܐ ܕܗ̣ܦܟ ܒܦܘܡ ܛܥܢܝ̈ܟܘܢ ܐܗܦܟܘ ܒܐ̈ܝܕܝܟܘܢ ܕܠܡܐ ܛܘܥܝܝ ܗܝ. +\v 13 ܘܠܐܚܘܟܘܢ ܕܒܪܘ. ܘܩܘܡܘ ܘܗܦܘܟܘ ܠܘܬ ܓܒܪܐ. +\v 14 ܘܐܝܠܫܕܝ ܢܬܠܟܘܢ\f k \fr 43.14\fr* \fk ܢܬܠ ܠܟܘܢ\fk* \ft U\ft*\f* ܠܪ̈ܚܡܐ ܩܕܡ ܓܒܪܐ. ܘܢܫܕܪ ܥܡܟܘܢ ܠܐܚܘܟܘܢ ܐܚܪܢܐ ܘܠܒܢܝܡܝܢ. ܘܐܢܐ ܐܝܟ ܕܓܙܝ̇ܬ ܓܙܝ̇ܬ. +\v 15 ܘܢܣܒܘ ܓܒܪ̈ܐ ܩܘܪܒܢܐ ܗܢܐ. †ܘܐܥܦܐ ܕܟܣܦܐ† ܢܣܒܘ ܒܐ̈ܝܕܝܗܘܢ. ܘܕܒ̣ܪܘ ܥܡܗܘܢ ܠܒܢܝܡܝܢ. †ܘܩܡܘ ܘܢܚܬܘ ܠܡܨܪܝܢ†\f l \fr 43.15\fr* \fk †ܘܩܡܘ ܘܢܚܬܘ ܠܡܨܪܝܢ†\fk* \ft om. 7a1\ft*\f*. ܘܩܡܘ ܩܕܡ ܝܘܣܦ. +\v 16 ܘܚ̣ܙܐ ܝܘܣܦ\f m \fr 43.16\fr* \fk ܝܘܣܦ\fk* \ft om. 8a1*\ft*\f* ܥܡܗܘܢ ܠܒܢܝܡܝܢ. ܘܐܡ̣ܪ ܠܪܒܝܬܗ. ܐܥܠ ܓܒܪ̈ܐ ܠܒܝܬܐ. ܘܟܘܣ ܢܟܣܬܐ ܘܬ̇ܩܢ. ܡܛܠ ܕܥܡܝ ܐܟܠܝܢ ܓܒܪ̈ܐ ܒܛܗܪܐ. +\v 17 ܘܥܒ̣ܕ ܥܒ̣ܕܐ\f n \fr 43.17\fr* \fk ܓܒܪܐ\fk* \ft 5b1, 8b1\ft*\f* ܐܝܟ ܕܐܡ̣ܪ ܝܘܣܦ. ܘܐܥܠ ܐܢܘܢ ܠܓܒܪ̈ܐ ܠܒܝܬ ܝܘܣܦ. +\v 18 ܘܕܚܠܘ\f o \fr 43.18\fr* \fk ܓܒܪ̈ܐ\fk* \ft add. 5b1\ft*\f* ܟܕ ܡܥܠܝܢ ܠܗܘܢ ܠܒܝܬ ܝܘܣܦ. ܘܐܡܪܘ ܡܛܠ ܟܣܦܐ ܕܗ̣ܦܟ ܒܛܥܢܝ̈ܢ ܒܩܕܡܝܬܐ. ܡܥܠܝܢ ܠܢ. ܠܡܬܪܘܪܒܘ ܥܠܝܢ ܘܠܡܬܢܟܠܘ ܥܠܝܢ. ܕܢܥܒܕܘܢܢ ܥܒ̈ܕܐ ܘܠܚܡܪܢ. +\v 19 ܘܩ̣ܪܒܘ ܠܘܬ ܓܒܪܐ ܪܒܝܬܗ ܕܝܘܣܦ. ܘܡܠܠܘ ܥܡܗ ܒܬܪܥܐ ܕܒܝܬܐ. +\v 20 ܘܐܡܪܘ ܠܗ\f p \fr 43.20\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܒܥܝܢܢ\f q \fr 43.20\fr* \fk ܡܢܟ\fk* \ft add. 5b1\ft*\f* ܡܪܢ. ܡܚܬ ܢܚܬܢ ܒܩܕܡܝܬܐ ܠܡܡܪ ܥܒܘܪܐ. +\v 21 ܘܟܕ ܐܙܠܢ ܠܒܝܬ ܒܘܬܐ ܦܬܚܢ ܛܥܢܝ̈ܢ. ܘܗܐ ܟܣܦܗ ܕܓܒܪܐ ܒܦܘܡ ܛܥܢܗ. ܟܣܦܢ ܒܡܬܩܠܗ ܐܗܦܟܢܝܗܝ ܒܐܝܕܢ. +\v 22 ܘܟܣܦܐ ܐܚܪܢܐ ܐܚܬܢ ܒܐܝܕܢ ܠܡܡܪ ܥܒܘܪܐ. ܠܐ ܝܕܥܢ ܡܢܘ ܣܡ ܟܣܦܢ ܒܦܘܡ ܛܥܢܝ̈ܢ. +\v 23 †ܐܡܪ† ܠܗܘܢ ܫ̣ܠܡ ܠܟܘܢ ܠܐ ܬܕܚܠܘܢ. ܐܠܗܟܘܢ\f r \fr 43.23\fr* \fk ܐܠܗܟܘܢ\fk* \ft om. 12b1\ft*\f* ܐܠܗܐ ܕܐܒܘܟܘܢ ܣܡ ܠܟܘܢ ܣܝܡܬܐ ܒܛܥܢܝ̈ܟܘܢ. ܟܣܦܟܘܢ ܥܠ ܠܘܬܝ. ܘܐܦܩ ܠܘܬܗܘܢ ܠܫܡܥܘܢ. +\v 24 ܘܐܥܠ ܥܒ̣ܕܐ ܓܒܪ̈ܐ\f s \fr 43.24\fr* \fk ܠ\fk* \ft 5b1, L\ft*\f* ܠܒܝܬ\f t \fr 43.24\fr* \fk ܠܘܬ\fk* \ft U\ft*\f* ܝܘܣܦ. ܘܝܗ̣ܒ ܡ̈ܝܐ ܘܐܫܝܓܘ ܪ̈ܓܠܝܗܘܢ. ܘܐܪܡܝ ܟܣܬܐ ܠܒܥܝܪܗܘܢ. +\v 25 ܘܬ̇ܩܢܘ\f u \fr 43.25\fr* \fk ܓܒܪ̈ܐ\fk* \ft add. E, W, M, U, L\ft*\f* ܩܘܪܒܢܐ ܥܕ ܥܐܠ ܝܘܣܦ ܒܛܗܪܐ. ܡܛܠ ܕܫܡܥܘ ܕܬܡ̇ܢ ܐ̇ܟܠܝܢ ܠܚܡܐ. +\v 26 ܘܥܠ ܝܘܣܦ\f v \fr 43.26\fr* \fk ܒܛܗܪܐ\fk* \ft add. 11.10g1*\ft*\f* ܠܒܝܬܐ. ܘܐܝܬܝܘ ܠܗ\f w \fr 43.26\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܩܘܪܒܢܐ ܕܒܐ̈ܝܕܝܗܘܢ ܠܒܝܬܐ. ܘܣ̣ܓܕܘ ܠܗ ܥܠ ܐܪܥܐ. +\v 27 ܘܫܐ̣ܠ ܒܫܠܡܗܘܢ ܘܐܡ̣ܪ ܠܗܘܢ\f x \fr 43.27\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܫܠ̣ܡ ܗ̣ܘ ܐܒܘܟܘܢ ܣܒܐ ܕܐܡܪܬܘܢ ܠܝ\f y \fr 43.27\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f*. ܥܕܟܝܠ ܚܝ ܗܘ. +\v 28 ܘܐܡܪܘ ܫܠܡ ܗܘ ܥܒܕܟ ܐܒܘܢ. ܘܐܡ̣ܪܘ ܠܗ\f z \fr 43.28\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܥܕܟܝܠ\f { \fr 43.28\fr* \fk ܘܥܕܟܝܠ\fk* \ft L\ft*\f* ܚܝ ܗ̣ܘ. ܘܩܥܕܘ ܘܣܓܕܘ. +\v 29 ܘܐܪܝܡ ܥܝܢ̈ܘܗܝ ܘܚ̣ܙܐ ܠܒܢܝܡܝܢ ܐܚܘܗܝ\f | \fr 43.29\fr* \fk ܐܚܘܗܝ\fk* \ft om. 5b1\ft*\f* ܒܪ ܐܡܗ ܘܐܡ̣ܪ ܠܗܘܢ\f } \fr 43.29\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܗܢܘ ܐܚܘܟܘܢ ܙܥܘܪܐ ܕܐܡܪܬܘܢ ܠܝ. ܘܐܡ̣ܪ ܐܠܗܐ ܢܪܚܡ ܥܠܝܟ ܒܪܝ. +\v 30 ܘܐܣܬܪܗܒ ܝܘܣܦ ܡܛܠ ܕܓܠܘ ܪ̈ܚܡܘܗܝ ܥܠ ܐܚܘܗܝ. ܘܒܥ̣ܐ ܠܡܒܟܐ. ܘܥܠ ܠܬܘܢܐ ܘܒܟ̣ܐ ܬܡܢ. +\v 31 ܘܐܫܝܓ ܐ̈ܦܘܗܝ ܘܢܦ̣ܩ ܘܚܡܣܢ. ܘܐܡ̣ܪ ܕܢܣܝܡܘܢ ܠܗܘܢ\f ~ \fr 43.31\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1, M\ft*\f* ܠܚܡܐ. +\v 32 ܘܣܡܘ ܠܗ ܒܠܚܘܕܘܗܝ ܘܠܗܘܢ ܒܠܚܘܕܝܗܘܢ. ܘܠܡܨܪ̈ܝܐ ܕܐܟܠܝܢ ܥܡܗ ܒܠܚܘܕܝܗܘܢ. ܡܛܠ ܕܠܐ ܡܫܟܚܝܢ ܡܨܪ̈ܝܐ ܠܡܐܟܠ ܠܚܡܐ ܥܡ ܥܒܪ̈ܝܐ. ܡܛܠ ܕܛܡܐܘܬܐ ܗܝ ܠܡܨܪ̈ܝܐ. +\v 33 ܘܐܣܬܡܟܘ ܩܕܡܘܗܝ. ܩܫܝܫܐ ܐܝܟ ܩܫܝܫܘܬܗ. ܘܙܥܘܪܐ ܐܝܟ ܙܥܘܪܘܬܗ. ܘܬܡܗܘ ܓܒܪ̈ܐ ܓܒܪ ܒܚܒܪܗ. +\v 34 ܘܫܩܠܘ ܠܗܘܢ ܫܩ̈ܠܐ ܡܢ ܩܕܡܘܗܝ. ܘܣܓܝ ܫܩܠܗ ܕܒܢܝܡܝܢ ܡܢ ܫܩ̈ܠܐ ܕܟܠܗܘܢ ܚܡܫ ܡ̈ܢܘܢ\f  \fr 43.34\fr* \fk ܙܒܢ̈ܝܢ\fk* \ft 12b1txt\ft*\f*. ܘܐܫܬܝܘ ܘܪܘܝܘ ܥܡܗ. +\c 44 +\v 1 ܘܦܩ̇ܕ ܠܪܒ ܒܝܬܗ ܘܐܡ̣ܪ. ܡܠ̣ܝ ܛܥܢܝ̈ܗܘܢ ܕܓܒܪ̈ܐ ܥܒܘܪܐ ܟܡܐ\f a \fr 44.1\fr* \fk ܐܝܟ\fk* \ft 5b1\ft*\f* ܕܡܫܟܚܝܢ ܠܡܫܩܠ. ܘܣܝܡ ܟܣܦܗ ܕܓܒܪܐ ܒܦܘܡ ܛܥܢܗ. +\v 2 ܘܣܒ ܐܣܩܦܐ ܕܝܠܝ\f b \fr 44.2\fr* \fk ܕܝܠܝ\fk* \ft om. 9b1*\ft*\f* ܕܣܐܡܐ\f c \fr 44.2\fr* \fk ܕܟܣܦܐ\fk* \ft 5b1\ft*\f*. ܘܣܝܡ ܒܦܘܡ ܛܥܢܗ ܕܙܥܘܪܐ ܘܟܣܦ ܡܝܪܗ\f d \fr 44.2\fr* \fk ܘܟܣܦ ܡܝܪܗ\fk* \ft om. 12a1*\ft*\f*. ܘܥܒ̣ܕ ܥܒ̣ܕܐ\f e \fr 44.2\fr* \fk ܪܒܝܬܗ\fk* \ft 5b1\ft*\f* ܐܝܟ ܡܠܬܗ ܕܝܘܣܦ\f f \fr 44.2\fr* \fk ܕܐܡܪ\fk* \ft add. 5b1\ft*\f*. +\v 3 ܘܟܕ ܗܘ̣ܐ ܫܦܪܐ\f g \fr 44.3\fr* \fk ܨܦܪܐ\fk* \ft 5b1\ft*\f*. ܐܫܬܪܝܘ ܓܒܪ̈ܐ †[ܠܡܐܙܠ\f g \fr 44.3\fr* \fk †[ܠܡܐܙܠ\fk* \ft om. 5b1\ft*\f* ܗ̣ܢܘܢ ܘܚܡܪܗܘܢ\f h \fr 44.3\fr* \fk ܘܒܥܝܪܗܘܢ†\fk* \ft 8b1\ft*\f*. +\v 4 ܗ̣ܢܘܢ ܢܦܩܘ ܡܢ ܩܪܝܬܐ ܘܠܐ ܐܪܚܩܘ. ܘܝܘܣܦ ܐܡ̣ܪ ܠܪܒܝܬܗ. ܩܘܡ ܪܕܘܦ ܒܬܪ ܓܒܪ̈ܐ ܘܐܕܪܟ ܐܢܘܢ. ܘܐܡ̣ܪ ܠܗܘܢ. ܠܡܢܐ ܦܪܥܬܘܢ ܒܝܫܬܐ ܚܠܦ ܛܒܬܐ. +\v 5 ܗܢܐ ܐܣܩܦܐ ܕܫ̇ܬܐ ܒܗ ܡܪܝ. ܘܐܦ ܡ̇ܢܚܫܘ ܡ̇ܢܚܫ ܒܗ. ܐܒܐܫܬܘܢ ܒܡܕܡ ܕܥܒܕܬܘܢ. +\v 6 ܘܐܕܪܟ ܐܢܘܢ ܘܐܡ̣ܪ ܠܗܘܢ ܐܝܟ ܡ̈ܠܐ ܗܠܝܢ. +\v 7 ܐܡܪܝܢ ܠܗ\f i \fr 44.7\fr* \fk ܘܐܡܪܘ\fk* \ft 5b1\ft*\f*. ܠܐ ܢܐܡܪ ܡܪܢ ܡ̈ܠܐ ܗܠܝܢ. ܚܣ ܠܥܒ̈ܕܝܟ ܠܡܥܒܕ ܦܬܓܡܐ ܗܢܐ\f j \fr 44.7\fr* \fk ܕܢܥܒܕܘܢ ܗܟܢܐ\fk* \ft 5b1\ft*\f*. +\v 8 ܗܐ ܟܣܦܐ ܕܐܫܟܚܢ ܒܦܘܡ ܛܥܢܝ̈ܢ. ܐܗܦܟܢܝܗܝ ܡܢ ܐܪܥܐ ܕܟܢܥܢ. ܐܝܟܢܐ ܓܢܒܝܢ ܗܘܝܢ ܡܢ ܒܝܬ ܡܪܟ ܕܗܒܐ ܐܘ ܣܐܡܐ\f k \fr 44.8\fr* \fk ܟܣܦܐ\fk* \ft 5b1\ft*\f*. +\v 9 ܡ̇ܢ ܕܢܫܬܟܚ ܠܘܬܗ ܡܢ ܥܒ̈ܕܝܟ ܢܡܘܬ. ܘܚܢܢ ܢܗܘܐ ܥܒ̈ܕܐ ܠܡܪܢ. +\v 10 ܐܡ̇ܪ ܠܗܘܢ\f l \fr 44.10\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܐܦ ܗܫܐ ܐܝܟ ܡܠܬܟܘܢ ܗܟܢܐ\f m \fr 44.10\fr* \fk ܢܥܒܕ\fk* \ft add. 5b1\ft*\f*. ܡ̇ܢ ܕܢܫܬܟܚ ܠܘܬܗ. ܗ̣ܘ\f n \fr 44.10\fr* \fk ܗ̣ܘ\fk* \ft om. 5b1\ft*\f* ܢܗܘܐ ܠܝ ܥܒ̣ܕܐ. ܘܐܢܬܘܢ ܬܗܘܘܢ ܙܟܝ̈ܝܢ. +\v 11 ܘܐܣܬܪܗܒܘ ܘܐܚܬܘ ܓܒܪ ܛܥܢܗ ܥܠ ܐܪܥܐ. ܘܦܬܚܘ ܓܒܪ ܛܥܢܗ\f o \fr 44.11\fr* \fk ܣܩܗ\fk* \ft 8b1\ft*\f*. +\v 12 ܘܒܨܘ ܡܢ ܪܒܐ ܫ̇ܪܝ ܘܒܙܥܘܪܐ ܫ̇ܠܡ. ܘܐܫܬܟܚ ܐܣܩܦܐ ܒܛܥܢܗ ܕܒܢܝܡܝܢ. +\v 13 ܘܨܪܝܘ ܠܒ̈ܘܫܝܗܘܢ. ܘܫܩܠܘ ܓܒܪ ܥܠ ܚܡܪܗ ܘܗܦܟܘ ܠܩܪܝܬܐ. +\v 14 ܘܥܠ ܝܗܘܕܐ ܘܐ̈ܚܘܗܝ ܠܘܬ ܝܘܣܦ. ܘܗ̣ܘ ܥܕܟܝܠ ܬܡܢ. ܘܢܦܠ̣ܘ ܩܕܡܘܗܝ ܥܠ ܐܪܥܐ. +\v 15 ܐܡ̇ܪ ܠܗܘܢ ܝܘܣܦ. ܡܢܘ ܥܒ̇ܕܐ ܗܢܐ ܕܥܒܕܬܘܢ. ܠܐ ܝܕܥܝܢ ܐܢܬܘܢ ܕܡ̇ܢܚܫܘ ܡ̇ܢܚܫ ܓܒܪܐ ܕܐܟܘܬܝ. +\v 16 ܘܐܡ̣ܪ ܝܗܘܕܐ. ܡܢܐ ܢܐܡܪ ܠܡܪܝ ܘܡܢܐ ܢܡܠܠ ܘܒܡܢܐ ܢܙܟ̣ܐ. ܡܢ ܩܕܡ ܐܠܗܐ ܐܫܬܟܚ ܚܛܗܐ ܠܥܒ̈ܕܝܟ. ܗܐ\f p \fr 44.16\fr* \fk ܐܦ\fk* \ft add. 5b1\ft*\f* ܚܢܢ ܥܒ̈ܕܐ ܠܡܪܝ. ܐܦ ܚܢܢ ܐܦ ܡ̇ܢ ܕܐܫܬܟܚ ܐܣܩܦܐ ܒܐܝܕܗ\f q \fr 44.16\fr* \fk ܠܘܬܗ\fk* \ft 11.10g1\ft*\f*. +\v 17 ܐܡ̇ܪ ܠܗܘܢ\f r \fr 44.17\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܚܣ ܠܝ ܕܐܥܒܕ ܗܕܐ. ܓܒܪܐ ܕܐܫܬܟܚ ܐܣܩܦܐ ܠܘܬܗ\f s \fr 44.17\fr* \fk ܒܐܝܕܗ\fk* \ft 5b1\ft*\f* ܗ̣ܘ ܢܗܘܐ ܠܝ ܥܒ̣ܕܐ. ܘܐܢܬܘܢ ܣܩܘ ܒܫܠܡܐ ܠܘܬ ܐܒܘܟܘܢ. +\v 18 ܘܩ̣ܪܒ ܠܘܬܗ ܝܗܘܕܐ ܘܐܡ̣ܪ. ܒܥ̇ܐ ܐܢܐ ܡܢܟ ܡܪܝ. ܢܡܠܠ ܥܒ̣ܕܟ ܡܠܬܐ ܩܕܡܝܟ ܡܪܝ. ܘܠܐ ܢܬܚܡܬ ܪܘܓܙܟ ܥܠ ܥܒ̣ܕܟ. ܡܛܠ ܕܐܢܬ\f t \fr 44.18\fr* \fk ܕܡ̇ܢ ܕܐܟܘܬܟ\fk* \ft 5b1\ft*\f* ܐܝܟ ܦܪܥܘܢ\f u \fr 44.18\fr* \fk ܗ̣ܘ\fk* \ft add. 5b1\ft*\f*. +\v 19 ܡܪܝ ܫܐ̇ܠ ܠܥܒ̈ܕܘܗܝ ܘܐܡ̣ܪ. ܐܝܬ ܠܟܘܢ ܐܒܐ ܐܘ ܐܚܐ\f v \fr 44.19\fr* \fk ܘܐܚܐ\fk* \ft 12b1\ft*\f*. +\v 20 ܘܐܡܪܢ ܠܡܪܝ. ܐܝܬ ܠܢ ܐܒܐ ܣܒܐ. ܘܒܪܐ ܒܪ ܣܝܒܘܬܐ ܙܥܘܪܐ. ܘܐܚܘܗܝ ܡܝܬ. ܘܗ̣ܘ ܒܠܚܘܕܘܗܝ ܐܫܬܚܪ ܠܐܡܗ. ܘܐܒܘܗܝ ܪܚܡ ܠܗ. +\v 21 ܘܐܡ̣ܪܬ ܠܥܒ̈ܕܝܟ. ܐܚܬܘܗܝ ܠܘܬܝ ܘܐܣܝܡ ܥܝܢܝ ܥܠܘܗܝ. +\v 22 ܘܐܡܪܢ ܠܡܪܝ. ܠܐ ܡܫܟܚ ܛܠܝܐ ܠܡܫܒܩ ܠܐܒܘܗܝ. ܘܐܢ ܫܒ̇ܩ ܠܐܒܘܗܝ ܡܐ̇ܬ. +\v 23 ܘܐܡ̣ܪܬ ܠܥܒ̈ܕܝܟ. ܕܐܢ ܠܐ ܢܚ̇ܬ ܐܚܘܟܘܢ ܙܥܘܪܐ ܥܡܟܘܢ. ܠܐ ܬܘܣܦܘܢ ܠܡܚܙܐ ܐ̈ܦܝ. +\v 24 ܘܟܕ ܣܠܩܢ ܠܘܬ ܥܒ̣ܕܟ ܐܒܘܢ. ܘܚܘܝܢܝܗܝ ܦܬ̈ܓܡ̇ܘܗܝ ܕܡܪܝ. +\v 25 ܐܡ̣ܪ ܠܢ ܥܒ̣ܕܟ\f w \fr 44.25\fr* \fk ܠܢ ܥܒ̣ܕܟ\fk* \ft om. 5b1\ft*\f* ܐܒܘܢ. ܗܦܘܟܘ ܡܘܪܘ ܠܢ ܩܠܝܠ ܥܒܘܪܐ. +\v 26 ܘܐܡܪܢ ܠܐܒܘܢ\f x \fr 44.26\fr* \fk ܠܐܒܘܢ\fk* \ft om. 5b1\ft*\f* ܠܐ ܡܫܟܚܝܢܢ ܠܡܚܬ. ܐܢ ܢܚ̇ܬ ܐܚܘܢ ܙܥܘܪܐ ܥܡܢ ܢܚܬܝܢܢ. ܡܛܠ ܕܠܐ ܡܫܟܚܝܢܢ ܠܡܚܙܐ ܐ̈ܦܘܗܝ ܕܓܒܪܐ. ܟܕ ܐܚܘܢ ܙܥܘܪܐ ܠܐ ܗܘ̣ܐ ܥܡܢ. +\v 27 ܘܐܡ̣ܪ ܠܢ ܥܒ̣ܕܟ ܐܒܘܢ. ܐܢܬܘܢ ܝܕܥܝܢ ܐܢܬܘܢ ܕܬܪ̈ܝܢ ܝܠ̣ܕܬ ܠܝ\f y \fr 44.27\fr* \fk ܠܝ\fk* \ft om. 12b2*\ft*\f* ܐܢܬܬܝ. +\v 28 ܘܢܦ̣ܩ ܚܕ ܡܢ ܠܘܬܝ. ܘܐܡ̇ܪܬ ܕܡܩܛܠ\f z \fr 44.28\fr* \fk ܡܩܛܠ\fk* \ft L\ft*\f* ܩܛܝܠ. ܘܠܐ ܚܙܝܬܗ ܥܕܡܐ ܠܗܫܐ. +\v 29 ܘܕܒܪܝܢ ܐܢܬܘܢ ܐܦ ܠܗܢܐ\f { \fr 44.29\fr* \fk ܗܢܐ\fk* \ft 5b1\ft*\f* ܡܢ ܠܘܬܝ. ܘܐ̇ܪܥ ܠܗ ܣܩܘܒܠܐ. ܘܡܚܬܝܢ ܐܢܬܘܢ ܣܝܒܘܬܝ\f | \fr 44.29\fr* \fk ܠ\fk* \ft 12b2\ft*\f* ܒܒܝܫܬܐ ܠܫܝܘܠ. +\v 30 ܘܗܫܐ ܡܐ ܕܐܙܠܢ ܠܘܬ ܥܒ̣ܕܟ ܐܒܘܢ. ܘܛܠܝܐ ܠܐ ܗܘܐ ܥܡܢ. ܘܢܦܫܗ ܚܒܝܒܐ ܠܗ ܐܝܟ ܢܦܫܗ. +\v 31 ܘܡܐ ܕܚ̣ܙܐ ܕܠܝܬ ܛܠܝܐ ܥܡܢ ܡܐ̇ܬ\f } \fr 44.31\fr* \fk ܠܗ\fk* \ft add. 12b2\ft*\f*. ܘܡܚܬܝܢ ܥܒ̈ܕܝܟ ܣܝܒܘܬܗ ܕܥܒ̣ܕܟ ܐܒܘܢ ܒܕܘܘܐܢܐ ܠܫܝܘܠ. +\v 32 ܡܛܠ ܕܥܒ̣ܕܟ ܥ̣ܪܒ\f ~ \fr 44.32\fr* \fk ܒܗ\fk* \ft add. 11.10g1\ft*\f* ܒܛܠܝܐ ܡܢ ܠܘܬ ܐܒܘܢ. ܘܐܡ̇ܪܬ\f  \fr 44.32\fr* \fk ܕ\fk* \ft Ai, E, W, M, U, L\ft*\f* ܐܢ ܠܐ ܐܝܬܝܘܗܝ ܠܟ\f € \fr 44.32\fr* \fk ܠܘܬܟ\fk* \ft 12b2\ft*\f* ܐܚܛܐ ܠܐܒܝ ܟܠܗܘܢ ܝܘܡ̈ܬܐ. +\v 33 ܘܗܫܐ ܢܦܘܫ ܥܒ̣ܕܟ ܚܠܦ ܛܠܝܐ ܥܒ̣ܕܐ ܠܡܪܝ. ܘܛܠܝܐ ܢܣܩ ܥܡ ܐܚ̈ܘܗܝ. +\v 34 ܡܛܠ ܕܐܝܟܢܐ ܐܣܩ ܠܘܬ ܐܒܝ. ܘܛܠܝܐ ܠܐ ܗܘܐ ܥܡܝ. ܕܠܡܐ ܐܚܙܐ ܒܒܝܫܬܐ ܕܬܓ̣ܕܫ ܠܐܒܝ. +\c 45 +\v 1 ܘܠܐ ܐܫܟܚ ܝܘܣܦ ܠܡܚܡܣܢܘ ܡܢ ܟܠ ܕܩܝܡܝܢ ܗܘܘ\f a \fr 45.1\fr* \fk ܗܘܘ\fk* \ft om. 5b1, L\ft*\f* ܩܕܡܘܗܝ\f b \fr 45.1\fr* \fk ܠܥܠ ܡܢܗ\fk* \ft 5b1\ft*\f*. ܘܐܡܪ ܐܦܩܘ ܠܟܠܢܫ ܡܢ ܠܘܬܝ. ܘܠܐ ܩܘܝ ܐܢܫ ܠܘܬܗ. ܟܕ ܐܬܓܠܝ ܝܘܣܦ ܠܐܚ̈ܘܗܝ. +\v 2 ܘܐܪܝܡ ܩܠܗ ܒܒܟܬܐ. ܘܫܡܥܘ ܡܨܪ̈ܝܐ. ܘܐܫܬܡܥ ܒܝܬ ܦܪܥܘܢ. +\v 3 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐܚ̈ܘܗܝ. ܐܢܐ ܐܢܐ ܝܘܣܦ ܐܚܘܟܘܢ. ܥܕܟܝܠ ܐܒܝ ܚܝ ܗܘ\f c \fr 45.3\fr* \fk ܗܘ\fk* \ft om. 5b1\ft*\f*. ܘܠܐ ܐܫܟܚܘ ܐܚ̈ܘܗܝ ܠܡܬܠ ܠܗ ܦܬܓܡܐ. ܡܛܠ ܕܕܚܠܘ ܡܢ\f d \fr 45.3\fr* \fk ܡܢ\fk* \ft om. L\ft*\f* ܩܕܡܘܗܝ. +\v 4 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐܚ̈ܘܗܝ. ܩܪܘܒܘ ܠܘܬܝ. ܘܩܪܒܘ ܠܘܬܗ\f e \fr 45.4\fr* \fk ܠܘܬܗ\fk* \ft om. 5b1\ft*\f*. ܘܐܡ̣ܪ ܠܗܘܢ\f f \fr 45.4\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f*. ܐܢܐ ܐܢܐ ܝܘܣܦ ܐܚܘܟܘܢ ܕܙܒܢܬܘܢܢܝ ܠܡܨܪ̈ܝܐ. +\v 5 ܘܗܫܐ ܠܐ ܬܟܪܐ ܠܟܘܢ. ܘܠܐ ܢܬܐܒܫ ܒܥܝܢ̈ܝܟܘܢ ܕܙܒܢܬܘܢܢܝ ܠܗܪܟܐ. ܡܛܠ ܕܠܬܘܪܣܝܐ ܗܘ ܫܕܪܢܝ ܐܠܗܐ ܩܕܡܝܟܘܢ. +\v 6 ܡܛܠ ܕܗܐ ܬܪ̈ܬܝܢ ܫ̈ܢܝܢ ܟܦܢܐ ܒܓܘܗ̇ ܕܐܪܥܐ. ܘܬܘܒ ܚܡܫ †ܫܢܝ̈ܢ†\f g \fr 45.6\fr* \fk ܐܢ̈ܝܢ\fk* \ft 7a1\ft*\f* ܕܠܝܬ ܕܙܪܥ ܘܕܚ̇ܨܕ\f h \fr 45.6\fr* \fk ܘܚ̇ܨܕ\fk* \ft 5b1, 8a1*, 11.10g1\ft*\f*. +\v 7 ܘܫܕܪܢܝ ܐܠܗܐ ܩܕܡܝܟܘܢ ܠܡܣܡ ܠܟܘܢ ܫܪܟܢܐ. ܘܠܡܚܝܘ ܠܟܘܢ ܡܫܘܙܒܘܬܐ ܪܒܬܐ ܒܐܪܥܐ. +\v 8 ܘܗܫܐ ܠܐ ܗܘ̣ܐ ܐܢܬܘܢ ܫܕܪܬܘܢܢܝ ܠܗܪܟܐ. ܐܠܐ ܐܠܗܐ. ܘܥܒܕܢܝ ܐܒܐ ܠܦܪܥܘܢ. ܘܡܪܐ ܥܠ ܟܠܗ\f i \fr 45.8\fr* \fk ܠܟܘܠܗ\fk* \ft 5b1\ft*\f* ܒܝܬܗ. ܘܫܠܝܛܐ ܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. +\v 9 ܒܥܓܠ ܣܩܘ ܠܘܬ ܐܒܝ ܘܐܡܪܘ ܠܗ. ܗܟܢܐ ܐܡ̇ܪ ܒܪܟ ܝܘܣܦ. ܥܒܕܢܝ ܐܠܗܐ ܡܪܐ ܥܠ ܟܠܗ̇ ܡܨܪܝܢ. ܚܘܬ ܠܘܬܝ ܘܠܐ ܬܫܬܘܚܪ. +\v 10 ܘܬܒ ܒܐܪܥܐ ܕܓܫܢ. ܘܗܘ̣ܝܬ ܩܪܝܒ ܠܝ ܐܢܬ ܘܒ̈ܢܝܟ ܘܒ̈ܢܝ ܒܝܬܟ. ܘܥܢܟ ܘܬܘܪ̈ܝܟ ܘܟܠ ܕܐܝܬ ܠܟ. +\v 11 ܘܐܬܪܣܝܟܘܢ ܬܡܢ ܡܛܠ ܕܬܘܒ ܚܡܫ ܫ̈ܢܝܢ ܩ̇ܝܡ ܟܦܢܐ. ܕܠܡܐ ܬܐܒܕ\f j \fr 45.11\fr* \fk ܠܟ\fk* \ft add. 12b2\ft*\f* ܐܢܬ ܘܒܝܬܟ ܘܟܠ ܕܐܝܬ ܠܟ. +\v 12 ܘܗܐ ܥܝܢ̈ܝܟܘܢ ܚ̈ܙܝܢ ܘܥܝܢ̈ܘܗܝ ܕܐܚܝ ܒܢܝܡܝܢ. ܕܦܘܡܝ ܡܡܠܠ ܥܡܟܘܢ. +\v 13 ܘܚܘܘ ܠܐܒܝ ܟܠܗ ܐܝܩܪܝ ܕܒܡܨܪܝܢ. ܘܟܠ ܕܚܙܝܬܘܢ. ܘܣܪܗܒܘ ܐܚܬܘ ܠܐܒܝ ܠܗܪܟܐ. +\v 14 ܘܢܦ̣ܠ ܥܠ ܨܘܪܗ ܕܒܢܝܡܝܢ ܐܚܘܗܝ ܘܒܟ̣ܐ. ܘܒܢܝܡܝܢ ܒܟ̣ܐ ܥܠ ܨܘܪܗ. +\v 15 ܘܢܫ̇ܩ ܠܟܠܗܘܢ ܐܚ̈ܘܗܝ ܘܒܟ̣ܐ ܥܠܝܗܘܢ. ܘܒܬܪܟܢ ܡܠܠܘ ܐ̈ܚܘܗܝ ܥܡܗ. +\v 16 ܘܩܠܐ ܐܫܬܡܥ ܒܝܬ ܦܪܥܘܢ ܕܐܡܪܝܢ. ܐܬܘ ܐ̈ܚܘܗܝ ܕܝܘܣܦ. ܘܫ̣ܦܪ ܦܬܓܡܐ ܒܥܝܢ̈ܝ ܦܪܥܘܢ ܘܒܥܝܢ̈ܝ ܥܒ̈ܕܘܗܝ. +\v 17 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܐܡ̣ܪ ܠܐ̈ܚܝܟ ܗܟܢܐ ܥܒܕܘ. ܐܛܥܢܘ ܒܥܝܪܟܘܢ ܥܒܘܪܐ\f k \fr 45.17\fr* \fk ܥܒܘܪܐ\fk* \ft om. 5b1\ft*\f*. ܘܙܠܘ ܐܘܒܠܘ ܠܐܪܥܐ ܕܟܢܥܢ. +\v 18 ܘܕܒ̣ܪܘ ܠܐܒܘܟܘܢ ܘܠܐܢܫ̈ܝ ܒܬ̈ܝܟܘܢ ܘܐܝܬܘ ܠܘܬܝ. ܘܐܬܠ ܠܟܘܢ ܛܘܒܗ̇ ܕܐܪܥܐ ܕܡܨܪܝܢ. ܘܐܟܘܠܘ ܫܘܡܢܗ̇ ܕܐܪܥܐ. +\v 19 ܘܐܢܬ ܗܐ\f l \fr 45.19\fr* \fk ܗܐ\fk* \ft om. 5b1\ft*\f* ܡܫܠܛ ܐܢܬ. ܐܡ̣ܪ ܠܐ̈ܚܝܟ\f m \fr 45.19\fr* \fk ܠܗܘܢ\fk* \ft 5b1\ft*\f* ܗܟܢܐ ܥܒܕܘ. ܕܒܪܘ ܠܟܘܢ ܡܢ ܐܪܥܐ ܕܡܨܪܝܢ ܥ̈ܓܠܬܐ ܠܢܫ̈ܝܟܘܢ ܘܠܝܩܪܬܟܘܢ. ܘܫܩܘܠܘ ܠܐܒܘܟܘܢ ܘܬܘ. +\v 20 ܘܥܝܢ̈ܝܟܘܢ ܠܐ ܢܚܘܣܢ ܥܠ ܡܐ̈ܢܝܟܘܢ. ܡܛܠ ܕܛܘܒܐ ܕܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ ܕܝܠܟܘܢ ܗܘ. +\v 21 ܘܥܒܕܘ ܗܟܢܐ ܒܢ̈ܝ ܐܝܣܪܝܠ. ܘܝܗ̣ܒ ܠܗܘܢ ܝܘܣܦ ܥ̈ܓܠܬܐ ܥܠ ܡܠܬ ܦܘܡܗ ܕܦܪܥܘܢ. ܘܝܗ̣ܒ ܠܗܘܢ\f n \fr 45.21\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f* ܙܘ̈ܕܐ ܠܐܘܪܚܐ. +\v 22 ܠܟܠܗܘܢ ܘܝܗ̣ܒ ܠܟܠ ܓܒܪ ܙܘܓܐ ܕܢܚ̈ܬܐ. ܘܠܒܢܝܡܝܢ ܝܗ̣ܒ ܬܠܬܡܐܐ ܕܟܣܦܐ. ܘܚܡܫܐ ܙܘ̈ܓܝܢ ܕܢܚ̈ܬܐ. +\v 23 ܘܠܐܒܘܗܝ ܫܕܪ ܗܟܢܐ ܘܥܣܪܐ ܚܡܪ̈ܝܢ. ܟܕ\f o \fr 45.23\fr* \fk ܟܕ\fk* \ft om. 5b1\ft*\f* ܛܥܝܢ̈ܝܢ ܡܢ ܛܘܒܗ̇ ܕܐܪܥܐ\f p \fr 45.23\fr* \fk ܕܐܪܥܐ\fk* \ft om. 5b1, 8b1\ft*\f* ܕܡܨܪܝܢ. ܘܥܣܪ ܐܬܢܝ̈ܢ\f q \fr 45.23\fr* \fk ܟܕ\fk* \ft add. 11.10g1, M, U, L\ft*\f* ܛܥܝܢ̈ܢ ܥܒܘܪܐ ܘܚܡܪܐ ܘܙܘ̈ܕܐ ܠܐܒܘܗܝ\f r \fr 45.23\fr* \fk ܠܐܒܘܗܝ\fk* \ft om. 12a1\ft*\f* ܠܐܘܪܚܐ. +\v 24 ܘܫܕܪ ܐܢܘܢ\f s \fr 45.24\fr* \fk ܠܐ̈ܚܘܗܝ\fk* \ft 5b1\ft*\f* ܘܐܙܠܘ. ܘܐܡ̣ܪ ܠܗܘܢ ܠܐ ܬܨܘܢ ܒܐܘܪܚܐ. +\v 25 ܘܣܠܩܘ ܡܢ ܡܨܪܝܢ. ܘܐܬܘ ܠܐܪܥܐ ܕܟܢܥܢ ܠܘܬ ܝܥܩܘܒ ܐܒܘܗܘܢ. +\v 26 ܘܚܘܝܘܗܝ\f t \fr 45.26\fr* \fk ܟܠ\fk* \ft add. 12b2\ft*\f* ܘܐܡܪܘ ܠܗ. ܥܕܟܝܠ ܝܘܣܦ ܚܝ\f u \fr 45.26\fr* \fk ܗܘ\fk* \ft add. 5b1, 8b1, 11.10g1\ft*\f*. ܘܗܘܝܘ ܫܠܝܛ ܒܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ. ܘܐܗܡܝ ܒܠܒܗ ܡܛܠ ܕܠܐ ܗܝܡܢ ܐܢܘܢ. +\v 27 ܘܚܘܝܘܗܝ\f v \fr 45.27\fr* \fk ܘܐܡܪܘ ܠܗ\fk* \ft 5b1\ft*\f* ܟܠܗܝܢ ܡ̈ܠܐ ܕܐܡ̣ܪ ܠܗܘܢ\f w \fr 45.27\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f* ܝܘܣܦ. ܘܚ̣ܙܐ ܝܥܩܘܒ\f x \fr 45.27\fr* \fk ܝܥܩܘܒ\fk* \ft om. 5b1, 8b1, 12b2\ft*\f* ܥ̈ܓܠܬܐ ܕܫܕܪ\f y \fr 45.27\fr* \fk ܐܢܘܢ\fk* \ft add. 12b1mg\ft*\f* ܝܘܣܦ ܠܡܫܩܠܗ. ܘܐܬܢܝܚܬ ܪܘܚܗ ܕܝܥܩܘܒ ܐܒܘܗܘܢ. +\v 28 ܘܐܡ̣ܪ\f z \fr 45.28\fr* \fk ܐܝܣܪܝܠ\fk* \ft add. 5b1\ft*\f* ܪܒܐ ܗܝ ܠܝ\f { \fr 45.28\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f* ܗܕܐ ܕܥܕܟܝܠ ܝܘܣܦ ܒܪܝ ܚܝ\f | \fr 45.28\fr* \fk ܗܘ\fk* \ft add. 12b2\ft*\f*. ܐܙܠ ܐܚܙܝܘܗܝ ܥܕܠܐ ܐܡܘܬ. +\c 46 +\v 1 ܘܫܩ̣ܠ ܐܝܣܪܝܠ ܗ̣ܘ ܘܟܘܠ ܕܐܝܬ ܠܗ ܘܐܬ̣ܐ ܠܒܪܫܒܥ. ܘܕܒ̣ܚ ܕܒܚܬܐ ܠܐܠܗܐ ܕܐܒܘܗܝ ܐܝܣܚܩ. +\v 2 ܘܐܡ̣ܪ ܐܠܗܐ ܠܐܝܣܪܝܠ ܒܚܙܘܐ ܕܠܠܝܐ. ܘܐܡ̣ܪ ܝܥܩܘܒ ܝܥܩܘܒ. ܘܐܡ̣ܪ ܗܐ ܐܢܐ. +\v 3 ܘܐܡ̣ܪ ܠܗ\f a \fr 46.3\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܐܢܐ ܐܢܐ ܐܝܠ\f b \fr 46.3\fr* \fk ܐܝܠ\fk* \ft om. 12b2*\ft*\f* ܐܠܗܗ ܕܐܒܘܟ. ܠܐ ܬܕܚܠ ܠܡܚܬ ܠܡܨܪܝܢ. ܡܛܠ ܕܠܥܡܐ ܪܒܐ ܐܥܒܕܟ ܬܡܢ. +\v 4 ܐܢܐ ܐܚܘܬ ܥܡܟ\f c \fr 46.4\fr* \fk ܠܡܨܪܝܢ\fk* \ft add. 5b1\ft*\f* ܘܐܢܐ ܐܣܩܟ. ܘܝܘܣܦ ܢܣܝܡ ܐ̈ܝܕܘܗܝ ܥܠ ܥܝܢ̈ܝܟ. +\v 5 ܘܩܡ ܝܥܩܘܒ ܡܢ ܒܪܫܒܥ. ܘܫܩ̣ܠܘ ܒܢ̈ܝ ܐܝܣܪܝܠ ܠܝܥܩܘܒ ܐܒܘܗܘܢ ܘܠܝܩܪܬܗܘܢ ܘܠܢܫܝ̈ܗܘܢ. ܒ̈ܥܓܠܬܐ ܕܫܕܪ ܦܪܥܘܢ ܠܡܫܩܠܗ. +\v 6 ܘܕܒܪܘ ܒܥܝܪܗܘܢ ܘܩܢܝܢܗܘܢ ܕܩܢܘ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܐܬܘ ܠܡܨܪܝܢ. ܝܥܩܘܒ ܘܟܠܗ ܙܪܥܗ ܥܡܗ. +\v 7 ܒܢ̈ܘܗܝ ܘܒܢ̈ܝ ܒܢ̈ܘܗܝ ܥܡܗ. ܒܢ̈ܬܗ ܘܒܢ̈ܬ ܒܢ̈ܘܗܝ. ܘܟܠܗ ܙܪܥܗ ܐܥܠ ܥܡܗ ܠܡܨܪܝܢ. +\v 8 ܘܗܠܝܢ ܫܡ̈ܗܐ ܕܒܢ̈ܝ ܐܝܣܪܝܠ ܕܥܠܘ ܠܡܨܪܝܢ. ܝܥܩܘܒ ܘܒܢ̈ܘܗܝ. ܒܘܟܪܗ ܕܝܥܩܘܒ ܪܘܒܝܠ. +\v 9 ܒܢ̈ܝ ܪܘܒܝܠ. ܚܢܘܟ ܘܦܠܘ. ܘܚܨܪܘܢ ܘܟܪܡܝ. +\v 10 ܘܒܢ̈ܝ ܫܡܥܘܢ. ܝܡܘܐܝܠ ܘܝܡܝܢ. ܘܐܗܪ ܘܝܟܝܢ. ܘܨܚܪ ܘܫܐܘܠ ܒܪ ܟܢܥܢܝܬܐ. +\v 11 ܘܒܢܝ̈ ܠܘܝ. ܓܪܫܘܢ ܘܩܗܬ ܘܡܪܪܝ. +\v 12 ܘܒܢ̈ܝ ܝܗܘܕܐ. ܥܝܪ ܘܐܘܢܢ. ܘܫܠܐ ܘܦܪܨ ܘܙܪܚ. ܘܡܝܬܘ ܥܝܪ ܘܐܘܢܢ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܗܘܘ ܒܢ̈ܝ ܦܪܨ. ܚܨܪܘܢ ܘܚܡܘܠ. +\v 13 ܘܒ̈ܢܝ ܐܝܣܟܪ. ܬܘܠܥ ܘܦܘܐܐ. ܘܐܘܝܒ ܘܫܡܪܘܢ. +\v 14 ܘܒܢ̈ܝ ܙܒܘܠܘܢ. ܣܕܪ ܘܐܠܘܢ ܘܢܚܠܐܝܠ. +\v 15 ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܠܝܐ ܕܝܠ̣ܕܬ ܠܝܥܩܘܒ ܒܦܕܢ ܕܐܪܡ. ܘܠܕܝܢ̣ܐ ܒܪܬܗ. ܟܘܠ ܢܦܫ̈ܬܐ ܕܒܢ̈ܘܗܝ ܘܕܒܢ̈ܬܗ. ܬܠܬܝܢ ܘܬܠܬ. +\v 16 ܘܒܢ̈ܝ ܓܕ. ܨܦܝܘܢ ܘܚܓܝ. ܘܫܘܢܝ ܘܐܨܒܥܘܢ. ܘܥܕܝ ܘܐܪܘܕ ܘܐܕܪܝ. +\v 17 ܘܒܢ̈ܝ ܐܫܝܪ. ܝܡܢܐ †ܘܝܫܘܐ\f d \fr 46.17\fr* \fk ܘܝܫܒܐ\fk* \ft M\ft*\f*. ܘܝܫܘܝ† ܘܒܪܝܥܐ. ܘܣܪܚ ܚܬܗܘܢ. ܘܒܢ̈ܝ ܒܪܝܥܐ. ܚܒ̇ܪ ܘܡܠܟܝܠ. +\v 18 ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܙܠܦܐ ܕܝܗ̣ܒ ܠܒܢ ܠܠܝܐ ܒܪܬܗ. ܘܝܠ̣ܕܬ ܗܠܝܢ ܠܝܥܩܘܒ. ܢܦܫ̈ܬܐ ܫܬܬܥܣܪ̈ܐ. +\v 19 ܘܒܢ̈ܝܗ̇ ܕܪܚܝܠ ܐܢܬܬܗ ܕܝܥܩܘܒ. ܝܘܣܦ ܘܒܢܝܡܝܢ. +\v 20 ܘܐܬܝܠܕܘ ܠܝܘܣܦ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܕܝܠ̣ܕܬ ܠܗ ܐܣܝܬ ܒܪܬ ܦܘܛܝܦܪܥ ܟܘܡܪܐ ܕܐܘܢ ܠܡܢܫܐ ܘܠܐܦܪܝܡ. +\v 21 ܘܒܢ̈ܝ ܒܢܝܡܝܢ. ܒ̇ܠܥ ܘܐܟܒܪ ܘܐܫܟܠ ܘܓ̣ܪܐ. ܘܢܥܡܢ ܘܐܚܝ ܘܐܪܘܫ. ܘܡܦܝܡ ܘܚܦܝܡ ܘܐܕܪ. +\v 22 ܗܠܝܢ ܒܢ̈ܝܗ̇ ܕܪܚܝܠ. ܕܝܠ̣ܕܬ ܠܝܥܩܘܒ.\f e \fr 46.22\fr* \fk ܟܠ\fk* \ft add. 5b1, 8a1c, 12a1, 12b2, M, U, L\ft*\f* ܢܦܫ̈ܬܐ ܐܪܒܥܣܪܐ. +\v 23 ܘܒܢ̈ܝ ܕܢ. ܚܘܫܝܡ. +\v 24 ܘܒܢ̈ܝ ܢܦܬܠܝ. ܢܚܨܐܝܠ ܘܓܘܢܝ. ܘܚ̇ܨܪ ܘܫܠܝܡ. +\v 25 ܗܠܝܢ ܒܢܝ̈ܗ̇ ܕܒܠܗܐ ܕܝܗ̣ܒ ܠܒܢ ܠܪܚܝܠ ܒܪܬܗ. ܘܝܠ̣ܕܬ ܗܠܝܢ ܠܝܥܩܘܒ. ܟܘܠ ܢܦܫ̈ܬܐ ܫܒܥ. +\v 26 ܟܠܗܝܢ ܢܦܫ̈ܬܐ ܕܥܠ ܥܡ ܝܥܩܘܒ ܠܡܨܪܝܢ. ܕܢܦ̣ܩ ܡܢ ܚܨܗ. ܣܛܪ ܡܢ ܢܫ̈ܐ ܕܒܢ̈ܘܗܝ ܕܝܥܩܘܒ. ܟܠ ܢܦܫ̈ܬܐ ܫܬܝܢ ܘܫܬ. +\v 27 ܘܒܢ̈ܝ ܝܘܣܦ ܕܐܬܝܠܕܘ ܠܗ ܒܡܨܪܝܢ. ܢܦܫ̈ܬܐ ܬܪ̈ܬܝܢ. ܟܠܗܝܢ ܢܦܫ̈ܬܐ ܕܒܝܬ ܝܥܩܘܒ ܕܥܠ ܠܡܨܪܝܢ ܫܒܥܝܢ. +\v 28 ܘܠܝܗܘܕܐ ܫܕܪ ܩܕܡܘܗܝ ܠܘܬ ܝܘܣܦ. ܠܡܬܚܙܝܘ ܩܕܡܘܗܝ †ܠܓܫܢ. ܘܐܬܐ† ܠܐܪܥܐ ܕܓܫܢ. +\v 29 ܘܦܓ̇ܕ ܝܘܣܦ ܡܪ̈ܟܒܬܗ. ܘܣ̣ܠܩ ܠܐܘܪܥܐ ܕܐܝܣܪܝܠ ܐܒܘܗܝ ܠܓܫܢ. ܘܐܬܚܙܝ ܠܗ ܘܢܦ̣ܠ ܥܠ ܨܘܪܗ. ܘܒܟ̣ܐ ܥܠ ܨܘܪܗ ܬܘܒ. +\v 30 ܘܐܡ̣ܪ ܐܝܣܪܝܠ ܠܝܘܣܦ. ܐܡܘܬ ܡܟܝܠ ܡܢ ܒܬܪ ܕܚ̇ܙܝܬ ܐ̈ܦܝܟ ܒܪܝ. ܕܥܕܟܝܠ ܚܝ ܐܢܬ. +\v 31 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐ̈ܚܘܗܝ ܘܠܒܝܬ ܐܒܘܗܝ. ܐܣܩ ܐܚܘܐ ܠܦܪܥܘܢ ܘܐܡ̣ܪ ܠܗ. ܐܚ̈ܝ ܘܒܝܬ ܐܒܝ ܕܒܐܪܥܐ ܕܟܢܥܢ. ܐܬܘ ܠܘܬܝ. +\v 32 ܘܓܒܪ̈ܐ ܪ̈ܥܝܝ ܥܢܐ ܐܢܘܢ. ܡܛܠ ܕܓܒܪ̈ܐ ܩܢܝ̈ܝ ܩܢܝܢܐ ܐܢܘܢ ܘܥܢܗܘܢ ܘܬܘܪ̈ܝܗܘܢ ܘܟܠ ܕܐܝܬ ܠܗܘܢ ܐܝܬܝܘ. +\v 33 ܘܟܕ ܢܩܪܝܟܘܢ ܦܪܥܘܢ ܘܢܐܡܪ ܠܟܘܢ\f f \fr 46.33\fr* \fk ܠܟܘܢ\fk* \ft om. 5b1\ft*\f*. ܡܢܘ ܥܒܕܟܘܢ. +\v 34 ܥܡܪܘ\f g \fr 46.34\fr* \fk ܐܡܪܘ\fk* \ft M, U, L\ft*\f* ܠܗ\f h \fr 46.34\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܡܪ̈ܝ\f i \fr 46.34\fr* \fk ܕ\fk* \ft 8a1*\ft*\f* ܩܢܝܢܐ ܗܘܘ ܥܒ̈ܕܝܟ ܡܢ ܛܠܝܘܬܗܘܢ ܘܥܕܡܐ ܠܗܫܐ. †ܘܐܦ† ܚܢܢ ܘܐܦ ܐܒ̈ܗܝܢ ܡܛܠ ܕܬܬܒܘܢ ܒܐܪܥܐ ܕܓܫܢ. ܡܛܠ ܕܡܣܠܝܢ ܐܢܘܢ ܠܡܨܪ̈ܝܐ ܟܠ ܪ̈ܥܝܝ ܥܢܐ. +\c 47 +\v 1 ܘܐܬ̣ܐ ܝܘܣܦ ܘܚܘܝ ܠܦܪܥܘܢ ܘܐܡ̣ܪ ܠܗ\f a \fr 47.1\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܐܒܝ ܘܐ̈ܚܝ ܘܥܢܗܘܢ ܘܬܘܪ̈ܝܗܘܢ ܘܟܠ ܕܐܝܬ ܠܗܘܢ. ܐܬܘ ܡܢ ܐܪܥܐ ܕܟܢܥܢ. ܘܗܐ ܫ̣ܪܝܢ ܒܐܪܥܐ ܕܓܫܢ. +\v 2 ܘܡܢ ܐ̈ܚܘܗܝ ܕܒ̣ܪ ܚܡܫܐ ܓܒܪ̈ܝܢ. ܘܐܩܝܡ ܐܢܘܢ ܩܕܡ ܦܪܥܘܢ. +\v 3 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܐܚ̈ܘܗܝ ܕܝܘܣܦ. ܡܢܘ ܥܒܕܟܘܢ. ܘܐܡܪܘ ܠܦܪܥܘܢ. ܪ̈ܥܝܝ ܥܢܐ ܐܢܘܢ ܥܒ̈ܕܝܟ. ܐܦ ܚܢܢ †ܘܐܦ† ܐ̈ܒܗܝܢ ܡܢ ܛܠܝܘܬܢ\f b \fr 47.3\fr* \fk ܡܢ ܛܠܝܘܬܢ\fk* \ft om. 5b1\ft*\f*. +\v 4 ܘܐܡܪܘ ܠܦܪܥܘܢ ܠܡܥܡܪ ܒܐܪܥܐ ܐܬܝܢ. ܡܛܠ ܕܠܝܬ ܪܥܝܐ ܠܥܢܐ ܕܥܒ̈ܕܝܟ. ܡܛܠ ܕܥܫ̣ܢ ܟܦܢܐ ܒܐܪܥܐ ܕܟܢܥܢ. ܘܗܫܐ ܢܬܒܘܢ ܥܒ̈ܕܝܟ ܒܐܪܥܐ ܕܓܫܢ. +\v 5 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܘܣܦ. ܐܒܘܟ ܘܐܚ̈ܝܟ ܐܬܘ ܠܘܬܟ. +\v 6 ܐܪܥܐ ܕܡܨܪܝܢ ܩܕܡܝܟ ܗ̣ܝ. ܒܫܘܦܪܗ̇ ܕܐܪܥܐ ܐܘܬܒ ܠܐܒܘܟ ܘܠܐ̈ܚܝܟ. ܢܬܒܘܢ ܒܐܪܥܐ ܕܓܫܢ. ܘܐܢ ܝܕܥ ܐܢܬ ܕܐܝܬ ܒܗܘܢ ܓܒܪ̈ܐ ܡܪ̈ܝ ܚܝܠܐ. ܥܒ̣ܕ ܐܢܘܢ ܡܪ̈ܝ ܩܢܝܢܐ ܥܠ ܟܠ ܕܐܝܬ ܠܝ. +\v 7 ܘܐܥܠ ܝܘܣܦ ܠܝܥܩܘܒ ܐܒܘܗܝ. ܘܐܩܝܡܗ ܩܕܡ ܦܪܥܘܢ. ܘܒ̇ܪܟ ܝܥܩܘܒ ܠܦܪܥܘܢ. +\v 8 ܘܐܡ̣ܪ ܦܪܥܘܢ ܠܝܥܩܘܒ. ܟܡܐ ܐܢܘܢ ܝܘܡ̈ܝ ܫ̈ܢܝ ܚܝ̈ܝܟ. +\v 9 ܘܐܡ̣ܪ ܝܥܩܘܒ ܠܦܪܥܘܢ. ܝܘܡ̈ܝ ܫ̈ܢܝ ܬܘܬܒܘܬܝ. ܡܐܐ ܘܬܠܬܝܢ ܫ̈ܢܝܢ. ܙܥܘܪ̈ܝܢ ܗܘܘ ܘܒܝܫ̈ܝܢ ܝܘܡ̈ܝ\f c \fr 47.9\fr* \fk ܝܘܡ̈ܝ\fk* \ft om. 12a1\ft*\f* ܫ̈ܢܝ ܚ̈ܝܝ. ܘܠܐ ܡܛܝܘ ܠܫ̈ܢܝ ܚ̈ܝܝ ܐ̈ܒܗܝ. ܒܝ̈ܘܡܝ\f d \fr 47.9\fr* \fk ܒܝܬ\fk* \ft add. M, L\ft*\f* ܡܥܡܪܗܘܢ. +\v 10 ܘܒ̇ܪܟ ܝܥܩܘܒ ܠܦܪܥܘܢ. ܘܢܦ̣ܩ ܝܥܩܘܒ\f e \fr 47.10\fr* \fk ܝܥܩܘܒ\fk* \ft om. 5b1\ft*\f* ܡܢ ܩܕܡ ܦܪܥܘܢ. +\v 11 ܘܐܘܬܒ ܝܘܣܦ ܠܐܒܘܗܝ ܘܠܐܚ̈ܘܗܝ. ܘܝܗ̣ܒ ܠܗܘܢ ܝܪܬܘܬܐ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܒܫܘܦܪܗ̇ ܕܐܪܥܐ ܒܐܪܥܐ\f f \fr 47.11\fr* \fk ܒܐܪܥܐ\fk* \ft om. M\ft*\f* ܕܪܥܡܣܝܣ. ܐܝܟ ܕܦܩ̣ܕ ܦܪܥܘܢ. +\v 12 ܘܬܪܣܝ ܝܘܣܦ ܠܐܒܘܗܝ ܘܠܐܚ̈ܘܗܝ ܘܠܟܠܗ ܒܝܬ ܐܒܘܗܝ. ܒܥܒܘܪܐ ܠܦܘܬ ܝܩܪܬܐ. +\v 13 ܘܥܒܘܪܐ ܠܝܬ ܒܟܠܗ̇ ܐܪܥܐ. ܡܛܠ ܕܥ̣ܫܢ ܟܦܢܐ ܛܒ. ܘܚ̣ܪܒܬ ܟܠܗ̇\f g \fr 47.13\fr* \fk ܟܠܗ̇\fk* \ft om. 5b1\ft*\f* ܐܪܥܐ ܕܡܨܪܝܢ ܘܐܪܥܐ ܕܟܢܥܢ. ܡܢ ܩܕܡ ܟܦܢܐ. +\v 14 ܘܠܩ̇ܛ ܝܘܣܦ ܟܠܗ ܟܣܦܐ ܕܐܫܬܟܚ\f h \fr 47.14\fr* \fk ܕܐܫܬܚܪ\fk* \ft 12b1\ft*\f* ܒܐܪܥܐ ܕܡܨܪܝܢ. ܘܒܐܪܥܐ ܕܟܢܥܢ ܒܥܒܘܪܐ ܕܙܒܢܝܢ ܗܘܘ. ܘܐܥܠ ܝܘܣܦ ܟܣܦܐ ܠܒܝܬ ܦܪܥܘܢ. +\v 15 †ܘܟܣܦܐ ܓܡ̣ܪ† ܡܢ ܐܪܥܐ ܕܡܨܪܝܢ ܘܡܢ ܐܪܥܐ ܕܟܢܥܢ. ܘܐܬܘ ܟܠܗܘܢ ܡܨܪ̈ܝܐ ܠܘܬ ܝܘܣܦ ܘܐܡܪ̈ܝܢ ܠܗ\f i \fr 47.15\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܗܒ ܠܢ ܥܒܘܪܐ\f j \fr 47.15\fr* \fk ܘܢܚܐ\fk* \ft add. E, W, U\ft*\f*\f k \fr 47.15\fr* \fk ܕܢܚܐ\fk* \ft add. M, L\ft*\f* ܘܠܐ ܢܡܘܬ ܩܕܡܝܟ. ܡܛܠ ܕܓܡ̣ܪ ܠܗ ܟܣܦܐ. +\v 16 ܐܡ̇ܪ ܠܗܘܢ\f l \fr 47.16\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1\ft*\f* ܝܘܣܦ. ܗܒܘ ܠܝ ܩܢܝܢܟܘܢ ܘܐܬܠ ܠܟܘܢ ܒܩܢܝܢܟܘܢ ܐܢ ܓܡ̣ܪ ܟܣܦܐ. +\v 17 ܘܐܝܬܝܘ ܠܗ\f m \fr 47.17\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f* ܩܢܝܢܗܘܢ\f n \fr 47.17\fr* \fk ܠܝܘܣܦ\fk* \ft add. 5b1\ft*\f*. ܘܝܗ̣ܒ ܠܗܘܢ ܝܘܣܦ ܥܒܘܪܐ ܒܪ̈ܟܫܐ ܘܒܩܢܝܢܐ ܕܥܢܐ ܘܒܩܢܝܢܐ\f o \fr 47.17\fr* \fk ܘܒܩܢܝܢܐ\fk* \ft om. M\ft*\f* ܕܬܘܪ̈ܐ ܘܕܚܡܪ̈ܐ\f p \fr 47.17\fr* \fk ܘܒ\fk* \ft 5b1\ft*\f*. ܘܬܪܣܝ ܐܢܘܢ ܒܠܚܡܐ ܒܗ̇ܝ ܫܢܬܐ. ܒܟܠܗ ܩܢܝܢܗܘܢ. +\v 18 ܘܫܠ̣ܡܬ ܫܢܬܐ ܗ̇ܝ. ܘܐܬܘ ܠܘܬܗ\f q \fr 47.18\fr* \fk ܠܘܬ ܝܘܣܦ\fk* \ft 5b1\ft*\f* ܒܫܢܬܐ ܐܚܪܬܐ ܘܐܡܪܘ ܠܗ. ܠܐ ܡ̇ܛܫܝܢ ܚܢܢ ܡܢ ܡܪܢ. ܡܛܠ ܕܓܡ̣ܪ ܟܣܦܐ ܟܘܠܗ ܘܩܢܝܢܐ [-]\f r \fr 47.18\fr* \fk ܠܘܬ\fk* \ft 7a1\ft*\f* ܕܒܥܝܪ̈ܐ\f s \fr 47.18\fr* \fk ܘ\fk* \ft M\ft*\f* ܠܘܬ ܡܪܢ. ܘܠܐ ܐܫܬܚܪ ܩܕܡ ܡܪܢ. ܐܠܐ ܐܢ ܢܦܫ̈ܬܢ ܘܐܪ̈ܥܬܢ. +\v 19 ܠܡܢܐ ܡ̇ܝܬܝܢܢ ܩܕܡܝܟ. ܐܦ ܚܢܢ ܐܦ ܐܪ̈ܥܬܢ. ܙܒܢ ܠܢ ܘܠܐܪ̈ܥܬܢ ܒܠܚܡܐ. ܘܢܗܘܐ ܚܢܢ ܘܐܪ̈ܥܬܢ ܥܒ̈ܕܐ ܠܦܪܥܘܢ. ܘܗܒ ܠܢ ܙܪܥܐ ܘܢܚ̣ܐ ܘܠܐ ܢܡܘܬ. ܘܐܪܥܐ ܠܐ ܬܚ̣ܪܒ. +\v 20 ܘܙܒ̣ܢ ܝܘܣܦ ܟܠܗ̇ ܐܪܥܐ ܕܡܨܪܝܢ\f t \fr 47.20\fr* \fk ܕܡܨܪ̈ܝܐ\fk* \ft 5b1\ft*\f* ܠܦܪܥܘܢ. ܡܛܠ ܕܙܒ̇ܢܘ ܡܨܪ̈ܝܐ\f u \fr 47.20\fr* \fk ܡܨܪ̈ܝܐ\fk* \ft om. 5b1\ft*\f* ܓܒܪ ܚܩܠܗ. ܡܛܠ ܕܥܫ̣ܢ ܥܠܝܗܘܢ ܟܦܢܐ. ܘܗܘܬ ܐܪܥܐ ܕܦܪܥܘܢ. +\v 21 ܘܠܥܡܐ ܫ̇ܢܝ ܐܢܘܢ ܡܢ ܩ̣ܪܐ ܠܩܪܐ. ܡܢ ܣܘܦ ܬܚܘܡܗ̇ ܕܡܨܪܝܢ. ܘܥܕܡܐ ܠܣܘܦܗ̇. +\v 22 ܒܠܚܘܕ ܐܪܥܐ ܕܟܘܡܪ̈ܐ ܕܠܐ ܙܒ̣ܢ. ܡܛܠ ܕܩ̇ܝܡܬܐ ܩܝܡܐ ܗܘܬ ܠܟܘܡܪ̈ܐ ܡܢ ܠܘܬ\f v \fr 47.22\fr* \fk ܩܕܡ\fk* \ft 12a1, L\ft*\f* ܦܪܥܘܢ. ܘܐܟܠܝܢ ܗܘܘ ܩܝܡ̈ܬܗܘܢ. ܕܝܗ̇ܒ ܗܘܐ ܠܗܘܢ ܦܪܥܘܢ. ܡܛܠ ܗܢܐ ܠܐ ܙܒ̇ܢܘ ܐܪܥܗܘܢ. +\v 23 ܘܐܡ̣ܪ ܝܘܣܦ ܠܥܡܐ. ܗܐ ܙܒܢܬܟܘܢ ܝܘܡܢܐ ܠܟܘܢ ܘܠܐܪ̈ܥܬܟܘܢ ܠܦܪܥܘܢ. ܗܐ ܠܟܘܢ ܙܪܥܐ ܕܬܙܪܥܘܢ\f w \fr 47.23\fr* \fk ܘ\fk* \ft 5b1\ft*\f* ܒܐܪܥܐ. +\v 24 ܘܡܐ ܕܥܐܠܐ ܥܠܠܬܐ. ܗܘܝܬܘܢ ܝܗܒܝܢ ܚܕ ܡܢ ܚܡܫܐ ܠܦܪܥܘܢ. ܘܐܪ̈ܒܥ ܡܢ̈ܘܢ ܢܗ̈ܘܝܢ ܠܟܘܢ ܠܙܪܥܐ ܕܚܩܠܐ. ܘܠܡܐܟܘܠܬܟܘܢ ܘܠܡܐܟܘܠܬܐ ܕܒܬ̈ܝܟܘܢ. ܘܠܡܐܟܘܠܬܐ ܕܝܩܪܬܟܘܢ. +\v 25 ܘܐܡܪܘ ܐܚܝܬܢ. ܢܫܟܚ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝ ܡܪܢ. ܘܢܗܘܐ ܥܒ̈ܕܐ ܠܦܪܥܘܢ. +\v 26 ܘܣܡܗ ܝܘܣܦ ܢܡܘܣܐ [-]\f x \fr 47.26\fr* \fk ܗܢܐ\fk* \ft 7a1, 8a1c\ft*\f* ܥܕܡܐ ܠܝܘܡܢܐ. ܥܠ ܐܪܥܐ ܕܡܨܪܝܢ. ܠܦܪܥܘܢ ܚܕ ܡܢ ܚܡܫܐ. ܒܠܚܘܕ ܐܪܥܐ ܕܟܘܡܪ̈ܐ ܕܠܐ ܗܘܬ ܕܦܪܥܘܢ. +\v 27 ܘܝܬ̣ܒ ܐܝܣܪܝܠ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܘܒܐܪܥܐ ܕܓܫܢ. ܘܥܫܢܘ ܒܗ̇ ܘܟܒܪܘ\f y \fr 47.27\fr* \fk ܘܦܪܝܘ\fk* \ft 5b1\ft*\f* ܘܣܓܝܘ ܛܒ. +\v 28 ܘܚ̣ܝܐ ܝܥܩܘܒ ܒܐܪܥܐ ܕܡܨܪܝܢ ܫܒܥܣܪܐ ܫ̈ܢܝܢ. ܘܗܘܘ ܝܘܡ̈ܘܗܝ ܕܝܥܩܘܒ ܫ̈ܢܝ ܚܝ̈ܘܗܝ. ܡܐܐ ܘܐܪ̈ܒܥܝܢ ܘܫܒܥ ܫ̈ܢܝܢ. +\v 29 ܘܩܪܒܘ ܝܘܡ̈ܘܗܝ ܕܐܝܣܪܝܠ ܠܡܡܬ. ܘܩ̣ܪܐ ܠܝܘܣܦ ܒܪܗ ܘܐܡ̣ܪ ܠܗ. ܐܢ ܐ̇ܫܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟ. ܣܝܡ ܐܝܕܟ ܬܚܝܬ ܚܨܝ. ܘܐܘܡܝܟ ܒܡܪܝܐ\f z \fr 47.29\fr* \fk ܘܐܘܡܝܟ ܒܡܪܝܐ\fk* \ft om. 5b1\ft*\f*. ܘܥܒܕ ܥܡܝ ܛܝܒܘܬܐ ܘܩܘܫܬܐ. ܘܠܐ ܬܩܒܪܢܝ ܒܡܨܪܝܢ. +\v 30 ܘܐܫܟܒ ܥܡ ܐܒ̈ܗܝ. ܘܫܩܘܠܝܢܝ ܡܢ ܡܨܪܝܢ ܘܩܒܘܪܝܢܝ ܒܩܒܪܗܘܢ. ܘܐܡ̣ܪ ܝܘܣܦ\f { \fr 47.30\fr* \fk ܝܘܣܦ\fk* \ft om. 5b1\ft*\f*. ܐܢܐ ܐܥܒܕ ܐܝܟ ܡܠܬܟ. +\v 31 ܘܐܡ̣ܪ ܝܡܝ ܠܝ. ܘܝܡ̣ܐ ܠܗ ܘܣܓ̣ܕ ܐܝܣܪܝܠ ܥܠ ܪܝܫ ܚܘܛܪܗ. +\c 48 +\v 1 ܘܗܘ̣ܐ ܡܢ ܒܬܪ ܦܬ̈ܓܡܐ ܗܠܝܢ. †ܐܬܐܡܪ† ܠܝܘܣܦ ܕܗܐ\f a \fr 48.1\fr* \fk ܗܐ\fk* \ft 5b1\ft*\f* ܐܒܘܟ ܐܬܟܪܗ. ܘܕܒ̣ܪ ܠܬܪ̈ܝܢ ܒܢ̈ܘܗܝ ܥܡܗ. ܠܡܢܫܐ ܘܠܐܦܪܝܡ. +\v 2 ܘܚܘܝܘ ܠܝܥܩܘܒ ܘܐܡ̣ܪܘ ܠܗ. ܗܐ ܒܪܟ ܝܘܣܦ ܐܬ̣ܐ ܠܘܬܟ. ܘܐܬܚܝܠ ܐܝܣܪܝܠ ܘܝܬ̣ܒ ܥܠ ܥܪܣܐ. +\v 3 ܘܐܡ̣ܪ ܐܝܣܪܝܠ ܠܝܘܣܦ. ܐܝܠܫܕܝ ܐܬܓܠܝ ܥܠܝ\f b \fr 48.3\fr* \fk ܠܝ\fk* \ft L\ft*\f* ܒܠܘܙ ܒܐܪܥܐ ܕܟܢܥܢ ܘܒܪܟܢܝ. +\v 4 ܘܐܡ̣ܪ ܠܝ. ܗܐ ܡܒܪܟ\f c \fr 48.4\fr* \fk ܡܟܒܪ\fk* \ft 5b1\ft*\f* ܐܢܐ ܠܟ ܘܡܣ̇ܓܐ ܐܢܐ ܠܟ. ܘܐܬܠܟ ܠܟܢܫܐ\f d \fr 48.4\fr* \fk ܪܒܐ\fk* \ft add. 10b1\ft*\f* ܕܥܡ̈ܡܐ. ܘܐܬܠ ܐܪܥܐ ܗܕܐ ܠܙܪܥܟ ܡܢ ܒܬܪܟ. ܝܪܬܘܬܐ\f e \fr 48.4\fr* \fk ܝܘܪܬܢܐ\fk* \ft 11.10g1\ft*\f* ܠܥܠܡ. +\v 5 ܘܗܫܐ ܬܪ̈ܝܢ ܒܢܝ̈ܟ ܕܐܬܝܠܕܘ ܠܟ ܒܐܪܥܐ ܕܡܨܪܝܢ. ܥܕܠܐ ܐܬܐ ܠܘܬܟ ܠܐܪܥܐ ܕܡܨܪܝܢ ܕܝܠܝ ܐܢܘܢ. ܐܦܪܝܡ ܘܡܢܫܐ ܕܝܠܝ ܢܗܘܘܢ\f f \fr 48.5\fr* \fk ܕܝܠܝ ܢܗܘܘܢ\fk* \ft om. 5b1\ft*\f*\f g \fr 48.5\fr* \fk ܐܢܘܢ\fk* \ft 12b1\ft*\f*. ܐܝܟ ܪܘܒܝܠ ܘܐܝܟ ܫܡܥܘܢ ܢܗܘܘܢ ܠܝ. +\v 6 ܘܒ̈ܢܝܐ ܕܬܘܠܕ ܒܬܪܗܘܢ ܠܟ ܢܗܘܘܢ. ܥܠ ܫܡܐ ܕܐ̈ܚܝܗܘܢ ܢܬܩܪܘܢ ܒܝܪܬܘܬܗܘܢ. +\v 7 ܘܐܢܐ ܟܕ ܐܬ̇ܐ ܐܢܐ ܡܢ ܦܕܢ ܕܐܪܡ. ܡܝܬܬ ܥܠܝ ܪܚܝܠ [-]\f h \fr 48.7\fr* \fk ܐܡܟ\fk* \ft add. 7a1, 8a1*\ft*\f* ܒܐܪܥܐ ܕܟܢܥܢ ܒܐܘܪܚܐ. ܐܝܟ ܡܪܕܐ ܦܪܣܚܐ ܕܐܪܥܐ ܠܡܥܠ ܠܐܦܪܬ. ܘܩܒܪܬܗ̇ ܬܡ̇ܢ ܒܐܘܪܚܐ ܕܐܦܪܬ. ܗ̣ܝ ܗܝ ܒܝܬ ܠܚܡ. +\v 8 ܘܚ̣ܙܐ ܐܝܣܪܝܠ ܠܒ̈ܢܘܗܝ ܕܝܘܣܦ ܘܐܡ̣ܪ ܠܗ\f i \fr 48.8\fr* \fk ܠܗ\fk* \ft om. 5b1\ft*\f*. ܡ̇ܢ ܐܢܘܢ ܗܠܝܢ. +\v 9 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐܒܘܗܝ. ܒܢ̈ܝ ܐܢܘܢ ܕܝܗ̣ܒ ܠܝ ܐܠܗܐ ܗܪܟܐ. ܘܐܡ̣ܪ ܩ̇ܪܒ ܐܢܘܢ ܠܘܬܝ ܘܐܒܪܟ ܐܢܘܢ. +\v 10 ܘܥܝܢ̈ܘܗܝ ܕܐܝܣܪܝܠ ܝܩܪ ܡܢ ܣܝܒܘܬܐ. ܘܠܐ ܡܫܟܚ ܗܘܐ\f j \fr 48.10\fr* \fk ܗܘܐ\fk* \ft om. 5b1\ft*\f* ܕܢܚܙܐ ܫܦܝܪ\f k \fr 48.10\fr* \fk ܫܦܝܪ\fk* \ft om. 5b1\ft*\f*. ܘܩ̇ܪܒ ܐܢܘܢ ܠܘܬܗ. ܘܢܫ̇ܩ ܐܢܘܢ ܘܥܦ̇ܩ ܐܢܘܢ. +\v 11 ܘܐܡ̣ܪ ܐܝܣܪܝܠ ܠܝܘܣܦ. ܠܚܙܘܐ ܕܐ̈ܦܝܟ ܠܐ ܣܒ̇ܪܬ. ܘܗܐ ܚܘܝܢܝ ܐܠܗܐ ܐܦ\f l \fr 48.11\fr* \fk ܐܦ\fk* \ft om. 12a1\ft*\f* ܙܪܥܟ. +\v 12 ܘܐܦܪܩ\f m \fr 48.12\fr* \fk ܘܐܦܩ\fk* \ft 5b1\ft*\f* ܐܢܘܢ\f n \fr 48.12\fr* \fk ܝܘܣܦ\fk* \ft add. 5b1\ft*\f* ܡܢ ܩܕܡ ܒܘܪ̈ܟܘܗܝ. ܘܣܓܕܘ ܩܕܡܘܗܝ\f o \fr 48.12\fr* \fk ܩܕܡܘܗܝ\fk* \ft om. 5b1\ft*\f* ܥܠ ܐ̈ܦܝܗܘܢ ܥܠ ܐܪܥܐ. +\v 13 ܘܕܒ̣ܪ ܝܘܣܦ ܠܬܪ̈ܝܗܘܢ ܒܢ̈ܘܗܝ ܠܐܦܪܝܡ ܒܝܡܝܢܗ ܡܢ ܣܡܠܗ ܕܐܝܣܪܝܠ. ܘܠܡܢܫܐ ܒܣܡܠܗ ܡܢ ܝܡܝܢܗ ܕܐܝܣܪܝܠ. ܘܩ̇ܪܒ ܐܢܘܢ\f p \fr 48.13\fr* \fk ܐܢܘܢ\fk* \ft om. 5b1\ft*\f* ܠܘܬܗ. +\v 14 ܘܐܘܫܛ ܐܝܣܪܝܠ ܝܡܝܢܗ. ܘܣܡܗ̇ ܥܠ ܪܫܗ ܕܐܦܪܝܡ. ܗܘܝܘ ܙܥܘܪܐ. ܘܣܡܠܗ ܥܠ ܪܫܗ ܕܡܢܫܐ. ܫܚ̇ܠܦ ܐܢܝ̈ܢ ܐ̈ܝܕܘܗܝ. ܡܛܠ ܕܡܢܫܐ ܗܘܐ\f q \fr 48.14\fr* \fk ܗܘܐ\fk* \ft om. 5b1, 8b1\ft*\f* ܒܘܟܪܐ. +\v 15 ܘܒܪܟ ܝܥܩܘܒ ܠܝܘܣܦ ܒܪܗ\f r \fr 48.15\fr* \fk ܒܪܗ\fk* \ft om. 5b1\ft*\f*. ܘܐܡ̣ܪ ܐܠܗܐ ܕܫܦܪܘ ܩܕܡܘܗܝ ܐ̈ܒܗܝ. ܐܒܪܗܡ ܘܐܝܣܚܩ. ܐܠܗܐ ܕܬܪܣܝܢܝ ܡܢ ܛܠܝܘܬܝ ܘܥܕܡܐ ܠܝܘܡܢܐ. +\v 16 ܡܠܐܟܐ ܕܦܪܩܢܝ ܡܢ ܟܠ ܒܝܫܐ\f s \fr 48.16\fr* \fk ܥܩܐ\fk* \ft 5b1\ft*\f* ܢܒܪܟ ܠܛܠܝ̈ܐ. ܘܢܬܩܪܐ ܫܡܝ ܒܗܘܢ. ܘܫܡܐ ܕܐܒ̈ܗܝ ܐܒܪܗܡ ܘܐܝܣܚܩ. ܘܢܟܒܪܘܢ ܘܢܣܓܘܢ ܒܓܘܗ̇ ܕܐܪܥܐ. +\v 17 ܘܚ̣ܙܐ ܝܘܣܦ ܕܣܡ ܐܒܘܗܝ ܐܝܕܗ ܕܝܡܝܢܐ ܥܠ ܪܝܫܗ ܕܐܦܪܝܡ. ܘܐܬܐܒܫ ܒܥܝܢ̈ܘܗܝ ܘܣܡ̣ܟ ܠܗ̇ ܠܐܝܕܗ ܕܐܒܘܗܝ\f t \fr 48.17\fr* \fk ܕܐܒܘܗܝ\fk* \ft om. 5b1\ft*\f*. ܠܡܥܒܪܘܬܗ̇ ܡܢ ܪܫܗ ܕܐܦܪܝܡ ܘܢܣܝܡܝܗ̇ ܥܠ ܪܫܗ ܕܡܢܫܐ. +\v 18 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐܒܘܗܝ ܠܐ ܗܘ̣ܐ ܗܟܢܐ ܐܒܝ. ܐܠܐ ܗܢܘ ܒܘܟܪܐ. ܣܝܡ ܝܡܝܢܟ ܥܠ ܪܫܗ. +\v 19 ܘܠܐ ܨܒ̣ܐ ܐܒܘܗܝ. ܘܐܡ̣ܪ ܝܕܥ ܐܢܐ ܒܪܝ ܝܕܥ ܐܢܐ. ܐܦ ܗ̣ܘ ܢܗܘܐ ܠܥܡܐ. ܐܦ ܗ̣ܘ ܢܐܪܒ. ܒܪܡ ܐܚܘܗܝ ܙܥܘܪܐ ܢܐܪܒ ܡܢܗ. ܘܙܪܥܗ ܢܗܘܐ ܡܠ̣ܐ ܥܡ̈ܡܐ. +\v 20 ܘܒ̇ܪܟ ܐܢܘܢ ܒܝܘܡܐ ܗ̇ܘ ܘܐܡ̣ܪ. ܒܟ ܢܬܒܪܟ ܐܝܣܪܝܠ ܘܢܐܡܪܘܢ. ܢܥܒ̣ܕܟ\f u \fr 48.20\fr* \fk ܢܒܪܟܟ\fk* \ft 12b1\ft*\f* ܐܠܗܐ ܐܝܟ ܐܦܪܝܡ ܘܐܝܟ ܡܢܫܐ. ܘܥܒ̣ܕ ܠܐܦܪܝܡ\f v \fr 48.20\fr* \fk ܐܦܪܝܡ\fk* \ft L\ft*\f* ܩܕܡ ܡܢܫܐ. +\v 21 ܘܐܡ̣ܪ ܐܝܣܪܝܠ ܠܝܘܣܦ. ܗܐ ܐܢܐ ܡܐܬ ܐܢܐ. ܘܢܗܘܐ ܐܠܗܐ ܥܡܟܘܢ. ܘܢܗܦܟܟܘܢ ܠܐܪܥܐ ܕܐ̈ܒܗܝܟܘܢ. +\v 22 ܘܐܢܐ ܗܐ\f w \fr 48.22\fr* \fk ܗܐ\fk* \ft om. 5b1\ft*\f* ܝܗ̇ܒܬ ܠܟ ܡܢܬܐ ܚܕܐ ܝܬܝܪܬܐ ܥܠ ܐ̈ܚܝܟ. ܕܢܣ̇ܒܬ ܡܢ ܐܝܕܐ ܕܐܡܘܪ̈ܝܐ ܒܣܝܦܝ ܘܒܩܫܬܝ. +\c 49 +\v 1 ܘܩ̣ܪܐ ܝܥܩܘܒ ܠܒܢ̈ܘܗܝ ܘܐܡ̣ܪ ܠܗܘܢ\f a \fr 49.1\fr* \fk ܠܗܘܢ\fk* \ft om. 5b1, 8b1\ft*\f*. ܐܬ̇ܟܢܫܘ ܘܐܚܘܝܟܘܢ ܡܕܡ ܕܓܕܫ̇ ܠܟܘܢ ܒܚܪܬܐ ܕܝܘܡ̈ܬܐ. +\v 2 ܐܬ̇ܟܢܫܘ ܘܫܡ̣ܥܘ ܒܢ̈ܘܗܝ ܕܝܥܩܘܒ. ܫܡܥܘ ܠܐܝܣܪܐܝܠ ܐܒܘܟܘܢ. +\v 3 ܪܘܒܝܠ ܒܘܟܪܝ ܐܢܬ. ܚܝܠܝ ܘܪܝܫ ܬܘܩܦܝ. ܫܪܟܐ ܕܫܩܘܠܬܐ ܘܫܪܟܐ ܕܥܘܫܢܐ. +\v 4 ܛܥ̣ܝܬ ܐܝܟ ܡ̈ܝܐ ܠܐ ܬܦܘܫ ܕܣܠܩ̣ܬ ܠܡܫܟܒܗ ܕܐܒܘܟ. ܫܪܝܪܐܝܬ ܛܘܫ̣ܬ ܬܫܘܝܬܝ ܘܣ̣ܠܩܬ. +\v 5 ܫܡܥܘܢ ܘܠܘܝ ܐ̈ܚܐ\f b \fr 49.5\fr* \fk ܐ̈ܚܐ\fk* \ft om. 5b1, 12a1\ft*\f* ܡܐ̈ܢܐ ܕܪܘܓܙܐ ܡܢ ܟܝܢܗܘܢ. +\v 6 ܒܐܪܙܗܘܢ ܠܐ ܥܠ̣ܬ ܢܦܫܝ. ܘܒܟܢܫܗܘܢ ܠܐ ܢܚܬܬ ܡܢ ܐܝܩܪܝ. ܡܛܠ ܕܒܪܘܓܙܗܘܢ\f c \fr 49.6\fr* \fk ܒܪܐܗܘܢ\fk* \ft L\ft*\f* ܩ̣ܛܠܘ ܓܒܪ̈ܐ. ܘܒܚܡܬܗܘܢ ܥܩܪܘ ܫܘܪܐ. +\v 7 ܠܝܛ ܗ̣ܘ\f d \fr 49.7\fr* \fk ܗ̣ܘ\fk* \ft om. 5b1\ft*\f* ܪܘܓܙܗܘܢ ܡܛܠ ܕܥܫܝܢ. ܘܚܡܬܗܘܢ ܡܛܠ ܕܩܫܝܐ\f e \fr 49.7\fr* \fk ܕܒܝܫܐ\fk* \ft 12a1\ft*\f*. ܐܦ̇ܠܓ ܐܢܘܢ ܒܝܥܩܘܒ. ܘܐܒܕܪ ܐܢܘܢ ܒܐܝܣܪܝܠ. +\v 8 ܝܗܘܕܐ ܠܟ ܢܘܕܘܢ ܐ̈ܚܝܟ. ܐܝܕܟ ܥܠ ܩܕܠܐ ܕܒ̈ܥܠܕܒܒܝܟ. ܢܣܓܕܘܢ ܠܟ ܒܢ̈ܘܗܝ ܕܐܒܘܟ. +\v 9 ܓܘܪܝܐ ܕܐܪܝܐ ܝܗܘܕܐ. ܡܢ ܩܛܠܐ ܒܪܝ ܣܠܩ̣ܬ. ܒ̣ܪܟ ܘܪܒ̣ܥ ܐܝܟ ܐܪܝܐ. ܘܐܝܟ ܓܘܪܝܐ ܕܐܪܝܐ †ܘܡܢܘ† ܢܩܝܡܝܘܗܝ. +\v 10 ܠܐ ܢܥܢܕ ܫܒܛܐ ܡܢ ܝܗܘܕܐ. ܘܡܒܕܩܢܐ ܡܢ ܒܝܬ ܪ̈ܓܠܘܗܝ. ܥܕܡܐ ܕܢܐܬܐ ܡ̇ܢ ܕܕܝܠܗ ܗ̣ܝ\f f \fr 49.10\fr* \fk ܡܠܟܘܬܐ\fk* \ft add. 12b2\ft*\f*. ܘܠܗ ܢܣ̇ܟܘܢ ܥܡ̈ܡܐ. +\v 11 ܢܐܣܘܪ ܒܓܦܬܐ ܥܝܠܗ. ܘܒܫܒܘܩܐ ܒܪ ܐܬܢܗ. ܢܚܘܪ ܒܚܡܪܐ ܠܒܘܫܗ. ܘܒܕܡܐ ܕܥܢ̈ܒܐ ܬܟܣܝܬܗ. +\v 12 ܙܪܓܢ ܥܝܢ̈ܘܗܝ ܡܢ ܚܡܪܐ. ܘܚܘܪ̈ܢ ܫ̈ܢܘܗܝ ܡܢ ܚܠܒܐ. +\v 13 ܙܒܘܠܘܢ ܥܠ ܣܦܪ̈ܝ ܝܡ̈ܡܐ ܢܫܪܐ. ܘܗ̣ܘ ܥܠ ܫܘܦܪܐ ܕܣܦܝ̈ܢܐ. ܘܬܚܘܡܗ ܥܕܡܐ ܠܨܝܕܢ. +\v 14 ܐܝܣܟܪ ܓܒܪܐ ܓܢܒܪܐ. ܕܪܒܝܥ ܒܝܬ ܫܒܝ̈ܠܐ. +\v 15 ܘܚ̣ܙܐ ܡܫܪܝܗ ܕܫܦܝܪ. ܘܐܪܥܗ ܕܛܒܐ. ܘܐܪܟܢ ܟܬܦܗ ܠܫܘܥܒܕܐ. ܘܗܘ̣ܐ ܠܡܕܐܬܐ. +\v 16 ܕܢ ܢܕܘܢ ܠܥܡܗ. ܐܝܟ ܚܕ ܡܢ ܫܒ̈ܛܐ ܕܐܝܣܪܝܠ. +\v 17 ܢܗܘܐ ܕܢ ܚܘܝܐ ܕܥܠ ܐܘܪܚܐ. ܘܚܪܡܢܐ ܕܥܠ ܫܒܝ̈ܠܐ\f g \fr 49.17\fr* \fk ܘܚܪܡܢܐ ܕܥܠ ܫܒܝ̈ܠܐ\fk* \ft om. 12a1\ft*\f*. ܕܢܟܬ\f h \fr 49.17\fr* \fk ܠܗ\fk* \ft add. 5b1\ft*\f* ܠܣܘܣܝܐ ܒܥܩܒܗ. ܘܡܪܡܐ ܠܪܟܒܗ ܠܒܣܬܪܗ. +\v 18 ܠܦܘܪܩܢܟ ܣ̇ܟܝܬ ܡܪܝܐ. +\v 19 ܓܕ ܒܓܝܣܐ ܢܦܘܩ. ܘܗ̣ܘ ܢܓܕ ܥܩܒܐ. +\v 20 ܐܫܝܪ ܛܒܐ ܐܪܥܗ. ܘܗ̣ܘ ܢܬܠ ܬܘܪܣܝܐ ܠܡ̈ܠܟܐ. +\v 21 ܢܦܬܠܝ ܐܝܙܓܕܐ ܩܠܝܠܐ. ܝܗ̇ܒ ܡܐܡܪܐ ܫܦܝܪܐ. +\v 22 ܒܪܐ ܕܬܪܒܝܬܐ ܝܘܣܦ. ܒܪܐ ܕܬܪܒܝܬܐ. ܣܩܝ ܥܝܢܐ ܒܢܝܢܐ ܣܡܝܟܐ. ܕܣ̇ܠܩ ܒܫܘܪܐ. +\v 23 ܘܐܬܚܪܝܘ ܥܡܗ ܘܣܓܝܘ. ܘܣܩܪܘܗܝ ܡܪ̈ܝ ܓܘ̈ܕܐ. +\v 24 ܘܗܦ̣ܟܬ ܒܥܘܫܢܐ ܩܫܬܗ. ܘܐ̣ܬܒܕܪܘ ܕܪ̈ܥܐ ܕܐ̈ܝܕܘܗܝ. ܡܢ ܐ̈ܝܕܝ ܥܫܝܢܐ ܕܝܥܩܘܒ. ܘܡܢ ܫܡ ܪܥܝܐ ܕܟܐܦܐ ܕܐܝܣܪܝܠ. +\v 25 ܐܠܗܗ ܕܐܒܘܟ ܢܥܕܪܟ ܘܐܝܠܫܕܝ ܢܒܪܟܟ. ܒܘܪܟܬܐ ܕܫܡܝܐ ܡܢ\f i \fr 49.25\fr* \fk ܕ\fk* \ft 12b2\ft*\f* ܠܥܠ. ܒܘܪܟܬܐ ܕܬܗܘܡܐ ܕܪܒܝܥܐ ܡܢ ܠܬܚܬ. ܒܘܪܟܬܐ ܕܬܕ̈ܝܐ ܘܕܪ̈ܚܡܐ. +\v 26 ܒܘܪ̈ܟܬܗ ܕܐܒܘܟ ܥܫ̣ܢ ܥܠ ܒܘܪ̈ܟܬܐ ܕܡܘ̈ܠܕܢܝ. ܥܕܡܐ ܠܣܒܪܐ ܕܪ̈ܡܬܐ ܕܥܠܡ. ܢܗܘܝܢ ܥܠ ܪܝܫܗ ܕܝܘܣܦ ܘܥܠ ܪܝܫ ܟܠܝܠܐ ܕܐ̈ܚܘܗܝ. +\v 27 ܒܢܝܡܝܢ ܕܐܒܐ ܚܛܘܦܐ. ܒܨܦܪܐ ܢܐܟܘܠ ܒܙܬܐ. ܘܒܪܡܫܐ ܢܦ̇ܠܓ ܡܕܡ ܕܡܥܕܐ. +\v 28 ܟܠܗܘܢ ܗܠܝܢ ܫܒ̈ܛܐ ܕܐܝܣܪܝܠ ܬܪ̈ܥܣܪ. ܘܗܢܐ ܡܕܡ ܕܐܡ̣ܪ ܠܗܘܢ ܝܥܩܘܒ ܐܒܘܗܘܢ ܐܡ̣ܪ ܠܗܘܢ. ܘܒ̇ܪܟ ܐܢܘܢ. ܐܢܫ ܐܝܟ ܒܘܪܟܬܗ ܒ̇ܪܟ ܐܢܘܢ. +\v 29 ܘܦܩ̇ܕ ܐܢܘܢ ܘܐܡ̣ܪ ܠܗܘܢ ܐܒܘܗܘܢ. ܐܢܐ ܡܬܟܢܫ ܐܢܐ †ܠܘܬ† ܥܡܝ. ܩܘܒܪܘܢܝ ܠܘܬ ܐ̈ܒܗܝ. ܒܡܥܪܬܐ ܕܒܚܩܠܐ\f j \fr 49.29\fr* \fk ܕܚܩܠܐ\fk* \ft 12b1\ft*\f* ܕܥܦܪܘܢ ܚܬܝܐ. +\v 30 ܒܡܥܪܬܐ ܕܒܚܩܠܐ\f k \fr 49.30\fr* \fk ܕܚܩܠܐ\fk* \ft 12b1\ft*\f* ܐܥܝܦܬܐ. ܕܩܕܡ ܡܡܪܐ ܕܒܐܪܥܐ\f l \fr 49.30\fr* \fk ܒܐܪܥܐ\fk* \ft 5b1\ft*\f* ܕܟܢܥܢ. ܕܙܒ̣ܢ ܐܒܪܗܡ ܚܩܠܐ ܡܢ ܥܦܪܘܢ ܚܬܝܐ ܠܝܘܪܬܢܐ\f m \fr 49.30\fr* \fk ܝܘܪܬܢܐ\fk* \ft 11.10g1\ft*\f* ܕܩܒܪܐ. +\v 31 ܬܡܢ ܩܒܪܘ ܠܐܒܪܗܡ ܘܠܣܪܐ ܐܢܬܬܗ. ܘܬܡܢ ܩܒܪܘ ܠܐܝܣܚܩ ܘܠܪܦܩܐ ܐܢܬܬܗ. ܘܬܡ̇ܢ ܩܒ̇ܪܬ ܠܠܝܐ. +\v 32 ܙܒܝܢܬܐ ܕܚܩܠܐ ܘܡܥܪܬܐ ܕܒܗ̇ ܡܢ ܒܢ̈ܝ ܚܝܬ. +\v 33 ܘܟܕ ܫ̇ܠܡ ܝܥܩܘܒ ܠܡܦܩܕܘ ܠܒ̈ܢܘܗܝ. ܦܫ̣ܛ ܪ̈ܓܠܘܗܝ ܒܥܪܣܐ ܘܐܬܟܪܗ ܘܡܝܬ. ܘܐܬܟܢܫ ܠܘܬ ܥܡܗ. +\c 50 +\v 1 ܘܢܦ̣ܠ ܝܘܣܦ ܥܠ ܐ̈ܦܘܗܝ ܕܐܒܘܗܝ. ܘܒܟ̣ܐ ܥܠܘܗܝ ܘܢܫܩܗ. +\v 2 ܘܦܩ̇ܕ ܝܘܣܦ ܠܥܒ̈ܕܘܗܝ ܐ̈ܣܘܬܐ\f a \fr 50.2\fr* \fk ܠ\fk* \ft 12b2\ft*\f* ܠܡܚܢܛ ܠܐܒܘܗܝ. ܘܚܢܛܘܗܝ ܐܣ̈ܘܬܐ ܠܐܝܣܪܝܠ. +\v 3 ܘܡܠܝܘ ܠܗ ܐܪ̈ܒܥܝܢ ܝܘܡ̈ܝܢ. ܡܛܠ ܕܗܟܢܐ ܫܠܡܝܢ ܝܘܡ̈ܬܐ ܕܚ̈ܢܝܛܐ. ܘܒܟܐܘܗܝ ܡܨܪ̈ܝܐ ܫܒܥܝܢ ܝܘܡ̈ܝܢ. +\v 4 ܘܥܒܪܘ ܝܘܡ̈ܝ ܒܟܬܗ. ܘܐܡ̣ܪ ܝܘܣܦ ܠܕܒܝܬ ܦܪܥܘܢ. ܐܢ ܐܫ̇ܟܚܬ ܪ̈ܚܡܐ ܒܥܝܢ̈ܝܟܘܢ. ܐܡܪܘ ܩܕܡ ܦܪܥܘܢ. +\v 5 ܐܒܝ ܐܘܡܝܢܝ ܘܐܡ̣ܪ ܠܝ\f b \fr 50.5\fr* \fk ܠܝ\fk* \ft om. 5b1\ft*\f*. ܗܐ ܐܢܐ ܡܐ̇ܬ ܐܢܐ. ܒܩܒܪܝ ܕܙܒ̇ܢܬ ܠܝ ܒܐܪܥܐ ܕܟܢܥܢ ܬܡ̇ܢ ܬܩܒܪܢܝ. ܗܫܐ ܐܣܩ ܐܩܒܘܪ ܠܐܒܝ ܘܐܗܦܘܟ. +\v 6 ܘܐܡ̣ܪ ܦܪܥܘܢ\f c \fr 50.6\fr* \fk ܠܝܘܣܦ\fk* \ft add. 12b1mg\ft*\f*. ܣܩ ܘܩܒܘܪ ܠܐܒܘܟ ܐܝܟ ܕܐܘܡܝܟ. +\v 7 ܘܣܠ̣ܩ ܝܘܣܦ ܠܡܩܒܪ ܠܐܒܘܗܝ. ܘܣܠܩܘ ܥܡܗ ܟܠܗܘܢ ܥܒ̈ܕܘܗܝ ܕܦܪܥܘܢ ܘܣܒ̈ܐ ܕܒܝܬܗ. ܘܟܠܗܘܢ ܣ̈ܒܐ ܕܐܪܥܐ ܕܡܨܪܝܢ. +\v 8 ܘܟܠܗ ܒܝܬ ܝܘܣܦ. ܘܐܚ̈ܘܗܝ ܘܒܝܬ ܐܒܘܗܝ ܣܠܩܘ ܥܡܗ\f d \fr 50.8\fr* \fk ܣܠܩܘ ܥܡܗ\fk* \ft om. 5b1\ft*\f*. ܒܠܚܘܕ ܝܩܪܬܗܘܢ ܘܥܢܗܘܢ ܘܬܘܪ̈ܝܗܘܢ ܫܒܩܘ ܒܐܪܥܐ ܕܓܫܢ. +\v 9 ܘܣܠܩܘ ܥܡܗ ܐܦ ܡܪ̈ܟܒܬܐ ܘܦܪ̈ܫܐ\f e \fr 50.9\fr* \fk ܘܐܦ ܦܪ̈ܫܐ\fk* \ft 5b1\ft*\f*. ܘܗܘܬ ܡܫܪܝܬܐ ܕܥܫܝܢܐ\f f \fr 50.9\fr* \fk ܥܫܝܢܐ\fk* \ft 5b1\ft*\f* ܛܒ. +\v 10 ܘܐܬܘ ܥܕܡܐ ܠܐܕܪ̈ܐ ܕܐܛܪ ܕܒܥܒܪܐ ܕܝܘܪܕܢܢ. ܘܐܪܩܕܘ ܬܡ̇ܢ ܡܪܩܘܕܬܐ ܪܒܬܐ ܘܥܫܝܢܬܐ. ܘܥܒ̣ܕ ܠܐܒܘܗܝ\f g \fr 50.10\fr* \fk ܠܐܒܘܗܝ\fk* \ft om. 11.10g1\ft*\f* ܒܝܬ ܒ̈ܟܐ ܫܒܥܐ ܝܘܡ̈ܝܢ. +\v 11 ܘܚܙܘ ܝ̈ܬܒܝ ܐܪܥܐ ܟܢܥܢ̈ܝܐ ܠܐܒܠܐ ܒܐܕܪ̈ܐ ܕܐܛܪ. ܘܐܡܪܘ ܐܒܠܐ ܗܘ ܪܒܐ ܗܢܐ\f h \fr 50.11\fr* \fk ܗܢܐ\fk* \ft om. 5b1\ft*\f* ܠܡܨܪ̈ܝܐ. ܡܛܠ ܗܢܐ ܩܪܘ ܫܡܗ ܐܒܠ ܡܨܪܝܢ ܕܒܥܒܪܐ ܕܝܘܪܕܢܢ. +\v 12 ܘܥܒ̣ܕܘ ܠܗ ܒܢ̈ܘܗܝ ܗܟܢܐ ܐܝܟ ܕܦܩ̇ܕ ܐܢܘܢ. +\v 13 ܘܫܩܠܘܗܝ ܘܐܘܒܠܘܗܝ\f i \fr 50.13\fr* \fk ܘܐܘܒܠܘܗܝ\fk* \ft om. 5b1\ft*\f* ܠܐܪܥܐ ܕܟܢܥܢ. ܘܩܒܪܘܗܝ ܒܡܥܪܬܐ †ܕܒܚܩܠܐ†\f j \fr 50.13\fr* \fk ܕܚܩܠܐ\fk* \ft 5b1, 7a1\ft*\f* ܐܥܝܦܬܐ. ܕܙܒ̣ܢ ܐܒܪܗܡ ܚܩܠܐ ܠܝܘܪܬܢܐ ܕܩܒܪܐ. ܡܢ ܥܦܪܘܢ ܚܬܝܐ ܕܩܕܡ ܡܡܪܐ. +\v 14 ܘܗ̣ܦܟ ܝܘܣܦ ܠܡܨܪܝܢ ܗ̣ܘ ܘܐ̈ܚܘܗܝ. ܘܟܠ ܕܣܠܩܘ ܥܡܗ ܠܡܩܒܪ ܠܐܒܘܗܝ. ܘܡܢ ܒܬܪ ܕܩܒ̣ܪ ܠܐܒܘܗܝ. +\v 15 ܚܙܘ ܐܚ̈ܘܗܝ ܕܝܘܣܦ ܕܡܝܬ ܐܒܘܗܘܢ ܘܕܚܠܘ\f k \fr 50.15\fr* \fk ܘܕܚܠܘ\fk* \ft om. 5b1\ft*\f*. ܘܐܡܪܝܢ ܕܠܡܐ ܢܗܪܢ ܝܘܣܦ. ܘܕܠܡܐ ܢܦܪܥܢ ܟܘܠܗ̇ ܒܝܫܬܐ ܕܥܒܕܢ ܠܗ. +\v 16 ܘܦܩܕܘ\f l \fr 50.16\fr* \fk ܘܩܪܒܘ\fk* \ft E, W, M, U, L\ft*\f* ܠܘܬ ܝܘܣܦ ܘܐܡܪܘ ܠܗ. ܐܒܘܟ ܦܩ̇ܕ ܩܕܡ ܡܘܬܗ ܘܐܡ̣ܪ. +\v 17 ܗܟܢܐ ܬܐܡܪܘܢ ܠܝܘܣܦ. ܒܒܥܘ ܫܒܘܩ ܣܟܠܘܬܐ ܠܐܚ̈ܝܟ. ܘܠܚ̈ܛܗܝܗܘܢ ܕܥܒ̣ܕܘ ܠܟ ܒܝܫܬܐ. ܘܗܫܐ ܫܒܘܩ ܣܟܠܘܬܐ ܕܥܒ̈ܕܝ ܐܠܗܗ ܕܐܒܘܟ. ܘܒܟ̣ܐ ܝܘܣܦ ܟܕ ܐܡܪܘ ܠܗ. +\v 18 ܘܐܙܠܘ ܐܦ\f m \fr 50.18\fr* \fk ܐܦ\fk* \ft om. E, W, M, U, L\ft*\f* ܐ̈ܚܘܗܝ ܘܢܦܠܘ ܩܕܡܘܗܝ. ܘܐܡܪܘ ܗܐ ܚܢܢ ܠܟ ܥܒ̈ܕܐ. +\v 19 ܘܐܡ̣ܪ ܠܗܘܢ ܝܘܣܦ. ܠܐ ܬܕܚܠܘܢ. ܡܛܠ ܕܬܚܝܬ ܐܠܗܐ ܐܢܐ. +\v 20 ܐܢܬܘܢ ܐܬ̇ܚܫܒܬܘܢ ܥܠܝ ܒܝܫܬܐ. ܘܐܠܗܐ ܐܬܚܫܒܗ̇ ܠܛܒܬܐ\f n \fr 50.20\fr* \fk ܛܒܬܐ\fk* \ft 5b1\ft*\f*. ܕܢܥܒܕ ܐܝܟ ܕܝܘܡܢܐ\f o \fr 50.20\fr* \fk ܝܘܡܢܐ\fk* \ft 5b1\ft*\f* ܘܢܚ̣ܐ ܥܡܐ ܣܓܝܐܐ. +\v 21 ܘܗܫܐ ܠܐ ܬܕܚܠܘܢ. ܐܢܐ ܐܬܪܣܝܟܘܢ ܘܠܝܩܪܬܟܘܢ. ܘܒܝܐ ܐܢܘܢ ܘܡܠ̣ܐ ܒܠܒܗܘܢ. +\v 22 ܘܝܬ̣ܒ ܝܘܣܦ ܒܡܨܪܝܢ ܗ̣ܘ ܘܟܠܗ ܒܝܬ\f p \fr 50.22\fr* \fk ܘܒܝܬ\fk* \ft 5b1\ft*\f* ܐܒܘܗܝ. ܘܚ̣ܝܐ ܝܘܣܦ ܡܐܐ ܘܥܣܪ ܫ̈ܢܝܢ. +\v 23 ܘܚ̣ܙܐ ܝܘܣܦ ܠܐܦܪܝܡ ܒܢ̈ܝܐ ܬܠܝܬ̈ܝܐ. ܐܦ ܒܢ̈ܘܗܝ ܕܡܟܝܪ ܒܪ ܡܢܫܐ. ܐܬܝܠܕܘ ܥܠ ܒܘܪ̈ܟܘܗܝ ܕܝܘܣܦ. +\v 24 ܘܐܡ̣ܪ ܝܘܣܦ ܠܐ̈ܚܘܗܝ. ܐܢܐ ܡܐܬ ܐܢܐ. ܘܐܠܗܐ ܡܬܕܟܪܘ ܡܬܕܟܪ ܠܟܘܢ. ܘܡ̇ܣܩ ܠܟܘܢ ܡܢ ܐܪܥܐ ܗܕܐ. ܠܐܪܥܐ ܕܝܡ̣ܐ ܠܐܒܪܗܡ ܘܠܐܝܣܚܩ ܘܠܝܥܩܘܒ. +\v 25 ܘܐܘܡܝ ܝܘܣܦ ܠܒܢ̈ܝ ܐܝܣܪܝܠ ܘܐܡܪ\f q \fr 50.25\fr* \fk ܠܗܘܢ\fk* \ft add. 11.10g1\ft*\f*. ܡܬܕܟܪܘ ܡܬܕܟܪ ܠܟܘܢ ܐܠܗܐ. ܐܣܩܘ ܓܪ̈ܡܝ ܡܟܐ ܥܡܟܘܢ. +\v 26 ܘܡܝܬ ܝܘܣܦ ܒܪ ܡܐܐ ܘܥܣܪ̈ ܫܢܝ̈ܢ. ܘܚܢܛܘܗܝ ܘܣܡܘܗܝ ܒܕܘܦܢܐ ܒܡܨܪܝܢ. \ No newline at end of file diff --git a/c-sharp/assets/WEB/02EXOengWEBUS.SFM b/c-sharp/assets/WEB/02EXOengWEBUS.SFM new file mode 100644 index 0000000000..9a26d4c60c --- /dev/null +++ b/c-sharp/assets/WEB/02EXOengWEBUS.SFM @@ -0,0 +1,1659 @@ +\id EXO World English Bible (WEB) +\ide UTF-8 +\h Exodus +\toc1 The Second Book of Mosis, Commonly Called Exodus +\toc2 Exodus +\toc3 Exodus +\mt2 The Second Book of Moses, +\mt3 Commonly Called +\mt1 Exodus +\c 1 +\p +\v 1 Now these are the names of the sons of Israel, who came into Egypt (every man and his household came with Jacob): +\v 2 Reuben, Simeon, Levi, and Judah, +\v 3 Issachar, Zebulun, and Benjamin, +\v 4 Dan and Naphtali, Gad and Asher. +\v 5 All the souls who came out of Jacob’s body were seventy souls, and Joseph was in Egypt already. +\v 6 Joseph died, as did all his brothers, and all that generation. +\v 7 The children of Israel were fruitful, and increased abundantly, and multiplied, and grew exceedingly mighty; and the land was filled with them. +\p +\v 8 Now there arose a new king over Egypt, who didn’t know Joseph. +\v 9 He said to his people, “Behold,\f + \fr 1:9 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the people of the children of Israel are more and mightier than we. +\v 10 Come, let’s deal wisely with them, lest they multiply, and it happen that when any war breaks out, they also join themselves to our enemies and fight against us, and escape out of the land.” +\v 11 Therefore they set taskmasters over them to afflict them with their burdens. They built storage cities for Pharaoh: Pithom and Raamses. +\v 12 But the more they afflicted them, the more they multiplied and the more they spread out. They started to dread the children of Israel. +\v 13 The Egyptians ruthlessly made the children of Israel serve, +\v 14 and they made their lives bitter with hard service in mortar and in brick, and in all kinds of service in the field, all their service, in which they ruthlessly made them serve. +\p +\v 15 The king of Egypt spoke to the Hebrew midwives, of whom the name of the one was Shiphrah, and the name of the other Puah, +\v 16 and he said, “When you perform the duty of a midwife to the Hebrew women, and see them on the birth stool, if it is a son, then you shall kill him; but if it is a daughter, then she shall live.” +\v 17 But the midwives feared God,\f + \fr 1:17 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* and didn’t do what the king of Egypt commanded them, but saved the baby boys alive. +\v 18 The king of Egypt called for the midwives, and said to them, “Why have you done this thing and saved the boys alive?” +\p +\v 19 The midwives said to Pharaoh, “Because the Hebrew women aren’t like the Egyptian women; for they are vigorous and give birth before the midwife comes to them.” +\p +\v 20 God dealt well with the midwives, and the people multiplied, and grew very mighty. +\v 21 Because the midwives feared God, he gave them families. +\v 22 Pharaoh commanded all his people, saying, “You shall cast every son who is born into the river, and every daughter you shall save alive.” +\c 2 +\p +\v 1 A man of the house of Levi went and took a daughter of Levi as his wife. +\v 2 The woman conceived and bore a son. When she saw that he was a fine child, she hid him three months. +\v 3 When she could no longer hide him, she took a papyrus basket for him, and coated it with tar and with pitch. She put the child in it, and laid it in the reeds by the river’s bank. +\v 4 His sister stood far off, to see what would be done to him. +\v 5 Pharaoh’s daughter came down to bathe at the river. Her maidens walked along by the riverside. She saw the basket among the reeds, and sent her servant to get it. +\v 6 She opened it, and saw the child, and behold, the baby cried. She had compassion on him, and said, “This is one of the Hebrews’ children.” +\p +\v 7 Then his sister said to Pharaoh’s daughter, “Should I go and call a nurse for you from the Hebrew women, that she may nurse the child for you?” +\p +\v 8 Pharaoh’s daughter said to her, “Go.” +\p The young woman went and called the child’s mother. +\v 9 Pharaoh’s daughter said to her, “Take this child away, and nurse him for me, and I will give you your wages.” +\p The woman took the child, and nursed it. +\v 10 The child grew, and she brought him to Pharaoh’s daughter, and he became her son. She named him Moses,\f + \fr 2:10 \ft “Moses” sounds like the Hebrew for “draw out”.\f* and said, “Because I drew him out of the water.” +\p +\v 11 In those days, when Moses had grown up, he went out to his brothers and saw their burdens. He saw an Egyptian striking a Hebrew, one of his brothers. +\v 12 He looked this way and that way, and when he saw that there was no one, he killed the Egyptian, and hid him in the sand. +\p +\v 13 He went out the second day, and behold, two men of the Hebrews were fighting with each other. He said to him who did the wrong, “Why do you strike your fellow?” +\p +\v 14 He said, “Who made you a prince and a judge over us? Do you plan to kill me, as you killed the Egyptian?” +\p Moses was afraid, and said, “Surely this thing is known.” +\v 15 Now when Pharaoh heard this thing, he sought to kill Moses. But Moses fled from the face of Pharaoh, and lived in the land of Midian, and he sat down by a well. +\p +\v 16 Now the priest of Midian had seven daughters. They came and drew water, and filled the troughs to water their father’s flock. +\v 17 The shepherds came and drove them away; but Moses stood up and helped them, and watered their flock. +\v 18 When they came to Reuel, their father, he said, “How is it that you have returned so early today?” +\p +\v 19 They said, “An Egyptian delivered us out of the hand of the shepherds, and moreover he drew water for us, and watered the flock.” +\p +\v 20 He said to his daughters, “Where is he? Why is it that you have left the man? Call him, that he may eat bread.” +\p +\v 21 Moses was content to dwell with the man. He gave Moses Zipporah, his daughter. +\v 22 She bore a son, and he named him Gershom,\f + \fr 2:22 \ft “Gershom” sounds like the Hebrew for “an alien there”.\f* for he said, “I have lived as a foreigner in a foreign land.” +\p +\v 23 In the course of those many days, the king of Egypt died, and the children of Israel sighed because of the bondage, and they cried, and their cry came up to God because of the bondage. +\v 24 God heard their groaning, and God remembered his covenant with Abraham, with Isaac, and with Jacob. +\v 25 God saw the children of Israel, and God understood. +\c 3 +\p +\v 1 Now Moses was keeping the flock of Jethro, his father-in-law, the priest of Midian, and he led the flock to the back of the wilderness, and came to God’s mountain, to Horeb. +\v 2 Yahweh’s\f + \fr 3:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* angel appeared to him in a flame of fire out of the middle of a bush. He looked, and behold, the bush burned with fire, and the bush was not consumed. +\v 3 Moses said, “I will go now, and see this great sight, why the bush is not burned.” +\p +\v 4 When Yahweh saw that he came over to see, God called to him out of the middle of the bush, and said, “Moses! Moses!” +\p He said, “Here I am.” +\p +\v 5 He said, “Don’t come close. Take off your sandals, for the place you are standing on is holy ground.” +\v 6 Moreover he said, “I am the God of your father, the God of Abraham, the God of Isaac, and the God of Jacob.” +\p Moses hid his face because he was afraid to look at God. +\p +\v 7 Yahweh said, “I have surely seen the affliction of my people who are in Egypt, and have heard their cry because of their taskmasters, for I know their sorrows. +\v 8 I have come down to deliver them out of the hand of the Egyptians, and to bring them up out of that land to a good and large land, to a land flowing with milk and honey; to the place of the Canaanite, the Hittite, the Amorite, the Perizzite, the Hivite, and the Jebusite. +\v 9 Now, behold, the cry of the children of Israel has come to me. Moreover I have seen the oppression with which the Egyptians oppress them. +\v 10 Come now therefore, and I will send you to Pharaoh, that you may bring my people, the children of Israel, out of Egypt.” +\p +\v 11 Moses said to God, “Who am I, that I should go to Pharaoh, and that I should bring the children of Israel out of Egypt?” +\p +\v 12 He said, “Certainly I will be with you. This will be the token to you, that I have sent you: when you have brought the people out of Egypt, you shall serve God on this mountain.” +\p +\v 13 Moses said to God, “Behold, when I come to the children of Israel, and tell them, ‘The God of your fathers has sent me to you,’ and they ask me, ‘What is his name?’ what should I tell them?” +\p +\v 14 God said to Moses, “I AM WHO I AM,” and he said, “You shall tell the children of Israel this: ‘I AM has sent me to you.’” +\v 15 God said moreover to Moses, “You shall tell the children of Israel this, ‘Yahweh, the God of your fathers, the God of Abraham, the God of Isaac, and the God of Jacob, has sent me to you.’ This is my name forever, and this is my memorial to all generations. +\v 16 Go and gather the elders of Israel together, and tell them, ‘Yahweh, the God of your fathers, the God of Abraham, of Isaac, and of Jacob, has appeared to me, saying, “I have surely visited you, and seen that which is done to you in Egypt. +\v 17 I have said, I will bring you up out of the affliction of Egypt to the land of the Canaanite, the Hittite, the Amorite, the Perizzite, the Hivite, and the Jebusite, to a land flowing with milk and honey.”’ +\v 18 They will listen to your voice. You shall come, you and the elders of Israel, to the king of Egypt, and you shall tell him, ‘Yahweh, the God of the Hebrews, has met with us. Now please let us go three days’ journey into the wilderness, that we may sacrifice to Yahweh, our God.’ +\v 19 I know that the king of Egypt won’t give you permission to go, no, not by a mighty hand. +\v 20 I will reach out my hand and strike Egypt with all my wonders which I will do among them, and after that he will let you go. +\v 21 I will give this people favor in the sight of the Egyptians, and it will happen that when you go, you shall not go empty-handed. +\v 22 But every woman shall ask of her neighbor, and of her who visits her house, jewels of silver, jewels of gold, and clothing. You shall put them on your sons, and on your daughters. You shall plunder the Egyptians.” +\c 4 +\p +\v 1 Moses answered, “But, behold, they will not believe me, nor listen to my voice; for they will say, ‘Yahweh has not appeared to you.’” +\p +\v 2 Yahweh said to him, “What is that in your hand?” +\p He said, “A rod.” +\p +\v 3 He said, “Throw it on the ground.” +\p He threw it on the ground, and it became a snake; and Moses ran away from it. +\p +\v 4 Yahweh said to Moses, “Stretch out your hand, and take it by the tail.” +\p He stretched out his hand, and took hold of it, and it became a rod in his hand. +\p +\v 5 “This is so that they may believe that Yahweh, the God of their fathers, the God of Abraham, the God of Isaac, and the God of Jacob, has appeared to you.” +\v 6 Yahweh said furthermore to him, “Now put your hand inside your cloak.” +\p He put his hand inside his cloak, and when he took it out, behold, his hand was leprous, as white as snow. +\p +\v 7 He said, “Put your hand inside your cloak again.” +\p He put his hand inside his cloak again, and when he took it out of his cloak, behold, it had turned again as his other flesh. +\p +\v 8 “It will happen, if they will not believe you or listen to the voice of the first sign, that they will believe the voice of the latter sign. +\v 9 It will happen, if they will not believe even these two signs or listen to your voice, that you shall take of the water of the river, and pour it on the dry land. The water which you take out of the river will become blood on the dry land.” +\p +\v 10 Moses said to Yahweh, “O Lord,\f + \fr 4:10 \ft The word translated “Lord” is “Adonai”.\f* I am not eloquent, neither before now, nor since you have spoken to your servant; for I am slow of speech, and of a slow tongue.” +\p +\v 11 Yahweh said to him, “Who made man’s mouth? Or who makes one mute, or deaf, or seeing, or blind? Isn’t it I, Yahweh? +\v 12 Now therefore go, and I will be with your mouth, and teach you what you shall speak.” +\p +\v 13 Moses said, “Oh, Lord, please send someone else.” +\p +\v 14 Yahweh’s anger burned against Moses, and he said, “What about Aaron, your brother, the Levite? I know that he can speak well. Also, behold, he is coming out to meet you. When he sees you, he will be glad in his heart. +\v 15 You shall speak to him, and put the words in his mouth. I will be with your mouth, and with his mouth, and will teach you what you shall do. +\v 16 He will be your spokesman to the people. It will happen that he will be to you a mouth, and you will be to him as God. +\v 17 You shall take this rod in your hand, with which you shall do the signs.” +\p +\v 18 Moses went and returned to Jethro his father-in-law, and said to him, “Please let me go and return to my brothers who are in Egypt, and see whether they are still alive.” +\p Jethro said to Moses, “Go in peace.” +\p +\v 19 Yahweh said to Moses in Midian, “Go, return into Egypt; for all the men who sought your life are dead.” +\p +\v 20 Moses took his wife and his sons, and set them on a donkey, and he returned to the land of Egypt. Moses took God’s rod in his hand. +\v 21 Yahweh said to Moses, “When you go back into Egypt, see that you do before Pharaoh all the wonders which I have put in your hand, but I will harden his heart and he will not let the people go. +\v 22 You shall tell Pharaoh, ‘Yahweh says, Israel is my son, my firstborn, +\v 23 and I have said to you, “Let my son go, that he may serve me;” and you have refused to let him go. Behold, I will kill your firstborn son.’” +\p +\v 24 On the way at a lodging place, Yahweh met Moses and wanted to kill him. +\v 25 Then Zipporah took a flint, and cut off the foreskin of her son, and cast it at his feet; and she said, “Surely you are a bridegroom of blood to me.” +\p +\v 26 So he let him alone. Then she said, “You are a bridegroom of blood,” because of the circumcision. +\p +\v 27 Yahweh said to Aaron, “Go into the wilderness to meet Moses.” +\p He went, and met him on God’s mountain, and kissed him. +\v 28 Moses told Aaron all Yahweh’s words with which he had sent him, and all the signs with which he had instructed him. +\v 29 Moses and Aaron went and gathered together all the elders of the children of Israel. +\v 30 Aaron spoke all the words which Yahweh had spoken to Moses, and did the signs in the sight of the people. +\v 31 The people believed, and when they heard that Yahweh had visited the children of Israel, and that he had seen their affliction, then they bowed their heads and worshiped. +\c 5 +\p +\v 1 Afterward Moses and Aaron came, and said to Pharaoh, “This is what Yahweh, the God of Israel, says, ‘Let my people go, that they may hold a feast to me in the wilderness.’” +\p +\v 2 Pharaoh said, “Who is Yahweh, that I should listen to his voice to let Israel go? I don’t know Yahweh, and moreover I will not let Israel go.” +\p +\v 3 They said, “The God of the Hebrews has met with us. Please let us go three days’ journey into the wilderness, and sacrifice to Yahweh, our God, lest he fall on us with pestilence, or with the sword.” +\p +\v 4 The king of Egypt said to them, “Why do you, Moses and Aaron, take the people from their work? Get back to your burdens!” +\v 5 Pharaoh said, “Behold, the people of the land are now many, and you make them rest from their burdens.” +\v 6 The same day Pharaoh commanded the taskmasters of the people and their officers, saying, +\v 7 “You shall no longer give the people straw to make brick, as before. Let them go and gather straw for themselves. +\v 8 You shall require from them the number of the bricks which they made before. You shall not diminish anything of it, for they are idle. Therefore they cry, saying, ‘Let’s go and sacrifice to our God.’ +\v 9 Let heavier work be laid on the men, that they may labor in it. Don’t let them pay any attention to lying words.” +\p +\v 10 The taskmasters of the people went out with their officers, and they spoke to the people, saying, “This is what Pharaoh says: ‘I will not give you straw. +\v 11 Go yourselves, get straw where you can find it, for nothing of your work shall be diminished.’” +\v 12 So the people were scattered abroad throughout all the land of Egypt to gather stubble for straw. +\v 13 The taskmasters were urgent saying, “Fulfill your work quota daily, as when there was straw!” +\v 14 The officers of the children of Israel, whom Pharaoh’s taskmasters had set over them, were beaten, and were asked, “Why haven’t you fulfilled your quota both yesterday and today, in making brick as before?” +\p +\v 15 Then the officers of the children of Israel came and cried to Pharaoh, saying, “Why do you deal this way with your servants? +\v 16 No straw is given to your servants, and they tell us, ‘Make brick!’ and behold, your servants are beaten; but the fault is in your own people.” +\p +\v 17 But Pharaoh said, “You are idle! You are idle! Therefore you say, ‘Let’s go and sacrifice to Yahweh.’ +\v 18 Go therefore now, and work; for no straw shall be given to you; yet you shall deliver the same number of bricks!” +\p +\v 19 The officers of the children of Israel saw that they were in trouble when it was said, “You shall not diminish anything from your daily quota of bricks!” +\p +\v 20 They met Moses and Aaron, who stood along the way, as they came out from Pharaoh. +\v 21 They said to them, “May Yahweh look at you and judge, because you have made us a stench to be abhorred in the eyes of Pharaoh, and in the eyes of his servants, to put a sword in their hand to kill us!” +\p +\v 22 Moses returned to Yahweh, and said, “Lord, why have you brought trouble on this people? Why is it that you have sent me? +\v 23 For since I came to Pharaoh to speak in your name, he has brought trouble on this people. You have not rescued your people at all!” +\c 6 +\p +\v 1 Yahweh said to Moses, “Now you shall see what I will do to Pharaoh, for by a strong hand he shall let them go, and by a strong hand he shall drive them out of his land.” +\p +\v 2 God spoke to Moses, and said to him, “I am Yahweh. +\v 3 I appeared to Abraham, to Isaac, and to Jacob, as God Almighty; but by my name Yahweh I was not known to them. +\v 4 I have also established my covenant with them, to give them the land of Canaan, the land of their travels, in which they lived as aliens. +\v 5 Moreover I have heard the groaning of the children of Israel, whom the Egyptians keep in bondage, and I have remembered my covenant. +\v 6 Therefore tell the children of Israel, ‘I am Yahweh, and I will bring you out from under the burdens of the Egyptians, and I will rid you out of their bondage, and I will redeem you with an outstretched arm, and with great judgments. +\v 7 I will take you to myself for a people. I will be your God; and you shall know that I am Yahweh your God, who brings you out from under the burdens of the Egyptians. +\v 8 I will bring you into the land which I swore to give to Abraham, to Isaac, and to Jacob; and I will give it to you for a heritage: I am Yahweh.’” +\p +\v 9 Moses spoke so to the children of Israel, but they didn’t listen to Moses for anguish of spirit, and for cruel bondage. +\p +\v 10 Yahweh spoke to Moses, saying, +\v 11 “Go in, speak to Pharaoh king of Egypt, that he let the children of Israel go out of his land.” +\p +\v 12 Moses spoke before Yahweh, saying, “Behold, the children of Israel haven’t listened to me. How then shall Pharaoh listen to me, when I have uncircumcised lips?” +\v 13 Yahweh spoke to Moses and to Aaron, and gave them a command to the children of Israel, and to Pharaoh king of Egypt, to bring the children of Israel out of the land of Egypt. +\p +\v 14 These are the heads of their fathers’ houses. The sons of Reuben the firstborn of Israel: Hanoch, and Pallu, Hezron, and Carmi; these are the families of Reuben. +\v 15 The sons of Simeon: Jemuel, and Jamin, and Ohad, and Jachin, and Zohar, and Shaul the son of a Canaanite woman; these are the families of Simeon. +\v 16 These are the names of the sons of Levi according to their generations: Gershon, and Kohath, and Merari; and the years of the life of Levi were one hundred thirty-seven years. +\v 17 The sons of Gershon: Libni and Shimei, according to their families. +\v 18 The sons of Kohath: Amram, and Izhar, and Hebron, and Uzziel; and the years of the life of Kohath were one hundred thirty-three years. +\v 19 The sons of Merari: Mahli and Mushi. These are the families of the Levites according to their generations. +\v 20 Amram took Jochebed his father’s sister to himself as wife; and she bore him Aaron and Moses. The years of the life of Amram were one hundred thirty-seven years. +\v 21 The sons of Izhar: Korah, and Nepheg, and Zichri. +\v 22 The sons of Uzziel: Mishael, Elzaphan, and Sithri. +\v 23 Aaron took Elisheba, the daughter of Amminadab, the sister of Nahshon, as his wife; and she bore him Nadab and Abihu, Eleazar and Ithamar. +\v 24 The sons of Korah: Assir, Elkanah, and Abiasaph; these are the families of the Korahites. +\v 25 Eleazar Aaron’s son took one of the daughters of Putiel as his wife; and she bore him Phinehas. These are the heads of the fathers’ houses of the Levites according to their families. +\v 26 These are that Aaron and Moses to whom Yahweh said, “Bring out the children of Israel from the land of Egypt according to their armies.” +\v 27 These are those who spoke to Pharaoh king of Egypt, to bring out the children of Israel from Egypt. These are that Moses and Aaron. +\p +\v 28 On the day when Yahweh spoke to Moses in the land of Egypt, +\v 29 Yahweh said to Moses, “I am Yahweh. Tell Pharaoh king of Egypt all that I tell you.” +\p +\v 30 Moses said before Yahweh, “Behold, I am of uncircumcised lips, and how shall Pharaoh listen to me?” +\c 7 +\p +\v 1 Yahweh said to Moses, “Behold, I have made you as God to Pharaoh; and Aaron your brother shall be your prophet. +\v 2 You shall speak all that I command you; and Aaron your brother shall speak to Pharaoh, that he let the children of Israel go out of his land. +\v 3 I will harden Pharaoh’s heart, and multiply my signs and my wonders in the land of Egypt. +\v 4 But Pharaoh will not listen to you, so I will lay my hand on Egypt, and bring out my armies, my people the children of Israel, out of the land of Egypt by great judgments. +\v 5 The Egyptians shall know that I am Yahweh when I stretch out my hand on Egypt, and bring the children of Israel out from among them.” +\p +\v 6 Moses and Aaron did so. As Yahweh commanded them, so they did. +\v 7 Moses was eighty years old, and Aaron eighty-three years old, when they spoke to Pharaoh. +\p +\v 8 Yahweh spoke to Moses and to Aaron, saying, +\v 9 “When Pharaoh speaks to you, saying, ‘Perform a miracle!’ then you shall tell Aaron, ‘Take your rod, and cast it down before Pharaoh, and it will become a serpent.’” +\p +\v 10 Moses and Aaron went in to Pharaoh, and they did so, as Yahweh had commanded. Aaron cast down his rod before Pharaoh and before his servants, and it became a serpent. +\v 11 Then Pharaoh also called for the wise men and the sorcerers. They also, the magicians of Egypt, did the same thing with their enchantments. +\v 12 For they each cast down their rods, and they became serpents; but Aaron’s rod swallowed up their rods. +\v 13 Pharaoh’s heart was hardened, and he didn’t listen to them, as Yahweh had spoken. +\p +\v 14 Yahweh said to Moses, “Pharaoh’s heart is stubborn. He refuses to let the people go. +\v 15 Go to Pharaoh in the morning. Behold, he is going out to the water. You shall stand by the river’s bank to meet him. You shall take the rod which was turned to a serpent in your hand. +\v 16 You shall tell him, ‘Yahweh, the God of the Hebrews, has sent me to you, saying, “Let my people go, that they may serve me in the wilderness. Behold, until now you haven’t listened.” +\v 17 Yahweh says, “In this you shall know that I am Yahweh. Behold: I will strike with the rod that is in my hand on the waters which are in the river, and they shall be turned to blood. +\v 18 The fish that are in the river will die and the river will become foul. The Egyptians will loathe to drink water from the river.”’” +\v 19 Yahweh said to Moses, “Tell Aaron, ‘Take your rod, and stretch out your hand over the waters of Egypt, over their rivers, over their streams, and over their pools, and over all their ponds of water, that they may become blood. There will be blood throughout all the land of Egypt, both in vessels of wood and in vessels of stone.’” +\p +\v 20 Moses and Aaron did so, as Yahweh commanded; and he lifted up the rod, and struck the waters that were in the river, in the sight of Pharaoh, and in the sight of his servants; and all the waters that were in the river were turned to blood. +\v 21 The fish that were in the river died. The river became foul. The Egyptians couldn’t drink water from the river. The blood was throughout all the land of Egypt. +\v 22 The magicians of Egypt did the same thing with their enchantments. So Pharaoh’s heart was hardened, and he didn’t listen to them, as Yahweh had spoken. +\v 23 Pharaoh turned and went into his house, and he didn’t even take this to heart. +\v 24 All the Egyptians dug around the river for water to drink; for they couldn’t drink the river water. +\v 25 Seven days were fulfilled, after Yahweh had struck the river. +\c 8 +\p +\v 1 Yahweh spoke to Moses, “Go in to Pharaoh, and tell him, ‘This is what Yahweh says, “Let my people go, that they may serve me. +\v 2 If you refuse to let them go, behold, I will plague all your borders with frogs. +\v 3 The river will swarm with frogs, which will go up and come into your house, and into your bedroom, and on your bed, and into the house of your servants, and on your people, and into your ovens, and into your kneading troughs. +\v 4 The frogs shall come up both on you, and on your people, and on all your servants.”’” +\v 5 Yahweh said to Moses, “Tell Aaron, ‘Stretch out your hand with your rod over the rivers, over the streams, and over the pools, and cause frogs to come up on the land of Egypt.’” +\v 6 Aaron stretched out his hand over the waters of Egypt; and the frogs came up, and covered the land of Egypt. +\v 7 The magicians did the same thing with their enchantments, and brought up frogs on the land of Egypt. +\p +\v 8 Then Pharaoh called for Moses and Aaron, and said, “Entreat Yahweh, that he take away the frogs from me and from my people; and I will let the people go, that they may sacrifice to Yahweh.” +\p +\v 9 Moses said to Pharaoh, “I give you the honor of setting the time that I should pray for you, and for your servants, and for your people, that the frogs be destroyed from you and your houses, and remain in the river only.” +\p +\v 10 Pharaoh said, “Tomorrow.” +\p Moses said, “Let it be according to your word, that you may know that there is no one like Yahweh our God. +\v 11 The frogs shall depart from you, and from your houses, and from your servants, and from your people. They shall remain in the river only.” +\p +\v 12 Moses and Aaron went out from Pharaoh, and Moses cried to Yahweh concerning the frogs which he had brought on Pharaoh. +\v 13 Yahweh did according to the word of Moses, and the frogs died out of the houses, out of the courts, and out of the fields. +\v 14 They gathered them together in heaps, and the land stank. +\v 15 But when Pharaoh saw that there was a respite, he hardened his heart, and didn’t listen to them, as Yahweh had spoken. +\p +\v 16 Yahweh said to Moses, “Tell Aaron, ‘Stretch out your rod, and strike the dust of the earth, that it may become lice throughout all the land of Egypt.’” +\v 17 They did so; and Aaron stretched out his hand with his rod, and struck the dust of the earth, and there were lice on man, and on animal; all the dust of the earth became lice throughout all the land of Egypt. +\v 18 The magicians tried with their enchantments to produce lice, but they couldn’t. There were lice on man, and on animal. +\v 19 Then the magicians said to Pharaoh, “This is God’s finger;” but Pharaoh’s heart was hardened, and he didn’t listen to them, as Yahweh had spoken. +\p +\v 20 Yahweh said to Moses, “Rise up early in the morning, and stand before Pharaoh; behold, he comes out to the water; and tell him, ‘This is what Yahweh says, “Let my people go, that they may serve me. +\v 21 Else, if you will not let my people go, behold, I will send swarms of flies on you, and on your servants, and on your people, and into your houses. The houses of the Egyptians shall be full of swarms of flies, and also the ground they are on. +\v 22 I will set apart in that day the land of Goshen, in which my people dwell, that no swarms of flies shall be there, to the end you may know that I am Yahweh on the earth. +\v 23 I will put a division between my people and your people. This sign shall happen by tomorrow.”’” +\v 24 Yahweh did so; and there came grievous swarms of flies into the house of Pharaoh, and into his servants’ houses. In all the land of Egypt the land was corrupted by reason of the swarms of flies. +\p +\v 25 Pharaoh called for Moses and for Aaron, and said, “Go, sacrifice to your God in the land!” +\p +\v 26 Moses said, “It isn’t appropriate to do so; for we shall sacrifice the abomination of the Egyptians to Yahweh our God. Behold, if we sacrifice the abomination of the Egyptians before their eyes, won’t they stone us? +\v 27 We will go three days’ journey into the wilderness, and sacrifice to Yahweh our God, as he shall command us.” +\p +\v 28 Pharaoh said, “I will let you go, that you may sacrifice to Yahweh your God in the wilderness, only you shall not go very far away. Pray for me.” +\p +\v 29 Moses said, “Behold, I am going out from you. I will pray to Yahweh that the swarms of flies may depart from Pharaoh, from his servants, and from his people, tomorrow; only don’t let Pharaoh deal deceitfully any more in not letting the people go to sacrifice to Yahweh.” +\v 30 Moses went out from Pharaoh, and prayed to Yahweh. +\v 31 Yahweh did according to the word of Moses, and he removed the swarms of flies from Pharaoh, from his servants, and from his people. There remained not one. +\v 32 Pharaoh hardened his heart this time also, and he didn’t let the people go. +\c 9 +\p +\v 1 Then Yahweh said to Moses, “Go in to Pharaoh, and tell him, ‘This is what Yahweh, the God of the Hebrews, says: “Let my people go, that they may serve me. +\v 2 For if you refuse to let them go, and hold them still, +\v 3 behold, Yahweh’s hand is on your livestock which are in the field, on the horses, on the donkeys, on the camels, on the herds, and on the flocks with a very grievous pestilence. +\v 4 Yahweh will make a distinction between the livestock of Israel and the livestock of Egypt; and nothing shall die of all that belongs to the children of Israel.”’” +\v 5 Yahweh appointed a set time, saying, “Tomorrow Yahweh shall do this thing in the land.” +\v 6 Yahweh did that thing on the next day; and all the livestock of Egypt died, but of the livestock of the children of Israel, not one died. +\v 7 Pharaoh sent, and, behold, there was not so much as one of the livestock of the Israelites dead. But the heart of Pharaoh was stubborn, and he didn’t let the people go. +\p +\v 8 Yahweh said to Moses and to Aaron, “Take handfuls of ashes of the furnace, and let Moses sprinkle it toward the sky in the sight of Pharaoh. +\v 9 It shall become small dust over all the land of Egypt, and shall be boils and blisters breaking out on man and on animal, throughout all the land of Egypt.” +\p +\v 10 They took ashes of the furnace, and stood before Pharaoh; and Moses sprinkled it up toward the sky; and it became boils and blisters breaking out on man and on animal. +\v 11 The magicians couldn’t stand before Moses because of the boils; for the boils were on the magicians and on all the Egyptians. +\v 12 Yahweh hardened the heart of Pharaoh, and he didn’t listen to them, as Yahweh had spoken to Moses. +\p +\v 13 Yahweh said to Moses, “Rise up early in the morning, and stand before Pharaoh, and tell him, ‘This is what Yahweh, the God of the Hebrews, says: “Let my people go, that they may serve me. +\v 14 For this time I will send all my plagues against your heart, against your officials, and against your people; that you may know that there is no one like me in all the earth. +\v 15 For now I would have stretched out my hand, and struck you and your people with pestilence, and you would have been cut off from the earth; +\v 16 but indeed for this cause I have made you stand: to show you my power, and that my name may be declared throughout all the earth, +\v 17 because you still exalt yourself against my people, that you won’t let them go. +\v 18 Behold, tomorrow about this time I will cause it to rain a very grievous hail, such as has not been in Egypt since the day it was founded even until now. +\v 19 Now therefore command that all of your livestock and all that you have in the field be brought into shelter. The hail will come down on every man and animal that is found in the field, and isn’t brought home, and they will die.”’” +\p +\v 20 Those who feared Yahweh’s word among the servants of Pharaoh made their servants and their livestock flee into the houses. +\v 21 Whoever didn’t respect Yahweh’s word left his servants and his livestock in the field. +\p +\v 22 Yahweh said to Moses, “Stretch out your hand toward the sky, that there may be hail in all the land of Egypt, on man, and on animal, and on every herb of the field, throughout the land of Egypt.” +\p +\v 23 Moses stretched out his rod toward the heavens, and Yahweh sent thunder and hail; and lightning flashed down to the earth. Yahweh rained hail on the land of Egypt. +\v 24 So there was very severe hail, and lightning mixed with the hail, such as had not been in all the land of Egypt since it became a nation. +\v 25 The hail struck throughout all the land of Egypt all that was in the field, both man and animal; and the hail struck every herb of the field, and broke every tree of the field. +\v 26 Only in the land of Goshen, where the children of Israel were, there was no hail. +\p +\v 27 Pharaoh sent and called for Moses and Aaron, and said to them, “I have sinned this time. Yahweh is righteous, and I and my people are wicked. +\v 28 Pray to Yahweh; for there has been enough of mighty thunderings and hail. I will let you go, and you shall stay no longer.” +\p +\v 29 Moses said to him, “As soon as I have gone out of the city, I will spread out my hands to Yahweh. The thunders shall cease, and there will not be any more hail; that you may know that the earth is Yahweh’s. +\v 30 But as for you and your servants, I know that you don’t yet fear Yahweh God.” +\p +\v 31 The flax and the barley were struck, for the barley had ripened and the flax was blooming. +\v 32 But the wheat and the spelt were not struck, for they had not grown up. +\v 33 Moses went out of the city from Pharaoh, and spread out his hands to Yahweh; and the thunders and hail ceased, and the rain was not poured on the earth. +\v 34 When Pharaoh saw that the rain and the hail and the thunders had ceased, he sinned yet more, and hardened his heart, he and his servants. +\v 35 The heart of Pharaoh was hardened, and he didn’t let the children of Israel go, just as Yahweh had spoken through Moses. +\c 10 +\p +\v 1 Yahweh said to Moses, “Go in to Pharaoh, for I have hardened his heart and the heart of his servants, that I may show these my signs among them; +\v 2 and that you may tell in the hearing of your son, and of your son’s son, what things I have done to Egypt, and my signs which I have done among them; that you may know that I am Yahweh.” +\p +\v 3 Moses and Aaron went in to Pharaoh, and said to him, “This is what Yahweh, the God of the Hebrews, says: ‘How long will you refuse to humble yourself before me? Let my people go, that they may serve me. +\v 4 Or else, if you refuse to let my people go, behold, tomorrow I will bring locusts into your country, +\v 5 and they shall cover the surface of the earth, so that one won’t be able to see the earth. They shall eat the residue of that which has escaped, which remains to you from the hail, and shall eat every tree which grows for you out of the field. +\v 6 Your houses shall be filled, and the houses of all your servants, and the houses of all the Egyptians, as neither your fathers nor your fathers’ fathers have seen, since the day that they were on the earth to this day.’” He turned, and went out from Pharaoh. +\p +\v 7 Pharaoh’s servants said to him, “How long will this man be a snare to us? Let the men go, that they may serve Yahweh, their God. Don’t you yet know that Egypt is destroyed?” +\p +\v 8 Moses and Aaron were brought again to Pharaoh, and he said to them, “Go, serve Yahweh your God; but who are those who will go?” +\p +\v 9 Moses said, “We will go with our young and with our old. We will go with our sons and with our daughters, with our flocks and with our herds; for we must hold a feast to Yahweh.” +\p +\v 10 He said to them, “Yahweh be with you if I let you go with your little ones! See, evil is clearly before your faces. +\v 11 Not so! Go now you who are men, and serve Yahweh; for that is what you desire!” Then they were driven out from Pharaoh’s presence. +\p +\v 12 Yahweh said to Moses, “Stretch out your hand over the land of Egypt for the locusts, that they may come up on the land of Egypt, and eat every herb of the land, even all that the hail has left.” +\v 13 Moses stretched out his rod over the land of Egypt, and Yahweh brought an east wind on the land all that day, and all night; and when it was morning, the east wind brought the locusts. +\v 14 The locusts went up over all the land of Egypt, and rested in all the borders of Egypt. They were very grievous. Before them there were no such locusts as they, nor will there ever be again. +\v 15 For they covered the surface of the whole earth, so that the land was darkened, and they ate every herb of the land, and all the fruit of the trees which the hail had left. There remained nothing green, either tree or herb of the field, through all the land of Egypt. +\v 16 Then Pharaoh called for Moses and Aaron in haste, and he said, “I have sinned against Yahweh your God, and against you. +\v 17 Now therefore please forgive my sin again, and pray to Yahweh your God, that he may also take away from me this death.” +\p +\v 18 Moses went out from Pharaoh, and prayed to Yahweh. +\v 19 Yahweh sent an exceedingly strong west wind, which took up the locusts, and drove them into the Red Sea.\f + \fr 10:19 \ft “Red Sea” is the translation for the Hebrew “Yam Suf”, which could be more literally translated “Sea of Reeds” or “Sea of Cattails”. It refers to the body of water currently known as the Red Sea, or possibly to one of the bodies of water connected to it or near it.\f* There remained not one locust in all the borders of Egypt. +\v 20 But Yahweh hardened Pharaoh’s heart, and he didn’t let the children of Israel go. +\p +\v 21 Yahweh said to Moses, “Stretch out your hand toward the sky, that there may be darkness over the land of Egypt, even darkness which may be felt.” +\v 22 Moses stretched out his hand toward the sky, and there was a thick darkness in all the land of Egypt for three days. +\v 23 They didn’t see one another, and nobody rose from his place for three days; but all the children of Israel had light in their dwellings. +\p +\v 24 Pharaoh called to Moses, and said, “Go, serve Yahweh. Only let your flocks and your herds stay behind. Let your little ones also go with you.” +\p +\v 25 Moses said, “You must also give into our hand sacrifices and burnt offerings, that we may sacrifice to Yahweh our God. +\v 26 Our livestock also shall go with us. Not a hoof shall be left behind, for of it we must take to serve Yahweh our God; and we don’t know with what we must serve Yahweh, until we come there.” +\p +\v 27 But Yahweh hardened Pharaoh’s heart, and he wouldn’t let them go. +\v 28 Pharaoh said to him, “Get away from me! Be careful to see my face no more; for in the day you see my face you shall die!” +\p +\v 29 Moses said, “You have spoken well. I will see your face again no more.” +\c 11 +\p +\v 1 Yahweh said to Moses, “I will bring yet one more plague on Pharaoh, and on Egypt; afterwards he will let you go. When he lets you go, he will surely thrust you out altogether. +\v 2 Speak now in the ears of the people, and let every man ask of his neighbor, and every woman of her neighbor, jewels of silver, and jewels of gold.” +\v 3 Yahweh gave the people favor in the sight of the Egyptians. Moreover, the man Moses was very great in the land of Egypt, in the sight of Pharaoh’s servants, and in the sight of the people. +\p +\v 4 Moses said, “This is what Yahweh says: ‘About midnight I will go out into the middle of Egypt, +\v 5 and all the firstborn in the land of Egypt shall die, from the firstborn of Pharaoh who sits on his throne, even to the firstborn of the female servant who is behind the mill, and all the firstborn of livestock. +\v 6 There will be a great cry throughout all the land of Egypt, such as there has not been, nor will be any more. +\v 7 But against any of the children of Israel a dog won’t even bark or move its tongue, against man or animal, that you may know that Yahweh makes a distinction between the Egyptians and Israel. +\v 8 All these servants of yours will come down to me, and bow down themselves to me, saying, “Get out, with all the people who follow you;” and after that I will go out.’” He went out from Pharaoh in hot anger. +\p +\v 9 Yahweh said to Moses, “Pharaoh won’t listen to you, that my wonders may be multiplied in the land of Egypt.” +\v 10 Moses and Aaron did all these wonders before Pharaoh, but Yahweh hardened Pharaoh’s heart, and he didn’t let the children of Israel go out of his land. +\c 12 +\p +\v 1 Yahweh spoke to Moses and Aaron in the land of Egypt, saying, +\v 2 “This month shall be to you the beginning of months. It shall be the first month of the year to you. +\v 3 Speak to all the congregation of Israel, saying, ‘On the tenth day of this month, they shall take to them every man a lamb, according to their fathers’ houses, a lamb for a household; +\v 4 and if the household is too little for a lamb, then he and his neighbor next to his house shall take one according to the number of the souls. You shall make your count for the lamb according to what everyone can eat. +\v 5 Your lamb shall be without defect, a male a year old. You shall take it from the sheep or from the goats. +\v 6 You shall keep it until the fourteenth day of the same month; and the whole assembly of the congregation of Israel shall kill it at evening. +\v 7 They shall take some of the blood, and put it on the two door posts and on the lintel, on the houses in which they shall eat it. +\v 8 They shall eat the meat in that night, roasted with fire, with unleavened bread. They shall eat it with bitter herbs. +\v 9 Don’t eat it raw, nor boiled at all with water, but roasted with fire; with its head, its legs and its inner parts. +\v 10 You shall let nothing of it remain until the morning; but that which remains of it until the morning you shall burn with fire. +\v 11 This is how you shall eat it: with your belt on your waist, your sandals on your feet, and your staff in your hand; and you shall eat it in haste: it is Yahweh’s Passover. +\v 12 For I will go through the land of Egypt in that night, and will strike all the firstborn in the land of Egypt, both man and animal. I will execute judgments against all the gods of Egypt. I am Yahweh. +\v 13 The blood shall be to you for a token on the houses where you are. When I see the blood, I will pass over you, and no plague will be on you to destroy you when I strike the land of Egypt. +\v 14 This day shall be a memorial for you. You shall keep it as a feast to Yahweh. You shall keep it as a feast throughout your generations by an ordinance forever. +\p +\v 15 “‘Seven days you shall eat unleavened bread; even the first day you shall put away yeast out of your houses, for whoever eats leavened bread from the first day until the seventh day, that soul shall be cut off from Israel. +\v 16 In the first day there shall be to you a holy convocation, and in the seventh day a holy convocation; no kind of work shall be done in them, except that which every man must eat, only that may be done by you. +\v 17 You shall observe the feast of unleavened bread; for in this same day I have brought your armies out of the land of Egypt. Therefore you shall observe this day throughout your generations by an ordinance forever. +\v 18 In the first month, on the fourteenth day of the month at evening, you shall eat unleavened bread, until the twenty first day of the month at evening. +\v 19 There shall be no yeast found in your houses for seven days, for whoever eats that which is leavened, that soul shall be cut off from the congregation of Israel, whether he is a foreigner, or one who is born in the land. +\v 20 You shall eat nothing leavened. In all your habitations you shall eat unleavened bread.’” +\p +\v 21 Then Moses called for all the elders of Israel, and said to them, “Draw out, and take lambs according to your families, and kill the Passover. +\v 22 You shall take a bunch of hyssop, and dip it in the blood that is in the basin, and strike the lintel and the two door posts with the blood that is in the basin. None of you shall go out of the door of his house until the morning. +\v 23 For Yahweh will pass through to strike the Egyptians; and when he sees the blood on the lintel, and on the two door posts, Yahweh will pass over the door, and will not allow the destroyer to come in to your houses to strike you. +\v 24 You shall observe this thing for an ordinance to you and to your sons forever. +\v 25 It shall happen when you have come to the land which Yahweh will give you, as he has promised, that you shall keep this service. +\v 26 It will happen, when your children ask you, ‘What do you mean by this service?’ +\v 27 that you shall say, ‘It is the sacrifice of Yahweh’s Passover, who passed over the houses of the children of Israel in Egypt, when he struck the Egyptians, and spared our houses.’” +\p The people bowed their heads and worshiped. +\v 28 The children of Israel went and did so; as Yahweh had commanded Moses and Aaron, so they did. +\p +\v 29 At midnight, Yahweh struck all the firstborn in the land of Egypt, from the firstborn of Pharaoh who sat on his throne to the firstborn of the captive who was in the dungeon, and all the firstborn of livestock. +\v 30 Pharaoh rose up in the night, he, and all his servants, and all the Egyptians; and there was a great cry in Egypt, for there was not a house where there was not one dead. +\v 31 He called for Moses and Aaron by night, and said, “Rise up, get out from among my people, both you and the children of Israel; and go, serve Yahweh, as you have said! +\v 32 Take both your flocks and your herds, as you have said, and be gone; and bless me also!” +\p +\v 33 The Egyptians were urgent with the people, to send them out of the land in haste, for they said, “We are all dead men.” +\v 34 The people took their dough before it was leavened, their kneading troughs being bound up in their clothes on their shoulders. +\v 35 The children of Israel did according to the word of Moses; and they asked of the Egyptians jewels of silver, and jewels of gold, and clothing. +\v 36 Yahweh gave the people favor in the sight of the Egyptians, so that they let them have what they asked. They plundered the Egyptians. +\p +\v 37 The children of Israel traveled from Rameses to Succoth, about six hundred thousand on foot who were men, in addition to children. +\v 38 A mixed multitude went up also with them, with flocks, herds, and even very much livestock. +\v 39 They baked unleavened cakes of the dough which they brought out of Egypt; for it wasn’t leavened, because they were thrust out of Egypt, and couldn’t wait, and they had not prepared any food for themselves. +\v 40 Now the time that the children of Israel lived in Egypt was four hundred thirty years. +\v 41 At the end of four hundred thirty years, to the day, all of Yahweh’s armies went out from the land of Egypt. +\v 42 It is a night to be much observed to Yahweh for bringing them out from the land of Egypt. This is that night of Yahweh, to be much observed by all the children of Israel throughout their generations. +\p +\v 43 Yahweh said to Moses and Aaron, “This is the ordinance of the Passover. No foreigner shall eat of it, +\v 44 but every man’s servant who is bought for money, when you have circumcised him, then shall he eat of it. +\v 45 A foreigner and a hired servant shall not eat of it. +\v 46 It must be eaten in one house. You shall not carry any of the meat outside of the house. Do not break any of its bones. +\v 47 All the congregation of Israel shall keep it. +\v 48 When a stranger lives as a foreigner with you, and would like to keep the Passover to Yahweh, let all his males be circumcised, and then let him come near and keep it. He shall be as one who is born in the land; but no uncircumcised person shall eat of it. +\v 49 One law shall be to him who is born at home, and to the stranger who lives as a foreigner among you.” +\v 50 All the children of Israel did so. As Yahweh commanded Moses and Aaron, so they did. +\v 51 That same day, Yahweh brought the children of Israel out of the land of Egypt by their armies. +\c 13 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Sanctify to me all the firstborn, whatever opens the womb among the children of Israel, both of man and of animal. It is mine.” +\p +\v 3 Moses said to the people, “Remember this day, in which you came out of Egypt, out of the house of bondage; for by strength of hand Yahweh brought you out from this place. No leavened bread shall be eaten. +\v 4 Today you go out in the month Abib. +\v 5 It shall be, when Yahweh brings you into the land of the Canaanite, and the Hittite, and the Amorite, and the Hivite, and the Jebusite, which he swore to your fathers to give you, a land flowing with milk and honey, that you shall keep this service in this month. +\v 6 Seven days you shall eat unleavened bread, and in the seventh day shall be a feast to Yahweh. +\v 7 Unleavened bread shall be eaten throughout the seven days; and no leavened bread shall be seen with you. No yeast shall be seen with you, within all your borders. +\v 8 You shall tell your son in that day, saying, ‘It is because of that which Yahweh did for me when I came out of Egypt.’ +\v 9 It shall be for a sign to you on your hand, and for a memorial between your eyes, that Yahweh’s law may be in your mouth; for with a strong hand Yahweh has brought you out of Egypt. +\v 10 You shall therefore keep this ordinance in its season from year to year. +\p +\v 11 “It shall be, when Yahweh brings you into the land of the Canaanite, as he swore to you and to your fathers, and will give it to you, +\v 12 that you shall set apart to Yahweh all that opens the womb, and every firstborn that comes from an animal which you have. The males shall be Yahweh’s. +\v 13 Every firstborn of a donkey you shall redeem with a lamb; and if you will not redeem it, then you shall break its neck; and you shall redeem all the firstborn of man among your sons. +\v 14 It shall be, when your son asks you in time to come, saying, ‘What is this?’ that you shall tell him, ‘By strength of hand Yahweh brought us out from Egypt, from the house of bondage. +\v 15 When Pharaoh stubbornly refused to let us go, Yahweh killed all the firstborn in the land of Egypt, both the firstborn of man, and the firstborn of livestock. Therefore I sacrifice to Yahweh all that opens the womb, being males; but all the firstborn of my sons I redeem.’ +\v 16 It shall be for a sign on your hand, and for symbols between your eyes; for by strength of hand Yahweh brought us out of Egypt.” +\p +\v 17 When Pharaoh had let the people go, God didn’t lead them by the way of the land of the Philistines, although that was near; for God said, “Lest perhaps the people change their minds when they see war, and they return to Egypt”; +\v 18 but God led the people around by the way of the wilderness by the Red Sea; and the children of Israel went up armed out of the land of Egypt. +\v 19 Moses took the bones of Joseph with him, for he had made the children of Israel swear, saying, “God will surely visit you, and you shall carry up my bones away from here with you.” +\v 20 They took their journey from Succoth, and encamped in Etham, in the edge of the wilderness. +\v 21 Yahweh went before them by day in a pillar of cloud, to lead them on their way, and by night in a pillar of fire, to give them light, that they might go by day and by night: +\v 22 the pillar of cloud by day, and the pillar of fire by night, didn’t depart from before the people. +\c 14 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, that they turn back and encamp before Pihahiroth, between Migdol and the sea, before Baal Zephon. You shall encamp opposite it by the sea. +\v 3 Pharaoh will say of the children of Israel, ‘They are entangled in the land. The wilderness has shut them in.’ +\v 4 I will harden Pharaoh’s heart, and he will follow after them; and I will get honor over Pharaoh, and over all his armies; and the Egyptians shall know that I am Yahweh.” They did so. +\p +\v 5 The king of Egypt was told that the people had fled; and the heart of Pharaoh and of his servants was changed toward the people, and they said, “What is this we have done, that we have let Israel go from serving us?” +\v 6 He prepared his chariot, and took his army with him; +\v 7 and he took six hundred chosen chariots, and all the chariots of Egypt, with captains over all of them. +\v 8 Yahweh hardened the heart of Pharaoh king of Egypt, and he pursued the children of Israel; for the children of Israel went out with a high hand.\f + \fr 14:8 \ft or, defiantly.\f* +\v 9 The Egyptians pursued them. All the horses and chariots of Pharaoh, his horsemen, and his army overtook them encamping by the sea, beside Pihahiroth, before Baal Zephon. +\p +\v 10 When Pharaoh came near, the children of Israel lifted up their eyes, and behold, the Egyptians were marching after them; and they were very afraid. The children of Israel cried out to Yahweh. +\v 11 They said to Moses, “Because there were no graves in Egypt, have you taken us away to die in the wilderness? Why have you treated us this way, to bring us out of Egypt? +\v 12 Isn’t this the word that we spoke to you in Egypt, saying, ‘Leave us alone, that we may serve the Egyptians?’ For it would have been better for us to serve the Egyptians than to die in the wilderness.” +\p +\v 13 Moses said to the people, “Don’t be afraid. Stand still, and see the salvation of Yahweh, which he will work for you today; for you will never again see the Egyptians whom you have seen today. +\v 14 Yahweh will fight for you, and you shall be still.” +\p +\v 15 Yahweh said to Moses, “Why do you cry to me? Speak to the children of Israel, that they go forward. +\v 16 Lift up your rod, and stretch out your hand over the sea and divide it. Then the children of Israel shall go into the middle of the sea on dry ground. +\v 17 Behold, I myself will harden the hearts of the Egyptians, and they will go in after them. I will get myself honor over Pharaoh, and over all his armies, over his chariots, and over his horsemen. +\v 18 The Egyptians shall know that I am Yahweh when I have gotten myself honor over Pharaoh, over his chariots, and over his horsemen.” +\v 19 The angel of God, who went before the camp of Israel, moved and went behind them; and the pillar of cloud moved from before them, and stood behind them. +\v 20 It came between the camp of Egypt and the camp of Israel. There was the cloud and the darkness, yet it gave light by night. One didn’t come near the other all night. +\p +\v 21 Moses stretched out his hand over the sea, and Yahweh caused the sea to go back by a strong east wind all night, and made the sea dry land, and the waters were divided. +\v 22 The children of Israel went into the middle of the sea on the dry ground; and the waters were a wall to them on their right hand and on their left. +\v 23 The Egyptians pursued, and went in after them into the middle of the sea: all of Pharaoh’s horses, his chariots, and his horsemen. +\v 24 In the morning watch, Yahweh looked out on the Egyptian army through the pillar of fire and of cloud, and confused the Egyptian army. +\v 25 He took off their chariot wheels, and they drove them heavily; so that the Egyptians said, “Let’s flee from the face of Israel, for Yahweh fights for them against the Egyptians!” +\p +\v 26 Yahweh said to Moses, “Stretch out your hand over the sea, that the waters may come again on the Egyptians, on their chariots, and on their horsemen.” +\v 27 Moses stretched out his hand over the sea, and the sea returned to its strength when the morning appeared; and the Egyptians fled against it. Yahweh overthrew the Egyptians in the middle of the sea. +\v 28 The waters returned, and covered the chariots and the horsemen, even all Pharaoh’s army that went in after them into the sea. There remained not so much as one of them. +\v 29 But the children of Israel walked on dry land in the middle of the sea, and the waters were a wall to them on their right hand and on their left. +\v 30 Thus Yahweh saved Israel that day out of the hand of the Egyptians; and Israel saw the Egyptians dead on the seashore. +\v 31 Israel saw the great work which Yahweh did to the Egyptians, and the people feared Yahweh; and they believed in Yahweh and in his servant Moses. +\c 15 +\p +\v 1 Then Moses and the children of Israel sang this song to Yahweh, and said, +\q1 “I will sing to Yahweh, for he has triumphed gloriously. +\q2 He has thrown the horse and his rider into the sea. +\q1 +\v 2 Yah is my strength and song. +\q2 He has become my salvation. +\q1 This is my God, and I will praise him; +\q2 my father’s God, and I will exalt him. +\q1 +\v 3 Yahweh is a man of war. +\q2 Yahweh is his name. +\q1 +\v 4 He has cast Pharaoh’s chariots and his army into the sea. +\q2 His chosen captains are sunk in the Red Sea. +\q1 +\v 5 The deeps cover them. +\q2 They went down into the depths like a stone. +\q1 +\v 6 Your right hand, Yahweh, is glorious in power. +\q2 Your right hand, Yahweh, dashes the enemy in pieces. +\q1 +\v 7 In the greatness of your excellency, you overthrow those who rise up against you. +\q2 You send out your wrath. It consumes them as stubble. +\q1 +\v 8 With the blast of your nostrils, the waters were piled up. +\q2 The floods stood upright as a heap. +\q2 The deeps were congealed in the heart of the sea. +\q1 +\v 9 The enemy said, ‘I will pursue. I will overtake. I will divide the plunder. +\q2 My desire will be satisfied on them. +\q2 I will draw my sword. My hand will destroy them.’ +\q1 +\v 10 You blew with your wind. +\q2 The sea covered them. +\q2 They sank like lead in the mighty waters. +\q1 +\v 11 Who is like you, Yahweh, among the gods? +\q2 Who is like you, glorious in holiness, +\q2 fearful in praises, doing wonders? +\q1 +\v 12 You stretched out your right hand. +\q2 The earth swallowed them. +\q1 +\v 13 “You, in your loving kindness, have led the people that you have redeemed. +\q2 You have guided them in your strength to your holy habitation. +\q1 +\v 14 The peoples have heard. +\q2 They tremble. +\q2 Pangs have taken hold of the inhabitants of Philistia. +\q1 +\v 15 Then the chiefs of Edom were dismayed. +\q2 Trembling takes hold of the mighty men of Moab. +\q2 All the inhabitants of Canaan have melted away. +\q1 +\v 16 Terror and dread falls on them. +\q2 By the greatness of your arm they are as still as a stone, +\q2 until your people pass over, Yahweh, +\q2 until the people you have purchased pass over. +\q2 +\v 17 You will bring them in, and plant them in the mountain of your inheritance, +\q2 the place, Yahweh, which you have made for yourself to dwell in: +\q2 the sanctuary, Lord, which your hands have established. +\q1 +\v 18 Yahweh will reign forever and ever.” +\p +\v 19 For the horses of Pharaoh went in with his chariots and with his horsemen into the sea, and Yahweh brought back the waters of the sea on them; but the children of Israel walked on dry land in the middle of the sea. +\v 20 Miriam the prophetess, the sister of Aaron, took a tambourine in her hand; and all the women went out after her with tambourines and with dances. +\v 21 Miriam answered them, +\q1 “Sing to Yahweh, for he has triumphed gloriously. +\q1 He has thrown the horse and his rider into the sea.” +\p +\v 22 Moses led Israel onward from the Red Sea, and they went out into the wilderness of Shur; and they went three days in the wilderness, and found no water. +\v 23 When they came to Marah, they couldn’t drink from the waters of Marah, for they were bitter. Therefore its name was called Marah.\f + \fr 15:23 \ft Marah means bitter.\f* +\v 24 The people murmured against Moses, saying, “What shall we drink?” +\v 25 Then he cried to Yahweh. Yahweh showed him a tree, and he threw it into the waters, and the waters were made sweet. There he made a statute and an ordinance for them, and there he tested them. +\v 26 He said, “If you will diligently listen to Yahweh your God’s voice, and will do that which is right in his eyes, and will pay attention to his commandments, and keep all his statutes, I will put none of the diseases on you which I have put on the Egyptians; for I am Yahweh who heals you.” +\p +\v 27 They came to Elim, where there were twelve springs of water and seventy palm trees. They encamped there by the waters. +\c 16 +\p +\v 1 They took their journey from Elim, and all the congregation of the children of Israel came to the wilderness of Sin, which is between Elim and Sinai, on the fifteenth day of the second month after their departing out of the land of Egypt. +\v 2 The whole congregation of the children of Israel murmured against Moses and against Aaron in the wilderness; +\v 3 and the children of Israel said to them, “We wish that we had died by Yahweh’s hand in the land of Egypt, when we sat by the meat pots, when we ate our fill of bread, for you have brought us out into this wilderness to kill this whole assembly with hunger.” +\p +\v 4 Then Yahweh said to Moses, “Behold, I will rain bread from the sky for you, and the people shall go out and gather a day’s portion every day, that I may test them, whether they will walk in my law or not. +\v 5 It shall come to pass on the sixth day, that they shall prepare that which they bring in, and it shall be twice as much as they gather daily.” +\p +\v 6 Moses and Aaron said to all the children of Israel, “At evening, you shall know that Yahweh has brought you out from the land of Egypt. +\v 7 In the morning, you shall see Yahweh’s glory; because he hears your murmurings against Yahweh. Who are we, that you murmur against us?” +\v 8 Moses said, “Now Yahweh will give you meat to eat in the evening, and in the morning bread to satisfy you, because Yahweh hears your murmurings which you murmur against him. And who are we? Your murmurings are not against us, but against Yahweh.” +\v 9 Moses said to Aaron, “Tell all the congregation of the children of Israel, ‘Come close to Yahweh, for he has heard your murmurings.’” +\v 10 As Aaron spoke to the whole congregation of the children of Israel, they looked toward the wilderness, and behold, Yahweh’s glory appeared in the cloud. +\v 11 Yahweh spoke to Moses, saying, +\v 12 “I have heard the murmurings of the children of Israel. Speak to them, saying, ‘At evening you shall eat meat, and in the morning you shall be filled with bread. Then you will know that I am Yahweh your God.’” +\p +\v 13 In the evening, quail came up and covered the camp; and in the morning the dew lay around the camp. +\v 14 When the dew that lay had gone, behold, on the surface of the wilderness was a small round thing, small as the frost on the ground. +\v 15 When the children of Israel saw it, they said to one another, “What is it?” For they didn’t know what it was. Moses said to them, “It is the bread which Yahweh has given you to eat. +\v 16 This is the thing which Yahweh has commanded: ‘Gather of it everyone according to his eating; an omer\f + \fr 16:16 \ft An omer is about 2.2 liters or about 2.3 quarts\f* a head, according to the number of your persons, you shall take it, every man for those who are in his tent.’” +\v 17 The children of Israel did so, and some gathered more, some less. +\v 18 When they measured it with an omer, he who gathered much had nothing over, and he who gathered little had no lack. They each gathered according to his eating. +\v 19 Moses said to them, “Let no one leave of it until the morning.” +\v 20 Notwithstanding they didn’t listen to Moses, but some of them left of it until the morning, so it bred worms and became foul; and Moses was angry with them. +\v 21 They gathered it morning by morning, everyone according to his eating. When the sun grew hot, it melted. +\v 22 On the sixth day, they gathered twice as much bread, two omers for each one; and all the rulers of the congregation came and told Moses. +\v 23 He said to them, “This is that which Yahweh has spoken, ‘Tomorrow is a solemn rest, a holy Sabbath to Yahweh. Bake that which you want to bake, and boil that which you want to boil; and all that remains over lay up for yourselves to be kept until the morning.’” +\v 24 They laid it up until the morning, as Moses ordered, and it didn’t become foul, and there were no worms in it. +\v 25 Moses said, “Eat that today, for today is a Sabbath to Yahweh. Today you shall not find it in the field. +\v 26 Six days you shall gather it, but on the seventh day is the Sabbath. In it there shall be none.” +\v 27 On the seventh day, some of the people went out to gather, and they found none. +\v 28 Yahweh said to Moses, “How long do you refuse to keep my commandments and my laws? +\v 29 Behold, because Yahweh has given you the Sabbath, therefore he gives you on the sixth day the bread of two days. Everyone stay in his place. Let no one go out of his place on the seventh day.” +\v 30 So the people rested on the seventh day. +\p +\v 31 The house of Israel called its name “Manna”,\f + \fr 16:31 \ft “Manna” means “What is it?”\f* and it was like coriander seed, white; and its taste was like wafers with honey. +\v 32 Moses said, “This is the thing which Yahweh has commanded, ‘Let an omer-full of it be kept throughout your generations, that they may see the bread with which I fed you in the wilderness, when I brought you out of the land of Egypt.’” +\v 33 Moses said to Aaron, “Take a pot, and put an omer-full of manna in it, and lay it up before Yahweh, to be kept throughout your generations.” +\v 34 As Yahweh commanded Moses, so Aaron laid it up before the Testimony, to be kept. +\v 35 The children of Israel ate the manna forty years, until they came to an inhabited land. They ate the manna until they came to the borders of the land of Canaan. +\v 36 Now an omer is one tenth of an ephah.\f + \fr 16:36 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* +\c 17 +\p +\v 1 All the congregation of the children of Israel traveled from the wilderness of Sin, starting according to Yahweh’s commandment, and encamped in Rephidim; but there was no water for the people to drink. +\v 2 Therefore the people quarreled with Moses, and said, “Give us water to drink.” +\p Moses said to them, “Why do you quarrel with me? Why do you test Yahweh?” +\p +\v 3 The people were thirsty for water there; so the people murmured against Moses, and said, “Why have you brought us up out of Egypt, to kill us, our children, and our livestock with thirst?” +\p +\v 4 Moses cried to Yahweh, saying, “What shall I do with these people? They are almost ready to stone me.” +\p +\v 5 Yahweh said to Moses, “Walk on before the people, and take the elders of Israel with you, and take the rod in your hand with which you struck the Nile, and go. +\v 6 Behold, I will stand before you there on the rock in Horeb. You shall strike the rock, and water will come out of it, that the people may drink.” Moses did so in the sight of the elders of Israel. +\v 7 He called the name of the place Massah,\f + \fr 17:7 \ft Massah means testing. \f* and Meribah,\f + \fr 17:7 \ft Meribah means quarreling.\f* because the children of Israel quarreled, and because they tested Yahweh, saying, “Is Yahweh among us, or not?” +\p +\v 8 Then Amalek came and fought with Israel in Rephidim. +\v 9 Moses said to Joshua, “Choose men for us, and go out to fight with Amalek. Tomorrow I will stand on the top of the hill with God’s rod in my hand.” +\v 10 So Joshua did as Moses had told him, and fought with Amalek; and Moses, Aaron, and Hur went up to the top of the hill. +\v 11 When Moses held up his hand, Israel prevailed. When he let down his hand, Amalek prevailed. +\v 12 But Moses’ hands were heavy; so they took a stone, and put it under him, and he sat on it. Aaron and Hur held up his hands, the one on the one side, and the other on the other side. His hands were steady until sunset. +\v 13 Joshua defeated Amalek and his people with the edge of the sword. +\v 14 Yahweh said to Moses, “Write this for a memorial in a book, and rehearse it in the ears of Joshua: that I will utterly blot out the memory of Amalek from under the sky.” +\v 15 Moses built an altar, and called its name “Yahweh our Banner”.\f + \fr 17:15 \ft Hebrew, Yahweh Nissi\f* +\v 16 He said, “Yah has sworn: ‘Yahweh will have war with Amalek from generation to generation.’” +\c 18 +\p +\v 1 Now Jethro, the priest of Midian, Moses’ father-in-law, heard of all that God had done for Moses and for Israel his people, how Yahweh had brought Israel out of Egypt. +\v 2 Jethro, Moses’ father-in-law, received Zipporah, Moses’ wife, after he had sent her away, +\v 3 and her two sons. The name of one son was Gershom,\f + \fr 18:3 \ft “Gershom” sounds like the Hebrew for “an alien there”.\f* for Moses said, “I have lived as a foreigner in a foreign land”. +\v 4 The name of the other was Eliezer,\f + \fr 18:4 \ft Eliezer means “God is my helper”. \f* for he said, “My father’s God was my help and delivered me from Pharaoh’s sword.” +\v 5 Jethro, Moses’ father-in-law, came with Moses’ sons and his wife to Moses into the wilderness where he was encamped, at the Mountain of God. +\v 6 He said to Moses, “I, your father-in-law Jethro, have come to you with your wife, and her two sons with her.” +\p +\v 7 Moses went out to meet his father-in-law, and bowed and kissed him. They asked each other of their welfare, and they came into the tent. +\v 8 Moses told his father-in-law all that Yahweh had done to Pharaoh and to the Egyptians for Israel’s sake, all the hardships that had come on them on the way, and how Yahweh delivered them. +\v 9 Jethro rejoiced for all the goodness which Yahweh had done to Israel, in that he had delivered them out of the hand of the Egyptians. +\v 10 Jethro said, “Blessed be Yahweh, who has delivered you out of the hand of the Egyptians, and out of the hand of Pharaoh; who has delivered the people from under the hand of the Egyptians. +\v 11 Now I know that Yahweh is greater than all gods because of the way that they treated people arrogantly.” +\v 12 Jethro, Moses’ father-in-law, took a burnt offering and sacrifices for God. Aaron came with all the elders of Israel, to eat bread with Moses’ father-in-law before God. +\p +\v 13 On the next day, Moses sat to judge the people, and the people stood around Moses from the morning to the evening. +\v 14 When Moses’ father-in-law saw all that he did to the people, he said, “What is this thing that you do for the people? Why do you sit alone, and all the people stand around you from morning to evening?” +\p +\v 15 Moses said to his father-in-law, “Because the people come to me to inquire of God. +\v 16 When they have a matter, they come to me, and I judge between a man and his neighbor, and I make them know the statutes of God, and his laws.” +\v 17 Moses’ father-in-law said to him, “The thing that you do is not good. +\v 18 You will surely wear away, both you, and this people that is with you; for the thing is too heavy for you. You are not able to perform it yourself alone. +\v 19 Listen now to my voice. I will give you counsel, and God be with you. You represent the people before God, and bring the causes to God. +\v 20 You shall teach them the statutes and the laws, and shall show them the way in which they must walk, and the work that they must do. +\v 21 Moreover you shall provide out of all the people able men which fear God: men of truth, hating unjust gain; and place such over them, to be rulers of thousands, rulers of hundreds, rulers of fifties, and rulers of tens. +\v 22 Let them judge the people at all times. It shall be that every great matter they shall bring to you, but every small matter they shall judge themselves. So shall it be easier for you, and they shall share the load with you. +\v 23 If you will do this thing, and God commands you so, then you will be able to endure, and all these people also will go to their place in peace.” +\p +\v 24 So Moses listened to the voice of his father-in-law, and did all that he had said. +\v 25 Moses chose able men out of all Israel, and made them heads over the people, rulers of thousands, rulers of hundreds, rulers of fifties, and rulers of tens. +\v 26 They judged the people at all times. They brought the hard cases to Moses, but every small matter they judged themselves. +\v 27 Moses let his father-in-law depart, and he went his way into his own land. +\c 19 +\p +\v 1 In the third month after the children of Israel had gone out of the land of Egypt, on that same day they came into the wilderness of Sinai. +\v 2 When they had departed from Rephidim, and had come to the wilderness of Sinai, they encamped in the wilderness; and there Israel encamped before the mountain. +\v 3 Moses went up to God, and Yahweh called to him out of the mountain, saying, “This is what you shall tell the house of Jacob, and tell the children of Israel: +\v 4 ‘You have seen what I did to the Egyptians, and how I bore you on eagles’ wings, and brought you to myself. +\v 5 Now therefore, if you will indeed obey my voice and keep my covenant, then you shall be my own possession from among all peoples; for all the earth is mine; +\v 6 and you shall be to me a kingdom of priests and a holy nation.’ These are the words which you shall speak to the children of Israel.” +\p +\v 7 Moses came and called for the elders of the people, and set before them all these words which Yahweh commanded him. +\v 8 All the people answered together, and said, “All that Yahweh has spoken we will do.” +\p Moses reported the words of the people to Yahweh. +\v 9 Yahweh said to Moses, “Behold, I come to you in a thick cloud, that the people may hear when I speak with you, and may also believe you forever.” Moses told the words of the people to Yahweh. +\v 10 Yahweh said to Moses, “Go to the people, and sanctify them today and tomorrow, and let them wash their garments, +\v 11 and be ready for the third day; for on the third day Yahweh will come down in the sight of all the people on Mount Sinai. +\v 12 You shall set bounds to the people all around, saying, ‘Be careful that you don’t go up onto the mountain, or touch its border. Whoever touches the mountain shall be surely put to death. +\v 13 No hand shall touch him, but he shall surely be stoned or shot through; whether it is animal or man, he shall not live.’ When the trumpet sounds long, they shall come up to the mountain.” +\p +\v 14 Moses went down from the mountain to the people, and sanctified the people; and they washed their clothes. +\v 15 He said to the people, “Be ready by the third day. Don’t have sexual relations with a woman.” +\p +\v 16 On the third day, when it was morning, there were thunders and lightnings, and a thick cloud on the mountain, and the sound of an exceedingly loud trumpet; and all the people who were in the camp trembled. +\v 17 Moses led the people out of the camp to meet God; and they stood at the lower part of the mountain. +\v 18 All of Mount Sinai smoked, because Yahweh descended on it in fire; and its smoke ascended like the smoke of a furnace, and the whole mountain quaked greatly. +\v 19 When the sound of the trumpet grew louder and louder, Moses spoke, and God answered him by a voice. +\v 20 Yahweh came down on Mount Sinai, to the top of the mountain. Yahweh called Moses to the top of the mountain, and Moses went up. +\p +\v 21 Yahweh said to Moses, “Go down, warn the people, lest they break through to Yahweh to gaze, and many of them perish. +\v 22 Let the priests also, who come near to Yahweh, sanctify themselves, lest Yahweh break out on them.” +\p +\v 23 Moses said to Yahweh, “The people can’t come up to Mount Sinai, for you warned us, saying, ‘Set bounds around the mountain, and sanctify it.’” +\p +\v 24 Yahweh said to him, “Go down! You shall bring Aaron up with you, but don’t let the priests and the people break through to come up to Yahweh, lest he break out against them.” +\p +\v 25 So Moses went down to the people, and told them. +\c 20 +\p +\v 1 God\f + \fr 20:1 \ft After “God”, the Hebrew has the two letters “Aleph Tav” (the first and last letters of the Hebrew alphabet), not as a word, but as a grammatical marker.\f* spoke all these words, saying, +\v 2 “I am Yahweh your God, who brought you out of the land of Egypt, out of the house of bondage. +\p +\v 3 “You shall have no other gods before me. +\p +\v 4 “You shall not make for yourselves an idol, nor any image of anything that is in the heavens above, or that is in the earth beneath, or that is in the water under the earth: +\v 5 you shall not bow yourself down to them, nor serve them, for I, Yahweh your God, am a jealous God, visiting the iniquity of the fathers on the children, on the third and on the fourth generation of those who hate me, +\v 6 and showing loving kindness to thousands of those who love me and keep my commandments. +\p +\v 7 “You shall not misuse the name of Yahweh your God,\f + \fr 20:7 \ft or, You shall not take the name of Yahweh your God in vain\f* for Yahweh will not hold him guiltless who misuses his name. +\p +\v 8 “Remember the Sabbath day, to keep it holy. +\v 9 You shall labor six days, and do all your work, +\v 10 but the seventh day is a Sabbath to Yahweh your God. You shall not do any work in it, you, nor your son, nor your daughter, your male servant, nor your female servant, nor your livestock, nor your stranger who is within your gates; +\v 11 for in six days Yahweh made heaven and earth, the sea, and all that is in them, and rested the seventh day; therefore Yahweh blessed the Sabbath day, and made it holy. +\p +\v 12 “Honor your father and your mother, that your days may be long in the land which Yahweh your God gives you. +\p +\v 13 “You shall not murder. +\p +\v 14 “You shall not commit adultery. +\p +\v 15 “You shall not steal. +\p +\v 16 “You shall not give false testimony against your neighbor. +\p +\v 17 “You shall not covet your neighbor’s house. You shall not covet your neighbor’s wife, nor his male servant, nor his female servant, nor his ox, nor his donkey, nor anything that is your neighbor’s.” +\p +\v 18 All the people perceived the thunderings, the lightnings, the sound of the trumpet, and the mountain smoking. When the people saw it, they trembled, and stayed at a distance. +\v 19 They said to Moses, “Speak with us yourself, and we will listen; but don’t let God speak with us, lest we die.” +\p +\v 20 Moses said to the people, “Don’t be afraid, for God has come to test you, and that his fear may be before you, that you won’t sin.” +\v 21 The people stayed at a distance, and Moses came near to the thick darkness where God was. +\p +\v 22 Yahweh said to Moses, “This is what you shall tell the children of Israel: ‘You yourselves have seen that I have talked with you from heaven. +\v 23 You shall most certainly not make gods of silver or gods of gold for yourselves to be alongside me. +\v 24 You shall make an altar of earth for me, and shall sacrifice on it your burnt offerings and your peace offerings, your sheep and your cattle. In every place where I record my name I will come to you and I will bless you. +\v 25 If you make me an altar of stone, you shall not build it of cut stones; for if you lift up your tool on it, you have polluted it. +\v 26 You shall not go up by steps to my altar, that your nakedness may not be exposed to it.’ +\c 21 +\p +\v 1 “Now these are the ordinances which you shall set before them: +\p +\v 2 “If you buy a Hebrew servant, he shall serve six years, and in the seventh he shall go out free without paying anything. +\v 3 If he comes in by himself, he shall go out by himself. If he is married, then his wife shall go out with him. +\v 4 If his master gives him a wife and she bears him sons or daughters, the wife and her children shall be her master’s, and he shall go out by himself. +\v 5 But if the servant shall plainly say, ‘I love my master, my wife, and my children. I will not go out free;’ +\v 6 then his master shall bring him to God, and shall bring him to the door or to the doorpost, and his master shall bore his ear through with an awl, and he shall serve him forever. +\p +\v 7 “If a man sells his daughter to be a female servant, she shall not go out as the male servants do. +\v 8 If she doesn’t please her master, who has married her to himself, then he shall let her be redeemed. He shall have no right to sell her to a foreign people, since he has dealt deceitfully with her. +\v 9 If he marries her to his son, he shall deal with her as a daughter. +\v 10 If he takes another wife to himself, he shall not diminish her food, her clothing, and her marital rights. +\v 11 If he doesn’t do these three things for her, she may go free without paying any money. +\p +\v 12 “One who strikes a man so that he dies shall surely be put to death, +\v 13 but not if it is unintentional, but God allows it to happen; then I will appoint you a place where he shall flee. +\v 14 If a man schemes and comes presumptuously on his neighbor to kill him, you shall take him from my altar, that he may die. +\p +\v 15 “Anyone who attacks his father or his mother shall be surely put to death. +\p +\v 16 “Anyone who kidnaps someone and sells him, or if he is found in his hand, he shall surely be put to death. +\p +\v 17 “Anyone who curses his father or his mother shall surely be put to death. +\p +\v 18 “If men quarrel and one strikes the other with a stone, or with his fist, and he doesn’t die, but is confined to bed; +\v 19 if he rises again and walks around with his staff, then he who struck him shall be cleared; only he shall pay for the loss of his time, and shall provide for his healing until he is thoroughly healed. +\p +\v 20 “If a man strikes his servant or his maid with a rod, and he dies under his hand, the man shall surely be punished. +\v 21 Notwithstanding, if his servant gets up after a day or two, he shall not be punished, for the servant is his property. +\p +\v 22 “If men fight and hurt a pregnant woman so that she gives birth prematurely, and yet no harm follows, he shall be surely fined as much as the woman’s husband demands and the judges allow. +\v 23 But if any harm follows, then you must take life for life, +\v 24 eye for eye, tooth for tooth, hand for hand, foot for foot, +\v 25 burning for burning, wound for wound, and bruise for bruise. +\p +\v 26 “If a man strikes his servant’s eye, or his maid’s eye, and destroys it, he shall let him go free for his eye’s sake. +\v 27 If he strikes out his male servant’s tooth, or his female servant’s tooth, he shall let the servant go free for his tooth’s sake. +\p +\v 28 “If a bull gores a man or a woman to death, the bull shall surely be stoned, and its meat shall not be eaten; but the owner of the bull shall not be held responsible. +\v 29 But if the bull had a habit of goring in the past, and this has been testified to its owner, and he has not kept it in, but it has killed a man or a woman, the bull shall be stoned, and its owner shall also be put to death. +\v 30 If a ransom is imposed on him, then he shall give for the redemption of his life whatever is imposed. +\v 31 Whether it has gored a son or has gored a daughter, according to this judgment it shall be done to him. +\v 32 If the bull gores a male servant or a female servant, thirty shekels\f + \fr 21:32 \ft A shekel is about 10 grams or about 0.35 ounces, so 30 shekels is about 300 grams or about 10.6 ounces.\f* of silver shall be given to their master, and the ox shall be stoned. +\p +\v 33 “If a man opens a pit, or if a man digs a pit and doesn’t cover it, and a bull or a donkey falls into it, +\v 34 the owner of the pit shall make it good. He shall give money to its owner, and the dead animal shall be his. +\p +\v 35 “If one man’s bull injures another’s, so that it dies, then they shall sell the live bull, and divide its price; and they shall also divide the dead animal. +\v 36 Or if it is known that the bull was in the habit of goring in the past, and its owner has not kept it in, he shall surely pay bull for bull, and the dead animal shall be his own. +\c 22 +\p +\v 1 “If a man steals an ox or a sheep, and kills it or sells it, he shall pay five oxen for an ox, and four sheep for a sheep. +\v 2 If the thief is found breaking in, and is struck so that he dies, there shall be no guilt of bloodshed for him. +\v 3 If the sun has risen on him, he is guilty of bloodshed. He shall make restitution. If he has nothing, then he shall be sold for his theft. +\v 4 If the stolen property is found in his hand alive, whether it is ox, donkey, or sheep, he shall pay double. +\p +\v 5 “If a man causes a field or vineyard to be eaten by letting his animal loose, and it grazes in another man’s field, he shall make restitution from the best of his own field, and from the best of his own vineyard. +\p +\v 6 “If fire breaks out, and catches in thorns so that the shocks of grain, or the standing grain, or the field are consumed; he who kindled the fire shall surely make restitution. +\p +\v 7 “If a man delivers to his neighbor money or stuff to keep, and it is stolen out of the man’s house, if the thief is found, he shall pay double. +\v 8 If the thief isn’t found, then the master of the house shall come near to God, to find out whether or not he has put his hand on his neighbor’s goods. +\v 9 For every matter of trespass, whether it is for ox, for donkey, for sheep, for clothing, or for any kind of lost thing, about which one says, ‘This is mine,’ the cause of both parties shall come before God. He whom God condemns shall pay double to his neighbor. +\p +\v 10 “If a man delivers to his neighbor a donkey, an ox, a sheep, or any animal to keep, and it dies or is injured, or driven away, no man seeing it; +\v 11 the oath of Yahweh shall be between them both, he has not put his hand on his neighbor’s goods; and its owner shall accept it, and he shall not make restitution. +\v 12 But if it is stolen from him, the one who stole shall make restitution to its owner. +\v 13 If it is torn in pieces, let him bring it for evidence. He shall not make good that which was torn. +\p +\v 14 “If a man borrows anything of his neighbor’s, and it is injured, or dies, its owner not being with it, he shall surely make restitution. +\v 15 If its owner is with it, he shall not make it good. If it is a leased thing, it came for its lease. +\p +\v 16 “If a man entices a virgin who isn’t pledged to be married, and lies with her, he shall surely pay a dowry for her to be his wife. +\v 17 If her father utterly refuses to give her to him, he shall pay money according to the dowry of virgins. +\p +\v 18 “You shall not allow a sorceress to live. +\p +\v 19 “Whoever has sex with an animal shall surely be put to death. +\p +\v 20 “He who sacrifices to any god, except to Yahweh only, shall be utterly destroyed. +\p +\v 21 “You shall not wrong an alien or oppress him, for you were aliens in the land of Egypt. +\p +\v 22 “You shall not take advantage of any widow or fatherless child. +\v 23 If you take advantage of them at all, and they cry at all to me, I will surely hear their cry; +\v 24 and my wrath will grow hot, and I will kill you with the sword; and your wives shall be widows, and your children fatherless. +\p +\v 25 “If you lend money to any of my people with you who is poor, you shall not be to him as a creditor. You shall not charge him interest. +\v 26 If you take your neighbor’s garment as collateral, you shall restore it to him before the sun goes down, +\v 27 for that is his only covering, it is his garment for his skin. What would he sleep in? It will happen, when he cries to me, that I will hear, for I am gracious. +\p +\v 28 “You shall not blaspheme God, nor curse a ruler of your people. +\p +\v 29 “You shall not delay to offer from your harvest and from the outflow of your presses. +\p “You shall give the firstborn of your sons to me. +\v 30 You shall do likewise with your cattle and with your sheep. It shall be with its mother seven days, then on the eighth day you shall give it to me. +\p +\v 31 “You shall be holy men to me, therefore you shall not eat any meat that is torn by animals in the field. You shall cast it to the dogs. +\c 23 +\p +\v 1 “You shall not spread a false report. Don’t join your hand with the wicked to be a malicious witness. +\p +\v 2 “You shall not follow a crowd to do evil. You shall not testify in court to side with a multitude to pervert justice. +\v 3 You shall not favor a poor man in his cause. +\p +\v 4 “If you meet your enemy’s ox or his donkey going astray, you shall surely bring it back to him again. +\v 5 If you see the donkey of him who hates you fallen down under his burden, don’t leave him. You shall surely help him with it. +\p +\v 6 “You shall not deny justice to your poor people in their lawsuits. +\p +\v 7 “Keep far from a false charge, and don’t kill the innocent and righteous; for I will not justify the wicked. +\p +\v 8 “You shall take no bribe, for a bribe blinds those who have sight and perverts the words of the righteous. +\p +\v 9 “You shall not oppress an alien, for you know the heart of an alien, since you were aliens in the land of Egypt. +\p +\v 10 “For six years you shall sow your land, and shall gather in its increase, +\v 11 but the seventh year you shall let it rest and lie fallow, that the poor of your people may eat; and what they leave the animal of the field shall eat. In the same way, you shall deal with your vineyard and with your olive grove. +\p +\v 12 “Six days you shall do your work, and on the seventh day you shall rest, that your ox and your donkey may have rest, and the son of your servant, and the alien may be refreshed. +\p +\v 13 “Be careful to do all things that I have said to you; and don’t invoke the name of other gods or even let them be heard out of your mouth. +\p +\v 14 “You shall observe a feast to me three times a year. +\v 15 You shall observe the feast of unleavened bread. Seven days you shall eat unleavened bread, as I commanded you, at the time appointed in the month Abib (for in it you came out of Egypt), and no one shall appear before me empty. +\v 16 And the feast of harvest, the first fruits of your labors, which you sow in the field; and the feast of ingathering, at the end of the year, when you gather in your labors out of the field. +\v 17 Three times in the year all your males shall appear before the Lord Yahweh. +\p +\v 18 “You shall not offer the blood of my sacrifice with leavened bread. The fat of my feast shall not remain all night until the morning. +\p +\v 19 You shall bring the first of the first fruits of your ground into the house of Yahweh your God. +\p “You shall not boil a young goat in its mother’s milk. +\p +\v 20 “Behold, I send an angel before you, to keep you by the way, and to bring you into the place which I have prepared. +\v 21 Pay attention to him, and listen to his voice. Don’t provoke him, for he will not pardon your disobedience, for my name is in him. +\v 22 But if you indeed listen to his voice, and do all that I speak, then I will be an enemy to your enemies, and an adversary to your adversaries. +\v 23 For my angel shall go before you, and bring you in to the Amorite, the Hittite, the Perizzite, the Canaanite, the Hivite, and the Jebusite; and I will cut them off. +\v 24 You shall not bow down to their gods, nor serve them, nor follow their practices, but you shall utterly overthrow them and demolish their pillars. +\v 25 You shall serve Yahweh your God, and he will bless your bread and your water, and I will take sickness away from among you. +\v 26 No one will miscarry or be barren in your land. I will fulfill the number of your days. +\v 27 I will send my terror before you, and will confuse all the people to whom you come, and I will make all your enemies turn their backs to you. +\v 28 I will send the hornet before you, which will drive out the Hivite, the Canaanite, and the Hittite, from before you. +\v 29 I will not drive them out from before you in one year, lest the land become desolate, and the animals of the field multiply against you. +\v 30 Little by little I will drive them out from before you, until you have increased and inherit the land. +\v 31 I will set your border from the Red Sea even to the sea of the Philistines, and from the wilderness to the River; for I will deliver the inhabitants of the land into your hand, and you shall drive them out before you. +\v 32 You shall make no covenant with them, nor with their gods. +\v 33 They shall not dwell in your land, lest they make you sin against me, for if you serve their gods, it will surely be a snare to you.” +\c 24 +\p +\v 1 He said to Moses, “Come up to Yahweh, you, and Aaron, Nadab, and Abihu, and seventy of the elders of Israel; and worship from a distance. +\v 2 Moses alone shall come near to Yahweh, but they shall not come near. The people shall not go up with him.” +\p +\v 3 Moses came and told the people all Yahweh’s words, and all the ordinances; and all the people answered with one voice, and said, “All the words which Yahweh has spoken will we do.” +\p +\v 4 Moses wrote all Yahweh’s words, then rose up early in the morning and built an altar at the base of the mountain, with twelve pillars for the twelve tribes of Israel. +\v 5 He sent young men of the children of Israel, who offered burnt offerings and sacrificed peace offerings of cattle to Yahweh. +\v 6 Moses took half of the blood and put it in basins, and half of the blood he sprinkled on the altar. +\v 7 He took the book of the covenant and read it in the hearing of the people, and they said, “We will do all that Yahweh has said, and be obedient.” +\p +\v 8 Moses took the blood, and sprinkled it on the people, and said, “Look, this is the blood of the covenant, which Yahweh has made with you concerning all these words.” +\p +\v 9 Then Moses, Aaron, Nadab, Abihu, and seventy of the elders of Israel went up. +\v 10 They saw the God of Israel. Under his feet was like a paved work of sapphire\f + \fr 24:10 \ft or, lapis lazuli\f* stone, like the skies for clearness. +\v 11 He didn’t lay his hand on the nobles of the children of Israel. They saw God, and ate and drank. +\p +\v 12 Yahweh said to Moses, “Come up to me on the mountain, and stay here, and I will give you the stone tablets with the law and the commands that I have written, that you may teach them.” +\p +\v 13 Moses rose up with Joshua, his servant, and Moses went up onto God’s Mountain. +\v 14 He said to the elders, “Wait here for us, until we come again to you. Behold, Aaron and Hur are with you. Whoever is involved in a dispute can go to them.” +\p +\v 15 Moses went up on the mountain, and the cloud covered the mountain. +\v 16 Yahweh’s glory settled on Mount Sinai, and the cloud covered it six days. The seventh day he called to Moses out of the middle of the cloud. +\v 17 The appearance of Yahweh’s glory was like devouring fire on the top of the mountain in the eyes of the children of Israel. +\v 18 Moses entered into the middle of the cloud, and went up on the mountain; and Moses was on the mountain forty days and forty nights. +\c 25 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, that they take an offering for me. From everyone whose heart makes him willing you shall take my offering. +\v 3 This is the offering which you shall take from them: gold, silver, bronze, +\v 4 blue, purple, scarlet, fine linen, goats’ hair, +\v 5 rams’ skins dyed red, sea cow hides,\f + \fr 25:5 \ft or, fine leather\f* acacia wood, +\v 6 oil for the light, spices for the anointing oil and for the sweet incense, +\v 7 onyx stones, and stones to be set for the ephod and for the breastplate. +\v 8 Let them make me a sanctuary, that I may dwell among them. +\v 9 According to all that I show you, the pattern of the tabernacle, and the pattern of all of its furniture, even so you shall make it. +\p +\v 10 “They shall make an ark of acacia wood. Its length shall be two and a half cubits,\f + \fr 25:10 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* its width a cubit and a half, and a cubit and a half its height. +\v 11 You shall overlay it with pure gold. You shall overlay it inside and outside, and you shall make a gold molding around it. +\v 12 You shall cast four rings of gold for it, and put them in its four feet. Two rings shall be on the one side of it, and two rings on the other side of it. +\v 13 You shall make poles of acacia wood, and overlay them with gold. +\v 14 You shall put the poles into the rings on the sides of the ark to carry the ark. +\v 15 The poles shall be in the rings of the ark. They shall not be taken from it. +\v 16 You shall put the covenant which I shall give you into the ark. +\v 17 You shall make a mercy seat of pure gold. Two and a half cubits shall be its length, and a cubit and a half its width. +\v 18 You shall make two cherubim of hammered gold. You shall make them at the two ends of the mercy seat. +\v 19 Make one cherub at the one end, and one cherub at the other end. You shall make the cherubim on its two ends of one piece with the mercy seat. +\v 20 The cherubim shall spread out their wings upward, covering the mercy seat with their wings, with their faces toward one another. The faces of the cherubim shall be toward the mercy seat. +\v 21 You shall put the mercy seat on top of the ark, and in the ark you shall put the covenant that I will give you. +\v 22 There I will meet with you, and I will tell you from above the mercy seat, from between the two cherubim which are on the ark of the covenant, all that I command you for the children of Israel. +\p +\v 23 “You shall make a table of acacia wood. Its length shall be two cubits, and its width a cubit, and its height one and a half cubits. +\v 24 You shall overlay it with pure gold, and make a gold molding around it. +\v 25 You shall make a rim of a hand width around it. You shall make a golden molding on its rim around it. +\v 26 You shall make four rings of gold for it, and put the rings in the four corners that are on its four feet. +\v 27 The rings shall be close to the rim, for places for the poles to carry the table. +\v 28 You shall make the poles of acacia wood, and overlay them with gold, that the table may be carried with them. +\v 29 You shall make its dishes, its spoons, its ladles, and its bowls with which to pour out offerings. You shall make them of pure gold. +\v 30 You shall set bread of the presence on the table before me always. +\p +\v 31 “You shall make a lamp stand of pure gold. The lamp stand shall be made of hammered work. Its base, its shaft, its cups, its buds, and its flowers shall be of one piece with it. +\v 32 There shall be six branches going out of its sides: three branches of the lamp stand out of its one side, and three branches of the lamp stand out of its other side; +\v 33 three cups made like almond blossoms in one branch, a bud and a flower; and three cups made like almond blossoms in the other branch, a bud and a flower, so for the six branches going out of the lamp stand; +\v 34 and in the lamp stand four cups made like almond blossoms, its buds and its flowers; +\v 35 and a bud under two branches of one piece with it, and a bud under two branches of one piece with it, and a bud under two branches of one piece with it, for the six branches going out of the lamp stand. +\v 36 Their buds and their branches shall be of one piece with it, all of it one beaten work of pure gold. +\v 37 You shall make its lamps seven, and they shall light its lamps to give light to the space in front of it. +\v 38 Its snuffers and its snuff dishes shall be of pure gold. +\v 39 It shall be made of a talent\f + \fr 25:39 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of pure gold, with all these accessories. +\v 40 See that you make them after their pattern, which has been shown to you on the mountain. +\c 26 +\p +\v 1 “Moreover you shall make the tabernacle with ten curtains of fine twined linen, and blue, and purple, and scarlet, with cherubim. You shall make them with the work of a skillful workman. +\v 2 The length of each curtain shall be twenty-eight cubits,\f + \fr 26:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and the width of each curtain four cubits: all the curtains shall have one measure. +\v 3 Five curtains shall be coupled together to one another, and the other five curtains shall be coupled to one another. +\v 4 You shall make loops of blue on the edge of the one curtain from the edge in the coupling, and you shall do likewise on the edge of the curtain that is outermost in the second coupling. +\v 5 You shall make fifty loops in the one curtain, and you shall make fifty loops in the edge of the curtain that is in the second coupling. The loops shall be opposite one another. +\v 6 You shall make fifty clasps of gold, and couple the curtains to one another with the clasps. The tabernacle shall be a unit. +\p +\v 7 “You shall make curtains of goats’ hair for a covering over the tabernacle. You shall make eleven curtains. +\v 8 The length of each curtain shall be thirty cubits, and the width of each curtain four cubits: the eleven curtains shall have one measure. +\v 9 You shall couple five curtains by themselves, and six curtains by themselves, and shall double over the sixth curtain in the forefront of the tent. +\v 10 You shall make fifty loops on the edge of the one curtain that is outermost in the coupling, and fifty loops on the edge of the curtain which is outermost in the second coupling. +\v 11 You shall make fifty clasps of bronze, and put the clasps into the loops, and couple the tent together, that it may be one. +\v 12 The overhanging part that remains of the curtains of the tent—the half curtain that remains—shall hang over the back of the tabernacle. +\v 13 The cubit on the one side and the cubit on the other side, of that which remains in the length of the curtains of the tent, shall hang over the sides of the tabernacle on this side and on that side, to cover it. +\v 14 You shall make a covering for the tent of rams’ skins dyed red, and a covering of sea cow hides above. +\p +\v 15 “You shall make the boards for the tabernacle of acacia wood, standing upright. +\v 16 Ten cubits shall be the length of a board, and one and a half cubits the width of each board. +\v 17 There shall be two tenons in each board, joined to one another: thus you shall make for all the boards of the tabernacle. +\v 18 You shall make twenty boards for the tabernacle, for the south side southward. +\v 19 You shall make forty sockets of silver under the twenty boards; two sockets under one board for its two tenons, and two sockets under another board for its two tenons. +\v 20 For the second side of the tabernacle, on the north side, twenty boards, +\v 21 and their forty sockets of silver; two sockets under one board, and two sockets under another board. +\v 22 For the far side of the tabernacle westward you shall make six boards. +\v 23 You shall make two boards for the corners of the tabernacle in the far side. +\v 24 They shall be double beneath, and in the same way they shall be whole to its top to one ring: thus shall it be for them both; they shall be for the two corners. +\v 25 There shall be eight boards, and their sockets of silver, sixteen sockets; two sockets under one board, and two sockets under another board. +\p +\v 26 “You shall make bars of acacia wood: five for the boards of the one side of the tabernacle, +\v 27 and five bars for the boards of the other side of the tabernacle, and five bars for the boards of the side of the tabernacle, for the far side westward. +\v 28 The middle bar in the middle of the boards shall pass through from end to end. +\v 29 You shall overlay the boards with gold, and make their rings of gold for places for the bars. You shall overlay the bars with gold. +\v 30 You shall set up the tabernacle according to the way that it was shown to you on the mountain. +\p +\v 31 “You shall make a veil of blue, and purple, and scarlet, and fine twined linen, with cherubim. It shall be the work of a skillful workman. +\v 32 You shall hang it on four pillars of acacia overlaid with gold; their hooks shall be of gold, on four sockets of silver. +\v 33 You shall hang up the veil under the clasps, and shall bring the ark of the covenant in there within the veil. The veil shall separate the holy place from the most holy for you. +\v 34 You shall put the mercy seat on the ark of the covenant in the most holy place. +\v 35 You shall set the table outside the veil, and the lamp stand opposite the table on the side of the tabernacle toward the south. You shall put the table on the north side. +\p +\v 36 “You shall make a screen for the door of the Tent, of blue, and purple, and scarlet, and fine twined linen, the work of the embroiderer. +\v 37 You shall make for the screen five pillars of acacia, and overlay them with gold. Their hooks shall be of gold. You shall cast five sockets of bronze for them. +\c 27 +\p +\v 1 “You shall make the altar of acacia wood, five cubits\f + \fr 27:1 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* long, and five cubits wide. The altar shall be square. Its height shall be three cubits.\f + \fr 27:1 \ft The altar was to be about 2.3×2.3×1.4 meters or about 7½×7½×4½ feet.\f* +\v 2 You shall make its horns on its four corners. Its horns shall be of one piece with it. You shall overlay it with bronze. +\v 3 You shall make its pots to take away its ashes; and its shovels, its basins, its meat hooks, and its fire pans. You shall make all its vessels of bronze. +\v 4 You shall make a grating for it of network of bronze. On the net you shall make four bronze rings in its four corners. +\v 5 You shall put it under the ledge around the altar beneath, that the net may reach halfway up the altar. +\v 6 You shall make poles for the altar, poles of acacia wood, and overlay them with bronze. +\v 7 Its poles shall be put into the rings, and the poles shall be on the two sides of the altar when carrying it. +\v 8 You shall make it hollow with planks. They shall make it as it has been shown you on the mountain. +\p +\v 9 “You shall make the court of the tabernacle: for the south side southward there shall be hangings for the court of fine twined linen one hundred cubits long for one side. +\v 10 Its pillars shall be twenty, and their sockets twenty, of bronze. The hooks of the pillars and their fillets shall be of silver. +\v 11 Likewise for the length of the north side, there shall be hangings one hundred cubits long, and its pillars twenty, and their sockets twenty, of bronze; the hooks of the pillars, and their fillets, of silver. +\v 12 For the width of the court on the west side shall be hangings of fifty cubits; their pillars ten, and their sockets ten. +\v 13 The width of the court on the east side eastward shall be fifty cubits. +\v 14 The hangings for the one side of the gate shall be fifteen cubits; their pillars three, and their sockets three. +\v 15 For the other side shall be hangings of fifteen cubits; their pillars three, and their sockets three. +\v 16 For the gate of the court shall be a screen of twenty cubits, of blue, and purple, and scarlet, and fine twined linen, the work of the embroiderer; their pillars four, and their sockets four. +\v 17 All the pillars of the court around shall be filleted with silver; their hooks of silver, and their sockets of bronze. +\v 18 The length of the court shall be one hundred cubits, and the width fifty throughout, and the height five cubits, of fine twined linen, and their sockets of bronze. +\v 19 All the instruments of the tabernacle in all its service, and all its pins, and all the pins of the court, shall be of bronze. +\p +\v 20 “You shall command the children of Israel, that they bring to you pure olive oil beaten for the light, to cause a lamp to burn continually. +\v 21 In the Tent of Meeting, outside the veil which is before the covenant, Aaron and his sons shall keep it in order from evening to morning before Yahweh: it shall be a statute forever throughout their generations on the behalf of the children of Israel. +\c 28 +\p +\v 1 “Bring Aaron your brother, and his sons with him, near to you from among the children of Israel, that he may minister to me in the priest’s office: Aaron, with Nadab, Abihu, Eleazar, and Ithamar, Aaron’s sons. +\v 2 You shall make holy garments for Aaron your brother, for glory and for beauty. +\v 3 You shall speak to all who are wise-hearted, whom I have filled with the spirit of wisdom, that they make Aaron’s garments to sanctify him, that he may minister to me in the priest’s office. +\v 4 These are the garments which they shall make: a breastplate, an ephod, a robe, a fitted tunic, a turban, and a sash. They shall make holy garments for Aaron your brother and his sons, that he may minister to me in the priest’s office. +\v 5 They shall use the gold, and the blue, and the purple, and the scarlet, and the fine linen. +\p +\v 6 “They shall make the ephod of gold, blue, purple, scarlet, and fine twined linen, the work of the skillful workman. +\v 7 It shall have two shoulder straps joined to the two ends of it, that it may be joined together. +\v 8 The skillfully woven band, which is on it, shall be like its work and of the same piece; of gold, blue, purple, scarlet, and fine twined linen. +\v 9 You shall take two onyx stones, and engrave on them the names of the children of Israel. +\v 10 Six of their names on the one stone, and the names of the six that remain on the other stone, in the order of their birth. +\v 11 With the work of an engraver in stone, like the engravings of a signet, you shall engrave the two stones, according to the names of the children of Israel. You shall make them to be enclosed in settings of gold. +\v 12 You shall put the two stones on the shoulder straps of the ephod, to be stones of memorial for the children of Israel. Aaron shall bear their names before Yahweh on his two shoulders for a memorial. +\v 13 You shall make settings of gold, +\v 14 and two chains of pure gold; you shall make them like cords of braided work. You shall put the braided chains on the settings. +\p +\v 15 “You shall make a breastplate of judgment, the work of the skillful workman; like the work of the ephod you shall make it; of gold, of blue, and purple, and scarlet, and fine twined linen, you shall make it. +\v 16 It shall be square and folded double; a span\f + \fr 28:16 \ft A span is the length from the tip of a man’s thumb to the tip of his little finger when his hand is stretched out (about half a cubit, or 9 inches, or 22.8 cm.)\f* shall be its length, and a span its width. +\v 17 You shall set in it settings of stones, four rows of stones: a row of ruby, topaz, and beryl shall be the first row; +\v 18 and the second row a turquoise, a sapphire,\f + \fr 28:18 \ft or, lapis lazuli \f* and an emerald; +\v 19 and the third row a jacinth, an agate, and an amethyst; +\v 20 and the fourth row a chrysolite, an onyx, and a jasper. They shall be enclosed in gold in their settings. +\v 21 The stones shall be according to the names of the children of Israel, twelve, according to their names; like the engravings of a signet, everyone according to his name, they shall be for the twelve tribes. +\v 22 You shall make on the breastplate chains like cords, of braided work of pure gold. +\v 23 You shall make on the breastplate two rings of gold, and shall put the two rings on the two ends of the breastplate. +\v 24 You shall put the two braided chains of gold in the two rings at the ends of the breastplate. +\v 25 The other two ends of the two braided chains you shall put on the two settings, and put them on the shoulder straps of the ephod in its forepart. +\v 26 You shall make two rings of gold, and you shall put them on the two ends of the breastplate, on its edge, which is toward the side of the ephod inward. +\v 27 You shall make two rings of gold, and shall put them on the two shoulder straps of the ephod underneath, in its forepart, close by its coupling, above the skillfully woven band of the ephod. +\v 28 They shall bind the breastplate by its rings to the rings of the ephod with a lace of blue, that it may be on the skillfully woven band of the ephod, and that the breastplate may not swing out from the ephod. +\v 29 Aaron shall bear the names of the children of Israel in the breastplate of judgment on his heart, when he goes in to the holy place, for a memorial before Yahweh continually. +\v 30 You shall put in the breastplate of judgment the Urim and the Thummim; and they shall be on Aaron’s heart, when he goes in before Yahweh. Aaron shall bear the judgment of the children of Israel on his heart before Yahweh continually. +\p +\v 31 “You shall make the robe of the ephod all of blue. +\v 32 It shall have a hole for the head in the middle of it. It shall have a binding of woven work around its hole, as it were the hole of a coat of mail, that it not be torn. +\v 33 On its hem you shall make pomegranates of blue, and of purple, and of scarlet, all around its hem; with bells of gold between and around them: +\v 34 a golden bell and a pomegranate, a golden bell and a pomegranate, around the hem of the robe. +\v 35 It shall be on Aaron to minister: and its sound shall be heard when he goes in to the holy place before Yahweh, and when he comes out, that he not die. +\p +\v 36 “You shall make a plate of pure gold, and engrave on it, like the engravings of a signet, ‘HOLY TO YAHWEH.’ +\v 37 You shall put it on a lace of blue, and it shall be on the sash. It shall be on the front of the sash. +\v 38 It shall be on Aaron’s forehead, and Aaron shall bear the iniquity of the holy things, which the children of Israel shall make holy in all their holy gifts; and it shall be always on his forehead, that they may be accepted before Yahweh. +\v 39 You shall weave the tunic with fine linen. You shall make a turban of fine linen. You shall make a sash, the work of the embroiderer. +\p +\v 40 “You shall make tunics for Aaron’s sons. You shall make sashes for them. You shall make headbands for them, for glory and for beauty. +\v 41 You shall put them on Aaron your brother, and on his sons with him, and shall anoint them, and consecrate them, and sanctify them, that they may minister to me in the priest’s office. +\v 42 You shall make them linen pants to cover their naked flesh. They shall reach from the waist even to the thighs. +\v 43 They shall be on Aaron and on his sons, when they go in to the Tent of Meeting, or when they come near to the altar to minister in the holy place, that they don’t bear iniquity, and die. This shall be a statute forever to him and to his offspring after him. +\c 29 +\p +\v 1 “This is the thing that you shall do to them to make them holy, to minister to me in the priest’s office: take one young bull and two rams without defect, +\v 2 unleavened bread, unleavened cakes mixed with oil, and unleavened wafers anointed with oil. You shall make them of fine wheat flour. +\v 3 You shall put them into one basket, and bring them in the basket, with the bull and the two rams. +\v 4 You shall bring Aaron and his sons to the door of the Tent of Meeting, and shall wash them with water. +\v 5 You shall take the garments, and put on Aaron the tunic, the robe of the ephod, the ephod, and the breastplate, and clothe him with the skillfully woven band of the ephod. +\v 6 You shall set the turban on his head, and put the holy crown on the turban. +\v 7 Then you shall take the anointing oil, and pour it on his head, and anoint him. +\v 8 You shall bring his sons, and put tunics on them. +\v 9 You shall clothe them with belts, Aaron and his sons, and bind headbands on them. They shall have the priesthood by a perpetual statute. You shall consecrate Aaron and his sons. +\p +\v 10 “You shall bring the bull before the Tent of Meeting; and Aaron and his sons shall lay their hands on the head of the bull. +\v 11 You shall kill the bull before Yahweh at the door of the Tent of Meeting. +\v 12 You shall take of the blood of the bull, and put it on the horns of the altar with your finger; and you shall pour out all the blood at the base of the altar. +\v 13 You shall take all the fat that covers the innards, the cover of the liver, the two kidneys, and the fat that is on them, and burn them on the altar. +\v 14 But the meat of the bull, and its skin, and its dung, you shall burn with fire outside of the camp. It is a sin offering. +\p +\v 15 “You shall also take the one ram, and Aaron and his sons shall lay their hands on the head of the ram. +\v 16 You shall kill the ram, and you shall take its blood, and sprinkle it around on the altar. +\v 17 You shall cut the ram into its pieces, and wash its innards, and its legs, and put them with its pieces, and with its head. +\v 18 You shall burn the whole ram on the altar: it is a burnt offering to Yahweh; it is a pleasant aroma, an offering made by fire to Yahweh. +\p +\v 19 “You shall take the other ram, and Aaron and his sons shall lay their hands on the head of the ram. +\v 20 Then you shall kill the ram, and take some of its blood, and put it on the tip of the right ear of Aaron, and on the tip of the right ear of his sons, and on the thumb of their right hand, and on the big toe of their right foot; and sprinkle the blood around on the altar. +\v 21 You shall take of the blood that is on the altar, and of the anointing oil, and sprinkle it on Aaron, and on his garments, and on his sons, and on the garments of his sons with him: and he shall be made holy, and his garments, and his sons, and his sons’ garments with him. +\v 22 Also you shall take some of the ram’s fat, the fat tail, the fat that covers the innards, the cover of the liver, the two kidneys, the fat that is on them, and the right thigh (for it is a ram of consecration), +\v 23 and one loaf of bread, one cake of oiled bread, and one wafer out of the basket of unleavened bread that is before Yahweh. +\v 24 You shall put all of this in Aaron’s hands, and in his sons’ hands, and shall wave them for a wave offering before Yahweh. +\v 25 You shall take them from their hands, and burn them on the altar on the burnt offering, for a pleasant aroma before Yahweh: it is an offering made by fire to Yahweh. +\p +\v 26 “You shall take the breast of Aaron’s ram of consecration, and wave it for a wave offering before Yahweh. It shall be your portion. +\v 27 You shall sanctify the breast of the wave offering and the thigh of the wave offering, which is waved, and which is raised up, of the ram of consecration, even of that which is for Aaron, and of that which is for his sons. +\v 28 It shall be for Aaron and his sons as their portion forever from the children of Israel; for it is a wave offering. It shall be a wave offering from the children of Israel of the sacrifices of their peace offerings, even their wave offering to Yahweh. +\p +\v 29 “The holy garments of Aaron shall be for his sons after him, to be anointed in them, and to be consecrated in them. +\v 30 Seven days shall the son who is priest in his place put them on, when he comes into the Tent of Meeting to minister in the holy place. +\p +\v 31 “You shall take the ram of consecration and boil its meat in a holy place. +\v 32 Aaron and his sons shall eat the meat of the ram, and the bread that is in the basket, at the door of the Tent of Meeting. +\v 33 They shall eat those things with which atonement was made, to consecrate and sanctify them; but a stranger shall not eat of it, because they are holy. +\v 34 If anything of the meat of the consecration, or of the bread, remains to the morning, then you shall burn the remainder with fire. It shall not be eaten, because it is holy. +\p +\v 35 “You shall do so to Aaron and to his sons, according to all that I have commanded you. You shall consecrate them seven days. +\v 36 Every day you shall offer the bull of sin offering for atonement. You shall cleanse the altar when you make atonement for it. You shall anoint it, to sanctify it. +\v 37 Seven days you shall make atonement for the altar, and sanctify it; and the altar shall be most holy. Whatever touches the altar shall be holy. +\p +\v 38 “Now this is that which you shall offer on the altar: two lambs a year old day by day continually. +\v 39 The one lamb you shall offer in the morning; and the other lamb you shall offer at evening; +\v 40 and with the one lamb a tenth part of an ephah\f + \fr 29:40 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with the fourth part of a hin\f + \fr 29:40 \ft A hin is about 6.5 liters or 1.7 gallons, so a fourth of a hin is about 1.6 liters.\f* of beaten oil, and the fourth part of a hin of wine for a drink offering. +\v 41 The other lamb you shall offer at evening, and shall do to it according to the meal offering of the morning and according to its drink offering, for a pleasant aroma, an offering made by fire to Yahweh. +\v 42 It shall be a continual burnt offering throughout your generations at the door of the Tent of Meeting before Yahweh, where I will meet with you, to speak there to you. +\v 43 There I will meet with the children of Israel; and the place shall be sanctified by my glory. +\v 44 I will sanctify the Tent of Meeting and the altar. I will also sanctify Aaron and his sons to minister to me in the priest’s office. +\v 45 I will dwell among the children of Israel, and will be their God. +\v 46 They shall know that I am Yahweh their God, who brought them out of the land of Egypt, that I might dwell among them: I am Yahweh their God. +\c 30 +\p +\v 1 “You shall make an altar to burn incense on. You shall make it of acacia wood. +\v 2 Its length shall be a cubit,\f + \fr 30:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width a cubit. It shall be square, and its height shall be two cubits. Its horns shall be of one piece with it. +\v 3 You shall overlay it with pure gold, its top, its sides around it, and its horns; and you shall make a gold molding around it. +\v 4 You shall make two golden rings for it under its molding; on its two ribs, on its two sides you shall make them; and they shall be for places for poles with which to bear it. +\v 5 You shall make the poles of acacia wood, and overlay them with gold. +\v 6 You shall put it before the veil that is by the ark of the covenant, before the mercy seat that is over the covenant, where I will meet with you. +\v 7 Aaron shall burn incense of sweet spices on it every morning. When he tends the lamps, he shall burn it. +\v 8 When Aaron lights the lamps at evening, he shall burn it, a perpetual incense before Yahweh throughout your generations. +\v 9 You shall offer no strange incense on it, nor burnt offering, nor meal offering; and you shall pour no drink offering on it. +\v 10 Aaron shall make atonement on its horns once in the year; with the blood of the sin offering of atonement once in the year he shall make atonement for it throughout your generations. It is most holy to Yahweh.” +\p +\v 11 Yahweh spoke to Moses, saying, +\v 12 “When you take a census of the children of Israel, according to those who are counted among them, then each man shall give a ransom for his soul to Yahweh when you count them, that there be no plague among them when you count them. +\v 13 They shall give this, everyone who passes over to those who are counted, half a shekel according to the shekel\f + \fr 30:13 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary (the shekel is twenty gerahs\f + \fr 30:13 \ft a gerah is about 0.5 grams or about 7.7 grains\f*); half a shekel for an offering to Yahweh. +\v 14 Everyone who passes over to those who are counted, from twenty years old and upward, shall give the offering to Yahweh. +\v 15 The rich shall not give more, and the poor shall not give less, than the half shekel,\f + \fr 30:15 \ft A shekel is about 10 grams or about 0.35 ounces.\f* when they give the offering of Yahweh, to make atonement for your souls. +\v 16 You shall take the atonement money from the children of Israel, and shall appoint it for the service of the Tent of Meeting; that it may be a memorial for the children of Israel before Yahweh, to make atonement for your souls.” +\p +\v 17 Yahweh spoke to Moses, saying, +\v 18 “You shall also make a basin of bronze, and its base of bronze, in which to wash. You shall put it between the Tent of Meeting and the altar, and you shall put water in it. +\v 19 Aaron and his sons shall wash their hands and their feet in it. +\v 20 When they go into the Tent of Meeting, they shall wash with water, that they not die; or when they come near to the altar to minister, to burn an offering made by fire to Yahweh. +\v 21 So they shall wash their hands and their feet, that they not die. This shall be a statute forever to them, even to him and to his descendants throughout their generations.” +\p +\v 22 Moreover Yahweh spoke to Moses, saying, +\v 23 “Also take fine spices: of liquid myrrh, five hundred shekels;\f + \fr 30:23 \ft A shekel is about 10 grams or about 0.35 ounces, so 500 shekels is about 5 kilograms or about 11 pounds.\f* and of fragrant cinnamon half as much, even two hundred and fifty; and of fragrant cane, two hundred and fifty; +\v 24 and of cassia five hundred, according to the shekel of the sanctuary; and a hin\f + \fr 30:24 \ft A hin is about 6.5 liters or 1.7 gallons.\f* of olive oil. +\v 25 You shall make it into a holy anointing oil, a perfume compounded after the art of the perfumer: it shall be a holy anointing oil. +\v 26 You shall use it to anoint the Tent of Meeting, the ark of the covenant, +\v 27 the table and all its articles, the lamp stand and its accessories, the altar of incense, +\v 28 the altar of burnt offering with all its utensils, and the basin with its base. +\v 29 You shall sanctify them, that they may be most holy. Whatever touches them shall be holy. +\v 30 You shall anoint Aaron and his sons, and sanctify them, that they may minister to me in the priest’s office. +\v 31 You shall speak to the children of Israel, saying, ‘This shall be a holy anointing oil to me throughout your generations. +\v 32 It shall not be poured on man’s flesh, and do not make any like it, according to its composition. It is holy. It shall be holy to you. +\v 33 Whoever compounds any like it, or whoever puts any of it on a stranger, he shall be cut off from his people.’” +\p +\v 34 Yahweh said to Moses, “Take to yourself sweet spices, gum resin, onycha, and galbanum: sweet spices with pure frankincense. There shall be an equal weight of each. +\v 35 You shall make incense of it, a perfume after the art of the perfumer, seasoned with salt, pure and holy. +\v 36 You shall beat some of it very small, and put some of it before the covenant in the Tent of Meeting, where I will meet with you. It shall be to you most holy. +\v 37 You shall not make this incense, according to its composition, for yourselves: it shall be to you holy for Yahweh. +\v 38 Whoever shall make any like that, to smell of it, he shall be cut off from his people.” +\c 31 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Behold, I have called by name Bezalel the son of Uri, the son of Hur, of the tribe of Judah. +\v 3 I have filled him with the Spirit of God, in wisdom, and in understanding, and in knowledge, and in all kinds of workmanship, +\v 4 to devise skillful works, to work in gold, and in silver, and in bronze, +\v 5 and in cutting of stones for setting, and in carving of wood, to work in all kinds of workmanship. +\v 6 Behold, I myself have appointed with him Oholiab, the son of Ahisamach, of the tribe of Dan; and in the heart of all who are wise-hearted I have put wisdom, that they may make all that I have commanded you: +\v 7 the Tent of Meeting, the ark of the covenant, the mercy seat that is on it, all the furniture of the Tent, +\v 8 the table and its vessels, the pure lamp stand with all its vessels, the altar of incense, +\v 9 the altar of burnt offering with all its vessels, the basin and its base, +\v 10 the finely worked garments—the holy garments for Aaron the priest, the garments of his sons to minister in the priest’s office— +\v 11 the anointing oil, and the incense of sweet spices for the holy place: according to all that I have commanded you they shall do.” +\p +\v 12 Yahweh spoke to Moses, saying, +\v 13 “Speak also to the children of Israel, saying, ‘Most certainly you shall keep my Sabbaths; for it is a sign between me and you throughout your generations, that you may know that I am Yahweh who sanctifies you. +\v 14 You shall keep the Sabbath therefore, for it is holy to you. Everyone who profanes it shall surely be put to death; for whoever does any work therein, that soul shall be cut off from among his people. +\v 15 Six days shall work be done, but on the seventh day is a Sabbath of solemn rest, holy to Yahweh. Whoever does any work on the Sabbath day shall surely be put to death. +\v 16 Therefore the children of Israel shall keep the Sabbath, to observe the Sabbath throughout their generations, for a perpetual covenant. +\v 17 It is a sign between me and the children of Israel forever; for in six days Yahweh made heaven and earth, and on the seventh day he rested, and was refreshed.’” +\p +\v 18 When he finished speaking with him on Mount Sinai, he gave Moses the two tablets of the covenant, stone tablets, written with God’s finger. +\c 32 +\p +\v 1 When the people saw that Moses delayed coming down from the mountain, the people gathered themselves together to Aaron, and said to him, “Come, make us gods, which shall go before us; for as for this Moses, the man who brought us up out of the land of Egypt, we don’t know what has become of him.” +\p +\v 2 Aaron said to them, “Take off the golden rings, which are in the ears of your wives, of your sons, and of your daughters, and bring them to me.” +\p +\v 3 All the people took off the golden rings which were in their ears, and brought them to Aaron. +\v 4 He received what they handed him, fashioned it with an engraving tool, and made it a molded calf. Then they said, “These are your gods, Israel, which brought you up out of the land of Egypt.” +\p +\v 5 When Aaron saw this, he built an altar before it; and Aaron made a proclamation, and said, “Tomorrow shall be a feast to Yahweh.” +\p +\v 6 They rose up early on the next day, and offered burnt offerings, and brought peace offerings; and the people sat down to eat and to drink, and rose up to play. +\p +\v 7 Yahweh spoke to Moses, “Go, get down; for your people, whom you brought up out of the land of Egypt, have corrupted themselves! +\v 8 They have turned away quickly out of the way which I commanded them. They have made themselves a molded calf, and have worshiped it, and have sacrificed to it, and said, ‘These are your gods, Israel, which brought you up out of the land of Egypt.’” +\p +\v 9 Yahweh said to Moses, “I have seen these people, and behold, they are a stiff-necked people. +\v 10 Now therefore leave me alone, that my wrath may burn hot against them, and that I may consume them; and I will make of you a great nation.” +\p +\v 11 Moses begged Yahweh his God, and said, “Yahweh, why does your wrath burn hot against your people, that you have brought out of the land of Egypt with great power and with a mighty hand? +\v 12 Why should the Egyptians talk, saying, ‘He brought them out for evil, to kill them in the mountains, and to consume them from the surface of the earth?’ Turn from your fierce wrath, and turn away from this evil against your people. +\v 13 Remember Abraham, Isaac, and Israel, your servants, to whom you swore by your own self, and said to them, ‘I will multiply your offspring\f + \fr 32:13 \ft or, seed\f* as the stars of the sky, and all this land that I have spoken of I will give to your offspring, and they shall inherit it forever.’” +\p +\v 14 So Yahweh turned away from the evil which he said he would do to his people. +\p +\v 15 Moses turned, and went down from the mountain, with the two tablets of the covenant in his hand; tablets that were written on both their sides. They were written on one side and on the other. +\v 16 The tablets were the work of God, and the writing was the writing of God, engraved on the tablets. +\p +\v 17 When Joshua heard the noise of the people as they shouted, he said to Moses, “There is the noise of war in the camp.” +\p +\v 18 He said, “It isn’t the voice of those who shout for victory. It is not the voice of those who cry for being overcome; but the noise of those who sing that I hear.” +\v 19 As soon as he came near to the camp, he saw the calf and the dancing. Then Moses’ anger grew hot, and he threw the tablets out of his hands, and broke them beneath the mountain. +\v 20 He took the calf which they had made, and burned it with fire, ground it to powder, and scattered it on the water, and made the children of Israel drink it. +\p +\v 21 Moses said to Aaron, “What did these people do to you, that you have brought a great sin on them?” +\p +\v 22 Aaron said, “Don’t let the anger of my lord grow hot. You know the people, that they are set on evil. +\v 23 For they said to me, ‘Make us gods, which shall go before us. As for this Moses, the man who brought us up out of the land of Egypt, we don’t know what has become of him.’ +\v 24 I said to them, ‘Whoever has any gold, let them take it off.’ So they gave it to me; and I threw it into the fire, and out came this calf.” +\p +\v 25 When Moses saw that the people were out of control, (for Aaron had let them lose control, causing derision among their enemies), +\v 26 then Moses stood in the gate of the camp, and said, “Whoever is on Yahweh’s side, come to me!” +\p All the sons of Levi gathered themselves together to him. +\v 27 He said to them, “Yahweh, the God of Israel, says, ‘Every man put his sword on his thigh, and go back and forth from gate to gate throughout the camp, and every man kill his brother, and every man his companion, and every man his neighbor.’” +\v 28 The sons of Levi did according to the word of Moses. About three thousand men fell of the people that day. +\v 29 Moses said, “Consecrate yourselves today to Yahweh, for every man was against his son and against his brother, that he may give you a blessing today.” +\p +\v 30 On the next day, Moses said to the people, “You have sinned a great sin. Now I will go up to Yahweh. Perhaps I shall make atonement for your sin.” +\p +\v 31 Moses returned to Yahweh, and said, “Oh, this people have sinned a great sin, and have made themselves gods of gold. +\v 32 Yet now, if you will, forgive their sin—and if not, please blot me out of your book which you have written.” +\p +\v 33 Yahweh said to Moses, “Whoever has sinned against me, I will blot him out of my book. +\v 34 Now go, lead the people to the place of which I have spoken to you. Behold, my angel shall go before you. Nevertheless, in the day when I punish, I will punish them for their sin.” +\v 35 Yahweh struck the people, because of what they did with the calf, which Aaron made. +\c 33 +\p +\v 1 Yahweh spoke to Moses, “Depart, go up from here, you and the people that you have brought up out of the land of Egypt, to the land of which I swore to Abraham, to Isaac, and to Jacob, saying, ‘I will give it to your offspring.’ +\v 2 I will send an angel before you; and I will drive out the Canaanite, the Amorite, and the Hittite, and the Perizzite, the Hivite, and the Jebusite. +\v 3 Go to a land flowing with milk and honey; but I will not go up among you, for you are a stiff-necked people, lest I consume you on the way.” +\p +\v 4 When the people heard this evil news, they mourned; and no one put on his jewelry. +\p +\v 5 Yahweh had said to Moses, “Tell the children of Israel, ‘You are a stiff-necked people. If I were to go up among you for one moment, I would consume you. Therefore now take off your jewelry from you, that I may know what to do to you.’” +\p +\v 6 The children of Israel stripped themselves of their jewelry from Mount Horeb onward. +\p +\v 7 Now Moses used to take the tent and pitch it outside the camp, far away from the camp, and he called it “The Tent of Meeting.” Everyone who sought Yahweh went out to the Tent of Meeting, which was outside the camp. +\v 8 When Moses went out to the Tent, all the people rose up, and stood, everyone at their tent door, and watched Moses, until he had gone into the Tent. +\v 9 When Moses entered into the Tent, the pillar of cloud descended, stood at the door of the Tent, and Yahweh spoke with Moses. +\v 10 All the people saw the pillar of cloud stand at the door of the Tent, and all the people rose up and worshiped, everyone at their tent door. +\v 11 Yahweh spoke to Moses face to face, as a man speaks to his friend. He turned again into the camp, but his servant Joshua, the son of Nun, a young man, didn’t depart from the Tent. +\p +\v 12 Moses said to Yahweh, “Behold, you tell me, ‘Bring up this people;’ and you haven’t let me know whom you will send with me. Yet you have said, ‘I know you by name, and you have also found favor in my sight.’ +\v 13 Now therefore, if I have found favor in your sight, please show me your way, now, that I may know you, so that I may find favor in your sight; and consider that this nation is your people.” +\p +\v 14 He said, “My presence will go with you, and I will give you rest.” +\p +\v 15 Moses said to him, “If your presence doesn’t go with me, don’t carry us up from here. +\v 16 For how would people know that I have found favor in your sight, I and your people? Isn’t it that you go with us, so that we are separated, I and your people, from all the people who are on the surface of the earth?” +\p +\v 17 Yahweh said to Moses, “I will do this thing also that you have spoken; for you have found favor in my sight, and I know you by name.” +\p +\v 18 Moses said, “Please show me your glory.” +\p +\v 19 He said, “I will make all my goodness pass before you, and will proclaim Yahweh’s name before you. I will be gracious to whom I will be gracious, and will show mercy on whom I will show mercy.” +\v 20 He said, “You cannot see my face, for man may not see me and live.” +\v 21 Yahweh also said, “Behold, there is a place by me, and you shall stand on the rock. +\v 22 It will happen, while my glory passes by, that I will put you in a cleft of the rock, and will cover you with my hand until I have passed by; +\v 23 then I will take away my hand, and you will see my back; but my face shall not be seen.” +\c 34 +\p +\v 1 Yahweh said to Moses, “Chisel two stone tablets like the first. I will write on the tablets the words that were on the first tablets, which you broke. +\v 2 Be ready by the morning, and come up in the morning to Mount Sinai, and present yourself there to me on the top of the mountain. +\v 3 No one shall come up with you or be seen anywhere on the mountain. Do not let the flocks or herds graze in front of that mountain.” +\p +\v 4 He chiseled two tablets of stone like the first; then Moses rose up early in the morning, and went up to Mount Sinai, as Yahweh had commanded him, and took in his hand two stone tablets. +\v 5 Yahweh descended in the cloud, and stood with him there, and proclaimed Yahweh’s name. +\v 6 Yahweh passed by before him, and proclaimed, “Yahweh! Yahweh, a merciful and gracious God, slow to anger, and abundant in loving kindness and truth, +\v 7 keeping loving kindness for thousands, forgiving iniquity and disobedience and sin; and who will by no means clear the guilty, visiting the iniquity of the fathers on the children, and on the children’s children, on the third and on the fourth generation.” +\p +\v 8 Moses hurried and bowed his head toward the earth, and worshiped. +\v 9 He said, “If now I have found favor in your sight, Lord, please let the Lord go among us, even though this is a stiff-necked people; pardon our iniquity and our sin, and take us for your inheritance.” +\p +\v 10 He said, “Behold, I make a covenant: before all your people I will do marvels, such as have not been worked in all the earth, nor in any nation; and all the people among whom you are shall see the work of Yahweh; for it is an awesome thing that I do with you. +\v 11 Observe that which I command you today. Behold, I will drive out before you the Amorite, the Canaanite, the Hittite, the Perizzite, the Hivite, and the Jebusite. +\v 12 Be careful, lest you make a covenant with the inhabitants of the land where you are going, lest it be for a snare among you; +\v 13 but you shall break down their altars, and dash in pieces their pillars, and you shall cut down their Asherah poles; +\v 14 for you shall worship no other god; for Yahweh, whose name is Jealous, is a jealous God. +\p +\v 15 “Don’t make a covenant with the inhabitants of the land, lest they play the prostitute after their gods, and sacrifice to their gods, and one call you and you eat of his sacrifice; +\v 16 and you take of their daughters to your sons, and their daughters play the prostitute after their gods, and make your sons play the prostitute after their gods. +\p +\v 17 “You shall make no cast idols for yourselves. +\p +\v 18 “You shall keep the feast of unleavened bread. Seven days you shall eat unleavened bread, as I commanded you, at the time appointed in the month Abib; for in the month Abib you came out of Egypt. +\p +\v 19 “All that opens the womb is mine; and all your livestock that is male, the firstborn of cow and sheep. +\v 20 You shall redeem the firstborn of a donkey with a lamb. If you will not redeem it, then you shall break its neck. You shall redeem all the firstborn of your sons. No one shall appear before me empty. +\p +\v 21 “Six days you shall work, but on the seventh day you shall rest: in plowing time and in harvest you shall rest. +\p +\v 22 “You shall observe the feast of weeks with the first fruits of wheat harvest, and the feast of harvest at the year’s end. +\v 23 Three times in the year all your males shall appear before the Lord Yahweh, the God of Israel. +\v 24 For I will drive out nations before you and enlarge your borders; neither shall any man desire your land when you go up to appear before Yahweh, your God, three times in the year. +\p +\v 25 “You shall not offer the blood of my sacrifice with leavened bread. The sacrifice of the feast of the Passover shall not be left to the morning. +\p +\v 26 “You shall bring the first of the first fruits of your ground to the house of Yahweh your God. +\p “You shall not boil a young goat in its mother’s milk.” +\p +\v 27 Yahweh said to Moses, “Write these words; for in accordance with these words I have made a covenant with you and with Israel.” +\p +\v 28 He was there with Yahweh forty days and forty nights; he neither ate bread, nor drank water. He wrote on the tablets the words of the covenant, the ten commandments. +\p +\v 29 When Moses came down from Mount Sinai with the two tablets of the covenant in Moses’ hand, when he came down from the mountain, Moses didn’t know that the skin of his face shone by reason of his speaking with him. +\v 30 When Aaron and all the children of Israel saw Moses, behold, the skin of his face shone; and they were afraid to come near him. +\v 31 Moses called to them, and Aaron and all the rulers of the congregation returned to him; and Moses spoke to them. +\v 32 Afterward all the children of Israel came near, and he gave them all the commandments that Yahweh had spoken with him on Mount Sinai. +\v 33 When Moses was done speaking with them, he put a veil on his face. +\v 34 But when Moses went in before Yahweh to speak with him, he took the veil off, until he came out; and he came out, and spoke to the children of Israel that which he was commanded. +\v 35 The children of Israel saw Moses’ face, that the skin of Moses’ face shone; so Moses put the veil on his face again, until he went in to speak with him. +\c 35 +\p +\v 1 Moses assembled all the congregation of the children of Israel, and said to them, “These are the words which Yahweh has commanded, that you should do them. +\v 2 ‘Six days shall work be done, but on the seventh day there shall be a holy day for you, a Sabbath of solemn rest to Yahweh: whoever does any work in it shall be put to death. +\v 3 You shall kindle no fire throughout your habitations on the Sabbath day.’” +\p +\v 4 Moses spoke to all the congregation of the children of Israel, saying, “This is the thing which Yahweh commanded, saying, +\v 5 ‘Take from among you an offering to Yahweh. Whoever is of a willing heart, let him bring it as Yahweh’s offering: gold, silver, bronze, +\v 6 blue, purple, scarlet, fine linen, goats’ hair, +\v 7 rams’ skins dyed red, sea cow hides, acacia wood, +\v 8 oil for the light, spices for the anointing oil and for the sweet incense, +\v 9 onyx stones, and stones to be set for the ephod and for the breastplate. +\p +\v 10 “‘Let every wise-hearted man among you come, and make all that Yahweh has commanded: +\v 11 the tabernacle, its outer covering, its roof, its clasps, its boards, its bars, its pillars, and its sockets; +\v 12 the ark, and its poles, the mercy seat, the veil of the screen; +\v 13 the table with its poles and all its vessels, and the show bread; +\v 14 the lamp stand also for the light, with its vessels, its lamps, and the oil for the light; +\v 15 and the altar of incense with its poles, the anointing oil, the sweet incense, the screen for the door, at the door of the tabernacle; +\v 16 the altar of burnt offering, with its grating of bronze, its poles, and all its vessels, the basin and its base; +\v 17 the hangings of the court, its pillars, their sockets, and the screen for the gate of the court; +\v 18 the pins of the tabernacle, the pins of the court, and their cords; +\v 19 the finely worked garments for ministering in the holy place—the holy garments for Aaron the priest, and the garments of his sons—to minister in the priest’s office.’” +\p +\v 20 All the congregation of the children of Israel departed from the presence of Moses. +\v 21 They came, everyone whose heart stirred him up, and everyone whom his spirit made willing, and brought Yahweh’s offering for the work of the Tent of Meeting, and for all of its service, and for the holy garments. +\v 22 They came, both men and women, as many as were willing-hearted, and brought brooches, earrings, signet rings, and armlets, all jewels of gold; even every man who offered an offering of gold to Yahweh. +\v 23 Everyone with whom was found blue, purple, scarlet, fine linen, goats’ hair, rams’ skins dyed red, and sea cow hides, brought them. +\v 24 Everyone who offered an offering of silver and bronze brought Yahweh’s offering; and everyone with whom was found acacia wood for any work of the service, brought it. +\v 25 All the women who were wise-hearted spun with their hands, and brought that which they had spun: the blue, the purple, the scarlet, and the fine linen. +\v 26 All the women whose heart stirred them up in wisdom spun the goats’ hair. +\v 27 The rulers brought the onyx stones and the stones to be set for the ephod and for the breastplate; +\v 28 with the spice and the oil for the light, for the anointing oil, and for the sweet incense. +\v 29 The children of Israel brought a free will offering to Yahweh; every man and woman whose heart made them willing to bring for all the work, which Yahweh had commanded to be made by Moses. +\p +\v 30 Moses said to the children of Israel, “Behold, Yahweh has called by name Bezalel the son of Uri, the son of Hur, of the tribe of Judah. +\v 31 He has filled him with the Spirit of God, in wisdom, in understanding, in knowledge, and in all kinds of workmanship; +\v 32 and to make skillful works, to work in gold, in silver, in bronze, +\v 33 in cutting of stones for setting, and in carving of wood, to work in all kinds of skillful workmanship. +\v 34 He has put in his heart that he may teach, both he and Oholiab, the son of Ahisamach, of the tribe of Dan. +\v 35 He has filled them with wisdom of heart to work all kinds of workmanship, of the engraver, of the skillful workman, and of the embroiderer, in blue, in purple, in scarlet, and in fine linen, and of the weaver, even of those who do any workmanship, and of those who make skillful works. +\c 36 +\p +\v 1 “Bezalel and Oholiab shall work with every wise-hearted man, in whom Yahweh has put wisdom and understanding to know how to do all the work for the service of the sanctuary, according to all that Yahweh has commanded.” +\p +\v 2 Moses called Bezalel and Oholiab, and every wise-hearted man, in whose heart Yahweh had put wisdom, even everyone whose heart stirred him up to come to the work to do it. +\v 3 They received from Moses all the offering which the children of Israel had brought for the work of the service of the sanctuary, with which to make it. They kept bringing free will offerings to him every morning. +\v 4 All the wise men, who performed all the work of the sanctuary, each came from his work which he did. +\v 5 They spoke to Moses, saying, “The people have brought much more than enough for the service of the work which Yahweh commanded to make.” +\p +\v 6 Moses gave a commandment, and they caused it to be proclaimed throughout the camp, saying, “Let neither man nor woman make anything else for the offering for the sanctuary.” So the people were restrained from bringing. +\v 7 For the stuff they had was sufficient to do all the work, and too much. +\p +\v 8 All the wise-hearted men among those who did the work made the tabernacle with ten curtains of fine twined linen, blue, purple, and scarlet. They made them with cherubim, the work of a skillful workman. +\v 9 The length of each curtain was twenty-eight cubits,\f + \fr 36:9 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and the width of each curtain four cubits. All the curtains had one measure. +\v 10 He coupled five curtains to one another, and the other five curtains he coupled to one another. +\v 11 He made loops of blue on the edge of the one curtain from the edge in the coupling. Likewise he made in the edge of the curtain that was outermost in the second coupling. +\v 12 He made fifty loops in the one curtain, and he made fifty loops in the edge of the curtain that was in the second coupling. The loops were opposite to one another. +\v 13 He made fifty clasps of gold, and coupled the curtains to one another with the clasps: so the tabernacle was a unit. +\p +\v 14 He made curtains of goats’ hair for a covering over the tabernacle. He made them eleven curtains. +\v 15 The length of each curtain was thirty cubits, and four cubits the width of each curtain. The eleven curtains had one measure. +\v 16 He coupled five curtains by themselves, and six curtains by themselves. +\v 17 He made fifty loops on the edge of the curtain that was outermost in the coupling, and he made fifty loops on the edge of the curtain which was outermost in the second coupling. +\v 18 He made fifty clasps of bronze to couple the tent together, that it might be a unit. +\v 19 He made a covering for the tent of rams’ skins dyed red, and a covering of sea cow hides above. +\p +\v 20 He made the boards for the tabernacle of acacia wood, standing up. +\v 21 Ten cubits was the length of a board, and a cubit and a half the width of each board. +\v 22 Each board had two tenons, joined to one another. He made all the boards of the tabernacle this way. +\v 23 He made the boards for the tabernacle, twenty boards for the south side southward. +\v 24 He made forty sockets of silver under the twenty boards: two sockets under one board for its two tenons, and two sockets under another board for its two tenons. +\v 25 For the second side of the tabernacle, on the north side, he made twenty boards +\v 26 and their forty sockets of silver: two sockets under one board, and two sockets under another board. +\v 27 For the far part of the tabernacle westward he made six boards. +\v 28 He made two boards for the corners of the tabernacle in the far part. +\v 29 They were double beneath, and in the same way they were all the way to its top to one ring. He did this to both of them in the two corners. +\v 30 There were eight boards and their sockets of silver, sixteen sockets—under every board two sockets. +\p +\v 31 He made bars of acacia wood: five for the boards of the one side of the tabernacle, +\v 32 and five bars for the boards of the other side of the tabernacle, and five bars for the boards of the tabernacle for the hinder part westward. +\v 33 He made the middle bar to pass through in the middle of the boards from the one end to the other. +\v 34 He overlaid the boards with gold, and made their rings of gold as places for the bars, and overlaid the bars with gold. +\p +\v 35 He made the veil of blue, purple, scarlet, and fine twined linen, with cherubim. He made it the work of a skillful workman. +\v 36 He made four pillars of acacia for it, and overlaid them with gold. Their hooks were of gold. He cast four sockets of silver for them. +\v 37 He made a screen for the door of the tent, of blue, purple, scarlet, and fine twined linen, the work of an embroiderer; +\v 38 and the five pillars of it with their hooks. He overlaid their capitals and their fillets with gold, and their five sockets were of bronze. +\c 37 +\p +\v 1 Bezalel made the ark of acacia wood. Its length was two and a half cubits,\f + \fr 37:1 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width a cubit and a half, and a cubit and a half its height. +\v 2 He overlaid it with pure gold inside and outside, and made a molding of gold for it around it. +\v 3 He cast four rings of gold for it in its four feet—two rings on its one side, and two rings on its other side. +\v 4 He made poles of acacia wood and overlaid them with gold. +\v 5 He put the poles into the rings on the sides of the ark, to bear the ark. +\v 6 He made a mercy seat of pure gold. Its length was two and a half cubits, and a cubit and a half its width. +\v 7 He made two cherubim of gold. He made them of beaten work, at the two ends of the mercy seat: +\v 8 one cherub at the one end, and one cherub at the other end. He made the cherubim of one piece with the mercy seat at its two ends. +\v 9 The cherubim spread out their wings above, covering the mercy seat with their wings, with their faces toward one another. The faces of the cherubim were toward the mercy seat. +\p +\v 10 He made the table of acacia wood. Its length was two cubits, and its width was a cubit, and its height was a cubit and a half. +\v 11 He overlaid it with pure gold, and made a gold molding around it. +\v 12 He made a border of a hand’s width around it, and made a golden molding on its border around it. +\v 13 He cast four rings of gold for it, and put the rings in the four corners that were on its four feet. +\v 14 The rings were close by the border, the places for the poles to carry the table. +\v 15 He made the poles of acacia wood, and overlaid them with gold, to carry the table. +\v 16 He made the vessels which were on the table, its dishes, its spoons, its bowls, and its pitchers with which to pour out, of pure gold. +\p +\v 17 He made the lamp stand of pure gold. He made the lamp stand of beaten work. Its base, its shaft, its cups, its buds, and its flowers were of one piece with it. +\v 18 There were six branches going out of its sides: three branches of the lamp stand out of its one side, and three branches of the lamp stand out of its other side: +\v 19 three cups made like almond blossoms in one branch, a bud and a flower, and three cups made like almond blossoms in the other branch, a bud and a flower; so for the six branches going out of the lamp stand. +\v 20 In the lamp stand were four cups made like almond blossoms, its buds and its flowers; +\v 21 and a bud under two branches of one piece with it, and a bud under two branches of one piece with it, and a bud under two branches of one piece with it, for the six branches going out of it. +\v 22 Their buds and their branches were of one piece with it. The whole thing was one beaten work of pure gold. +\v 23 He made its seven lamps, and its snuffers, and its snuff dishes, of pure gold. +\v 24 He made it of a talent\f + \fr 37:24 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of pure gold, with all its vessels. +\p +\v 25 He made the altar of incense of acacia wood. It was square: its length was a cubit, and its width a cubit. Its height was two cubits. Its horns were of one piece with it. +\v 26 He overlaid it with pure gold: its top, its sides around it, and its horns. He made a gold molding around it. +\v 27 He made two golden rings for it under its molding crown, on its two ribs, on its two sides, for places for poles with which to carry it. +\v 28 He made the poles of acacia wood, and overlaid them with gold. +\v 29 He made the holy anointing oil and the pure incense of sweet spices, after the art of the perfumer. +\c 38 +\p +\v 1 He made the altar of burnt offering of acacia wood. It was square. Its length was five cubits,\f + \fr 38:1 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* its width was five cubits, and its height was three cubits. +\v 2 He made its horns on its four corners. Its horns were of one piece with it, and he overlaid it with bronze. +\v 3 He made all the vessels of the altar: the pots, the shovels, the basins, the forks, and the fire pans. He made all its vessels of bronze. +\v 4 He made for the altar a grating of a network of bronze, under the ledge around it beneath, reaching halfway up. +\v 5 He cast four rings for the four corners of bronze grating, to be places for the poles. +\v 6 He made the poles of acacia wood, and overlaid them with bronze. +\v 7 He put the poles into the rings on the sides of the altar, with which to carry it. He made it hollow with planks. +\p +\v 8 He made the basin of bronze, and its base of bronze, out of the mirrors of the ministering women who ministered at the door of the Tent of Meeting. +\p +\v 9 He made the court: for the south side southward the hangings of the court were of fine twined linen, one hundred cubits; +\v 10 their pillars were twenty, and their sockets twenty, of bronze; the hooks of the pillars and their fillets were of silver. +\v 11 For the north side one hundred cubits, their pillars twenty, and their sockets twenty, of bronze; the hooks of the pillars, and their fillets, of silver. +\v 12 For the west side were hangings of fifty cubits, their pillars ten, and their sockets ten; the hooks of the pillars, and their fillets, of silver. +\v 13 For the east side eastward fifty cubits, +\v 14 the hangings for the one side were fifteen cubits; their pillars three, and their sockets three; +\v 15 and so for the other side: on this hand and that hand by the gate of the court were hangings of fifteen cubits; their pillars three, and their sockets three. +\v 16 All the hangings around the court were of fine twined linen. +\v 17 The sockets for the pillars were of bronze. The hooks of the pillars and their fillets were of silver. Their capitals were overlaid with silver. All the pillars of the court had silver bands. +\v 18 The screen for the gate of the court was the work of the embroiderer, of blue, purple, scarlet, and fine twined linen. Twenty cubits was the length, and the height along the width was five cubits, like the hangings of the court. +\v 19 Their pillars were four, and their sockets four, of bronze; their hooks of silver, and the overlaying of their capitals, and their fillets, of silver. +\v 20 All the pins of the tabernacle, and around the court, were of bronze. +\p +\v 21 These are the amounts of materials used for the tabernacle, even the Tabernacle of the Testimony, as they were counted, according to the commandment of Moses, for the service of the Levites, by the hand of Ithamar, the son of Aaron the priest. +\v 22 Bezalel the son of Uri, the son of Hur, of the tribe of Judah, made all that Yahweh commanded Moses. +\v 23 With him was Oholiab, the son of Ahisamach, of the tribe of Dan, an engraver, and a skillful workman, and an embroiderer in blue, in purple, in scarlet, and in fine linen. +\p +\v 24 All the gold that was used for the work in all the work of the sanctuary, even the gold of the offering, was twenty-nine talents\f + \fr 38:24 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces.\f* and seven hundred thirty shekels, according to the shekel\f + \fr 38:24 \ft A shekel is about 10 grams or about 0.32 Troy ounces.\f* of the sanctuary. +\v 25 The silver of those who were counted of the congregation was one hundred talents\f + \fr 38:25 \ft A talent is about 30 kilograms or 66 pounds\f* and one thousand seven hundred seventy-five shekels,\f + \fr 38:25 \ft A shekel is about 10 grams or about 0.35 ounces.\f* according to the shekel of the sanctuary: +\v 26 a beka\f + \fr 38:26 \ft a beka is about 5 grams or about 0.175 ounces\f* a head, that is, half a shekel, according to the shekel\f + \fr 38:26 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary, for everyone who passed over to those who were counted, from twenty years old and upward, for six hundred three thousand five hundred fifty men. +\v 27 The one hundred talents\f + \fr 38:27 \ft A talent is about 30 kilograms or 66 pounds.\f* of silver were for casting the sockets of the sanctuary and the sockets of the veil: one hundred sockets for the one hundred talents, one talent per socket. +\v 28 From the one thousand seven hundred seventy-five shekels\f + \fr 38:28 \ft A shekel is about 10 grams or about 0.35 ounces, so 1775 shekels is about 17.75 kilograms or about 39 pounds.\f* he made hooks for the pillars, overlaid their capitals, and made fillets for them. +\v 29 The bronze of the offering was seventy talents\f + \fr 38:29 \ft A talent is about 30 kilograms or 66 pounds\f* and two thousand four hundred shekels.\f + \fr 38:29 \ft 70 talents + 2400 shekels is about 2124 kilograms, or 2.124 metric tons.\f* +\v 30 With this he made the sockets to the door of the Tent of Meeting, the bronze altar, the bronze grating for it, all the vessels of the altar, +\v 31 the sockets around the court, the sockets of the gate of the court, all the pins of the tabernacle, and all the pins around the court. +\c 39 +\p +\v 1 Of the blue, purple, and scarlet, they made finely worked garments for ministering in the holy place, and made the holy garments for Aaron, as Yahweh commanded Moses. +\p +\v 2 He made the ephod of gold, blue, purple, scarlet, and fine twined linen. +\v 3 They beat the gold into thin plates, and cut it into wires, to work it in with the blue, the purple, the scarlet, and the fine linen, the work of the skillful workman. +\v 4 They made shoulder straps for it, joined together. It was joined together at the two ends. +\v 5 The skillfully woven band that was on it, with which to fasten it on, was of the same piece, like its work: of gold, of blue, purple, scarlet, and fine twined linen, as Yahweh commanded Moses. +\p +\v 6 They worked the onyx stones, enclosed in settings of gold, engraved with the engravings of a signet, according to the names of the children of Israel. +\v 7 He put them on the shoulder straps of the ephod, to be stones of memorial for the children of Israel, as Yahweh commanded Moses. +\p +\v 8 He made the breastplate, the work of a skillful workman, like the work of the ephod: of gold, of blue, purple, scarlet, and fine twined linen. +\v 9 It was square. They made the breastplate double. Its length was a span,\f + \fr 39:9 \ft A span is the length from the tip of a man’s thumb to the tip of his little finger when his hand is stretched out (about half a cubit, or 9 inches, or 22.8 cm.)\f* and its width a span, being double. +\v 10 They set in it four rows of stones. A row of ruby, topaz, and beryl was the first row; +\v 11 and the second row, a turquoise, a sapphire,\f + \fr 39:11 \ft or, lapis lazuli \f* and an emerald; +\v 12 and the third row, a jacinth, an agate, and an amethyst; +\v 13 and the fourth row, a chrysolite, an onyx, and a jasper. They were enclosed in gold settings. +\v 14 The stones were according to the names of the children of Israel, twelve, according to their names; like the engravings of a signet, everyone according to his name, for the twelve tribes. +\v 15 They made on the breastplate chains like cords, of braided work of pure gold. +\v 16 They made two settings of gold, and two gold rings, and put the two rings on the two ends of the breastplate. +\v 17 They put the two braided chains of gold in the two rings at the ends of the breastplate. +\v 18 The other two ends of the two braided chains they put on the two settings, and put them on the shoulder straps of the ephod, in its front. +\v 19 They made two rings of gold, and put them on the two ends of the breastplate, on its edge, which was toward the side of the ephod inward. +\v 20 They made two more rings of gold, and put them on the two shoulder straps of the ephod underneath, in its front, close by its coupling, above the skillfully woven band of the ephod. +\v 21 They bound the breastplate by its rings to the rings of the ephod with a lace of blue, that it might be on the skillfully woven band of the ephod, and that the breastplate might not come loose from the ephod, as Yahweh commanded Moses. +\p +\v 22 He made the robe of the ephod of woven work, all of blue. +\v 23 The opening of the robe in the middle of it was like the opening of a coat of mail, with a binding around its opening, that it should not be torn. +\v 24 They made on the skirts of the robe pomegranates of blue, purple, scarlet, and twined linen. +\v 25 They made bells of pure gold, and put the bells between the pomegranates around the skirts of the robe, between the pomegranates; +\v 26 a bell and a pomegranate, a bell and a pomegranate, around the skirts of the robe, to minister in, as Yahweh commanded Moses. +\p +\v 27 They made the tunics of fine linen of woven work for Aaron and for his sons, +\v 28 the turban of fine linen, the linen headbands of fine linen, the linen trousers of fine twined linen, +\v 29 the sash of fine twined linen, blue, purple, and scarlet, the work of the embroiderer, as Yahweh commanded Moses. +\p +\v 30 They made the plate of the holy crown of pure gold, and wrote on it an inscription, like the engravings of a signet: “HOLY TO YAHWEH”. +\v 31 They tied to it a lace of blue, to fasten it on the turban above, as Yahweh commanded Moses. +\p +\v 32 Thus all the work of the tabernacle of the Tent of Meeting was finished. The children of Israel did according to all that Yahweh commanded Moses; so they did. +\v 33 They brought the tabernacle to Moses: the tent, with all its furniture, its clasps, its boards, its bars, its pillars, its sockets, +\v 34 the covering of rams’ skins dyed red, the covering of sea cow hides, the veil of the screen, +\v 35 the ark of the covenant with its poles, the mercy seat, +\v 36 the table, all its vessels, the show bread, +\v 37 the pure lamp stand, its lamps, even the lamps to be set in order, all its vessels, the oil for the light, +\v 38 the golden altar, the anointing oil, the sweet incense, the screen for the door of the Tent, +\v 39 the bronze altar, its grating of bronze, its poles, all of its vessels, the basin and its base, +\v 40 the hangings of the court, its pillars, its sockets, the screen for the gate of the court, its cords, its pins, and all the instruments of the service of the tabernacle, for the Tent of Meeting, +\v 41 the finely worked garments for ministering in the holy place, the holy garments for Aaron the priest, and the garments of his sons, to minister in the priest’s office. +\v 42 According to all that Yahweh commanded Moses, so the children of Israel did all the work. +\v 43 Moses saw all the work, and behold, they had done it as Yahweh had commanded. They had done so; and Moses blessed them. +\c 40 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “On the first day of the first month you shall raise up the tabernacle of the Tent of Meeting. +\v 3 You shall put the ark of the covenant in it, and you shall screen the ark with the veil. +\v 4 You shall bring in the table, and set in order the things that are on it. You shall bring in the lamp stand, and light its lamps. +\v 5 You shall set the golden altar for incense before the ark of the covenant, and put the screen of the door to the tabernacle. +\p +\v 6 “You shall set the altar of burnt offering before the door of the tabernacle of the Tent of Meeting. +\v 7 You shall set the basin between the Tent of Meeting and the altar, and shall put water therein. +\v 8 You shall set up the court around it, and hang up the screen of the gate of the court. +\p +\v 9 “You shall take the anointing oil, and anoint the tabernacle and all that is in it, and shall make it holy, and all its furniture, and it will be holy. +\v 10 You shall anoint the altar of burnt offering, with all its vessels, and sanctify the altar, and the altar will be most holy. +\v 11 You shall anoint the basin and its base, and sanctify it. +\p +\v 12 “You shall bring Aaron and his sons to the door of the Tent of Meeting, and shall wash them with water. +\v 13 You shall put on Aaron the holy garments; and you shall anoint him, and sanctify him, that he may minister to me in the priest’s office. +\v 14 You shall bring his sons, and put tunics on them. +\v 15 You shall anoint them, as you anointed their father, that they may minister to me in the priest’s office. Their anointing shall be to them for an everlasting priesthood throughout their generations.” +\v 16 Moses did so. According to all that Yahweh commanded him, so he did. +\p +\v 17 In the first month in the second year, on the first day of the month, the tabernacle was raised up. +\v 18 Moses raised up the tabernacle, and laid its sockets, and set up its boards, and put in its bars, and raised up its pillars. +\v 19 He spread the covering over the tent, and put the roof of the tabernacle above on it, as Yahweh commanded Moses. +\v 20 He took and put the covenant into the ark, and set the poles on the ark, and put the mercy seat above on the ark. +\v 21 He brought the ark into the tabernacle, and set up the veil of the screen, and screened the ark of the covenant, as Yahweh commanded Moses. +\v 22 He put the table in the Tent of Meeting, on the north side of the tabernacle, outside of the veil. +\v 23 He set the bread in order on it before Yahweh, as Yahweh commanded Moses. +\v 24 He put the lamp stand in the Tent of Meeting, opposite the table, on the south side of the tabernacle. +\v 25 He lit the lamps before Yahweh, as Yahweh commanded Moses. +\v 26 He put the golden altar in the Tent of Meeting before the veil; +\v 27 and he burned incense of sweet spices on it, as Yahweh commanded Moses. +\v 28 He put up the screen of the door to the tabernacle. +\v 29 He set the altar of burnt offering at the door of the tabernacle of the Tent of Meeting, and offered on it the burnt offering and the meal offering, as Yahweh commanded Moses. +\v 30 He set the basin between the Tent of Meeting and the altar, and put water therein, with which to wash. +\v 31 Moses, Aaron, and his sons washed their hands and their feet there. +\v 32 When they went into the Tent of Meeting, and when they came near to the altar, they washed, as Yahweh commanded Moses. +\v 33 He raised up the court around the tabernacle and the altar, and set up the screen of the gate of the court. So Moses finished the work. +\p +\v 34 Then the cloud covered the Tent of Meeting, and Yahweh’s glory filled the tabernacle. +\v 35 Moses wasn’t able to enter into the Tent of Meeting, because the cloud stayed on it, and Yahweh’s glory filled the tabernacle. +\v 36 When the cloud was taken up from over the tabernacle, the children of Israel went onward, throughout all their journeys; +\v 37 but if the cloud wasn’t taken up, then they didn’t travel until the day that it was taken up. +\v 38 For the cloud of Yahweh was on the tabernacle by day, and there was fire in the cloud by night, in the sight of all the house of Israel, throughout all their journeys. diff --git a/c-sharp/assets/WEB/03LEVengWEBUS.SFM b/c-sharp/assets/WEB/03LEVengWEBUS.SFM new file mode 100644 index 0000000000..b031bf4711 --- /dev/null +++ b/c-sharp/assets/WEB/03LEVengWEBUS.SFM @@ -0,0 +1,1169 @@ +\id LEV World English Bible (WEB) +\ide UTF-8 +\h Leviticus +\toc1 The Third Book of Mosis, Commonly Called Leviticus +\toc2 Leviticus +\toc3 Leviticus +\mt2 The Third Book of Moses, +\mt3 Commonly Called +\mt1 Leviticus +\c 1 +\p +\v 1 Yahweh\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* called to Moses, and spoke to him from the Tent of Meeting, saying, +\v 2 “Speak to the children of Israel, and tell them, ‘When anyone of you offers an offering to Yahweh, you shall offer your offering of the livestock, from the herd and from the flock. +\p +\v 3 “‘If his offering is a burnt offering from the herd, he shall offer a male without defect. He shall offer it at the door of the Tent of Meeting, that he may be accepted before Yahweh. +\v 4 He shall lay his hand on the head of the burnt offering, and it shall be accepted for him to make atonement for him. +\v 5 He shall kill the bull before Yahweh. Aaron’s sons, the priests, shall present the blood and sprinkle the blood around on the altar that is at the door of the Tent of Meeting. +\v 6 He shall skin the burnt offering and cut it into pieces. +\v 7 The sons of Aaron the priest shall put fire on the altar, and lay wood in order on the fire; +\v 8 and Aaron’s sons, the priests, shall lay the pieces, the head, and the fat in order on the wood that is on the fire which is on the altar; +\v 9 but he shall wash its innards and its legs with water. The priest shall burn all of it on the altar, for a burnt offering, an offering made by fire, of a pleasant aroma to Yahweh. +\p +\v 10 “‘If his offering is from the flock, from the sheep or from the goats, for a burnt offering, he shall offer a male without defect. +\v 11 He shall kill it on the north side of the altar before Yahweh. Aaron’s sons, the priests, shall sprinkle its blood around on the altar. +\v 12 He shall cut it into its pieces, with its head and its fat. The priest shall lay them in order on the wood that is on the fire which is on the altar, +\v 13 but the innards and the legs he shall wash with water. The priest shall offer the whole, and burn it on the altar. It is a burnt offering, an offering made by fire, of a pleasant aroma to Yahweh. +\p +\v 14 “‘If his offering to Yahweh is a burnt offering of birds, then he shall offer his offering from turtledoves or of young pigeons. +\v 15 The priest shall bring it to the altar, and wring off its head, and burn it on the altar; and its blood shall be drained out on the side of the altar; +\v 16 and he shall take away its crop and its feathers, and cast it beside the altar on the east part, in the place of the ashes. +\v 17 He shall tear it by its wings, but shall not divide it apart. The priest shall burn it on the altar, on the wood that is on the fire. It is a burnt offering, an offering made by fire, of a pleasant aroma to Yahweh. +\c 2 +\p +\v 1 “‘When anyone offers an offering of a meal offering to Yahweh, his offering shall be of fine flour. He shall pour oil on it, and put frankincense on it. +\v 2 He shall bring it to Aaron’s sons, the priests. He shall take his handful of its fine flour, and of its oil, with all its frankincense, and the priest shall burn its memorial on the altar, an offering made by fire, of a pleasant aroma to Yahweh. +\v 3 That which is left of the meal offering shall be Aaron’s and his sons’. It is a most holy part of the offerings of Yahweh made by fire. +\p +\v 4 “‘When you offer an offering of a meal offering baked in the oven, it shall be unleavened cakes of fine flour mixed with oil, or unleavened wafers anointed with oil. +\v 5 If your offering is a meal offering made on a griddle, it shall be of unleavened fine flour, mixed with oil. +\v 6 You shall cut it in pieces, and pour oil on it. It is a meal offering. +\v 7 If your offering is a meal offering of the pan, it shall be made of fine flour with oil. +\v 8 You shall bring the meal offering that is made of these things to Yahweh. It shall be presented to the priest, and he shall bring it to the altar. +\v 9 The priest shall take from the meal offering its memorial, and shall burn it on the altar, an offering made by fire, of a pleasant aroma to Yahweh. +\v 10 That which is left of the meal offering shall be Aaron’s and his sons’. It is a most holy part of the offerings of Yahweh made by fire. +\p +\v 11 “‘No meal offering which you shall offer to Yahweh shall be made with yeast; for you shall burn no yeast, nor any honey, as an offering made by fire to Yahweh. +\v 12 As an offering of first fruits you shall offer them to Yahweh, but they shall not rise up as a pleasant aroma on the altar. +\v 13 Every offering of your meal offering you shall season with salt. You shall not allow the salt of the covenant of your God\f + \fr 2:13 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* to be lacking from your meal offering. With all your offerings you shall offer salt. +\p +\v 14 “‘If you offer a meal offering of first fruits to Yahweh, you shall offer for the meal offering of your first fruits fresh heads of grain parched with fire and crushed. +\v 15 You shall put oil on it and lay frankincense on it. It is a meal offering. +\v 16 The priest shall burn as its memorial part of its crushed grain and part of its oil, along with all its frankincense. It is an offering made by fire to Yahweh. +\c 3 +\p +\v 1 “‘If his offering is a sacrifice of peace offerings, if he offers it from the herd, whether male or female, he shall offer it without defect before Yahweh. +\v 2 He shall lay his hand on the head of his offering, and kill it at the door of the Tent of Meeting. Aaron’s sons, the priests, shall sprinkle the blood around on the altar. +\v 3 He shall offer of the sacrifice of peace offerings an offering made by fire to Yahweh. The fat that covers the innards, and all the fat that is on the innards, +\v 4 and the two kidneys, and the fat that is on them, which is by the loins, and the cover on the liver, with the kidneys, he shall take away. +\v 5 Aaron’s sons shall burn it on the altar on the burnt offering, which is on the wood that is on the fire: it is an offering made by fire, of a pleasant aroma to Yahweh. +\p +\v 6 “‘If his offering for a sacrifice of peace offerings to Yahweh is from the flock, either male or female, he shall offer it without defect. +\v 7 If he offers a lamb for his offering, then he shall offer it before Yahweh; +\v 8 and he shall lay his hand on the head of his offering, and kill it before the Tent of Meeting. Aaron’s sons shall sprinkle its blood around on the altar. +\v 9 He shall offer from the sacrifice of peace offerings an offering made by fire to Yahweh; its fat, the entire tail fat, he shall take away close to the backbone; and the fat that covers the entrails, and all the fat that is on the entrails, +\v 10 and the two kidneys, and the fat that is on them, which is by the loins, and the cover on the liver, with the kidneys, he shall take away. +\v 11 The priest shall burn it on the altar: it is the food of the offering made by fire to Yahweh. +\p +\v 12 “‘If his offering is a goat, then he shall offer it before Yahweh. +\v 13 He shall lay his hand on its head, and kill it before the Tent of Meeting; and the sons of Aaron shall sprinkle its blood around on the altar. +\v 14 He shall offer from it as his offering, an offering made by fire to Yahweh; the fat that covers the innards, and all the fat that is on the innards, +\v 15 and the two kidneys, and the fat that is on them, which is by the loins, and the cover on the liver, with the kidneys, he shall take away. +\v 16 The priest shall burn them on the altar: it is the food of the offering made by fire, for a pleasant aroma; all the fat is Yahweh’s. +\p +\v 17 “‘It shall be a perpetual statute throughout your generations in all your dwellings, that you shall eat neither fat nor blood.’” +\c 4 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, saying, ‘If anyone sins unintentionally, in any of the things which Yahweh has commanded not to be done, and does any one of them, +\v 3 if the anointed priest sins so as to bring guilt on the people, then let him offer for his sin which he has sinned a young bull without defect to Yahweh for a sin offering. +\v 4 He shall bring the bull to the door of the Tent of Meeting before Yahweh; and he shall lay his hand on the head of the bull, and kill the bull before Yahweh. +\v 5 The anointed priest shall take some of the blood of the bull, and bring it to the Tent of Meeting. +\v 6 The priest shall dip his finger in the blood, and sprinkle some of the blood seven times before Yahweh, before the veil of the sanctuary. +\v 7 The priest shall put some of the blood on the horns of the altar of sweet incense before Yahweh, which is in the Tent of Meeting; and he shall pour out the rest of the blood of the bull at the base of the altar of burnt offering, which is at the door of the Tent of Meeting. +\v 8 He shall take all the fat of the bull of the sin offering from it: the fat that covers the innards, and all the fat that is on the innards, +\v 9 and the two kidneys, and the fat that is on them, which is by the loins, and the cover on the liver, with the kidneys, he shall remove, +\v 10 as it is removed from the bull of the sacrifice of peace offerings. The priest shall burn them on the altar of burnt offering. +\v 11 He shall carry the bull’s skin, all its meat, with its head, and with its legs, its innards, and its dung +\v 12 —all the rest of the bull—outside of the camp to a clean place where the ashes are poured out, and burn it on wood with fire. It shall be burned where the ashes are poured out. +\p +\v 13 “‘If the whole congregation of Israel sins, and the thing is hidden from the eyes of the assembly, and they have done any of the things which Yahweh has commanded not to be done, and are guilty; +\v 14 when the sin in which they have sinned is known, then the assembly shall offer a young bull for a sin offering, and bring it before the Tent of Meeting. +\v 15 The elders of the congregation shall lay their hands on the head of the bull before Yahweh; and the bull shall be killed before Yahweh. +\v 16 The anointed priest shall bring some of the blood of the bull to the Tent of Meeting. +\v 17 The priest shall dip his finger in the blood and sprinkle it seven times before Yahweh, before the veil. +\v 18 He shall put some of the blood on the horns of the altar which is before Yahweh, that is in the Tent of Meeting; and the rest of the blood he shall pour out at the base of the altar of burnt offering, which is at the door of the Tent of Meeting. +\v 19 All its fat he shall take from it, and burn it on the altar. +\v 20 He shall do this with the bull; as he did with the bull of the sin offering, so he shall do with this; and the priest shall make atonement for them, and they shall be forgiven. +\v 21 He shall carry the bull outside the camp, and burn it as he burned the first bull. It is the sin offering for the assembly. +\p +\v 22 “‘When a ruler sins, and unwittingly does any one of all the things which Yahweh his God has commanded not to be done, and is guilty, +\v 23 if his sin in which he has sinned is made known to him, he shall bring as his offering a goat, a male without defect. +\v 24 He shall lay his hand on the head of the goat, and kill it in the place where they kill the burnt offering before Yahweh. It is a sin offering. +\v 25 The priest shall take some of the blood of the sin offering with his finger, and put it on the horns of the altar of burnt offering. He shall pour out the rest of its blood at the base of the altar of burnt offering. +\v 26 All its fat he shall burn on the altar, like the fat of the sacrifice of peace offerings; and the priest shall make atonement for him concerning his sin, and he will be forgiven. +\p +\v 27 “‘If anyone of the common people sins unwittingly, in doing any of the things which Yahweh has commanded not to be done, and is guilty, +\v 28 if his sin which he has sinned is made known to him, then he shall bring for his offering a goat, a female without defect, for his sin which he has sinned. +\v 29 He shall lay his hand on the head of the sin offering, and kill the sin offering in the place of burnt offering. +\v 30 The priest shall take some of its blood with his finger, and put it on the horns of the altar of burnt offering; and the rest of its blood he shall pour out at the base of the altar. +\v 31 All its fat he shall take away, like the fat is taken away from the sacrifice of peace offerings; and the priest shall burn it on the altar for a pleasant aroma to Yahweh; and the priest shall make atonement for him, and he will be forgiven. +\p +\v 32 “‘If he brings a lamb as his offering for a sin offering, he shall bring a female without defect. +\v 33 He shall lay his hand on the head of the sin offering, and kill it for a sin offering in the place where they kill the burnt offering. +\v 34 The priest shall take some of the blood of the sin offering with his finger, and put it on the horns of the altar of burnt offering; and all the rest of its blood he shall pour out at the base of the altar. +\v 35 He shall remove all its fat, like the fat of the lamb is removed from the sacrifice of peace offerings. The priest shall burn them on the altar, on the offerings of Yahweh made by fire. The priest shall make atonement for him concerning his sin that he has sinned, and he will be forgiven. +\c 5 +\p +\v 1 “‘If anyone sins, in that he hears a public adjuration to testify, he being a witness, whether he has seen or known, if he doesn’t report it, then he shall bear his iniquity. +\p +\v 2 “‘Or if anyone touches any unclean thing, whether it is the carcass of an unclean animal, or the carcass of unclean livestock, or the carcass of unclean creeping things, and it is hidden from him, and he is unclean, then he shall be guilty. +\p +\v 3 “‘Or if he touches the uncleanness of man, whatever his uncleanness is with which he is unclean, and it is hidden from him; when he knows of it, then he shall be guilty. +\p +\v 4 “‘Or if anyone swears rashly with his lips to do evil or to do good—whatever it is that a man might utter rashly with an oath, and it is hidden from him—when he knows of it, then he will be guilty of one of these. +\v 5 It shall be, when he is guilty of one of these, he shall confess that in which he has sinned; +\v 6 and he shall bring his trespass offering to Yahweh for his sin which he has sinned: a female from the flock, a lamb or a goat, for a sin offering; and the priest shall make atonement for him concerning his sin. +\p +\v 7 “‘If he can’t afford a lamb, then he shall bring his trespass offering for that in which he has sinned, two turtledoves, or two young pigeons, to Yahweh; one for a sin offering, and the other for a burnt offering. +\v 8 He shall bring them to the priest, who shall first offer the one which is for the sin offering. He shall wring off its head from its neck, but shall not sever it completely. +\v 9 He shall sprinkle some of the blood of the sin offering on the side of the altar; and the rest of the blood shall be drained out at the base of the altar. It is a sin offering. +\v 10 He shall offer the second for a burnt offering, according to the ordinance; and the priest shall make atonement for him concerning his sin which he has sinned, and he shall be forgiven. +\p +\v 11 “‘But if he can’t afford two turtledoves or two young pigeons, then he shall bring as his offering for that in which he has sinned, one tenth of an ephah\f + \fr 5:11 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a sin offering. He shall put no oil on it, and he shall not put any frankincense on it, for it is a sin offering. +\v 12 He shall bring it to the priest, and the priest shall take his handful of it as the memorial portion, and burn it on the altar, on the offerings of Yahweh made by fire. It is a sin offering. +\v 13 The priest shall make atonement for him concerning his sin that he has sinned in any of these things, and he will be forgiven; and the rest shall be the priest’s, as the meal offering.’” +\p +\v 14 Yahweh spoke to Moses, saying, +\v 15 “If anyone commits a trespass, and sins unwittingly regarding Yahweh’s holy things, then he shall bring his trespass offering to Yahweh: a ram without defect from the flock, according to your estimation in silver by shekels, according to the shekel\f + \fr 5:15 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary, for a trespass offering. +\v 16 He shall make restitution for that which he has done wrong regarding the holy thing, and shall add a fifth part to it, and give it to the priest; and the priest shall make atonement for him with the ram of the trespass offering, and he will be forgiven. +\p +\v 17 “If anyone sins, doing any of the things which Yahweh has commanded not to be done, though he didn’t know it, he is still guilty, and shall bear his iniquity. +\v 18 He shall bring a ram without defect from of the flock, according to your estimation, for a trespass offering, to the priest; and the priest shall make atonement for him concerning the thing in which he sinned and didn’t know it, and he will be forgiven. +\v 19 It is a trespass offering. He is certainly guilty before Yahweh.” +\c 6 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “If anyone sins, and commits a trespass against Yahweh, and deals falsely with his neighbor in a matter of deposit, or of bargain, or of robbery, or has oppressed his neighbor, +\v 3 or has found that which was lost, and lied about it, and swearing to a lie—in any of these things that a man sins in his actions— +\v 4 then it shall be, if he has sinned, and is guilty, he shall restore that which he took by robbery, or the thing which he has gotten by oppression, or the deposit which was committed to him, or the lost thing which he found, +\v 5 or any thing about which he has sworn falsely: he shall restore it in full, and shall add a fifth part more to it. He shall return it to him to whom it belongs in the day of his being found guilty. +\v 6 He shall bring his trespass offering to Yahweh: a ram without defect from the flock, according to your estimation, for a trespass offering, to the priest. +\v 7 The priest shall make atonement for him before Yahweh, and he will be forgiven concerning whatever he does to become guilty.” +\p +\v 8 Yahweh spoke to Moses, saying, +\v 9 “Command Aaron and his sons, saying, ‘This is the law of the burnt offering: the burnt offering shall be on the hearth on the altar all night until the morning; and the fire of the altar shall be kept burning on it. +\v 10 The priest shall put on his linen garment, and he shall put on his linen trousers upon his body; and he shall remove the ashes from where the fire has consumed the burnt offering on the altar, and he shall put them beside the altar. +\v 11 He shall take off his garments, and put on other garments, and carry the ashes outside the camp to a clean place. +\v 12 The fire on the altar shall be kept burning on it, it shall not go out; and the priest shall burn wood on it every morning. He shall lay the burnt offering in order upon it, and shall burn on it the fat of the peace offerings. +\v 13 Fire shall be kept burning on the altar continually; it shall not go out. +\p +\v 14 “‘This is the law of the meal offering: the sons of Aaron shall offer it before Yahweh, before the altar. +\v 15 He shall take from there his handful of the fine flour of the meal offering, and of its oil, and all the frankincense which is on the meal offering, and shall burn it on the altar for a pleasant aroma, as its memorial portion, to Yahweh. +\v 16 That which is left of it Aaron and his sons shall eat. It shall be eaten without yeast in a holy place. They shall eat it in the court of the Tent of Meeting. +\v 17 It shall not be baked with yeast. I have given it as their portion of my offerings made by fire. It is most holy, as are the sin offering and the trespass offering. +\v 18 Every male among the children of Aaron shall eat of it, as their portion forever throughout your generations, from the offerings of Yahweh made by fire. Whoever touches them shall be holy.’” +\p +\v 19 Yahweh spoke to Moses, saying, +\v 20 “This is the offering of Aaron and of his sons, which they shall offer to Yahweh in the day when he is anointed: one tenth of an ephah\f + \fr 6:20 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a meal offering perpetually, half of it in the morning, and half of it in the evening. +\v 21 It shall be made with oil in a griddle. When it is soaked, you shall bring it in. You shall offer the meal offering in baked pieces for a pleasant aroma to Yahweh. +\v 22 The anointed priest that will be in his place from among his sons shall offer it. By a statute forever, it shall be wholly burned to Yahweh. +\v 23 Every meal offering of a priest shall be wholly burned. It shall not be eaten.” +\p +\v 24 Yahweh spoke to Moses, saying, +\v 25 “Speak to Aaron and to his sons, saying, ‘This is the law of the sin offering: in the place where the burnt offering is killed, the sin offering shall be killed before Yahweh. It is most holy. +\v 26 The priest who offers it for sin shall eat it. It shall be eaten in a holy place, in the court of the Tent of Meeting. +\v 27 Whatever shall touch its flesh shall be holy. When there is any of its blood sprinkled on a garment, you shall wash that on which it was sprinkled in a holy place. +\v 28 But the earthen vessel in which it is boiled shall be broken; and if it is boiled in a bronze vessel, it shall be scoured, and rinsed in water. +\v 29 Every male among the priests shall eat of it. It is most holy. +\v 30 No sin offering, of which any of the blood is brought into the Tent of Meeting to make atonement in the Holy Place, shall be eaten. It shall be burned with fire. +\c 7 +\p +\v 1 “‘This is the law of the trespass offering: It is most holy. +\v 2 In the place where they kill the burnt offering, he shall kill the trespass offering; and its blood he shall sprinkle around on the altar. +\v 3 He shall offer all of its fat: the fat tail, and the fat that covers the innards, +\v 4 and he shall take away the two kidneys, and the fat that is on them, which is by the loins, and the cover on the liver, with the kidneys; +\v 5 and the priest shall burn them on the altar for an offering made by fire to Yahweh: it is a trespass offering. +\v 6 Every male among the priests may eat of it. It shall be eaten in a holy place. It is most holy. +\p +\v 7 “‘As is the sin offering, so is the trespass offering; there is one law for them. The priest who makes atonement with them shall have it. +\v 8 The priest who offers any man’s burnt offering shall have for himself the skin of the burnt offering which he has offered. +\v 9 Every meal offering that is baked in the oven, and all that is prepared in the pan and on the griddle, shall be the priest’s who offers it. +\v 10 Every meal offering, mixed with oil or dry, belongs to all the sons of Aaron, one as well as another. +\p +\v 11 “‘This is the law of the sacrifice of peace offerings, which one shall offer to Yahweh: +\v 12 If he offers it for a thanksgiving, then he shall offer with the sacrifice of thanksgiving unleavened cakes mixed with oil, and unleavened wafers anointed with oil, and cakes mixed with oil. +\v 13 He shall offer his offering with the sacrifice of his peace offerings for thanksgiving with cakes of leavened bread. +\v 14 Of it he shall offer one out of each offering for a heave offering to Yahweh. It shall be the priest’s who sprinkles the blood of the peace offerings. +\v 15 The flesh of the sacrifice of his peace offerings for thanksgiving shall be eaten on the day of his offering. He shall not leave any of it until the morning. +\p +\v 16 “‘But if the sacrifice of his offering is a vow, or a free will offering, it shall be eaten on the day that he offers his sacrifice. On the next day what remains of it shall be eaten, +\v 17 but what remains of the meat of the sacrifice on the third day shall be burned with fire. +\v 18 If any of the meat of the sacrifice of his peace offerings is eaten on the third day, it will not be accepted, and it shall not be credited to him who offers it. It will be an abomination, and the soul who eats any of it will bear his iniquity. +\p +\v 19 “‘The meat that touches any unclean thing shall not be eaten. It shall be burned with fire. As for the meat, everyone who is clean may eat it; +\v 20 but the soul who eats of the meat of the sacrifice of peace offerings that belongs to Yahweh, having his uncleanness on him, that soul shall be cut off from his people. +\v 21 When anyone touches any unclean thing, the uncleanness of man, or an unclean animal, or any unclean abomination, and eats some of the meat of the sacrifice of peace offerings which belong to Yahweh, that soul shall be cut off from his people.’” +\p +\v 22 Yahweh spoke to Moses, saying, +\v 23 “Speak to the children of Israel, saying, ‘You shall eat no fat, of bull, or sheep, or goat. +\v 24 The fat of that which dies of itself, and the fat of that which is torn of animals, may be used for any other service, but you shall in no way eat of it. +\v 25 For whoever eats the fat of the animal which men offer as an offering made by fire to Yahweh, even the soul who eats it shall be cut off from his people. +\v 26 You shall not eat any blood, whether it is of bird or of animal, in any of your dwellings. +\v 27 Whoever it is who eats any blood, that soul shall be cut off from his people.’” +\p +\v 28 Yahweh spoke to Moses, saying, +\v 29 “Speak to the children of Israel, saying, ‘He who offers the sacrifice of his peace offerings to Yahweh shall bring his offering to Yahweh out of the sacrifice of his peace offerings. +\v 30 With his own hands he shall bring the offerings of Yahweh made by fire. He shall bring the fat with the breast, that the breast may be waved for a wave offering before Yahweh. +\v 31 The priest shall burn the fat on the altar, but the breast shall be Aaron’s and his sons’. +\v 32 The right thigh you shall give to the priest for a heave offering out of the sacrifices of your peace offerings. +\v 33 He among the sons of Aaron who offers the blood of the peace offerings, and the fat, shall have the right thigh for a portion. +\v 34 For the waved breast and the heaved thigh I have taken from the children of Israel out of the sacrifices of their peace offerings, and have given them to Aaron the priest and to his sons as their portion forever from the children of Israel.’” +\p +\v 35 This is the consecrated portion of Aaron, and the consecrated portion of his sons, out of the offerings of Yahweh made by fire, in the day when he presented them to minister to Yahweh in the priest’s office; +\v 36 which Yahweh commanded to be given them of the children of Israel, in the day that he anointed them. It is their portion forever throughout their generations. +\v 37 This is the law of the burnt offering, the meal offering, the sin offering, the trespass offering, the consecration, and the sacrifice of peace offerings +\v 38 which Yahweh commanded Moses in Mount Sinai in the day that he commanded the children of Israel to offer their offerings to Yahweh, in the wilderness of Sinai. +\c 8 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Take Aaron and his sons with him, and the garments, and the anointing oil, and the bull of the sin offering, and the two rams, and the basket of unleavened bread; +\v 3 and assemble all the congregation at the door of the Tent of Meeting.” +\p +\v 4 Moses did as Yahweh commanded him; and the congregation was assembled at the door of the Tent of Meeting. +\v 5 Moses said to the congregation, “This is the thing which Yahweh has commanded to be done.” +\v 6 Moses brought Aaron and his sons, and washed them with water. +\v 7 He put the tunic on him, tied the sash on him, clothed him with the robe, put the ephod on him, and he tied the skillfully woven band of the ephod on him and fastened it to him with it. +\v 8 He placed the breastplate on him. He put the Urim and Thummim in the breastplate. +\v 9 He set the turban on his head. He set the golden plate, the holy crown, on the front of the turban, as Yahweh commanded Moses. +\v 10 Moses took the anointing oil, and anointed the tabernacle and all that was in it, and sanctified them. +\v 11 He sprinkled it on the altar seven times, and anointed the altar and all its vessels, and the basin and its base, to sanctify them. +\v 12 He poured some of the anointing oil on Aaron’s head, and anointed him, to sanctify him. +\v 13 Moses brought Aaron’s sons, and clothed them with tunics, and tied sashes on them, and put headbands on them, as Yahweh commanded Moses. +\p +\v 14 He brought the bull of the sin offering, and Aaron and his sons laid their hands on the head of the bull of the sin offering. +\v 15 He killed it; and Moses took the blood, and put it around on the horns of the altar with his finger, and purified the altar, and poured out the blood at the base of the altar, and sanctified it, to make atonement for it. +\v 16 He took all the fat that was on the innards, and the cover of the liver, and the two kidneys, and their fat; and Moses burned it on the altar. +\v 17 But the bull, and its skin, and its meat, and its dung, he burned with fire outside the camp, as Yahweh commanded Moses. +\v 18 He presented the ram of the burnt offering. Aaron and his sons laid their hands on the head of the ram. +\v 19 He killed it; and Moses sprinkled the blood around on the altar. +\v 20 He cut the ram into its pieces; and Moses burned the head, and the pieces, and the fat. +\v 21 He washed the innards and the legs with water; and Moses burned the whole ram on the altar. It was a burnt offering for a pleasant aroma. It was an offering made by fire to Yahweh, as Yahweh commanded Moses. +\v 22 He presented the other ram, the ram of consecration. Aaron and his sons laid their hands on the head of the ram. +\v 23 He killed it; and Moses took some of its blood, and put it on the tip of Aaron’s right ear, and on the thumb of his right hand, and on the great toe of his right foot. +\v 24 He brought Aaron’s sons; and Moses put some of the blood on the tip of their right ear, and on the thumb of their right hand, and on the great toe of their right foot; and Moses sprinkled the blood around on the altar. +\v 25 He took the fat, the fat tail, all the fat that was on the innards, the cover of the liver, the two kidneys and their fat, and the right thigh; +\v 26 and out of the basket of unleavened bread that was before Yahweh, he took one unleavened cake, one cake of oiled bread, and one wafer, and placed them on the fat and on the right thigh. +\v 27 He put all these in Aaron’s hands and in his sons’ hands, and waved them for a wave offering before Yahweh. +\v 28 Moses took them from their hands, and burned them on the altar on the burnt offering. They were a consecration offering for a pleasant aroma. It was an offering made by fire to Yahweh. +\v 29 Moses took the breast, and waved it for a wave offering before Yahweh. It was Moses’ portion of the ram of consecration, as Yahweh commanded Moses. +\v 30 Moses took some of the anointing oil, and some of the blood which was on the altar, and sprinkled it on Aaron, on his garments, and on his sons, and on his sons’ garments with him, and sanctified Aaron, his garments, and his sons, and his sons’ garments with him. +\p +\v 31 Moses said to Aaron and to his sons, “Boil the meat at the door of the Tent of Meeting, and there eat it and the bread that is in the basket of consecration, as I commanded, saying, ‘Aaron and his sons shall eat it.’ +\v 32 What remains of the meat and of the bread you shall burn with fire. +\v 33 You shall not go out from the door of the Tent of Meeting for seven days, until the days of your consecration are fulfilled: for he shall consecrate you seven days. +\v 34 What has been done today, so Yahweh has commanded to do, to make atonement for you. +\v 35 You shall stay at the door of the Tent of Meeting day and night seven days, and keep Yahweh’s command, that you don’t die: for so I am commanded.” +\v 36 Aaron and his sons did all the things which Yahweh commanded by Moses. +\c 9 +\p +\v 1 On the eighth day, Moses called Aaron and his sons, and the elders of Israel; +\v 2 and he said to Aaron, “Take a calf from the herd for a sin offering, and a ram for a burnt offering, without defect, and offer them before Yahweh. +\v 3 You shall speak to the children of Israel, saying, ‘Take a male goat for a sin offering; and a calf and a lamb, both a year old, without defect, for a burnt offering; +\v 4 and a bull and a ram for peace offerings, to sacrifice before Yahweh; and a meal offering mixed with oil: for today Yahweh appears to you.’” +\p +\v 5 They brought what Moses commanded before the Tent of Meeting. All the congregation came near and stood before Yahweh. +\v 6 Moses said, “This is the thing which Yahweh commanded that you should do; and Yahweh’s glory shall appear to you.” +\v 7 Moses said to Aaron, “Draw near to the altar, and offer your sin offering, and your burnt offering, and make atonement for yourself, and for the people; and offer the offering of the people, and make atonement for them, as Yahweh commanded.” +\p +\v 8 So Aaron came near to the altar, and killed the calf of the sin offering, which was for himself. +\v 9 The sons of Aaron presented the blood to him; and he dipped his finger in the blood, and put it on the horns of the altar, and poured out the blood at the base of the altar; +\v 10 but the fat, and the kidneys, and the cover from the liver of the sin offering, he burned upon the altar, as Yahweh commanded Moses. +\v 11 The meat and the skin he burned with fire outside the camp. +\v 12 He killed the burnt offering; and Aaron’s sons delivered the blood to him, and he sprinkled it around on the altar. +\v 13 They delivered the burnt offering to him, piece by piece, and the head. He burned them upon the altar. +\v 14 He washed the innards and the legs, and burned them on the burnt offering on the altar. +\v 15 He presented the people’s offering, and took the goat of the sin offering which was for the people, and killed it, and offered it for sin, like the first. +\v 16 He presented the burnt offering, and offered it according to the ordinance. +\v 17 He presented the meal offering, and filled his hand from there, and burned it upon the altar, in addition to the burnt offering of the morning. +\v 18 He also killed the bull and the ram, the sacrifice of peace offerings, which was for the people. Aaron’s sons delivered to him the blood, which he sprinkled around on the altar; +\v 19 and the fat of the bull and of the ram, the fat tail, and that which covers the innards, and the kidneys, and the cover of the liver; +\v 20 and they put the fat upon the breasts, and he burned the fat on the altar. +\v 21 Aaron waved the breasts and the right thigh for a wave offering before Yahweh, as Moses commanded. +\v 22 Aaron lifted up his hands toward the people, and blessed them; and he came down from offering the sin offering, and the burnt offering, and the peace offerings. +\p +\v 23 Moses and Aaron went into the Tent of Meeting, and came out, and blessed the people; and Yahweh’s glory appeared to all the people. +\v 24 Fire came out from before Yahweh, and consumed the burnt offering and the fat upon the altar. When all the people saw it, they shouted, and fell on their faces. +\c 10 +\p +\v 1 Nadab and Abihu, the sons of Aaron, each took his censer, and put fire in it, and laid incense on it, and offered strange fire before Yahweh, which he had not commanded them. +\v 2 Fire came out from before Yahweh, and devoured them, and they died before Yahweh. +\p +\v 3 Then Moses said to Aaron, “This is what Yahweh spoke of, saying, +\q1 ‘I will show myself holy to those who come near me, +\q2 and before all the people I will be glorified.’” +\p Aaron held his peace. +\v 4 Moses called Mishael and Elzaphan, the sons of Uzziel the uncle of Aaron, and said to them, “Draw near, carry your brothers from before the sanctuary out of the camp.” +\v 5 So they came near, and carried them in their tunics out of the camp, as Moses had said. +\p +\v 6 Moses said to Aaron, and to Eleazar and to Ithamar, his sons, “Don’t let the hair of your heads go loose, and don’t tear your clothes, so that you don’t die, and so that he will not be angry with all the congregation; but let your brothers, the whole house of Israel, bewail the burning which Yahweh has kindled. +\v 7 You shall not go out from the door of the Tent of Meeting, lest you die; for the anointing oil of Yahweh is on you.” They did according to the word of Moses. +\v 8 Then Yahweh said to Aaron, +\v 9 “You and your sons are not to drink wine or strong drink whenever you go into the Tent of Meeting, or you will die. This shall be a statute forever throughout your generations. +\v 10 You are to make a distinction between the holy and the common, and between the unclean and the clean. +\v 11 You are to teach the children of Israel all the statutes which Yahweh has spoken to them by Moses.” +\p +\v 12 Moses spoke to Aaron, and to Eleazar and to Ithamar, his sons who were left, “Take the meal offering that remains of the offerings of Yahweh made by fire, and eat it without yeast beside the altar; for it is most holy; +\v 13 and you shall eat it in a holy place, because it is your portion, and your sons’ portion, of the offerings of Yahweh made by fire; for so I am commanded. +\v 14 The waved breast and the heaved thigh you shall eat in a clean place, you, and your sons, and your daughters with you: for they are given as your portion, and your sons’ portion, out of the sacrifices of the peace offerings of the children of Israel. +\v 15 They shall bring the heaved thigh and the waved breast with the offerings made by fire of the fat, to wave it for a wave offering before Yahweh. It shall be yours, and your sons’ with you, as a portion forever, as Yahweh has commanded.” +\p +\v 16 Moses diligently inquired about the goat of the sin offering, and, behold,\f + \fr 10:16 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* it was burned. He was angry with Eleazar and with Ithamar, the sons of Aaron who were left, saying, +\v 17 “Why haven’t you eaten the sin offering in the place of the sanctuary, since it is most holy, and he has given it to you to bear the iniquity of the congregation, to make atonement for them before Yahweh? +\v 18 Behold, its blood was not brought into the inner part of the sanctuary. You certainly should have eaten it in the sanctuary, as I commanded.” +\p +\v 19 Aaron spoke to Moses, “Behold, today they have offered their sin offering and their burnt offering before Yahweh; and such things as these have happened to me. If I had eaten the sin offering today, would it have been pleasing in Yahweh’s sight?” +\p +\v 20 When Moses heard that, it was pleasing in his sight. +\c 11 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying to them, +\v 2 “Speak to the children of Israel, saying, ‘These are the living things which you may eat among all the animals that are on the earth. +\v 3 Whatever parts the hoof, and is cloven-footed, and chews the cud among the animals, that you may eat. +\p +\v 4 “‘Nevertheless these you shall not eat of those that chew the cud, or of those who part the hoof: the camel, because it chews the cud but doesn’t have a parted hoof, is unclean to you. +\v 5 The hyrax,\f + \fr 11:5 \ft or rock badger, or cony\f* because it chews the cud but doesn’t have a parted hoof, is unclean to you. +\v 6 The hare, because it chews the cud but doesn’t have a parted hoof, is unclean to you. +\v 7 The pig, because it has a split hoof, and is cloven-footed, but doesn’t chew the cud, is unclean to you. +\v 8 You shall not eat their meat. You shall not touch their carcasses. They are unclean to you. +\p +\v 9 “‘You may eat of all these that are in the waters: whatever has fins and scales in the waters, in the seas, and in the rivers, that you may eat. +\v 10 All that don’t have fins and scales in the seas and rivers, all that move in the waters, and all the living creatures that are in the waters, they are an abomination to you, +\v 11 and you shall detest them. You shall not eat of their meat, and you shall detest their carcasses. +\v 12 Whatever has no fins nor scales in the waters is an abomination to you. +\p +\v 13 “‘You shall detest these among the birds; they shall not be eaten because they are an abomination: the eagle, the vulture, the black vulture, +\v 14 the red kite, any kind of black kite, +\v 15 any kind of raven, +\v 16 the horned owl, the screech owl, the gull, any kind of hawk, +\v 17 the little owl, the cormorant, the great owl, +\v 18 the white owl, the desert owl, the osprey, +\v 19 the stork, any kind of heron, the hoopoe, and the bat. +\p +\v 20 “‘All flying insects that walk on all fours are an abomination to you. +\v 21 Yet you may eat these: of all winged creeping things that go on all fours, which have long, jointed legs for hopping on the earth. +\v 22 Even of these you may eat: any kind of locust, any kind of katydid, any kind of cricket, and any kind of grasshopper. +\v 23 But all winged creeping things which have four feet are an abomination to you. +\p +\v 24 “‘By these you will become unclean: whoever touches their carcass shall be unclean until the evening. +\v 25 Whoever carries any part of their carcass shall wash his clothes, and be unclean until the evening. +\p +\v 26 “‘Every animal which has a split hoof that isn’t completely divided, or doesn’t chew the cud, is unclean to you. Everyone who touches them shall be unclean. +\v 27 Whatever goes on its paws, among all animals that go on all fours, they are unclean to you. Whoever touches their carcass shall be unclean until the evening. +\v 28 He who carries their carcass shall wash his clothes, and be unclean until the evening. They are unclean to you. +\p +\v 29 “‘These are they which are unclean to you among the creeping things that creep on the earth: the weasel, the rat, any kind of great lizard, +\v 30 the gecko, and the monitor lizard, the wall lizard, the skink, and the chameleon. +\v 31 These are they which are unclean to you among all that creep. Whoever touches them when they are dead shall be unclean until the evening. +\v 32 Anything they fall on when they are dead shall be unclean; whether it is any vessel of wood, or clothing, or skin, or sack, whatever vessel it is, with which any work is done, it must be put into water, and it shall be unclean until the evening. Then it will be clean. +\v 33 Every earthen vessel into which any of them falls and all that is in it shall be unclean. You shall break it. +\v 34 All food which may be eaten which is soaked in water shall be unclean. All drink that may be drunk in every such vessel shall be unclean. +\v 35 Everything whereupon part of their carcass falls shall be unclean; whether oven, or range for pots, it shall be broken in pieces. They are unclean, and shall be unclean to you. +\v 36 Nevertheless a spring or a cistern in which water is gathered shall be clean, but that which touches their carcass shall be unclean. +\v 37 If part of their carcass falls on any sowing seed which is to be sown, it is clean. +\v 38 But if water is put on the seed, and part of their carcass falls on it, it is unclean to you. +\p +\v 39 “‘If any animal of which you may eat dies, he who touches its carcass shall be unclean until the evening. +\v 40 He who eats of its carcass shall wash his clothes, and be unclean until the evening. He also who carries its carcass shall wash his clothes, and be unclean until the evening. +\p +\v 41 “‘Every creeping thing that creeps on the earth is an abomination. It shall not be eaten. +\v 42 Whatever goes on its belly, and whatever goes on all fours, or whatever has many feet, even all creeping things that creep on the earth, them you shall not eat; for they are an abomination. +\v 43 You shall not make yourselves abominable with any creeping thing that creeps. You shall not make yourselves unclean with them, that you should be defiled by them. +\v 44 For I am Yahweh your God. Sanctify yourselves therefore, and be holy; for I am holy. You shall not defile yourselves with any kind of creeping thing that moves on the earth. +\v 45 For I am Yahweh who brought you up out of the land of Egypt, to be your God. You shall therefore be holy, for I am holy. +\p +\v 46 “‘This is the law of the animal, and of the bird, and of every living creature that moves in the waters, and of every creature that creeps on the earth, +\v 47 to make a distinction between the unclean and the clean, and between the living thing that may be eaten and the living thing that may not be eaten.’” +\c 12 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, saying, ‘If a woman conceives, and bears a male child, then she shall be unclean seven days; as in the days of her monthly period she shall be unclean. +\v 3 In the eighth day the flesh of his foreskin shall be circumcised. +\v 4 She shall continue in the blood of purification thirty-three days. She shall not touch any holy thing, nor come into the sanctuary, until the days of her purifying are completed. +\v 5 But if she bears a female child, then she shall be unclean two weeks, as in her period; and she shall continue in the blood of purification sixty-six days. +\p +\v 6 “‘When the days of her purification are completed for a son or for a daughter, she shall bring to the priest at the door of the Tent of Meeting, a year old lamb for a burnt offering, and a young pigeon or a turtledove, for a sin offering. +\v 7 He shall offer it before Yahweh, and make atonement for her; then she shall be cleansed from the fountain of her blood. +\p “‘This is the law for her who bears, whether a male or a female. +\v 8 If she cannot afford a lamb, then she shall take two turtledoves or two young pigeons: the one for a burnt offering, and the other for a sin offering. The priest shall make atonement for her, and she shall be clean.’” +\c 13 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying, +\v 2 “When a man shall have a swelling in his body’s skin, or a scab, or a bright spot, and it becomes in the skin of his body the plague of leprosy, then he shall be brought to Aaron the priest or to one of his sons, the priests. +\v 3 The priest shall examine the plague in the skin of the body. If the hair in the plague has turned white, and the appearance of the plague is deeper than the body’s skin, it is the plague of leprosy; so the priest shall examine him and pronounce him unclean. +\v 4 If the bright spot is white in the skin of his body, and its appearance isn’t deeper than the skin, and its hair hasn’t turned white, then the priest shall isolate the infected person for seven days. +\v 5 The priest shall examine him on the seventh day. Behold, if in his eyes the plague is arrested and the plague hasn’t spread in the skin, then the priest shall isolate him for seven more days. +\v 6 The priest shall examine him again on the seventh day. Behold, if the plague has faded and the plague hasn’t spread in the skin, then the priest shall pronounce him clean. It is a scab. He shall wash his clothes, and be clean. +\v 7 But if the scab spreads on the skin after he has shown himself to the priest for his cleansing, he shall show himself to the priest again. +\v 8 The priest shall examine him; and behold, if the scab has spread on the skin, then the priest shall pronounce him unclean. It is leprosy. +\p +\v 9 “When the plague of leprosy is in a man, then he shall be brought to the priest; +\v 10 and the priest shall examine him. Behold, if there is a white swelling in the skin, and it has turned the hair white, and there is raw flesh in the swelling, +\v 11 it is a chronic leprosy in the skin of his body, and the priest shall pronounce him unclean. He shall not isolate him, for he is already unclean. +\p +\v 12 “If the leprosy breaks out all over the skin, and the leprosy covers all the skin of the infected person from his head even to his feet, as far as it appears to the priest, +\v 13 then the priest shall examine him. Behold, if the leprosy has covered all his flesh, he shall pronounce him clean of the plague. It has all turned white: he is clean. +\v 14 But whenever raw flesh appears in him, he shall be unclean. +\v 15 The priest shall examine the raw flesh, and pronounce him unclean: the raw flesh is unclean. It is leprosy. +\v 16 Or if the raw flesh turns again, and is changed to white, then he shall come to the priest. +\v 17 The priest shall examine him. Behold, if the plague has turned white, then the priest shall pronounce him clean of the plague. He is clean. +\p +\v 18 “When the body has a boil on its skin, and it has healed, +\v 19 and in the place of the boil there is a white swelling, or a bright spot, reddish-white, then it shall be shown to the priest. +\v 20 The priest shall examine it. Behold, if its appearance is deeper than the skin, and its hair has turned white, then the priest shall pronounce him unclean. It is the plague of leprosy. It has broken out in the boil. +\v 21 But if the priest examines it, and behold, there are no white hairs in it, and it isn’t deeper than the skin, but is dim, then the priest shall isolate him seven days. +\v 22 If it spreads in the skin, then the priest shall pronounce him unclean. It is a plague. +\v 23 But if the bright spot stays in its place, and hasn’t spread, it is the scar from the boil; and the priest shall pronounce him clean. +\p +\v 24 “Or when the body has a burn from fire on its skin, and the raw flesh of the burn becomes a bright spot, reddish-white, or white, +\v 25 then the priest shall examine it; and behold, if the hair in the bright spot has turned white, and its appearance is deeper than the skin, it is leprosy. It has broken out in the burning, and the priest shall pronounce him unclean. It is the plague of leprosy. +\v 26 But if the priest examines it, and behold, there is no white hair in the bright spot, and it isn’t deeper than the skin, but has faded, then the priest shall isolate him seven days. +\v 27 The priest shall examine him on the seventh day. If it has spread in the skin, then the priest shall pronounce him unclean. It is the plague of leprosy. +\v 28 If the bright spot stays in its place, and hasn’t spread in the skin, but is faded, it is the swelling from the burn, and the priest shall pronounce him clean, for it is the scar from the burn. +\p +\v 29 “When a man or woman has a plague on the head or on the beard, +\v 30 then the priest shall examine the plague; and behold, if its appearance is deeper than the skin, and the hair in it is yellow and thin, then the priest shall pronounce him unclean. It is an itch. It is leprosy of the head or of the beard. +\v 31 If the priest examines the plague of itching, and behold, its appearance isn’t deeper than the skin, and there is no black hair in it, then the priest shall isolate the person infected with itching seven days. +\v 32 On the seventh day the priest shall examine the plague; and behold, if the itch hasn’t spread, and there is no yellow hair in it, and the appearance of the itch isn’t deeper than the skin, +\v 33 then he shall be shaved, but he shall not shave the itch. Then the priest shall isolate the one who has the itch seven more days. +\v 34 On the seventh day, the priest shall examine the itch; and behold, if the itch hasn’t spread in the skin, and its appearance isn’t deeper than the skin, then the priest shall pronounce him clean. He shall wash his clothes and be clean. +\v 35 But if the itch spreads in the skin after his cleansing, +\v 36 then the priest shall examine him; and behold, if the itch has spread in the skin, the priest shall not look for the yellow hair; he is unclean. +\v 37 But if in his eyes the itch is arrested and black hair has grown in it, then the itch is healed. He is clean. The priest shall pronounce him clean. +\p +\v 38 “When a man or a woman has bright spots in the skin of the body, even white bright spots, +\v 39 then the priest shall examine them. Behold, if the bright spots on the skin of their body are a dull white, it is a harmless rash. It has broken out in the skin. He is clean. +\p +\v 40 “If a man’s hair has fallen from his head, he is bald. He is clean. +\v 41 If his hair has fallen off from the front part of his head, he is forehead bald. He is clean. +\v 42 But if a reddish-white plague is in the bald head or the bald forehead, it is leprosy breaking out in his bald head or his bald forehead. +\v 43 Then the priest shall examine him. Behold, if the swelling of the plague is reddish-white in his bald head, or in his bald forehead, like the appearance of leprosy in the skin of the body, +\v 44 he is a leprous man. He is unclean. The priest shall surely pronounce him unclean. His plague is on his head. +\p +\v 45 “The leper in whom the plague is shall wear torn clothes, and the hair of his head shall hang loose. He shall cover his upper lip, and shall cry, ‘Unclean! Unclean!’ +\v 46 All the days in which the plague is in him he shall be unclean. He is unclean. He shall dwell alone. His dwelling shall be outside of the camp. +\p +\v 47 “The garment also that the plague of leprosy is in, whether it is a woolen garment, or a linen garment; +\v 48 whether it is in warp or woof;\f + \fr 13:48 \ft warp and woof are the vertical and horizontal threads in woven cloth\f* of linen or of wool; whether in a leather, or in anything made of leather; +\v 49 if the plague is greenish or reddish in the garment, or in the leather, or in the warp, or in the woof, or in anything made of leather; it is the plague of leprosy, and shall be shown to the priest. +\v 50 The priest shall examine the plague, and isolate the plague seven days. +\v 51 He shall examine the plague on the seventh day. If the plague has spread in the garment, either in the warp, or in the woof, or in the skin, whatever use the skin is used for, the plague is a destructive mildew. It is unclean. +\v 52 He shall burn the garment, whether the warp or the woof, in wool or in linen, or anything of leather, in which the plague is, for it is a destructive mildew. It shall be burned in the fire. +\p +\v 53 “If the priest examines it, and behold, the plague hasn’t spread in the garment, either in the warp, or in the woof, or in anything of skin; +\v 54 then the priest shall command that they wash the thing that the plague is in, and he shall isolate it seven more days. +\v 55 Then the priest shall examine it, after the plague is washed; and behold, if the plague hasn’t changed its color, and the plague hasn’t spread, it is unclean; you shall burn it in the fire. It is a mildewed spot, whether the bareness is inside or outside. +\v 56 If the priest looks, and behold, the plague has faded after it is washed, then he shall tear it out of the garment, or out of the skin, or out of the warp, or out of the woof; +\v 57 and if it appears again in the garment, either in the warp, or in the woof, or in anything of skin, it is spreading. You shall burn what the plague is in with fire. +\v 58 The garment, either the warp, or the woof, or whatever thing of skin it is, which you shall wash, if the plague has departed from them, then it shall be washed the second time, and it will be clean.” +\p +\v 59 This is the law of the plague of mildew in a garment of wool or linen, either in the warp, or the woof, or in anything of skin, to pronounce it clean, or to pronounce it unclean. +\c 14 +\p +\v 1 Yahweh spoke to Moses, saying, +\p +\v 2 “This shall be the law of the leper in the day of his cleansing: He shall be brought to the priest, +\v 3 and the priest shall go out of the camp. The priest shall examine him. Behold, if the plague of leprosy is healed in the leper, +\v 4 then the priest shall command them to take for him who is to be cleansed two living clean birds, cedar wood, scarlet, and hyssop. +\v 5 The priest shall command them to kill one of the birds in an earthen vessel over running water. +\v 6 As for the living bird, he shall take it, the cedar wood, the scarlet, and the hyssop, and shall dip them and the living bird in the blood of the bird that was killed over the running water. +\v 7 He shall sprinkle on him who is to be cleansed from the leprosy seven times, and shall pronounce him clean, and shall let the living bird go into the open field. +\p +\v 8 “He who is to be cleansed shall wash his clothes, and shave off all his hair, and bathe himself in water; and he shall be clean. After that he shall come into the camp, but shall dwell outside his tent seven days. +\v 9 It shall be on the seventh day, that he shall shave all his hair off his head and his beard and his eyebrows. He shall shave off all his hair. He shall wash his clothes, and he shall bathe his body in water. Then he shall be clean. +\p +\v 10 “On the eighth day he shall take two male lambs without defect, one ewe lamb a year old without defect, three tenths of an ephah\f + \fr 14:10 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a meal offering, mixed with oil, and one log\f + \fr 14:10 \ft a log is a liquid measure of about 300 ml or 10 ounces\f* of oil. +\v 11 The priest who cleanses him shall set the man who is to be cleansed, and those things, before Yahweh, at the door of the Tent of Meeting. +\p +\v 12 “The priest shall take one of the male lambs, and offer him for a trespass offering, with the log of oil, and wave them for a wave offering before Yahweh. +\v 13 He shall kill the male lamb in the place where they kill the sin offering and the burnt offering, in the place of the sanctuary; for as the sin offering is the priest’s, so is the trespass offering. It is most holy. +\v 14 The priest shall take some of the blood of the trespass offering, and the priest shall put it on the tip of the right ear of him who is to be cleansed, and on the thumb of his right hand, and on the big toe of his right foot. +\v 15 The priest shall take some of the log of oil, and pour it into the palm of his own left hand. +\v 16 The priest shall dip his right finger in the oil that is in his left hand, and shall sprinkle some of the oil with his finger seven times before Yahweh. +\v 17 The priest shall put some of the rest of the oil that is in his hand on the tip of the right ear of him who is to be cleansed, and on the thumb of his right hand, and on the big toe of his right foot, upon the blood of the trespass offering. +\v 18 The rest of the oil that is in the priest’s hand he shall put on the head of him who is to be cleansed, and the priest shall make atonement for him before Yahweh. +\p +\v 19 “The priest shall offer the sin offering, and make atonement for him who is to be cleansed because of his uncleanness. Afterward he shall kill the burnt offering; +\v 20 then the priest shall offer the burnt offering and the meal offering on the altar. The priest shall make atonement for him, and he shall be clean. +\p +\v 21 “If he is poor, and can’t afford so much, then he shall take one male lamb for a trespass offering to be waved, to make atonement for him, and one tenth of an ephah\f + \fr 14:21 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with oil for a meal offering, and a log\f + \fr 14:21 \ft a log is a liquid measure of about 300 ml or 10 ounces\f* of oil; +\v 22 and two turtledoves, or two young pigeons, such as he is able to afford; and the one shall be a sin offering, and the other a burnt offering. +\p +\v 23 “On the eighth day he shall bring them for his cleansing to the priest, to the door of the Tent of Meeting, before Yahweh. +\v 24 The priest shall take the lamb of the trespass offering, and the log of oil, and the priest shall wave them for a wave offering before Yahweh. +\v 25 He shall kill the lamb of the trespass offering. The priest shall take some of the blood of the trespass offering and put it on the tip of the right ear of him who is to be cleansed, and on the thumb of his right hand, and on the big toe of his right foot. +\v 26 The priest shall pour some of the oil into the palm of his own left hand; +\v 27 and the priest shall sprinkle with his right finger some of the oil that is in his left hand seven times before Yahweh. +\v 28 Then the priest shall put some of the oil that is in his hand on the tip of the right ear of him who is to be cleansed, and on the thumb of his right hand, and on the big toe of his right foot, on the place of the blood of the trespass offering. +\v 29 The rest of the oil that is in the priest’s hand he shall put on the head of him who is to be cleansed, to make atonement for him before Yahweh. +\v 30 He shall offer one of the turtledoves, or of the young pigeons, which ever he is able to afford, +\v 31 of the kind he is able to afford, the one for a sin offering, and the other for a burnt offering, with the meal offering. The priest shall make atonement for him who is to be cleansed before Yahweh.” +\p +\v 32 This is the law for him in whom is the plague of leprosy, who is not able to afford the sacrifice for his cleansing. +\p +\v 33 Yahweh spoke to Moses and to Aaron, saying, +\v 34 “When you have come into the land of Canaan, which I give to you for a possession, and I put a spreading mildew in a house in the land of your possession, +\v 35 then he who owns the house shall come and tell the priest, saying, ‘There seems to me to be some sort of plague in the house.’ +\v 36 The priest shall command that they empty the house, before the priest goes in to examine the plague, that all that is in the house not be made unclean. Afterward the priest shall go in to inspect the house. +\v 37 He shall examine the plague; and behold, if the plague is in the walls of the house with hollow streaks, greenish or reddish, and it appears to be deeper than the wall, +\v 38 then the priest shall go out of the house to the door of the house, and shut up the house seven days. +\v 39 The priest shall come again on the seventh day, and look. If the plague has spread in the walls of the house, +\v 40 then the priest shall command that they take out the stones in which is the plague, and cast them into an unclean place outside of the city. +\v 41 He shall cause the inside of the house to be scraped all over. They shall pour out the mortar that they scraped off outside of the city into an unclean place. +\v 42 They shall take other stones, and put them in the place of those stones; and he shall take other mortar, and shall plaster the house. +\p +\v 43 “If the plague comes again, and breaks out in the house after he has taken out the stones, and after he has scraped the house, and after it was plastered, +\v 44 then the priest shall come in and look; and behold, if the plague has spread in the house, it is a destructive mildew in the house. It is unclean. +\v 45 He shall break down the house, its stones, and its timber, and all the house’s mortar. He shall carry them out of the city into an unclean place. +\p +\v 46 “Moreover he who goes into the house while it is shut up shall be unclean until the evening. +\v 47 He who lies down in the house shall wash his clothes; and he who eats in the house shall wash his clothes. +\p +\v 48 “If the priest shall come in, and examine it, and behold, the plague hasn’t spread in the house, after the house was plastered, then the priest shall pronounce the house clean, because the plague is healed. +\v 49 To cleanse the house he shall take two birds, cedar wood, scarlet, and hyssop. +\v 50 He shall kill one of the birds in an earthen vessel over running water. +\v 51 He shall take the cedar wood, the hyssop, the scarlet, and the living bird, and dip them in the blood of the slain bird, and in the running water, and sprinkle the house seven times. +\v 52 He shall cleanse the house with the blood of the bird, and with the running water, with the living bird, with the cedar wood, with the hyssop, and with the scarlet; +\v 53 but he shall let the living bird go out of the city into the open field. So shall he make atonement for the house; and it shall be clean.” +\p +\v 54 This is the law for any plague of leprosy, and for an itch, +\v 55 and for the destructive mildew of a garment, and for a house, +\v 56 and for a swelling, and for a scab, and for a bright spot; +\v 57 to teach when it is unclean, and when it is clean. +\p This is the law of leprosy. +\c 15 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying, +\v 2 “Speak to the children of Israel, and tell them, ‘When any man has a discharge from his body, because of his discharge he is unclean. +\v 3 This shall be his uncleanness in his discharge: whether his body runs with his discharge, or his body has stopped from his discharge, it is his uncleanness. +\p +\v 4 “‘Every bed on which he who has the discharge lies shall be unclean; and everything he sits on shall be unclean. +\v 5 Whoever touches his bed shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\v 6 He who sits on anything on which the man who has the discharge sat shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\p +\v 7 “‘He who touches the body of him who has the discharge shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\p +\v 8 “‘If he who has the discharge spits on him who is clean, then he shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\p +\v 9 “‘Whatever saddle he who has the discharge rides on shall be unclean. +\v 10 Whoever touches anything that was under him shall be unclean until the evening. He who carries those things shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\p +\v 11 “‘Whomever he who has the discharge touches, without having rinsed his hands in water, he shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\p +\v 12 “‘The earthen vessel, which he who has the discharge touches, shall be broken; and every vessel of wood shall be rinsed in water. +\p +\v 13 “‘When he who has a discharge is cleansed of his discharge, then he shall count to himself seven days for his cleansing, and wash his clothes; and he shall bathe his flesh in running water, and shall be clean. +\p +\v 14 “‘On the eighth day he shall take two turtledoves, or two young pigeons, and come before Yahweh to the door of the Tent of Meeting, and give them to the priest. +\v 15 The priest shall offer them, the one for a sin offering, and the other for a burnt offering. The priest shall make atonement for him before Yahweh for his discharge. +\p +\v 16 “‘If any man has an emission of semen, then he shall bathe all his flesh in water, and be unclean until the evening. +\v 17 Every garment and every skin which the semen is on shall be washed with water, and be unclean until the evening. +\v 18 If a man lies with a woman and there is an emission of semen, they shall both bathe themselves in water, and be unclean until the evening. +\p +\v 19 “‘If a woman has a discharge, and her discharge in her flesh is blood, she shall be in her impurity seven days. Whoever touches her shall be unclean until the evening. +\p +\v 20 “‘Everything that she lies on in her impurity shall be unclean. Everything also that she sits on shall be unclean. +\v 21 Whoever touches her bed shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\v 22 Whoever touches anything that she sits on shall wash his clothes, and bathe himself in water, and be unclean until the evening. +\v 23 If it is on the bed, or on anything she sits on, when he touches it, he shall be unclean until the evening. +\p +\v 24 “‘If any man lies with her, and her monthly flow is on him, he shall be unclean seven days; and every bed he lies on shall be unclean. +\p +\v 25 “‘If a woman has a discharge of her blood many days not in the time of her period, or if she has a discharge beyond the time of her period, all the days of the discharge of her uncleanness shall be as in the days of her period. She is unclean. +\v 26 Every bed she lies on all the days of her discharge shall be to her as the bed of her period. Everything she sits on shall be unclean, as the uncleanness of her period. +\v 27 Whoever touches these things shall be unclean, and shall wash his clothes and bathe himself in water, and be unclean until the evening. +\p +\v 28 “‘But if she is cleansed of her discharge, then she shall count to herself seven days, and after that she shall be clean. +\v 29 On the eighth day she shall take two turtledoves, or two young pigeons, and bring them to the priest, to the door of the Tent of Meeting. +\v 30 The priest shall offer the one for a sin offering, and the other for a burnt offering; and the priest shall make atonement for her before Yahweh for the uncleanness of her discharge. +\p +\v 31 “‘Thus you shall separate the children of Israel from their uncleanness, so they will not die in their uncleanness when they defile my tabernacle that is among them.’” +\p +\v 32 This is the law of him who has a discharge, and of him who has an emission of semen, so that he is unclean by it; +\v 33 and of her who has her period, and of a man or woman who has a discharge, and of him who lies with her who is unclean. +\c 16 +\p +\v 1 Yahweh spoke to Moses after the death of the two sons of Aaron, when they came near before Yahweh, and died; +\v 2 and Yahweh said to Moses, “Tell Aaron your brother not to come at just any time into the Most Holy Place within the veil, before the mercy seat which is on the ark; lest he die; for I will appear in the cloud on the mercy seat. +\p +\v 3 “Aaron shall come into the sanctuary with a young bull for a sin offering, and a ram for a burnt offering. +\v 4 He shall put on the holy linen tunic. He shall have the linen trousers on his body, and shall put on the linen sash, and he shall be clothed with the linen turban. They are the holy garments. He shall bathe his body in water, and put them on. +\v 5 He shall take from the congregation of the children of Israel two male goats for a sin offering, and one ram for a burnt offering. +\p +\v 6 “Aaron shall offer the bull of the sin offering, which is for himself, and make atonement for himself and for his house. +\v 7 He shall take the two goats, and set them before Yahweh at the door of the Tent of Meeting. +\v 8 Aaron shall cast lots for the two goats: one lot for Yahweh, and the other lot for the scapegoat. +\v 9 Aaron shall present the goat on which the lot fell for Yahweh, and offer him for a sin offering. +\v 10 But the goat on which the lot fell for the scapegoat shall be presented alive before Yahweh, to make atonement for him, to send him away as the scapegoat into the wilderness. +\p +\v 11 “Aaron shall present the bull of the sin offering, which is for himself, and shall make atonement for himself and for his house, and shall kill the bull of the sin offering which is for himself. +\v 12 He shall take a censer full of coals of fire from off the altar before Yahweh, and two handfuls of sweet incense beaten small, and bring it within the veil. +\v 13 He shall put the incense on the fire before Yahweh, that the cloud of the incense may cover the mercy seat that is on the covenant, so that he will not die. +\v 14 He shall take some of the blood of the bull, and sprinkle it with his finger on the mercy seat on the east; and before the mercy seat he shall sprinkle some of the blood with his finger seven times. +\p +\v 15 “Then he shall kill the goat of the sin offering that is for the people, and bring his blood within the veil, and do with his blood as he did with the blood of the bull, and sprinkle it on the mercy seat and before the mercy seat. +\v 16 He shall make atonement for the Holy Place, because of the uncleanness of the children of Israel, and because of their transgressions, even all their sins; and so he shall do for the Tent of Meeting that dwells with them in the middle of their uncleanness. +\v 17 No one shall be in the Tent of Meeting when he enters to make atonement in the Holy Place, until he comes out, and has made atonement for himself and for his household, and for all the assembly of Israel. +\p +\v 18 “He shall go out to the altar that is before Yahweh and make atonement for it, and shall take some of the bull’s blood, and some of the goat’s blood, and put it around on the horns of the altar. +\v 19 He shall sprinkle some of the blood on it with his finger seven times, and cleanse it, and make it holy from the uncleanness of the children of Israel. +\p +\v 20 “When he has finished atoning for the Holy Place, the Tent of Meeting, and the altar, he shall present the live goat. +\v 21 Aaron shall lay both his hands on the head of the live goat, and confess over him all the iniquities of the children of Israel, and all their transgressions, even all their sins; and he shall put them on the head of the goat, and shall send him away into the wilderness by the hand of a man who is ready. +\v 22 The goat shall carry all their iniquities on himself to a solitary land, and he shall release the goat in the wilderness. +\p +\v 23 “Aaron shall come into the Tent of Meeting, and shall take off the linen garments which he put on when he went into the Holy Place, and shall leave them there. +\v 24 Then he shall bathe himself in water in a holy place, put on his garments, and come out and offer his burnt offering and the burnt offering of the people, and make atonement for himself and for the people. +\v 25 The fat of the sin offering he shall burn on the altar. +\p +\v 26 “He who lets the goat go as the scapegoat shall wash his clothes, and bathe his flesh in water, and afterward he shall come into the camp. +\v 27 The bull for the sin offering, and the goat for the sin offering, whose blood was brought in to make atonement in the Holy Place, shall be carried outside the camp; and they shall burn their skins, their flesh, and their dung with fire. +\v 28 He who burns them shall wash his clothes, and bathe his flesh in water, and afterward he shall come into the camp. +\p +\v 29 “It shall be a statute to you forever: in the seventh month, on the tenth day of the month, you shall afflict your souls, and shall do no kind of work, whether native-born or a stranger who lives as a foreigner among you; +\v 30 for on this day shall atonement be made for you, to cleanse you. You shall be clean from all your sins before Yahweh. +\v 31 It is a Sabbath of solemn rest to you, and you shall afflict your souls. It is a statute forever. +\v 32 The priest, who is anointed and who is consecrated to be priest in his father’s place, shall make the atonement, and shall put on the linen garments, even the holy garments. +\v 33 Then he shall make atonement for the Holy Sanctuary; and he shall make atonement for the Tent of Meeting and for the altar; and he shall make atonement for the priests and for all the people of the assembly. +\p +\v 34 “This shall be an everlasting statute for you, to make atonement for the children of Israel once in the year because of all their sins.” +\p It was done as Yahweh commanded Moses. +\c 17 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to Aaron, and to his sons, and to all the children of Israel, and say to them, ‘This is the thing which Yahweh has commanded: +\v 3 Whatever man there is of the house of Israel who kills a bull, or lamb, or goat in the camp, or who kills it outside the camp, +\v 4 and hasn’t brought it to the door of the Tent of Meeting to offer it as an offering to Yahweh before Yahweh’s tabernacle: blood shall be imputed to that man. He has shed blood. That man shall be cut off from among his people. +\v 5 This is to the end that the children of Israel may bring their sacrifices, which they sacrifice in the open field, that they may bring them to Yahweh, to the door of the Tent of Meeting, to the priest, and sacrifice them for sacrifices of peace offerings to Yahweh. +\v 6 The priest shall sprinkle the blood on Yahweh’s altar at the door of the Tent of Meeting, and burn the fat for a pleasant aroma to Yahweh. +\v 7 They shall no more sacrifice their sacrifices to the goat idols, after which they play the prostitute. This shall be a statute forever to them throughout their generations.’ +\p +\v 8 “You shall say to them, ‘Any man there is of the house of Israel, or of the strangers who live as foreigners among them, who offers a burnt offering or sacrifice, +\v 9 and doesn’t bring it to the door of the Tent of Meeting to sacrifice it to Yahweh, that man shall be cut off from his people. +\p +\v 10 “‘Any man of the house of Israel, or of the strangers who live as foreigners among them, who eats any kind of blood, I will set my face against that soul who eats blood, and will cut him off from among his people. +\v 11 For the life of the flesh is in the blood. I have given it to you on the altar to make atonement for your souls; for it is the blood that makes atonement by reason of the life. +\v 12 Therefore I have said to the children of Israel, “No person among you may eat blood, nor may any stranger who lives as a foreigner among you eat blood.” +\p +\v 13 “‘Whatever man there is of the children of Israel, or of the strangers who live as foreigners among them, who takes in hunting any animal or bird that may be eaten, he shall pour out its blood, and cover it with dust. +\v 14 For as to the life of all flesh, its blood is with its life. Therefore I said to the children of Israel, “You shall not eat the blood of any kind of flesh; for the life of all flesh is its blood. Whoever eats it shall be cut off.” +\p +\v 15 “‘Every person that eats what dies of itself, or that which is torn by animals, whether he is native-born or a foreigner, shall wash his clothes, and bathe himself in water, and be unclean until the evening. Then he shall be clean. +\v 16 But if he doesn’t wash them, or bathe his flesh, then he shall bear his iniquity.’” +\c 18 +\p +\v 1 Yahweh said to Moses, +\v 2 “Speak to the children of Israel, and say to them, ‘I am Yahweh your God. +\v 3 You shall not do as they do in the land of Egypt, where you lived. You shall not do as they do in the land of Canaan, where I am bringing you. You shall not follow their statutes. +\v 4 You shall do my ordinances. You shall keep my statutes and walk in them. I am Yahweh your God. +\v 5 You shall therefore keep my statutes and my ordinances, which if a man does, he shall live in them. I am Yahweh. +\p +\v 6 “‘None of you shall approach any close relatives, to uncover their nakedness: I am Yahweh. +\p +\v 7 “‘You shall not uncover the nakedness of your father, nor the nakedness of your mother: she is your mother. You shall not uncover her nakedness. +\p +\v 8 “‘You shall not uncover the nakedness of your father’s wife. It is your father’s nakedness. +\p +\v 9 “‘You shall not uncover the nakedness of your sister, the daughter of your father, or the daughter of your mother, whether born at home or born abroad. +\p +\v 10 “‘You shall not uncover the nakedness of your son’s daughter, or of your daughter’s daughter, even their nakedness; for theirs is your own nakedness. +\p +\v 11 “‘You shall not uncover the nakedness of your father’s wife’s daughter, conceived by your father, since she is your sister. +\p +\v 12 “‘You shall not uncover the nakedness of your father’s sister. She is your father’s near kinswoman. +\p +\v 13 “‘You shall not uncover the nakedness of your mother’s sister, for she is your mother’s near kinswoman. +\p +\v 14 “‘You shall not uncover the nakedness of your father’s brother. You shall not approach his wife. She is your aunt. +\p +\v 15 “‘You shall not uncover the nakedness of your daughter-in-law. She is your son’s wife. You shall not uncover her nakedness. +\p +\v 16 “‘You shall not uncover the nakedness of your brother’s wife. It is your brother’s nakedness. +\p +\v 17 “‘You shall not uncover the nakedness of a woman and her daughter. You shall not take her son’s daughter, or her daughter’s daughter, to uncover her nakedness. They are near kinswomen. It is wickedness. +\p +\v 18 “‘You shall not take a wife in addition to her sister, to be a rival, to uncover her nakedness, while her sister is still alive. +\p +\v 19 “‘You shall not approach a woman to uncover her nakedness, as long as she is impure by her uncleanness. +\p +\v 20 “‘You shall not lie carnally with your neighbor’s wife, and defile yourself with her. +\p +\v 21 “‘You shall not give any of your children as a sacrifice to Molech. You shall not profane the name of your God. I am Yahweh. +\p +\v 22 “‘You shall not lie with a man as with a woman. That is detestable. +\p +\v 23 “‘You shall not lie with any animal to defile yourself with it. No woman may give herself to an animal, to lie down with it: it is a perversion. +\p +\v 24 “‘Don’t defile yourselves in any of these things; for in all these the nations which I am casting out before you were defiled. +\v 25 The land was defiled. Therefore I punished its iniquity, and the land vomited out her inhabitants. +\v 26 You therefore shall keep my statutes and my ordinances, and shall not do any of these abominations; neither the native-born, nor the stranger who lives as a foreigner among you +\v 27 (for the men of the land that were before you had done all these abominations, and the land became defiled), +\v 28 that the land not vomit you out also, when you defile it, as it vomited out the nation that was before you. +\p +\v 29 “‘For whoever shall do any of these abominations, even the souls that do them shall be cut off from among their people. +\v 30 Therefore you shall keep my requirements, that you do not practice any of these abominable customs which were practiced before you, and that you do not defile yourselves with them. I am Yahweh your God.’” +\c 19 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to all the congregation of the children of Israel, and tell them, ‘You shall be holy; for I, Yahweh your God, am holy. +\p +\v 3 “‘Each one of you shall respect his mother and his father. You shall keep my Sabbaths. I am Yahweh your God. +\p +\v 4 “‘Don’t turn to idols, nor make molten gods for yourselves. I am Yahweh your God. +\p +\v 5 “‘When you offer a sacrifice of peace offerings to Yahweh, you shall offer it so that you may be accepted. +\v 6 It shall be eaten the same day you offer it, and on the next day. If anything remains until the third day, it shall be burned with fire. +\v 7 If it is eaten at all on the third day, it is an abomination. It will not be accepted; +\v 8 but everyone who eats it shall bear his iniquity, because he has profaned the holy thing of Yahweh, and that soul shall be cut off from his people. +\p +\v 9 “‘When you reap the harvest of your land, you shall not wholly reap the corners of your field, neither shall you gather the gleanings of your harvest. +\v 10 You shall not glean your vineyard, neither shall you gather the fallen grapes of your vineyard. You shall leave them for the poor and for the foreigner. I am Yahweh your God. +\p +\v 11 “‘You shall not steal. +\p “‘You shall not lie. +\p “‘You shall not deceive one another. +\p +\v 12 “‘You shall not swear by my name falsely, and profane the name of your God. I am Yahweh. +\p +\v 13 “‘You shall not oppress your neighbor, nor rob him. +\p “‘The wages of a hired servant shall not remain with you all night until the morning. +\p +\v 14 “‘You shall not curse the deaf, nor put a stumbling block before the blind; but you shall fear your God. I am Yahweh. +\p +\v 15 “‘You shall do no injustice in judgment. You shall not be partial to the poor, nor show favoritism to the great; but you shall judge your neighbor in righteousness. +\p +\v 16 “‘You shall not go around as a slanderer among your people. +\p “‘You shall not endanger the life\f + \fr 19:16 \ft literally, “blood”\f* of your neighbor. I am Yahweh. +\p +\v 17 “‘You shall not hate your brother in your heart. You shall surely rebuke your neighbor, and not bear sin because of him. +\p +\v 18 “‘You shall not take vengeance, nor bear any grudge against the children of your people; but you shall love your neighbor as yourself. I am Yahweh. +\p +\v 19 “‘You shall keep my statutes. +\p “‘You shall not cross-breed different kinds of animals. +\p “‘You shall not sow your field with two kinds of seed; +\p “‘Don’t wear a garment made of two kinds of material. +\p +\v 20 “‘If a man lies carnally with a woman who is a slave girl, pledged to be married to another man, and not ransomed or given her freedom; they shall be punished. They shall not be put to death, because she was not free. +\v 21 He shall bring his trespass offering to Yahweh, to the door of the Tent of Meeting, even a ram for a trespass offering. +\v 22 The priest shall make atonement for him with the ram of the trespass offering before Yahweh for his sin which he has committed; and the sin which he has committed shall be forgiven him. +\p +\v 23 “‘When you come into the land, and have planted all kinds of trees for food, then you shall count their fruit as forbidden.\f + \fr 19:23 \ft literally, “uncircumcised”\f* For three years it shall be forbidden to you. It shall not be eaten. +\v 24 But in the fourth year all its fruit shall be holy, for giving praise to Yahweh. +\v 25 In the fifth year you shall eat its fruit, that it may yield its increase to you. I am Yahweh your God. +\p +\v 26 “‘You shall not eat any meat with the blood still in it. You shall not use enchantments, nor practice sorcery. +\p +\v 27 “‘You shall not cut the hair on the sides of your head or clip off the edge of your beard. +\p +\v 28 “‘You shall not make any cuttings in your flesh for the dead, nor tattoo any marks on you. I am Yahweh. +\p +\v 29 “‘Don’t profane your daughter, to make her a prostitute; lest the land fall to prostitution, and the land become full of wickedness. +\p +\v 30 “‘You shall keep my Sabbaths, and reverence my sanctuary; I am Yahweh. +\p +\v 31 “‘Don’t turn to those who are mediums, nor to the wizards. Don’t seek them out, to be defiled by them. I am Yahweh your God. +\p +\v 32 “‘You shall rise up before the gray head and honor the face of the elderly; and you shall fear your God. I am Yahweh. +\p +\v 33 “‘If a stranger lives as a foreigner with you in your land, you shall not do him wrong. +\v 34 The stranger who lives as a foreigner with you shall be to you as the native-born among you, and you shall love him as yourself; for you lived as foreigners in the land of Egypt. I am Yahweh your God. +\p +\v 35 “‘You shall do no unrighteousness in judgment, in measures of length, of weight, or of quantity. +\v 36 You shall have just balances, just weights, a just ephah,\f + \fr 19:36 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* and a just hin.\f + \fr 19:36 \ft A hin is about 6.5 liters or 1.7 gallons.\f* I am Yahweh your God, who brought you out of the land of Egypt. +\p +\v 37 “‘You shall observe all my statutes and all my ordinances, and do them. I am Yahweh.’” +\c 20 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Moreover, you shall tell the children of Israel, ‘Anyone of the children of Israel, or of the strangers who live as foreigners in Israel, who gives any of his offspring\f + \fr 20:2 \ft or, seed\f* to Molech shall surely be put to death. The people of the land shall stone that person with stones. +\v 3 I also will set my face against that person, and will cut him off from among his people, because he has given of his offspring to Molech, to defile my sanctuary, and to profane my holy name. +\v 4 If the people of the land all hide their eyes from that person when he gives of his offspring to Molech, and don’t put him to death, +\v 5 then I will set my face against that man and against his family, and will cut him off, and all who play the prostitute after him to play the prostitute with Molech, from among their people. +\p +\v 6 “‘The person that turns to those who are mediums and wizards, to play the prostitute after them, I will even set my face against that person, and will cut him off from among his people. +\p +\v 7 “‘Sanctify yourselves therefore, and be holy; for I am Yahweh your God. +\v 8 You shall keep my statutes, and do them. I am Yahweh who sanctifies you. +\p +\v 9 “‘For everyone who curses his father or his mother shall surely be put to death. He has cursed his father or his mother. His blood shall be upon himself. +\p +\v 10 “‘The man who commits adultery with another man’s wife, even he who commits adultery with his neighbor’s wife, the adulterer and the adulteress shall surely be put to death. +\p +\v 11 “‘The man who lies with his father’s wife has uncovered his father’s nakedness. Both of them shall surely be put to death. Their blood shall be upon themselves. +\p +\v 12 “‘If a man lies with his daughter-in-law, both of them shall surely be put to death. They have committed a perversion. Their blood shall be upon themselves. +\p +\v 13 “‘If a man lies with a male, as with a woman, both of them have committed an abomination. They shall surely be put to death. Their blood shall be upon themselves. +\p +\v 14 “‘If a man takes a wife and her mother, it is wickedness. They shall be burned with fire, both he and they, that there may be no wickedness among you. +\p +\v 15 “‘If a man lies with an animal, he shall surely be put to death; and you shall kill the animal. +\p +\v 16 “‘If a woman approaches any animal and lies with it, you shall kill the woman and the animal. They shall surely be put to death. Their blood shall be upon them. +\p +\v 17 “‘If a man takes his sister—his father’s daughter, or his mother’s daughter—and sees her nakedness, and she sees his nakedness, it is a shameful thing. They shall be cut off in the sight of the children of their people. He has uncovered his sister’s nakedness. He shall bear his iniquity. +\p +\v 18 “‘If a man lies with a woman having her monthly period, and uncovers her nakedness, he has made her fountain naked, and she has uncovered the fountain of her blood. Both of them shall be cut off from among their people. +\p +\v 19 “‘You shall not uncover the nakedness of your mother’s sister, nor of your father’s sister, for he has made his close relative naked. They shall bear their iniquity. +\v 20 If a man lies with his uncle’s wife, he has uncovered his uncle’s nakedness. They shall bear their sin. They shall die childless. +\p +\v 21 “‘If a man takes his brother’s wife, it is an impurity. He has uncovered his brother’s nakedness. They shall be childless. +\p +\v 22 “‘You shall therefore keep all my statutes and all my ordinances, and do them, that the land where I am bringing you to dwell may not vomit you out. +\v 23 You shall not walk in the customs of the nation which I am casting out before you; for they did all these things, and therefore I abhorred them. +\v 24 But I have said to you, “You shall inherit their land, and I will give it to you to possess it, a land flowing with milk and honey.” I am Yahweh your God, who has separated you from the peoples. +\p +\v 25 “‘You shall therefore make a distinction between the clean animal and the unclean, and between the unclean fowl and the clean. You shall not make yourselves abominable by animal, or by bird, or by anything with which the ground teems, which I have separated from you as unclean for you. +\v 26 You shall be holy to me, for I, Yahweh, am holy, and have set you apart from the peoples, that you should be mine. +\p +\v 27 “‘A man or a woman that is a medium or is a wizard shall surely be put to death. They shall be stoned with stones. Their blood shall be upon themselves.’” +\c 21 +\p +\v 1 Yahweh said to Moses, “Speak to the priests, the sons of Aaron, and say to them, ‘A priest shall not defile himself for the dead among his people, +\v 2 except for his relatives that are near to him: for his mother, for his father, for his son, for his daughter, for his brother, +\v 3 and for his virgin sister who is near to him, who has had no husband; for her he may defile himself. +\v 4 He shall not defile himself, being a chief man among his people, to profane himself. +\p +\v 5 “‘They shall not shave their heads or shave off the corners of their beards or make any cuttings in their flesh. +\v 6 They shall be holy to their God, and not profane the name of their God, for they offer the offerings of Yahweh made by fire, the bread of their God. Therefore they shall be holy. +\p +\v 7 “‘They shall not marry a woman who is a prostitute, or profane. A priest shall not marry a woman divorced from her husband; for he is holy to his God. +\v 8 Therefore you shall sanctify him, for he offers the bread of your God. He shall be holy to you, for I Yahweh, who sanctify you, am holy. +\p +\v 9 “‘The daughter of any priest, if she profanes herself by playing the prostitute, she profanes her father. She shall be burned with fire. +\p +\v 10 “‘He who is the high priest among his brothers, upon whose head the anointing oil is poured, and who is consecrated to put on the garments, shall not let the hair of his head hang loose, or tear his clothes. +\v 11 He must not go in to any dead body, or defile himself for his father or for his mother. +\v 12 He shall not go out of the sanctuary, nor profane the sanctuary of his God; for the crown of the anointing oil of his God is upon him. I am Yahweh. +\p +\v 13 “‘He shall take a wife in her virginity. +\v 14 He shall not marry a widow, or one divorced, or a woman who has been defiled, or a prostitute. He shall take a virgin of his own people as a wife. +\v 15 He shall not profane his offspring among his people, for I am Yahweh who sanctifies him.’” +\p +\v 16 Yahweh spoke to Moses, saying, +\v 17 “Say to Aaron, ‘None of your offspring throughout their generations who has a defect may approach to offer the bread of his God. +\v 18 For whatever man he is that has a defect, he shall not draw near: a blind man, or a lame, or he who has a flat nose, or any deformity, +\v 19 or a man who has an injured foot, or an injured hand, +\v 20 or hunchbacked, or a dwarf, or one who has a defect in his eye, or an itching disease, or scabs, or who has damaged testicles. +\v 21 No man of the offspring of Aaron the priest who has a defect shall come near to offer the offerings of Yahweh made by fire. Since he has a defect, he shall not come near to offer the bread of his God. +\v 22 He shall eat the bread of his God, both of the most holy, and of the holy. +\v 23 He shall not come near to the veil, nor come near to the altar, because he has a defect; that he may not profane my sanctuaries, for I am Yahweh who sanctifies them.’” +\p +\v 24 So Moses spoke to Aaron, and to his sons, and to all the children of Israel. +\c 22 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Tell Aaron and his sons to separate themselves from the holy things of the children of Israel, which they make holy to me, and that they not profane my holy name. I am Yahweh. +\p +\v 3 “Tell them, ‘If anyone of all your offspring throughout your generations approaches the holy things which the children of Israel make holy to Yahweh, having his uncleanness on him, that soul shall be cut off from before me. I am Yahweh. +\p +\v 4 “‘Whoever of the offspring of Aaron is a leper or has a discharge shall not eat of the holy things until he is clean. Whoever touches anything that is unclean by the dead, or a man who has a seminal emission, +\v 5 or whoever touches any creeping thing by which he may be made unclean, or a man from whom he may become unclean, whatever uncleanness he has— +\v 6 the person that touches any such shall be unclean until the evening, and shall not eat of the holy things unless he bathes his body in water. +\v 7 When the sun is down, he shall be clean; and afterward he shall eat of the holy things, because it is his bread. +\v 8 He shall not eat that which dies of itself or is torn by animals, defiling himself by it. I am Yahweh. +\p +\v 9 “‘They shall therefore follow my commandment, lest they bear sin for it and die in it, if they profane it. I am Yahweh who sanctifies them. +\p +\v 10 “‘No stranger shall eat of the holy thing: a foreigner living with the priests, or a hired servant, shall not eat of the holy thing. +\v 11 But if a priest buys a slave, purchased by his money, he shall eat of it; and those who are born in his house shall eat of his bread. +\v 12 If a priest’s daughter is married to an outsider, she shall not eat of the heave offering of the holy things. +\v 13 But if a priest’s daughter is a widow, or divorced, and has no child, and has returned to her father’s house as in her youth, she may eat of her father’s bread; but no stranger shall eat any of it. +\p +\v 14 “‘If a man eats something holy unwittingly, then he shall add the fifth part of its value to it, and shall give the holy thing to the priest. +\v 15 The priests shall not profane the holy things of the children of Israel, which they offer to Yahweh, +\v 16 and so cause them to bear the iniquity that brings guilt when they eat their holy things; for I am Yahweh who sanctifies them.’” +\p +\v 17 Yahweh spoke to Moses, saying, +\v 18 “Speak to Aaron, and to his sons, and to all the children of Israel, and say to them, ‘Whoever is of the house of Israel, or of the foreigners in Israel, who offers his offering, whether it is any of their vows or any of their free will offerings, which they offer to Yahweh for a burnt offering: +\v 19 that you may be accepted, you shall offer a male without defect, of the bulls, of the sheep, or of the goats. +\v 20 But you shall not offer whatever has a defect, for it shall not be acceptable for you. +\v 21 Whoever offers a sacrifice of peace offerings to Yahweh to accomplish a vow, or for a free will offering of the herd or of the flock, it shall be perfect to be accepted. It shall have no defect. +\v 22 You shall not offer what is blind, is injured, is maimed, has a wart, is festering, or has a running sore to Yahweh, nor make an offering by fire of them on the altar to Yahweh. +\v 23 Either a bull or a lamb that has any deformity or lacking in his parts, that you may offer for a free will offering; but for a vow it shall not be accepted. +\v 24 You must not offer to Yahweh that which has its testicles bruised, crushed, broken, or cut. You must not do this in your land. +\v 25 You must not offer any of these as the bread of your God from the hand of a foreigner, because their corruption is in them. There is a defect in them. They shall not be accepted for you.’” +\p +\v 26 Yahweh spoke to Moses, saying, +\v 27 “When a bull, a sheep, or a goat is born, it shall remain seven days with its mother. From the eighth day on it shall be accepted for the offering of an offering made by fire to Yahweh. +\v 28 Whether it is a cow or ewe, you shall not kill it and its young both in one day. +\p +\v 29 “When you sacrifice a sacrifice of thanksgiving to Yahweh, you shall sacrifice it so that you may be accepted. +\v 30 It shall be eaten on the same day; you shall leave none of it until the morning. I am Yahweh. +\p +\v 31 “Therefore you shall keep my commandments, and do them. I am Yahweh. +\v 32 You shall not profane my holy name, but I will be made holy among the children of Israel. I am Yahweh who makes you holy, +\v 33 who brought you out of the land of Egypt, to be your God. I am Yahweh.” +\c 23 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, and tell them, ‘The set feasts of Yahweh, which you shall proclaim to be holy convocations, even these are my set feasts. +\p +\v 3 “‘Six days shall work be done, but on the seventh day is a Sabbath of solemn rest, a holy convocation; you shall do no kind of work. It is a Sabbath to Yahweh in all your dwellings. +\p +\v 4 “‘These are the set feasts of Yahweh, even holy convocations, which you shall proclaim in their appointed season. +\v 5 In the first month, on the fourteenth day of the month in the evening, is Yahweh’s Passover. +\v 6 On the fifteenth day of the same month is the feast of unleavened bread to Yahweh. Seven days you shall eat unleavened bread. +\v 7 In the first day you shall have a holy convocation. You shall do no regular work. +\v 8 But you shall offer an offering made by fire to Yahweh seven days. In the seventh day is a holy convocation. You shall do no regular work.’” +\p +\v 9 Yahweh spoke to Moses, saying, +\v 10 “Speak to the children of Israel, and tell them, ‘When you have come into the land which I give to you, and shall reap its harvest, then you shall bring the sheaf of the first fruits of your harvest to the priest. +\v 11 He shall wave the sheaf before Yahweh, to be accepted for you. On the next day after the Sabbath the priest shall wave it. +\v 12 On the day when you wave the sheaf, you shall offer a male lamb without defect a year old for a burnt offering to Yahweh. +\v 13 The meal offering with it shall be two tenths of an ephah\f + \fr 23:13 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with oil, an offering made by fire to Yahweh for a pleasant aroma; and the drink offering with it shall be of wine, the fourth part of a hin.\f + \fr 23:13 \ft A hin is about 6.5 liters or 1.7 gallons.\f* +\v 14 You must not eat bread, or roasted grain, or fresh grain, until this same day, until you have brought the offering of your God. This is a statute forever throughout your generations in all your dwellings. +\p +\v 15 “‘You shall count from the next day after the Sabbath, from the day that you brought the sheaf of the wave offering: seven Sabbaths shall be completed. +\v 16 The next day after the seventh Sabbath you shall count fifty days; and you shall offer a new meal offering to Yahweh. +\v 17 You shall bring out of your habitations two loaves of bread for a wave offering made of two tenths of an ephah\f + \fr 23:17 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour. They shall be baked with yeast, for first fruits to Yahweh. +\v 18 You shall present with the bread seven lambs without defect a year old, one young bull, and two rams. They shall be a burnt offering to Yahweh, with their meal offering and their drink offerings, even an offering made by fire, of a sweet aroma to Yahweh. +\v 19 You shall offer one male goat for a sin offering, and two male lambs a year old for a sacrifice of peace offerings. +\v 20 The priest shall wave them with the bread of the first fruits for a wave offering before Yahweh, with the two lambs. They shall be holy to Yahweh for the priest. +\v 21 You shall make proclamation on the same day that there shall be a holy convocation to you. You shall do no regular work. This is a statute forever in all your dwellings throughout your generations. +\p +\v 22 “‘When you reap the harvest of your land, you must not wholly reap into the corners of your field. You must not gather the gleanings of your harvest. You must leave them for the poor and for the foreigner. I am Yahweh your God.’” +\p +\v 23 Yahweh spoke to Moses, saying, +\v 24 “Speak to the children of Israel, saying, ‘In the seventh month, on the first day of the month, there shall be a solemn rest for you, a memorial of blowing of trumpets, a holy convocation. +\v 25 You shall do no regular work. You shall offer an offering made by fire to Yahweh.’” +\p +\v 26 Yahweh spoke to Moses, saying, +\v 27 “However on the tenth day of this seventh month is the day of atonement. It shall be a holy convocation to you. You shall afflict yourselves and you shall offer an offering made by fire to Yahweh. +\v 28 You shall do no kind of work in that same day, for it is a day of atonement, to make atonement for you before Yahweh your God. +\v 29 For whoever it is who shall not deny himself in that same day shall be cut off from his people. +\v 30 Whoever does any kind of work in that same day, I will destroy that person from among his people. +\v 31 You shall do no kind of work: it is a statute forever throughout your generations in all your dwellings. +\v 32 It shall be a Sabbath of solemn rest for you, and you shall deny yourselves. In the ninth day of the month at evening, from evening to evening, you shall keep your Sabbath.” +\p +\v 33 Yahweh spoke to Moses, saying, +\v 34 “Speak to the children of Israel, and say, ‘On the fifteenth day of this seventh month is the feast of booths\f + \fr 23:34 \ft or, feast of tents, or Succoth\f* for seven days to Yahweh. +\v 35 On the first day shall be a holy convocation. You shall do no regular work. +\v 36 Seven days you shall offer an offering made by fire to Yahweh. On the eighth day shall be a holy convocation to you. You shall offer an offering made by fire to Yahweh. It is a solemn assembly; you shall do no regular work. +\p +\v 37 “‘These are the appointed feasts of Yahweh which you shall proclaim to be holy convocations, to offer an offering made by fire to Yahweh, a burnt offering, a meal offering, a sacrifice, and drink offerings, each on its own day— +\v 38 in addition to the Sabbaths of Yahweh, and in addition to your gifts, and in addition to all your vows, and in addition to all your free will offerings, which you give to Yahweh. +\p +\v 39 “‘So on the fifteenth day of the seventh month, when you have gathered in the fruits of the land, you shall keep the feast of Yahweh seven days. On the first day shall be a solemn rest, and on the eighth day shall be a solemn rest. +\v 40 You shall take on the first day the fruit of majestic trees, branches of palm trees, and boughs of thick trees, and willows of the brook; and you shall rejoice before Yahweh your God seven days. +\v 41 You shall keep it as a feast to Yahweh seven days in the year. It is a statute forever throughout your generations. You shall keep it in the seventh month. +\v 42 You shall dwell in temporary shelters\f + \fr 23:42 \ft or, booths\f* for seven days. All who are native-born in Israel shall dwell in temporary shelters,\f + \fr 23:42 \ft or, booths\f* +\v 43 that your generations may know that I made the children of Israel to dwell in temporary shelters\f + \fr 23:43 \ft or, booths\f* when I brought them out of the land of Egypt. I am Yahweh your God.’” +\p +\v 44 So Moses declared to the children of Israel the appointed feasts of Yahweh. +\c 24 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Command the children of Israel, that they bring to you pure olive oil beaten for the light, to cause a lamp to burn continually. +\v 3 Outside of the veil of the Testimony, in the Tent of Meeting, Aaron shall keep it in order from evening to morning before Yahweh continually. It shall be a statute forever throughout your generations. +\v 4 He shall keep in order the lamps on the pure gold lamp stand before Yahweh continually. +\p +\v 5 “You shall take fine flour, and bake twelve cakes of it: two tenths of an ephah\f + \fr 24:5 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* shall be in one cake. +\v 6 You shall set them in two rows, six on a row, on the pure gold table before Yahweh. +\v 7 You shall put pure frankincense on each row, that it may be to the bread for a memorial, even an offering made by fire to Yahweh. +\v 8 Every Sabbath day he shall set it in order before Yahweh continually. It is an everlasting covenant on the behalf of the children of Israel. +\v 9 It shall be for Aaron and his sons. They shall eat it in a holy place; for it is most holy to him of the offerings of Yahweh made by fire by a perpetual statute.” +\p +\v 10 The son of an Israelite woman, whose father was an Egyptian, went out among the children of Israel; and the son of the Israelite woman and a man of Israel strove together in the camp. +\v 11 The son of the Israelite woman blasphemed the Name, and cursed; and they brought him to Moses. His mother’s name was Shelomith, the daughter of Dibri, of the tribe of Dan. +\v 12 They put him in custody until Yahweh’s will should be declared to them. +\v 13 Yahweh spoke to Moses, saying, +\v 14 “Bring him who cursed out of the camp; and let all who heard him lay their hands on his head, and let all the congregation stone him. +\v 15 You shall speak to the children of Israel, saying, ‘Whoever curses his God shall bear his sin. +\v 16 He who blasphemes Yahweh’s name, he shall surely be put to death. All the congregation shall certainly stone him. The foreigner as well as the native-born shall be put to death when he blasphemes the Name. +\p +\v 17 “‘He who strikes any man mortally shall surely be put to death. +\v 18 He who strikes an animal mortally shall make it good, life for life. +\v 19 If anyone injures his neighbor, it shall be done to him as he has done: +\v 20 fracture for fracture, eye for eye, tooth for tooth. It shall be done to him as he has injured someone. +\v 21 He who kills an animal shall make it good; and he who kills a man shall be put to death. +\v 22 You shall have one kind of law for the foreigner as well as the native-born; for I am Yahweh your God.’” +\p +\v 23 Moses spoke to the children of Israel; and they brought him who had cursed out of the camp, and stoned him with stones. The children of Israel did as Yahweh commanded Moses. +\c 25 +\p +\v 1 Yahweh said to Moses on Mount Sinai, +\v 2 “Speak to the children of Israel, and tell them, ‘When you come into the land which I give you, then the land shall keep a Sabbath to Yahweh. +\v 3 You shall sow your field six years, and you shall prune your vineyard six years, and gather in its fruits; +\v 4 but in the seventh year there shall be a Sabbath of solemn rest for the land, a Sabbath to Yahweh. You shall not sow your field or prune your vineyard. +\v 5 What grows of itself in your harvest you shall not reap, and you shall not gather the grapes of your undressed vine. It shall be a year of solemn rest for the land. +\v 6 The Sabbath of the land shall be for food for you; for yourself, for your servant, for your maid, for your hired servant, and for your stranger, who lives as a foreigner with you. +\v 7 For your livestock also, and for the animals that are in your land, shall all its increase be for food. +\p +\v 8 “‘You shall count off seven Sabbaths of years, seven times seven years; and there shall be to you the days of seven Sabbaths of years, even forty-nine years. +\v 9 Then you shall sound the loud trumpet on the tenth day of the seventh month. On the Day of Atonement you shall sound the trumpet throughout all your land. +\v 10 You shall make the fiftieth year holy, and proclaim liberty throughout the land to all its inhabitants. It shall be a jubilee to you; and each of you shall return to his own property, and each of you shall return to his family. +\v 11 That fiftieth year shall be a jubilee to you. In it you shall not sow, neither reap that which grows of itself, nor gather from the undressed vines. +\v 12 For it is a jubilee; it shall be holy to you. You shall eat of its increase out of the field. +\p +\v 13 “‘In this Year of Jubilee each of you shall return to his property. +\p +\v 14 “‘If you sell anything to your neighbor, or buy from your neighbor, you shall not wrong one another. +\v 15 According to the number of years after the Jubilee you shall buy from your neighbor. According to the number of years of the crops he shall sell to you. +\v 16 According to the length of the years you shall increase its price, and according to the shortness of the years you shall diminish its price; for he is selling the number of the crops to you. +\v 17 You shall not wrong one another, but you shall fear your God; for I am Yahweh your God. +\p +\v 18 “‘Therefore you shall do my statutes, and keep my ordinances and do them; and you shall dwell in the land in safety. +\v 19 The land shall yield its fruit, and you shall eat your fill, and dwell therein in safety. +\v 20 If you said, “What shall we eat the seventh year? Behold, we shall not sow, nor gather in our increase;” +\v 21 then I will command my blessing on you in the sixth year, and it shall bear fruit for the three years. +\v 22 You shall sow the eighth year, and eat of the fruits from the old store until the ninth year. Until its fruits come in, you shall eat the old store. +\p +\v 23 “‘The land shall not be sold in perpetuity, for the land is mine; for you are strangers and live as foreigners with me. +\v 24 In all the land of your possession you shall grant a redemption for the land. +\p +\v 25 “‘If your brother becomes poor, and sells some of his possessions, then his kinsman who is next to him shall come, and redeem that which his brother has sold. +\v 26 If a man has no one to redeem it, and he becomes prosperous and finds sufficient means to redeem it, +\v 27 then let him reckon the years since its sale, and restore the surplus to the man to whom he sold it; and he shall return to his property. +\v 28 But if he isn’t able to get it back for himself, then what he has sold shall remain in the hand of him who has bought it until the Year of Jubilee. In the Jubilee it shall be released, and he shall return to his property. +\p +\v 29 “‘If a man sells a dwelling house in a walled city, then he may redeem it within a whole year after it has been sold. For a full year he shall have the right of redemption. +\v 30 If it isn’t redeemed within the space of a full year, then the house that is in the walled city shall be made sure in perpetuity to him who bought it, throughout his generations. It shall not be released in the Jubilee. +\v 31 But the houses of the villages which have no wall around them shall be accounted for with the fields of the country: they may be redeemed, and they shall be released in the Jubilee. +\p +\v 32 “‘Nevertheless, in the cities of the Levites, the Levites may redeem the houses in the cities of their possession at any time. +\v 33 The Levites may redeem the house that was sold, and the city of his possession, and it shall be released in the Jubilee; for the houses of the cities of the Levites are their possession among the children of Israel. +\v 34 But the field of the pasture lands of their cities may not be sold, for it is their perpetual possession. +\p +\v 35 “‘If your brother has become poor, and his hand can’t support himself among you, then you shall uphold him. He shall live with you like an alien and a temporary resident. +\v 36 Take no interest from him or profit; but fear your God, that your brother may live among you. +\v 37 You shall not lend him your money at interest, nor give him your food for profit. +\v 38 I am Yahweh your God, who brought you out of the land of Egypt, to give you the land of Canaan, and to be your God. +\p +\v 39 “‘If your brother has grown poor among you, and sells himself to you, you shall not make him to serve as a slave. +\v 40 As a hired servant, and as a temporary resident, he shall be with you; he shall serve with you until the Year of Jubilee. +\v 41 Then he shall go out from you, he and his children with him, and shall return to his own family, and to the possession of his fathers. +\v 42 For they are my servants, whom I brought out of the land of Egypt. They shall not be sold as slaves. +\v 43 You shall not rule over him with harshness, but shall fear your God. +\p +\v 44 “‘As for your male and your female slaves, whom you may have from the nations that are around you, from them you may buy male and female slaves. +\v 45 Moreover, of the children of the aliens who live among you, of them you may buy, and of their families who are with you, which they have conceived in your land; and they will be your property. +\v 46 You may make them an inheritance for your children after you, to hold for a possession. Of them you may take your slaves forever, but over your brothers the children of Israel you shall not rule, one over another, with harshness. +\p +\v 47 “‘If an alien or temporary resident with you becomes rich, and your brother beside him has grown poor, and sells himself to the stranger or foreigner living among you, or to a member of the stranger’s family, +\v 48 after he is sold he may be redeemed. One of his brothers may redeem him; +\v 49 or his uncle, or his uncle’s son, may redeem him, or any who is a close relative to him of his family may redeem him; or if he has grown rich, he may redeem himself. +\v 50 He shall reckon with him who bought him from the year that he sold himself to him to the Year of Jubilee. The price of his sale shall be according to the number of years; he shall be with him according to the time of a hired servant. +\v 51 If there are yet many years, according to them he shall give back the price of his redemption out of the money that he was bought for. +\v 52 If there remain but a few years to the year of jubilee, then he shall reckon with him; according to his years of service he shall give back the price of his redemption. +\v 53 As a servant hired year by year shall he be with him. He shall not rule with harshness over him in your sight. +\v 54 If he isn’t redeemed by these means, then he shall be released in the Year of Jubilee: he and his children with him. +\v 55 For to me the children of Israel are servants; they are my servants whom I brought out of the land of Egypt. I am Yahweh your God. +\c 26 +\p +\v 1 “‘You shall make for yourselves no idols, and you shall not raise up a carved image or a pillar, and you shall not place any figured stone in your land, to bow down to it; for I am Yahweh your God. +\p +\v 2 “‘You shall keep my Sabbaths, and have reverence for my sanctuary. I am Yahweh. +\p +\v 3 “‘If you walk in my statutes and keep my commandments, and do them, +\v 4 then I will give you your rains in their season, and the land shall yield its increase, and the trees of the field shall yield their fruit. +\v 5 Your threshing shall continue until the vintage, and the vintage shall continue until the sowing time. You shall eat your bread to the full, and dwell in your land safely. +\p +\v 6 “‘I will give peace in the land, and you shall lie down, and no one will make you afraid. I will remove evil animals out of the land, neither shall the sword go through your land. +\v 7 You shall chase your enemies, and they shall fall before you by the sword. +\v 8 Five of you shall chase a hundred, and a hundred of you shall chase ten thousand; and your enemies shall fall before you by the sword. +\p +\v 9 “‘I will have respect for you, make you fruitful, multiply you, and will establish my covenant with you. +\v 10 You shall eat old supplies long kept, and you shall move out the old because of the new. +\v 11 I will set my tent among you, and my soul won’t abhor you. +\v 12 I will walk among you, and will be your God, and you will be my people. +\v 13 I am Yahweh your God, who brought you out of the land of Egypt, that you should not be their slaves. I have broken the bars of your yoke, and made you walk upright. +\p +\v 14 “‘But if you will not listen to me, and will not do all these commandments, +\v 15 and if you shall reject my statutes, and if your soul abhors my ordinances, so that you will not do all my commandments, but break my covenant, +\v 16 I also will do this to you: I will appoint terror over you, even consumption and fever, that shall consume the eyes, and make the soul to pine away. You will sow your seed in vain, for your enemies will eat it. +\v 17 I will set my face against you, and you will be struck before your enemies. Those who hate you will rule over you; and you will flee when no one pursues you. +\p +\v 18 “‘If you in spite of these things will not listen to me, then I will chastise you seven times more for your sins. +\v 19 I will break the pride of your power, and I will make your sky like iron, and your soil like bronze. +\v 20 Your strength will be spent in vain; for your land won’t yield its increase, neither will the trees of the land yield their fruit. +\p +\v 21 “‘If you walk contrary to me, and won’t listen to me, then I will bring seven times more plagues on you according to your sins. +\v 22 I will send the wild animals among you, which will rob you of your children, destroy your livestock, and make you few in number. Your roads will become desolate. +\p +\v 23 “‘If by these things you won’t be turned back to me, but will walk contrary to me, +\v 24 then I will also walk contrary to you; and I will strike you, even I, seven times for your sins. +\v 25 I will bring a sword upon you that will execute the vengeance of the covenant. You will be gathered together within your cities, and I will send the pestilence among you. You will be delivered into the hand of the enemy. +\v 26 When I break your staff of bread, ten women shall bake your bread in one oven, and they shall deliver your bread again by weight. You shall eat, and not be satisfied. +\p +\v 27 “‘If you in spite of this won’t listen to me, but walk contrary to me, +\v 28 then I will walk contrary to you in wrath. I will also chastise you seven times for your sins. +\v 29 You will eat the flesh of your sons, and you will eat the flesh of your daughters. +\v 30 I will destroy your high places, and cut down your incense altars, and cast your dead bodies upon the bodies of your idols; and my soul will abhor you. +\v 31 I will lay your cities waste, and will bring your sanctuaries to desolation. I will not take delight in the sweet fragrance of your offerings. +\v 32 I will bring the land into desolation, and your enemies who dwell in it will be astonished at it. +\v 33 I will scatter you among the nations, and I will draw out the sword after you. Your land will be a desolation, and your cities shall be a waste. +\v 34 Then the land will enjoy its Sabbaths as long as it lies desolate and you are in your enemies’ land. Even then the land will rest and enjoy its Sabbaths. +\v 35 As long as it lies desolate it shall have rest, even the rest which it didn’t have in your Sabbaths when you lived on it. +\p +\v 36 “‘As for those of you who are left, I will send a faintness into their hearts in the lands of their enemies. The sound of a driven leaf will put them to flight; and they shall flee, as one flees from the sword. They will fall when no one pursues. +\v 37 They will stumble over one another, as it were before the sword, when no one pursues. You will have no power to stand before your enemies. +\v 38 You will perish among the nations. The land of your enemies will eat you up. +\v 39 Those of you who are left will pine away in their iniquity in your enemies’ lands; and also in the iniquities of their fathers they shall pine away with them. +\p +\v 40 “‘If they confess their iniquity and the iniquity of their fathers, in their trespass which they trespassed against me; and also that because they walked contrary to me, +\v 41 I also walked contrary to them, and brought them into the land of their enemies; if then their uncircumcised heart is humbled, and they then accept the punishment of their iniquity, +\v 42 then I will remember my covenant with Jacob, my covenant with Isaac, and also my covenant with Abraham; and I will remember the land. +\v 43 The land also will be left by them, and will enjoy its Sabbaths while it lies desolate without them; and they will accept the punishment of their iniquity because they rejected my ordinances, and their soul abhorred my statutes. +\v 44 Yet for all that, when they are in the land of their enemies, I will not reject them, neither will I abhor them, to destroy them utterly and to break my covenant with them; for I am Yahweh their God. +\v 45 But I will for their sake remember the covenant of their ancestors, whom I brought out of the land of Egypt in the sight of the nations, that I might be their God. I am Yahweh.’” +\p +\v 46 These are the statutes, ordinances, and laws, which Yahweh made between him and the children of Israel in Mount Sinai by Moses. +\c 27 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, and say to them, ‘When a man consecrates a person to Yahweh in a vow, according to your valuation, +\v 3 your valuation of a male from twenty years old to sixty years old shall be fifty shekels of silver, according to the shekel\f + \fr 27:3 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary. +\v 4 If she is a female, then your valuation shall be thirty shekels. +\v 5 If the person is from five years old to twenty years old, then your valuation shall be for a male twenty shekels, and for a female ten shekels. +\v 6 If the person is from a month old to five years old, then your valuation shall be for a male five shekels of silver, and for a female your valuation shall be three shekels of silver. +\v 7 If the person is from sixty years old and upward; if he is a male, then your valuation shall be fifteen shekels, and for a female ten shekels. +\v 8 But if he is poorer than your valuation, then he shall be set before the priest, and the priest shall assign a value to him. The priest shall assign a value according to his ability to pay. +\p +\v 9 “‘If it is an animal of which men offer an offering to Yahweh, all that any man gives of such to Yahweh becomes holy. +\v 10 He shall not alter it, nor exchange it, a good for a bad, or a bad for a good. If he shall at all exchange animal for animal, then both it and that for which it is exchanged shall be holy. +\v 11 If it is any unclean animal, of which they do not offer as an offering to Yahweh, then he shall set the animal before the priest; +\v 12 and the priest shall evaluate it, whether it is good or bad. As the priest evaluates it, so it shall be. +\v 13 But if he will indeed redeem it, then he shall add the fifth part of it to its valuation. +\p +\v 14 “‘When a man dedicates his house to be holy to Yahweh, then the priest shall evaluate it, whether it is good or bad. As the priest evaluates it, so it shall stand. +\v 15 If he who dedicates it will redeem his house, then he shall add the fifth part of the money of your valuation to it, and it shall be his. +\p +\v 16 “‘If a man dedicates to Yahweh part of the field of his possession, then your valuation shall be according to the seed for it. The sowing of a homer\f + \fr 27:16 \ft 1 homer is about 220 liters or 6 bushels\f* of barley shall be valued at fifty shekels\f + \fr 27:16 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver. +\v 17 If he dedicates his field from the Year of Jubilee, according to your valuation it shall stand. +\v 18 But if he dedicates his field after the Jubilee, then the priest shall reckon to him the money according to the years that remain to the Year of Jubilee; and an abatement shall be made from your valuation. +\v 19 If he who dedicated the field will indeed redeem it, then he shall add the fifth part of the money of your valuation to it, and it shall remain his. +\v 20 If he will not redeem the field, or if he has sold the field to another man, it shall not be redeemed any more; +\v 21 but the field, when it goes out in the Jubilee, shall be holy to Yahweh, as a devoted field. It shall be owned by the priests. +\p +\v 22 “‘If he dedicates a field to Yahweh which he has bought, which is not of the field of his possession, +\v 23 then the priest shall reckon to him the worth of your valuation up to the Year of Jubilee; and he shall give your valuation on that day, as a holy thing to Yahweh. +\v 24 In the Year of Jubilee the field shall return to him from whom it was bought, even to him to whom the possession of the land belongs. +\v 25 All your valuations shall be according to the shekel of the sanctuary: twenty gerahs\f + \fr 27:25 \ft A gerah is about 0.5 grams or about 7.7 grains.\f* to the shekel.\f + \fr 27:25 \ft A shekel is about 10 grams or about 0.35 ounces.\f* +\p +\v 26 “‘However the firstborn among animals, which belongs to Yahweh as a firstborn, no man may dedicate, whether an ox or a sheep. It is Yahweh’s. +\v 27 If it is an unclean animal, then he shall buy it back according to your valuation, and shall add to it the fifth part of it; or if it isn’t redeemed, then it shall be sold according to your valuation. +\p +\v 28 “‘Notwithstanding, no devoted thing that a man devotes to Yahweh of all that he has, whether of man or animal, or of the field of his possession, shall be sold or redeemed. Everything that is permanently devoted is most holy to Yahweh. +\p +\v 29 “‘No one devoted to destruction, who shall be devoted from among men, shall be ransomed. He shall surely be put to death. +\p +\v 30 “‘All the tithe of the land, whether of the seed of the land or of the fruit of the trees, is Yahweh’s. It is holy to Yahweh. +\v 31 If a man redeems anything of his tithe, he shall add a fifth part to it. +\v 32 All the tithe of the herds or the flocks, whatever passes under the rod, the tenth shall be holy to Yahweh. +\v 33 He shall not examine whether it is good or bad, neither shall he exchange it. If he exchanges it at all, then both it and that for which it is exchanged shall be holy. It shall not be redeemed.’” +\p +\v 34 These are the commandments which Yahweh commanded Moses for the children of Israel on Mount Sinai. diff --git a/c-sharp/assets/WEB/04NUMengWEBUS.SFM b/c-sharp/assets/WEB/04NUMengWEBUS.SFM new file mode 100644 index 0000000000..6e4fe4ffe0 --- /dev/null +++ b/c-sharp/assets/WEB/04NUMengWEBUS.SFM @@ -0,0 +1,1943 @@ +\id NUM World English Bible (WEB) +\ide UTF-8 +\h Numbers +\toc1 The Fourth Book of Moses, Commonly Called Numbers +\toc2 Numbers +\toc3 Numbers +\mt2 The Fourth Book of Moses, +\mt3 Commonly Called +\mt1 Numbers +\c 1 +\p +\v 1 Yahweh\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* spoke to Moses in the wilderness of Sinai, in the Tent of Meeting, on the first day of the second month, in the second year after they had come out of the land of Egypt, saying, +\v 2 “Take a census of all the congregation of the children of Israel, by their families, by their fathers’ houses, according to the number of the names, every male, one by one, +\v 3 from twenty years old and upward, all who are able to go out to war in Israel. You and Aaron shall count them by their divisions. +\v 4 With you there shall be a man of every tribe, each one head of his fathers’ house. +\v 5 These are the names of the men who shall stand with you: +\p Of Reuben: Elizur the son of Shedeur. +\p +\v 6 Of Simeon: Shelumiel the son of Zurishaddai. +\p +\v 7 Of Judah: Nahshon the son of Amminadab. +\p +\v 8 Of Issachar: Nethanel the son of Zuar. +\p +\v 9 Of Zebulun: Eliab the son of Helon. +\p +\v 10 Of the children of Joseph: of Ephraim: Elishama the son of Ammihud; of Manasseh: Gamaliel the son of Pedahzur. +\p +\v 11 Of Benjamin: Abidan the son of Gideoni. +\p +\v 12 Of Dan: Ahiezer the son of Ammishaddai. +\p +\v 13 Of Asher: Pagiel the son of Ochran. +\p +\v 14 Of Gad: Eliasaph the son of Deuel. +\p +\v 15 Of Naphtali: Ahira the son of Enan.” +\p +\v 16 These are those who were called of the congregation, the princes\f + \fr 1:16 \ft or, chiefs, or, leaders\f* of the tribes of their fathers; they were the heads of the thousands of Israel. +\v 17 Moses and Aaron took these men who are mentioned by name. +\v 18 They assembled all the congregation together on the first day of the second month; and they declared their ancestry by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, one by one. +\v 19 As Yahweh commanded Moses, so he counted them in the wilderness of Sinai. +\p +\v 20 The children of Reuben, Israel’s firstborn, their generations, by their families, by their fathers’ houses, according to the number of the names, one by one, every male from twenty years old and upward, all who were able to go out to war: +\v 21 those who were counted of them, of the tribe of Reuben, were forty-six thousand five hundred. +\p +\v 22 Of the children of Simeon, their generations, by their families, by their fathers’ houses, those who were counted of it, according to the number of the names, one by one, every male from twenty years old and upward, all who were able to go out to war: +\v 23 those who were counted of them, of the tribe of Simeon, were fifty-nine thousand three hundred. +\p +\v 24 Of the children of Gad, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 25 those who were counted of them, of the tribe of Gad, were forty-five thousand six hundred fifty. +\p +\v 26 Of the children of Judah, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 27 those who were counted of them, of the tribe of Judah, were seventy-four thousand six hundred. +\p +\v 28 Of the children of Issachar, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 29 those who were counted of them, of the tribe of Issachar, were fifty-four thousand four hundred. +\p +\v 30 Of the children of Zebulun, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 31 those who were counted of them, of the tribe of Zebulun, were fifty-seven thousand four hundred. +\p +\v 32 Of the children of Joseph: of the children of Ephraim, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 33 those who were counted of them, of the tribe of Ephraim, were forty thousand five hundred. +\p +\v 34 Of the children of Manasseh, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 35 those who were counted of them, of the tribe of Manasseh, were thirty-two thousand two hundred. +\p +\v 36 Of the children of Benjamin, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 37 those who were counted of them, of the tribe of Benjamin, were thirty-five thousand four hundred. +\p +\v 38 Of the children of Dan, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 39 those who were counted of them, of the tribe of Dan, were sixty-two thousand seven hundred. +\p +\v 40 Of the children of Asher, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 41 those who were counted of them, of the tribe of Asher, were forty-one thousand five hundred. +\p +\v 42 Of the children of Naphtali, their generations, by their families, by their fathers’ houses, according to the number of the names, from twenty years old and upward, all who were able to go out to war: +\v 43 those who were counted of them, of the tribe of Naphtali, were fifty-three thousand four hundred. +\p +\v 44 These are those who were counted, whom Moses and Aaron counted, and the twelve men who were princes of Israel, each one for his fathers’ house. +\v 45 So all those who were counted of the children of Israel by their fathers’ houses, from twenty years old and upward, all who were able to go out to war in Israel— +\v 46 all those who were counted were six hundred three thousand five hundred fifty. +\v 47 But the Levites after the tribe of their fathers were not counted among them. +\v 48 For Yahweh spoke to Moses, saying, +\v 49 “Only the tribe of Levi you shall not count, neither shall you take a census of them among the children of Israel; +\v 50 but appoint the Levites over the Tabernacle of the Testimony, and over all its furnishings, and over all that belongs to it. They shall carry the tabernacle and all its furnishings; and they shall take care of it, and shall encamp around it. +\v 51 When the tabernacle is to move, the Levites shall take it down; and when the tabernacle is to be set up, the Levites shall set it up. The stranger who comes near shall be put to death. +\v 52 The children of Israel shall pitch their tents, every man by his own camp, and every man by his own standard, according to their divisions. +\v 53 But the Levites shall encamp around the Tabernacle of the Testimony, that there may be no wrath on the congregation of the children of Israel. The Levites shall be responsible for the Tabernacle of the Testimony.” +\p +\v 54 Thus the children of Israel did. According to all that Yahweh commanded Moses, so they did. +\c 2 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying, +\v 2 “The children of Israel shall encamp every man by his own standard, with the banners of their fathers’ houses. They shall encamp around the Tent of Meeting at a distance from it. +\p +\v 3 “Those who encamp on the east side toward the sunrise shall be of the standard of the camp of Judah, according to their divisions. The prince of the children of Judah shall be Nahshon the son of Amminadab. +\v 4 His division, and those who were counted of them, were seventy-four thousand six hundred. +\p +\v 5 “Those who encamp next to him shall be the tribe of Issachar. The prince of the children of Issachar shall be Nethanel the son of Zuar. +\v 6 His division, and those who were counted of it, were fifty-four thousand four hundred. +\p +\v 7 “The tribe of Zebulun: the prince of the children of Zebulun shall be Eliab the son of Helon. +\v 8 His division, and those who were counted of it, were fifty-seven thousand four hundred. +\p +\v 9 “All who were counted of the camp of Judah were one hundred eighty-six thousand four hundred, according to their divisions. They shall set out first. +\p +\v 10 “On the south side shall be the standard of the camp of Reuben according to their divisions. The prince of the children of Reuben shall be Elizur the son of Shedeur. +\v 11 His division, and those who were counted of it, were forty-six thousand five hundred. +\p +\v 12 “Those who encamp next to him shall be the tribe of Simeon. The prince of the children of Simeon shall be Shelumiel the son of Zurishaddai. +\v 13 His division, and those who were counted of them, were fifty-nine thousand three hundred. +\p +\v 14 “The tribe of Gad: the prince of the children of Gad shall be Eliasaph the son of Reuel. +\v 15 His division, and those who were counted of them, were forty-five thousand six hundred fifty. +\p +\v 16 “All who were counted of the camp of Reuben were one hundred fifty-one thousand four hundred fifty, according to their armies. They shall set out second. +\p +\v 17 “Then the Tent of Meeting shall set out, with the camp of the Levites in the middle of the camps. As they encamp, so shall they set out, every man in his place, by their standards. +\p +\v 18 “On the west side shall be the standard of the camp of Ephraim according to their divisions. The prince of the children of Ephraim shall be Elishama the son of Ammihud. +\v 19 His division, and those who were counted of them, were forty thousand five hundred. +\p +\v 20 “Next to him shall be the tribe of Manasseh. The prince of the children of Manasseh shall be Gamaliel the son of Pedahzur. +\v 21 His division, and those who were counted of them, were thirty-two thousand two hundred. +\p +\v 22 “The tribe of Benjamin: the prince of the children of Benjamin shall be Abidan the son of Gideoni. +\v 23 His army, and those who were counted of them, were thirty-five thousand four hundred. +\p +\v 24 “All who were counted of the camp of Ephraim were one hundred eight thousand one hundred, according to their divisions. They shall set out third. +\p +\v 25 “On the north side shall be the standard of the camp of Dan according to their divisions. The prince of the children of Dan shall be Ahiezer the son of Ammishaddai. +\v 26 His division, and those who were counted of them, were sixty-two thousand seven hundred. +\p +\v 27 “Those who encamp next to him shall be the tribe of Asher. The prince of the children of Asher shall be Pagiel the son of Ochran. +\v 28 His division, and those who were counted of them, were forty-one thousand five hundred. +\p +\v 29 “The tribe of Naphtali: the prince of the children of Naphtali shall be Ahira the son of Enan. +\v 30 His division, and those who were counted of them, were fifty-three thousand four hundred. +\p +\v 31 “All who were counted of the camp of Dan were one hundred fifty-seven thousand six hundred. They shall set out last by their standards.” +\p +\v 32 These are those who were counted of the children of Israel by their fathers’ houses. All who were counted of the camps according to their armies were six hundred three thousand five hundred fifty. +\v 33 But the Levites were not counted among the children of Israel, as Yahweh commanded Moses. +\p +\v 34 Thus the children of Israel did. According to all that Yahweh commanded Moses, so they encamped by their standards, and so they set out, everyone by their families, according to their fathers’ houses. +\c 3 +\p +\v 1 Now this is the history of the generations of Aaron and Moses in the day that Yahweh spoke with Moses in Mount Sinai. +\v 2 These are the names of the sons of Aaron: Nadab the firstborn, and Abihu, Eleazar, and Ithamar. +\p +\v 3 These are the names of the sons of Aaron, the priests who were anointed, whom he consecrated to minister in the priest’s office. +\v 4 Nadab and Abihu died before Yahweh when they offered strange fire before Yahweh in the wilderness of Sinai, and they had no children. Eleazar and Ithamar ministered in the priest’s office in the presence of Aaron their father. +\p +\v 5 Yahweh spoke to Moses, saying, +\v 6 “Bring the tribe of Levi near, and set them before Aaron the priest, that they may minister to him. +\v 7 They shall keep his requirements, and the requirements of the whole congregation before the Tent of Meeting, to do the service of the tabernacle. +\v 8 They shall keep all the furnishings of the Tent of Meeting, and the obligations of the children of Israel, to do the service of the tabernacle. +\v 9 You shall give the Levites to Aaron and to his sons. They are wholly given to him on the behalf of the children of Israel. +\v 10 You shall appoint Aaron and his sons, and they shall keep their priesthood, but the stranger who comes near shall be put to death.” +\p +\v 11 Yahweh spoke to Moses, saying, +\v 12 “Behold,\f + \fr 3:12 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I have taken the Levites from among the children of Israel instead of all the firstborn who open the womb among the children of Israel; and the Levites shall be mine, +\v 13 for all the firstborn are mine. On the day that I struck down all the firstborn in the land of Egypt I made holy to me all the firstborn in Israel, both man and animal. They shall be mine. I am Yahweh.” +\p +\v 14 Yahweh spoke to Moses in the wilderness of Sinai, saying, +\v 15 “Count the children of Levi by their fathers’ houses, by their families. You shall count every male from a month old and upward.” +\p +\v 16 Moses counted them according to Yahweh’s word, as he was commanded. +\p +\v 17 These were the sons of Levi by their names: Gershon, Kohath, and Merari. +\p +\v 18 These are the names of the sons of Gershon by their families: Libni and Shimei. +\p +\v 19 The sons of Kohath by their families: Amram, Izhar, Hebron, and Uzziel. +\p +\v 20 The sons of Merari by their families: Mahli and Mushi. +\p These are the families of the Levites according to their fathers’ houses. +\p +\v 21 Of Gershon was the family of the Libnites, and the family of the Shimeites. These are the families of the Gershonites. +\p +\v 22 Those who were counted of them, according to the number of all the males from a month old and upward, even those who were counted of them were seven thousand five hundred. +\p +\v 23 The families of the Gershonites shall encamp behind the tabernacle westward. +\p +\v 24 Eliasaph the son of Lael shall be the prince of the fathers’ house of the Gershonites. +\v 25 The duty of the sons of Gershon in the Tent of Meeting shall be the tabernacle, the tent, its covering, the screen for the door of the Tent of Meeting, +\v 26 the hangings of the court, the screen for the door of the court which is by the tabernacle and around the altar, and its cords for all of its service. +\p +\v 27 Of Kohath was the family of the Amramites, the family of the Izharites, the family of the Hebronites, and the family of the Uzzielites. These are the families of the Kohathites. +\v 28 According to the number of all the males from a month old and upward, there were eight thousand six hundred keeping the requirements of the sanctuary. +\p +\v 29 The families of the sons of Kohath shall encamp on the south side of the tabernacle. +\v 30 The prince of the fathers’ house of the families of the Kohathites shall be Elizaphan the son of Uzziel. +\v 31 Their duty shall be the ark, the table, the lamp stand, the altars, the vessels of the sanctuary with which they minister, the screen, and all its service. +\v 32 Eleazar the son of Aaron the priest shall be prince of the princes of the Levites, with the oversight of those who keep the requirements of the sanctuary. +\p +\v 33 Of Merari was the family of the Mahlites and the family of the Mushites. These are the families of Merari. +\v 34 Those who were counted of them, according to the number of all the males from a month old and upward, were six thousand two hundred.\f + \fr 3:34 \ft + 22,000 is the sum rounded to 2 significant digits. The sum of the Gershonites, Kohathites, and Merarites given above is 22,300, but the traditional Hebrew text has the number rounded to 2 significant digits, not 3 significant digits.\f* +\p +\v 35 The prince of the fathers’ house of the families of Merari was Zuriel the son of Abihail. They shall encamp on the north side of the tabernacle. +\v 36 The appointed duty of the sons of Merari shall be the tabernacle’s boards, its bars, its pillars, its sockets, all its instruments, all its service, +\v 37 the pillars of the court around it, their sockets, their pins, and their cords. +\p +\v 38 Those who encamp before the tabernacle eastward, in front of the Tent of Meeting toward the sunrise, shall be Moses, with Aaron and his sons, keeping the requirements of the sanctuary for the duty of the children of Israel. The outsider who comes near shall be put to death. +\v 39 All who were counted of the Levites, whom Moses and Aaron counted at the commandment of Yahweh, by their families, all the males from a month old and upward, were twenty-two thousand. +\p +\v 40 Yahweh said to Moses, “Count all the firstborn males of the children of Israel from a month old and upward, and take the number of their names. +\v 41 You shall take the Levites for me—I am Yahweh—instead of all the firstborn among the children of Israel; and the livestock of the Levites instead of all the firstborn among the livestock of the children of Israel.” +\p +\v 42 Moses counted, as Yahweh commanded him, all the firstborn among the children of Israel. +\v 43 All the firstborn males according to the number of names from a month old and upward, of those who were counted of them, were twenty-two thousand two hundred seventy-three. +\p +\v 44 Yahweh spoke to Moses, saying, +\v 45 “Take the Levites instead of all the firstborn among the children of Israel, and the livestock of the Levites instead of their livestock; and the Levites shall be mine. I am Yahweh. +\v 46 For the redemption of the two hundred seventy-three of the firstborn of the children of Israel who exceed the number of the Levites, +\v 47 you shall take five shekels apiece for each one; according to the shekel\f + \fr 3:47 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary you shall take them (the shekel is twenty gerahs\f + \fr 3:47 \ft A gerah is about 0.5 grams or about 7.7 grains.\f*); +\v 48 and you shall give the money, with which their remainder is redeemed, to Aaron and to his sons.” +\p +\v 49 Moses took the redemption money from those who exceeded the number of those who were redeemed by the Levites; +\v 50 from the firstborn of the children of Israel he took the money, one thousand three hundred sixty-five shekels,\f + \fr 3:50 \ft A shekel is about 10 grams or about 0.35 ounces, so 1365 shekels is about 13.65 kilograms or about 30 pounds.\f* according to the shekel of the sanctuary; +\v 51 and Moses gave the redemption money to Aaron and to his sons, according to Yahweh’s word, as Yahweh commanded Moses. +\c 4 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying, +\v 2 “Take a census of the sons of Kohath from among the sons of Levi, by their families, by their fathers’ houses, +\v 3 from thirty years old and upward even until fifty years old, all who enter into the service to do the work in the Tent of Meeting. +\p +\v 4 “This is the service of the sons of Kohath in the Tent of Meeting, regarding the most holy things. +\v 5 When the camp moves forward, Aaron shall go in with his sons; and they shall take down the veil of the screen, cover the ark of the Testimony with it, +\v 6 put a covering of sealskin on it, spread a blue cloth over it, and put in its poles. +\p +\v 7 “On the table of show bread they shall spread a blue cloth, and put on it the dishes, the spoons, the bowls, and the cups with which to pour out; and the continual bread shall be on it. +\v 8 They shall spread on them a scarlet cloth, and cover it with a covering of sealskin, and shall put in its poles. +\p +\v 9 “They shall take a blue cloth and cover the lamp stand of the light, its lamps, its snuffers, its snuff dishes, and all its oil vessels, with which they minister to it. +\v 10 They shall put it and all its vessels within a covering of sealskin, and shall put it on the frame. +\p +\v 11 “On the golden altar they shall spread a blue cloth, and cover it with a covering of sealskin, and shall put in its poles. +\p +\v 12 “They shall take all the vessels of ministry with which they minister in the sanctuary, and put them in a blue cloth, cover them with a covering of sealskin, and shall put them on the frame. +\p +\v 13 “They shall take away the ashes from the altar, and spread a purple cloth on it. +\v 14 They shall put on it all its vessels with which they minister about it, the fire pans, the meat hooks, the shovels, and the basins—all the vessels of the altar; and they shall spread on it a covering of sealskin, and put in its poles. +\p +\v 15 “When Aaron and his sons have finished covering the sanctuary and all the furniture of the sanctuary, as the camp moves forward; after that, the sons of Kohath shall come to carry it; but they shall not touch the sanctuary, lest they die. The sons of Kohath shall carry these things belonging to the Tent of Meeting. +\p +\v 16 “The duty of Eleazar the son of Aaron the priest shall be the oil for the light, the sweet incense, the continual meal offering, and the anointing oil, the requirements of all the tabernacle, and of all that is in it, the sanctuary, and its furnishings.” +\p +\v 17 Yahweh spoke to Moses and to Aaron, saying, +\v 18 “Don’t cut off the tribe of the families of the Kohathites from among the Levites; +\v 19 but do this to them, that they may live, and not die, when they approach the most holy things: Aaron and his sons shall go in and appoint everyone to his service and to his burden; +\v 20 but they shall not go in to see the sanctuary even for a moment, lest they die.” +\p +\v 21 Yahweh spoke to Moses, saying, +\v 22 “Take a census of the sons of Gershon also, by their fathers’ houses, by their families; +\v 23 you shall count them from thirty years old and upward until fifty years old: all who enter in to wait on the service, to do the work in the Tent of Meeting. +\p +\v 24 “This is the service of the families of the Gershonites, in serving and in bearing burdens: +\v 25 they shall carry the curtains of the tabernacle and the Tent of Meeting, its covering, the covering of sealskin that is on it, the screen for the door of the Tent of Meeting, +\v 26 the hangings of the court, the screen for the door of the gate of the court which is by the tabernacle and around the altar, their cords, and all the instruments of their service, and whatever shall be done with them. They shall serve in there. +\v 27 At the commandment of Aaron and his sons shall be all the service of the sons of the Gershonites, in all their burden and in all their service; and you shall appoint their duty to them in all their responsibilities. +\v 28 This is the service of the families of the sons of the Gershonites in the Tent of Meeting. Their duty shall be under the hand of Ithamar the son of Aaron the priest. +\p +\v 29 “As for the sons of Merari, you shall count them by their families, by their fathers’ houses; +\v 30 you shall count them from thirty years old and upward even to fifty years old—everyone who enters on the service, to do the work of the Tent of Meeting. +\v 31 This is the duty of their burden, according to all their service in the Tent of Meeting: the tabernacle’s boards, its bars, its pillars, its sockets, +\v 32 the pillars of the court around it, their sockets, their pins, their cords, with all their instruments, and with all their service. You shall appoint the instruments of the duty of their burden to them by name. +\v 33 This is the service of the families of the sons of Merari, according to all their service in the Tent of Meeting, under the hand of Ithamar the son of Aaron the priest.” +\p +\v 34 Moses and Aaron and the princes of the congregation counted the sons of the Kohathites by their families, and by their fathers’ houses, +\v 35 from thirty years old and upward even to fifty years old, everyone who entered into the service for work in the Tent of Meeting. +\v 36 Those who were counted of them by their families were two thousand seven hundred fifty. +\v 37 These are those who were counted of the families of the Kohathites, all who served in the Tent of Meeting, whom Moses and Aaron counted according to the commandment of Yahweh by Moses. +\p +\v 38 Those who were counted of the sons of Gershon, by their families, and by their fathers’ houses, +\v 39 from thirty years old and upward even to fifty years old—everyone who entered into the service for work in the Tent of Meeting, +\v 40 even those who were counted of them, by their families, by their fathers’ houses, were two thousand six hundred thirty. +\v 41 These are those who were counted of the families of the sons of Gershon, all who served in the Tent of Meeting, whom Moses and Aaron counted according to the commandment of Yahweh. +\p +\v 42 Those who were counted of the families of the sons of Merari, by their families, by their fathers’ houses, +\v 43 from thirty years old and upward even to fifty years old—everyone who entered into the service for work in the Tent of Meeting, +\v 44 even those who were counted of them by their families, were three thousand two hundred. +\v 45 These are those who were counted of the families of the sons of Merari, whom Moses and Aaron counted according to the commandment of Yahweh by Moses. +\p +\v 46 All those who were counted of the Levites whom Moses and Aaron and the princes of Israel counted, by their families and by their fathers’ houses, +\v 47 from thirty years old and upward even to fifty years old, everyone who entered in to do the work of service and the work of bearing burdens in the Tent of Meeting, +\v 48 even those who were counted of them, were eight thousand five hundred eighty. +\v 49 According to the commandment of Yahweh they were counted by Moses, everyone according to his service and according to his burden. Thus they were counted by him, as Yahweh commanded Moses. +\c 5 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Command the children of Israel that they put out of the camp every leper, everyone who has a discharge, and whoever is unclean by a corpse. +\v 3 You shall put both male and female outside of the camp so that they don’t defile their camp, in the midst of which I dwell.” +\p +\v 4 The children of Israel did so, and put them outside of the camp; as Yahweh spoke to Moses, so the children of Israel did. +\p +\v 5 Yahweh spoke to Moses, saying, +\v 6 “Speak to the children of Israel: ‘When a man or woman commits any sin that men commit, so as to trespass against Yahweh, and that soul is guilty, +\v 7 then he shall confess his sin which he has done; and he shall make restitution for his guilt in full, add to it the fifth part of it, and give it to him in respect of whom he has been guilty. +\v 8 But if the man has no kinsman to whom restitution may be made for the guilt, the restitution for guilt which is made to Yahweh shall be the priest’s, in addition to the ram of the atonement, by which atonement shall be made for him. +\v 9 Every heave offering of all the holy things of the children of Israel, which they present to the priest, shall be his. +\v 10 Every man’s holy things shall be his; whatever any man gives the priest, it shall be his.’” +\p +\v 11 Yahweh spoke to Moses, saying, +\v 12 “Speak to the children of Israel, and tell them: ‘If any man’s wife goes astray and is unfaithful to him, +\v 13 and a man lies with her carnally, and it is hidden from the eyes of her husband and this is kept concealed, and she is defiled, there is no witness against her, and she isn’t taken in the act; +\v 14 and the spirit of jealousy comes on him, and he is jealous of his wife and she is defiled; or if the spirit of jealousy comes on him, and he is jealous of his wife and she isn’t defiled; +\v 15 then the man shall bring his wife to the priest, and shall bring her offering for her: one tenth of an ephah\f + \fr 5:15 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of barley meal. He shall pour no oil on it, nor put frankincense on it, for it is a meal offering of jealousy, a meal offering of memorial, bringing iniquity to memory. +\v 16 The priest shall bring her near, and set her before Yahweh. +\v 17 The priest shall take holy water in an earthen vessel; and the priest shall take some of the dust that is on the floor of the tabernacle and put it into the water. +\v 18 The priest shall set the woman before Yahweh, and let the hair of the woman’s head go loose, and put the meal offering of memorial in her hands, which is the meal offering of jealousy. The priest shall have in his hand the water of bitterness that brings a curse. +\v 19 The priest shall cause her to take an oath and shall tell the woman, “If no man has lain with you, and if you haven’t gone aside to uncleanness, being under your husband’s authority, be free from this water of bitterness that brings a curse. +\v 20 But if you have gone astray, being under your husband’s authority, and if you are defiled, and some man has lain with you besides your husband—” +\v 21 then the priest shall cause the woman to swear with the oath of cursing, and the priest shall tell the woman, “May Yahweh make you a curse and an oath among your people, when Yahweh allows your thigh to fall away, and your body to swell; +\v 22 and this water that brings a curse will go into your bowels, and make your body swell, and your thigh fall away.” The woman shall say, “Amen, Amen.” +\p +\v 23 “‘The priest shall write these curses in a book, and he shall wipe them into the water of bitterness. +\v 24 He shall make the woman drink the water of bitterness that causes the curse; and the water that causes the curse shall enter into her and become bitter. +\v 25 The priest shall take the meal offering of jealousy out of the woman’s hand, and shall wave the meal offering before Yahweh, and bring it to the altar. +\v 26 The priest shall take a handful of the meal offering, as its memorial portion, and burn it on the altar, and afterward shall make the woman drink the water. +\v 27 When he has made her drink the water, then it shall happen, if she is defiled and has committed a trespass against her husband, that the water that causes the curse will enter into her and become bitter, and her body will swell, and her thigh will fall away; and the woman will be a curse among her people. +\v 28 If the woman isn’t defiled, but is clean; then she shall be free, and shall conceive offspring.\f + \fr 5:28 \ft or, seed\f* +\p +\v 29 “‘This is the law of jealousy, when a wife, being under her husband, goes astray, and is defiled, +\v 30 or when the spirit of jealousy comes on a man, and he is jealous of his wife; then he shall set the woman before Yahweh, and the priest shall execute on her all this law. +\v 31 The man shall be free from iniquity, and that woman shall bear her iniquity.’” +\c 6 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, and tell them: ‘When either man or woman shall make a special vow, the vow of a Nazirite, to separate himself to Yahweh, +\v 3 he shall separate himself from wine and strong drink. He shall drink no vinegar of wine, or vinegar of fermented drink, neither shall he drink any juice of grapes, nor eat fresh grapes or dried. +\v 4 All the days of his separation he shall eat nothing that is made of the grapevine, from the seeds even to the skins. +\p +\v 5 “‘All the days of his vow of separation no razor shall come on his head, until the days are fulfilled in which he separates himself to Yahweh. He shall be holy. He shall let the locks of the hair of his head grow long. +\p +\v 6 “‘All the days that he separates himself to Yahweh he shall not go near a dead body. +\v 7 He shall not make himself unclean for his father, or for his mother, for his brother, or for his sister, when they die, because his separation to God\f + \fr 6:7 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* is on his head. +\v 8 All the days of his separation he is holy to Yahweh. +\p +\v 9 “‘If any man dies very suddenly beside him, and he defiles the head of his separation, then he shall shave his head in the day of his cleansing. On the seventh day he shall shave it. +\v 10 On the eighth day he shall bring two turtledoves or two young pigeons to the priest, to the door of the Tent of Meeting. +\v 11 The priest shall offer one for a sin offering, and the other for a burnt offering, and make atonement for him, because he sinned by reason of the dead, and shall make his head holy that same day. +\v 12 He shall separate to Yahweh the days of his separation, and shall bring a male lamb a year old for a trespass offering; but the former days shall be void, because his separation was defiled. +\p +\v 13 “‘This is the law of the Nazirite: when the days of his separation are fulfilled, he shall be brought to the door of the Tent of Meeting, +\v 14 and he shall offer his offering to Yahweh: one male lamb a year old without defect for a burnt offering, one ewe lamb a year old without defect for a sin offering, one ram without defect for peace offerings, +\v 15 a basket of unleavened bread, cakes of fine flour mixed with oil, and unleavened wafers anointed with oil with their meal offering and their drink offerings. +\v 16 The priest shall present them before Yahweh, and shall offer his sin offering and his burnt offering. +\v 17 He shall offer the ram for a sacrifice of peace offerings to Yahweh, with the basket of unleavened bread. The priest shall offer also its meal offering and its drink offering. +\v 18 The Nazirite shall shave the head of his separation at the door of the Tent of Meeting, take the hair of the head of his separation, and put it on the fire which is under the sacrifice of peace offerings. +\v 19 The priest shall take the boiled shoulder of the ram, one unleavened cake out of the basket, and one unleavened wafer, and shall put them on the hands of the Nazirite after he has shaved the head of his separation; +\v 20 and the priest shall wave them for a wave offering before Yahweh. They are holy for the priest, together with the breast that is waved and the thigh that is offered. After that the Nazirite may drink wine. +\p +\v 21 “‘This is the law of the Nazirite who vows and of his offering to Yahweh for his separation, in addition to that which he is able to afford. According to his vow which he vows, so he must do after the law of his separation.’” +\p +\v 22 Yahweh spoke to Moses, saying, +\v 23 “Speak to Aaron and to his sons, saying, ‘This is how you shall bless the children of Israel.’ You shall tell them, +\q1 +\v 24 ‘Yahweh bless you, and keep you. +\q2 +\v 25 Yahweh make his face to shine on you, +\q2 and be gracious to you. +\q1 +\v 26 Yahweh lift up his face toward you, +\q2 and give you peace.’ +\p +\v 27 “So they shall put my name on the children of Israel; and I will bless them.” +\c 7 +\p +\v 1 On the day that Moses had finished setting up the tabernacle, and had anointed it and sanctified it with all its furniture, and the altar with all its vessels, and had anointed and sanctified them; +\v 2 the princes of Israel, the heads of their fathers’ houses, gave offerings. These were the princes of the tribes. These are they who were over those who were counted; +\v 3 and they brought their offering before Yahweh, six covered wagons and twelve oxen; a wagon for every two of the princes, and for each one an ox. They presented them before the tabernacle. +\v 4 Yahweh spoke to Moses, saying, +\v 5 “Accept these from them, that they may be used in doing the service of the Tent of Meeting; and you shall give them to the Levites, to every man according to his service.” +\p +\v 6 Moses took the wagons and the oxen, and gave them to the Levites. +\v 7 He gave two wagons and four oxen to the sons of Gershon, according to their service. +\v 8 He gave four wagons and eight oxen to the sons of Merari, according to their service, under the direction of Ithamar the son of Aaron the priest. +\v 9 But to the sons of Kohath he gave none, because the service of the sanctuary belonged to them; they carried it on their shoulders. +\p +\v 10 The princes gave offerings for the dedication of the altar in the day that it was anointed. The princes gave their offerings before the altar. +\p +\v 11 Yahweh said to Moses, “They shall offer their offering, each prince on his day, for the dedication of the altar.” +\p +\v 12 He who offered his offering the first day was Nahshon the son of Amminadab, of the tribe of Judah, +\v 13 and his offering was: +\p one silver platter, the weight of which was one hundred thirty shekels,\f + \fr 7:13 \ft A shekel is about 10 grams or about 0.35 ounces.\f* +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 14 one golden ladle of ten shekels, full of incense; +\p +\v 15 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 16 one male goat for a sin offering; +\p +\v 17 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Nahshon the son of Amminadab. +\p +\v 18 On the second day Nethanel the son of Zuar, prince of Issachar, gave his offering. +\v 19 He offered for his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 20 one golden ladle of ten shekels, full of incense; +\p +\v 21 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 22 one male goat for a sin offering; +\p +\v 23 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, five male lambs a year old. This was the offering of Nethanel the son of Zuar. +\p +\v 24 On the third day Eliab the son of Helon, prince of the children of Zebulun, +\v 25 gave his offering: +\p one silver platter, the weight of which was a hundred and thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 26 one golden ladle of ten shekels, full of incense; +\p +\v 27 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 28 one male goat for a sin offering; +\p +\v 29 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Eliab the son of Helon. +\p +\v 30 On the fourth day Elizur the son of Shedeur, prince of the children of Reuben, +\v 31 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 32 one golden ladle of ten shekels, full of incense; +\p +\v 33 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 34 one male goat for a sin offering; +\p +\v 35 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Elizur the son of Shedeur. +\p +\v 36 On the fifth day Shelumiel the son of Zurishaddai, prince of the children of Simeon, +\v 37 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 38 one golden ladle of ten shekels, full of incense; +\p +\v 39 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 40 one male goat for a sin offering; +\p +\v 41 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old: this was the offering of Shelumiel the son of Zurishaddai. +\p +\v 42 On the sixth day, Eliasaph the son of Deuel, prince of the children of Gad, +\v 43 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 44 one golden ladle of ten shekels, full of incense; +\p +\v 45 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 46 one male goat for a sin offering; +\p +\v 47 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Eliasaph the son of Deuel. +\p +\v 48 On the seventh day Elishama the son of Ammihud, prince of the children of Ephraim, +\v 49 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 50 one golden ladle of ten shekels, full of incense; +\p +\v 51 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 52 one male goat for a sin offering; +\p +\v 53 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Elishama the son of Ammihud. +\p +\v 54 On the eighth day Gamaliel the son of Pedahzur, prince of the children of Manasseh, +\v 55 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 56 one golden ladle of ten shekels, full of incense; +\p +\v 57 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 58 one male goat for a sin offering; +\p +\v 59 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Gamaliel the son of Pedahzur. +\p +\v 60 On the ninth day Abidan the son of Gideoni, prince of the children of Benjamin, +\v 61 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 62 one golden ladle of ten shekels, full of incense; +\p +\v 63 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 64 one male goat for a sin offering; +\p +\v 65 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Abidan the son of Gideoni. +\p +\v 66 On the tenth day Ahiezer the son of Ammishaddai, prince of the children of Dan, +\v 67 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 68 one golden ladle of ten shekels, full of incense; +\p +\v 69 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 70 one male goat for a sin offering; +\p +\v 71 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Ahiezer the son of Ammishaddai. +\p +\v 72 On the eleventh day Pagiel the son of Ochran, prince of the children of Asher, +\v 73 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 74 one golden ladle of ten shekels, full of incense; +\p +\v 75 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 76 one male goat for a sin offering; +\p +\v 77 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Pagiel the son of Ochran. +\p +\v 78 On the twelfth day Ahira the son of Enan, prince of the children of Naphtali, +\v 79 gave his offering: +\p one silver platter, the weight of which was one hundred thirty shekels, +\p one silver bowl of seventy shekels, according to the shekel of the sanctuary, both of them full of fine flour mixed with oil for a meal offering; +\p +\v 80 one golden ladle of ten shekels, full of incense; +\p +\v 81 one young bull, +\p one ram, +\p one male lamb a year old, for a burnt offering; +\p +\v 82 one male goat for a sin offering; +\p +\v 83 and for the sacrifice of peace offerings, two head of cattle, five rams, five male goats, and five male lambs a year old. This was the offering of Ahira the son of Enan. +\p +\v 84 This was the dedication offering of the altar, on the day when it was anointed, by the princes of Israel: twelve silver platters, twelve silver bowls, twelve golden ladles; +\v 85 each silver platter weighing one hundred thirty shekels, and each bowl seventy; all the silver of the vessels two thousand four hundred shekels, according to the shekel of the sanctuary; +\v 86 the twelve golden ladles, full of incense, weighing ten shekels apiece, according to the shekel of the sanctuary; all the gold of the ladles weighed one hundred twenty shekels; +\v 87 all the cattle for the burnt offering twelve bulls, the rams twelve, the male lambs a year old twelve, and their meal offering; and twelve male goats for a sin offering; +\v 88 and all the cattle for the sacrifice of peace offerings: twenty-four bulls, sixty rams, sixty male goats, and sixty male lambs a year old. This was the dedication offering of the altar, after it was anointed. +\p +\v 89 When Moses went into the Tent of Meeting to speak with Yahweh, he heard his voice speaking to him from above the mercy seat that was on the ark of the Testimony, from between the two cherubim; and he spoke to him. +\c 8 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to Aaron, and tell him, ‘When you light the lamps, the seven lamps shall give light in front of the lamp stand.’” +\p +\v 3 Aaron did so. He lit its lamps to light the area in front of the lamp stand, as Yahweh commanded Moses. +\v 4 This was the workmanship of the lamp stand, beaten work of gold. From its base to its flowers, it was beaten work. He made the lamp stand according to the pattern which Yahweh had shown Moses. +\p +\v 5 Yahweh spoke to Moses, saying, +\v 6 “Take the Levites from among the children of Israel, and cleanse them. +\v 7 You shall do this to them to cleanse them: sprinkle the water of cleansing on them, let them shave their whole bodies with a razor, let them wash their clothes, and cleanse themselves. +\v 8 Then let them take a young bull and its meal offering, fine flour mixed with oil; and another young bull you shall take for a sin offering. +\v 9 You shall present the Levites before the Tent of Meeting. You shall assemble the whole congregation of the children of Israel. +\v 10 You shall present the Levites before Yahweh. The children of Israel shall lay their hands on the Levites, +\v 11 and Aaron shall offer the Levites before Yahweh for a wave offering on the behalf of the children of Israel, that it may be theirs to do the service of Yahweh. +\p +\v 12 “The Levites shall lay their hands on the heads of the bulls, and you shall offer the one for a sin offering and the other for a burnt offering to Yahweh, to make atonement for the Levites. +\v 13 You shall set the Levites before Aaron and before his sons, and offer them as a wave offering to Yahweh. +\v 14 Thus you shall separate the Levites from among the children of Israel, and the Levites shall be mine. +\p +\v 15 “After that, the Levites shall go in to do the service of the Tent of Meeting. You shall cleanse them, and offer them as a wave offering. +\v 16 For they are wholly given to me from among the children of Israel; instead of all who open the womb, even the firstborn of all the children of Israel, I have taken them to me. +\v 17 For all the firstborn among the children of Israel are mine, both man and animal. On the day that I struck all the firstborn in the land of Egypt, I sanctified them for myself. +\v 18 I have taken the Levites instead of all the firstborn among the children of Israel. +\v 19 I have given the Levites as a gift to Aaron and to his sons from among the children of Israel, to do the service of the children of Israel in the Tent of Meeting, and to make atonement for the children of Israel, so that there will be no plague among the children of Israel when the children of Israel come near to the sanctuary.” +\p +\v 20 Moses, and Aaron, and all the congregation of the children of Israel did so to the Levites. According to all that Yahweh commanded Moses concerning the Levites, so the children of Israel did to them. +\v 21 The Levites purified themselves from sin, and they washed their clothes; and Aaron offered them for a wave offering before Yahweh and Aaron made atonement for them to cleanse them. +\v 22 After that, the Levites went in to do their service in the Tent of Meeting before Aaron and before his sons: as Yahweh had commanded Moses concerning the Levites, so they did to them. +\p +\v 23 Yahweh spoke to Moses, saying, +\v 24 “This is what is assigned to the Levites: from twenty-five years old and upward they shall go in to wait on the service in the work of the Tent of Meeting; +\v 25 and from the age of fifty years they shall retire from doing the work, and shall serve no more, +\v 26 but shall assist their brothers in the Tent of Meeting, to perform the duty, and shall perform no service. This is how you shall have the Levites do their duties.” +\c 9 +\p +\v 1 Yahweh spoke to Moses in the wilderness of Sinai, in the first month of the second year after they had come out of the land of Egypt, saying, +\v 2 “Let the children of Israel keep the Passover in its appointed season. +\v 3 On the fourteenth day of this month, at evening, you shall keep it in its appointed season. You shall keep it according to all its statutes and according to all its ordinances.” +\p +\v 4 Moses told the children of Israel that they should keep the Passover. +\v 5 They kept the Passover in the first month, on the fourteenth day of the month at evening, in the wilderness of Sinai. According to all that Yahweh commanded Moses, so the children of Israel did. +\v 6 There were certain men who were unclean because of the dead body of a man, so that they could not keep the Passover on that day, and they came before Moses and Aaron on that day. +\v 7 Those men said to him, “We are unclean because of the dead body of a man. Why are we kept back, that we may not offer the offering of Yahweh in its appointed season among the children of Israel?” +\p +\v 8 Moses answered them, “Wait, that I may hear what Yahweh will command concerning you.” +\p +\v 9 Yahweh spoke to Moses, saying, +\v 10 “Say to the children of Israel, ‘If any man of you or of your generations is unclean by reason of a dead body, or is on a journey far away, he shall still keep the Passover to Yahweh. +\v 11 In the second month, on the fourteenth day at evening they shall keep it; they shall eat it with unleavened bread and bitter herbs. +\v 12 They shall leave none of it until the morning, nor break a bone of it. According to all the statute of the Passover they shall keep it. +\v 13 But the man who is clean, and is not on a journey, and fails to keep the Passover, that soul shall be cut off from his people. Because he didn’t offer the offering of Yahweh in its appointed season, that man shall bear his sin. +\p +\v 14 “‘If a foreigner lives among you and desires to keep the Passover to Yahweh, then he shall do so according to the statute of the Passover, and according to its ordinance. You shall have one statute, both for the foreigner and for him who is born in the land.’” +\p +\v 15 On the day that the tabernacle was raised up, the cloud covered the tabernacle, even the Tent of the Testimony. At evening it was over the tabernacle, as it were the appearance of fire, until morning. +\v 16 So it was continually. The cloud covered it, and the appearance of fire by night. +\v 17 Whenever the cloud was taken up from over the Tent, then after that the children of Israel traveled; and in the place where the cloud remained, there the children of Israel encamped. +\v 18 At the commandment of Yahweh, the children of Israel traveled, and at the commandment of Yahweh they encamped. As long as the cloud remained on the tabernacle they remained encamped. +\v 19 When the cloud stayed on the tabernacle many days, then the children of Israel kept Yahweh’s command, and didn’t travel. +\v 20 Sometimes the cloud was a few days on the tabernacle; then according to the commandment of Yahweh they remained encamped, and according to the commandment of Yahweh they traveled. +\v 21 Sometimes the cloud was from evening until morning; and when the cloud was taken up in the morning, they traveled; or by day and by night, when the cloud was taken up, they traveled. +\v 22 Whether it was two days, or a month, or a year that the cloud stayed on the tabernacle, remaining on it, the children of Israel remained encamped, and didn’t travel; but when it was taken up, they traveled. +\v 23 At the commandment of Yahweh they encamped, and at the commandment of Yahweh they traveled. They kept Yahweh’s command, at the commandment of Yahweh by Moses. +\c 10 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Make two trumpets of silver. You shall make them of beaten work. You shall use them for the calling of the congregation and for the journeying of the camps. +\v 3 When they blow them, all the congregation shall gather themselves to you at the door of the Tent of Meeting. +\v 4 If they blow just one, then the princes, the heads of the thousands of Israel, shall gather themselves to you. +\v 5 When you blow an alarm, the camps that lie on the east side shall go forward. +\v 6 When you blow an alarm the second time, the camps that lie on the south side shall go forward. They shall blow an alarm for their journeys. +\v 7 But when the assembly is to be gathered together, you shall blow, but you shall not sound an alarm. +\p +\v 8 “The sons of Aaron, the priests, shall blow the trumpets. This shall be to you for a statute forever throughout your generations. +\v 9 When you go to war in your land against the adversary who oppresses you, then you shall sound an alarm with the trumpets. Then you will be remembered before Yahweh your God, and you will be saved from your enemies. +\p +\v 10 “Also in the day of your gladness, and in your set feasts, and in the beginnings of your months, you shall blow the trumpets over your burnt offerings, and over the sacrifices of your peace offerings; and they shall be to you for a memorial before your God. I am Yahweh your God.” +\p +\v 11 In the second year, in the second month, on the twentieth day of the month, the cloud was taken up from over the tabernacle of the covenant. +\v 12 The children of Israel went forward on their journeys out of the wilderness of Sinai; and the cloud stayed in the wilderness of Paran. +\v 13 They first went forward according to the commandment of Yahweh by Moses. +\p +\v 14 First, the standard of the camp of the children of Judah went forward according to their armies. Nahshon the son of Amminadab was over his army. +\v 15 Nethanel the son of Zuar was over the army of the tribe of the children of Issachar. +\v 16 Eliab the son of Helon was over the army of the tribe of the children of Zebulun. +\v 17 The tabernacle was taken down; and the sons of Gershon and the sons of Merari, who bore the tabernacle, went forward. +\v 18 The standard of the camp of Reuben went forward according to their armies. Elizur the son of Shedeur was over his army. +\v 19 Shelumiel the son of Zurishaddai was over the army of the tribe of the children of Simeon. +\v 20 Eliasaph the son of Deuel was over the army of the tribe of the children of Gad. +\p +\v 21 The Kohathites set forward, bearing the sanctuary. The others set up the tabernacle before they arrived. +\p +\v 22 The standard of the camp of the children of Ephraim set forward according to their armies. Elishama the son of Ammihud was over his army. +\v 23 Gamaliel the son of Pedahzur was over the army of the tribe of the children of Manasseh. +\v 24 Abidan the son of Gideoni was over the army of the tribe of the children of Benjamin. +\p +\v 25 The standard of the camp of the children of Dan, which was the rear guard of all the camps, set forward according to their armies. Ahiezer the son of Ammishaddai was over his army. +\v 26 Pagiel the son of Ochran was over the army of the tribe of the children of Asher. +\v 27 Ahira the son of Enan was over the army of the tribe of the children of Naphtali. +\v 28 Thus were the travels of the children of Israel according to their armies; and they went forward. +\p +\v 29 Moses said to Hobab, the son of Reuel the Midianite, Moses’ father-in-law, “We are journeying to the place of which Yahweh said, ‘I will give it to you.’ Come with us, and we will treat you well; for Yahweh has spoken good concerning Israel.” +\p +\v 30 He said to him, “I will not go; but I will depart to my own land, and to my relatives.” +\p +\v 31 Moses said, “Don’t leave us, please; because you know how we are to encamp in the wilderness, and you can be our eyes. +\v 32 It shall be, if you go with us—yes, it shall be—that whatever good Yahweh does to us, we will do the same to you.” +\p +\v 33 They set forward from the Mount of Yahweh three days’ journey. The ark of Yahweh’s covenant went before them three days’ journey, to seek out a resting place for them. +\v 34 The cloud of Yahweh was over them by day, when they set forward from the camp. +\v 35 When the ark went forward, Moses said, “Rise up, Yahweh, and let your enemies be scattered! Let those who hate you flee before you!” +\v 36 When it rested, he said, “Return, Yahweh, to the ten thousands of the thousands of Israel.” +\c 11 +\p +\v 1 The people were complaining in the ears of Yahweh. When Yahweh heard it, his anger burned; and Yahweh’s fire burned among them, and consumed some of the outskirts of the camp. +\v 2 The people cried to Moses; and Moses prayed to Yahweh, and the fire abated. +\v 3 The name of that place was called Taberah,\f + \fr 11:3 \ft Taberah means “burning” \f* because Yahweh’s fire burned among them. +\p +\v 4 The mixed multitude that was among them lusted exceedingly; and the children of Israel also wept again, and said, “Who will give us meat to eat? +\v 5 We remember the fish, which we ate in Egypt for nothing; the cucumbers, and the melons, and the leeks, and the onions, and the garlic; +\v 6 but now we have lost our appetite. There is nothing at all except this manna to look at.” +\v 7 The manna was like coriander seed, and it looked like bdellium.\f + \fr 11:7 \ft Bdellium is a resin extracted from certain African trees.\f* +\v 8 The people went around, gathered it, and ground it in mills, or beat it in mortars, and boiled it in pots, and made cakes of it. Its taste was like the taste of fresh oil. +\v 9 When the dew fell on the camp in the night, the manna fell on it. +\p +\v 10 Moses heard the people weeping throughout their families, every man at the door of his tent; and Yahweh’s anger burned greatly; and Moses was displeased. +\v 11 Moses said to Yahweh, “Why have you treated your servant so badly? Why haven’t I found favor in your sight, that you lay the burden of all this people on me? +\v 12 Have I conceived all this people? Have I brought them out, that you should tell me, ‘Carry them in your bosom, as a nurse carries a nursing infant, to the land which you swore to their fathers?’ +\v 13 Where could I get meat to give all these people? For they weep before me, saying, ‘Give us meat, that we may eat.’ +\v 14 I am not able to bear all this people alone, because it is too heavy for me. +\v 15 If you treat me this way, please kill me right now, if I have found favor in your sight; and don’t let me see my wretchedness.” +\p +\v 16 Yahweh said to Moses, “Gather to me seventy men of the elders of Israel, whom you know to be the elders of the people and officers over them; and bring them to the Tent of Meeting, that they may stand there with you. +\v 17 I will come down and talk with you there. I will take of the Spirit which is on you, and will put it on them; and they shall bear the burden of the people with you, that you don’t bear it yourself alone. +\p +\v 18 “Say to the people, ‘Sanctify yourselves in preparation for tomorrow, and you will eat meat; for you have wept in the ears of Yahweh, saying, “Who will give us meat to eat? For it was well with us in Egypt.” Therefore Yahweh will give you meat, and you will eat. +\v 19 You will not eat just one day, or two days, or five days, or ten days, or twenty days, +\v 20 but a whole month, until it comes out at your nostrils, and it is loathsome to you; because you have rejected Yahweh who is among you, and have wept before him, saying, “Why did we come out of Egypt?”’” +\p +\v 21 Moses said, “The people, among whom I am, are six hundred thousand men on foot; and you have said, ‘I will give them meat, that they may eat a whole month.’ +\v 22 Shall flocks and herds be slaughtered for them, to be sufficient for them? Shall all the fish of the sea be gathered together for them, to be sufficient for them?” +\p +\v 23 Yahweh said to Moses, “Has Yahweh’s hand grown short? Now you will see whether my word will happen to you or not.” +\p +\v 24 Moses went out, and told the people Yahweh’s words; and he gathered seventy men of the elders of the people, and set them around the Tent. +\v 25 Yahweh came down in the cloud, and spoke to him, and took of the Spirit that was on him, and put it on the seventy elders. When the Spirit rested on them, they prophesied, but they did so no more. +\v 26 But two men remained in the camp. The name of one was Eldad, and the name of the other Medad; and the Spirit rested on them. They were of those who were written, but had not gone out to the Tent; and they prophesied in the camp. +\v 27 A young man ran, and told Moses, and said, “Eldad and Medad are prophesying in the camp!” +\p +\v 28 Joshua the son of Nun, the servant of Moses, one of his chosen men, answered, “My lord Moses, forbid them!” +\p +\v 29 Moses said to him, “Are you jealous for my sake? I wish that all Yahweh’s people were prophets, that Yahweh would put his Spirit on them!” +\p +\v 30 Moses went into the camp, he and the elders of Israel. +\v 31 A wind from Yahweh went out and brought quails from the sea, and let them fall by the camp, about a day’s journey on this side, and a day’s journey on the other side, around the camp, and about two cubits\f + \fr 11:31 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* above the surface of the earth. +\v 32 The people rose up all that day, and all of that night, and all the next day, and gathered the quails. He who gathered least gathered ten homers;\f + \fr 11:32 \ft 1 homer is about 220 liters or 6 bushels\f* and they spread them all out for themselves around the camp. +\v 33 While the meat was still between their teeth, before it was chewed, Yahweh’s anger burned against the people, and Yahweh struck the people with a very great plague. +\v 34 The name of that place was called Kibroth Hattaavah,\f + \fr 11:34 \ft Kibroth Hattaavah means “graves of lust”\f* because there they buried the people who lusted. +\p +\v 35 From Kibroth Hattaavah the people traveled to Hazeroth; and they stayed at Hazeroth. +\c 12 +\p +\v 1 Miriam and Aaron spoke against Moses because of the Cushite woman whom he had married; for he had married a Cushite woman. +\v 2 They said, “Has Yahweh indeed spoken only with Moses? Hasn’t he spoken also with us?” And Yahweh heard it. +\p +\v 3 Now the man Moses was very humble, more than all the men who were on the surface of the earth. +\v 4 Yahweh spoke suddenly to Moses, to Aaron, and to Miriam, “You three come out to the Tent of Meeting!” +\p The three of them came out. +\v 5 Yahweh came down in a pillar of cloud, and stood at the door of the Tent, and called Aaron and Miriam; and they both came forward. +\v 6 He said, “Now hear my words. If there is a prophet among you, I, Yahweh, will make myself known to him in a vision. I will speak with him in a dream. +\v 7 My servant Moses is not so. He is faithful in all my house. +\v 8 With him, I will speak mouth to mouth, even plainly, and not in riddles; and he shall see Yahweh’s form. Why then were you not afraid to speak against my servant, against Moses?” +\v 9 Yahweh’s anger burned against them; and he departed. +\p +\v 10 The cloud departed from over the Tent; and behold, Miriam was leprous, as white as snow. Aaron looked at Miriam, and behold, she was leprous. +\p +\v 11 Aaron said to Moses, “Oh, my lord, please don’t count this sin against us, in which we have done foolishly, and in which we have sinned. +\v 12 Let her not, I pray, be as one dead, of whom the flesh is half consumed when he comes out of his mother’s womb.” +\p +\v 13 Moses cried to Yahweh, saying, “Heal her, God, I beg you!” +\p +\v 14 Yahweh said to Moses, “If her father had but spit in her face, shouldn’t she be ashamed seven days? Let her be shut up outside of the camp seven days, and after that she shall be brought in again.” +\p +\v 15 Miriam was shut up outside of the camp seven days, and the people didn’t travel until Miriam was brought in again. +\v 16 Afterward the people traveled from Hazeroth, and encamped in the wilderness of Paran. +\c 13 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Send men, that they may spy out the land of Canaan, which I give to the children of Israel. Of every tribe of their fathers, you shall send a man, every one a prince among them.” +\p +\v 3 Moses sent them from the wilderness of Paran according to the commandment of Yahweh. All of them were men who were heads of the children of Israel. +\v 4 These were their names: +\m Of the tribe of Reuben, Shammua the son of Zaccur. +\m +\v 5 Of the tribe of Simeon, Shaphat the son of Hori. +\m +\v 6 Of the tribe of Judah, Caleb the son of Jephunneh. +\m +\v 7 Of the tribe of Issachar, Igal the son of Joseph. +\m +\v 8 Of the tribe of Ephraim, Hoshea the son of Nun. +\m +\v 9 Of the tribe of Benjamin, Palti the son of Raphu. +\m +\v 10 Of the tribe of Zebulun, Gaddiel the son of Sodi. +\m +\v 11 Of the tribe of Joseph, of the tribe of Manasseh, Gaddi the son of Susi. +\m +\v 12 Of the tribe of Dan, Ammiel the son of Gemalli. +\m +\v 13 Of the tribe of Asher, Sethur the son of Michael. +\m +\v 14 Of the tribe of Naphtali, Nahbi the son of Vophsi. +\m +\v 15 Of the tribe of Gad, Geuel the son of Machi. +\m +\v 16 These are the names of the men who Moses sent to spy out the land. Moses called Hoshea the son of Nun Joshua. +\v 17 Moses sent them to spy out the land of Canaan, and said to them, “Go up this way by the South, and go up into the hill country. +\v 18 See the land, what it is; and the people who dwell therein, whether they are strong or weak, whether they are few or many; +\v 19 and what the land is that they dwell in, whether it is good or bad; and what cities they are that they dwell in, whether in camps, or in strongholds; +\v 20 and what the land is, whether it is fertile or poor, whether there is wood therein, or not. Be courageous, and bring some of the fruit of the land.” Now the time was the time of the first-ripe grapes. +\p +\v 21 So they went up, and spied out the land from the wilderness of Zin to Rehob, to the entrance of Hamath. +\v 22 They went up by the South, and came to Hebron; and Ahiman, Sheshai, and Talmai, the children of Anak, were there. (Now Hebron was built seven years before Zoan in Egypt.) +\v 23 They came to the valley of Eshcol, and cut down from there a branch with one cluster of grapes, and they bore it on a staff between two. They also brought some of the pomegranates and figs. +\v 24 That place was called the valley of Eshcol, because of the cluster which the children of Israel cut down from there. +\v 25 They returned from spying out the land at the end of forty days. +\v 26 They went and came to Moses, to Aaron, and to all the congregation of the children of Israel, to the wilderness of Paran, to Kadesh; and brought back word to them and to all the congregation. They showed them the fruit of the land. +\v 27 They told him, and said, “We came to the land where you sent us. Surely it flows with milk and honey, and this is its fruit. +\v 28 However, the people who dwell in the land are strong, and the cities are fortified and very large. Moreover, we saw the children of Anak there. +\v 29 Amalek dwells in the land of the South. The Hittite, the Jebusite, and the Amorite dwell in the hill country. The Canaanite dwells by the sea, and along the side of the Jordan.” +\p +\v 30 Caleb stilled the people before Moses, and said, “Let’s go up at once, and possess it; for we are well able to overcome it!” +\p +\v 31 But the men who went up with him said, “We aren’t able to go up against the people; for they are stronger than we.” +\v 32 They brought up an evil report of the land which they had spied out to the children of Israel, saying, “The land, through which we have gone to spy it out, is a land that eats up its inhabitants; and all the people who we saw in it are men of great stature. +\v 33 There we saw the Nephilim,\f + \fr 13:33 \ft or, giants\f* the sons of Anak, who come from the Nephilim.\f + \fr 13:33 \ft or, giants\f* We were in our own sight as grasshoppers, and so we were in their sight.” +\c 14 +\p +\v 1 All the congregation lifted up their voice, and cried; and the people wept that night. +\v 2 All the children of Israel murmured against Moses and against Aaron. The whole congregation said to them, “We wish that we had died in the land of Egypt, or that we had died in this wilderness! +\v 3 Why does Yahweh bring us to this land, to fall by the sword? Our wives and our little ones will be captured or killed! Wouldn’t it be better for us to return into Egypt?” +\v 4 They said to one another, “Let’s choose a leader, and let’s return into Egypt.” +\p +\v 5 Then Moses and Aaron fell on their faces before all the assembly of the congregation of the children of Israel. +\p +\v 6 Joshua the son of Nun and Caleb the son of Jephunneh, who were of those who spied out the land, tore their clothes. +\v 7 They spoke to all the congregation of the children of Israel, saying, “The land, which we passed through to spy it out, is an exceedingly good land. +\v 8 If Yahweh delights in us, then he will bring us into this land, and give it to us: a land which flows with milk and honey. +\v 9 Only don’t rebel against Yahweh, neither fear the people of the land; for they are bread for us. Their defense is removed from over them, and Yahweh is with us. Don’t fear them.” +\p +\v 10 But all the congregation threatened to stone them with stones. +\p Yahweh’s glory appeared in the Tent of Meeting to all the children of Israel. +\v 11 Yahweh said to Moses, “How long will this people despise me? How long will they not believe in me, for all the signs which I have worked among them? +\v 12 I will strike them with the pestilence, and disinherit them, and will make of you a nation greater and mightier than they.” +\p +\v 13 Moses said to Yahweh, “Then the Egyptians will hear it; for you brought up this people in your might from among them. +\v 14 They will tell it to the inhabitants of this land. They have heard that you Yahweh are among this people; for you Yahweh are seen face to face, and your cloud stands over them, and you go before them, in a pillar of cloud by day, and in a pillar of fire by night. +\v 15 Now if you killed this people as one man, then the nations which have heard the fame of you will speak, saying, +\v 16 ‘Because Yahweh was not able to bring this people into the land which he swore to them, therefore he has slain them in the wilderness.’ +\v 17 Now please let the power of the Lord\f + \fr 14:17 \ft The word translated “Lord” is “Adonai.”\f* be great, according as you have spoken, saying, +\v 18 ‘Yahweh is slow to anger, and abundant in loving kindness, forgiving iniquity and disobedience; and he will by no means clear the guilty, visiting the iniquity of the fathers on the children, on the third and on the fourth generation.’ +\v 19 Please pardon the iniquity of this people according to the greatness of your loving kindness, and just as you have forgiven this people, from Egypt even until now.” +\p +\v 20 Yahweh said, “I have pardoned according to your word; +\v 21 but in very deed—as I live, and as all the earth shall be filled with Yahweh’s glory— +\v 22 because all those men who have seen my glory and my signs, which I worked in Egypt and in the wilderness, yet have tempted me these ten times, and have not listened to my voice; +\v 23 surely they shall not see the land which I swore to their fathers, neither shall any of those who despised me see it. +\v 24 But my servant Caleb, because he had another spirit with him, and has followed me fully, him I will bring into the land into which he went. His offspring shall possess it. +\v 25 Since the Amalekite and the Canaanite dwell in the valley, tomorrow turn and go into the wilderness by the way to the Red Sea.” +\v 26 Yahweh spoke to Moses and to Aaron, saying, +\v 27 “How long shall I bear with this evil congregation that complain against me? I have heard the complaints of the children of Israel, which they complain against me. +\v 28 Tell them, ‘As I live, says Yahweh, surely as you have spoken in my ears, so I will do to you. +\v 29 Your dead bodies shall fall in this wilderness; and all who were counted of you, according to your whole number, from twenty years old and upward, who have complained against me, +\v 30 surely you shall not come into the land concerning which I swore that I would make you dwell therein, except Caleb the son of Jephunneh, and Joshua the son of Nun. +\v 31 But I will bring in your little ones that you said should be captured or killed, and they shall know the land which you have rejected. +\v 32 But as for you, your dead bodies shall fall in this wilderness. +\v 33 Your children shall be wanderers in the wilderness forty years, and shall bear your prostitution, until your dead bodies are consumed in the wilderness. +\v 34 After the number of the days in which you spied out the land, even forty days, for every day a year, you will bear your iniquities, even forty years, and you will know my alienation.’ +\v 35 I, Yahweh, have spoken. I will surely do this to all this evil congregation who are gathered together against me. In this wilderness they shall be consumed, and there they shall die.” +\p +\v 36 The men whom Moses sent to spy out the land, who returned and made all the congregation to murmur against him by bringing up an evil report against the land, +\v 37 even those men who brought up an evil report of the land, died by the plague before Yahweh. +\v 38 But Joshua the son of Nun and Caleb the son of Jephunneh remained alive of those men who went to spy out the land. +\p +\v 39 Moses told these words to all the children of Israel, and the people mourned greatly. +\v 40 They rose up early in the morning and went up to the top of the mountain, saying, “Behold, we are here, and will go up to the place which Yahweh has promised; for we have sinned.” +\p +\v 41 Moses said, “Why now do you disobey the commandment of Yahweh, since it shall not prosper? +\v 42 Don’t go up, for Yahweh isn’t among you; that way you won’t be struck down before your enemies. +\v 43 For there the Amalekite and the Canaanite are before you, and you will fall by the sword because you turned back from following Yahweh; therefore Yahweh will not be with you.” +\p +\v 44 But they presumed to go up to the top of the mountain. Nevertheless, the ark of Yahweh’s covenant and Moses didn’t depart out of the camp. +\v 45 Then the Amalekites came down, and the Canaanites who lived in that mountain, and struck them and beat them down even to Hormah. +\c 15 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, and tell them, ‘When you have come into the land of your habitations, which I give to you, +\v 3 and will make an offering by fire to Yahweh—a burnt offering, or a sacrifice, to accomplish a vow, or as a free will offering, or in your set feasts, to make a pleasant aroma to Yahweh, of the herd, or of the flock— +\v 4 then he who offers his offering shall offer to Yahweh a meal offering of one tenth of an ephah\f + \fr 15:4 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with one fourth of a hin\f + \fr 15:4 \ft A hin is about 6.5 liters or 1.7 gallons.\f* of oil. +\v 5 You shall prepare wine for the drink offering, one fourth of a hin, with the burnt offering or for the sacrifice, for each lamb. +\p +\v 6 “‘For a ram, you shall prepare for a meal offering two tenths of an ephah\f + \fr 15:6 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with the third part of a hin of oil; +\v 7 and for the drink offering you shall offer the third part of a hin of wine, of a pleasant aroma to Yahweh. +\v 8 When you prepare a bull for a burnt offering or for a sacrifice, to accomplish a vow, or for peace offerings to Yahweh, +\v 9 then he shall offer with the bull a meal offering of three tenths of an ephah\f + \fr 15:9 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour mixed with half a hin of oil; +\v 10 and you shall offer for the drink offering half a hin of wine, for an offering made by fire, of a pleasant aroma to Yahweh. +\v 11 Thus it shall be done for each bull, for each ram, for each of the male lambs, or of the young goats. +\v 12 According to the number that you shall prepare, so you shall do to everyone according to their number. +\p +\v 13 “‘All who are native-born shall do these things in this way, in offering an offering made by fire, of a pleasant aroma to Yahweh. +\v 14 If a stranger lives as a foreigner with you, or whoever may be among you throughout your generations, and will offer an offering made by fire, of a pleasant aroma to Yahweh, as you do, so he shall do. +\v 15 For the assembly, there shall be one statute for you and for the stranger who lives as a foreigner, a statute forever throughout your generations. As you are, so the foreigner shall be before Yahweh. +\v 16 One law and one ordinance shall be for you and for the stranger who lives as a foreigner with you.’” +\p +\v 17 Yahweh spoke to Moses, saying, +\v 18 “Speak to the children of Israel, and tell them, ‘When you come into the land where I bring you, +\v 19 then it shall be that when you eat of the bread of the land, you shall offer up a wave offering to Yahweh. +\v 20 Of the first of your dough you shall offer up a cake for a wave offering. As the wave offering of the threshing floor, so you shall heave it. +\v 21 Of the first of your dough, you shall give to Yahweh a wave offering throughout your generations. +\p +\v 22 “‘When you err, and don’t observe all these commandments which Yahweh has spoken to Moses— +\v 23 even all that Yahweh has commanded you by Moses, from the day that Yahweh gave commandment and onward throughout your generations— +\v 24 then it shall be, if it was done unwittingly, without the knowledge of the congregation, that all the congregation shall offer one young bull for a burnt offering, for a pleasant aroma to Yahweh, with its meal offering and its drink offering, according to the ordinance, and one male goat for a sin offering. +\v 25 The priest shall make atonement for all the congregation of the children of Israel, and they shall be forgiven; for it was an error, and they have brought their offering, an offering made by fire to Yahweh, and their sin offering before Yahweh, for their error. +\v 26 All the congregation of the children of Israel shall be forgiven, as well as the stranger who lives as a foreigner among them; for with regard to all the people, it was done unwittingly. +\p +\v 27 “‘If a person sins unwittingly, then he shall offer a female goat a year old for a sin offering. +\v 28 The priest shall make atonement for the soul who errs when he sins unwittingly before Yahweh. He shall make atonement for him; and he shall be forgiven. +\v 29 You shall have one law for him who does anything unwittingly, for him who is native-born among the children of Israel, and for the stranger who lives as a foreigner among them. +\p +\v 30 “‘But the soul who does anything with a high hand, whether he is native-born or a foreigner, blasphemes Yahweh. That soul shall be cut off from among his people. +\v 31 Because he has despised Yahweh’s word, and has broken his commandment, that soul shall be utterly cut off. His iniquity shall be on him.’” +\p +\v 32 While the children of Israel were in the wilderness, they found a man gathering sticks on the Sabbath day. +\v 33 Those who found him gathering sticks brought him to Moses and Aaron, and to all the congregation. +\v 34 They put him in custody, because it had not been declared what should be done to him. +\p +\v 35 Yahweh said to Moses, “The man shall surely be put to death. All the congregation shall stone him with stones outside of the camp.” +\v 36 All the congregation brought him outside of the camp, and stoned him to death with stones, as Yahweh commanded Moses. +\p +\v 37 Yahweh spoke to Moses, saying, +\v 38 “Speak to the children of Israel, and tell them that they should make themselves fringes\f + \fr 15:38 \ft or, tassels (Hebrew צִיצִ֛ת)\f* on the borders of their garments throughout their generations, and that they put on the fringe\f + \fr 15:38 \ft or, tassel\f* of each border a cord of blue. +\v 39 It shall be to you for a fringe,\f + \fr 15:39 \ft or, tassel\f* that you may see it, and remember all Yahweh’s commandments, and do them; and that you don’t follow your own heart and your own eyes, after which you used to play the prostitute; +\v 40 so that you may remember and do all my commandments, and be holy to your God. +\v 41 I am Yahweh your God, who brought you out of the land of Egypt, to be your God: I am Yahweh your God.” +\c 16 +\p +\v 1 Now Korah, the son of Izhar, the son of Kohath, the son of Levi, with Dathan and Abiram, the sons of Eliab, and On, the son of Peleth, sons of Reuben, took some men. +\v 2 They rose up before Moses, with some of the children of Israel, two hundred fifty princes of the congregation, called to the assembly, men of renown. +\v 3 They assembled themselves together against Moses and against Aaron, and said to them, “You take too much on yourself, since all the congregation are holy, everyone of them, and Yahweh is among them! Why do you lift yourselves up above Yahweh’s assembly?” +\p +\v 4 When Moses heard it, he fell on his face. +\v 5 He said to Korah and to all his company, “In the morning, Yahweh will show who are his, and who is holy, and will cause him to come near to him. Even him whom he shall choose, he will cause to come near to him. +\v 6 Do this: have Korah and all his company take censers, +\v 7 put fire in them, and put incense on them before Yahweh tomorrow. It shall be that the man whom Yahweh chooses, he shall be holy. You have gone too far, you sons of Levi!” +\p +\v 8 Moses said to Korah, “Hear now, you sons of Levi! +\v 9 Is it a small thing to you that the God of Israel has separated you from the congregation of Israel, to bring you near to himself, to do the service of Yahweh’s tabernacle, and to stand before the congregation to minister to them; +\v 10 and that he has brought you near, and all your brothers the sons of Levi with you? Do you seek the priesthood also? +\v 11 Therefore you and all your company have gathered together against Yahweh! What is Aaron that you complain against him?” +\p +\v 12 Moses sent to call Dathan and Abiram, the sons of Eliab; and they said, “We won’t come up! +\v 13 Is it a small thing that you have brought us up out of a land flowing with milk and honey, to kill us in the wilderness, but you must also make yourself a prince over us? +\v 14 Moreover you haven’t brought us into a land flowing with milk and honey, nor given us inheritance of fields and vineyards. Will you put out the eyes of these men? We won’t come up.” +\p +\v 15 Moses was very angry, and said to Yahweh, “Don’t respect their offering. I have not taken one donkey from them, neither have I hurt one of them.” +\p +\v 16 Moses said to Korah, “You and all your company go before Yahweh, you, and they, and Aaron, tomorrow. +\v 17 Each man take his censer and put incense on it, and each man bring before Yahweh his censer, two hundred fifty censers; you also, and Aaron, each with his censer.” +\p +\v 18 They each took his censer, and put fire in it, and laid incense on it, and stood at the door of the Tent of Meeting with Moses and Aaron. +\v 19 Korah assembled all the congregation opposite them to the door of the Tent of Meeting. +\p Yahweh’s glory appeared to all the congregation. +\v 20 Yahweh spoke to Moses and to Aaron, saying, +\v 21 “Separate yourselves from among this congregation, that I may consume them in a moment!” +\p +\v 22 They fell on their faces, and said, “God, the God of the spirits of all flesh, shall one man sin, and will you be angry with all the congregation?” +\p +\v 23 Yahweh spoke to Moses, saying, +\v 24 “Speak to the congregation, saying, ‘Get away from around the tent of Korah, Dathan, and Abiram!’” +\p +\v 25 Moses rose up and went to Dathan and Abiram; and the elders of Israel followed him. +\v 26 He spoke to the congregation, saying, “Depart, please, from the tents of these wicked men, and touch nothing of theirs, lest you be consumed in all their sins!” +\p +\v 27 So they went away from the tent of Korah, Dathan, and Abiram, on every side. Dathan and Abiram came out, and stood at the door of their tents with their wives, their sons, and their little ones. +\p +\v 28 Moses said, “Hereby you shall know that Yahweh has sent me to do all these works; for they are not from my own mind. +\v 29 If these men die the common death of all men, or if they experience what all men experience, then Yahweh hasn’t sent me. +\v 30 But if Yahweh makes a new thing, and the ground opens its mouth, and swallows them up with all that belong to them, and they go down alive into Sheol,\f + \fr 16:30 \ft Sheol is the place of the dead.\f* then you shall understand that these men have despised Yahweh.” +\p +\v 31 As he finished speaking all these words, the ground that was under them split apart. +\v 32 The earth opened its mouth and swallowed them up with their households, all of Korah’s men, and all their goods. +\v 33 So they, and all that belonged to them went down alive into Sheol.\f + \fr 16:33 \ft Sheol is the place of the dead.\f* The earth closed on them, and they perished from among the assembly. +\v 34 All Israel that were around them fled at their cry; for they said, “Lest the earth swallow us up!” +\v 35 Fire came out from Yahweh, and devoured the two hundred fifty men who offered the incense. +\p +\v 36 Yahweh spoke to Moses, saying, +\v 37 “Speak to Eleazar the son of Aaron the priest, that he take up the censers out of the burning, and scatter the fire away from the camp; for they are holy, +\v 38 even the censers of those who sinned against their own lives. Let them be beaten into plates for a covering of the altar, for they offered them before Yahweh. Therefore they are holy. They shall be a sign to the children of Israel.” +\p +\v 39 Eleazar the priest took the bronze censers which those who were burned had offered; and they beat them out for a covering of the altar, +\v 40 to be a memorial to the children of Israel, to the end that no stranger who isn’t of the offspring of Aaron, would come near to burn incense before Yahweh, that he not be as Korah and as his company; as Yahweh spoke to him by Moses. +\p +\v 41 But on the next day all the congregation of the children of Israel complained against Moses and against Aaron, saying, “You have killed Yahweh’s people!” +\p +\v 42 When the congregation was assembled against Moses and against Aaron, they looked toward the Tent of Meeting. Behold, the cloud covered it, and Yahweh’s glory appeared. +\v 43 Moses and Aaron came to the front of the Tent of Meeting. +\v 44 Yahweh spoke to Moses, saying, +\v 45 “Get away from among this congregation, that I may consume them in a moment!” They fell on their faces. +\p +\v 46 Moses said to Aaron, “Take your censer, put fire from the altar in it, lay incense on it, carry it quickly to the congregation, and make atonement for them; for wrath has gone out from Yahweh! The plague has begun.” +\p +\v 47 Aaron did as Moses said, and ran into the middle of the assembly. The plague had already begun among the people. He put on the incense, and made atonement for the people. +\v 48 He stood between the dead and the living; and the plague was stayed. +\v 49 Now those who died by the plague were fourteen thousand seven hundred, in addition to those who died about the matter of Korah. +\v 50 Aaron returned to Moses to the door of the Tent of Meeting, and the plague was stopped. +\c 17 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Speak to the children of Israel, and take rods from them, one for each fathers’ house, of all their princes according to their fathers’ houses, twelve rods. Write each man’s name on his rod. +\v 3 You shall write Aaron’s name on Levi’s rod. There shall be one rod for each head of their fathers’ houses. +\v 4 You shall lay them up in the Tent of Meeting before the covenant, where I meet with you. +\v 5 It shall happen that the rod of the man whom I shall choose shall bud. I will make the murmurings of the children of Israel, which they murmur against you, cease from me.” +\p +\v 6 Moses spoke to the children of Israel; and all their princes gave him rods, for each prince one, according to their fathers’ houses, a total of twelve rods. Aaron’s rod was among their rods. +\v 7 Moses laid up the rods before Yahweh in the Tent of the Testimony. +\p +\v 8 On the next day, Moses went into the Tent of the Testimony; and behold, Aaron’s rod for the house of Levi had sprouted, budded, produced blossoms, and bore ripe almonds. +\v 9 Moses brought out all the rods from before Yahweh to all the children of Israel. They looked, and each man took his rod. +\p +\v 10 Yahweh said to Moses, “Put back the rod of Aaron before the covenant, to be kept for a token against the children of rebellion; that you may make an end of their complaining against me, that they not die.” +\v 11 Moses did so. As Yahweh commanded him, so he did. +\p +\v 12 The children of Israel spoke to Moses, saying, “Behold, we perish! We are undone! We are all undone! +\v 13 Everyone who keeps approaching Yahweh’s tabernacle, dies! Will we all perish?” +\c 18 +\p +\v 1 Yahweh said to Aaron, “You and your sons and your fathers’ house with you shall bear the iniquity of the sanctuary; and you and your sons with you shall bear the iniquity of your priesthood. +\v 2 Bring your brothers also, the tribe of Levi, the tribe of your father, near with you, that they may be joined to you, and minister to you; but you and your sons with you shall be before the Tent of the Testimony. +\v 3 They shall keep your commands and the duty of the whole Tent; only they shall not come near to the vessels of the sanctuary and to the altar, that they not die, neither they nor you. +\v 4 They shall be joined to you and keep the responsibility of the Tent of Meeting, for all the service of the Tent. A stranger shall not come near to you. +\p +\v 5 “You shall perform the duty of the sanctuary and the duty of the altar, that there be no more wrath on the children of Israel. +\v 6 Behold, I myself have taken your brothers the Levites from among the children of Israel. They are a gift to you, dedicated to Yahweh, to do the service of the Tent of Meeting. +\v 7 You and your sons with you shall keep your priesthood for everything of the altar, and for that within the veil. You shall serve. I give you the service of the priesthood as a gift. The stranger who comes near shall be put to death.” +\p +\v 8 Yahweh spoke to Aaron, “Behold, I myself have given you the command of my wave offerings, even all the holy things of the children of Israel. I have given them to you by reason of the anointing, and to your sons, as a portion forever. +\v 9 This shall be yours of the most holy things from the fire: every offering of theirs, even every meal offering of theirs, and every sin offering of theirs, and every trespass offering of theirs, which they shall render to me, shall be most holy for you and for your sons. +\v 10 You shall eat of it like the most holy things. Every male shall eat of it. It shall be holy to you. +\p +\v 11 “This is yours, too: the wave offering of their gift, even all the wave offerings of the children of Israel. I have given them to you, and to your sons and to your daughters with you, as a portion forever. Everyone who is clean in your house shall eat of it. +\p +\v 12 “I have given to you all the best of the oil, all the best of the vintage, and of the grain, the first fruits of them which they give to Yahweh. +\v 13 The first-ripe fruits of all that is in their land, which they bring to Yahweh, shall be yours. Everyone who is clean in your house shall eat of it. +\p +\v 14 “Everything devoted in Israel shall be yours. +\v 15 Everything that opens the womb, of all flesh which they offer to Yahweh, both of man and animal, shall be yours. Nevertheless, you shall surely redeem the firstborn of man, and you shall redeem the firstborn of unclean animals. +\v 16 You shall redeem those who are to be redeemed of them from a month old, according to your estimation, for five shekels of money, according to the shekel\f + \fr 18:16 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of the sanctuary, which weighs twenty gerahs.\f + \fr 18:16 \ft A gerah is about 0.5 grams or about 7.7 grains.\f* +\p +\v 17 “But you shall not redeem the firstborn of a cow, or the firstborn of a sheep, or the firstborn of a goat. They are holy. You shall sprinkle their blood on the altar, and shall burn their fat for an offering made by fire, for a pleasant aroma to Yahweh. +\v 18 Their meat shall be yours, as the wave offering breast and as the right thigh, it shall be yours. +\v 19 All the wave offerings of the holy things which the children of Israel offer to Yahweh, I have given you and your sons and your daughters with you, as a portion forever. It is a covenant of salt forever before Yahweh to you and to your offspring with you.” +\p +\v 20 Yahweh said to Aaron, “You shall have no inheritance in their land, neither shall you have any portion among them. I am your portion and your inheritance among the children of Israel. +\p +\v 21 “To the children of Levi, behold, I have given all the tithe in Israel for an inheritance, in return for their service which they serve, even the service of the Tent of Meeting. +\v 22 Henceforth the children of Israel shall not come near the Tent of Meeting, lest they bear sin, and die. +\v 23 But the Levites shall do the service of the Tent of Meeting, and they shall bear their iniquity. It shall be a statute forever throughout your generations. Among the children of Israel, they shall have no inheritance. +\v 24 For the tithe of the children of Israel, which they offer as a wave offering to Yahweh, I have given to the Levites for an inheritance. Therefore I have said to them, ‘Among the children of Israel they shall have no inheritance.’” +\p +\v 25 Yahweh spoke to Moses, saying, +\v 26 “Moreover you shall speak to the Levites, and tell them, ‘When you take of the children of Israel the tithe which I have given you from them for your inheritance, then you shall offer up a wave offering of it for Yahweh, a tithe of the tithe. +\v 27 Your wave offering shall be credited to you, as though it were the grain of the threshing floor, and as the fullness of the wine press. +\v 28 Thus you also shall offer a wave offering to Yahweh of all your tithes, which you receive of the children of Israel; and of it you shall give Yahweh’s wave offering to Aaron the priest. +\v 29 Out of all your gifts, you shall offer every wave offering to Yahweh, of all its best parts, even the holy part of it.’ +\p +\v 30 “Therefore you shall tell them, ‘When you heave its best from it, then it shall be credited to the Levites as the increase of the threshing floor, and as the increase of the wine press. +\v 31 You may eat it anywhere, you and your households, for it is your reward in return for your service in the Tent of Meeting. +\v 32 You shall bear no sin by reason of it, when you have heaved from it its best. You shall not profane the holy things of the children of Israel, that you not die.’” +\c 19 +\p +\v 1 Yahweh spoke to Moses and to Aaron, saying, +\v 2 “This is the statute of the law which Yahweh has commanded. Tell the children of Israel to bring you a red heifer without spot, in which is no defect, and which was never yoked. +\v 3 You shall give her to Eleazar the priest, and he shall bring her outside of the camp, and one shall kill her before his face. +\v 4 Eleazar the priest shall take some of her blood with his finger, and sprinkle her blood toward the front of the Tent of Meeting seven times. +\v 5 One shall burn the heifer in his sight; her skin, and her meat, and her blood, with her dung, shall he burn. +\v 6 The priest shall take cedar wood, hyssop, and scarlet, and cast it into the middle of the burning of the heifer. +\v 7 Then the priest shall wash his clothes, and he shall bathe his flesh in water, and afterward he shall come into the camp, and the priest shall be unclean until the evening. +\v 8 He who burns her shall wash his clothes in water, and bathe his flesh in water, and shall be unclean until the evening. +\p +\v 9 “A man who is clean shall gather up the ashes of the heifer, and lay them up outside of the camp in a clean place; and it shall be kept for the congregation of the children of Israel for use in water for cleansing impurity. It is a sin offering. +\v 10 He who gathers the ashes of the heifer shall wash his clothes, and be unclean until the evening. It shall be to the children of Israel, and to the stranger who lives as a foreigner among them, for a statute forever. +\p +\v 11 “He who touches the dead body of any man shall be unclean seven days. +\v 12 He shall purify himself with water on the third day, and on the seventh day he shall be clean; but if he doesn’t purify himself the third day, then the seventh day he shall not be clean. +\v 13 Whoever touches a dead person, the body of a man who has died, and doesn’t purify himself, defiles Yahweh’s tabernacle; and that soul shall be cut off from Israel; because the water for impurity was not sprinkled on him, he shall be unclean. His uncleanness is yet on him. +\p +\v 14 “This is the law when a man dies in a tent: everyone who comes into the tent, and everyone who is in the tent, shall be unclean seven days. +\v 15 Every open vessel, which has no covering bound on it, is unclean. +\p +\v 16 “Whoever in the open field touches one who is slain with a sword, or a dead body, or a bone of a man, or a grave, shall be unclean seven days. +\p +\v 17 “For the unclean, they shall take of the ashes of the burning of the sin offering; and running water shall be poured on them in a vessel. +\v 18 A clean person shall take hyssop, dip it in the water, and sprinkle it on the tent, on all the vessels, on the persons who were there, and on him who touched the bone, or the slain, or the dead, or the grave. +\v 19 The clean person shall sprinkle on the unclean on the third day, and on the seventh day. On the seventh day, he shall purify him. He shall wash his clothes and bathe himself in water, and shall be clean at evening. +\v 20 But the man who shall be unclean, and shall not purify himself, that soul shall be cut off from among the assembly, because he has defiled the sanctuary of Yahweh. The water for impurity has not been sprinkled on him. He is unclean. +\v 21 It shall be a perpetual statute to them. He who sprinkles the water for impurity shall wash his clothes, and he who touches the water for impurity shall be unclean until evening. +\p +\v 22 “Whatever the unclean person touches shall be unclean; and the soul that touches it shall be unclean until evening.” +\c 20 +\p +\v 1 The children of Israel, even the whole congregation, came into the wilderness of Zin in the first month. The people stayed in Kadesh. Miriam died there, and was buried there. +\v 2 There was no water for the congregation; and they assembled themselves together against Moses and against Aaron. +\v 3 The people quarreled with Moses, and spoke, saying, “We wish that we had died when our brothers died before Yahweh! +\v 4 Why have you brought Yahweh’s assembly into this wilderness, that we should die there, we and our animals? +\v 5 Why have you made us to come up out of Egypt, to bring us in to this evil place? It is no place of seed, or of figs, or of vines, or of pomegranates; neither is there any water to drink.” +\p +\v 6 Moses and Aaron went from the presence of the assembly to the door of the Tent of Meeting, and fell on their faces. Yahweh’s glory appeared to them. +\v 7 Yahweh spoke to Moses, saying, +\v 8 “Take the rod, and assemble the congregation, you, and Aaron your brother, and speak to the rock before their eyes, that it pour out its water. You shall bring water to them out of the rock; so you shall give the congregation and their livestock drink.” +\p +\v 9 Moses took the rod from before Yahweh, as he commanded him. +\v 10 Moses and Aaron gathered the assembly together before the rock, and he said to them, “Hear now, you rebels! Shall we bring water out of this rock for you?” +\v 11 Moses lifted up his hand, and struck the rock with his rod twice, and water came out abundantly. The congregation and their livestock drank. +\p +\v 12 Yahweh said to Moses and Aaron, “Because you didn’t believe in me, to sanctify me in the eyes of the children of Israel, therefore you shall not bring this assembly into the land which I have given them.” +\p +\v 13 These are the waters of Meribah;\f + \fr 20:13 \ft “Meribah” means “quarreling”.\f* because the children of Israel strove with Yahweh, and he was sanctified in them. +\p +\v 14 Moses sent messengers from Kadesh to the king of Edom, saying: +\p “Your brother Israel says: You know all the travail that has happened to us; +\v 15 how our fathers went down into Egypt, and we lived in Egypt a long time. The Egyptians mistreated us and our fathers. +\v 16 When we cried to Yahweh, he heard our voice, sent an angel, and brought us out of Egypt. Behold, we are in Kadesh, a city in the edge of your border. +\p +\v 17 “Please let us pass through your land. We will not pass through field or through vineyard, neither will we drink from the water of the wells. We will go along the king’s highway. We will not turn away to the right hand nor to the left, until we have passed your border.” +\p +\v 18 Edom said to him, “You shall not pass through me, lest I come out with the sword against you.” +\p +\v 19 The children of Israel said to him, “We will go up by the highway; and if we drink your water, I and my livestock, then I will give its price. Only let me, without doing anything else, pass through on my feet.” +\p +\v 20 He said, “You shall not pass through.” Edom came out against him with many people, and with a strong hand. +\v 21 Thus Edom refused to give Israel passage through his border, so Israel turned away from him. +\p +\v 22 They traveled from Kadesh, and the children of Israel, even the whole congregation, came to Mount Hor. +\v 23 Yahweh spoke to Moses and Aaron in Mount Hor, by the border of the land of Edom, saying, +\v 24 “Aaron shall be gathered to his people; for he shall not enter into the land which I have given to the children of Israel, because you rebelled against my word at the waters of Meribah. +\v 25 Take Aaron and Eleazar his son, and bring them up to Mount Hor; +\v 26 and strip Aaron of his garments, and put them on Eleazar his son. Aaron shall be gathered, and shall die there.” +\p +\v 27 Moses did as Yahweh commanded. They went up onto Mount Hor in the sight of all the congregation. +\v 28 Moses stripped Aaron of his garments, and put them on Eleazar his son. Aaron died there on the top of the mountain, and Moses and Eleazar came down from the mountain. +\v 29 When all the congregation saw that Aaron was dead, they wept for Aaron thirty days, even all the house of Israel. +\c 21 +\p +\v 1 The Canaanite, the king of Arad, who lived in the South, heard that Israel came by the way of Atharim. He fought against Israel, and took some of them captive. +\v 2 Israel vowed a vow to Yahweh, and said, “If you will indeed deliver this people into my hand, then I will utterly destroy their cities.” +\v 3 Yahweh listened to the voice of Israel, and delivered up the Canaanites; and they utterly destroyed them and their cities. The name of the place was called Hormah.\f + \fr 21:3 \ft “Hormah” means “destruction”.\f* +\p +\v 4 They traveled from Mount Hor by the way to the Red Sea, to go around the land of Edom. The soul of the people was very discouraged because of the journey. +\v 5 The people spoke against God and against Moses: “Why have you brought us up out of Egypt to die in the wilderness? For there is no bread, there is no water, and our soul loathes this disgusting food!” +\p +\v 6 Yahweh sent venomous snakes among the people, and they bit the people. Many people of Israel died. +\v 7 The people came to Moses, and said, “We have sinned, because we have spoken against Yahweh and against you. Pray to Yahweh, that he take away the serpents from us.” Moses prayed for the people. +\p +\v 8 Yahweh said to Moses, “Make a venomous snake, and set it on a pole. It shall happen that everyone who is bitten, when he sees it, shall live.” +\v 9 Moses made a serpent of bronze, and set it on the pole. If a serpent had bitten any man, when he looked at the serpent of bronze, he lived. +\p +\v 10 The children of Israel traveled, and encamped in Oboth. +\v 11 They traveled from Oboth, and encamped at Iyeabarim, in the wilderness which is before Moab, toward the sunrise. +\v 12 From there they traveled, and encamped in the valley of Zered. +\v 13 From there they traveled, and encamped on the other side of the Arnon, which is in the wilderness that comes out of the border of the Amorites; for the Arnon is the border of Moab, between Moab and the Amorites. +\v 14 Therefore it is said in \bk The Book of the Wars of Yahweh\bk*, “Vaheb in Suphah, the valleys of the Arnon, +\v 15 the slope of the valleys that incline toward the dwelling of Ar, leans on the border of Moab.” +\p +\v 16 From there they traveled to Beer; that is the well of which Yahweh said to Moses, “Gather the people together, and I will give them water.” +\p +\v 17 Then Israel sang this song: +\q1 “Spring up, well! Sing to it, +\q2 +\v 18 the well, which the princes dug, +\q2 which the nobles of the people dug, +\q2 with the scepter, and with their poles.” +\p From the wilderness they traveled to Mattanah; +\v 19 and from Mattanah to Nahaliel; and from Nahaliel to Bamoth; +\v 20 and from Bamoth to the valley that is in the field of Moab, to the top of Pisgah, which looks down on the desert. +\v 21 Israel sent messengers to Sihon king of the Amorites, saying, +\v 22 “Let me pass through your land. We will not turn away into field or vineyard. We will not drink of the water of the wells. We will go by the king’s highway, until we have passed your border.” +\p +\v 23 Sihon would not allow Israel to pass through his border, but Sihon gathered all his people together, and went out against Israel into the wilderness, and came to Jahaz. He fought against Israel. +\v 24 Israel struck him with the edge of the sword, and possessed his land from the Arnon to the Jabbok, even to the children of Ammon; for the border of the children of Ammon was fortified. +\v 25 Israel took all these cities. Israel lived in all the cities of the Amorites, in Heshbon, and in all its villages. +\v 26 For Heshbon was the city of Sihon the king of the Amorites, who had fought against the former king of Moab, and taken all his land out of his hand, even to the Arnon. +\v 27 Therefore those who speak in proverbs say, +\q1 “Come to Heshbon. +\q2 Let the city of Sihon be built and established; +\q1 +\v 28 for a fire has gone out of Heshbon, +\q2 a flame from the city of Sihon. +\q1 It has devoured Ar of Moab, +\q2 The lords of the high places of the Arnon. +\q1 +\v 29 Woe to you, Moab! +\q2 You are undone, people of Chemosh! +\q1 He has given his sons as fugitives, +\q2 and his daughters into captivity, +\q2 to Sihon king of the Amorites. +\q1 +\v 30 We have shot at them. +\q2 Heshbon has perished even to Dibon. +\q1 We have laid waste even to Nophah, +\q2 Which reaches to Medeba.” +\p +\v 31 Thus Israel lived in the land of the Amorites. +\v 32 Moses sent to spy out Jazer. They took its villages, and drove out the Amorites who were there. +\v 33 They turned and went up by the way of Bashan. Og the king of Bashan went out against them, he and all his people, to battle at Edrei. +\p +\v 34 Yahweh said to Moses, “Don’t fear him, for I have delivered him into your hand, with all his people, and his land. You shall do to him as you did to Sihon king of the Amorites, who lived at Heshbon.” +\p +\v 35 So they struck him, with his sons and all his people, until there were no survivors; and they possessed his land. +\c 22 +\p +\v 1 The children of Israel traveled, and encamped in the plains of Moab beyond the Jordan at Jericho. +\v 2 Balak the son of Zippor saw all that Israel had done to the Amorites. +\v 3 Moab was very afraid of the people, because they were many. Moab was distressed because of the children of Israel. +\v 4 Moab said to the elders of Midian, “Now this multitude will lick up all that is around us, as the ox licks up the grass of the field.” +\p Balak the son of Zippor was king of Moab at that time. +\v 5 He sent messengers to Balaam the son of Beor, to Pethor, which is by the River, to the land of the children of his people, to call him, saying, “Behold, there is a people who came out of Egypt. Behold, they cover the surface of the earth, and they are staying opposite me. +\v 6 Please come now therefore, and curse this people for me; for they are too mighty for me. Perhaps I shall prevail, that we may strike them, and that I may drive them out of the land; for I know that he whom you bless is blessed, and he whom you curse is cursed.” +\p +\v 7 The elders of Moab and the elders of Midian departed with the rewards of divination in their hand. They came to Balaam, and spoke to him the words of Balak. +\p +\v 8 He said to them, “Lodge here this night, and I will bring you word again, as Yahweh shall speak to me.” The princes of Moab stayed with Balaam. +\p +\v 9 God came to Balaam, and said, “Who are these men with you?” +\p +\v 10 Balaam said to God, “Balak the son of Zippor, king of Moab, has said to me, +\v 11 ‘Behold, the people that has come out of Egypt covers the surface of the earth. Now, come curse them for me. Perhaps I shall be able to fight against them, and shall drive them out.’” +\p +\v 12 God said to Balaam, “You shall not go with them. You shall not curse the people, for they are blessed.” +\p +\v 13 Balaam rose up in the morning, and said to the princes of Balak, “Go to your land; for Yahweh refuses to permit me to go with you.” +\p +\v 14 The princes of Moab rose up, and they went to Balak, and said, “Balaam refuses to come with us.” +\p +\v 15 Balak again sent princes, more, and more honorable than they. +\v 16 They came to Balaam, and said to him, “Balak the son of Zippor says, ‘Please let nothing hinder you from coming to me, +\v 17 for I will promote you to very great honor, and whatever you say to me I will do. Please come therefore, and curse this people for me.’” +\p +\v 18 Balaam answered the servants of Balak, “If Balak would give me his house full of silver and gold, I can’t go beyond the word of Yahweh my God, to do less or more. +\v 19 Now therefore please stay here tonight as well, that I may know what else Yahweh will speak to me.” +\p +\v 20 God came to Balaam at night, and said to him, “If the men have come to call you, rise up, go with them; but only the word which I speak to you, that you shall do.” +\p +\v 21 Balaam rose up in the morning, and saddled his donkey, and went with the princes of Moab. +\v 22 God’s anger burned because he went; and Yahweh’s angel placed himself in the way as an adversary against him. Now he was riding on his donkey, and his two servants were with him. +\v 23 The donkey saw Yahweh’s angel standing in the way, with his sword drawn in his hand; and the donkey turned out of the path, and went into the field. Balaam struck the donkey, to turn her into the path. +\v 24 Then Yahweh’s angel stood in a narrow path between the vineyards, a wall being on this side, and a wall on that side. +\v 25 The donkey saw Yahweh’s angel, and she thrust herself to the wall, and crushed Balaam’s foot against the wall. He struck her again. +\p +\v 26 Yahweh’s angel went further, and stood in a narrow place, where there was no way to turn either to the right hand or to the left. +\v 27 The donkey saw Yahweh’s angel, and she lay down under Balaam. Balaam’s anger burned, and he struck the donkey with his staff. +\p +\v 28 Yahweh opened the mouth of the donkey, and she said to Balaam, “What have I done to you, that you have struck me these three times?” +\p +\v 29 Balaam said to the donkey, “Because you have mocked me, I wish there were a sword in my hand, for now I would have killed you.” +\p +\v 30 The donkey said to Balaam, “Am I not your donkey, on which you have ridden all your life long until today? Was I ever in the habit of doing so to you?” +\p He said, “No.” +\p +\v 31 Then Yahweh opened the eyes of Balaam, and he saw Yahweh’s angel standing in the way, with his sword drawn in his hand; and he bowed his head, and fell on his face. +\v 32 Yahweh’s angel said to him, “Why have you struck your donkey these three times? Behold, I have come out as an adversary, because your way is perverse before me. +\v 33 The donkey saw me, and turned away before me these three times. Unless she had turned away from me, surely now I would have killed you, and saved her alive.” +\p +\v 34 Balaam said to Yahweh’s angel, “I have sinned; for I didn’t know that you stood in the way against me. Now therefore, if it displeases you, I will go back again.” +\p +\v 35 Yahweh’s angel said to Balaam, “Go with the men; but you shall only speak the word that I shall speak to you.” +\p So Balaam went with the princes of Balak. +\v 36 When Balak heard that Balaam had come, he went out to meet him to the City of Moab, which is on the border of the Arnon, which is in the utmost part of the border. +\v 37 Balak said to Balaam, “Didn’t I earnestly send for you to summon you? Why didn’t you come to me? Am I not able indeed to promote you to honor?” +\p +\v 38 Balaam said to Balak, “Behold, I have come to you. Have I now any power at all to speak anything? I will speak the word that God puts in my mouth.” +\p +\v 39 Balaam went with Balak, and they came to Kiriath Huzoth. +\v 40 Balak sacrificed cattle and sheep, and sent to Balaam, and to the princes who were with him. +\v 41 In the morning, Balak took Balaam, and brought him up into the high places of Baal; and he saw from there part of the people. +\c 23 +\p +\v 1 Balaam said to Balak, “Build here seven altars for me, and prepare here seven bulls and seven rams for me.” +\p +\v 2 Balak did as Balaam had spoken; and Balak and Balaam offered on every altar a bull and a ram. +\v 3 Balaam said to Balak, “Stand by your burnt offering, and I will go. Perhaps Yahweh will come to meet me. Whatever he shows me I will tell you.” +\p He went to a bare height. +\v 4 God met Balaam, and he said to him, “I have prepared the seven altars, and I have offered up a bull and a ram on every altar.” +\p +\v 5 Yahweh put a word in Balaam’s mouth, and said, “Return to Balak, and thus you shall speak.” +\p +\v 6 He returned to him, and behold, he was standing by his burnt offering, he, and all the princes of Moab. +\v 7 He took up his parable, and said, +\q1 “From Aram has Balak brought me, +\q2 the king of Moab from the mountains of the East. +\q1 Come, curse Jacob for me. +\q2 Come, defy Israel. +\q1 +\v 8 How shall I curse whom God has not cursed? +\q2 How shall I defy whom Yahweh has not defied? +\q1 +\v 9 For from the top of the rocks I see him. +\q2 From the hills I see him. +\q1 Behold, it is a people that dwells alone, +\q2 and shall not be listed among the nations. +\q1 +\v 10 Who can count the dust of Jacob, +\q2 or count the fourth part of Israel? +\q1 Let me die the death of the righteous! +\q2 Let my last end be like his!” +\p +\v 11 Balak said to Balaam, “What have you done to me? I took you to curse my enemies, and behold, you have blessed them altogether.” +\p +\v 12 He answered and said, “Must I not take heed to speak that which Yahweh puts in my mouth?” +\p +\v 13 Balak said to him, “Please come with me to another place, where you may see them. You shall see just part of them, and shall not see them all. Curse them from there for me.” +\p +\v 14 He took him into the field of Zophim, to the top of Pisgah, and built seven altars, and offered up a bull and a ram on every altar. +\v 15 He said to Balak, “Stand here by your burnt offering, while I meet God over there.” +\p +\v 16 Yahweh met Balaam, and put a word in his mouth, and said, “Return to Balak, and say this.” +\p +\v 17 He came to him, and behold, he was standing by his burnt offering, and the princes of Moab with him. Balak said to him, “What has Yahweh spoken?” +\p +\v 18 He took up his parable, and said, +\q1 “Rise up, Balak, and hear! +\q2 Listen to me, you son of Zippor. +\q1 +\v 19 God is not a man, that he should lie, +\q2 nor a son of man, that he should repent. +\q1 Has he said, and he won’t do it? +\q2 Or has he spoken, and he won’t make it good? +\q1 +\v 20 Behold, I have received a command to bless. +\q2 He has blessed, and I can’t reverse it. +\q1 +\v 21 He has not seen iniquity in Jacob. +\q2 Neither has he seen perverseness in Israel. +\q1 Yahweh his God is with him. +\q2 The shout of a king is among them. +\q1 +\v 22 God brings them out of Egypt. +\q2 He has as it were the strength of the wild ox. +\q1 +\v 23 Surely there is no enchantment with Jacob; +\q2 neither is there any divination with Israel. +\q1 Now it shall be said of Jacob and of Israel, +\q2 ‘What has God done!’ +\q1 +\v 24 Behold, a people rises up as a lioness. +\q2 As a lion he lifts himself up. +\q1 He shall not lie down until he eats of the prey, +\q2 and drinks the blood of the slain.” +\p +\v 25 Balak said to Balaam, “Neither curse them at all, nor bless them at all.” +\p +\v 26 But Balaam answered Balak, “Didn’t I tell you, saying, ‘All that Yahweh speaks, that I must do?’” +\p +\v 27 Balak said to Balaam, “Come now, I will take you to another place; perhaps it will please God that you may curse them for me from there.” +\p +\v 28 Balak took Balaam to the top of Peor, that looks down on the desert. +\v 29 Balaam said to Balak, “Build seven altars for me here, and prepare seven bulls and seven rams for me here.” +\p +\v 30 Balak did as Balaam had said, and offered up a bull and a ram on every altar. +\c 24 +\p +\v 1 When Balaam saw that it pleased Yahweh to bless Israel, he didn’t go, as at the other times, to use divination, but he set his face toward the wilderness. +\v 2 Balaam lifted up his eyes, and he saw Israel dwelling according to their tribes; and the Spirit of God came on him. +\v 3 He took up his parable, and said, +\q1 “Balaam the son of Beor says, +\q2 the man whose eyes are open says; +\q1 +\v 4 he says, who hears the words of God, +\q2 who sees the vision of the Almighty, +\q2 falling down, and having his eyes open: +\q1 +\v 5 How goodly are your tents, Jacob, +\q2 and your dwellings, Israel! +\q1 +\v 6 As valleys they are spread out, +\q2 as gardens by the riverside, +\q2 as aloes which Yahweh has planted, +\q2 as cedar trees beside the waters. +\q1 +\v 7 Water shall flow from his buckets. +\q2 His seed shall be in many waters. +\q1 His king shall be higher than Agag. +\q2 His kingdom shall be exalted. +\q1 +\v 8 God brings him out of Egypt. +\q2 He has as it were the strength of the wild ox. +\q1 He shall consume the nations his adversaries, +\q2 shall break their bones in pieces, +\q2 and pierce them with his arrows. +\q1 +\v 9 He couched, he lay down as a lion, +\q2 as a lioness; +\q2 who shall rouse him up? +\q1 Everyone who blesses you is blessed. +\q2 Everyone who curses you is cursed.” +\p +\v 10 Balak’s anger burned against Balaam, and he struck his hands together. Balak said to Balaam, “I called you to curse my enemies, and, behold, you have altogether blessed them these three times. +\v 11 Therefore, flee to your place, now! I thought to promote you to great honor; but, behold, Yahweh has kept you back from honor.” +\p +\v 12 Balaam said to Balak, “Didn’t I also tell your messengers whom you sent to me, saying, +\v 13 ‘If Balak would give me his house full of silver and gold, I can’t go beyond Yahweh’s word, to do either good or bad from my own mind. I will say what Yahweh says’? +\v 14 Now, behold, I go to my people. Come, I will inform you what this people shall do to your people in the latter days.” +\p +\v 15 He took up his parable, and said, +\q1 “Balaam the son of Beor says, +\q2 the man whose eyes are open says; +\q2 +\v 16 he says, who hears the words of God, +\q2 knows the knowledge of the Most High, +\q2 and who sees the vision of the Almighty, +\q2 falling down, and having his eyes open: +\q1 +\v 17 I see him, but not now. +\q2 I see him, but not near. +\q1 A star will come out of Jacob. +\q2 A scepter will rise out of Israel, +\q1 and shall strike through the corners of Moab, +\q2 and crush all the sons of Sheth. +\q1 +\v 18 Edom shall be a possession. +\q2 Seir, his enemy, also shall be a possession, +\q2 while Israel does valiantly. +\q1 +\v 19 Out of Jacob shall one have dominion, +\q2 and shall destroy the remnant from the city.” +\p +\v 20 He looked at Amalek, and took up his parable, and said, +\q1 “Amalek was the first of the nations, +\q2 but his latter end shall come to destruction.” +\p +\v 21 He looked at the Kenite, and took up his parable, and said, +\q1 “Your dwelling place is strong. +\q2 Your nest is set in the rock. +\q1 +\v 22 Nevertheless Kain shall be wasted, +\q2 until Asshur carries you away captive.” +\p +\v 23 He took up his parable, and said, +\q1 “Alas, who shall live when God does this? +\q2 +\v 24 But ships shall come from the coast of Kittim. +\q1 They shall afflict Asshur, and shall afflict Eber. +\q2 He also shall come to destruction.” +\p +\v 25 Balaam rose up, and went and returned to his place; and Balak also went his way. +\c 25 +\p +\v 1 Israel stayed in Shittim; and the people began to play the prostitute with the daughters of Moab; +\v 2 for they called the people to the sacrifices of their gods. The people ate and bowed down to their gods. +\v 3 Israel joined himself to Baal Peor, and Yahweh’s anger burned against Israel. +\v 4 Yahweh said to Moses, “Take all the chiefs of the people, and hang them up to Yahweh before the sun, that the fierce anger of Yahweh may turn away from Israel.” +\p +\v 5 Moses said to the judges of Israel, “Everyone kill his men who have joined themselves to Baal Peor.” +\p +\v 6 Behold, one of the children of Israel came and brought to his brothers a Midianite woman in the sight of Moses, and in the sight of all the congregation of the children of Israel, while they were weeping at the door of the Tent of Meeting. +\v 7 When Phinehas, the son of Eleazar, the son of Aaron the priest, saw it, he rose up from the middle of the congregation, and took a spear in his hand. +\v 8 He went after the man of Israel into the pavilion, and thrust both of them through, the man of Israel, and the woman through her body. So the plague was stopped among the children of Israel. +\v 9 Those who died by the plague were twenty-four thousand. +\p +\v 10 Yahweh spoke to Moses, saying, +\v 11 “Phinehas, the son of Eleazar, the son of Aaron the priest, has turned my wrath away from the children of Israel, in that he was jealous with my jealousy among them, so that I didn’t consume the children of Israel in my jealousy. +\v 12 Therefore say, ‘Behold, I give to him my covenant of peace. +\v 13 It shall be to him, and to his offspring after him, the covenant of an everlasting priesthood, because he was jealous for his God, and made atonement for the children of Israel.’” +\p +\v 14 Now the name of the man of Israel that was slain, who was slain with the Midianite woman, was Zimri, the son of Salu, a prince of a fathers’ house among the Simeonites. +\v 15 The name of the Midianite woman who was slain was Cozbi, the daughter of Zur. He was head of the people of a fathers’ house in Midian. +\p +\v 16 Yahweh spoke to Moses, saying, +\v 17 “Harass the Midianites, and strike them; +\v 18 for they harassed you with their wiles, wherein they have deceived you in the matter of Peor, and in the incident regarding Cozbi, the daughter of the prince of Midian, their sister, who was slain on the day of the plague in the matter of Peor.” +\c 26 +\p +\v 1 After the plague, Yahweh spoke to Moses and to Eleazar the son of Aaron the priest, saying, +\v 2 “Take a census of all the congregation of the children of Israel, from twenty years old and upward, by their fathers’ houses, all who are able to go out to war in Israel.” +\v 3 Moses and Eleazar the priest spoke with them in the plains of Moab by the Jordan at Jericho, saying, +\v 4 “Take a census, from twenty years old and upward, as Yahweh commanded Moses and the children of Israel.” +\p These are those who came out of the land of Egypt. +\v 5 Reuben, the firstborn of Israel; the sons of Reuben: of Hanoch, the family of the Hanochites; of Pallu, the family of the Palluites; +\v 6 of Hezron, the family of the Hezronites; of Carmi, the family of the Carmites. +\v 7 These are the families of the Reubenites; and those who were counted of them were forty-three thousand seven hundred thirty. +\v 8 The son of Pallu: Eliab. +\v 9 The sons of Eliab: Nemuel, Dathan, and Abiram. These are that Dathan and Abiram who were called by the congregation, who rebelled against Moses and against Aaron in the company of Korah when they rebelled against Yahweh; +\v 10 and the earth opened its mouth, and swallowed them up together with Korah when that company died; at the time the fire devoured two hundred fifty men, and they became a sign. +\v 11 Notwithstanding, the sons of Korah didn’t die. +\v 12 The sons of Simeon after their families: of Nemuel, the family of the Nemuelites; of Jamin, the family of the Jaminites; of Jachin, the family of the Jachinites; +\v 13 of Zerah, the family of the Zerahites; of Shaul, the family of the Shaulites. +\v 14 These are the families of the Simeonites, twenty-two thousand two hundred. +\v 15 The sons of Gad after their families: of Zephon, the family of the Zephonites; of Haggi, the family of the Haggites; of Shuni, the family of the Shunites; +\v 16 of Ozni, the family of the Oznites; of Eri, the family of the Erites; +\v 17 of Arod, the family of the Arodites; of Areli, the family of the Arelites. +\v 18 These are the families of the sons of Gad according to those who were counted of them, forty thousand and five hundred. +\v 19 The sons of Judah: Er and Onan. Er and Onan died in the land of Canaan. +\v 20 The sons of Judah after their families were: of Shelah, the family of the Shelanites; of Perez, the family of the Perezites; of Zerah, the family of the Zerahites. +\v 21 The sons of Perez were: of Hezron, the family of the Hezronites; of Hamul, the family of the Hamulites. +\v 22 These are the families of Judah according to those who were counted of them, seventy-six thousand five hundred. +\v 23 The sons of Issachar after their families: of Tola, the family of the Tolaites; of Puvah, the family of the Punites; +\v 24 of Jashub, the family of the Jashubites; of Shimron, the family of the Shimronites. +\v 25 These are the families of Issachar according to those who were counted of them, sixty-four thousand three hundred. +\v 26 The sons of Zebulun after their families: of Sered, the family of the Seredites; of Elon, the family of the Elonites; of Jahleel, the family of the Jahleelites. +\v 27 These are the families of the Zebulunites according to those who were counted of them, sixty thousand five hundred. +\v 28 The sons of Joseph after their families: Manasseh and Ephraim. +\v 29 The sons of Manasseh: of Machir, the family of the Machirites; and Machir became the father of Gilead; of Gilead, the family of the Gileadites. +\v 30 These are the sons of Gilead: of Iezer, the family of the Iezerites; of Helek, the family of the Helekites; +\v 31 and Asriel, the family of the Asrielites; and Shechem, the family of the Shechemites; +\v 32 and Shemida, the family of the Shemidaites; and Hepher, the family of the Hepherites. +\v 33 Zelophehad the son of Hepher had no sons, but daughters: and the names of the daughters of Zelophehad were Mahlah, Noah, Hoglah, Milcah, and Tirzah. +\v 34 These are the families of Manasseh. Those who were counted of them were fifty-two thousand seven hundred. +\v 35 These are the sons of Ephraim after their families: of Shuthelah, the family of the Shuthelahites; of Becher, the family of the Becherites; of Tahan, the family of the Tahanites. +\v 36 These are the sons of Shuthelah: of Eran, the family of the Eranites. +\v 37 These are the families of the sons of Ephraim according to those who were counted of them, thirty-two thousand five hundred. These are the sons of Joseph after their families. +\v 38 The sons of Benjamin after their families: of Bela, the family of the Belaites; of Ashbel, the family of the Ashbelites; of Ahiram, the family of the Ahiramites; +\v 39 of Shephupham, the family of the Shuphamites; of Hupham, the family of the Huphamites. +\v 40 The sons of Bela were Ard and Naaman: the family of the Ardites; and of Naaman, the family of the Naamites. +\v 41 These are the sons of Benjamin after their families; and those who were counted of them were forty-five thousand six hundred. +\v 42 These are the sons of Dan after their families: of Shuham, the family of the Shuhamites. These are the families of Dan after their families. +\v 43 All the families of the Shuhamites, according to those who were counted of them, were sixty-four thousand four hundred. +\v 44 The sons of Asher after their families: of Imnah, the family of the Imnites; of Ishvi, the family of the Ishvites; of Beriah, the family of the Berites. +\v 45 Of the sons of Beriah: of Heber, the family of the Heberites; of Malchiel, the family of the Malchielites. +\v 46 The name of the daughter of Asher was Serah. +\v 47 These are the families of the sons of Asher according to those who were counted of them, fifty-three thousand four hundred. +\v 48 The sons of Naphtali after their families: of Jahzeel, the family of the Jahzeelites; of Guni, the family of the Gunites; +\v 49 of Jezer, the family of the Jezerites; of Shillem, the family of the Shillemites. +\v 50 These are the families of Naphtali according to their families; and those who were counted of them were forty-five thousand four hundred. +\v 51 These are those who were counted of the children of Israel, six hundred one thousand seven hundred thirty. +\p +\v 52 Yahweh spoke to Moses, saying, +\v 53 “To these the land shall be divided for an inheritance according to the number of names. +\v 54 To the more you shall give the more inheritance, and to the fewer you shall give the less inheritance. To everyone according to those who were counted of him shall his inheritance be given. +\v 55 Notwithstanding, the land shall be divided by lot. According to the names of the tribes of their fathers they shall inherit. +\v 56 According to the lot shall their inheritance be divided between the more and the fewer.” +\p +\v 57 These are those who were counted of the Levites after their families: of Gershon, the family of the Gershonites; of Kohath, the family of the Kohathites; of Merari, the family of the Merarites. +\v 58 These are the families of Levi: the family of the Libnites, the family of the Hebronites, the family of the Mahlites, the family of the Mushites, and the family of the Korahites. Kohath became the father of Amram. +\v 59 The name of Amram’s wife was Jochebed, the daughter of Levi, who was born to Levi in Egypt. She bore to Amram Aaron and Moses, and Miriam their sister. +\v 60 To Aaron were born Nadab and Abihu, Eleazar and Ithamar. +\v 61 Nadab and Abihu died when they offered strange fire before Yahweh. +\v 62 Those who were counted of them were twenty-three thousand, every male from a month old and upward; for they were not counted among the children of Israel, because there was no inheritance given them among the children of Israel. +\v 63 These are those who were counted by Moses and Eleazar the priest, who counted the children of Israel in the plains of Moab by the Jordan at Jericho. +\v 64 But among these there was not a man of them who were counted by Moses and Aaron the priest, who counted the children of Israel in the wilderness of Sinai. +\v 65 For Yahweh had said of them, “They shall surely die in the wilderness.” There was not a man left of them, except Caleb the son of Jephunneh, and Joshua the son of Nun. +\c 27 +\p +\v 1 Then the daughters of Zelophehad, the son of Hepher, the son of Gilead, the son of Machir, the son of Manasseh, of the families of Manasseh the son of Joseph came near. These are the names of his daughters: Mahlah, Noah, Hoglah, Milcah, and Tirzah. +\v 2 They stood before Moses, before Eleazar the priest, and before the princes and all the congregation, at the door of the Tent of Meeting, saying, +\v 3 “Our father died in the wilderness. He was not among the company of those who gathered themselves together against Yahweh in the company of Korah, but he died in his own sin. He had no sons. +\v 4 Why should the name of our father be taken away from among his family, because he had no son? Give to us a possession among the brothers of our father.” +\p +\v 5 Moses brought their cause before Yahweh. +\v 6 Yahweh spoke to Moses, saying, +\v 7 “The daughters of Zelophehad speak right. You shall surely give them a possession of an inheritance among their father’s brothers. You shall cause the inheritance of their father to pass to them. +\v 8 You shall speak to the children of Israel, saying, ‘If a man dies, and has no son, then you shall cause his inheritance to pass to his daughter. +\v 9 If he has no daughter, then you shall give his inheritance to his brothers. +\v 10 If he has no brothers, then you shall give his inheritance to his father’s brothers. +\v 11 If his father has no brothers, then you shall give his inheritance to his kinsman who is next to him of his family, and he shall possess it. This shall be a statute and ordinance for the children of Israel, as Yahweh commanded Moses.’” +\p +\v 12 Yahweh said to Moses, “Go up into this mountain of Abarim, and see the land which I have given to the children of Israel. +\v 13 When you have seen it, you also shall be gathered to your people, as Aaron your brother was gathered; +\v 14 because in the strife of the congregation, you rebelled against my word in the wilderness of Zin, to honor me as holy at the waters before their eyes.” (These are the waters of Meribah of Kadesh in the wilderness of Zin.) +\p +\v 15 Moses spoke to Yahweh, saying, +\v 16 “Let Yahweh, the God of the spirits of all flesh, appoint a man over the congregation, +\v 17 who may go out before them, and who may come in before them, and who may lead them out, and who may bring them in, that the congregation of Yahweh may not be as sheep which have no shepherd.” +\p +\v 18 Yahweh said to Moses, “Take Joshua the son of Nun, a man in whom is the Spirit, and lay your hand on him. +\v 19 Set him before Eleazar the priest, and before all the congregation; and commission him in their sight. +\v 20 You shall give authority to him, that all the congregation of the children of Israel may obey. +\v 21 He shall stand before Eleazar the priest, who shall inquire for him by the judgment of the Urim before Yahweh. At his word they shall go out, and at his word they shall come in, both he and all the children of Israel with him, even all the congregation.” +\p +\v 22 Moses did as Yahweh commanded him. He took Joshua, and set him before Eleazar the priest and before all the congregation. +\v 23 He laid his hands on him and commissioned him, as Yahweh spoke by Moses. +\c 28 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Command the children of Israel, and tell them, ‘See that you present my offering, my food for my offerings made by fire, as a pleasant aroma to me, in their due season.’ +\v 3 You shall tell them, ‘This is the offering made by fire which you shall offer to Yahweh: male lambs a year old without defect, two day by day, for a continual burnt offering. +\v 4 You shall offer the one lamb in the morning, and you shall offer the other lamb at evening, +\v 5 with one tenth of an ephah\f + \fr 28:5 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a meal offering, mixed with the fourth part of a hin\f + \fr 28:5 \ft A hin is about 6.5 liters or 1.7 gallons.\f* of beaten oil. +\v 6 It is a continual burnt offering which was ordained in Mount Sinai for a pleasant aroma, an offering made by fire to Yahweh. +\v 7 Its drink offering shall be the fourth part of a hin\f + \fr 28:7 \ft One hin is about 6.5 liters, so 1/4 hin is about 1.6 liters or 1.7 quarts.\f* for each lamb. You shall pour out a drink offering of strong drink to Yahweh in the holy place. +\v 8 The other lamb you shall offer at evening. As the meal offering of the morning, and as its drink offering, you shall offer it, an offering made by fire, for a pleasant aroma to Yahweh. +\p +\v 9 “‘On the Sabbath day, you shall offer two male lambs a year old without defect, and two tenths of an ephah\f + \fr 28:9 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a meal offering mixed with oil, and its drink offering: +\v 10 this is the burnt offering of every Sabbath, in addition to the continual burnt offering and its drink offering. +\p +\v 11 “‘In the beginnings of your months, you shall offer a burnt offering to Yahweh: two young bulls, one ram, seven male lambs a year old without defect, +\v 12 and three tenths of an ephah\f + \fr 28:12 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of fine flour for a meal offering mixed with oil, for each bull; and two tenth parts of fine flour for a meal offering mixed with oil, for the one ram; +\v 13 and one tenth part of fine flour mixed with oil for a meal offering to every lamb, as a burnt offering of a pleasant aroma, an offering made by fire to Yahweh. +\v 14 Their drink offerings shall be half a hin of wine for a bull, the third part of a hin for the ram, and the fourth part of a hin for a lamb. This is the burnt offering of every month throughout the months of the year. +\v 15 Also, one male goat for a sin offering to Yahweh shall be offered in addition to the continual burnt offering and its drink offering. +\p +\v 16 “‘In the first month, on the fourteenth day of the month, is Yahweh’s Passover. +\v 17 On the fifteenth day of this month shall be a feast. Unleavened bread shall be eaten for seven days. +\v 18 In the first day shall be a holy convocation. You shall do no regular work, +\v 19 but you shall offer an offering made by fire, a burnt offering to Yahweh: two young bulls, one ram, and seven male lambs a year old. They shall be without defect, +\v 20 with their meal offering, fine flour mixed with oil. You shall offer three tenths for a bull, and two tenths for the ram. +\v 21 You shall offer one tenth for every lamb of the seven lambs; +\v 22 and one male goat for a sin offering, to make atonement for you. +\v 23 You shall offer these in addition to the burnt offering of the morning, which is for a continual burnt offering. +\v 24 In this way you shall offer daily, for seven days, the food of the offering made by fire, of a pleasant aroma to Yahweh. It shall be offered in addition to the continual burnt offering and its drink offering. +\v 25 On the seventh day you shall have a holy convocation. You shall do no regular work. +\p +\v 26 “‘Also in the day of the first fruits, when you offer a new meal offering to Yahweh in your feast of weeks, you shall have a holy convocation. You shall do no regular work; +\v 27 but you shall offer a burnt offering for a pleasant aroma to Yahweh: two young bulls, one ram, seven male lambs a year old; +\v 28 and their meal offering, fine flour mixed with oil, three tenths for each bull, two tenths for the one ram, +\v 29 one tenth for every lamb of the seven lambs; +\v 30 and one male goat, to make atonement for you. +\v 31 Besides the continual burnt offering and its meal offering, you shall offer them and their drink offerings. See that they are without defect. +\c 29 +\p +\v 1 “‘In the seventh month, on the first day of the month, you shall have a holy convocation; you shall do no regular work. It is a day of blowing of trumpets to you. +\v 2 You shall offer a burnt offering for a pleasant aroma to Yahweh: one young bull, one ram, seven male lambs a year old without defect; +\v 3 and their meal offering, fine flour mixed with oil: three tenths for the bull, two tenths for the ram, +\v 4 and one tenth for every lamb of the seven lambs; +\v 5 and one male goat for a sin offering, to make atonement for you; +\v 6 in addition to the burnt offering of the new moon with its meal offering, and the continual burnt offering with its meal offering, and their drink offerings, according to their ordinance, for a pleasant aroma, an offering made by fire to Yahweh. +\p +\v 7 “‘On the tenth day of this seventh month you shall have a holy convocation. You shall afflict your souls. You shall do no kind of work; +\v 8 but you shall offer a burnt offering to Yahweh for a pleasant aroma: one young bull, one ram, seven male lambs a year old, all without defect; +\v 9 and their meal offering, fine flour mixed with oil: three tenths for the bull, two tenths for the one ram, +\v 10 one tenth for every lamb of the seven lambs; +\v 11 one male goat for a sin offering, in addition to the sin offering of atonement, and the continual burnt offering, and its meal offering, and their drink offerings. +\p +\v 12 “‘On the fifteenth day of the seventh month you shall have a holy convocation. You shall do no regular work. You shall keep a feast to Yahweh seven days. +\v 13 You shall offer a burnt offering, an offering made by fire, of a pleasant aroma to Yahweh: thirteen young bulls, two rams, fourteen male lambs a year old, all without defect; +\v 14 and their meal offering, fine flour mixed with oil: three tenths for every bull of the thirteen bulls, two tenths for each ram of the two rams, +\v 15 and one tenth for every lamb of the fourteen lambs; +\v 16 and one male goat for a sin offering, in addition to the continual burnt offering, its meal offering, and its drink offering. +\p +\v 17 “‘On the second day you shall offer twelve young bulls, two rams, and fourteen male lambs a year old without defect; +\v 18 and their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance; +\v 19 and one male goat for a sin offering, in addition to the continual burnt offering, with its meal offering and their drink offerings. +\p +\v 20 “‘On the third day: eleven bulls, two rams, fourteen male lambs a year old without defect; +\v 21 and their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance; +\v 22 and one male goat for a sin offering, in addition to the continual burnt offering, and its meal offering, and its drink offering. +\p +\v 23 “‘On the fourth day ten bulls, two rams, fourteen male lambs a year old without defect; +\v 24 their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance; +\v 25 and one male goat for a sin offering; in addition to the continual burnt offering, its meal offering, and its drink offering. +\p +\v 26 “‘On the fifth day: nine bulls, two rams, fourteen male lambs a year old without defect; +\v 27 and their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance, +\v 28 and one male goat for a sin offering, in addition to the continual burnt offering, and its meal offering, and its drink offering. +\p +\v 29 “‘On the sixth day: eight bulls, two rams, fourteen male lambs a year old without defect; +\v 30 and their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance, +\v 31 and one male goat for a sin offering; in addition to the continual burnt offering, its meal offering, and the drink offerings of it. +\p +\v 32 “‘On the seventh day: seven bulls, two rams, fourteen male lambs a year old without defect; +\v 33 and their meal offering and their drink offerings for the bulls, for the rams, and for the lambs, according to their number, after the ordinance, +\v 34 and one male goat for a sin offering; in addition to the continual burnt offering, its meal offering, and its drink offering. +\p +\v 35 “‘On the eighth day you shall have a solemn assembly. You shall do no regular work; +\v 36 but you shall offer a burnt offering, an offering made by fire, a pleasant aroma to Yahweh: one bull, one ram, seven male lambs a year old without defect; +\v 37 their meal offering and their drink offerings for the bull, for the ram, and for the lambs, shall be according to their number, after the ordinance, +\v 38 and one male goat for a sin offering, in addition to the continual burnt offering, with its meal offering, and its drink offering. +\p +\v 39 “‘You shall offer these to Yahweh in your set feasts—in addition to your vows and your free will offerings—for your burnt offerings, your meal offerings, your drink offerings, and your peace offerings.’” +\p +\v 40 Moses told the children of Israel according to all that Yahweh commanded Moses. +\c 30 +\p +\v 1 Moses spoke to the heads of the tribes of the children of Israel, saying, “This is the thing which Yahweh has commanded. +\v 2 When a man vows a vow to Yahweh, or swears an oath to bind his soul with a bond, he shall not break his word. He shall do according to all that proceeds out of his mouth. +\p +\v 3 “Also, when a woman vows a vow to Yahweh and binds herself by a pledge, being in her father’s house, in her youth, +\v 4 and her father hears her vow and her pledge with which she has bound her soul, and her father says nothing to her, then all her vows shall stand, and every pledge with which she has bound her soul shall stand. +\v 5 But if her father forbids her in the day that he hears, none of her vows or of her pledges with which she has bound her soul, shall stand. Yahweh will forgive her, because her father has forbidden her. +\p +\v 6 “If she has a husband, while her vows are on her, or the rash utterance of her lips with which she has bound her soul, +\v 7 and her husband hears it, and says nothing to her in the day that he hears it; then her vows shall stand, and her pledges with which she has bound her soul shall stand. +\v 8 But if her husband forbids her in the day that he hears it, then he makes void her vow which is on her and the rash utterance of her lips, with which she has bound her soul. Yahweh will forgive her. +\p +\v 9 “But the vow of a widow, or of her who is divorced, everything with which she has bound her soul shall stand against her. +\p +\v 10 “If she vowed in her husband’s house or bound her soul by a bond with an oath, +\v 11 and her husband heard it, and held his peace at her and didn’t disallow her, then all her vows shall stand, and every pledge with which she bound her soul shall stand. +\v 12 But if her husband made them null and void in the day that he heard them, then whatever proceeded out of her lips concerning her vows, or concerning the bond of her soul, shall not stand. Her husband has made them void. Yahweh will forgive her. +\v 13 Every vow, and every binding oath to afflict the soul, her husband may establish it, or her husband may make it void. +\v 14 But if her husband says nothing to her from day to day, then he establishes all her vows or all her pledges which are on her. He has established them, because he said nothing to her in the day that he heard them. +\v 15 But if he makes them null and void after he has heard them, then he shall bear her iniquity.” +\p +\v 16 These are the statutes which Yahweh commanded Moses, between a man and his wife, between a father and his daughter, being in her youth, in her father’s house. +\c 31 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Avenge the children of Israel on the Midianites. Afterward you shall be gathered to your people.” +\p +\v 3 Moses spoke to the people, saying, “Arm men from among you for war, that they may go against Midian, to execute Yahweh’s vengeance on Midian. +\v 4 You shall send one thousand out of every tribe, throughout all the tribes of Israel, to the war.” +\v 5 So there were delivered, out of the thousands of Israel, a thousand from every tribe, twelve thousand armed for war. +\v 6 Moses sent them, one thousand of every tribe, to the war with Phinehas the son of Eleazar the priest, to the war, with the vessels of the sanctuary and the trumpets for the alarm in his hand. +\v 7 They fought against Midian, as Yahweh commanded Moses. They killed every male. +\v 8 They killed the kings of Midian with the rest of their slain: Evi, Rekem, Zur, Hur, and Reba, the five kings of Midian. They also killed Balaam the son of Beor with the sword. +\v 9 The children of Israel took the women of Midian captive with their little ones; and all their livestock, all their flocks, and all their goods, they took as plunder. +\v 10 All their cities in the places in which they lived, and all their encampments, they burned with fire. +\v 11 They took all the captives, and all the plunder, both of man and of animal. +\v 12 They brought the captives with the prey and the plunder, to Moses, and to Eleazar the priest, and to the congregation of the children of Israel, to the camp at the plains of Moab, which are by the Jordan at Jericho. +\v 13 Moses and Eleazar the priest, with all the princes of the congregation, went out to meet them outside of the camp. +\v 14 Moses was angry with the officers of the army, the captains of thousands and the captains of hundreds, who came from the service of the war. +\v 15 Moses said to them, “Have you saved all the women alive? +\v 16 Behold, these caused the children of Israel, through the counsel of Balaam, to commit trespass against Yahweh in the matter of Peor, and so the plague was among the congregation of Yahweh. +\v 17 Now therefore kill every male among the little ones, and kill every woman who has known man by lying with him. +\v 18 But all the girls, who have not known man by lying with him, keep alive for yourselves. +\p +\v 19 “Encamp outside of the camp for seven days. Whoever has killed any person, and whoever has touched any slain, purify yourselves on the third day and on the seventh day, you and your captives. +\v 20 You shall purify every garment, and all that is made of skin, and all work of goats’ hair, and all things made of wood.” +\p +\v 21 Eleazar the priest said to the men of war who went to the battle, “This is the statute of the law which Yahweh has commanded Moses. +\v 22 However the gold, and the silver, the bronze, the iron, the tin, and the lead, +\v 23 everything that may withstand the fire, you shall make to go through the fire, and it shall be clean; nevertheless it shall be purified with the water for impurity. All that doesn’t withstand the fire you shall make to go through the water. +\v 24 You shall wash your clothes on the seventh day, and you shall be clean. Afterward you shall come into the camp.” +\p +\v 25 Yahweh spoke to Moses, saying, +\v 26 “Count the plunder that was taken, both of man and of animal, you, and Eleazar the priest, and the heads of the fathers’ households of the congregation; +\v 27 and divide the plunder into two parts: between the men skilled in war, who went out to battle, and all the congregation. +\v 28 Levy a tribute to Yahweh of the men of war who went out to battle: one soul of five hundred; of the persons, of the cattle, of the donkeys, and of the flocks. +\v 29 Take it from their half, and give it to Eleazar the priest, for Yahweh’s wave offering. +\v 30 Of the children of Israel’s half, you shall take one drawn out of every fifty, of the persons, of the cattle, of the donkeys, and of the flocks, of all the livestock, and give them to the Levites, who perform the duty of Yahweh’s tabernacle.” +\p +\v 31 Moses and Eleazar the priest did as Yahweh commanded Moses. +\p +\v 32 Now the plunder, over and above the booty which the men of war took, was six hundred seventy-five thousand sheep, +\v 33 seventy-two thousand head of cattle, +\v 34 sixty-one thousand donkeys, +\v 35 and thirty-two thousand persons in all, of the women who had not known man by lying with him. +\v 36 The half, which was the portion of those who went out to war, was in number three hundred thirty-seven thousand five hundred sheep; +\v 37 and Yahweh’s tribute of the sheep was six hundred seventy-five. +\v 38 The cattle were thirty-six thousand, of which Yahweh’s tribute was seventy-two. +\v 39 The donkeys were thirty thousand five hundred, of which Yahweh’s tribute was sixty-one. +\v 40 The persons were sixteen thousand, of whom Yahweh’s tribute was thirty-two persons. +\v 41 Moses gave the tribute, which was Yahweh’s wave offering, to Eleazar the priest, as Yahweh commanded Moses. +\v 42 Of the children of Israel’s half, which Moses divided off from the men who fought +\v 43 (now the congregation’s half was three hundred thirty-seven thousand five hundred sheep, +\v 44 thirty-six thousand head of cattle, +\v 45 thirty thousand five hundred donkeys, +\v 46 and sixteen thousand persons), +\v 47 even of the children of Israel’s half, Moses took one drawn out of every fifty, both of man and of animal, and gave them to the Levites, who performed the duty of Yahweh’s tabernacle, as Yahweh commanded Moses. +\p +\v 48 The officers who were over the thousands of the army, the captains of thousands, and the captains of hundreds, came near to Moses. +\v 49 They said to Moses, “Your servants have taken the sum of the men of war who are under our command, and there lacks not one man of us. +\v 50 We have brought Yahweh’s offering, what every man found: gold ornaments, armlets, bracelets, signet rings, earrings, and necklaces, to make atonement for our souls before Yahweh.” +\p +\v 51 Moses and Eleazar the priest took their gold, even all worked jewels. +\v 52 All the gold of the wave offering that they offered up to Yahweh, of the captains of thousands, and of the captains of hundreds, was sixteen thousand seven hundred fifty shekels.\f + \fr 31:52 \ft A shekel is about 10 grams or about 0.35 ounces, so 16,750 shekels is about 167.5 kilograms or about 368.5 pounds.\f* +\v 53 The men of war had taken booty, every man for himself. +\v 54 Moses and Eleazar the priest took the gold of the captains of thousands and of hundreds, and brought it into the Tent of Meeting for a memorial for the children of Israel before Yahweh. +\c 32 +\p +\v 1 Now the children of Reuben and the children of Gad had a very great multitude of livestock. They saw the land of Jazer, and the land of Gilead. Behold, the place was a place for livestock. +\v 2 Then the children of Gad and the children of Reuben came and spoke to Moses, and to Eleazar the priest, and to the princes of the congregation, saying, +\v 3 “Ataroth, Dibon, Jazer, Nimrah, Heshbon, Elealeh, Sebam, Nebo, and Beon, +\v 4 the land which Yahweh struck before the congregation of Israel, is a land for livestock; and your servants have livestock.” +\v 5 They said, “If we have found favor in your sight, let this land be given to your servants for a possession. Don’t bring us over the Jordan.” +\p +\v 6 Moses said to the children of Gad, and to the children of Reuben, “Shall your brothers go to war while you sit here? +\v 7 Why do you discourage the heart of the children of Israel from going over into the land which Yahweh has given them? +\v 8 Your fathers did so when I sent them from Kadesh Barnea to see the land. +\v 9 For when they went up to the valley of Eshcol, and saw the land, they discouraged the heart of the children of Israel, that they should not go into the land which Yahweh had given them. +\v 10 Yahweh’s anger burned in that day, and he swore, saying, +\v 11 ‘Surely none of the men who came up out of Egypt, from twenty years old and upward, shall see the land which I swore to Abraham, to Isaac, and to Jacob; because they have not wholly followed me, +\v 12 except Caleb the son of Jephunneh the Kenizzite, and Joshua the son of Nun, because they have followed Yahweh completely.’ +\v 13 Yahweh’s anger burned against Israel, and he made them wander back and forth in the wilderness forty years, until all the generation who had done evil in Yahweh’s sight was consumed. +\p +\v 14 “Behold, you have risen up in your fathers’ place, an increase of sinful men, to increase the fierce anger of Yahweh toward Israel. +\v 15 For if you turn away from after him, he will yet again leave them in the wilderness; and you will destroy all these people.” +\p +\v 16 They came near to him, and said, “We will build sheepfolds here for our livestock, and cities for our little ones; +\v 17 but we ourselves will be ready armed to go before the children of Israel, until we have brought them to their place. Our little ones shall dwell in the fortified cities because of the inhabitants of the land. +\v 18 We will not return to our houses until the children of Israel have all received their inheritance. +\v 19 For we will not inherit with them on the other side of the Jordan and beyond, because our inheritance has come to us on this side of the Jordan eastward.” +\p +\v 20 Moses said to them: “If you will do this thing, if you will arm yourselves to go before Yahweh to the war, +\v 21 and every one of your armed men will pass over the Jordan before Yahweh until he has driven out his enemies from before him, +\v 22 and the land is subdued before Yahweh; then afterward you shall return, and be clear of obligation to Yahweh and to Israel. Then this land shall be your possession before Yahweh. +\p +\v 23 “But if you will not do so, behold, you have sinned against Yahweh; and be sure your sin will find you out. +\v 24 Build cities for your little ones, and folds for your sheep; and do that which has proceeded out of your mouth.” +\p +\v 25 The children of Gad and the children of Reuben spoke to Moses, saying, “Your servants will do as my lord commands. +\v 26 Our little ones, our wives, our flocks, and all our livestock shall be there in the cities of Gilead; +\v 27 but your servants will pass over, every man who is armed for war, before Yahweh to battle, as my lord says.” +\p +\v 28 So Moses commanded concerning them to Eleazar the priest, and to Joshua the son of Nun, and to the heads of the fathers’ households of the tribes of the children of Israel. +\v 29 Moses said to them, “If the children of Gad and the children of Reuben will pass with you over the Jordan, every man who is armed to battle before Yahweh, and the land is subdued before you, then you shall give them the land of Gilead for a possession; +\v 30 but if they will not pass over with you armed, they shall have possessions among you in the land of Canaan.” +\p +\v 31 The children of Gad and the children of Reuben answered, saying, “As Yahweh has said to your servants, so will we do. +\v 32 We will pass over armed before Yahweh into the land of Canaan, and the possession of our inheritance shall remain with us beyond the Jordan.” +\p +\v 33 Moses gave to them, even to the children of Gad, and to the children of Reuben, and to the half-tribe of Manasseh the son of Joseph, the kingdom of Sihon king of the Amorites, and the kingdom of Og king of Bashan; the land, according to its cities and borders, even the cities of the surrounding land. +\v 34 The children of Gad built Dibon, Ataroth, Aroer, +\v 35 Atroth-shophan, Jazer, Jogbehah, +\v 36 Beth Nimrah, and Beth Haran: fortified cities and folds for sheep. +\v 37 The children of Reuben built Heshbon, Elealeh, Kiriathaim, +\v 38 Nebo, and Baal Meon, (their names being changed), and Sibmah. They gave other names to the cities which they built. +\v 39 The children of Machir the son of Manasseh went to Gilead, took it, and dispossessed the Amorites who were therein. +\v 40 Moses gave Gilead to Machir the son of Manasseh; and he lived therein. +\v 41 Jair the son of Manasseh went and took its villages, and called them Havvoth Jair. +\v 42 Nobah went and took Kenath and its villages, and called it Nobah, after his own name. +\c 33 +\p +\v 1 These are the journeys of the children of Israel, when they went out of the land of Egypt by their armies under the hand of Moses and Aaron. +\v 2 Moses wrote the starting points of their journeys by the commandment of Yahweh. These are their journeys according to their starting points. +\v 3 They traveled from Rameses in the first month, on the fifteenth day of the first month; on the next day after the Passover, the children of Israel went out with a high hand in the sight of all the Egyptians, +\v 4 while the Egyptians were burying all their firstborn, whom Yahweh had struck among them. Yahweh also executed judgments on their gods. +\v 5 The children of Israel traveled from Rameses, and encamped in Succoth. +\v 6 They traveled from Succoth, and encamped in Etham, which is in the edge of the wilderness. +\v 7 They traveled from Etham, and turned back to Pihahiroth, which is before Baal Zephon, and they encamped before Migdol. +\v 8 They traveled from before Hahiroth, and crossed through the middle of the sea into the wilderness. They went three days’ journey in the wilderness of Etham, and encamped in Marah. +\v 9 They traveled from Marah, and came to Elim. In Elim, there were twelve springs of water and seventy palm trees, and they encamped there. +\v 10 They traveled from Elim, and encamped by the Red Sea. +\v 11 They traveled from the Red Sea, and encamped in the wilderness of Sin. +\v 12 They traveled from the wilderness of Sin, and encamped in Dophkah. +\v 13 They traveled from Dophkah, and encamped in Alush. +\v 14 They traveled from Alush, and encamped in Rephidim, where there was no water for the people to drink. +\v 15 They traveled from Rephidim, and encamped in the wilderness of Sinai. +\v 16 They traveled from the wilderness of Sinai, and encamped in Kibroth Hattaavah. +\v 17 They traveled from Kibroth Hattaavah, and encamped in Hazeroth. +\v 18 They traveled from Hazeroth, and encamped in Rithmah. +\v 19 They traveled from Rithmah, and encamped in Rimmon Perez. +\v 20 They traveled from Rimmon Perez, and encamped in Libnah. +\v 21 They traveled from Libnah, and encamped in Rissah. +\v 22 They traveled from Rissah, and encamped in Kehelathah. +\v 23 They traveled from Kehelathah, and encamped in Mount Shepher. +\v 24 They traveled from Mount Shepher, and encamped in Haradah. +\v 25 They traveled from Haradah, and encamped in Makheloth. +\v 26 They traveled from Makheloth, and encamped in Tahath. +\v 27 They traveled from Tahath, and encamped in Terah. +\v 28 They traveled from Terah, and encamped in Mithkah. +\v 29 They traveled from Mithkah, and encamped in Hashmonah. +\v 30 They traveled from Hashmonah, and encamped in Moseroth. +\v 31 They traveled from Moseroth, and encamped in Bene Jaakan. +\v 32 They traveled from Bene Jaakan, and encamped in Hor Haggidgad. +\v 33 They traveled from Hor Haggidgad, and encamped in Jotbathah. +\v 34 They traveled from Jotbathah, and encamped in Abronah. +\v 35 They traveled from Abronah, and encamped in Ezion Geber. +\v 36 They traveled from Ezion Geber, and encamped at Kadesh in the wilderness of Zin. +\v 37 They traveled from Kadesh, and encamped in Mount Hor, in the edge of the land of Edom. +\v 38 Aaron the priest went up into Mount Hor at the commandment of Yahweh and died there, in the fortieth year after the children of Israel had come out of the land of Egypt, in the fifth month, on the first day of the month. +\v 39 Aaron was one hundred twenty-three years old when he died in Mount Hor. +\v 40 The Canaanite king of Arad, who lived in the South in the land of Canaan, heard of the coming of the children of Israel. +\v 41 They traveled from Mount Hor, and encamped in Zalmonah. +\v 42 They traveled from Zalmonah, and encamped in Punon. +\v 43 They traveled from Punon, and encamped in Oboth. +\v 44 They traveled from Oboth, and encamped in Iye Abarim, in the border of Moab. +\v 45 They traveled from Iyim, and encamped in Dibon Gad. +\v 46 They traveled from Dibon Gad, and encamped in Almon Diblathaim. +\v 47 They traveled from Almon Diblathaim, and encamped in the mountains of Abarim, before Nebo. +\v 48 They traveled from the mountains of Abarim, and encamped in the plains of Moab by the Jordan at Jericho. +\v 49 They encamped by the Jordan, from Beth Jeshimoth even to Abel Shittim in the plains of Moab. +\v 50 Yahweh spoke to Moses in the plains of Moab by the Jordan at Jericho, saying, +\v 51 Speak to the children of Israel, and tell them, “When you pass over the Jordan into the land of Canaan, +\v 52 then you shall drive out all the inhabitants of the land from before you, destroy all their stone idols, destroy all their molten images, and demolish all their high places. +\v 53 You shall take possession of the land, and dwell therein; for I have given the land to you to possess it. +\v 54 You shall inherit the land by lot according to your families; to the larger groups you shall give a larger inheritance, and to the smaller you shall give a smaller inheritance. Wherever the lot falls to any man, that shall be his. You shall inherit according to the tribes of your fathers. +\p +\v 55 “But if you do not drive out the inhabitants of the land from before you, then those you let remain of them will be like pricks in your eyes and thorns in your sides. They will harass you in the land in which you dwell. +\v 56 It shall happen that as I thought to do to them, so I will do to you.” +\c 34 +\p +\v 1 Yahweh spoke to Moses, saying, +\v 2 “Command the children of Israel, and tell them, ‘When you come into the land of Canaan (this is the land that shall fall to you for an inheritance, even the land of Canaan according to its borders), +\v 3 then your south quarter shall be from the wilderness of Zin along by the side of Edom, and your south border shall be from the end of the Salt Sea eastward. +\v 4 Your border shall turn about southward of the ascent of Akrabbim, and pass along to Zin; and it shall pass southward of Kadesh Barnea; and it shall go from there to Hazar Addar, and pass along to Azmon. +\v 5 The border shall turn about from Azmon to the brook of Egypt, and it shall end at the sea. +\p +\v 6 “‘For the western border, you shall have the great sea and its border. This shall be your west border. +\p +\v 7 “‘This shall be your north border: from the great sea you shall mark out for yourselves Mount Hor. +\v 8 From Mount Hor you shall mark out to the entrance of Hamath; and the border shall pass by Zedad. +\v 9 Then the border shall go to Ziphron, and it shall end at Hazar Enan. This shall be your north border. +\p +\v 10 “‘You shall mark out your east border from Hazar Enan to Shepham. +\v 11 The border shall go down from Shepham to Riblah, on the east side of Ain. The border shall go down, and shall reach to the side of the sea of Chinnereth eastward. +\v 12 The border shall go down to the Jordan, and end at the Salt Sea. This shall be your land according to its borders around it.’” +\p +\v 13 Moses commanded the children of Israel, saying, “This is the land which you shall inherit by lot, which Yahweh has commanded to give to the nine tribes, and to the half-tribe; +\v 14 for the tribe of the children of Reuben according to their fathers’ houses, the tribe of the children of Gad according to their fathers’ houses, and the half-tribe of Manasseh have received their inheritance. +\v 15 The two tribes and the half-tribe have received their inheritance beyond the Jordan at Jericho eastward, toward the sunrise.” +\p +\v 16 Yahweh spoke to Moses, saying, +\v 17 “These are the names of the men who shall divide the land to you for inheritance: Eleazar the priest, and Joshua the son of Nun. +\v 18 You shall take one prince of every tribe, to divide the land for inheritance. +\v 19 These are the names of the men: Of the tribe of Judah, Caleb the son of Jephunneh. +\v 20 Of the tribe of the children of Simeon, Shemuel the son of Ammihud. +\v 21 Of the tribe of Benjamin, Elidad the son of Chislon. +\v 22 Of the tribe of the children of Dan a prince, Bukki the son of Jogli. +\v 23 Of the children of Joseph: of the tribe of the children of Manasseh a prince, Hanniel the son of Ephod. +\v 24 Of the tribe of the children of Ephraim a prince, Kemuel the son of Shiphtan. +\v 25 Of the tribe of the children of Zebulun a prince, Elizaphan the son of Parnach. +\v 26 Of the tribe of the children of Issachar a prince, Paltiel the son of Azzan. +\v 27 Of the tribe of the children of Asher a prince, Ahihud the son of Shelomi. +\v 28 Of the tribe of the children of Naphtali a prince, Pedahel the son of Ammihud.” +\v 29 These are they whom Yahweh commanded to divide the inheritance to the children of Israel in the land of Canaan. +\c 35 +\p +\v 1 Yahweh spoke to Moses in the plains of Moab by the Jordan at Jericho, saying, +\v 2 “Command the children of Israel to give to the Levites cities to dwell in out of their inheritance. You shall give pasture lands for the cities around them to the Levites. +\v 3 They shall have the cities to dwell in. Their pasture lands shall be for their livestock, and for their possessions, and for all their animals. +\p +\v 4 “The pasture lands of the cities, which you shall give to the Levites, shall be from the wall of the city and outward one thousand cubits\f + \fr 35:4 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* around it. +\v 5 You shall measure outside of the city for the east side two thousand cubits, and for the south side two thousand cubits, and for the west side two thousand cubits, and for the north side two thousand cubits, the city being in the middle. This shall be the pasture lands of their cities. +\p +\v 6 “The cities which you shall give to the Levites, they shall be the six cities of refuge, which you shall give for the man slayer to flee to. Besides them you shall give forty-two cities. +\v 7 All the cities which you shall give to the Levites shall be forty-eight cities together with their pasture lands. +\v 8 Concerning the cities which you shall give of the possession of the children of Israel, from the many you shall take many, and from the few you shall take few. Everyone according to his inheritance which he inherits shall give some of his cities to the Levites.” +\v 9 Yahweh spoke to Moses, saying, +\v 10 “Speak to the children of Israel, and tell them, ‘When you pass over the Jordan into the land of Canaan, +\v 11 then you shall appoint for yourselves cities to be cities of refuge for you, that the man slayer who kills any person unwittingly may flee there. +\v 12 The cities shall be for your refuge from the avenger, that the man slayer not die until he stands before the congregation for judgment. +\v 13 The cities which you shall give shall be for you six cities of refuge. +\v 14 You shall give three cities beyond the Jordan, and you shall give three cities in the land of Canaan. They shall be cities of refuge. +\v 15 These six cities shall be refuge for the children of Israel, for the stranger, and for the foreigner living among them, that everyone who kills any person unwittingly may flee there. +\p +\v 16 “‘But if he struck him with an instrument of iron, so that he died, he is a murderer. The murderer shall surely be put to death. +\v 17 If he struck him with a stone in the hand, by which a man may die, and he died, he is a murderer. The murderer shall surely be put to death. +\v 18 Or if he struck him with a weapon of wood in the hand, by which a man may die, and he died, he is a murderer. The murderer shall surely be put to death. +\v 19 The avenger of blood shall himself put the murderer to death. When he meets him, he shall put him to death. +\v 20 If he shoved him out of hatred, or hurled something at him while lying in wait, so that he died, +\v 21 or in hostility struck him with his hand, so that he died, he who struck him shall surely be put to death. He is a murderer. The avenger of blood shall put the murderer to death when he meets him. +\p +\v 22 “‘But if he shoved him suddenly without hostility, or hurled on him anything without lying in wait, +\v 23 or with any stone, by which a man may die, not seeing him, and cast it on him so that he died, and he was not his enemy and not seeking his harm, +\v 24 then the congregation shall judge between the striker and the avenger of blood according to these ordinances. +\v 25 The congregation shall deliver the man slayer out of the hand of the avenger of blood, and the congregation shall restore him to his city of refuge, where he had fled. He shall dwell therein until the death of the high priest, who was anointed with the holy oil. +\p +\v 26 “‘But if the man slayer shall at any time go beyond the border of his city of refuge where he flees, +\v 27 and the avenger of blood finds him outside of the border of his city of refuge, and the avenger of blood kills the man slayer, he shall not be guilty of blood, +\v 28 because he should have remained in his city of refuge until the death of the high priest. But after the death of the high priest, the man slayer shall return into the land of his possession. +\p +\v 29 “‘These things shall be for a statute and ordinance to you throughout your generations in all your dwellings. +\p +\v 30 “‘Whoever kills any person, the murderer shall be slain based on the testimony of witnesses; but one witness shall not testify alone against any person so that he dies. +\p +\v 31 “‘Moreover you shall take no ransom for the life of a murderer who is guilty of death. He shall surely be put to death. +\p +\v 32 “‘You shall take no ransom for him who has fled to his city of refuge, that he may come again to dwell in the land before the death of the priest. +\p +\v 33 “‘So you shall not pollute the land where you live; for blood pollutes the land. No atonement can be made for the land for the blood that is shed in it, but by the blood of him who shed it. +\v 34 You shall not defile the land which you inhabit, where I dwell; for I, Yahweh, dwell among the children of Israel.’” +\c 36 +\p +\v 1 The heads of the fathers’ households of the family of the children of Gilead, the son of Machir, the son of Manasseh, of the families of the sons of Joseph, came near and spoke before Moses and before the princes, the heads of the fathers’ households of the children of Israel. +\v 2 They said, “Yahweh commanded my lord to give the land for inheritance by lot to the children of Israel. My lord was commanded by Yahweh to give the inheritance of Zelophehad our brother to his daughters. +\v 3 If they are married to any of the sons of the other tribes of the children of Israel, then their inheritance will be taken away from the inheritance of our fathers, and will be added to the inheritance of the tribe to which they shall belong. So it will be taken away from the lot of our inheritance. +\v 4 When the jubilee of the children of Israel comes, then their inheritance will be added to the inheritance of the tribe to which they shall belong. So their inheritance will be taken away from the inheritance of the tribe of our fathers.” +\p +\v 5 Moses commanded the children of Israel according to Yahweh’s word, saying, “The tribe of the sons of Joseph speak what is right. +\v 6 This is the thing which Yahweh commands concerning the daughters of Zelophehad, saying, ‘Let them be married to whom they think best, only they shall marry into the family of the tribe of their father. +\v 7 So shall no inheritance of the children of Israel move from tribe to tribe; for the children of Israel shall all keep the inheritance of the tribe of his fathers. +\v 8 Every daughter who possesses an inheritance in any tribe of the children of Israel shall be wife to one of the family of the tribe of her father, that the children of Israel may each possess the inheritance of his fathers. +\v 9 So shall no inheritance move from one tribe to another tribe; for the tribes of the children of Israel shall each keep his own inheritance.’” +\p +\v 10 The daughters of Zelophehad did as Yahweh commanded Moses: +\v 11 for Mahlah, Tirzah, Hoglah, Milcah, and Noah, the daughters of Zelophehad, were married to their father’s brothers’ sons. +\v 12 They were married into the families of the sons of Manasseh the son of Joseph. Their inheritance remained in the tribe of the family of their father. +\p +\v 13 These are the commandments and the ordinances which Yahweh commanded by Moses to the children of Israel in the plains of Moab by the Jordan at Jericho. diff --git a/c-sharp/assets/WEB/05DEUengWEBUS.SFM b/c-sharp/assets/WEB/05DEUengWEBUS.SFM new file mode 100644 index 0000000000..4f14bc02c9 --- /dev/null +++ b/c-sharp/assets/WEB/05DEUengWEBUS.SFM @@ -0,0 +1,1453 @@ +\id DEU 1World English Bible (WEB) +\ide UTF-8 +\h Deuteronomy +\toc1 The Fifth Book of Moses, Commonly Called Deuteronomy +\toc2 Deuteronomy +\toc3 Deuteronomy +\mt2 The Fifth Book of Moses, +\mt3 Commonly Called +\mt1 Deuteronomy +\c 1 +\p +\v 1 These are the words which Moses spoke to all Israel beyond the Jordan in the wilderness, in the Arabah opposite Suf, between Paran, Tophel, Laban, Hazeroth, and Dizahab. +\v 2 It is eleven days’ journey from Horeb by the way of Mount Seir to Kadesh Barnea. +\v 3 In the fortieth year, in the eleventh month, on the first day of the month, Moses spoke to the children of Israel according to all that Yahweh\f + \fr 1:3 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* had given him in commandment to them, +\v 4 after he had struck Sihon the king of the Amorites who lived in Heshbon, and Og the king of Bashan who lived in Ashtaroth, at Edrei. +\v 5 Beyond the Jordan, in the land of Moab, Moses began to declare this law, saying, +\v 6 “Yahweh our God\f + \fr 1:6 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* spoke to us in Horeb, saying, ‘You have lived long enough at this mountain. +\v 7 Turn, and take your journey, and go to the hill country of the Amorites and to all the places near there: in the Arabah, in the hill country, in the lowland, in the South, by the seashore, in the land of the Canaanites, and in Lebanon as far as the great river, the river Euphrates. +\v 8 Behold,\f + \fr 1:8 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I have set the land before you. Go in and possess the land which Yahweh swore to your fathers—to Abraham, to Isaac, and to Jacob—to give to them and to their offspring\f + \fr 1:8 \ft or, seed\f* after them.’” +\p +\v 9 I spoke to you at that time, saying, “I am not able to bear you myself alone. +\v 10 Yahweh your God has multiplied you, and behold, you are today as the stars of the sky for multitude. +\v 11 May Yahweh, the God of your fathers, make you a thousand times as many as you are and bless you, as he has promised you! +\v 12 How can I myself alone bear your problems, your burdens, and your strife? +\v 13 Take wise men of understanding who are respected among your tribes, and I will make them heads over you.” +\p +\v 14 You answered me, and said, “The thing which you have spoken is good to do.” +\v 15 So I took the heads of your tribes, wise and respected men, and made them heads over you, captains of thousands, captains of hundreds, captains of fifties, captains of tens, and officers, according to your tribes. +\v 16 I commanded your judges at that time, saying, “Hear cases between your brothers and judge righteously between a man and his brother, and the foreigner who is living with him. +\v 17 You shall not show partiality in judgment; you shall hear the small and the great alike. You shall not be afraid of the face of man, for the judgment is God’s. The case that is too hard for you, you shall bring to me, and I will hear it.” +\v 18 I commanded you at that time all the things which you should do. +\v 19 We traveled from Horeb and went through all that great and terrible wilderness which you saw, by the way to the hill country of the Amorites, as Yahweh our God commanded us; and we came to Kadesh Barnea. +\v 20 I said to you, “You have come to the hill country of the Amorites, which Yahweh our God gives to us. +\v 21 Behold, Yahweh your God has set the land before you. Go up, take possession, as Yahweh the God of your fathers has spoken to you. Don’t be afraid, neither be dismayed.” +\p +\v 22 You came near to me, everyone of you, and said, “Let’s send men before us, that they may search the land for us, and bring back to us word of the way by which we must go up, and the cities to which we shall come.” +\p +\v 23 The thing pleased me well. I took twelve of your men, one man for every tribe. +\v 24 They turned and went up into the hill country, and came to the valley of Eshcol, and spied it out. +\v 25 They took some of the fruit of the land in their hands and brought it down to us, and brought us word again, and said, “It is a good land which Yahweh our God gives to us.” +\p +\v 26 Yet you wouldn’t go up, but rebelled against the commandment of Yahweh your God. +\v 27 You murmured in your tents, and said, “Because Yahweh hated us, he has brought us out of the land of Egypt, to deliver us into the hand of the Amorites to destroy us. +\v 28 Where are we going up? Our brothers have made our heart melt, saying, ‘The people are greater and taller than we. The cities are great and fortified up to the sky. Moreover we have seen the sons of the Anakim there!’” +\p +\v 29 Then I said to you, “Don’t be terrified. Don’t be afraid of them. +\v 30 Yahweh your God, who goes before you, he will fight for you, according to all that he did for you in Egypt before your eyes, +\v 31 and in the wilderness where you have seen how that Yahweh your God carried you, as a man carries his son, in all the way that you went, until you came to this place.” +\p +\v 32 Yet in this thing you didn’t believe Yahweh your God, +\v 33 who went before you on the way, to seek out a place for you to pitch your tents in: in fire by night, to show you by what way you should go, and in the cloud by day. +\v 34 Yahweh heard the voice of your words and was angry, and swore, saying, +\v 35 “Surely not one of these men of this evil generation shall see the good land which I swore to give to your fathers, +\v 36 except Caleb the son of Jephunneh. He shall see it. I will give the land that he has trodden on to him and to his children, because he has wholly followed Yahweh.” +\p +\v 37 Also Yahweh was angry with me for your sakes, saying, “You also shall not go in there. +\v 38 Joshua the son of Nun, who stands before you, shall go in there. Encourage him, for he shall cause Israel to inherit it. +\v 39 Moreover your little ones, whom you said would be captured or killed, your children, who today have no knowledge of good or evil, shall go in there. I will give it to them, and they shall possess it. +\v 40 But as for you, turn, and take your journey into the wilderness by the way to the Red Sea.” +\p +\v 41 Then you answered and said to me, “We have sinned against Yahweh. We will go up and fight, according to all that Yahweh our God commanded us.” Every man of you put on his weapons of war, and presumed to go up into the hill country. +\p +\v 42 Yahweh said to me, “Tell them, ‘Don’t go up and don’t fight; for I am not among you, lest you be struck before your enemies.’” +\p +\v 43 So I spoke to you, and you didn’t listen; but you rebelled against the commandment of Yahweh, and were presumptuous, and went up into the hill country. +\v 44 The Amorites, who lived in that hill country, came out against you and chased you as bees do, and beat you down in Seir, even to Hormah. +\v 45 You returned and wept before Yahweh, but Yahweh didn’t listen to your voice, nor turn his ear to you. +\v 46 So you stayed in Kadesh many days, according to the days that you remained. +\c 2 +\p +\v 1 Then we turned, and took our journey into the wilderness by the way to the Red Sea, as Yahweh spoke to me; and we encircled Mount Seir many days. +\p +\v 2 Yahweh spoke to me, saying, +\v 3 “You have encircled this mountain long enough. Turn northward. +\v 4 Command the people, saying, ‘You are to pass through the border of your brothers, the children of Esau, who dwell in Seir; and they will be afraid of you. Therefore be careful. +\v 5 Don’t contend with them; for I will not give you any of their land, no, not so much as for the sole of the foot to tread on, because I have given Mount Seir to Esau for a possession. +\v 6 You shall purchase food from them for money, that you may eat. You shall also buy water from them for money, that you may drink.’” +\p +\v 7 For Yahweh your God has blessed you in all the work of your hands. He has known your walking through this great wilderness. These forty years, Yahweh your God has been with you. You have lacked nothing. +\p +\v 8 So we passed by from our brothers, the children of Esau, who dwell in Seir, from the way of the Arabah from Elath and from Ezion Geber. We turned and passed by the way of the wilderness of Moab. +\p +\v 9 Yahweh said to me, “Don’t bother Moab, neither contend with them in battle; for I will not give you any of his land for a possession, because I have given Ar to the children of Lot for a possession.” +\p +\v 10 (The Emim lived there before, a great and numerous people, and tall as the Anakim. +\v 11 These also are considered to be Rephaim, as the Anakim; but the Moabites call them Emim. +\v 12 The Horites also lived in Seir in the past, but the children of Esau succeeded them. They destroyed them from before them, and lived in their place, as Israel did to the land of his possession, which Yahweh gave to them.) +\p +\v 13 “Now rise up and cross over the brook Zered.” We went over the brook Zered. +\p +\v 14 The days in which we came from Kadesh Barnea until we had come over the brook Zered were thirty-eight years, until all the generation of the men of war were consumed from the middle of the camp, as Yahweh swore to them. +\v 15 Moreover Yahweh’s hand was against them, to destroy them from the middle of the camp, until they were consumed. +\v 16 So, when all the men of war were consumed and dead from among the people, +\v 17 Yahweh spoke to me, saying, +\v 18 “You are to pass over Ar, the border of Moab, today. +\v 19 When you come near the border of the children of Ammon, don’t bother them, nor contend with them; for I will not give you any of the land of the children of Ammon for a possession, because I have given it to the children of Lot for a possession.” +\p +\v 20 (That also is considered a land of Rephaim. Rephaim lived there in the past, but the Ammonites call them Zamzummim, +\v 21 a great people, many, and tall, as the Anakim; but Yahweh destroyed them from before Israel, and they succeeded them, and lived in their place, +\v 22 as he did for the children of Esau who dwell in Seir, when he destroyed the Horites from before them; and they succeeded them, and lived in their place even to this day. +\v 23 Then the Avvim, who lived in villages as far as Gaza: the Caphtorim, who came out of Caphtor, destroyed them and lived in their place.) +\p +\v 24 “Rise up, take your journey, and pass over the valley of the Arnon. Behold, I have given into your hand Sihon the Amorite, king of Heshbon, and his land; begin to possess it, and contend with him in battle. +\v 25 Today I will begin to put the dread of you and the fear of you on the peoples who are under the whole sky, who shall hear the report of you, and shall tremble and be in anguish because of you.” +\p +\v 26 I sent messengers out of the wilderness of Kedemoth to Sihon king of Heshbon with words of peace, saying, +\v 27 “Let me pass through your land. I will go along by the highway. I will turn neither to the right hand nor to the left. +\v 28 You shall sell me food for money, that I may eat; and give me water for money, that I may drink. Just let me pass through on my feet, +\v 29 as the children of Esau who dwell in Seir, and the Moabites who dwell in Ar, did to me, until I pass over the Jordan into the land which Yahweh our God gives us.” +\v 30 But Sihon king of Heshbon would not let us pass by him, for Yahweh your God hardened his spirit and made his heart obstinate, that he might deliver him into your hand, as it is today. +\p +\v 31 Yahweh said to me, “Behold, I have begun to deliver up Sihon and his land before you. Begin to possess, that you may inherit his land.” +\v 32 Then Sihon came out against us, he and all his people, to battle at Jahaz. +\v 33 Yahweh our God delivered him up before us; and we struck him, his sons, and all his people. +\v 34 We took all his cities at that time, and utterly destroyed every inhabited city, with the women and the little ones. We left no one remaining. +\v 35 Only the livestock we took for plunder for ourselves, with the plunder of the cities which we had taken. +\v 36 From Aroer, which is on the edge of the valley of the Arnon, and the city that is in the valley, even to Gilead, there was not a city too high for us. Yahweh our God delivered up all before us. +\v 37 Only to the land of the children of Ammon you didn’t come near: all the banks of the river Jabbok, and the cities of the hill country, and wherever Yahweh our God forbade us. +\c 3 +\p +\v 1 Then we turned, and went up the way to Bashan. Og the king of Bashan came out against us, he and all his people, to battle at Edrei. +\v 2 Yahweh said to me, “Don’t fear him; for I have delivered him, with all his people and his land, into your hand. You shall do to him as you did to Sihon king of the Amorites, who lived at Heshbon.” +\p +\v 3 So Yahweh our God also delivered into our hand Og, the king of Bashan, and all his people. We struck him until no one was left to him remaining. +\v 4 We took all his cities at that time. There was not a city which we didn’t take from them: sixty cities, all the region of Argob, the kingdom of Og in Bashan. +\v 5 All these were cities fortified with high walls, gates, and bars, in addition to a great many villages without walls. +\v 6 We utterly destroyed them, as we did to Sihon king of Heshbon, utterly destroying every inhabited city, with the women and the little ones. +\v 7 But all the livestock, and the plunder of the cities, we took for plunder for ourselves. +\v 8 We took the land at that time out of the hand of the two kings of the Amorites who were beyond the Jordan, from the valley of the Arnon to Mount Hermon. +\v 9 (The Sidonians call Hermon Sirion, and the Amorites call it Senir.) +\v 10 We took all the cities of the plain, and all Gilead, and all Bashan, to Salecah and Edrei, cities of the kingdom of Og in Bashan. +\v 11 (For only Og king of Bashan remained of the remnant of the Rephaim. Behold, his bedstead was a bedstead of iron. Isn’t it in Rabbah of the children of Ammon? Nine cubits\f + \fr 3:11 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* was its length, and four cubits its width, after the cubit of a man.) +\v 12 This land we took in possession at that time: from Aroer, which is by the valley of the Arnon, and half the hill country of Gilead with its cities, I gave to the Reubenites and to the Gadites; +\v 13 and the rest of Gilead, and all Bashan, the kingdom of Og, I gave to the half-tribe of Manasseh—all the region of Argob, even all Bashan. (The same is called the land of Rephaim. +\v 14 Jair the son of Manasseh took all the region of Argob, to the border of the Geshurites and the Maacathites, and called them, even Bashan, after his own name, Havvoth Jair, to this day.) +\v 15 I gave Gilead to Machir. +\v 16 To the Reubenites and to the Gadites I gave from Gilead even to the valley of the Arnon, the middle of the valley, and its border, even to the river Jabbok, which is the border of the children of Ammon; +\v 17 the Arabah also, and the Jordan and its border, from Chinnereth even to the sea of the Arabah, the Salt Sea, under the slopes of Pisgah eastward. +\p +\v 18 I commanded you at that time, saying, “Yahweh your God has given you this land to possess it. All of you men of valor shall pass over armed before your brothers, the children of Israel. +\v 19 But your wives, and your little ones, and your livestock, (I know that you have much livestock), shall live in your cities which I have given you, +\v 20 until Yahweh gives rest to your brothers, as to you, and they also possess the land which Yahweh your God gives them beyond the Jordan. Then you shall each return to his own possession, which I have given you.” +\p +\v 21 I commanded Joshua at that time, saying, “Your eyes have seen all that Yahweh your God has done to these two kings. So shall Yahweh do to all the kingdoms where you go over. +\v 22 You shall not fear them; for Yahweh your God himself fights for you.” +\p +\v 23 I begged Yahweh at that time, saying, +\v 24 “Lord\f + \fr 3:24 \ft The word translated “Lord” is “Adonai.”\f* Yahweh, you have begun to show your servant your greatness, and your strong hand. For what god is there in heaven or in earth that can do works like yours, and mighty acts like yours? +\v 25 Please let me go over and see the good land that is beyond the Jordan, that fine mountain, and Lebanon.” +\p +\v 26 But Yahweh was angry with me because of you, and didn’t listen to me. Yahweh said to me, “That is enough! Speak no more to me of this matter. +\v 27 Go up to the top of Pisgah, and lift up your eyes westward, and northward, and southward, and eastward, and see with your eyes; for you shall not go over this Jordan. +\v 28 But commission Joshua, and encourage him, and strengthen him; for he shall go over before this people, and he shall cause them to inherit the land which you shall see.” +\v 29 So we stayed in the valley near Beth Peor. +\c 4 +\p +\v 1 Now, Israel, listen to the statutes and to the ordinances which I teach you, to do them, that you may live and go in and possess the land which Yahweh, the God of your fathers, gives you. +\v 2 You shall not add to the word which I command you, neither shall you take away from it, that you may keep the commandments of Yahweh your God which I command you. +\v 3 Your eyes have seen what Yahweh did because of Baal Peor; for Yahweh your God has destroyed all the men who followed Baal Peor from among you. +\v 4 But you who were faithful to Yahweh your God are all alive today. +\v 5 Behold, I have taught you statutes and ordinances, even as Yahweh my God commanded me, that you should do so in the middle of the land where you go in to possess it. +\v 6 Keep therefore and do them; for this is your wisdom and your understanding in the sight of the peoples who shall hear all these statutes and say, “Surely this great nation is a wise and understanding people.” +\v 7 For what great nation is there that has a god so near to them as Yahweh our God is whenever we call on him? +\v 8 What great nation is there that has statutes and ordinances so righteous as all this law which I set before you today? +\p +\v 9 Only be careful, and keep your soul diligently, lest you forget the things which your eyes saw, and lest they depart from your heart all the days of your life; but make them known to your children and your children’s children— +\v 10 the day that you stood before Yahweh your God in Horeb, when Yahweh said to me, “Assemble the people to me, and I will make them hear my words, that they may learn to fear me all the days that they live on the earth, and that they may teach their children.” +\v 11 You came near and stood under the mountain. The mountain burned with fire to the heart of the sky, with darkness, cloud, and thick darkness. +\v 12 Yahweh spoke to you out of the middle of the fire: you heard the voice of words, but you saw no form; you only heard a voice. +\v 13 He declared to you his covenant, which he commanded you to perform, even the ten commandments. He wrote them on two stone tablets. +\v 14 Yahweh commanded me at that time to teach you statutes and ordinances, that you might do them in the land where you go over to possess it. +\v 15 Be very careful, for you saw no kind of form on the day that Yahweh spoke to you in Horeb out of the middle of the fire, +\v 16 lest you corrupt yourselves, and make yourself a carved image in the form of any figure, the likeness of male or female, +\v 17 the likeness of any animal that is on the earth, the likeness of any winged bird that flies in the sky, +\v 18 the likeness of anything that creeps on the ground, the likeness of any fish that is in the water under the earth; +\v 19 and lest you lift up your eyes to the sky, and when you see the sun and the moon and the stars, even all the army of the sky, you are drawn away and worship them, and serve them, which Yahweh your God has allotted to all the peoples under the whole sky. +\v 20 But Yahweh has taken you, and brought you out of the iron furnace, out of Egypt, to be to him a people of inheritance, as it is today. +\v 21 Furthermore Yahweh was angry with me for your sakes, and swore that I should not go over the Jordan, and that I should not go in to that good land which Yahweh your God gives you for an inheritance; +\v 22 but I must die in this land. I must not go over the Jordan, but you shall go over and possess that good land. +\v 23 Be careful, lest you forget the covenant of Yahweh your God, which he made with you, and make yourselves a carved image in the form of anything which Yahweh your God has forbidden you. +\v 24 For Yahweh your God is a devouring fire, a jealous God. +\v 25 When you father children and children’s children, and you have been long in the land, and then corrupt yourselves, and make a carved image in the form of anything, and do that which is evil in Yahweh your God’s sight to provoke him to anger, +\v 26 I call heaven and earth to witness against you today, that you will soon utterly perish from off the land which you go over the Jordan to possess it. You will not prolong your days on it, but will utterly be destroyed. +\v 27 Yahweh will scatter you among the peoples, and you will be left few in number among the nations where Yahweh will lead you away. +\v 28 There you will serve gods, the work of men’s hands, wood and stone, which neither see, nor hear, nor eat, nor smell. +\v 29 But from there you shall seek Yahweh your God, and you will find him when you search after him with all your heart and with all your soul. +\v 30 When you are in oppression, and all these things have come on you, in the latter days you shall return to Yahweh your God and listen to his voice. +\v 31 For Yahweh your God is a merciful God. He will not fail you nor destroy you, nor forget the covenant of your fathers which he swore to them. +\v 32 For ask now of the days that are past, which were before you, since the day that God created man on the earth, and from the one end of the sky to the other, whether there has been anything as great as this thing is, or has been heard like it? +\v 33 Did a people ever hear the voice of God speaking out of the middle of the fire, as you have heard, and live? +\v 34 Or has God tried to go and take a nation for himself from among another nation, by trials, by signs, by wonders, by war, by a mighty hand, by an outstretched arm, and by great terrors, according to all that Yahweh your God did for you in Egypt before your eyes? +\v 35 It was shown to you so that you might know that Yahweh is God. There is no one else besides him. +\v 36 Out of heaven he made you to hear his voice, that he might instruct you. On earth he made you to see his great fire; and you heard his words out of the middle of the fire. +\v 37 Because he loved your fathers, therefore he chose their offspring after them, and brought you out with his presence, with his great power, out of Egypt; +\v 38 to drive out nations from before you greater and mightier than you, to bring you in, to give you their land for an inheritance, as it is today. +\v 39 Know therefore today, and take it to heart, that Yahweh himself is God in heaven above and on the earth beneath. There is no one else. +\v 40 You shall keep his statutes and his commandments which I command you today, that it may go well with you and with your children after you, and that you may prolong your days in the land which Yahweh your God gives you for all time. +\p +\v 41 Then Moses set apart three cities beyond the Jordan toward the sunrise, +\v 42 that the man slayer might flee there, who kills his neighbor unintentionally and didn’t hate him in time past, and that fleeing to one of these cities he might live: +\v 43 Bezer in the wilderness, in the plain country, for the Reubenites; and Ramoth in Gilead for the Gadites; and Golan in Bashan for the Manassites. +\p +\v 44 This is the law which Moses set before the children of Israel. +\v 45 These are the testimonies, and the statutes, and the ordinances which Moses spoke to the children of Israel when they came out of Egypt, +\v 46 beyond the Jordan, in the valley opposite Beth Peor, in the land of Sihon king of the Amorites, who lived at Heshbon, whom Moses and the children of Israel struck when they came out of Egypt. +\v 47 They took possession of his land and the land of Og king of Bashan, the two kings of the Amorites, who were beyond the Jordan toward the sunrise; +\v 48 from Aroer, which is on the edge of the valley of the Arnon, even to Mount Zion (also called Hermon), +\v 49 and all the Arabah beyond the Jordan eastward, even to the sea of the Arabah, under the slopes of Pisgah. +\c 5 +\p +\v 1 Moses called to all Israel, and said to them, “Hear, Israel, the statutes and the ordinances which I speak in your ears today, that you may learn them, and observe to do them.” +\v 2 Yahweh our God made a covenant with us in Horeb. +\v 3 Yahweh didn’t make this covenant with our fathers, but with us, even us, who are all of us here alive today. +\v 4 Yahweh spoke with you face to face on the mountain out of the middle of the fire, +\v 5 (I stood between Yahweh and you at that time, to show you Yahweh’s word; for you were afraid because of the fire, and didn’t go up onto the mountain) saying, +\m +\v 6 “I am Yahweh your God, who brought you out of the land of Egypt, out of the house of bondage. +\p +\v 7 “You shall have no other gods before me. +\p +\v 8 “You shall not make a carved image for yourself—any likeness of what is in heaven above, or what is in the earth beneath, or that is in the water under the earth. +\v 9 You shall not bow yourself down to them, nor serve them, for I, Yahweh your God, am a jealous God, visiting the iniquity of the fathers on the children and on the third and on the fourth generation of those who hate me +\v 10 and showing loving kindness to thousands of those who love me and keep my commandments. +\p +\v 11 “You shall not misuse the name of Yahweh your God;\f + \fr 5:11 \ft or, You shall not take the name of Yahweh your God in vain;\f* for Yahweh will not hold him guiltless who misuses his name. +\p +\v 12 “Observe the Sabbath day, to keep it holy, as Yahweh your God commanded you. +\v 13 You shall labor six days, and do all your work; +\v 14 but the seventh day is a Sabbath to Yahweh your God, in which you shall not do any work— neither you, nor your son, nor your daughter, nor your male servant, nor your female servant, nor your ox, nor your donkey, nor any of your livestock, nor your stranger who is within your gates; that your male servant and your female servant may rest as well as you. +\v 15 You shall remember that you were a servant in the land of Egypt, and Yahweh your God brought you out of there by a mighty hand and by an outstretched arm. Therefore Yahweh your God commanded you to keep the Sabbath day. +\p +\v 16 “Honor your father and your mother, as Yahweh your God commanded you, that your days may be long and that it may go well with you in the land which Yahweh your God gives you. +\p +\v 17 “You shall not murder. +\p +\v 18 “You shall not commit adultery. +\p +\v 19 “You shall not steal. +\p +\v 20 “You shall not give false testimony against your neighbor. +\p +\v 21 “You shall not covet your neighbor’s wife. Neither shall you desire your neighbor’s house, his field, or his male servant, or his female servant, his ox, or his donkey, or anything that is your neighbor’s.” +\p +\v 22 Yahweh spoke these words to all your assembly on the mountain out of the middle of the fire, of the cloud, and of the thick darkness, with a great voice. He added no more. He wrote them on two stone tablets, and gave them to me. +\v 23 When you heard the voice out of the middle of the darkness, while the mountain was burning with fire, you came near to me, even all the heads of your tribes, and your elders; +\v 24 and you said, “Behold, Yahweh our God has shown us his glory and his greatness, and we have heard his voice out of the middle of the fire. We have seen today that God does speak with man, and he lives. +\v 25 Now therefore, why should we die? For this great fire will consume us. If we hear Yahweh our God’s voice any more, then we shall die. +\v 26 For who is there of all flesh who has heard the voice of the living God speaking out of the middle of the fire, as we have, and lived? +\v 27 Go near, and hear all that Yahweh our God shall say, and tell us all that Yahweh our God tells you; and we will hear it, and do it.” +\p +\v 28 Yahweh heard the voice of your words when you spoke to me; and Yahweh said to me, “I have heard the voice of the words of this people which they have spoken to you. They have well said all that they have spoken. +\v 29 Oh that there were such a heart in them that they would fear me and keep all my commandments always, that it might be well with them and with their children forever! +\p +\v 30 “Go tell them, ‘Return to your tents.’ +\v 31 But as for you, stand here by me, and I will tell you all the commandments, and the statutes, and the ordinances, which you shall teach them, that they may do them in the land which I give them to possess.” +\p +\v 32 You shall observe to do therefore as Yahweh your God has commanded you. You shall not turn away to the right hand or to the left. +\v 33 You shall walk in all the way which Yahweh your God has commanded you, that you may live and that it may be well with you, and that you may prolong your days in the land which you shall possess. +\c 6 +\p +\v 1 Now these are the commandments, the statutes, and the ordinances, which Yahweh your God commanded to teach you, that you might do them in the land that you go over to possess; +\v 2 that you might fear Yahweh your God, to keep all his statutes and his commandments, which I command you—you, your son, and your son’s son, all the days of your life; and that your days may be prolonged. +\v 3 Hear therefore, Israel, and observe to do it, that it may be well with you, and that you may increase mightily, as Yahweh, the God of your fathers, has promised to you, in a land flowing with milk and honey. +\p +\v 4 Hear, Israel: Yahweh is our God. Yahweh is one. +\v 5 You shall love Yahweh your God with all your heart, with all your soul, and with all your might. +\v 6 These words, which I command you today, shall be on your heart; +\v 7 and you shall teach them diligently to your children, and shall talk of them when you sit in your house, and when you walk by the way, and when you lie down, and when you rise up. +\v 8 You shall bind them for a sign on your hand, and they shall be for frontlets between your eyes. +\v 9 You shall write them on the door posts of your house and on your gates. +\p +\v 10 It shall be, when Yahweh your God brings you into the land which he swore to your fathers, to Abraham, to Isaac, and to Jacob, to give you, great and goodly cities which you didn’t build, +\v 11 and houses full of all good things which you didn’t fill, and cisterns dug out which you didn’t dig, vineyards and olive trees which you didn’t plant, and you shall eat and be full; +\v 12 then beware lest you forget Yahweh, who brought you out of the land of Egypt, out of the house of bondage. +\v 13 You shall fear Yahweh your God; and you shall serve him, and shall swear by his name. +\v 14 You shall not go after other gods, of the gods of the peoples who are around you, +\v 15 for Yahweh your God among you is a jealous God, lest the anger of Yahweh your God be kindled against you, and he destroy you from off the face of the earth. +\v 16 You shall not tempt Yahweh your God, as you tempted him in Massah. +\v 17 You shall diligently keep the commandments of Yahweh your God, and his testimonies, and his statutes, which he has commanded you. +\v 18 You shall do that which is right and good in Yahweh’s sight, that it may be well with you and that you may go in and possess the good land which Yahweh swore to your fathers, +\v 19 to thrust out all your enemies from before you, as Yahweh has spoken. +\p +\v 20 When your son asks you in time to come, saying, “What do the testimonies, the statutes, and the ordinances, which Yahweh our God has commanded you mean?” +\v 21 then you shall tell your son, “We were Pharaoh’s slaves in Egypt. Yahweh brought us out of Egypt with a mighty hand; +\v 22 and Yahweh showed great and awesome signs and wonders on Egypt, on Pharaoh, and on all his house, before our eyes; +\v 23 and he brought us out from there, that he might bring us in, to give us the land which he swore to our fathers. +\v 24 Yahweh commanded us to do all these statutes, to fear Yahweh our God, for our good always, that he might preserve us alive, as we are today. +\v 25 It shall be righteousness to us, if we observe to do all these commandments before Yahweh our God, as he has commanded us.” +\c 7 +\p +\v 1 When Yahweh your God brings you into the land where you go to possess it, and casts out many nations before you—the Hittite, the Girgashite, the Amorite, the Canaanite, the Perizzite, the Hivite, and the Jebusite—seven nations greater and mightier than you; +\v 2 and when Yahweh your God delivers them up before you, and you strike them, then you shall utterly destroy them. You shall make no covenant with them, nor show mercy to them. +\v 3 You shall not make marriages with them. You shall not give your daughter to his son, nor shall you take his daughter for your son. +\v 4 For that would turn away your sons from following me, that they may serve other gods. So Yahweh’s anger would be kindled against you, and he would destroy you quickly. +\v 5 But you shall deal with them like this: you shall break down their altars, dash their pillars in pieces, cut down their Asherah poles, and burn their engraved images with fire. +\v 6 For you are a holy people to Yahweh your God. Yahweh your God has chosen you to be a people for his own possession, above all peoples who are on the face of the earth. +\v 7 Yahweh didn’t set his love on you nor choose you, because you were more in number than any people; for you were the fewest of all peoples; +\v 8 but because Yahweh loves you, and because he desires to keep the oath which he swore to your fathers, Yahweh has brought you out with a mighty hand and redeemed you out of the house of bondage, from the hand of Pharaoh king of Egypt. +\v 9 Know therefore that Yahweh your God himself is God, the faithful God, who keeps covenant and loving kindness to a thousand generations with those who love him and keep his commandments, +\v 10 and repays those who hate him to their face, to destroy them. He will not be slack to him who hates him. He will repay him to his face. +\v 11 You shall therefore keep the commandments, the statutes, and the ordinances which I command you today, to do them. +\v 12 It shall happen, because you listen to these ordinances and keep and do them, that Yahweh your God will keep with you the covenant and the loving kindness which he swore to your fathers. +\v 13 He will love you, bless you, and multiply you. He will also bless the fruit of your body and the fruit of your ground, your grain and your new wine and your oil, the increase of your livestock and the young of your flock, in the land which he swore to your fathers to give you. +\v 14 You will be blessed above all peoples. There won’t be male or female barren among you, or among your livestock. +\v 15 Yahweh will take away from you all sickness; and he will put none of the evil diseases of Egypt, which you know, on you, but will lay them on all those who hate you. +\v 16 You shall consume all the peoples whom Yahweh your God shall deliver to you. Your eye shall not pity them. You shall not serve their gods; for that would be a snare to you. +\v 17 If you shall say in your heart, “These nations are more than I; how can I dispossess them?” +\v 18 you shall not be afraid of them. You shall remember well what Yahweh your God did to Pharaoh and to all Egypt: +\v 19 the great trials which your eyes saw, the signs, the wonders, the mighty hand, and the outstretched arm, by which Yahweh your God brought you out. So shall Yahweh your God do to all the peoples of whom you are afraid. +\v 20 Moreover Yahweh your God will send the hornet among them, until those who are left, and hide themselves, perish from before you. +\v 21 You shall not be scared of them; for Yahweh your God is among you, a great and awesome God. +\v 22 Yahweh your God will cast out those nations before you little by little. You may not consume them at once, lest the animals of the field increase on you. +\v 23 But Yahweh your God will deliver them up before you, and will confuse them with a great confusion, until they are destroyed. +\v 24 He will deliver their kings into your hand, and you shall make their name perish from under the sky. No one will be able to stand before you until you have destroyed them. +\v 25 You shall burn the engraved images of their gods with fire. You shall not covet the silver or the gold that is on them, nor take it for yourself, lest you be snared in it; for it is an abomination to Yahweh your God. +\v 26 You shall not bring an abomination into your house and become a devoted thing like it. You shall utterly detest it. You shall utterly abhor it; for it is a devoted thing. +\c 8 +\p +\v 1 You shall observe to do all the commandments which I command you today, that you may live, and multiply, and go in and possess the land which Yahweh swore to your fathers. +\v 2 You shall remember all the way which Yahweh your God has led you these forty years in the wilderness, that he might humble you, to test you, to know what was in your heart, whether you would keep his commandments or not. +\v 3 He humbled you, allowed you to be hungry, and fed you with manna, which you didn’t know, neither did your fathers know, that he might teach you that man does not live by bread only, but man lives by every word that proceeds out of Yahweh’s mouth. +\v 4 Your clothing didn’t grow old on you, neither did your foot swell, these forty years. +\v 5 You shall consider in your heart that as a man disciplines his son, so Yahweh your God disciplines you. +\v 6 You shall keep the commandments of Yahweh your God, to walk in his ways, and to fear him. +\v 7 For Yahweh your God brings you into a good land, a land of brooks of water, of springs, and underground water flowing into valleys and hills; +\v 8 a land of wheat, barley, vines, fig trees, and pomegranates; a land of olive trees and honey; +\v 9 a land in which you shall eat bread without scarcity, you shall not lack anything in it; a land whose stones are iron, and out of whose hills you may dig copper. +\v 10 You shall eat and be full, and you shall bless Yahweh your God for the good land which he has given you. +\p +\v 11 Beware lest you forget Yahweh your God, in not keeping his commandments, his ordinances, and his statutes, which I command you today; +\v 12 lest, when you have eaten and are full, and have built fine houses and lived in them; +\v 13 and when your herds and your flocks multiply, and your silver and your gold is multiplied, and all that you have is multiplied; +\v 14 then your heart might be lifted up, and you forget Yahweh your God, who brought you out of the land of Egypt, out of the house of bondage; +\v 15 who led you through the great and terrible wilderness, with venomous snakes and scorpions, and thirsty ground where there was no water; who poured water for you out of the rock of flint; +\v 16 who fed you in the wilderness with manna, which your fathers didn’t know, that he might humble you, and that he might prove you, to do you good at your latter end; +\v 17 and lest you say in your heart, “My power and the might of my hand has gotten me this wealth.” +\v 18 But you shall remember Yahweh your God, for it is he who gives you power to get wealth, that he may establish his covenant which he swore to your fathers, as it is today. +\p +\v 19 It shall be, if you shall forget Yahweh your God, and walk after other gods, and serve them and worship them, I testify against you today that you shall surely perish. +\v 20 As the nations that Yahweh makes to perish before you, so you shall perish, because you wouldn’t listen to Yahweh your God’s voice. +\c 9 +\p +\v 1 Hear, Israel! You are to pass over the Jordan today, to go in to dispossess nations greater and mightier than yourself, cities great and fortified up to the sky, +\v 2 a people great and tall, the sons of the Anakim, whom you know, and of whom you have heard say, “Who can stand before the sons of Anak?” +\v 3 Know therefore today that Yahweh your God is he who goes over before you as a devouring fire. He will destroy them and he will bring them down before you. So you shall drive them out and make them perish quickly, as Yahweh has spoken to you. +\p +\v 4 Don’t say in your heart, after Yahweh your God has thrust them out from before you, “For my righteousness Yahweh has brought me in to possess this land;” because Yahweh drives them out before you because of the wickedness of these nations. +\v 5 Not for your righteousness or for the uprightness of your heart do you go in to possess their land; but for the wickedness of these nations Yahweh your God does drive them out from before you, and that he may establish the word which Yahweh swore to your fathers, to Abraham, to Isaac, and to Jacob. +\v 6 Know therefore that Yahweh your God doesn’t give you this good land to possess for your righteousness, for you are a stiff-necked people. +\v 7 Remember, and don’t forget, how you provoked Yahweh your God to wrath in the wilderness. From the day that you left the land of Egypt until you came to this place, you have been rebellious against Yahweh. +\v 8 Also in Horeb you provoked Yahweh to wrath, and Yahweh was angry with you to destroy you. +\v 9 When I had gone up onto the mountain to receive the stone tablets, even the tablets of the covenant which Yahweh made with you, then I stayed on the mountain forty days and forty nights. I neither ate bread nor drank water. +\v 10 Yahweh delivered to me the two stone tablets written with God’s finger. On them were all the words which Yahweh spoke with you on the mountain out of the middle of the fire in the day of the assembly. +\p +\v 11 It came to pass at the end of forty days and forty nights that Yahweh gave me the two stone tablets, even the tablets of the covenant. +\v 12 Yahweh said to me, “Arise, get down quickly from here; for your people whom you have brought out of Egypt have corrupted themselves. They have quickly turned away from the way which I commanded them. They have made a molten image for themselves!” +\p +\v 13 Furthermore Yahweh spoke to me, saying, “I have seen these people, and behold, they are a stiff-necked people. +\v 14 Leave me alone, that I may destroy them, and blot out their name from under the sky; and I will make of you a nation mightier and greater than they.” +\p +\v 15 So I turned and came down from the mountain, and the mountain was burning with fire. The two tablets of the covenant were in my two hands. +\v 16 I looked, and behold, you had sinned against Yahweh your God. You had made yourselves a molded calf. You had quickly turned away from the way which Yahweh had commanded you. +\v 17 I took hold of the two tablets, and threw them out of my two hands, and broke them before your eyes. +\v 18 I fell down before Yahweh, as at the first, forty days and forty nights. I neither ate bread nor drank water, because of all your sin which you sinned, in doing that which was evil in Yahweh’s sight, to provoke him to anger. +\v 19 For I was afraid of the anger and hot displeasure with which Yahweh was angry against you to destroy you. But Yahweh listened to me that time also. +\v 20 Yahweh was angry enough with Aaron to destroy him. I prayed for Aaron also at the same time. +\v 21 I took your sin, the calf which you had made, and burned it with fire, and crushed it, grinding it very small, until it was as fine as dust. I threw its dust into the brook that descended out of the mountain. +\v 22 At Taberah, at Massah, and at Kibroth Hattaavah you provoked Yahweh to wrath. +\v 23 When Yahweh sent you from Kadesh Barnea, saying, “Go up and possess the land which I have given you,” you rebelled against the commandment of Yahweh your God, and you didn’t believe him or listen to his voice. +\v 24 You have been rebellious against Yahweh from the day that I knew you. +\v 25 So I fell down before Yahweh the forty days and forty nights that I fell down, because Yahweh had said he would destroy you. +\v 26 I prayed to Yahweh, and said, “Lord Yahweh, don’t destroy your people and your inheritance that you have redeemed through your greatness, that you have brought out of Egypt with a mighty hand. +\v 27 Remember your servants, Abraham, Isaac, and Jacob. Don’t look at the stubbornness of this people, nor at their wickedness, nor at their sin, +\v 28 lest the land you brought us out from say, ‘Because Yahweh was not able to bring them into the land which he promised to them, and because he hated them, he has brought them out to kill them in the wilderness.’ +\v 29 Yet they are your people and your inheritance, which you brought out by your great power and by your outstretched arm.” +\c 10 +\p +\v 1 At that time Yahweh said to me, “Cut two stone tablets like the first, and come up to me onto the mountain, and make an ark of wood. +\v 2 I will write on the tablets the words that were on the first tablets which you broke, and you shall put them in the ark.” +\v 3 So I made an ark of acacia wood, and cut two stone tablets like the first, and went up onto the mountain, having the two tablets in my hand. +\v 4 He wrote on the tablets, according to the first writing, the ten commandments, which Yahweh spoke to you on the mountain out of the middle of the fire in the day of the assembly; and Yahweh gave them to me. +\v 5 I turned and came down from the mountain, and put the tablets in the ark which I had made; and there they are as Yahweh commanded me. +\p +\v 6 (The children of Israel traveled from Beeroth Bene Jaakan to Moserah. There Aaron died, and there he was buried; and Eleazar his son ministered in the priest’s office in his place. +\v 7 From there they traveled to Gudgodah; and from Gudgodah to Jotbathah, a land of brooks of water. +\v 8 At that time Yahweh set apart the tribe of Levi to bear the ark of Yahweh’s covenant, to stand before Yahweh to minister to him, and to bless in his name, to this day. +\v 9 Therefore Levi has no portion nor inheritance with his brothers; Yahweh is his inheritance, according as Yahweh your God spoke to him.) +\p +\v 10 I stayed on the mountain, as at the first time, forty days and forty nights; and Yahweh listened to me that time also. Yahweh would not destroy you. +\v 11 Yahweh said to me, “Arise, take your journey before the people; and they shall go in and possess the land which I swore to their fathers to give to them.” +\p +\v 12 Now, Israel, what does Yahweh your God require of you, but to fear Yahweh your God, to walk in all his ways, to love him, and to serve Yahweh your God with all your heart and with all your soul, +\v 13 to keep Yahweh’s commandments and statutes, which I command you today for your good? +\v 14 Behold, to Yahweh your God belongs heaven, the heaven of heavens, and the earth, with all that is therein. +\v 15 Only Yahweh had a delight in your fathers to love them, and he chose their offspring after them, even you above all peoples, as it is today. +\v 16 Circumcise therefore the foreskin of your heart, and be no more stiff-necked. +\v 17 For Yahweh your God, he is God of gods and Lord of lords, the great God, the mighty, and the awesome, who doesn’t respect persons or take bribes. +\v 18 He executes justice for the fatherless and widow and loves the foreigner in giving him food and clothing. +\v 19 Therefore love the foreigner, for you were foreigners in the land of Egypt. +\v 20 You shall fear Yahweh your God. You shall serve him. You shall cling to him, and you shall swear by his name. +\v 21 He is your praise, and he is your God, who has done for you these great and awesome things which your eyes have seen. +\v 22 Your fathers went down into Egypt with seventy persons; and now Yahweh your God has made you as the stars of the sky for multitude. +\c 11 +\p +\v 1 Therefore you shall love Yahweh your God, and keep his instructions, his statutes, his ordinances, and his commandments, always. +\v 2 Know this day—for I don’t speak with your children who have not known, and who have not seen the chastisement of Yahweh your God, his greatness, his mighty hand, his outstretched arm, +\v 3 his signs, and his works, which he did in the middle of Egypt to Pharaoh the king of Egypt, and to all his land; +\v 4 and what he did to the army of Egypt, to their horses, and to their chariots; how he made the water of the Red Sea to overflow them as they pursued you, and how Yahweh has destroyed them to this day; +\v 5 and what he did to you in the wilderness until you came to this place; +\v 6 and what he did to Dathan and Abiram, the sons of Eliab, the son of Reuben—how the earth opened its mouth and swallowed them up, with their households, their tents, and every living thing that followed them, in the middle of all Israel; +\v 7 but your eyes have seen all of Yahweh’s great work which he did. +\p +\v 8 Therefore you shall keep the entire commandment which I command you today, that you may be strong, and go in and possess the land that you go over to possess; +\v 9 and that you may prolong your days in the land which Yahweh swore to your fathers to give to them and to their offspring, a land flowing with milk and honey. +\v 10 For the land, where you go in to possess isn’t like the land of Egypt that you came out of, where you sowed your seed and watered it with your foot, as a garden of herbs; +\v 11 but the land that you go over to possess is a land of hills and valleys which drinks water from the rain of the sky, +\v 12 a land which Yahweh your God cares for. Yahweh your God’s eyes are always on it, from the beginning of the year even to the end of the year. +\v 13 It shall happen, if you shall listen diligently to my commandments which I command you today, to love Yahweh your God, and to serve him with all your heart and with all your soul, +\v 14 that I will give the rain for your land in its season, the early rain and the latter rain, that you may gather in your grain, your new wine, and your oil. +\v 15 I will give grass in your fields for your livestock, and you shall eat and be full. +\v 16 Be careful, lest your heart be deceived, and you turn away to serve other gods and worship them; +\v 17 and Yahweh’s anger be kindled against you, and he shut up the sky so that there is no rain, and the land doesn’t yield its fruit; and you perish quickly from off the good land which Yahweh gives you. +\v 18 Therefore you shall lay up these words of mine in your heart and in your soul. You shall bind them for a sign on your hand, and they shall be for frontlets between your eyes. +\v 19 You shall teach them to your children, talking of them when you sit in your house, when you walk by the way, when you lie down, and when you rise up. +\v 20 You shall write them on the door posts of your house and on your gates; +\v 21 that your days and your children’s days may be multiplied in the land which Yahweh swore to your fathers to give them, as the days of the heavens above the earth. +\v 22 For if you shall diligently keep all these commandments which I command you—to do them, to love Yahweh your God, to walk in all his ways, and to cling to him— +\v 23 then Yahweh will drive out all these nations from before you, and you shall dispossess nations greater and mightier than yourselves. +\v 24 Every place on which the sole of your foot treads shall be yours: from the wilderness and Lebanon, from the river, the river Euphrates, even to the western sea shall be your border. +\v 25 No man will be able to stand before you. Yahweh your God will lay the fear of you and the dread of you on all the land that you tread on, as he has spoken to you. +\v 26 Behold, I set before you today a blessing and a curse: +\v 27 the blessing, if you listen to the commandments of Yahweh your God, which I command you today; +\v 28 and the curse, if you do not listen to the commandments of Yahweh your God, but turn away out of the way which I command you today, to go after other gods which you have not known. +\v 29 It shall happen, when Yahweh your God brings you into the land that you go to possess, that you shall set the blessing on Mount Gerizim, and the curse on Mount Ebal. +\v 30 Aren’t they beyond the Jordan, behind the way of the going down of the sun, in the land of the Canaanites who dwell in the Arabah near Gilgal, beside the oaks of Moreh? +\v 31 For you are to pass over the Jordan to go in to possess the land which Yahweh your God gives you, and you shall possess it and dwell in it. +\v 32 You shall observe to do all the statutes and the ordinances which I set before you today. +\c 12 +\p +\v 1 These are the statutes and the ordinances which you shall observe to do in the land which Yahweh, the God of your fathers, has given you to possess all the days that you live on the earth. +\v 2 You shall surely destroy all the places in which the nations that you shall dispossess served their gods: on the high mountains, and on the hills, and under every green tree. +\v 3 You shall break down their altars, dash their pillars in pieces, and burn their Asherah poles with fire. You shall cut down the engraved images of their gods. You shall destroy their name out of that place. +\v 4 You shall not do so to Yahweh your God. +\v 5 But to the place which Yahweh your God shall choose out of all your tribes, to put his name there, you shall seek his habitation, and you shall come there. +\v 6 You shall bring your burnt offerings, your sacrifices, your tithes, the wave offering of your hand, your vows, your free will offerings, and the firstborn of your herd and of your flock there. +\v 7 There you shall eat before Yahweh your God, and you shall rejoice in all that you put your hand to, you and your households, in which Yahweh your God has blessed you. +\v 8 You shall not do all the things that we do here today, every man whatever is right in his own eyes; +\v 9 for you haven’t yet come to the rest and to the inheritance which Yahweh your God gives you. +\v 10 But when you go over the Jordan and dwell in the land which Yahweh your God causes you to inherit, and he gives you rest from all your enemies around you, so that you dwell in safety, +\v 11 then it shall happen that to the place which Yahweh your God shall choose, to cause his name to dwell there, there you shall bring all that I command you: your burnt offerings, your sacrifices, your tithes, the wave offering of your hand, and all your choice vows which you vow to Yahweh. +\v 12 You shall rejoice before Yahweh your God—you, and your sons, your daughters, your male servants, your female servants, and the Levite who is within your gates, because he has no portion nor inheritance with you. +\v 13 Be careful that you don’t offer your burnt offerings in every place that you see; +\v 14 but in the place which Yahweh chooses in one of your tribes, there you shall offer your burnt offerings, and there you shall do all that I command you. +\p +\v 15 Yet you may kill and eat meat within all your gates, after all the desire of your soul, according to Yahweh your God’s blessing which he has given you. The unclean and the clean may eat of it, as of the gazelle and the deer. +\v 16 Only you shall not eat the blood. You shall pour it out on the earth like water. +\v 17 You may not eat within your gates the tithe of your grain, or of your new wine, or of your oil, or the firstborn of your herd or of your flock, nor any of your vows which you vow, nor your free will offerings, nor the wave offering of your hand; +\v 18 but you shall eat them before Yahweh your God in the place which Yahweh your God shall choose: you, your son, your daughter, your male servant, your female servant, and the Levite who is within your gates. You shall rejoice before Yahweh your God in all that you put your hand to. +\v 19 Be careful that you don’t forsake the Levite as long as you live in your land. +\p +\v 20 When Yahweh your God enlarges your border, as he has promised you, and you say, “I want to eat meat,” because your soul desires to eat meat, you may eat meat, after all the desire of your soul. +\v 21 If the place which Yahweh your God shall choose to put his name is too far from you, then you shall kill of your herd and of your flock, which Yahweh has given you, as I have commanded you; and you may eat within your gates, after all the desire of your soul. +\v 22 Even as the gazelle and as the deer is eaten, so you shall eat of it. The unclean and the clean may eat of it alike. +\v 23 Only be sure that you don’t eat the blood; for the blood is the life. You shall not eat the life with the meat. +\v 24 You shall not eat it. You shall pour it out on the earth like water. +\v 25 You shall not eat it, that it may go well with you and with your children after you, when you do that which is right in Yahweh’s eyes. +\v 26 Only your holy things which you have, and your vows, you shall take and go to the place which Yahweh shall choose. +\v 27 You shall offer your burnt offerings, the meat and the blood, on Yahweh your God’s altar. The blood of your sacrifices shall be poured out on Yahweh your God’s altar, and you shall eat the meat. +\v 28 Observe and hear all these words which I command you, that it may go well with you and with your children after you forever, when you do that which is good and right in Yahweh your God’s eyes. +\p +\v 29 When Yahweh your God cuts off the nations from before you where you go in to dispossess them, and you dispossess them and dwell in their land, +\v 30 be careful that you are not ensnared to follow them after they are destroyed from before you, and that you not inquire after their gods, saying, “How do these nations serve their gods? I will do likewise.” +\v 31 You shall not do so to Yahweh your God; for every abomination to Yahweh, which he hates, they have done to their gods; for they even burn their sons and their daughters in the fire to their gods. +\v 32 Whatever thing I command you, that you shall observe to do. You shall not add to it, nor take away from it. +\c 13 +\p +\v 1 If a prophet or a dreamer of dreams arises among you, and he gives you a sign or a wonder, +\v 2 and the sign or the wonder comes to pass, of which he spoke to you, saying, “Let’s go after other gods” (which you have not known) “and let’s serve them,” +\v 3 you shall not listen to the words of that prophet, or to that dreamer of dreams; for Yahweh your God is testing you, to know whether you love Yahweh your God with all your heart and with all your soul. +\v 4 You shall walk after Yahweh your God, fear him, keep his commandments, and obey his voice. You shall serve him, and cling to him. +\v 5 That prophet, or that dreamer of dreams, shall be put to death, because he has spoken rebellion against Yahweh your God, who brought you out of the land of Egypt and redeemed you out of the house of bondage, to draw you aside out of the way which Yahweh your God commanded you to walk in. So you shall remove the evil from among you. +\p +\v 6 If your brother, the son of your mother, or your son, or your daughter, or the wife of your bosom, or your friend who is as your own soul, entices you secretly, saying, “Let’s go and serve other gods”—which you have not known, you, nor your fathers; +\v 7 of the gods of the peoples who are around you, near to you, or far off from you, from the one end of the earth even to the other end of the earth— +\v 8 you shall not consent to him nor listen to him; neither shall your eye pity him, neither shall you spare, neither shall you conceal him; +\v 9 but you shall surely kill him. Your hand shall be first on him to put him to death, and afterwards the hands of all the people. +\v 10 You shall stone him to death with stones, because he has sought to draw you away from Yahweh your God, who brought you out of the land of Egypt, out of the house of bondage. +\v 11 All Israel shall hear, and fear, and shall not do any more wickedness like this among you. +\p +\v 12 If you hear about one of your cities, which Yahweh your God gives you to dwell there, that +\v 13 certain wicked fellows have gone out from among you and have drawn away the inhabitants of their city, saying, “Let’s go and serve other gods,” which you have not known, +\v 14 then you shall inquire, investigate, and ask diligently. Behold, if it is true, and the thing certain, that such abomination was done among you, +\v 15 you shall surely strike the inhabitants of that city with the edge of the sword, destroying it utterly, with all that is therein and its livestock, with the edge of the sword. +\v 16 You shall gather all its plunder into the middle of its street, and shall burn with fire the city, with all of its plunder, to Yahweh your God. It shall be a heap forever. It shall not be built again. +\v 17 Nothing of the devoted thing shall cling to your hand, that Yahweh may turn from the fierceness of his anger and show you mercy, and have compassion on you and multiply you, as he has sworn to your fathers, +\v 18 when you listen to Yahweh your God’s voice, to keep all his commandments which I command you today, to do that which is right in Yahweh your God’s eyes. +\c 14 +\p +\v 1 You are the children of Yahweh your God. You shall not cut yourselves, nor make any baldness between your eyes for the dead. +\v 2 For you are a holy people to Yahweh your God, and Yahweh has chosen you to be a people for his own possession, above all peoples who are on the face of the earth. +\p +\v 3 You shall not eat any abominable thing. +\v 4 These are the animals which you may eat: the ox, the sheep, the goat, +\v 5 the deer, the gazelle, the roebuck, the wild goat, the ibex, the antelope, and the chamois. +\v 6 Every animal that parts the hoof, and has the hoof split in two and chews the cud, among the animals, you may eat. +\v 7 Nevertheless these you shall not eat of them that chew the cud, or of those who have the hoof split: the camel, the hare, and the rabbit. Because they chew the cud but don’t part the hoof, they are unclean to you. +\v 8 The pig, because it has a split hoof but doesn’t chew the cud, is unclean to you. You shall not eat their meat. You shall not touch their carcasses. +\v 9 These you may eat of all that are in the waters: you may eat whatever has fins and scales. +\v 10 You shall not eat whatever doesn’t have fins and scales. It is unclean to you. +\v 11 Of all clean birds you may eat. +\v 12 But these are they of which you shall not eat: the eagle, the vulture, the osprey, +\v 13 the red kite, the falcon, the kite of any kind, +\v 14 every raven of any kind, +\v 15 the ostrich, the owl, the seagull, the hawk of any kind, +\v 16 the little owl, the great owl, the horned owl, +\v 17 the pelican, the vulture, the cormorant, +\v 18 the stork, the heron after its kind, the hoopoe, and the bat. +\v 19 All winged creeping things are unclean to you. They shall not be eaten. +\v 20 Of all clean birds you may eat. +\p +\v 21 You shall not eat of anything that dies of itself. You may give it to the foreigner living among you who is within your gates, that he may eat it; or you may sell it to a foreigner; for you are a holy people to Yahweh your God. +\p You shall not boil a young goat in its mother’s milk. +\p +\v 22 You shall surely tithe all the increase of your seed, that which comes out of the field year by year. +\v 23 You shall eat before Yahweh your God, in the place which he chooses to cause his name to dwell, the tithe of your grain, of your new wine, and of your oil, and the firstborn of your herd and of your flock; that you may learn to fear Yahweh your God always. +\v 24 If the way is too long for you, so that you are not able to carry it because the place which Yahweh your God shall choose to set his name there is too far from you, when Yahweh your God blesses you, +\v 25 then you shall turn it into money, bind up the money in your hand, and shall go to the place which Yahweh your God shall choose. +\v 26 You shall trade the money for whatever your soul desires: for cattle, or for sheep, or for wine, or for strong drink, or for whatever your soul asks of you. You shall eat there before Yahweh your God, and you shall rejoice, you and your household. +\v 27 You shall not forsake the Levite who is within your gates, for he has no portion nor inheritance with you. +\v 28 At the end of every three years you shall bring all the tithe of your increase in the same year, and shall store it within your gates. +\v 29 The Levite, because he has no portion nor inheritance with you, as well as the foreigner living among you, the fatherless, and the widow who are within your gates shall come, and shall eat and be satisfied; that Yahweh your God may bless you in all the work of your hand which you do. +\c 15 +\p +\v 1 At the end of every seven years, you shall cancel debts. +\v 2 This is the way it shall be done: every creditor shall release that which he has lent to his neighbor. He shall not require payment from his neighbor and his brother, because Yahweh’s release has been proclaimed. +\v 3 Of a foreigner you may require it; but whatever of yours is with your brother, your hand shall release. +\v 4 However there will be no poor with you (for Yahweh will surely bless you in the land which Yahweh your God gives you for an inheritance to possess) +\v 5 if only you diligently listen to Yahweh your God’s voice, to observe to do all this commandment which I command you today. +\v 6 For Yahweh your God will bless you, as he promised you. You will lend to many nations, but you will not borrow. You will rule over many nations, but they will not rule over you. +\v 7 If a poor man, one of your brothers, is with you within any of your gates in your land which Yahweh your God gives you, you shall not harden your heart, nor shut your hand from your poor brother; +\v 8 but you shall surely open your hand to him, and shall surely lend him sufficient for his need, which he lacks. +\v 9 Beware that there not be a wicked thought in your heart, saying, “The seventh year, the year of release, is at hand,” and your eye be evil against your poor brother and you give him nothing; and he cry to Yahweh against you, and it be sin to you. +\v 10 You shall surely give, and your heart shall not be grieved when you give to him, because it is for this thing Yahweh your God will bless you in all your work and in all that you put your hand to. +\v 11 For the poor will never cease out of the land. Therefore I command you to surely open your hand to your brother, to your needy, and to your poor, in your land. +\v 12 If your brother, a Hebrew man, or a Hebrew woman, is sold to you and serves you six years, then in the seventh year you shall let him go free from you. +\v 13 When you let him go free from you, you shall not let him go empty. +\v 14 You shall furnish him liberally out of your flock, out of your threshing floor, and out of your wine press. As Yahweh your God has blessed you, you shall give to him. +\v 15 You shall remember that you were a slave in the land of Egypt, and Yahweh your God redeemed you. Therefore I command you this thing today. +\v 16 It shall be, if he tells you, “I will not go out from you,” because he loves you and your house, because he is well with you, +\v 17 then you shall take an awl, and thrust it through his ear to the door, and he shall be your servant forever. Also to your female servant you shall do likewise. +\v 18 It shall not seem hard to you when you let him go free from you, for he has been double the value of a hired hand as he served you six years. Yahweh your God will bless you in all that you do. +\v 19 You shall dedicate all the firstborn males that are born of your herd and of your flock to Yahweh your God. You shall do no work with the firstborn of your herd, nor shear the firstborn of your flock. +\v 20 You shall eat it before Yahweh your God year by year in the place which Yahweh shall choose, you and your household. +\v 21 If it has any defect—is lame or blind, or has any defect whatever, you shall not sacrifice it to Yahweh your God. +\v 22 You shall eat it within your gates. The unclean and the clean shall eat it alike, as the gazelle and as the deer. +\v 23 Only you shall not eat its blood. You shall pour it out on the ground like water. +\c 16 +\p +\v 1 Observe the month of Abib, and keep the Passover to Yahweh your God; for in the month of Abib Yahweh your God brought you out of Egypt by night. +\v 2 You shall sacrifice the Passover to Yahweh your God, of the flock and the herd, in the place which Yahweh shall choose to cause his name to dwell there. +\v 3 You shall eat no leavened bread with it. You shall eat unleavened bread with it seven days, even the bread of affliction (for you came out of the land of Egypt in haste) that you may remember the day when you came out of the land of Egypt all the days of your life. +\v 4 No yeast shall be seen with you in all your borders seven days; neither shall any of the meat, which you sacrifice the first day at evening, remain all night until the morning. +\v 5 You may not sacrifice the Passover within any of your gates which Yahweh your God gives you; +\v 6 but at the place which Yahweh your God shall choose to cause his name to dwell in, there you shall sacrifice the Passover at evening, at the going down of the sun, at the season that you came out of Egypt. +\v 7 You shall roast and eat it in the place which Yahweh your God chooses. In the morning you shall return to your tents. +\v 8 Six days you shall eat unleavened bread. On the seventh day shall be a solemn assembly to Yahweh your God. You shall do no work. +\p +\v 9 You shall count for yourselves seven weeks. From the time you begin to put the sickle to the standing grain you shall begin to count seven weeks. +\v 10 You shall keep the feast of weeks to Yahweh your God with a tribute of a free will offering of your hand, which you shall give according to how Yahweh your God blesses you. +\v 11 You shall rejoice before Yahweh your God: you, your son, your daughter, your male servant, your female servant, the Levite who is within your gates, the foreigner, the fatherless, and the widow who are among you, in the place which Yahweh your God shall choose to cause his name to dwell there. +\v 12 You shall remember that you were a slave in Egypt. You shall observe and do these statutes. +\p +\v 13 You shall keep the feast of booths seven days, after you have gathered in from your threshing floor and from your wine press. +\v 14 You shall rejoice in your feast, you, your son, your daughter, your male servant, your female servant, the Levite, the foreigner, the fatherless, and the widow who are within your gates. +\v 15 You shall keep a feast to Yahweh your God seven days in the place which Yahweh chooses, because Yahweh your God will bless you in all your increase and in all the work of your hands, and you shall be altogether joyful. +\v 16 Three times in a year all of your males shall appear before Yahweh your God in the place which he chooses: in the feast of unleavened bread, in the feast of weeks, and in the feast of booths. They shall not appear before Yahweh empty. +\v 17 Every man shall give as he is able, according to Yahweh your God’s blessing which he has given you. +\v 18 You shall make judges and officers in all your gates, which Yahweh your God gives you, according to your tribes; and they shall judge the people with righteous judgment. +\v 19 You shall not pervert justice. You shall not show partiality. You shall not take a bribe, for a bribe blinds the eyes of the wise and perverts the words of the righteous. +\v 20 You shall follow that which is altogether just, that you may live and inherit the land which Yahweh your God gives you. +\v 21 You shall not plant for yourselves an Asherah of any kind of tree beside Yahweh your God’s altar, which you shall make for yourselves. +\v 22 Neither shall you set yourself up a sacred stone which Yahweh your God hates. +\c 17 +\p +\v 1 You shall not sacrifice to Yahweh your God an ox or a sheep in which is a defect or anything evil; for that is an abomination to Yahweh your God. +\p +\v 2 If there is found among you, within any of your gates which Yahweh your God gives you, a man or woman who does that which is evil in Yahweh your God’s sight in transgressing his covenant, +\v 3 and has gone and served other gods and worshiped them, or the sun, or the moon, or any of the stars of the sky, which I have not commanded, +\v 4 and you are told, and you have heard of it, then you shall inquire diligently. Behold, if it is true, and the thing certain, that such abomination is done in Israel, +\v 5 then you shall bring out that man or that woman who has done this evil thing to your gates, even that same man or woman; and you shall stone them to death with stones. +\v 6 At the mouth of two witnesses, or three witnesses, he who is to die shall be put to death. At the mouth of one witness he shall not be put to death. +\v 7 The hands of the witnesses shall be first on him to put him to death, and afterward the hands of all the people. So you shall remove the evil from among you. +\p +\v 8 If there arises a matter too hard for you in judgment, between blood and blood, between plea and plea, and between stroke and stroke, being matters of controversy within your gates, then you shall arise, and go up to the place which Yahweh your God chooses. +\v 9 You shall come to the priests who are Levites and to the judge who shall be in those days. You shall inquire, and they shall give you the verdict. +\v 10 You shall do according to the decisions of the verdict which they shall give you from that place which Yahweh chooses. You shall observe to do according to all that they shall teach you. +\v 11 According to the decisions of the law which they shall teach you, and according to the judgment which they shall tell you, you shall do. You shall not turn away from the sentence which they announce to you, to the right hand, nor to the left. +\v 12 The man who does presumptuously in not listening to the priest who stands to minister there before Yahweh your God, or to the judge, even that man shall die. You shall put away the evil from Israel. +\v 13 All the people shall hear and fear, and do no more presumptuously. +\p +\v 14 When you have come to the land which Yahweh your God gives you, and possess it and dwell in it, and say, “I will set a king over me, like all the nations that are around me,” +\v 15 you shall surely set him whom Yahweh your God chooses as king over yourselves. You shall set as king over you one from among your brothers. You may not put a foreigner over you, who is not your brother. +\v 16 Only he shall not multiply horses to himself, nor cause the people to return to Egypt, to the end that he may multiply horses; because Yahweh has said to you, “You shall not go back that way again.” +\v 17 He shall not multiply wives to himself, that his heart not turn away. He shall not greatly multiply to himself silver and gold. +\p +\v 18 It shall be, when he sits on the throne of his kingdom, that he shall write himself a copy of this law in a book, out of that which is before the Levitical priests. +\v 19 It shall be with him, and he shall read from it all the days of his life, that he may learn to fear Yahweh his God, to keep all the words of this law and these statutes, to do them; +\v 20 that his heart not be lifted up above his brothers, and that he not turn away from the commandment to the right hand, or to the left, to the end that he may prolong his days in his kingdom, he and his children, in the middle of Israel. +\c 18 +\p +\v 1 The priests and the Levites—all the tribe of Levi—shall have no portion nor inheritance with Israel. They shall eat the offerings of Yahweh made by fire and his portion. +\v 2 They shall have no inheritance among their brothers. Yahweh is their inheritance, as he has spoken to them. +\v 3 This shall be the priests’ due from the people, from those who offer a sacrifice, whether it be ox or sheep, that they shall give to the priest: the shoulder, the two cheeks, and the inner parts. +\v 4 You shall give him the first fruits of your grain, of your new wine, and of your oil, and the first of the fleece of your sheep. +\v 5 For Yahweh your God has chosen him out of all your tribes to stand to minister in Yahweh’s name, him and his sons forever. +\p +\v 6 If a Levite comes from any of your gates out of all Israel where he lives, and comes with all the desire of his soul to the place which Yahweh shall choose, +\v 7 then he shall minister in the name of Yahweh his God, as all his brothers the Levites do, who stand there before Yahweh. +\v 8 They shall have like portions to eat, in addition to that which comes from the sale of his family possessions. +\p +\v 9 When you have come into the land which Yahweh your God gives you, you shall not learn to imitate the abominations of those nations. +\v 10 There shall not be found with you anyone who makes his son or his daughter to pass through the fire, one who uses divination, one who tells fortunes, or an enchanter, or a sorcerer, +\v 11 or a charmer, or someone who consults with a familiar spirit, or a wizard, or a necromancer. +\v 12 For whoever does these things is an abomination to Yahweh. Because of these abominations, Yahweh your God drives them out from before you. +\v 13 You shall be blameless with Yahweh your God. +\v 14 For these nations that you shall dispossess listen to those who practice sorcery and to diviners; but as for you, Yahweh your God has not allowed you so to do. +\v 15 Yahweh your God will raise up to you a prophet from among you, of your brothers, like me. You shall listen to him. +\v 16 This is according to all that you desired of Yahweh your God in Horeb in the day of the assembly, saying, “Let me not hear again Yahweh my God’s voice, neither let me see this great fire any more, that I not die.” +\p +\v 17 Yahweh said to me, “They have well said that which they have spoken. +\v 18 I will raise them up a prophet from among their brothers, like you. I will put my words in his mouth, and he shall speak to them all that I shall command him. +\v 19 It shall happen, that whoever will not listen to my words which he shall speak in my name, I will require it of him. +\v 20 But the prophet who speaks a word presumptuously in my name, which I have not commanded him to speak, or who speaks in the name of other gods, that same prophet shall die.” +\p +\v 21 You may say in your heart, “How shall we know the word which Yahweh has not spoken?” +\v 22 When a prophet speaks in Yahweh’s name, if the thing doesn’t follow, nor happen, that is the thing which Yahweh has not spoken. The prophet has spoken it presumptuously. You shall not be afraid of him. +\c 19 +\p +\v 1 When Yahweh your God cuts off the nations whose land Yahweh your God gives you, and you succeed them and dwell in their cities and in their houses, +\v 2 you shall set apart three cities for yourselves in the middle of your land, which Yahweh your God gives you to possess. +\v 3 You shall prepare the way, and divide the borders of your land which Yahweh your God causes you to inherit into three parts, that every man slayer may flee there. +\v 4 This is the case of the man slayer who shall flee there and live: Whoever kills his neighbor unintentionally, and didn’t hate him in time past— +\v 5 as when a man goes into the forest with his neighbor to chop wood and his hand swings the ax to cut down the tree, and the head slips from the handle and hits his neighbor so that he dies—he shall flee to one of these cities and live. +\v 6 Otherwise, the avenger of blood might pursue the man slayer while hot anger is in his heart and overtake him, because the way is long, and strike him mortally, even though he was not worthy of death, because he didn’t hate him in time past. +\v 7 Therefore I command you to set apart three cities for yourselves. +\v 8 If Yahweh your God enlarges your border, as he has sworn to your fathers, and gives you all the land which he promised to give to your fathers; +\v 9 and if you keep all this commandment to do it, which I command you today, to love Yahweh your God, and to walk ever in his ways, then you shall add three cities more for yourselves, in addition to these three. +\v 10 This is so that innocent blood will not be shed in the middle of your land which Yahweh your God gives you for an inheritance, leaving blood guilt on you. +\v 11 But if any man hates his neighbor, lies in wait for him, rises up against him, strikes him mortally so that he dies, and he flees into one of these cities; +\v 12 then the elders of his city shall send and bring him there, and deliver him into the hand of the avenger of blood, that he may die. +\v 13 Your eye shall not pity him, but you shall purge the innocent blood from Israel that it may go well with you. +\p +\v 14 You shall not remove your neighbor’s landmark, which they of old time have set, in your inheritance which you shall inherit, in the land that Yahweh your God gives you to possess. +\p +\v 15 One witness shall not rise up against a man for any iniquity, or for any sin that he sins. At the mouth of two witnesses, or at the mouth of three witnesses, shall a matter be established. +\v 16 If an unrighteous witness rises up against any man to testify against him of wrongdoing, +\v 17 then both the men, between whom the controversy is, shall stand before Yahweh, before the priests and the judges who shall be in those days; +\v 18 and the judges shall make diligent inquisition; and behold, if the witness is a false witness, and has testified falsely against his brother, +\v 19 then you shall do to him as he had thought to do to his brother. So you shall remove the evil from among you. +\v 20 Those who remain shall hear, and fear, and will never again commit any such evil among you. +\v 21 Your eyes shall not pity: life for life, eye for eye, tooth for tooth, hand for hand, foot for foot. +\c 20 +\p +\v 1 When you go out to battle against your enemies, and see horses, chariots, and a people more numerous than you, you shall not be afraid of them; for Yahweh your God, who brought you up out of the land of Egypt, is with you. +\v 2 It shall be, when you draw near to the battle, that the priest shall approach and speak to the people, +\v 3 and shall tell them, “Hear, Israel, you draw near today to battle against your enemies. Don’t let your heart faint! Don’t be afraid, nor tremble, neither be scared of them; +\v 4 for Yahweh your God is he who goes with you, to fight for you against your enemies, to save you.” +\p +\v 5 The officers shall speak to the people, saying, “What man is there who has built a new house, and has not dedicated it? Let him go and return to his house, lest he die in the battle, and another man dedicate it. +\v 6 What man is there who has planted a vineyard, and has not used its fruit? Let him go and return to his house, lest he die in the battle, and another man use its fruit. +\v 7 What man is there who has pledged to be married to a wife, and has not taken her? Let him go and return to his house, lest he die in the battle, and another man take her.” +\v 8 The officers shall speak further to the people, and they shall say, “What man is there who is fearful and faint-hearted? Let him go and return to his house, lest his brother’s heart melt as his heart.” +\v 9 It shall be, when the officers have finished speaking to the people, that they shall appoint captains of armies at the head of the people. +\p +\v 10 When you draw near to a city to fight against it, then proclaim peace to it. +\v 11 It shall be, if it gives you answer of peace and opens to you, then it shall be that all the people who are found therein shall become forced laborers to you, and shall serve you. +\v 12 If it will make no peace with you, but will make war against you, then you shall besiege it. +\v 13 When Yahweh your God delivers it into your hand, you shall strike every male of it with the edge of the sword; +\v 14 but the women, the little ones, the livestock, and all that is in the city, even all its plunder, you shall take for plunder for yourself. You may use the plunder of your enemies, which Yahweh your God has given you. +\v 15 Thus you shall do to all the cities which are very far off from you, which are not of the cities of these nations. +\v 16 But of the cities of these peoples that Yahweh your God gives you for an inheritance, you shall save alive nothing that breathes; +\v 17 but you shall utterly destroy them: the Hittite, the Amorite, the Canaanite, the Perizzite, the Hivite, and the Jebusite, as Yahweh your God has commanded you; +\v 18 that they not teach you to follow all their abominations, which they have done for their gods; so would you sin against Yahweh your God. +\v 19 When you shall besiege a city a long time, in making war against it to take it, you shall not destroy its trees by wielding an ax against them; for you may eat of them. You shall not cut them down, for is the tree of the field man, that it should be besieged by you? +\v 20 Only the trees that you know are not trees for food, you shall destroy and cut them down. You shall build bulwarks against the city that makes war with you, until it falls. +\c 21 +\p +\v 1 If someone is found slain in the land which Yahweh your God gives you to possess, lying in the field, and it isn’t known who has struck him, +\v 2 then your elders and your judges shall come out, and they shall measure to the cities which are around him who is slain. +\v 3 It shall be that the elders of the city which is nearest to the slain man shall take a heifer of the herd, which hasn’t been worked with and which has not drawn in the yoke. +\v 4 The elders of that city shall bring the heifer down to a valley with running water, which is neither plowed nor sown, and shall break the heifer’s neck there in the valley. +\v 5 The priests the sons of Levi shall come near, for them Yahweh your God has chosen to minister to him, and to bless in Yahweh’s name; and according to their word shall every controversy and every assault be decided. +\v 6 All the elders of that city which is nearest to the slain man shall wash their hands over the heifer whose neck was broken in the valley. +\v 7 They shall answer and say, “Our hands have not shed this blood, neither have our eyes seen it. +\v 8 Forgive, Yahweh, your people Israel, whom you have redeemed, and don’t allow innocent blood among your people Israel.” The blood shall be forgiven them. +\v 9 So you shall put away the innocent blood from among you, when you shall do that which is right in Yahweh’s eyes. +\p +\v 10 When you go out to battle against your enemies, and Yahweh your God delivers them into your hands and you carry them away captive, +\v 11 and see among the captives a beautiful woman, and you are attracted to her, and desire to take her as your wife, +\v 12 then you shall bring her home to your house. She shall shave her head and trim her nails. +\v 13 She shall take off the clothing of her captivity, and shall remain in your house, and bewail her father and her mother a full month. After that you shall go in to her and be her husband, and she shall be your wife. +\v 14 It shall be, if you have no delight in her, then you shall let her go where she desires; but you shall not sell her at all for money. You shall not deal with her as a slave, because you have humbled her. +\p +\v 15 If a man has two wives, the one beloved and the other hated, and they have borne him children, both the beloved and the hated, and if the firstborn son is hers who was hated, +\v 16 then it shall be, in the day that he causes his sons to inherit that which he has, that he may not give the son of the beloved the rights of the firstborn before the son of the hated, who is the firstborn; +\v 17 but he shall acknowledge the firstborn, the son of the hated, by giving him a double portion of all that he has; for he is the beginning of his strength. The right of the firstborn is his. +\p +\v 18 If a man has a stubborn and rebellious son who will not obey the voice of his father or the voice of his mother, and though they chasten him, will not listen to them, +\v 19 then his father and his mother shall take hold of him and bring him out to the elders of his city and to the gate of his place. +\v 20 They shall tell the elders of his city, “This our son is stubborn and rebellious. He will not obey our voice. He is a glutton and a drunkard.” +\v 21 All the men of his city shall stone him to death with stones. So you shall remove the evil from among you. All Israel shall hear, and fear. +\p +\v 22 If a man has committed a sin worthy of death, and he is put to death, and you hang him on a tree, +\v 23 his body shall not remain all night on the tree, but you shall surely bury him the same day; for he who is hanged is accursed of God. Don’t defile your land which Yahweh your God gives you for an inheritance. +\c 22 +\p +\v 1 You shall not see your brother’s ox or his sheep go astray and hide yourself from them. You shall surely bring them again to your brother. +\v 2 If your brother isn’t near to you, or if you don’t know him, then you shall bring it home to your house, and it shall be with you until your brother comes looking for it, and you shall restore it to him. +\v 3 So you shall do with his donkey. So you shall do with his garment. So you shall do with every lost thing of your brother’s, which he has lost and you have found. You may not hide yourself. +\v 4 You shall not see your brother’s donkey or his ox fallen down by the way, and hide yourself from them. You shall surely help him to lift them up again. +\p +\v 5 A woman shall not wear men’s clothing, neither shall a man put on women’s clothing; for whoever does these things is an abomination to Yahweh your God. +\p +\v 6 If you come across a bird’s nest on the way, in any tree or on the ground, with young ones or eggs, and the hen sitting on the young, or on the eggs, you shall not take the hen with the young. +\v 7 You shall surely let the hen go, but the young you may take for yourself, that it may be well with you, and that you may prolong your days. +\p +\v 8 When you build a new house, then you shall make a railing around your roof, so that you don’t bring blood on your house if anyone falls from there. +\p +\v 9 You shall not sow your vineyard with two kinds of seed, lest all the fruit be defiled, the seed which you have sown, and the increase of the vineyard. +\v 10 You shall not plow with an ox and a donkey together. +\v 11 You shall not wear clothes of wool and linen woven together. +\p +\v 12 You shall make yourselves fringes\f + \fr 22:12 \ft or, tassels\f* on the four corners of your cloak with which you cover yourself. +\p +\v 13 If any man takes a wife, and goes in to her, hates her, +\v 14 accuses her of shameful things, gives her a bad name, and says, “I took this woman, and when I came near to her, I didn’t find in her the tokens of virginity;” +\v 15 then the young lady’s father and mother shall take and bring the tokens of the young lady’s virginity to the elders of the city in the gate. +\v 16 The young lady’s father shall tell the elders, “I gave my daughter to this man as his wife, and he hates her. +\v 17 Behold, he has accused her of shameful things, saying, ‘I didn’t find in your daughter the tokens of virginity;’ and yet these are the tokens of my daughter’s virginity.” They shall spread the cloth before the elders of the city. +\v 18 The elders of that city shall take the man and chastise him. +\v 19 They shall fine him one hundred shekels of silver,\f + \fr 22:19 \ft A shekel is about 10 grams or about 0.35 ounces, so 100 shekels is about a kilogram or 2.2 pounds.\f* and give them to the father of the young lady, because he has given a bad name to a virgin of Israel. She shall be his wife. He may not put her away all his days. +\p +\v 20 But if this thing is true, that the tokens of virginity were not found in the young lady, +\v 21 then they shall bring out the young lady to the door of her father’s house, and the men of her city shall stone her to death with stones, because she has done folly in Israel, to play the prostitute in her father’s house. So you shall remove the evil from among you. +\p +\v 22 If a man is found lying with a woman married to a husband, then they shall both die, the man who lay with the woman and the woman. So you shall remove the evil from Israel. +\v 23 If there is a young lady who is a virgin pledged to be married to a husband, and a man finds her in the city, and lies with her, +\v 24 then you shall bring them both out to the gate of that city, and you shall stone them to death with stones; the lady, because she didn’t cry, being in the city; and the man, because he has humbled his neighbor’s wife. So you shall remove the evil from among you. +\v 25 But if the man finds the lady who is pledged to be married in the field, and the man forces her and lies with her, then only the man who lay with her shall die; +\v 26 but to the lady you shall do nothing. There is in the lady no sin worthy of death; for as when a man rises against his neighbor and kills him, even so is this matter; +\v 27 for he found her in the field, the pledged to be married lady cried, and there was no one to save her. +\v 28 If a man finds a lady who is a virgin, who is not pledged to be married, grabs her and lies with her, and they are found, +\v 29 then the man who lay with her shall give to the lady’s father fifty shekels\f + \fr 22:29 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver. She shall be his wife, because he has humbled her. He may not put her away all his days. +\v 30 A man shall not take his father’s wife, and shall not uncover his father’s skirt. +\c 23 +\p +\v 1 He who is emasculated by crushing or cutting shall not enter into Yahweh’s assembly. +\v 2 A person born of a forbidden union shall not enter into Yahweh’s assembly; even to the tenth generation shall no one of his enter into Yahweh’s assembly. +\v 3 An Ammonite or a Moabite shall not enter into Yahweh’s assembly; even to the tenth generation shall no one belonging to them enter into Yahweh’s assembly forever, +\v 4 because they didn’t meet you with bread and with water on the way when you came out of Egypt, and because they hired against you Balaam the son of Beor from Pethor of Mesopotamia, to curse you. +\v 5 Nevertheless Yahweh your God wouldn’t listen to Balaam, but Yahweh your God turned the curse into a blessing to you, because Yahweh your God loved you. +\v 6 You shall not seek their peace nor their prosperity all your days forever. +\v 7 You shall not abhor an Edomite, for he is your brother. You shall not abhor an Egyptian, because you lived as a foreigner in his land. +\v 8 The children of the third generation who are born to them may enter into Yahweh’s assembly. +\p +\v 9 When you go out and camp against your enemies, then you shall keep yourselves from every evil thing. +\v 10 If there is among you any man who is not clean by reason of that which happens to him by night, then shall he go outside of the camp. He shall not come within the camp; +\v 11 but it shall be, when evening comes, he shall bathe himself in water. When the sun is down, he shall come within the camp. +\v 12 You shall have a place also outside of the camp where you go relieve yourself. +\v 13 You shall have a trowel among your weapons. It shall be, when you relieve yourself, you shall dig with it, and shall turn back and cover your excrement; +\v 14 for Yahweh your God walks in the middle of your camp, to deliver you, and to give up your enemies before you. Therefore your camp shall be holy, that he may not see an unclean thing in you, and turn away from you. +\p +\v 15 You shall not deliver to his master a servant who has escaped from his master to you. +\v 16 He shall dwell with you, among you, in the place which he shall choose within one of your gates, where it pleases him best. You shall not oppress him. +\p +\v 17 There shall be no prostitute of the daughters of Israel, neither shall there be a sodomite of the sons of Israel. +\v 18 You shall not bring the hire of a prostitute, or the wages of a male prostitute,\f + \fr 23:18 \ft literally, dog\f* into the house of Yahweh your God for any vow; for both of these are an abomination to Yahweh your God. +\p +\v 19 You shall not lend on interest to your brother: interest of money, interest of food, interest of anything that is lent on interest. +\v 20 You may charge a foreigner interest; but you shall not charge your brother interest, that Yahweh your God may bless you in all that you put your hand to, in the land where you go in to possess it. +\p +\v 21 When you vow a vow to Yahweh your God, you shall not be slack to pay it, for Yahweh your God will surely require it of you; and it would be sin in you. +\v 22 But if you refrain from making a vow, it shall be no sin in you. +\v 23 You shall observe and do that which has gone out of your lips. Whatever you have vowed to Yahweh your God as a free will offering, which you have promised with your mouth, you must do. +\v 24 When you come into your neighbor’s vineyard, then you may eat your fill of grapes at your own pleasure; but you shall not put any in your container. +\v 25 When you come into your neighbor’s standing grain, then you may pluck the ears with your hand; but you shall not use a sickle on your neighbor’s standing grain. +\c 24 +\p +\v 1 When a man takes a wife and marries her, then it shall be, if she finds no favor in his eyes because he has found some unseemly thing in her, that he shall write her a certificate of divorce, put it in her hand, and send her out of his house. +\v 2 When she has departed out of his house, she may go and be another man’s wife. +\v 3 If the latter husband hates her, and writes her a certificate of divorce, puts it in her hand, and sends her out of his house; or if the latter husband dies, who took her to be his wife; +\v 4 her former husband, who sent her away, may not take her again to be his wife after she is defiled; for that would be an abomination to Yahweh. You shall not cause the land to sin, which Yahweh your God gives you for an inheritance. +\v 5 When a man takes a new wife, he shall not go out in the army, neither shall he be assigned any business. He shall be free at home one year, and shall cheer his wife whom he has taken. +\p +\v 6 No man shall take the mill or the upper millstone as a pledge, for he takes a life in pledge. +\p +\v 7 If a man is found stealing any of his brothers of the children of Israel, and he deals with him as a slave, or sells him, then that thief shall die. So you shall remove the evil from among you. +\p +\v 8 Be careful in the plague of leprosy, that you observe diligently and do according to all that the Levitical priests teach you. As I commanded them, so you shall observe to do. +\v 9 Remember what Yahweh your God did to Miriam, by the way as you came out of Egypt. +\p +\v 10 When you lend your neighbor any kind of loan, you shall not go into his house to get his pledge. +\v 11 You shall stand outside, and the man to whom you lend shall bring the pledge outside to you. +\v 12 If he is a poor man, you shall not sleep with his pledge. +\v 13 You shall surely restore to him the pledge when the sun goes down, that he may sleep in his garment and bless you. It shall be righteousness to you before Yahweh your God. +\p +\v 14 You shall not oppress a hired servant who is poor and needy, whether he is one of your brothers or one of the foreigners who are in your land within your gates. +\v 15 In his day you shall give him his wages, neither shall the sun go down on it, for he is poor and sets his heart on it, lest he cry against you to Yahweh, and it be sin to you. +\p +\v 16 The fathers shall not be put to death for the children, neither shall the children be put to death for the fathers. Every man shall be put to death for his own sin. +\p +\v 17 You shall not deprive the foreigner or the fatherless of justice, nor take a widow’s clothing in pledge; +\v 18 but you shall remember that you were a slave in Egypt, and Yahweh your God redeemed you there. Therefore I command you to do this thing. +\p +\v 19 When you reap your harvest in your field, and have forgotten a sheaf in the field, you shall not go again to get it. It shall be for the foreigner, for the fatherless, and for the widow, that Yahweh your God may bless you in all the work of your hands. +\v 20 When you beat your olive tree, you shall not go over the boughs again. It shall be for the foreigner, for the fatherless, and for the widow. +\p +\v 21 When you harvest your vineyard, you shall not glean it after yourselves. It shall be for the foreigner, for the fatherless, and for the widow. +\v 22 You shall remember that you were a slave in the land of Egypt. Therefore I command you to do this thing. +\c 25 +\p +\v 1 If there is a controversy between men, and they come to judgment and the judges judge them, then they shall justify the righteous and condemn the wicked. +\v 2 It shall be, if the wicked man is worthy to be beaten, that the judge shall cause him to lie down and to be beaten before his face, according to his wickedness, by number. +\v 3 He may sentence him to no more than forty stripes. He shall not give more, lest if he should give more and beat him more than that many stripes, then your brother will be degraded in your sight. +\p +\v 4 You shall not muzzle the ox when he treads out the grain. +\p +\v 5 If brothers dwell together, and one of them dies and has no son, the wife of the dead shall not be married outside to a stranger. Her husband’s brother shall go in to her, and take her as his wife, and perform the duty of a husband’s brother to her. +\v 6 It shall be that the firstborn whom she bears shall succeed in the name of his brother who is dead, that his name not be blotted out of Israel. +\p +\v 7 If the man doesn’t want to take his brother’s wife, then his brother’s wife shall go up to the gate to the elders, and say, “My husband’s brother refuses to raise up to his brother a name in Israel. He will not perform the duty of a husband’s brother to me.” +\v 8 Then the elders of his city shall call him, and speak to him. If he stands and says, “I don’t want to take her,” +\v 9 then his brother’s wife shall come to him in the presence of the elders, and loose his sandal from off his foot, and spit in his face. She shall answer and say, “So shall it be done to the man who does not build up his brother’s house.” +\v 10 His name shall be called in Israel, “The house of him who had his sandal removed.” +\p +\v 11 When men strive against each other, and the wife of one draws near to deliver her husband out of the hand of him who strikes him, and puts out her hand, and grabs him by his private parts, +\v 12 then you shall cut off her hand. Your eye shall have no pity. +\p +\v 13 You shall not have in your bag diverse weights, one heavy and one light. +\v 14 You shall not have in your house diverse measures, one large and one small. +\v 15 You shall have a perfect and just weight. You shall have a perfect and just measure, that your days may be long in the land which Yahweh your God gives you. +\v 16 For all who do such things, all who do unrighteously, are an abomination to Yahweh your God. +\p +\v 17 Remember what Amalek did to you by the way as you came out of Egypt, +\v 18 how he met you by the way, and struck the rearmost of you, all who were feeble behind you, when you were faint and weary; and he didn’t fear God. +\v 19 Therefore it shall be, when Yahweh your God has given you rest from all your enemies all around, in the land which Yahweh your God gives you for an inheritance to possess it, that you shall blot out the memory of Amalek from under the sky. You shall not forget. +\c 26 +\p +\v 1 It shall be, when you have come in to the land which Yahweh your God gives you for an inheritance, possess it, and dwell in it, +\v 2 that you shall take some of the first of all the fruit of the ground, which you shall bring in from your land that Yahweh your God gives you. You shall put it in a basket, and shall go to the place which Yahweh your God shall choose to cause his name to dwell there. +\v 3 You shall come to the priest who shall be in those days, and tell him, “I profess today to Yahweh your God, that I have come to the land which Yahweh swore to our fathers to give us.” +\v 4 The priest shall take the basket out of your hand, and set it down before Yahweh your God’s altar. +\v 5 You shall answer and say before Yahweh your God, “My father\f + \fr 26:5 \ft or, forefather\f* was a Syrian ready to perish. He went down into Egypt, and lived there, few in number. There he became a great, mighty, and populous nation. +\v 6 The Egyptians mistreated us, afflicted us, and imposed hard labor on us. +\v 7 Then we cried to Yahweh, the God of our fathers. Yahweh heard our voice, and saw our affliction, our toil, and our oppression. +\v 8 Yahweh brought us out of Egypt with a mighty hand, with an outstretched arm, with great terror, with signs, and with wonders; +\v 9 and he has brought us into this place, and has given us this land, a land flowing with milk and honey. +\v 10 Now, behold, I have brought the first of the fruit of the ground, which you, Yahweh, have given me.” You shall set it down before Yahweh your God, and worship before Yahweh your God. +\v 11 You shall rejoice in all the good which Yahweh your God has given to you, and to your house, you, and the Levite, and the foreigner who is among you. +\p +\v 12 When you have finished tithing all the tithe of your increase in the third year, which is the year of tithing, then you shall give it to the Levite, to the foreigner, to the fatherless, and to the widow, that they may eat within your gates and be filled. +\v 13 You shall say before Yahweh your God, “I have put away the holy things out of my house, and also have given them to the Levite, to the foreigner, to the fatherless, and to the widow, according to all your commandment which you have commanded me. I have not transgressed any of your commandments, neither have I forgotten them. +\v 14 I have not eaten of it in my mourning, neither have I removed any of it while I was unclean, nor given of it for the dead. I have listened to Yahweh my God’s voice. I have done according to all that you have commanded me. +\v 15 Look down from your holy habitation, from heaven, and bless your people Israel, and the ground which you have given us, as you swore to our fathers, a land flowing with milk and honey.” +\p +\v 16 Today Yahweh your God commands you to do these statutes and ordinances. You shall therefore keep and do them with all your heart and with all your soul. +\v 17 You have declared today that Yahweh is your God, and that you would walk in his ways, keep his statutes, his commandments, and his ordinances, and listen to his voice. +\v 18 Yahweh has declared today that you are a people for his own possession, as he has promised you, and that you should keep all his commandments. +\v 19 He will make you high above all nations that he has made, in praise, in name, and in honor, and that you may be a holy people to Yahweh your God, as he has spoken. +\c 27 +\p +\v 1 Moses and the elders of Israel commanded the people, saying, “Keep all the commandment which I command you today. +\v 2 It shall be on the day when you shall pass over the Jordan to the land which Yahweh your God gives you, that you shall set yourself up great stones, and coat them with plaster. +\v 3 You shall write on them all the words of this law, when you have passed over, that you may go in to the land which Yahweh your God gives you, a land flowing with milk and honey, as Yahweh, the God of your fathers, has promised you. +\v 4 It shall be, when you have crossed over the Jordan, that you shall set up these stones, which I command you today, on Mount Ebal, and you shall coat them with plaster. +\v 5 There you shall build an altar to Yahweh your God, an altar of stones. You shall not use any iron tool on them. +\v 6 You shall build Yahweh your God’s altar of uncut stones. You shall offer burnt offerings on it to Yahweh your God. +\v 7 You shall sacrifice peace offerings, and shall eat there. You shall rejoice before Yahweh your God. +\v 8 You shall write on the stones all the words of this law very plainly.” +\p +\v 9 Moses and the Levitical priests spoke to all Israel, saying, “Be silent and listen, Israel! Today you have become the people of Yahweh your God. +\v 10 You shall therefore obey Yahweh your God’s voice, and do his commandments and his statutes, which I command you today.” +\p +\v 11 Moses commanded the people the same day, saying, +\v 12 “These shall stand on Mount Gerizim to bless the people, when you have crossed over the Jordan: Simeon, Levi, Judah, Issachar, Joseph, and Benjamin. +\v 13 These shall stand on Mount Ebal for the curse: Reuben, Gad, Asher, Zebulun, Dan, and Naphtali. +\v 14 With a loud voice, the Levites shall say to all the men of Israel, +\v 15 ‘Cursed is the man who makes an engraved or molten image, an abomination to Yahweh, the work of the hands of the craftsman, and sets it up in secret.’ +\p All the people shall answer and say, ‘Amen.’ +\p +\v 16 ‘Cursed is he who dishonors his father or his mother.’ +\p All the people shall say, ‘Amen.’ +\p +\v 17 ‘Cursed is he who removes his neighbor’s landmark.’ +\p All the people shall say, ‘Amen.’ +\p +\v 18 ‘Cursed is he who leads the blind astray on the road.’ +\p All the people shall say, ‘Amen.’ +\p +\v 19 ‘Cursed is he who withholds justice from the foreigner, fatherless, and widow.’ +\p All the people shall say, ‘Amen.’ +\p +\v 20 ‘Cursed is he who lies with\f + \fr 27:20 \ft i.e., has sexual relations with\f* his father’s wife, because he dishonors his father’s bed.’ +\p All the people shall say, ‘Amen.’ +\p +\v 21 ‘Cursed is he who lies with any kind of animal.’ +\p All the people shall say, ‘Amen.’ +\p +\v 22 ‘Cursed is he who lies with his sister, his father’s daughter or his mother’s daughter.’ +\p All the people shall say, ‘Amen.’ +\p +\v 23 ‘Cursed is he who lies with his mother-in-law.’ +\p All the people shall say, ‘Amen.’ +\p +\v 24 ‘Cursed is he who secretly kills his neighbor.’ +\p All the people shall say, ‘Amen.’ +\p +\v 25 ‘Cursed is he who takes a bribe to kill an innocent person.’ +\p All the people shall say, ‘Amen.’ +\p +\v 26 ‘Cursed is he who doesn’t uphold the words of this law by doing them.’ +\p All the people shall say, ‘Amen.’” +\c 28 +\p +\v 1 It shall happen, if you shall listen diligently to Yahweh your God’s voice, to observe to do all his commandments which I command you today, that Yahweh your God will set you high above all the nations of the earth. +\v 2 All these blessings will come upon you, and overtake you, if you listen to Yahweh your God’s voice. +\v 3 You shall be blessed in the city, and you shall be blessed in the field. +\v 4 You shall be blessed in the fruit of your body, the fruit of your ground, the fruit of your animals, the increase of your livestock, and the young of your flock. +\v 5 Your basket and your kneading trough shall be blessed. +\v 6 You shall be blessed when you come in, and you shall be blessed when you go out. +\v 7 Yahweh will cause your enemies who rise up against you to be struck before you. They will come out against you one way, and will flee before you seven ways. +\v 8 Yahweh will command the blessing on you in your barns, and in all that you put your hand to. He will bless you in the land which Yahweh your God gives you. +\v 9 Yahweh will establish you for a holy people to himself, as he has sworn to you, if you shall keep the commandments of Yahweh your God, and walk in his ways. +\v 10 All the peoples of the earth shall see that you are called by Yahweh’s name, and they will be afraid of you. +\v 11 Yahweh will grant you abundant prosperity in the fruit of your body, in the fruit of your livestock, and in the fruit of your ground, in the land which Yahweh swore to your fathers to give you. +\v 12 Yahweh will open to you his good treasure in the sky, to give the rain of your land in its season, and to bless all the work of your hand. You will lend to many nations, and you will not borrow. +\v 13 Yahweh will make you the head, and not the tail. You will be above only, and you will not be beneath, if you listen to the commandments of Yahweh your God which I command you today, to observe and to do, +\v 14 and shall not turn away from any of the words which I command you today, to the right hand or to the left, to go after other gods to serve them. +\p +\v 15 But it shall come to pass, if you will not listen to Yahweh your God’s voice, to observe to do all his commandments and his statutes which I command you today, that all these curses will come on you and overtake you. +\v 16 You will be cursed in the city, and you will be cursed in the field. +\v 17 Your basket and your kneading trough will be cursed. +\v 18 The fruit of your body, the fruit of your ground, the increase of your livestock, and the young of your flock will be cursed. +\v 19 You will be cursed when you come in, and you will be cursed when you go out. +\v 20 Yahweh will send on you cursing, confusion, and rebuke in all that you put your hand to do, until you are destroyed and until you perish quickly, because of the evil of your doings, by which you have forsaken me. +\v 21 Yahweh will make the pestilence cling to you, until he has consumed you from off the land where you go in to possess it. +\v 22 Yahweh will strike you with consumption, with fever, with inflammation, with fiery heat, with the sword, with blight, and with mildew. They will pursue you until you perish. +\v 23 Your sky that is over your head will be bronze, and the earth that is under you will be iron. +\v 24 Yahweh will make the rain of your land powder and dust. It will come down on you from the sky, until you are destroyed. +\v 25 Yahweh will cause you to be struck before your enemies. You will go out one way against them, and will flee seven ways before them. You will be tossed back and forth among all the kingdoms of the earth. +\v 26 Your dead bodies will be food to all birds of the sky, and to the animals of the earth; and there will be no one to frighten them away. +\v 27 Yahweh will strike you with the boils of Egypt, with the tumors, with the scurvy, and with the itch, of which you can not be healed. +\v 28 Yahweh will strike you with madness, with blindness, and with astonishment of heart. +\v 29 You will grope at noonday, as the blind gropes in darkness, and you shall not prosper in your ways. You will only be oppressed and robbed always, and there will be no one to save you. +\v 30 You will betroth a wife, and another man shall lie with her. You will build a house, and you won’t dwell in it. You will plant a vineyard, and not use its fruit. +\v 31 Your ox will be slain before your eyes, and you will not eat any of it. Your donkey will be violently taken away from before your face, and will not be restored to you. Your sheep will be given to your enemies, and you will have no one to save you. +\v 32 Your sons and your daughters will be given to another people. Your eyes will look and fail with longing for them all day long. There will be no power in your hand. +\v 33 A nation which you don’t know will eat the fruit of your ground and all of your work. You will only be oppressed and crushed always, +\v 34 so that the sights that you see with your eyes will drive you mad. +\v 35 Yahweh will strike you in the knees and in the legs with a sore boil, of which you cannot be healed, from the sole of your foot to the crown of your head. +\v 36 Yahweh will bring you, and your king whom you will set over yourselves, to a nation that you have not known, you nor your fathers. There you will serve other gods of wood and stone. +\v 37 You will become an astonishment, a proverb, and a byword among all the peoples where Yahweh will lead you away. +\v 38 You will carry much seed out into the field, and will gather little in, for the locust will consume it. +\v 39 You will plant vineyards and dress them, but you will neither drink of the wine, nor harvest, because worms will eat them. +\v 40 You will have olive trees throughout all your borders, but you won’t anoint yourself with the oil, for your olives will drop off. +\v 41 You will father sons and daughters, but they will not be yours, for they will go into captivity. +\v 42 Locusts will consume all of your trees and the fruit of your ground. +\v 43 The foreigner who is among you will mount up above you higher and higher, and you will come down lower and lower. +\v 44 He will lend to you, and you won’t lend to him. He will be the head, and you will be the tail. +\p +\v 45 All these curses will come on you, and will pursue you and overtake you, until you are destroyed, because you didn’t listen to Yahweh your God’s voice, to keep his commandments and his statutes which he commanded you. +\v 46 They will be for a sign and for a wonder to you and to your offspring forever. +\v 47 Because you didn’t serve Yahweh your God with joyfulness and with gladness of heart, by reason of the abundance of all things; +\v 48 therefore you will serve your enemies whom Yahweh sends against you, in hunger, in thirst, in nakedness, and in lack of all things. He will put an iron yoke on your neck until he has destroyed you. +\v 49 Yahweh will bring a nation against you from far away, from the end of the earth, as the eagle flies: a nation whose language you will not understand, +\v 50 a nation of fierce facial expressions, that doesn’t respect the elderly, nor show favor to the young. +\v 51 They will eat the fruit of your livestock and the fruit of your ground, until you are destroyed. They also won’t leave you grain, new wine, oil, the increase of your livestock, or the young of your flock, until they have caused you to perish. +\v 52 They will besiege you in all your gates until your high and fortified walls in which you trusted come down throughout all your land. They will besiege you in all your gates throughout all your land which Yahweh your God has given you. +\v 53 You will eat the fruit of your own body, the flesh of your sons and of your daughters, whom Yahweh your God has given you, in the siege and in the distress with which your enemies will distress you. +\v 54 The man who is tender among you, and very delicate, his eye will be evil toward his brother, toward the wife whom he loves, and toward the remnant of his children whom he has remaining, +\v 55 so that he will not give to any of them of the flesh of his children whom he will eat, because he has nothing left to him, in the siege and in the distress with which your enemy will distress you in all your gates. +\v 56 The tender and delicate woman among you, who would not venture to set the sole of her foot on the ground for delicateness and tenderness, her eye will be evil toward the husband that she loves, toward her son, toward her daughter, +\v 57 toward her young one who comes out from between her feet, and toward her children whom she bears; for she will eat them secretly for lack of all things in the siege and in the distress with which your enemy will distress you in your gates. +\v 58 If you will not observe to do all the words of this law that are written in this book, that you may fear this glorious and fearful name, YAHWEH your God, +\v 59 then Yahweh will make your plagues and the plagues of your offspring fearful, even great plagues, and of long duration, and severe sicknesses, and of long duration. +\v 60 He will bring on you again all the diseases of Egypt, which you were afraid of; and they will cling to you. +\v 61 Also every sickness and every plague which is not written in the book of this law, Yahweh will bring them on you until you are destroyed. +\v 62 You will be left few in number, even though you were as the stars of the sky for multitude, because you didn’t listen to Yahweh your God’s voice. +\v 63 It will happen that as Yahweh rejoiced over you to do you good, and to multiply you, so Yahweh will rejoice over you to cause you to perish and to destroy you. You will be plucked from the land that you are going in to possess. +\v 64 Yahweh will scatter you among all peoples, from one end of the earth to the other end of the earth. There you will serve other gods which you have not known, you nor your fathers, even wood and stone. +\v 65 Among these nations you will find no ease, and there will be no rest for the sole of your foot; but Yahweh will give you there a trembling heart, failing of eyes, and pining of soul. +\v 66 Your life will hang in doubt before you. You will be afraid night and day, and will have no assurance of your life. +\v 67 In the morning you will say, “I wish it were evening!” and at evening you will say, “I wish it were morning!” for the fear of your heart which you will fear, and for the sights which your eyes will see. +\v 68 Yahweh will bring you into Egypt again with ships, by the way of which I told to you that you would never see it again. There you will offer yourselves to your enemies for male and female slaves, and nobody will buy you. +\c 29 +\p +\v 1 These are the words of the covenant which Yahweh commanded Moses to make with the children of Israel in the land of Moab, in addition to the covenant which he made with them in Horeb. +\v 2 Moses called to all Israel, and said to them: +\p Your eyes have seen all that Yahweh did in the land of Egypt to Pharaoh, and to all his servants, and to all his land; +\v 3 the great trials which your eyes saw, the signs, and those great wonders. +\v 4 But Yahweh has not given you a heart to know, eyes to see, and ears to hear, to this day. +\v 5 I have led you forty years in the wilderness. Your clothes have not grown old on you, and your sandals have not grown old on your feet. +\v 6 You have not eaten bread, neither have you drunk wine or strong drink, that you may know that I am Yahweh your God. +\v 7 When you came to this place, Sihon the king of Heshbon and Og the king of Bashan came out against us to battle, and we struck them. +\v 8 We took their land, and gave it for an inheritance to the Reubenites, and to the Gadites, and to the half-tribe of the Manassites. +\v 9 Therefore keep the words of this covenant and do them, that you may prosper in all that you do. +\v 10 All of you stand today in the presence of Yahweh your God: your heads, your tribes, your elders, and your officers, even all the men of Israel, +\v 11 your little ones, your wives, and the foreigners who are in the middle of your camps, from the one who cuts your wood to the one who draws your water, +\v 12 that you may enter into the covenant of Yahweh your God, and into his oath, which Yahweh your God makes with you today, +\v 13 that he may establish you today as his people, and that he may be your God, as he spoke to you and as he swore to your fathers, to Abraham, to Isaac, and to Jacob. +\v 14 Neither do I make this covenant and this oath with you only, +\v 15 but with those who stand here with us today before Yahweh our God, and also with those who are not here with us today +\v 16 (for you know how we lived in the land of Egypt, and how we came through the middle of the nations through which you passed; +\v 17 and you have seen their abominations and their idols of wood, stone, silver, and gold, which were among them); +\v 18 lest there should be among you man, woman, family, or tribe whose heart turns away today from Yahweh our God, to go to serve the gods of those nations; lest there should be among you a root that produces bitter poison; +\v 19 and it happen, when he hears the words of this curse, that he bless himself in his heart, saying, “I shall have peace, though I walk in the stubbornness of my heart,” to destroy the moist with the dry. +\v 20 Yahweh will not pardon him, but then Yahweh’s anger and his jealousy will smoke against that man, and all the curse that is written in this book will fall on him, and Yahweh will blot out his name from under the sky. +\v 21 Yahweh will set him apart for evil out of all the tribes of Israel, according to all the curses of the covenant written in this book of the law. +\p +\v 22 The generation to come—your children who will rise up after you, and the foreigner who will come from a far land—will say, when they see the plagues of that land, and the sicknesses with which Yahweh has made it sick, +\v 23 that all of its land is sulfur, salt, and burning, that it is not sown, doesn’t produce, nor does any grass grow in it, like the overthrow of Sodom, Gomorrah, Admah, and Zeboiim, which Yahweh overthrew in his anger, and in his wrath. +\v 24 Even all the nations will say, “Why has Yahweh done this to this land? What does the heat of this great anger mean?” +\p +\v 25 Then men will say, “Because they abandoned the covenant of Yahweh, the God of their fathers, which he made with them when he brought them out of the land of Egypt, +\v 26 and went and served other gods and worshiped them, gods that they didn’t know and that he had not given to them. +\v 27 Therefore Yahweh’s anger burned against this land, to bring on it all the curses that are written in this book. +\v 28 Yahweh rooted them out of their land in anger, in wrath, and in great indignation, and thrust them into another land, as it is today.” +\p +\v 29 The secret things belong to Yahweh our God; but the things that are revealed belong to us and to our children forever, that we may do all the words of this law. +\c 30 +\p +\v 1 It shall happen, when all these things have come on you, the blessing and the curse, which I have set before you, and you shall call them to mind among all the nations where Yahweh your God has driven you, +\v 2 and return to Yahweh your God and obey his voice according to all that I command you today, you and your children, with all your heart and with all your soul, +\v 3 that then Yahweh your God will release you from captivity, have compassion on you, and will return and gather you from all the peoples where Yahweh your God has scattered you. +\v 4 If your outcasts are in the uttermost parts of the heavens, from there Yahweh your God will gather you, and from there he will bring you back. +\v 5 Yahweh your God will bring you into the land which your fathers possessed, and you will possess it. He will do you good, and increase your numbers more than your fathers. +\v 6 Yahweh your God will circumcise your heart, and the heart of your offspring, to love Yahweh your God with all your heart and with all your soul, that you may live. +\v 7 Yahweh your God will put all these curses on your enemies and on those who hate you, who persecuted you. +\v 8 You shall return and obey Yahweh’s voice, and do all his commandments which I command you today. +\v 9 Yahweh your God will make you prosperous in all the work of your hand, in the fruit of your body, in the fruit of your livestock, and in the fruit of your ground, for good; for Yahweh will again rejoice over you for good, as he rejoiced over your fathers, +\v 10 if you will obey Yahweh your God’s voice, to keep his commandments and his statutes which are written in this book of the law, if you turn to Yahweh your God with all your heart and with all your soul. +\p +\v 11 For this commandment which I command you today is not too hard for you or too distant. +\v 12 It is not in heaven, that you should say, “Who will go up for us to heaven, bring it to us, and proclaim it to us, that we may do it?” +\v 13 Neither is it beyond the sea, that you should say, “Who will go over the sea for us, bring it to us, and proclaim it to us, that we may do it?” +\v 14 But the word is very near to you, in your mouth and in your heart, that you may do it. +\v 15 Behold, I have set before you today life and prosperity, and death and evil. +\v 16 For I command you today to love Yahweh your God, to walk in his ways and to keep his commandments, his statutes, and his ordinances, that you may live and multiply, and that Yahweh your God may bless you in the land where you go in to possess it. +\v 17 But if your heart turns away, and you will not hear, but are drawn away and worship other gods, and serve them, +\v 18 I declare to you today that you will surely perish. You will not prolong your days in the land where you pass over the Jordan to go in to possess it. +\v 19 I call heaven and earth to witness against you today that I have set before you life and death, the blessing and the curse. Therefore choose life, that you may live, you and your descendants, +\v 20 to love Yahweh your God, to obey his voice, and to cling to him; for he is your life, and the length of your days, that you may dwell in the land which Yahweh swore to your fathers, to Abraham, to Isaac, and to Jacob, to give them. +\c 31 +\p +\v 1 Moses went and spoke these words to all Israel. +\v 2 He said to them, “I am one hundred twenty years old today. I can no more go out and come in. Yahweh has said to me, ‘You shall not go over this Jordan.’ +\v 3 Yahweh your God himself will go over before you. He will destroy these nations from before you, and you shall dispossess them. Joshua will go over before you, as Yahweh has spoken. +\v 4 Yahweh will do to them as he did to Sihon and to Og, the kings of the Amorites, and to their land, when he destroyed them. +\v 5 Yahweh will deliver them up before you, and you shall do to them according to all the commandment which I have commanded you. +\v 6 Be strong and courageous. Don’t be afraid or scared of them, for Yahweh your God himself is who goes with you. He will not fail you nor forsake you.” +\p +\v 7 Moses called to Joshua, and said to him in the sight of all Israel, “Be strong and courageous, for you shall go with this people into the land which Yahweh has sworn to their fathers to give them; and you shall cause them to inherit it. +\v 8 Yahweh himself is who goes before you. He will be with you. He will not fail you nor forsake you. Don’t be afraid. Don’t be discouraged.” +\p +\v 9 Moses wrote this law and delivered it to the priests the sons of Levi, who bore the ark of Yahweh’s covenant, and to all the elders of Israel. +\v 10 Moses commanded them, saying, “At the end of every seven years, in the set time of the year of release, in the feast of booths, +\v 11 when all Israel has come to appear before Yahweh your God in the place which he will choose, you shall read this law before all Israel in their hearing. +\v 12 Assemble the people, the men and the women and the little ones, and the foreigners who are within your gates, that they may hear, learn, fear Yahweh your God, and observe to do all the words of this law, +\v 13 and that their children, who have not known, may hear and learn to fear Yahweh your God, as long as you live in the land where you go over the Jordan to possess it.” +\p +\v 14 Yahweh said to Moses, “Behold, your days approach that you must die. Call Joshua, and present yourselves in the Tent of Meeting, that I may commission him.” +\p Moses and Joshua went, and presented themselves in the Tent of Meeting. +\p +\v 15 Yahweh appeared in the Tent in a pillar of cloud, and the pillar of cloud stood over the Tent’s door. +\v 16 Yahweh said to Moses, “Behold, you shall sleep with your fathers. This people will rise up and play the prostitute after the strange gods of the land where they go to be among them, and will forsake me and break my covenant which I have made with them. +\v 17 Then my anger shall be kindled against them in that day, and I will forsake them, and I will hide my face from them, and they shall be devoured, and many evils and troubles shall come on them; so that they will say in that day, ‘Haven’t these evils come on us because our God is not among us?’ +\v 18 I will surely hide my face in that day for all the evil which they have done, in that they have turned to other gods. +\p +\v 19 “Now therefore write this song for yourselves, and teach it to the children of Israel. Put it in their mouths, that this song may be a witness for me against the children of Israel. +\v 20 For when I have brought them into the land which I swore to their fathers, flowing with milk and honey, and they have eaten and filled themselves, and grown fat, then they will turn to other gods, and serve them, and despise me, and break my covenant. +\v 21 It will happen, when many evils and troubles have come on them, that this song will testify before them as a witness; for it will not be forgotten out of the mouths of their descendants; for I know their ways and what they are doing today, before I have brought them into the land which I promised them.” +\p +\v 22 So Moses wrote this song the same day, and taught it to the children of Israel. +\p +\v 23 He commissioned Joshua the son of Nun, and said, “Be strong and courageous; for you shall bring the children of Israel into the land which I swore to them. I will be with you.” +\p +\v 24 When Moses had finished writing the words of this law in a book, until they were finished, +\v 25 Moses commanded the Levites, who bore the ark of Yahweh’s covenant, saying, +\v 26 “Take this book of the law, and put it by the side of the ark of Yahweh your God’s covenant, that it may be there for a witness against you. +\v 27 For I know your rebellion and your stiff neck. Behold, while I am yet alive with you today, you have been rebellious against Yahweh. How much more after my death? +\v 28 Assemble to me all the elders of your tribes and your officers, that I may speak these words in their ears, and call heaven and earth to witness against them. +\v 29 For I know that after my death you will utterly corrupt yourselves, and turn away from the way which I have commanded you; and evil will happen to you in the latter days, because you will do that which is evil in Yahweh’s sight, to provoke him to anger through the work of your hands.” +\p +\v 30 Moses spoke in the ears of all the assembly of Israel the words of this song, until they were finished. +\c 32 +\q1 +\v 1 Give ear, you heavens, and I will speak. +\q2 Let the earth hear the words of my mouth. +\q1 +\v 2 My doctrine will drop as the rain. +\q2 My speech will condense as the dew, +\q2 as the misty rain on the tender grass, +\q2 as the showers on the herb. +\q1 +\v 3 For I will proclaim Yahweh’s name. +\q2 Ascribe greatness to our God! +\q1 +\v 4 The Rock: his work is perfect, +\q2 for all his ways are just. +\q2 A God of faithfulness who does no wrong, +\q2 just and right is he. +\q1 +\v 5 They have dealt corruptly with him. +\q2 They are not his children, because of their defect. +\q2 They are a perverse and crooked generation. +\q1 +\v 6 Is this the way you repay Yahweh, +\q2 foolish and unwise people? +\q1 Isn’t he your father who has bought you? +\q2 He has made you and established you. +\q1 +\v 7 Remember the days of old. +\q2 Consider the years of many generations. +\q1 Ask your father, and he will show you; +\q2 your elders, and they will tell you. +\q1 +\v 8 When the Most High gave to the nations their inheritance, +\q2 when he separated the children of men, +\q1 he set the bounds of the peoples +\q2 according to the number of the children of Israel. +\q1 +\v 9 For Yahweh’s portion is his people. +\q2 Jacob is the lot of his inheritance. +\q1 +\v 10 He found him in a desert land, +\q2 in the waste howling wilderness. +\q1 He surrounded him. +\q2 He cared for him. +\q2 He kept him as the apple of his eye. +\q1 +\v 11 As an eagle that stirs up her nest, +\q2 that flutters over her young, +\q1 he spread abroad his wings, +\q2 he took them, +\q2 he bore them on his feathers. +\q1 +\v 12 Yahweh alone led him. +\q2 There was no foreign god with him. +\q1 +\v 13 He made him ride on the high places of the earth. +\q2 He ate the increase of the field. +\q1 He caused him to suck honey out of the rock, +\q2 oil out of the flinty rock; +\q1 +\v 14 butter from the herd, and milk from the flock, +\q2 with fat of lambs, +\q2 rams of the breed of Bashan, and goats, +\q2 with the finest of the wheat. +\q2 From the blood of the grape, you drank wine. +\q1 +\v 15 But Jeshurun grew fat, and kicked. +\q2 You have grown fat. +\q2 You have grown thick. +\q2 You have become sleek. +\q1 Then he abandoned God who made him, +\q2 and rejected the Rock of his salvation. +\q1 +\v 16 They moved him to jealousy with strange gods. +\q2 They provoked him to anger with abominations. +\q1 +\v 17 They sacrificed to demons, not God, +\q2 to gods that they didn’t know, +\q2 to new gods that came up recently, +\q2 which your fathers didn’t dread. +\q1 +\v 18 Of the Rock who became your father, you are unmindful, +\q2 and have forgotten God who gave you birth. +\q1 +\v 19 Yahweh saw and abhorred, +\q2 because of the provocation of his sons and his daughters. +\q1 +\v 20 He said, “I will hide my face from them. +\q2 I will see what their end will be; +\q1 for they are a very perverse generation, +\q2 children in whom is no faithfulness. +\q1 +\v 21 They have moved me to jealousy with that which is not God. +\q2 They have provoked me to anger with their vanities. +\q1 I will move them to jealousy with those who are not a people. +\q2 I will provoke them to anger with a foolish nation. +\q1 +\v 22 For a fire is kindled in my anger, +\q2 that burns to the lowest Sheol,\f + \fr 32:22 \ft Sheol is the place of the dead.\f* +\q2 devours the earth with its increase, +\q2 and sets the foundations of the mountains on fire. +\b +\q1 +\v 23 “I will heap evils on them. +\q2 I will spend my arrows on them. +\q1 +\v 24 They shall be wasted with hunger, +\q2 and devoured with burning heat +\q2 and bitter destruction. +\q1 I will send the teeth of animals on them, +\q2 with the venom of vipers that glide in the dust. +\q1 +\v 25 Outside the sword will bereave, +\q2 and in the rooms, +\q2 terror on both young man and virgin, +\q2 the nursing infant with the gray-haired man. +\q1 +\v 26 I said that I would scatter them afar. +\q2 I would make their memory to cease from among men; +\q1 +\v 27 were it not that I feared the provocation of the enemy, +\q2 lest their adversaries should judge wrongly, +\q2 lest they should say, ‘Our hand is exalted; +\q2 Yahweh has not done all this.’” +\b +\q1 +\v 28 For they are a nation void of counsel. +\q2 There is no understanding in them. +\q1 +\v 29 Oh that they were wise, that they understood this, +\q2 that they would consider their latter end! +\q1 +\v 30 How could one chase a thousand, +\q2 and two put ten thousand to flight, +\q1 unless their Rock had sold them, +\q2 and Yahweh had delivered them up? +\q1 +\v 31 For their rock is not as our Rock, +\q2 even our enemies themselves concede. +\q1 +\v 32 For their vine is of the vine of Sodom, +\q2 of the fields of Gomorrah. +\q1 Their grapes are poison grapes. +\q2 Their clusters are bitter. +\q1 +\v 33 Their wine is the poison of serpents, +\q2 the cruel venom of asps. +\b +\q1 +\v 34 “Isn’t this laid up in store with me, +\q2 sealed up among my treasures? +\q1 +\v 35 Vengeance is mine, and recompense, +\q2 at the time when their foot slides, +\q1 for the day of their calamity is at hand. +\q2 Their doom rushes at them.” +\b +\q1 +\v 36 For Yahweh will judge his people, +\q2 and have compassion on his servants, +\q1 when he sees that their power is gone, +\q2 that there is no one remaining, shut up or left at large. +\q1 +\v 37 He will say, “Where are their gods, +\q2 the rock in which they took refuge, +\q1 +\v 38 which ate the fat of their sacrifices, +\q2 and drank the wine of their drink offering? +\q1 Let them rise up and help you! +\q2 Let them be your protection. +\b +\q1 +\v 39 “See now that I myself am he. +\q2 There is no god with me. +\q1 I kill and I make alive. +\q2 I wound and I heal. +\q2 There is no one who can deliver out of my hand. +\q1 +\v 40 For I lift up my hand to heaven and declare, +\q2 as I live forever, +\q1 +\v 41 if I sharpen my glittering sword, +\q2 my hand grasps it in judgment; +\q1 I will take vengeance on my adversaries, +\q2 and will repay those who hate me. +\q1 +\v 42 I will make my arrows drunk with blood. +\q2 My sword shall devour flesh with the blood of the slain and the captives, +\q2 from the head of the leaders of the enemy.” +\b +\q1 +\v 43 Rejoice, you nations, with his people, +\q2 for he will avenge the blood of his servants. +\q2 He will take vengeance on his adversaries, +\q2 and will make atonement for his land and for his people.\f + \fr 32:43 \ft For this verse, LXX reads: Rejoice, you heavens, with him, and let all the angels of God worship him; rejoice you Gentiles, with his people, and let all the sons of God strengthen themselves in him; for he will avenge the blood of his sons, and he will render vengeance, and recompense justice to his enemies, and will reward them that hate him; and the Lord shall purge the land of his people.\f* +\p +\v 44 Moses came and spoke all the words of this song in the ears of the people, he and Joshua the son of Nun. +\v 45 Moses finished reciting all these words to all Israel. +\v 46 He said to them, “Set your heart to all the words which I testify to you today, which you shall command your children to observe to do, all the words of this law. +\v 47 For it is no vain thing for you, because it is your life, and through this thing you shall prolong your days in the land, where you go over the Jordan to possess it.” +\p +\v 48 Yahweh spoke to Moses that same day, saying, +\v 49 “Go up into this mountain of Abarim, to Mount Nebo, which is in the land of Moab, that is across from Jericho; and see the land of Canaan, which I give to the children of Israel for a possession. +\v 50 Die on the mountain where you go up, and be gathered to your people, as Aaron your brother died on Mount Hor, and was gathered to his people; +\v 51 because you trespassed against me among the children of Israel at the waters of Meribah of Kadesh, in the wilderness of Zin; because you didn’t uphold my holiness among the children of Israel. +\v 52 For you shall see the land from a distance; but you shall not go there into the land which I give the children of Israel.” +\c 33 +\p +\v 1 This is the blessing with which Moses the man of God blessed the children of Israel before his death. +\v 2 He said, +\q1 “Yahweh came from Sinai, +\q2 and rose from Seir to them. +\q1 He shone from Mount Paran. +\q2 He came from the ten thousands of holy ones. +\q2 At his right hand was a fiery law for them.\f + \fr 33:2 \ft another manuscript reads “He came with myriads of holy ones from the south, from his mountain slopes.”\f* +\q1 +\v 3 Yes, he loves the people. +\q2 All his saints are in your hand. +\q2 They sat down at your feet. +\q2 Each receives your words. +\q1 +\v 4 Moses commanded us a law, +\q2 an inheritance for the assembly of Jacob. +\q1 +\v 5 He was king in Jeshurun, +\q2 when the heads of the people were gathered, +\q2 all the tribes of Israel together. +\b +\q1 +\v 6 “Let Reuben live, and not die; +\q2 Nor let his men be few.” +\p +\v 7 This is for Judah. He said, +\q1 “Hear, Yahweh, the voice of Judah. +\q2 Bring him in to his people. +\q1 With his hands he contended for himself. +\q2 You shall be a help against his adversaries.” +\p +\v 8 About Levi he said, +\q1 “Your Thummim and your Urim are with your godly one, +\q2 whom you proved at Massah, +\q2 with whom you contended at the waters of Meribah. +\q1 +\v 9 He said of his father, and of his mother, ‘I have not seen him.’ +\q2 He didn’t acknowledge his brothers, +\q2 nor did he know his own children; +\q1 for they have observed your word, +\q2 and keep your covenant. +\q1 +\v 10 They shall teach Jacob your ordinances, +\q2 and Israel your law. +\q1 They shall put incense before you, +\q2 and whole burnt offering on your altar. +\q1 +\v 11 Yahweh, bless his skills. +\q2 Accept the work of his hands. +\q1 Strike through the hips of those who rise up against him, +\q2 of those who hate him, that they not rise again.” +\p +\v 12 About Benjamin he said, +\q1 “The beloved of Yahweh will dwell in safety by him. +\q2 He covers him all day long. +\q2 He dwells between his shoulders.” +\p +\v 13 About Joseph he said, +\q1 “His land is blessed by Yahweh, +\q2 for the precious things of the heavens, for the dew, +\q2 for the deep that couches beneath, +\q1 +\v 14 for the precious things of the fruits of the sun, +\q2 for the precious things that the moon can yield, +\q1 +\v 15 for the best things of the ancient mountains, +\q2 for the precious things of the everlasting hills, +\q1 +\v 16 for the precious things of the earth and its fullness, +\q2 the good will of him who lived in the bush.\f + \fr 33:16 \ft i.e., the burning bush of Exodus 3:3-4.\f* +\q1 Let this come on the head of Joseph, +\q2 on the crown of the head of him who was separated from his brothers. +\q1 +\v 17 Majesty belongs to the firstborn of his herd. +\q2 His horns are the horns of the wild ox. +\q2 With them he will push all the peoples to the ends of the earth. +\q1 They are the ten thousands of Ephraim. +\q2 They are the thousands of Manasseh.” +\p +\v 18 About Zebulun he said, +\q1 “Rejoice, Zebulun, in your going out; +\q2 and Issachar, in your tents. +\q1 +\v 19 They will call the peoples to the mountain. +\q2 There they will offer sacrifices of righteousness, +\q1 for they will draw out the abundance of the seas, +\q2 the hidden treasures of the sand.” +\p +\v 20 About Gad he said, +\q1 “He who enlarges Gad is blessed. +\q2 He dwells as a lioness, +\q2 and tears the arm and the crown of the head. +\q1 +\v 21 He provided the first part for himself, +\q2 for the lawgiver’s portion was reserved for him. +\q1 He came with the heads of the people. +\q2 He executed the righteousness of Yahweh, +\q2 His ordinances with Israel.” +\p +\v 22 About Dan he said, +\q1 “Dan is a lion’s cub +\q2 that leaps out of Bashan.” +\p +\v 23 About Naphtali he said, +\q1 “Naphtali, satisfied with favor, +\q2 full of Yahweh’s blessing, +\q2 Possess the west and the south.” +\p +\v 24 About Asher he said, +\q1 “Asher is blessed with children. +\q2 Let him be acceptable to his brothers. +\q2 Let him dip his foot in oil. +\q1 +\v 25 Your bars will be iron and bronze. +\q2 As your days, so your strength will be. +\b +\q1 +\v 26 “There is no one like God, Jeshurun, +\q2 who rides on the heavens for your help, +\q2 in his excellency on the skies. +\q1 +\v 27 The eternal God is your dwelling place. +\q2 Underneath are the everlasting arms. +\q1 He thrust out the enemy from before you, +\q2 and said, ‘Destroy!’ +\q1 +\v 28 Israel dwells in safety, +\q2 the fountain of Jacob alone, +\q1 In a land of grain and new wine. +\q2 Yes, his heavens drop down dew. +\q1 +\v 29 You are happy, Israel! +\q2 Who is like you, a people saved by Yahweh, +\q2 the shield of your help, +\q2 the sword of your excellency? +\q1 Your enemies will submit themselves to you. +\q2 You will tread on their high places.” +\c 34 +\p +\v 1 Moses went up from the plains of Moab to Mount Nebo, to the top of Pisgah, that is opposite Jericho. Yahweh showed him all the land of Gilead to Dan, +\v 2 and all Naphtali, and the land of Ephraim and Manasseh, and all the land of Judah, to the Western Sea, +\v 3 and the south,\f + \fr 34:3 \ft or, Negev\f* and the Plain of the valley of Jericho the city of palm trees, to Zoar. +\v 4 Yahweh said to him, “This is the land which I swore to Abraham, to Isaac, and to Jacob, saying, ‘I will give it to your offspring.’ I have caused you to see it with your eyes, but you shall not go over there.” +\p +\v 5 So Moses the servant of Yahweh died there in the land of Moab, according to Yahweh’s word. +\v 6 He buried him in the valley in the land of Moab opposite Beth Peor, but no man knows where his tomb is to this day. +\v 7 Moses was one hundred twenty years old when he died. His eye was not dim, nor his strength gone. +\v 8 The children of Israel wept for Moses in the plains of Moab thirty days, until the days of weeping in the mourning for Moses were ended. +\v 9 Joshua the son of Nun was full of the spirit of wisdom, for Moses had laid his hands on him. The children of Israel listened to him, and did as Yahweh commanded Moses. +\v 10 Since then, there has not arisen a prophet in Israel like Moses, whom Yahweh knew face to face, +\v 11 in all the signs and the wonders which Yahweh sent him to do in the land of Egypt, to Pharaoh, and to all his servants, and to all his land, +\v 12 and in all the mighty hand, and in all the awesome deeds, which Moses did in the sight of all Israel. diff --git a/c-sharp/assets/WEB/06JOSengWEBUS.SFM b/c-sharp/assets/WEB/06JOSengWEBUS.SFM new file mode 100644 index 0000000000..db41320af9 --- /dev/null +++ b/c-sharp/assets/WEB/06JOSengWEBUS.SFM @@ -0,0 +1,888 @@ +\id JOS World English Bible (WEB) +\ide UTF-8 +\h Joshua +\toc1 The Book of Joshua +\toc2 Joshua +\toc3 Joshua +\mt2 The Book of +\mt1 Joshua +\c 1 +\p +\v 1 Now after the death of Moses the servant of Yahweh,\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* Yahweh spoke to Joshua the son of Nun, Moses’ servant, saying, +\v 2 “Moses my servant is dead. Now therefore arise, go across this Jordan, you and all these people, to the land which I am giving to them, even to the children of Israel. +\v 3 I have given you every place that the sole of your foot will tread on, as I told Moses. +\v 4 From the wilderness and this Lebanon even to the great river, the river Euphrates, all the land of the Hittites, and to the great sea toward the going down of the sun, shall be your border. +\v 5 No man will be able to stand before you all the days of your life. As I was with Moses, so I will be with you. I will not fail you nor forsake you. +\p +\v 6 “Be strong and courageous; for you shall cause this people to inherit the land which I swore to their fathers to give them. +\v 7 Only be strong and very courageous. Be careful to observe to do according to all the law which Moses my servant commanded you. Don’t turn from it to the right hand or to the left, that you may have good success wherever you go. +\v 8 This book of the law shall not depart from your mouth, but you shall meditate on it day and night, that you may observe to do according to all that is written in it; for then you shall make your way prosperous, and then you shall have good success. +\v 9 Haven’t I commanded you? Be strong and courageous. Don’t be afraid. Don’t be dismayed, for Yahweh your God\f + \fr 1:9 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* is with you wherever you go.” +\p +\v 10 Then Joshua commanded the officers of the people, saying, +\v 11 “Pass through the middle of the camp, and command the people, saying, ‘Prepare food; for within three days you are to pass over this Jordan, to go in to possess the land which Yahweh your God gives you to possess.’” +\p +\v 12 Joshua spoke to the Reubenites, and to the Gadites, and to the half-tribe of Manasseh, saying, +\v 13 “Remember the word which Moses the servant of Yahweh commanded you, saying, ‘Yahweh your God gives you rest, and will give you this land. +\v 14 Your wives, your little ones, and your livestock shall live in the land which Moses gave you beyond the Jordan; but you shall pass over before your brothers armed, all the mighty men of valor, and shall help them +\v 15 until Yahweh has given your brothers rest, as he has given you, and they have also possessed the land which Yahweh your God gives them. Then you shall return to the land of your possession and possess it, which Moses the servant of Yahweh gave you beyond the Jordan toward the sunrise.’” +\p +\v 16 They answered Joshua, saying, “All that you have commanded us we will do, and wherever you send us we will go. +\v 17 Just as we listened to Moses in all things, so will we listen to you. Only may Yahweh your God be with you, as he was with Moses. +\v 18 Whoever rebels against your commandment, and doesn’t listen to your words in all that you command him shall himself be put to death. Only be strong and courageous.” +\c 2 +\p +\v 1 Joshua the son of Nun secretly sent two men out of Shittim as spies, saying, “Go, view the land, including Jericho.” They went and came into the house of a prostitute whose name was Rahab, and slept there. +\p +\v 2 The king of Jericho was told, “Behold,\f + \fr 2:2 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* men of the children of Israel came in here tonight to spy out the land.” +\p +\v 3 Jericho’s king sent to Rahab, saying, “Bring out the men who have come to you, who have entered into your house; for they have come to spy out all the land.” +\p +\v 4 The woman took the two men and hid them. Then she said, “Yes, the men came to me, but I didn’t know where they came from. +\v 5 About the time of the shutting of the gate, when it was dark, the men went out. Where the men went, I don’t know. Pursue them quickly. You may catch up with them.” +\v 6 But she had brought them up to the roof, and hidden them under the stalks of flax which she had laid in order on the roof. +\v 7 The men pursued them along the way to the fords of the Jordan River. As soon as those who pursued them had gone out, they shut the gate. +\v 8 Before they had lain down, she came up to them on the roof. +\v 9 She said to the men, “I know that Yahweh has given you the land, and that the fear of you has fallen upon us, and that all the inhabitants of the land melt away before you. +\v 10 For we have heard how Yahweh dried up the water of the Red Sea before you, when you came out of Egypt; and what you did to the two kings of the Amorites, who were beyond the Jordan, to Sihon and to Og, whom you utterly destroyed. +\v 11 As soon as we had heard it, our hearts melted, and there wasn’t any more spirit in any man, because of you: for Yahweh your God, he is God in heaven above, and on earth beneath. +\v 12 Now therefore, please swear to me by Yahweh, since I have dealt kindly with you, that you also will deal kindly with my father’s house, and give me a true sign; +\v 13 and that you will save alive my father, my mother, my brothers, and my sisters, and all that they have, and will deliver our lives from death.” +\p +\v 14 The men said to her, “Our life for yours, if you don’t talk about this business of ours; and it shall be, when Yahweh gives us the land, that we will deal kindly and truly with you.” +\p +\v 15 Then she let them down by a cord through the window; for her house was on the side of the wall, and she lived on the wall. +\v 16 She said to them, “Go to the mountain, lest the pursuers find you. Hide yourselves there three days, until the pursuers have returned. Afterward, you may go your way.” +\p +\v 17 The men said to her, “We will be guiltless of this your oath which you’ve made us to swear. +\v 18 Behold, when we come into the land, tie this line of scarlet thread in the window which you used to let us down. Gather to yourself into the house your father, your mother, your brothers, and all your father’s household. +\v 19 It shall be that whoever goes out of the doors of your house into the street, his blood will be on his head, and we will be guiltless. Whoever is with you in the house, his blood shall be on our head, if any hand is on him. +\v 20 But if you talk about this business of ours, then we shall be guiltless of your oath which you’ve made us to swear.” +\p +\v 21 She said, “Let it be as you have said.” She sent them away, and they departed. Then she tied the scarlet line in the window. +\p +\v 22 They went and came to the mountain, and stayed there three days, until the pursuers had returned. The pursuers sought them all along the way, but didn’t find them. +\v 23 Then the two men returned, descended from the mountain, crossed the river, and came to Joshua the son of Nun. They told him all that had happened to them. +\v 24 They said to Joshua, “Truly Yahweh has delivered all the land into our hands. Moreover, all the inhabitants of the land melt away before us.” +\c 3 +\p +\v 1 Joshua got up early in the morning; and they moved from Shittim and came to the Jordan, he and all the children of Israel. They camped there before they crossed over. +\v 2 After three days, the officers went through the middle of the camp; +\v 3 and they commanded the people, saying, “When you see the ark of Yahweh your God’s covenant, and the Levitical priests bearing it, then leave your place and follow it. +\v 4 Yet there shall be a space between you and it of about two thousand cubits\f + \fr 3:4 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters, so 2,000 cubits is about 920 meters.\f* by measure—don’t come closer to it—that you may know the way by which you must go; for you have not passed this way before.” +\p +\v 5 Joshua said to the people, “Sanctify yourselves; for tomorrow Yahweh will do wonders among you.” +\p +\v 6 Joshua spoke to the priests, saying, “Take up the ark of the covenant, and cross over before the people.” They took up the ark of the covenant, and went before the people. +\p +\v 7 Yahweh said to Joshua, “Today I will begin to magnify you in the sight of all Israel, that they may know that as I was with Moses, so I will be with you. +\v 8 You shall command the priests who bear the ark of the covenant, saying, ‘When you come to the brink of the waters of the Jordan, you shall stand still in the Jordan.’” +\p +\v 9 Joshua said to the children of Israel, “Come here, and hear the words of Yahweh your God.” +\v 10 Joshua said, “By this you shall know that the living God is among you, and that he will without fail drive the Canaanite, the Hittite, the Hivite, the Perizzite, the Girgashite, the Amorite, and the Jebusite out from before you. +\v 11 Behold, the ark of the covenant of the Lord\f + \fr 3:11 \ft The word translated “Lord” is “Adonai.”\f* of all the earth passes over before you into the Jordan. +\v 12 Now therefore take twelve men out of the tribes of Israel, for every tribe a man. +\v 13 It shall be that when the soles of the feet of the priests who bear the ark of Yahweh, the Lord of all the earth, rest in the waters of the Jordan, that the waters of the Jordan will be cut off. The waters that come down from above shall stand in one heap.” +\p +\v 14 When the people moved from their tents to pass over the Jordan, the priests who bore the ark of the covenant being before the people, +\v 15 and when those who bore the ark had come to the Jordan, and the feet of the priests who bore the ark had dipped in the edge of the water (for the Jordan overflows all its banks all the time of harvest), +\v 16 the waters which came down from above stood, and rose up in one heap a great way off, at Adam, the city that is beside Zarethan; and those that went down toward the sea of the Arabah, even the Salt Sea, were wholly cut off. Then the people passed over near Jericho. +\v 17 The priests who bore the ark of Yahweh’s covenant stood firm on dry ground in the middle of the Jordan; and all Israel crossed over on dry ground, until all the nation had passed completely over the Jordan. +\c 4 +\p +\v 1 When all the nation had completely crossed over the Jordan, Yahweh spoke to Joshua, saying, +\v 2 “Take twelve men out of the people, a man out of every tribe, +\v 3 and command them, saying, ‘Take from out of the middle of the Jordan, out of the place where the priests’ feet stood firm, twelve stones, carry them over with you, and lay them down in the place where you’ll camp tonight.’” +\p +\v 4 Then Joshua called the twelve men whom he had prepared of the children of Israel, a man out of every tribe. +\v 5 Joshua said to them, “Cross before the ark of Yahweh your God into the middle of the Jordan, and each of you pick up a stone and put it on your shoulder, according to the number of the tribes of the children of Israel; +\v 6 that this may be a sign among you, that when your children ask in the future, saying, ‘What do you mean by these stones?’ +\v 7 then you shall tell them, ‘Because the waters of the Jordan were cut off before the ark of Yahweh’s covenant. When it crossed over the Jordan, the waters of the Jordan were cut off. These stones shall be for a memorial to the children of Israel forever.’” +\p +\v 8 The children of Israel did as Joshua commanded, and took up twelve stones out of the middle of the Jordan, as Yahweh spoke to Joshua, according to the number of the tribes of the children of Israel. They carried them over with them to the place where they camped, and laid them down there. +\v 9 Joshua set up twelve stones in the middle of the Jordan, in the place where the feet of the priests who bore the ark of the covenant stood; and they are there to this day. +\v 10 For the priests who bore the ark stood in the middle of the Jordan until everything was finished that Yahweh commanded Joshua to speak to the people, according to all that Moses commanded Joshua; and the people hurried and passed over. +\v 11 When all the people had completely crossed over, Yahweh’s ark crossed over with the priests in the presence of the people. +\p +\v 12 The children of Reuben, and the children of Gad, and the half-tribe of Manasseh crossed over armed before the children of Israel, as Moses spoke to them. +\v 13 About forty thousand men, ready and armed for war, passed over before Yahweh to battle, to the plains of Jericho. +\v 14 On that day, Yahweh magnified Joshua in the sight of all Israel; and they feared him, as they feared Moses, all the days of his life. +\p +\v 15 Yahweh spoke to Joshua, saying, +\v 16 “Command the priests who bear the ark of the covenant, that they come up out of the Jordan.” +\p +\v 17 Joshua therefore commanded the priests, saying, “Come up out of the Jordan!” +\v 18 When the priests who bore the ark of Yahweh’s covenant had come up out of the middle of the Jordan, and the soles of the priests’ feet had been lifted up to the dry ground, the waters of the Jordan returned to their place, and went over all its banks, as before. +\v 19 The people came up out of the Jordan on the tenth day of the first month, and encamped in Gilgal, on the east border of Jericho. +\p +\v 20 Joshua set up those twelve stones, which they took out of the Jordan, in Gilgal. +\v 21 He spoke to the children of Israel, saying, “When your children ask their fathers in time to come, saying, ‘What do these stones mean?’ +\v 22 Then you shall let your children know, saying, ‘Israel came over this Jordan on dry land. +\v 23 For Yahweh your God dried up the waters of the Jordan from before you until you had crossed over, as Yahweh your God did to the Red Sea, which he dried up from before us, until we had crossed over, +\v 24 that all the peoples of the earth may know that Yahweh’s hand is mighty, and that you may fear Yahweh your God forever.’” +\c 5 +\p +\v 1 When all the kings of the Amorites, who were beyond the Jordan westward, and all the kings of the Canaanites, who were by the sea, heard how Yahweh had dried up the waters of the Jordan from before the children of Israel until we had crossed over, their heart melted, and there was no more spirit in them, because of the children of Israel. +\v 2 At that time, Yahweh said to Joshua, “Make flint knives, and circumcise again the sons of Israel the second time.” +\v 3 Joshua made himself flint knives, and circumcised the sons of Israel at the hill of the foreskins. +\v 4 This is the reason Joshua circumcised them: all the people who came out of Egypt, who were males, even all the men of war, died in the wilderness along the way, after they came out of Egypt. +\v 5 For all the people who came out were circumcised; but all the people who were born in the wilderness along the way as they came out of Egypt had not been circumcised. +\v 6 For the children of Israel walked forty years in the wilderness until all the nation, even the men of war who came out of Egypt, were consumed, because they didn’t listen to Yahweh’s voice. Yahweh swore to them that he wouldn’t let them see the land which Yahweh swore to their fathers that he would give us, a land flowing with milk and honey. +\v 7 Their children, whom he raised up in their place, were circumcised by Joshua, for they were uncircumcised, because they had not circumcised them on the way. +\v 8 When they were done circumcising the whole nation, they stayed in their places in the camp until they were healed. +\p +\v 9 Yahweh said to Joshua, “Today I have rolled away the reproach of Egypt from you.” Therefore the name of that place was called Gilgal\f + \fr 5:9 \ft “Gilgal” sounds like the Hebrew for “roll.”\f* to this day. +\v 10 The children of Israel encamped in Gilgal. They kept the Passover on the fourteenth day of the month at evening in the plains of Jericho. +\v 11 They ate unleavened cakes and parched grain of the produce of the land on the next day after the Passover, in the same day. +\v 12 The manna ceased on the next day, after they had eaten of the produce of the land. The children of Israel didn’t have manna any more, but they ate of the fruit of the land of Canaan that year. +\p +\v 13 When Joshua was by Jericho, he lifted up his eyes and looked, and behold, a man stood in front of him with his sword drawn in his hand. Joshua went to him and said to him, “Are you for us, or for our enemies?” +\p +\v 14 He said, “No; but I have come now as commander of Yahweh’s army.” +\p Joshua fell on his face to the earth, and worshiped, and asked him, “What does my lord say to his servant?” +\p +\v 15 The prince of Yahweh’s army said to Joshua, “Take off your sandals, for the place on which you stand is holy.” Joshua did so. +\c 6 +\p +\v 1 Now Jericho was tightly shut up because of the children of Israel. No one went out, and no one came in. +\v 2 Yahweh said to Joshua, “Behold, I have given Jericho into your hand, with its king and the mighty men of valor. +\v 3 All of your men of war shall march around the city, going around the city once. You shall do this six days. +\v 4 Seven priests shall bear seven trumpets of rams’ horns before the ark. On the seventh day, you shall march around the city seven times, and the priests shall blow the trumpets. +\v 5 It shall be that when they make a long blast with the ram’s horn, and when you hear the sound of the trumpet, all the people shall shout with a great shout; then the city wall will fall down flat, and the people shall go up, every man straight in front of him.” +\p +\v 6 Joshua the son of Nun called the priests, and said to them, “Take up the ark of the covenant, and let seven priests bear seven trumpets of rams’ horns before Yahweh’s ark.” +\p +\v 7 They said to the people, “Advance! March around the city, and let the armed men pass on before Yahweh’s ark.” +\p +\v 8 It was so, that when Joshua had spoken to the people, the seven priests bearing the seven trumpets of rams’ horns before Yahweh advanced and blew the trumpets, and the ark of Yahweh’s covenant followed them. +\v 9 The armed men went before the priests who blew the trumpets, and the ark went after them. The trumpets sounded as they went. +\p +\v 10 Joshua commanded the people, saying, “You shall not shout nor let your voice be heard, neither shall any word proceed out of your mouth until the day I tell you to shout. Then you shall shout.” +\v 11 So he caused Yahweh’s ark to go around the city, circling it once. Then they came into the camp, and stayed in the camp. +\v 12 Joshua rose early in the morning, and the priests took up Yahweh’s ark. +\v 13 The seven priests bearing the seven trumpets of rams’ horns in front of Yahweh’s ark went on continually, and blew the trumpets. The armed men went in front of them. The rear guard came after Yahweh’s ark. The trumpets sounded as they went. +\v 14 The second day they marched around the city once, and returned into the camp. They did this six days. +\p +\v 15 On the seventh day, they rose early at the dawning of the day, and marched around the city in the same way seven times. On this day only they marched around the city seven times. +\v 16 At the seventh time, when the priests blew the trumpets, Joshua said to the people, “Shout, for Yahweh has given you the city! +\v 17 The city shall be devoted, even it and all that is in it, to Yahweh. Only Rahab the prostitute shall live, she and all who are with her in the house, because she hid the messengers that we sent. +\v 18 But as for you, only keep yourselves from what is devoted to destruction, lest when you have devoted it, you take of the devoted thing; so you would make the camp of Israel accursed and trouble it. +\v 19 But all the silver, gold, and vessels of bronze and iron are holy to Yahweh. They shall come into Yahweh’s treasury.” +\p +\v 20 So the people shouted and the priests blew the trumpets. When the people heard the sound of the trumpet, the people shouted with a great shout, and the wall fell down flat, so that the people went up into the city, every man straight in front of him, and they took the city. +\v 21 They utterly destroyed all that was in the city, both man and woman, both young and old, and ox, sheep, and donkey, with the edge of the sword. +\v 22 Joshua said to the two men who had spied out the land, “Go into the prostitute’s house, and bring the woman and all that she has out from there, as you swore to her.” +\v 23 The young men who were spies went in, and brought out Rahab with her father, her mother, her brothers, and all that she had. They also brought out all of her relatives, and they set them outside of the camp of Israel. +\v 24 They burned the city with fire, and all that was in it. Only they put the silver, the gold, and the vessels of bronze and of iron into the treasury of Yahweh’s house. +\v 25 But Rahab the prostitute, her father’s household, and all that she had, Joshua saved alive. She lives in the middle of Israel to this day, because she hid the messengers whom Joshua sent to spy out Jericho. +\p +\v 26 Joshua commanded them with an oath at that time, saying, “Cursed is the man before Yahweh who rises up and builds this city Jericho. With the loss of his firstborn he will lay its foundation, and with the loss of his youngest son he will set up its gates.” +\v 27 So Yahweh was with Joshua; and his fame was in all the land. +\c 7 +\p +\v 1 But the children of Israel committed a trespass in the devoted things; for Achan, the son of Carmi, the son of Zabdi, the son of Zerah, of the tribe of Judah, took some of the devoted things. Therefore Yahweh’s anger burned against the children of Israel. +\v 2 Joshua sent men from Jericho to Ai, which is beside Beth Aven, on the east side of Bethel, and spoke to them, saying, “Go up and spy out the land.” +\p The men went up and spied out Ai. +\v 3 They returned to Joshua, and said to him, “Don’t let all the people go up, but let about two or three thousand men go up and strike Ai. Don’t make all the people to toil there, for there are only a few of them.” +\v 4 So about three thousand men of the people went up there, and they fled before the men of Ai. +\v 5 The men of Ai struck about thirty-six men of them. They chased them from before the gate even to Shebarim, and struck them at the descent. The hearts of the people melted, and became like water. +\v 6 Joshua tore his clothes, and fell to the earth on his face before Yahweh’s ark until the evening, he and the elders of Israel; and they put dust on their heads. +\v 7 Joshua said, “Alas, Lord Yahweh, why have you brought this people over the Jordan at all, to deliver us into the hand of the Amorites, to cause us to perish? I wish that we had been content and lived beyond the Jordan! +\v 8 Oh, Lord, what shall I say, after Israel has turned their backs before their enemies? +\v 9 For the Canaanites and all the inhabitants of the land will hear of it, and will surround us, and cut off our name from the earth. What will you do for your great name?” +\p +\v 10 Yahweh said to Joshua, “Get up! Why have you fallen on your face like that? +\v 11 Israel has sinned. Yes, they have even transgressed my covenant which I commanded them. Yes, they have even taken some of the devoted things, and have also stolen, and also deceived. They have even put it among their own stuff. +\v 12 Therefore the children of Israel can’t stand before their enemies. They turn their backs before their enemies, because they have become devoted for destruction. I will not be with you any more, unless you destroy the devoted things from among you. +\v 13 Get up! Sanctify the people, and say, ‘Sanctify yourselves for tomorrow, for Yahweh, the God of Israel, says, “There is a devoted thing among you, Israel. You cannot stand before your enemies until you take away the devoted thing from among you.” +\v 14 In the morning therefore you shall be brought near by your tribes. It shall be that the tribe which Yahweh selects shall come near by families. The family which Yahweh selects shall come near by households. The household which Yahweh selects shall come near man by man. +\v 15 It shall be, that he who is taken with the devoted thing shall be burned with fire, he and all that he has, because he has transgressed Yahweh’s covenant, and because he has done a disgraceful thing in Israel.’” +\p +\v 16 So Joshua rose up early in the morning and brought Israel near by their tribes. The tribe of Judah was selected. +\v 17 He brought near the family of Judah, and he selected the family of the Zerahites. He brought near the family of the Zerahites man by man, and Zabdi was selected. +\v 18 He brought near his household man by man, and Achan, the son of Carmi, the son of Zabdi, the son of Zerah, of the tribe of Judah, was selected. +\v 19 Joshua said to Achan, “My son, please give glory to Yahweh, the God of Israel, and make confession to him. Tell me now what you have done! Don’t hide it from me!” +\p +\v 20 Achan answered Joshua, and said, “I have truly sinned against Yahweh, the God of Israel, and this is what I have done. +\v 21 When I saw among the plunder a beautiful Babylonian robe, two hundred shekels\f + \fr 7:21 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver, and a wedge of gold weighing fifty shekels, then I coveted them and took them. Behold, they are hidden in the ground in the middle of my tent, with the silver under it.” +\p +\v 22 So Joshua sent messengers, and they ran to the tent. Behold, it was hidden in his tent, with the silver under it. +\v 23 They took them from the middle of the tent, and brought them to Joshua and to all the children of Israel. They laid them down before Yahweh. +\v 24 Joshua, and all Israel with him, took Achan the son of Zerah, the silver, the robe, the wedge of gold, his sons, his daughters, his cattle, his donkeys, his sheep, his tent, and all that he had; and they brought them up to the valley of Achor. +\v 25 Joshua said, “Why have you troubled us? Yahweh will trouble you today.” All Israel stoned him with stones, and they burned them with fire and stoned them with stones. +\v 26 They raised over him a great heap of stones that remains to this day. Yahweh turned from the fierceness of his anger. Therefore the name of that place was called “The valley of Achor” to this day. +\c 8 +\p +\v 1 Yahweh said to Joshua, “Don’t be afraid, and don’t be dismayed. Take all the warriors with you, and arise, go up to Ai. Behold, I have given into your hand the king of Ai, with his people, his city, and his land. +\v 2 You shall do to Ai and her king as you did to Jericho and her king, except you shall take its goods and its livestock for yourselves. Set an ambush for the city behind it.” +\p +\v 3 So Joshua arose, with all the warriors, to go up to Ai. Joshua chose thirty thousand men, the mighty men of valor, and sent them out by night. +\v 4 He commanded them, saying, “Behold, you shall lie in ambush against the city, behind the city. Don’t go very far from the city, but all of you be ready. +\v 5 I and all the people who are with me will approach the city. It shall happen, when they come out against us, as at the first, that we will flee before them. +\v 6 They will come out after us until we have drawn them away from the city; for they will say, ‘They flee before us, like the first time.’ So we will flee before them, +\v 7 and you shall rise up from the ambush, and take possession of the city; for Yahweh your God will deliver it into your hand. +\v 8 It shall be, when you have seized the city, that you shall set the city on fire. You shall do this according to Yahweh’s word. Behold, I have commanded you.” +\p +\v 9 Joshua sent them out; and they went to set up the ambush, and stayed between Bethel and Ai on the west side of Ai; but Joshua stayed among the people that night. +\v 10 Joshua rose up early in the morning, mustered the people, and went up, he and the elders of Israel, before the people to Ai. +\v 11 All the people, even the men of war who were with him, went up and came near, and came before the city and encamped on the north side of Ai. Now there was a valley between him and Ai. +\v 12 He took about five thousand men, and set them in ambush between Bethel and Ai, on the west side of the city. +\v 13 So they set the people, even all the army who was on the north of the city, and their ambush on the west of the city; and Joshua went that night into the middle of the valley. +\v 14 When the king of Ai saw it, they hurried and rose up early, and the men of the city went out against Israel to battle, he and all his people, at the time appointed, before the Arabah; but he didn’t know that there was an ambush against him behind the city. +\v 15 Joshua and all Israel made as if they were beaten before them, and fled by the way of the wilderness. +\v 16 All the people who were in the city were called together to pursue after them. They pursued Joshua, and were drawn away from the city. +\v 17 There was not a man left in Ai or Bethel who didn’t go out after Israel. They left the city open, and pursued Israel. +\p +\v 18 Yahweh said to Joshua, “Stretch out the javelin that is in your hand toward Ai, for I will give it into your hand.” +\p Joshua stretched out the javelin that was in his hand toward the city. +\v 19 The ambush arose quickly out of their place, and they ran as soon as he had stretched out his hand and entered into the city and took it. They hurried and set the city on fire. +\v 20 When the men of Ai looked behind them, they saw, and behold, the smoke of the city ascended up to heaven, and they had no power to flee this way or that way. The people who fled to the wilderness turned back on the pursuers. +\v 21 When Joshua and all Israel saw that the ambush had taken the city, and that the smoke of the city ascended, then they turned back and killed the men of Ai. +\v 22 The others came out of the city against them, so they were in the middle of Israel, some on this side, and some on that side. They struck them, so that they let none of them remain or escape. +\v 23 They captured the king of Ai alive, and brought him to Joshua. +\p +\v 24 When Israel had finished killing all the inhabitants of Ai in the field, in the wilderness in which they pursued them, and they had all fallen by the edge of the sword until they were consumed, all Israel returned to Ai and struck it with the edge of the sword. +\v 25 All that fell that day, both of men and women, were twelve thousand, even all the people of Ai. +\v 26 For Joshua didn’t draw back his hand, with which he stretched out the javelin, until he had utterly destroyed all the inhabitants of Ai. +\v 27 Israel took for themselves only the livestock and the goods of that city, according to Yahweh’s word which he commanded Joshua. +\v 28 So Joshua burned Ai and made it a heap forever, even a desolation, to this day. +\v 29 He hanged the king of Ai on a tree until the evening. At sundown, Joshua commanded, and they took his body down from the tree and threw it at the entrance of the gate of the city, and raised a great heap of stones on it that remains to this day. +\p +\v 30 Then Joshua built an altar to Yahweh, the God of Israel, on Mount Ebal, +\v 31 as Moses the servant of Yahweh commanded the children of Israel, as it is written in the book of the law of Moses: an altar of uncut stones, on which no one had lifted up any iron. They offered burnt offerings on it to Yahweh and sacrificed peace offerings. +\v 32 He wrote there on the stones a copy of Moses’ law, which he wrote in the presence of the children of Israel. +\v 33 All Israel, with their elders, officers, and judges, stood on both sides of the ark before the Levitical priests, who carried the ark of Yahweh’s covenant, the foreigner as well as the native; half of them in front of Mount Gerizim, and half of them in front of Mount Ebal, as Moses the servant of Yahweh had commanded at the first, that they should bless the people of Israel. +\v 34 Afterward he read all the words of the law, the blessing and the curse, according to all that is written in the book of the law. +\v 35 There was not a word of all that Moses commanded which Joshua didn’t read before all the assembly of Israel, with the women, the little ones, and the foreigners who were among them. +\c 9 +\p +\v 1 When all the kings who were beyond the Jordan, in the hill country, and in the lowland, and on all the shore of the great sea in front of Lebanon, the Hittite, the Amorite, the Canaanite, the Perizzite, the Hivite, and the Jebusite, heard of it +\v 2 they gathered themselves together to fight with Joshua and with Israel, with one accord. +\v 3 But when the inhabitants of Gibeon heard what Joshua had done to Jericho and to Ai, +\v 4 they also resorted to a ruse, and went and made as if they had been ambassadors, and took old sacks on their donkeys, and old, torn-up and bound up wine skins, +\v 5 and old and patched sandals on their feet, and wore old garments. All the bread of their food supply was dry and moldy. +\v 6 They went to Joshua at the camp at Gilgal, and said to him and to the men of Israel, “We have come from a far country. Now therefore make a covenant with us.” +\p +\v 7 The men of Israel said to the Hivites, “What if you live among us? How could we make a covenant with you?” +\p +\v 8 They said to Joshua, “We are your servants.” +\p Joshua said to them, “Who are you? Where do you come from?” +\p +\v 9 They said to him, “Your servants have come from a very far country because of the name of Yahweh your God; for we have heard of his fame, all that he did in Egypt, +\v 10 and all that he did to the two kings of the Amorites who were beyond the Jordan, to Sihon king of Heshbon and to Og king of Bashan, who was at Ashtaroth. +\v 11 Our elders and all the inhabitants of our country spoke to us, saying, ‘Take supplies in your hand for the journey, and go to meet them. Tell them, “We are your servants. Now make a covenant with us.”’ +\v 12 This our bread we took hot for our supplies out of our houses on the day we went out to go to you; but now, behold, it is dry, and has become moldy. +\v 13 These wine skins, which we filled, were new; and behold, they are torn. These our garments and our sandals have become old because of the very long journey.” +\p +\v 14 The men sampled their provisions, and didn’t ask counsel from Yahweh’s mouth. +\v 15 Joshua made peace with them, and made a covenant with them, to let them live. The princes of the congregation swore to them. +\v 16 At the end of three days after they had made a covenant with them, they heard that they were their neighbors, and that they lived among them. +\v 17 The children of Israel traveled and came to their cities on the third day. Now their cities were Gibeon, Chephirah, Beeroth, and Kiriath Jearim. +\v 18 The children of Israel didn’t strike them, because the princes of the congregation had sworn to them by Yahweh, the God of Israel. All the congregation murmured against the princes. +\v 19 But all the princes said to all the congregation, “We have sworn to them by Yahweh, the God of Israel. Now therefore we may not touch them. +\v 20 We will do this to them, and let them live; lest wrath be on us, because of the oath which we swore to them.” +\v 21 The princes said to them, “Let them live.” So they became wood cutters and drawers of water for all the congregation, as the princes had spoken to them. +\p +\v 22 Joshua called for them, and he spoke to them, saying, “Why have you deceived us, saying, ‘We are very far from you,’ when you live among us? +\v 23 Now therefore you are cursed, and some of you will never fail to be slaves, both wood cutters and drawers of water for the house of my God.” +\p +\v 24 They answered Joshua, and said, “Because your servants were certainly told how Yahweh your God commanded his servant Moses to give you all the land, and to destroy all the inhabitants of the land from before you. Therefore we were very afraid for our lives because of you, and have done this thing. +\v 25 Now, behold, we are in your hand. Do to us as it seems good and right to you to do.” +\p +\v 26 He did so to them, and delivered them out of the hand of the children of Israel, so that they didn’t kill them. +\v 27 That day Joshua made them wood cutters and drawers of water for the congregation and for Yahweh’s altar to this day, in the place which he should choose. +\c 10 +\p +\v 1 Now when Adoni-Zedek king of Jerusalem heard how Joshua had taken Ai, and had utterly destroyed it; as he had done to Jericho and her king, so he had done to Ai and her king; and how the inhabitants of Gibeon had made peace with Israel, and were among them, +\v 2 they were very afraid, because Gibeon was a great city, as one of the royal cities, and because it was greater than Ai, and all its men were mighty. +\v 3 Therefore Adoni-Zedek king of Jerusalem sent to Hoham king of Hebron, Piram king of Jarmuth, Japhia king of Lachish, and Debir king of Eglon, saying, +\v 4 “Come up to me and help me. Let’s strike Gibeon; for they have made peace with Joshua and with the children of Israel.” +\v 5 Therefore the five kings of the Amorites, the king of Jerusalem, the king of Hebron, the king of Jarmuth, the king of Lachish, and the king of Eglon, gathered themselves together and went up, they and all their armies, and encamped against Gibeon, and made war against it. +\v 6 The men of Gibeon sent to Joshua at the camp at Gilgal, saying, “Don’t abandon your servants! Come up to us quickly and save us! Help us; for all the kings of the Amorites that dwell in the hill country have gathered together against us.” +\p +\v 7 So Joshua went up from Gilgal, he and the whole army with him, including all the mighty men of valor. +\v 8 Yahweh said to Joshua, “Don’t fear them, for I have delivered them into your hands. Not a man of them will stand before you.” +\p +\v 9 Joshua therefore came to them suddenly. He marched from Gilgal all night. +\v 10 Yahweh confused them before Israel. He killed them with a great slaughter at Gibeon, and chased them by the way of the ascent of Beth Horon, and struck them to Azekah and to Makkedah. +\v 11 As they fled from before Israel, while they were at the descent of Beth Horon, Yahweh hurled down great stones from the sky on them to Azekah, and they died. There were more who died from the hailstones than those whom the children of Israel killed with the sword. +\p +\v 12 Then Joshua spoke to Yahweh in the day when Yahweh delivered up the Amorites before the children of Israel. He said in the sight of Israel, “Sun, stand still on Gibeon! You, moon, stop in the valley of Aijalon!” +\p +\v 13 The sun stood still, and the moon stayed, until the nation had avenged themselves of their enemies. Isn’t this written in the book of Jashar? The sun stayed in the middle of the sky, and didn’t hurry to go down about a whole day. +\v 14 There was no day like that before it or after it, that Yahweh listened to the voice of a man; for Yahweh fought for Israel. +\p +\v 15 Joshua returned, and all Israel with him, to the camp to Gilgal. +\v 16 These five kings fled, and hid themselves in the cave at Makkedah. +\v 17 Joshua was told, saying, “The five kings have been found, hidden in the cave at Makkedah.” +\p +\v 18 Joshua said, “Roll large stones to cover the cave’s entrance, and set men by it to guard them; +\v 19 but don’t stay there. Pursue your enemies, and attack them from the rear. Don’t allow them to enter into their cities; for Yahweh your God has delivered them into your hand.” +\p +\v 20 When Joshua and the children of Israel had finished killing them with a very great slaughter until they were consumed, and the remnant which remained of them had entered into the fortified cities, +\v 21 all the people returned to the camp to Joshua at Makkedah in peace. None moved his tongue against any of the children of Israel. +\v 22 Then Joshua said, “Open the cave entrance, and bring those five kings out of the cave to me.” +\p +\v 23 They did so, and brought those five kings out of the cave to him: the king of Jerusalem, the king of Hebron, the king of Jarmuth, the king of Lachish, and the king of Eglon. +\v 24 When they brought those kings out to Joshua, Joshua called for all the men of Israel, and said to the chiefs of the men of war who went with him, “Come near. Put your feet on the necks of these kings.” +\p They came near, and put their feet on their necks. +\p +\v 25 Joshua said to them, “Don’t be afraid, nor be dismayed. Be strong and courageous, for Yahweh will do this to all your enemies against whom you fight.” +\p +\v 26 Afterward Joshua struck them, put them to death, and hanged them on five trees. They were hanging on the trees until the evening. +\v 27 At the time of the going down of the sun, Joshua commanded, and they took them down off the trees, and threw them into the cave in which they had hidden themselves, and laid great stones on the mouth of the cave, which remain to this very day. +\p +\v 28 Joshua took Makkedah on that day, and struck it with the edge of the sword, with its king. He utterly destroyed it and all the souls who were in it. He left no one remaining. He did to the king of Makkedah as he had done to the king of Jericho. +\p +\v 29 Joshua passed from Makkedah, and all Israel with him, to Libnah, and fought against Libnah. +\v 30 Yahweh delivered it also, with its king, into the hand of Israel. He struck it with the edge of the sword, and all the souls who were in it. He left no one remaining in it. He did to its king as he had done to the king of Jericho. +\p +\v 31 Joshua passed from Libnah, and all Israel with him, to Lachish, and encamped against it, and fought against it. +\v 32 Yahweh delivered Lachish into the hand of Israel. He took it on the second day, and struck it with the edge of the sword, with all the souls who were in it, according to all that he had done to Libnah. +\v 33 Then Horam king of Gezer came up to help Lachish; and Joshua struck him and his people, until he had left him no one remaining. +\p +\v 34 Joshua passed from Lachish, and all Israel with him, to Eglon; and they encamped against it and fought against it. +\v 35 They took it on that day, and struck it with the edge of the sword. He utterly destroyed all the souls who were in it that day, according to all that he had done to Lachish. +\p +\v 36 Joshua went up from Eglon, and all Israel with him, to Hebron; and they fought against it. +\v 37 They took it, and struck it with the edge of the sword, with its king and all its cities, and all the souls who were in it. He left no one remaining, according to all that he had done to Eglon; but he utterly destroyed it, and all the souls who were in it. +\p +\v 38 Joshua returned, and all Israel with him, to Debir, and fought against it. +\v 39 He took it, with its king and all its cities. They struck them with the edge of the sword, and utterly destroyed all the souls who were in it. He left no one remaining. As he had done to Hebron, so he did to Debir, and to its king; as he had done also to Libnah, and to its king. +\v 40 So Joshua struck all the land, the hill country, the South, the lowland, the slopes, and all their kings. He left no one remaining, but he utterly destroyed all that breathed, as Yahweh, the God of Israel, commanded. +\v 41 Joshua struck them from Kadesh Barnea even to Gaza, and all the country of Goshen, even to Gibeon. +\v 42 Joshua took all these kings and their land at one time because Yahweh, the God of Israel, fought for Israel. +\v 43 Joshua returned, and all Israel with him, to the camp to Gilgal. +\c 11 +\p +\v 1 When Jabin king of Hazor heard of it, he sent to Jobab king of Madon, to the king of Shimron, to the king of Achshaph, +\v 2 and to the kings who were on the north, in the hill country, in the Arabah south of Chinneroth, in the lowland, and in the heights of Dor on the west, +\v 3 to the Canaanite on the east and on the west, the Amorite, the Hittite, the Perizzite, the Jebusite in the hill country, and the Hivite under Hermon in the land of Mizpah. +\v 4 They went out, they and all their armies with them, many people, even as the sand that is on the seashore in multitude, with very many horses and chariots. +\v 5 All these kings met together; and they came and encamped together at the waters of Merom, to fight with Israel. +\p +\v 6 Yahweh said to Joshua, “Don’t be afraid because of them; for tomorrow at this time, I will deliver them up all slain before Israel. You shall hamstring their horses and burn their chariots with fire.” +\p +\v 7 So Joshua came suddenly, with all the warriors, against them by the waters of Merom, and attacked them. +\v 8 Yahweh delivered them into the hand of Israel, and they struck them, and chased them to great Sidon, and to Misrephoth Maim, and to the valley of Mizpah eastward. They struck them until they left them no one remaining. +\v 9 Joshua did to them as Yahweh told him. He hamstrung their horses and burned their chariots with fire. +\v 10 Joshua turned back at that time, and took Hazor, and struck its king with the sword; for Hazor used to be the head of all those kingdoms. +\v 11 They struck all the souls who were in it with the edge of the sword, utterly destroying them. There was no one left who breathed. He burned Hazor with fire. +\v 12 Joshua captured all the cities of those kings, with their kings, and he struck them with the edge of the sword, and utterly destroyed them, as Moses the servant of Yahweh commanded. +\v 13 But as for the cities that stood on their mounds, Israel burned none of them, except Hazor only. Joshua burned that. +\v 14 The children of Israel took all the plunder of these cities, with the livestock, as plunder for themselves; but every man they struck with the edge of the sword, until they had destroyed them. They didn’t leave any who breathed. +\p +\v 15 As Yahweh commanded Moses his servant, so Moses commanded Joshua. Joshua did so. He left nothing undone of all that Yahweh commanded Moses. +\v 16 So Joshua captured all that land, the hill country, all the South, all the land of Goshen, the lowland, the Arabah, the hill country of Israel, and the lowland of the same, +\v 17 from Mount Halak, that goes up to Seir, even to Baal Gad in the valley of Lebanon under Mount Hermon. He took all their kings, struck them, and put them to death. +\v 18 Joshua made war a long time with all those kings. +\v 19 There was not a city that made peace with the children of Israel, except the Hivites, the inhabitants of Gibeon. They took all in battle. +\v 20 For it was of Yahweh to harden their hearts, to come against Israel in battle, that he might utterly destroy them, that they might have no favor, but that he might destroy them, as Yahweh commanded Moses. +\v 21 Joshua came at that time, and cut off the Anakim from the hill country, from Hebron, from Debir, from Anab, and from all the hill country of Judah, and from all the hill country of Israel. Joshua utterly destroyed them with their cities. +\v 22 There were none of the Anakim left in the land of the children of Israel. Only in Gaza, in Gath, and in Ashdod, did some remain. +\v 23 So Joshua took the whole land, according to all that Yahweh spoke to Moses; and Joshua gave it for an inheritance to Israel according to their divisions by their tribes. Then the land had rest from war. +\c 12 +\p +\v 1 Now these are the kings of the land, whom the children of Israel struck, and possessed their land beyond the Jordan toward the sunrise, from the valley of the Arnon to Mount Hermon, and all the Arabah eastward: +\v 2 Sihon king of the Amorites, who lived in Heshbon, and ruled from Aroer, which is on the edge of the valley of the Arnon, and the middle of the valley, and half Gilead, even to the river Jabbok, the border of the children of Ammon; +\v 3 and the Arabah to the sea of Chinneroth, eastward, and to the sea of the Arabah, even the Salt Sea, eastward, the way to Beth Jeshimoth; and on the south, under the slopes of Pisgah: +\v 4 and the border of Og king of Bashan, of the remnant of the Rephaim, who lived at Ashtaroth and at Edrei, +\v 5 and ruled in Mount Hermon, and in Salecah, and in all Bashan, to the border of the Geshurites and the Maacathites, and half Gilead, the border of Sihon king of Heshbon. +\v 6 Moses the servant of Yahweh and the children of Israel struck them. Moses the servant of Yahweh gave it for a possession to the Reubenites, and the Gadites, and the half-tribe of Manasseh. +\p +\v 7 These are the kings of the land whom Joshua and the children of Israel struck beyond the Jordan westward, from Baal Gad in the valley of Lebanon even to Mount Halak, that goes up to Seir. Joshua gave it to the tribes of Israel for a possession according to their divisions; +\v 8 in the hill country, and in the lowland, and in the Arabah, and in the slopes, and in the wilderness, and in the South; the Hittite, the Amorite, and the Canaanite, the Perizzite, the Hivite, and the Jebusite: +\m +\v 9 the king of Jericho, one; +\m the king of Ai, which is beside Bethel, one; +\m +\v 10 the king of Jerusalem, one; +\m the king of Hebron, one; +\m +\v 11 the king of Jarmuth, one; +\m the king of Lachish, one; +\m +\v 12 the king of Eglon, one; +\m the king of Gezer, one; +\m +\v 13 the king of Debir, one; +\m the king of Geder, one; +\m +\v 14 the king of Hormah, one; +\m the king of Arad, one; +\m +\v 15 the king of Libnah, one; +\m the king of Adullam, one; +\m +\v 16 the king of Makkedah, one; +\m the king of Bethel, one; +\m +\v 17 the king of Tappuah, one; +\m the king of Hepher, one; +\m +\v 18 the king of Aphek, one; +\m the king of Lassharon, one; +\m +\v 19 the king of Madon, one; +\m the king of Hazor, one; +\m +\v 20 the king of Shimron Meron, one; +\m the king of Achshaph, one; +\m +\v 21 the king of Taanach, one; +\m the king of Megiddo, one; +\m +\v 22 the king of Kedesh, one; +\m the king of Jokneam in Carmel, one; +\m +\v 23 the king of Dor in the height of Dor, one; +\m the king of Goiim in Gilgal, one; +\m +\v 24 the king of Tirzah, one: +\m all the kings thirty-one. +\c 13 +\p +\v 1 Now Joshua was old and well advanced in years. Yahweh said to him, “You are old and advanced in years, and there remains yet very much land to be possessed. +\p +\v 2 “This is the land that still remains: all the regions of the Philistines, and all the Geshurites; +\v 3 from the Shihor, which is before Egypt, even to the border of Ekron northward, which is counted as Canaanite; the five lords of the Philistines; the Gazites, and the Ashdodites, the Ashkelonites, the Gittites, and the Ekronites; also the Avvim, +\v 4 on the south; all the land of the Canaanites, and Mearah that belongs to the Sidonians, to Aphek, to the border of the Amorites; +\v 5 and the land of the Gebalites, and all Lebanon, toward the sunrise, from Baal Gad under Mount Hermon to the entrance of Hamath; +\v 6 all the inhabitants of the hill country from Lebanon to Misrephoth Maim, even all the Sidonians. I will drive them out from before the children of Israel. Just allocate it to Israel for an inheritance, as I have commanded you. +\v 7 Now therefore divide this land for an inheritance to the nine tribes and the half-tribe of Manasseh.” +\v 8 With him the Reubenites and the Gadites received their inheritance, which Moses gave them, beyond the Jordan eastward, even as Moses the servant of Yahweh gave them: +\v 9 from Aroer, that is on the edge of the valley of the Arnon, and the city that is in the middle of the valley, and all the plain of Medeba to Dibon; +\v 10 and all the cities of Sihon king of the Amorites, who reigned in Heshbon, to the border of the children of Ammon; +\v 11 and Gilead, and the border of the Geshurites and Maacathites, and all Mount Hermon, and all Bashan to Salecah; +\v 12 all the kingdom of Og in Bashan, who reigned in Ashtaroth and in Edrei (who was left of the remnant of the Rephaim); for Moses attacked these, and drove them out. +\v 13 Nevertheless the children of Israel didn’t drive out the Geshurites, nor the Maacathites: but Geshur and Maacath live within Israel to this day. +\v 14 Only he gave no inheritance to the tribe of Levi. The offerings of Yahweh, the God of Israel, made by fire are his inheritance, as he spoke to him. +\v 15 Moses gave to the tribe of the children of Reuben according to their families. +\v 16 Their border was from Aroer, that is on the edge of the valley of the Arnon, and the city that is in the middle of the valley, and all the plain by Medeba; +\v 17 Heshbon, and all its cities that are in the plain; Dibon, Bamoth Baal, Beth Baal Meon, +\v 18 Jahaz, Kedemoth, Mephaath, +\v 19 Kiriathaim, Sibmah, Zereth Shahar in the mount of the valley, +\v 20 Beth Peor, the slopes of Pisgah, Beth Jeshimoth, +\v 21 all the cities of the plain, and all the kingdom of Sihon king of the Amorites, who reigned in Heshbon, whom Moses struck with the chiefs of Midian, Evi, Rekem, Zur, Hur, and Reba, the princes of Sihon, who lived in the land. +\v 22 The children of Israel also killed Balaam the son of Beor, the soothsayer, with the sword, among the rest of their slain. +\p +\v 23 The border of the children of Reuben was the bank of the Jordan. This was the inheritance of the children of Reuben according to their families, the cities and its villages. +\p +\v 24 Moses gave to the tribe of Gad, to the children of Gad, according to their families. +\v 25 Their border was Jazer, and all the cities of Gilead, and half the land of the children of Ammon, to Aroer that is near Rabbah; +\v 26 and from Heshbon to Ramath Mizpeh, and Betonim; and from Mahanaim to the border of Debir; +\v 27 and in the valley, Beth Haram, Beth Nimrah, Succoth, and Zaphon, the rest of the kingdom of Sihon king of Heshbon, the Jordan’s bank, to the uttermost part of the sea of Chinnereth beyond the Jordan eastward. +\v 28 This is the inheritance of the children of Gad according to their families, the cities and its villages. +\p +\v 29 Moses gave an inheritance to the half-tribe of Manasseh. It was for the half-tribe of the children of Manasseh according to their families. +\v 30 Their border was from Mahanaim, all Bashan, all the kingdom of Og king of Bashan, and all the villages of Jair, which are in Bashan, sixty cities. +\v 31 Half Gilead, Ashtaroth, and Edrei, the cities of the kingdom of Og in Bashan, were for the children of Machir the son of Manasseh, even for the half of the children of Machir according to their families. +\p +\v 32 These are the inheritances which Moses distributed in the plains of Moab, beyond the Jordan at Jericho, eastward. +\v 33 But Moses gave no inheritance to the tribe of Levi. Yahweh, the God of Israel, is their inheritance, as he spoke to them. +\c 14 +\p +\v 1 These are the inheritances which the children of Israel took in the land of Canaan, which Eleazar the priest, Joshua the son of Nun, and the heads of the fathers’ houses of the tribes of the children of Israel, distributed to them, +\v 2 by the lot of their inheritance, as Yahweh commanded by Moses, for the nine tribes, and for the half-tribe. +\v 3 For Moses had given the inheritance of the two tribes and the half-tribe beyond the Jordan; but to the Levites he gave no inheritance among them. +\v 4 For the children of Joseph were two tribes, Manasseh and Ephraim. They gave no portion to the Levites in the land, except cities to dwell in, with their pasture lands for their livestock and for their property. +\v 5 The children of Israel did as Yahweh commanded Moses, and they divided the land. +\p +\v 6 Then the children of Judah came near to Joshua in Gilgal. Caleb the son of Jephunneh the Kenizzite said to him, “You know the thing that Yahweh spoke to Moses the man of God concerning me and concerning you in Kadesh Barnea. +\v 7 I was forty years old when Moses the servant of Yahweh sent me from Kadesh Barnea to spy out the land. I brought him word again as it was in my heart. +\v 8 Nevertheless, my brothers who went up with me made the heart of the people melt; but I wholly followed Yahweh my God. +\v 9 Moses swore on that day, saying, ‘Surely the land where you walked shall be an inheritance to you and to your children forever, because you have wholly followed Yahweh my God.’ +\p +\v 10 “Now, behold, Yahweh has kept me alive, as he spoke, these forty-five years, from the time that Yahweh spoke this word to Moses, while Israel walked in the wilderness. Now, behold, I am eighty-five years old, today. +\v 11 As yet I am as strong today as I was in the day that Moses sent me. As my strength was then, even so is my strength now for war, to go out and to come in. +\v 12 Now therefore give me this hill country, of which Yahweh spoke in that day; for you heard in that day how the Anakim were there, and great and fortified cities. It may be that Yahweh will be with me, and I shall drive them out, as Yahweh said.” +\p +\v 13 Joshua blessed him; and he gave Hebron to Caleb the son of Jephunneh for an inheritance. +\v 14 Therefore Hebron became the inheritance of Caleb the son of Jephunneh the Kenizzite to this day, because he followed Yahweh, the God of Israel wholeheartedly. +\v 15 Now the name of Hebron before was Kiriath Arba, after the greatest man among the Anakim. Then the land had rest from war. +\c 15 +\p +\v 1 The lot for the tribe of the children of Judah according to their families was to the border of Edom, even to the wilderness of Zin southward, at the uttermost part of the south. +\v 2 Their south border was from the uttermost part of the Salt Sea, from the bay that looks southward; +\v 3 and it went out southward of the ascent of Akrabbim, and passed along to Zin, and went up by the south of Kadesh Barnea, and passed along by Hezron, went up to Addar, and turned toward Karka; +\v 4 and it passed along to Azmon, went out at the brook of Egypt; and the border ended at the sea. This shall be your south border. +\v 5 The east border was the Salt Sea, even to the end of the Jordan. The border of the north quarter was from the bay of the sea at the end of the Jordan. +\v 6 The border went up to Beth Hoglah, and passed along by the north of Beth Arabah; and the border went up to the stone of Bohan the son of Reuben. +\v 7 The border went up to Debir from the valley of Achor, and so northward, looking toward Gilgal, that faces the ascent of Adummim, which is on the south side of the river. The border passed along to the waters of En Shemesh, and ended at En Rogel. +\v 8 The border went up by the valley of the son of Hinnom to the side of the Jebusite (also called Jerusalem) southward; and the border went up to the top of the mountain that lies before the valley of Hinnom westward, which is at the farthest part of the valley of Rephaim northward. +\v 9 The border extended from the top of the mountain to the spring of the waters of Nephtoah, and went out to the cities of Mount Ephron; and the border extended to Baalah (also called Kiriath Jearim); +\v 10 and the border turned about from Baalah westward to Mount Seir, and passed along to the side of Mount Jearim (also called Chesalon) on the north, and went down to Beth Shemesh, and passed along by Timnah; +\v 11 and the border went out to the side of Ekron northward; and the border extended to Shikkeron, and passed along to Mount Baalah, and went out at Jabneel; and the goings out of the border were at the sea. +\v 12 The west border was to the shore of the great sea. This is the border of the children of Judah according to their families. +\p +\v 13 He gave to Caleb the son of Jephunneh a portion among the children of Judah, according to the commandment of Yahweh to Joshua, even Kiriath Arba, named after the father of Anak (also called Hebron). +\v 14 Caleb drove out the three sons of Anak: Sheshai, and Ahiman, and Talmai, the children of Anak. +\v 15 He went up against the inhabitants of Debir: now the name of Debir before was Kiriath Sepher. +\v 16 Caleb said, “He who strikes Kiriath Sepher, and takes it, to him I will give Achsah my daughter as wife.” +\v 17 Othniel the son of Kenaz, the brother of Caleb, took it: and he gave him Achsah his daughter as wife. +\v 18 When she came, she had him ask her father for a field. She got off her donkey, and Caleb said, “What do you want?” +\p +\v 19 She said, “Give me a blessing. Because you have set me in the land of the South, give me also springs of water.” +\p So he gave her the upper springs and the lower springs. +\p +\v 20 This is the inheritance of the tribe of the children of Judah according to their families. +\v 21 The farthest cities of the tribe of the children of Judah toward the border of Edom in the South were Kabzeel, Eder, Jagur, +\v 22 Kinah, Dimonah, Adadah, +\v 23 Kedesh, Hazor, Ithnan, +\v 24 Ziph, Telem, Bealoth, +\v 25 Hazor Hadattah, Kerioth Hezron (also called Hazor), +\v 26 Amam, Shema, Moladah, +\v 27 Hazar Gaddah, Heshmon, Beth Pelet, +\v 28 Hazar Shual, Beersheba, Biziothiah, +\v 29 Baalah, Iim, Ezem, +\v 30 Eltolad, Chesil, Hormah, +\v 31 Ziklag, Madmannah, Sansannah, +\v 32 Lebaoth, Shilhim, Ain, and Rimmon. All the cities are twenty-nine, with their villages. +\m +\v 33 In the lowland, Eshtaol, Zorah, Ashnah, +\v 34 Zanoah, En Gannim, Tappuah, Enam, +\v 35 Jarmuth, Adullam, Socoh, Azekah, +\v 36 Shaaraim, Adithaim and Gederah (or Gederothaim); fourteen cities with their villages. +\m +\v 37 Zenan, Hadashah, Migdal Gad, +\v 38 Dilean, Mizpah, Joktheel, +\v 39 Lachish, Bozkath, Eglon, +\v 40 Cabbon, Lahmam, Chitlish, +\v 41 Gederoth, Beth Dagon, Naamah, and Makkedah; sixteen cities with their villages. +\m +\v 42 Libnah, Ether, Ashan, +\v 43 Iphtah, Ashnah, Nezib, +\v 44 Keilah, Achzib, and Mareshah; nine cities with their villages. +\m +\v 45 Ekron, with its towns and its villages; +\v 46 from Ekron even to the sea, all that were by the side of Ashdod, with their villages. +\v 47 Ashdod, its towns and its villages; Gaza, its towns and its villages; to the brook of Egypt, and the great sea with its coastline. +\m +\v 48 In the hill country, Shamir, Jattir, Socoh, +\v 49 Dannah, Kiriath Sannah (which is Debir), +\v 50 Anab, Eshtemoh, Anim, +\v 51 Goshen, Holon, and Giloh; eleven cities with their villages. +\m +\v 52 Arab, Dumah, Eshan, +\v 53 Janim, Beth Tappuah, Aphekah, +\v 54 Humtah, Kiriath Arba (also called Hebron), and Zior; nine cities with their villages. +\m +\v 55 Maon, Carmel, Ziph, Jutah, +\v 56 Jezreel, Jokdeam, Zanoah, +\v 57 Kain, Gibeah, and Timnah; ten cities with their villages. +\m +\v 58 Halhul, Beth Zur, Gedor, +\v 59 Maarath, Beth Anoth, and Eltekon; six cities with their villages. +\v 60 Kiriath Baal (also called Kiriath Jearim), and Rabbah; two cities with their villages. +\m +\v 61 In the wilderness, Beth Arabah, Middin, Secacah, +\v 62 Nibshan, the City of Salt, and En Gedi; six cities with their villages. +\p +\v 63 As for the Jebusites, the inhabitants of Jerusalem, the children of Judah couldn’t drive them out; but the Jebusites live with the children of Judah at Jerusalem to this day. +\c 16 +\p +\v 1 The lot came out for the children of Joseph from the Jordan at Jericho, at the waters of Jericho on the east, even the wilderness, going up from Jericho through the hill country to Bethel. +\v 2 It went out from Bethel to Luz, and passed along to the border of the Archites to Ataroth; +\v 3 and it went down westward to the border of the Japhletites, to the border of Beth Horon the lower, and on to Gezer; and ended at the sea. +\p +\v 4 The children of Joseph, Manasseh and Ephraim, took their inheritance. +\v 5 This was the border of the children of Ephraim according to their families. The border of their inheritance eastward was Ataroth Addar, to Beth Horon the upper. +\v 6 The border went out westward at Michmethath on the north. The border turned about eastward to Taanath Shiloh, and passed along it on the east of Janoah. +\v 7 It went down from Janoah to Ataroth, to Naarah, reached to Jericho, and went out at the Jordan. +\v 8 From Tappuah the border went along westward to the brook of Kanah; and ended at the sea. This is the inheritance of the tribe of the children of Ephraim according to their families; +\v 9 together with the cities which were set apart for the children of Ephraim in the middle of the inheritance of the children of Manasseh, all the cities with their villages. +\v 10 They didn’t drive out the Canaanites who lived in Gezer; but the Canaanites dwell in the territory of Ephraim to this day, and have become servants to do forced labor. +\c 17 +\p +\v 1 This was the lot for the tribe of Manasseh, for he was the firstborn of Joseph. As for Machir the firstborn of Manasseh, the father of Gilead, because he was a man of war, therefore he had Gilead and Bashan. +\v 2 So this was for the rest of the children of Manasseh according to their families: for the children of Abiezer, for the children of Helek, for the children of Asriel, for the children of Shechem, for the children of Hepher, and for the children of Shemida. These were the male children of Manasseh the son of Joseph according to their families. +\v 3 But Zelophehad, the son of Hepher, the son of Gilead, the son of Machir, the son of Manasseh, had no sons, but daughters. These are the names of his daughters: Mahlah, Noah, Hoglah, Milcah, and Tirzah. +\v 4 They came to Eleazar the priest, and to Joshua the son of Nun, and to the princes, saying, “Yahweh commanded Moses to give us an inheritance among our brothers.” Therefore according to the commandment of Yahweh he gave them an inheritance among the brothers of their father. +\v 5 Ten parts fell to Manasseh, in addition to the land of Gilead and Bashan, which is beyond the Jordan; +\v 6 because the daughters of Manasseh had an inheritance among his sons. The land of Gilead belonged to the rest of the sons of Manasseh. +\v 7 The border of Manasseh was from Asher to Michmethath, which is before Shechem. The border went along to the right hand, to the inhabitants of En Tappuah. +\v 8 The land of Tappuah belonged to Manasseh; but Tappuah on the border of Manasseh belonged to the children of Ephraim. +\v 9 The border went down to the brook of Kanah, southward of the brook. These cities belonged to Ephraim among the cities of Manasseh. The border of Manasseh was on the north side of the brook, and ended at the sea. +\v 10 Southward it was Ephraim’s, and northward it was Manasseh’s, and the sea was his border. They reached to Asher on the north, and to Issachar on the east. +\v 11 Manasseh had three heights in Issachar, in Asher Beth Shean and its towns, and Ibleam and its towns, and the inhabitants of Dor and its towns, and the inhabitants of Endor and its towns, and the inhabitants of Taanach and its towns, and the inhabitants of Megiddo and its towns. +\v 12 Yet the children of Manasseh couldn’t drive out the inhabitants of those cities; but the Canaanites would dwell in that land. +\p +\v 13 When the children of Israel had grown strong, they put the Canaanites to forced labor, and didn’t utterly drive them out. +\v 14 The children of Joseph spoke to Joshua, saying, “Why have you given me just one lot and one part for an inheritance, since we are a numerous people, because Yahweh has blessed us so far?” +\p +\v 15 Joshua said to them, “If you are a numerous people, go up to the forest, and clear land for yourself there in the land of the Perizzites and of the Rephaim, since the hill country of Ephraim is too narrow for you.” +\p +\v 16 The children of Joseph said, “The hill country is not enough for us. All the Canaanites who dwell in the land of the valley have chariots of iron, both those who are in Beth Shean and its towns, and those who are in the valley of Jezreel.” +\p +\v 17 Joshua spoke to the house of Joseph, that is, to Ephraim and to Manasseh, saying, “You are a numerous people, and have great power. You shall not have one lot only; +\v 18 but the hill country shall be yours. Although it is a forest, you shall cut it down, and it’s farthest extent shall be yours; for you shall drive out the Canaanites, though they have chariots of iron, and though they are strong.” +\c 18 +\p +\v 1 The whole congregation of the children of Israel assembled themselves together at Shiloh, and set up the Tent of Meeting there. The land was subdued before them. +\v 2 Seven tribes remained among the children of Israel, which had not yet divided their inheritance. +\v 3 Joshua said to the children of Israel, “How long will you neglect to go in to possess the land, which Yahweh, the God of your fathers, has given you? +\v 4 Appoint for yourselves three men from each tribe. I will send them, and they shall arise, walk through the land, and describe it according to their inheritance; then they shall come to me. +\v 5 They shall divide it into seven portions. Judah shall live in his borders on the south, and the house of Joseph shall live in their borders on the north. +\v 6 You shall survey the land into seven parts, and bring the description here to me; and I will cast lots for you here before Yahweh our God. +\v 7 However, the Levites have no portion among you; for the priesthood of Yahweh is their inheritance. Gad, Reuben, and the half-tribe of Manasseh have received their inheritance east of the Jordan, which Moses the servant of Yahweh gave them.” +\p +\v 8 The men arose and went. Joshua commanded those who went to survey the land, saying, “Go walk through the land, survey it, and come again to me. I will cast lots for you here before Yahweh in Shiloh.” +\p +\v 9 The men went and passed through the land, and surveyed it by cities into seven portions in a book. They came to Joshua to the camp at Shiloh. +\v 10 Joshua cast lots for them in Shiloh before Yahweh. There Joshua divided the land to the children of Israel according to their divisions. +\p +\v 11 The lot of the tribe of the children of Benjamin came up according to their families. The border of their lot went out between the children of Judah and the children of Joseph. +\v 12 Their border on the north quarter was from the Jordan. The border went up to the side of Jericho on the north, and went up through the hill country westward. It ended at the wilderness of Beth Aven. +\v 13 The border passed along from there to Luz, to the side of Luz (also called Bethel), southward. The border went down to Ataroth Addar, by the mountain that lies on the south of Beth Horon the lower. +\v 14 The border extended, and turned around on the west quarter southward, from the mountain that lies before Beth Horon southward; and ended at Kiriath Baal (also called Kiriath Jearim), a city of the children of Judah. This was the west quarter. +\v 15 The south quarter was from the farthest part of Kiriath Jearim. The border went out westward, and went out to the spring of the waters of Nephtoah. +\v 16 The border went down to the farthest part of the mountain that lies before the valley of the son of Hinnom, which is in the valley of Rephaim northward. It went down to the valley of Hinnom, to the side of the Jebusite southward, and went down to En Rogel. +\v 17 It extended northward, went out at En Shemesh, and went out to Geliloth, which is opposite the ascent of Adummim. It went down to the stone of Bohan the son of Reuben. +\v 18 It passed along to the side opposite the Arabah northward, and went down to the Arabah. +\v 19 The border passed along to the side of Beth Hoglah northward; and the border ended at the north bay of the Salt Sea, at the south end of the Jordan. This was the south border. +\v 20 The Jordan was its border on the east quarter. This was the inheritance of the children of Benjamin, by the borders around it, according to their families. +\v 21 Now the cities of the tribe of the children of Benjamin according to their families were Jericho, Beth Hoglah, Emek Keziz, +\v 22 Beth Arabah, Zemaraim, Bethel, +\v 23 Avvim, Parah, Ophrah, +\v 24 Chephar Ammoni, Ophni, and Geba; twelve cities with their villages. +\v 25 Gibeon, Ramah, Beeroth, +\v 26 Mizpeh, Chephirah, Mozah, +\v 27 Rekem, Irpeel, Taralah, +\v 28 Zelah, Eleph, the Jebusite (also called Jerusalem), Gibeath, and Kiriath; fourteen cities with their villages. This is the inheritance of the children of Benjamin according to their families. +\c 19 +\p +\v 1 The second lot came out for Simeon, even for the tribe of the children of Simeon according to their families. Their inheritance was in the middle of the inheritance of the children of Judah. +\v 2 They had for their inheritance Beersheba (or Sheba), Moladah, +\v 3 Hazar Shual, Balah, Ezem, +\v 4 Eltolad, Bethul, Hormah, +\v 5 Ziklag, Beth Marcaboth, Hazar Susah, +\v 6 Beth Lebaoth, and Sharuhen; thirteen cities with their villages; +\v 7 Ain, Rimmon, Ether, and Ashan; four cities with their villages; +\v 8 and all the villages that were around these cities to Baalath Beer, Ramah of the South. This is the inheritance of the tribe of the children of Simeon according to their families. +\v 9 Out of the part of the children of Judah was the inheritance of the children of Simeon; for the portion of the children of Judah was too much for them. Therefore the children of Simeon had inheritance in the middle of their inheritance. +\p +\v 10 The third lot came up for the children of Zebulun according to their families. The border of their inheritance was to Sarid. +\v 11 Their border went up westward, even to Maralah, and reached to Dabbesheth. It reached to the brook that is before Jokneam. +\v 12 It turned from Sarid eastward toward the sunrise to the border of Chisloth Tabor. It went out to Daberath, and went up to Japhia. +\v 13 From there it passed along eastward to Gath Hepher, to Ethkazin; and it went out at Rimmon which stretches to Neah. +\v 14 The border turned around it on the north to Hannathon; and it ended at the valley of Iphtah El; +\v 15 Kattath, Nahalal, Shimron, Idalah, and Bethlehem: twelve cities with their villages. +\v 16 This is the inheritance of the children of Zebulun according to their families, these cities with their villages. +\p +\v 17 The fourth lot came out for Issachar, even for the children of Issachar according to their families. +\v 18 Their border was to Jezreel, Chesulloth, Shunem, +\v 19 Hapharaim, Shion, Anaharath, +\v 20 Rabbith, Kishion, Ebez, +\v 21 Remeth, Engannim, En Haddah, and Beth Pazzez. +\v 22 The border reached to Tabor, Shahazumah, and Beth Shemesh. Their border ended at the Jordan: sixteen cities with their villages. +\v 23 This is the inheritance of the tribe of the children of Issachar according to their families, the cities with their villages. +\p +\v 24 The fifth lot came out for the tribe of the children of Asher according to their families. +\v 25 Their border was Helkath, Hali, Beten, Achshaph, +\v 26 Allammelech, Amad, Mishal. It reached to Carmel westward, and to Shihorlibnath. +\v 27 It turned toward the sunrise to Beth Dagon, and reached to Zebulun, and to the valley of Iphtah El northward to Beth Emek and Neiel. It went out to Cabul on the left hand, +\v 28 and Ebron, Rehob, Hammon, and Kanah, even to great Sidon. +\v 29 The border turned to Ramah, to the fortified city of Tyre; and the border turned to Hosah. It ended at the sea by the region of Achzib; +\v 30 Ummah also, and Aphek, and Rehob: twenty-two cities with their villages. +\v 31 This is the inheritance of the tribe of the children of Asher according to their families, these cities with their villages. +\p +\v 32 The sixth lot came out for the children of Naphtali, even for the children of Naphtali according to their families. +\v 33 Their border was from Heleph, from the oak in Zaanannim, Adami-nekeb, and Jabneel, to Lakkum. It ended at the Jordan. +\v 34 The border turned westward to Aznoth Tabor, and went out from there to Hukkok. It reached to Zebulun on the south, and reached to Asher on the west, and to Judah at the Jordan toward the sunrise. +\v 35 The fortified cities were Ziddim, Zer, Hammath, Rakkath, Chinnereth, +\v 36 Adamah, Ramah, Hazor, +\v 37 Kedesh, Edrei, En Hazor, +\v 38 Iron, Migdal El, Horem, Beth Anath, and Beth Shemesh; nineteen cities with their villages. +\v 39 This is the inheritance of the tribe of the children of Naphtali according to their families, the cities with their villages. +\p +\v 40 The seventh lot came out for the tribe of the children of Dan according to their families. +\v 41 The border of their inheritance was Zorah, Eshtaol, Irshemesh, +\v 42 Shaalabbin, Aijalon, Ithlah, +\v 43 Elon, Timnah, Ekron, +\v 44 Eltekeh, Gibbethon, Baalath, +\v 45 Jehud, Bene Berak, Gath Rimmon, +\v 46 Me Jarkon, and Rakkon, with the border opposite Joppa. +\v 47 The border of the children of Dan went out beyond them; for the children of Dan went up and fought against Leshem, and took it, and struck it with the edge of the sword, and possessed it, and lived therein, and called Leshem, Dan, after the name of Dan their forefather. +\v 48 This is the inheritance of the tribe of the children of Dan according to their families, these cities with their villages. +\p +\v 49 So they finished distributing the land for inheritance by its borders. The children of Israel gave an inheritance to Joshua the son of Nun among them. +\v 50 According to Yahweh’s commandment, they gave him the city which he asked, even Timnathserah in the hill country of Ephraim; and he built the city, and lived there. +\v 51 These are the inheritances, which Eleazar the priest, Joshua the son of Nun, and the heads of the fathers’ houses of the tribes of the children of Israel, distributed for inheritance by lot in Shiloh before Yahweh, at the door of the Tent of Meeting. So they finished dividing the land. +\c 20 +\p +\v 1 Yahweh spoke to Joshua, saying, +\v 2 “Speak to the children of Israel, saying, ‘Assign the cities of refuge, of which I spoke to you by Moses, +\v 3 that the man slayer who kills any person accidentally or unintentionally may flee there. They shall be to you for a refuge from the avenger of blood. +\v 4 He shall flee to one of those cities, and shall stand at the entrance of the gate of the city, and declare his case in the ears of the elders of that city. They shall take him into the city with them, and give him a place, that he may live among them. +\v 5 If the avenger of blood pursues him, then they shall not deliver up the man slayer into his hand; because he struck his neighbor unintentionally, and didn’t hate him before. +\v 6 He shall dwell in that city until he stands before the congregation for judgment, until the death of the high priest that shall be in those days. Then the man slayer shall return, and come to his own city, and to his own house, to the city he fled from.’” +\p +\v 7 They set apart Kedesh in Galilee in the hill country of Naphtali, Shechem in the hill country of Ephraim, and Kiriath Arba (also called Hebron) in the hill country of Judah. +\v 8 Beyond the Jordan at Jericho eastward, they assigned Bezer in the wilderness in the plain out of the tribe of Reuben, Ramoth in Gilead out of the tribe of Gad, and Golan in Bashan out of the tribe of Manasseh. +\v 9 These were the appointed cities for all the children of Israel, and for the alien who lives among them, that whoever kills any person unintentionally might flee there, and not die by the hand of the avenger of blood, until he stands trial before the congregation. +\c 21 +\p +\v 1 Then the heads of fathers’ houses of the Levites came near to Eleazar the priest, and to Joshua the son of Nun, and to the heads of fathers’ houses of the tribes of the children of Israel. +\v 2 They spoke to them at Shiloh in the land of Canaan, saying, “Yahweh commanded through Moses to give us cities to dwell in, with their pasture lands for our livestock.” +\p +\v 3 The children of Israel gave to the Levites out of their inheritance, according to the commandment of Yahweh, these cities with their pasture lands. +\v 4 The lot came out for the families of the Kohathites. The children of Aaron the priest, who were of the Levites, had thirteen cities by lot out of the tribe of Judah, out of the tribe of the Simeonites, and out of the tribe of Benjamin. +\v 5 The rest of the children of Kohath had ten cities by lot out of the families of the tribe of Ephraim, out of the tribe of Dan, and out of the half-tribe of Manasseh. +\v 6 The children of Gershon had thirteen cities by lot out of the families of the tribe of Issachar, out of the tribe of Asher, out of the tribe of Naphtali, and out of the half-tribe of Manasseh in Bashan. +\v 7 The children of Merari according to their families had twelve cities out of the tribe of Reuben, out of the tribe of Gad, and out of the tribe of Zebulun. +\v 8 The children of Israel gave these cities with their pasture lands by lot to the Levites, as Yahweh commanded by Moses. +\v 9 They gave out of the tribe of the children of Judah, and out of the tribe of the children of Simeon, these cities which are mentioned by name: +\v 10 and they were for the children of Aaron, of the families of the Kohathites, who were of the children of Levi; for theirs was the first lot. +\v 11 They gave them Kiriath Arba, named after the father of Anak (also called Hebron), in the hill country of Judah, with its pasture lands around it. +\v 12 But they gave the fields of the city and its villages to Caleb the son of Jephunneh for his possession. +\v 13 To the children of Aaron the priest they gave Hebron with its pasture lands, the city of refuge for the man slayer, Libnah with its pasture lands, +\v 14 Jattir with its pasture lands, Eshtemoa with its pasture lands, +\v 15 Holon with its pasture lands, Debir with its pasture lands, +\v 16 Ain with its pasture lands, Juttah with its pasture lands, and Beth Shemesh with its pasture lands: nine cities out of those two tribes. +\v 17 Out of the tribe of Benjamin, Gibeon with its pasture lands, Geba with its pasture lands, +\v 18 Anathoth with its pasture lands, and Almon with its pasture lands: four cities. +\v 19 All the cities of the children of Aaron, the priests, were thirteen cities with their pasture lands. +\p +\v 20 The families of the children of Kohath, the Levites, even the rest of the children of Kohath, had the cities of their lot out of the tribe of Ephraim. +\v 21 They gave them Shechem with its pasture lands in the hill country of Ephraim, the city of refuge for the man slayer, and Gezer with its pasture lands, +\v 22 Kibzaim with its pasture lands, and Beth Horon with its pasture lands: four cities. +\v 23 Out of the tribe of Dan, Elteke with its pasture lands, Gibbethon with its pasture lands, +\v 24 Aijalon with its pasture lands, Gath Rimmon with its pasture lands: four cities. +\v 25 Out of the half-tribe of Manasseh, Taanach with its pasture lands, and Gath Rimmon with its pasture lands: two cities. +\v 26 All the cities of the families of the rest of the children of Kohath were ten with their pasture lands. +\p +\v 27 They gave to the children of Gershon, of the families of the Levites, out of the half-tribe of Manasseh Golan in Bashan with its pasture lands, the city of refuge for the man slayer, and Be Eshterah with its pasture lands: two cities. +\v 28 Out of the tribe of Issachar, Kishion with its pasture lands, Daberath with its pasture lands, +\v 29 Jarmuth with its pasture lands, En Gannim with its pasture lands: four cities. +\v 30 Out of the tribe of Asher, Mishal with its pasture lands, Abdon with its pasture lands, +\v 31 Helkath with its pasture lands, and Rehob with its pasture lands: four cities. +\v 32 Out of the tribe of Naphtali, Kedesh in Galilee with its pasture lands, the city of refuge for the man slayer, Hammothdor with its pasture lands, and Kartan with its pasture lands: three cities. +\v 33 All the cities of the Gershonites according to their families were thirteen cities with their pasture lands. +\p +\v 34 To the families of the children of Merari, the rest of the Levites, out of the tribe of Zebulun, Jokneam with its pasture lands, Kartah with its pasture lands, +\v 35 Dimnah with its pasture lands, and Nahalal with its pasture lands: four cities. +\v 36 Out of the tribe of Reuben, Bezer with its pasture lands, Jahaz with its pasture lands, +\v 37 Kedemoth with its pasture lands, and Mephaath with its pasture lands: four cities. +\v 38 Out of the tribe of Gad, Ramoth in Gilead with its pasture lands, the city of refuge for the man slayer, and Mahanaim with its pasture lands, +\v 39 Heshbon with its pasture lands, Jazer with its pasture lands: four cities in all. +\v 40 All these were the cities of the children of Merari according to their families, even the rest of the families of the Levites. Their lot was twelve cities. +\p +\v 41 All the cities of the Levites among the possessions of the children of Israel were forty-eight cities with their pasture lands. +\v 42 Each of these cities included their pasture lands around them. It was this way with all these cities. +\p +\v 43 So Yahweh gave to Israel all the land which he swore to give to their fathers. They possessed it, and lived in it. +\v 44 Yahweh gave them rest all around, according to all that he swore to their fathers. Not a man of all their enemies stood before them. Yahweh delivered all their enemies into their hand. +\v 45 Nothing failed of any good thing which Yahweh had spoken to the house of Israel. All came to pass. +\c 22 +\p +\v 1 Then Joshua called the Reubenites, the Gadites, and the half-tribe of Manasseh, +\v 2 and said to them, “You have kept all that Moses the servant of Yahweh commanded you, and have listened to my voice in all that I commanded you. +\v 3 You have not left your brothers these many days to this day, but have performed the duty of the commandment of Yahweh your God. +\v 4 Now Yahweh your God has given rest to your brothers, as he spoke to them. Therefore now return and go to your tents, to the land of your possession, which Moses the servant of Yahweh gave you beyond the Jordan. +\v 5 Only take diligent heed to do the commandment and the law which Moses the servant of Yahweh commanded you, to love Yahweh your God, to walk in all his ways, to keep his commandments, to hold fast to him, and to serve him with all your heart and with all your soul.” +\p +\v 6 So Joshua blessed them, and sent them away; and they went to their tents. +\v 7 Now to the one half-tribe of Manasseh Moses had given inheritance in Bashan; but Joshua gave to the other half among their brothers beyond the Jordan westward. Moreover when Joshua sent them away to their tents, he blessed them, +\v 8 and spoke to them, saying, “Return with much wealth to your tents, with very much livestock, with silver, with gold, with bronze, with iron, and with very much clothing. Divide the plunder of your enemies with your brothers.” +\p +\v 9 The children of Reuben and the children of Gad and the half-tribe of Manasseh returned, and departed from the children of Israel out of Shiloh, which is in the land of Canaan, to go to the land of Gilead, to the land of their possession, which they owned, according to the commandment of Yahweh by Moses. +\v 10 When they came to the region near the Jordan, that is in the land of Canaan, the children of Reuben and the children of Gad and the half-tribe of Manasseh built an altar there by the Jordan, a great altar to look at. +\v 11 The children of Israel heard this, “Behold, the children of Reuben and the children of Gad and the half-tribe of Manasseh have built an altar along the border of the land of Canaan, in the region around the Jordan, on the side that belongs to the children of Israel.” +\v 12 When the children of Israel heard of it, the whole congregation of the children of Israel gathered themselves together at Shiloh, to go up against them to war. +\v 13 The children of Israel sent to the children of Reuben, and to the children of Gad, and to the half-tribe of Manasseh, into the land of Gilead, Phinehas the son of Eleazar the priest. +\v 14 With him were ten princes, one prince of a fathers’ house for each of the tribes of Israel; and they were each head of their fathers’ houses among the thousands of Israel. +\v 15 They came to the children of Reuben, and to the children of Gad, and to the half-tribe of Manasseh, to the land of Gilead, and they spoke with them, saying, +\v 16 “The whole congregation of Yahweh says, ‘What trespass is this that you have committed against the God of Israel, to turn away today from following Yahweh, in that you have built yourselves an altar, to rebel today against Yahweh? +\v 17 Is the iniquity of Peor too little for us, from which we have not cleansed ourselves to this day, although there came a plague on the congregation of Yahweh, +\v 18 that you must turn away today from following Yahweh? It will be, since you rebel today against Yahweh, that tomorrow he will be angry with the whole congregation of Israel. +\v 19 However, if the land of your possession is unclean, then pass over to the land of the possession of Yahweh, in which Yahweh’s tabernacle dwells, and take possession among us; but don’t rebel against Yahweh, nor rebel against us, in building an altar other than Yahweh our God’s altar. +\v 20 Didn’t Achan the son of Zerah commit a trespass in the devoted thing, and wrath fell on all the congregation of Israel? That man didn’t perish alone in his iniquity.’” +\p +\v 21 Then the children of Reuben and the children of Gad and the half-tribe of Manasseh answered, and spoke to the heads of the thousands of Israel, +\v 22 “The Mighty One, God, Yahweh, the Mighty One, God, Yahweh, he knows; and Israel shall know: if it was in rebellion, or if in trespass against Yahweh (don’t save us today), +\v 23 that we have built us an altar to turn away from following Yahweh; or if to offer burnt offering or meal offering, or if to offer sacrifices of peace offerings, let Yahweh himself require it. +\p +\v 24 “If we have not out of concern done this, and for a reason, saying, ‘In time to come your children might speak to our children, saying, “What have you to do with Yahweh, the God of Israel? +\v 25 For Yahweh has made the Jordan a border between us and you, you children of Reuben and children of Gad. You have no portion in Yahweh.”’ So your children might make our children cease from fearing Yahweh. +\p +\v 26 “Therefore we said, ‘Let’s now prepare to build ourselves an altar, not for burnt offering, nor for sacrifice; +\v 27 but it will be a witness between us and you, and between our generations after us, that we may perform the service of Yahweh before him with our burnt offerings, with our sacrifices, and with our peace offerings;’ that your children may not tell our children in time to come, ‘You have no portion in Yahweh.’ +\p +\v 28 “Therefore we said, ‘It shall be, when they tell us or our generations this in time to come, that we shall say, “Behold the pattern of Yahweh’s altar, which our fathers made, not for burnt offering, nor for sacrifice; but it is a witness between us and you.”’ +\p +\v 29 “Far be it from us that we should rebel against Yahweh, and turn away today from following Yahweh, to build an altar for burnt offering, for meal offering, or for sacrifice, besides Yahweh our God’s altar that is before his tabernacle!” +\p +\v 30 When Phinehas the priest, and the princes of the congregation, even the heads of the thousands of Israel that were with him, heard the words that the children of Reuben and the children of Gad and the children of Manasseh spoke, it pleased them well. +\v 31 Phinehas the son of Eleazar the priest said to the children of Reuben, to the children of Gad, and to the children of Manasseh, “Today we know that Yahweh is among us, because you have not committed this trespass against Yahweh. Now you have delivered the children of Israel out of Yahweh’s hand.” +\v 32 Phinehas the son of Eleazar the priest, and the princes, returned from the children of Reuben, and from the children of Gad, out of the land of Gilead, to the land of Canaan, to the children of Israel, and brought them word again. +\v 33 The thing pleased the children of Israel; and the children of Israel blessed God, and spoke no more of going up against them to war, to destroy the land in which the children of Reuben and the children of Gad lived. +\v 34 The children of Reuben and the children of Gad named the altar “A Witness Between Us that Yahweh is God.” +\c 23 +\p +\v 1 After many days, when Yahweh had given rest to Israel from their enemies all around, and Joshua was old and well advanced in years, +\v 2 Joshua called for all Israel, for their elders and for their heads, and for their judges and for their officers, and said to them, “I am old and well advanced in years. +\v 3 You have seen all that Yahweh your God has done to all these nations because of you; for it is Yahweh your God who has fought for you. +\v 4 Behold, I have allotted to you these nations that remain, to be an inheritance for your tribes, from the Jordan, with all the nations that I have cut off, even to the great sea toward the going down of the sun. +\v 5 Yahweh your God will thrust them out from before you, and drive them from out of your sight. You shall possess their land, as Yahweh your God spoke to you. +\p +\v 6 “Therefore be very courageous to keep and to do all that is written in the book of the law of Moses, that you not turn away from it to the right hand or to the left; +\v 7 that you not come among these nations, these that remain among you; neither make mention of the name of their gods, nor cause to swear by them, neither serve them, nor bow down yourselves to them; +\v 8 but hold fast to Yahweh your God, as you have done to this day. +\p +\v 9 “For Yahweh has driven great and strong nations out from before you. But as for you, no man has stood before you to this day. +\v 10 One man of you shall chase a thousand; for it is Yahweh your God who fights for you, as he spoke to you. +\v 11 Take good heed therefore to yourselves, that you love Yahweh your God. +\p +\v 12 “But if you do at all go back, and hold fast to the remnant of these nations, even these who remain among you, and make marriages with them, and go in to them, and they to you; +\v 13 know for a certainty that Yahweh your God will no longer drive these nations from out of your sight; but they shall be a snare and a trap to you, a scourge in your sides, and thorns in your eyes, until you perish from off this good land which Yahweh your God has given you. +\p +\v 14 “Behold, today I am going the way of all the earth. You know in all your hearts and in all your souls that not one thing has failed of all the good things which Yahweh your God spoke concerning you. All have happened to you. Not one thing has failed of it. +\v 15 It shall happen that as all the good things have come on you of which Yahweh your God spoke to you, so Yahweh will bring on you all the evil things, until he has destroyed you from off this good land which Yahweh your God has given you, +\v 16 when you disobey the covenant of Yahweh your God, which he commanded you, and go and serve other gods, and bow down yourselves to them. Then Yahweh’s anger will be kindled against you, and you will perish quickly from off the good land which he has given to you.” +\c 24 +\p +\v 1 Joshua gathered all the tribes of Israel to Shechem, and called for the elders of Israel, for their heads, for their judges, and for their officers; and they presented themselves before God. +\v 2 Joshua said to all the people, “Yahweh, the God of Israel, says, ‘Your fathers lived of old time beyond the River, even Terah, the father of Abraham, and the father of Nahor. They served other gods. +\v 3 I took your father Abraham from beyond the River, and led him throughout all the land of Canaan, and multiplied his offspring,\f + \fr 24:3 \ft or, seed\f* and gave him Isaac. +\v 4 I gave to Isaac Jacob and Esau: and I gave to Esau Mount Seir, to possess it. Jacob and his children went down into Egypt. +\p +\v 5 “‘I sent Moses and Aaron, and I plagued Egypt, according to that which I did among them: and afterward I brought you out. +\v 6 I brought your fathers out of Egypt: and you came to the sea. The Egyptians pursued your fathers with chariots and with horsemen to the Red Sea. +\v 7 When they cried out to Yahweh, he put darkness between you and the Egyptians, and brought the sea on them, and covered them; and your eyes saw what I did in Egypt. You lived in the wilderness many days. +\p +\v 8 “‘I brought you into the land of the Amorites, that lived beyond the Jordan. They fought with you, and I gave them into your hand. You possessed their land, and I destroyed them from before you. +\v 9 Then Balak the son of Zippor, king of Moab, arose and fought against Israel. He sent and called Balaam the son of Beor to curse you, +\v 10 but I would not listen to Balaam; therefore he blessed you still. So I delivered you out of his hand. +\p +\v 11 “‘You went over the Jordan, and came to Jericho. The men of Jericho fought against you, the Amorite, the Perizzite, the Canaanite, the Hittite, the Girgashite, the Hivite, and the Jebusite; and I delivered them into your hand. +\v 12 I sent the hornet before you, which drove them out from before you, even the two kings of the Amorites; not with your sword, nor with your bow. +\v 13 I gave you a land on which you had not labored, and cities which you didn’t build, and you live in them. You eat of vineyards and olive groves which you didn’t plant.’ +\p +\v 14 “Now therefore fear Yahweh, and serve him in sincerity and in truth. Put away the gods which your fathers served beyond the River, in Egypt; and serve Yahweh. +\v 15 If it seems evil to you to serve Yahweh, choose today whom you will serve; whether the gods which your fathers served that were beyond the River, or the gods of the Amorites, in whose land you dwell; but as for me and my house, we will serve Yahweh.” +\p +\v 16 The people answered, “Far be it from us that we should forsake Yahweh, to serve other gods; +\v 17 for it is Yahweh our God who brought us and our fathers up out of the land of Egypt, from the house of bondage, and who did those great signs in our sight, and preserved us in all the way in which we went, and among all the peoples through the middle of whom we passed. +\v 18 Yahweh drove out from before us all the peoples, even the Amorites who lived in the land. Therefore we also will serve Yahweh; for he is our God.” +\p +\v 19 Joshua said to the people, “You can’t serve Yahweh, for he is a holy God. He is a jealous God. He will not forgive your disobedience nor your sins. +\v 20 If you forsake Yahweh, and serve foreign gods, then he will turn and do you evil, and consume you, after he has done you good.” +\p +\v 21 The people said to Joshua, “No, but we will serve Yahweh.” +\v 22 Joshua said to the people, “You are witnesses against yourselves that you have chosen Yahweh yourselves, to serve him.” +\p They said, “We are witnesses.” +\p +\v 23 “Now therefore put away the foreign gods which are among you, and incline your heart to Yahweh, the God of Israel.” +\p +\v 24 The people said to Joshua, “We will serve Yahweh our God, and we will listen to his voice.” +\p +\v 25 So Joshua made a covenant with the people that day, and made for them a statute and an ordinance in Shechem. +\v 26 Joshua wrote these words in the book of the law of God; and he took a great stone, and set it up there under the oak that was by the sanctuary of Yahweh. +\v 27 Joshua said to all the people, “Behold, this stone shall be a witness against us, for it has heard all Yahweh’s words which he spoke to us. It shall be therefore a witness against you, lest you deny your God.” +\v 28 So Joshua sent the people away, each to his own inheritance. +\p +\v 29 After these things, Joshua the son of Nun, the servant of Yahweh, died, being one hundred ten years old. +\v 30 They buried him in the border of his inheritance in Timnathserah, which is in the hill country of Ephraim, on the north of the mountain of Gaash. +\v 31 Israel served Yahweh all the days of Joshua, and all the days of the elders who outlived Joshua, and had known all the work of Yahweh, that he had worked for Israel. +\v 32 They buried the bones of Joseph, which the children of Israel brought up out of Egypt, in Shechem, in the parcel of ground which Jacob bought from the sons of Hamor the father of Shechem for a hundred pieces of silver.\f + \fr 24:32 \ft Hebrew: kesitahs. A kesitah was a kind of silver coin.\f* They became the inheritance of the children of Joseph. +\v 33 Eleazar the son of Aaron died. They buried him in the hill of Phinehas his son, which was given him in the hill country of Ephraim. diff --git a/c-sharp/assets/WEB/07JDGengWEBUS.SFM b/c-sharp/assets/WEB/07JDGengWEBUS.SFM new file mode 100644 index 0000000000..9c698417dc --- /dev/null +++ b/c-sharp/assets/WEB/07JDGengWEBUS.SFM @@ -0,0 +1,1009 @@ +\id JDG World English Bible (WEB) +\ide UTF-8 +\h Judges +\toc1 The Book of Judges +\toc2 Judges +\toc3 Judges +\mt2 The Book of +\mt1 Judges +\c 1 +\p +\v 1 After the death of Joshua, the children of Israel asked of Yahweh,\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* saying, “Who should go up for us first against the Canaanites, to fight against them?” +\p +\v 2 Yahweh said, “Judah shall go up. Behold,\f + \fr 1:2 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I have delivered the land into his hand.” +\p +\v 3 Judah said to Simeon his brother, “Come up with me into my lot, that we may fight against the Canaanites; and I likewise will go with you into your lot.” So Simeon went with him. +\v 4 Judah went up, and Yahweh delivered the Canaanites and the Perizzites into their hand. They struck ten thousand men in Bezek. +\v 5 They found Adoni-Bezek in Bezek, and they fought against him. They struck the Canaanites and the Perizzites. +\v 6 But Adoni-Bezek fled. They pursued him, caught him, and cut off his thumbs and his big toes. +\v 7 Adoni-Bezek said, “Seventy kings, having their thumbs and their big toes cut off, scavenged under my table. As I have done, so God\f + \fr 1:7 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* has done to me.” They brought him to Jerusalem, and he died there. +\v 8 The children of Judah fought against Jerusalem, took it, struck it with the edge of the sword, and set the city on fire. +\p +\v 9 After that, the children of Judah went down to fight against the Canaanites who lived in the hill country, and in the South, and in the lowland. +\v 10 Judah went against the Canaanites who lived in Hebron. (The name of Hebron before that was Kiriath Arba.) They struck Sheshai, Ahiman, and Talmai. +\p +\v 11 From there he went against the inhabitants of Debir. (The name of Debir before that was Kiriath Sepher.) +\v 12 Caleb said, “I will give Achsah my daughter as wife to the man who strikes Kiriath Sepher, and takes it.” +\v 13 Othniel the son of Kenaz, Caleb’s younger brother, took it, so he gave him Achsah his daughter as his wife. +\p +\v 14 When she came, she got him to ask her father for a field. She got off her donkey; and Caleb said to her, “What would you like?” +\p +\v 15 She said to him, “Give me a blessing; because you have set me in the land of the South, give me also springs of water.” Then Caleb gave her the upper springs and the lower springs. +\v 16 The children of the Kenite, Moses’ brother-in-law, went up out of the city of palm trees with the children of Judah into the wilderness of Judah, which is in the south of Arad; and they went and lived with the people. +\v 17 Judah went with Simeon his brother, and they struck the Canaanites who inhabited Zephath, and utterly destroyed it. The name of the city was called Hormah. +\v 18 Also Judah took Gaza with its border, and Ashkelon with its border, and Ekron with its border. +\v 19 Yahweh was with Judah, and drove out the inhabitants of the hill country; for he could not drive out the inhabitants of the valley, because they had chariots of iron. +\v 20 They gave Hebron to Caleb, as Moses had said, and he drove the three sons of Anak out of there. +\v 21 The children of Benjamin didn’t drive out the Jebusites who inhabited Jerusalem, but the Jebusites dwell with the children of Benjamin in Jerusalem to this day. +\p +\v 22 The house of Joseph also went up against Bethel, and Yahweh was with them. +\v 23 The house of Joseph sent to spy out Bethel. (The name of the city before that was Luz.) +\v 24 The watchers saw a man come out of the city, and they said to him, “Please show us the entrance into the city, and we will deal kindly with you.” +\v 25 He showed them the entrance into the city, and they struck the city with the edge of the sword; but they let the man and all his family go. +\v 26 The man went into the land of the Hittites, built a city, and called its name Luz, which is its name to this day. +\p +\v 27 Manasseh didn’t drive out the inhabitants of Beth Shean and its towns, nor Taanach and its towns, nor the inhabitants of Dor and its towns, nor the inhabitants of Ibleam and its towns, nor the inhabitants of Megiddo and its towns; but the Canaanites would dwell in that land. +\v 28 When Israel had grown strong, they put the Canaanites to forced labor, and didn’t utterly drive them out. +\v 29 Ephraim didn’t drive out the Canaanites who lived in Gezer, but the Canaanites lived in Gezer among them. +\v 30 Zebulun didn’t drive out the inhabitants of Kitron, nor the inhabitants of Nahalol; but the Canaanites lived among them, and became subject to forced labor. +\v 31 Asher didn’t drive out the inhabitants of Acco, nor the inhabitants of Sidon, nor of Ahlab, nor of Achzib, nor of Helbah, nor of Aphik, nor of Rehob; +\v 32 but the Asherites lived among the Canaanites, the inhabitants of the land, for they didn’t drive them out. +\v 33 Naphtali didn’t drive out the inhabitants of Beth Shemesh, nor the inhabitants of Beth Anath; but he lived among the Canaanites, the inhabitants of the land. Nevertheless the inhabitants of Beth Shemesh and of Beth Anath became subject to forced labor. +\v 34 The Amorites forced the children of Dan into the hill country, for they would not allow them to come down to the valley; +\v 35 but the Amorites would dwell in Mount Heres, in Aijalon, and in Shaalbim. Yet the hand of the house of Joseph prevailed, so that they became subject to forced labor. +\v 36 The border of the Amorites was from the ascent of Akrabbim, from the rock, and upward. +\c 2 +\p +\v 1 Yahweh’s angel came up from Gilgal to Bochim. He said, “I brought you out of Egypt, and have brought you to the land which I swore to give your fathers. I said, ‘I will never break my covenant with you. +\v 2 You shall make no covenant with the inhabitants of this land. You shall break down their altars.’ But you have not listened to my voice. Why have you done this? +\v 3 Therefore I also said, ‘I will not drive them out from before you; but they shall be in your sides, and their gods will be a snare to you.’” +\p +\v 4 When Yahweh’s angel spoke these words to all the children of Israel, the people lifted up their voice and wept. +\v 5 They called the name of that place Bochim,\f + \fr 2:5 \ft “Bochim” means “weepers”.\f* and they sacrificed there to Yahweh. +\v 6 Now when Joshua had sent the people away, the children of Israel each went to his inheritance to possess the land. +\v 7 The people served Yahweh all the days of Joshua, and all the days of the elders who outlived Joshua, who had seen all the great work of Yahweh that he had worked for Israel. +\v 8 Joshua the son of Nun, the servant of Yahweh, died, being one hundred ten years old. +\v 9 They buried him in the border of his inheritance in Timnath Heres, in the hill country of Ephraim, on the north of the mountain of Gaash. +\v 10 After all that generation were gathered to their fathers, another generation arose after them who didn’t know Yahweh, nor the work which he had done for Israel. +\v 11 The children of Israel did that which was evil in Yahweh’s sight, and served the Baals. +\v 12 They abandoned Yahweh, the God of their fathers, who brought them out of the land of Egypt, and followed other gods, of the gods of the peoples who were around them, and bowed themselves down to them; and they provoked Yahweh to anger. +\v 13 They abandoned Yahweh, and served Baal and the Ashtaroth. +\v 14 Yahweh’s anger burned against Israel, and he delivered them into the hands of raiders who plundered them. He sold them into the hands of their enemies all around, so that they could no longer stand before their enemies. +\v 15 Wherever they went out, Yahweh’s hand was against them for evil, as Yahweh had spoken, and as Yahweh had sworn to them; and they were very distressed. +\v 16 Yahweh raised up judges, who saved them out of the hand of those who plundered them. +\v 17 Yet they didn’t listen to their judges; for they prostituted themselves to other gods, and bowed themselves down to them. They quickly turned away from the way in which their fathers walked, obeying Yahweh’s commandments. They didn’t do so. +\v 18 When Yahweh raised up judges for them, then Yahweh was with the judge, and saved them out of the hand of their enemies all the days of the judge; for it grieved Yahweh because of their groaning by reason of those who oppressed them and troubled them. +\v 19 But when the judge was dead, they turned back, and dealt more corruptly than their fathers in following other gods to serve them and to bow down to them. They didn’t cease what they were doing, or give up their stubborn ways. +\v 20 Yahweh’s anger burned against Israel; and he said, “Because this nation transgressed my covenant which I commanded their fathers, and has not listened to my voice, +\v 21 I also will no longer drive out any of the nations that Joshua left when he died from before them; +\v 22 that by them I may test Israel, to see if they will keep Yahweh’s way to walk therein, as their fathers kept it, or not.” +\v 23 So Yahweh left those nations, without driving them out hastily. He didn’t deliver them into Joshua’s hand. +\c 3 +\p +\v 1 Now these are the nations which Yahweh left, to test Israel by them, even as many as had not known all the wars of Canaan; +\v 2 only that the generations of the children of Israel might know, to teach them war, at least those who knew nothing of it before: +\v 3 the five lords of the Philistines, all the Canaanites, the Sidonians, and the Hivites who lived on Mount Lebanon, from Mount Baal Hermon to the entrance of Hamath. +\v 4 They were left to test Israel by them, to know whether they would listen to Yahweh’s commandments, which he commanded their fathers by Moses. +\v 5 The children of Israel lived among the Canaanites, the Hittites, the Amorites, the Perizzites, the Hivites, and the Jebusites. +\v 6 They took their daughters to be their wives, and gave their own daughters to their sons and served their gods. +\v 7 The children of Israel did that which was evil in Yahweh’s sight, and forgot Yahweh their God, and served the Baals and the Asheroth. +\v 8 Therefore Yahweh’s anger burned against Israel, and he sold them into the hand of Cushan Rishathaim king of Mesopotamia; and the children of Israel served Cushan Rishathaim eight years. +\v 9 When the children of Israel cried to Yahweh, Yahweh raised up a savior to the children of Israel, who saved them, even Othniel the son of Kenaz, Caleb’s younger brother. +\v 10 Yahweh’s Spirit came on him, and he judged Israel; and he went out to war, and Yahweh delivered Cushan Rishathaim king of Mesopotamia into his hand. His hand prevailed against Cushan Rishathaim. +\v 11 The land had rest forty years, then Othniel the son of Kenaz died. +\p +\v 12 The children of Israel again did that which was evil in Yahweh’s sight, and Yahweh strengthened Eglon the king of Moab against Israel, because they had done that which was evil in Yahweh’s sight. +\v 13 He gathered the children of Ammon and Amalek to himself; and he went and struck Israel, and they possessed the city of palm trees. +\v 14 The children of Israel served Eglon the king of Moab eighteen years. +\v 15 But when the children of Israel cried to Yahweh, Yahweh raised up a savior for them: Ehud the son of Gera, the Benjamite, a left-handed man. The children of Israel sent tribute by him to Eglon the king of Moab. +\v 16 Ehud made himself a sword which had two edges, a cubit\f + \fr 3:16 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* in length; and he wore it under his clothing on his right thigh. +\v 17 He offered the tribute to Eglon king of Moab. Now Eglon was a very fat man. +\v 18 When Ehud had finished offering the tribute, he sent away the people who carried the tribute. +\v 19 But he himself turned back from the stone idols that were by Gilgal, and said, “I have a secret message for you, O king.” +\p The king said, “Keep silence!” All who stood by him left him. +\p +\v 20 Ehud came to him; and he was sitting by himself alone in the cool upper room. Ehud said, “I have a message from God to you.” He arose out of his seat. +\v 21 Ehud put out his left hand, and took the sword from his right thigh, and thrust it into his body. +\v 22 The handle also went in after the blade; and the fat closed on the blade, for he didn’t draw the sword out of his body; and it came out behind. +\v 23 Then Ehud went out onto the porch, and shut the doors of the upper room on him, and locked them. +\p +\v 24 After he had gone, his servants came and saw that the doors of the upper room were locked. They said, “Surely he is covering his feet\f + \fr 3:24 \ft or, “relieving himself”.\f* in the upper room.” +\v 25 They waited until they were ashamed; and behold, he didn’t open the doors of the upper room. Therefore they took the key and opened them, and behold, their lord had fallen down dead on the floor. +\p +\v 26 Ehud escaped while they waited, passed beyond the stone idols, and escaped to Seirah. +\v 27 When he had come, he blew a trumpet in the hill country of Ephraim; and the children of Israel went down with him from the hill country, and he led them. +\p +\v 28 He said to them, “Follow me; for Yahweh has delivered your enemies the Moabites into your hand.” They followed him, and took the fords of the Jordan against the Moabites, and didn’t allow any man to pass over. +\v 29 They struck at that time about ten thousand men of Moab, every strong man and every man of valor. No man escaped. +\v 30 So Moab was subdued that day under the hand of Israel. Then the land had rest eighty years. +\p +\v 31 After him was Shamgar the son of Anath, who struck six hundred men of the Philistines with an ox goad. He also saved Israel. +\c 4 +\p +\v 1 The children of Israel again did that which was evil in Yahweh’s sight, when Ehud was dead. +\v 2 Yahweh sold them into the hand of Jabin king of Canaan, who reigned in Hazor; the captain of whose army was Sisera, who lived in Harosheth of the Gentiles. +\v 3 The children of Israel cried to Yahweh, for he had nine hundred chariots of iron; and he mightily oppressed the children of Israel for twenty years. +\v 4 Now Deborah, a prophetess, the wife of Lappidoth, judged Israel at that time. +\v 5 She lived under Deborah’s palm tree between Ramah and Bethel in the hill country of Ephraim; and the children of Israel came up to her for judgment. +\v 6 She sent and called Barak the son of Abinoam out of Kedesh Naphtali, and said to him, “Hasn’t Yahweh, the God of Israel, commanded, ‘Go and lead the way to Mount Tabor, and take with you ten thousand men of the children of Naphtali and of the children of Zebulun? +\v 7 I will draw to you, to the river Kishon, Sisera, the captain of Jabin’s army, with his chariots and his multitude; and I will deliver him into your hand.’” +\p +\v 8 Barak said to her, “If you will go with me, then I will go; but if you will not go with me, I will not go.” +\p +\v 9 She said, “I will surely go with you. Nevertheless, the journey that you take won’t be for your honor; for Yahweh will sell Sisera into a woman’s hand.” Deborah arose, and went with Barak to Kedesh. +\p +\v 10 Barak called Zebulun and Naphtali together to Kedesh. Ten thousand men followed him; and Deborah went up with him. +\v 11 Now Heber the Kenite had separated himself from the Kenites, even from the children of Hobab, Moses’ brother-in-law, and had pitched his tent as far as the oak in Zaanannim, which is by Kedesh. +\v 12 They told Sisera that Barak the son of Abinoam had gone up to Mount Tabor. +\v 13 Sisera gathered together all his chariots, even nine hundred chariots of iron, and all the people who were with him, from Harosheth of the Gentiles, to the river Kishon. +\p +\v 14 Deborah said to Barak, “Go; for this is the day in which Yahweh has delivered Sisera into your hand. Hasn’t Yahweh gone out before you?” So Barak went down from Mount Tabor, and ten thousand men after him. +\v 15 Yahweh confused Sisera, all his chariots, and all his army, with the edge of the sword before Barak. Sisera abandoned his chariot and fled away on his feet. +\v 16 But Barak pursued the chariots and the army to Harosheth of the Gentiles; and all the army of Sisera fell by the edge of the sword. There was not a man left. +\p +\v 17 However Sisera fled away on his feet to the tent of Jael the wife of Heber the Kenite; for there was peace between Jabin the king of Hazor and the house of Heber the Kenite. +\v 18 Jael went out to meet Sisera, and said to him, “Turn in, my lord, turn in to me; don’t be afraid.” He came in to her into the tent, and she covered him with a rug. +\p +\v 19 He said to her, “Please give me a little water to drink; for I am thirsty.” +\p She opened a container of milk, and gave him a drink, and covered him. +\p +\v 20 He said to her, “Stand in the door of the tent, and if any man comes and inquires of you, and says, ‘Is there any man here?’ you shall say, ‘No.’” +\p +\v 21 Then Jael, Heber’s wife, took a tent peg, and took a hammer in her hand, and went softly to him, and struck the pin into his temples, and it pierced through into the ground, for he was in a deep sleep; so he fainted and died. +\v 22 Behold, as Barak pursued Sisera, Jael came out to meet him, and said to him, “Come, and I will show you the man whom you seek.” He came to her; and behold, Sisera lay dead, and the tent peg was in his temples. +\v 23 So God subdued Jabin the king of Canaan before the children of Israel on that day. +\v 24 The hand of the children of Israel prevailed more and more against Jabin the king of Canaan, until they had destroyed Jabin king of Canaan. +\c 5 +\p +\v 1 Then Deborah and Barak the son of Abinoam sang on that day, saying, +\q1 +\v 2 “Because the leaders took the lead in Israel, +\q2 because the people offered themselves willingly, +\q1 be blessed, Yahweh! +\b +\q1 +\v 3 “Hear, you kings! +\q2 Give ear, you princes! +\q1 I, even I, will sing to Yahweh. +\q2 I will sing praise to Yahweh, the God of Israel. +\b +\q1 +\v 4 “Yahweh, when you went out of Seir, +\q2 when you marched out of the field of Edom, +\q1 the earth trembled, the sky also dropped. +\q2 Yes, the clouds dropped water. +\q1 +\v 5 The mountains quaked at Yahweh’s presence, +\q2 even Sinai at the presence of Yahweh, the God of Israel. +\b +\q1 +\v 6 “In the days of Shamgar the son of Anath, +\q2 in the days of Jael, the highways were unoccupied. +\q2 The travelers walked through byways. +\q1 +\v 7 The rulers ceased in Israel. +\q2 They ceased until I, Deborah, arose; +\q2 Until I arose a mother in Israel. +\q1 +\v 8 They chose new gods. +\q2 Then war was in the gates. +\q2 Was there a shield or spear seen among forty thousand in Israel? +\q1 +\v 9 My heart is toward the governors of Israel, +\q2 who offered themselves willingly among the people. +\q2 Bless Yahweh! +\b +\q1 +\v 10 “Speak, you who ride on white donkeys, +\q2 you who sit on rich carpets, +\q2 and you who walk by the way. +\q1 +\v 11 Far from the noise of archers, in the places of drawing water, +\q2 there they will rehearse Yahweh’s righteous acts, +\q2 the righteous acts of his rule in Israel. +\b +\q1 “Then Yahweh’s people went down to the gates. +\q2 +\v 12 ‘Awake, awake, Deborah! +\q2 Awake, awake, utter a song! +\q2 Arise, Barak, and lead away your captives, you son of Abinoam.’ +\b +\q1 +\v 13 “Then a remnant of the nobles and the people came down. +\q2 Yahweh came down for me against the mighty. +\q1 +\v 14 Those whose root is in Amalek came out of Ephraim, +\q2 after you, Benjamin, among your peoples. +\q1 Governors come down out of Machir. +\q2 Those who handle the marshal’s staff came out of Zebulun. +\q1 +\v 15 The princes of Issachar were with Deborah. +\q2 As was Issachar, so was Barak. +\q2 They rushed into the valley at his feet. +\q1 By the watercourses of Reuben, +\q2 there were great resolves of heart. +\q1 +\v 16 Why did you sit among the sheepfolds? +\q2 To hear the whistling for the flocks? +\q1 At the watercourses of Reuben, +\q2 there were great searchings of heart. +\q1 +\v 17 Gilead lived beyond the Jordan. +\q2 Why did Dan remain in ships? +\q2 Asher sat still at the haven of the sea, +\q2 and lived by his creeks. +\q1 +\v 18 Zebulun was a people that jeopardized their lives to the death; +\q2 Naphtali also, on the high places of the field. +\b +\q1 +\v 19 “The kings came and fought, +\q2 then the kings of Canaan fought at Taanach by the waters of Megiddo. +\q2 They took no plunder of silver. +\q1 +\v 20 From the sky the stars fought. +\q2 From their courses, they fought against Sisera. +\q1 +\v 21 The river Kishon swept them away, +\q2 that ancient river, the river Kishon. +\q2 My soul, march on with strength. +\q1 +\v 22 Then the horse hoofs stamped because of the prancing, +\q2 the prancing of their strong ones. +\q1 +\v 23 ‘Curse Meroz,’ said Yahweh’s angel. +\q2 ‘Curse bitterly its inhabitants, +\q2 because they didn’t come to help Yahweh, +\q2 to help Yahweh against the mighty.’ +\b +\q1 +\v 24 “Jael shall be blessed above women, +\q2 the wife of Heber the Kenite; +\q2 blessed shall she be above women in the tent. +\q1 +\v 25 He asked for water. +\q2 She gave him milk. +\q2 She brought him butter in a lordly dish. +\q1 +\v 26 She put her hand to the tent peg, +\q2 and her right hand to the workmen’s hammer. +\q1 With the hammer she struck Sisera. +\q2 She struck through his head. +\q2 Yes, she pierced and struck through his temples. +\q1 +\v 27 At her feet he bowed, he fell, he lay. +\q2 At her feet he bowed, he fell. +\q2 Where he bowed, there he fell down dead. +\b +\q1 +\v 28 “Through the window she looked out, and cried: +\q2 Sisera’s mother looked through the lattice. +\q1 ‘Why is his chariot so long in coming? +\q2 Why do the wheels of his chariots wait?’ +\q1 +\v 29 Her wise ladies answered her, +\q2 Yes, she returned answer to herself, +\q1 +\v 30 ‘Have they not found, have they not divided the plunder? +\q2 A lady, two ladies to every man; +\q1 to Sisera a plunder of dyed garments, +\q2 a plunder of dyed garments embroidered, +\q2 of dyed garments embroidered on both sides, on the necks of the plunder?’ +\b +\q1 +\v 31 “So let all your enemies perish, Yahweh, +\q2 but let those who love him be as the sun when it rises in its strength.” +\b +\p Then the land had rest forty years. +\c 6 +\p +\v 1 The children of Israel did that which was evil in Yahweh’s sight, so Yahweh delivered them into the hand of Midian seven years. +\v 2 The hand of Midian prevailed against Israel; and because of Midian the children of Israel made themselves the dens which are in the mountains, the caves, and the strongholds. +\v 3 So it was, when Israel had sown, that the Midianites, the Amalekites, and the children of the east came up against them. +\v 4 They encamped against them, and destroyed the increase of the earth, until you come to Gaza. They left no sustenance in Israel, and no sheep, ox, or donkey. +\v 5 For they came up with their livestock and their tents. They came in as locusts for multitude. Both they and their camels were without number; and they came into the land to destroy it. +\v 6 Israel was brought very low because of Midian; and the children of Israel cried to Yahweh. +\p +\v 7 When the children of Israel cried to Yahweh because of Midian, +\v 8 Yahweh sent a prophet to the children of Israel; and he said to them, “Yahweh, the God of Israel, says, ‘I brought you up from Egypt, and brought you out of the house of bondage. +\v 9 I delivered you out of the hand of the Egyptians and out of the hand of all who oppressed you, and drove them out from before you, and gave you their land. +\v 10 I said to you, “I am Yahweh your God. You shall not fear the gods of the Amorites, in whose land you dwell.” But you have not listened to my voice.’” +\p +\v 11 Yahweh’s angel came and sat under the oak which was in Ophrah, that belonged to Joash the Abiezrite. His son Gideon was beating out wheat in the wine press, to hide it from the Midianites. +\v 12 Yahweh’s angel appeared to him, and said to him, “Yahweh is with you, you mighty man of valor!” +\p +\v 13 Gideon said to him, “Oh, my lord, if Yahweh is with us, why then has all this happened to us? Where are all his wondrous works which our fathers told us of, saying, ‘Didn’t Yahweh bring us up from Egypt?’ But now Yahweh has cast us off, and delivered us into the hand of Midian.” +\p +\v 14 Yahweh looked at him, and said, “Go in this your might, and save Israel from the hand of Midian. Haven’t I sent you?” +\p +\v 15 He said to him, “O Lord,\f + \fr 6:15 \ft The word translated “Lord” is “Adonai.”\f* how shall I save Israel? Behold, my family is the poorest in Manasseh, and I am the least in my father’s house.” +\p +\v 16 Yahweh said to him, “Surely I will be with you, and you shall strike the Midianites as one man.” +\p +\v 17 He said to him, “If now I have found favor in your sight, then show me a sign that it is you who talk with me. +\v 18 Please don’t go away until I come to you, and bring out my present, and lay it before you.” +\p He said, “I will wait until you come back.” +\p +\v 19 Gideon went in and prepared a young goat and unleavened cakes of an ephah\f + \fr 6:19 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of meal. He put the meat in a basket and he put the broth in a pot, and brought it out to him under the oak, and presented it. +\p +\v 20 The angel of God said to him, “Take the meat and the unleavened cakes, and lay them on this rock, and pour out the broth.” +\p He did so. +\v 21 Then Yahweh’s angel stretched out the end of the staff that was in his hand, and touched the meat and the unleavened cakes; and fire went up out of the rock and consumed the meat and the unleavened cakes. Then Yahweh’s angel departed out of his sight. +\p +\v 22 Gideon saw that he was Yahweh’s angel; and Gideon said, “Alas, Lord Yahweh! Because I have seen Yahweh’s angel face to face!” +\p +\v 23 Yahweh said to him, “Peace be to you! Don’t be afraid. You shall not die.” +\p +\v 24 Then Gideon built an altar there to Yahweh, and called it “Yahweh is Peace.”\f + \fr 6:24 \ft or, Yahweh Shalom\f* To this day it is still in Ophrah of the Abiezrites. +\p +\v 25 That same night, Yahweh said to him, “Take your father’s bull, even the second bull seven years old, and throw down the altar of Baal that your father has, and cut down the Asherah that is by it. +\v 26 Then build an altar to Yahweh your God on the top of this stronghold, in an orderly way, and take the second bull, and offer a burnt offering with the wood of the Asherah which you shall cut down.” +\p +\v 27 Then Gideon took ten men of his servants, and did as Yahweh had spoken to him. Because he feared his father’s household and the men of the city, he could not do it by day, but he did it by night. +\p +\v 28 When the men of the city arose early in the morning, behold, the altar of Baal was broken down, and the Asherah was cut down that was by it, and the second bull was offered on the altar that was built. +\v 29 They said to one another, “Who has done this thing?” +\p When they inquired and asked, they said, “Gideon the son of Joash has done this thing.” +\p +\v 30 Then the men of the city said to Joash, “Bring out your son, that he may die, because he has broken down the altar of Baal, and because he has cut down the Asherah that was by it.” +\v 31 Joash said to all who stood against him, “Will you contend for Baal? Or will you save him? He who will contend for him, let him be put to death by morning! If he is a god, let him contend for himself, because someone has broken down his altar!” +\v 32 Therefore on that day he named him Jerub-Baal,\f + \fr 6:32 \ft “Jerub-Baal” means “Let Baal contend”.\f* saying, “Let Baal contend against him, because he has broken down his altar.” +\p +\v 33 Then all the Midianites and the Amalekites and the children of the east assembled themselves together; and they passed over, and encamped in the valley of Jezreel. +\v 34 But Yahweh’s Spirit came on Gideon, and he blew a trumpet; and Abiezer was gathered together to follow him. +\v 35 He sent messengers throughout all Manasseh, and they also were gathered together to follow him. He sent messengers to Asher, to Zebulun, and to Naphtali; and they came up to meet them. +\p +\v 36 Gideon said to God, “If you will save Israel by my hand, as you have spoken, +\v 37 behold, I will put a fleece of wool on the threshing floor. If there is dew on the fleece only, and it is dry on all the ground, then I’ll know that you will save Israel by my hand, as you have spoken.” +\p +\v 38 It was so; for he rose up early on the next day, and pressed the fleece together, and wrung the dew out of the fleece, a bowl full of water. +\p +\v 39 Gideon said to God, “Don’t let your anger be kindled against me, and I will speak but this once. Please let me make a trial just this once with the fleece. Let it now be dry only on the fleece, and on all the ground let there be dew.” +\p +\v 40 God did so that night; for it was dry on the fleece only, and there was dew on all the ground. +\c 7 +\p +\v 1 Then Jerubbaal, who is Gideon, and all the people who were with him, rose up early and encamped beside the spring of Harod. Midian’s camp was on the north side of them, by the hill of Moreh, in the valley. +\v 2 Yahweh said to Gideon, “The people who are with you are too many for me to give the Midianites into their hand, lest Israel brag against me, saying, ‘My own hand has saved me.’ +\v 3 Now therefore proclaim in the ears of the people, saying, ‘Whoever is fearful and trembling, let him return and depart from Mount Gilead.’” So twenty-two thousand of the people returned, and ten thousand remained. +\p +\v 4 Yahweh said to Gideon, “There are still too many people. Bring them down to the water, and I will test them for you there. It shall be, that those whom I tell you, ‘This shall go with you,’ shall go with you; and whoever I tell you, ‘This shall not go with you,’ shall not go.” +\v 5 So he brought down the people to the water; and Yahweh said to Gideon, “Everyone who laps of the water with his tongue, like a dog laps, you shall set him by himself; likewise everyone who bows down on his knees to drink.” +\v 6 The number of those who lapped, putting their hand to their mouth, was three hundred men; but all the rest of the people bowed down on their knees to drink water. +\v 7 Yahweh said to Gideon, “I will save you by the three hundred men who lapped, and deliver the Midianites into your hand. Let all the other people go, each to his own place.” +\p +\v 8 So the people took food in their hand, and their trumpets; and he sent all the rest of the men of Israel to their own tents, but retained the three hundred men; and the camp of Midian was beneath him in the valley. +\v 9 That same night, Yahweh said to him, “Arise, go down into the camp, for I have delivered it into your hand. +\v 10 But if you are afraid to go down, go with Purah your servant down to the camp. +\v 11 You will hear what they say; and afterward your hands will be strengthened to go down into the camp.” Then went he down with Purah his servant to the outermost part of the armed men who were in the camp. +\p +\v 12 The Midianites and the Amalekites and all the children of the east lay along in the valley like locusts for multitude; and their camels were without number, as the sand which is on the seashore for multitude. +\p +\v 13 When Gideon had come, behold, there was a man telling a dream to his fellow. He said, “Behold, I dreamed a dream; and behold, a cake of barley bread tumbled into the camp of Midian, came to the tent, and struck it so that it fell, and turned it upside down, so that the tent lay flat.” +\p +\v 14 His fellow answered, “This is nothing other than the sword of Gideon the son of Joash, a man of Israel. God has delivered Midian into his hand, with all the army.” +\p +\v 15 It was so, when Gideon heard the telling of the dream and its interpretation, that he worshiped. Then he returned into the camp of Israel and said, “Arise, for Yahweh has delivered the army of Midian into your hand!” +\p +\v 16 He divided the three hundred men into three companies, and he put into the hands of all of them trumpets and empty pitchers, with torches within the pitchers. +\p +\v 17 He said to them, “Watch me, and do likewise. Behold, when I come to the outermost part of the camp, it shall be that, as I do, so you shall do. +\v 18 When I blow the trumpet, I and all who are with me, then blow the trumpets also on every side of all the camp, and shout, ‘For Yahweh and for Gideon!’” +\p +\v 19 So Gideon and the hundred men who were with him came to the outermost part of the camp in the beginning of the middle watch, when they had but newly set the watch. Then they blew the trumpets and broke in pieces the pitchers that were in their hands. +\v 20 The three companies blew the trumpets, broke the pitchers, and held the torches in their left hands and the trumpets in their right hands with which to blow; and they shouted, “The sword of Yahweh and of Gideon!” +\v 21 They each stood in his place around the camp, and all the army ran; and they shouted, and put them to flight. +\v 22 They blew the three hundred trumpets, and Yahweh set every man’s sword against his fellow and against all the army; and the army fled as far as Beth Shittah toward Zererah, as far as the border of Abel Meholah, by Tabbath. +\v 23 The men of Israel were gathered together out of Naphtali, out of Asher, and out of all Manasseh, and pursued Midian. +\v 24 Gideon sent messengers throughout all the hill country of Ephraim, saying, “Come down against Midian and take the waters before them as far as Beth Barah, even the Jordan!” So all the men of Ephraim were gathered together and took the waters as far as Beth Barah, even the Jordan. +\v 25 They took the two princes of Midian, Oreb and Zeeb. They killed Oreb at Oreb’s rock, and Zeeb they killed at Zeeb’s wine press, as they pursued Midian. Then they brought the heads of Oreb and Zeeb to Gideon beyond the Jordan. +\c 8 +\p +\v 1 The men of Ephraim said to him, “Why have you treated us this way, that you didn’t call us when you went to fight with Midian?” They rebuked him sharply. +\v 2 He said to them, “What have I now done in comparison with you? Isn’t the gleaning of the grapes of Ephraim better than the vintage of Abiezer? +\v 3 God has delivered into your hand the princes of Midian, Oreb and Zeeb! What was I able to do in comparison with you?” Then their anger was abated toward him when he had said that. +\p +\v 4 Gideon came to the Jordan and passed over, he and the three hundred men who were with him, faint, yet pursuing. +\v 5 He said to the men of Succoth, “Please give loaves of bread to the people who follow me; for they are faint, and I am pursuing after Zebah and Zalmunna, the kings of Midian.” +\p +\v 6 The princes of Succoth said, “Are the hands of Zebah and Zalmunna now in your hand, that we should give bread to your army?” +\p +\v 7 Gideon said, “Therefore when Yahweh has delivered Zebah and Zalmunna into my hand, then I will tear your flesh with the thorns of the wilderness and with briers.” +\p +\v 8 He went up there to Penuel, and spoke to them in the same way; and the men of Penuel answered him as the men of Succoth had answered. +\v 9 He spoke also to the men of Penuel, saying, “When I come again in peace, I will break down this tower.” +\p +\v 10 Now Zebah and Zalmunna were in Karkor, and their armies with them, about fifteen thousand men, all who were left of all the army of the children of the east; for there fell one hundred twenty thousand men who drew sword. +\v 11 Gideon went up by the way of those who lived in tents on the east of Nobah and Jogbehah, and struck the army; for the army felt secure. +\v 12 Zebah and Zalmunna fled and he pursued them. He took the two kings of Midian, Zebah and Zalmunna, and confused all the army. +\v 13 Gideon the son of Joash returned from the battle from the ascent of Heres. +\v 14 He caught a young man of the men of Succoth, and inquired of him; and he described for him the princes of Succoth, and its elders, seventy-seven men. +\v 15 He came to the men of Succoth, and said, “See Zebah and Zalmunna, concerning whom you taunted me, saying, ‘Are the hands of Zebah and Zalmunna now in your hand, that we should give bread to your men who are weary?’” +\v 16 He took the elders of the city, and thorns of the wilderness and briers, and with them he taught the men of Succoth. +\v 17 He broke down the tower of Penuel, and killed the men of the city. +\p +\v 18 Then he said to Zebah and Zalmunna, “What kind of men were they whom you killed at Tabor?” +\p They answered, “They were like you. They all resembled the children of a king.” +\p +\v 19 He said, “They were my brothers, the sons of my mother. As Yahweh lives, if you had saved them alive, I would not kill you.” +\p +\v 20 He said to Jether his firstborn, “Get up and kill them!” But the youth didn’t draw his sword; for he was afraid, because he was yet a youth. +\p +\v 21 Then Zebah and Zalmunna said, “You rise and fall on us; for as the man is, so is his strength.” Gideon arose, and killed Zebah and Zalmunna, and took the crescents that were on their camels’ necks. +\p +\v 22 Then the men of Israel said to Gideon, “Rule over us, both you, your son, and your son’s son also; for you have saved us out of the hand of Midian.” +\p +\v 23 Gideon said to them, “I will not rule over you, neither shall my son rule over you. Yahweh shall rule over you.” +\v 24 Gideon said to them, “I do have a request: that you would each give me the earrings of his plunder.” (For they had golden earrings, because they were Ishmaelites.) +\p +\v 25 They answered, “We will willingly give them.” They spread a garment, and every man threw the earrings of his plunder into it. +\v 26 The weight of the golden earrings that he requested was one thousand and seven hundred shekels\f + \fr 8:26 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 1700 shekels is about 17 kilograms or 37.4 pounds.\f* of gold, in addition to the crescents, and the pendants, and the purple clothing that was on the kings of Midian, and in addition to the chains that were about their camels’ necks. +\v 27 Gideon made an ephod out of it, and put it in Ophrah, his city. Then all Israel played the prostitute with it there; and it became a snare to Gideon and to his house. +\v 28 So Midian was subdued before the children of Israel, and they lifted up their heads no more. The land had rest forty years in the days of Gideon. +\p +\v 29 Jerubbaal the son of Joash went and lived in his own house. +\v 30 Gideon had seventy sons conceived from his body, for he had many wives. +\v 31 His concubine who was in Shechem also bore him a son, and he named him Abimelech. +\v 32 Gideon the son of Joash died in a good old age, and was buried in the tomb of Joash his father, in Ophrah of the Abiezrites. +\p +\v 33 As soon as Gideon was dead, the children of Israel turned again and played the prostitute following the Baals, and made Baal Berith their god. +\v 34 The children of Israel didn’t remember Yahweh their God, who had delivered them out of the hand of all their enemies on every side; +\v 35 neither did they show kindness to the house of Jerubbaal, that is, Gideon, according to all the goodness which he had shown to Israel. +\c 9 +\p +\v 1 Abimelech the son of Jerubbaal went to Shechem to his mother’s brothers, and spoke with them and with all the family of the house of his mother’s father, saying, +\v 2 “Please speak in the ears of all the men of Shechem, ‘Is it better for you that all the sons of Jerubbaal, who are seventy persons, rule over you, or that one rule over you?’ Remember also that I am your bone and your flesh.” +\p +\v 3 His mother’s brothers spoke of him in the ears of all the men of Shechem all these words. Their hearts inclined to follow Abimelech; for they said, “He is our brother.” +\v 4 They gave him seventy pieces of silver out of the house of Baal Berith, with which Abimelech hired vain and reckless fellows who followed him. +\v 5 He went to his father’s house at Ophrah, and killed his brothers the sons of Jerubbaal, being seventy persons, on one stone; but Jotham the youngest son of Jerubbaal was left, for he hid himself. +\v 6 All the men of Shechem assembled themselves together with all the house of Millo, and went and made Abimelech king by the oak of the pillar that was in Shechem. +\v 7 When they told it to Jotham, he went and stood on the top of Mount Gerizim and lifted up his voice, cried out, and said to them, “Listen to me, you men of Shechem, that God may listen to you. +\v 8 The trees set out to anoint a king over themselves. They said to the olive tree, ‘Reign over us.’ +\p +\v 9 “But the olive tree said to them, ‘Should I stop producing my oil, with which they honor God and man by me, and go to wave back and forth over the trees?’ +\p +\v 10 “The trees said to the fig tree, ‘Come and reign over us.’ +\p +\v 11 “But the fig tree said to them, ‘Should I leave my sweetness, and my good fruit, and go to wave back and forth over the trees?’ +\p +\v 12 “The trees said to the vine, ‘Come and reign over us.’ +\p +\v 13 “The vine said to them, ‘Should I leave my new wine, which cheers God and man, and go to wave back and forth over the trees?’ +\p +\v 14 “Then all the trees said to the bramble, ‘Come and reign over us.’ +\p +\v 15 “The bramble said to the trees, ‘If in truth you anoint me king over you, then come and take refuge in my shade; and if not, let fire come out of the bramble, and devour the cedars of Lebanon.’ +\p +\v 16 “Now therefore, if you have dealt truly and righteously, in that you have made Abimelech king, and if you have dealt well with Jerubbaal and his house, and have done to him according to the deserving of his hands +\v 17 (for my father fought for you, risked his life, and delivered you out of the hand of Midian; +\v 18 and you have risen up against my father’s house today and have slain his sons, seventy persons, on one stone, and have made Abimelech, the son of his female servant, king over the men of Shechem, because he is your brother); +\v 19 if you then have dealt truly and righteously with Jerubbaal and with his house today, then rejoice in Abimelech, and let him also rejoice in you; +\v 20 but if not, let fire come out from Abimelech and devour the men of Shechem and the house of Millo; and let fire come out from the men of Shechem and from the house of Millo and devour Abimelech.” +\p +\v 21 Jotham ran away and fled, and went to Beer\f + \fr 9:21 \ft “Beer” is Hebrew for “well”, i.e., a village named for its well.\f* and lived there, for fear of Abimelech his brother. +\p +\v 22 Abimelech was prince over Israel three years. +\v 23 Then God sent an evil spirit between Abimelech and the men of Shechem; and the men of Shechem dealt treacherously with Abimelech, +\v 24 that the violence done to the seventy sons of Jerubbaal might come, and that their blood might be laid on Abimelech their brother who killed them, and on the men of Shechem who strengthened his hands to kill his brothers. +\v 25 The men of Shechem set an ambush for him on the tops of the mountains, and they robbed all who came along that way by them; and Abimelech was told about it. +\p +\v 26 Gaal the son of Ebed came with his brothers and went over to Shechem; and the men of Shechem put their trust in him. +\v 27 They went out into the field, harvested their vineyards, trod the grapes, celebrated, and went into the house of their god and ate and drank, and cursed Abimelech. +\v 28 Gaal the son of Ebed said, “Who is Abimelech, and who is Shechem, that we should serve him? Isn’t he the son of Jerubbaal? Isn’t Zebul his officer? Serve the men of Hamor the father of Shechem, but why should we serve him? +\v 29 I wish that this people were under my hand! Then I would remove Abimelech.” He said to Abimelech, “Increase your army and come out!” +\p +\v 30 When Zebul the ruler of the city heard the words of Gaal the son of Ebed, his anger burned. +\v 31 He sent messengers to Abimelech craftily, saying, “Behold, Gaal the son of Ebed and his brothers have come to Shechem; and behold, they incite the city against you. +\v 32 Now therefore, go up by night, you and the people who are with you, and lie in wait in the field. +\v 33 It shall be that in the morning, as soon as the sun is up, you shall rise early and rush on the city. Behold, when he and the people who are with him come out against you, then may you do to them as you shall find occasion.” +\p +\v 34 Abimelech rose up, and all the people who were with him, by night, and they laid wait against Shechem in four companies. +\v 35 Gaal the son of Ebed went out, and stood in the entrance of the gate of the city. Abimelech rose up, and the people who were with him, from the ambush. +\p +\v 36 When Gaal saw the people, he said to Zebul, “Behold, people are coming down from the tops of the mountains.” +\p Zebul said to him, “You see the shadows of the mountains as if they were men.” +\p +\v 37 Gaal spoke again and said, “Behold, people are coming down by the middle of the land, and one company comes by the way of the oak of Meonenim.” +\p +\v 38 Then Zebul said to him, “Now where is your mouth, that you said, ‘Who is Abimelech, that we should serve him?’ Isn’t this the people that you have despised? Please go out now and fight with them.” +\p +\v 39 Gaal went out before the men of Shechem, and fought with Abimelech. +\v 40 Abimelech chased him, and he fled before him, and many fell wounded, even to the entrance of the gate. +\v 41 Abimelech lived at Arumah; and Zebul drove out Gaal and his brothers, that they should not dwell in Shechem. +\v 42 On the next day, the people went out into the field; and they told Abimelech. +\v 43 He took the people and divided them into three companies, and laid wait in the field; and he looked, and behold, the people came out of the city. So, he rose up against them and struck them. +\v 44 Abimelech and the companies that were with him rushed forward and stood in the entrance of the gate of the city; and the two companies rushed on all who were in the field and struck them. +\v 45 Abimelech fought against the city all that day; and he took the city and killed the people in it. He beat down the city and sowed it with salt. +\p +\v 46 When all the men of the tower of Shechem heard of it, they entered into the stronghold of the house of Elberith. +\v 47 Abimelech was told that all the men of the tower of Shechem were gathered together. +\v 48 Abimelech went up to Mount Zalmon, he and all the people who were with him; and Abimelech took an ax in his hand, and cut down a bough from the trees, and took it up, and laid it on his shoulder. Then he said to the people who were with him, “What you have seen me do, make haste, and do as I have done!” +\v 49 All the people likewise each cut down his bough, followed Abimelech, and put them at the base of the stronghold, and set the stronghold on fire over them, so that all the people of the tower of Shechem died also, about a thousand men and women. +\v 50 Then Abimelech went to Thebez and encamped against Thebez, and took it. +\v 51 But there was a strong tower within the city, and all the men and women of the city fled there, and shut themselves in, and went up to the roof of the tower. +\v 52 Abimelech came to the tower and fought against it, and came near to the door of the tower to burn it with fire. +\v 53 A certain woman cast an upper millstone on Abimelech’s head, and broke his skull. +\p +\v 54 Then he called hastily to the young man, his armor bearer, and said to him, “Draw your sword and kill me, that men not say of me, ‘A woman killed him.’ His young man thrust him through, and he died.” +\p +\v 55 When the men of Israel saw that Abimelech was dead, they each departed to his place. +\v 56 Thus God repaid the wickedness of Abimelech, which he did to his father in killing his seventy brothers; +\v 57 and God repaid all the wickedness of the men of Shechem on their heads; and the curse of Jotham the son of Jerubbaal came on them. +\c 10 +\p +\v 1 After Abimelech, Tola the son of Puah, the son of Dodo, a man of Issachar, arose to save Israel. He lived in Shamir in the hill country of Ephraim. +\v 2 He judged Israel twenty-three years, and died, and was buried in Shamir. +\p +\v 3 After him Jair, the Gileadite, arose. He judged Israel twenty-two years. +\v 4 He had thirty sons who rode on thirty donkey colts. They had thirty cities, which are called Havvoth Jair to this day, which are in the land of Gilead. +\v 5 Jair died, and was buried in Kamon. +\p +\v 6 The children of Israel again did that which was evil in Yahweh’s sight, and served the Baals, the Ashtaroth, the gods of Syria, the gods of Sidon, the gods of Moab, the gods of the children of Ammon, and the gods of the Philistines. They abandoned Yahweh, and didn’t serve him. +\v 7 Yahweh’s anger burned against Israel, and he sold them into the hand of the Philistines and into the hand of the children of Ammon. +\v 8 They troubled and oppressed the children of Israel that year. For eighteen years they oppressed all the children of Israel that were beyond the Jordan in the land of the Amorites, which is in Gilead. +\v 9 The children of Ammon passed over the Jordan to fight also against Judah, and against Benjamin, and against the house of Ephraim, so that Israel was very distressed. +\v 10 The children of Israel cried to Yahweh, saying, “We have sinned against you, even because we have forsaken our God, and have served the Baals.” +\p +\v 11 Yahweh said to the children of Israel, “Didn’t I save you from the Egyptians, and from the Amorites, from the children of Ammon, and from the Philistines? +\v 12 The Sidonians also, and the Amalekites, and the Maonites, oppressed you; and you cried to me, and I saved you out of their hand. +\v 13 Yet you have forsaken me and served other gods. Therefore I will save you no more. +\v 14 Go and cry to the gods which you have chosen. Let them save you in the time of your distress!” +\p +\v 15 The children of Israel said to Yahweh, “We have sinned! Do to us whatever seems good to you; only deliver us, please, today.” +\v 16 They put away the foreign gods from among them and served Yahweh; and his soul was grieved for the misery of Israel. +\p +\v 17 Then the children of Ammon were gathered together and encamped in Gilead. The children of Israel assembled themselves together and encamped in Mizpah. +\v 18 The people, the princes of Gilead, said to one another, “Who is the man who will begin to fight against the children of Ammon? He shall be head over all the inhabitants of Gilead.” +\c 11 +\p +\v 1 Now Jephthah the Gileadite was a mighty man of valor. He was the son of a prostitute. Gilead became the father of Jephthah. +\v 2 Gilead’s wife bore him sons. When his wife’s sons grew up, they drove Jephthah out and said to him, “You will not inherit in our father’s house, for you are the son of another woman.” +\v 3 Then Jephthah fled from his brothers and lived in the land of Tob. Outlaws joined up with Jephthah, and they went out with him. +\p +\v 4 After a while, the children of Ammon made war against Israel. +\v 5 When the children of Ammon made war against Israel, the elders of Gilead went to get Jephthah out of the land of Tob. +\v 6 They said to Jephthah, “Come and be our chief, that we may fight with the children of Ammon.” +\p +\v 7 Jephthah said to the elders of Gilead, “Didn’t you hate me, and drive me out of my father’s house? Why have you come to me now when you are in distress?” +\p +\v 8 The elders of Gilead said to Jephthah, “Therefore we have turned again to you now, that you may go with us and fight with the children of Ammon. You will be our head over all the inhabitants of Gilead.” +\p +\v 9 Jephthah said to the elders of Gilead, “If you bring me home again to fight with the children of Ammon, and Yahweh delivers them before me, will I be your head?” +\p +\v 10 The elders of Gilead said to Jephthah, “Yahweh will be witness between us. Surely we will do what you say.” +\p +\v 11 Then Jephthah went with the elders of Gilead, and the people made him head and chief over them. Jephthah spoke all his words before Yahweh in Mizpah. +\p +\v 12 Jephthah sent messengers to the king of the children of Ammon, saying, “What do you have to do with me, that you have come to me to fight against my land?” +\p +\v 13 The king of the children of Ammon answered the messengers of Jephthah, “Because Israel took away my land when he came up out of Egypt, from the Arnon even to the Jabbok, and to the Jordan. Now therefore restore that territory again peaceably.” +\p +\v 14 Jephthah sent messengers again to the king of the children of Ammon; +\v 15 and he said to him, “Jephthah says: Israel didn’t take away the land of Moab, nor the land of the children of Ammon; +\v 16 but when they came up from Egypt, and Israel went through the wilderness to the Red Sea, and came to Kadesh, +\v 17 then Israel sent messengers to the king of Edom, saying, ‘Please let me pass through your land;’ but the king of Edom didn’t listen. In the same way, he sent to the king of Moab, but he refused; so Israel stayed in Kadesh. +\v 18 Then they went through the wilderness, and went around the land of Edom, and the land of Moab, and came by the east side of the land of Moab, and they encamped on the other side of the Arnon; but they didn’t come within the border of Moab, for the Arnon was the border of Moab. +\v 19 Israel sent messengers to Sihon king of the Amorites, the king of Heshbon; and Israel said to him, ‘Please let us pass through your land to my place.’ +\v 20 But Sihon didn’t trust Israel to pass through his border; but Sihon gathered all his people together, and encamped in Jahaz, and fought against Israel. +\v 21 Yahweh, the God of Israel, delivered Sihon and all his people into the hand of Israel, and they struck them. So Israel possessed all the land of the Amorites, the inhabitants of that country. +\v 22 They possessed all the border of the Amorites, from the Arnon even to the Jabbok, and from the wilderness even to the Jordan. +\v 23 So now Yahweh, the God of Israel, has dispossessed the Amorites from before his people Israel, and should you possess them? +\v 24 Won’t you possess that which Chemosh your god gives you to possess? So whoever Yahweh our God has dispossessed from before us, them will we possess. +\v 25 Now are you anything better than Balak the son of Zippor, king of Moab? Did he ever strive against Israel, or did he ever fight against them? +\v 26 Israel lived in Heshbon and its towns, and in Aroer and its towns, and in all the cities that are along the side of the Arnon for three hundred years! Why didn’t you recover them within that time? +\v 27 Therefore I have not sinned against you, but you do me wrong to war against me. May Yahweh the Judge be judge today between the children of Israel and the children of Ammon.” +\p +\v 28 However, the king of the children of Ammon didn’t listen to the words of Jephthah which he sent him. +\v 29 Then Yahweh’s Spirit came on Jephthah, and he passed over Gilead and Manasseh, and passed over Mizpah of Gilead, and from Mizpah of Gilead he passed over to the children of Ammon. +\p +\v 30 Jephthah vowed a vow to Yahweh, and said, “If you will indeed deliver the children of Ammon into my hand, +\v 31 then it shall be, that whatever comes out of the doors of my house to meet me when I return in peace from the children of Ammon, it shall be Yahweh’s, and I will offer it up for a burnt offering.” +\p +\v 32 So Jephthah passed over to the children of Ammon to fight against them; and Yahweh delivered them into his hand. +\v 33 He struck them from Aroer until you come to Minnith, even twenty cities, and to Abelcheramim, with a very great slaughter. So the children of Ammon were subdued before the children of Israel. +\p +\v 34 Jephthah came to Mizpah to his house; and behold, his daughter came out to meet him with tambourines and with dances. She was his only child. Besides her he had neither son nor daughter. +\v 35 When he saw her, he tore his clothes, and said, “Alas, my daughter! You have brought me very low, and you are one of those who trouble me; for I have opened my mouth to Yahweh, and I can’t go back.” +\p +\v 36 She said to him, “My father, you have opened your mouth to Yahweh; do to me according to that which has proceeded out of your mouth, because Yahweh has taken vengeance for you on your enemies, even on the children of Ammon.” +\v 37 Then she said to her father, “Let this thing be done for me. Leave me alone two months, that I may depart and go down on the mountains, and bewail my virginity, I and my companions.” +\p +\v 38 He said, “Go.” He sent her away for two months; and she departed, she and her companions, and mourned her virginity on the mountains. +\v 39 At the end of two months, she returned to her father, who did with her according to his vow which he had vowed. She was a virgin. It became a custom in Israel +\v 40 that the daughters of Israel went yearly to celebrate the daughter of Jephthah the Gileadite four days in a year. +\c 12 +\p +\v 1 The men of Ephraim were gathered together, and passed northward; and they said to Jephthah, “Why did you pass over to fight against the children of Ammon, and didn’t call us to go with you? We will burn your house around you with fire!” +\p +\v 2 Jephthah said to them, “I and my people were at great strife with the children of Ammon; and when I called you, you didn’t save me out of their hand. +\v 3 When I saw that you didn’t save me, I put my life in my hand, and passed over against the children of Ammon, and Yahweh delivered them into my hand. Why then have you come up to me today, to fight against me?” +\p +\v 4 Then Jephthah gathered together all the men of Gilead, and fought with Ephraim. The men of Gilead struck Ephraim, because they said, “You are fugitives of Ephraim, you Gileadites, in the middle of Ephraim, and in the middle of Manasseh.” +\v 5 The Gileadites took the fords of the Jordan against the Ephraimites. Whenever a fugitive of Ephraim said, “Let me go over,” the men of Gilead said to him, “Are you an Ephraimite?” If he said, “No;” +\v 6 then they said to him, “Now say ‘Shibboleth;’” and he said “Sibboleth”; for he couldn’t manage to pronounce it correctly, then they seized him and killed him at the fords of the Jordan. At that time, forty-two thousand of Ephraim fell. +\p +\v 7 Jephthah judged Israel six years. Then Jephthah the Gileadite died, and was buried in the cities of Gilead. +\p +\v 8 After him Ibzan of Bethlehem judged Israel. +\v 9 He had thirty sons. He sent his thirty daughters outside his clan, and he brought in thirty daughters from outside his clan for his sons. He judged Israel seven years. +\v 10 Ibzan died, and was buried at Bethlehem. +\p +\v 11 After him, Elon the Zebulunite judged Israel; and he judged Israel ten years. +\v 12 Elon the Zebulunite died, and was buried in Aijalon in the land of Zebulun. +\p +\v 13 After him, Abdon the son of Hillel the Pirathonite judged Israel. +\v 14 He had forty sons and thirty sons’ sons who rode on seventy donkey colts. He judged Israel eight years. +\v 15 Abdon the son of Hillel the Pirathonite died, and was buried in Pirathon in the land of Ephraim, in the hill country of the Amalekites. +\c 13 +\p +\v 1 The children of Israel again did that which was evil in Yahweh’s sight; and Yahweh delivered them into the hand of the Philistines forty years. +\p +\v 2 There was a certain man of Zorah, of the family of the Danites, whose name was Manoah; and his wife was barren, and childless. +\v 3 Yahweh’s angel appeared to the woman, and said to her, “See now, you are barren and childless; but you shall conceive and bear a son. +\v 4 Now therefore please beware and drink no wine nor strong drink, and don’t eat any unclean thing; +\v 5 for, behold, you shall conceive and give birth to a son. No razor shall come on his head, for the child shall be a Nazirite to God from the womb. He shall begin to save Israel out of the hand of the Philistines.” +\p +\v 6 Then the woman came and told her husband, saying, “A man of God came to me, and his face was like the face of the angel of God, very awesome. I didn’t ask him where he was from, neither did he tell me his name; +\v 7 but he said to me, ‘Behold, you shall conceive and bear a son; and now drink no wine nor strong drink. Don’t eat any unclean thing, for the child shall be a Nazirite to God from the womb to the day of his death.’” +\p +\v 8 Then Manoah entreated Yahweh, and said, “Oh, Lord, please let the man of God whom you sent come again to us, and teach us what we should do to the child who shall be born.” +\p +\v 9 God listened to the voice of Manoah, and the angel of God came again to the woman as she sat in the field; but Manoah, her husband, wasn’t with her. +\v 10 The woman hurried and ran, and told her husband, saying to him, “Behold, the man who came to me that day has appeared to me.” +\p +\v 11 Manoah arose and followed his wife, and came to the man, and said to him, “Are you the man who spoke to my wife?” +\p He said, “I am.” +\p +\v 12 Manoah said, “Now let your words happen. What shall the child’s way of life and mission be?” +\p +\v 13 Yahweh’s angel said to Manoah, “Of all that I said to the woman let her beware. +\v 14 She may not eat of anything that comes of the vine, neither let her drink wine or strong drink, nor eat any unclean thing. Let her observe all that I commanded her.” +\p +\v 15 Manoah said to Yahweh’s angel, “Please stay with us, that we may make a young goat ready for you.” +\p +\v 16 Yahweh’s angel said to Manoah, “Though you detain me, I won’t eat your bread. If you will prepare a burnt offering, you must offer it to Yahweh.” For Manoah didn’t know that he was Yahweh’s angel. +\p +\v 17 Manoah said to Yahweh’s angel, “What is your name, that when your words happen, we may honor you?” +\p +\v 18 Yahweh’s angel said to him, “Why do you ask about my name, since it is incomprehensible\f + \fr 13:18 \ft or, wonderful\f*?” +\p +\v 19 So Manoah took the young goat with the meal offering, and offered it on the rock to Yahweh. Then the angel did an amazing thing as Manoah and his wife watched. +\v 20 For when the flame went up toward the sky from off the altar, Yahweh’s angel ascended in the flame of the altar. Manoah and his wife watched; and they fell on their faces to the ground. +\v 21 But Yahweh’s angel didn’t appear to Manoah or to his wife any more. Then Manoah knew that he was Yahweh’s angel. +\v 22 Manoah said to his wife, “We shall surely die, because we have seen God.” +\p +\v 23 But his wife said to him, “If Yahweh were pleased to kill us, he wouldn’t have received a burnt offering and a meal offering at our hand, and he wouldn’t have shown us all these things, nor would he have told us such things as these at this time.” +\v 24 The woman bore a son and named him Samson. The child grew, and Yahweh blessed him. +\v 25 Yahweh’s Spirit began to move him in Mahaneh Dan, between Zorah and Eshtaol. +\c 14 +\p +\v 1 Samson went down to Timnah, and saw a woman in Timnah of the daughters of the Philistines. +\v 2 He came up, and told his father and his mother, saying, “I have seen a woman in Timnah of the daughters of the Philistines. Now therefore get her for me as my wife.” +\p +\v 3 Then his father and his mother said to him, “Isn’t there a woman among your brothers’ daughters, or among all my people, that you go to take a wife of the uncircumcised Philistines?” +\p Samson said to his father, “Get her for me, for she pleases me well.” +\p +\v 4 But his father and his mother didn’t know that it was of Yahweh; for he sought an occasion against the Philistines. Now at that time the Philistines ruled over Israel. +\p +\v 5 Then Samson went down to Timnah with his father and his mother, and came to the vineyards of Timnah; and behold, a young lion roared at him. +\v 6 Yahweh’s Spirit came mightily on him, and he tore him as he would have torn a young goat with his bare hands, but he didn’t tell his father or his mother what he had done. +\v 7 He went down and talked with the woman, and she pleased Samson well. +\v 8 After a while he returned to take her, and he went over to see the carcass of the lion; and behold, there was a swarm of bees in the body of the lion, and honey. +\v 9 He took it into his hands, and went on, eating as he went. He came to his father and mother and gave to them, and they ate, but he didn’t tell them that he had taken the honey out of the lion’s body. +\v 10 His father went down to the woman; and Samson made a feast there, for the young men used to do so. +\v 11 When they saw him, they brought thirty companions to be with him. +\p +\v 12 Samson said to them, “Let me tell you a riddle now. If you can tell me the answer within the seven days of the feast, and find it out, then I will give you thirty linen garments and thirty changes of clothing; +\v 13 but if you can’t tell me the answer, then you shall give me thirty linen garments and thirty changes of clothing.” +\p They said to him, “Tell us your riddle, that we may hear it.” +\p +\v 14 He said to them, +\q1 “Out of the eater came out food. +\q2 Out of the strong came out sweetness.” +\p They couldn’t in three days declare the riddle. +\v 15 On the seventh day, they said to Samson’s wife, “Entice your husband, that he may declare to us the riddle, lest we burn you and your father’s house with fire. Have you called us to impoverish us? Isn’t that so?” +\p +\v 16 Samson’s wife wept before him, and said, “You just hate me, and don’t love me. You’ve told a riddle to the children of my people, and haven’t told it to me.” +\p He said to her, “Behold, I haven’t told my father or my mother, so why should I tell you?” +\p +\v 17 She wept before him the seven days, while their feast lasted; and on the seventh day, he told her, because she pressed him severely; and she told the riddle to the children of her people. +\v 18 The men of the city said to him on the seventh day before the sun went down, “What is sweeter than honey? What is stronger than a lion?” +\p He said to them, +\q1 “If you hadn’t plowed with my heifer, +\q2 you wouldn’t have found out my riddle.” +\p +\v 19 Yahweh’s Spirit came mightily on him, and he went down to Ashkelon and struck thirty men of them. He took their plunder, then gave the changes of clothing to those who declared the riddle. His anger burned, and he went up to his father’s house. +\v 20 But Samson’s wife was given to his companion, who had been his friend. +\c 15 +\p +\v 1 But after a while, in the time of wheat harvest, Samson visited his wife with a young goat. He said, “I will go in to my wife’s room.” +\p But her father wouldn’t allow him to go in. +\v 2 Her father said, “I most certainly thought that you utterly hated her; therefore I gave her to your companion. Isn’t her younger sister more beautiful than she? Please, take her instead.” +\p +\v 3 Samson said to them, “This time I will be blameless in the case of the Philistines when I harm them.” +\v 4 Samson went and caught three hundred foxes, and took torches, and turned tail to tail, and put a torch in the middle between every two tails. +\v 5 When he had set the torches on fire, he let them go into the standing grain of the Philistines, and burned up both the shocks and the standing grain, and also the olive groves. +\p +\v 6 Then the Philistines said, “Who has done this?” +\p They said, “Samson, the son-in-law of the Timnite, because he has taken his wife and given her to his companion.” The Philistines came up, and burned her and her father with fire. +\p +\v 7 Samson said to them, “If you behave like this, surely I will take revenge on you, and after that I will cease.” +\v 8 He struck them hip and thigh with a great slaughter; and he went down and lived in the cave in Etam’s rock. +\v 9 Then the Philistines went up, encamped in Judah, and spread themselves in Lehi. +\p +\v 10 The men of Judah said, “Why have you come up against us?” +\p They said, “We have come up to bind Samson, to do to him as he has done to us.” +\p +\v 11 Then three thousand men of Judah went down to the cave in Etam’s rock, and said to Samson, “Don’t you know that the Philistines are rulers over us? What then is this that you have done to us?” +\p He said to them, “As they did to me, so I have done to them.” +\p +\v 12 They said to him, “We have come down to bind you, that we may deliver you into the hand of the Philistines.” +\p Samson said to them, “Swear to me that you will not attack me yourselves.” +\p +\v 13 They spoke to him, saying, “No, but we will bind you securely and deliver you into their hands; but surely we will not kill you.” They bound him with two new ropes, and brought him up from the rock. +\p +\v 14 When he came to Lehi, the Philistines shouted as they met him. Then Yahweh’s Spirit came mightily on him, and the ropes that were on his arms became as flax that was burned with fire; and his bands dropped from off his hands. +\v 15 He found a fresh jawbone of a donkey, put out his hand, took it, and struck a thousand men with it. +\v 16 Samson said, “With the jawbone of a donkey, heaps on heaps; with the jawbone of a donkey I have struck a thousand men.” +\v 17 When he had finished speaking, he threw the jawbone out of his hand; and that place was called Ramath Lehi.\f + \fr 15:17 \ft “Ramath” means “hill” and “Lehi” means “jawbone”.\f* +\p +\v 18 He was very thirsty, and called on Yahweh and said, “You have given this great deliverance by the hand of your servant; and now shall I die of thirst, and fall into the hands of the uncircumcised?” +\p +\v 19 But God split the hollow place that is in Lehi, and water came out of it. When he had drunk, his spirit came again, and he revived. Therefore its name was called En Hakkore, which is in Lehi, to this day. +\v 20 He judged Israel twenty years in the days of the Philistines. +\c 16 +\p +\v 1 Samson went to Gaza, and saw there a prostitute, and went in to her. +\v 2 The Gazites were told, “Samson is here!” They surrounded him and laid wait for him all night in the gate of the city, and were quiet all the night, saying, “Wait until morning light; then we will kill him.” +\v 3 Samson lay until midnight, then arose at midnight and took hold of the doors of the gate of the city, with the two posts, and plucked them up, bar and all, and put them on his shoulders and carried them up to the top of the mountain that is before Hebron. +\p +\v 4 It came to pass afterward that he loved a woman in the valley of Sorek, whose name was Delilah. +\v 5 The lords of the Philistines came up to her and said to her, “Entice him, and see in which his great strength lies, and by what means we may prevail against him, that we may bind him to afflict him; and we will each give you eleven hundred pieces of silver.” +\p +\v 6 Delilah said to Samson, “Please tell me where your great strength lies, and what you might be bound to afflict you.” +\p +\v 7 Samson said to her, “If they bind me with seven green cords that were never dried, then shall I become weak, and be as another man.” +\p +\v 8 Then the lords of the Philistines brought up to her seven green cords which had not been dried, and she bound him with them. +\v 9 Now she had an ambush waiting in the inner room. She said to him, “The Philistines are on you, Samson!” He broke the cords as a flax thread is broken when it touches the fire. So his strength was not known. +\p +\v 10 Delilah said to Samson, “Behold, you have mocked me, and told me lies. Now please tell me how you might be bound.” +\p +\v 11 He said to her, “If they only bind me with new ropes with which no work has been done, then shall I become weak, and be as another man.” +\p +\v 12 So Delilah took new ropes and bound him with them, then said to him, “The Philistines are on you, Samson!” The ambush was waiting in the inner room. He broke them off his arms like a thread. +\p +\v 13 Delilah said to Samson, “Until now, you have mocked me and told me lies. Tell me with what you might be bound.” +\p He said to her, “If you weave the seven locks of my head with the fabric on the loom.” +\p +\v 14 She fastened it with the pin, and said to him, “The Philistines are on you, Samson!” He awakened out of his sleep, and plucked away the pin of the beam and the fabric. +\p +\v 15 She said to him, “How can you say, ‘I love you,’ when your heart is not with me? You have mocked me these three times, and have not told me where your great strength lies.” +\p +\v 16 When she pressed him daily with her words and urged him, his soul was troubled to death. +\v 17 He told her all his heart and said to her, “No razor has ever come on my head; for I have been a Nazirite to God from my mother’s womb. If I am shaved, then my strength will go from me and I will become weak, and be like any other man.” +\p +\v 18 When Delilah saw that he had told her all his heart, she sent and called for the lords of the Philistines, saying, “Come up this once, for he has told me all his heart.” Then the lords of the Philistines came up to her and brought the money in their hand. +\v 19 She made him sleep on her knees; and she called for a man and shaved off the seven locks of his head; and she began to afflict him, and his strength went from him. +\v 20 She said, “The Philistines are upon you, Samson!” +\p He awoke out of his sleep, and said, “I will go out as at other times, and shake myself free.” But he didn’t know that Yahweh had departed from him. +\v 21 The Philistines laid hold on him and put out his eyes; and they brought him down to Gaza and bound him with fetters of bronze; and he ground at the mill in the prison. +\v 22 However, the hair of his head began to grow again after he was shaved. +\p +\v 23 The lords of the Philistines gathered together to offer a great sacrifice to Dagon their god, and to rejoice; for they said, “Our god has delivered Samson our enemy into our hand.” +\v 24 When the people saw him, they praised their god; for they said, “Our god has delivered our enemy and the destroyer of our country, who has slain many of us, into our hand.” +\p +\v 25 When their hearts were merry, they said, “Call for Samson, that he may entertain us.” They called for Samson out of the prison; and he performed before them. They set him between the pillars; +\v 26 and Samson said to the boy who held him by the hand, “Allow me to feel the pillars on which the house rests, that I may lean on them.” +\v 27 Now the house was full of men and women; and all the lords of the Philistines were there; and there were on the roof about three thousand men and women, who saw while Samson performed. +\v 28 Samson called to Yahweh, and said, “Lord Yahweh, remember me, please, and strengthen me, please, only this once, God, that I may be at once avenged of the Philistines for my two eyes.” +\v 29 Samson took hold of the two middle pillars on which the house rested and leaned on them, the one with his right hand and the other with his left. +\v 30 Samson said, “Let me die with the Philistines!” He bowed himself with all his might; and the house fell on the lords, and on all the people who were in it. So the dead that he killed at his death were more than those who he killed in his life. +\p +\v 31 Then his brothers and all the house of his father came down and took him, and brought him up and buried him between Zorah and Eshtaol in the burial site of Manoah his father. He judged Israel twenty years. +\c 17 +\p +\v 1 There was a man of the hill country of Ephraim, whose name was Micah. +\v 2 He said to his mother, “The eleven hundred pieces of silver that were taken from you, about which you uttered a curse, and also spoke it in my ears—behold, the silver is with me. I took it.” +\p His mother said, “May Yahweh bless my son!” +\p +\v 3 He restored the eleven hundred pieces of silver to his mother, then his mother said, “I most certainly dedicate the silver to Yahweh from my hand for my son, to make a carved image and a molten image. Now therefore I will restore it to you.” +\p +\v 4 When he restored the money to his mother, his mother took two hundred pieces of silver, and gave them to a silversmith, who made a carved image and a molten image out of it. It was in the house of Micah. +\p +\v 5 The man Micah had a house of gods, and he made an ephod, and teraphim,\f + \fr 17:5 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* and consecrated one of his sons, who became his priest. +\v 6 In those days there was no king in Israel. Everyone did that which was right in his own eyes. +\v 7 There was a young man out of Bethlehem Judah, of the family of Judah, who was a Levite; and he lived there. +\v 8 The man departed out of the city, out of Bethlehem Judah, to live where he could find a place, and he came to the hill country of Ephraim, to the house of Micah, as he traveled. +\v 9 Micah said to him, “Where did you come from?” +\p He said to him, “I am a Levite of Bethlehem Judah, and I am looking for a place to live.” +\p +\v 10 Micah said to him, “Dwell with me, and be to me a father and a priest, and I will give you ten pieces of silver per year, a suit of clothing, and your food.” So the Levite went in. +\v 11 The Levite was content to dwell with the man; and the young man was to him as one of his sons. +\v 12 Micah consecrated the Levite, and the young man became his priest, and was in the house of Micah. +\v 13 Then Micah said, “Now I know that Yahweh will do good to me, since I have a Levite as my priest.” +\c 18 +\p +\v 1 In those days there was no king in Israel. In those days the tribe of the Danites sought an inheritance to dwell in; for to that day, their inheritance had not fallen to them among the tribes of Israel. +\v 2 The children of Dan sent five men of their family from their whole number, men of valor, from Zorah and from Eshtaol, to spy out the land and to search it. They said to them, “Go, explore the land!” +\p They came to the hill country of Ephraim, to the house of Micah, and lodged there. +\v 3 When they were by the house of Micah, they knew the voice of the young man the Levite; so they went over there and said to him, “Who brought you here? What do you do in this place? What do you have here?” +\p +\v 4 He said to them, “Thus and thus has Micah dealt with me, and he has hired me, and I have become his priest.” +\p +\v 5 They said to him, “Please ask counsel of God, that we may know whether our way which we go shall be prosperous.” +\p +\v 6 The priest said to them, “Go in peace. Your way in which you go is before Yahweh.” +\p +\v 7 Then the five men departed and came to Laish and saw the people who were there, how they lived in safety, in the way of the Sidonians, quiet and secure; for there was no one in the land possessing authority, that might put them to shame in anything, and they were far from the Sidonians, and had no dealings with anyone else. +\v 8 They came to their brothers at Zorah and Eshtaol; and their brothers asked them, “What do you say?” +\p +\v 9 They said, “Arise, and let’s go up against them; for we have seen the land, and behold, it is very good. Do you stand still? Don’t be slothful to go and to enter in to possess the land. +\v 10 When you go, you will come to an unsuspecting people, and the land is large; for God has given it into your hand, a place where there is no lack of anything that is in the earth.” +\p +\v 11 The family of the Danites set out from Zorah and Eshtaol with six hundred men armed with weapons of war. +\v 12 They went up and encamped in Kiriath Jearim in Judah. Therefore they call that place Mahaneh Dan to this day. Behold, it is behind Kiriath Jearim. +\v 13 They passed from there to the hill country of Ephraim, and came to the house of Micah. +\p +\v 14 Then the five men who went to spy out the country of Laish answered and said to their brothers, “Do you know that there is in these houses an ephod, and teraphim,\f + \fr 18:14 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* and a carved image, and a molten image? Now therefore consider what you have to do.” +\v 15 They went over there and came to the house of the young Levite man, even to the house of Micah, and asked him how he was doing. +\v 16 The six hundred men armed with their weapons of war, who were of the children of Dan, stood by the entrance of the gate. +\v 17 The five men who went to spy out the land went up, and came in there, and took the engraved image, the ephod, the teraphim, and the molten image; and the priest stood by the entrance of the gate with the six hundred men armed with weapons of war. +\p +\v 18 When these went into Micah’s house, and took the engraved image, the ephod, the teraphim, and the molten image, the priest said to them, “What are you doing?” +\p +\v 19 They said to him, “Hold your peace, put your hand on your mouth, and go with us. Be a father and a priest to us. Is it better for you to be priest to the house of one man, or to be priest to a tribe and a family in Israel?” +\p +\v 20 The priest’s heart was glad, and he took the ephod, the teraphim, and the engraved image, and went with the people. +\v 21 So they turned and departed, and put the little ones, the livestock, and the goods before them. +\v 22 When they were a good way from the house of Micah, the men who were in the houses near Micah’s house gathered together and overtook the children of Dan. +\v 23 As they called to the children of Dan, they turned their faces, and said to Micah, “What ails you, that you come with such a company?” +\p +\v 24 He said, “You have taken away my gods which I made, and the priest, and have gone away! What more do I have? How can you ask me, ‘What ails you?’” +\p +\v 25 The children of Dan said to him, “Don’t let your voice be heard among us, lest angry fellows fall on you, and you lose your life, with the lives of your household.” +\p +\v 26 The children of Dan went their way; and when Micah saw that they were too strong for him, he turned and went back to his house. +\v 27 They took that which Micah had made, and the priest whom he had, and came to Laish, to a people quiet and unsuspecting, and struck them with the edge of the sword; then they burned the city with fire. +\v 28 There was no deliverer, because it was far from Sidon, and they had no dealings with anyone else; and it was in the valley that lies by Beth Rehob. They built the city and lived in it. +\v 29 They called the name of the city Dan, after the name of Dan their father, who was born to Israel; however the name of the city used to be Laish. +\v 30 The children of Dan set up for themselves the engraved image; and Jonathan, the son of Gershom, the son of Moses, and his sons were priests to the tribe of the Danites until the day of the captivity of the land. +\v 31 So they set up for themselves Micah’s engraved image which he made, and it remained all the time that God’s house was in Shiloh. +\c 19 +\p +\v 1 In those days, when there was no king in Israel, there was a certain Levite living on the farther side of the hill country of Ephraim, who took for himself a concubine out of Bethlehem Judah. +\v 2 His concubine played the prostitute against him, and went away from him to her father’s house to Bethlehem Judah, and was there for four months. +\v 3 Her husband arose and went after her to speak kindly to her, to bring her again, having his servant with him and a couple of donkeys. She brought him into her father’s house; and when the father of the young lady saw him, he rejoiced to meet him. +\v 4 His father-in-law, the young lady’s father, kept him there; and he stayed with him three days. So they ate and drank, and stayed there. +\p +\v 5 On the fourth day, they got up early in the morning, and he rose up to depart. The young lady’s father said to his son-in-law, “Strengthen your heart with a morsel of bread, and afterward you shall go your way.” +\v 6 So they sat down, ate, and drank, both of them together. Then the young lady’s father said to the man, “Please be pleased to stay all night, and let your heart be merry.” +\v 7 The man rose up to depart; but his father-in-law urged him, and he stayed there again. +\v 8 He arose early in the morning on the fifth day to depart; and the young lady’s father said, “Please strengthen your heart and stay until the day declines;” and they both ate. +\p +\v 9 When the man rose up to depart, he, and his concubine, and his servant, his father-in-law, the young lady’s father, said to him, “Behold, now the day draws toward evening, please stay all night. Behold, the day is ending. Stay here, that your heart may be merry; and tomorrow go on your way early, that you may go home.” +\v 10 But the man wouldn’t stay that night, but he rose up and went near Jebus (also called Jerusalem). With him were a couple of saddled donkeys. His concubine also was with him. +\p +\v 11 When they were by Jebus, the day was far spent; and the servant said to his master, “Please come and let’s enter into this city of the Jebusites, and stay in it.” +\p +\v 12 His master said to him, “We won’t enter into the city of a foreigner that is not of the children of Israel; but we will pass over to Gibeah.” +\v 13 He said to his servant, “Come and let’s draw near to one of these places; and we will lodge in Gibeah, or in Ramah.” +\v 14 So they passed on and went their way; and the sun went down on them near Gibeah, which belongs to Benjamin. +\v 15 They went over there, to go in to stay in Gibeah. He went in, and sat down in the street of the city; for there was no one who took them into his house to stay. +\p +\v 16 Behold, an old man came from his work out of the field at evening. Now the man was from the hill country of Ephraim, and he lived in Gibeah; but the men of the place were Benjamites. +\v 17 He lifted up his eyes, and saw the wayfaring man in the street of the city; and the old man said, “Where are you going? Where did you come from?” +\p +\v 18 He said to him, “We are passing from Bethlehem Judah to the farther side of the hill country of Ephraim. I am from there, and I went to Bethlehem Judah. I am going to Yahweh’s house; and there is no one who has taken me into his house. +\v 19 Yet there is both straw and feed for our donkeys; and there is bread and wine also for me, and for your servant, and for the young man who is with your servants. There is no lack of anything.” +\p +\v 20 The old man said, “Peace be to you! Just let me supply all your needs, but don’t sleep in the street.” +\v 21 So he brought him into his house, and gave the donkeys fodder. Then they washed their feet, and ate and drank. +\v 22 As they were making their hearts merry, behold, the men of the city, certain wicked fellows, surrounded the house, beating at the door; and they spoke to the master of the house, the old man, saying, “Bring out the man who came into your house, that we can have sex with him!” +\p +\v 23 The man, the master of the house, went out to them, and said to them, “No, my brothers, please don’t act so wickedly; since this man has come into my house, don’t do this folly. +\v 24 Behold, here is my virgin daughter and his concubine. I will bring them out now. Humble them, and do with them what seems good to you; but to this man don’t do any such folly.” +\p +\v 25 But the men wouldn’t listen to him; so the man grabbed his concubine, and brought her out to them; and they had sex with her, and abused her all night until the morning. When the day began to dawn, they let her go. +\v 26 Then the woman came in the dawning of the day, and fell down at the door of the man’s house where her lord was, until it was light. +\v 27 Her lord rose up in the morning and opened the doors of the house, and went out to go his way; and behold, the woman his concubine had fallen down at the door of the house, with her hands on the threshold. +\p +\v 28 He said to her, “Get up, and let’s get going!” but no one answered. Then he took her up on the donkey; and the man rose up, and went to his place. +\p +\v 29 When he had come into his house, he took a knife and cut up his concubine, and divided her, limb by limb, into twelve pieces, and sent her throughout all the borders of Israel. +\v 30 It was so, that all who saw it said, “Such a deed has not been done or seen from the day that the children of Israel came up out of the land of Egypt to this day! Consider it, take counsel, and speak.” +\c 20 +\p +\v 1 Then all the children of Israel went out, and the congregation was assembled as one man, from Dan even to Beersheba, with the land of Gilead, to Yahweh at Mizpah. +\v 2 The chiefs of all the people, even of all the tribes of Israel, presented themselves in the assembly of the people of God, four hundred thousand footmen who drew sword. +\v 3 (Now the children of Benjamin heard that the children of Israel had gone up to Mizpah.) The children of Israel said, “Tell us, how did this wickedness happen?” +\p +\v 4 The Levite, the husband of the woman who was murdered, answered, “I came into Gibeah that belongs to Benjamin, I and my concubine, to spend the night. +\v 5 The men of Gibeah rose against me, and surrounded the house by night. They intended to kill me and they raped my concubine, and she is dead. +\v 6 I took my concubine and cut her in pieces, and sent her throughout all the country of the inheritance of Israel; for they have committed lewdness and folly in Israel. +\v 7 Behold, you children of Israel, all of you, give here your advice and counsel.” +\p +\v 8 All the people arose as one man, saying, “None of us will go to his tent, neither will any of us turn to his house. +\v 9 But now this is the thing which we will do to Gibeah: we will go up against it by lot; +\v 10 and we will take ten men of one hundred throughout all the tribes of Israel, and one hundred of one thousand, and a thousand out of ten thousand to get food for the people, that they may do, when they come to Gibeah of Benjamin, according to all the folly that the men of Gibeah have done in Israel.” +\v 11 So all the men of Israel were gathered against the city, knit together as one man. +\p +\v 12 The tribes of Israel sent men through all the tribe of Benjamin, saying, “What wickedness is this that has happened among you? +\v 13 Now therefore deliver up the men, the wicked fellows who are in Gibeah, that we may put them to death and put away evil from Israel.” +\p But Benjamin would not listen to the voice of their brothers, the children of Israel. +\v 14 The children of Benjamin gathered themselves together out of the cities to Gibeah, to go out to battle against the children of Israel. +\v 15 The children of Benjamin were counted on that day out of the cities twenty-six thousand men who drew the sword, in addition to the inhabitants of Gibeah, who were counted seven hundred chosen men. +\v 16 Among all these soldiers there were seven hundred chosen men who were left-handed. Every one of them could sling a stone at a hair and not miss. +\v 17 The men of Israel, besides Benjamin, were counted four hundred thousand men who drew sword. All these were men of war. +\p +\v 18 The children of Israel arose, went up to Bethel, and asked counsel of God. They asked, “Who shall go up for us first to battle against the children of Benjamin?” +\p Yahweh said, “Judah first.” +\p +\v 19 The children of Israel rose up in the morning and encamped against Gibeah. +\v 20 The men of Israel went out to battle against Benjamin; and the men of Israel set the battle in array against them at Gibeah. +\v 21 The children of Benjamin came out of Gibeah, and on that day destroyed twenty-two thousand of the Israelite men down to the ground. +\v 22 The people, the men of Israel, encouraged themselves, and set the battle again in array in the place where they set themselves in array the first day. +\v 23 The children of Israel went up and wept before Yahweh until evening; and they asked of Yahweh, saying, “Shall I again draw near to battle against the children of Benjamin my brother?” +\p Yahweh said, “Go up against him.” +\p +\v 24 The children of Israel came near against the children of Benjamin the second day. +\v 25 Benjamin went out against them out of Gibeah the second day, and destroyed down to the ground of the children of Israel again eighteen thousand men. All these drew the sword. +\p +\v 26 Then all the children of Israel and all the people went up, and came to Bethel, and wept, and sat there before Yahweh, and fasted that day until evening; then they offered burnt offerings and peace offerings before Yahweh. +\v 27 The children of Israel asked Yahweh (for the ark of the covenant of God was there in those days, +\v 28 and Phinehas, the son of Eleazar, the son of Aaron, stood before it in those days), saying, “Shall I yet again go out to battle against the children of Benjamin my brother, or shall I cease?” +\p Yahweh said, “Go up; for tomorrow I will deliver him into your hand.” +\p +\v 29 Israel set ambushes all around Gibeah. +\v 30 The children of Israel went up against the children of Benjamin on the third day, and set themselves in array against Gibeah, as at other times. +\v 31 The children of Benjamin went out against the people, and were drawn away from the city; and they began to strike and kill of the people as at other times, in the highways, of which one goes up to Bethel and the other to Gibeah, in the field, about thirty men of Israel. +\p +\v 32 The children of Benjamin said, “They are struck down before us, as at the first.” But the children of Israel said, “Let’s flee, and draw them away from the city to the highways.” +\p +\v 33 All the men of Israel rose up out of their place and set themselves in array at Baal Tamar. Then the ambushers of Israel broke out of their place, even out of Maareh Geba. +\v 34 Ten thousand chosen men out of all Israel came over against Gibeah, and the battle was severe; but they didn’t know that disaster was close to them. +\v 35 Yahweh struck Benjamin before Israel; and the children of Israel destroyed of Benjamin that day twenty-five thousand one hundred men. All these drew the sword. +\v 36 So the children of Benjamin saw that they were struck, for the men of Israel yielded to Benjamin because they trusted the ambushers whom they had set against Gibeah. +\v 37 The ambushers hurried, and rushed on Gibeah; then the ambushers spread out, and struck all the city with the edge of the sword. +\v 38 Now the appointed sign between the men of Israel and the ambushers was that they should make a great cloud of smoke rise up out of the city. +\v 39 The men of Israel turned in the battle, and Benjamin began to strike and kill of the men of Israel about thirty persons; for they said, “Surely they are struck down before us, as in the first battle.” +\v 40 But when the cloud began to arise up out of the city in a pillar of smoke, the Benjamites looked behind them; and behold, the whole city went up in smoke to the sky. +\v 41 The men of Israel turned, and the men of Benjamin were dismayed; for they saw that disaster had come on them. +\v 42 Therefore they turned their backs before the men of Israel to the way of the wilderness, but the battle followed hard after them; and those who came out of the cities destroyed them in the middle of it. +\v 43 They surrounded the Benjamites, chased them, and trod them down at their resting place, as far as near Gibeah toward the sunrise. +\v 44 Eighteen thousand men of Benjamin fell; all these were men of valor. +\v 45 They turned and fled toward the wilderness to the rock of Rimmon. They gleaned five thousand men of them in the highways, and followed hard after them to Gidom, and struck two thousand men of them. +\v 46 So that all who fell that day of Benjamin were twenty-five thousand men who drew the sword. All these were men of valor. +\v 47 But six hundred men turned and fled toward the wilderness to the rock of Rimmon, and stayed in the rock of Rimmon four months. +\v 48 The men of Israel turned again on the children of Benjamin, and struck them with the edge of the sword—including the entire city, the livestock, and all that they found. Moreover they set all the cities which they found on fire. +\c 21 +\p +\v 1 Now the men of Israel had sworn in Mizpah, saying, “None of us will give his daughter to Benjamin as a wife.” +\v 2 The people came to Bethel and sat there until evening before God, and lifted up their voices, and wept severely. +\v 3 They said, “Yahweh, the God of Israel, why has this happened in Israel, that there should be one tribe lacking in Israel today?” +\p +\v 4 On the next day, the people rose early and built an altar there, and offered burnt offerings and peace offerings. +\v 5 The children of Israel said, “Who is there among all the tribes of Israel who didn’t come up in the assembly to Yahweh?” For they had made a great oath concerning him who didn’t come up to Yahweh to Mizpah, saying, “He shall surely be put to death.” +\v 6 The children of Israel grieved for Benjamin their brother, and said, “There is one tribe cut off from Israel today. +\v 7 How shall we provide wives for those who remain, since we have sworn by Yahweh that we will not give them of our daughters to wives?” +\v 8 They said, “What one is there of the tribes of Israel who didn’t come up to Yahweh to Mizpah?” Behold, no one came from Jabesh Gilead to the camp to the assembly. +\v 9 For when the people were counted, behold, there were none of the inhabitants of Jabesh Gilead there. +\v 10 The congregation sent twelve thousand of the most valiant men there, and commanded them, saying, “Go and strike the inhabitants of Jabesh Gilead with the edge of the sword, with the women and the little ones. +\v 11 This is the thing that you shall do: you shall utterly destroy every male, and every woman who has lain with a man.” +\v 12 They found among the inhabitants of Jabesh Gilead four hundred young virgins who had not known man by lying with him; and they brought them to the camp to Shiloh, which is in the land of Canaan. +\p +\v 13 The whole congregation sent and spoke to the children of Benjamin who were in the rock of Rimmon, and proclaimed peace to them. +\v 14 Benjamin returned at that time; and they gave them the women whom they had saved alive of the women of Jabesh Gilead. There still weren’t enough for them. +\v 15 The people grieved for Benjamin, because Yahweh had made a breach in the tribes of Israel. +\v 16 Then the elders of the congregation said, “How shall we provide wives for those who remain, since the women are destroyed out of Benjamin?” +\v 17 They said, “There must be an inheritance for those who are escaped of Benjamin, that a tribe not be blotted out from Israel. +\v 18 However, we may not give them wives of our daughters, for the children of Israel had sworn, saying, ‘Cursed is he who gives a wife to Benjamin.’” +\v 19 They said, “Behold, there is a feast of Yahweh from year to year in Shiloh, which is on the north of Bethel, on the east side of the highway that goes up from Bethel to Shechem, and on the south of Lebonah.” +\v 20 They commanded the children of Benjamin, saying, “Go and lie in wait in the vineyards, +\v 21 and see, and behold, if the daughters of Shiloh come out to dance in the dances, then come out of the vineyards, and each man catch his wife of the daughters of Shiloh, and go to the land of Benjamin. +\v 22 It shall be, when their fathers or their brothers come to complain to us, that we will say to them, ‘Grant them graciously to us, because we didn’t take for each man his wife in battle, neither did you give them to them; otherwise you would now be guilty.’” +\p +\v 23 The children of Benjamin did so, and took wives for themselves according to their number, of those who danced, whom they carried off. They went and returned to their inheritance, built the cities, and lived in them. +\v 24 The children of Israel departed from there at that time, every man to his tribe and to his family, and they each went out from there to his own inheritance. +\v 25 In those days there was no king in Israel. Everyone did that which was right in his own eyes. diff --git a/c-sharp/assets/WEB/08RUTengWEBUS.SFM b/c-sharp/assets/WEB/08RUTengWEBUS.SFM new file mode 100644 index 0000000000..073e35f50c --- /dev/null +++ b/c-sharp/assets/WEB/08RUTengWEBUS.SFM @@ -0,0 +1,139 @@ +\id RUT World English Bible (WEB) +\ide UTF-8 +\h Ruth +\toc1 The Book of Ruth +\toc2 Ruth +\toc3 Ruth +\mt2 The Book of +\mt1 Ruth +\c 1 +\p +\v 1 In the days when the judges judged, there was a famine in the land. A certain man of Bethlehem Judah went to live in the country of Moab with his wife and his two sons. +\v 2 The name of the man was Elimelech, and the name of his wife Naomi. The names of his two sons were Mahlon and Chilion, Ephrathites of Bethlehem Judah. They came into the country of Moab and lived there. +\v 3 Elimelech, Naomi’s husband, died; and she was left with her two sons. +\v 4 They took for themselves wives of the women of Moab. The name of the one was Orpah, and the name of the other was Ruth. They lived there about ten years. +\v 5 Mahlon and Chilion both died, and the woman was bereaved of her two children and of her husband. +\v 6 Then she arose with her daughters-in-law, that she might return from the country of Moab; for she had heard in the country of Moab how Yahweh\f + \fr 1:6 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* had visited his people in giving them bread. +\v 7 She went out of the place where she was, and her two daughters-in-law with her. They went on the way to return to the land of Judah. +\v 8 Naomi said to her two daughters-in-law, “Go, return each of you to her mother’s house. May Yahweh deal kindly with you, as you have dealt with the dead and with me. +\v 9 May Yahweh grant you that you may find rest, each of you in the house of her husband.” +\p Then she kissed them, and they lifted up their voices, and wept. +\v 10 They said to her, “No, but we will return with you to your people.” +\p +\v 11 Naomi said, “Go back, my daughters. Why do you want to go with me? Do I still have sons in my womb, that they may be your husbands? +\v 12 Go back, my daughters, go your way; for I am too old to have a husband. If I should say, ‘I have hope,’ if I should even have a husband tonight, and should also bear sons, +\v 13 would you then wait until they were grown? Would you then refrain from having husbands? No, my daughters, for it grieves me seriously for your sakes, for Yahweh’s hand has gone out against me.” +\p +\v 14 They lifted up their voices and wept again; then Orpah kissed her mother-in-law, but Ruth stayed with her. +\v 15 She said, “Behold,\f + \fr 1:15 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* your sister-in-law has gone back to her people and to her god. Follow your sister-in-law.” +\p +\v 16 Ruth said, “Don’t urge me to leave you, and to return from following you, for where you go, I will go; and where you stay, I will stay. Your people will be my people, and your God\f + \fr 1:16 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* my God. +\v 17 Where you die, I will die, and there I will be buried. May Yahweh do so to me, and more also, if anything but death parts you and me.” +\p +\v 18 When Naomi saw that she was determined to go with her, she stopped urging her. +\p +\v 19 So they both went until they came to Bethlehem. When they had come to Bethlehem, all the city was excited about them, and they asked, “Is this Naomi?” +\p +\v 20 She said to them, “Don’t call me Naomi.\f + \fr 1:20 \ft “Naomi” means “pleasant”.\f* Call me Mara,\f + \fr 1:20 \ft “Mara” means “bitter”.\f* for the Almighty has dealt very bitterly with me. +\v 21 I went out full, and Yahweh has brought me home again empty. Why do you call me Naomi, since Yahweh has testified against me, and the Almighty has afflicted me?” +\v 22 So Naomi returned, and Ruth the Moabitess, her daughter-in-law, with her, who returned out of the country of Moab. They came to Bethlehem in the beginning of barley harvest. +\c 2 +\p +\v 1 Naomi had a relative of her husband’s, a mighty man of wealth, of the family of Elimelech, and his name was Boaz. +\v 2 Ruth the Moabitess said to Naomi, “Let me now go to the field, and glean among the ears of grain after him in whose sight I find favor.” +\p She said to her, “Go, my daughter.” +\v 3 She went, and came and gleaned in the field after the reapers; and she happened to come to the portion of the field belonging to Boaz, who was of the family of Elimelech. +\p +\v 4 Behold, Boaz came from Bethlehem, and said to the reapers, “May Yahweh be with you.” +\p They answered him, “May Yahweh bless you.” +\p +\v 5 Then Boaz said to his servant who was set over the reapers, “Whose young lady is this?” +\p +\v 6 The servant who was set over the reapers answered, “It is the Moabite lady who came back with Naomi out of the country of Moab. +\v 7 She said, ‘Please let me glean and gather after the reapers among the sheaves.’ So she came, and has continued even from the morning until now, except that she rested a little in the house.” +\p +\v 8 Then Boaz said to Ruth, “Listen, my daughter. Don’t go to glean in another field, and don’t go from here, but stay here close to my maidens. +\v 9 Let your eyes be on the field that they reap, and go after them. Haven’t I commanded the young men not to touch you? When you are thirsty, go to the vessels, and drink from that which the young men have drawn.” +\p +\v 10 Then she fell on her face and bowed herself to the ground, and said to him, “Why have I found favor in your sight, that you should take knowledge of me, since I am a foreigner?” +\p +\v 11 Boaz answered her, “I have been told all about what you have done for your mother-in-law since the death of your husband, and how you have left your father, your mother, and the land of your birth, and have come to a people that you didn’t know before. +\v 12 May Yahweh repay your work, and a full reward be given to you from Yahweh, the God of Israel, under whose wings you have come to take refuge.” +\p +\v 13 Then she said, “Let me find favor in your sight, my lord, because you have comforted me, and because you have spoken kindly to your servant, though I am not as one of your servants.” +\p +\v 14 At meal time Boaz said to her, “Come here, and eat some bread, and dip your morsel in the vinegar.” +\p She sat beside the reapers, and they passed her parched grain. She ate, was satisfied, and left some of it. +\v 15 When she had risen up to glean, Boaz commanded his young men, saying, “Let her glean even among the sheaves, and don’t reproach her. +\v 16 Also pull out some for her from the bundles, and leave it. Let her glean, and don’t rebuke her.” +\p +\v 17 So she gleaned in the field until evening; and she beat out that which she had gleaned, and it was about an ephah\f + \fr 2:17 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of barley. +\v 18 She took it up, and went into the city. Then her mother-in-law saw what she had gleaned; and she brought out and gave to her that which she had left after she had enough. +\p +\v 19 Her mother-in-law said to her, “Where have you gleaned today? Where have you worked? Blessed be he who noticed you.” +\p She told her mother-in-law with whom she had worked, “The man’s name with whom I worked today is Boaz.” +\v 20 Naomi said to her daughter-in-law, “May he be blessed by Yahweh, who has not abandoned his kindness to the living and to the dead.” Naomi said to her, “The man is a close relative to us, one of our near kinsmen.” +\p +\v 21 Ruth the Moabitess said, “Yes, he said to me, ‘You shall stay close to my young men until they have finished all my harvest.’” +\p +\v 22 Naomi said to Ruth her daughter-in-law, “It is good, my daughter, that you go out with his maidens, and that they not meet you in any other field.” +\v 23 So she stayed close to the maidens of Boaz, to glean to the end of barley harvest and of wheat harvest; and she lived with her mother-in-law. +\c 3 +\p +\v 1 Naomi her mother-in-law said to her, “My daughter, shall I not seek rest for you, that it may be well with you? +\v 2 Now isn’t Boaz our kinsman, with whose maidens you were? Behold, he will be winnowing barley tonight on the threshing floor. +\v 3 Therefore wash yourself, anoint yourself, get dressed, and go down to the threshing floor; but don’t make yourself known to the man until he has finished eating and drinking. +\v 4 It shall be, when he lies down, that you shall note the place where he is lying. Then you shall go in, uncover his feet, and lie down. Then he will tell you what to do.” +\p +\v 5 She said to her, “All that you say, I will do.” +\v 6 She went down to the threshing floor, and did everything that her mother-in-law told her. +\v 7 When Boaz had eaten and drunk, and his heart was merry, he went to lie down at the end of the heap of grain. She came softly, uncovered his feet, and lay down. +\v 8 At midnight, the man was startled and turned himself; and behold, a woman lay at his feet. +\v 9 He said, “Who are you?” +\p She answered, “I am Ruth your servant. Therefore spread the corner of your garment over your servant; for you are a near kinsman.” +\p +\v 10 He said, “You are blessed by Yahweh, my daughter. You have shown more kindness in the latter end than at the beginning, because you didn’t follow young men, whether poor or rich. +\v 11 Now, my daughter, don’t be afraid. I will do to you all that you say; for all the city of my people knows that you are a worthy woman. +\v 12 Now it is true that I am a near kinsman. However, there is a kinsman nearer than I. +\v 13 Stay this night, and in the morning, if he will perform for you the part of a kinsman, good. Let him do the kinsman’s duty. But if he will not do the duty of a kinsman for you, then I will do the duty of a kinsman for you, as Yahweh lives. Lie down until the morning.” +\p +\v 14 She lay at his feet until the morning, then she rose up before one could discern another. For he said, “Let it not be known that the woman came to the threshing floor.” +\v 15 He said, “Bring the mantle that is on you, and hold it.” She held it; and he measured six measures of barley, and laid it on her; then he went into the city. +\p +\v 16 When she came to her mother-in-law, she said, “How did it go, my daughter?” +\p She told her all that the man had done for her. +\v 17 She said, “He gave me these six measures of barley; for he said, ‘Don’t go empty to your mother-in-law.’” +\p +\v 18 Then she said, “Wait, my daughter, until you know what will happen; for the man will not rest until he has settled this today.” +\c 4 +\p +\v 1 Now Boaz went up to the gate and sat down there. Behold, the near kinsman of whom Boaz spoke came by. Boaz said to him, “Come over here, friend, and sit down!” He came over, and sat down. +\v 2 Boaz took ten men of the elders of the city, and said, “Sit down here,” and they sat down. +\v 3 He said to the near kinsman, “Naomi, who has come back out of the country of Moab, is selling the parcel of land, which was our brother Elimelech’s. +\v 4 I thought I should tell you, saying, ‘Buy it before those who sit here, and before the elders of my people.’ If you will redeem it, redeem it; but if you will not redeem it, then tell me, that I may know. For there is no one to redeem it besides you; and I am after you.” +\p He said, “I will redeem it.” +\p +\v 5 Then Boaz said, “On the day you buy the field from the hand of Naomi, you must buy it also from Ruth the Moabitess, the wife of the dead, to raise up the name of the dead on his inheritance.” +\p +\v 6 The near kinsman said, “I can’t redeem it for myself, lest I endanger my own inheritance. Take my right of redemption for yourself; for I can’t redeem it.” +\p +\v 7 Now this was the custom in former time in Israel concerning redeeming and concerning exchanging, to confirm all things: a man took off his sandal, and gave it to his neighbor; and this was the way of formalizing transactions in Israel. +\v 8 So the near kinsman said to Boaz, “Buy it for yourself,” then he took off his sandal. +\p +\v 9 Boaz said to the elders and to all the people, “You are witnesses today, that I have bought all that was Elimelech’s, and all that was Chilion’s and Mahlon’s, from the hand of Naomi. +\v 10 Moreover, Ruth the Moabitess, the wife of Mahlon, I have purchased to be my wife, to raise up the name of the dead on his inheritance, that the name of the dead may not be cut off from among his brothers and from the gate of his place. You are witnesses today.” +\p +\v 11 All the people who were in the gate, and the elders, said, “We are witnesses. May Yahweh make the woman who has come into your house like Rachel and like Leah, which both built the house of Israel; and treat you worthily in Ephrathah, and be famous in Bethlehem. +\v 12 Let your house be like the house of Perez, whom Tamar bore to Judah, of the offspring\f + \fr 4:12 \ft or, seed\f* which Yahweh will give you by this young woman.” +\p +\v 13 So Boaz took Ruth and she became his wife; and he went in to her, and Yahweh enabled her to conceive, and she bore a son. +\v 14 The women said to Naomi, “Blessed be Yahweh, who has not left you today without a near kinsman. Let his name be famous in Israel. +\v 15 He shall be to you a restorer of life and sustain you in your old age; for your daughter-in-law, who loves you, who is better to you than seven sons, has given birth to him.” +\v 16 Naomi took the child, laid him in her bosom, and became nurse to him. +\v 17 The women, her neighbors, gave him a name, saying, “A son is born to Naomi”. They named him Obed. He is the father of Jesse, the father of David. +\p +\v 18 Now this is the history of the generations of Perez: Perez became the father of Hezron, +\v 19 and Hezron became the father of Ram, and Ram became the father of Amminadab, +\v 20 and Amminadab became the father of Nahshon, and Nahshon became the father of Salmon, +\v 21 and Salmon became the father of Boaz, and Boaz became the father of Obed, +\v 22 and Obed became the father of Jesse, and Jesse became the father of David. diff --git a/c-sharp/assets/WEB/091SAengWEBUS.SFM b/c-sharp/assets/WEB/091SAengWEBUS.SFM new file mode 100644 index 0000000000..4dcd5df7b3 --- /dev/null +++ b/c-sharp/assets/WEB/091SAengWEBUS.SFM @@ -0,0 +1,1261 @@ +\id 1SA World English Bible (WEB) +\ide UTF-8 +\h 1 Samuel +\toc1 The First Book of Samuel +\toc2 1 Samuel +\toc3 1 Samuel +\mt1 The First Book of Samuel +\c 1 +\p +\v 1 Now there was a certain man of Ramathaim Zophim, of the hill country of Ephraim, and his name was Elkanah, the son of Jeroham, the son of Elihu, the son of Tohu, the son of Zuph, an Ephraimite. +\v 2 He had two wives. The name of one was Hannah, and the name of the other Peninnah. Peninnah had children, but Hannah had no children. +\v 3 This man went up out of his city from year to year to worship and to sacrifice to Yahweh\f + \fr 1:3 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* of Armies in Shiloh. The two sons of Eli, Hophni and Phinehas, priests to Yahweh, were there. +\v 4 When the day came that Elkanah sacrificed, he gave portions to Peninnah his wife and to all her sons and her daughters; +\v 5 but he gave a double portion to Hannah, for he loved Hannah, but Yahweh had shut up her womb. +\v 6 Her rival provoked her severely, to irritate her, because Yahweh had shut up her womb. +\v 7 So year by year, when she went up to Yahweh’s house, her rival provoked her. Therefore she wept, and didn’t eat. +\v 8 Elkanah her husband said to her, “Hannah, why do you weep? Why don’t you eat? Why is your heart grieved? Am I not better to you than ten sons?” +\p +\v 9 So Hannah rose up after they had finished eating and drinking in Shiloh. Now Eli the priest was sitting on his seat by the doorpost of Yahweh’s temple. +\v 10 She was in bitterness of soul, and prayed to Yahweh, weeping bitterly. +\v 11 She vowed a vow, and said, “Yahweh of Armies, if you will indeed look at the affliction of your servant and remember me, and not forget your servant, but will give to your servant a boy, then I will give him to Yahweh all the days of his life, and no razor shall come on his head.” +\p +\v 12 As she continued praying before Yahweh, Eli saw her mouth. +\v 13 Now Hannah spoke in her heart. Only her lips moved, but her voice was not heard. Therefore Eli thought she was drunk. +\v 14 Eli said to her, “How long will you be drunk? Get rid of your wine!” +\p +\v 15 Hannah answered, “No, my lord, I am a woman of a sorrowful spirit. I have not been drinking wine or strong drink, but I poured out my soul before Yahweh. +\v 16 Don’t consider your servant a wicked woman; for I have been speaking out of the abundance of my complaint and my provocation.” +\p +\v 17 Then Eli answered, “Go in peace; and may the God\f + \fr 1:17 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* of Israel grant your petition that you have asked of him.” +\p +\v 18 She said, “Let your servant find favor in your sight.” So the woman went her way and ate; and her facial expression wasn’t sad any more. +\p +\v 19 They rose up in the morning early and worshiped Yahweh, then returned and came to their house to Ramah. Then Elkanah knew Hannah his wife; and Yahweh remembered her. +\p +\v 20 When the time had come, Hannah conceived, and bore a son; and she named him Samuel,\f + \fr 1:20 \ft Samuel sounds like the Hebrew for “heard by God.”\f* saying, “Because I have asked him of Yahweh.” +\p +\v 21 The man Elkanah, and all his house, went up to offer to Yahweh the yearly sacrifice and his vow. +\v 22 But Hannah didn’t go up, for she said to her husband, “Not until the child is weaned; then I will bring him, that he may appear before Yahweh, and stay there forever.” +\p +\v 23 Elkanah her husband said to her, “Do what seems good to you. Wait until you have weaned him; only may Yahweh establish his word.” +\p So the woman waited and nursed her son until she weaned him. +\v 24 When she had weaned him, she took him up with her, with three bulls, and one ephah\f + \fr 1:24 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of meal, and a container of wine, and brought him to Yahweh’s house in Shiloh. The child was young. +\v 25 They killed the bull, and brought the child to Eli. +\v 26 She said, “Oh, my lord, as your soul lives, my lord, I am the woman who stood by you here, praying to Yahweh. +\v 27 I prayed for this child, and Yahweh has given me my petition which I asked of him. +\v 28 Therefore I have also given him to Yahweh. As long as he lives he is given to Yahweh.” He worshiped Yahweh there. +\c 2 +\p +\v 1 Hannah prayed, and said, +\q1 “My heart exults in Yahweh! +\q2 My horn is exalted in Yahweh. +\q1 My mouth is enlarged over my enemies, +\q2 because I rejoice in your salvation. +\q1 +\v 2 There is no one as holy as Yahweh, +\q2 for there is no one besides you, +\q2 nor is there any rock like our God. +\b +\q1 +\v 3 “Don’t keep talking so exceedingly proudly. +\q2 Don’t let arrogance come out of your mouth, +\q2 for Yahweh is a God of knowledge. +\q2 By him actions are weighed. +\b +\q1 +\v 4 “The bows of the mighty men are broken. +\q2 Those who stumbled are armed with strength. +\q1 +\v 5 Those who were full have hired themselves out for bread. +\q2 Those who were hungry are satisfied. +\q1 Yes, the barren has borne seven. +\q2 She who has many children languishes. +\b +\q1 +\v 6 “Yahweh kills and makes alive. +\q2 He brings down to Sheol\f + \fr 2:6 \ft Sheol is the place of the dead.\f* and brings up. +\q1 +\v 7 Yahweh makes poor and makes rich. +\q2 He brings low, he also lifts up. +\q1 +\v 8 He raises up the poor out of the dust. +\q2 He lifts up the needy from the dunghill +\q2 to make them sit with princes +\q2 and inherit the throne of glory. +\q1 For the pillars of the earth are Yahweh’s. +\q2 He has set the world on them. +\q1 +\v 9 He will keep the feet of his holy ones, +\q2 but the wicked will be put to silence in darkness; +\q2 for no man will prevail by strength. +\q1 +\v 10 Those who strive with Yahweh shall be broken to pieces. +\q2 He will thunder against them in the sky. +\b +\q1 “Yahweh will judge the ends of the earth. +\q2 He will give strength to his king, +\q2 and exalt the horn of his anointed.” +\p +\v 11 Elkanah went to Ramah to his house. The child served Yahweh before Eli the priest. +\p +\v 12 Now the sons of Eli were wicked men. They didn’t know Yahweh. +\v 13 The custom of the priests with the people was that when anyone offered a sacrifice, the priest’s servant came while the meat was boiling, with a fork of three teeth in his hand; +\v 14 and he stabbed it into the pan, or kettle, or cauldron, or pot. The priest took all that the fork brought up for himself. They did this to all the Israelites who came there to Shiloh. +\v 15 Yes, before they burned the fat, the priest’s servant came, and said to the man who sacrificed, “Give meat to roast for the priest; for he will not accept boiled meat from you, but raw.” +\p +\v 16 If the man said to him, “Let the fat be burned first, and then take as much as your soul desires;” then he would say, “No, but you shall give it to me now; and if not, I will take it by force.” +\v 17 The sin of the young men was very great before Yahweh; for the men despised Yahweh’s offering. +\v 18 But Samuel ministered before Yahweh, being a child, clothed with a linen ephod. +\v 19 Moreover his mother made him a little robe, and brought it to him from year to year when she came up with her husband to offer the yearly sacrifice. +\v 20 Eli blessed Elkanah and his wife, and said, “May Yahweh give you offspring\f + \fr 2:20 \ft or, seed\f* from this woman for the petition which was asked of Yahweh.” Then they went to their own home. +\v 21 Yahweh visited Hannah, and she conceived and bore three sons and two daughters. The child Samuel grew before Yahweh. +\p +\v 22 Now Eli was very old; and he heard all that his sons did to all Israel, and how that they slept with the women who served at the door of the Tent of Meeting. +\v 23 He said to them, “Why do you do such things? For I hear of your evil dealings from all these people. +\v 24 No, my sons; for it is not a good report that I hear! You make Yahweh’s people disobey. +\v 25 If one man sins against another, God will judge him; but if a man sins against Yahweh, who will intercede for him?” Notwithstanding, they didn’t listen to the voice of their father, because Yahweh intended to kill them. +\p +\v 26 The child Samuel grew on, and increased in favor both with Yahweh and also with men. +\p +\v 27 A man of God came to Eli and said to him, “Yahweh says, ‘Did I reveal myself to the house of your father when they were in Egypt in bondage to Pharaoh’s house? +\v 28 Didn’t I choose him out of all the tribes of Israel to be my priest, to go up to my altar, to burn incense, to wear an ephod before me? Didn’t I give to the house of your father all the offerings of the children of Israel made by fire? +\v 29 Why do you kick at my sacrifice and at my offering, which I have commanded in my habitation, and honor your sons above me, to make yourselves fat with the best of all the offerings of Israel my people?’ +\v 30 “Therefore Yahweh, the God of Israel, says, ‘I said indeed that your house and the house of your father should walk before me forever.’ But now Yahweh says, ‘Far be it from me; for those who honor me I will honor, and those who despise me will be cursed. +\v 31 Behold,\f + \fr 2:31 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the days come that I will cut off your arm and the arm of your father’s house, that there will not be an old man in your house. +\v 32 You will see the affliction of my habitation, in all the wealth which I will give Israel. There shall not be an old man in your house forever. +\v 33 The man of yours whom I don’t cut off from my altar will consume your eyes\f + \fr 2:33 \ft or, blind your eyes with tears\f* and grieve your heart. All the increase of your house will die in the flower of their age. +\v 34 This will be the sign to you that will come on your two sons, on Hophni and Phinehas: in one day they will both die. +\v 35 I will raise up a faithful priest for myself who will do according to that which is in my heart and in my mind. I will build him a sure house. He will walk before my anointed forever. +\v 36 It will happen that everyone who is left in your house will come and bow down to him for a piece of silver and a loaf of bread, and will say, “Please put me into one of the priests’ offices, that I may eat a morsel of bread.”’” +\c 3 +\p +\v 1 The child Samuel ministered to Yahweh before Eli. Yahweh’s word was rare in those days. There were not many visions, then. +\v 2 At that time, when Eli was laid down in his place (now his eyes had begun to grow dim, so that he could not see), +\v 3 and God’s lamp hadn’t yet gone out, and Samuel had laid down in Yahweh’s temple where God’s ark was, +\v 4 Yahweh called Samuel. He said, “Here I am.” +\p +\v 5 He ran to Eli and said, “Here I am; for you called me.” +\p He said, “I didn’t call. Lie down again.” +\p He went and lay down. +\v 6 Yahweh called yet again, “Samuel!” +\p Samuel arose and went to Eli and said, “Here I am; for you called me.” +\p He answered, “I didn’t call, my son. Lie down again.” +\v 7 Now Samuel didn’t yet know Yahweh, neither was Yahweh’s word yet revealed to him. +\v 8 Yahweh called Samuel again the third time. He arose and went to Eli and said, “Here I am; for you called me.” +\p Eli perceived that Yahweh had called the child. +\v 9 Therefore Eli said to Samuel, “Go, lie down. It shall be, if he calls you, that you shall say, ‘Speak, Yahweh; for your servant hears.’” So Samuel went and lay down in his place. +\v 10 Yahweh came, and stood, and called as at other times, “Samuel! Samuel!” +\p Then Samuel said, “Speak; for your servant hears.” +\p +\v 11 Yahweh said to Samuel, “Behold, I will do a thing in Israel at which both the ears of everyone who hears it will tingle. +\v 12 In that day I will perform against Eli all that I have spoken concerning his house, from the beginning even to the end. +\v 13 For I have told him that I will judge his house forever for the iniquity which he knew, because his sons brought a curse on themselves, and he didn’t restrain them. +\v 14 Therefore I have sworn to the house of Eli that the iniquity of Eli’s house shall not be removed with sacrifice or offering forever.” +\p +\v 15 Samuel lay until the morning, and opened the doors of Yahweh’s house. Samuel was afraid to show Eli the vision. +\v 16 Then Eli called Samuel and said, “Samuel, my son!” +\p He said, “Here I am.” +\p +\v 17 He said, “What is the thing that he has spoken to you? Please don’t hide it from me. God do so to you, and more also, if you hide anything from me of all the things that he spoke to you.” +\p +\v 18 Samuel told him every bit, and hid nothing from him. +\p He said, “It is Yahweh. Let him do what seems good to him.” +\p +\v 19 Samuel grew, and Yahweh was with him and let none of his words fall to the ground. +\v 20 All Israel from Dan even to Beersheba knew that Samuel was established to be a prophet of Yahweh. +\v 21 Yahweh appeared again in Shiloh; for Yahweh revealed himself to Samuel in Shiloh by Yahweh’s word. +\c 4 +\nb +\v 1 The word of Samuel came to all Israel. +\p Now Israel went out against the Philistines to battle, and encamped beside Ebenezer; and the Philistines encamped in Aphek. +\v 2 The Philistines put themselves in array against Israel. When they joined battle, Israel was defeated by the Philistines, who killed about four thousand men of the army in the field. +\v 3 When the people had come into the camp, the elders of Israel said, “Why has Yahweh defeated us today before the Philistines? Let’s get the ark of Yahweh’s covenant out of Shiloh and bring it to us, that it may come among us and save us out of the hand of our enemies.” +\p +\v 4 So the people sent to Shiloh, and they brought from there the ark of the covenant of Yahweh of Armies, who sits above the cherubim; and the two sons of Eli, Hophni and Phinehas, were there with the ark of the covenant of God. +\v 5 When the ark of Yahweh’s covenant came into the camp, all Israel shouted with a great shout, so that the earth resounded. +\v 6 When the Philistines heard the noise of the shout, they said, “What does the noise of this great shout in the camp of the Hebrews mean?” They understood that Yahweh’s ark had come into the camp. +\v 7 The Philistines were afraid, for they said, “God has come into the camp.” They said, “Woe to us! For there has not been such a thing before. +\v 8 Woe to us! Who shall deliver us out of the hand of these mighty gods? These are the gods that struck the Egyptians with all kinds of plagues in the wilderness. +\v 9 Be strong and behave like men, O you Philistines, that you not be servants to the Hebrews, as they have been to you. Strengthen yourselves like men, and fight!” +\v 10 The Philistines fought, and Israel was defeated, and each man fled to his tent. There was a very great slaughter; for thirty thousand footmen of Israel fell. +\v 11 God’s ark was taken; and the two sons of Eli, Hophni and Phinehas, were slain. +\p +\v 12 A man of Benjamin ran out of the army and came to Shiloh the same day, with his clothes torn and with dirt on his head. +\v 13 When he came, behold, Eli was sitting on his seat by the road watching, for his heart trembled for God’s ark. When the man came into the city and told about it, all the city cried out. +\v 14 When Eli heard the noise of the crying, he said, “What does the noise of this tumult mean?” +\p The man hurried, and came and told Eli. +\v 15 Now Eli was ninety-eight years old. His eyes were set, so that he could not see. +\v 16 The man said to Eli, “I am he who came out of the army, and I fled today out of the army.” +\p He said, “How did the matter go, my son?” +\p +\v 17 He who brought the news answered, “Israel has fled before the Philistines, and there has been also a great slaughter among the people. Your two sons also, Hophni and Phinehas, are dead, and God’s ark has been captured.” +\p +\v 18 When he made mention of God’s ark, Eli fell from off his seat backward by the side of the gate; and his neck broke, and he died, for he was an old man and heavy. He had judged Israel forty years. +\p +\v 19 His daughter-in-law, Phinehas’ wife, was with child, near to giving birth. When she heard the news that God’s ark was taken and that her father-in-law and her husband were dead, she bowed herself and gave birth; for her pains came on her. +\v 20 About the time of her death the women who stood by her said to her, “Don’t be afraid, for you have given birth to a son.” But she didn’t answer, neither did she regard it. +\v 21 She named the child Ichabod,\f + \fr 4:21 \ft “Ichabod” means “no glory”.\f* saying, “The glory has departed from Israel!” because God’s ark was taken, and because of her father-in-law and her husband. +\v 22 She said, “The glory has departed from Israel; for God’s ark has been taken.” +\c 5 +\p +\v 1 Now the Philistines had taken God’s ark, and they brought it from Ebenezer to Ashdod. +\v 2 The Philistines took God’s ark, and brought it into the house of Dagon and set it by Dagon. +\v 3 When the people of Ashdod arose early on the next day, behold, Dagon had fallen on his face to the ground before Yahweh’s ark. They took Dagon and set him in his place again. +\v 4 When they arose early on the following morning, behold, Dagon had fallen on his face to the ground before Yahweh’s ark; and the head of Dagon and both the palms of his hands were cut off on the threshold. Only Dagon’s torso was intact. +\v 5 Therefore neither the priests of Dagon nor any who come into Dagon’s house step on the threshold of Dagon in Ashdod to this day. +\v 6 But Yahweh’s hand was heavy on the people of Ashdod, and he destroyed them and struck them with tumors, even Ashdod and its borders. +\p +\v 7 When the men of Ashdod saw that it was so, they said, “The ark of the God of Israel shall not stay with us, for his hand is severe on us and on Dagon our god.” +\v 8 They sent therefore and gathered together all the lords of the Philistines, and said, “What shall we do with the ark of the God of Israel?” +\p They answered, “Let the ark of the God of Israel be carried over to Gath.” They carried the ark of the God of Israel there. +\v 9 It was so, that after they had carried it there, Yahweh’s hand was against the city with a very great confusion; and he struck the men of the city, both small and great, so that tumors broke out on them. +\v 10 So they sent God’s ark to Ekron. +\p As God’s ark came to Ekron, the Ekronites cried out, saying, “They have brought the ark of the God of Israel here to us, to kill us and our people.” +\v 11 They sent therefore and gathered together all the lords of the Philistines, and they said, “Send the ark of the God of Israel away, and let it go again to its own place, that it not kill us and our people.” For there was a deadly panic throughout all the city. The hand of God was very heavy there. +\v 12 The men who didn’t die were struck with the tumors; and the cry of the city went up to heaven. +\c 6 +\p +\v 1 Yahweh’s ark was in the country of the Philistines seven months. +\v 2 The Philistines called for the priests and the diviners, saying, “What shall we do with Yahweh’s ark? Show us how we should send it to its place.” +\p +\v 3 They said, “If you send away the ark of the God of Israel, don’t send it empty; but by all means return a trespass offering to him. Then you will be healed, and it will be known to you why his hand is not removed from you.” +\p +\v 4 Then they said, “What should the trespass offering be which we shall return to him?” +\p They said, “Five golden tumors and five golden mice, for the number of the lords of the Philistines; for one plague was on you all, and on your lords. +\v 5 Therefore you shall make images of your tumors and images of your mice that mar the land; and you shall give glory to the God of Israel. Perhaps he will release his hand from you, from your gods, and from your land. +\v 6 Why then do you harden your hearts as the Egyptians and Pharaoh hardened their hearts? When he had worked wonderfully among them, didn’t they let the people go, and they departed? +\p +\v 7 “Now therefore take and prepare yourselves a new cart and two milk cows on which there has come no yoke; and tie the cows to the cart, and bring their calves home from them; +\v 8 and take Yahweh’s ark and lay it on the cart. Put the jewels of gold, which you return him for a trespass offering, in a box by its side; and send it away, that it may go. +\v 9 Behold, if it goes up by the way of its own border to Beth Shemesh, then he has done us this great evil; but if not, then we shall know that it is not his hand that struck us. It was a chance that happened to us.” +\p +\v 10 The men did so, and took two milk cows and tied them to the cart, and shut up their calves at home. +\v 11 They put Yahweh’s ark on the cart, and the box with the golden mice and the images of their tumors. +\v 12 The cows took the straight way by the way to Beth Shemesh. They went along the highway, lowing as they went, and didn’t turn away to the right hand or to the left; and the lords of the Philistines went after them to the border of Beth Shemesh. +\v 13 The people of Beth Shemesh were reaping their wheat harvest in the valley; and they lifted up their eyes and saw the ark, and rejoiced to see it. +\v 14 The cart came into the field of Joshua of Beth Shemesh, and stood there, where there was a great stone. Then they split the wood of the cart and offered up the cows for a burnt offering to Yahweh. +\v 15 The Levites took down Yahweh’s ark and the box that was with it, in which the jewels of gold were, and put them on the great stone; and the men of Beth Shemesh offered burnt offerings and sacrificed sacrifices the same day to Yahweh. +\v 16 When the five lords of the Philistines had seen it, they returned to Ekron the same day. +\v 17 These are the golden tumors which the Philistines returned for a trespass offering to Yahweh: for Ashdod one, for Gaza one, for Ashkelon one, for Gath one, for Ekron one; +\v 18 and the golden mice, according to the number of all the cities of the Philistines belonging to the five lords, both of fortified cities and of country villages, even to the great stone on which they set down Yahweh’s ark. That stone remains to this day in the field of Joshua of Beth Shemesh. +\v 19 He struck of the men of Beth Shemesh, because they had looked into Yahweh’s ark, he struck fifty thousand seventy of the men. Then the people mourned, because Yahweh had struck the people with a great slaughter. +\v 20 The men of Beth Shemesh said, “Who is able to stand before Yahweh, this holy God? To whom shall he go up from us?” +\p +\v 21 They sent messengers to the inhabitants of Kiriath Jearim, saying, “The Philistines have brought back Yahweh’s ark. Come down and bring it up to yourselves.” +\c 7 +\p +\v 1 The men of Kiriath Jearim came and took Yahweh’s ark, and brought it into Abinadab’s house on the hill, and consecrated Eleazar his son to keep Yahweh’s ark. +\v 2 From the day that the ark stayed in Kiriath Jearim, the time was long—for it was twenty years; and all the house of Israel lamented after Yahweh. +\v 3 Samuel spoke to all the house of Israel, saying, “If you are returning to Yahweh with all your heart, then put away the foreign gods and the Ashtaroth from among you, and direct your hearts to Yahweh, and serve him only; and he will deliver you out of the hand of the Philistines.” +\v 4 Then the children of Israel removed the Baals and the Ashtaroth, and served Yahweh only. +\v 5 Samuel said, “Gather all Israel to Mizpah, and I will pray to Yahweh for you.” +\v 6 They gathered together to Mizpah, and drew water, and poured it out before Yahweh, and fasted on that day, and said there, “We have sinned against Yahweh.” Samuel judged the children of Israel in Mizpah. +\p +\v 7 When the Philistines heard that the children of Israel were gathered together at Mizpah, the lords of the Philistines went up against Israel. When the children of Israel heard it, they were afraid of the Philistines. +\v 8 The children of Israel said to Samuel, “Don’t stop crying to Yahweh our God for us, that he will save us out of the hand of the Philistines.” +\v 9 Samuel took a suckling lamb, and offered it for a whole burnt offering to Yahweh. Samuel cried to Yahweh for Israel, and Yahweh answered him. +\v 10 As Samuel was offering up the burnt offering, the Philistines came near to battle against Israel; but Yahweh thundered with a great thunder on that day on the Philistines and confused them; and they were struck down before Israel. +\v 11 The men of Israel went out of Mizpah and pursued the Philistines, and struck them until they came under Beth Kar. +\p +\v 12 Then Samuel took a stone and set it between Mizpah and Shen, and called its name Ebenezer,\f + \fr 7:12 \ft “Ebenezer” means “stone of help”.\f* saying, “Yahweh helped us until now.” +\v 13 So the Philistines were subdued, and they stopped coming within the border of Israel. Yahweh’s hand was against the Philistines all the days of Samuel. +\p +\v 14 The cities which the Philistines had taken from Israel were restored to Israel, from Ekron even to Gath; and Israel recovered its border out of the hand of the Philistines. There was peace between Israel and the Amorites. +\p +\v 15 Samuel judged Israel all the days of his life. +\v 16 He went from year to year in a circuit to Bethel, Gilgal, and Mizpah; and he judged Israel in all those places. +\v 17 His return was to Ramah, for his house was there, and he judged Israel there; and he built an altar to Yahweh there. +\c 8 +\p +\v 1 When Samuel was old, he made his sons judges over Israel. +\v 2 Now the name of his firstborn was Joel, and the name of his second, Abijah. They were judges in Beersheba. +\v 3 His sons didn’t walk in his ways, but turned away after dishonest gain, took bribes, and perverted justice. +\p +\v 4 Then all the elders of Israel gathered themselves together and came to Samuel to Ramah. +\v 5 They said to him, “Behold, you are old, and your sons don’t walk in your ways. Now make us a king to judge us like all the nations.” +\v 6 But the thing displeased Samuel when they said, “Give us a king to judge us.” +\p Samuel prayed to Yahweh. +\v 7 Yahweh said to Samuel, “Listen to the voice of the people in all that they tell you; for they have not rejected you, but they have rejected me as the king over them. +\v 8 According to all the works which they have done since the day that I brought them up out of Egypt even to this day, in that they have forsaken me and served other gods, so they also do to you. +\v 9 Now therefore, listen to their voice. However, you shall protest solemnly to them, and shall show them the way of the king who will reign over them.” +\p +\v 10 Samuel told all Yahweh’s words to the people who asked him for a king. +\v 11 He said, “This will be the way of the king who shall reign over you: he will take your sons and appoint them as his servants, for his chariots and to be his horsemen; and they will run before his chariots. +\v 12 He will appoint them to him for captains of thousands and captains of fifties; and he will assign some to plow his ground and to reap his harvest; and to make his instruments of war and the instruments of his chariots. +\v 13 He will take your daughters to be perfumers, to be cooks, and to be bakers. +\v 14 He will take your fields, your vineyards, and your olive groves, even your best, and give them to his servants. +\v 15 He will take one tenth of your seed and of your vineyards, and give it to his officers and to his servants. +\v 16 He will take your male servants, your female servants, your best young men, and your donkeys, and assign them to his own work. +\v 17 He will take one tenth of your flocks; and you will be his servants. +\v 18 You will cry out in that day because of your king whom you will have chosen for yourselves; and Yahweh will not answer you in that day.” +\p +\v 19 But the people refused to listen to the voice of Samuel; and they said, “No, but we will have a king over us, +\v 20 that we also may be like all the nations; and that our king may judge us, and go out before us, and fight our battles.” +\p +\v 21 Samuel heard all the words of the people, and he rehearsed them in the ears of Yahweh. +\v 22 Yahweh said to Samuel, “Listen to their voice, and make them a king.” +\p Samuel said to the men of Israel, “Everyone go to your own city.” +\c 9 +\p +\v 1 Now there was a man of Benjamin, whose name was Kish the son of Abiel, the son of Zeror, the son of Becorath, the son of Aphiah, the son of a Benjamite, a mighty man of valor. +\v 2 He had a son whose name was Saul, an impressive young man; and there was not among the children of Israel a more handsome person than he. From his shoulders and upward he was taller than any of the people. +\p +\v 3 The donkeys of Kish, Saul’s father, were lost. Kish said to Saul his son, “Now take one of the servants with you, and arise, go look for the donkeys.” +\v 4 He passed through the hill country of Ephraim, and passed through the land of Shalishah, but they didn’t find them. Then they passed through the land of Shaalim, and they weren’t there. Then he passed through the land of the Benjamites, but they didn’t find them. +\p +\v 5 When they had come to the land of Zuph, Saul said to his servant who was with him, “Come! Let’s return, lest my father stop caring about the donkeys and be anxious for us.” +\p +\v 6 The servant said to him, “Behold now, there is a man of God in this city, and he is a man who is held in honor. All that he says surely happens. Now let’s go there. Perhaps he can tell us which way to go.” +\p +\v 7 Then Saul said to his servant, “But behold, if we go, what should we bring the man? For the bread is spent in our sacks, and there is not a present to bring to the man of God. What do we have?” +\p +\v 8 The servant answered Saul again and said, “Behold, I have in my hand the fourth part of a shekel\f + \fr 9:8 \ft A shekel is about 10 grams or about 0.35 ounces, so 1/4 shekel would be a small coin of about 2.5 grams.\f* of silver. I will give that to the man of God, to tell us our way.” +\v 9 (In earlier times in Israel, when a man went to inquire of God, he said, “Come! Let’s go to the seer;” for he who is now called a prophet was before called a seer.) +\p +\v 10 Then Saul said to his servant, “Well said. Come! Let’s go.” So they went to the city where the man of God was. +\v 11 As they went up the ascent to the city, they found young maidens going out to draw water, and said to them, “Is the seer here?” +\p +\v 12 They answered them and said, “He is. Behold, he is before you. Hurry now, for he has come today into the city; for the people have a sacrifice today in the high place. +\v 13 As soon as you have come into the city, you will immediately find him before he goes up to the high place to eat; for the people will not eat until he comes, because he blesses the sacrifice. Afterwards those who are invited eat. Now therefore go up; for at this time you will find him.” +\p +\v 14 They went up to the city. As they came within the city, behold, Samuel came out toward them to go up to the high place. +\p +\v 15 Now Yahweh had revealed to Samuel a day before Saul came, saying, +\v 16 “Tomorrow about this time I will send you a man out of the land of Benjamin, and you shall anoint him to be prince over my people Israel. He will save my people out of the hand of the Philistines; for I have looked upon my people, because their cry has come to me.” +\p +\v 17 When Samuel saw Saul, Yahweh said to him, “Behold, the man of whom I spoke to you! He will have authority over my people.” +\p +\v 18 Then Saul approached Samuel in the gateway, and said, “Please tell me where the seer’s house is.” +\p +\v 19 Samuel answered Saul and said, “I am the seer. Go up before me to the high place, for you are to eat with me today. In the morning I will let you go and will tell you all that is in your heart. +\v 20 As for your donkeys who were lost three days ago, don’t set your mind on them, for they have been found. For whom does all Israel desire? Is it not you and all your father’s house?” +\p +\v 21 Saul answered, “Am I not a Benjamite, of the smallest of the tribes of Israel? And my family the least of all the families of the tribe of Benjamin? Why then do you speak to me like this?” +\p +\v 22 Samuel took Saul and his servant and brought them into the guest room, and made them sit in the best place among those who were invited, who were about thirty persons. +\v 23 Samuel said to the cook, “Bring the portion which I gave you, of which I said to you, ‘Set it aside.’” +\v 24 The cook took up the thigh, and that which was on it, and set it before Saul. Samuel said, “Behold, that which has been reserved! Set it before yourself and eat; because it has been kept for you for the appointed time, for I said, ‘I have invited the people.’” So Saul ate with Samuel that day. +\p +\v 25 When they had come down from the high place into the city, he talked with Saul on the housetop. +\v 26 They arose early; and about daybreak, Samuel called to Saul on the housetop, saying, “Get up, that I may send you away.” Saul arose, and they both went outside, he and Samuel, together. +\v 27 As they were going down at the end of the city, Samuel said to Saul, “Tell the servant to go on ahead of us.” He went ahead, then Samuel said, “But stand still first, that I may cause you to hear God’s message.” +\c 10 +\p +\v 1 Then Samuel took the vial of oil and poured it on his head, then kissed him and said, “Hasn’t Yahweh anointed you to be prince over his inheritance? +\v 2 When you have departed from me today, then you will find two men by Rachel’s tomb, on the border of Benjamin at Zelzah. They will tell you, ‘The donkeys which you went to look for have been found; and behold, your father has stopped caring about the donkeys and is anxious for you, saying, “What shall I do for my son?”’ +\p +\v 3 “Then you will go on forward from there, and you will come to the oak of Tabor. Three men will meet you there going up to God to Bethel: one carrying three young goats, and another carrying three loaves of bread, and another carrying a container of wine. +\v 4 They will greet you and give you two loaves of bread, which you shall receive from their hand. +\p +\v 5 “After that you will come to the hill of God, where the garrison of the Philistines is; and it will happen, when you have come there to the city, that you will meet a band of prophets coming down from the high place with a lute, a tambourine, a pipe, and a harp before them; and they will be prophesying. +\v 6 Then Yahweh’s Spirit will come mightily on you, then you will prophesy with them and will be turned into another man. +\v 7 Let it be, when these signs have come to you, that you do what is appropriate for the occasion; for God is with you. +\p +\v 8 “Go down ahead of me to Gilgal; and behold, I will come down to you to offer burnt offerings and to sacrifice sacrifices of peace offerings. Wait seven days, until I come to you and show you what you are to do.” +\v 9 It was so, that when he had turned his back to go from Samuel, God gave him another heart; and all those signs happened that day. +\v 10 When they came there to the hill, behold, a band of prophets met him; and the Spirit of God came mightily on him, and he prophesied among them. +\v 11 When all who knew him before saw that, behold, he prophesied with the prophets, then the people said to one another, “What is this that has come to the son of Kish? Is Saul also among the prophets?” +\p +\v 12 One from the same place answered, “Who is their father?” Therefore it became a proverb, “Is Saul also among the prophets?” +\v 13 When he had finished prophesying, he came to the high place. +\p +\v 14 Saul’s uncle said to him and to his servant, “Where did you go?” +\p He said, “To seek the donkeys. When we saw that they were not found, we came to Samuel.” +\p +\v 15 Saul’s uncle said, “Please tell me what Samuel said to you.” +\p +\v 16 Saul said to his uncle, “He told us plainly that the donkeys were found.” But concerning the matter of the kingdom, of which Samuel spoke, he didn’t tell him. +\p +\v 17 Samuel called the people together to Yahweh to Mizpah; +\v 18 and he said to the children of Israel, “Yahweh, the God of Israel, says ‘I brought Israel up out of Egypt and I delivered you out of the hand of the Egyptians, and out of the hand of all the kingdoms that oppressed you.’ +\v 19 But you have today rejected your God, who himself saves you out of all your calamities and your distresses; and you have said to him, ‘No! Set a king over us!’ Now therefore present yourselves before Yahweh by your tribes and by your thousands.” +\p +\v 20 So Samuel brought all the tribes of Israel near, and the tribe of Benjamin was chosen. +\v 21 He brought the tribe of Benjamin near by their families and the family of the Matrites was chosen. Then Saul the son of Kish was chosen; but when they looked for him, he could not be found. +\v 22 Therefore they asked of Yahweh further, “Is there yet a man to come here?” +\p Yahweh answered, “Behold, he has hidden himself among the baggage.” +\p +\v 23 They ran and got him there. When he stood among the people, he was higher than any of the people from his shoulders and upward. +\v 24 Samuel said to all the people, “Do you see him whom Yahweh has chosen, that there is no one like him among all the people?” +\p All the people shouted and said, “Long live the king!” +\p +\v 25 Then Samuel told the people the regulations of the kingdom, and wrote it in a book and laid it up before Yahweh. Samuel sent all the people away, every man to his house. +\v 26 Saul also went to his house in Gibeah; and the army went with him, whose hearts God had touched. +\v 27 But certain worthless fellows said, “How could this man save us?” They despised him, and brought him no tribute. But he held his peace. +\c 11 +\p +\v 1 Then Nahash the Ammonite came up and encamped against Jabesh Gilead; and all the men of Jabesh said to Nahash, “Make a covenant with us, and we will serve you.” +\p +\v 2 Nahash the Ammonite said to them, “On this condition I will make it with you, that all your right eyes be gouged out. I will make this dishonor all Israel.” +\p +\v 3 The elders of Jabesh said to him, “Give us seven days, that we may send messengers to all the borders of Israel; and then, if there is no one to save us, we will come out to you.” +\v 4 Then the messengers came to Gibeah of Saul, and spoke these words in the ears of the people, then all the people lifted up their voice and wept. +\p +\v 5 Behold, Saul came following the oxen out of the field; and Saul said, “What ails the people that they weep?” They told him the words of the men of Jabesh. +\v 6 God’s Spirit came mightily on Saul when he heard those words, and his anger burned hot. +\v 7 He took a yoke of oxen and cut them in pieces, then sent them throughout all the borders of Israel by the hand of messengers, saying, “Whoever doesn’t come out after Saul and after Samuel, so shall it be done to his oxen.” The dread of Yahweh fell on the people, and they came out as one man. +\v 8 He counted them in Bezek; and the children of Israel were three hundred thousand, and the men of Judah thirty thousand. +\v 9 They said to the messengers who came, “Tell the men of Jabesh Gilead, ‘Tomorrow, by the time the sun is hot, you will be rescued.’” The messengers came and told the men of Jabesh; and they were glad. +\v 10 Therefore the men of Jabesh said, “Tomorrow we will come out to you, and you shall do with us all that seems good to you.” +\v 11 On the next day, Saul put the people in three companies; and they came into the middle of the camp in the morning watch, and struck the Ammonites until the heat of the day. Those who remained were scattered, so that no two of them were left together. +\p +\v 12 The people said to Samuel, “Who is he who said, ‘Shall Saul reign over us?’ Bring those men, that we may put them to death!” +\p +\v 13 Saul said, “No man shall be put to death today; for today Yahweh has rescued Israel.” +\p +\v 14 Then Samuel said to the people, “Come! Let’s go to Gilgal, and renew the kingdom there.” +\v 15 All the people went to Gilgal; and there they made Saul king before Yahweh in Gilgal. There they offered sacrifices of peace offerings before Yahweh; and there Saul and all the men of Israel rejoiced greatly. +\c 12 +\p +\v 1 Samuel said to all Israel, “Behold, I have listened to your voice in all that you said to me, and have made a king over you. +\v 2 Now, behold, the king walks before you. I am old and gray-headed. Behold, my sons are with you. I have walked before you from my youth to this day. +\v 3 Here I am. Witness against me before Yahweh and before his anointed. Whose ox have I taken? Whose donkey have I taken? Whom have I defrauded? Whom have I oppressed? Of whose hand have I taken a bribe to make me blind my eyes? I will restore it to you.” +\p +\v 4 They said, “You have not defrauded us, nor oppressed us, neither have you taken anything from anyone’s hand.” +\p +\v 5 He said to them, “Yahweh is witness against you, and his anointed is witness today, that you have not found anything in my hand.” +\p They said, “He is witness.” +\v 6 Samuel said to the people, “It is Yahweh who appointed Moses and Aaron, and that brought your fathers up out of the land of Egypt. +\v 7 Now therefore stand still, that I may plead with you before Yahweh concerning all the righteous acts of Yahweh, which he did to you and to your fathers. +\p +\v 8 “When Jacob had come into Egypt, and your fathers cried to Yahweh, then Yahweh sent Moses and Aaron, who brought your fathers out of Egypt, and made them to dwell in this place. +\v 9 But they forgot Yahweh their God; and he sold them into the hand of Sisera, captain of the army of Hazor, and into the hand of the Philistines, and into the hand of the king of Moab; and they fought against them. +\v 10 They cried to Yahweh, and said, ‘We have sinned, because we have forsaken Yahweh and have served the Baals and the Ashtaroth; but now deliver us out of the hand of our enemies, and we will serve you.’ +\v 11 Yahweh sent Jerubbaal, Bedan, Jephthah, and Samuel, and delivered you out of the hand of your enemies on every side; and you lived in safety. +\p +\v 12 “When you saw that Nahash the king of the children of Ammon came against you, you said to me, ‘No, but a king shall reign over us,’ when Yahweh your God was your king. +\v 13 Now therefore see the king whom you have chosen and whom you have asked for. Behold, Yahweh has set a king over you. +\v 14 If you will fear Yahweh, and serve him, and listen to his voice, and not rebel against the commandment of Yahweh, then both you and also the king who reigns over you are followers of Yahweh your God. +\v 15 But if you will not listen to Yahweh’s voice, but rebel against the commandment of Yahweh, then Yahweh’s hand will be against you, as it was against your fathers. +\p +\v 16 “Now therefore stand still and see this great thing, which Yahweh will do before your eyes. +\v 17 Isn’t it wheat harvest today? I will call to Yahweh, that he may send thunder and rain; and you will know and see that your wickedness is great, which you have done in Yahweh’s sight, in asking for a king.” +\p +\v 18 So Samuel called to Yahweh, and Yahweh sent thunder and rain that day. Then all the people greatly feared Yahweh and Samuel. +\p +\v 19 All the people said to Samuel, “Pray for your servants to Yahweh your God, that we not die; for we have added to all our sins this evil, to ask for a king.” +\p +\v 20 Samuel said to the people, “Don’t be afraid. You have indeed done all this evil; yet don’t turn away from following Yahweh, but serve Yahweh with all your heart. +\v 21 Don’t turn away to go after vain things which can’t profit or deliver, for they are vain. +\v 22 For Yahweh will not forsake his people for his great name’s sake, because it has pleased Yahweh to make you a people for himself. +\v 23 Moreover, as for me, far be it from me that I should sin against Yahweh in ceasing to pray for you; but I will instruct you in the good and the right way. +\v 24 Only fear Yahweh, and serve him in truth with all your heart; for consider what great things he has done for you. +\v 25 But if you keep doing evil, you will be consumed, both you and your king.” +\c 13 +\p +\v 1 Saul was thirty years old when he became king, and he reigned over Israel forty-two years.\f + \fr 13:1 \ft The traditional Hebrew text omits “thirty” and “forty-”. The blanks are filled in here from a few manuscripts of the Septuagint.\f* +\p +\v 2 Saul chose for himself three thousand men of Israel, of which two thousand were with Saul in Michmash and in the Mount of Bethel, and one thousand were with Jonathan in Gibeah of Benjamin. He sent the rest of the people to their own tents. +\v 3 Jonathan struck the garrison of the Philistines that was in Geba, and the Philistines heard of it. Saul blew the trumpet throughout all the land, saying, “Let the Hebrews hear!” +\v 4 All Israel heard that Saul had struck the garrison of the Philistines, and also that Israel was considered an abomination to the Philistines. The people were gathered together after Saul to Gilgal. +\v 5 The Philistines assembled themselves together to fight with Israel: thirty thousand chariots, six thousand horsemen, and people as the sand which is on the seashore in multitude. They came up and encamped in Michmash, eastward of Beth Aven. +\v 6 When the men of Israel saw that they were in trouble (for the people were distressed), then the people hid themselves in caves, in thickets, in rocks, in tombs, and in pits. +\v 7 Now some of the Hebrews had gone over the Jordan to the land of Gad and Gilead; but as for Saul, he was yet in Gilgal, and all the people followed him trembling. +\v 8 He stayed seven days, according to the time set by Samuel; but Samuel didn’t come to Gilgal, and the people were scattering from him. +\v 9 Saul said, “Bring the burnt offering to me here, and the peace offerings.” He offered the burnt offering. +\p +\v 10 It came to pass that as soon as he had finished offering the burnt offering, behold, Samuel came; and Saul went out to meet him, that he might greet him. +\v 11 Samuel said, “What have you done?” +\p Saul said, “Because I saw that the people were scattered from me, and that you didn’t come within the days appointed, and that the Philistines assembled themselves together at Michmash, +\v 12 therefore I said, ‘Now the Philistines will come down on me to Gilgal, and I haven’t entreated the favor of Yahweh.’ I forced myself therefore, and offered the burnt offering.” +\p +\v 13 Samuel said to Saul, “You have done foolishly. You have not kept the commandment of Yahweh your God, which he commanded you; for now Yahweh would have established your kingdom on Israel forever. +\v 14 But now your kingdom will not continue. Yahweh has sought for himself a man after his own heart, and Yahweh has appointed him to be prince over his people, because you have not kept that which Yahweh commanded you.” +\p +\v 15 Samuel arose, and went from Gilgal to Gibeah of Benjamin. Saul counted the people who were present with him, about six hundred men. +\v 16 Saul, and Jonathan his son, and the people who were present with them, stayed in Geba of Benjamin; but the Philistines encamped in Michmash. +\v 17 The raiders came out of the camp of the Philistines in three companies: one company turned to the way that leads to Ophrah, to the land of Shual; +\v 18 another company turned the way to Beth Horon; and another company turned the way of the border that looks down on the valley of Zeboim toward the wilderness. +\v 19 Now there was no blacksmith found throughout all the land of Israel, for the Philistines said, “Lest the Hebrews make themselves swords or spears”; +\v 20 but all the Israelites went down to the Philistines, each man to sharpen his own plowshare, mattock, ax, and sickle. +\v 21 The price was one payim\f + \fr 13:21 \ft A payim (or pim) was 2/3 shekel of silver, or 0.26 ounces, or 7.6 grams\f* each to sharpen mattocks, plowshares, pitchforks, axes, and goads. +\v 22 So it came to pass in the day of battle that neither sword nor spear was found in the hand of any of the people who were with Saul and Jonathan; but Saul and Jonathan his son had them. +\p +\v 23 The garrison of the Philistines went out to the pass of Michmash. +\c 14 +\p +\v 1 Now it happened on a day that Jonathan the son of Saul said to the young man who bore his armor, “Come! Let’s go over to the Philistines’ garrison that is on the other side.” But he didn’t tell his father. +\v 2 Saul stayed in the uttermost part of Gibeah under the pomegranate tree which is in Migron; and the people who were with him were about six hundred men, +\v 3 including Ahijah the son of Ahitub, Ichabod’s brother, the son of Phinehas, the son of Eli the priest of Yahweh in Shiloh, wearing an ephod. The people didn’t know that Jonathan was gone. +\p +\v 4 Between the passes, by which Jonathan sought to go over to the Philistines’ garrison, there was a rocky crag on the one side and a rocky crag on the other side; and the name of the one was Bozez, and the name of the other Seneh. +\v 5 The one crag rose up on the north in front of Michmash, and the other on the south in front of Geba. +\v 6 Jonathan said to the young man who bore his armor, “Come! Let’s go over to the garrison of these uncircumcised. It may be that Yahweh will work for us, for there is no restraint on Yahweh to save by many or by few.” +\p +\v 7 His armor bearer said to him, “Do all that is in your heart. Go, and behold, I am with you according to your heart.” +\p +\v 8 Then Jonathan said, “Behold, we will pass over to the men, and we will reveal ourselves to them. +\v 9 If they say this to us, ‘Wait until we come to you!’ then we will stand still in our place and will not go up to them. +\v 10 But if they say this, ‘Come up to us!’ then we will go up, for Yahweh has delivered them into our hand. This shall be the sign to us.” +\p +\v 11 Both of them revealed themselves to the garrison of the Philistines; and the Philistines said, “Behold, the Hebrews are coming out of the holes where they had hidden themselves!” +\v 12 The men of the garrison answered Jonathan and his armor bearer, and said, “Come up to us, and we will show you something!” +\p Jonathan said to his armor bearer, “Come up after me, for Yahweh has delivered them into the hand of Israel.” +\v 13 Jonathan climbed up on his hands and on his feet, and his armor bearer after him, and they fell before Jonathan; and his armor bearer killed them after him. +\v 14 That first slaughter, which Jonathan and his armor bearer made, was about twenty men, within as it were half a furrow’s length in an acre of land. +\p +\v 15 There was a trembling in the camp, in the field, and among all the people; the garrison and the raiders also trembled; and the earth quaked, so there was an exceedingly great trembling. +\v 16 The watchmen of Saul in Gibeah of Benjamin looked; and behold, the multitude melted away and scattered. +\v 17 Then Saul said to the people who were with him, “Count now, and see who is missing from us.” When they had counted, behold, Jonathan and his armor bearer were not there. +\p +\v 18 Saul said to Ahijah, “Bring God’s ark here.” For God’s ark was with the children of Israel at that time. +\v 19 While Saul talked to the priest, the tumult that was in the camp of the Philistines went on and increased; and Saul said to the priest, “Withdraw your hand!” +\p +\v 20 Saul and all the people who were with him were gathered together, and came to the battle; and behold, they were all striking each other with their swords in very great confusion. +\v 21 Now the Hebrews who were with the Philistines before and who went up with them into the camp from all around, even they also turned to be with the Israelites who were with Saul and Jonathan. +\v 22 Likewise all the men of Israel who had hidden themselves in the hill country of Ephraim, when they heard that the Philistines fled, even they also followed hard after them in the battle. +\v 23 So Yahweh saved Israel that day; and the battle passed over by Beth Aven. +\p +\v 24 The men of Israel were distressed that day; for Saul had adjured the people, saying, “Cursed is the man who eats any food until it is evening, and I am avenged of my enemies.” So none of the people tasted food. +\p +\v 25 All the people came into the forest; and there was honey on the ground. +\v 26 When the people had come to the forest, behold, honey was dripping, but no one put his hand to his mouth, for the people feared the oath. +\v 27 But Jonathan didn’t hear when his father commanded the people with the oath. Therefore he put out the end of the rod that was in his hand and dipped it in the honeycomb, and put his hand to his mouth; and his eyes brightened. +\v 28 Then one of the people answered, and said, “Your father directly commanded the people with an oath, saying, ‘Cursed is the man who eats food today.’” So the people were faint. +\p +\v 29 Then Jonathan said, “My father has troubled the land. Please look how my eyes have brightened because I tasted a little of this honey. +\v 30 How much more, if perhaps the people had eaten freely today of the plunder of their enemies which they found? For now there has been no great slaughter among the Philistines.” +\v 31 They struck the Philistines that day from Michmash to Aijalon. The people were very faint; +\v 32 and the people pounced on the plunder, and took sheep, cattle, and calves, and killed them on the ground; and the people ate them with the blood. +\v 33 Then they told Saul, saying, “Behold, the people are sinning against Yahweh, in that they eat meat with the blood.” +\p He said, “You have dealt treacherously. Roll a large stone to me today!” +\v 34 Saul said, “Disperse yourselves among the people, and tell them, ‘Every man bring me here his ox, and every man his sheep, and kill them here, and eat; and don’t sin against Yahweh in eating meat with the blood.’” All the people brought every man his ox with him that night, and killed them there. +\p +\v 35 Saul built an altar to Yahweh. This was the first altar that he built to Yahweh. +\v 36 Saul said, “Let’s go down after the Philistines by night, and take plunder among them until the morning light. Let’s not leave a man of them.” +\p They said, “Do whatever seems good to you.” +\p Then the priest said, “Let’s draw near here to God.” +\p +\v 37 Saul asked counsel of God: “Shall I go down after the Philistines? Will you deliver them into the hand of Israel?” But he didn’t answer him that day. +\v 38 Saul said, “Draw near here, all you chiefs of the people, and know and see in whom this sin has been today. +\v 39 For as Yahweh lives, who saves Israel, though it is in Jonathan my son, he shall surely die.” But there was not a man among all the people who answered him. +\v 40 Then he said to all Israel, “You be on one side, and I and Jonathan my son will be on the other side.” +\p The people said to Saul, “Do what seems good to you.” +\p +\v 41 Therefore Saul said to Yahweh, the God of Israel, “Show the right.” +\p Jonathan and Saul were chosen, but the people escaped. +\p +\v 42 Saul said, “Cast lots between me and Jonathan my son.” +\p Jonathan was selected. +\p +\v 43 Then Saul said to Jonathan, “Tell me what you have done!” +\p Jonathan told him, and said, “I certainly did taste a little honey with the end of the rod that was in my hand; and behold, I must die.” +\p +\v 44 Saul said, “God do so and more also; for you shall surely die, Jonathan.” +\p +\v 45 The people said to Saul, “Shall Jonathan die, who has worked this great salvation in Israel? Far from it! As Yahweh lives, there shall not one hair of his head fall to the ground, for he has worked with God today!” So the people rescued Jonathan, so he didn’t die. +\v 46 Then Saul went up from following the Philistines; and the Philistines went to their own place. +\p +\v 47 Now when Saul had taken the kingdom over Israel, he fought against all his enemies on every side: against Moab, and against the children of Ammon, and against Edom, and against the kings of Zobah, and against the Philistines. Wherever he turned himself, he defeated them. +\v 48 He did valiantly and struck the Amalekites, and delivered Israel out of the hands of those who plundered them. +\v 49 Now the sons of Saul were Jonathan, Ishvi, and Malchishua; and the names of his two daughters were these: the name of the firstborn Merab, and the name of the younger Michal. +\v 50 The name of Saul’s wife was Ahinoam the daughter of Ahimaaz. The name of the captain of his army was Abner the son of Ner, Saul’s uncle. +\v 51 Kish was the father of Saul, and Ner the father of Abner was the son of Abiel. +\p +\v 52 There was severe war against the Philistines all the days of Saul; and when Saul saw any mighty man or any valiant man, he took him into his service. +\c 15 +\p +\v 1 Samuel said to Saul, “Yahweh sent me to anoint you to be king over his people, over Israel. Now therefore listen to the voice of Yahweh’s words. +\v 2 Yahweh of Armies says, ‘I remember what Amalek did to Israel, how he set himself against him on the way when he came up out of Egypt. +\v 3 Now go and strike Amalek, and utterly destroy all that they have, and don’t spare them; but kill both man and woman, infant and nursing baby, ox and sheep, camel and donkey.’” +\p +\v 4 Saul summoned the people, and counted them in Telaim, two hundred thousand footmen and ten thousand men of Judah. +\v 5 Saul came to the city of Amalek, and set an ambush in the valley. +\v 6 Saul said to the Kenites, “Go, depart, go down from among the Amalekites, lest I destroy you with them; for you showed kindness to all the children of Israel when they came up out of Egypt.” So the Kenites departed from among the Amalekites. +\p +\v 7 Saul struck the Amalekites, from Havilah as you go to Shur, which is before Egypt. +\v 8 He took Agag the king of the Amalekites alive, and utterly destroyed all the people with the edge of the sword. +\v 9 But Saul and the people spared Agag and the best of the sheep, of the cattle, of the fat calves, of the lambs, and all that was good, and were not willing to utterly destroy them; but everything that was vile and refuse, that they destroyed utterly. +\p +\v 10 Then Yahweh’s word came to Samuel, saying, +\v 11 “It grieves me that I have set up Saul to be king, for he has turned back from following me, and has not performed my commandments.” Samuel was angry; and he cried to Yahweh all night. +\p +\v 12 Samuel rose early to meet Saul in the morning; and Samuel was told, saying, “Saul came to Carmel, and behold, he set up a monument for himself, turned, passed on, and went down to Gilgal.” +\p +\v 13 Samuel came to Saul; and Saul said to him, “You are blessed by Yahweh! I have performed the commandment of Yahweh.” +\p +\v 14 Samuel said, “Then what does this bleating of the sheep in my ears and the lowing of the cattle which I hear mean?” +\p +\v 15 Saul said, “They have brought them from the Amalekites; for the people spared the best of the sheep and of the cattle, to sacrifice to Yahweh your God. We have utterly destroyed the rest.” +\p +\v 16 Then Samuel said to Saul, “Stay, and I will tell you what Yahweh said to me last night.” +\p He said to him, “Say on.” +\p +\v 17 Samuel said, “Though you were little in your own sight, weren’t you made the head of the tribes of Israel? Yahweh anointed you king over Israel; +\v 18 and Yahweh sent you on a journey, and said, ‘Go, and utterly destroy the sinners the Amalekites, and fight against them until they are consumed.’ +\v 19 Why then didn’t you obey Yahweh’s voice, but took the plunder, and did that which was evil in Yahweh’s sight?” +\p +\v 20 Saul said to Samuel, “But I have obeyed Yahweh’s voice, and have gone the way which Yahweh sent me, and have brought Agag the king of Amalek, and have utterly destroyed the Amalekites. +\v 21 But the people took of the plunder, sheep and cattle, the best of the devoted things, to sacrifice to Yahweh your God in Gilgal.” +\p +\v 22 Samuel said, “Has Yahweh as great delight in burnt offerings and sacrifices, as in obeying Yahweh’s voice? Behold, to obey is better than sacrifice, and to listen than the fat of rams. +\v 23 For rebellion is as the sin of witchcraft, and stubbornness is as idolatry and teraphim.\f + \fr 15:23 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* Because you have rejected Yahweh’s word, he has also rejected you from being king.” +\p +\v 24 Saul said to Samuel, “I have sinned; for I have transgressed the commandment of Yahweh and your words, because I feared the people and obeyed their voice. +\v 25 Now therefore, please pardon my sin, and turn again with me, that I may worship Yahweh.” +\p +\v 26 Samuel said to Saul, “I will not return with you; for you have rejected Yahweh’s word, and Yahweh has rejected you from being king over Israel.” +\v 27 As Samuel turned around to go away, Saul grabbed the skirt of his robe, and it tore. +\v 28 Samuel said to him, “Yahweh has torn the kingdom of Israel from you today, and has given it to a neighbor of yours who is better than you. +\v 29 Also the Strength of Israel will not lie nor repent; for he is not a man, that he should repent.” +\p +\v 30 Then he said, “I have sinned; yet please honor me now before the elders of my people and before Israel, and come back with me, that I may worship Yahweh your God.” +\p +\v 31 So Samuel went back with Saul; and Saul worshiped Yahweh. +\v 32 Then Samuel said, “Bring Agag the king of the Amalekites here to me!” +\p Agag came to him cheerfully. Agag said, “Surely the bitterness of death is past.” +\p +\v 33 Samuel said, “As your sword has made women childless, so your mother will be childless among women!” Then Samuel cut Agag in pieces before Yahweh in Gilgal. +\p +\v 34 Then Samuel went to Ramah; and Saul went up to his house to Gibeah of Saul. +\v 35 Samuel came no more to see Saul until the day of his death, but Samuel mourned for Saul. Yahweh grieved that he had made Saul king over Israel. +\c 16 +\p +\v 1 Yahweh said to Samuel, “How long will you mourn for Saul, since I have rejected him from being king over Israel? Fill your horn with oil, and go. I will send you to Jesse the Bethlehemite, for I have provided a king for myself among his sons.” +\p +\v 2 Samuel said, “How can I go? If Saul hears it, he will kill me.” +\p Yahweh said, “Take a heifer with you, and say, ‘I have come to sacrifice to Yahweh.’ +\v 3 Call Jesse to the sacrifice, and I will show you what you shall do. You shall anoint to me him whom I name to you.” +\p +\v 4 Samuel did that which Yahweh spoke, and came to Bethlehem. The elders of the city came to meet him trembling, and said, “Do you come peaceably?” +\p +\v 5 He said, “Peaceably; I have come to sacrifice to Yahweh. Sanctify yourselves, and come with me to the sacrifice.” He sanctified Jesse and his sons, and called them to the sacrifice. +\v 6 When they had come, he looked at Eliab, and said, “Surely Yahweh’s anointed is before him.” +\p +\v 7 But Yahweh said to Samuel, “Don’t look on his face, or on the height of his stature, because I have rejected him; for I don’t see as man sees. For man looks at the outward appearance, but Yahweh looks at the heart.” +\p +\v 8 Then Jesse called Abinadab, and made him pass before Samuel. He said, “Yahweh has not chosen this one, either.” +\v 9 Then Jesse made Shammah to pass by. He said, “Yahweh has not chosen this one, either.” +\v 10 Jesse made seven of his sons to pass before Samuel. Samuel said to Jesse, “Yahweh has not chosen these.” +\v 11 Samuel said to Jesse, “Are all your children here?” +\p He said, “There remains yet the youngest. Behold, he is keeping the sheep.” +\p Samuel said to Jesse, “Send and get him, for we will not sit down until he comes here.” +\p +\v 12 He sent, and brought him in. Now he was ruddy, with a handsome face and good appearance. Yahweh said, “Arise! Anoint him, for this is he.” +\p +\v 13 Then Samuel took the horn of oil and anointed him in the middle of his brothers. Then Yahweh’s Spirit came mightily on David from that day forward. So Samuel rose up and went to Ramah. +\v 14 Now Yahweh’s Spirit departed from Saul, and an evil spirit from Yahweh troubled him. +\v 15 Saul’s servants said to him, “See now, an evil spirit from God troubles you. +\v 16 Let our lord now command your servants who are in front of you to seek out a man who is a skillful player on the harp. Then when the evil spirit from God is on you, he will play with his hand, and you will be well.” +\p +\v 17 Saul said to his servants, “Provide me now a man who can play well, and bring him to me.” +\p +\v 18 Then one of the young men answered and said, “Behold, I have seen a son of Jesse the Bethlehemite who is skillful in playing, a mighty man of valor, a man of war, prudent in speech, and a handsome person; and Yahweh is with him.” +\p +\v 19 Therefore Saul sent messengers to Jesse, and said, “Send me David your son, who is with the sheep.” +\p +\v 20 Jesse took a donkey loaded with bread, a container of wine, and a young goat, and sent them by David his son to Saul. +\v 21 David came to Saul and stood before him. He loved him greatly; and he became his armor bearer. +\v 22 Saul sent to Jesse, saying, “Please let David stand before me, for he has found favor in my sight.” +\v 23 When the spirit from God was on Saul, David took the harp and played with his hand; so Saul was refreshed and was well, and the evil spirit departed from him. +\c 17 +\p +\v 1 Now the Philistines gathered together their armies to battle; and they were gathered together at Socoh, which belongs to Judah, and encamped between Socoh and Azekah in Ephesdammim. +\v 2 Saul and the men of Israel were gathered together, and encamped in the valley of Elah, and set the battle in array against the Philistines. +\v 3 The Philistines stood on the mountain on the one side, and Israel stood on the mountain on the other side: and there was a valley between them. +\v 4 A champion out of the camp of the Philistines named Goliath of Gath, whose height was six cubits and a span\f + \fr 17:4 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters. A span is the length from the tip of a man’s thumb to the tip of his little finger when his hand is stretched out (about half a cubit, or 9 inches, or 22.8 cm.) Therefore, Goliath was about 9 feet and 9 inches or 2.97 meters tall.\f* went out. +\v 5 He had a helmet of bronze on his head, and he wore a coat of mail; and the weight of the coat was five thousand shekels\f + \fr 17:5 \ft A shekel is about 10 grams or about 0.35 ounces, so 5000 shekels is about 50 kilograms or 110 pounds.\f* of bronze. +\v 6 He had bronze shin armor on his legs and a bronze javelin between his shoulders. +\v 7 The staff of his spear was like a weaver’s beam; and his spear’s head weighed six hundred shekels of iron.\f + \fr 17:7 \ft A shekel is about 10 grams or about 0.35 ounces, so 600 shekels is about 6 kilograms or about 13 pounds.\f* His shield bearer went before him. +\v 8 He stood and cried to the armies of Israel, and said to them, “Why have you come out to set your battle in array? Am I not a Philistine, and you servants to Saul? Choose a man for yourselves, and let him come down to me. +\v 9 If he is able to fight with me and kill me, then will we be your servants; but if I prevail against him and kill him, then you will be our servants and serve us.” +\v 10 The Philistine said, “I defy the armies of Israel today! Give me a man, that we may fight together!” +\p +\v 11 When Saul and all Israel heard those words of the Philistine, they were dismayed and greatly afraid. +\v 12 Now David was the son of that Ephrathite of Bethlehem Judah, whose name was Jesse; and he had eight sons. The man was an elderly old man in the days of Saul. +\v 13 The three oldest sons of Jesse had gone after Saul to the battle; and the names of his three sons who went to the battle were Eliab the firstborn, and next to him Abinadab, and the third Shammah. +\v 14 David was the youngest; and the three oldest followed Saul. +\v 15 Now David went back and forth from Saul to feed his father’s sheep at Bethlehem. +\p +\v 16 The Philistine came near morning and evening, and presented himself forty days. +\p +\v 17 Jesse said to David his son, “Now take for your brothers an ephah\f + \fr 17:17 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* of this parched grain and these ten loaves, and carry them quickly to the camp to your brothers; +\v 18 and bring these ten cheeses to the captain of their thousand; and see how your brothers are doing, and bring back news.” +\v 19 Now Saul, and they, and all the men of Israel were in the valley of Elah, fighting with the Philistines. +\p +\v 20 David rose up early in the morning and left the sheep with a keeper, and took the provisions and went, as Jesse had commanded him. He came to the place of the wagons as the army which was going out to the fight shouted for the battle. +\v 21 Israel and the Philistines put the battle in array, army against army. +\v 22 David left his baggage in the hand of the keeper of the baggage and ran to the army, and came and greeted his brothers. +\v 23 As he talked with them, behold, the champion, the Philistine of Gath, Goliath by name, came up out of the ranks of the Philistines, and said the same words; and David heard them. +\v 24 All the men of Israel, when they saw the man, fled from him and were terrified. +\v 25 The men of Israel said, “Have you seen this man who has come up? He has surely come up to defy Israel. The king will give great riches to the man who kills him, and will give him his daughter, and will make his father’s house tax-free in Israel.” +\p +\v 26 David spoke to the men who stood by him, saying, “What shall be done to the man who kills this Philistine and takes away the reproach from Israel? For who is this uncircumcised Philistine, that he should defy the armies of the living God?” +\p +\v 27 The people answered him in this way, saying, “So shall it be done to the man who kills him.” +\p +\v 28 Eliab his oldest brother heard when he spoke to the men; and Eliab’s anger burned against David, and he said, “Why have you come down? With whom have you left those few sheep in the wilderness? I know your pride and the evil of your heart; for you have come down that you might see the battle.” +\p +\v 29 David said, “What have I now done? Is there not a cause?” +\v 30 He turned away from him toward another, and spoke like that again; and the people answered him again the same way. +\v 31 When the words were heard which David spoke, they rehearsed them before Saul; and he sent for him. +\v 32 David said to Saul, “Let no man’s heart fail because of him. Your servant will go and fight with this Philistine.” +\p +\v 33 Saul said to David, “You are not able to go against this Philistine to fight with him; for you are but a youth, and he a man of war from his youth.” +\p +\v 34 David said to Saul, “Your servant was keeping his father’s sheep; and when a lion or a bear came and took a lamb out of the flock, +\v 35 I went out after him, struck him, and rescued it out of his mouth. When he arose against me, I caught him by his beard, struck him, and killed him. +\v 36 Your servant struck both the lion and the bear. This uncircumcised Philistine shall be as one of them, since he has defied the armies of the living God.” +\v 37 David said, “Yahweh, who delivered me out of the paw of the lion and out of the paw of the bear, will deliver me out of the hand of this Philistine.” +\p Saul said to David, “Go! Yahweh will be with you.” +\p +\v 38 Saul dressed David with his clothing. He put a helmet of bronze on his head, and he clad him with a coat of mail. +\v 39 David strapped his sword on his clothing and he tried to move, for he had not tested it. David said to Saul, “I can’t go with these, for I have not tested them.” Then David took them off. +\p +\v 40 He took his staff in his hand, and chose for himself five smooth stones out of the brook, and put them in the pouch of his shepherd’s bag which he had. His sling was in his hand; and he came near to the Philistine. +\v 41 The Philistine walked and came near to David; and the man who bore the shield went before him. +\v 42 When the Philistine looked around and saw David, he disdained him; for he was but a youth, and ruddy, and had a good looking face. +\v 43 The Philistine said to David, “Am I a dog, that you come to me with sticks?” The Philistine cursed David by his gods. +\v 44 The Philistine said to David, “Come to me, and I will give your flesh to the birds of the sky and to the animals of the field.” +\p +\v 45 Then David said to the Philistine, “You come to me with a sword, with a spear, and with a javelin; but I come to you in the name of Yahweh of Armies, the God of the armies of Israel, whom you have defied. +\v 46 Today, Yahweh will deliver you into my hand. I will strike you and take your head from off you. I will give the dead bodies of the army of the Philistines today to the birds of the sky and to the wild animals of the earth, that all the earth may know that there is a God in Israel, +\v 47 and that all this assembly may know that Yahweh doesn’t save with sword and spear; for the battle is Yahweh’s, and he will give you into our hand.” +\p +\v 48 When the Philistine arose, and walked and came near to meet David, David hurried and ran toward the army to meet the Philistine. +\v 49 David put his hand in his bag, took a stone and slung it, and struck the Philistine in his forehead. The stone sank into his forehead, and he fell on his face to the earth. +\v 50 So David prevailed over the Philistine with a sling and with a stone, and struck the Philistine and killed him; but there was no sword in David’s hand. +\v 51 Then David ran, stood over the Philistine, took his sword, drew it out of its sheath, killed him, and cut off his head with it. +\p When the Philistines saw that their champion was dead, they fled. +\v 52 The men of Israel and of Judah arose and shouted, and pursued the Philistines as far as Gai and to the gates of Ekron. The wounded of the Philistines fell down by the way to Shaaraim, even to Gath and to Ekron. +\v 53 The children of Israel returned from chasing after the Philistines, and they plundered their camp. +\v 54 David took the head of the Philistine and brought it to Jerusalem, but he put his armor in his tent. +\v 55 When Saul saw David go out against the Philistine, he said to Abner, the captain of the army, “Abner, whose son is this youth?” +\p Abner said, “As your soul lives, O king, I can’t tell.” +\p +\v 56 The king said, “Inquire whose son the young man is!” +\p +\v 57 As David returned from the slaughter of the Philistine, Abner took him and brought him before Saul with the head of the Philistine in his hand. +\v 58 Saul said to him, “Whose son are you, you young man?” +\p David answered, “I am the son of your servant Jesse the Bethlehemite.” +\c 18 +\p +\v 1 When he had finished speaking to Saul, the soul of Jonathan was knit with the soul of David, and Jonathan loved him as his own soul. +\v 2 Saul took him that day, and wouldn’t let him go home to his father’s house any more. +\v 3 Then Jonathan and David made a covenant, because he loved him as his own soul. +\v 4 Jonathan stripped himself of the robe that was on him and gave it to David with his clothing, even including his sword, his bow, and his sash. +\p +\v 5 David went out wherever Saul sent him, and behaved himself wisely; and Saul set him over the men of war. It was good in the sight of all the people, and also in the sight of Saul’s servants. +\p +\v 6 As they came, when David returned from the slaughter of the Philistine, the women came out of all the cities of Israel, singing and dancing, to meet King Saul with tambourines, with joy, and with instruments of music. +\v 7 The women sang to one another as they played, and said, +\q1 “Saul has slain his thousands, +\q2 and David his ten thousands.” +\p +\v 8 Saul was very angry, and this saying displeased him. He said, “They have credited David with ten thousands, and they have only credited me with thousands. What can he have more but the kingdom?” +\v 9 Saul watched David from that day and forward. +\v 10 On the next day, an evil spirit from God came mightily on Saul, and he prophesied in the middle of the house. David played with his hand, as he did day by day. Saul had his spear in his hand; +\v 11 and Saul threw the spear, for he said, “I will pin David to the wall!” David escaped from his presence twice. +\v 12 Saul was afraid of David, because Yahweh was with him, and had departed from Saul. +\v 13 Therefore Saul removed him from his presence, and made him his captain over a thousand; and he went out and came in before the people. +\p +\v 14 David behaved himself wisely in all his ways; and Yahweh was with him. +\v 15 When Saul saw that he behaved himself very wisely, he stood in awe of him. +\v 16 But all Israel and Judah loved David; for he went out and came in before them. +\v 17 Saul said to David, “Behold, my elder daughter Merab. I will give her to you as wife. Only be valiant for me, and fight Yahweh’s battles.” For Saul said, “Don’t let my hand be on him, but let the hand of the Philistines be on him.” +\p +\v 18 David said to Saul, “Who am I, and what is my life, or my father’s family in Israel, that I should be son-in-law to the king?” +\p +\v 19 But at the time when Merab, Saul’s daughter, should have been given to David, she was given to Adriel the Meholathite as wife. +\p +\v 20 Michal, Saul’s daughter, loved David; and they told Saul, and the thing pleased him. +\v 21 Saul said, I will give her to him, that she may be a snare to him and that the hand of the Philistines may be against him. Therefore Saul said to David a second time, “You shall today be my son-in-law.” +\p +\v 22 Saul commanded his servants, “Talk with David secretly, and say, ‘Behold, the king has delight in you, and all his servants love you. Now therefore be the king’s son-in-law.’” +\p +\v 23 Saul’s servants spoke those words in the ears of David. David said, “Does it seem to you a light thing to be the king’s son-in-law, since I am a poor man and little known?” +\p +\v 24 The servants of Saul told him, saying, “David spoke like this.” +\p +\v 25 Saul said, “Tell David, ‘The king desires no dowry except one hundred foreskins of the Philistines, to be avenged of the king’s enemies.’” Now Saul thought he would make David fall by the hand of the Philistines. +\v 26 When his servants told David these words, it pleased David well to be the king’s son-in-law. Before the deadline, +\v 27 David arose and went, he and his men, and killed two hundred men of the Philistines. Then David brought their foreskins, and they gave them in full number to the king, that he might be the king’s son-in-law. Then Saul gave him Michal his daughter as wife. +\v 28 Saul saw and knew that Yahweh was with David; and Michal, Saul’s daughter, loved him. +\v 29 Saul was even more afraid of David; and Saul was David’s enemy continually. +\p +\v 30 Then the princes of the Philistines went out; and as often as they went out, David behaved himself more wisely than all the servants of Saul, so that his name was highly esteemed. +\c 19 +\p +\v 1 Saul spoke to Jonathan his son and to all his servants, that they should kill David. But Jonathan, Saul’s son, greatly delighted in David. +\v 2 Jonathan told David, saying, “Saul my father seeks to kill you. Now therefore, please take care of yourself in the morning, live in a secret place, and hide yourself. +\v 3 I will go out and stand beside my father in the field where you are, and I will talk with my father about you; and if I see anything, I will tell you.” +\p +\v 4 Jonathan spoke good of David to Saul his father, and said to him, “Don’t let the king sin against his servant, against David; because he has not sinned against you, and because his works have been very good toward you; +\v 5 for he put his life in his hand and struck the Philistine, and Yahweh worked a great victory for all Israel. You saw it and rejoiced. Why then will you sin against innocent blood, to kill David without a cause?” +\p +\v 6 Saul listened to the voice of Jonathan; and Saul swore, “As Yahweh lives, he shall not be put to death.” +\p +\v 7 Jonathan called David, and Jonathan showed him all those things. Then Jonathan brought David to Saul, and he was in his presence as before. +\p +\v 8 There was war again. David went out and fought with the Philistines, and killed them with a great slaughter; and they fled before him. +\p +\v 9 An evil spirit from Yahweh was on Saul as he sat in his house with his spear in his hand; and David was playing music with his hand. +\v 10 Saul sought to pin David to the wall with the spear, but he slipped away out of Saul’s presence; and he stuck the spear into the wall. David fled and escaped that night. +\v 11 Saul sent messengers to David’s house to watch him and to kill him in the morning. Michal, David’s wife, told him, saying, “If you don’t save your life tonight, tomorrow you will be killed.” +\v 12 So Michal let David down through the window. He went away, fled, and escaped. +\v 13 Michal took the teraphim\f + \fr 19:13 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* and laid it in the bed, and put a pillow of goats’ hair at its head and covered it with clothes. +\v 14 When Saul sent messengers to take David, she said, “He is sick.” +\p +\v 15 Saul sent the messengers to see David, saying, “Bring him up to me in the bed, that I may kill him.” +\v 16 When the messengers came in, behold, the teraphim was in the bed, with the pillow of goats’ hair at its head. +\p +\v 17 Saul said to Michal, “Why have you deceived me like this and let my enemy go, so that he has escaped?” +\p Michal answered Saul, “He said to me, ‘Let me go! Why should I kill you?’” +\p +\v 18 Now David fled and escaped, and came to Samuel at Ramah, and told him all that Saul had done to him. He and Samuel went and lived in Naioth. +\v 19 Saul was told, saying, “Behold, David is at Naioth in Ramah.” +\p +\v 20 Saul sent messengers to seize David; and when they saw the company of the prophets prophesying, and Samuel standing as head over them, God’s Spirit came on Saul’s messengers, and they also prophesied. +\v 21 When Saul was told, he sent other messengers, and they also prophesied. Saul sent messengers again the third time, and they also prophesied. +\v 22 Then he also went to Ramah, and came to the great well that is in Secu: and he asked, “Where are Samuel and David?” +\p One said, “Behold, they are at Naioth in Ramah.” +\p +\v 23 He went there to Naioth in Ramah. Then God’s Spirit came on him also, and he went on, and prophesied, until he came to Naioth in Ramah. +\v 24 He also stripped off his clothes. He also prophesied before Samuel and lay down naked all that day and all that night. Therefore they say, “Is Saul also among the prophets?” +\c 20 +\p +\v 1 David fled from Naioth in Ramah, and came and said to Jonathan, “What have I done? What is my iniquity? What is my sin before your father, that he seeks my life?” +\p +\v 2 He said to him, “Far from it; you will not die. Behold, my father does nothing either great or small, but that he discloses it to me. Why would my father hide this thing from me? It is not so.” +\p +\v 3 David swore moreover, and said, “Your father knows well that I have found favor in your eyes; and he says, ‘Don’t let Jonathan know this, lest he be grieved;’ but truly as Yahweh lives, and as your soul lives, there is but a step between me and death.” +\p +\v 4 Then Jonathan said to David, “Whatever your soul desires, I will even do it for you.” +\p +\v 5 David said to Jonathan, “Behold, tomorrow is the new moon, and I should not fail to dine with the king; but let me go, that I may hide myself in the field to the third day at evening. +\v 6 If your father misses me at all, then say, ‘David earnestly asked leave of me that he might run to Bethlehem, his city; for it is the yearly sacrifice there for all the family.’ +\v 7 If he says, ‘It is well,’ your servant shall have peace; but if he is angry, then know that evil is determined by him. +\v 8 Therefore deal kindly with your servant, for you have brought your servant into a covenant of Yahweh with you; but if there is iniquity in me, kill me yourself, for why should you bring me to your father?” +\p +\v 9 Jonathan said, “Far be it from you; for if I should at all know that evil were determined by my father to come on you, then wouldn’t I tell you that?” +\p +\v 10 Then David said to Jonathan, “Who will tell me if your father answers you roughly?” +\p +\v 11 Jonathan said to David, “Come! Let’s go out into the field.” They both went out into the field. +\v 12 Jonathan said to David, “By Yahweh, the God of Israel, when I have sounded out my father about this time tomorrow, or the third day, behold, if there is good toward David, won’t I then send to you and disclose it to you? +\v 13 Yahweh do so to Jonathan and more also, should it please my father to do you evil, if I don’t disclose it to you and send you away, that you may go in peace. May Yahweh be with you as he has been with my father. +\v 14 You shall not only show me the loving kindness of Yahweh while I still live, that I not die; +\v 15 but you shall also not cut off your kindness from my house forever, no, not when Yahweh has cut off every one of the enemies of David from the surface of the earth.” +\v 16 So Jonathan made a covenant with David’s house, saying, “Yahweh will require it at the hand of David’s enemies.” +\p +\v 17 Jonathan caused David to swear again, for the love that he had to him; for he loved him as he loved his own soul. +\v 18 Then Jonathan said to him, “Tomorrow is the new moon, and you will be missed, because your seat will be empty. +\v 19 When you have stayed three days, go down quickly and come to the place where you hid yourself when this started, and remain by the stone Ezel. +\v 20 I will shoot three arrows on its side, as though I shot at a mark. +\v 21 Behold, I will send the boy, saying, ‘Go, find the arrows!’ If I tell the boy, ‘Behold, the arrows are on this side of you. Take them;’ then come, for there is peace to you and no danger, as Yahweh lives. +\v 22 But if I say this to the boy, ‘Behold, the arrows are beyond you,’ then go your way, for Yahweh has sent you away. +\v 23 Concerning the matter which you and I have spoken of, behold, Yahweh is between you and me forever.” +\p +\v 24 So David hid himself in the field. When the new moon had come, the king sat himself down to eat food. +\v 25 The king sat on his seat, as at other times, even on the seat by the wall; and Jonathan stood up, and Abner sat by Saul’s side, but David’s place was empty. +\v 26 Nevertheless Saul didn’t say anything that day, for he thought, “Something has happened to him. He is not clean. Surely he is not clean.” +\p +\v 27 On the next day after the new moon, the second day, David’s place was empty. Saul said to Jonathan his son, “Why didn’t the son of Jesse come to eat, either yesterday, or today?” +\p +\v 28 Jonathan answered Saul, “David earnestly asked permission of me to go to Bethlehem. +\v 29 He said, ‘Please let me go, for our family has a sacrifice in the city. My brother has commanded me to be there. Now, if I have found favor in your eyes, please let me go away and see my brothers.’ Therefore he has not come to the king’s table.” +\p +\v 30 Then Saul’s anger burned against Jonathan, and he said to him, “You son of a perverse rebellious woman, don’t I know that you have chosen the son of Jesse to your own shame, and to the shame of your mother’s nakedness? +\v 31 For as long as the son of Jesse lives on the earth, you will not be established, nor will your kingdom. Therefore now send and bring him to me, for he shall surely die!” +\p +\v 32 Jonathan answered Saul his father, and said to him, “Why should he be put to death? What has he done?” +\p +\v 33 Saul cast his spear at him to strike him. By this Jonathan knew that his father was determined to put David to death. +\v 34 So Jonathan arose from the table in fierce anger, and ate no food the second day of the month; for he was grieved for David, because his father had treated him shamefully. +\p +\v 35 In the morning, Jonathan went out into the field at the time appointed with David, and a little boy with him. +\v 36 He said to his boy, “Run, find now the arrows which I shoot.” As the boy ran, he shot an arrow beyond him. +\v 37 When the boy had come to the place of the arrow which Jonathan had shot, Jonathan cried after the boy, and said, “Isn’t the arrow beyond you?” +\v 38 Jonathan cried after the boy, “Go fast! Hurry! Don’t delay!” Jonathan’s boy gathered up the arrows, and came to his master. +\v 39 But the boy didn’t know anything. Only Jonathan and David knew the matter. +\v 40 Jonathan gave his weapons to his boy, and said to him, “Go, carry them to the city.” +\p +\v 41 As soon as the boy was gone, David arose out of the south, and fell on his face to the ground, and bowed himself three times. They kissed one another and wept with one another, and David wept the most. +\v 42 Jonathan said to David, “Go in peace, because we have both sworn in Yahweh’s name, saying, ‘Yahweh is between me and you, and between my offspring and your offspring, forever.’” He arose and departed; and Jonathan went into the city. +\c 21 +\p +\v 1 Then David came to Nob to Ahimelech the priest. Ahimelech came to meet David trembling, and said to him, “Why are you alone, and no man with you?” +\v 2 David said to Ahimelech the priest, “The king has commanded me to do something, and has said to me, ‘Let no one know anything about the business about which I send you, and what I have commanded you. I have sent the young men to a certain place.’ +\v 3 Now therefore what is under your hand? Please give me five loaves of bread in my hand, or whatever is available.” +\p +\v 4 The priest answered David, and said, “I have no common bread, but there is holy bread; if only the young men have kept themselves from women.” +\p +\v 5 David answered the priest, and said to him, “Truly, women have been kept from us as usual these three days. When I came out, the vessels of the young men were holy, though it was only a common journey. How much more then today shall their vessels be holy?” +\v 6 So the priest gave him holy bread; for there was no bread there but the show bread that was taken from before Yahweh, to be replaced with hot bread in the day when it was taken away. +\p +\v 7 Now a certain man of the servants of Saul was there that day, detained before Yahweh; and his name was Doeg the Edomite, the best of the herdsmen who belonged to Saul. +\p +\v 8 David said to Ahimelech, “Isn’t there here under your hand spear or sword? For I haven’t brought my sword or my weapons with me, because the king’s business required haste.” +\p +\v 9 The priest said, “Behold, the sword of Goliath the Philistine, whom you killed in the valley of Elah, is here wrapped in a cloth behind the ephod. If you would like to take that, take it, for there is no other except that here.” +\p David said, “There is none like that. Give it to me.” +\p +\v 10 David arose and fled that day for fear of Saul, and went to Achish the king of Gath. +\v 11 The servants of Achish said to him, “Isn’t this David the king of the land? Didn’t they sing to one another about him in dances, saying, +\q1 ‘Saul has slain his thousands, +\q2 and David his ten thousands?’” +\p +\v 12 David laid up these words in his heart, and was very afraid of Achish the king of Gath. +\v 13 He changed his behavior before them and pretended to be insane in their hands, and scribbled on the doors of the gate, and let his spittle fall down on his beard. +\v 14 Then Achish said to his servants, “Look, you see the man is insane. Why then have you brought him to me? +\v 15 Do I lack madmen, that you have brought this fellow to play the madman in my presence? Should this fellow come into my house?” +\c 22 +\p +\v 1 David therefore departed from there and escaped to Adullam’s cave. When his brothers and all his father’s house heard it, they went down there to him. +\v 2 Everyone who was in distress, everyone who was in debt, and everyone who was discontented gathered themselves to him; and he became captain over them. There were with him about four hundred men. +\v 3 David went from there to Mizpeh of Moab; and he said to the king of Moab, “Please let my father and my mother come out to you, until I know what God will do for me.” +\v 4 He brought them before the king of Moab; and they lived with him all the time that David was in the stronghold. +\v 5 The prophet Gad said to David, “Don’t stay in the stronghold. Depart, and go into the land of Judah.” +\p Then David departed, and came into the forest of Hereth. +\p +\v 6 Saul heard that David was discovered, with the men who were with him. Now Saul was sitting in Gibeah, under the tamarisk tree in Ramah, with his spear in his hand, and all his servants were standing around him. +\v 7 Saul said to his servants who stood around him, “Hear now, you Benjamites! Will the son of Jesse give everyone of you fields and vineyards? Will he make you all captains of thousands and captains of hundreds? +\v 8 Is that why all of you have conspired against me, and there is no one who discloses to me when my son makes a treaty with the son of Jesse, and there is none of you who is sorry for me, or discloses to me that my son has stirred up my servant against me, to lie in wait, as it is today?” +\p +\v 9 Then Doeg the Edomite, who stood by the servants of Saul, answered and said, “I saw the son of Jesse coming to Nob, to Ahimelech the son of Ahitub. +\v 10 He inquired of Yahweh for him, gave him food, and gave him the sword of Goliath the Philistine.” +\p +\v 11 Then the king sent to call Ahimelech the priest, the son of Ahitub, and all his father’s house, the priests who were in Nob; and they all came to the king. +\v 12 Saul said, “Hear now, you son of Ahitub.” +\p He answered, “Here I am, my lord.” +\p +\v 13 Saul said to him, “Why have you conspired against me, you and the son of Jesse, in that you have given him bread, and a sword, and have inquired of God for him, that he should rise against me, to lie in wait, as it is today?” +\p +\v 14 Then Ahimelech answered the king, and said, “Who among all your servants is so faithful as David, who is the king’s son-in-law, captain of your body guard, and honored in your house? +\v 15 Have I today begun to inquire of God for him? Be it far from me! Don’t let the king impute anything to his servant, nor to all the house of my father; for your servant knew nothing of all this, less or more.” +\p +\v 16 The king said, “You shall surely die, Ahimelech, you and all your father’s house.” +\v 17 The king said to the guard who stood about him, “Turn and kill the priests of Yahweh, because their hand also is with David, and because they knew that he fled and didn’t disclose it to me.” But the servants of the king wouldn’t put out their hand to fall on the priests of Yahweh. +\p +\v 18 The king said to Doeg, “Turn and attack the priests!” +\p Doeg the Edomite turned, and he attacked the priests, and he killed on that day eighty-five people who wore a linen ephod. +\v 19 He struck Nob, the city of the priests, with the edge of the sword—both men and women, children and nursing babies, and cattle, donkeys, and sheep, with the edge of the sword. +\v 20 One of the sons of Ahimelech the son of Ahitub, named Abiathar, escaped and fled after David. +\v 21 Abiathar told David that Saul had slain Yahweh’s priests. +\p +\v 22 David said to Abiathar, “I knew on that day, when Doeg the Edomite was there, that he would surely tell Saul. I am responsible for the death of all the persons of your father’s house. +\v 23 Stay with me. Don’t be afraid, for he who seeks my life seeks your life. You will be safe with me.” +\c 23 +\p +\v 1 David was told, “Behold, the Philistines are fighting against Keilah, and are robbing the threshing floors.” +\p +\v 2 Therefore David inquired of Yahweh, saying, “Shall I go and strike these Philistines?” +\p Yahweh said to David, “Go strike the Philistines, and save Keilah.” +\p +\v 3 David’s men said to him, “Behold, we are afraid here in Judah. How much more then if we go to Keilah against the armies of the Philistines?” +\p +\v 4 Then David inquired of Yahweh yet again. Yahweh answered him, and said, “Arise, go down to Keilah; for I will deliver the Philistines into your hand.” +\p +\v 5 David and his men went to Keilah and fought with the Philistines, and brought away their livestock, and killed them with a great slaughter. So David saved the inhabitants of Keilah. +\p +\v 6 When Abiathar the son of Ahimelech fled to David to Keilah, he came down with an ephod in his hand. +\p +\v 7 Saul was told that David had come to Keilah. Saul said, “God has delivered him into my hand, for he is shut in by entering into a town that has gates and bars.” +\v 8 Saul summoned all the people to war, to go down to Keilah to besiege David and his men. +\v 9 David knew that Saul was devising mischief against him. He said to Abiathar the priest, “Bring the ephod here.” +\v 10 Then David said, “O Yahweh, the God of Israel, your servant has surely heard that Saul seeks to come to Keilah to destroy the city for my sake. +\v 11 Will the men of Keilah deliver me up into his hand? Will Saul come down, as your servant has heard? Yahweh, the God of Israel, I beg you, tell your servant.” +\p Yahweh said, “He will come down.” +\p +\v 12 Then David said, “Will the men of Keilah deliver me and my men into the hand of Saul?” +\p Yahweh said, “They will deliver you up.” +\p +\v 13 Then David and his men, who were about six hundred, arose and departed out of Keilah and went wherever they could go. Saul was told that David had escaped from Keilah; and he gave up going there. +\v 14 David stayed in the wilderness in the strongholds, and remained in the hill country in the wilderness of Ziph. Saul sought him every day, but God didn’t deliver him into his hand. +\v 15 David saw that Saul had come out to seek his life. David was in the wilderness of Ziph in the woods. +\p +\v 16 Jonathan, Saul’s son, arose and went to David into the woods, and strengthened his hand in God. +\v 17 He said to him, “Don’t be afraid, for the hand of Saul my father won’t find you; and you will be king over Israel, and I will be next to you; and Saul my father knows that also.” +\v 18 They both made a covenant before Yahweh. Then David stayed in the woods and Jonathan went to his house. +\p +\v 19 Then the Ziphites came up to Saul to Gibeah, saying, “Doesn’t David hide himself with us in the strongholds in the woods, in the hill of Hachilah, which is on the south of the desert? +\v 20 Now therefore, O king, come down. According to all the desire of your soul to come down; and our part will be to deliver him up into the king’s hand.” +\p +\v 21 Saul said, “You are blessed by Yahweh, for you have had compassion on me. +\v 22 Please go make yet more sure, and know and see his place where his haunt is, and who has seen him there; for I have been told that he is very cunning. +\v 23 See therefore, and take knowledge of all the lurking places where he hides himself; and come again to me with certainty, and I will go with you. It shall happen, if he is in the land, that I will search him out among all the thousands of Judah.” +\p +\v 24 They arose, and went to Ziph before Saul; but David and his men were in the wilderness of Maon, in the Arabah on the south of the desert. +\v 25 Saul and his men went to seek him. When David was told, he went down to the rock, and stayed in the wilderness of Maon. When Saul heard that, he pursued David in the wilderness of Maon. +\v 26 Saul went on this side of the mountain, and David and his men on that side of the mountain; and David hurried to get away for fear of Saul, for Saul and his men surrounded David and his men to take them. +\v 27 But a messenger came to Saul, saying, “Hurry and come, for the Philistines have made a raid on the land!” +\v 28 So Saul returned from pursuing David, and went against the Philistines. Therefore they called that place Sela Hammahlekoth.\f + \fr 23:28 \ft “Sela Hammahlekoth” means “rock of parting”.\f* +\p +\v 29 David went up from there and lived in the strongholds of En Gedi. +\c 24 +\p +\v 1 When Saul had returned from following the Philistines, he was told, “Behold, David is in the wilderness of En Gedi.” +\v 2 Then Saul took three thousand chosen men out of all Israel, and went to seek David and his men on the rocks of the wild goats. +\v 3 He came to the sheep pens by the way, where there was a cave; and Saul went in to relieve himself. Now David and his men were staying in the innermost parts of the cave. +\v 4 David’s men said to him, “Behold, the day of which Yahweh said to you, ‘Behold, I will deliver your enemy into your hand, and you shall do to him as it shall seem good to you.’” Then David arose and cut off the skirt of Saul’s robe secretly. +\v 5 Afterward, David’s heart struck him because he had cut off Saul’s skirt. +\v 6 He said to his men, “Yahweh forbid that I should do this thing to my lord, Yahweh’s anointed, to stretch out my hand against him, since he is Yahweh’s anointed.” +\v 7 So David checked his men with these words, and didn’t allow them to rise against Saul. Saul rose up out of the cave, and went on his way. +\v 8 David also arose afterward, and went out of the cave and cried after Saul, saying, “My lord the king!” +\p When Saul looked behind him, David bowed with his face to the earth, and showed respect. +\v 9 David said to Saul, “Why do you listen to men’s words, saying, ‘Behold, David seeks to harm you?’ +\v 10 Behold, today your eyes have seen how Yahweh had delivered you today into my hand in the cave. Some urged me to kill you, but I spared you. I said, ‘I will not stretch out my hand against my lord, for he is Yahweh’s anointed.’ +\v 11 Moreover, my father, behold, yes, see the skirt of your robe in my hand; for in that I cut off the skirt of your robe and didn’t kill you, know and see that there is neither evil nor disobedience in my hand. I have not sinned against you, though you hunt for my life to take it. +\v 12 May Yahweh judge between me and you, and may Yahweh avenge me of you; but my hand will not be on you. +\v 13 As the proverb of the ancients says, ‘Out of the wicked comes wickedness;’ but my hand will not be on you. +\v 14 Against whom has the king of Israel come out? Whom do you pursue? A dead dog? A flea? +\v 15 May Yahweh therefore be judge, and give sentence between me and you, and see, and plead my cause, and deliver me out of your hand.” +\p +\v 16 It came to pass, when David had finished speaking these words to Saul, that Saul said, “Is that your voice, my son David?” Saul lifted up his voice and wept. +\v 17 He said to David, “You are more righteous than I; for you have done good to me, whereas I have done evil to you. +\v 18 You have declared today how you have dealt well with me, because when Yahweh had delivered me up into your hand, you didn’t kill me. +\v 19 For if a man finds his enemy, will he let him go away unharmed? Therefore may Yahweh reward you good for that which you have done to me today. +\v 20 Now, behold, I know that you will surely be king, and that the kingdom of Israel will be established in your hand. +\v 21 Swear now therefore to me by Yahweh that you will not cut off my offspring after me, and that you will not destroy my name out of my father’s house.” +\p +\v 22 David swore to Saul. Saul went home, but David and his men went up to the stronghold. +\c 25 +\p +\v 1 Samuel died; and all Israel gathered themselves together and mourned for him, and buried him at his house at Ramah. +\p Then David arose and went down to the wilderness of Paran. +\v 2 There was a man in Maon whose possessions were in Carmel; and the man was very great. He had three thousand sheep and a thousand goats; and he was shearing his sheep in Carmel. +\v 3 Now the name of the man was Nabal; and the name of his wife Abigail. This woman was intelligent and had a beautiful face; but the man was surly and evil in his doings. He was of the house of Caleb. +\v 4 David heard in the wilderness that Nabal was shearing his sheep. +\v 5 David sent ten young men; and David said to the young men, “Go up to Carmel, and go to Nabal, and greet him in my name. +\v 6 Tell him, ‘Long life to you! Peace be to you! Peace be to your house! Peace be to all that you have! +\v 7 Now I have heard that you have shearers. Your shepherds have now been with us, and we didn’t harm them. Nothing was missing from them all the time they were in Carmel. +\v 8 Ask your young men, and they will tell you. Therefore let the young men find favor in your eyes, for we come on a good day. Please give whatever comes to your hand to your servants and to your son David.’” +\p +\v 9 When David’s young men came, they spoke to Nabal all those words in the name of David, and waited. +\p +\v 10 Nabal answered David’s servants and said, “Who is David? Who is the son of Jesse? There are many servants who break away from their masters these days. +\v 11 Shall I then take my bread, my water, and my meat that I have killed for my shearers, and give it to men who I don’t know where they come from?” +\p +\v 12 So David’s young men turned on their way and went back, and came and told him all these words. +\p +\v 13 David said to his men, “Every man put on his sword!” +\p Every man put on his sword. David also put on his sword. About four hundred men followed David, and two hundred stayed by the baggage. +\p +\v 14 But one of the young men told Abigail, Nabal’s wife, saying, “Behold, David sent messengers out of the wilderness to greet our master; and he insulted them. +\v 15 But the men were very good to us, and we were not harmed, and we didn’t miss anything as long as we went with them, when we were in the fields. +\v 16 They were a wall to us both by night and by day, all the while we were with them keeping the sheep. +\v 17 Now therefore know and consider what you will do; for evil is determined against our master and against all his house, for he is such a worthless fellow that one can’t speak to him.” +\p +\v 18 Then Abigail hurried and took two hundred loaves of bread, two containers of wine, five sheep ready dressed, five seahs\f + \fr 25:18 \ft 1 seah is about 7 liters or 1.9 gallons or 0.8 pecks\f* of parched grain, one hundred clusters of raisins, and two hundred cakes of figs, and laid them on donkeys. +\v 19 She said to her young men, “Go on before me. Behold, I am coming after you.” But she didn’t tell her husband, Nabal. +\v 20 As she rode on her donkey, and came down hidden by the mountain, behold, David and his men came down toward her, and she met them. +\p +\v 21 Now David had said, “Surely in vain I have kept all that this fellow has in the wilderness, so that nothing was missed of all that pertained to him. He has returned me evil for good. +\v 22 God do so to the enemies of David, and more also, if I leave of all that belongs to him by the morning light so much as one who urinates on a wall.”\f + \fr 25:22 \ft or, male.\f* +\p +\v 23 When Abigail saw David, she hurried and got off her donkey, and fell before David on her face and bowed herself to the ground. +\v 24 She fell at his feet and said, “On me, my lord, on me be the blame! Please let your servant speak in your ears. Hear the words of your servant. +\v 25 Please don’t let my lord pay attention to this worthless fellow, Nabal, for as his name is, so is he. Nabal\f + \fr 25:25 \ft “Nabal” means “foolish”.\f* is his name, and folly is with him; but I, your servant, didn’t see my lord’s young men whom you sent. +\v 26 Now therefore, my lord, as Yahweh lives and as your soul lives, since Yahweh has withheld you from blood guiltiness and from avenging yourself with your own hand, now therefore let your enemies and those who seek evil to my lord be as Nabal. +\v 27 Now this present which your servant has brought to my lord, let it be given to the young men who follow my lord. +\v 28 Please forgive the trespass of your servant. For Yahweh will certainly make my lord a sure house, because my lord fights Yahweh’s battles. Evil will not be found in you all your days. +\v 29 Though men may rise up to pursue you and to seek your soul, yet the soul of my lord will be bound in the bundle of life with Yahweh your God. He will sling out the souls of your enemies as from a sling’s pocket. +\v 30 It will come to pass, when Yahweh has done to my lord according to all the good that he has spoken concerning you, and has appointed you prince over Israel, +\v 31 that this shall be no grief to you, nor offense of heart to my lord, either that you have shed blood without cause, or that my lord has avenged himself. When Yahweh has dealt well with my lord, then remember your servant.” +\p +\v 32 David said to Abigail, “Blessed is Yahweh, the God of Israel, who sent you today to meet me! +\v 33 Blessed is your discretion, and blessed are you, who have kept me today from blood guiltiness, and from avenging myself with my own hand. +\v 34 For indeed, as Yahweh the God of Israel lives, who has withheld me from harming you, unless you had hurried and come to meet me, surely there wouldn’t have been left to Nabal by the morning light so much as one who urinates on a wall.”\f + \fr 25:34 \ft or, one male.\f* +\p +\v 35 So David received from her hand that which she had brought him. Then he said to her, “Go up in peace to your house. Behold, I have listened to your voice and have granted your request.” +\p +\v 36 Abigail came to Nabal; and behold, he held a feast in his house like the feast of a king. Nabal’s heart was merry within him, for he was very drunk. Therefore she told him nothing until the morning light. +\v 37 In the morning, when the wine had gone out of Nabal, his wife told him these things; and his heart died within him, and he became as a stone. +\v 38 About ten days later, Yahweh struck Nabal, so that he died. +\v 39 When David heard that Nabal was dead, he said, “Blessed is Yahweh, who has pleaded the cause of my reproach from the hand of Nabal, and has kept back his servant from evil. Yahweh has returned the evildoing of Nabal on his own head.” +\p David sent and spoke concerning Abigail, to take her to himself as wife. +\v 40 When David’s servants had come to Abigail to Carmel, they spoke to her, saying, “David has sent us to you, to take you to him as wife.” +\p +\v 41 She arose and bowed herself with her face to the earth, and said, “Behold, your servant is a servant to wash the feet of the servants of my lord.” +\v 42 Abigail hurriedly arose and rode on a donkey with her five maids who followed her; and she went after the messengers of David, and became his wife. +\v 43 David also took Ahinoam of Jezreel; and they both became his wives. +\p +\v 44 Now Saul had given Michal his daughter, David’s wife, to Palti the son of Laish, who was of Gallim. +\c 26 +\p +\v 1 The Ziphites came to Saul to Gibeah, saying, “Doesn’t David hide himself in the hill of Hachilah, which is before the desert?” +\v 2 Then Saul arose and went down to the wilderness of Ziph, having three thousand chosen men of Israel with him, to seek David in the wilderness of Ziph. +\v 3 Saul encamped in the hill of Hachilah, which is before the desert, by the way. But David stayed in the wilderness, and he saw that Saul came after him into the wilderness. +\v 4 David therefore sent out spies, and understood that Saul had certainly come. +\v 5 Then David arose and came to the place where Saul had encamped; and David saw the place where Saul lay, with Abner the son of Ner, the captain of his army. Saul lay within the place of the wagons, and the people were encamped around him. +\p +\v 6 Then David answered and said to Ahimelech the Hittite, and to Abishai the son of Zeruiah, brother of Joab, saying, “Who will go down with me to Saul to the camp?” +\p Abishai said, “I will go down with you.” +\v 7 So David and Abishai came to the people by night; and, behold, Saul lay sleeping within the place of the wagons, with his spear stuck in the ground at his head; and Abner and the people lay around him. +\v 8 Then Abishai said to David, “God has delivered up your enemy into your hand today. Now therefore please let me strike him with the spear to the earth at one stroke, and I will not strike him the second time.” +\p +\v 9 David said to Abishai, “Don’t destroy him, for who can stretch out his hand against Yahweh’s anointed, and be guiltless?” +\v 10 David said, “As Yahweh lives, Yahweh will strike him; or his day shall come to die, or he shall go down into battle and perish. +\v 11 Yahweh forbid that I should stretch out my hand against Yahweh’s anointed; but now please take the spear that is at his head and the jar of water, and let’s go.” +\p +\v 12 So David took the spear and the jar of water from Saul’s head, and they went away. No man saw it, or knew it, nor did any awake; for they were all asleep, because a deep sleep from Yahweh had fallen on them. +\v 13 Then David went over to the other side, and stood on the top of the mountain far away, a great space being between them; +\v 14 and David cried to the people, and to Abner the son of Ner, saying, “Don’t you answer, Abner?” +\p Then Abner answered, “Who are you who calls to the king?” +\p +\v 15 David said to Abner, “Aren’t you a man? Who is like you in Israel? Why then have you not kept watch over your lord the king? For one of the people came in to destroy your lord the king. +\v 16 This thing isn’t good that you have done. As Yahweh lives, you are worthy to die, because you have not kept watch over your lord, Yahweh’s anointed. Now see where the king’s spear is, and the jar of water that was at his head.” +\p +\v 17 Saul recognized David’s voice, and said, “Is this your voice, my son David?” +\p David said, “It is my voice, my lord, O king.” +\v 18 He said, “Why does my lord pursue his servant? For what have I done? What evil is in my hand? +\v 19 Now therefore, please let my lord the king hear the words of his servant. If it is so that Yahweh has stirred you up against me, let him accept an offering. But if it is the children of men, they are cursed before Yahweh; for they have driven me out today that I shouldn’t cling to Yahweh’s inheritance, saying, ‘Go, serve other gods!’ +\v 20 Now therefore, don’t let my blood fall to the earth away from the presence of Yahweh; for the king of Israel has come out to seek a flea, as when one hunts a partridge in the mountains.” +\p +\v 21 Then Saul said, “I have sinned. Return, my son David; for I will no more do you harm, because my life was precious in your eyes today. Behold, I have played the fool, and have erred exceedingly.” +\p +\v 22 David answered, “Behold the spear, O king! Let one of the young men come over and get it. +\v 23 Yahweh will render to every man his righteousness and his faithfulness; because Yahweh delivered you into my hand today, and I wouldn’t stretch out my hand against Yahweh’s anointed. +\v 24 Behold, as your life was respected today in my eyes, so let my life be respected in Yahweh’s eyes, and let him deliver me out of all oppression.” +\p +\v 25 Then Saul said to David, “You are blessed, my son David. You will both do mightily, and will surely prevail.” +\p So David went his way, and Saul returned to his place. +\c 27 +\p +\v 1 David said in his heart, “I will now perish one day by the hand of Saul. There is nothing better for me than that I should escape into the land of the Philistines; and Saul will despair of me, to seek me any more in all the borders of Israel. So I will escape out of his hand.” +\v 2 David arose and passed over, he and the six hundred men who were with him, to Achish the son of Maoch, king of Gath. +\v 3 David lived with Achish at Gath, he and his men, every man with his household, even David with his two wives, Ahinoam the Jezreelitess and Abigail the Carmelitess, Nabal’s wife. +\v 4 Saul was told that David had fled to Gath, so he stopped looking for him. +\p +\v 5 David said to Achish, “If now I have found favor in your eyes, let them give me a place in one of the cities in the country, that I may dwell there. For why should your servant dwell in the royal city with you?” +\v 6 Then Achish gave him Ziklag that day: therefore Ziklag belongs to the kings of Judah to this day. +\v 7 The number of the days that David lived in the country of the Philistines was a full year and four months. +\p +\v 8 David and his men went up and raided the Geshurites, the Girzites, and the Amalekites; for those were the inhabitants of the land who were of old, on the way to Shur, even to the land of Egypt. +\v 9 David struck the land, and saved no man or woman alive, and took away the sheep, the cattle, the donkeys, the camels, and the clothing. Then he returned, and came to Achish. +\p +\v 10 Achish said, “Against whom have you made a raid today?” +\p David said, “Against the South of Judah, against the South of the Jerahmeelites, and against the South of the Kenites.” +\v 11 David saved neither man nor woman alive to bring them to Gath, saying, “Lest they should tell about us, saying, ‘David did this, and this has been his way all the time he has lived in the country of the Philistines.’” +\p +\v 12 Achish believed David, saying, “He has made his people Israel utterly to abhor him. Therefore he will be my servant forever.” +\c 28 +\p +\v 1 In those days, the Philistines gathered their armies together for warfare, to fight with Israel. Achish said to David, “Know assuredly that you will go out with me in the army, you and your men.” +\p +\v 2 David said to Achish, “Therefore you will know what your servant can do.” +\p Achish said to David, “Therefore I will make you my bodyguard forever.” +\p +\v 3 Now Samuel was dead, and all Israel had mourned for him and buried him in Ramah, even in his own city. Saul had sent away those who had familiar spirits and the wizards out of the land. +\p +\v 4 The Philistines gathered themselves together, and came and encamped in Shunem; and Saul gathered all Israel together, and they encamped in Gilboa. +\v 5 When Saul saw the army of the Philistines, he was afraid, and his heart trembled greatly. +\v 6 When Saul inquired of Yahweh, Yahweh didn’t answer him by dreams, by Urim, or by prophets. +\v 7 Then Saul said to his servants, “Seek for me a woman who has a familiar spirit, that I may go to her and inquire of her.” +\p His servants said to him, “Behold, there is a woman who has a familiar spirit at Endor.” +\p +\v 8 Saul disguised himself and put on other clothing, and went, he and two men with him, and they came to the woman by night. Then he said, “Please consult for me by the familiar spirit, and bring me up whomever I shall name to you.” +\p +\v 9 The woman said to him, “Behold, you know what Saul has done, how he has cut off those who have familiar spirits and the wizards out of the land. Why then do you lay a snare for my life, to cause me to die?” +\p +\v 10 Saul swore to her by Yahweh, saying, “As Yahweh lives, no punishment will happen to you for this thing.” +\p +\v 11 Then the woman said, “Whom shall I bring up to you?” +\p He said, “Bring Samuel up for me.” +\p +\v 12 When the woman saw Samuel, she cried with a loud voice; and the woman spoke to Saul, saying, “Why have you deceived me? For you are Saul!” +\p +\v 13 The king said to her, “Don’t be afraid! What do you see?” +\p The woman said to Saul, “I see a god coming up out of the earth.” +\p +\v 14 He said to her, “What does he look like?” +\p She said, “An old man comes up. He is covered with a robe.” Saul perceived that it was Samuel, and he bowed with his face to the ground, and showed respect. +\p +\v 15 Samuel said to Saul, “Why have you disturbed me, to bring me up?” +\p Saul answered, “I am very distressed; for the Philistines make war against me, and God has departed from me, and answers me no more, by prophets, or by dreams. Therefore I have called you, that you may make known to me what I shall do.” +\p +\v 16 Samuel said, “Why then do you ask me, since Yahweh has departed from you and has become your adversary? +\v 17 Yahweh has done to you as he spoke by me. Yahweh has torn the kingdom out of your hand and given it to your neighbor, even to David. +\v 18 Because you didn’t obey Yahweh’s voice, and didn’t execute his fierce wrath on Amalek, therefore Yahweh has done this thing to you today. +\v 19 Moreover Yahweh will deliver Israel also with you into the hand of the Philistines; and tomorrow you and your sons will be with me. Yahweh will deliver the army of Israel also into the hand of the Philistines.” +\p +\v 20 Then Saul fell immediately his full length on the earth, and was terrified, because of Samuel’s words. There was no strength in him, for he had eaten no bread all day long or all night long. +\p +\v 21 The woman came to Saul and saw that he was very troubled, and said to him, “Behold, your servant has listened to your voice, and I have put my life in my hand, and have listened to your words which you spoke to me. +\v 22 Now therefore, please listen also to the voice of your servant, and let me set a morsel of bread before you. Eat, that you may have strength when you go on your way.” +\p +\v 23 But he refused, and said, “I will not eat.” But his servants, together with the woman, constrained him; and he listened to their voice. So he arose from the earth and sat on the bed. +\v 24 The woman had a fattened calf in the house. She hurried and killed it; and she took flour and kneaded it, and baked unleavened bread of it. +\v 25 She brought it before Saul and before his servants, and they ate. Then they rose up and went away that night. +\c 29 +\p +\v 1 Now the Philistines gathered together all their armies to Aphek; and the Israelites encamped by the spring which is in Jezreel. +\v 2 The lords of the Philistines passed on by hundreds and by thousands; and David and his men passed on in the rear with Achish. +\p +\v 3 Then the princes of the Philistines said, “What about these Hebrews?” +\p Achish said to the princes of the Philistines, “Isn’t this David, the servant of Saul the king of Israel, who has been with me these days, or rather these years? I have found no fault in him since he fell away until today.” +\p +\v 4 But the princes of the Philistines were angry with him; and the princes of the Philistines said to him, “Make the man return, that he may go back to his place where you have appointed him, and let him not go down with us to battle, lest in the battle he become an adversary to us. For with what should this fellow reconcile himself to his lord? Should it not be with the heads of these men? +\v 5 Isn’t this David, of whom people sang to one another in dances, saying, +\q1 ‘Saul has slain his thousands, +\q2 and David his ten thousands?’” +\p +\v 6 Then Achish called David and said to him, “As Yahweh lives, you have been upright, and your going out and your coming in with me in the army is good in my sight; for I have not found evil in you since the day of your coming to me to this day. Nevertheless, the lords don’t favor you. +\v 7 Therefore now return, and go in peace, that you not displease the lords of the Philistines.” +\p +\v 8 David said to Achish, “But what have I done? What have you found in your servant so long as I have been before you to this day, that I may not go and fight against the enemies of my lord the king?” +\p +\v 9 Achish answered David, “I know that you are good in my sight, as an angel of God. Notwithstanding, the princes of the Philistines have said, ‘He shall not go up with us to the battle.’ +\v 10 Therefore now rise up early in the morning with the servants of your lord who have come with you; and as soon as you are up early in the morning and have light, depart.” +\p +\v 11 So David rose up early, he and his men, to depart in the morning, to return into the land of the Philistines; and the Philistines went up to Jezreel. +\c 30 +\p +\v 1 When David and his men had come to Ziklag on the third day, the Amalekites had made a raid on the South and on Ziklag, and had struck Ziklag and burned it with fire, +\v 2 and had taken captive the women and all who were in it, both small and great. They didn’t kill any, but carried them off and went their way. +\v 3 When David and his men came to the city, behold, it was burned with fire; and their wives, their sons, and their daughters were taken captive. +\v 4 Then David and the people who were with him lifted up their voice and wept until they had no more power to weep. +\v 5 David’s two wives were taken captive, Ahinoam the Jezreelitess, and Abigail the wife of Nabal the Carmelite. +\v 6 David was greatly distressed, for the people spoke of stoning him, because the souls of all the people were grieved, every man for his sons and for his daughters; but David strengthened himself in Yahweh his God. +\v 7 David said to Abiathar the priest, the son of Ahimelech, “Please bring the ephod here to me.” +\p Abiathar brought the ephod to David. +\v 8 David inquired of Yahweh, saying, “If I pursue after this troop, will I overtake them?” +\p He answered him, “Pursue, for you will surely overtake them, and will without fail recover all.” +\p +\v 9 So David went, he and the six hundred men who were with him, and came to the brook Besor, where those who were left behind stayed. +\v 10 But David pursued, he and four hundred men; for two hundred stayed behind, who were so faint that they couldn’t go over the brook Besor. +\v 11 They found an Egyptian in the field, and brought him to David, and gave him bread, and he ate; and they gave him water to drink. +\v 12 They gave him a piece of a cake of figs and two clusters of raisins. When he had eaten, his spirit came again to him; for he had eaten no bread, and drank no water for three days and three nights. +\v 13 David asked him, “To whom do you belong? Where are you from?” +\p He said, “I am a young man of Egypt, servant to an Amalekite; and my master left me, because three days ago I got sick. +\v 14 We made a raid on the South of the Cherethites, and on that which belongs to Judah, and on the South of Caleb; and we burned Ziklag with fire.” +\p +\v 15 David said to him, “Will you bring me down to this troop?” +\p He said, “Swear to me by God that you will not kill me and not deliver me up into the hands of my master, and I will bring you down to this troop.” +\p +\v 16 When he had brought him down, behold, they were spread around over all the ground, eating, drinking, and dancing, because of all the great plunder that they had taken out of the land of the Philistines, and out of the land of Judah. +\v 17 David struck them from the twilight even to the evening of the next day. Not a man of them escaped from there, except four hundred young men who rode on camels and fled. +\v 18 David recovered all that the Amalekites had taken, and David rescued his two wives. +\v 19 There was nothing lacking to them, neither small nor great, neither sons nor daughters, neither plunder, nor anything that they had taken. David brought them all back. +\v 20 David took all the flocks and the herds, which they drove before those other livestock, and said, “This is David’s plunder.” +\p +\v 21 David came to the two hundred men, who were so faint that they could not follow David, whom also they had made to stay at the brook Besor; and they went out to meet David, and to meet the people who were with him. When David came near to the people, he greeted them. +\v 22 Then all the wicked men and worthless fellows of those who went with David answered and said, “Because they didn’t go with us, we will not give them anything of the plunder that we have recovered, except to every man his wife and his children, that he may lead them away and depart.” +\p +\v 23 Then David said, “Do not do so, my brothers, with that which Yahweh has given to us, who has preserved us, and delivered the troop that came against us into our hand. +\v 24 Who will listen to you in this matter? For as his share is who goes down to the battle, so shall his share be who stays with the baggage. They shall share alike.” +\v 25 It was so from that day forward that he made it a statute and an ordinance for Israel to this day. +\p +\v 26 When David came to Ziklag, he sent some of the plunder to the elders of Judah, even to his friends, saying, “Behold, a present for you from the plunder of Yahweh’s enemies.” +\v 27 He sent it to those who were in Bethel, to those who were in Ramoth of the South, to those who were in Jattir, +\v 28 to those who were in Aroer, to those who were in Siphmoth, to those who were in Eshtemoa, +\v 29 to those who were in Racal, to those who were in the cities of the Jerahmeelites, to those who were in the cities of the Kenites, +\v 30 to those who were in Hormah, to those who were in Borashan, to those who were in Athach, +\v 31 to those who were in Hebron, and to all the places where David himself and his men used to stay. +\c 31 +\p +\v 1 Now the Philistines fought against Israel; and the men of Israel fled from before the Philistines, and fell down slain on Mount Gilboa. +\v 2 The Philistines overtook Saul and his sons; and the Philistines killed Jonathan, Abinadab, and Malchishua, the sons of Saul. +\v 3 The battle went hard against Saul, and the archers overtook him; and he was greatly distressed by reason of the archers. +\v 4 Then Saul said to his armor bearer, “Draw your sword, and thrust me through with it, lest these uncircumcised come and thrust me through and abuse me!” But his armor bearer would not, for he was terrified. Therefore Saul took his sword and fell on it. +\v 5 When his armor bearer saw that Saul was dead, he likewise fell on his sword, and died with him. +\v 6 So Saul died with his three sons, his armor bearer, and all his men that same day together. +\p +\v 7 When the men of Israel who were on the other side of the valley, and those who were beyond the Jordan, saw that the men of Israel fled and that Saul and his sons were dead, they abandoned the cities and fled; and the Philistines came and lived in them. +\v 8 On the next day, when the Philistines came to strip the slain, they found Saul and his three sons fallen on Mount Gilboa. +\v 9 They cut off his head, stripped off his armor, and sent into the land of the Philistines all around, to carry the news to the house of their idols and to the people. +\v 10 They put his armor in the house of the Ashtaroth, and they fastened his body to the wall of Beth Shan. +\v 11 When the inhabitants of Jabesh Gilead heard what the Philistines had done to Saul, +\v 12 all the valiant men arose, went all night, and took the body of Saul and the bodies of his sons from the wall of Beth Shan; and they came to Jabesh and burned them there. +\v 13 They took their bones and buried them under the tamarisk\f + \fr 31:13 \ft or, salt cedar\f* tree in Jabesh, and fasted seven days. diff --git a/c-sharp/assets/WEB/102SAengWEBUS.SFM b/c-sharp/assets/WEB/102SAengWEBUS.SFM new file mode 100644 index 0000000000..1366b1ca21 --- /dev/null +++ b/c-sharp/assets/WEB/102SAengWEBUS.SFM @@ -0,0 +1,1199 @@ +\id 2SA World English Bible (WEB) +\ide UTF-8 +\h 2 Samuel +\toc1 The Second Book of Samuel +\toc2 2 Samuel +\toc3 2 Samuel +\mt1 The Second Book of Samuel +\c 1 +\p +\v 1 After the death of Saul, when David had returned from the slaughter of the Amalekites, and David had stayed two days in Ziklag, +\v 2 on the third day, behold,\f + \fr 1:2 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* a man came out of the camp from Saul, with his clothes torn and earth on his head. When he came to David, he fell to the earth and showed respect. +\p +\v 3 David said to him, “Where do you come from?” +\p He said to him, “I have escaped out of the camp of Israel.” +\p +\v 4 David said to him, “How did it go? Please tell me.” +\p He answered, “The people have fled from the battle, and many of the people also have fallen and are dead. Saul and Jonathan his son are dead also.” +\p +\v 5 David said to the young man who told him, “How do you know that Saul and Jonathan his son are dead?” +\p +\v 6 The young man who told him said, “As I happened by chance on Mount Gilboa, behold, Saul was leaning on his spear; and behold, the chariots and the horsemen followed close behind him. +\v 7 When he looked behind him, he saw me and called to me. I answered, ‘Here I am.’ +\v 8 He said to me, ‘Who are you?’ I answered him, ‘I am an Amalekite.’ +\v 9 He said to me, ‘Please stand beside me, and kill me, for anguish has taken hold of me because my life lingers in me.’ +\v 10 So I stood beside him and killed him, because I was sure that he could not live after he had fallen. I took the crown that was on his head and the bracelet that was on his arm, and have brought them here to my lord.” +\p +\v 11 Then David took hold on his clothes and tore them; and all the men who were with him did likewise. +\v 12 They mourned, wept, and fasted until evening for Saul and for Jonathan his son, and for the people of Yahweh,\f + \fr 1:12 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* and for the house of Israel, because they had fallen by the sword. +\p +\v 13 David said to the young man who told him, “Where are you from?” +\p He answered, “I am the son of a foreigner, an Amalekite.” +\p +\v 14 David said to him, “Why were you not afraid to stretch out your hand to destroy Yahweh’s anointed?” +\v 15 David called one of the young men and said, “Go near, and cut him down!” He struck him so that he died. +\v 16 David said to him, “Your blood be on your head, for your mouth has testified against you, saying, ‘I have slain Yahweh’s anointed.’” +\p +\v 17 David lamented with this lamentation over Saul and over Jonathan his son +\v 18 (and he commanded them to teach the children of Judah the song of the bow; behold, it is written in the book of Jashar): +\q1 +\v 19 “Your glory, Israel, was slain on your high places! +\q2 How the mighty have fallen! +\q1 +\v 20 Don’t tell it in Gath. +\q2 Don’t publish it in the streets of Ashkelon, +\q1 lest the daughters of the Philistines rejoice, +\q2 lest the daughters of the uncircumcised triumph. +\q1 +\v 21 You mountains of Gilboa, +\q2 let there be no dew or rain on you, and no fields of offerings; +\q2 for there the shield of the mighty was defiled and cast away, +\q2 the shield of Saul was not anointed with oil. +\q1 +\v 22 From the blood of the slain, +\q2 from the fat of the mighty, +\q2 Jonathan’s bow didn’t turn back. +\q2 Saul’s sword didn’t return empty. +\q1 +\v 23 Saul and Jonathan were lovely and pleasant in their lives. +\q2 In their death, they were not divided. +\q1 They were swifter than eagles. +\q2 They were stronger than lions. +\q1 +\v 24 You daughters of Israel, weep over Saul, +\q2 who clothed you delicately in scarlet, +\q2 who put ornaments of gold on your clothing. +\q1 +\v 25 How the mighty have fallen in the middle of the battle! +\q2 Jonathan was slain on your high places. +\q1 +\v 26 I am distressed for you, my brother Jonathan. +\q2 You have been very pleasant to me. +\q2 Your love to me was wonderful, +\q2 surpassing the love of women. +\q1 +\v 27 How the mighty have fallen, +\q2 and the weapons of war have perished!” +\c 2 +\p +\v 1 After this, David inquired of Yahweh, saying, “Shall I go up into any of the cities of Judah?” +\p Yahweh said to him, “Go up.” +\p David said, “Where shall I go up?” +\p He said, “To Hebron.” +\p +\v 2 So David went up there with his two wives, Ahinoam the Jezreelitess, and Abigail the wife of Nabal the Carmelite. +\v 3 David brought up his men who were with him, every man with his household. They lived in the cities of Hebron. +\v 4 The men of Judah came, and there they anointed David king over the house of Judah. They told David, “The men of Jabesh Gilead were those who buried Saul.” +\v 5 David sent messengers to the men of Jabesh Gilead, and said to them, “Blessed are you by Yahweh, that you have shown this kindness to your lord, even to Saul, and have buried him. +\v 6 Now may Yahweh show loving kindness and truth to you. I also will reward you for this kindness, because you have done this thing. +\v 7 Now therefore let your hands be strong, and be valiant; for Saul your lord is dead, and also the house of Judah have anointed me king over them.” +\p +\v 8 Now Abner the son of Ner, captain of Saul’s army, had taken Ishbosheth the son of Saul and brought him over to Mahanaim. +\v 9 He made him king over Gilead, over the Ashurites, over Jezreel, over Ephraim, over Benjamin, and over all Israel. +\v 10 Ishbosheth, Saul’s son, was forty years old when he began to reign over Israel, and he reigned two years. But the house of Judah followed David. +\v 11 The time that David was king in Hebron over the house of Judah was seven years and six months. +\p +\v 12 Abner the son of Ner, and the servants of Ishbosheth the son of Saul, went out from Mahanaim to Gibeon. +\v 13 Joab the son of Zeruiah and David’s servants went out, and met them by the pool of Gibeon; and they sat down, the one on the one side of the pool and the other on the other side of the pool. +\v 14 Abner said to Joab, “Please let the young men arise and compete before us!” +\p Joab said, “Let them arise!” +\v 15 Then they arose and went over by number: twelve for Benjamin and for Ishbosheth the son of Saul, and twelve of David’s servants. +\v 16 They each caught his opponent by the head and thrust his sword in his fellow’s side; so they fell down together. Therefore that place in Gibeon was called Helkath Hazzurim.\f + \fr 2:16 \ft “Helkath Hazzurim” means “field of daggers”.\f* +\v 17 The battle was very severe that day; and Abner was beaten, and the men of Israel, before David’s servants. +\v 18 The three sons of Zeruiah were there: Joab, Abishai, and Asahel. Asahel was as light of foot as a wild gazelle. +\v 19 Asahel pursued Abner. He didn’t turn to the right hand or to the left from following Abner. +\p +\v 20 Then Abner looked behind him and said, “Is that you, Asahel?” +\p He answered, “It is.” +\p +\v 21 Abner said to him, “Turn away to your right hand or to your left, and grab one of the young men, and take his armor.” But Asahel would not turn away from following him. +\v 22 Abner said again to Asahel, “Turn away from following me. Why should I strike you to the ground? How then could I look Joab your brother in the face?” +\v 23 However, he refused to turn away. Therefore Abner with the back end of the spear struck him in the body, so that the spear came out behind him; and he fell down there and died in the same place. As many as came to the place where Asahel fell down and died stood still. +\p +\v 24 But Joab and Abishai pursued Abner. The sun went down when they had come to the hill of Ammah, that lies before Giah by the way of the wilderness of Gibeon. +\v 25 The children of Benjamin gathered themselves together after Abner and became one band, and stood on the top of a hill. +\v 26 Then Abner called to Joab, and said, “Shall the sword devour forever? Don’t you know that it will be bitterness in the latter end? How long will it be then, before you ask the people to return from following their brothers?” +\p +\v 27 Joab said, “As God\f + \fr 2:27 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* lives, if you had not spoken, surely then in the morning the people would have gone away, and not each followed his brother.” +\v 28 So Joab blew the trumpet; and all the people stood still and pursued Israel no more, and they fought no more. +\v 29 Abner and his men went all that night through the Arabah; and they passed over the Jordan, and went through all Bithron, and came to Mahanaim. +\p +\v 30 Joab returned from following Abner; and when he had gathered all the people together, nineteen men of David’s and Asahel were missing. +\v 31 But David’s servants had struck Benjamin Abner’s men so that three hundred sixty men died. +\v 32 They took up Asahel and buried him in the tomb of his father, which was in Bethlehem. Joab and his men went all night, and the day broke on them at Hebron. +\c 3 +\p +\v 1 Now there was long war between Saul’s house and David’s house. David grew stronger and stronger, but Saul’s house grew weaker and weaker. +\v 2 Sons were born to David in Hebron. His firstborn was Amnon, of Ahinoam the Jezreelitess; +\v 3 and his second, Chileab, of Abigail the wife of Nabal the Carmelite; and the third, Absalom the son of Maacah the daughter of Talmai king of Geshur; +\v 4 and the fourth, Adonijah the son of Haggith; and the fifth, Shephatiah the son of Abital; +\v 5 and the sixth, Ithream, of Eglah, David’s wife. These were born to David in Hebron. +\p +\v 6 While there was war between Saul’s house and David’s house, Abner made himself strong in Saul’s house. +\v 7 Now Saul had a concubine, whose name was Rizpah, the daughter of Aiah; and Ishbosheth said to Abner, “Why have you gone in to my father’s concubine?” +\p +\v 8 Then Abner was very angry about Ishbosheth’s words, and said, “Am I a dog’s head that belongs to Judah? Today I show kindness to your father Saul’s house, to his brothers, and to his friends, and have not delivered you into the hand of David; and yet you charge me today with a fault concerning this woman! +\v 9 God do so to Abner, and more also, if, as Yahweh has sworn to David, I don’t do even so to him: +\v 10 to transfer the kingdom from Saul’s house, and to set up David’s throne over Israel and over Judah, from Dan even to Beersheba.” +\p +\v 11 He could not answer Abner another word, because he was afraid of him. +\p +\v 12 Abner sent messengers to David on his behalf, saying, “Whose is the land?” and saying, “Make your alliance with me, and behold, my hand will be with you to bring all Israel around to you.” +\p +\v 13 David said, “Good. I will make a treaty with you, but one thing I require of you. That is, you will not see my face unless you first bring Michal, Saul’s daughter, when you come to see my face.” +\v 14 David sent messengers to Ishbosheth, Saul’s son, saying, “Deliver me my wife Michal, whom I was given to marry for one hundred foreskins of the Philistines.” +\p +\v 15 Ishbosheth sent and took her from her husband, Paltiel the son of Laish. +\v 16 Her husband went with her, weeping as he went, and followed her to Bahurim. Then Abner said to him, “Go! Return!” and he returned. +\p +\v 17 Abner had communication with the elders of Israel, saying, “In times past, you sought for David to be king over you. +\v 18 Now then do it! For Yahweh has spoken of David, saying, ‘By the hand of my servant David, I will save my people Israel out of the hand of the Philistines, and out of the hand of all their enemies.’” +\p +\v 19 Abner also spoke in the ears of Benjamin; and Abner went also to speak in the ears of David in Hebron all that seemed good to Israel and to the whole house of Benjamin. +\v 20 So Abner came to David to Hebron, and twenty men with him. David made Abner and the men who were with him a feast. +\v 21 Abner said to David, “I will arise and go, and will gather all Israel to my lord the king, that they may make a covenant with you, and that you may reign over all that your soul desires.” David sent Abner away; and he went in peace. +\p +\v 22 Behold, David’s servants and Joab came from a raid and brought in a great plunder with them; but Abner was not with David in Hebron, for he had sent him away, and he had gone in peace. +\v 23 When Joab and all the army who was with him had come, they told Joab, “Abner the son of Ner came to the king, and he has sent him away, and he has gone in peace.” +\p +\v 24 Then Joab came to the king and said, “What have you done? Behold, Abner came to you. Why is it that you have sent him away, and he is already gone? +\v 25 You know Abner the son of Ner. He came to deceive you, and to know your going out and your coming in, and to know all that you do.” +\p +\v 26 When Joab had come out from David, he sent messengers after Abner, and they brought him back from the well of Sirah; but David didn’t know it. +\v 27 When Abner had returned to Hebron, Joab took him aside into the middle of the gate to speak with him quietly, and struck him there in the body, so that he died for the blood of Asahel his brother. +\v 28 Afterward, when David heard it, he said, “I and my kingdom are guiltless before Yahweh forever of the blood of Abner the son of Ner. +\v 29 Let it fall on the head of Joab and on all his father’s house. Let there not fail from the house of Joab one who has a discharge, or who is a leper, or who leans on a staff, or who falls by the sword, or who lacks bread.” +\v 30 So Joab and Abishai his brother killed Abner, because he had killed their brother Asahel at Gibeon in the battle. +\p +\v 31 David said to Joab and to all the people who were with him, “Tear your clothes, and clothe yourselves with sackcloth, and mourn in front of Abner.” King David followed the bier. +\v 32 They buried Abner in Hebron; and the king lifted up his voice and wept at Abner’s grave; and all the people wept. +\v 33 The king lamented for Abner, and said, “Should Abner die as a fool dies? +\v 34 Your hands weren’t bound, and your feet weren’t put into fetters. As a man falls before the children of iniquity, so you fell.” +\p All the people wept again over him. +\v 35 All the people came to urge David to eat bread while it was yet day; but David swore, saying, “God do so to me, and more also, if I taste bread or anything else, until the sun goes down.” +\p +\v 36 All the people took notice of it, and it pleased them, as whatever the king did pleased all the people. +\v 37 So all the people and all Israel understood that day that it was not of the king to kill Abner the son of Ner. +\v 38 The king said to his servants, “Don’t you know that a prince and a great man has fallen today in Israel? +\v 39 I am weak today, though anointed king. These men, the sons of Zeruiah are too hard for me. May Yahweh reward the evildoer according to his wickedness.” +\c 4 +\p +\v 1 When Saul’s son heard that Abner was dead in Hebron, his hands became feeble, and all the Israelites were troubled. +\v 2 Saul’s son had two men who were captains of raiding bands. The name of one was Baanah and the name of the other Rechab, the sons of Rimmon the Beerothite, of the children of Benjamin (for Beeroth also is considered a part of Benjamin; +\v 3 and the Beerothites fled to Gittaim, and have lived as foreigners there until today). +\p +\v 4 Now Jonathan, Saul’s son, had a son who was lame in his feet. He was five years old when the news came about Saul and Jonathan out of Jezreel; and his nurse picked him up and fled. As she hurried to flee, he fell and became lame. His name was Mephibosheth. +\p +\v 5 The sons of Rimmon the Beerothite, Rechab and Baanah, went out and came at about the heat of the day to the house of Ishbosheth as he took his rest at noon. +\v 6 They came there into the middle of the house as though they would have fetched wheat, and they struck him in the body; and Rechab and Baanah his brother escaped. +\v 7 Now when they came into the house as he lay on his bed in his bedroom, they struck him, killed him, beheaded him, and took his head, and went by the way of the Arabah all night. +\v 8 They brought the head of Ishbosheth to David to Hebron, and said to the king, “Behold, the head of Ishbosheth, the son of Saul, your enemy, who sought your life! Yahweh has avenged my lord the king today of Saul and of his offspring.\f + \fr 4:8 \ft or, seed\f*” +\p +\v 9 David answered Rechab and Baanah his brother, the sons of Rimmon the Beerothite, and said to them, “As Yahweh lives, who has redeemed my soul out of all adversity, +\v 10 when someone told me, ‘Behold, Saul is dead,’ thinking that he brought good news, I seized him and killed him in Ziklag, which was the reward I gave him for his news. +\v 11 How much more, when wicked men have slain a righteous person in his own house on his bed, should I not now require his blood from your hand, and rid the earth of you?” +\v 12 David commanded his young men, and they killed them, cut off their hands and their feet, and hanged them up beside the pool in Hebron. But they took the head of Ishbosheth and buried it in Abner’s grave in Hebron. +\c 5 +\p +\v 1 Then all the tribes of Israel came to David at Hebron and spoke, saying, “Behold, we are your bone and your flesh. +\v 2 In times past, when Saul was king over us, it was you who led Israel out and in. Yahweh said to you, ‘You will be shepherd of my people Israel, and you will be prince over Israel.’” +\v 3 So all the elders of Israel came to the king to Hebron, and King David made a covenant with them in Hebron before Yahweh; and they anointed David king over Israel. +\p +\v 4 David was thirty years old when he began to reign, and he reigned forty years. +\v 5 In Hebron he reigned over Judah seven years and six months, and in Jerusalem he reigned thirty-three years over all Israel and Judah. +\p +\v 6 The king and his men went to Jerusalem against the Jebusites, the inhabitants of the land, who spoke to David, saying, “The blind and the lame will keep you out of here,” thinking, “David can’t come in here.” +\v 7 Nevertheless David took the stronghold of Zion. This is David’s city. +\v 8 David said on that day, “Whoever strikes the Jebusites, let him go up to the watercourse and strike those lame and blind, who are hated by David’s soul.” Therefore they say, “The blind and the lame can’t come into the house.” +\p +\v 9 David lived in the stronghold, and called it David’s city. David built around from Millo and inward. +\v 10 David grew greater and greater, for Yahweh, the God of Armies, was with him. +\v 11 Hiram king of Tyre sent messengers to David, with cedar trees, carpenters, and masons; and they built David a house. +\v 12 David perceived that Yahweh had established him king over Israel, and that he had exalted his kingdom for his people Israel’s sake. +\p +\v 13 David took more concubines and wives for himself out of Jerusalem, after he had come from Hebron; and more sons and daughters were born to David. +\v 14 These are the names of those who were born to him in Jerusalem: Shammua, Shobab, Nathan, Solomon, +\v 15 Ibhar, Elishua, Nepheg, Japhia, +\v 16 Elishama, Eliada, and Eliphelet. +\p +\v 17 When the Philistines heard that they had anointed David king over Israel, all the Philistines went up to seek David, but David heard about it and went down to the stronghold. +\v 18 Now the Philistines had come and spread themselves in the valley of Rephaim. +\v 19 David inquired of Yahweh, saying, “Shall I go up against the Philistines? Will you deliver them into my hand?” +\p Yahweh said to David, “Go up; for I will certainly deliver the Philistines into your hand.” +\p +\v 20 David came to Baal Perazim, and David struck them there. Then he said, “Yahweh has broken my enemies before me, like the breach of waters.” Therefore he called the name of that place Baal Perazim.\f + \fr 5:20 \ft “Baal Perazim” means “Lord who breaks out”.\f* +\v 21 They left their images there, and David and his men took them away. +\p +\v 22 The Philistines came up yet again and spread themselves in the valley of Rephaim. +\v 23 When David inquired of Yahweh, he said, “You shall not go up. Circle around behind them, and attack them in front of the mulberry trees. +\v 24 When you hear the sound of marching in the tops of the mulberry trees, then stir yourself up; for then Yahweh has gone out before you to strike the army of the Philistines.” +\p +\v 25 David did so, as Yahweh commanded him, and struck the Philistines all the way from Geba to Gezer. +\c 6 +\p +\v 1 David again gathered together all the chosen men of Israel, thirty thousand. +\v 2 David arose and went with all the people who were with him from Baale Judah, to bring up from there God’s ark, which is called by the Name, even the name of Yahweh of Armies who sits above the cherubim. +\v 3 They set God’s ark on a new cart, and brought it out of Abinadab’s house that was on the hill; and Uzzah and Ahio, the sons of Abinadab, drove the new cart. +\v 4 They brought it out of Abinadab’s house which was in the hill, with God’s ark; and Ahio went before the ark. +\v 5 David and all the house of Israel played before Yahweh with all kinds of instruments made of cypress wood, with harps, with stringed instruments, with tambourines, with castanets, and with cymbals. +\p +\v 6 When they came to the threshing floor of Nacon, Uzzah reached for God’s ark and took hold of it, for the cattle stumbled. +\v 7 Yahweh’s anger burned against Uzzah, and God struck him there for his error; and he died there by God’s ark. +\v 8 David was displeased because Yahweh had broken out against Uzzah; and he called that place Perez Uzzah\f + \fr 6:8 \ft “Perez Uzzah” means “outbreak against Uzzah”.\f* to this day. +\v 9 David was afraid of Yahweh that day; and he said, “How could Yahweh’s ark come to me?” +\v 10 So David would not move Yahweh’s ark to be with him in David’s city; but David carried it aside into Obed-Edom the Gittite’s house. +\v 11 Yahweh’s ark remained in Obed-Edom the Gittite’s house three months; and Yahweh blessed Obed-Edom and all his house. +\v 12 King David was told, “Yahweh has blessed the house of Obed-Edom, and all that belongs to him, because of God’s ark.” +\p So David went and brought up God’s ark from the house of Obed-Edom into David’s city with joy. +\v 13 When those who bore Yahweh’s ark had gone six paces, he sacrificed an ox and a fattened calf. +\v 14 David danced before Yahweh with all his might; and David was clothed in a linen ephod. +\v 15 So David and all the house of Israel brought up Yahweh’s ark with shouting and with the sound of the trumpet. +\p +\v 16 As Yahweh’s ark came into David’s city, Michal the daughter of Saul looked out through the window and saw King David leaping and dancing before Yahweh; and she despised him in her heart. +\v 17 They brought in Yahweh’s ark, and set it in its place in the middle of the tent that David had pitched for it; and David offered burnt offerings and peace offerings before Yahweh. +\v 18 When David had finished offering the burnt offering and the peace offerings, he blessed the people in the name of Yahweh of Armies. +\v 19 He gave to all the people, even among the whole multitude of Israel, both to men and women, to everyone a portion of bread, dates, and raisins. So all the people departed, each to his own house. +\p +\v 20 Then David returned to bless his household. Michal the daughter of Saul came out to meet David, and said, “How glorious the king of Israel was today, who uncovered himself today in the eyes of his servants’ maids, as one of the vain fellows shamelessly uncovers himself!” +\p +\v 21 David said to Michal, “It was before Yahweh, who chose me above your father, and above all his house, to appoint me prince over the people of Yahweh, over Israel. Therefore I will celebrate before Yahweh. +\v 22 I will be yet more undignified than this, and will be worthless in my own sight. But the maids of whom you have spoken will honor me.” +\p +\v 23 Michal the daughter of Saul had no child to the day of her death. +\c 7 +\p +\v 1 When the king lived in his house, and Yahweh had given him rest from all his enemies all around, +\v 2 the king said to Nathan the prophet, “See now, I dwell in a house of cedar, but God’s ark dwells within curtains.” +\p +\v 3 Nathan said to the king, “Go, do all that is in your heart, for Yahweh is with you.” +\p +\v 4 That same night, Yahweh’s word came to Nathan, saying, +\v 5 “Go and tell my servant David, ‘Yahweh says, “Should you build me a house for me to dwell in? +\v 6 For I have not lived in a house since the day that I brought the children of Israel up out of Egypt, even to this day, but have moved around in a tent and in a tabernacle. +\v 7 In all places in which I have walked with all the children of Israel, did I say a word to anyone from the tribes of Israel whom I commanded to be shepherd of my people Israel, saying, ‘Why have you not built me a house of cedar?’”’ +\v 8 Now therefore tell my servant David this: ‘Yahweh of Armies says, “I took you from the sheep pen, from following the sheep, to be prince over my people, over Israel. +\v 9 I have been with you wherever you went, and have cut off all your enemies from before you. I will make you a great name, like the name of the great ones who are in the earth. +\v 10 I will appoint a place for my people Israel, and will plant them, that they may dwell in their own place and be moved no more. The children of wickedness will not afflict them any more, as at the first, +\v 11 and as from the day that I commanded judges to be over my people Israel. I will cause you to rest from all your enemies. Moreover Yahweh tells you that Yahweh will make you a house. +\v 12 When your days are fulfilled and you sleep with your fathers, I will set up your offspring after you, who will proceed out of your body, and I will establish his kingdom. +\v 13 He will build a house for my name, and I will establish the throne of his kingdom forever. +\v 14 I will be his father, and he will be my son. If he commits iniquity, I will chasten him with the rod of men and with the stripes of the children of men; +\v 15 but my loving kindness will not depart from him, as I took it from Saul, whom I put away before you. +\v 16 Your house and your kingdom will be made sure forever before you. Your throne will be established forever.”’” +\v 17 Nathan spoke to David all these words, and according to all this vision. +\p +\v 18 Then David the king went in and sat before Yahweh; and he said, “Who am I, Lord\f + \fr 7:18 \ft The word translated “Lord” is “Adonai.”\f* Yahweh, and what is my house, that you have brought me this far? +\v 19 This was yet a small thing in your eyes, Lord Yahweh, but you have spoken also of your servant’s house for a great while to come; and this among men, Lord Yahweh! +\v 20 What more can David say to you? For you know your servant, Lord Yahweh. +\v 21 For your word’s sake, and according to your own heart, you have worked all this greatness, to make your servant know it. +\v 22 Therefore you are great, Yahweh God. For there is no one like you, neither is there any God besides you, according to all that we have heard with our ears. +\v 23 What one nation in the earth is like your people, even like Israel, whom God went to redeem to himself for a people, and to make himself a name, and to do great things for you, and awesome things for your land, before your people, whom you redeemed to yourself out of Egypt, from the nations and their gods? +\v 24 You established for yourself your people Israel to be your people forever; and you, Yahweh, became their God. +\p +\v 25 “Now, Yahweh God, the word that you have spoken concerning your servant, and concerning his house, confirm it forever, and do as you have spoken. +\v 26 Let your name be magnified forever, saying, ‘Yahweh of Armies is God over Israel; and the house of your servant David will be established before you.’ +\v 27 For you, Yahweh of Armies, the God of Israel, have revealed to your servant, saying, ‘I will build you a house.’ Therefore your servant has found in his heart to pray this prayer to you. +\p +\v 28 “Now, O Lord Yahweh, you are God, and your words are truth, and you have promised this good thing to your servant. +\v 29 Now therefore, let it please you to bless the house of your servant, that it may continue forever before you; for you, Lord Yahweh, have spoken it. Let the house of your servant be blessed forever with your blessing.” +\c 8 +\p +\v 1 After this, David struck the Philistines and subdued them; and David took the bridle of the mother city out of the hand of the Philistines. +\v 2 He defeated Moab, and measured them with the line, making them to lie down on the ground; and he measured two lines to put to death, and one full line to keep alive. The Moabites became servants to David, and brought tribute. +\p +\v 3 David also struck Hadadezer the son of Rehob, king of Zobah, as he went to recover his dominion at the River. +\v 4 David took from him one thousand seven hundred horsemen and twenty thousand footmen. David hamstrung the chariot horses, but reserved enough of them for one hundred chariots. +\v 5 When the Syrians of Damascus came to help Hadadezer king of Zobah, David struck twenty two thousand men of the Syrians. +\v 6 Then David put garrisons in Syria of Damascus; and the Syrians became servants to David, and brought tribute. Yahweh gave victory to David wherever he went. +\v 7 David took the shields of gold that were on the servants of Hadadezer, and brought them to Jerusalem. +\v 8 From Betah and from Berothai, cities of Hadadezer, King David took a great quantity of bronze. +\p +\v 9 When Toi king of Hamath heard that David had struck all the army of Hadadezer, +\v 10 then Toi sent Joram his son to King David to greet him and to bless him, because he had fought against Hadadezer and struck him; for Hadadezer had wars with Toi. Joram brought with him vessels of silver, vessels of gold, and vessels of bronze. +\v 11 King David also dedicated these to Yahweh, with the silver and gold that he dedicated of all the nations which he subdued— +\v 12 of Syria, of Moab, of the children of Ammon, of the Philistines, of Amalek, and of the plunder of Hadadezer, son of Rehob, king of Zobah. +\p +\v 13 David earned a reputation when he returned from striking down eighteen thousand men of the Syrians in the Valley of Salt. +\v 14 He put garrisons in Edom. Throughout all Edom, he put garrisons, and all the Edomites became servants to David. Yahweh gave victory to David wherever he went. +\p +\v 15 David reigned over all Israel; and David executed justice and righteousness for all his people. +\v 16 Joab the son of Zeruiah was over the army, Jehoshaphat the son of Ahilud was recorder, +\v 17 Zadok the son of Ahitub and Ahimelech the son of Abiathar were priests, Seraiah was scribe, +\v 18 Benaiah the son of Jehoiada was over the Cherethites and the Pelethites; and David’s sons were chief ministers. +\c 9 +\p +\v 1 David said, “Is there yet any who is left of Saul’s house, that I may show him kindness for Jonathan’s sake?” +\v 2 There was of Saul’s house a servant whose name was Ziba, and they called him to David; and the king said to him, “Are you Ziba?” +\p He said, “I am your servant.” +\p +\v 3 The king said, “Is there not yet any of Saul’s house, that I may show the kindness of God to him?” +\p Ziba said to the king, “Jonathan still has a son, who is lame in his feet.” +\p +\v 4 The king said to him, “Where is he?” +\p Ziba said to the king, “Behold, he is in the house of Machir the son of Ammiel, in Lo Debar.” +\p +\v 5 Then King David sent and brought him out of the house of Machir the son of Ammiel, from Lo Debar. +\v 6 Mephibosheth, the son of Jonathan, the son of Saul, came to David, fell on his face, and showed respect. David said, “Mephibosheth?” +\p He answered, “Behold, your servant!” +\p +\v 7 David said to him, “Don’t be afraid, for I will surely show you kindness for Jonathan your father’s sake, and will restore to you all the land of Saul your father. You will eat bread at my table continually.” +\p +\v 8 He bowed down, and said, “What is your servant, that you should look at such a dead dog as I am?” +\p +\v 9 Then the king called to Ziba, Saul’s servant, and said to him, “All that belonged to Saul and to all his house I have given to your master’s son. +\v 10 Till the land for him—you, your sons, and your servants. Bring in the harvest, that your master’s son may have bread to eat; but Mephibosheth your master’s son will always eat bread at my table.” +\p Now Ziba had fifteen sons and twenty servants. +\v 11 Then Ziba said to the king, “According to all that my lord the king commands his servant, so your servant will do.” So Mephibosheth ate at the king’s table like one of the king’s sons. +\v 12 Mephibosheth had a young son, whose name was Mica. All who lived in Ziba’s house were servants to Mephibosheth. +\v 13 So Mephibosheth lived in Jerusalem, for he ate continually at the king’s table. He was lame in both his feet. +\c 10 +\p +\v 1 After this, the king of the children of Ammon died, and Hanun his son reigned in his place. +\v 2 David said, “I will show kindness to Hanun the son of Nahash, as his father showed kindness to me.” So David sent by his servants to comfort him concerning his father. David’s servants came into the land of the children of Ammon. +\p +\v 3 But the princes of the children of Ammon said to Hanun their lord, “Do you think that David honors your father, in that he has sent comforters to you? Hasn’t David sent his servants to you to search the city, to spy it out, and to overthrow it?” +\p +\v 4 So Hanun took David’s servants, shaved off one half of their beards, and cut off their garments in the middle, even to their buttocks, and sent them away. +\v 5 When they told David this, he sent to meet them, for the men were greatly ashamed. The king said, “Wait at Jericho until your beards have grown, and then return.” +\p +\v 6 When the children of Ammon saw that they had become odious to David, the children of Ammon sent and hired the Syrians of Beth Rehob and the Syrians of Zobah, twenty thousand footmen, and the king of Maacah with one thousand men, and the men of Tob twelve thousand men. +\v 7 When David heard of it, he sent Joab and all the army of the mighty men. +\v 8 The children of Ammon came out, and put the battle in array at the entrance of the gate. The Syrians of Zobah and of Rehob and the men of Tob and Maacah were by themselves in the field. +\v 9 Now when Joab saw that the battle was set against him before and behind, he chose of all the choice men of Israel and put them in array against the Syrians. +\v 10 The rest of the people he committed into the hand of Abishai his brother; and he put them in array against the children of Ammon. +\v 11 He said, “If the Syrians are too strong for me, then you shall help me; but if the children of Ammon are too strong for you, then I will come and help you. +\v 12 Be courageous, and let’s be strong for our people and for the cities of our God; and may Yahweh do what seems good to him.” +\v 13 So Joab and the people who were with him came near to the battle against the Syrians, and they fled before him. +\v 14 When the children of Ammon saw that the Syrians had fled, they likewise fled before Abishai, and entered into the city. Then Joab returned from the children of Ammon and came to Jerusalem. +\p +\v 15 When the Syrians saw that they were defeated by Israel, they gathered themselves together. +\v 16 Hadadezer sent and brought out the Syrians who were beyond the River; and they came to Helam, with Shobach the captain of the army of Hadadezer at their head. +\v 17 David was told that; and he gathered all Israel together, passed over the Jordan, and came to Helam. The Syrians set themselves in array against David and fought with him. +\v 18 The Syrians fled before Israel; and David killed seven hundred charioteers of the Syrians and forty thousand horsemen, and struck Shobach the captain of their army, so that he died there. +\v 19 When all the kings who were servants to Hadadezer saw that they were defeated before Israel, they made peace with Israel and served them. So the Syrians were afraid to help the children of Ammon any more. +\c 11 +\p +\v 1 At the return of the year, at the time when kings go out, David sent Joab and his servants with him, and all Israel; and they destroyed the children of Ammon and besieged Rabbah. But David stayed at Jerusalem. +\v 2 At evening, David arose from his bed and walked on the roof of the king’s house. From the roof, he saw a woman bathing, and the woman was very beautiful to look at. +\v 3 David sent and inquired after the woman. One said, “Isn’t this Bathsheba, the daughter of Eliam, Uriah the Hittite’s wife?” +\p +\v 4 David sent messengers, and took her; and she came in to him, and he lay with her (for she was purified from her uncleanness); and she returned to her house. +\v 5 The woman conceived; and she sent and told David, and said, “I am with child.” +\p +\v 6 David sent to Joab, “Send me Uriah the Hittite.” Joab sent Uriah to David. +\v 7 When Uriah had come to him, David asked him how Joab did, and how the people fared, and how the war prospered. +\v 8 David said to Uriah, “Go down to your house and wash your feet.” Uriah departed out of the king’s house, and a gift from the king was sent after him. +\v 9 But Uriah slept at the door of the king’s house with all the servants of his lord, and didn’t go down to his house. +\v 10 When they had told David, saying, “Uriah didn’t go down to his house,” David said to Uriah, “Haven’t you come from a journey? Why didn’t you go down to your house?” +\p +\v 11 Uriah said to David, “The ark, Israel, and Judah, are staying in tents; and my lord Joab and the servants of my lord are encamped in the open field. Shall I then go into my house to eat and to drink, and to lie with my wife? As you live, and as your soul lives, I will not do this thing!” +\p +\v 12 David said to Uriah, “Stay here today also, and tomorrow I will let you depart.” So Uriah stayed in Jerusalem that day and the next day. +\v 13 When David had called him, he ate and drank before him; and he made him drunk. At evening, he went out to lie on his bed with the servants of his lord, but didn’t go down to his house. +\v 14 In the morning, David wrote a letter to Joab and sent it by the hand of Uriah. +\v 15 He wrote in the letter, saying, “Send Uriah to the forefront of the hottest battle, and retreat from him, that he may be struck and die.” +\p +\v 16 When Joab kept watch on the city, he assigned Uriah to the place where he knew that valiant men were. +\v 17 The men of the city went out and fought with Joab. Some of the people fell, even of David’s servants; and Uriah the Hittite died also. +\v 18 Then Joab sent and told David all the things concerning the war; +\v 19 and he commanded the messenger, saying, “When you have finished telling all the things concerning the war to the king, +\v 20 it shall be that, if the king’s wrath arise, and he asks you, ‘Why did you go so near to the city to fight? Didn’t you know that they would shoot from the wall? +\v 21 Who struck Abimelech the son of Jerubbesheth? Didn’t a woman cast an upper millstone on him from the wall, so that he died at Thebez? Why did you go so near the wall?’ then you shall say, ‘Your servant Uriah the Hittite is also dead.’” +\p +\v 22 So the messenger went, and came and showed David all that Joab had sent him for. +\v 23 The messenger said to David, “The men prevailed against us, and came out to us into the field; and we were on them even to the entrance of the gate. +\v 24 The shooters shot at your servants from off the wall; and some of the king’s servants are dead, and your servant Uriah the Hittite is also dead.” +\p +\v 25 Then David said to the messenger, “Tell Joab, ‘Don’t let this thing displease you, for the sword devours one as well as another. Make your battle stronger against the city, and overthrow it.’ Encourage him.” +\p +\v 26 When Uriah’s wife heard that Uriah her husband was dead, she mourned for her husband. +\v 27 When the mourning was past, David sent and took her home to his house, and she became his wife and bore him a son. But the thing that David had done displeased Yahweh. +\c 12 +\p +\v 1 Yahweh sent Nathan to David. He came to him, and said to him, “There were two men in one city: the one rich, and the other poor. +\v 2 The rich man had very many flocks and herds, +\v 3 but the poor man had nothing, except one little ewe lamb, which he had bought and raised. It grew up together with him and with his children. It ate of his own food, drank of his own cup, and lay in his bosom, and was like a daughter to him. +\v 4 A traveler came to the rich man, and he didn’t want to take of his own flock and of his own herd to prepare for the wayfaring man who had come to him, but took the poor man’s lamb and prepared it for the man who had come to him.” +\p +\v 5 David’s anger burned hot against the man, and he said to Nathan, “As Yahweh lives, the man who has done this deserves to die! +\v 6 He must restore the lamb fourfold, because he did this thing and because he had no pity!” +\p +\v 7 Nathan said to David, “You are the man! This is what Yahweh, the God of Israel, says: ‘I anointed you king over Israel, and I delivered you out of the hand of Saul. +\v 8 I gave you your master’s house and your master’s wives into your bosom, and gave you the house of Israel and of Judah; and if that would have been too little, I would have added to you many more such things. +\v 9 Why have you despised Yahweh’s word, to do that which is evil in his sight? You have struck Uriah the Hittite with the sword, have taken his wife to be your wife, and have slain him with the sword of the children of Ammon. +\v 10 Now therefore the sword will never depart from your house, because you have despised me and have taken Uriah the Hittite’s wife to be your wife.’ +\p +\v 11 “This is what Yahweh says: ‘Behold, I will raise up evil against you out of your own house; and I will take your wives before your eyes and give them to your neighbor, and he will lie with your wives in the sight of this sun. +\v 12 For you did this secretly, but I will do this thing before all Israel, and before the sun.’” +\p +\v 13 David said to Nathan, “I have sinned against Yahweh.” +\p Nathan said to David, “Yahweh also has put away your sin. You will not die. +\v 14 However, because by this deed you have given great occasion to Yahweh’s enemies to blaspheme, the child also who is born to you will surely die.” +\v 15 Then Nathan departed to his house. +\p Yahweh struck the child that Uriah’s wife bore to David, and he was very sick. +\v 16 David therefore begged God for the child; and David fasted, and went in and lay all night on the ground. +\v 17 The elders of his house arose beside him, to raise him up from the earth; but he would not, and he didn’t eat bread with them. +\v 18 On the seventh day, the child died. David’s servants were afraid to tell him that the child was dead, for they said, “Behold, while the child was yet alive, we spoke to him and he didn’t listen to our voice. How will he then harm himself if we tell him that the child is dead?” +\p +\v 19 But when David saw that his servants were whispering together, David perceived that the child was dead; and David said to his servants, “Is the child dead?” +\p They said, “He is dead.” +\p +\v 20 Then David arose from the earth, and washed and anointed himself, and changed his clothing; and he came into Yahweh’s house, and worshiped. Then he came to his own house; and when he requested, they set bread before him and he ate. +\v 21 Then his servants said to him, “What is this that you have done? You fasted and wept for the child while he was alive, but when the child was dead, you rose up and ate bread.” +\p +\v 22 He said, “While the child was yet alive, I fasted and wept; for I said, ‘Who knows whether Yahweh will not be gracious to me, that the child may live?’ +\v 23 But now he is dead. Why should I fast? Can I bring him back again? I will go to him, but he will not return to me.” +\p +\v 24 David comforted Bathsheba his wife, and went in to her, and lay with her. She bore a son, and he called his name Solomon. Yahweh loved him; +\v 25 and he sent by the hand of Nathan the prophet, and he named him Jedidiah,\f + \fr 12:25 \ft “Jedidiah” means “loved by Yahweh”.\f* for Yahweh’s sake. +\p +\v 26 Now Joab fought against Rabbah of the children of Ammon, and took the royal city. +\v 27 Joab sent messengers to David, and said, “I have fought against Rabbah. Yes, I have taken the city of waters. +\v 28 Now therefore gather the rest of the people together, and encamp against the city and take it; lest I take the city, and it be called by my name.” +\p +\v 29 David gathered all the people together and went to Rabbah, and fought against it and took it. +\v 30 He took the crown of their king from off his head; and its weight was a talent\f + \fr 12:30 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of gold, and in it were precious stones; and it was set on David’s head. He brought a great quantity of plunder out of the city. +\v 31 He brought out the people who were in it, and put them to work under saws, under iron picks, under axes of iron, and made them go to the brick kiln; and he did so to all the cities of the children of Ammon. Then David and all the people returned to Jerusalem. +\c 13 +\p +\v 1 After this, Absalom the son of David had a beautiful sister, whose name was Tamar; and Amnon the son of David loved her. +\v 2 Amnon was so troubled that he became sick because of his sister Tamar, for she was a virgin, and it seemed hard to Amnon to do anything to her. +\v 3 But Amnon had a friend whose name was Jonadab the son of Shimeah, David’s brother; and Jonadab was a very subtle man. +\v 4 He said to him, “Why, son of the king, are you so sad from day to day? Won’t you tell me?” +\p Amnon said to him, “I love Tamar, my brother Absalom’s sister.” +\p +\v 5 Jonadab said to him, “Lay down on your bed and pretend to be sick. When your father comes to see you, tell him, ‘Please let my sister Tamar come and give me bread to eat, and prepare the food in my sight, that I may see it and eat it from her hand.’” +\p +\v 6 So Amnon lay down and faked being sick. When the king came to see him, Amnon said to the king, “Please let my sister Tamar come and make me a couple of cakes in my sight, that I may eat from her hand.” +\p +\v 7 Then David sent home to Tamar, saying, “Go now to your brother Amnon’s house, and prepare food for him.” +\v 8 So Tamar went to her brother Amnon’s house; and he was lying down. She took dough, kneaded it, made cakes in his sight, and baked the cakes. +\v 9 She took the pan and poured them out before him, but he refused to eat. Amnon said, “Have all men leave me.” Then every man went out from him. +\v 10 Amnon said to Tamar, “Bring the food into the room, that I may eat from your hand.” Tamar took the cakes which she had made, and brought them into the room to Amnon her brother. +\v 11 When she had brought them near to him to eat, he took hold of her and said to her, “Come, lie with me, my sister!” +\p +\v 12 She answered him, “No, my brother, do not force me! For no such thing ought to be done in Israel. Don’t you do this folly! +\v 13 As for me, where would I carry my shame? And as for you, you will be as one of the fools in Israel. Now therefore, please speak to the king; for he will not withhold me from you.” +\p +\v 14 However, he would not listen to her voice; but being stronger than she, he forced her and lay with her. +\v 15 Then Amnon hated her with exceedingly great hatred; for the hatred with which he hated her was greater than the love with which he had loved her. Amnon said to her, “Arise, be gone!” +\p +\v 16 She said to him, “Not so, because this great wrong in sending me away is worse than the other that you did to me!” +\p But he would not listen to her. +\v 17 Then he called his servant who ministered to him, and said, “Now put this woman out from me, and bolt the door after her.” +\p +\v 18 She had a garment of various colors on her, for the king’s daughters who were virgins dressed in such robes. Then his servant brought her out and bolted the door after her. +\v 19 Tamar put ashes on her head, and tore her garment of various colors that was on her; and she laid her hand on her head and went her way, crying aloud as she went. +\v 20 Absalom her brother said to her, “Has Amnon your brother been with you? But now hold your peace, my sister. He is your brother. Don’t take this thing to heart.” +\p So Tamar remained desolate in her brother Absalom’s house. +\v 21 But when King David heard of all these things, he was very angry. +\v 22 Absalom spoke to Amnon neither good nor bad; for Absalom hated Amnon, because he had forced his sister Tamar. +\p +\v 23 After two full years, Absalom had sheep shearers in Baal Hazor, which is beside Ephraim; and Absalom invited all the king’s sons. +\v 24 Absalom came to the king and said, “See now, your servant has sheep shearers. Please let the king and his servants go with your servant.” +\p +\v 25 The king said to Absalom, “No, my son, let’s not all go, lest we be burdensome to you.” He pressed him; however he would not go, but blessed him. +\p +\v 26 Then Absalom said, “If not, please let my brother Amnon go with us.” +\p The king said to him, “Why should he go with you?” +\p +\v 27 But Absalom pressed him, and he let Amnon and all the king’s sons go with him. +\v 28 Absalom commanded his servants, saying, “Mark now, when Amnon’s heart is merry with wine; and when I tell you, ‘Strike Amnon,’ then kill him. Don’t be afraid. Haven’t I commanded you? Be courageous, and be valiant!” +\p +\v 29 The servants of Absalom did to Amnon as Absalom had commanded. Then all the king’s sons arose, and every man got up on his mule and fled. +\p +\v 30 While they were on the way, the news came to David, saying, “Absalom has slain all the king’s sons, and there is not one of them left!” +\p +\v 31 Then the king arose, and tore his garments, and lay on the earth; and all his servants stood by with their clothes torn. +\v 32 Jonadab the son of Shimeah, David’s brother, answered, “Don’t let my lord suppose that they have killed all the young men, the king’s sons, for Amnon only is dead; for by the appointment of Absalom this has been determined from the day that he forced his sister Tamar. +\v 33 Now therefore don’t let my lord the king take the thing to his heart, to think that all the king’s sons are dead; for only Amnon is dead.” +\v 34 But Absalom fled. The young man who kept the watch lifted up his eyes and looked, and behold, many people were coming by way of the hillside behind him. +\v 35 Jonadab said to the king, “Behold, the king’s sons are coming! It is as your servant said.” +\v 36 As soon as he had finished speaking, behold, the king’s sons came, and lifted up their voices and wept. The king also and all his servants wept bitterly. +\p +\v 37 But Absalom fled and went to Talmai the son of Ammihur, king of Geshur. David mourned for his son every day. +\v 38 So Absalom fled and went to Geshur, and was there three years. +\v 39 King David longed to go out to Absalom, for he was comforted concerning Amnon, since he was dead. +\c 14 +\p +\v 1 Now Joab the son of Zeruiah perceived that the king’s heart was toward Absalom. +\v 2 Joab sent to Tekoa and brought a wise woman from there, and said to her, “Please act like a mourner, and put on mourning clothing, please, and don’t anoint yourself with oil; but be as a woman who has mourned a long time for the dead. +\v 3 Go in to the king and speak like this to him.” So Joab put the words in her mouth. +\p +\v 4 When the woman of Tekoa spoke to the king, she fell on her face to the ground, showed respect, and said, “Help, O king!” +\p +\v 5 The king said to her, “What ails you?” +\p She answered, “Truly I am a widow, and my husband is dead. +\v 6 Your servant had two sons; and they both fought together in the field, and there was no one to part them, but the one struck the other and killed him. +\v 7 Behold, the whole family has risen against your servant, and they say, ‘Deliver him who struck his brother, that we may kill him for the life of his brother whom he killed, and so destroy the heir also.’ Thus they would quench my coal which is left, and would leave to my husband neither name nor remainder on the surface of the earth.” +\p +\v 8 The king said to the woman, “Go to your house, and I will give a command concerning you.” +\p +\v 9 The woman of Tekoa said to the king, “My lord, O king, may the iniquity be on me, and on my father’s house; and may the king and his throne be guiltless.” +\p +\v 10 The king said, “Whoever says anything to you, bring him to me, and he will not bother you any more.” +\p +\v 11 Then she said, “Please let the king remember Yahweh your God, that the avenger of blood destroy not any more, lest they destroy my son.” +\p He said, “As Yahweh lives, not one hair of your son shall fall to the earth.” +\p +\v 12 Then the woman said, “Please let your servant speak a word to my lord the king.” +\p He said, “Say on.” +\p +\v 13 The woman said, “Why then have you devised such a thing against the people of God? For in speaking this word the king is as one who is guilty, in that the king does not bring home again his banished one. +\v 14 For we must die, and are like water spilled on the ground, which can’t be gathered up again; neither does God take away life, but devises means, that he who is banished not be an outcast from him. +\v 15 Now therefore, seeing that I have come to speak this word to my lord the king, it is because the people have made me afraid. Your servant said, ‘I will now speak to the king; it may be that the king will perform the request of his servant.’ +\v 16 For the king will hear, to deliver his servant out of the hand of the man who would destroy me and my son together out of the inheritance of God. +\v 17 Then your servant said, ‘Please let the word of my lord the king bring rest; for as an angel of God, so is my lord the king to discern good and bad. May Yahweh, your God, be with you.’” +\p +\v 18 Then the king answered the woman, “Please don’t hide anything from me that I ask you.” +\p The woman said, “Let my lord the king now speak.” +\p +\v 19 The king said, “Is the hand of Joab with you in all this?” +\p The woman answered, “As your soul lives, my lord the king, no one can turn to the right hand or to the left from anything that my lord the king has spoken; for your servant Joab urged me, and he put all these words in the mouth of your servant. +\v 20 Your servant Joab has done this thing to change the face of the matter. My lord is wise, according to the wisdom of an angel of God, to know all things that are in the earth.” +\p +\v 21 The king said to Joab, “Behold now, I have granted this thing. Go therefore, and bring the young man Absalom back.” +\p +\v 22 Joab fell to the ground on his face, showed respect, and blessed the king. Joab said, “Today your servant knows that I have found favor in your sight, my lord, O king, in that the king has performed the request of his servant.” +\p +\v 23 So Joab arose and went to Geshur, and brought Absalom to Jerusalem. +\v 24 The king said, “Let him return to his own house, but let him not see my face.” So Absalom returned to his own house, and didn’t see the king’s face. +\v 25 Now in all Israel there was no one to be so much praised as Absalom for his beauty. From the sole of his foot even to the crown of his head there was no defect in him. +\v 26 When he cut the hair of his head (now it was at every year’s end that he cut it; because it was heavy on him, therefore he cut it), he weighed the hair of his head at two hundred shekels,\f + \fr 14:26 \ft A shekel is about 10 grams or about 0.35 ounces, so 200 shekels is about 2 kilograms or about 4.4 pounds.\f* after the king’s weight. +\v 27 Three sons were born to Absalom, and one daughter, whose name was Tamar. She was a woman with a beautiful face. +\v 28 Absalom lived two full years in Jerusalem, and he didn’t see the king’s face. +\v 29 Then Absalom sent for Joab, to send him to the king, but he would not come to him. Then he sent again a second time, but he would not come. +\v 30 Therefore he said to his servants, “Behold, Joab’s field is near mine, and he has barley there. Go and set it on fire.” So Absalom’s servants set the field on fire. +\p +\v 31 Then Joab arose and came to Absalom to his house, and said to him, “Why have your servants set my field on fire?” +\p +\v 32 Absalom answered Joab, “Behold, I sent to you, saying, ‘Come here, that I may send you to the king, to say, “Why have I come from Geshur? It would be better for me to be there still. Now therefore, let me see the king’s face; and if there is iniquity in me, let him kill me.”’” +\p +\v 33 So Joab came to the king and told him; and when he had called for Absalom, he came to the king and bowed himself on his face to the ground before the king; and the king kissed Absalom. +\c 15 +\p +\v 1 After this, Absalom prepared a chariot and horses for himself, and fifty men to run before him. +\v 2 Absalom rose up early, and stood beside the way of the gate. When any man had a suit which should come to the king for judgment, then Absalom called to him, and said, “What city are you from?” +\p He said, “Your servant is of one of the tribes of Israel.” +\p +\v 3 Absalom said to him, “Behold, your matters are good and right; but there is no man deputized by the king to hear you.” +\v 4 Absalom said moreover, “Oh that I were made judge in the land, that every man who has any suit or cause might come to me, and I would do him justice!” +\v 5 It was so, that when any man came near to bow down to him, he stretched out his hand, took hold of him, and kissed him. +\v 6 Absalom did this sort of thing to all Israel who came to the king for judgment. So Absalom stole the hearts of the men of Israel. +\p +\v 7 At the end of forty years, Absalom said to the king, “Please let me go and pay my vow, which I have vowed to Yahweh, in Hebron. +\v 8 For your servant vowed a vow while I stayed at Geshur in Syria, saying, ‘If Yahweh shall indeed bring me again to Jerusalem, then I will serve Yahweh.’” +\p +\v 9 The king said to him, “Go in peace.” +\p So he arose and went to Hebron. +\v 10 But Absalom sent spies throughout all the tribes of Israel, saying, “As soon as you hear the sound of the trumpet, then you shall say, ‘Absalom is king in Hebron!’” +\p +\v 11 Two hundred men went with Absalom out of Jerusalem, who were invited, and went in their simplicity; and they didn’t know anything. +\v 12 Absalom sent for Ahithophel the Gilonite, David’s counselor, from his city, even from Giloh, while he was offering the sacrifices. The conspiracy was strong, for the people increased continually with Absalom. +\v 13 A messenger came to David, saying, “The hearts of the men of Israel are after Absalom.” +\p +\v 14 David said to all his servants who were with him at Jerusalem, “Arise! Let’s flee, or else none of us will escape from Absalom. Hurry to depart, lest he overtake us quickly and bring down evil on us, and strike the city with the edge of the sword.” +\p +\v 15 The king’s servants said to the king, “Behold, your servants are ready to do whatever my lord the king chooses.” +\p +\v 16 The king went out, and all his household after him. The king left ten women, who were concubines, to keep the house. +\v 17 The king went out, and all the people after him; and they stayed in Beth Merhak. +\v 18 All his servants passed on beside him; and all the Cherethites, and all the Pelethites, and all the Gittites, six hundred men who came after him from Gath, passed on before the king. +\p +\v 19 Then the king said to Ittai the Gittite, “Why do you also go with us? Return, and stay with the king; for you are a foreigner and also an exile. Return to your own place. +\v 20 Whereas you came but yesterday, should I today make you go up and down with us, since I go where I may? Return, and take back your brothers. Mercy and truth be with you.” +\p +\v 21 Ittai answered the king and said, “As Yahweh lives, and as my lord the king lives, surely in what place my lord the king is, whether for death or for life, your servant will be there also.” +\p +\v 22 David said to Ittai, “Go and pass over.” Ittai the Gittite passed over, and all his men, and all the little ones who were with him. +\v 23 All the country wept with a loud voice, and all the people passed over. The king also himself passed over the brook Kidron, and all the people passed over toward the way of the wilderness. +\v 24 Behold, Zadok also came, and all the Levites with him, bearing the ark of the covenant of God; and they set down God’s ark; and Abiathar went up until all the people finished passing out of the city. +\v 25 The king said to Zadok, “Carry God’s ark back into the city. If I find favor in Yahweh’s eyes, he will bring me again, and show me both it and his habitation; +\v 26 but if he says, ‘I have no delight in you,’ behold, here I am. Let him do to me as seems good to him.” +\v 27 The king said also to Zadok the priest, “Aren’t you a seer? Return into the city in peace, and your two sons with you, Ahimaaz your son and Jonathan the son of Abiathar. +\v 28 Behold, I will stay at the fords of the wilderness until word comes from you to inform me.” +\v 29 Zadok therefore and Abiathar carried God’s ark to Jerusalem again; and they stayed there. +\v 30 David went up by the ascent of the Mount of Olives, and wept as he went up; and he had his head covered and went barefoot. All the people who were with him each covered his head, and they went up, weeping as they went up. +\p +\v 31 Someone told David, saying, “Ahithophel is among the conspirators with Absalom.” +\p David said, “Yahweh, please turn the counsel of Ahithophel into foolishness.” +\p +\v 32 When David had come to the top, where God was worshiped, behold, Hushai the Archite came to meet him with his tunic torn and earth on his head. +\v 33 David said to him, “If you pass on with me, then you will be a burden to me; +\v 34 but if you return to the city, and tell Absalom, ‘I will be your servant, O king. As I have been your father’s servant in time past, so I will now be your servant; then will you defeat for me the counsel of Ahithophel.’ +\v 35 Don’t you have Zadok and Abiathar the priests there with you? Therefore whatever you hear out of the king’s house, tell it to Zadok and Abiathar the priests. +\v 36 Behold, they have there with them their two sons, Ahimaaz, Zadok’s son, and Jonathan, Abiathar’s son. Send to me everything that you shall hear by them.” +\p +\v 37 So Hushai, David’s friend, came into the city; and Absalom came into Jerusalem. +\c 16 +\p +\v 1 When David was a little past the top, behold, Ziba the servant of Mephibosheth met him with a couple of donkeys saddled, and on them two hundred loaves of bread, and one hundred clusters of raisins, and one hundred summer fruits, and a container of wine. +\v 2 The king said to Ziba, “What do you mean by these?” +\p Ziba said, “The donkeys are for the king’s household to ride on; and the bread and summer fruit for the young men to eat; and the wine, that those who are faint in the wilderness may drink.” +\p +\v 3 The king said, “Where is your master’s son?” +\p Ziba said to the king, “Behold, he is staying in Jerusalem; for he said, ‘Today the house of Israel will restore me the kingdom of my father.’” +\p +\v 4 Then the king said to Ziba, “Behold, all that belongs to Mephibosheth is yours.” +\p Ziba said, “I bow down. Let me find favor in your sight, my lord, O king.” +\p +\v 5 When King David came to Bahurim, behold, a man of the family of Saul’s house came out, whose name was Shimei, the son of Gera. He came out and cursed as he came. +\v 6 He cast stones at David and at all the servants of King David, and all the people and all the mighty men were on his right hand and on his left. +\v 7 Shimei said when he cursed, “Be gone, be gone, you man of blood, and wicked fellow! +\v 8 Yahweh has returned on you all the blood of Saul’s house, in whose place you have reigned! Yahweh has delivered the kingdom into the hand of Absalom your son! Behold, you are caught by your own mischief, because you are a man of blood!” +\p +\v 9 Then Abishai the son of Zeruiah said to the king, “Why should this dead dog curse my lord the king? Please let me go over and take off his head.” +\v 10 The king said, “What have I to do with you, you sons of Zeruiah? Because he curses, and because Yahweh has said to him, ‘Curse David,’ who then shall say, ‘Why have you done so?’” +\p +\v 11 David said to Abishai and to all his servants, “Behold, my son, who came out of my bowels, seeks my life. How much more this Benjamite, now? Leave him alone, and let him curse; for Yahweh has invited him. +\v 12 It may be that Yahweh will look on the wrong done to me, and that Yahweh will repay me good for the cursing of me today.” +\v 13 So David and his men went by the way; and Shimei went along on the hillside opposite him and cursed as he went, threw stones at him, and threw dust. +\v 14 The king and all the people who were with him arrived weary; and he refreshed himself there. +\p +\v 15 Absalom and all the people, the men of Israel, came to Jerusalem, and Ahithophel with him. +\v 16 When Hushai the Archite, David’s friend, had come to Absalom, Hushai said to Absalom, “Long live the king! Long live the king!” +\p +\v 17 Absalom said to Hushai, “Is this your kindness to your friend? Why didn’t you go with your friend?” +\p +\v 18 Hushai said to Absalom, “No; but whomever Yahweh and this people and all the men of Israel have chosen, I will be his, and I will stay with him. +\v 19 Again, whom should I serve? Shouldn’t I serve in the presence of his son? As I have served in your father’s presence, so I will be in your presence.” +\p +\v 20 Then Absalom said to Ahithophel, “Give your counsel what we shall do.” +\p +\v 21 Ahithophel said to Absalom, “Go in to your father’s concubines that he has left to keep the house. Then all Israel will hear that you are abhorred by your father. Then the hands of all who are with you will be strong.” +\p +\v 22 So they spread a tent for Absalom on the top of the house, and Absalom went in to his father’s concubines in the sight of all Israel. +\p +\v 23 The counsel of Ahithophel, which he gave in those days, was as if a man inquired at the inner sanctuary of God. All the counsel of Ahithophel was like this both with David and with Absalom. +\c 17 +\p +\v 1 Moreover Ahithophel said to Absalom, “Let me now choose twelve thousand men, and I will arise and pursue after David tonight. +\v 2 I will come on him while he is weary and exhausted, and will make him afraid. All the people who are with him will flee. I will strike the king only, +\v 3 and I will bring back all the people to you. The man whom you seek is as if all returned. All the people shall be in peace.” +\p +\v 4 The saying pleased Absalom well, and all the elders of Israel. +\v 5 Then Absalom said, “Now call Hushai the Archite also, and let’s hear likewise what he says.” +\p +\v 6 When Hushai had come to Absalom, Absalom spoke to him, saying, “Ahithophel has spoken like this. Shall we do what he says? If not, speak up.” +\p +\v 7 Hushai said to Absalom, “The counsel that Ahithophel has given this time is not good.” +\v 8 Hushai said moreover, “You know your father and his men, that they are mighty men, and they are fierce in their minds, like a bear robbed of her cubs in the field. Your father is a man of war, and will not lodge with the people. +\v 9 Behold, he is now hidden in some pit, or in some other place. It will happen, when some of them have fallen at the first, that whoever hears it will say, ‘There is a slaughter among the people who follow Absalom!’ +\v 10 Even he who is valiant, whose heart is as the heart of a lion, will utterly melt; for all Israel knows that your father is a mighty man, and those who are with him are valiant men. +\v 11 But I counsel that all Israel be gathered together to you, from Dan even to Beersheba, as the sand that is by the sea for multitude; and that you go to battle in your own person. +\v 12 So we will come on him in some place where he will be found, and we will light on him as the dew falls on the ground, then we will not leave so much as one of him and of all the men who are with him. +\v 13 Moreover, if he has gone into a city, then all Israel will bring ropes to that city, and we will draw it into the river, until there isn’t one small stone found there.” +\p +\v 14 Absalom and all the men of Israel said, “The counsel of Hushai the Archite is better than the counsel of Ahithophel.” For Yahweh had ordained to defeat the good counsel of Ahithophel, to the intent that Yahweh might bring evil on Absalom. +\p +\v 15 Then Hushai said to Zadok and to Abiathar the priests, “Ahithophel counseled Absalom and the elders of Israel that way; and I have counseled this way. +\v 16 Now therefore send quickly, and tell David, saying, ‘Don’t lodge tonight at the fords of the wilderness, but by all means pass over, lest the king be swallowed up, and all the people who are with him.’” +\p +\v 17 Now Jonathan and Ahimaaz were staying by En Rogel; and a female servant used to go and report to them, and they went and told King David; for they couldn’t risk being seen coming into the city. +\v 18 But a boy saw them, and told Absalom. Then they both went away quickly and came to the house of a man in Bahurim, who had a well in his court; and they went down there. +\v 19 The woman took and spread the covering over the well’s mouth, and spread out crushed grain on it; and nothing was known. +\v 20 Absalom’s servants came to the woman to the house; and they said, “Where are Ahimaaz and Jonathan?” +\p The woman said to them, “They have gone over the brook of water.” +\p When they had sought and could not find them, they returned to Jerusalem. +\v 21 After they had departed, they came up out of the well and went and told King David; and they said to David, “Arise and pass quickly over the water; for thus has Ahithophel counseled against you.” +\p +\v 22 Then David arose, and all the people who were with him, and they passed over the Jordan. By the morning light there lacked not one of them who had not gone over the Jordan. +\p +\v 23 When Ahithophel saw that his counsel was not followed, he saddled his donkey, arose, and went home to his city, set his house in order, and hanged himself; and he died, and was buried in the tomb of his father. +\p +\v 24 Then David came to Mahanaim. Absalom passed over the Jordan, he and all the men of Israel with him. +\v 25 Absalom set Amasa over the army instead of Joab. Now Amasa was the son of a man whose name was Ithra the Israelite, who went in to Abigail the daughter of Nahash, sister to Zeruiah, Joab’s mother. +\v 26 Israel and Absalom encamped in the land of Gilead. +\p +\v 27 When David had come to Mahanaim, Shobi the son of Nahash of Rabbah of the children of Ammon, and Machir the son of Ammiel of Lodebar, and Barzillai the Gileadite of Rogelim, +\v 28 brought beds, basins, earthen vessels, wheat, barley, meal, parched grain, beans, lentils, roasted grain, +\v 29 honey, butter, sheep, and cheese of the herd, for David and for the people who were with him to eat; for they said, “The people are hungry, weary, and thirsty in the wilderness.” +\c 18 +\p +\v 1 David counted the people who were with him, and set captains of thousands and captains of hundreds over them. +\v 2 David sent the people out, a third part under the hand of Joab, and a third part under the hand of Abishai the son of Zeruiah, Joab’s brother, and a third part under the hand of Ittai the Gittite. The king said to the people, “I will also surely go out with you myself.” +\p +\v 3 But the people said, “You shall not go out, for if we flee away, they will not care for us, neither if half of us die, will they care for us. But you are worth ten thousand of us. Therefore now it is better that you are ready to help us out of the city.” +\p +\v 4 The king said to them, “I will do what seems best to you.” +\p The king stood beside the gate, and all the people went out by hundreds and by thousands. +\v 5 The king commanded Joab and Abishai and Ittai, saying, “Deal gently for my sake with the young man Absalom.” All the people heard when the king commanded all the captains concerning Absalom. +\p +\v 6 So the people went out into the field against Israel; and the battle was in the forest of Ephraim. +\v 7 The people of Israel were struck there before David’s servants, and there was a great slaughter there that day of twenty thousand men. +\v 8 For the battle was there spread over the surface of all the country, and the forest devoured more people that day than the sword devoured. +\p +\v 9 Absalom happened to meet David’s servants. Absalom was riding on his mule, and the mule went under the thick boughs of a great oak; and his head caught hold of the oak, and he was hanging between the sky and earth; and the mule that was under him went on. +\v 10 A certain man saw it, and told Joab, and said, “Behold, I saw Absalom hanging in an oak.” +\p +\v 11 Joab said to the man who told him, “Behold, you saw it, and why didn’t you strike him there to the ground? I would have given you ten pieces of silver and a sash.” +\p +\v 12 The man said to Joab, “Though I should receive a thousand pieces of silver in my hand, I still wouldn’t stretch out my hand against the king’s son; for in our hearing the king commanded you and Abishai and Ittai, saying, ‘Beware that no one touch the young man Absalom.’ +\v 13 Otherwise, if I had dealt falsely against his life (and there is no matter hidden from the king), then you yourself would have set yourself against me.” +\p +\v 14 Then Joab said, “I’m not going to wait like this with you.” He took three darts in his hand and thrust them through Absalom’s heart while he was still alive in the middle of the oak. +\v 15 Ten young men who bore Joab’s armor surrounded and struck Absalom, and killed him. +\v 16 Joab blew the trumpet, and the people returned from pursuing after Israel; for Joab held the people back. +\v 17 They took Absalom and cast him into a great pit in the forest, and raised over him a very great heap of stones. Then all Israel fled, each to his own tent. +\p +\v 18 Now Absalom in his lifetime had taken and reared up for himself the pillar which is in the king’s valley, for he said, “I have no son to keep my name in memory.” He called the pillar after his own name. It is called Absalom’s monument, to this day. +\p +\v 19 Then Ahimaaz the son of Zadok said, “Let me now run and carry the king news, how Yahweh has avenged him of his enemies.” +\p +\v 20 Joab said to him, “You must not be the bearer of news today, but you must carry news another day. But today you must carry no news, because the king’s son is dead.” +\p +\v 21 Then Joab said to the Cushite, “Go, tell the king what you have seen!” The Cushite bowed himself to Joab, and ran. +\p +\v 22 Then Ahimaaz the son of Zadok said yet again to Joab, “But come what may, please let me also run after the Cushite.” +\p Joab said, “Why do you want to run, my son, since you will have no reward for the news?” +\p +\v 23 “But come what may,” he said, “I will run.” +\p He said to him, “Run!” Then Ahimaaz ran by the way of the Plain, and outran the Cushite. +\p +\v 24 Now David was sitting between the two gates; and the watchman went up to the roof of the gate to the wall, and lifted up his eyes and looked, and, behold, a man running alone. +\v 25 The watchman shouted and told the king. The king said, “If he is alone, there is news in his mouth.” He came closer and closer. +\p +\v 26 The watchman saw another man running; and the watchman called to the gatekeeper and said, “Behold, a man running alone!” +\p The king said, “He also brings news.” +\p +\v 27 The watchman said, “I think the running of the first one is like the running of Ahimaaz the son of Zadok.” +\p The king said, “He is a good man, and comes with good news.” +\p +\v 28 Ahimaaz called, and said to the king, “All is well.” He bowed himself before the king with his face to the earth, and said, “Blessed is Yahweh your God, who has delivered up the men who lifted up their hand against my lord the king!” +\p +\v 29 The king said, “Is it well with the young man Absalom?” +\p Ahimaaz answered, “When Joab sent the king’s servant, even me your servant, I saw a great tumult, but I don’t know what it was.” +\p +\v 30 The king said, “Come and stand here.” He came and stood still. +\p +\v 31 Behold, the Cushite came. The Cushite said, “Good news for my lord the king, for Yahweh has avenged you today of all those who rose up against you.” +\p +\v 32 The king said to the Cushite, “Is it well with the young man Absalom?” +\p The Cushite answered, “May the enemies of my lord the king, and all who rise up against you to do you harm, be as that young man is.” +\p +\v 33 The king was much moved, and went up to the room over the gate and wept. As he went, he said, “My son Absalom! My son, my son Absalom! I wish I had died instead of you, Absalom, my son, my son!” +\c 19 +\p +\v 1 Joab was told, “Behold, the king weeps and mourns for Absalom.” +\v 2 The victory that day was turned into mourning among all the people, for the people heard it said that day, “The king grieves for his son.” +\p +\v 3 The people sneaked into the city that day, as people who are ashamed steal away when they flee in battle. +\v 4 The king covered his face, and the king cried with a loud voice, “My son Absalom, Absalom, my son, my son!” +\p +\v 5 Joab came into the house to the king, and said, “Today you have shamed the faces of all your servants who today have saved your life, and the lives of your sons and of your daughters, and the lives of your wives, and the lives of your concubines; +\v 6 in that you love those who hate you and hate those who love you. For you have declared today that princes and servants are nothing to you. For today I perceive that if Absalom had lived and we had all died today, then it would have pleased you well. +\v 7 Now therefore arise, go out and speak to comfort your servants; for I swear by Yahweh, if you don’t go out, not a man will stay with you this night. That would be worse to you than all the evil that has happened to you from your youth until now.” +\p +\v 8 Then the king arose and sat in the gate. The people were all told, “Behold, the king is sitting in the gate.” All the people came before the king. Now Israel had fled every man to his tent. +\v 9 All the people were at strife throughout all the tribes of Israel, saying, “The king delivered us out of the hand of our enemies, and he saved us out of the hand of the Philistines; and now he has fled out of the land from Absalom. +\v 10 Absalom, whom we anointed over us, is dead in battle. Now therefore why don’t you speak a word of bringing the king back?” +\p +\v 11 King David sent to Zadok and to Abiathar the priests, saying, “Speak to the elders of Judah, saying, ‘Why are you the last to bring the king back to his house, since the speech of all Israel has come to the king, to return him to his house? +\v 12 You are my brothers. You are my bone and my flesh. Why then are you the last to bring back the king?’ +\v 13 Say to Amasa, ‘Aren’t you my bone and my flesh? God do so to me, and more also, if you aren’t captain of the army before me continually instead of Joab.’” +\v 14 He bowed the heart of all the men of Judah, even as one man, so that they sent to the king, saying, “Return, you and all your servants.” +\p +\v 15 So the king returned, and came to the Jordan. Judah came to Gilgal, to go to meet the king, to bring the king over the Jordan. +\v 16 Shimei the son of Gera, the Benjamite, who was of Bahurim, hurried and came down with the men of Judah to meet King David. +\v 17 There were a thousand men of Benjamin with him, and Ziba the servant of Saul’s house, and his fifteen sons and his twenty servants with him; and they went through the Jordan in the presence of the king. +\v 18 A ferry boat went to bring over the king’s household, and to do what he thought good. +\p Shimei the son of Gera fell down before the king when he had come over the Jordan. +\v 19 He said to the king, “Don’t let my lord impute iniquity to me, or remember that which your servant did perversely the day that my lord the king went out of Jerusalem, that the king should take it to his heart. +\v 20 For your servant knows that I have sinned. Therefore behold, I have come today as the first of all the house of Joseph to go down to meet my lord the king.” +\p +\v 21 But Abishai the son of Zeruiah answered, “Shouldn’t Shimei be put to death for this, because he cursed Yahweh’s anointed?” +\p +\v 22 David said, “What have I to do with you, you sons of Zeruiah, that you should be adversaries to me today? Shall any man be put to death today in Israel? For don’t I know that I am king over Israel today?” +\v 23 The king said to Shimei, “You will not die.” The king swore to him. +\p +\v 24 Mephibosheth the son of Saul came down to meet the king; and he had neither groomed his feet, nor trimmed his beard, nor washed his clothes, from the day the king departed until the day he came home in peace. +\v 25 When he had come to Jerusalem to meet the king, the king said to him, “Why didn’t you go with me, Mephibosheth?” +\p +\v 26 He answered, “My lord, O king, my servant deceived me. For your servant said, ‘I will saddle a donkey for myself, that I may ride on it and go with the king,’ because your servant is lame. +\v 27 He has slandered your servant to my lord the king, but my lord the king is as an angel of God. Therefore do what is good in your eyes. +\v 28 For all my father’s house were but dead men before my lord the king; yet you set your servant among those who ate at your own table. What right therefore have I yet that I should appeal any more to the king?” +\p +\v 29 The king said to him, “Why do you speak any more of your matters? I say, you and Ziba divide the land.” +\p +\v 30 Mephibosheth said to the king, “Yes, let him take all, because my lord the king has come in peace to his own house.” +\p +\v 31 Barzillai the Gileadite came down from Rogelim; and he went over the Jordan with the king to conduct him over the Jordan. +\v 32 Now Barzillai was a very aged man, even eighty years old. He had provided the king with sustenance while he stayed at Mahanaim, for he was a very great man. +\v 33 The king said to Barzillai, “Come over with me, and I will sustain you with me in Jerusalem.” +\p +\v 34 Barzillai said to the king, “How many are the days of the years of my life, that I should go up with the king to Jerusalem? +\v 35 I am eighty years old, today. Can I discern between good and bad? Can your servant taste what I eat or what I drink? Can I hear the voice of singing men and singing women any more? Why then should your servant be a burden to my lord the king? +\v 36 Your servant will just go over the Jordan with the king. Why should the king repay me with such a reward? +\v 37 Please let your servant turn back again, that I may die in my own city, by the grave of my father and my mother. But behold, your servant Chimham; let him go over with my lord the king; and do to him what shall seem good to you.” +\p +\v 38 The king answered, “Chimham shall go over with me, and I will do to him that which shall seem good to you. Whatever you request of me, that I will do for you.” +\p +\v 39 All the people went over the Jordan, and the king went over. Then the king kissed Barzillai and blessed him; and he returned to his own place. +\v 40 So the king went over to Gilgal, and Chimham went over with him. All the people of Judah brought the king over, and also half the people of Israel. +\v 41 Behold, all the men of Israel came to the king, and said to the king, “Why have our brothers the men of Judah stolen you away, and brought the king and his household, over the Jordan, and all David’s men with him?” +\p +\v 42 All the men of Judah answered the men of Israel, “Because the king is a close relative to us. Why then are you angry about this matter? Have we eaten at all at the king’s cost? Or has he given us any gift?” +\p +\v 43 The men of Israel answered the men of Judah, and said, “We have ten parts in the king, and we have also more claim to David than you. Why then did you despise us, that our advice should not be first had in bringing back our king?” The words of the men of Judah were fiercer than the words of the men of Israel. +\c 20 +\p +\v 1 There happened to be there a wicked fellow, whose name was Sheba the son of Bichri, a Benjamite; and he blew the trumpet, and said, “We have no portion in David, neither have we inheritance in the son of Jesse. Every man to his tents, Israel!” +\p +\v 2 So all the men of Israel went up from following David, and followed Sheba the son of Bichri; but the men of Judah joined with their king, from the Jordan even to Jerusalem. +\p +\v 3 David came to his house at Jerusalem; and the king took the ten women his concubines, whom he had left to keep the house, and put them in custody and provided them with sustenance, but didn’t go in to them. So they were shut up to the day of their death, living in widowhood. +\p +\v 4 Then the king said to Amasa, “Call me the men of Judah together within three days, and be here present.” +\p +\v 5 So Amasa went to call the men of Judah together, but he stayed longer than the set time which had been appointed to him. +\v 6 David said to Abishai, “Now Sheba the son of Bichri will do us more harm than Absalom did. Take your lord’s servants and pursue after him, lest he get himself fortified cities, and escape out of our sight.” +\p +\v 7 Joab’s men went out after him with the Cherethites, the Pelethites, and all the mighty men; and they went out of Jerusalem to pursue Sheba the son of Bichri. +\v 8 When they were at the great stone which is in Gibeon, Amasa came to meet them. Joab was clothed in his apparel of war that he had put on, and on it was a sash with a sword fastened on his waist in its sheath; and as he went along it fell out. +\v 9 Joab said to Amasa, “Is it well with you, my brother?” Joab took Amasa by the beard with his right hand to kiss him. +\v 10 But Amasa took no heed to the sword that was in Joab’s hand. So he struck him with it in the body and shed out his bowels to the ground, and didn’t strike him again; and he died. Joab and Abishai his brother pursued Sheba the son of Bichri. +\v 11 One of Joab’s young men stood by him, and said, “He who favors Joab, and he who is for David, let him follow Joab!” +\p +\v 12 Amasa lay wallowing in his blood in the middle of the highway. When the man saw that all the people stood still, he carried Amasa out of the highway into the field, and cast a garment over him when he saw that everyone who came by him stood still. +\v 13 When he was removed out of the highway, all the people went on after Joab to pursue Sheba the son of Bichri. +\v 14 He went through all the tribes of Israel to Abel, to Beth Maacah, and all the Berites. They were gathered together, and went also after him. +\v 15 They came and besieged him in Abel of Beth Maacah, and they cast up a mound against the city, and it stood against the rampart; and all the people who were with Joab battered the wall to throw it down. +\p +\v 16 Then a wise woman cried out of the city, “Hear, hear! Please say to Joab, ‘Come near here, that I may speak with you.’” +\v 17 He came near to her; and the woman said, “Are you Joab?” +\p He answered, “I am.” +\p Then she said to him, “Hear the words of your servant.” +\p He answered, “I’m listening.” +\p +\v 18 Then she spoke, saying, “They used to say in old times, ‘They shall surely ask counsel at Abel,’ and so they settled a matter. +\v 19 I am among those who are peaceable and faithful in Israel. You seek to destroy a city and a mother in Israel. Why will you swallow up Yahweh’s inheritance?” +\p +\v 20 Joab answered, “Far be it, far be it from me, that I should swallow up or destroy. +\v 21 The matter is not so. But a man of the hill country of Ephraim, Sheba the son of Bichri by name, has lifted up his hand against the king, even against David. Just deliver him, and I will depart from the city.” +\p The woman said to Joab, “Behold, his head will be thrown to you over the wall.” +\p +\v 22 Then the woman went to all the people in her wisdom. They cut off the head of Sheba the son of Bichri, and threw it out to Joab. He blew the trumpet, and they were dispersed from the city, every man to his tent. Then Joab returned to Jerusalem to the king. +\p +\v 23 Now Joab was over all the army of Israel, Benaiah the son of Jehoiada was over the Cherethites and over the Pelethites, +\v 24 Adoram was over the men subject to forced labor, Jehoshaphat the son of Ahilud was the recorder, +\v 25 Sheva was scribe, Zadok and Abiathar were priests, +\v 26 and Ira the Jairite was chief minister to David. +\c 21 +\p +\v 1 There was a famine in the days of David for three years, year after year; and David sought the face of Yahweh. Yahweh said, “It is for Saul, and for his bloody house, because he put the Gibeonites to death.” +\p +\v 2 The king called the Gibeonites and said to them (now the Gibeonites were not of the children of Israel, but of the remnant of the Amorites, and the children of Israel had sworn to them; and Saul sought to kill them in his zeal for the children of Israel and Judah); +\v 3 and David said to the Gibeonites, “What should I do for you? And with what should I make atonement, that you may bless Yahweh’s inheritance?” +\p +\v 4 The Gibeonites said to him, “It is no matter of silver or gold between us and Saul or his house; neither is it for us to put any man to death in Israel.” +\p He said, “I will do for you whatever you say.” +\p +\v 5 They said to the king, “The man who consumed us and who plotted against us, that we should be destroyed from remaining in any of the borders of Israel, +\v 6 let seven men of his sons be delivered to us, and we will hang them up to Yahweh in Gibeah of Saul, the chosen of Yahweh.” +\p The king said, “I will give them.” +\p +\v 7 But the king spared Mephibosheth the son of Jonathan the son of Saul, because of Yahweh’s oath that was between them, between David and Jonathan the son of Saul. +\v 8 But the king took the two sons of Rizpah the daughter of Aiah, whom she bore to Saul, Armoni and Mephibosheth; and the five sons of Merab the daughter of Saul, whom she bore to Adriel the son of Barzillai the Meholathite. +\v 9 He delivered them into the hands of the Gibeonites; and they hanged them on the mountain before Yahweh, and all seven of them fell together. They were put to death in the days of harvest, in the first days, at the beginning of barley harvest. +\p +\v 10 Rizpah the daughter of Aiah took sackcloth and spread it for herself on the rock, from the beginning of harvest until water poured on them from the sky. She allowed neither the birds of the sky to rest on them by day, nor the animals of the field by night. +\v 11 David was told what Rizpah the daughter of Aiah, the concubine of Saul, had done. +\v 12 So David went and took the bones of Saul and the bones of Jonathan his son from the men of Jabesh Gilead, who had stolen them from the street of Beth Shan, where the Philistines had hanged them in the day that the Philistines killed Saul in Gilboa; +\v 13 and he brought up from there the bones of Saul and the bones of Jonathan his son. They also gathered the bones of those who were hanged. +\v 14 They buried the bones of Saul and Jonathan his son in the country of Benjamin in Zela, in the tomb of Kish his father; and they performed all that the king commanded. After that, God answered prayer for the land. +\p +\v 15 The Philistines had war again with Israel; and David went down, and his servants with him, and fought against the Philistines. David grew faint; +\v 16 and Ishbibenob, who was of the sons of the giant, the weight of whose spear was three hundred shekels of bronze in weight, he being armed with a new sword, thought he would kill David. +\v 17 But Abishai the son of Zeruiah helped him, and struck the Philistine and killed him. Then the men of David swore to him, saying, “Don’t go out with us to battle any more, so that you don’t quench the lamp of Israel.” +\p +\v 18 After this, there was again war with the Philistines at Gob. Then Sibbecai the Hushathite killed Saph, who was of the sons of the giant. +\v 19 There was again war with the Philistines at Gob, and Elhanan the son of Jaare-Oregim the Bethlehemite killed Goliath the Gittite’s brother, the staff of whose spear was like a weaver’s beam. +\v 20 There was again war at Gath, where there was a man of great stature, who had six fingers on every hand and six toes on every foot, twenty-four in number, and he also was born to the giant. +\v 21 When he defied Israel, Jonathan the son of Shimei, David’s brother, killed him. +\v 22 These four were born to the giant in Gath; and they fell by the hand of David and by the hand of his servants. +\c 22 +\p +\v 1 David spoke to Yahweh the words of this song in the day that Yahweh delivered him out of the hand of all his enemies, and out of the hand of Saul, +\v 2 and he said: +\q1 “Yahweh is my rock, +\q2 my fortress, +\q2 and my deliverer, even mine; +\q1 +\v 3 God is my rock in whom I take refuge; +\q2 my shield, and the horn of my salvation, +\q2 my high tower, and my refuge. +\q2 My savior, you save me from violence. +\q1 +\v 4 I call on Yahweh, who is worthy to be praised; +\q2 So shall I be saved from my enemies. +\b +\q1 +\v 5 For the waves of death surrounded me. +\q2 The floods of ungodliness made me afraid. +\q1 +\v 6 The cords of Sheol\f + \fr 22:6 \ft Sheol is the place of the dead.\f* were around me. +\q2 The snares of death caught me. +\q1 +\v 7 In my distress, I called on Yahweh. +\q2 Yes, I called to my God. +\q1 He heard my voice out of his temple. +\q2 My cry came into his ears. +\q1 +\v 8 Then the earth shook and trembled. +\q2 The foundations of heaven quaked and were shaken, +\q2 because he was angry. +\q1 +\v 9 Smoke went up out of his nostrils. +\q2 Consuming fire came out of his mouth. +\q2 Coals were kindled by it. +\q1 +\v 10 He bowed the heavens also, and came down. +\q2 Thick darkness was under his feet. +\q1 +\v 11 He rode on a cherub, and flew. +\q2 Yes, he was seen on the wings of the wind. +\q1 +\v 12 He made darkness a shelter around himself, +\q2 gathering of waters, and thick clouds of the skies. +\q1 +\v 13 At the brightness before him, +\q2 coals of fire were kindled. +\q1 +\v 14 Yahweh thundered from heaven. +\q2 The Most High uttered his voice. +\q1 +\v 15 He sent out arrows and scattered them, +\q2 lightning and confused them. +\q1 +\v 16 Then the channels of the sea appeared. +\q2 The foundations of the world were laid bare by Yahweh’s rebuke, +\q2 at the blast of the breath of his nostrils. +\b +\q1 +\v 17 He sent from on high and he took me. +\q2 He drew me out of many waters. +\q1 +\v 18 He delivered me from my strong enemy, +\q2 from those who hated me, for they were too mighty for me. +\q1 +\v 19 They came on me in the day of my calamity, +\q2 but Yahweh was my support. +\q1 +\v 20 He also brought me out into a large place. +\q2 He delivered me, because he delighted in me. +\b +\q1 +\v 21 Yahweh rewarded me according to my righteousness. +\q2 He rewarded me according to the cleanness of my hands. +\q1 +\v 22 For I have kept Yahweh’s ways, +\q2 and have not wickedly departed from my God. +\q1 +\v 23 For all his ordinances were before me. +\q2 As for his statutes, I didn’t depart from them. +\q1 +\v 24 I was also perfect toward him. +\q2 I kept myself from my iniquity. +\q1 +\v 25 Therefore Yahweh has rewarded me according to my righteousness, +\q2 According to my cleanness in his eyesight. +\b +\q1 +\v 26 With the merciful you will show yourself merciful. +\q2 With the perfect man you will show yourself perfect. +\q2 +\v 27 With the pure you will show yourself pure. +\q2 With the crooked you will show yourself shrewd. +\q1 +\v 28 You will save the afflicted people, +\q2 but your eyes are on the arrogant, that you may bring them down. +\q1 +\v 29 For you are my lamp, Yahweh. +\q2 Yahweh will light up my darkness. +\q1 +\v 30 For by you, I run against a troop. +\q2 By my God, I leap over a wall. +\q1 +\v 31 As for God, his way is perfect. +\q2 Yahweh’s word is tested. +\q2 He is a shield to all those who take refuge in him. +\b +\q1 +\v 32 For who is God, besides Yahweh? +\q2 Who is a rock, besides our God? +\q1 +\v 33 God is my strong fortress. +\q2 He makes my way perfect. +\q1 +\v 34 He makes his feet like hinds’ feet, +\q2 and sets me on my high places. +\q1 +\v 35 He teaches my hands to war, +\q2 so that my arms bend a bow of bronze. +\q1 +\v 36 You have also given me the shield of your salvation. +\q2 Your gentleness has made me great. +\q1 +\v 37 You have enlarged my steps under me. +\q2 My feet have not slipped. +\q1 +\v 38 I have pursued my enemies and destroyed them. +\q2 I didn’t turn again until they were consumed. +\q1 +\v 39 I have consumed them, +\q2 and struck them through, +\q2 so that they can’t arise. +\q2 Yes, they have fallen under my feet. +\q1 +\v 40 For you have armed me with strength for the battle. +\q2 You have subdued under me those who rose up against me. +\q1 +\v 41 You have also made my enemies turn their backs to me, +\q2 that I might cut off those who hate me. +\q1 +\v 42 They looked, but there was no one to save; +\q2 even to Yahweh, but he didn’t answer them. +\q1 +\v 43 Then I beat them as small as the dust of the earth. +\q2 I crushed them as the mire of the streets, and spread them abroad. +\b +\q1 +\v 44 You also have delivered me from the strivings of my people. +\q2 You have kept me to be the head of the nations. +\q2 A people whom I have not known will serve me. +\q1 +\v 45 The foreigners will submit themselves to me. +\q2 As soon as they hear of me, they will obey me. +\q1 +\v 46 The foreigners will fade away, +\q2 and will come trembling out of their close places. +\b +\q1 +\v 47 Yahweh lives! +\q2 Blessed be my rock! +\q1 Exalted be God, the rock of my salvation, +\q2 +\v 48 even the God who executes vengeance for me, +\q2 who brings down peoples under me, +\q2 +\v 49 who brings me away from my enemies. +\q1 Yes, you lift me up above those who rise up against me. +\q2 You deliver me from the violent man. +\q1 +\v 50 Therefore I will give thanks to you, Yahweh, among the nations, +\q2 and will sing praises to your name. +\q1 +\v 51 He gives great deliverance to his king, +\q2 and shows loving kindness to his anointed, +\q2 to David and to his offspring, forever more.” +\c 23 +\p +\v 1 Now these are the last words of David. +\q1 David the son of Jesse says, +\q2 the man who was raised on high says, +\q2 the anointed of the God of Jacob, +\q2 the sweet psalmist of Israel: +\q1 +\v 2 “Yahweh’s Spirit spoke by me. +\q2 His word was on my tongue. +\q1 +\v 3 The God of Israel said, +\q2 the Rock of Israel spoke to me, +\q2 ‘One who rules over men righteously, +\q2 who rules in the fear of God, +\q1 +\v 4 shall be as the light of the morning when the sun rises, +\q2 a morning without clouds, +\q2 when the tender grass springs out of the earth, +\q2 through clear shining after rain.’ +\b +\q1 +\v 5 Isn’t my house so with God? +\q2 Yet he has made with me an everlasting covenant, +\q2 ordered in all things, and sure, +\q2 for it is all my salvation and all my desire. +\q2 Won’t he make it grow? +\q1 +\v 6 But all the ungodly will be as thorns to be thrust away, +\q2 because they can’t be taken with the hand. +\q1 +\v 7 The man who touches them must be armed with iron and the staff of a spear. +\q1 They will be utterly burned with fire in their place.” +\p +\v 8 These are the names of the mighty men whom David had: Josheb Basshebeth a Tahchemonite, chief of the captains; he was called Adino the Eznite, who killed eight hundred at one time. +\v 9 After him was Eleazar the son of Dodai the son of an Ahohite, one of the three mighty men with David when they defied the Philistines who were there gathered together to battle, and the men of Israel had gone away. +\v 10 He arose and struck the Philistines until his hand was weary, and his hand froze to the sword; and Yahweh worked a great victory that day; and the people returned after him only to take plunder. +\v 11 After him was Shammah the son of Agee a Hararite. The Philistines had gathered together into a troop where there was a plot of ground full of lentils; and the people fled from the Philistines. +\v 12 But he stood in the middle of the plot and defended it, and killed the Philistines; and Yahweh worked a great victory. +\p +\v 13 Three of the thirty chief men went down, and came to David in the harvest time to the cave of Adullam; and the troop of the Philistines was encamped in the valley of Rephaim. +\v 14 David was then in the stronghold; and the garrison of the Philistines was then in Bethlehem. +\v 15 David said longingly, “Oh that someone would give me water to drink from the well of Bethlehem, which is by the gate!” +\p +\v 16 The three mighty men broke through the army of the Philistines, and drew water out of the well of Bethlehem that was by the gate and took it and brought it to David; but he would not drink of it, but poured it out to Yahweh. +\v 17 He said, “Be it far from me, Yahweh, that I should do this! Isn’t this the blood of the men who risked their lives to go?” Therefore he would not drink it. The three mighty men did these things. +\p +\v 18 Abishai, the brother of Joab, the son of Zeruiah, was chief of the three. He lifted up his spear against three hundred and killed them, and had a name among the three. +\v 19 Wasn’t he most honorable of the three? Therefore he was made their captain. However he wasn’t included as one of the three. +\p +\v 20 Benaiah the son of Jehoiada, the son of a valiant man of Kabzeel, who had done mighty deeds, killed the two sons of Ariel of Moab. He also went down and killed a lion in the middle of a pit in a time of snow. +\v 21 He killed a huge Egyptian, and the Egyptian had a spear in his hand; but he went down to him with a staff and plucked the spear out of the Egyptian’s hand, and killed him with his own spear. +\v 22 Benaiah the son of Jehoiada did these things, and had a name among the three mighty men. +\v 23 He was more honorable than the thirty, but he didn’t attain to the three. David set him over his guard. +\p +\v 24 Asahel the brother of Joab was one of the thirty: Elhanan the son of Dodo of Bethlehem, +\v 25 Shammah the Harodite, Elika the Harodite, +\v 26 Helez the Paltite, Ira the son of Ikkesh the Tekoite, +\v 27 Abiezer the Anathothite, Mebunnai the Hushathite, +\v 28 Zalmon the Ahohite, Maharai the Netophathite, +\v 29 Heleb the son of Baanah the Netophathite, Ittai the son of Ribai of Gibeah of the children of Benjamin, +\v 30 Benaiah a Pirathonite, Hiddai of the brooks of Gaash. +\v 31 Abialbon the Arbathite, Azmaveth the Barhumite, +\v 32 Eliahba the Shaalbonite, the sons of Jashen, Jonathan, +\v 33 Shammah the Hararite, Ahiam the son of Sharar the Ararite, +\v 34 Eliphelet the son of Ahasbai, the son of the Maacathite, Eliam the son of Ahithophel the Gilonite, +\v 35 Hezro the Carmelite, Paarai the Arbite, +\v 36 Igal the son of Nathan of Zobah, Bani the Gadite, +\v 37 Zelek the Ammonite, Naharai the Beerothite, armor bearers to Joab the son of Zeruiah, +\v 38 Ira the Ithrite, Gareb the Ithrite, +\v 39 and Uriah the Hittite: thirty-seven in all. +\c 24 +\p +\v 1 Again Yahweh’s anger burned against Israel, and he moved David against them, saying, “Go, count Israel and Judah.” +\v 2 The king said to Joab the captain of the army, who was with him, “Now go back and forth through all the tribes of Israel, from Dan even to Beersheba, and count the people, that I may know the sum of the people.” +\p +\v 3 Joab said to the king, “Now may Yahweh your God add to the people, however many they may be, one hundred times; and may the eyes of my lord the king see it. But why does my lord the king delight in this thing?” +\p +\v 4 Notwithstanding, the king’s word prevailed against Joab and against the captains of the army. Joab and the captains of the army went out from the presence of the king to count the people of Israel. +\v 5 They passed over the Jordan and encamped in Aroer, on the right side of the city that is in the middle of the valley of Gad, and to Jazer; +\v 6 then they came to Gilead and to the land of Tahtim Hodshi; and they came to Dan Jaan and around to Sidon, +\v 7 and came to the stronghold of Tyre, and to all the cities of the Hivites and of the Canaanites; and they went out to the south of Judah, at Beersheba. +\v 8 So when they had gone back and forth through all the land, they came to Jerusalem at the end of nine months and twenty days. +\v 9 Joab gave up the sum of the counting of the people to the king; and there were in Israel eight hundred thousand valiant men who drew the sword, and the men of Judah were five hundred thousand men. +\p +\v 10 David’s heart struck him after he had counted the people. David said to Yahweh, “I have sinned greatly in that which I have done. But now, Yahweh, put away, I beg you, the iniquity of your servant; for I have done very foolishly.” +\p +\v 11 When David rose up in the morning, Yahweh’s word came to the prophet Gad, David’s seer, saying, +\v 12 “Go and speak to David, ‘Yahweh says, “I offer you three things. Choose one of them, that I may do it to you.”’” +\p +\v 13 So Gad came to David, and told him, saying, “Shall seven years of famine come to you in your land? Or will you flee three months before your foes while they pursue you? Or shall there be three days’ pestilence in your land? Now answer, and consider what answer I shall return to him who sent me.” +\p +\v 14 David said to Gad, “I am in distress. Let us fall now into Yahweh’s hand, for his mercies are great. Let me not fall into man’s hand.” +\p +\v 15 So Yahweh sent a pestilence on Israel from the morning even to the appointed time; and seventy thousand men died of the people from Dan even to Beersheba. +\v 16 When the angel stretched out his hand toward Jerusalem to destroy it, Yahweh relented of the disaster, and said to the angel who destroyed the people, “It is enough. Now withdraw your hand.” Yahweh’s angel was by the threshing floor of Araunah the Jebusite. +\p +\v 17 David spoke to Yahweh when he saw the angel who struck the people, and said, “Behold, I have sinned, and I have done perversely; but these sheep, what have they done? Please let your hand be against me, and against my father’s house.” +\p +\v 18 Gad came that day to David and said to him, “Go up, build an altar to Yahweh on the threshing floor of Araunah the Jebusite.” +\p +\v 19 David went up according to the saying of Gad, as Yahweh commanded. +\v 20 Araunah looked out, and saw the king and his servants coming on toward him. Then Araunah went out and bowed himself before the king with his face to the ground. +\v 21 Araunah said, “Why has my lord the king come to his servant?” +\p David said, “To buy your threshing floor, to build an altar to Yahweh, that the plague may be stopped from afflicting the people.” +\p +\v 22 Araunah said to David, “Let my lord the king take and offer up what seems good to him. Behold, the cattle for the burnt offering, and the threshing sledges and the yokes of the oxen for the wood. +\v 23 All this, O king, does Araunah give to the king.” Araunah said to the king, “May Yahweh your God accept you.” +\p +\v 24 The king said to Araunah, “No, but I will most certainly buy it from you for a price. I will not offer burnt offerings to Yahweh my God which cost me nothing.” So David bought the threshing floor and the oxen for fifty shekels\f + \fr 24:24 \ft A shekel is about 10 grams or about 0.35 ounces, so 50 shekels is about 0.5 kilograms or 1.1 pounds.\f* of silver. +\v 25 David built an altar to Yahweh there, and offered burnt offerings and peace offerings. So Yahweh was entreated for the land, and the plague was removed from Israel. diff --git a/c-sharp/assets/WEB/111KIengWEBUS.SFM b/c-sharp/assets/WEB/111KIengWEBUS.SFM new file mode 100644 index 0000000000..98993edc33 --- /dev/null +++ b/c-sharp/assets/WEB/111KIengWEBUS.SFM @@ -0,0 +1,1147 @@ +\id 1KI World English Bible (WEB) +\ide UTF-8 +\h 1 Kings +\toc1 The First Book of Kings +\toc2 1 Kings +\toc3 1 Kings +\mt1 The First Book of Kings +\c 1 +\p +\v 1 Now King David was old and advanced in years; and they covered him with clothes, but he couldn’t keep warm. +\v 2 Therefore his servants said to him, “Let a young virgin be sought for my lord the king. Let her stand before the king, and cherish him; and let her lie in your bosom, that my lord the king may keep warm.” +\v 3 So they sought for a beautiful young lady throughout all the borders of Israel, and found Abishag the Shunammite, and brought her to the king. +\v 4 The young lady was very beautiful; and she cherished the king, and served him; but the king didn’t know her intimately. +\p +\v 5 Then Adonijah the son of Haggith exalted himself, saying, “I will be king.” Then he prepared him chariots and horsemen, and fifty men to run before him. +\v 6 His father had not displeased him at any time in saying, “Why have you done so?” and he was also a very handsome man; and he was born after Absalom. +\v 7 He conferred with Joab the son of Zeruiah and with Abiathar the priest; and they followed Adonijah and helped him. +\v 8 But Zadok the priest, Benaiah the son of Jehoiada, Nathan the prophet, Shimei, Rei, and the mighty men who belonged to David, were not with Adonijah. +\p +\v 9 Adonijah killed sheep, cattle, and fatlings by the stone of Zoheleth, which is beside En Rogel; and he called all his brothers, the king’s sons, and all the men of Judah, the king’s servants; +\v 10 but he didn’t call Nathan the prophet, and Benaiah, and the mighty men, and Solomon his brother. +\p +\v 11 Then Nathan spoke to Bathsheba the mother of Solomon, saying, “Haven’t you heard that Adonijah the son of Haggith reigns, and David our lord doesn’t know it? +\v 12 Now therefore come, please let me give you counsel, that you may save your own life and your son Solomon’s life. +\v 13 Go in to King David, and tell him, ‘Didn’t you, my lord the king, swear to your servant, saying, “Assuredly Solomon your son shall reign after me, and he shall sit on my throne?” Why then does Adonijah reign?’ +\v 14 Behold,\f + \fr 1:14 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* while you are still talking there with the king, I will also come in after you and confirm your words.” +\p +\v 15 Bathsheba went in to the king in his room. The king was very old; and Abishag the Shunammite was serving the king. +\v 16 Bathsheba bowed and showed respect to the king. The king said, “What would you like?” +\p +\v 17 She said to him, “My lord, you swore by Yahweh\f + \fr 1:17 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations. \f* your God\f + \fr 1:17 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* to your servant, ‘Assuredly Solomon your son shall reign after me, and he shall sit on my throne.’ +\v 18 Now, behold, Adonijah reigns; and you, my lord the king, don’t know it. +\v 19 He has slain cattle and fatlings and sheep in abundance, and has called all the sons of the king, Abiathar the priest, and Joab the captain of the army; but he hasn’t called Solomon your servant. +\v 20 You, my lord the king, the eyes of all Israel are on you, that you should tell them who will sit on the throne of my lord the king after him. +\v 21 Otherwise it will happen, when my lord the king sleeps with his fathers, that I and my son Solomon will be considered criminals.” +\p +\v 22 Behold, while she was still talking with the king, Nathan the prophet came in. +\v 23 They told the king, saying, “Behold, Nathan the prophet!” +\p When he had come in before the king, he bowed himself before the king with his face to the ground. +\v 24 Nathan said, “My lord, King, have you said, ‘Adonijah shall reign after me, and he shall sit on my throne?’ +\v 25 For he has gone down today, and has slain cattle, fatlings, and sheep in abundance, and has called all the king’s sons, the captains of the army, and Abiathar the priest. Behold, they are eating and drinking before him, and saying, ‘Long live King Adonijah!’ +\v 26 But he hasn’t called me, even me your servant, Zadok the priest, Benaiah the son of Jehoiada, and your servant Solomon. +\v 27 Was this thing done by my lord the king, and you haven’t shown to your servants who should sit on the throne of my lord the king after him?” +\p +\v 28 Then King David answered, “Call Bathsheba in to me.” She came into the king’s presence and stood before the king. +\v 29 The king vowed and said, “As Yahweh lives, who has redeemed my soul out of all adversity, +\v 30 most certainly as I swore to you by Yahweh, the God of Israel, saying, ‘Assuredly Solomon your son shall reign after me, and he shall sit on my throne in my place;’ I will most certainly do this today.” +\p +\v 31 Then Bathsheba bowed with her face to the earth and showed respect to the king, and said, “Let my lord King David live forever!” +\p +\v 32 King David said, “Call to me Zadok the priest, Nathan the prophet, and Benaiah the son of Jehoiada.” They came before the king. +\v 33 The king said to them, “Take with you the servants of your lord, and cause Solomon my son to ride on my own mule, and bring him down to Gihon. +\v 34 Let Zadok the priest and Nathan the prophet anoint him there king over Israel. Blow the trumpet, and say, ‘Long live King Solomon!’ +\v 35 Then come up after him, and he shall come and sit on my throne; for he shall be king in my place. I have appointed him to be prince over Israel and over Judah.” +\p +\v 36 Benaiah the son of Jehoiada answered the king, and said, “Amen. May Yahweh, the God of my lord the king, say so. +\v 37 As Yahweh has been with my lord the king, even so may he be with Solomon, and make his throne greater than the throne of my lord King David.” +\p +\v 38 So Zadok the priest, Nathan the prophet, Benaiah the son of Jehoiada, and the Cherethites and the Pelethites went down and had Solomon ride on King David’s mule, and brought him to Gihon. +\v 39 Zadok the priest took the horn of oil from the Tent, and anointed Solomon. They blew the trumpet; and all the people said, “Long live King Solomon!” +\p +\v 40 All the people came up after him, and the people piped with pipes, and rejoiced with great joy, so that the earth shook with their sound. +\v 41 Adonijah and all the guests who were with him heard it as they had finished eating. When Joab heard the sound of the trumpet, he said, “Why is this noise of the city being in an uproar?” +\p +\v 42 While he yet spoke, behold, Jonathan the son of Abiathar the priest came; and Adonijah said, “Come in; for you are a worthy man, and bring good news.” +\p +\v 43 Jonathan answered Adonijah, “Most certainly our lord King David has made Solomon king. +\v 44 The king has sent with him Zadok the priest, Nathan the prophet, Benaiah the son of Jehoiada, and the Cherethites and the Pelethites; and they have caused him to ride on the king’s mule. +\v 45 Zadok the priest and Nathan the prophet have anointed him king in Gihon. They have come up from there rejoicing, so that the city rang again. This is the noise that you have heard. +\v 46 Also, Solomon sits on the throne of the kingdom. +\v 47 Moreover the king’s servants came to bless our lord King David, saying, ‘May your God make the name of Solomon better than your name, and make his throne greater than your throne;’ and the king bowed himself on the bed. +\v 48 Also thus said the king, ‘Blessed be Yahweh, the God of Israel, who has given one to sit on my throne today, my eyes even seeing it.’” +\p +\v 49 All the guests of Adonijah were afraid, and rose up, and each man went his way. +\v 50 Adonijah was afraid because of Solomon; and he arose, and went, and hung onto the horns of the altar. +\v 51 Solomon was told, “Behold, Adonijah fears King Solomon; for, behold, he is hanging onto the horns of the altar, saying, ‘Let King Solomon swear to me first that he will not kill his servant with the sword.’” +\p +\v 52 Solomon said, “If he shows himself a worthy man, not a hair of his shall fall to the earth; but if wickedness is found in him, he shall die.” +\p +\v 53 So King Solomon sent, and they brought him down from the altar. He came and bowed down to King Solomon; and Solomon said to him, “Go to your house.” +\c 2 +\p +\v 1 Now the days of David came near that he should die; and he commanded Solomon his son, saying, +\v 2 “I am going the way of all the earth. You be strong therefore, and show yourself a man; +\v 3 and keep the instruction of Yahweh your God, to walk in his ways, to keep his statutes, his commandments, his ordinances, and his testimonies, according to that which is written in the law of Moses, that you may prosper in all that you do and wherever you turn yourself. +\v 4 Then Yahweh may establish his word which he spoke concerning me, saying, ‘If your children are careful of their way, to walk before me in truth with all their heart and with all their soul, there shall not fail you,’ he said, ‘a man on the throne of Israel.’ +\p +\v 5 “Moreover you know also what Joab the son of Zeruiah did to me, even what he did to the two captains of the armies of Israel, to Abner the son of Ner and to Amasa the son of Jether, whom he killed, and shed the blood of war in peace, and put the blood of war on his sash that was around his waist and in his sandals that were on his feet. +\v 6 Do therefore according to your wisdom, and don’t let his gray head go down to Sheol\f + \fr 2:6 \ft Sheol is the place of the dead.\f* in peace. +\v 7 But show kindness to the sons of Barzillai the Gileadite, and let them be among those who eat at your table; for so they came to me when I fled from Absalom your brother. +\p +\v 8 “Behold, there is with you Shimei the son of Gera, the Benjamite of Bahurim, who cursed me with a grievous curse in the day when I went to Mahanaim; but he came down to meet me at the Jordan, and I swore to him by Yahweh, saying, ‘I will not put you to death with the sword.’ +\v 9 Now therefore don’t hold him guiltless, for you are a wise man; and you will know what you ought to do to him, and you shall bring his gray head down to Sheol\f + \fr 2:9 \ft Sheol is the place of the dead.\f* with blood.” +\p +\v 10 David slept with his fathers, and was buried in David’s city. +\v 11 The days that David reigned over Israel were forty years; he reigned seven years in Hebron, and he reigned thirty-three years in Jerusalem. +\v 12 Solomon sat on David his father’s throne; and his kingdom was firmly established. +\p +\v 13 Then Adonijah the son of Haggith came to Bathsheba the mother of Solomon. She said, “Do you come peaceably?” +\p He said, “Peaceably. +\v 14 He said moreover, I have something to tell you.” +\p She said, “Say on.” +\p +\v 15 He said, “You know that the kingdom was mine, and that all Israel set their faces on me, that I should reign. However, the kingdom is turned around, and has become my brother’s; for it was his from Yahweh. +\v 16 Now I ask one petition of you. Don’t deny me.” +\p She said to him, “Say on.” +\p +\v 17 He said, “Please speak to Solomon the king (for he will not tell you ‘no’), that he give me Abishag the Shunammite as wife.” +\p +\v 18 Bathsheba said, “All right. I will speak for you to the king.” +\p +\v 19 Bathsheba therefore went to King Solomon, to speak to him for Adonijah. The king rose up to meet her and bowed himself to her, and sat down on his throne and caused a throne to be set for the king’s mother; and she sat on his right hand. +\v 20 Then she said, “I ask one small petition of you; don’t deny me.” +\p The king said to her, “Ask on, my mother, for I will not deny you.” +\p +\v 21 She said, “Let Abishag the Shunammite be given to Adonijah your brother as wife.” +\p +\v 22 King Solomon answered his mother, “Why do you ask Abishag the Shunammite for Adonijah? Ask for him the kingdom also, for he is my elder brother; even for him, and for Abiathar the priest, and for Joab the son of Zeruiah.” +\v 23 Then King Solomon swore by Yahweh, saying, “God do so to me, and more also, if Adonijah has not spoken this word against his own life. +\v 24 Now therefore as Yahweh lives, who has established me and set me on my father David’s throne, and who has made me a house as he promised, surely Adonijah shall be put to death today.” +\p +\v 25 King Solomon sent Benaiah the son of Jehoiada; and he fell on him, so that he died. +\v 26 To Abiathar the priest the king said, “Go to Anathoth, to your own fields, for you are worthy of death. But I will not at this time put you to death, because you bore the Lord\f + \fr 2:26 \ft The word translated “Lord” is “Adonai.”\f* Yahweh’s ark before David my father, and because you were afflicted in all in which my father was afflicted.” +\v 27 So Solomon thrust Abiathar out from being priest to Yahweh, that he might fulfill Yahweh’s word which he spoke concerning the house of Eli in Shiloh. +\p +\v 28 This news came to Joab; for Joab had followed Adonijah, although he didn’t follow Absalom. Joab fled to Yahweh’s Tent, and held onto the horns of the altar. +\v 29 King Solomon was told, “Joab has fled to Yahweh’s Tent; and behold, he is by the altar.” Then Solomon sent Benaiah the son of Jehoiada, saying, “Go, fall on him.” +\p +\v 30 Benaiah came to Yahweh’s Tent, and said to him, “The king says, ‘Come out!’” +\p He said, “No; but I will die here.” +\p Benaiah brought the king word again, saying, “This is what Joab said, and this is how he answered me.” +\p +\v 31 The king said to him, “Do as he has said, and fall on him, and bury him, that you may take away the blood, which Joab shed without cause, from me and from my father’s house. +\v 32 Yahweh will return his blood on his own head, because he fell on two men more righteous and better than he, and killed them with the sword, and my father David didn’t know it: Abner the son of Ner, captain of the army of Israel, and Amasa the son of Jether, captain of the army of Judah. +\v 33 So their blood will return on the head of Joab and on the head of his offspring\f + \fr 2:33 \ft or, seed\f* forever. But for David, for his offspring, for his house, and for his throne, there will be peace forever from Yahweh.” +\p +\v 34 Then Benaiah the son of Jehoiada went up and fell on him, and killed him; and he was buried in his own house in the wilderness. +\v 35 The king put Benaiah the son of Jehoiada in his place over the army; and the king put Zadok the priest in the place of Abiathar. +\p +\v 36 The king sent and called for Shimei, and said to him, “Build yourself a house in Jerusalem, and live there, and don’t go anywhere else. +\v 37 For on the day you go out and pass over the brook Kidron, know for certain that you will surely die. Your blood will be on your own head.” +\p +\v 38 Shimei said to the king, “What you say is good. As my lord the king has said, so will your servant do.” Shimei lived in Jerusalem many days. +\p +\v 39 At the end of three years, two of Shimei’s slaves ran away to Achish, son of Maacah, king of Gath. They told Shimei, saying, “Behold, your slaves are in Gath.” +\p +\v 40 Shimei arose, saddled his donkey, and went to Gath to Achish to seek his slaves; and Shimei went and brought his slaves from Gath. +\v 41 Solomon was told that Shimei had gone from Jerusalem to Gath, and had come again. +\p +\v 42 The king sent and called for Shimei, and said to him, “Didn’t I adjure you by Yahweh and warn you, saying, ‘Know for certain that on the day you go out and walk anywhere else, you shall surely die?’ You said to me, ‘The saying that I have heard is good.’ +\v 43 Why then have you not kept the oath of Yahweh and the commandment that I have instructed you with?” +\v 44 The king said moreover to Shimei, “You know in your heart all the wickedness that you did to David my father. Therefore Yahweh will return your wickedness on your own head. +\v 45 But King Solomon will be blessed, and David’s throne will be established before Yahweh forever.” +\v 46 So the king commanded Benaiah the son of Jehoiada; and he went out, and fell on him, so that he died. The kingdom was established in the hand of Solomon. +\c 3 +\p +\v 1 Solomon made a marriage alliance with Pharaoh king of Egypt. He took Pharaoh’s daughter and brought her into David’s city until he had finished building his own house, Yahweh’s house, and the wall around Jerusalem. +\v 2 However, the people sacrificed in the high places, because there was not yet a house built for Yahweh’s name. +\v 3 Solomon loved Yahweh, walking in the statutes of David his father, except that he sacrificed and burned incense in the high places. +\v 4 The king went to Gibeon to sacrifice there, for that was the great high place. Solomon offered a thousand burnt offerings on that altar. +\v 5 In Gibeon, Yahweh appeared to Solomon in a dream by night; and God said, “Ask for what I should give you.” +\p +\v 6 Solomon said, “You have shown to your servant David my father great loving kindness, because he walked before you in truth, in righteousness, and in uprightness of heart with you. You have kept for him this great loving kindness, that you have given him a son to sit on his throne, as it is today. +\v 7 Now, Yahweh my God, you have made your servant king instead of David my father. I am just a little child. I don’t know how to go out or come in. +\v 8 Your servant is among your people which you have chosen, a great people, that can’t be numbered or counted for multitude. +\v 9 Give your servant therefore an understanding heart to judge your people, that I may discern between good and evil; for who is able to judge this great people of yours?” +\p +\v 10 This request pleased the Lord, that Solomon had asked this thing. +\v 11 God said to him, “Because you have asked this thing, and have not asked for yourself long life, nor have you asked for riches for yourself, nor have you asked for the life of your enemies, but have asked for yourself understanding to discern justice, +\v 12 behold, I have done according to your word. Behold, I have given you a wise and understanding heart, so that there has been no one like you before you, and after you none will arise like you. +\v 13 I have also given you that which you have not asked, both riches and honor, so that there will not be any among the kings like you for all your days. +\v 14 If you will walk in my ways, to keep my statutes and my commandments, as your father David walked, then I will lengthen your days.” +\p +\v 15 Solomon awoke; and behold, it was a dream. Then he came to Jerusalem and stood before the ark of Yahweh’s covenant, and offered up burnt offerings, offered peace offerings, and made a feast for all his servants. +\p +\v 16 Then two women who were prostitutes came to the king, and stood before him. +\v 17 The one woman said, “Oh, my lord, I and this woman dwell in one house. I delivered a child with her in the house. +\v 18 The third day after I delivered, this woman delivered also. We were together. There was no stranger with us in the house, just us two in the house. +\v 19 This woman’s child died in the night, because she lay on it. +\v 20 She arose at midnight, and took my son from beside me while your servant slept, and laid it in her bosom, and laid her dead child in my bosom. +\v 21 When I rose in the morning to nurse my child, behold, he was dead; but when I had looked at him in the morning, behold, it was not my son whom I bore.” +\p +\v 22 The other woman said, “No! But the living one is my son, and the dead one is your son.” +\p The first one said, “No! But the dead one is your son, and the living one is my son.” They argued like this before the king. +\p +\v 23 Then the king said, “One says, ‘This is my son who lives, and your son is the dead;’ and the other says, ‘No! But your son is the dead one, and my son is the living one.’” +\p +\v 24 The king said, “Get me a sword.” So they brought a sword before the king. +\p +\v 25 The king said, “Divide the living child in two, and give half to the one, and half to the other.” +\p +\v 26 Then the woman whose the living child was spoke to the king, for her heart yearned over her son, and she said, “Oh, my lord, give her the living child, and in no way kill him!” +\p But the other said, “He shall be neither mine nor yours. Divide him.” +\p +\v 27 Then the king answered, “Give the first woman the living child, and definitely do not kill him. She is his mother.” +\p +\v 28 All Israel heard of the judgment which the king had judged; and they feared the king, for they saw that the wisdom of God was in him to do justice. +\c 4 +\p +\v 1 King Solomon was king over all Israel. +\v 2 These were the princes whom he had: Azariah the son of Zadok, the priest; +\v 3 Elihoreph and Ahijah, the sons of Shisha, scribes; Jehoshaphat the son of Ahilud, the recorder; +\v 4 Benaiah the son of Jehoiada was over the army; Zadok and Abiathar were priests; +\v 5 Azariah the son of Nathan was over the officers; Zabud the son of Nathan was chief minister, the king’s friend; +\v 6 Ahishar was over the household; and Adoniram the son of Abda was over the men subject to forced labor. +\p +\v 7 Solomon had twelve officers over all Israel, who provided food for the king and his household. Each man had to make provision for a month in the year. +\v 8 These are their names: Ben Hur, in the hill country of Ephraim; +\v 9 Ben Deker, in Makaz, in Shaalbim, Beth Shemesh, and Elon Beth Hanan; +\v 10 Ben Hesed, in Arubboth (Socoh and all the land of Hepher belonged to him); +\v 11 Ben Abinadab, in all the height of Dor (he had Taphath, Solomon’s daughter, as wife); +\v 12 Baana the son of Ahilud, in Taanach and Megiddo, and all Beth Shean which is beside Zarethan, beneath Jezreel, from Beth Shean to Abel Meholah, as far as beyond Jokmeam; +\v 13 Ben Geber, in Ramoth Gilead (the towns of Jair the son of Manasseh, which are in Gilead, belonged to him; and the region of Argob, which is in Bashan, sixty great cities with walls and bronze bars, belonged to him); +\v 14 Ahinadab the son of Iddo, in Mahanaim; +\v 15 Ahimaaz, in Naphtali (he also took Basemath the daughter of Solomon as wife); +\v 16 Baana the son of Hushai, in Asher and Bealoth; +\v 17 Jehoshaphat the son of Paruah, in Issachar; +\v 18 Shimei the son of Ela, in Benjamin; +\v 19 Geber the son of Uri, in the land of Gilead, the country of Sihon king of the Amorites and of Og king of Bashan; and he was the only officer who was in the land. +\p +\v 20 Judah and Israel were numerous as the sand which is by the sea in multitude, eating and drinking and making merry. +\v 21 Solomon ruled over all the kingdoms from the River to the land of the Philistines, and to the border of Egypt. They brought tribute and served Solomon all the days of his life. +\v 22 Solomon’s provision for one day was thirty cors\f + \fr 4:22 \ft 1 cor is the same as a homer, or about 55.9 U. S. gallons (liquid) or 211 liters or 6 bushels\f* of fine flour, sixty measures of meal, +\v 23 ten head of fat cattle, twenty head of cattle out of the pastures, and one hundred sheep, in addition to deer, gazelles, roebucks, and fattened fowl. +\v 24 For he had dominion over all on this side the River, from Tiphsah even to Gaza, over all the kings on this side the River; and he had peace on all sides around him. +\v 25 Judah and Israel lived safely, every man under his vine and under his fig tree, from Dan even to Beersheba, all the days of Solomon. +\v 26 Solomon had forty thousand stalls of horses for his chariots, and twelve thousand horsemen. +\v 27 Those officers provided food for King Solomon, and for all who came to King Solomon’s table, every man in his month. They let nothing be lacking. +\v 28 They also brought barley and straw for the horses and swift steeds to the place where the officers were, each man according to his duty. +\v 29 God gave Solomon abundant wisdom, understanding, and breadth of mind like the sand that is on the seashore. +\v 30 Solomon’s wisdom excelled the wisdom of all the children of the east and all the wisdom of Egypt. +\v 31 For he was wiser than all men—wiser than Ethan the Ezrahite, Heman, Calcol, and Darda, the sons of Mahol; and his fame was in all the nations all around. +\v 32 He spoke three thousand proverbs, and his songs numbered one thousand five. +\v 33 He spoke of trees, from the cedar that is in Lebanon even to the hyssop that grows out of the wall; he also spoke of animals, of birds, of creeping things, and of fish. +\v 34 People of all nations came to hear the wisdom of Solomon, sent by all kings of the earth who had heard of his wisdom. +\c 5 +\p +\v 1 Hiram king of Tyre sent his servants to Solomon, for he had heard that they had anointed him king in the place of his father, and Hiram had always loved David. +\v 2 Solomon sent to Hiram, saying, +\v 3 “You know that David my father could not build a house for the name of Yahweh his God because of the wars which were around him on every side, until Yahweh put his enemies under the soles of his feet. +\v 4 But now Yahweh my God has given me rest on every side. There is no enemy and no evil occurrence. +\v 5 Behold, I intend to build a house for the name of Yahweh my God, as Yahweh spoke to David my father, saying, ‘Your son, whom I will set on your throne in your place shall build the house for my name.’ +\v 6 Now therefore command that cedar trees be cut for me out of Lebanon. My servants will be with your servants; and I will give you wages for your servants according to all that you say. For you know that there is nobody among us who knows how to cut timber like the Sidonians.” +\p +\v 7 When Hiram heard the words of Solomon, he rejoiced greatly, and said, “Blessed is Yahweh today, who has given to David a wise son to rule over this great people.” +\v 8 Hiram sent to Solomon, saying, “I have heard the message which you have sent to me. I will do all your desire concerning timber of cedar, and concerning cypress timber. +\v 9 My servants will bring them down from Lebanon to the sea. I will make them into rafts to go by sea to the place that you specify to me, and will cause them to be broken up there, and you will receive them. You will accomplish my desire, in giving food for my household.” +\p +\v 10 So Hiram gave Solomon cedar timber and cypress timber according to all his desire. +\v 11 Solomon gave Hiram twenty thousand cors\f + \fr 5:11 \ft 20,000 cors would be about 120,000 bushels or about 4.2 megaliters of wheat, which would weigh about 3,270 metric tons.\f* of wheat for food to his household, and twenty cors\f + \fr 5:11 \ft 20 cors is about 1,100 gallons or about 4220 liters.\f* of pure oil. Solomon gave this to Hiram year by year. +\v 12 Yahweh gave Solomon wisdom, as he promised him. There was peace between Hiram and Solomon, and the two of them made a treaty together. +\p +\v 13 King Solomon raised a levy out of all Israel; and the levy was thirty thousand men. +\v 14 He sent them to Lebanon, ten thousand a month by courses: for a month they were in Lebanon, and two months at home; and Adoniram was over the men subject to forced labor. +\v 15 Solomon had seventy thousand who bore burdens, and eighty thousand who were stone cutters in the mountains, +\v 16 besides Solomon’s chief officers who were over the work: three thousand three hundred who ruled over the people who labored in the work. +\v 17 The king commanded, and they cut out large stones, costly stones, to lay the foundation of the house with worked stone. +\v 18 Solomon’s builders and Hiram’s builders and the Gebalites cut them, and prepared the timber and the stones to build the house. +\c 6 +\p +\v 1 In the four hundred and eightieth year after the children of Israel had come out of the land of Egypt, in the fourth year of Solomon’s reign over Israel, in the month Ziv, which is the second month, he began to build Yahweh’s house. +\v 2 The house which King Solomon built for Yahweh had a length of sixty cubits,\f + \fr 6:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width twenty, and its height thirty cubits. +\v 3 The porch in front of the temple of the house had a length of twenty cubits, which was along the width of the house. Ten cubits was its width in front of the house. +\v 4 He made windows of fixed lattice work for the house. +\v 5 Against the wall of the house, he built floors all around, against the walls of the house all around, both of the temple and of the inner sanctuary; and he made side rooms all around. +\v 6 The lowest floor was five cubits wide, and the middle was six cubits wide, and the third was seven cubits wide; for on the outside he made offsets in the wall of the house all around, that the beams should not be inserted into the walls of the house. +\v 7 The house, when it was under construction, was built of stone prepared at the quarry; and no hammer or ax or any tool of iron was heard in the house while it was under construction. +\v 8 The door for the middle side rooms was in the right side of the house. They went up by winding stairs into the middle floor, and out of the middle into the third. +\v 9 So he built the house and finished it; and he covered the house with beams and planks of cedar. +\v 10 He built the floors all along the house, each five cubits high; and they rested on the house with timbers of cedar. +\p +\v 11 Yahweh’s word came to Solomon, saying, +\v 12 “Concerning this house which you are building, if you will walk in my statutes, and execute my ordinances, and keep all my commandments to walk in them, then I will establish my word with you, which I spoke to David your father. +\v 13 I will dwell among the children of Israel, and will not forsake my people Israel.” +\p +\v 14 So Solomon built the house and finished it. +\v 15 He built the walls of the house within with boards of cedar; from the floor of the house to the walls of the ceiling, he covered them on the inside with wood. He covered the floor of the house with cypress boards. +\v 16 He built twenty cubits of the back part of the house with boards of cedar from the floor to the ceiling. He built this within, for an inner sanctuary, even for the most holy place. +\v 17 In front of the temple sanctuary was forty cubits long. +\v 18 There was cedar on the house within, carved with buds and open flowers. All was cedar. No stone was visible. +\v 19 He prepared an inner sanctuary in the middle of the house within, to set the ark of Yahweh’s covenant there. +\v 20 Within the inner sanctuary was twenty cubits in length, and twenty cubits in width, and twenty cubits in its height. He overlaid it with pure gold. He covered the altar with cedar. +\v 21 So Solomon overlaid the house within with pure gold. He drew chains of gold across before the inner sanctuary, and he overlaid it with gold. +\v 22 He overlaid the whole house with gold, until all the house was finished. He also overlaid the whole altar that belonged to the inner sanctuary with gold. +\p +\v 23 In the inner sanctuary he made two cherubim\f + \fr 6:23 \ft “Cherubim” is plural of “cherub”, an angelic being.\f* of olive wood, each ten cubits high. +\v 24 Five cubits was the length of one wing of the cherub, and five cubits was the length of the other wing of the cherub. From the tip of one wing to the tip of the other was ten cubits. +\v 25 The other cherub was ten cubits. Both the cherubim were of one measure and one form. +\v 26 One cherub was ten cubits high, and so was the other cherub. +\v 27 He set the cherubim within the inner house. The wings of the cherubim were stretched out, so that the wing of the one touched the one wall and the wing of the other cherub touched the other wall; and their wings touched one another in the middle of the house. +\v 28 He overlaid the cherubim with gold. +\p +\v 29 He carved all the walls of the house around with carved figures of cherubim, palm trees, and open flowers, inside and outside. +\v 30 He overlaid the floor of the house with gold, inside and outside. +\v 31 For the entrance of the inner sanctuary, he made doors of olive wood. The lintel and door posts were a fifth part of the wall. +\v 32 So he made two doors of olive wood; and he carved on them carvings of cherubim, palm trees, and open flowers, and overlaid them with gold. He spread the gold on the cherubim and on the palm trees. +\v 33 He also made the entrance of the temple door posts of olive wood, out of a fourth part of the wall, +\v 34 and two doors of cypress wood. The two leaves of the one door were folding, and the two leaves of the other door were folding. +\v 35 He carved cherubim, palm trees, and open flowers; and he overlaid them with gold fitted on the engraved work. +\v 36 He built the inner court with three courses of cut stone and a course of cedar beams. +\p +\v 37 The foundation of Yahweh’s house was laid in the fourth year, in the month Ziv. +\v 38 In the eleventh year, in the month Bul, which is the eighth month, the house was finished throughout all its parts and according to all its specifications. So he spent seven years building it. +\c 7 +\p +\v 1 Solomon was building his own house thirteen years, and he finished all his house. +\v 2 For he built the House of the Forest of Lebanon. Its length was one hundred cubits,\f + \fr 7:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* its width fifty cubits, and its height thirty cubits, on four rows of cedar pillars, with cedar beams on the pillars. +\v 3 It was covered with cedar above over the forty-five beams that were on the pillars, fifteen in a row. +\v 4 There were beams in three rows, and window was facing window in three ranks. +\v 5 All the doors and posts were made square with beams; and window was facing window in three ranks. +\v 6 He made the hall of pillars. Its length was fifty cubits and its width thirty cubits, with a porch before them, and pillars and a threshold before them. +\v 7 He made the porch of the throne where he was to judge, even the porch of judgment; and it was covered with cedar from floor to floor. +\v 8 His house where he was to dwell, the other court within the porch, was of the same construction. He made also a house for Pharaoh’s daughter (whom Solomon had taken as wife), like this porch. +\v 9 All these were of costly stones, even of stone cut according to measure, sawed with saws, inside and outside, even from the foundation to the coping, and so on the outside to the great court. +\v 10 The foundation was of costly stones, even great stones, stones of ten cubits and stones of eight cubits. +\v 11 Above were costly stones, even cut stone, according to measure, and cedar wood. +\v 12 The great court around had three courses of cut stone with a course of cedar beams, like the inner court of Yahweh’s house and the porch of the house. +\p +\v 13 King Solomon sent and brought Hiram out of Tyre. +\v 14 He was the son of a widow of the tribe of Naphtali, and his father was a man of Tyre, a worker in bronze; and he was filled with wisdom and understanding and skill to work all works in bronze. He came to King Solomon and performed all his work. +\v 15 For he fashioned the two pillars of bronze, eighteen cubits high apiece; and a line of twelve cubits encircled either of them. +\v 16 He made two capitals of molten bronze to set on the tops of the pillars. The height of the one capital was five cubits, and the height of the other capital was five cubits. +\v 17 There were nets of checker work and wreaths of chain work for the capitals which were on the top of the pillars: seven for the one capital, and seven for the other capital. +\v 18 So he made the pillars; and there were two rows of pomegranates around the one network, to cover the capitals that were on the top of the pillars; and he did so for the other capital. +\v 19 The capitals that were on the top of the pillars in the porch were of lily work, four cubits. +\v 20 There were capitals above also on the two pillars, close by the belly which was beside the network. There were two hundred pomegranates in rows around the other capital. +\v 21 He set up the pillars at the porch of the temple. He set up the right pillar and called its name Jachin; and he set up the left pillar and called its name Boaz. +\v 22 On the tops of the pillars was lily work. So the work of the pillars was finished. +\p +\v 23 He made the molten sea ten cubits from brim to brim, round in shape. Its height was five cubits; and a line of thirty cubits encircled it. +\v 24 Under its brim around there were buds which encircled it for ten cubits, encircling the sea. The buds were in two rows, cast when it was cast. +\v 25 It stood on twelve oxen, three looking toward the north, and three looking toward the west, and three looking toward the south, and three looking toward the east; and the sea was set on them above, and all their hindquarters were inward. +\v 26 It was a hand width thick. Its brim was worked like the brim of a cup, like the flower of a lily. It held two thousand baths. +\p +\v 27 He made the ten bases of bronze. The length of one base was four cubits, four cubits its width, and three cubits its height. +\v 28 The work of the bases was like this: they had panels; and there were panels between the ledges; +\v 29 and on the panels that were between the ledges were lions, oxen, and cherubim; and on the ledges there was a pedestal above; and beneath the lions and oxen were wreaths of hanging work. +\v 30 Every base had four bronze wheels and axles of bronze; and its four feet had supports. The supports were cast beneath the basin, with wreaths at the side of each. +\v 31 Its opening within the capital and above was a cubit. Its opening was round like the work of a pedestal, a cubit and a half; and also on its opening were engravings, and their panels were square, not round. +\v 32 The four wheels were underneath the panels; and the axles of the wheels were in the base. The height of a wheel was a cubit and half a cubit. +\v 33 The work of the wheels was like the work of a chariot wheel. Their axles, their rims, their spokes, and their hubs were all of cast metal. +\v 34 There were four supports at the four corners of each base. Its supports were of the base itself. +\v 35 In the top of the base there was a round band half a cubit high; and on the top of the base its supports and its panels were the same. +\v 36 On the plates of its supports and on its panels, he engraved cherubim, lions, and palm trees, each in its space, with wreaths all around. +\v 37 He made the ten bases in this way: all of them had one casting, one measure, and one form. +\v 38 He made ten basins of bronze. One basin contained forty baths.\f + \fr 7:38 \ft 1 bath is one tenth of a cor, or about 5.6 U. S. gallons or 21 liters, so 40 baths was about 224 gallons or 840 liters.\f* Every basin measured four cubits. One basin was on every one of the ten bases. +\v 39 He set the bases, five on the right side of the house and five on the left side of the house. He set the sea on the right side of the house eastward and toward the south. +\p +\v 40 Hiram made the pots, the shovels, and the basins. So Hiram finished doing all the work that he worked for King Solomon in Yahweh’s house: +\v 41 the two pillars; the two bowls of the capitals that were on the top of the pillars; the two networks to cover the two bowls of the capitals that were on the top of the pillars; +\v 42 the four hundred pomegranates for the two networks; two rows of pomegranates for each network, to cover the two bowls of the capitals that were on the pillars; +\v 43 the ten bases; the ten basins on the bases; +\v 44 the one sea; the twelve oxen under the sea; +\v 45 the pots; the shovels; and the basins. All of these vessels, which Hiram made for King Solomon in Yahweh’s house, were of burnished bronze. +\v 46 The king cast them in the plain of the Jordan, in the clay ground between Succoth and Zarethan. +\v 47 Solomon left all the vessels unweighed, because there were so many of them. The weight of the bronze could not be determined. +\p +\v 48 Solomon made all the vessels that were in Yahweh’s house: the golden altar and the table that the show bread was on, of gold; +\v 49 and the lamp stands, five on the right side and five on the left, in front of the inner sanctuary, of pure gold; and the flowers, the lamps, and the tongs, of gold; +\v 50 the cups, the snuffers, the basins, the spoons, and the fire pans, of pure gold; and the hinges, both for the doors of the inner house, the most holy place, and for the doors of the house, of the temple, of gold. +\p +\v 51 Thus all the work that King Solomon did in Yahweh’s house was finished. Solomon brought in the things which David his father had dedicated—the silver, the gold, and the vessels—and put them in the treasuries of Yahweh’s house. +\c 8 +\p +\v 1 Then Solomon assembled the elders of Israel with all the heads of the tribes, the princes of the fathers’ households of the children of Israel, to King Solomon in Jerusalem, to bring up the ark of Yahweh’s covenant out of David’s city, which is Zion. +\v 2 All the men of Israel assembled themselves to King Solomon at the feast in the month Ethanim, which is the seventh month. +\v 3 All the elders of Israel came, and the priests picked up the ark. +\v 4 They brought up Yahweh’s ark, the Tent of Meeting, and all the holy vessels that were in the Tent. The priests and the Levites brought these up. +\v 5 King Solomon and all the congregation of Israel, who were assembled to him, were with him before the ark, sacrificing sheep and cattle that could not be counted or numbered for multitude. +\v 6 The priests brought in the ark of Yahweh’s covenant to its place, into the inner sanctuary of the house, to the most holy place, even under the cherubim’s wings. +\v 7 For the cherubim spread their wings out over the place of the ark, and the cherubim covered the ark and its poles above. +\v 8 The poles were so long that the ends of the poles were seen from the holy place before the inner sanctuary, but they were not seen outside. They are there to this day. +\v 9 There was nothing in the ark except the two stone tablets which Moses put there at Horeb, when Yahweh made a covenant with the children of Israel, when they came out of the land of Egypt. +\v 10 It came to pass, when the priests had come out of the holy place, that the cloud filled Yahweh’s house, +\v 11 so that the priests could not stand to minister by reason of the cloud; for Yahweh’s glory filled Yahweh’s house. +\p +\v 12 Then Solomon said, “Yahweh has said that he would dwell in the thick darkness. +\v 13 I have surely built you a house of habitation, a place for you to dwell in forever.” +\p +\v 14 The king turned his face around and blessed all the assembly of Israel; and all the assembly of Israel stood. +\v 15 He said, “Blessed is Yahweh, the God of Israel, who spoke with his mouth to David your father, and has with his hand fulfilled it, saying, +\v 16 ‘Since the day that I brought my people Israel out of Egypt, I chose no city out of all the tribes of Israel to build a house, that my name might be there; but I chose David to be over my people Israel.’ +\p +\v 17 “Now it was in the heart of David my father to build a house for the name of Yahweh, the God of Israel. +\v 18 But Yahweh said to David my father, ‘Whereas it was in your heart to build a house for my name, you did well that it was in your heart. +\v 19 Nevertheless, you shall not build the house; but your son who shall come out of your body, he shall build the house for my name.’ +\v 20 Yahweh has established his word that he spoke; for I have risen up in the place of David my father, and I sit on the throne of Israel, as Yahweh promised, and have built the house for the name of Yahweh, the God of Israel. +\v 21 There I have set a place for the ark, in which is Yahweh’s covenant, which he made with our fathers when he brought them out of the land of Egypt.” +\p +\v 22 Solomon stood before Yahweh’s altar in the presence of all the assembly of Israel, and spread out his hands toward heaven; +\v 23 and he said, “Yahweh, the God of Israel, there is no God like you, in heaven above, or on earth beneath; who keeps covenant and loving kindness with your servants who walk before you with all their heart; +\v 24 who has kept with your servant David my father that which you promised him. Yes, you spoke with your mouth, and have fulfilled it with your hand, as it is today. +\v 25 Now therefore, may Yahweh, the God of Israel, keep with your servant David my father that which you have promised him, saying, ‘There shall not fail from you a man in my sight to sit on the throne of Israel, if only your children take heed to their way, to walk before me as you have walked before me.’ +\p +\v 26 “Now therefore, God of Israel, please let your word be verified, which you spoke to your servant David my father. +\v 27 But will God in very deed dwell on the earth? Behold, heaven and the heaven of heavens can’t contain you; how much less this house that I have built! +\v 28 Yet have respect for the prayer of your servant and for his supplication, Yahweh my God, to listen to the cry and to the prayer which your servant prays before you today; +\v 29 that your eyes may be open toward this house night and day, even toward the place of which you have said, ‘My name shall be there;’ to listen to the prayer which your servant prays toward this place. +\v 30 Listen to the supplication of your servant, and of your people Israel, when they pray toward this place. Yes, hear in heaven, your dwelling place; and when you hear, forgive. +\p +\v 31 “If a man sins against his neighbor, and an oath is laid on him to cause him to swear, and he comes and swears before your altar in this house, +\v 32 then hear in heaven, and act, and judge your servants, condemning the wicked, to bring his way on his own head, and justifying the righteous, to give him according to his righteousness. +\p +\v 33 “When your people Israel are struck down before the enemy because they have sinned against you, if they turn again to you and confess your name, and pray and make supplication to you in this house, +\v 34 then hear in heaven, and forgive the sin of your people Israel, and bring them again to the land which you gave to their fathers. +\p +\v 35 “When the sky is shut up and there is no rain because they have sinned against you, if they pray toward this place and confess your name, and turn from their sin when you afflict them, +\v 36 then hear in heaven, and forgive the sin of your servants, and of your people Israel, when you teach them the good way in which they should walk; and send rain on your land which you have given to your people for an inheritance. +\p +\v 37 “If there is famine in the land, if there is pestilence, if there is blight, mildew, locust or caterpillar; if their enemy besieges them in the land of their cities, whatever plague, whatever sickness there is, +\v 38 whatever prayer and supplication is made by any man, or by all your people Israel, who shall each know the plague of his own heart, and spread out his hands toward this house, +\v 39 then hear in heaven, your dwelling place, and forgive, and act, and give to every man according to all his ways, whose heart you know (for you, even you only, know the hearts of all the children of men); +\v 40 that they may fear you all the days that they live in the land which you gave to our fathers. +\p +\v 41 “Moreover, concerning the foreigner, who is not of your people Israel, when he comes out of a far country for your name’s sake +\v 42 (for they shall hear of your great name and of your mighty hand and of your outstretched arm), when he comes and prays toward this house, +\v 43 hear in heaven, your dwelling place, and do according to all that the foreigner calls to you for; that all the peoples of the earth may know your name, to fear you, as do your people Israel, and that they may know that this house which I have built is called by your name. +\p +\v 44 “If your people go out to battle against their enemy, by whatever way you shall send them, and they pray to Yahweh toward the city which you have chosen, and toward the house which I have built for your name, +\v 45 then hear in heaven their prayer and their supplication, and maintain their cause. +\v 46 If they sin against you (for there is no man who doesn’t sin), and you are angry with them and deliver them to the enemy, so that they carry them away captive to the land of the enemy, far off or near; +\v 47 yet if they repent in the land where they are carried captive, and turn again, and make supplication to you in the land of those who carried them captive, saying, ‘We have sinned and have done perversely; we have dealt wickedly,’ +\v 48 if they return to you with all their heart and with all their soul in the land of their enemies who carried them captive, and pray to you toward their land which you gave to their fathers, the city which you have chosen and the house which I have built for your name, +\v 49 then hear their prayer and their supplication in heaven, your dwelling place, and maintain their cause; +\v 50 and forgive your people who have sinned against you, and all their transgressions in which they have transgressed against you; and give them compassion before those who carried them captive, that they may have compassion on them +\v 51 (for they are your people and your inheritance, which you brought out of Egypt, from the middle of the iron furnace); +\v 52 that your eyes may be open to the supplication of your servant and to the supplication of your people Israel, to listen to them whenever they cry to you. +\v 53 For you separated them from among all the peoples of the earth to be your inheritance, as you spoke by Moses your servant, when you brought our fathers out of Egypt, Lord Yahweh.” +\p +\v 54 It was so, that when Solomon had finished praying all this prayer and supplication to Yahweh, he arose from before Yahweh’s altar, from kneeling on his knees with his hands spread out toward heaven. +\v 55 He stood and blessed all the assembly of Israel with a loud voice, saying, +\v 56 “Blessed be Yahweh, who has given rest to his people Israel, according to all that he promised. There has not failed one word of all his good promise, which he promised by Moses his servant. +\v 57 May Yahweh our God be with us as he was with our fathers. Let him not leave us or forsake us, +\v 58 that he may incline our hearts to him, to walk in all his ways, and to keep his commandments, his statutes, and his ordinances, which he commanded our fathers. +\v 59 Let these my words, with which I have made supplication before Yahweh, be near to Yahweh our God day and night, that he may maintain the cause of his servant and the cause of his people Israel, as every day requires; +\v 60 that all the peoples of the earth may know that Yahweh himself is God. There is no one else. +\p +\v 61 “Let your heart therefore be perfect with Yahweh our God, to walk in his statutes, and to keep his commandments, as it is today.” +\p +\v 62 The king, and all Israel with him, offered sacrifice before Yahweh. +\v 63 Solomon offered for the sacrifice of peace offerings, which he offered to Yahweh, twenty two thousand head of cattle and one hundred twenty thousand sheep. So the king and all the children of Israel dedicated Yahweh’s house. +\v 64 The same day the king made the middle of the court holy that was before Yahweh’s house; for there he offered the burnt offering, the meal offering, and the fat of the peace offerings, because the bronze altar that was before Yahweh was too little to receive the burnt offering, the meal offering, and the fat of the peace offerings. +\p +\v 65 So Solomon held the feast at that time, and all Israel with him, a great assembly, from the entrance of Hamath to the brook of Egypt, before Yahweh our God, seven days and seven more days, even fourteen days. +\v 66 On the eighth day he sent the people away; and they blessed the king, and went to their tents joyful and glad in their hearts for all the goodness that Yahweh had shown to David his servant, and to Israel his people. +\c 9 +\p +\v 1 When Solomon had finished the building of Yahweh’s house, the king’s house, and all Solomon’s desire which he was pleased to do, +\v 2 Yahweh appeared to Solomon the second time, as he had appeared to him at Gibeon. +\v 3 Yahweh said to him, “I have heard your prayer and your supplication that you have made before me. I have made this house holy, which you have built, to put my name there forever; and my eyes and my heart shall be there perpetually. +\v 4 As for you, if you will walk before me as David your father walked, in integrity of heart and in uprightness, to do according to all that I have commanded you, and will keep my statutes and my ordinances, +\v 5 then I will establish the throne of your kingdom over Israel forever, as I promised to David your father, saying, ‘There shall not fail from you a man on the throne of Israel.’ +\v 6 But if you turn away from following me, you or your children, and not keep my commandments and my statutes which I have set before you, but go and serve other gods and worship them, +\v 7 then I will cut off Israel out of the land which I have given them; and I will cast this house, which I have made holy for my name, out of my sight; and Israel will be a proverb and a byword among all peoples. +\v 8 Though this house is so high, yet everyone who passes by it will be astonished and hiss; and they will say, ‘Why has Yahweh done this to this land and to this house?’ +\v 9 and they will answer, ‘Because they abandoned Yahweh their God, who brought their fathers out of the land of Egypt, and embraced other gods, and worshiped them, and served them. Therefore Yahweh has brought all this evil on them.’” +\p +\v 10 At the end of twenty years, in which Solomon had built the two houses, Yahweh’s house and the king’s house +\v 11 (now Hiram the king of Tyre had furnished Solomon with cedar trees and cypress trees, and with gold, according to all his desire), King Solomon gave Hiram twenty cities in the land of Galilee. +\v 12 Hiram came out of Tyre to see the cities which Solomon had given him; and they didn’t please him. +\v 13 He said, “What cities are these which you have given me, my brother?” He called them the land of Cabul\f + \fr 9:13 \ft “Cabul” sounds like Hebrew for “good-for-nothing”.\f* to this day. +\v 14 Hiram sent to the king one hundred twenty talents\f + \fr 9:14 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 120 talents is about 3.6 metric tons\f* of gold. +\p +\v 15 This is the reason of the forced labor which King Solomon conscripted: to build Yahweh’s house, his own house, Millo, Jerusalem’s wall, Hazor, Megiddo, and Gezer. +\v 16 Pharaoh king of Egypt had gone up, taken Gezer, burned it with fire, killed the Canaanites who lived in the city, and given it for a wedding gift to his daughter, Solomon’s wife. +\v 17 Solomon built in the land Gezer, Beth Horon the lower, +\v 18 Baalath, Tamar in the wilderness, +\v 19 all the storage cities that Solomon had, the cities for his chariots, the cities for his horsemen, and that which Solomon desired to build for his pleasure in Jerusalem, and in Lebanon, and in all the land of his dominion. +\v 20 As for all the people who were left of the Amorites, the Hittites, the Perizzites, the Hivites, and the Jebusites, who were not of the children of Israel— +\v 21 their children who were left after them in the land, whom the children of Israel were not able utterly to destroy—of them Solomon raised a levy of bondservants to this day. +\v 22 But of the children of Israel Solomon made no bondservants; but they were the men of war, his servants, his princes, his captains, and rulers of his chariots and of his horsemen. +\v 23 These were the five hundred fifty chief officers who were over Solomon’s work, who ruled over the people who labored in the work. +\p +\v 24 But Pharaoh’s daughter came up out of David’s city to her house which Solomon had built for her. Then he built Millo. +\p +\v 25 Solomon offered burnt offerings and peace offerings on the altar which he built to Yahweh three times per year, burning incense with them on the altar that was before Yahweh. So he finished the house. +\p +\v 26 King Solomon made a fleet of ships in Ezion Geber, which is beside Eloth, on the shore of the Red Sea, in the land of Edom. +\v 27 Hiram sent in the fleet his servants, sailors who had knowledge of the sea, with the servants of Solomon. +\v 28 They came to Ophir, and fetched from there gold, four hundred and twenty talents,\f + \fr 9:28 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 420 talents is about 12.6 metric tons\f* and brought it to King Solomon. +\c 10 +\p +\v 1 When the queen of Sheba heard of the fame of Solomon concerning Yahweh’s name, she came to test him with hard questions. +\v 2 She came to Jerusalem with a very great caravan, with camels that bore spices, very much gold, and precious stones; and when she had come to Solomon, she talked with him about all that was in her heart. +\v 3 Solomon answered all her questions. There wasn’t anything hidden from the king which he didn’t tell her. +\v 4 When the queen of Sheba had seen all the wisdom of Solomon, the house that he had built, +\v 5 the food of his table, the sitting of his servants, the attendance of his officials, their clothing, his cup bearers, and his ascent by which he went up to Yahweh’s house, there was no more spirit in her. +\v 6 She said to the king, “It was a true report that I heard in my own land of your acts and of your wisdom. +\v 7 However, I didn’t believe the words until I came and my eyes had seen it. Behold, not even half was told me! Your wisdom and prosperity exceed the fame which I heard. +\v 8 Happy are your men, happy are these your servants who stand continually before you, who hear your wisdom. +\v 9 Blessed is Yahweh your God, who delighted in you, to set you on the throne of Israel. Because Yahweh loved Israel forever, therefore he made you king, to do justice and righteousness.” +\v 10 She gave the king one hundred twenty talents of gold, and a very great quantity of spices, and precious stones. Never again was there such an abundance of spices as these which the queen of Sheba gave to King Solomon. +\p +\v 11 The fleet of Hiram that brought gold from Ophir also brought in from Ophir great quantities of almug trees\f + \fr 10:11 \ft possibly an Indian sandalwood, with nice grain and a pleasant scent, and good for woodworking\f* and precious stones. +\v 12 The king made of the almug trees pillars for Yahweh’s house and for the king’s house, harps also and stringed instruments for the singers; no such almug trees came or were seen to this day. +\p +\v 13 King Solomon gave to the queen of Sheba all her desire, whatever she asked, in addition to that which Solomon gave her of his royal bounty. So she turned and went to her own land, she and her servants. +\p +\v 14 Now the weight of gold that came to Solomon in one year was six hundred sixty-six talents\f + \fr 10:14 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 666 talents is about 20 metric tons\f* of gold, +\v 15 in addition to that which the traders brought, and the traffic of the merchants, and of all the kings of the mixed people, and of the governors of the country. +\v 16 King Solomon made two hundred bucklers of beaten gold; six hundred shekels\f + \fr 10:16 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 600 shekels is about 6 kilograms or 13.2 pounds or 192 Troy ounces.\f* of gold went to one buckler. +\v 17 He made three hundred shields of beaten gold; three minas\f + \fr 10:17 \ft A mina is about 600 grams or 1.3 U. S. pounds.\f* of gold went to one shield; and the king put them in the House of the Forest of Lebanon. +\v 18 Moreover the king made a great throne of ivory, and overlaid it with the finest gold. +\v 19 There were six steps to the throne, and the top of the throne was round behind; and there were armrests on either side by the place of the seat, and two lions standing beside the armrests. +\v 20 Twelve lions stood there on the one side and on the other on the six steps. Nothing like it was made in any kingdom. +\v 21 All King Solomon’s drinking vessels were of gold, and all the vessels of the House of the Forest of Lebanon were of pure gold. None were of silver, because it was considered of little value in the days of Solomon. +\v 22 For the king had a fleet of ships of Tarshish at sea with Hiram’s fleet. Once every three years the fleet of Tarshish came bringing gold, silver, ivory, apes, and peacocks. +\p +\v 23 So King Solomon exceeded all the kings of the earth in riches and in wisdom. +\v 24 All the earth sought the presence of Solomon to hear his wisdom which God had put in his heart. +\v 25 Year after year, every man brought his tribute, vessels of silver, vessels of gold, clothing, armor, spices, horses, and mules. +\p +\v 26 Solomon gathered together chariots and horsemen. He had one thousand four hundred chariots and twelve thousand horsemen. He kept them in the chariot cities and with the king at Jerusalem. +\v 27 The king made silver as common as stones in Jerusalem, and cedars as common as the sycamore trees that are in the lowland. +\v 28 The horses which Solomon had were brought out of Egypt. The king’s merchants received them in droves, each drove at a price. +\v 29 A chariot was imported from Egypt for six hundred shekels\f + \fr 10:29 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver, and a horse for one hundred fifty shekels; and so they exported them to all the kings of the Hittites and to the kings of Syria. +\c 11 +\p +\v 1 Now King Solomon loved many foreign women, together with the daughter of Pharaoh: women of the Moabites, Ammonites, Edomites, Sidonians, and Hittites, +\v 2 of the nations concerning which Yahweh said to the children of Israel, “You shall not go among them, neither shall they come among you, for surely they will turn away your heart after their gods.” Solomon joined to these in love. +\v 3 He had seven hundred wives, princesses, and three hundred concubines. His wives turned his heart away. +\v 4 When Solomon was old, his wives turned away his heart after other gods; and his heart was not perfect with Yahweh his God, as the heart of David his father was. +\v 5 For Solomon went after Ashtoreth the goddess of the Sidonians, and after Milcom the abomination of the Ammonites. +\v 6 Solomon did that which was evil in Yahweh’s sight, and didn’t go fully after Yahweh, as David his father did. +\v 7 Then Solomon built a high place for Chemosh the abomination of Moab, on the mountain that is before Jerusalem, and for Molech the abomination of the children of Ammon. +\v 8 So he did for all his foreign wives, who burned incense and sacrificed to their gods. +\v 9 Yahweh was angry with Solomon, because his heart was turned away from Yahweh, the God of Israel, who had appeared to him twice, +\v 10 and had commanded him concerning this thing, that he should not go after other gods; but he didn’t keep that which Yahweh commanded. +\v 11 Therefore Yahweh said to Solomon, “Because this is done by you, and you have not kept my covenant and my statutes, which I have commanded you, I will surely tear the kingdom from you, and will give it to your servant. +\v 12 Nevertheless, I will not do it in your days, for David your father’s sake; but I will tear it out of your son’s hand. +\v 13 However, I will not tear away all the kingdom; but I will give one tribe to your son, for David my servant’s sake, and for Jerusalem’s sake which I have chosen.” +\p +\v 14 Yahweh raised up an adversary to Solomon: Hadad the Edomite. He was one of the king’s offspring in Edom. +\v 15 For when David was in Edom, and Joab the captain of the army had gone up to bury the slain, and had struck every male in Edom +\v 16 (for Joab and all Israel remained there six months, until he had cut off every male in Edom), +\v 17 Hadad fled, he and certain Edomites of his father’s servants with him, to go into Egypt, when Hadad was still a little child. +\v 18 They arose out of Midian and came to Paran; and they took men with them out of Paran, and they came to Egypt, to Pharaoh king of Egypt, who gave him a house, and appointed him food, and gave him land. +\v 19 Hadad found great favor in the sight of Pharaoh, so that he gave him as wife the sister of his own wife, the sister of Tahpenes the queen. +\v 20 The sister of Tahpenes bore him Genubath his son, whom Tahpenes weaned in Pharaoh’s house; and Genubath was in Pharaoh’s house among the sons of Pharaoh. +\v 21 When Hadad heard in Egypt that David slept with his fathers, and that Joab the captain of the army was dead, Hadad said to Pharaoh, “Let me depart, that I may go to my own country.” +\p +\v 22 Then Pharaoh said to him, “But what have you lacked with me, that behold, you seek to go to your own country?” +\p He answered, “Nothing, however only let me depart.” +\p +\v 23 God raised up an adversary to him, Rezon the son of Eliada, who had fled from his lord, Hadadezer king of Zobah. +\v 24 He gathered men to himself, and became captain over a troop, when David killed them of Zobah. They went to Damascus and lived there, and reigned in Damascus. +\v 25 He was an adversary to Israel all the days of Solomon, in addition to the mischief of Hadad. He abhorred Israel, and reigned over Syria. +\p +\v 26 Jeroboam the son of Nebat, an Ephraimite of Zeredah, a servant of Solomon, whose mother’s name was Zeruah, a widow, also lifted up his hand against the king. +\v 27 This was the reason why he lifted up his hand against the king: Solomon built Millo, and repaired the breach of his father David’s city. +\v 28 The man Jeroboam was a mighty man of valor; and Solomon saw the young man that he was industrious, and he put him in charge of all the labor of the house of Joseph. +\v 29 At that time, when Jeroboam went out of Jerusalem, the prophet Ahijah the Shilonite found him on the way. Now Ahijah had clad himself with a new garment; and the two of them were alone in the field. +\v 30 Ahijah took the new garment that was on him, and tore it in twelve pieces. +\v 31 He said to Jeroboam, “Take ten pieces; for Yahweh, the God of Israel, says, ‘Behold, I will tear the kingdom out of the hand of Solomon and will give ten tribes to you +\v 32 (but he shall have one tribe, for my servant David’s sake and for Jerusalem’s sake, the city which I have chosen out of all the tribes of Israel), +\v 33 because they have forsaken me, and have worshiped Ashtoreth the goddess of the Sidonians, Chemosh the god of Moab, and Milcom the god of the children of Ammon. They have not walked in my ways, to do that which is right in my eyes, and to keep my statutes and my ordinances, as David his father did. +\p +\v 34 “‘However, I will not take the whole kingdom out of his hand, but I will make him prince all the days of his life for David my servant’s sake whom I chose, who kept my commandments and my statutes, +\v 35 but I will take the kingdom out of his son’s hand and will give it to you, even ten tribes. +\v 36 I will give one tribe to his son, that David my servant may have a lamp always before me in Jerusalem, the city which I have chosen for myself to put my name there. +\v 37 I will take you, and you shall reign according to all that your soul desires, and shall be king over Israel. +\v 38 It shall be, if you will listen to all that I command you, and will walk in my ways, and do that which is right in my eyes, to keep my statutes and my commandments, as David my servant did, that I will be with you, and will build you a sure house, as I built for David, and will give Israel to you. +\v 39 I will afflict the offspring of David for this, but not forever.’” +\p +\v 40 Therefore Solomon sought to kill Jeroboam, but Jeroboam arose and fled into Egypt, to Shishak king of Egypt, and was in Egypt until the death of Solomon. +\p +\v 41 Now the rest of the acts of Solomon, and all that he did, and his wisdom, aren’t they written in the book of the acts of Solomon? +\v 42 The time that Solomon reigned in Jerusalem over all Israel was forty years. +\v 43 Solomon slept with his fathers, and was buried in his father David’s city; and Rehoboam his son reigned in his place. +\c 12 +\p +\v 1 Rehoboam went to Shechem, for all Israel had come to Shechem to make him king. +\v 2 When Jeroboam the son of Nebat heard of it (for he was yet in Egypt, where he had fled from the presence of King Solomon, and Jeroboam lived in Egypt; +\v 3 and they sent and called him), Jeroboam and all the assembly of Israel came, and spoke to Rehoboam, saying, +\v 4 “Your father made our yoke difficult. Now therefore make the hard service of your father, and his heavy yoke which he put on us, lighter, and we will serve you.” +\p +\v 5 He said to them, “Depart for three days, then come back to me.” +\p So the people departed. +\p +\v 6 King Rehoboam took counsel with the old men who had stood before Solomon his father while he yet lived, saying, “What counsel do you give me to answer these people?” +\p +\v 7 They replied, “If you will be a servant to this people today, and will serve them, and answer them with good words, then they will be your servants forever.” +\p +\v 8 But he abandoned the counsel of the old men which they had given him, and took counsel with the young men who had grown up with him, who stood before him. +\v 9 He said to them, “What counsel do you give, that we may answer these people who have spoken to me, saying, ‘Make the yoke that your father put on us lighter?’” +\p +\v 10 The young men who had grown up with him said to him, “Tell these people who spoke to you, saying, ‘Your father made our yoke heavy, but make it lighter to us’— tell them, ‘My little finger is thicker than my father’s waist. +\v 11 Now my father burdened you with a heavy yoke, but I will add to your yoke. My father chastised you with whips, but I will chastise you with scorpions.’” +\p +\v 12 So Jeroboam and all the people came to Rehoboam the third day, as the king asked, saying, “Come to me again the third day.” +\v 13 The king answered the people roughly, and abandoned the counsel of the old men which they had given him, +\v 14 and spoke to them according to the counsel of the young men, saying, “My father made your yoke heavy, but I will add to your yoke. My father chastised you with whips, but I will chastise you with scorpions.” +\p +\v 15 So the king didn’t listen to the people; for it was a thing brought about from Yahweh, that he might establish his word, which Yahweh spoke by Ahijah the Shilonite to Jeroboam the son of Nebat. +\v 16 When all Israel saw that the king didn’t listen to them, the people answered the king, saying, “What portion have we in David? We don’t have an inheritance in the son of Jesse. To your tents, Israel! Now see to your own house, David.” So Israel departed to their tents. +\p +\v 17 But as for the children of Israel who lived in the cities of Judah, Rehoboam reigned over them. +\v 18 Then King Rehoboam sent Adoram, who was over the men subject to forced labor; and all Israel stoned him to death with stones. King Rehoboam hurried to get himself up to his chariot, to flee to Jerusalem. +\v 19 So Israel rebelled against David’s house to this day. +\p +\v 20 When all Israel heard that Jeroboam had returned, they sent and called him to the congregation, and made him king over all Israel. There was no one who followed David’s house, except for the tribe of Judah only. +\p +\v 21 When Rehoboam had come to Jerusalem, he assembled all the house of Judah and the tribe of Benjamin, a hundred and eighty thousand chosen men who were warriors, to fight against the house of Israel, to bring the kingdom again to Rehoboam the son of Solomon. +\v 22 But the word of God came to Shemaiah the man of God, saying, +\v 23 “Speak to Rehoboam the son of Solomon, king of Judah, and to all the house of Judah and Benjamin, and to the rest of the people, saying, +\v 24 ‘Yahweh says, “You shall not go up or fight against your brothers, the children of Israel. Everyone return to his house; for this thing is from me.”’” So they listened to Yahweh’s word, and returned and went their way, according to Yahweh’s word. +\p +\v 25 Then Jeroboam built Shechem in the hill country of Ephraim, and lived in it; and he went out from there and built Penuel. +\v 26 Jeroboam said in his heart, “Now the kingdom will return to David’s house. +\v 27 If this people goes up to offer sacrifices in Yahweh’s house at Jerusalem, then the heart of this people will turn again to their lord, even to Rehoboam king of Judah; and they will kill me, and return to Rehoboam king of Judah.” +\v 28 So the king took counsel, and made two calves of gold; and he said to them, “It is too much for you to go up to Jerusalem. Look and behold your gods, Israel, which brought you up out of the land of Egypt!” +\v 29 He set the one in Bethel, and the other he put in Dan. +\v 30 This thing became a sin, for the people went even as far as Dan to worship before the one there. +\v 31 He made houses of high places, and made priests from among all the people, who were not of the sons of Levi. +\v 32 Jeroboam ordained a feast in the eighth month, on the fifteenth day of the month, like the feast that is in Judah, and he went up to the altar. He did so in Bethel, sacrificing to the calves that he had made, and he placed in Bethel the priests of the high places that he had made. +\v 33 He went up to the altar which he had made in Bethel on the fifteenth day in the eighth month, even in the month which he had devised of his own heart; and he ordained a feast for the children of Israel, and went up to the altar to burn incense. +\c 13 +\p +\v 1 Behold, a man of God came out of Judah by Yahweh’s word to Bethel; and Jeroboam was standing by the altar to burn incense. +\v 2 He cried against the altar by Yahweh’s word, and said, “Altar! Altar! Yahweh says: ‘Behold, a son will be born to David’s house, Josiah by name. On you he will sacrifice the priests of the high places who burn incense on you, and they will burn men’s bones on you.’” +\v 3 He gave a sign the same day, saying, “This is the sign which Yahweh has spoken: Behold, the altar will be split apart, and the ashes that are on it will be poured out.” +\p +\v 4 When the king heard the saying of the man of God, which he cried against the altar in Bethel, Jeroboam put out his hand from the altar, saying, “Seize him!” His hand, which he put out against him, dried up, so that he could not draw it back again to himself. +\v 5 The altar was also split apart, and the ashes poured out from the altar, according to the sign which the man of God had given by Yahweh’s word. +\v 6 The king answered the man of God, “Now intercede for the favor of Yahweh your God, and pray for me, that my hand may be restored me again.” +\p The man of God interceded with Yahweh, and the king’s hand was restored to him again, and became as it was before. +\p +\v 7 The king said to the man of God, “Come home with me and refresh yourself, and I will give you a reward.” +\p +\v 8 The man of God said to the king, “Even if you gave me half of your house, I would not go in with you, neither would I eat bread nor drink water in this place; +\v 9 for so was it commanded me by Yahweh’s word, saying, ‘You shall eat no bread, drink no water, and don’t return by the way that you came.’” +\v 10 So he went another way, and didn’t return by the way that he came to Bethel. +\p +\v 11 Now an old prophet lived in Bethel, and one of his sons came and told him all the works that the man of God had done that day in Bethel. They also told their father the words which he had spoken to the king. +\p +\v 12 Their father said to them, “Which way did he go?” Now his sons had seen which way the man of God went, who came from Judah. +\v 13 He said to his sons, “Saddle the donkey for me.” So they saddled the donkey for him; and he rode on it. +\v 14 He went after the man of God, and found him sitting under an oak. He said to him, “Are you the man of God who came from Judah?” +\p He said, “I am.” +\p +\v 15 Then he said to him, “Come home with me and eat bread.” +\p +\v 16 He said, “I may not return with you, nor go in with you. I will not eat bread or drink water with you in this place. +\v 17 For it was said to me by Yahweh’s word, ‘You shall eat no bread or drink water there, and don’t turn again to go by the way that you came.’” +\p +\v 18 He said to him, “I also am a prophet as you are; and an angel spoke to me by Yahweh’s word, saying, ‘Bring him back with you into your house, that he may eat bread and drink water.’” He lied to him. +\p +\v 19 So he went back with him, ate bread in his house, and drank water. +\v 20 As they sat at the table, Yahweh’s word came to the prophet who brought him back; +\v 21 and he cried out to the man of God who came from Judah, saying, “Yahweh says, ‘Because you have been disobedient to Yahweh’s word, and have not kept the commandment which Yahweh your God commanded you, +\v 22 but came back, and have eaten bread and drank water in the place of which he said to you, “Eat no bread, and drink no water,” your body will not come to the tomb of your fathers.’” +\p +\v 23 After he had eaten bread and after he drank, he saddled the donkey for the prophet whom he had brought back. +\v 24 When he had gone, a lion met him by the way and killed him. His body was thrown on the path, and the donkey stood by it. The lion also stood by the body. +\v 25 Behold, men passed by and saw the body thrown on the path, and the lion standing by the body; and they came and told it in the city where the old prophet lived. +\v 26 When the prophet who brought him back from the way heard of it, he said, “It is the man of God who was disobedient to Yahweh’s word. Therefore Yahweh has delivered him to the lion, which has mauled him and slain him, according to Yahweh’s word which he spoke to him.” +\v 27 He said to his sons, saying, “Saddle the donkey for me,” and they saddled it. +\v 28 He went and found his body thrown on the path, and the donkey and the lion standing by the body. The lion had not eaten the body nor mauled the donkey. +\v 29 The prophet took up the body of the man of God, and laid it on the donkey, and brought it back. He came to the city of the old prophet to mourn, and to bury him. +\v 30 He laid his body in his own grave; and they mourned over him, saying, “Alas, my brother!” +\p +\v 31 After he had buried him, he spoke to his sons, saying, “When I am dead, bury me in the tomb in which the man of God is buried. Lay my bones beside his bones. +\v 32 For the saying which he cried by Yahweh’s word against the altar in Bethel, and against all the houses of the high places which are in the cities of Samaria, will surely happen.” +\p +\v 33 After this thing, Jeroboam didn’t turn from his evil way, but again made priests of the high places from among all the people. Whoever wanted to, he consecrated him, that there might be priests of the high places. +\v 34 This thing became sin to the house of Jeroboam, even to cut it off and to destroy it from off the surface of the earth. +\c 14 +\p +\v 1 At that time Abijah the son of Jeroboam became sick. +\v 2 Jeroboam said to his wife, “Please get up and disguise yourself, so that you won’t be recognized as Jeroboam’s wife. Go to Shiloh. Behold, Ahijah the prophet is there, who said that I would be king over this people. +\v 3 Take with you ten loaves of bread, some cakes, and a jar of honey, and go to him. He will tell you what will become of the child.” +\p +\v 4 Jeroboam’s wife did so, and arose and went to Shiloh, and came to Ahijah’s house. Now Ahijah could not see, for his eyes were set by reason of his age. +\v 5 Yahweh said to Ahijah, “Behold, Jeroboam’s wife is coming to inquire of you concerning her son, for he is sick. Tell her such and such; for it will be, when she comes in, that she will pretend to be another woman.” +\p +\v 6 So when Ahijah heard the sound of her feet as she came in at the door, he said, “Come in, Jeroboam’s wife! Why do you pretend to be another? For I am sent to you with heavy news. +\v 7 Go, tell Jeroboam, ‘Yahweh, the God of Israel, says: “Because I exalted you from among the people, and made you prince over my people Israel, +\v 8 and tore the kingdom away from David’s house, and gave it you; and yet you have not been as my servant David, who kept my commandments, and who followed me with all his heart, to do that only which was right in my eyes, +\v 9 but have done evil above all who were before you, and have gone and made for yourself other gods, molten images, to provoke me to anger, and have cast me behind your back, +\v 10 therefore, behold, I will bring evil on the house of Jeroboam, and will cut off from Jeroboam everyone who urinates on a wall,\f + \fr 14:10 \ft or, male\f* he who is shut up and he who is left at large in Israel, and will utterly sweep away the house of Jeroboam, as a man sweeps away dung until it is all gone. +\v 11 The dogs will eat he who belongs to Jeroboam who dies in the city; and the birds of the sky will eat he who dies in the field, for Yahweh has spoken it.”’ +\v 12 Arise therefore, and go to your house. When your feet enter into the city, the child will die. +\v 13 All Israel will mourn for him and bury him; for he only of Jeroboam will come to the grave, because in him there is found some good thing toward Yahweh, the God of Israel, in the house of Jeroboam. +\v 14 Moreover Yahweh will raise up a king for himself over Israel who will cut off the house of Jeroboam. This is the day! What? Even now. +\v 15 For Yahweh will strike Israel, as a reed is shaken in the water; and he will root up Israel out of this good land which he gave to their fathers, and will scatter them beyond the River,\f + \fr 14:15 \ft That is, the Euphrates.\f* because they have made their Asherah poles, provoking Yahweh to anger. +\v 16 He will give Israel up because of the sins of Jeroboam, which he has sinned, and with which he has made Israel to sin.” +\p +\v 17 Jeroboam’s wife arose and departed, and came to Tirzah. As she came to the threshold of the house, the child died. +\v 18 All Israel buried him and mourned for him, according to Yahweh’s word, which he spoke by his servant Ahijah the prophet. +\p +\v 19 The rest of the acts of Jeroboam, how he fought and how he reigned, behold, they are written in the book of the chronicles of the kings of Israel. +\v 20 The days which Jeroboam reigned were twenty two years; then he slept with his fathers, and Nadab his son reigned in his place. +\p +\v 21 Rehoboam the son of Solomon reigned in Judah. Rehoboam was forty-one years old when he began to reign, and he reigned seventeen years in Jerusalem, the city which Yahweh had chosen out of all the tribes of Israel, to put his name there. His mother’s name was Naamah the Ammonitess. +\v 22 Judah did that which was evil in Yahweh’s sight, and they provoked him to jealousy with their sins which they committed, above all that their fathers had done. +\v 23 For they also built for themselves high places, sacred pillars, and Asherah poles on every high hill and under every green tree. +\v 24 There were also sodomites in the land. They did according to all the abominations of the nations which Yahweh drove out before the children of Israel. +\p +\v 25 In the fifth year of King Rehoboam, Shishak king of Egypt came up against Jerusalem; +\v 26 and he took away the treasures of Yahweh’s house and the treasures of the king’s house. He even took away all of it, including all the gold shields which Solomon had made. +\v 27 King Rehoboam made shields of bronze in their place, and committed them to the hands of the captains of the guard, who kept the door of the king’s house. +\v 28 It was so, that as often as the king went into Yahweh’s house, the guard bore them, and brought them back into the guard room. +\p +\v 29 Now the rest of the acts of Rehoboam, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 30 There was war between Rehoboam and Jeroboam continually. +\v 31 Rehoboam slept with his fathers, and was buried with his fathers in David’s city. His mother’s name was Naamah the Ammonitess. Abijam his son reigned in his place. +\c 15 +\p +\v 1 Now in the eighteenth year of King Jeroboam the son of Nebat, Abijam began to reign over Judah. +\v 2 He reigned three years in Jerusalem. His mother’s name was Maacah the daughter of Abishalom. +\v 3 He walked in all the sins of his father, which he had done before him; and his heart was not perfect with Yahweh his God, as the heart of David his father. +\v 4 Nevertheless for David’s sake, Yahweh his God gave him a lamp in Jerusalem, to set up his son after him and to establish Jerusalem; +\v 5 because David did that which was right in Yahweh’s eyes, and didn’t turn away from anything that he commanded him all the days of his life, except only in the matter of Uriah the Hittite. +\v 6 Now there was war between Rehoboam and Jeroboam all the days of his life. +\v 7 The rest of the acts of Abijam, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? There was war between Abijam and Jeroboam. +\v 8 Abijam slept with his fathers, and they buried him in David’s city; and Asa his son reigned in his place. +\p +\v 9 In the twentieth year of Jeroboam king of Israel, Asa began to reign over Judah. +\v 10 He reigned forty-one years in Jerusalem. His mother’s name was Maacah the daughter of Abishalom. +\v 11 Asa did that which was right in Yahweh’s eyes, as David his father did. +\v 12 He put away the sodomites out of the land, and removed all the idols that his fathers had made. +\v 13 He also removed Maacah his mother from being queen, because she had made an abominable image for an Asherah. Asa cut down her image and burned it at the brook Kidron. +\v 14 But the high places were not taken away. Nevertheless the heart of Asa was perfect with Yahweh all his days. +\v 15 He brought into Yahweh’s house the things that his father had dedicated, and the things that he himself had dedicated: silver, gold, and utensils. +\p +\v 16 There was war between Asa and Baasha king of Israel all their days. +\v 17 Baasha king of Israel went up against Judah, and built Ramah, that he might not allow anyone to go out or come in to Asa king of Judah. +\v 18 Then Asa took all the silver and the gold that was left in the treasures of Yahweh’s house, and the treasures of the king’s house, and delivered it into the hand of his servants. Then King Asa sent them to Ben Hadad, the son of Tabrimmon, the son of Hezion, king of Syria, who lived at Damascus, saying, +\v 19 “Let there be a treaty between me and you, like that between my father and your father. Behold, I have sent to you a present of silver and gold. Go, break your treaty with Baasha king of Israel, that he may depart from me.” +\p +\v 20 Ben Hadad listened to King Asa, and sent the captains of his armies against the cities of Israel, and struck Ijon, and Dan, and Abel Beth Maacah, and all Chinneroth, with all the land of Naphtali. +\v 21 When Baasha heard of it, he stopped building Ramah, and lived in Tirzah. +\v 22 Then King Asa made a proclamation to all Judah. No one was exempted. They carried away the stones of Ramah, and its timber, with which Baasha had built; and King Asa used it to build Geba of Benjamin, and Mizpah. +\v 23 Now the rest of all the acts of Asa, and all his might, and all that he did, and the cities which he built, aren’t they written in the book of the chronicles of the kings of Judah? But in the time of his old age he was diseased in his feet. +\v 24 Asa slept with his fathers, and was buried with his fathers in his father David’s city; and Jehoshaphat his son reigned in his place. +\p +\v 25 Nadab the son of Jeroboam began to reign over Israel in the second year of Asa king of Judah; and he reigned over Israel two years. +\v 26 He did that which was evil in Yahweh’s sight, and walked in the way of his father, and in his sin with which he made Israel to sin. +\v 27 Baasha the son of Ahijah, of the house of Issachar, conspired against him; and Baasha struck him at Gibbethon, which belonged to the Philistines; for Nadab and all Israel were besieging Gibbethon. +\v 28 Even in the third year of Asa king of Judah, Baasha killed him and reigned in his place. +\v 29 As soon as he was king, he struck all the house of Jeroboam. He didn’t leave to Jeroboam any who breathed, until he had destroyed him, according to the saying of Yahweh, which he spoke by his servant Ahijah the Shilonite; +\v 30 for the sins of Jeroboam which he sinned, and with which he made Israel to sin, because of his provocation with which he provoked Yahweh, the God of Israel, to anger. +\p +\v 31 Now the rest of the acts of Nadab, and all that he did, aren’t they written in the book of the chronicles of the kings of Israel? +\v 32 There was war between Asa and Baasha king of Israel all their days. +\p +\v 33 In the third year of Asa king of Judah, Baasha the son of Ahijah began to reign over all Israel in Tirzah for twenty-four years. +\v 34 He did that which was evil in Yahweh’s sight, and walked in the way of Jeroboam, and in his sin with which he made Israel to sin. +\c 16 +\p +\v 1 Yahweh’s word came to Jehu the son of Hanani against Baasha, saying, +\v 2 “Because I exalted you out of the dust and made you prince over my people Israel, and you have walked in the way of Jeroboam and have made my people Israel to sin, to provoke me to anger with their sins, +\v 3 behold, I will utterly sweep away Baasha and his house; and I will make your house like the house of Jeroboam the son of Nebat. +\v 4 The dogs will eat Baasha’s descendants who die in the city; and he who dies of his in the field, the birds of the sky will eat.” +\p +\v 5 Now the rest of the acts of Baasha, and what he did, and his might, aren’t they written in the book of the chronicles of the kings of Israel? +\v 6 Baasha slept with his fathers, and was buried in Tirzah; and Elah his son reigned in his place. +\p +\v 7 Moreover Yahweh’s word came by the prophet Jehu the son of Hanani against Baasha and against his house, both because of all the evil that he did in Yahweh’s sight, to provoke him to anger with the work of his hands, in being like the house of Jeroboam, and because he struck him. +\p +\v 8 In the twenty-sixth year of Asa king of Judah, Elah the son of Baasha began to reign over Israel in Tirzah for two years. +\v 9 His servant Zimri, captain of half his chariots, conspired against him. Now he was in Tirzah, drinking himself drunk in the house of Arza, who was over the household in Tirzah; +\v 10 and Zimri went in and struck him and killed him in the twenty-seventh year of Asa king of Judah, and reigned in his place. +\p +\v 11 When he began to reign, as soon as he sat on his throne, he attacked all the house of Baasha. He didn’t leave him a single one who urinates on a wall\f + \fr 16:11 \ft or, male\f* among his relatives or his friends. +\v 12 Thus Zimri destroyed all the house of Baasha, according to Yahweh’s word which he spoke against Baasha by Jehu the prophet, +\v 13 for all the sins of Baasha, and the sins of Elah his son, which they sinned and with which they made Israel to sin, to provoke Yahweh, the God of Israel, to anger with their vanities. +\v 14 Now the rest of the acts of Elah, and all that he did, aren’t they written in the book of the chronicles of the kings of Israel? +\p +\v 15 In the twenty-seventh year of Asa king of Judah, Zimri reigned seven days in Tirzah. Now the people were encamped against Gibbethon, which belonged to the Philistines. +\v 16 The people who were encamped heard that Zimri had conspired, and had also killed the king. Therefore all Israel made Omri, the captain of the army, king over Israel that day in the camp. +\v 17 Omri went up from Gibbethon, and all Israel with him, and they besieged Tirzah. +\v 18 When Zimri saw that the city was taken, he went into the fortified part of the king’s house and burned the king’s house over him with fire, and died, +\v 19 for his sins which he sinned in doing that which was evil in Yahweh’s sight, in walking in the way of Jeroboam, and in his sin which he did to make Israel to sin. +\v 20 Now the rest of the acts of Zimri, and his treason that he committed, aren’t they written in the book of the chronicles of the kings of Israel? +\p +\v 21 Then the people of Israel were divided into two parts: half of the people followed Tibni the son of Ginath, to make him king, and half followed Omri. +\v 22 But the people who followed Omri prevailed against the people who followed Tibni the son of Ginath; so Tibni died, and Omri reigned. +\v 23 In the thirty-first year of Asa king of Judah, Omri began to reign over Israel for twelve years. He reigned six years in Tirzah. +\v 24 He bought the hill Samaria of Shemer for two talents\f + \fr 16:24 \ft A talent is about 30 kilograms or 66 pounds.\f* of silver; and he built on the hill, and called the name of the city which he built, Samaria, after the name of Shemer, the owner of the hill. +\v 25 Omri did that which was evil in Yahweh’s sight, and dealt wickedly above all who were before him. +\v 26 For he walked in all the way of Jeroboam the son of Nebat, and in his sins with which he made Israel to sin, to provoke Yahweh, the God of Israel, to anger with their vanities. +\v 27 Now the rest of the acts of Omri which he did, and his might that he showed, aren’t they written in the book of the chronicles of the kings of Israel? +\v 28 So Omri slept with his fathers, and was buried in Samaria; and Ahab his son reigned in his place. +\p +\v 29 In the thirty-eighth year of Asa king of Judah, Ahab the son of Omri began to reign over Israel. Ahab the son of Omri reigned over Israel in Samaria twenty-two years. +\v 30 Ahab the son of Omri did that which was evil in Yahweh’s sight above all that were before him. +\v 31 As if it had been a light thing for him to walk in the sins of Jeroboam the son of Nebat, he took as wife Jezebel the daughter of Ethbaal king of the Sidonians, and went and served Baal and worshiped him. +\v 32 He raised up an altar for Baal in the house of Baal, which he had built in Samaria. +\v 33 Ahab made the Asherah; and Ahab did more yet to provoke Yahweh, the God of Israel, to anger than all the kings of Israel who were before him. +\v 34 In his days Hiel the Bethelite built Jericho. He laid its foundation with the loss of Abiram his firstborn, and set up its gates with the loss of his youngest son Segub, according to Yahweh’s word, which he spoke by Joshua the son of Nun. +\c 17 +\p +\v 1 Elijah the Tishbite, who was one of the settlers of Gilead, said to Ahab, “As Yahweh, the God of Israel, lives, before whom I stand, there shall not be dew nor rain these years, but according to my word.” +\p +\v 2 Then Yahweh’s word came to him, saying, +\v 3 “Go away from here, turn eastward, and hide yourself by the brook Cherith, that is before the Jordan. +\v 4 You shall drink from the brook. I have commanded the ravens to feed you there.” +\v 5 So he went and did according to Yahweh’s word, for he went and lived by the brook Cherith that is before the Jordan. +\v 6 The ravens brought him bread and meat in the morning, and bread and meat in the evening; and he drank from the brook. +\v 7 After a while, the brook dried up, because there was no rain in the land. +\p +\v 8 Yahweh’s word came to him, saying, +\v 9 “Arise, go to Zarephath, which belongs to Sidon, and stay there. Behold, I have commanded a widow there to sustain you.” +\p +\v 10 So he arose and went to Zarephath; and when he came to the gate of the city, behold, a widow was there gathering sticks. He called to her and said, “Please get me a little water in a jar, that I may drink.” +\p +\v 11 As she was going to get it, he called to her and said, “Please bring me a morsel of bread in your hand.” +\p +\v 12 She said, “As Yahweh your God lives, I don’t have anything baked, but only a handful of meal in a jar and a little oil in a jar. Behold, I am gathering two sticks, that I may go in and bake it for me and my son, that we may eat it, and die.” +\p +\v 13 Elijah said to her, “Don’t be afraid. Go and do as you have said; but make me a little cake from it first, and bring it out to me, and afterward make some for you and for your son. +\v 14 For Yahweh, the God of Israel, says, ‘The jar of meal will not run out, and the jar of oil will not fail, until the day that Yahweh sends rain on the earth.’” +\p +\v 15 She went and did according to the saying of Elijah; and she, he, and her household ate many days. +\v 16 The jar of meal didn’t run out and the jar of oil didn’t fail, according to Yahweh’s word, which he spoke by Elijah. +\p +\v 17 After these things, the son of the woman, the mistress of the house, became sick; and his sickness was so severe that there was no breath left in him. +\v 18 She said to Elijah, “What have I to do with you, you man of God? You have come to me to bring my sin to memory, and to kill my son!” +\p +\v 19 He said to her, “Give me your son.” He took him out of her bosom, and carried him up into the room where he stayed, and laid him on his own bed. +\v 20 He cried to Yahweh and said, “Yahweh my God, have you also brought evil on the widow with whom I am staying, by killing her son?” +\p +\v 21 He stretched himself on the child three times, and cried to Yahweh and said, “Yahweh my God, please let this child’s soul come into him again.” +\p +\v 22 Yahweh listened to the voice of Elijah; and the soul of the child came into him again, and he revived. +\v 23 Elijah took the child and brought him down out of the room into the house, and delivered him to his mother; and Elijah said, “Behold, your son lives.” +\p +\v 24 The woman said to Elijah, “Now I know that you are a man of God, and that Yahweh’s word in your mouth is truth.” +\c 18 +\p +\v 1 After many days, Yahweh’s word came to Elijah, in the third year, saying, “Go, show yourself to Ahab; and I will send rain on the earth.” +\p +\v 2 Elijah went to show himself to Ahab. The famine was severe in Samaria. +\v 3 Ahab called Obadiah, who was over the household. (Now Obadiah feared Yahweh greatly; +\v 4 for when Jezebel cut off Yahweh’s prophets, Obadiah took one hundred prophets, and hid them fifty to a cave, and fed them with bread and water.) +\v 5 Ahab said to Obadiah, “Go through the land, to all the springs of water, and to all the brooks. Perhaps we may find grass and save the horses and mules alive, that we not lose all the animals.” +\p +\v 6 So they divided the land between them to pass throughout it. Ahab went one way by himself, and Obadiah went another way by himself. +\v 7 As Obadiah was on the way, behold, Elijah met him. He recognized him, and fell on his face, and said, “Is it you, my lord Elijah?” +\p +\v 8 He answered him, “It is I. Go, tell your lord, ‘Behold, Elijah is here!’” +\p +\v 9 He said, “How have I sinned, that you would deliver your servant into the hand of Ahab, to kill me? +\v 10 As Yahweh your God lives, there is no nation or kingdom where my lord has not sent to seek you. When they said, ‘He is not here,’ he took an oath of the kingdom and nation that they didn’t find you. +\v 11 Now you say, ‘Go, tell your lord, “Behold, Elijah is here.”’ +\v 12 It will happen, as soon as I leave you, that Yahweh’s Spirit will carry you I don’t know where; and so when I come and tell Ahab, and he can’t find you, he will kill me. But I, your servant, have feared Yahweh from my youth. +\v 13 Wasn’t it told my lord what I did when Jezebel killed Yahweh’s prophets, how I hid one hundred men of Yahweh’s prophets with fifty to a cave, and fed them with bread and water? +\v 14 Now you say, ‘Go, tell your lord, “Behold, Elijah is here”.’ He will kill me.” +\p +\v 15 Elijah said, “As Yahweh of Armies lives, before whom I stand, I will surely show myself to him today.” +\v 16 So Obadiah went to meet Ahab, and told him; and Ahab went to meet Elijah. +\p +\v 17 When Ahab saw Elijah, Ahab said to him, “Is that you, you troubler of Israel?” +\p +\v 18 He answered, “I have not troubled Israel, but you and your father’s house, in that you have forsaken Yahweh’s commandments and you have followed the Baals. +\v 19 Now therefore send, and gather to me all Israel to Mount Carmel, and four hundred fifty of the prophets of Baal, and four hundred of the prophets of the Asherah, who eat at Jezebel’s table.” +\p +\v 20 So Ahab sent to all the children of Israel, and gathered the prophets together to Mount Carmel. +\v 21 Elijah came near to all the people, and said, “How long will you waver between the two sides? If Yahweh is God, follow him; but if Baal, then follow him.” +\p The people didn’t say a word. +\p +\v 22 Then Elijah said to the people, “I, even I only, am left as a prophet of Yahweh; but Baal’s prophets are four hundred fifty men. +\v 23 Let them therefore give us two bulls; and let them choose one bull for themselves, and cut it in pieces, and lay it on the wood, and put no fire under; and I will dress the other bull, and lay it on the wood, and put no fire under it. +\v 24 You call on the name of your god, and I will call on Yahweh’s name. The God who answers by fire, let him be God.” +\p All the people answered, “What you say is good.” +\p +\v 25 Elijah said to the prophets of Baal, “Choose one bull for yourselves, and dress it first, for you are many; and call on the name of your god, but put no fire under it.” +\p +\v 26 They took the bull which was given them, and they dressed it, and called on the name of Baal from morning even until noon, saying, “Baal, hear us!” But there was no voice, and nobody answered. They leaped about the altar which was made. +\p +\v 27 At noon, Elijah mocked them, and said, “Cry aloud, for he is a god. Either he is deep in thought, or he has gone somewhere, or he is on a journey, or perhaps he sleeps and must be awakened.” +\p +\v 28 They cried aloud, and cut themselves in their way with knives and lances until the blood gushed out on them. +\v 29 When midday was past, they prophesied until the time of the evening offering; but there was no voice, no answer, and nobody paid attention. +\p +\v 30 Elijah said to all the people, “Come near to me!”; and all the people came near to him. He repaired Yahweh’s altar that had been thrown down. +\v 31 Elijah took twelve stones, according to the number of the tribes of the sons of Jacob, to whom Yahweh’s word came, saying, “Israel shall be your name.” +\v 32 With the stones he built an altar in Yahweh’s name. He made a trench around the altar large enough to contain two seahs\f + \fr 18:32 \ft 1 seah is about 7 liters or 1.9 gallons or 0.8 pecks\f* of seed. +\v 33 He put the wood in order, and cut the bull in pieces and laid it on the wood. He said, “Fill four jars with water, and pour it on the burnt offering and on the wood.” +\v 34 He said, “Do it a second time;” and they did it the second time. He said, “Do it a third time;” and they did it the third time. +\v 35 The water ran around the altar; and he also filled the trench with water. +\p +\v 36 At the time of the evening offering, Elijah the prophet came near and said, “Yahweh, the God of Abraham, of Isaac, and of Israel, let it be known today that you are God in Israel and that I am your servant, and that I have done all these things at your word. +\v 37 Hear me, Yahweh, hear me, that this people may know that you, Yahweh, are God, and that you have turned their heart back again.” +\p +\v 38 Then Yahweh’s fire fell and consumed the burnt offering, the wood, the stones, and the dust; and it licked up the water that was in the trench. +\v 39 When all the people saw it, they fell on their faces. They said, “Yahweh, he is God! Yahweh, he is God!” +\p +\v 40 Elijah said to them, “Seize the prophets of Baal! Don’t let one of them escape!” +\p They seized them; and Elijah brought them down to the brook Kishon, and killed them there. +\p +\v 41 Elijah said to Ahab, “Get up, eat and drink; for there is the sound of abundance of rain.” +\p +\v 42 So Ahab went up to eat and to drink. Elijah went up to the top of Carmel; and he bowed himself down on the earth, and put his face between his knees. +\v 43 He said to his servant, “Go up now and look toward the sea.” +\p He went up and looked, then said, “There is nothing.” +\p He said, “Go again” seven times. +\p +\v 44 On the seventh time, he said, “Behold, a small cloud, like a man’s hand, is rising out of the sea.” +\p He said, “Go up, tell Ahab, ‘Get ready and go down, so that the rain doesn’t stop you.’” +\p +\v 45 In a little while, the sky grew black with clouds and wind, and there was a great rain. Ahab rode, and went to Jezreel. +\v 46 Yahweh’s hand was on Elijah; and he tucked his cloak into his belt and ran before Ahab to the entrance of Jezreel. +\c 19 +\p +\v 1 Ahab told Jezebel all that Elijah had done, and how he had killed all the prophets with the sword. +\v 2 Then Jezebel sent a messenger to Elijah, saying, “So let the gods do to me, and more also, if I don’t make your life as the life of one of them by tomorrow about this time!” +\p +\v 3 When he saw that, he arose and ran for his life, and came to Beersheba, which belongs to Judah, and left his servant there. +\v 4 But he himself went a day’s journey into the wilderness, and came and sat down under a juniper tree. Then he requested for himself that he might die, and said, “It is enough. Now, O Yahweh, take away my life; for I am not better than my fathers.” +\p +\v 5 He lay down and slept under a juniper tree; and behold, an angel touched him, and said to him, “Arise and eat!” +\p +\v 6 He looked, and behold, there was at his head a cake baked on the coals, and a jar of water. He ate and drank, and lay down again. +\v 7 Yahweh’s angel came again the second time, and touched him, and said, “Arise and eat, because the journey is too great for you.” +\p +\v 8 He arose, and ate and drank, and went in the strength of that food forty days and forty nights to Horeb, God’s Mountain. +\v 9 He came to a cave there, and camped there; and behold, Yahweh’s word came to him, and he said to him, “What are you doing here, Elijah?” +\p +\v 10 He said, “I have been very jealous for Yahweh, the God of Armies; for the children of Israel have forsaken your covenant, thrown down your altars, and killed your prophets with the sword. I, even I only, am left; and they seek my life, to take it away.” +\p +\v 11 He said, “Go out and stand on the mountain before Yahweh.” +\p Behold, Yahweh passed by, and a great and strong wind tore the mountains and broke in pieces the rocks before Yahweh; but Yahweh was not in the wind. After the wind there was an earthquake; but Yahweh was not in the earthquake. +\v 12 After the earthquake a fire passed; but Yahweh was not in the fire. After the fire, there was a still small voice. +\v 13 When Elijah heard it, he wrapped his face in his mantle, went out, and stood in the entrance of the cave. Behold, a voice came to him, and said, “What are you doing here, Elijah?” +\p +\v 14 He said, “I have been very jealous for Yahweh, the God of Armies; for the children of Israel have forsaken your covenant, thrown down your altars, and killed your prophets with the sword. I, even I only, am left; and they seek my life, to take it away.” +\p +\v 15 Yahweh said to him, “Go, return on your way to the wilderness of Damascus. When you arrive, anoint Hazael to be king over Syria. +\v 16 Anoint Jehu the son of Nimshi to be king over Israel; and anoint Elisha the son of Shaphat of Abel Meholah to be prophet in your place. +\v 17 He who escapes from the sword of Hazael, Jehu will kill; and he who escapes from the sword of Jehu, Elisha will kill. +\v 18 Yet I reserved seven thousand in Israel, all the knees of which have not bowed to Baal, and every mouth which has not kissed him.” +\p +\v 19 So he departed from there and found Elisha the son of Shaphat, who was plowing with twelve yoke of oxen before him, and he with the twelfth. Elijah went over to him and put his mantle on him. +\v 20 Elisha left the oxen and ran after Elijah, and said, “Let me please kiss my father and my mother, and then I will follow you.” +\p He said to him, “Go back again; for what have I done to you?” +\p +\v 21 He returned from following him, and took the yoke of oxen, killed them, and boiled their meat with the oxen’s equipment, and gave to the people; and they ate. Then he arose, and went after Elijah, and served him. +\c 20 +\p +\v 1 Ben Hadad the king of Syria gathered all his army together; and there were thirty-two kings with him, with horses and chariots. He went up and besieged Samaria, and fought against it. +\v 2 He sent messengers into the city to Ahab king of Israel and said to him, “Ben Hadad says, +\v 3 ‘Your silver and your gold are mine. Your wives also and your children, even the best, are mine.’” +\p +\v 4 The king of Israel answered, “It is according to your saying, my lord, O king. I am yours, and all that I have.” +\p +\v 5 The messengers came again and said, “Ben Hadad says, ‘I sent indeed to you, saying, “You shall deliver me your silver, your gold, your wives, and your children; +\v 6 but I will send my servants to you tomorrow about this time, and they will search your house and the houses of your servants. Whatever is pleasant in your eyes, they will put it in their hand, and take it away.”’” +\p +\v 7 Then the king of Israel called all the elders of the land, and said, “Please notice how this man seeks mischief; for he sent to me for my wives, and for my children, and for my silver, and for my gold; and I didn’t deny him.” +\p +\v 8 All the elders and all the people said to him, “Don’t listen, and don’t consent.” +\p +\v 9 Therefore he said to the messengers of Ben Hadad, “Tell my lord the king, ‘All that you sent for to your servant at the first I will do, but this thing I cannot do.’” +\p The messengers departed and brought him back the message. +\v 10 Ben Hadad sent to him, and said, “The gods do so to me, and more also, if the dust of Samaria will be enough for handfuls for all the people who follow me.” +\p +\v 11 The king of Israel answered, “Tell him, ‘Don’t let him who puts on his armor brag like he who takes it off.’” +\p +\v 12 When Ben Hadad heard this message as he was drinking, he and the kings in the pavilions, he said to his servants, “Prepare to attack!” So they prepared to attack the city. +\p +\v 13 Behold, a prophet came near to Ahab king of Israel, and said, “Yahweh says, ‘Have you seen all this great multitude? Behold, I will deliver it into your hand today. Then you will know that I am Yahweh.’” +\p +\v 14 Ahab said, “By whom?” +\p He said, “Yahweh says, ‘By the young men of the princes of the provinces.’” +\p Then he said, “Who shall begin the battle?” +\p He answered, “You.” +\p +\v 15 Then he mustered the young men of the princes of the provinces, and they were two hundred and thirty-two. After them, he mustered all the people, even all the children of Israel, being seven thousand. +\v 16 They went out at noon. But Ben Hadad was drinking himself drunk in the pavilions, he and the kings, the thirty-two kings who helped him. +\v 17 The young men of the princes of the provinces went out first; and Ben Hadad sent out, and they told him, saying, “Men are coming out from Samaria.” +\p +\v 18 He said, “If they have come out for peace, take them alive; or if they have come out for war, take them alive.” +\p +\v 19 So these went out of the city, the young men of the princes of the provinces, and the army which followed them. +\v 20 They each killed his man. The Syrians fled, and Israel pursued them. Ben Hadad the king of Syria escaped on a horse with horsemen. +\v 21 The king of Israel went out and struck the horses and chariots, and killed the Syrians with a great slaughter. +\v 22 The prophet came near to the king of Israel and said to him, “Go, strengthen yourself, and plan what you must do, for at the return of the year, the king of Syria will come up against you.” +\p +\v 23 The servants of the king of Syria said to him, “Their god is a god of the hills; therefore they were stronger than we. But let’s fight against them in the plain, and surely we will be stronger than they. +\v 24 Do this thing: take the kings away, every man out of his place, and put captains in their place. +\v 25 Muster an army like the army that you have lost, horse for horse and chariot for chariot. We will fight against them in the plain, and surely we will be stronger than they are.” +\p He listened to their voice and did so. +\v 26 At the return of the year, Ben Hadad mustered the Syrians and went up to Aphek to fight against Israel. +\v 27 The children of Israel were mustered and given provisions, and went against them. The children of Israel encamped before them like two little flocks of young goats, but the Syrians filled the country. +\v 28 A man of God came near and spoke to the king of Israel, and said, “Yahweh says, ‘Because the Syrians have said, “Yahweh is a god of the hills, but he is not a god of the valleys,” therefore I will deliver all this great multitude into your hand, and you shall know that I am Yahweh.’” +\p +\v 29 They encamped opposite each other for seven days. Then on the seventh day the battle was joined; and the children of Israel killed one hundred thousand footmen of the Syrians in one day. +\v 30 But the rest fled to Aphek, into the city; and the wall fell on twenty-seven thousand men who were left. Ben Hadad fled and came into the city, into an inner room. +\v 31 His servants said to him, “See now, we have heard that the kings of the house of Israel are merciful kings. Please let us put sackcloth on our bodies and ropes on our heads, and go out to the king of Israel. Maybe he will save your life.” +\p +\v 32 So they put sackcloth on their bodies and ropes on their heads, and came to the king of Israel, and said, “Your servant Ben Hadad says, ‘Please let me live.’” +\p He said, “Is he still alive? He is my brother.” +\p +\v 33 Now the men observed diligently and hurried to take this phrase; and they said, “Your brother Ben Hadad.” +\p Then he said, “Go, bring him.” +\p Then Ben Hadad came out to him; and he caused him to come up into the chariot. +\v 34 Ben Hadad said to him, “The cities which my father took from your father I will restore. You shall make streets for yourself in Damascus, as my father made in Samaria.” +\p “I”, said Ahab, “will let you go with this covenant.” So he made a covenant with him and let him go. +\p +\v 35 A certain man of the sons of the prophets said to his fellow by Yahweh’s word, “Please strike me!” +\p The man refused to strike him. +\v 36 Then he said to him, “Because you have not obeyed Yahweh’s voice, behold, as soon as you have departed from me, a lion will kill you.” As soon as he had departed from him, a lion found him and killed him. +\p +\v 37 Then he found another man, and said, “Please strike me.” +\p The man struck him and wounded him. +\v 38 So the prophet departed and waited for the king by the way, and disguised himself with his headband over his eyes. +\v 39 As the king passed by, he cried to the king, and he said, “Your servant went out into the middle of the battle; and behold, a man came over and brought a man to me, and said, ‘Guard this man! If by any means he is missing, then your life shall be for his life, or else you shall pay a talent\f + \fr 20:39 \ft A talent is about 30 kilograms or 66 pounds\f* of silver.’ +\v 40 As your servant was busy here and there, he was gone.” +\p The king of Israel said to him, “So shall your judgment be. You yourself have decided it.” +\p +\v 41 He hurried, and took the headband away from his eyes; and the king of Israel recognized that he was one of the prophets. +\v 42 He said to him, “Yahweh says, ‘Because you have let go out of your hand the man whom I had devoted to destruction, therefore your life will take the place of his life, and your people take the place of his people.’” +\p +\v 43 The king of Israel went to his house sullen and angry, and came to Samaria. +\c 21 +\p +\v 1 After these things, Naboth the Jezreelite had a vineyard which was in Jezreel, next to the palace of Ahab king of Samaria. +\v 2 Ahab spoke to Naboth, saying, “Give me your vineyard, that I may have it for a garden of herbs, because it is near my house; and I will give you for it a better vineyard than it. Or, if it seems good to you, I will give you its worth in money.” +\p +\v 3 Naboth said to Ahab, “May Yahweh forbid me, that I should give the inheritance of my fathers to you!” +\p +\v 4 Ahab came into his house sullen and angry because of the word which Naboth the Jezreelite had spoken to him, for he had said, “I will not give you the inheritance of my fathers.” He laid himself down on his bed, and turned away his face, and would eat no bread. +\v 5 But Jezebel his wife came to him, and said to him, “Why is your spirit so sad that you eat no bread?” +\p +\v 6 He said to her, “Because I spoke to Naboth the Jezreelite, and said to him, ‘Give me your vineyard for money; or else, if it pleases you, I will give you another vineyard for it.’ He answered, ‘I will not give you my vineyard.’” +\p +\v 7 Jezebel his wife said to him, “Do you now govern the kingdom of Israel? Arise, and eat bread, and let your heart be merry. I will give you the vineyard of Naboth the Jezreelite.” +\v 8 So she wrote letters in Ahab’s name and sealed them with his seal, and sent the letters to the elders and to the nobles who were in his city, who lived with Naboth. +\v 9 She wrote in the letters, saying, “Proclaim a fast, and set Naboth on high among the people. +\v 10 Set two men, wicked fellows, before him, and let them testify against him, saying, ‘You cursed God and the king!’ Then carry him out, and stone him to death.” +\p +\v 11 The men of his city, even the elders and the nobles who lived in his city, did as Jezebel had instructed them in the letters which she had written and sent to them. +\v 12 They proclaimed a fast, and set Naboth on high among the people. +\v 13 The two men, the wicked fellows, came in and sat before him. The wicked fellows testified against him, even against Naboth, in the presence of the people, saying, “Naboth cursed God and the king!” Then they carried him out of the city and stoned him to death with stones. +\v 14 Then they sent to Jezebel, saying, “Naboth has been stoned and is dead.” +\p +\v 15 When Jezebel heard that Naboth had been stoned and was dead, Jezebel said to Ahab, “Arise, take possession of the vineyard of Naboth the Jezreelite, which he refused to give you for money; for Naboth is not alive, but dead.” +\p +\v 16 When Ahab heard that Naboth was dead, Ahab rose up to go down to the vineyard of Naboth the Jezreelite, to take possession of it. +\p +\v 17 Yahweh’s word came to Elijah the Tishbite, saying, +\v 18 “Arise, go down to meet Ahab king of Israel, who dwells in Samaria. Behold, he is in the vineyard of Naboth, where he has gone down to take possession of it. +\v 19 You shall speak to him, saying, ‘Yahweh says, “Have you killed and also taken possession?”’ You shall speak to him, saying, ‘Yahweh says, “In the place where dogs licked the blood of Naboth, dogs will lick your blood, even yours.”’” +\p +\v 20 Ahab said to Elijah, “Have you found me, my enemy?” +\p He answered, “I have found you, because you have sold yourself to do that which is evil in Yahweh’s sight. +\v 21 Behold, I will bring evil on you, and will utterly sweep you away and will cut off from Ahab everyone who urinates against a wall,\f + \fr 21:21 \ft or, male \f* and him who is shut up and him who is left at large in Israel. +\v 22 I will make your house like the house of Jeroboam the son of Nebat, and like the house of Baasha the son of Ahijah, for the provocation with which you have provoked me to anger, and have made Israel to sin.” +\v 23 Yahweh also spoke of Jezebel, saying, “The dogs will eat Jezebel by the rampart of Jezreel. +\v 24 The dogs will eat he who dies of Ahab in the city; and the birds of the sky will eat he who dies in the field.” +\p +\v 25 But there was no one like Ahab, who sold himself to do that which was evil in Yahweh’s sight, whom Jezebel his wife stirred up. +\v 26 He did very abominably in following idols, according to all that the Amorites did, whom Yahweh cast out before the children of Israel. +\p +\v 27 When Ahab heard those words, he tore his clothes, put sackcloth on his body, fasted, lay in sackcloth, and went about despondently. +\p +\v 28 Yahweh’s word came to Elijah the Tishbite, saying, +\v 29 “See how Ahab humbles himself before me? Because he humbles himself before me, I will not bring the evil in his days; but I will bring the evil on his house in his son’s day.” +\c 22 +\p +\v 1 They continued three years without war between Syria and Israel. +\v 2 In the third year, Jehoshaphat the king of Judah came down to the king of Israel. +\v 3 The king of Israel said to his servants, “You know that Ramoth Gilead is ours, and we do nothing, and don’t take it out of the hand of the king of Syria?” +\v 4 He said to Jehoshaphat, “Will you go with me to battle to Ramoth Gilead?” +\p Jehoshaphat said to the king of Israel, “I am as you are, my people as your people, my horses as your horses.” +\v 5 Jehoshaphat said to the king of Israel, “Please inquire first for Yahweh’s word.” +\p +\v 6 Then the king of Israel gathered the prophets together, about four hundred men, and said to them, “Should I go against Ramoth Gilead to battle, or should I refrain?” +\p They said, “Go up; for the Lord will deliver it into the hand of the king.” +\p +\v 7 But Jehoshaphat said, “Isn’t there here a prophet of Yahweh, that we may inquire of him?” +\p +\v 8 The king of Israel said to Jehoshaphat, “There is yet one man by whom we may inquire of Yahweh, Micaiah the son of Imlah; but I hate him, for he does not prophesy good concerning me, but evil.” +\p Jehoshaphat said, “Don’t let the king say so.” +\p +\v 9 Then the king of Israel called an officer, and said, “Quickly get Micaiah the son of Imlah.” +\p +\v 10 Now the king of Israel and Jehoshaphat the king of Judah were sitting each on his throne, arrayed in their robes, in an open place at the entrance of the gate of Samaria; and all the prophets were prophesying before them. +\v 11 Zedekiah the son of Chenaanah made himself horns of iron, and said, “Yahweh says, ‘With these you will push the Syrians, until they are consumed.’” +\v 12 All the prophets prophesied so, saying, “Go up to Ramoth Gilead and prosper; for Yahweh will deliver it into the hand of the king.” +\p +\v 13 The messenger who went to call Micaiah spoke to him, saying, “See now, the prophets declare good to the king with one mouth. Please let your word be like the word of one of them, and speak good.” +\p +\v 14 Micaiah said, “As Yahweh lives, what Yahweh says to me, that I will speak.” +\p +\v 15 When he had come to the king, the king said to him, “Micaiah, shall we go to Ramoth Gilead to battle, or shall we forbear?” +\p He answered him, “Go up and prosper; and Yahweh will deliver it into the hand of the king.” +\p +\v 16 The king said to him, “How many times do I have to adjure you that you speak to me nothing but the truth in Yahweh’s name?” +\p +\v 17 He said, “I saw all Israel scattered on the mountains, as sheep that have no shepherd. Yahweh said, ‘These have no master. Let them each return to his house in peace.’” +\p +\v 18 The king of Israel said to Jehoshaphat, “Didn’t I tell you that he would not prophesy good concerning me, but evil?” +\p +\v 19 Micaiah said, “Therefore hear Yahweh’s word. I saw Yahweh sitting on his throne, and all the army of heaven standing by him on his right hand and on his left. +\v 20 Yahweh said, ‘Who will entice Ahab, that he may go up and fall at Ramoth Gilead?’ One said one thing, and another said another. +\p +\v 21 A spirit came out and stood before Yahweh, and said, ‘I will entice him.’ +\p +\v 22 Yahweh said to him, ‘How?’ +\p He said, ‘I will go out and will be a lying spirit in the mouth of all his prophets.’ +\p He said, ‘You will entice him, and will also prevail. Go out and do so.’ +\v 23 Now therefore, behold, Yahweh has put a lying spirit in the mouth of all these your prophets; and Yahweh has spoken evil concerning you.” +\p +\v 24 Then Zedekiah the son of Chenaanah came near and struck Micaiah on the cheek, and said, “Which way did Yahweh’s Spirit go from me to speak to you?” +\p +\v 25 Micaiah said, “Behold, you will see on that day when you go into an inner room to hide yourself.” +\p +\v 26 The king of Israel said, “Take Micaiah, and carry him back to Amon the governor of the city and to Joash the king’s son. +\v 27 Say, ‘The king says, “Put this fellow in the prison, and feed him with bread of affliction and with water of affliction, until I come in peace.”’” +\p +\v 28 Micaiah said, “If you return at all in peace, Yahweh has not spoken by me.” He said, “Listen, all you people!” +\p +\v 29 So the king of Israel and Jehoshaphat the king of Judah went up to Ramoth Gilead. +\v 30 The king of Israel said to Jehoshaphat, “I will disguise myself and go into the battle, but you put on your robes.” The king of Israel disguised himself and went into the battle. +\p +\v 31 Now the king of Syria had commanded the thirty-two captains of his chariots, saying, “Don’t fight with small nor great, except only with the king of Israel.” +\p +\v 32 When the captains of the chariots saw Jehoshaphat, they said, “Surely that is the king of Israel!” and they came over to fight against him. Jehoshaphat cried out. +\v 33 When the captains of the chariots saw that it was not the king of Israel, they turned back from pursuing him. +\v 34 A certain man drew his bow at random, and struck the king of Israel between the joints of the armor. Therefore he said to the driver of his chariot, “Turn around, and carry me out of the battle, for I am severely wounded.” +\v 35 The battle increased that day. The king was propped up in his chariot facing the Syrians, and died at evening. The blood ran out of the wound into the bottom of the chariot. +\v 36 A cry went throughout the army about the going down of the sun, saying, “Every man to his city, and every man to his country!” +\p +\v 37 So the king died, and was brought to Samaria; and they buried the king in Samaria. +\v 38 They washed the chariot by the pool of Samaria; and the dogs licked up his blood where the prostitutes washed themselves, according to Yahweh’s word which he spoke. +\p +\v 39 Now the rest of the acts of Ahab, and all that he did, and the ivory house which he built, and all the cities that he built, aren’t they written in the book of the chronicles of the kings of Israel? +\v 40 So Ahab slept with his fathers; and Ahaziah his son reigned in his place. +\p +\v 41 Jehoshaphat the son of Asa began to reign over Judah in the fourth year of Ahab king of Israel. +\v 42 Jehoshaphat was thirty-five years old when he began to reign; and he reigned twenty-five years in Jerusalem. His mother’s name was Azubah the daughter of Shilhi. +\v 43 He walked in all the way of Asa his father. He didn’t turn away from it, doing that which was right in Yahweh’s eyes. However, the high places were not taken away. The people still sacrificed and burned incense on the high places. +\v 44 Jehoshaphat made peace with the king of Israel. +\p +\v 45 Now the rest of the acts of Jehoshaphat, and his might that he showed, and how he fought, aren’t they written in the book of the chronicles of the kings of Judah? +\v 46 The remnant of the sodomites, that remained in the days of his father Asa, he put away out of the land. +\v 47 There was no king in Edom. A deputy ruled. +\v 48 Jehoshaphat made ships of Tarshish to go to Ophir for gold, but they didn’t go, for the ships wrecked at Ezion Geber. +\v 49 Then Ahaziah the son of Ahab said to Jehoshaphat, “Let my servants go with your servants in the ships.” But Jehoshaphat would not. +\v 50 Jehoshaphat slept with his fathers, and was buried with his fathers in his father David’s city. Jehoram his son reigned in his place. +\p +\v 51 Ahaziah the son of Ahab began to reign over Israel in Samaria in the seventeenth year of Jehoshaphat king of Judah, and he reigned two years over Israel. +\v 52 He did that which was evil in Yahweh’s sight, and walked in the way of his father, and in the way of his mother, and in the way of Jeroboam the son of Nebat, in which he made Israel to sin. +\v 53 He served Baal and worshiped him, and provoked Yahweh, the God of Israel, to anger in all the ways that his father had done so. diff --git a/c-sharp/assets/WEB/122KIengWEBUS.SFM b/c-sharp/assets/WEB/122KIengWEBUS.SFM new file mode 100644 index 0000000000..f844a3fb7e --- /dev/null +++ b/c-sharp/assets/WEB/122KIengWEBUS.SFM @@ -0,0 +1,1078 @@ +\id 2KI World English Bible (WEB) +\ide UTF-8 +\h 2 Kings +\toc1 The Second Book of Kings +\toc2 2 Kings +\toc3 2 Kings +\mt1 The Second Book of Kings +\c 1 +\p +\v 1 Moab rebelled against Israel after the death of Ahab. +\p +\v 2 Ahaziah fell down through the lattice in his upper room that was in Samaria, and was sick. So he sent messengers, and said to them, “Go, inquire of Baal Zebub, the god of Ekron, whether I will recover of this sickness.” +\p +\v 3 But Yahweh’s\f + \fr 1:3 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* angel said to Elijah the Tishbite, “Arise, go up to meet the messengers of the king of Samaria, and tell them, ‘Is it because there is no God\f + \fr 1:3 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* in Israel that you go to inquire of Baal Zebub, the god of Ekron? +\v 4 Now therefore Yahweh says, “You will not come down from the bed where you have gone up, but you will surely die.”’” Then Elijah departed. +\p +\v 5 The messengers returned to him, and he said to them, “Why is it that you have returned?” +\p +\v 6 They said to him, “A man came up to meet us, and said to us, ‘Go, return to the king who sent you, and tell him, “Yahweh says, ‘Is it because there is no God in Israel that you send to inquire of Baal Zebub, the god of Ekron? Therefore you will not come down from the bed where you have gone up, but you will surely die.’”’” +\p +\v 7 He said to them, “What kind of man was he who came up to meet you and told you these words?” +\p +\v 8 They answered him, “He was a hairy man, and wearing a leather belt around his waist.” +\p He said, “It’s Elijah the Tishbite.” +\p +\v 9 Then the king sent a captain of fifty with his fifty to him. He went up to him; and behold,\f + \fr 1:9 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* he was sitting on the top of the hill. He said to him, “Man of God, the king has said, ‘Come down!’” +\p +\v 10 Elijah answered to the captain of fifty, “If I am a man of God, then let fire come down from the sky and consume you and your fifty!” Then fire came down from the sky, and consumed him and his fifty. +\p +\v 11 Again he sent to him another captain of fifty with his fifty. He answered him, “Man of God, the king has said, ‘Come down quickly!’” +\p +\v 12 Elijah answered them, “If I am a man of God, then let fire come down from the sky and consume you and your fifty!” Then God’s fire came down from the sky, and consumed him and his fifty. +\p +\v 13 Again he sent the captain of a third fifty with his fifty. The third captain of fifty went up, and came and fell on his knees before Elijah, and begged him, and said to him, “Man of God, please let my life and the life of these fifty of your servants be precious in your sight. +\v 14 Behold, fire came down from the sky and consumed the last two captains of fifty with their fifties. But now let my life be precious in your sight.” +\p +\v 15 Yahweh’s angel said to Elijah, “Go down with him. Don’t be afraid of him.” +\p Then he arose and went down with him to the king. +\v 16 He said to him, “Yahweh says, ‘Because you have sent messengers to inquire of Baal Zebub, the god of Ekron, is it because there is no God in Israel to inquire of his word? Therefore you will not come down from the bed where you have gone up, but you will surely die.’” +\p +\v 17 So he died according to Yahweh’s word which Elijah had spoken. Jehoram began to reign in his place in the second year of Jehoram the son of Jehoshaphat king of Judah, because he had no son. +\v 18 Now the rest of the acts of Ahaziah which he did, aren’t they written in the book of the chronicles of the kings of Israel? +\c 2 +\p +\v 1 When Yahweh was about to take Elijah up by a whirlwind into heaven, Elijah went with Elisha from Gilgal. +\v 2 Elijah said to Elisha, “Please wait here, for Yahweh has sent me as far as Bethel.” +\p Elisha said, “As Yahweh lives, and as your soul lives, I will not leave you.” So they went down to Bethel. +\p +\v 3 The sons of the prophets who were at Bethel came out to Elisha, and said to him, “Do you know that Yahweh will take away your master from over you today?” +\p He said, “Yes, I know it. Hold your peace.” +\p +\v 4 Elijah said to him, “Elisha, please wait here, for Yahweh has sent me to Jericho.” +\p He said, “As Yahweh lives, and as your soul lives, I will not leave you.” So they came to Jericho. +\p +\v 5 The sons of the prophets who were at Jericho came near to Elisha, and said to him, “Do you know that Yahweh will take away your master from over you today?” +\p He answered, “Yes, I know it. Hold your peace.” +\p +\v 6 Elijah said to him, “Please wait here, for Yahweh has sent me to the Jordan.” +\p He said, “As Yahweh lives, and as your soul lives, I will not leave you.” Then they both went on. +\v 7 Fifty men of the sons of the prophets went and stood opposite them at a distance; and they both stood by the Jordan. +\v 8 Elijah took his mantle, and rolled it up, and struck the waters; and they were divided here and there, so that they both went over on dry ground. +\v 9 When they had gone over, Elijah said to Elisha, “Ask what I shall do for you, before I am taken from you.” +\p Elisha said, “Please let a double portion of your spirit be on me.” +\p +\v 10 He said, “You have asked a hard thing. If you see me when I am taken from you, it will be so for you; but if not, it will not be so.” +\p +\v 11 As they continued on and talked, behold, a chariot of fire and horses of fire separated them; and Elijah went up by a whirlwind into heaven. +\v 12 Elisha saw it, and he cried, “My father, my father, the chariots of Israel and its horsemen!” +\p He saw him no more. Then he took hold of his own clothes and tore them in two pieces. +\v 13 He also took up Elijah’s mantle that fell from him, and went back and stood by the bank of the Jordan. +\v 14 He took Elijah’s mantle that fell from him, and struck the waters, and said, “Where is Yahweh, the God of Elijah?” When he also had struck the waters, they were divided apart, and Elisha went over. +\p +\v 15 When the sons of the prophets who were at Jericho facing him saw him, they said, “The spirit of Elijah rests on Elisha.” They came to meet him, and bowed themselves to the ground before him. +\v 16 They said to him, “See now, there are with your servants fifty strong men. Please let them go and seek your master. Perhaps Yahweh’s Spirit has taken him up, and put him on some mountain or into some valley.” +\p He said, “Don’t send them.” +\p +\v 17 When they urged him until he was ashamed, he said, “Send them.” +\p Therefore they sent fifty men; and they searched for three days, but didn’t find him. +\v 18 They came back to him while he stayed at Jericho; and he said to them, “Didn’t I tell you, ‘Don’t go?’” +\p +\v 19 The men of the city said to Elisha, “Behold, please, the situation of this city is pleasant, as my lord sees; but the water is bad, and the land is barren.” +\p +\v 20 He said, “Bring me a new jar, and put salt in it.” Then they brought it to him. +\v 21 He went out to the spring of the waters, and threw salt into it, and said, “Yahweh says, ‘I have healed these waters. There shall not be from there any more death or barren wasteland.’” +\v 22 So the waters were healed to this day, according to Elisha’s word which he spoke. +\p +\v 23 He went up from there to Bethel. As he was going up by the way, some youths came out of the city and mocked him, and said to him, “Go up, you baldy! Go up, you baldy!” +\v 24 He looked behind him and saw them, and cursed them in Yahweh’s name. Then two female bears came out of the woods and mauled forty-two of those youths. +\v 25 He went from there to Mount Carmel, and from there he returned to Samaria. +\c 3 +\p +\v 1 Now Jehoram the son of Ahab began to reign over Israel in Samaria in the eighteenth year of Jehoshaphat king of Judah, and reigned twelve years. +\v 2 He did that which was evil in Yahweh’s sight, but not like his father and like his mother, for he put away the pillar of Baal that his father had made. +\v 3 Nevertheless he held to the sins of Jeroboam the son of Nebat, with which he made Israel to sin. He didn’t depart from them. +\p +\v 4 Now Mesha king of Moab was a sheep breeder; and he supplied the king of Israel with one hundred thousand lambs and the wool of one hundred thousand rams. +\v 5 But when Ahab was dead, the king of Moab rebelled against the king of Israel. +\v 6 King Jehoram went out of Samaria at that time, and mustered all Israel. +\v 7 He went and sent to Jehoshaphat the king of Judah, saying, “The king of Moab has rebelled against me. Will you go with me against Moab to battle?” +\p He said, “I will go up. I am as you are, my people as your people, my horses as your horses.” +\v 8 Then he said, “Which way shall we go up?” +\p Jehoram answered, “The way of the wilderness of Edom.” +\p +\v 9 So the king of Israel went with the king of Judah and the king of Edom, and they marched for seven days along a circuitous route. There was no water for the army or for the animals that followed them. +\v 10 The king of Israel said, “Alas! For Yahweh has called these three kings together to deliver them into the hand of Moab.” +\p +\v 11 But Jehoshaphat said, “Isn’t there a prophet of Yahweh here, that we may inquire of Yahweh by him?” +\p One of the king of Israel’s servants answered, “Elisha the son of Shaphat, who poured water on the hands of Elijah, is here.” +\p +\v 12 Jehoshaphat said, “Yahweh’s word is with him.” So the king of Israel and Jehoshaphat and the king of Edom went down to him. +\p +\v 13 Elisha said to the king of Israel, “What have I to do with you? Go to the prophets of your father, and to the prophets of your mother.” +\p The king of Israel said to him, “No, for Yahweh has called these three kings together to deliver them into the hand of Moab.” +\p +\v 14 Elisha said, “As Yahweh of Armies lives, before whom I stand, surely, were it not that I respect the presence of Jehoshaphat the king of Judah, I would not look toward you, nor see you. +\v 15 But now bring me a musician.” When the musician played, Yahweh’s hand came on him. +\v 16 He said, “Yahweh says, ‘Make this valley full of trenches.’ +\v 17 For Yahweh says, ‘You will not see wind, neither will you see rain, yet that valley will be filled with water, and you will drink, both you and your livestock and your other animals. +\v 18 This is an easy thing in Yahweh’s sight. He will also deliver the Moabites into your hand. +\v 19 You shall strike every fortified city and every choice city, and shall fell every good tree, and stop all springs of water, and mar every good piece of land with stones.’” +\p +\v 20 In the morning, about the time of offering the sacrifice, behold, water came by the way of Edom, and the country was filled with water. +\p +\v 21 Now when all the Moabites heard that the kings had come up to fight against them, they gathered themselves together, all who were able to put on armor, young and old, and stood on the border. +\v 22 They rose up early in the morning, and the sun shone on the water, and the Moabites saw the water opposite them as red as blood. +\v 23 They said, “This is blood. The kings are surely destroyed, and they have struck each other. Now therefore, Moab, to the plunder!” +\p +\v 24 When they came to the camp of Israel, the Israelites rose up and struck the Moabites, so that they fled before them; and they went forward into the land attacking the Moabites. +\v 25 They beat down the cities; and on every good piece of land each man cast his stone, and filled it. They also stopped all the springs of water and cut down all the good trees, until in Kir Hareseth all they left was its stones; however the men armed with slings went around it and attacked it. +\v 26 When the king of Moab saw that the battle was too severe for him, he took with him seven hundred men who drew a sword, to break through to the king of Edom; but they could not. +\v 27 Then he took his oldest son who would have reigned in his place, and offered him for a burnt offering on the wall. There was great wrath against Israel; and they departed from him, and returned to their own land. +\c 4 +\p +\v 1 Now a certain woman of the wives of the sons of the prophets cried out to Elisha, saying, “Your servant my husband is dead. You know that your servant feared Yahweh. Now the creditor has come to take for himself my two children to be slaves.” +\p +\v 2 Elisha said to her, “What should I do for you? Tell me, what do you have in the house?” +\p She said, “Your servant has nothing in the house, except a pot of oil.” +\p +\v 3 Then he said, “Go, borrow empty containers from all your neighbors. Don’t borrow just a few containers. +\v 4 Go in and shut the door on you and on your sons, and pour oil into all those containers; and set aside those which are full.” +\p +\v 5 So she went from him, and shut the door on herself and on her sons. They brought the containers to her, and she poured oil. +\v 6 When the containers were full, she said to her son, “Bring me another container.” +\p He said to her, “There isn’t another container.” Then the oil stopped flowing. +\p +\v 7 Then she came and told the man of God. He said, “Go, sell the oil, and pay your debt; and you and your sons live on the rest.” +\p +\v 8 One day Elisha went to Shunem, where there was a prominent woman; and she persuaded him to eat bread. So it was, that as often as he passed by, he turned in there to eat bread. +\v 9 She said to her husband, “See now, I perceive that this is a holy man of God who passes by us continually. +\v 10 Please, let’s make a little room on the roof. Let’s set a bed, a table, a chair, and a lamp stand for him there. When he comes to us, he can stay there.” +\p +\v 11 One day he came there, and he went to the room and lay there. +\v 12 He said to Gehazi his servant, “Call this Shunammite.” When he had called her, she stood before him. +\v 13 He said to him, “Say now to her, ‘Behold, you have cared for us with all this care. What is to be done for you? Would you like to be spoken for to the king, or to the captain of the army?’” +\p She answered, “I dwell among my own people.” +\p +\v 14 He said, “What then is to be done for her?” +\p Gehazi answered, “Most certainly she has no son, and her husband is old.” +\p +\v 15 He said, “Call her.” When he had called her, she stood in the door. +\v 16 He said, “At this season next year, you will embrace a son.” +\p She said, “No, my lord, you man of God, do not lie to your servant.” +\p +\v 17 The woman conceived, and bore a son at that season when the time came around, as Elisha had said to her. +\v 18 When the child was grown, one day he went out to his father to the reapers. +\v 19 He said to his father, “My head! My head!” +\p He said to his servant, “Carry him to his mother.” +\p +\v 20 When he had taken him and brought him to his mother, he sat on her knees until noon, and then died. +\v 21 She went up and laid him on the man of God’s bed, and shut the door on him, and went out. +\v 22 She called to her husband and said, “Please send me one of the servants, and one of the donkeys, that I may run to the man of God and come again.” +\p +\v 23 He said, “Why would you want to go to him today? It is not a new moon or a Sabbath.” +\p She said, “It’s all right.” +\p +\v 24 Then she saddled a donkey, and said to her servant, “Drive, and go forward! Don’t slow down for me, unless I ask you to.” +\p +\v 25 So she went, and came to the man of God to Mount Carmel. When the man of God saw her afar off, he said to Gehazi his servant, “Behold, there is the Shunammite. +\v 26 Please run now to meet her, and ask her, ‘Is it well with you? Is it well with your husband? Is it well with your child?’” +\p She answered, “It is well.” +\p +\v 27 When she came to the man of God to the hill, she caught hold of his feet. Gehazi came near to thrust her away; but the man of God said, “Leave her alone, for her soul is troubled within her; and Yahweh has hidden it from me, and has not told me.” +\p +\v 28 Then she said, “Did I ask you for a son, my lord? Didn’t I say, ‘Do not deceive me’?” +\p +\v 29 Then he said to Gehazi, “Tuck your cloak into your belt, take my staff in your hand, and go your way. If you meet any man, don’t greet him; and if anyone greets you, don’t answer him again. Then lay my staff on the child’s face.” +\p +\v 30 The child’s mother said, “As Yahweh lives, and as your soul lives, I will not leave you.” +\p So he arose, and followed her. +\p +\v 31 Gehazi went ahead of them, and laid the staff on the child’s face; but there was no voice and no hearing. Therefore he returned to meet him, and told him, “The child has not awakened.” +\p +\v 32 When Elisha had come into the house, behold, the child was dead, and lying on his bed. +\v 33 He went in therefore, and shut the door on them both, and prayed to Yahweh. +\v 34 He went up and lay on the child, and put his mouth on his mouth, and his eyes on his eyes, and his hands on his hands. He stretched himself on him; and the child’s flesh grew warm. +\v 35 Then he returned, and walked in the house once back and forth, then went up and stretched himself out on him. Then the child sneezed seven times, and the child opened his eyes. +\v 36 He called Gehazi, and said, “Call this Shunammite!” So he called her. +\p When she had come in to him, he said, “Take up your son.” +\p +\v 37 Then she went in, fell at his feet, and bowed herself to the ground; then she picked up her son, and went out. +\p +\v 38 Elisha came again to Gilgal. There was a famine in the land; and the sons of the prophets were sitting before him; and he said to his servant, “Get the large pot, and boil stew for the sons of the prophets.” +\p +\v 39 One went out into the field to gather herbs, and found a wild vine, and gathered a lap full of wild gourds from it, and came and cut them up into the pot of stew; for they didn’t recognize them. +\v 40 So they poured out for the men to eat. As they were eating some of the stew, they cried out and said, “Man of God, there is death in the pot!” And they could not eat it. +\p +\v 41 But he said, “Then bring meal.” He threw it into the pot; and he said, “Serve it to the people, that they may eat.” And there was nothing harmful in the pot. +\p +\v 42 A man from Baal Shalishah came, and brought the man of God some bread of the first fruits: twenty loaves of barley and fresh ears of grain in his sack. Elisha said, “Give to the people, that they may eat.” +\p +\v 43 His servant said, “What, should I set this before a hundred men?” +\p But he said, “Give it to the people, that they may eat; for Yahweh says, ‘They will eat, and will have some left over.’” +\p +\v 44 So he set it before them and they ate and had some left over, according to Yahweh’s word. +\c 5 +\p +\v 1 Now Naaman, captain of the army of the king of Syria, was a great man with his master, and honorable, because by him Yahweh had given victory to Syria; he was also a mighty man of valor, but he was a leper. +\v 2 The Syrians had gone out in bands, and had brought away captive out of the land of Israel a little girl, and she waited on Naaman’s wife. +\v 3 She said to her mistress, “I wish that my lord were with the prophet who is in Samaria! Then he would heal him of his leprosy.” +\p +\v 4 Someone went in and told his lord, saying, “The girl who is from the land of Israel said this.” +\p +\v 5 The king of Syria said, “Go now, and I will send a letter to the king of Israel.” +\p He departed, and took with him ten talents\f + \fr 5:5 \ft A talent is about 30 kilograms or 66 pounds\f* of silver, six thousand pieces of gold, and ten changes of clothing. +\v 6 He brought the letter to the king of Israel, saying, “Now when this letter has come to you, behold, I have sent Naaman my servant to you, that you may heal him of his leprosy.” +\p +\v 7 When the king of Israel had read the letter, he tore his clothes and said, “Am I God, to kill and to make alive, that this man sends to me to heal a man of his leprosy? But please consider and see how he seeks a quarrel against me.” +\p +\v 8 It was so, when Elisha the man of God heard that the king of Israel had torn his clothes, that he sent to the king, saying, “Why have you torn your clothes? Let him come now to me, and he shall know that there is a prophet in Israel.” +\p +\v 9 So Naaman came with his horses and with his chariots, and stood at the door of the house of Elisha. +\v 10 Elisha sent a messenger to him, saying, “Go and wash in the Jordan seven times, and your flesh shall come again to you, and you shall be clean.” +\p +\v 11 But Naaman was angry, and went away and said, “Behold, I thought, ‘He will surely come out to me, and stand, and call on the name of Yahweh his God, and wave his hand over the place, and heal the leper.’ +\v 12 Aren’t Abanah and Pharpar, the rivers of Damascus, better than all the waters of Israel? Couldn’t I wash in them and be clean?” So he turned and went away in a rage. +\p +\v 13 His servants came near and spoke to him, and said, “My father, if the prophet had asked you do some great thing, wouldn’t you have done it? How much rather then, when he says to you, ‘Wash, and be clean?’” +\p +\v 14 Then went he down and dipped himself seven times in the Jordan, according to the saying of the man of God; and his flesh was restored like the flesh of a little child, and he was clean. +\v 15 He returned to the man of God, he and all his company, and came, and stood before him; and he said, “See now, I know that there is no God in all the earth, but in Israel. Now therefore, please take a gift from your servant.” +\p +\v 16 But he said, “As Yahweh lives, before whom I stand, I will receive none.” +\p He urged him to take it; but he refused. +\v 17 Naaman said, “If not, then, please let two mules’ load of earth be given to your servant; for your servant will from now on offer neither burnt offering nor sacrifice to other gods, but to Yahweh. +\v 18 In this thing may Yahweh pardon your servant: when my master goes into the house of Rimmon to worship there, and he leans on my hand, and I bow myself in the house of Rimmon. When I bow myself in the house of Rimmon, may Yahweh pardon your servant in this thing.” +\p +\v 19 He said to him, “Go in peace.” +\p So he departed from him a little way. +\v 20 But Gehazi the servant of Elisha the man of God, said, “Behold, my master has spared this Naaman the Syrian, in not receiving at his hands that which he brought. As Yahweh lives, I will run after him, and take something from him.” +\p +\v 21 So Gehazi followed after Naaman. When Naaman saw one running after him, he came down from the chariot to meet him, and said, “Is all well?” +\p +\v 22 He said, “All is well. My master has sent me, saying, ‘Behold, even now two young men of the sons of the prophets have come to me from the hill country of Ephraim. Please give them a talent\f + \fr 5:22 \ft A talent is about 30 kilograms or 66 pounds\f* of silver and two changes of clothing.’” +\p +\v 23 Naaman said, “Be pleased to take two talents.” He urged him, and bound two talents of silver in two bags, with two changes of clothing, and laid them on two of his servants; and they carried them before him. +\v 24 When he came to the hill, he took them from their hand, and stored them in the house. Then he let the men go, and they departed. +\v 25 But he went in, and stood before his master. Elisha said to him, “Where did you come from, Gehazi?” +\p He said, “Your servant went nowhere.” +\p +\v 26 He said to him, “Didn’t my heart go with you when the man turned from his chariot to meet you? Is it a time to receive money, and to receive garments, and olive groves and vineyards, and sheep and cattle, and male servants and female servants? +\v 27 Therefore the leprosy of Naaman will cling to you and to your offspring\f + \fr 5:27 \ft or, seed\f* forever.” +\p He went out from his presence a leper, as white as snow. +\c 6 +\p +\v 1 The sons of the prophets said to Elisha, “See now, the place where we live and meet with you is too small for us. +\v 2 Please let us go to the Jordan, and each man take a beam from there, and let’s make us a place there, where we may live.” +\p He answered, “Go!” +\p +\v 3 One said, “Please be pleased to go with your servants.” +\p He answered, “I will go.” +\v 4 So he went with them. When they came to the Jordan, they cut down wood. +\v 5 But as one was cutting down a tree, the ax head fell into the water. Then he cried out and said, “Alas, my master! For it was borrowed.” +\p +\v 6 The man of God asked, “Where did it fall?” He showed him the place. He cut down a stick, threw it in there, and made the iron float. +\v 7 He said, “Take it.” So he put out his hand and took it. +\p +\v 8 Now the king of Syria was at war against Israel; and he took counsel with his servants, saying, “My camp will be in such and such a place.” +\p +\v 9 The man of God sent to the king of Israel, saying, “Beware that you not pass this place, for the Syrians are coming down there.” +\v 10 The king of Israel sent to the place which the man of God told him and warned him of; and he saved himself there, not once or twice. +\v 11 The king of Syria’s heart was very troubled about this. He called his servants, and said to them, “Won’t you show me which of us is for the king of Israel?” +\p +\v 12 One of his servants said, “No, my lord, O king; but Elisha, the prophet who is in Israel, tells the king of Israel the words that you speak in your bedroom.” +\p +\v 13 He said, “Go and see where he is, that I may send and get him.” +\p He was told, “Behold, he is in Dothan.” +\p +\v 14 Therefore he sent horses, chariots, and a great army there. They came by night and surrounded the city. +\v 15 When the servant of the man of God had risen early and gone out, behold, an army with horses and chariots was around the city. His servant said to him, “Alas, my master! What shall we do?” +\p +\v 16 He answered, “Don’t be afraid, for those who are with us are more than those who are with them.” +\v 17 Elisha prayed, and said, “Yahweh, please open his eyes, that he may see.” Yahweh opened the young man’s eyes, and he saw; and behold, the mountain was full of horses and chariots of fire around Elisha. +\v 18 When they came down to him, Elisha prayed to Yahweh, and said, “Please strike this people with blindness.” +\p He struck them with blindness according to Elisha’s word. +\p +\v 19 Elisha said to them, “This is not the way, neither is this the city. Follow me, and I will bring you to the man whom you seek.” He led them to Samaria. +\v 20 When they had come into Samaria, Elisha said, “Yahweh, open these men’s eyes, that they may see.” +\p Yahweh opened their eyes, and they saw; and behold, they were in the middle of Samaria. +\p +\v 21 The king of Israel said to Elisha, when he saw them, “My father, shall I strike them? Shall I strike them?” +\p +\v 22 He answered, “You shall not strike them. Would you strike those whom you have taken captive with your sword and with your bow? Set bread and water before them, that they may eat and drink, then go to their master.” +\p +\v 23 He prepared a great feast for them. After they ate and drank, he sent them away and they went to their master. So the bands of Syria stopped raiding the land of Israel. +\p +\v 24 After this, Benhadad king of Syria gathered all his army, and went up and besieged Samaria. +\v 25 There was a great famine in Samaria. Behold, they besieged it until a donkey’s head was sold for eighty pieces of silver, and the fourth part of a kab\f + \fr 6:25 \ft A kab was about 2 liters, so a fourth of a kab would be about 500 milliliters or about a pint\f* of dove’s dung for five pieces of silver. +\v 26 As the king of Israel was passing by on the wall, a woman cried to him, saying, “Help, my lord, O king!” +\p +\v 27 He said, “If Yahweh doesn’t help you, where could I get help for you? From the threshing floor, or from the wine press?” +\v 28 Then the king asked her, “What is your problem?” +\p She answered, “This woman said to me, ‘Give your son, that we may eat him today, and we will eat my son tomorrow.’ +\v 29 So we boiled my son and ate him; and I said to her on the next day, ‘Give up your son, that we may eat him;’ and she has hidden her son.” +\p +\v 30 When the king heard the words of the woman, he tore his clothes. Now he was passing by on the wall, and the people looked, and behold, he had sackcloth underneath on his body. +\v 31 Then he said, “God do so to me, and more also, if the head of Elisha the son of Shaphat stays on him today.” +\p +\v 32 But Elisha was sitting in his house, and the elders were sitting with him. Then the king sent a man from before him; but before the messenger came to him, he said to the elders, “Do you see how this son of a murderer has sent to take away my head? Behold, when the messenger comes, shut the door, and hold the door shut against him. Isn’t the sound of his master’s feet behind him?” +\p +\v 33 While he was still talking with them, behold, the messenger came down to him. Then he said, “Behold, this evil is from Yahweh. Why should I wait for Yahweh any longer?” +\c 7 +\p +\v 1 Elisha said, “Hear Yahweh’s word. Yahweh says, ‘Tomorrow about this time a seah\f + \fr 7:1 \ft 1 seah is about 7 liters or 1.9 gallons or 0.8 pecks\f* of fine flour will be sold for a shekel,\f + \fr 7:1 \ft A shekel is about 10 grams or about 0.35 ounces. In this context, it was probably a silver coin weighing that much.\f* and two seahs of barley for a shekel, in the gate of Samaria.’” +\p +\v 2 Then the captain on whose hand the king leaned answered the man of God, and said, “Behold, if Yahweh made windows in heaven, could this thing be?” +\p He said, “Behold, you will see it with your eyes, but will not eat of it.” +\p +\v 3 Now there were four leprous men at the entrance of the gate. They said to one another, “Why do we sit here until we die? +\v 4 If we say, ‘We will enter into the city,’ then the famine is in the city, and we will die there. If we sit still here, we also die. Now therefore come, and let’s surrender to the army of the Syrians. If they save us alive, we will live; and if they kill us, we will only die.” +\p +\v 5 They rose up in the twilight to go to the camp of the Syrians. When they had come to the outermost part of the camp of the Syrians, behold, no man was there. +\v 6 For the Lord\f + \fr 7:6 \ft The word translated “Lord” is “Adonai.”\f* had made the army of the Syrians to hear the sound of chariots and the sound of horses, even the noise of a great army; and they said to one another, “Behold, the king of Israel has hired against us the kings of the Hittites and the kings of the Egyptians to attack us.” +\v 7 Therefore they arose and fled in the twilight, and left their tents, their horses, and their donkeys, even the camp as it was, and fled for their life. +\v 8 When these lepers came to the outermost part of the camp, they went into one tent, and ate and drank, then carried away silver, gold, and clothing and went and hid it. Then they came back, and entered into another tent and carried things from there also, and went and hid them. +\v 9 Then they said to one another, “We aren’t doing right. Today is a day of good news, and we keep silent. If we wait until the morning light, punishment will overtake us. Now therefore come, let’s go and tell the king’s household.” +\p +\v 10 So they came and called to the city gatekeepers; and they told them, “We came to the camp of the Syrians, and, behold, there was no man there, not even a man’s voice, but the horses tied, and the donkeys tied, and the tents as they were.” +\p +\v 11 Then the gatekeepers called out and told it to the king’s household within. +\p +\v 12 The king arose in the night, and said to his servants, “I will now show you what the Syrians have done to us. They know that we are hungry. Therefore they have gone out of the camp to hide themselves in the field, saying, ‘When they come out of the city, we shall take them alive, and get into the city.’” +\p +\v 13 One of his servants answered, “Please let some people take five of the horses that remain, which are left in the city. Behold, they are like all the multitude of Israel who are left in it. Behold, they are like all the multitude of Israel who are consumed. Let’s send and see.” +\p +\v 14 Therefore they took two chariots with horses; and the king sent them out to the Syrian army, saying, “Go and see.” +\p +\v 15 They went after them to the Jordan; and behold, all the path was full of garments and equipment which the Syrians had cast away in their haste. The messengers returned and told the king. +\v 16 The people went out and plundered the camp of the Syrians. So a seah\f + \fr 7:16 \ft 1 seah is about 7 liters or 1.9 gallons or 0.8 pecks\f* of fine flour was sold for a shekel, and two measures of barley for a shekel,\f + \fr 7:16 \ft A shekel is about 10 grams or about 0.35 ounces. In this context, it was probably a silver coin weighing that much.\f* according to Yahweh’s word. +\v 17 The king had appointed the captain on whose hand he leaned to be in charge of the gate; and the people trampled over him in the gate, and he died as the man of God had said, who spoke when the king came down to him. +\v 18 It happened as the man of God had spoken to the king, saying, “Two seahs\f + \fr 7:18 \ft 1 seah is about 7 liters or 1.9 gallons or 0.8 pecks\f* of barley for a shekel,\f + \fr 7:18 \ft A shekel is about 10 grams or about 0.35 ounces. In this context, it was probably a silver coin weighing that much.\f* and a seah of fine flour for a shekel, shall be tomorrow about this time in the gate of Samaria;” +\v 19 and that captain answered the man of God, and said, “Now, behold, if Yahweh made windows in heaven, might such a thing be?” and he said, “Behold, you will see it with your eyes, but will not eat of it.” +\v 20 It happened like that to him, for the people trampled over him in the gate, and he died. +\c 8 +\p +\v 1 Now Elisha had spoken to the woman whose son he had restored to life, saying, “Arise, and go, you and your household, and stay for a while wherever you can; for Yahweh has called for a famine. It will also come on the land for seven years.” +\p +\v 2 The woman arose, and did according to the man of God’s word. She went with her household, and lived in the land of the Philistines for seven years. +\v 3 At the end of seven years, the woman returned from the land of the Philistines. Then she went out to beg the king for her house and for her land. +\v 4 Now the king was talking with Gehazi the servant of the man of God, saying, “Please tell me all the great things that Elisha has done.” +\v 5 As he was telling the king how he had restored to life him who was dead, behold, the woman whose son he had restored to life begged the king for her house and for her land. Gehazi said, “My lord, O king, this is the woman, and this is her son, whom Elisha restored to life.” +\p +\v 6 When the king asked the woman, she told him. So the king appointed to her a certain officer, saying, “Restore all that was hers, and all the fruits of the field since the day that she left the land, even until now.” +\p +\v 7 Elisha came to Damascus; and Benhadad the king of Syria was sick. He was told, “The man of God has come here.” +\p +\v 8 The king said to Hazael, “Take a present in your hand, and go meet the man of God, and inquire of Yahweh by him, saying, ‘Will I recover from this sickness?’” +\p +\v 9 So Hazael went to meet him and took a present with him, even of every good thing of Damascus, forty camels’ burden, and came and stood before him and said, “Your son Benhadad king of Syria has sent me to you, saying, ‘Will I recover from this sickness?’” +\p +\v 10 Elisha said to him, “Go, tell him, ‘You will surely recover;’ however Yahweh has shown me that he will surely die.” +\v 11 He settled his gaze steadfastly on him, until he was ashamed. Then the man of God wept. +\p +\v 12 Hazael said, “Why do you weep, my lord?” +\p He answered, “Because I know the evil that you will do to the children of Israel. You will set their strongholds on fire, and you will kill their young men with the sword, and will dash their little ones in pieces, and rip up their pregnant women.” +\p +\v 13 Hazael said, “But what is your servant, who is but a dog, that he could do this great thing?” +\p Elisha answered, “Yahweh has shown me that you will be king over Syria.” +\p +\v 14 Then he departed from Elisha, and came to his master, who said to him, “What did Elisha say to you?” +\p He answered, “He told me that you would surely recover.” +\p +\v 15 On the next day, he took a thick cloth, dipped it in water, and spread it on the king’s face, so that he died. Then Hazael reigned in his place. +\p +\v 16 In the fifth year of Joram the son of Ahab king of Israel, Jehoshaphat being king of Judah then, Jehoram the son of Jehoshaphat king of Judah began to reign. +\v 17 He was thirty-two years old when he began to reign. He reigned eight years in Jerusalem. +\v 18 He walked in the way of the kings of Israel, as did Ahab’s house, for he married Ahab’s daughter. He did that which was evil in Yahweh’s sight. +\v 19 However, Yahweh would not destroy Judah, for David his servant’s sake, as he promised him to give to him a lamp for his children always. +\p +\v 20 In his days Edom revolted from under the hand of Judah, and made a king over themselves. +\v 21 Then Joram crossed over to Zair, and all his chariots with him; and he rose up by night and struck the Edomites who surrounded him with the captains of the chariots; and the people fled to their tents. +\v 22 So Edom revolted from under the hand of Judah to this day. Then Libnah revolted at the same time. +\v 23 The rest of the acts of Joram, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 24 Joram slept with his fathers, and was buried with his fathers in David’s city; and Ahaziah his son reigned in his place. +\p +\v 25 In the twelfth year of Joram the son of Ahab king of Israel, Ahaziah the son of Jehoram king of Judah began to reign. +\v 26 Ahaziah was twenty-two years old when he began to reign; and he reigned one year in Jerusalem. His mother’s name was Athaliah the daughter of Omri king of Israel. +\v 27 He walked in the way of Ahab’s house and did that which was evil in Yahweh’s sight, as did Ahab’s house, for he was the son-in-law of Ahab’s house. +\p +\v 28 He went with Joram the son of Ahab to war against Hazael king of Syria at Ramoth Gilead, and the Syrians wounded Joram. +\v 29 King Joram returned to be healed in Jezreel from the wounds which the Syrians had given him at Ramah, when he fought against Hazael king of Syria. Ahaziah the son of Jehoram, king of Judah, went down to see Joram the son of Ahab in Jezreel, because he was sick. +\c 9 +\p +\v 1 Elisha the prophet called one of the sons of the prophets, and said to him, “Put your belt on your waist, take this vial of oil in your hand, and go to Ramoth Gilead. +\v 2 When you come there, find Jehu the son of Jehoshaphat the son of Nimshi, and go in and make him rise up from among his brothers, and take him to an inner room. +\v 3 Then take the vial of oil, and pour it on his head, and say, ‘Yahweh says, “I have anointed you king over Israel.”’ Then open the door, flee, and don’t wait.” +\p +\v 4 So the young man, the young prophet, went to Ramoth Gilead. +\v 5 When he came, behold, the captains of the army were sitting. Then he said, “I have a message for you, captain.” +\p Jehu said, “To which one of us?” +\p He said, “To you, O captain.” +\v 6 He arose, and went into the house. Then he poured the oil on his head, and said to him, “Yahweh, the God of Israel, says, ‘I have anointed you king over the people of Yahweh, even over Israel. +\v 7 You must strike your master Ahab’s house, that I may avenge the blood of my servants the prophets, and the blood of all the servants of Yahweh, at the hand of Jezebel. +\v 8 For the whole house of Ahab will perish. I will cut off from Ahab everyone who urinates against a wall,\f + \fr 9:8 \ft or, male\f* both him who is shut up and him who is left at large in Israel. +\v 9 I will make Ahab’s house like the house of Jeroboam the son of Nebat, and like the house of Baasha the son of Ahijah. +\v 10 The dogs will eat Jezebel on the plot of ground of Jezreel, and there shall be no one to bury her.’” Then he opened the door and fled. +\p +\v 11 When Jehu came out to the servants of his lord and one said to him, “Is all well? Why did this madman come to you?” +\p He said to them, “You know the man and how he talks.” +\p +\v 12 They said, “That is a lie. Tell us now.” +\p He said, “He said to me, ‘Yahweh says, I have anointed you king over Israel.’” +\p +\v 13 Then they hurried, and each man took his cloak, and put it under him on the top of the stairs, and blew the trumpet, saying, “Jehu is king.” +\p +\v 14 So Jehu the son of Jehoshaphat the son of Nimshi conspired against Joram. (Now Joram was defending Ramoth Gilead, he and all Israel, because of Hazael king of Syria; +\v 15 but King Joram had returned to be healed in Jezreel of the wounds which the Syrians had given him when he fought with Hazael king of Syria.) Jehu said, “If this is your thinking, then let no one escape and go out of the city to go to tell it in Jezreel.” +\v 16 So Jehu rode in a chariot and went to Jezreel, for Joram lay there. Ahaziah king of Judah had come down to see Joram. +\v 17 Now the watchman was standing on the tower in Jezreel, and he spied the company of Jehu as he came, and said, “I see a company.” +\p Joram said, “Take a horseman, and send to meet them, and let him say, ‘Is it peace?’” +\p +\v 18 So one went on horseback to meet him, and said, “the king says, ‘Is it peace?’” +\p Jehu said, “What do you have to do with peace? Fall in behind me!” +\p The watchman said, “The messenger came to them, but he isn’t coming back.” +\p +\v 19 Then he sent out a second on horseback, who came to them and said, “The king says, ‘Is it peace?’” +\p Jehu answered, “What do you have to do with peace? Fall in behind me!” +\p +\v 20 The watchman said, “He came to them, and isn’t coming back. The driving is like the driving of Jehu the son of Nimshi, for he drives furiously.” +\p +\v 21 Joram said, “Get ready!” +\p They got his chariot ready. Then Joram king of Israel and Ahaziah king of Judah went out, each in his chariot; and they went out to meet Jehu, and found him on Naboth the Jezreelite’s land. +\v 22 When Joram saw Jehu, he said, “Is it peace, Jehu?” +\p He answered, “What peace, so long as the prostitution of your mother Jezebel and her witchcraft abound?” +\p +\v 23 Joram turned his hands and fled, and said to Ahaziah, “This is treason, Ahaziah!” +\p +\v 24 Jehu drew his bow with his full strength, and struck Joram between his arms; and the arrow went out at his heart, and he sunk down in his chariot. +\v 25 Then Jehu said to Bidkar his captain, “Pick him up, and throw him in the plot of the field of Naboth the Jezreelite; for remember how, when you and I rode together after Ahab his father, Yahweh laid this burden on him: +\v 26 ‘Surely I have seen yesterday the blood of Naboth, and the blood of his sons,’ says Yahweh; ‘and I will repay you in this plot of ground,’ says Yahweh. Now therefore take and cast him onto the plot of ground, according to Yahweh’s word.” +\p +\v 27 But when Ahaziah the king of Judah saw this, he fled by the way of the garden house. Jehu followed after him, and said, “Strike him also in the chariot!” They struck him at the ascent of Gur, which is by Ibleam. He fled to Megiddo, and died there. +\v 28 His servants carried him in a chariot to Jerusalem, and buried him in his tomb with his fathers in David’s city. +\v 29 In the eleventh year of Joram the son of Ahab, Ahaziah began to reign over Judah. +\p +\v 30 When Jehu had come to Jezreel, Jezebel heard of it; and she painted her eyes, and adorned her head, and looked out at the window. +\v 31 As Jehu entered in at the gate, she said, “Do you come in peace, Zimri, you murderer of your master?” +\p +\v 32 He lifted up his face to the window, and said, “Who is on my side? Who?” +\p Two or three eunuchs looked out at him. +\p +\v 33 He said, “Throw her down!” +\p So they threw her down; and some of her blood was sprinkled on the wall, and on the horses. Then he trampled her under foot. +\v 34 When he had come in, he ate and drank. Then he said, “See now to this cursed woman, and bury her; for she is a king’s daughter.” +\p +\v 35 They went to bury her, but they found no more of her than the skull, the feet, and the palms of her hands. +\v 36 Therefore they came back, and told him. +\p He said, “This is Yahweh’s word, which he spoke by his servant Elijah the Tishbite, saying, ‘The dogs will eat the flesh of Jezebel on the plot of Jezreel, +\v 37 and the body of Jezebel will be as dung on the surface of the field on Jezreel’s land, so that they won’t say, “This is Jezebel.”’” +\c 10 +\p +\v 1 Now Ahab had seventy sons in Samaria. Jehu wrote letters and sent them to Samaria, to the rulers of Jezreel, even the elders, and to those who brought up Ahab’s sons, saying, +\v 2 “Now as soon as this letter comes to you, since your master’s sons are with you, and you have chariots and horses, a fortified city also, and armor, +\v 3 select the best and fittest of your master’s sons, set him on his father’s throne, and fight for your master’s house.” +\p +\v 4 But they were exceedingly afraid, and said, “Behold, the two kings didn’t stand before him! How then shall we stand?” +\v 5 He who was over the household, and he who was over the city, the elders also, and those who raised the children, sent to Jehu, saying, “We are your servants, and will do all that you ask us. We will not make any man king. You do that which is good in your eyes.” +\p +\v 6 Then he wrote a letter the second time to them, saying, “If you are on my side, and if you will listen to my voice, take the heads of the men who are your master’s sons, and come to me to Jezreel by tomorrow this time.” +\p Now the king’s sons, being seventy persons, were with the great men of the city, who brought them up. +\v 7 When the letter came to them, they took the king’s sons and killed them, even seventy people, and put their heads in baskets, and sent them to him to Jezreel. +\v 8 A messenger came and told him, “They have brought the heads of the king’s sons.” +\p He said, “Lay them in two heaps at the entrance of the gate until the morning.” +\v 9 In the morning, he went out and stood, and said to all the people, “You are righteous. Behold, I conspired against my master and killed him, but who killed all these? +\v 10 Know now that nothing will fall to the earth of Yahweh’s word, which Yahweh spoke concerning Ahab’s house. For Yahweh has done that which he spoke by his servant Elijah.” +\p +\v 11 So Jehu struck all that remained of Ahab’s house in Jezreel, with all his great men, his familiar friends, and his priests, until he left him no one remaining. +\p +\v 12 He arose and departed, and went to Samaria. As he was at the shearing house of the shepherds on the way, +\v 13 Jehu met with the brothers of Ahaziah king of Judah, and said, “Who are you?” +\p They answered, “We are the brothers of Ahaziah. We are going down to greet the children of the king and the children of the queen.” +\p +\v 14 He said, “Take them alive!” +\p They took them alive, and killed them at the pit of the shearing house, even forty-two men. He didn’t leave any of them. +\p +\v 15 When he had departed from there, he met Jehonadab the son of Rechab coming to meet him. He greeted him, and said to him, “Is your heart right, as my heart is with your heart?” +\p Jehonadab answered, “It is.” +\p “If it is, give me your hand.” He gave him his hand; and he took him up to him into the chariot. +\v 16 He said, “Come with me, and see my zeal for Yahweh.” So they made him ride in his chariot. +\v 17 When he came to Samaria, he struck all who remained to Ahab in Samaria, until he had destroyed them, according to Yahweh’s word which he spoke to Elijah. +\p +\v 18 Jehu gathered all the people together, and said to them, “Ahab served Baal a little, but Jehu will serve him much. +\v 19 Now therefore call to me all the prophets of Baal, all of his worshipers, and all of his priests. Let no one be absent, for I have a great sacrifice to Baal. Whoever is absent, he shall not live.” But Jehu did deceptively, intending to destroy the worshipers of Baal. +\p +\v 20 Jehu said, “Sanctify a solemn assembly for Baal!” +\p So they proclaimed it. +\v 21 Jehu sent through all Israel; and all the worshipers of Baal came, so that there was not a man left that didn’t come. They came into the house of Baal; and the house of Baal was filled from one end to another. +\v 22 He said to him who kept the wardrobe, “Bring out robes for all the worshipers of Baal!” +\p So he brought robes out to them. +\v 23 Jehu went with Jehonadab the son of Rechab into the house of Baal. Then he said to the worshipers of Baal, “Search, and see that none of the servants of Yahweh are here with you, but only the worshipers of Baal.” +\p +\v 24 So they went in to offer sacrifices and burnt offerings. Now Jehu had appointed for himself eighty men outside, and said, “If any of the men whom I bring into your hands escape, he who lets him go, his life shall be for the life of him.” +\p +\v 25 As soon as he had finished offering the burnt offering, Jehu said to the guard and to the captains, “Go in and kill them! Let no one escape.” So they struck them with the edge of the sword. The guard and the captains threw the bodies out, and went to the inner shrine of the house of Baal. +\v 26 They brought out the pillars that were in the house of Baal and burned them. +\v 27 They broke down the pillar of Baal, and broke down the house of Baal, and made it a latrine, to this day. +\v 28 Thus Jehu destroyed Baal out of Israel. +\p +\v 29 However, Jehu didn’t depart from the sins of Jeroboam the son of Nebat, with which he made Israel to sin—the golden calves that were in Bethel and that were in Dan. +\v 30 Yahweh said to Jehu, “Because you have done well in executing that which is right in my eyes, and have done to Ahab’s house according to all that was in my heart, your descendants shall sit on the throne of Israel to the fourth generation.” +\p +\v 31 But Jehu took no heed to walk in the law of Yahweh, the God of Israel, with all his heart. He didn’t depart from the sins of Jeroboam, with which he made Israel to sin. +\p +\v 32 In those days Yahweh began to cut away parts of Israel; and Hazael struck them in all the borders of Israel +\v 33 from the Jordan eastward, all the land of Gilead, the Gadites, and the Reubenites, and the Manassites, from Aroer, which is by the valley of the Arnon, even Gilead and Bashan. +\v 34 Now the rest of the acts of Jehu, and all that he did, and all his might, aren’t they written in the book of the chronicles of the kings of Israel? +\v 35 Jehu slept with his fathers; and they buried him in Samaria. Jehoahaz his son reigned in his place. +\v 36 The time that Jehu reigned over Israel in Samaria was twenty-eight years. +\c 11 +\p +\v 1 Now when Athaliah the mother of Ahaziah saw that her son was dead, she arose and destroyed all the royal offspring. +\v 2 But Jehosheba, the daughter of King Joram, sister of Ahaziah, took Joash the son of Ahaziah, and stole him away from among the king’s sons who were slain, even him and his nurse, and put them in the bedroom; and they hid him from Athaliah, so that he was not slain. +\v 3 He was with her hidden in Yahweh’s house six years while Athaliah reigned over the land. +\p +\v 4 In the seventh year Jehoiada sent and fetched the captains over hundreds of the Carites and of the guard, and brought them to him into Yahweh’s house; and he made a covenant with them, and made a covenant with them in Yahweh’s house, and showed them the king’s son. +\v 5 He commanded them, saying, “This is what you must do: a third of you, who come in on the Sabbath, shall be keepers of the watch of the king’s house; +\v 6 a third of you shall be at the gate Sur; and a third of you at the gate behind the guard. So you shall keep the watch of the house, and be a barrier. +\v 7 The two companies of you, even all who go out on the Sabbath, shall keep the watch of Yahweh’s house around the king. +\v 8 You shall surround the king, every man with his weapons in his hand; and he who comes within the ranks, let him be slain. Be with the king when he goes out, and when he comes in.” +\p +\v 9 The captains over hundreds did according to all that Jehoiada the priest commanded; and they each took his men, those who were to come in on the Sabbath with those who were to go out on the Sabbath, and came to Jehoiada the priest. +\v 10 The priest delivered to the captains over hundreds the spears and shields that had been King David’s, which were in Yahweh’s house. +\v 11 The guard stood, every man with his weapons in his hand, from the right side of the house to the left side of the house, along by the altar and the house, around the king. +\v 12 Then he brought out the king’s son, and put the crown on him, and gave him the covenant; and they made him king and anointed him; and they clapped their hands, and said, “Long live the king!” +\p +\v 13 When Athaliah heard the noise of the guard and of the people, she came to the people into Yahweh’s house; +\v 14 and she looked, and behold, the king stood by the pillar, as the tradition was, with the captains and the trumpets by the king; and all the people of the land rejoiced, and blew trumpets. Then Athaliah tore her clothes and cried, “Treason! Treason!” +\p +\v 15 Jehoiada the priest commanded the captains of hundreds who were set over the army, and said to them, “Bring her out between the ranks. Kill anyone who follows her with the sword.” For the priest said, “Don’t let her be slain in Yahweh’s house.” +\v 16 So they seized her; and she went by the way of the horses’ entry to the king’s house, and she was slain there. +\p +\v 17 Jehoiada made a covenant between Yahweh and the king and the people, that they should be Yahweh’s people; also between the king and the people. +\v 18 All the people of the land went to the house of Baal, and broke it down. They broke his altars and his images in pieces thoroughly, and killed Mattan the priest of Baal before the altars. The priest appointed officers over Yahweh’s house. +\v 19 He took the captains over hundreds, and the Carites, and the guard, and all the people of the land; and they brought down the king from Yahweh’s house, and came by the way of the gate of the guard to the king’s house. He sat on the throne of the kings. +\v 20 So all the people of the land rejoiced, and the city was quiet. They had slain Athaliah with the sword at the king’s house. +\p +\v 21 Jehoash was seven years old when he began to reign. +\c 12 +\p +\v 1 Jehoash began to reign in the seventh year of Jehu, and he reigned forty years in Jerusalem. His mother’s name was Zibiah of Beersheba. +\v 2 Jehoash did that which was right in Yahweh’s eyes all his days in which Jehoiada the priest instructed him. +\v 3 However, the high places were not taken away. The people still sacrificed and burned incense in the high places. +\p +\v 4 Jehoash said to the priests, “All the money of the holy things that is brought into Yahweh’s house, in current money, the money of the people for whom each man is evaluated,\x + \xo 12:4 \xt Exodus 30:12\x* and all the money that it comes into any man’s heart to bring into Yahweh’s house, +\v 5 let the priests take it to them, each man from his donor; and they shall repair the damage to the house, wherever any damage is found.” +\p +\v 6 But it was so, that in the twenty-third year of King Jehoash the priests had not repaired the damage to the house. +\v 7 Then King Jehoash called for Jehoiada the priest, and for the other priests, and said to them, “Why aren’t you repairing the damage to the house? Now therefore take no more money from your treasurers, but deliver it for repair of the damage to the house.” +\p +\v 8 The priests consented that they should take no more money from the people, and not repair the damage to the house. +\v 9 But Jehoiada the priest took a chest and bored a hole in its lid, and set it beside the altar, on the right side as one comes into Yahweh’s house; and the priests who kept the threshold put all the money that was brought into Yahweh’s house into it. +\v 10 When they saw that there was much money in the chest, the king’s scribe and the high priest came up, and they put it in bags and counted the money that was found in Yahweh’s house. +\v 11 They gave the money that was weighed out into the hands of those who did the work, who had the oversight of Yahweh’s house; and they paid it out to the carpenters and the builders who worked on Yahweh’s house, +\v 12 and to the masons and the stone cutters, and for buying timber and cut stone to repair the damage to Yahweh’s house, and for all that was laid out for the house to repair it. +\v 13 But there were not made for Yahweh’s house cups of silver, snuffers, basins, trumpets, any vessels of gold or vessels of silver, of the money that was brought into Yahweh’s house; +\v 14 for they gave that to those who did the work, and repaired Yahweh’s house with it. +\v 15 Moreover they didn’t demand an accounting from the men into whose hand they delivered the money to give to those who did the work; for they dealt faithfully. +\v 16 The money for the trespass offerings and the money for the sin offerings was not brought into Yahweh’s house. It was the priests’. +\p +\v 17 Then Hazael king of Syria went up and fought against Gath, and took it; and Hazael set his face to go up to Jerusalem. +\v 18 Jehoash king of Judah took all the holy things that Jehoshaphat and Jehoram and Ahaziah, his fathers, kings of Judah, had dedicated, and his own holy things, and all the gold that was found in the treasures of Yahweh’s house, and of the king’s house, and sent it to Hazael king of Syria; and he went away from Jerusalem. +\p +\v 19 Now the rest of the acts of Joash, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 20 His servants arose and made a conspiracy, and struck Joash at the house of Millo, on the way that goes down to Silla. +\v 21 For Jozacar the son of Shimeath, and Jehozabad the son of Shomer, his servants, struck him, and he died; and they buried him with his fathers in David’s city; and Amaziah his son reigned in his place. +\c 13 +\p +\v 1 In the twenty-third year of Joash the son of Ahaziah, king of Judah, Jehoahaz the son of Jehu began to reign over Israel in Samaria for seventeen years. +\v 2 He did that which was evil in Yahweh’s sight, and followed the sins of Jeroboam the son of Nebat, with which he made Israel to sin. He didn’t depart from it. +\v 3 Yahweh’s anger burned against Israel, and he delivered them into the hand of Hazael king of Syria, and into the hand of Benhadad the son of Hazael, continually. +\v 4 Jehoahaz begged Yahweh, and Yahweh listened to him; for he saw the oppression of Israel, how the king of Syria oppressed them. +\v 5 (Yahweh gave Israel a savior, so that they went out from under the hand of the Syrians; and the children of Israel lived in their tents as before. +\v 6 Nevertheless they didn’t depart from the sins of the house of Jeroboam, with which he made Israel to sin, but walked in them; and the Asherah also remained in Samaria.) +\v 7 For he didn’t leave to Jehoahaz of the people any more than fifty horsemen, and ten chariots, and ten thousand footmen; for the king of Syria destroyed them and made them like the dust in threshing. +\v 8 Now the rest of the acts of Jehoahaz, and all that he did, and his might, aren’t they written in the book of the chronicles of the kings of Israel? +\v 9 Jehoahaz slept with his fathers; and they buried him in Samaria; and Joash his son reigned in his place. +\p +\v 10 In the thirty-seventh year of Joash king of Judah, Jehoash the son of Jehoahaz began to reign over Israel in Samaria for sixteen years. +\v 11 He did that which was evil in Yahweh’s sight. He didn’t depart from all the sins of Jeroboam the son of Nebat, with which he made Israel to sin; but he walked in them. +\v 12 Now the rest of the acts of Joash, and all that he did, and his might with which he fought against Amaziah king of Judah, aren’t they written in the book of the chronicles of the kings of Israel? +\v 13 Joash slept with his fathers; and Jeroboam sat on his throne. Joash was buried in Samaria with the kings of Israel. +\p +\v 14 Now Elisha became sick with the illness of which he died; and Joash the king of Israel came down to him, and wept over him, and said, “My father, my father, the chariots of Israel and its horsemen!” +\p +\v 15 Elisha said to him, “Take bow and arrows;” and he took bow and arrows for himself. +\v 16 He said to the king of Israel, “Put your hand on the bow;” and he put his hand on it. Elisha laid his hands on the king’s hands. +\v 17 He said, “Open the window eastward;” and he opened it. Then Elisha said, “Shoot!” and he shot. He said, “Yahweh’s arrow of victory, even the arrow of victory over Syria; for you will strike the Syrians in Aphek until you have consumed them.” +\p +\v 18 He said, “Take the arrows;” and he took them. He said to the king of Israel, “Strike the ground;” and he struck three times, and stopped. +\v 19 The man of God was angry with him, and said, “You should have struck five or six times. Then you would have struck Syria until you had consumed it, but now you will strike Syria just three times.” +\p +\v 20 Elisha died, and they buried him. +\p Now the bands of the Moabites invaded the land at the coming in of the year. +\v 21 As they were burying a man, behold, they saw a band of raiders; and they threw the man into Elisha’s tomb. As soon as the man touched Elisha’s bones, he revived, and stood up on his feet. +\p +\v 22 Hazael king of Syria oppressed Israel all the days of Jehoahaz. +\v 23 But Yahweh was gracious to them, and had compassion on them, and favored them because of his covenant with Abraham, Isaac, and Jacob, and would not destroy them and he didn’t cast them from his presence as yet. +\p +\v 24 Hazael king of Syria died; and Benhadad his son reigned in his place. +\v 25 Jehoash the son of Jehoahaz took again out of the hand of Benhadad the son of Hazael the cities which he had taken out of the hand of Jehoahaz his father by war. Joash struck him three times, and recovered the cities of Israel. +\c 14 +\p +\v 1 In the second year of Joash, son of Joahaz, king of Israel, Amaziah the son of Joash king of Judah began to reign. +\v 2 He was twenty-five years old when he began to reign; and he reigned twenty-nine years in Jerusalem. His mother’s name was Jehoaddin of Jerusalem. +\v 3 He did that which was right in Yahweh’s eyes, yet not like David his father. He did according to all that Joash his father had done. +\v 4 However the high places were not taken away. The people still sacrificed and burned incense in the high places. +\v 5 As soon as the kingdom was established in his hand, he killed his servants who had slain the king his father, +\v 6 but the children of the murderers he didn’t put to death, according to that which is written in the book of the law of Moses, as Yahweh commanded, saying, “The fathers shall not be put to death for the children, nor the children be put to death for the fathers; but every man shall die for his own sin.” +\p +\v 7 He killed ten thousand Edomites in the Valley of Salt, and took Sela by war, and called its name Joktheel, to this day. +\v 8 Then Amaziah sent messengers to Jehoash, the son of Jehoahaz son of Jehu, king of Israel, saying, “Come, let’s look one another in the face.” +\p +\v 9 Jehoash the king of Israel sent to Amaziah king of Judah, saying, “The thistle that was in Lebanon sent to the cedar that was in Lebanon, saying, ‘Give your daughter to my son as wife.’ Then a wild animal that was in Lebanon passed by, and trampled down the thistle. +\v 10 You have indeed struck Edom, and your heart has lifted you up. Enjoy the glory of it, and stay at home; for why should you meddle to your harm, that you fall, even you, and Judah with you?” +\p +\v 11 But Amaziah would not listen. So Jehoash king of Israel went up; and he and Amaziah king of Judah looked one another in the face at Beth Shemesh, which belongs to Judah. +\v 12 Judah was defeated by Israel; and each man fled to his tent. +\v 13 Jehoash king of Israel took Amaziah king of Judah, the son of Jehoash the son of Ahaziah, at Beth Shemesh and came to Jerusalem, then broke down the wall of Jerusalem from the gate of Ephraim to the corner gate, four hundred cubits.\f + \fr 14:13 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* +\v 14 He took all the gold and silver and all the vessels that were found in Yahweh’s house and in the treasures of the king’s house, the hostages also, and returned to Samaria. +\p +\v 15 Now the rest of the acts of Jehoash which he did, and his might, and how he fought with Amaziah king of Judah, aren’t they written in the book of the chronicles of the kings of Israel? +\v 16 Jehoash slept with his fathers, and was buried in Samaria with the kings of Israel; and Jeroboam his son reigned in his place. +\p +\v 17 Amaziah the son of Joash king of Judah lived after the death of Jehoash son of Jehoahaz, king of Israel, fifteen years. +\v 18 Now the rest of the acts of Amaziah, aren’t they written in the book of the chronicles of the kings of Judah? +\v 19 They made a conspiracy against him in Jerusalem, and he fled to Lachish; but they sent after him to Lachish and killed him there. +\v 20 They brought him on horses, and he was buried at Jerusalem with his fathers in David’s city. +\p +\v 21 All the people of Judah took Azariah, who was sixteen years old, and made him king in the place of his father Amaziah. +\v 22 He built Elath and restored it to Judah. After that the king slept with his fathers. +\p +\v 23 In the fifteenth year of Amaziah the son of Joash king of Judah, Jeroboam the son of Joash king of Israel began to reign in Samaria for forty-one years. +\v 24 He did that which was evil in Yahweh’s sight. He didn’t depart from all the sins of Jeroboam the son of Nebat, with which he made Israel to sin. +\v 25 He restored the border of Israel from the entrance of Hamath to the sea of the Arabah, according to Yahweh, the God of Israel’s word, which he spoke by his servant Jonah the son of Amittai, the prophet, who was from Gath Hepher. +\v 26 For Yahweh saw the affliction of Israel, that it was very bitter for all, slave and free; and there was no helper for Israel. +\v 27 Yahweh didn’t say that he would blot out the name of Israel from under the sky; but he saved them by the hand of Jeroboam the son of Joash. +\v 28 Now the rest of the acts of Jeroboam, and all that he did, and his might, how he fought, and how he recovered Damascus, and Hamath, which had belonged to Judah, for Israel, aren’t they written in the book of the chronicles of the kings of Israel? +\v 29 Jeroboam slept with his fathers, even with the kings of Israel; and Zechariah his son reigned in his place. +\c 15 +\p +\v 1 In the twenty-seventh year of Jeroboam king of Israel, Azariah son of Amaziah king of Judah began to reign. +\v 2 He was sixteen years old when he began to reign, and he reigned fifty-two years in Jerusalem. His mother’s name was Jecoliah of Jerusalem. +\v 3 He did that which was right in Yahweh’s eyes, according to all that his father Amaziah had done. +\v 4 However, the high places were not taken away. The people still sacrificed and burned incense in the high places. +\v 5 Yahweh struck the king, so that he was a leper to the day of his death, and lived in a separate house. Jotham, the king’s son, was over the household, judging the people of the land. +\v 6 Now the rest of the acts of Azariah, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 7 Azariah slept with his fathers; and they buried him with his fathers in David’s city; and Jotham his son reigned in his place. +\p +\v 8 In the thirty-eighth year of Azariah king of Judah, Zechariah the son of Jeroboam reigned over Israel in Samaria six months. +\v 9 He did that which was evil in Yahweh’s sight, as his fathers had done. He didn’t depart from the sins of Jeroboam the son of Nebat, with which he made Israel to sin. +\v 10 Shallum the son of Jabesh conspired against him, and struck him before the people and killed him, and reigned in his place. +\v 11 Now the rest of the acts of Zechariah, behold, they are written in the book of the chronicles of the kings of Israel. +\v 12 This was Yahweh’s word which he spoke to Jehu, saying, “Your sons to the fourth generation shall sit on the throne of Israel.” So it came to pass. +\p +\v 13 Shallum the son of Jabesh began to reign in the thirty-ninth year of Uzziah king of Judah, and he reigned for a month in Samaria. +\v 14 Menahem the son of Gadi went up from Tirzah, came to Samaria, struck Shallum the son of Jabesh in Samaria, killed him, and reigned in his place. +\v 15 Now the rest of the acts of Shallum, and his conspiracy which he made, behold, they are written in the book of the chronicles of the kings of Israel. +\p +\v 16 Then Menahem attacked Tiphsah and all who were in it and its border areas, from Tirzah. He attacked it because they didn’t open their gates to him, and he ripped up all their women who were with child. +\p +\v 17 In the thirty ninth year of Azariah king of Judah, Menahem the son of Gadi began to reign over Israel for ten years in Samaria. +\v 18 He did that which was evil in Yahweh’s sight. He didn’t depart all his days from the sins of Jeroboam the son of Nebat, with which he made Israel to sin. +\v 19 Pul the king of Assyria came against the land, and Menahem gave Pul one thousand talents\f + \fr 15:19 \ft A talent is about 30 kilograms or 66 pounds, so 1000 talents is about 30 metric tons\f* of silver, that his hand might be with him to confirm the kingdom in his hand. +\v 20 Menahem exacted the money from Israel, even from all the mighty men of wealth, from each man fifty shekels\f + \fr 15:20 \ft A shekel is about 10 grams or about 0.35 ounces, so 50 shekels was about 0.5 kilograms or 1.1 pounds.\f* of silver, to give to the king of Assyria. So the king of Assyria turned back, and didn’t stay there in the land. +\v 21 Now the rest of the acts of Menahem, and all that he did, aren’t they written in the book of the chronicles of the kings of Israel? +\v 22 Menahem slept with his fathers, and Pekahiah his son reigned in his place. +\p +\v 23 In the fiftieth year of Azariah king of Judah, Pekahiah the son of Menahem began to reign over Israel in Samaria for two years. +\v 24 He did that which was evil in Yahweh’s sight. He didn’t depart from the sins of Jeroboam the son of Nebat, with which he made Israel to sin. +\v 25 Pekah the son of Remaliah, his captain, conspired against him and attacked him in Samaria, in the fortress of the king’s house, with Argob and Arieh; and with him were fifty men of the Gileadites. He killed him, and reigned in his place. +\v 26 Now the rest of the acts of Pekahiah, and all that he did, behold, they are written in the book of the chronicles of the kings of Israel. +\p +\v 27 In the fifty-second year of Azariah king of Judah, Pekah the son of Remaliah began to reign over Israel in Samaria for twenty years. +\v 28 He did that which was evil in Yahweh’s sight. He didn’t depart from the sins of Jeroboam the son of Nebat, with which he made Israel to sin. +\v 29 In the days of Pekah king of Israel, Tiglath Pileser king of Assyria came and took Ijon, Abel Beth Maacah, Janoah, Kedesh, Hazor, Gilead, and Galilee, all the land of Naphtali; and he carried them captive to Assyria. +\v 30 Hoshea the son of Elah made a conspiracy against Pekah the son of Remaliah, attacked him, killed him, and reigned in his place, in the twentieth year of Jotham the son of Uzziah. +\v 31 Now the rest of the acts of Pekah, and all that he did, behold, they are written in the book of the chronicles of the kings of Israel. +\p +\v 32 In the second year of Pekah the son of Remaliah king of Israel, Jotham the son of Uzziah king of Judah began to reign. +\v 33 He was twenty-five years old when he began to reign, and he reigned sixteen years in Jerusalem. His mother’s name was Jerusha the daughter of Zadok. +\v 34 He did that which was right in Yahweh’s eyes. He did according to all that his father Uzziah had done. +\v 35 However the high places were not taken away. The people still sacrificed and burned incense in the high places. He built the upper gate of Yahweh’s house. +\v 36 Now the rest of the acts of Jotham, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 37 In those days, Yahweh began to send Rezin the king of Syria and Pekah the son of Remaliah against Judah. +\v 38 Jotham slept with his fathers, and was buried with his fathers in his father David’s city; and Ahaz his son reigned in his place. +\c 16 +\p +\v 1 In the seventeenth year of Pekah the son of Remaliah, Ahaz the son of Jotham king of Judah began to reign. +\v 2 Ahaz was twenty years old when he began to reign, and he reigned sixteen years in Jerusalem. He didn’t do that which was right in Yahweh his God’s eyes, like David his father. +\v 3 But he walked in the way of the kings of Israel, and even made his son to pass through the fire, according to the abominations of the nations whom Yahweh cast out from before the children of Israel. +\v 4 He sacrificed and burned incense in the high places, on the hills, and under every green tree. +\p +\v 5 Then Rezin king of Syria and Pekah son of Remaliah king of Israel came up to Jerusalem to wage war. They besieged Ahaz, but could not overcome him. +\v 6 At that time Rezin king of Syria recovered Elath to Syria, and drove the Jews from Elath; and the Syrians came to Elath, and lived there to this day. +\v 7 So Ahaz sent messengers to Tiglath Pileser king of Assyria, saying, “I am your servant and your son. Come up and save me out of the hand of the king of Syria and out of the hand of the king of Israel, who rise up against me.” +\v 8 Ahaz took the silver and gold that was found in Yahweh’s house, and in the treasures of the king’s house, and sent it for a present to the king of Assyria. +\v 9 The king of Assyria listened to him; and the king of Assyria went up against Damascus and took it, and carried its people captive to Kir, and killed Rezin. +\p +\v 10 King Ahaz went to Damascus to meet Tiglath Pileser king of Assyria, and saw the altar that was at Damascus; and King Ahaz sent to Urijah the priest a drawing of the altar and plans to build it. +\v 11 Urijah the priest built an altar. According to all that King Ahaz had sent from Damascus, so Urijah the priest made it for the coming of King Ahaz from Damascus. +\v 12 When the king had come from Damascus, the king saw the altar; and the king came near to the altar, and offered on it. +\v 13 He burned his burnt offering and his meal offering, poured his drink offering, and sprinkled the blood of his peace offerings on the altar. +\v 14 The bronze altar, which was before Yahweh, he brought from the front of the house, from between his altar and Yahweh’s house, and put it on the north side of his altar. +\v 15 King Ahaz commanded Urijah the priest, saying, “On the great altar burn the morning burnt offering, the evening meal offering, the king’s burnt offering and his meal offering, with the burnt offering of all the people of the land, their meal offering, and their drink offerings; and sprinkle on it all the blood of the burnt offering, and all the blood of the sacrifice; but the bronze altar will be for me to inquire by.” +\v 16 Urijah the priest did so, according to all that King Ahaz commanded. +\p +\v 17 King Ahaz cut off the panels of the bases, and removed the basin from off them, and took down the sea from off the bronze oxen that were under it, and put it on a pavement of stone. +\v 18 He removed the covered way for the Sabbath that they had built in the house, and the king’s outer entrance to Yahweh’s house, because of the king of Assyria. +\v 19 Now the rest of the acts of Ahaz which he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 20 Ahaz slept with his fathers, and was buried with his fathers in David’s city; and Hezekiah his son reigned in his place. +\c 17 +\p +\v 1 In the twelfth year of Ahaz king of Judah, Hoshea the son of Elah began to reign in Samaria over Israel for nine years. +\v 2 He did that which was evil in Yahweh’s sight, yet not as the kings of Israel who were before him. +\v 3 Shalmaneser king of Assyria came up against him; and Hoshea became his servant, and brought him tribute. +\v 4 The king of Assyria discovered a conspiracy in Hoshea; for he had sent messengers to So king of Egypt, and offered no tribute to the king of Assyria, as he had done year by year. Therefore the king of Assyria seized him, and bound him in prison. +\v 5 Then the king of Assyria came up throughout all the land, went up to Samaria, and besieged it three years. +\v 6 In the ninth year of Hoshea the king of Assyria took Samaria and carried Israel away to Assyria, and placed them in Halah, and on the Habor, the river of Gozan, and in the cities of the Medes. +\p +\v 7 It was so because the children of Israel had sinned against Yahweh their God, who brought them up out of the land of Egypt from under the hand of Pharaoh king of Egypt, and had feared other gods, +\v 8 and walked in the statutes of the nations whom Yahweh cast out from before the children of Israel, and of the kings of Israel, which they made. +\v 9 The children of Israel secretly did things that were not right against Yahweh their God; and they built high places for themselves in all their cities, from the tower of the watchmen to the fortified city; +\v 10 and they set up for themselves pillars and Asherah poles on every high hill and under every green tree; +\v 11 and there they burned incense in all the high places, as the nations whom Yahweh carried away before them did; and they did wicked things to provoke Yahweh to anger; +\v 12 and they served idols, of which Yahweh had said to them, “You shall not do this thing.” +\v 13 Yet Yahweh testified to Israel and to Judah, by every prophet and every seer, saying, “Turn from your evil ways, and keep my commandments and my statutes, according to all the law which I commanded your fathers, and which I sent to you by my servants the prophets.” +\v 14 Notwithstanding, they would not listen, but hardened their neck like the neck of their fathers who didn’t believe in Yahweh their God. +\v 15 They rejected his statutes and his covenant that he made with their fathers, and his testimonies which he testified to them; and they followed vanity, and became vain, and followed the nations that were around them, concerning whom Yahweh had commanded them that they should not do like them. +\v 16 They abandoned all the commandments of Yahweh their God, and made molten images for themselves, even two calves, and made an Asherah, and worshiped all the army of the sky, and served Baal. +\v 17 They caused their sons and their daughters to pass through the fire, used divination and enchantments, and sold themselves to do that which was evil in Yahweh’s sight, to provoke him to anger. +\v 18 Therefore Yahweh was very angry with Israel, and removed them out of his sight. There was none left but the tribe of Judah only. +\p +\v 19 Also Judah didn’t keep the commandments of Yahweh their God, but walked in the statutes of Israel which they made. +\v 20 Yahweh rejected all the offspring of Israel, afflicted them, and delivered them into the hands of raiders, until he had cast them out of his sight. +\v 21 For he tore Israel from David’s house; and they made Jeroboam the son of Nebat king; and Jeroboam drove Israel from following Yahweh, and made them sin a great sin. +\v 22 The children of Israel walked in all the sins of Jeroboam which he did; they didn’t depart from them +\v 23 until Yahweh removed Israel out of his sight, as he said by all his servants the prophets. So Israel was carried away out of their own land to Assyria to this day. +\p +\v 24 The king of Assyria brought people from Babylon, from Cuthah, from Avva, and from Hamath and Sepharvaim, and placed them in the cities of Samaria instead of the children of Israel; and they possessed Samaria and lived in its cities. +\v 25 So it was, at the beginning of their dwelling there, that they didn’t fear Yahweh. Therefore Yahweh sent lions among them, which killed some of them. +\v 26 Therefore they spoke to the king of Assyria, saying, “The nations which you have carried away and placed in the cities of Samaria don’t know the law of the god of the land. Therefore he has sent lions among them; and behold, they kill them, because they don’t know the law of the god of the land.” +\p +\v 27 Then the king of Assyria commanded, saying, “Carry there one of the priests whom you brought from there; and let him\f + \fr 17:27 \ft Hebrew: \fq them\f* go and dwell there, and let him teach them the law of the god of the land.” +\p +\v 28 So one of the priests whom they had carried away from Samaria came and lived in Bethel, and taught them how they should fear Yahweh. +\p +\v 29 However every nation made gods of their own, and put them in the houses of the high places which the Samaritans had made, every nation in their cities in which they lived. +\v 30 The men of Babylon made Succoth Benoth, and the men of Cuth made Nergal, and the men of Hamath made Ashima, +\v 31 and the Avvites made Nibhaz and Tartak; and the Sepharvites burned their children in the fire to Adrammelech and Anammelech, the gods of Sepharvaim. +\v 32 So they feared Yahweh, and also made from among themselves priests of the high places for themselves, who sacrificed for them in the houses of the high places. +\v 33 They feared Yahweh, and also served their own gods, after the ways of the nations from among whom they had been carried away. +\v 34 To this day they do what they did before. They don’t fear Yahweh, and they do not follow the statutes, or the ordinances, or the law, or the commandment which Yahweh commanded the children of Jacob, whom he named Israel; +\v 35 with whom Yahweh had made a covenant and commanded them, saying, “You shall not fear other gods, nor bow yourselves to them, nor serve them, nor sacrifice to them; +\v 36 but you shall fear Yahweh, who brought you up out of the land of Egypt with great power and with an outstretched arm, and you shall bow yourselves to him, and you shall sacrifice to him. +\v 37 The statutes and the ordinances, and the law and the commandment which he wrote for you, you shall observe to do forever more. You shall not fear other gods. +\v 38 You shall not forget the covenant that I have made with you. You shall not fear other gods. +\v 39 But you shall fear Yahweh your God, and he will deliver you out of the hand of all your enemies.” +\p +\v 40 However they didn’t listen, but they did what they did before. +\v 41 So these nations feared Yahweh, and also served their engraved images. Their children did likewise, and so did their children’s children. They do as their fathers did to this day. +\c 18 +\p +\v 1 Now in the third year of Hoshea son of Elah king of Israel, Hezekiah the son of Ahaz king of Judah began to reign. +\v 2 He was twenty-five years old when he began to reign, and he reigned twenty-nine years in Jerusalem. His mother’s name was Abi the daughter of Zechariah. +\v 3 He did that which was right in Yahweh’s eyes, according to all that David his father had done. +\v 4 He removed the high places, broke the pillars, and cut down the Asherah. He also broke in pieces the bronze serpent that Moses had made, because in those days the children of Israel burned incense to it; and he called it Nehushtan. +\v 5 He trusted in Yahweh, the God of Israel, so that after him was no one like him among all the kings of Judah, nor among them that were before him. +\v 6 For he joined with Yahweh. He didn’t depart from following him, but kept his commandments, which Yahweh commanded Moses. +\v 7 Yahweh was with him. Wherever he went, he prospered. He rebelled against the king of Assyria, and didn’t serve him. +\v 8 He struck the Philistines to Gaza and its borders, from the tower of the watchmen to the fortified city. +\p +\v 9 In the fourth year of King Hezekiah, which was the seventh year of Hoshea son of Elah king of Israel, Shalmaneser king of Assyria came up against Samaria and besieged it. +\v 10 At the end of three years they took it. In the sixth year of Hezekiah, which was the ninth year of Hoshea king of Israel, Samaria was taken. +\v 11 The king of Assyria carried Israel away to Assyria, and put them in Halah, and on the Habor, the river of Gozan, and in the cities of the Medes, +\v 12 because they didn’t obey Yahweh their God’s voice, but transgressed his covenant, even all that Moses the servant of Yahweh commanded, and would not hear it or do it. +\p +\v 13 Now in the fourteenth year of King Hezekiah, Sennacherib king of Assyria came up against all the fortified cities of Judah and took them. +\v 14 Hezekiah king of Judah sent to the king of Assyria at Lachish, saying, “I have offended you. Withdraw from me. That which you put on me, I will bear.” The king of Assyria appointed to Hezekiah king of Judah three hundred talents of silver and thirty talents\f + \fr 18:14 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of gold. +\v 15 Hezekiah gave him all the silver that was found in Yahweh’s house and in the treasures of the king’s house. +\v 16 At that time, Hezekiah cut off the gold from the doors of Yahweh’s temple, and from the pillars which Hezekiah king of Judah had overlaid, and gave it to the king of Assyria. +\p +\v 17 The king of Assyria sent Tartan, Rabsaris, and Rabshakeh from Lachish to King Hezekiah with a great army to Jerusalem. They went up and came to Jerusalem. When they had come up, they came and stood by the conduit of the upper pool, which is in the highway of the fuller’s field. +\v 18 When they had called to the king, Eliakim the son of Hilkiah, who was over the household, and Shebnah the scribe, and Joah the son of Asaph the recorder came out to them. +\v 19 Rabshakeh said to them, “Say now to Hezekiah, ‘The great king, the king of Assyria, says, “What confidence is this in which you trust? +\v 20 You say (but they are but vain words), ‘There is counsel and strength for war.’ Now on whom do you trust, that you have rebelled against me? +\v 21 Now, behold, you trust in the staff of this bruised reed, even in Egypt. If a man leans on it, it will go into his hand and pierce it. So is Pharaoh king of Egypt to all who trust on him. +\v 22 But if you tell me, ‘We trust in Yahweh our God,’ isn’t that he whose high places and whose altars Hezekiah has taken away, and has said to Judah and to Jerusalem, ‘You shall worship before this altar in Jerusalem?’ +\v 23 Now therefore, please give pledges to my master the king of Assyria, and I will give you two thousand horses if you are able on your part to set riders on them. +\v 24 How then can you turn away the face of one captain of the least of my master’s servants, and put your trust on Egypt for chariots and for horsemen? +\v 25 Have I now come up without Yahweh against this place to destroy it? Yahweh said to me, ‘Go up against this land, and destroy it.’”’” +\p +\v 26 Then Eliakim the son of Hilkiah, Shebnah, and Joah, said to Rabshakeh, “Please speak to your servants in the Syrian language, for we understand it. Don’t speak with us in the Jews’ language, in the hearing of the people who are on the wall.” +\p +\v 27 But Rabshakeh said to them, “Has my master sent me to your master and to you, to speak these words? Hasn’t he sent me to the men who sit on the wall, to eat their own dung, and to drink their own urine with you?” +\p +\v 28 Then Rabshakeh stood and cried with a loud voice in the Jews’ language, and spoke, saying, “Hear the word of the great king, the king of Assyria. +\v 29 The king says, ‘Don’t let Hezekiah deceive you, for he will not be able to deliver you out of his hand. +\v 30 Don’t let Hezekiah make you trust in Yahweh, saying, “Yahweh will surely deliver us, and this city shall not be given into the hand of the king of Assyria.” +\v 31 Don’t listen to Hezekiah.’ For the king of Assyria says, ‘Make your peace with me, and come out to me; and everyone of you eat from his own vine, and everyone from his own fig tree, and everyone drink water from his own cistern; +\v 32 until I come and take you away to a land like your own land, a land of grain and new wine, a land of bread and vineyards, a land of olive trees and of honey, that you may live and not die. Don’t listen to Hezekiah when he persuades you, saying, “Yahweh will deliver us.” +\v 33 Has any of the gods of the nations ever delivered his land out of the hand of the king of Assyria? +\v 34 Where are the gods of Hamath and of Arpad? Where are the gods of Sepharvaim, of Hena, and Ivvah? Have they delivered Samaria out of my hand? +\v 35 Who are they among all the gods of the countries, that have delivered their country out of my hand, that Yahweh should deliver Jerusalem out of my hand?’” +\p +\v 36 But the people stayed quiet, and answered him not a word; for the king’s commandment was, “Don’t answer him.” +\v 37 Then Eliakim the son of Hilkiah, who was over the household, came with Shebna the scribe and Joah the son of Asaph the recorder to Hezekiah with their clothes torn, and told him Rabshakeh’s words. +\c 19 +\p +\v 1 When King Hezekiah heard it, he tore his clothes, covered himself with sackcloth, and went into Yahweh’s house. +\v 2 He sent Eliakim, who was over the household, Shebna the scribe, and the elders of the priests, covered with sackcloth, to Isaiah the prophet the son of Amoz. +\v 3 They said to him, “Hezekiah says, ‘Today is a day of trouble, of rebuke, and of rejection; for the children have come to the point of birth, and there is no strength to deliver them. +\v 4 It may be Yahweh your God will hear all the words of Rabshakeh, whom the king of Assyria his master has sent to defy the living God, and will rebuke the words which Yahweh your God has heard. Therefore lift up your prayer for the remnant that is left.’” +\p +\v 5 So the servants of King Hezekiah came to Isaiah. +\v 6 Isaiah said to them, “Tell your master this: ‘Yahweh says, “Don’t be afraid of the words that you have heard, with which the servants of the king of Assyria have blasphemed me. +\v 7 Behold, I will put a spirit in him, and he will hear news, and will return to his own land. I will cause him to fall by the sword in his own land.”’” +\p +\v 8 So Rabshakeh returned and found the king of Assyria warring against Libnah; for he had heard that he had departed from Lachish. +\v 9 When he heard it said of Tirhakah king of Ethiopia, “Behold, he has come out to fight against you,” he sent messengers again to Hezekiah, saying, +\v 10 “Tell Hezekiah king of Judah this: ‘Don’t let your God in whom you trust deceive you, saying, Jerusalem will not be given into the hand of the king of Assyria. +\v 11 Behold, you have heard what the kings of Assyria have done to all lands, by destroying them utterly. Will you be delivered? +\v 12 Have the gods of the nations delivered them, which my fathers have destroyed—Gozan, Haran, Rezeph, and the children of Eden who were in Telassar? +\v 13 Where is the king of Hamath, the king of Arpad, and the king of the city of Sepharvaim, of Hena, and Ivvah?’” +\p +\v 14 Hezekiah received the letter from the hand of the messengers and read it. Then Hezekiah went up to Yahweh’s house, and spread it before Yahweh. +\v 15 Hezekiah prayed before Yahweh, and said, “Yahweh, the God of Israel, who are enthroned above the cherubim, you are the God, even you alone, of all the kingdoms of the earth. You have made heaven and earth. +\v 16 Incline your ear, Yahweh, and hear. Open your eyes, Yahweh, and see. Hear the words of Sennacherib, which he has sent to defy the living God. +\v 17 Truly, Yahweh, the kings of Assyria have laid waste the nations and their lands, +\v 18 and have cast their gods into the fire; for they were no gods, but the work of men’s hands, wood and stone. Therefore they have destroyed them. +\v 19 Now therefore, Yahweh our God, save us, I beg you, out of his hand, that all the kingdoms of the earth may know that you, Yahweh, are God alone.” +\p +\v 20 Then Isaiah the son of Amoz sent to Hezekiah, saying, “Yahweh, the God of Israel, says ‘You have prayed to me against Sennacherib king of Assyria, and I have heard you. +\v 21 This is the word that Yahweh has spoken concerning him: ‘The virgin daughter of Zion has despised you and ridiculed you. The daughter of Jerusalem has shaken her head at you. +\v 22 Whom have you defied and blasphemed? Against whom have you exalted your voice and lifted up your eyes on high? Against the Holy One of Israel! +\v 23 By your messengers, you have defied the Lord, and have said, “With the multitude of my chariots, I have come up to the height of the mountains, to the innermost parts of Lebanon, and I will cut down its tall cedars and its choice cypress trees; and I will enter into his farthest lodging place, the forest of his fruitful field. +\v 24 I have dug and drunk strange waters, and I will dry up all the rivers of Egypt with the sole of my feet.” +\v 25 Haven’t you heard how I have done it long ago, and formed it of ancient times? Now I have brought it to pass, that it should be yours to lay waste fortified cities into ruinous heaps. +\v 26 Therefore their inhabitants had little power. They were dismayed and confounded. They were like the grass of the field and like the green herb, like the grass on the housetops and like grain blasted before it has grown up. +\v 27 But I know your sitting down, your going out, your coming in, and your raging against me. +\v 28 Because of your raging against me, and because your arrogance has come up into my ears, therefore I will put my hook in your nose, and my bridle in your lips, and I will turn you back by the way by which you came.’ +\p +\v 29 “This will be the sign to you: This year, you will eat that which grows of itself, and in the second year that which springs from that; and in the third year sow and reap, and plant vineyards and eat their fruit. +\v 30 The remnant that has escaped of the house of Judah will again take root downward, and bear fruit upward. +\v 31 For out of Jerusalem a remnant will go out, and out of Mount Zion those who shall escape. Yahweh’s zeal will perform this. +\p +\v 32 “Therefore Yahweh says concerning the king of Assyria, ‘He will not come to this city, nor shoot an arrow there. He will not come before it with shield, nor cast up a mound against it. +\v 33 He will return the same way that he came, and he will not come to this city,’ says Yahweh. +\v 34 ‘For I will defend this city to save it, for my own sake and for my servant David’s sake.’” +\p +\v 35 That night, Yahweh’s angel went out and struck one hundred eighty-five thousand in the camp of the Assyrians. When men arose early in the morning, behold, these were all dead bodies. +\v 36 So Sennacherib king of Assyria departed, went home, and lived at Nineveh. +\v 37 As he was worshiping in the house of Nisroch his god, Adrammelech and Sharezer struck him with the sword; and they escaped into the land of Ararat. Esar Haddon his son reigned in his place. +\c 20 +\p +\v 1 In those days Hezekiah was sick and dying. Isaiah the prophet the son of Amoz came to him, and said to him, “Yahweh says, ‘Set your house in order; for you will die, and not live.’” +\p +\v 2 Then he turned his face to the wall, and prayed to Yahweh, saying, +\v 3 “Remember now, Yahweh, I beg you, how I have walked before you in truth and with a perfect heart, and have done that which is good in your sight.” And Hezekiah wept bitterly. +\p +\v 4 Before Isaiah had gone out into the middle part of the city, Yahweh’s word came to him, saying, +\v 5 “Turn back, and tell Hezekiah the prince of my people, ‘Yahweh, the God of David your father, says, “I have heard your prayer. I have seen your tears. Behold, I will heal you. On the third day, you will go up to Yahweh’s house. +\v 6 I will add to your days fifteen years. I will deliver you and this city out of the hand of the king of Assyria. I will defend this city for my own sake, and for my servant David’s sake.”’” +\p +\v 7 Isaiah said, “Take a cake of figs.” +\p They took and laid it on the boil, and he recovered. +\p +\v 8 Hezekiah said to Isaiah, “What will be the sign that Yahweh will heal me, and that I will go up to Yahweh’s house the third day?” +\p +\v 9 Isaiah said, “This will be the sign to you from Yahweh, that Yahweh will do the thing that he has spoken: should the shadow go forward ten steps, or go back ten steps?” +\p +\v 10 Hezekiah answered, “It is a light thing for the shadow to go forward ten steps. No, but let the shadow return backward ten steps.” +\p +\v 11 Isaiah the prophet cried to Yahweh; and he brought the shadow ten steps backward, by which it had gone down on the sundial of Ahaz. +\p +\v 12 At that time Berodach Baladan the son of Baladan, king of Babylon, sent letters and a present to Hezekiah, for he had heard that Hezekiah had been sick. +\v 13 Hezekiah listened to them, and showed them all the storehouse of his precious things—the silver, the gold, the spices, and the precious oil, and the house of his armor, and all that was found in his treasures. There was nothing in his house, or in all his dominion, that Hezekiah didn’t show them. +\p +\v 14 Then Isaiah the prophet came to King Hezekiah, and said to him, “What did these men say? From where did they come to you?” +\p Hezekiah said, “They have come from a far country, even from Babylon.” +\p +\v 15 He said, “What have they seen in your house?” +\p Hezekiah answered, “They have seen all that is in my house. There is nothing among my treasures that I have not shown them.” +\p +\v 16 Isaiah said to Hezekiah, “Hear Yahweh’s word. +\v 17 ‘Behold, the days come that all that is in your house, and that which your fathers have laid up in store to this day, will be carried to Babylon. Nothing will be left,’ says Yahweh. +\v 18 ‘They will take away some of your sons who will issue from you, whom you will father; and they will be eunuchs in the palace of the king of Babylon.’” +\p +\v 19 Then Hezekiah said to Isaiah, “Yahweh’s word which you have spoken is good.” He said moreover, “Isn’t it so, if peace and truth will be in my days?” +\p +\v 20 Now the rest of the acts of Hezekiah, and all his might, and how he made the pool, and the conduit, and brought water into the city, aren’t they written in the book of the chronicles of the kings of Judah? +\v 21 Hezekiah slept with his fathers, and Manasseh his son reigned in his place. +\c 21 +\p +\v 1 Manasseh was twelve years old when he began to reign, and he reigned fifty-five years in Jerusalem. His mother’s name was Hephzibah. +\v 2 He did that which was evil in Yahweh’s sight, after the abominations of the nations whom Yahweh cast out before the children of Israel. +\v 3 For he built again the high places which Hezekiah his father had destroyed; and he raised up altars for Baal, and made an Asherah, as Ahab king of Israel did, and worshiped all the army of the sky, and served them. +\v 4 He built altars in Yahweh’s house, of which Yahweh said, “I will put my name in Jerusalem.” +\v 5 He built altars for all the army of the sky in the two courts of Yahweh’s house. +\v 6 He made his son to pass through the fire, practiced sorcery, used enchantments, and dealt with those who had familiar spirits and with wizards. He did much evil in Yahweh’s sight, to provoke him to anger. +\v 7 He set the engraved image of Asherah that he had made in the house of which Yahweh said to David and to Solomon his son, “In this house, and in Jerusalem, which I have chosen out of all the tribes of Israel, I will put my name forever; +\v 8 I will not cause the feet of Israel to wander any more out of the land which I gave their fathers, if only they will observe to do according to all that I have commanded them, and according to all the law that my servant Moses commanded them.” +\v 9 But they didn’t listen, and Manasseh seduced them to do that which is evil more than the nations did whom Yahweh destroyed before the children of Israel. +\p +\v 10 Yahweh spoke by his servants the prophets, saying, +\v 11 “Because Manasseh king of Judah has done these abominations, and has done wickedly above all that the Amorites did, who were before him, and has also made Judah to sin with his idols; +\v 12 therefore Yahweh the God of Israel says, ‘Behold, I will bring such evil on Jerusalem and Judah that whoever hears of it, both his ears will tingle. +\v 13 I will stretch over Jerusalem the line of Samaria, and the plumb line of Ahab’s house; and I will wipe Jerusalem as a man wipes a dish, wiping it and turning it upside down. +\v 14 I will cast off the remnant of my inheritance and deliver them into the hands of their enemies. They will become a prey and a plunder to all their enemies, +\v 15 because they have done that which is evil in my sight, and have provoked me to anger since the day their fathers came out of Egypt, even to this day.’” +\p +\v 16 Moreover Manasseh shed innocent blood very much, until he had filled Jerusalem from one end to another; in addition to his sin with which he made Judah to sin, in doing that which was evil in Yahweh’s sight. +\p +\v 17 Now the rest of the acts of Manasseh, and all that he did, and his sin that he sinned, aren’t they written in the book of the chronicles of the kings of Judah? +\v 18 Manasseh slept with his fathers, and was buried in the garden of his own house, in the garden of Uzza; and Amon his son reigned in his place. +\p +\v 19 Amon was twenty-two years old when he began to reign; and he reigned two years in Jerusalem. His mother’s name was Meshullemeth the daughter of Haruz of Jotbah. +\v 20 He did that which was evil in Yahweh’s sight, as Manasseh his father did. +\v 21 He walked in all the ways that his father walked in, and served the idols that his father served, and worshiped them; +\v 22 and he abandoned Yahweh, the God of his fathers, and didn’t walk in the way of Yahweh. +\v 23 The servants of Amon conspired against him, and put the king to death in his own house. +\v 24 But the people of the land killed all those who had conspired against King Amon; and the people of the land made Josiah his son king in his place. +\v 25 Now the rest of the acts of Amon which he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 26 He was buried in his tomb in the garden of Uzza, and Josiah his son reigned in his place. +\c 22 +\p +\v 1 Josiah was eight years old when he began to reign, and he reigned thirty-one years in Jerusalem. His mother’s name was Jedidah the daughter of Adaiah of Bozkath. +\v 2 He did that which was right in Yahweh’s eyes, and walked in all the ways of David his father, and didn’t turn away to the right hand or to the left. +\p +\v 3 In the eighteenth year of King Josiah, the king sent Shaphan, the son of Azaliah the son of Meshullam, the scribe, to Yahweh’s house, saying, +\v 4 “Go up to Hilkiah the high priest, that he may count the money which is brought into Yahweh’s house, which the keepers of the threshold have gathered of the people. +\v 5 Let them deliver it into the hand of the workers who have the oversight of Yahweh’s house; and let them give it to the workers who are in Yahweh’s house, to repair the damage to the house, +\v 6 to the carpenters, and to the builders, and to the masons, and for buying timber and cut stone to repair the house. +\v 7 However, no accounting shall be asked of them for the money delivered into their hand, for they deal faithfully.” +\p +\v 8 Hilkiah the high priest said to Shaphan the scribe, “I have found the book of the law in Yahweh’s house.” Hilkiah delivered the book to Shaphan, and he read it. +\v 9 Shaphan the scribe came to the king, and brought the king word again, and said, “Your servants have emptied out the money that was found in the house, and have delivered it into the hands of the workmen who have the oversight of Yahweh’s house.” +\v 10 Shaphan the scribe told the king, saying, “Hilkiah the priest has delivered a book to me.” Then Shaphan read it before the king. +\p +\v 11 When the king had heard the words of the book of the law, he tore his clothes. +\v 12 The king commanded Hilkiah the priest, Ahikam the son of Shaphan, Achbor the son of Micaiah, Shaphan the scribe, and Asaiah the king’s servant, saying, +\v 13 “Go inquire of Yahweh for me, and for the people, and for all Judah, concerning the words of this book that is found; for great is Yahweh’s wrath that is kindled against us, because our fathers have not listened to the words of this book, to do according to all that which is written concerning us.” +\p +\v 14 So Hilkiah the priest, Ahikam, Achbor, Shaphan, and Asaiah went to Huldah the prophetess, the wife of Shallum the son of Tikvah, the son of Harhas, keeper of the wardrobe (now she lived in Jerusalem in the second quarter); and they talked with her. +\v 15 She said to them, “Yahweh the God of Israel says, ‘Tell the man who sent you to me, +\v 16 “Yahweh says, ‘Behold, I will bring evil on this place and on its inhabitants, even all the words of the book which the king of Judah has read. +\v 17 Because they have forsaken me and have burned incense to other gods, that they might provoke me to anger with all the work of their hands, therefore my wrath shall be kindled against this place, and it will not be quenched.’” +\v 18 But to the king of Judah, who sent you to inquire of Yahweh, tell him, “Yahweh the God of Israel says, ‘Concerning the words which you have heard, +\v 19 because your heart was tender, and you humbled yourself before Yahweh when you heard what I spoke against this place and against its inhabitants, that they should become a desolation and a curse, and have torn your clothes and wept before me, I also have heard you,’ says Yahweh. +\v 20 ‘Therefore behold, I will gather you to your fathers, and you will be gathered to your grave in peace. Your eyes will not see all the evil which I will bring on this place.’”’” So they brought this message back to the king. +\c 23 +\p +\v 1 The king sent, and they gathered to him all the elders of Judah and of Jerusalem. +\v 2 The king went up to Yahweh’s house, and all the men of Judah and all the inhabitants of Jerusalem with him—with the priests, the prophets, and all the people, both small and great; and he read in their hearing all the words of the book of the covenant which was found in Yahweh’s house. +\v 3 The king stood by the pillar and made a covenant before Yahweh to walk after Yahweh and to keep his commandments, his testimonies, and his statutes with all his heart and all his soul, to confirm the words of this covenant that were written in this book; and all the people agreed to the covenant. +\p +\v 4 The king commanded Hilkiah the high priest, and the priests of the second order, and the keepers of the threshold, to bring out of Yahweh’s temple all the vessels that were made for Baal, for the Asherah, and for all the army of the sky; and he burned them outside of Jerusalem in the fields of the Kidron, and carried their ashes to Bethel. +\v 5 He got rid of the idolatrous priests whom the kings of Judah had ordained to burn incense in the high places in the cities of Judah and in the places around Jerusalem; those also who burned incense to Baal, to the sun, to the moon, to the planets, and to all the army of the sky. +\v 6 He brought out the Asherah from Yahweh’s house, outside of Jerusalem, to the brook Kidron, and burned it at the brook Kidron, and beat it to dust, and cast its dust on the graves of the common people. +\v 7 He broke down the houses of the male shrine prostitutes that were in Yahweh’s house, where the women wove hangings for the Asherah. +\v 8 He brought all the priests out of the cities of Judah, and defiled the high places where the priests had burned incense, from Geba to Beersheba; and he broke down the high places of the gates that were at the entrance of the gate of Joshua the governor of the city, which were on a man’s left hand at the gate of the city. +\v 9 Nevertheless the priests of the high places didn’t come up to Yahweh’s altar in Jerusalem, but they ate unleavened bread among their brothers. +\v 10 He defiled Topheth, which is in the valley of the children of Hinnom, that no man might make his son or his daughter to pass through the fire to Molech. +\v 11 He took away the horses that the kings of Judah had dedicated to the sun, at the entrance of Yahweh’s house, by the room of Nathan Melech the officer who was in the court; and he burned the chariots of the sun with fire. +\v 12 The king broke down the altars that were on the roof of the upper room of Ahaz, which the kings of Judah had made, and the altars which Manasseh had made in the two courts of Yahweh’s house, and beat them down from there, and cast their dust into the brook Kidron. +\v 13 The king defiled the high places that were before Jerusalem, which were on the right hand of the mountain of corruption, which Solomon the king of Israel had built for Ashtoreth the abomination of the Sidonians, and for Chemosh the abomination of Moab, and for Milcom the abomination of the children of Ammon. +\v 14 He broke in pieces the pillars, cut down the Asherah poles, and filled their places with men’s bones. +\p +\v 15 Moreover the altar that was at Bethel and the high place which Jeroboam the son of Nebat, who made Israel to sin, had made, even that altar and the high place he broke down; and he burned the high place and beat it to dust, and burned the Asherah. +\v 16 As Josiah turned himself, he spied the tombs that were there in the mountain; and he sent, and took the bones out of the tombs, and burned them on the altar, and defiled it, according to Yahweh’s word which the man of God proclaimed, who proclaimed these things. +\v 17 Then he said, “What monument is that which I see?” +\p The men of the city told him, “It is the tomb of the man of God who came from Judah and proclaimed these things that you have done against the altar of Bethel.” +\p +\v 18 He said, “Let him be! Let no one move his bones.” So they let his bones alone, with the bones of the prophet who came out of Samaria. +\v 19 All the houses also of the high places that were in the cities of Samaria, which the kings of Israel had made to provoke Yahweh to anger, Josiah took away, and did to them according to all the acts that he had done in Bethel. +\v 20 He killed all the priests of the high places that were there, on the altars, and burned men’s bones on them; and he returned to Jerusalem. +\p +\v 21 The king commanded all the people, saying, “Keep the Passover to Yahweh your God, as it is written in this book of the covenant.” +\v 22 Surely there was not kept such a Passover from the days of the judges who judged Israel, nor in all the days of the kings of Israel, nor of the kings of Judah; +\v 23 but in the eighteenth year of King Josiah, this Passover was kept to Yahweh in Jerusalem. +\p +\v 24 Moreover, Josiah removed those who had familiar spirits, the wizards, and the teraphim,\f + \fr 23:24 \ft teraphim were household idols.\f* and the idols, and all the abominations that were seen in the land of Judah and in Jerusalem, that he might confirm the words of the law which were written in the book that Hilkiah the priest found in Yahweh’s house. +\v 25 There was no king like him before him, who turned to Yahweh with all his heart, and with all his soul, and with all his might, according to all the law of Moses; and there was none like him who arose after him. +\v 26 Notwithstanding, Yahweh didn’t turn from the fierceness of his great wrath, with which his anger burned against Judah, because of all the provocation with which Manasseh had provoked him. +\v 27 Yahweh said, “I will also remove Judah out of my sight, as I have removed Israel; and I will cast off this city which I have chosen, even Jerusalem, and the house of which I said, ‘My name shall be there.’” +\p +\v 28 Now the rest of the acts of Josiah, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 29 In his days Pharaoh Necoh king of Egypt went up against the king of Assyria to the river Euphrates; and King Josiah went against him, but Pharaoh Necoh killed him at Megiddo when he saw him. +\v 30 His servants carried him dead in a chariot from Megiddo, brought him to Jerusalem, and buried him in his own tomb. The people of the land took Jehoahaz the son of Josiah, and anointed him, and made him king in his father’s place. +\p +\v 31 Jehoahaz was twenty-three years old when he began to reign; and he reigned three months in Jerusalem. His mother’s name was Hamutal the daughter of Jeremiah of Libnah. +\v 32 He did that which was evil in Yahweh’s sight, according to all that his fathers had done. +\v 33 Pharaoh Necoh put him in bonds at Riblah in the land of Hamath, that he might not reign in Jerusalem; and put the land to a tribute of one hundred talents of silver and a talent\f + \fr 23:33 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of gold. +\v 34 Pharaoh Necoh made Eliakim the son of Josiah king in the place of Josiah his father, and changed his name to Jehoiakim; but he took Jehoahaz away, and he came to Egypt and died there. +\v 35 Jehoiakim gave the silver and the gold to Pharaoh; but he taxed the land to give the money according to the commandment of Pharaoh. He exacted the silver and the gold of the people of the land, from everyone according to his assessment, to give it to Pharaoh Necoh. +\v 36 Jehoiakim was twenty-five years old when he began to reign, and he reigned eleven years in Jerusalem. His mother’s name was Zebidah the daughter of Pedaiah of Rumah. +\v 37 He did that which was evil in Yahweh’s sight, according to all that his fathers had done. +\c 24 +\p +\v 1 In his days Nebuchadnezzar king of Babylon came up, and Jehoiakim became his servant three years. Then he turned and rebelled against him. +\v 2 Yahweh sent against him bands of the Chaldeans, bands of the Syrians, bands of the Moabites, and bands of the children of Ammon, and sent them against Judah to destroy it, according to Yahweh’s word which he spoke by his servants the prophets. +\v 3 Surely at the commandment of Yahweh this came on Judah, to remove them out of his sight for the sins of Manasseh, according to all that he did, +\v 4 and also for the innocent blood that he shed; for he filled Jerusalem with innocent blood, and Yahweh would not pardon. +\v 5 Now the rest of the acts of Jehoiakim, and all that he did, aren’t they written in the book of the chronicles of the kings of Judah? +\v 6 So Jehoiakim slept with his fathers, and Jehoiachin his son reigned in his place. +\p +\v 7 The king of Egypt didn’t come out of his land any more; for the king of Babylon had taken, from the brook of Egypt to the river Euphrates, all that belonged to the king of Egypt. +\p +\v 8 Jehoiachin was eighteen years old when he began to reign, and he reigned in Jerusalem three months. His mother’s name was Nehushta the daughter of Elnathan of Jerusalem. +\v 9 He did that which was evil in Yahweh’s sight, according to all that his father had done. +\v 10 At that time the servants of Nebuchadnezzar king of Babylon came up to Jerusalem, and the city was besieged. +\v 11 Nebuchadnezzar king of Babylon came to the city while his servants were besieging it, +\v 12 and Jehoiachin the king of Judah went out to the king of Babylon—he, his mother, his servants, his princes, and his officers; and the king of Babylon captured him in the eighth year of his reign. +\v 13 He carried out from there all the treasures of Yahweh’s house and the treasures of the king’s house, and cut in pieces all the vessels of gold which Solomon king of Israel had made in Yahweh’s temple, as Yahweh had said. +\v 14 He carried away all Jerusalem, and all the princes, and all the mighty men of valor, even ten thousand captives, and all the craftsmen and the smiths. No one remained except the poorest people of the land. +\v 15 He carried away Jehoiachin to Babylon, with the king’s mother, the king’s wives, his officers, and the chief men of the land. He carried them into captivity from Jerusalem to Babylon. +\v 16 All the men of might, even seven thousand, and the craftsmen and the smiths one thousand, all of them strong and fit for war, even them the king of Babylon brought captive to Babylon. +\v 17 The king of Babylon made Mattaniah, Jehoiachin’s father’s brother, king in his place, and changed his name to Zedekiah. +\p +\v 18 Zedekiah was twenty-one years old when he began to reign, and he reigned eleven years in Jerusalem. His mother’s name was Hamutal the daughter of Jeremiah of Libnah. +\v 19 He did that which was evil in Yahweh’s sight, according to all that Jehoiakim had done. +\v 20 For through the anger of Yahweh, this happened in Jerusalem and Judah, until he had cast them out from his presence. +\p Then Zedekiah rebelled against the king of Babylon. +\c 25 +\p +\v 1 In the ninth year of his reign, in the tenth month, in the tenth day of the month, Nebuchadnezzar king of Babylon came, he and all his army, against Jerusalem, and encamped against it; and they built forts against it around it. +\v 2 So the city was besieged until the eleventh year of King Zedekiah. +\v 3 On the ninth day of the fourth month, the famine was severe in the city, so that there was no bread for the people of the land. +\v 4 Then a breach was made in the city, and all the men of war fled by night by the way of the gate between the two walls, which was by the king’s garden (now the Chaldeans were against the city around it); and the king went by the way of the Arabah. +\v 5 But the Chaldean army pursued the king, and overtook him in the plains of Jericho; and all his army was scattered from him. +\v 6 Then they captured the king and carried him up to the king of Babylon to Riblah; and they passed judgment on him. +\v 7 They killed Zedekiah’s sons before his eyes, then put out Zedekiah’s eyes, bound him in fetters, and carried him to Babylon. +\p +\v 8 Now in the fifth month, on the seventh day of the month, which was the nineteenth year of King Nebuchadnezzar king of Babylon, Nebuzaradan the captain of the guard, a servant of the king of Babylon, came to Jerusalem. +\v 9 He burned Yahweh’s house, the king’s house, and all the houses of Jerusalem. He burned every great house with fire. +\v 10 All the army of the Chaldeans, who were with the captain of the guard, broke down the walls around Jerusalem. +\v 11 Nebuzaradan the captain of the guard carried away captive the rest of the people who were left in the city and those who had deserted to the king of Babylon—all the rest of the multitude. +\v 12 But the captain of the guard left some of the poorest of the land to work the vineyards and fields. +\p +\v 13 The Chaldeans broke up the pillars of bronze that were in Yahweh’s house and the bases and the bronze sea that were in Yahweh’s house, and carried the bronze pieces to Babylon. +\v 14 They took away the pots, the shovels, the snuffers, the spoons, and all the vessels of bronze with which they ministered. +\v 15 The captain of the guard took away the fire pans, the basins, that which was of gold, for gold, and that which was of silver, for silver. +\v 16 The two pillars, the one sea, and the bases, which Solomon had made for Yahweh’s house, the bronze of all these vessels was not weighed. +\v 17 The height of the one pillar was eighteen cubits,\f + \fr 25:17 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and a capital of bronze was on it. The height of the capital was three cubits, with network and pomegranates on the capital around it, all of bronze; and the second pillar with its network was like these. +\p +\v 18 The captain of the guard took Seraiah the chief priest, Zephaniah the second priest, and the three keepers of the threshold; +\v 19 and out of the city he took an officer who was set over the men of war; and five men of those who saw the king’s face, who were found in the city; and the scribe, the captain of the army, who mustered the people of the land, and sixty men of the people of the land who were found in the city. +\v 20 Nebuzaradan the captain of the guard took them, and brought them to the king of Babylon to Riblah. +\v 21 The king of Babylon attacked them and put them to death at Riblah in the land of Hamath. So Judah was carried away captive out of his land. +\p +\v 22 As for the people who were left in the land of Judah whom Nebuchadnezzar king of Babylon had left, even over them he made Gedaliah the son of Ahikam, the son of Shaphan, governor. +\v 23 Now when all the captains of the forces, they and their men, heard that the king of Babylon had made Gedaliah governor, they came to Gedaliah to Mizpah, even Ishmael the son of Nethaniah, Johanan the son of Kareah, Seraiah the son of Tanhumeth the Netophathite, and Jaazaniah the son of the Maacathite, they and their men. +\v 24 Gedaliah swore to them and to their men, and said to them, “Don’t be afraid because of the servants of the Chaldeans. Dwell in the land and serve the king of Babylon, and it will be well with you.” +\p +\v 25 But in the seventh month, Ishmael the son of Nethaniah, the son of Elishama, of the royal offspring came, and ten men with him, and struck Gedaliah so that he died, with the Jews and the Chaldeans that were with him at Mizpah. +\v 26 All the people, both small and great, and the captains of the forces arose and came to Egypt; for they were afraid of the Chaldeans. +\v 27 In the thirty-seventh year of the captivity of Jehoiachin king of Judah, in the twelfth month, on the twenty-seventh day of the month, Evilmerodach king of Babylon, in the year that he began to reign, released Jehoiachin king of Judah out of prison, +\v 28 and he spoke kindly to him and set his throne above the throne of the kings who were with him in Babylon, +\v 29 and changed his prison garments. Jehoiachin ate bread before him continually all the days of his life; +\v 30 and for his allowance, there was a continual allowance given him from the king, every day a portion, all the days of his life. diff --git a/c-sharp/assets/WEB/131CHengWEBUS.SFM b/c-sharp/assets/WEB/131CHengWEBUS.SFM new file mode 100644 index 0000000000..ab169c8e4c --- /dev/null +++ b/c-sharp/assets/WEB/131CHengWEBUS.SFM @@ -0,0 +1,1216 @@ +\id 1CH World English Bible (WEB) +\ide UTF-8 +\h 1 Chronicles +\toc1 The First Book of Chronicles +\toc2 1 Chronicles +\toc3 1 Chronicles +\mt1 The First Book of Chronicles +\c 1 +\p +\v 1 Adam, Seth, Enosh, +\v 2 Kenan, Mahalalel, Jared, +\v 3 Enoch, Methuselah, Lamech, +\v 4 Noah, Shem, Ham, and Japheth. +\p +\v 5 The sons of Japheth: Gomer, Magog, Madai, Javan, Tubal, Meshech, and Tiras. +\v 6 The sons of Gomer: Ashkenaz, Diphath, and Togarmah. +\v 7 The sons of Javan: Elishah, Tarshish, Kittim, and Rodanim. +\p +\v 8 The sons of Ham: Cush, Mizraim, Put, and Canaan. +\v 9 The sons of Cush: Seba, Havilah, Sabta, Raama, Sabteca. The sons of Raamah: Sheba and Dedan. +\v 10 Cush became the father of Nimrod. He began to be a mighty one in the earth. +\v 11 Mizraim became the father of Ludim, Anamim, Lehabim, Naphtuhim, +\v 12 Pathrusim, Casluhim (where the Philistines came from), and Caphtorim. +\v 13 Canaan became the father of Sidon his firstborn, Heth, +\v 14 the Jebusite, the Amorite, the Girgashite, +\v 15 the Hivite, the Arkite, the Sinite, +\v 16 the Arvadite, the Zemarite, and the Hamathite. +\p +\v 17 The sons of Shem: Elam, Asshur, Arpachshad, Lud, Aram, Uz, Hul, Gether, and Meshech. +\v 18 Arpachshad became the father of Shelah, and Shelah became the father of Eber. +\v 19 To Eber were born two sons: the name of the one was Peleg, for in his days the earth was divided; and his brother’s name was Joktan. +\v 20 Joktan became the father of Almodad, Sheleph, Hazarmaveth, Jerah, +\v 21 Hadoram, Uzal, Diklah, +\v 22 Ebal, Abimael, Sheba, +\v 23 Ophir, Havilah, and Jobab. All these were the sons of Joktan. +\v 24 Shem, Arpachshad, Shelah, +\v 25 Eber, Peleg, Reu, +\v 26 Serug, Nahor, Terah, +\v 27 Abram (also called Abraham). +\p +\v 28 The sons of Abraham: Isaac and Ishmael. +\v 29 These are their generations: the firstborn of Ishmael, Nebaioth; then Kedar, Adbeel, Mibsam, +\v 30 Mishma, Dumah, Massa, Hadad, Tema, +\v 31 Jetur, Naphish, and Kedemah. These are the sons of Ishmael. +\p +\v 32 The sons of Keturah, Abraham’s concubine: she bore Zimran, Jokshan, Medan, Midian, Ishbak, and Shuah. The sons of Jokshan: Sheba and Dedan. +\v 33 The sons of Midian: Ephah, Epher, Hanoch, Abida, and Eldaah. All these were the sons of Keturah. +\p +\v 34 Abraham became the father of Isaac. The sons of Isaac: Esau and Israel. +\v 35 The sons of Esau: Eliphaz, Reuel, Jeush, Jalam, and Korah. +\v 36 The sons of Eliphaz: Teman, Omar, Zephi, Gatam, Kenaz, Timna, and Amalek. +\v 37 The sons of Reuel: Nahath, Zerah, Shammah, and Mizzah. +\p +\v 38 The sons of Seir: Lotan, Shobal, Zibeon, Anah, Dishon, Ezer, and Dishan. +\v 39 The sons of Lotan: Hori and Homam; and Timna was Lotan’s sister. +\v 40 The sons of Shobal: Alian, Manahath, Ebal, Shephi, and Onam. The sons of Zibeon: Aiah and Anah. +\v 41 The son of Anah: Dishon. The sons of Dishon: Hamran, Eshban, Ithran, and Cheran. +\v 42 The sons of Ezer: Bilhan, Zaavan, and Jaakan. The sons of Dishan: Uz and Aran. +\p +\v 43 Now these are the kings who reigned in the land of Edom, before any king reigned over the children of Israel: Bela the son of Beor; and the name of his city was Dinhabah. +\v 44 Bela died, and Jobab the son of Zerah of Bozrah reigned in his place. +\v 45 Jobab died, and Husham of the land of the Temanites reigned in his place. +\v 46 Husham died, and Hadad the son of Bedad, who struck Midian in the field of Moab, reigned in his place; and the name of his city was Avith. +\v 47 Hadad died, and Samlah of Masrekah reigned in his place. +\v 48 Samlah died, and Shaul of Rehoboth by the River reigned in his place. +\v 49 Shaul died, and Baal Hanan the son of Achbor reigned in his place. +\v 50 Baal Hanan died, and Hadad reigned in his place; and the name of his city was Pai. His wife’s name was Mehetabel, the daughter of Matred, the daughter of Mezahab. +\v 51 Then Hadad died. The chiefs of Edom were: chief Timna, chief Aliah, chief Jetheth, +\v 52 chief Oholibamah, chief Elah, chief Pinon, +\v 53 chief Kenaz, chief Teman, chief Mibzar, +\v 54 chief Magdiel, and chief Iram. These are the chiefs of Edom. +\c 2 +\p +\v 1 These are the sons of Israel: Reuben, Simeon, Levi, Judah, Issachar, Zebulun, +\v 2 Dan, Joseph, Benjamin, Naphtali, Gad, and Asher. +\p +\v 3 The sons of Judah: Er, Onan, and Shelah, which three were born to him of Shua’s daughter the Canaanitess. Er, Judah’s firstborn, was wicked in Yahweh’s\f + \fr 2:3 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* sight; and he killed him. +\v 4 Tamar his daughter-in-law bore him Perez and Zerah. All the sons of Judah were five. +\p +\v 5 The sons of Perez: Hezron and Hamul. +\v 6 The sons of Zerah: Zimri, Ethan, Heman, Calcol, and Dara—five of them in all. +\v 7 The son of Carmi: Achar, the troubler of Israel, who committed a trespass in the devoted thing. +\v 8 The son of Ethan: Azariah. +\p +\v 9 The sons also of Hezron, who were born to him: Jerahmeel, Ram, and Chelubai. +\v 10 Ram became the father of Amminadab, and Amminadab became the father of Nahshon, prince of the children of Judah; +\v 11 and Nahshon became the father of Salma, and Salma became the father of Boaz, +\v 12 and Boaz became the father of Obed, and Obed became the father of Jesse; +\v 13 and Jesse became the father of his firstborn Eliab, Abinadab the second, Shimea the third, +\v 14 Nethanel the fourth, Raddai the fifth, +\v 15 Ozem the sixth, and David the seventh; +\v 16 and their sisters were Zeruiah and Abigail. The sons of Zeruiah: Abishai, Joab, and Asahel, three. +\v 17 Abigail bore Amasa; and the father of Amasa was Jether the Ishmaelite. +\p +\v 18 Caleb the son of Hezron became the father of children by Azubah his wife, and by Jerioth; and these were her sons: Jesher, Shobab, and Ardon. +\v 19 Azubah died, and Caleb married Ephrath, who bore him Hur. +\v 20 Hur became the father of Uri, and Uri became the father of Bezalel. +\p +\v 21 Afterward Hezron went in to the daughter of Machir the father of Gilead, whom he took as wife when he was sixty years old; and she bore him Segub. +\v 22 Segub became the father of Jair, who had twenty-three cities in the land of Gilead. +\v 23 Geshur and Aram took the towns of Jair from them, with Kenath, and its villages, even sixty cities. All these were the sons of Machir the father of Gilead. +\v 24 After Hezron died in Caleb Ephrathah, Abijah, Hezron’s wife, bore him Ashhur the father of Tekoa. +\p +\v 25 The sons of Jerahmeel the firstborn of Hezron were Ram the firstborn, Bunah, Oren, Ozem, and Ahijah. +\v 26 Jerahmeel had another wife, whose name was Atarah. She was the mother of Onam. +\v 27 The sons of Ram the firstborn of Jerahmeel were Maaz, Jamin, and Eker. +\v 28 The sons of Onam were Shammai and Jada. The sons of Shammai: Nadab and Abishur. +\v 29 The name of the wife of Abishur was Abihail; and she bore him Ahban and Molid. +\v 30 The sons of Nadab: Seled and Appaim; but Seled died without children. +\v 31 The son of Appaim: Ishi. The son of Ishi: Sheshan. The son of Sheshan: Ahlai. +\v 32 The sons of Jada the brother of Shammai: Jether and Jonathan; and Jether died without children. +\v 33 The sons of Jonathan: Peleth and Zaza. These were the sons of Jerahmeel. +\v 34 Now Sheshan had no sons, but only daughters. Sheshan had a servant, an Egyptian, whose name was Jarha. +\v 35 Sheshan gave his daughter to Jarha his servant as wife; and she bore him Attai. +\v 36 Attai became the father of Nathan, and Nathan became the father of Zabad, +\v 37 and Zabad became the father of Ephlal, and Ephlal became the father of Obed, +\v 38 and Obed became the father of Jehu, and Jehu became the father of Azariah, +\v 39 and Azariah became the father of Helez, and Helez became the father of Eleasah, +\v 40 and Eleasah became the father of Sismai, and Sismai became the father of Shallum, +\v 41 and Shallum became the father of Jekamiah, and Jekamiah became the father of Elishama. +\p +\v 42 The sons of Caleb the brother of Jerahmeel were Mesha his firstborn, who was the father of Ziph, and the sons of Mareshah the father of Hebron. +\v 43 The sons of Hebron: Korah, Tappuah, Rekem, and Shema. +\v 44 Shema became the father of Raham, the father of Jorkeam; and Rekem became the father of Shammai. +\v 45 The son of Shammai was Maon; and Maon was the father of Beth Zur. +\v 46 Ephah, Caleb’s concubine, bore Haran, Moza, and Gazez; and Haran became the father of Gazez. +\v 47 The sons of Jahdai: Regem, Jothan, Geshan, Pelet, Ephah, and Shaaph. +\v 48 Maacah, Caleb’s concubine, bore Sheber and Tirhanah. +\v 49 She bore also Shaaph the father of Madmannah, Sheva the father of Machbena and the father of Gibea; and the daughter of Caleb was Achsah. +\p +\v 50 These were the sons of Caleb, the son of Hur, the firstborn of Ephrathah: Shobal the father of Kiriath Jearim, +\v 51 Salma the father of Bethlehem, and Hareph the father of Beth Gader. +\v 52 Shobal the father of Kiriath Jearim had sons: Haroeh, half of the Menuhoth. +\v 53 The families of Kiriath Jearim: the Ithrites, the Puthites, the Shumathites, and the Mishraites; from them came the Zorathites and the Eshtaolites. +\v 54 The sons of Salma: Bethlehem, the Netophathites, Atroth Beth Joab, and half of the Manahathites, the Zorites. +\v 55 The families of scribes who lived at Jabez: the Tirathites, the Shimeathites, and the Sucathites. These are the Kenites who came from Hammath, the father of the house of Rechab. +\c 3 +\p +\v 1 Now these were the sons of David, who were born to him in Hebron: the firstborn, Amnon, of Ahinoam the Jezreelitess; the second, Daniel, of Abigail the Carmelitess; +\v 2 the third, Absalom the son of Maacah the daughter of Talmai king of Geshur; the fourth, Adonijah the son of Haggith; +\v 3 the fifth, Shephatiah of Abital; the sixth, Ithream by Eglah his wife: +\v 4 six were born to him in Hebron; and he reigned there seven years and six months. He reigned thirty-three years in Jerusalem; +\v 5 and these were born to him in Jerusalem: Shimea, Shobab, Nathan, and Solomon, four, by Bathshua the daughter of Ammiel; +\v 6 and Ibhar, Elishama, Eliphelet, +\v 7 Nogah, Nepheg, Japhia, +\v 8 Elishama, Eliada, and Eliphelet, nine. +\v 9 All these were the sons of David, in addition to the sons of the concubines; and Tamar was their sister. +\p +\v 10 Solomon’s son was Rehoboam, Abijah his son, Asa his son, Jehoshaphat his son, +\v 11 Joram his son, Ahaziah his son, Joash his son, +\v 12 Amaziah his son, Azariah his son, Jotham his son, +\v 13 Ahaz his son, Hezekiah his son, Manasseh his son, +\v 14 Amon his son, and Josiah his son. +\v 15 The sons of Josiah: the firstborn Johanan, the second Jehoiakim, the third Zedekiah, and the fourth Shallum. +\v 16 The sons of Jehoiakim: Jeconiah his son, and Zedekiah his son. +\v 17 The sons of Jeconiah, the captive: Shealtiel his son, +\v 18 Malchiram, Pedaiah, Shenazzar, Jekamiah, Hoshama, and Nedabiah. +\v 19 The sons of Pedaiah: Zerubbabel and Shimei. The sons of Zerubbabel: Meshullam and Hananiah; and Shelomith was their sister; +\v 20 and Hashubah, Ohel, Berechiah, Hasadiah, and Jushab Hesed, five. +\v 21 The sons of Hananiah: Pelatiah and Jeshaiah; the sons of Rephaiah, the sons of Arnan, the sons of Obadiah, the sons of Shecaniah. +\v 22 The son of Shecaniah: Shemaiah. The sons of Shemaiah: Hattush, Igal, Bariah, Neariah, and Shaphat, six. +\v 23 The sons of Neariah: Elioenai, Hizkiah, and Azrikam, three. +\v 24 The sons of Elioenai: Hodaviah, Eliashib, Pelaiah, Akkub, Johanan, Delaiah, and Anani, seven. +\c 4 +\p +\v 1 The sons of Judah: Perez, Hezron, Carmi, Hur, and Shobal. +\v 2 Reaiah the son of Shobal became the father of Jahath; and Jahath became the father of Ahumai and Lahad. These are the families of the Zorathites. +\v 3 These were the sons of the father of Etam: Jezreel, Ishma, and Idbash. The name of their sister was Hazzelelponi. +\v 4 Penuel was the father of Gedor and Ezer the father of Hushah. These are the sons of Hur, the firstborn of Ephrathah, the father of Bethlehem. +\v 5 Ashhur the father of Tekoa had two wives, Helah and Naarah. +\v 6 Naarah bore him Ahuzzam, Hepher, Temeni, and Haahashtari. These were the sons of Naarah. +\v 7 The sons of Helah were Zereth, Izhar, and Ethnan. +\v 8 Hakkoz became the father of Anub, Zobebah, and the families of Aharhel the son of Harum. +\p +\v 9 Jabez was more honorable than his brothers. His mother named him Jabez,\f + \fr 4:9 \ft “Jabez” sounds similar to the Hebrew word for “pain”.\f* saying, “Because I bore him with sorrow.” +\p +\v 10 Jabez called on the God\f + \fr 4:10 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* of Israel, saying, “Oh that you would bless me indeed, and enlarge my border! May your hand be with me, and may you keep me from evil, that I may not cause pain!” +\p God granted him that which he requested. +\p +\v 11 Chelub the brother of Shuhah became the father of Mehir, who was the father of Eshton. +\v 12 Eshton became the father of Beth Rapha, Paseah, and Tehinnah the father of Ir Nahash. These are the men of Recah. +\v 13 The sons of Kenaz: Othniel and Seraiah. The sons of Othniel: Hathath.\f + \fr 4:13 \ft Greek and Vulgate add “and Meonothai”\f* +\v 14 Meonothai became the father of Ophrah: and Seraiah became the father of Joab the father of Ge Harashim, for they were craftsmen. +\v 15 The sons of Caleb the son of Jephunneh: Iru, Elah, and Naam. The son of Elah: Kenaz. +\v 16 The sons of Jehallelel: Ziph, Ziphah, Tiria, and Asarel. +\v 17 The sons of Ezrah: Jether, Mered, Epher, and Jalon; and Mered’s wife bore Miriam, Shammai, and Ishbah the father of Eshtemoa. +\v 18 His wife the Jewess bore Jered the father of Gedor, Heber the father of Soco, and Jekuthiel the father of Zanoah. These are the sons of Bithiah the daughter of Pharaoh, whom Mered took. +\v 19 The sons of the wife of Hodiah, the sister of Naham, were the fathers of Keilah the Garmite and Eshtemoa the Maacathite. +\v 20 The sons of Shimon: Amnon, Rinnah, Ben Hanan, and Tilon. The sons of Ishi: Zoheth, and Ben Zoheth. +\v 21 The sons of Shelah the son of Judah: Er the father of Lecah, Laadah the father of Mareshah, and the families of the house of those who worked fine linen, of the house of Ashbea; +\v 22 and Jokim, and the men of Cozeba, and Joash, and Saraph, who had dominion in Moab, and Jashubilehem. These records are ancient. +\v 23 These were the potters, and the inhabitants of Netaim and Gederah; they lived there with the king for his work. +\p +\v 24 The sons of Simeon: Nemuel, Jamin, Jarib, Zerah, Shaul; +\v 25 Shallum his son, Mibsam his son, and Mishma his son. +\v 26 The sons of Mishma: Hammuel his son, Zaccur his son, Shimei his son. +\v 27 Shimei had sixteen sons and six daughters; but his brothers didn’t have many children, and all their family didn’t multiply like the children of Judah. +\v 28 They lived at Beersheba, Moladah, Hazarshual, +\v 29 at Bilhah, at Ezem, at Tolad, +\v 30 at Bethuel, at Hormah, at Ziklag, +\v 31 at Beth Marcaboth, Hazar Susim, at Beth Biri, and at Shaaraim. These were their cities until David’s reign. +\v 32 Their villages were Etam, Ain, Rimmon, Tochen, and Ashan, five cities; +\v 33 and all their villages that were around the same cities, as far as Baal. These were their settlements, and they kept their genealogy. +\v 34 Meshobab, Jamlech, Joshah the son of Amaziah, +\v 35 Joel, Jehu the son of Joshibiah, the son of Seraiah, the son of Asiel, +\v 36 Elioenai, Jaakobah, Jeshohaiah, Asaiah, Adiel, Jesimiel, Benaiah, +\v 37 and Ziza the son of Shiphi, the son of Allon, the son of Jedaiah, the son of Shimri, the son of Shemaiah— +\v 38 these mentioned by name were princes in their families. Their fathers’ houses increased greatly. +\p +\v 39 They went to the entrance of Gedor, even to the east side of the valley, to seek pasture for their flocks. +\v 40 They found rich, good pasture, and the land was wide, and quiet, and peaceful, for those who lived there before were descended from Ham. +\v 41 These written by name came in the days of Hezekiah king of Judah, and struck their tents and the Meunim who were found there; and they destroyed them utterly to this day, and lived in their place, because there was pasture there for their flocks. +\v 42 Some of them, even of the sons of Simeon, five hundred men, went to Mount Seir, having for their captains Pelatiah, Neariah, Rephaiah, and Uzziel, the sons of Ishi. +\v 43 They struck the remnant of the Amalekites who escaped, and have lived there to this day. +\c 5 +\p +\v 1 The sons of Reuben the firstborn of Israel (for he was the firstborn, but because he defiled his father’s couch, his birthright was given to the sons of Joseph the son of Israel; and the genealogy is not to be listed according to the birthright. +\v 2 For Judah prevailed above his brothers, and from him came the prince; but the birthright was Joseph’s)— +\v 3 the sons of Reuben the firstborn of Israel: Hanoch, Pallu, Hezron, and Carmi. +\v 4 The sons of Joel: Shemaiah his son, Gog his son, Shimei his son, +\v 5 Micah his son, Reaiah his son, Baal his son, +\v 6 and Beerah his son, whom Tilgath Pilneser king of Assyria carried away captive. He was prince of the Reubenites. +\v 7 His brothers by their families, when the genealogy of their generations was listed: the chief, Jeiel, and Zechariah, +\v 8 and Bela the son of Azaz, the son of Shema, the son of Joel, who lived in Aroer, even to Nebo and Baal Meon; +\v 9 and he lived eastward even to the entrance of the wilderness from the river Euphrates, because their livestock were multiplied in the land of Gilead. +\p +\v 10 In the days of Saul, they made war with the Hagrites, who fell by their hand; and they lived in their tents throughout all the land east of Gilead. +\p +\v 11 The sons of Gad lived beside them in the land of Bashan to Salecah: +\v 12 Joel the chief, Shapham the second, Janai, and Shaphat in Bashan. +\v 13 Their brothers of their fathers’ houses: Michael, Meshullam, Sheba, Jorai, Jacan, Zia, and Eber, seven. +\v 14 These were the sons of Abihail, the son of Huri, the son of Jaroah, the son of Gilead, the son of Michael, the son of Jeshishai, the son of Jahdo, the son of Buz; +\v 15 Ahi the son of Abdiel, the son of Guni, chief of their fathers’ houses. +\v 16 They lived in Gilead in Bashan and in its towns, and in all the pasture lands of Sharon as far as their borders. +\v 17 All these were listed by genealogies in the days of Jotham king of Judah, and in the days of Jeroboam king of Israel. +\p +\v 18 The sons of Reuben, the Gadites, and the half-tribe of Manasseh, of valiant men, men able to bear buckler and sword, able to shoot with bow, and skillful in war, were forty-four thousand seven hundred sixty that were able to go out to war. +\v 19 They made war with the Hagrites, with Jetur, and Naphish, and Nodab. +\v 20 They were helped against them, and the Hagrites were delivered into their hand, and all who were with them; for they cried to God in the battle, and he answered them because they put their trust in him. +\v 21 They took away their livestock: of their camels fifty thousand, and of sheep two hundred fifty thousand, and of donkeys two thousand, and of men one hundred thousand. +\v 22 For many fell slain, because the war was of God. They lived in their place until the captivity. +\p +\v 23 The children of the half-tribe of Manasseh lived in the land. They increased from Bashan to Baal Hermon, Senir, and Mount Hermon. +\v 24 These were the heads of their fathers’ houses: Epher, Ishi, Eliel, Azriel, Jeremiah, Hodaviah, and Jahdiel—mighty men of valor, famous men, heads of their fathers’ houses. +\v 25 They trespassed against the God of their fathers, and played the prostitute after the gods of the peoples of the land whom God destroyed before them. +\v 26 So the God of Israel stirred up the spirit of Pul king of Assyria, and the spirit of Tilgath Pilneser king of Assyria, and he carried away the Reubenites, the Gadites, and the half-tribe of Manasseh, and brought them to Halah, Habor, Hara, and to the river of Gozan, to this day. +\c 6 +\p +\v 1 The sons of Levi: Gershon, Kohath, and Merari. +\v 2 The sons of Kohath: Amram, Izhar, Hebron, and Uzziel. +\v 3 The children of Amram: Aaron, Moses, and Miriam. The sons of Aaron: Nadab, Abihu, Eleazar, and Ithamar. +\v 4 Eleazar became the father of Phinehas, Phinehas became the father of Abishua, +\v 5 Abishua became the father of Bukki. Bukki became the father of Uzzi. +\v 6 Uzzi became the father of Zerahiah. Zerahiah became the father of Meraioth. +\v 7 Meraioth became the father of Amariah. Amariah became the father of Ahitub. +\v 8 Ahitub became the father of Zadok. Zadok became the father of Ahimaaz. +\v 9 Ahimaaz became the father of Azariah. Azariah became the father of Johanan. +\v 10 Johanan became the father of Azariah, who executed the priest’s office in the house that Solomon built in Jerusalem. +\v 11 Azariah became the father of Amariah. Amariah became the father of Ahitub. +\v 12 Ahitub became the father of Zadok. Zadok became the father of Shallum. +\v 13 Shallum became the father of Hilkiah. Hilkiah became the father of Azariah. +\v 14 Azariah became the father of Seraiah. Seraiah became the father of Jehozadak. +\v 15 Jehozadak went into captivity when Yahweh carried Judah and Jerusalem away by the hand of Nebuchadnezzar. +\p +\v 16 The sons of Levi: Gershom, Kohath, and Merari. +\v 17 These are the names of the sons of Gershom: Libni and Shimei. +\v 18 The sons of Kohath were Amram, Izhar, Hebron, and Uzziel. +\v 19 The sons of Merari: Mahli and Mushi. These are the families of the Levites according to their fathers’ households. +\v 20 Of Gershom: Libni his son, Jahath his son, Zimmah his son, +\v 21 Joah his son, Iddo his son, Zerah his son, and Jeatherai his son. +\v 22 The sons of Kohath: Amminadab his son, Korah his son, Assir his son, +\v 23 Elkanah his son, Ebiasaph his son, Assir his son, +\v 24 Tahath his son, Uriel his son, Uzziah his son, and Shaul his son. +\v 25 The sons of Elkanah: Amasai and Ahimoth. +\v 26 As for Elkanah, the sons of Elkanah: Zophai his son, Nahath his son, +\v 27 Eliab his son, Jeroham his son, and Elkanah his son. +\v 28 The sons of Samuel: the firstborn, Joel, and the second, Abijah. +\v 29 The sons of Merari: Mahli, Libni his son, Shimei his son, Uzzah his son, +\v 30 Shimea his son, Haggiah his son, Asaiah his son. +\p +\v 31 These are they whom David set over the service of song in Yahweh’s house after the ark came to rest there. +\v 32 They ministered with song before the tabernacle of the Tent of Meeting until Solomon had built Yahweh’s house in Jerusalem. They performed the duties of their office according to their order. +\v 33 These are those who served, and their sons. Of the sons of the Kohathites: Heman the singer, the son of Joel, the son of Samuel, +\v 34 the son of Elkanah, the son of Jeroham, the son of Eliel, the son of Toah, +\v 35 the son of Zuph, the son of Elkanah, the son of Mahath, the son of Amasai, +\v 36 the son of Elkanah, the son of Joel, the son of Azariah, the son of Zephaniah, +\v 37 the son of Tahath, the son of Assir, the son of Ebiasaph, the son of Korah, +\v 38 the son of Izhar, the son of Kohath, the son of Levi, the son of Israel. +\v 39 His brother Asaph, who stood on his right hand, even Asaph the son of Berechiah, the son of Shimea, +\v 40 the son of Michael, the son of Baaseiah, the son of Malchijah, +\v 41 the son of Ethni, the son of Zerah, the son of Adaiah, +\v 42 the son of Ethan, the son of Zimmah, the son of Shimei, +\v 43 the son of Jahath, the son of Gershom, the son of Levi. +\v 44 On the left hand their brothers the sons of Merari: Ethan the son of Kishi, the son of Abdi, the son of Malluch, +\v 45 the son of Hashabiah, the son of Amaziah, the son of Hilkiah, +\v 46 the son of Amzi, the son of Bani, the son of Shemer, +\v 47 the son of Mahli, the son of Mushi, the son of Merari, the son of Levi. +\v 48 Their brothers the Levites were appointed for all the service of the tabernacle of God’s house. +\v 49 But Aaron and his sons offered on the altar of burnt offering, and on the altar of incense, for all the work of the most holy place, and to make atonement for Israel, according to all that Moses the servant of God had commanded. +\p +\v 50 These are the sons of Aaron: Eleazar his son, Phinehas his son, Abishua his son, +\v 51 Bukki his son, Uzzi his son, Zerahiah his son, +\v 52 Meraioth his son, Amariah his son, Ahitub his son, +\v 53 Zadok his son, and Ahimaaz his son. +\v 54 Now these are their dwelling places according to their encampments in their borders: to the sons of Aaron, of the families of the Kohathites (for theirs was the first lot), +\v 55 to them they gave Hebron in the land of Judah, and its pasture lands around it; +\v 56 but the fields of the city and its villages, they gave to Caleb the son of Jephunneh. +\v 57 To the sons of Aaron they gave the cities of refuge, Hebron, Libnah also with its pasture lands, Jattir, Eshtemoa with its pasture lands, +\v 58 Hilen with its pasture lands, Debir with its pasture lands, +\v 59 Ashan with its pasture lands, and Beth Shemesh with its pasture lands; +\v 60 and out of the tribe of Benjamin, Geba with its pasture lands, Allemeth with its pasture lands, and Anathoth with its pasture lands. All their cities throughout their families were thirteen cities. +\p +\v 61 To the rest of the sons of Kohath were given by lot, out of the family of the tribe, out of the half-tribe, the half of Manasseh, ten cities. +\v 62 To the sons of Gershom, according to their families, out of the tribe of Issachar, and out of the tribe of Asher, and out of the tribe of Naphtali, and out of the tribe of Manasseh in Bashan, thirteen cities. +\v 63 To the sons of Merari were given by lot, according to their families, out of the tribe of Reuben, and out of the tribe of Gad, and out of the tribe of Zebulun, twelve cities. +\v 64 The children of Israel gave to the Levites the cities with their pasture lands. +\v 65 They gave by lot out of the tribe of the children of Judah, and out of the tribe of the children of Simeon, and out of the tribe of the children of Benjamin, these cities which are mentioned by name. +\p +\v 66 Some of the families of the sons of Kohath had cities of their borders out of the tribe of Ephraim. +\v 67 They gave to them the cities of refuge, Shechem in the hill country of Ephraim with its pasture lands and Gezer with its pasture lands, +\v 68 Jokmeam with its pasture lands, Beth Horon with its pasture lands, +\v 69 Aijalon with its pasture lands, Gath Rimmon with its pasture lands; +\v 70 and out of the half-tribe of Manasseh, Aner with its pasture lands, and Bileam with its pasture lands, for the rest of the family of the sons of Kohath. +\p +\v 71 To the sons of Gershom were given, out of the family of the half-tribe of Manasseh, Golan in Bashan with its pasture lands, and Ashtaroth with its pasture lands; +\v 72 and out of the tribe of Issachar, Kedesh with its pasture lands, Daberath with its pasture lands, +\v 73 Ramoth with its pasture lands, and Anem with its pasture lands; +\v 74 and out of the tribe of Asher, Mashal with its pasture lands, Abdon with its pasture lands, +\v 75 Hukok with its pasture lands, and Rehob with its pasture lands; +\v 76 and out of the tribe of Naphtali, Kedesh in Galilee with its pasture lands, Hammon with its pasture lands, and Kiriathaim with its pasture lands. +\p +\v 77 To the rest of the Levites, the sons of Merari, were given, out of the tribe of Zebulun, Rimmono with its pasture lands, and Tabor with its pasture lands; +\v 78 and beyond the Jordan at Jericho, on the east side of the Jordan, were given them out of the tribe of Reuben: Bezer in the wilderness with its pasture lands, Jahzah with its pasture lands, +\v 79 Kedemoth with its pasture lands, and Mephaath with its pasture lands; +\v 80 and out of the tribe of Gad, Ramoth in Gilead with its pasture lands, Mahanaim with its pasture lands, +\v 81 Heshbon with its pasture lands, and Jazer with its pasture lands. +\c 7 +\p +\v 1 Of the sons of Issachar: Tola, Puah, Jashub, and Shimron, four. +\v 2 The sons of Tola: Uzzi, Rephaiah, Jeriel, Jahmai, Ibsam, and Shemuel, heads of their fathers’ houses, of Tola; mighty men of valor in their generations. Their number in the days of David was twenty-two thousand six hundred. +\v 3 The son of Uzzi: Izrahiah. The sons of Izrahiah: Michael, Obadiah, Joel, and Isshiah, five; all of them chief men. +\v 4 With them, by their generations, after their fathers’ houses, were bands of the army for war, thirty-six thousand; for they had many wives and sons. +\v 5 Their brothers among all the families of Issachar, mighty men of valor, listed in all by genealogy, were eighty-seven thousand. +\p +\v 6 The sons of Benjamin: Bela, Becher, and Jediael, three. +\v 7 The sons of Bela: Ezbon, Uzzi, Uzziel, Jerimoth, and Iri, five; heads of fathers’ houses, mighty men of valor; and they were listed by genealogy twenty-two thousand thirty-four. +\v 8 The sons of Becher: Zemirah, Joash, Eliezer, Elioenai, Omri, Jeremoth, Abijah, Anathoth, and Alemeth. All these were the sons of Becher. +\v 9 They were listed by genealogy, after their generations, heads of their fathers’ houses, mighty men of valor, twenty thousand two hundred. +\v 10 The son of Jediael: Bilhan. The sons of Bilhan: Jeush, Benjamin, Ehud, Chenaanah, Zethan, Tarshish, and Ahishahar. +\v 11 All these were sons of Jediael, according to the heads of their fathers’ households, mighty men of valor, seventeen thousand two hundred, who were able to go out in the army for war. +\v 12 So were Shuppim, Huppim, the sons of Ir, Hushim, and the sons of Aher. +\p +\v 13 The sons of Naphtali: Jahziel, Guni, Jezer, Shallum, and the sons of Bilhah. +\p +\v 14 The sons of Manasseh: Asriel, whom his concubine the Aramitess bore. She bore Machir the father of Gilead. +\v 15 Machir took a wife of Huppim and Shuppim, whose sister’s name was Maacah. The name of the second was Zelophehad; and Zelophehad had daughters. +\v 16 Maacah the wife of Machir bore a son, and she named him Peresh. The name of his brother was Sheresh; and his sons were Ulam and Rakem. +\v 17 The sons of Ulam: Bedan. These were the sons of Gilead the son of Machir, the son of Manasseh. +\v 18 His sister Hammolecheth bore Ishhod, Abiezer, and Mahlah. +\v 19 The sons of Shemida were Ahian, Shechem, Likhi, and Aniam. +\p +\v 20 The sons of Ephraim: Shuthelah, Bered his son, Tahath his son, Eleadah his son, Tahath his son, +\v 21 Zabad his son, Shuthelah his son, Ezer, and Elead, whom the men of Gath who were born in the land killed, because they came down to take away their livestock. +\v 22 Ephraim their father mourned many days, and his brothers came to comfort him. +\v 23 He went in to his wife, and she conceived and bore a son, and he named him Beriah,\f + \fr 7:23 \ft “Beriah” is similar to the Hebrew word for “misfortune”.\f* because there was trouble with his house. +\v 24 His daughter was Sheerah, who built Beth Horon the lower and the upper, and Uzzen Sheerah. +\v 25 Rephah was his son, Resheph his son, Telah his son, Tahan his son, +\v 26 Ladan his son, Ammihud his son, Elishama his son, +\v 27 Nun his son, and Joshua his son. +\v 28 Their possessions and settlements were Bethel and its towns, and eastward Naaran, and westward Gezer with its towns; Shechem also and its towns, to Azzah and its towns; +\v 29 and by the borders of the children of Manasseh, Beth Shean and its towns, Taanach and its towns, Megiddo and its towns, and Dor and its towns. The children of Joseph the son of Israel lived in these. +\p +\v 30 The sons of Asher: Imnah, Ishvah, Ishvi, and Beriah. Serah was their sister. +\v 31 The sons of Beriah: Heber and Malchiel, who was the father of Birzaith. +\v 32 Heber became the father of Japhlet, Shomer, Hotham, and Shua their sister. +\v 33 The sons of Japhlet: Pasach, Bimhal, and Ashvath. These are the children of Japhlet. +\v 34 The sons of Shemer: Ahi, Rohgah, Jehubbah, and Aram. +\v 35 The sons of Helem his brother: Zophah, Imna, Shelesh, and Amal. +\v 36 The sons of Zophah: Suah, Harnepher, Shual, Beri, Imrah, +\v 37 Bezer, Hod, Shamma, Shilshah, Ithran, and Beera. +\v 38 The sons of Jether: Jephunneh, Pispa, and Ara. +\v 39 The sons of Ulla: Arah, Hanniel, and Rizia. +\v 40 All these were the children of Asher, heads of the fathers’ houses, choice and mighty men of valor, chief of the princes. The number of them listed by genealogy for service in war was twenty-six thousand men. +\c 8 +\p +\v 1 Benjamin became the father of Bela his firstborn, Ashbel the second, Aharah the third, +\v 2 Nohah the fourth, and Rapha the fifth. +\v 3 Bela had sons: Addar, Gera, Abihud, +\v 4 Abishua, Naaman, Ahoah, +\v 5 Gera, Shephuphan, and Huram. +\v 6 These are the sons of Ehud. These are the heads of fathers’ households of the inhabitants of Geba, who were carried captive to Manahath: +\v 7 Naaman, Ahijah, and Gera, who carried them captive; and he became the father of Uzza and Ahihud. +\p +\v 8 Shaharaim became the father of children in the field of Moab, after he had sent them away. Hushim and Baara were his wives. +\v 9 By Hodesh his wife, he became the father of Jobab, Zibia, Mesha, Malcam, +\v 10 Jeuz, Shachia, and Mirmah. These were his sons, heads of fathers’ households. +\v 11 By Hushim, he became the father of Abitub and Elpaal. +\v 12 The sons of Elpaal: Eber, Misham, and Shemed, who built Ono and Lod, with its towns; +\v 13 and Beriah and Shema, who were heads of fathers’ households of the inhabitants of Aijalon, who put to flight the inhabitants of Gath; +\v 14 and Ahio, Shashak, Jeremoth, +\v 15 Zebadiah, Arad, Eder, +\v 16 Michael, Ishpah, Joha, the sons of Beriah, +\v 17 Zebadiah, Meshullam, Hizki, Heber, +\v 18 Ishmerai, Izliah, Jobab, the sons of Elpaal, +\v 19 Jakim, Zichri, Zabdi, +\v 20 Elienai, Zillethai, Eliel, +\v 21 Adaiah, Beraiah, Shimrath, the sons of Shimei, +\v 22 Ishpan, Eber, Eliel, +\v 23 Abdon, Zichri, Hanan, +\v 24 Hananiah, Elam, Anthothijah, +\v 25 Iphdeiah, Penuel, the sons of Shashak, +\v 26 Shamsherai, Shehariah, Athaliah, +\v 27 Jaareshiah, Elijah, Zichri, and the sons of Jeroham. +\v 28 These were heads of fathers’ households throughout their generations, chief men. These lived in Jerusalem. +\p +\v 29 The father of Gibeon, whose wife’s name was Maacah, lived in Gibeon +\v 30 with his firstborn son Abdon, Zur, Kish, Baal, Nadab, +\v 31 Gedor, Ahio, Zecher, +\v 32 and Mikloth, who became the father of Shimeah. They also lived with their families in Jerusalem, near their relatives. +\v 33 Ner became the father of Kish. Kish became the father of Saul. Saul became the father of Jonathan, Malchishua, Abinadab, and Eshbaal. +\v 34 The son of Jonathan was Merib-baal. Merib-baal became the father of Micah. +\v 35 The sons of Micah: Pithon, Melech, Tarea, and Ahaz. +\v 36 Ahaz became the father of Jehoaddah. Jehoaddah became the father of Alemeth, Azmaveth, and Zimri. Zimri became the father of Moza. +\v 37 Moza became the father of Binea. Raphah was his son, Eleasah his son, and Azel his son. +\v 38 Azel had six sons, whose names are these: Azrikam, Bocheru, Ishmael, Sheariah, Obadiah, and Hanan. All these were the sons of Azel. +\v 39 The sons of Eshek his brother: Ulam his firstborn, Jeush the second, and Eliphelet the third. +\v 40 The sons of Ulam were mighty men of valor, archers, and had many sons, and grandsons, one hundred fifty. All these were of the sons of Benjamin. +\c 9 +\p +\v 1 So all Israel were listed by genealogies; and behold,\f + \fr 9:1 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* they are written in the book of the kings of Israel. Judah was carried away captive to Babylon for their disobedience. +\v 2 Now the first inhabitants who lived in their possessions in their cities were Israel, the priests, the Levites, and the temple servants. +\v 3 In Jerusalem, there lived of the children of Judah, of the children of Benjamin, and of the children of Ephraim and Manasseh: +\v 4 Uthai the son of Ammihud, the son of Omri, the son of Imri, the son of Bani, of the children of Perez the son of Judah. +\v 5 Of the Shilonites: Asaiah the firstborn and his sons. +\v 6 Of the sons of Zerah: Jeuel and their brothers, six hundred ninety. +\v 7 Of the sons of Benjamin: Sallu the son of Meshullam, the son of Hodaviah, the son of Hassenuah; +\v 8 and Ibneiah the son of Jeroham, and Elah the son of Uzzi, the son of Michri; and Meshullam the son of Shephatiah, the son of Reuel, the son of Ibnijah; +\v 9 and their brothers, according to their generations, nine hundred fifty-six. All these men were heads of fathers’ households by their fathers’ houses. +\p +\v 10 Of the priests: Jedaiah, Jehoiarib, Jachin, +\v 11 and Azariah the son of Hilkiah, the son of Meshullam, the son of Zadok, the son of Meraioth, the son of Ahitub, the ruler of God’s house; +\v 12 and Adaiah the son of Jeroham, the son of Pashhur, the son of Malchijah; and Maasai the son of Adiel, the son of Jahzerah, the son of Meshullam, the son of Meshillemith, the son of Immer; +\v 13 and their brothers, heads of their fathers’ houses, one thousand seven hundred sixty; they were very able men for the work of the service of God’s house. +\p +\v 14 Of the Levites: Shemaiah the son of Hasshub, the son of Azrikam, the son of Hashabiah, of the sons of Merari; +\v 15 and Bakbakkar, Heresh, Galal, and Mattaniah the son of Mica, the son of Zichri, the son of Asaph, +\v 16 and Obadiah the son of Shemaiah, the son of Galal, the son of Jeduthun; and Berechiah the son of Asa, the son of Elkanah, who lived in the villages of the Netophathites. +\p +\v 17 The gatekeepers: Shallum, Akkub, Talmon, Ahiman, and their brothers (Shallum was the chief), +\v 18 who previously served in the king’s gate eastward. They were the gatekeepers for the camp of the children of Levi. +\v 19 Shallum was the son of Kore, the son of Ebiasaph, the son of Korah, and his brothers, of his father’s house, the Korahites, were over the work of the service, keepers of the thresholds of the tent. Their fathers had been over Yahweh’s camp, keepers of the entry. +\v 20 Phinehas the son of Eleazar was ruler over them in time past, and Yahweh was with him. +\v 21 Zechariah the son of Meshelemiah was gatekeeper of the door of the Tent of Meeting. +\v 22 All these who were chosen to be gatekeepers in the thresholds were two hundred twelve. These were listed by genealogy in their villages, whom David and Samuel the seer ordained in their office of trust. +\v 23 So they and their children had the oversight of the gates of Yahweh’s house, even the house of the tent, as guards. +\v 24 On the four sides were the gatekeepers, toward the east, west, north, and south. +\v 25 Their brothers, in their villages, were to come in every seven days from time to time to be with them, +\v 26 for the four chief gatekeepers, who were Levites, were in an office of trust, and were over the rooms and over the treasuries in God’s house. +\v 27 They stayed around God’s house, because that was their duty; and it was their duty to open it morning by morning. +\p +\v 28 Certain of them were in charge of the vessels of service, for these were brought in by count, and these were taken out by count. +\v 29 Some of them also were appointed over the furniture, and over all the vessels of the sanctuary, over the fine flour, the wine, the oil, the frankincense, and the spices. +\p +\v 30 Some of the sons of the priests prepared the mixing of the spices. +\v 31 Mattithiah, one of the Levites, who was the firstborn of Shallum the Korahite, had the office of trust over the things that were baked in pans. +\v 32 Some of their brothers, of the sons of the Kohathites, were over the show bread, to prepare it every Sabbath. +\p +\v 33 These are the singers, heads of fathers’ households of the Levites, who lived in the rooms and were free from other service, for they were employed in their work day and night. +\v 34 These were heads of fathers’ households of the Levites, throughout their generations, chief men. They lived at Jerusalem. +\p +\v 35 Jeiel the father of Gibeon, whose wife’s name was Maacah, lived in Gibeon. +\v 36 His firstborn son was Abdon, then Zur, Kish, Baal, Ner, Nadab, +\v 37 Gedor, Ahio, Zechariah, and Mikloth. +\v 38 Mikloth became the father of Shimeam. They also lived with their relatives in Jerusalem, near their relatives. +\v 39 Ner became the father of Kish. Kish became the father of Saul. Saul became the father of Jonathan, Malchishua, Abinadab, and Eshbaal. +\v 40 The son of Jonathan was Merib-baal. Merib-baal became the father of Micah. +\v 41 The sons of Micah: Pithon, Melech, Tahrea, and Ahaz. +\v 42 Ahaz became the father of Jarah. Jarah became the father of Alemeth, Azmaveth, and Zimri. Zimri became the father of Moza. +\v 43 Moza became the father of Binea, Rephaiah his son, Eleasah his son, and Azel his son. +\v 44 Azel had six sons, whose names are Azrikam, Bocheru, Ishmael, Sheariah, Obadiah, and Hanan. These were the sons of Azel. +\c 10 +\p +\v 1 Now the Philistines fought against Israel; and the men of Israel fled from before the Philistines, and fell down slain on Mount Gilboa. +\v 2 The Philistines followed hard after Saul and after his sons; and the Philistines killed Jonathan, Abinadab, and Malchishua, the sons of Saul. +\v 3 The battle went hard against Saul, and the archers overtook him; and he was distressed by reason of the archers. +\v 4 Then Saul said to his armor bearer, “Draw your sword, and thrust me through with it, lest these uncircumcised come and abuse me.” +\p But his armor bearer would not, for he was terrified. Therefore Saul took his sword and fell on it. +\v 5 When his armor bearer saw that Saul was dead, he likewise fell on his sword and died. +\v 6 So Saul died with his three sons; and all his house died together. +\v 7 When all the men of Israel who were in the valley saw that they fled, and that Saul and his sons were dead, they abandoned their cities, and fled; and the Philistines came and lived in them. +\p +\v 8 On the next day, when the Philistines came to strip the slain, they found Saul and his sons fallen on Mount Gilboa. +\v 9 They stripped him and took his head and his armor, then sent into the land of the Philistines all around to carry the news to their idols and to the people. +\v 10 They put his armor in the house of their gods, and fastened his head in the house of Dagon. +\v 11 When all Jabesh Gilead heard all that the Philistines had done to Saul, +\v 12 all the valiant men arose and took away the body of Saul and the bodies of his sons, and brought them to Jabesh, and buried their bones under the oak in Jabesh, and fasted seven days. +\p +\v 13 So Saul died for his trespass which he committed against Yahweh, because of Yahweh’s word, which he didn’t keep, and also because he asked counsel of one who had a familiar spirit, to inquire, +\v 14 and didn’t inquire of Yahweh. Therefore he killed him, and turned the kingdom over to David the son of Jesse. +\c 11 +\p +\v 1 Then all Israel gathered themselves to David to Hebron, saying, “Behold, we are your bone and your flesh. +\v 2 In times past, even when Saul was king, it was you who led out and brought in Israel. Yahweh your God said to you, ‘You shall be shepherd of my people Israel, and you shall be prince over my people Israel.’” +\p +\v 3 So all the elders of Israel came to the king to Hebron; and David made a covenant with them in Hebron before Yahweh. They anointed David king over Israel, according to Yahweh’s word by Samuel. +\p +\v 4 David and all Israel went to Jerusalem (also called Jebus); and the Jebusites, the inhabitants of the land, were there. +\v 5 The inhabitants of Jebus said to David, “You will not come in here!” Nevertheless David took the stronghold of Zion. The same is David’s city. +\v 6 David had said, “Whoever strikes the Jebusites first shall be chief and captain.” Joab the son of Zeruiah went up first, and was made chief. +\v 7 David lived in the stronghold; therefore they called it David’s city. +\v 8 He built the city all around, from Millo even around; and Joab repaired the rest of the city. +\v 9 David grew greater and greater, for Yahweh of Armies was with him. +\p +\v 10 Now these are the chief of the mighty men whom David had, who showed themselves strong with him in his kingdom, together with all Israel, to make him king, according to Yahweh’s word concerning Israel. +\p +\v 11 This is the number of the mighty men whom David had: Jashobeam, the son of a Hachmonite, the chief of the thirty; he lifted up his spear against three hundred and killed them at one time. +\v 12 After him was Eleazar the son of Dodo, the Ahohite, who was one of the three mighty men. +\v 13 He was with David at Pasdammim, and there the Philistines were gathered together to battle, where there was a plot of ground full of barley; and the people fled from before the Philistines. +\v 14 They stood in the middle of the plot, defended it, and killed the Philistines; and Yahweh saved them by a great victory. +\p +\v 15 Three of the thirty chief men went down to the rock to David, into the cave of Adullam; and the army of the Philistines were encamped in the valley of Rephaim. +\v 16 David was then in the stronghold, and the garrison of the Philistines was in Bethlehem at that time. +\v 17 David longed, and said, “Oh, that someone would give me water to drink from the well of Bethlehem, which is by the gate!” +\p +\v 18 The three broke through the army of the Philistines, and drew water out of the well of Bethlehem that was by the gate, took it, and brought it to David; but David would not drink any of it, but poured it out to Yahweh, +\v 19 and said, “My God forbid me, that I should do this! Shall I drink the blood of these men who have put their lives in jeopardy?” For they risked their lives to bring it. Therefore he would not drink it. The three mighty men did these things. +\p +\v 20 Abishai, the brother of Joab, was chief of the three; for he lifted up his spear against three hundred and killed them, and had a name among the three. +\v 21 Of the three, he was more honorable than the two, and was made their captain; however he wasn’t included in the three. +\p +\v 22 Benaiah the son of Jehoiada, the son of a valiant man of Kabzeel, who had done mighty deeds, killed the two sons of Ariel of Moab. He also went down and killed a lion in the middle of a pit on a snowy day. +\v 23 He killed an Egyptian, a man of great stature, five cubits\f + \fr 11:23 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters. Therefore this Egyptian was bout 7 feet and 6 inches or 2.28 meters tall.\f* high. In the Egyptian’s hand was a spear like a weaver’s beam; and he went down to him with a staff, plucked the spear out of the Egyptian’s hand, and killed him with his own spear. +\v 24 Benaiah the son of Jehoiada did these things and had a name among the three mighty men. +\v 25 Behold, he was more honorable than the thirty, but he didn’t attain to the three; and David set him over his guard. +\p +\v 26 The mighty men of the armies also include Asahel the brother of Joab, Elhanan the son of Dodo of Bethlehem, +\v 27 Shammoth the Harorite, Helez the Pelonite, +\v 28 Ira the son of Ikkesh the Tekoite, Abiezer the Anathothite, +\v 29 Sibbecai the Hushathite, Ilai the Ahohite, +\v 30 Maharai the Netophathite, Heled the son of Baanah the Netophathite, +\v 31 Ithai the son of Ribai of Gibeah of the children of Benjamin, Benaiah the Pirathonite, +\v 32 Hurai of the brooks of Gaash, Abiel the Arbathite, +\v 33 Azmaveth the Baharumite, Eliahba the Shaalbonite, +\v 34 the sons of Hashem the Gizonite, Jonathan the son of Shagee the Hararite, +\v 35 Ahiam the son of Sacar the Hararite, Eliphal the son of Ur, +\v 36 Hepher the Mecherathite, Ahijah the Pelonite, +\v 37 Hezro the Carmelite, Naarai the son of Ezbai, +\v 38 Joel the brother of Nathan, Mibhar the son of Hagri, +\v 39 Zelek the Ammonite, Naharai the Berothite (the armor bearer of Joab the son of Zeruiah), +\v 40 Ira the Ithrite, Gareb the Ithrite, +\v 41 Uriah the Hittite, Zabad the son of Ahlai, +\v 42 Adina the son of Shiza the Reubenite (a chief of the Reubenites), and thirty with him, +\v 43 Hanan the son of Maacah, Joshaphat the Mithnite, +\v 44 Uzzia the Ashterathite, Shama and Jeiel the sons of Hotham the Aroerite, +\v 45 Jediael the son of Shimri, and Joha his brother, the Tizite, +\v 46 Eliel the Mahavite, and Jeribai, and Joshaviah, the sons of Elnaam, and Ithmah the Moabite, +\v 47 Eliel, Obed, and Jaasiel the Mezobaite. +\c 12 +\p +\v 1 Now these are those who came to David to Ziklag while he was a fugitive from Saul the son of Kish. They were among the mighty men, his helpers in war. +\v 2 They were armed with bows, and could use both the right hand and the left in slinging stones and in shooting arrows from the bow. They were of Saul’s relatives of the tribe of Benjamin. +\v 3 The chief was Ahiezer, then Joash, the sons of Shemaah the Gibeathite; Jeziel and Pelet, the sons of Azmaveth; Beracah; Jehu the Anathothite; +\v 4 Ishmaiah the Gibeonite, a mighty man among the thirty and a leader of the thirty; Jeremiah; Jahaziel; Johanan; Jozabad the Gederathite; +\v 5 Eluzai; Jerimoth; Bealiah; Shemariah; Shephatiah the Haruphite; +\v 6 Elkanah, Isshiah, Azarel, Joezer, and Jashobeam, the Korahites; +\v 7 and Joelah and Zebadiah, the sons of Jeroham of Gedor. +\p +\v 8 Some Gadites joined David in the stronghold in the wilderness, mighty men of valor, men trained for war, who could handle shield and spear; whose faces were like the faces of lions, and they were as swift as the gazelles on the mountains: +\v 9 Ezer the chief, Obadiah the second, Eliab the third, +\v 10 Mishmannah the fourth, Jeremiah the fifth, +\v 11 Attai the sixth, Eliel the seventh, +\v 12 Johanan the eighth, Elzabad the ninth, +\v 13 Jeremiah the tenth, and Machbannai the eleventh. +\v 14 These of the sons of Gad were captains of the army. He who was least was equal to one hundred, and the greatest to one thousand. +\v 15 These are those who went over the Jordan in the first month, when it had overflowed all its banks; and they put to flight all who lived in the valleys, both toward the east and toward the west. +\p +\v 16 Some of the children of Benjamin and Judah came to the stronghold to David. +\v 17 David went out to meet them, and answered them, “If you have come peaceably to me to help me, my heart will be united with you; but if you have come to betray me to my adversaries, since there is no wrong in my hands, may the God of our fathers see this and rebuke it.” +\v 18 Then the Spirit came on Amasai, who was chief of the thirty, and he said, “We are yours, David, and on your side, you son of Jesse. Peace, peace be to you, and peace be to your helpers; for your God helps you.” Then David received them and made them captains of the band. +\p +\v 19 Some of Manasseh also joined David when he came with the Philistines against Saul to battle, but they didn’t help them, for the lords of the Philistines sent him away after consultation, saying, “He will desert to his master Saul to the jeopardy of our heads.” +\p +\v 20 As he went to Ziklag, some from Manasseh joined him: Adnah, Jozabad, Jediael, Michael, Jozabad, Elihu, and Zillethai, captains of thousands who were of Manasseh. +\v 21 They helped David against the band of raiders, for they were all mighty men of valor and were captains in the army. +\v 22 For from day to day men came to David to help him, until there was a great army, like God’s army. +\p +\v 23 These are the numbers of the heads of those who were armed for war, who came to David to Hebron to turn the kingdom of Saul to him, according to Yahweh’s word. +\v 24 The children of Judah who bore shield and spear were six thousand eight hundred, armed for war. +\v 25 Of the children of Simeon, mighty men of valor for the war: seven thousand one hundred. +\v 26 Of the children of Levi: four thousand six hundred. +\v 27 Jehoiada was the leader of the household of Aaron; and with him were three thousand seven hundred, +\v 28 and Zadok, a young man mighty of valor, and of his father’s house twenty-two captains. +\v 29 Of the children of Benjamin, Saul’s relatives: three thousand, for until then, the greatest part of them had kept their allegiance to Saul’s house. +\v 30 Of the children of Ephraim: twenty thousand eight hundred, mighty men of valor, famous men in their fathers’ houses. +\v 31 Of the half-tribe of Manasseh: eighteen thousand, who were mentioned by name, to come and make David king. +\v 32 Of the children of Issachar, men who had understanding of the times, to know what Israel ought to do, their heads were two hundred; and all their brothers were at their command. +\v 33 Of Zebulun, such as were able to go out in the army, who could set the battle in array with all kinds of instruments of war: fifty thousand who could command and were not of double heart. +\v 34 Of Naphtali: one thousand captains, and with them with shield and spear thirty-seven thousand. +\v 35 Of the Danites who could set the battle in array: twenty-eight thousand six hundred. +\v 36 Of Asher, such as were able to go out in the army, who could set the battle in array: forty thousand. +\v 37 On the other side of the Jordan, of the Reubenites, the Gadites, and of the half-tribe of Manasseh, with all kinds of instruments of war for the battle: one hundred twenty thousand. +\p +\v 38 All these were men of war who could order the battle array, and came with a perfect heart to Hebron to make David king over all Israel; and all the rest also of Israel were of one heart to make David king. +\v 39 They were there with David three days, eating and drinking; for their brothers had supplied provisions for them. +\v 40 Moreover those who were near to them, as far as Issachar, Zebulun, and Naphtali, brought bread on donkeys, on camels, on mules, and on oxen: supplies of flour, cakes of figs, clusters of raisins, wine, oil, cattle, and sheep in abundance; for there was joy in Israel. +\c 13 +\p +\v 1 David consulted with the captains of thousands and of hundreds, even with every leader. +\v 2 David said to all the assembly of Israel, “If it seems good to you, and if it is of Yahweh our God, let’s send word everywhere to our brothers who are left in all the land of Israel, with whom the priests and Levites are in their cities that have pasture lands, that they may gather themselves to us. +\v 3 Also, let’s bring the ark of our God back to us again, for we didn’t seek it in the days of Saul.” +\p +\v 4 All the assembly said that they would do so, for the thing was right in the eyes of all the people. +\v 5 So David assembled all Israel together, from the Shihor River of Egypt even to the entrance of Hamath, to bring God’s ark from Kiriath Jearim. +\p +\v 6 David went up with all Israel to Baalah, that is, to Kiriath Jearim, which belonged to Judah, to bring up from there God Yahweh’s ark that sits above the cherubim, that is called by the Name. +\v 7 They carried God’s ark on a new cart, and brought it out of Abinadab’s house; and Uzza and Ahio drove the cart. +\v 8 David and all Israel played before God with all their might, even with songs, with harps, with stringed instruments, with tambourines, with cymbals, and with trumpets. +\p +\v 9 When they came to Chidon’s threshing floor, Uzza put out his hand to hold the ark, for the oxen stumbled. +\v 10 Yahweh’s anger burned against Uzza, and he struck him because he put his hand on the ark; and he died there before God. +\v 11 David was displeased, because Yahweh had broken out against Uzza. He called that place Perez Uzza, to this day. +\v 12 David was afraid of God that day, saying, “How can I bring God’s ark home to me?” +\v 13 So David didn’t move the ark with him into David’s city, but carried it aside into Obed-Edom the Gittite’s house. +\v 14 God’s ark remained with the family of Obed-Edom in his house three months; and Yahweh blessed Obed-Edom’s house and all that he had. +\c 14 +\p +\v 1 Hiram king of Tyre sent messengers to David with cedar trees, masons, and carpenters, to build him a house. +\v 2 David perceived that Yahweh had established him king over Israel, for his kingdom was highly exalted, for his people Israel’s sake. +\p +\v 3 David took more wives in Jerusalem, and David became the father of more sons and daughters. +\v 4 These are the names of the children whom he had in Jerusalem: Shammua, Shobab, Nathan, Solomon, +\v 5 Ibhar, Elishua, Elpelet, +\v 6 Nogah, Nepheg, Japhia, +\v 7 Elishama, Beeliada, and Eliphelet. +\p +\v 8 When the Philistines heard that David was anointed king over all Israel, all the Philistines went up to seek David; and David heard of it, and went out against them. +\v 9 Now the Philistines had come and made a raid in the valley of Rephaim. +\v 10 David inquired of God, saying, “Shall I go up against the Philistines? Will you deliver them into my hand?” +\p Yahweh said to him, “Go up; for I will deliver them into your hand.” +\p +\v 11 So they came up to Baal Perazim, and David defeated them there. David said, God has broken my enemies by my hand, like waters breaking out. Therefore they called the name of that place Baal Perazim.\f + \fr 14:11 \ft “Baal Perazim” means “The Lord who breaks out”.\f* +\v 12 They left their gods there; and David gave a command, and they were burned with fire. +\p +\v 13 The Philistines made another raid in the valley. +\v 14 David inquired again of God; and God said to him, “You shall not go up after them. Turn away from them, and come on them opposite the mulberry trees. +\v 15 When you hear the sound of marching in the tops of the mulberry trees, then go out to battle; for God has gone out before you to strike the army of the Philistines.” +\p +\v 16 David did as God commanded him; and they attacked the army of the Philistines from Gibeon even to Gezer. +\v 17 The fame of David went out into all lands; and Yahweh brought the fear of him on all nations. +\c 15 +\p +\v 1 David made himself houses in David’s city; and he prepared a place for God’s ark, and pitched a tent for it. +\v 2 Then David said, “No one ought to carry God’s ark but the Levites. For Yahweh has chosen them to carry God’s ark, and to minister to him forever.” +\p +\v 3 David assembled all Israel at Jerusalem, to bring up Yahweh’s ark to its place, which he had prepared for it. +\v 4 David gathered together the sons of Aaron and the Levites: +\v 5 of the sons of Kohath, Uriel the chief, and his brothers one hundred twenty; +\v 6 of the sons of Merari, Asaiah the chief, and his brothers two hundred twenty; +\v 7 of the sons of Gershom, Joel the chief, and his brothers one hundred thirty; +\v 8 of the sons of Elizaphan, Shemaiah the chief, and his brothers two hundred; +\v 9 of the sons of Hebron, Eliel the chief, and his brothers eighty; +\v 10 of the sons of Uzziel, Amminadab the chief, and his brothers one hundred twelve. +\p +\v 11 David called for Zadok and Abiathar the priests, and for the Levites: for Uriel, Asaiah, Joel, Shemaiah, Eliel, and Amminadab, +\v 12 and said to them, “You are the heads of the fathers’ households of the Levites. Sanctify yourselves, both you and your brothers, that you may bring the ark of Yahweh, the God of Israel, up to the place that I have prepared for it. +\v 13 For because you didn’t carry it at first, Yahweh our God broke out in anger against us, because we didn’t seek him according to the ordinance.” +\p +\v 14 So the priests and the Levites sanctified themselves to bring up the ark of Yahweh, the God of Israel. +\v 15 The children of the Levites bore God’s ark on their shoulders with its poles, as Moses commanded according to Yahweh’s word. +\p +\v 16 David spoke to the chief of the Levites to appoint their brothers as singers with instruments of music, stringed instruments, harps, and cymbals, sounding aloud and lifting up their voices with joy. +\v 17 So the Levites appointed Heman the son of Joel; and of his brothers, Asaph the son of Berechiah; and of the sons of Merari their brothers, Ethan the son of Kushaiah; +\v 18 and with them their brothers of the second rank: Zechariah, Ben, Jaaziel, Shemiramoth, Jehiel, Unni, Eliab, Benaiah, Maaseiah, Mattithiah, Eliphelehu, Mikneiah, Obed-Edom, and Jeiel, the doorkeepers. +\v 19 So the singers, Heman, Asaph, and Ethan, were given cymbals of bronze to sound aloud; +\v 20 and Zechariah, Aziel, Shemiramoth, Jehiel, Unni, Eliab, Maaseiah, and Benaiah, with stringed instruments set to Alamoth; +\v 21 and Mattithiah, Eliphelehu, Mikneiah, Obed-Edom, Jeiel, and Azaziah, with harps tuned to the eight-stringed lyre, to lead. +\v 22 Chenaniah, chief of the Levites, was over the singing. He taught the singers, because he was skillful. +\v 23 Berechiah and Elkanah were doorkeepers for the ark. +\v 24 Shebaniah, Joshaphat, Nethanel, Amasai, Zechariah, Benaiah, and Eliezer, the priests, blew the trumpets before God’s ark; and Obed-Edom and Jehiah were doorkeepers for the ark. +\p +\v 25 So David, the elders of Israel, and the captains over thousands went to bring the ark of Yahweh’s covenant up out of the house of Obed-Edom with joy. +\v 26 When God helped the Levites who bore the ark of Yahweh’s covenant, they sacrificed seven bulls and seven rams. +\v 27 David was clothed with a robe of fine linen, as were all the Levites who bore the ark, the singers, and Chenaniah the choir master with the singers; and David had an ephod of linen on him. +\v 28 Thus all Israel brought the ark of Yahweh’s covenant up with shouting, with sound of the cornet, with trumpets, and with cymbals, sounding aloud with stringed instruments and harps. +\v 29 As the ark of Yahweh’s covenant came to David’s city, Michal the daughter of Saul looked out at the window, and saw king David dancing and playing; and she despised him in her heart. +\c 16 +\p +\v 1 They brought in God’s ark, and set it in the middle of the tent that David had pitched for it; and they offered burnt offerings and peace offerings before God. +\v 2 When David had finished offering the burnt offering and the peace offerings, he blessed the people in Yahweh’s name. +\v 3 He gave to everyone of Israel, both man and woman, to everyone a loaf of bread, a portion of meat, and a cake of raisins. +\p +\v 4 He appointed some of the Levites to minister before Yahweh’s ark, and to commemorate, to thank, and to praise Yahweh, the God of Israel: +\v 5 Asaph the chief, and second to him Zechariah, then Jeiel, Shemiramoth, Jehiel, Mattithiah, Eliab, Benaiah, Obed-Edom, and Jeiel, with stringed instruments and with harps; and Asaph with cymbals, sounding aloud; +\v 6 with Benaiah and Jahaziel the priests with trumpets continually, before the ark of the covenant of God. +\p +\v 7 Then on that day David first ordained giving of thanks to Yahweh by the hand of Asaph and his brothers. +\q1 +\v 8 Oh give thanks to Yahweh. +\q2 Call on his name. +\q2 Make what he has done known among the peoples. +\q1 +\v 9 Sing to him. +\q2 Sing praises to him. +\q2 Tell of all his marvelous works. +\q1 +\v 10 Glory in his holy name. +\q2 Let the heart of those who seek Yahweh rejoice. +\q1 +\v 11 Seek Yahweh and his strength. +\q2 Seek his face forever more. +\q1 +\v 12 Remember his marvelous works that he has done, +\q2 his wonders, and the judgments of his mouth, +\q1 +\v 13 you offspring\f + \fr 16:13 \ft or, seed\f* of Israel his servant, +\q2 you children of Jacob, his chosen ones. +\b +\q1 +\v 14 He is Yahweh our God. +\q2 His judgments are in all the earth. +\q1 +\v 15 Remember his covenant forever, +\q2 the word which he commanded to a thousand generations, +\q2 +\v 16 the covenant which he made with Abraham, +\q2 his oath to Isaac. +\q1 +\v 17 He confirmed it to Jacob for a statute, +\q2 and to Israel for an everlasting covenant, +\q1 +\v 18 saying, “I will give you the land of Canaan, +\q2 The lot of your inheritance,” +\q2 +\v 19 when you were but a few men in number, +\q2 yes, very few, and foreigners in it. +\q1 +\v 20 They went about from nation to nation, +\q2 from one kingdom to another people. +\q1 +\v 21 He allowed no man to do them wrong. +\q2 Yes, he reproved kings for their sakes, +\q1 +\v 22 “Don’t touch my anointed ones! +\q2 Do my prophets no harm!” +\b +\q1 +\v 23 Sing to Yahweh, all the earth! +\q2 Display his salvation from day to day. +\q1 +\v 24 Declare his glory among the nations, +\q2 and his marvelous works among all the peoples. +\q1 +\v 25 For great is Yahweh, and greatly to be praised. +\q2 He also is to be feared above all gods. +\q1 +\v 26 For all the gods of the peoples are idols, +\q2 but Yahweh made the heavens. +\q1 +\v 27 Honor and majesty are before him. +\q2 Strength and gladness are in his place. +\b +\q1 +\v 28 Ascribe to Yahweh, you families of the peoples, +\q2 ascribe to Yahweh glory and strength! +\q1 +\v 29 Ascribe to Yahweh the glory due to his name. +\q2 Bring an offering, and come before him. +\q2 Worship Yahweh in holy array. +\q1 +\v 30 Tremble before him, all the earth. +\q2 The world also is established that it can’t be moved. +\q1 +\v 31 Let the heavens be glad, +\q2 and let the earth rejoice! +\q2 Let them say among the nations, “Yahweh reigns!” +\q1 +\v 32 Let the sea roar, and its fullness! +\q2 Let the field exult, and all that is in it! +\q1 +\v 33 Then the trees of the forest will sing for joy before Yahweh, +\q2 for he comes to judge the earth. +\q1 +\v 34 Oh give thanks to Yahweh, for he is good, +\q2 for his loving kindness endures forever. +\q1 +\v 35 Say, “Save us, God of our salvation! +\q2 Gather us together and deliver us from the nations, +\q2 to give thanks to your holy name, +\q2 to triumph in your praise.” +\q1 +\v 36 Blessed be Yahweh, the God of Israel, +\q2 from everlasting even to everlasting. +\p All the people said, “Amen,” and praised Yahweh. +\p +\v 37 So he left Asaph and his brothers there before the ark of Yahweh’s covenant, to minister before the ark continually, as every day’s work required; +\v 38 and Obed-Edom with their sixty-eight relatives; Obed-Edom also the son of Jeduthun and Hosah to be doorkeepers; +\v 39 and Zadok the priest and his brothers the priests, before Yahweh’s tabernacle in the high place that was at Gibeon, +\v 40 to offer burnt offerings to Yahweh on the altar of burnt offering continually morning and evening, even according to all that is written in Yahweh’s law, which he commanded to Israel; +\v 41 and with them Heman and Jeduthun and the rest who were chosen, who were mentioned by name, to give thanks to Yahweh, because his loving kindness endures forever; +\v 42 and with them Heman and Jeduthun with trumpets and cymbals for those that should sound aloud, and with instruments for the songs of God, and the sons of Jeduthun to be at the gate. +\v 43 All the people departed, each man to his house; and David returned to bless his house. +\c 17 +\p +\v 1 When David was living in his house, David said to Nathan the prophet, “Behold, I live in a cedar house, but the ark of Yahweh’s covenant is in a tent.” +\p +\v 2 Nathan said to David, “Do all that is in your heart; for God is with you.” +\p +\v 3 That same night, the word of God came to Nathan, saying, +\v 4 “Go and tell David my servant, ‘Yahweh says, “You shall not build me a house to dwell in; +\v 5 for I have not lived in a house since the day that I brought up Israel to this day, but have gone from tent to tent, and from one tent to another. +\v 6 In all places in which I have walked with all Israel, did I speak a word with any of the judges of Israel, whom I commanded to be shepherd of my people, saying, ‘Why have you not built me a house of cedar?’”’ +\p +\v 7 “Now therefore, you shall tell my servant David, ‘Yahweh of Armies says, “I took you from the sheep pen, from following the sheep, to be prince over my people Israel. +\v 8 I have been with you wherever you have gone, and have cut off all your enemies from before you. I will make you a name like the name of the great ones who are in the earth. +\v 9 I will appoint a place for my people Israel, and will plant them, that they may dwell in their own place, and be moved no more. The children of wickedness will not waste them any more, as at the first, +\v 10 and from the day that I commanded judges to be over my people Israel. I will subdue all your enemies. Moreover I tell you that Yahweh will build you a house. +\v 11 It will happen, when your days are fulfilled that you must go to be with your fathers, that I will set up your offspring after you, who will be of your sons; and I will establish his kingdom. +\v 12 He will build me a house, and I will establish his throne forever. +\v 13 I will be his father, and he will be my son. I will not take my loving kindness away from him, as I took it from him who was before you; +\v 14 but I will settle him in my house and in my kingdom forever. His throne will be established forever.”’” +\v 15 According to all these words, and according to all this vision, so Nathan spoke to David. +\p +\v 16 Then David the king went in and sat before Yahweh; and he said, “Who am I, Yahweh God, and what is my house, that you have brought me this far? +\v 17 This was a small thing in your eyes, O God, but you have spoken of your servant’s house for a great while to come, and have respected me according to the standard of a man of high degree, Yahweh God. +\v 18 What can David say yet more to you concerning the honor which is done to your servant? For you know your servant. +\v 19 Yahweh, for your servant’s sake, and according to your own heart, you have done all this greatness, to make known all these great things. +\v 20 Yahweh, there is no one like you, neither is there any God besides you, according to all that we have heard with our ears. +\v 21 What one nation in the earth is like your people Israel, whom God went to redeem to himself for a people, to make you a name by great and awesome things, in driving out nations from before your people whom you redeemed out of Egypt? +\v 22 For you made your people Israel your own people forever; and you, Yahweh, became their God. +\v 23 Now, Yahweh, let the word that you have spoken concerning your servant, and concerning his house, be established forever, and do as you have spoken. +\v 24 Let your name be established and magnified forever, saying, ‘Yahweh of Armies is the God of Israel, even a God to Israel. The house of David your servant is established before you.’ +\v 25 For you, my God, have revealed to your servant that you will build him a house. Therefore your servant has found courage to pray before you. +\v 26 Now, Yahweh, you are God, and have promised this good thing to your servant. +\v 27 Now it has pleased you to bless the house of your servant, that it may continue forever before you; for you, Yahweh, have blessed, and it is blessed forever.” +\c 18 +\p +\v 1 After this, David defeated the Philistines and subdued them, and took Gath and its towns out of the hand of the Philistines. +\v 2 He defeated Moab; and the Moabites became servants to David and brought tribute. +\p +\v 3 David defeated Hadadezer king of Zobah, toward Hamath, as he went to establish his dominion by the river Euphrates. +\v 4 David took from him one thousand chariots, seven thousand horsemen, and twenty thousand footmen; and David hamstrung all the chariot horses, but reserved of them enough for one hundred chariots. +\v 5 When the Syrians of Damascus came to help Hadadezer king of Zobah, David struck twenty-two thousand men of the Syrians. +\v 6 Then David put garrisons in Syria of Damascus; and the Syrians became servants to David and brought tribute. Yahweh gave victory to David wherever he went. +\v 7 David took the shields of gold that were on the servants of Hadadezer, and brought them to Jerusalem. +\v 8 From Tibhath and from Cun, cities of Hadadezer, David took very much bronze, with which Solomon made the bronze sea, the pillars, and the vessels of bronze. +\p +\v 9 When Tou king of Hamath heard that David had struck all the army of Hadadezer king of Zobah, +\v 10 he sent Hadoram his son to King David to greet him and to bless him, because he had fought against Hadadezer and struck him (for Hadadezer had wars with Tou); and he had with him all kinds of vessels of gold and silver and bronze. +\v 11 King David also dedicated these to Yahweh, with the silver and the gold that he carried away from all the nations: from Edom, from Moab, from the children of Ammon, from the Philistines, and from Amalek. +\p +\v 12 Moreover Abishai the son of Zeruiah struck eighteen thousand of the Edomites in the Valley of Salt. +\v 13 He put garrisons in Edom; and all the Edomites became servants to David. Yahweh gave victory to David wherever he went. +\p +\v 14 David reigned over all Israel; and he executed justice and righteousness for all his people. +\v 15 Joab the son of Zeruiah was over the army; Jehoshaphat the son of Ahilud was recorder; +\v 16 Zadok the son of Ahitub and Abimelech the son of Abiathar were priests; Shavsha was scribe; +\v 17 and Benaiah the son of Jehoiada was over the Cherethites and the Pelethites; and the sons of David were chief officials serving the king. +\c 19 +\p +\v 1 After this, Nahash the king of the children of Ammon died, and his son reigned in his place. +\v 2 David said, “I will show kindness to Hanun the son of Nahash, because his father showed kindness to me.” +\p So David sent messengers to comfort him concerning his father. David’s servants came into the land of the children of Ammon to Hanun to comfort him. +\v 3 But the princes of the children of Ammon said to Hanun, “Do you think that David honors your father, in that he has sent comforters to you? Haven’t his servants come to you to search, to overthrow, and to spy out the land?” +\v 4 So Hanun took David’s servants, shaved them, and cut off their garments in the middle at their buttocks, and sent them away. +\v 5 Then some people went and told David how the men were treated. He sent to meet them; for the men were greatly humiliated. The king said, “Stay at Jericho until your beards have grown, and then return.” +\p +\v 6 When the children of Ammon saw that they had made themselves odious to David, Hanun and the children of Ammon sent one thousand talents\f + \fr 19:6 \ft A talent is about 30 kilograms or 66 pounds, so 1000 talents is about 30 metric tons\f* of silver to hire chariots and horsemen out of Mesopotamia, out of Aram-maacah, and out of Zobah. +\v 7 So they hired for themselves thirty-two thousand chariots, and the king of Maacah with his people, who came and encamped near Medeba. The children of Ammon gathered themselves together from their cities, and came to battle. +\v 8 When David heard of it, he sent Joab with all the army of the mighty men. +\v 9 The children of Ammon came out, and put the battle in array at the gate of the city; and the kings who had come were by themselves in the field. +\p +\v 10 Now when Joab saw that the battle was set against him before and behind, he chose some of all the choice men of Israel, and put them in array against the Syrians. +\v 11 The rest of the people he committed into the hand of Abishai his brother; and they put themselves in array against the children of Ammon. +\v 12 He said, “If the Syrians are too strong for me, then you are to help me; but if the children of Ammon are too strong for you, then I will help you. +\v 13 Be courageous, and let’s be strong for our people and for the cities of our God. May Yahweh do that which seems good to him.” +\p +\v 14 So Joab and the people who were with him came near to the front of the Syrians to the battle; and they fled before him. +\v 15 When the children of Ammon saw that the Syrians had fled, they likewise fled before Abishai his brother, and entered into the city. Then Joab came to Jerusalem. +\p +\v 16 When the Syrians saw that they were defeated by Israel, they sent messengers and called out the Syrians who were beyond the River,\f + \fr 19:16 \ft or, the Euphrates River\f* with Shophach the captain of the army of Hadadezer leading them. +\v 17 David was told that, so he gathered all Israel together, passed over the Jordan, came to them, and set the battle in array against them. So when David had put the battle in array against the Syrians, they fought with him. +\v 18 The Syrians fled before Israel; and David killed of the Syrian men seven thousand charioteers and forty thousand footmen, and also killed Shophach the captain of the army. +\v 19 When the servants of Hadadezer saw that they were defeated by Israel, they made peace with David and served him. The Syrians would not help the children of Ammon any more. +\c 20 +\p +\v 1 At the time of the return of the year, at the time when kings go out, Joab led out the army and wasted the country of the children of Ammon, and came and besieged Rabbah. But David stayed at Jerusalem. Joab struck Rabbah, and overthrew it. +\v 2 David took the crown of their king from off his head, and found it to weigh a talent of gold,\f + \fr 20:2 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* and there were precious stones in it. It was set on David’s head, and he brought very much plunder out of the city. +\v 3 He brought out the people who were in it, and had them cut with saws, with iron picks, and with axes. David did so to all the cities of the children of Ammon. Then David and all the people returned to Jerusalem. +\p +\v 4 After this, war arose at Gezer with the Philistines. Then Sibbecai the Hushathite killed Sippai, of the sons of the giant; and they were subdued. +\p +\v 5 Again there was war with the Philistines; and Elhanan the son of Jair killed Lahmi the brother of Goliath the Gittite, the staff of whose spear was like a weaver’s beam. +\v 6 There was again war at Gath, where there was a man of great stature, who had twenty-four fingers and toes, six on each hand and six on each foot; and he also was born to the giant. +\v 7 When he defied Israel, Jonathan the son of Shimea, David’s brother, killed him. +\v 8 These were born to the giant in Gath; and they fell by the hand of David and by the hand of his servants. +\c 21 +\p +\v 1 Satan stood up against Israel, and moved David to take a census of Israel. +\v 2 David said to Joab and to the princes of the people, “Go, count Israel from Beersheba even to Dan; and bring me word, that I may know how many there are.” +\p +\v 3 Joab said, “May Yahweh make his people a hundred times as many as they are. But, my lord the king, aren’t they all my lord’s servants? Why does my lord require this thing? Why will he be a cause of guilt to Israel?” +\p +\v 4 Nevertheless the king’s word prevailed against Joab. Therefore Joab departed and went throughout all Israel, then came to Jerusalem. +\v 5 Joab gave the sum of the census of the people to David. All those of Israel were one million one hundred thousand men who drew a sword; and in Judah were four hundred seventy thousand men who drew a sword. +\v 6 But he didn’t count Levi and Benjamin among them, for the king’s word was abominable to Joab. +\p +\v 7 God was displeased with this thing; therefore he struck Israel. +\v 8 David said to God, “I have sinned greatly, in that I have done this thing. But now put away, I beg you, the iniquity of your servant, for I have done very foolishly.” +\p +\v 9 Yahweh spoke to Gad, David’s seer, saying, +\v 10 “Go and speak to David, saying, ‘Yahweh says, “I offer you three things. Choose one of them, that I may do it to you.”’” +\p +\v 11 So Gad came to David and said to him, “Yahweh says, ‘Take your choice: +\v 12 either three years of famine; or three months to be consumed before your foes, while the sword of your enemies overtakes you; or else three days of the sword of Yahweh, even pestilence in the land, and Yahweh’s angel destroying throughout all the borders of Israel. Now therefore consider what answer I shall return to him who sent me.’” +\p +\v 13 David said to Gad, “I am in distress. Let me fall, I pray, into Yahweh’s hand, for his mercies are very great. Don’t let me fall into man’s hand.” +\p +\v 14 So Yahweh sent a pestilence on Israel, and seventy thousand men of Israel fell. +\v 15 God sent an angel to Jerusalem to destroy it. As he was about to destroy, Yahweh saw, and he relented of the disaster, and said to the destroying angel, “It is enough. Now withdraw your hand.” Yahweh’s angel was standing by the threshing floor of Ornan the Jebusite. +\v 16 David lifted up his eyes, and saw Yahweh’s angel standing between earth and the sky, having a drawn sword in his hand stretched out over Jerusalem. +\p Then David and the elders, clothed in sackcloth, fell on their faces. +\v 17 David said to God, “Isn’t it I who commanded the people to be counted? It is even I who have sinned and done very wickedly; but these sheep, what have they done? Please let your hand, O Yahweh my God, be against me and against my father’s house; but not against your people, that they should be plagued.” +\p +\v 18 Then Yahweh’s angel commanded Gad to tell David that David should go up and raise an altar to Yahweh on the threshing floor of Ornan the Jebusite. +\v 19 David went up at the saying of Gad, which he spoke in Yahweh’s name. +\p +\v 20 Ornan turned back and saw the angel; and his four sons who were with him hid themselves. Now Ornan was threshing wheat. +\v 21 As David came to Ornan, Ornan looked and saw David, and went out of the threshing floor, and bowed himself to David with his face to the ground. +\p +\v 22 Then David said to Ornan, “Sell me the place of this threshing floor, that I may build an altar to Yahweh on it. You shall sell it to me for the full price, that the plague may be stopped from afflicting the people.” +\p +\v 23 Ornan said to David, “Take it for yourself, and let my lord the king do that which is good in his eyes. Behold, I give the oxen for burnt offerings, and the threshing instruments for wood, and the wheat for the meal offering. I give it all.” +\p +\v 24 King David said to Ornan, “No, but I will most certainly buy it for the full price. For I will not take that which is yours for Yahweh, nor offer a burnt offering that costs me nothing.” +\p +\v 25 So David gave to Ornan six hundred shekels\f + \fr 21:25 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 600 shekels was about 6 kilograms or about 192 Troy ounces.\f* of gold by weight for the place. +\v 26 David built an altar to Yahweh there, and offered burnt offerings and peace offerings, and called on Yahweh; and he answered him from the sky by fire on the altar of burnt offering. +\p +\v 27 Then Yahweh commanded the angel, and he put his sword back into its sheath. +\p +\v 28 At that time, when David saw that Yahweh had answered him in the threshing floor of Ornan the Jebusite, then he sacrificed there. +\v 29 For Yahweh’s tabernacle, which Moses made in the wilderness, and the altar of burnt offering, were at that time in the high place at Gibeon. +\v 30 But David couldn’t go before it to inquire of God, for he was afraid because of the sword of Yahweh’s angel. +\c 22 +\p +\v 1 Then David said, “This is the house of Yahweh God, and this is the altar of burnt offering for Israel.” +\p +\v 2 David gave orders to gather together the foreigners who were in the land of Israel; and he set masons to cut dressed stones to build God’s house. +\v 3 David prepared iron in abundance for the nails for the doors of the gates and for the couplings, and bronze in abundance without weight, +\v 4 and cedar trees without number, for the Sidonians and the people of Tyre brought cedar trees in abundance to David. +\v 5 David said, “Solomon my son is young and tender, and the house that is to be built for Yahweh must be exceedingly magnificent, of fame and of glory throughout all countries. I will therefore make preparation for it.” So David prepared abundantly before his death. +\v 6 Then he called for Solomon his son, and commanded him to build a house for Yahweh, the God of Israel. +\v 7 David said to Solomon his son, “As for me, it was in my heart to build a house to the name of Yahweh my God. +\v 8 But Yahweh’s word came to me, saying, ‘You have shed blood abundantly and have made great wars. You shall not build a house to my name, because you have shed much blood on the earth in my sight. +\v 9 Behold, a son shall be born to you, who shall be a man of peace. I will give him rest from all his enemies all around; for his name shall be Solomon, and I will give peace and quietness to Israel in his days. +\v 10 He shall build a house for my name; and he will be my son, and I will be his father; and I will establish the throne of his kingdom over Israel forever.’ +\v 11 Now, my son, may Yahweh be with you and prosper you, and build the house of Yahweh your God, as he has spoken concerning you. +\v 12 May Yahweh give you discretion and understanding, and put you in charge of Israel, so that you may keep the law of Yahweh your God. +\v 13 Then you will prosper, if you observe to do the statutes and the ordinances which Yahweh gave Moses concerning Israel. Be strong and courageous. Don’t be afraid and don’t be dismayed. +\v 14 Now, behold, in my affliction I have prepared for Yahweh’s house one hundred thousand talents\f + \fr 22:14 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 100,000 talents is about 3 metric tons\f* of gold, one million talents\f + \fr 22:14 \ft about 30,000 metric tons\f* of silver, and bronze and iron without weight; for it is in abundance. I have also prepared timber and stone; and you may add to them. +\v 15 There are also workmen with you in abundance—cutters and workers of stone and timber, and all kinds of men who are skillful in every kind of work; +\v 16 of the gold, the silver, the bronze, and the iron, there is no number. Arise and be doing, and may Yahweh be with you.” +\p +\v 17 David also commanded all the princes of Israel to help Solomon his son, saying, +\v 18 “Isn’t Yahweh your God with you? Hasn’t he given you rest on every side? For he has delivered the inhabitants of the land into my hand; and the land is subdued before Yahweh and before his people. +\v 19 Now set your heart and your soul to follow Yahweh your God. Arise therefore, and build the sanctuary of Yahweh God, to bring the ark of Yahweh’s covenant and the holy vessels of God into the house that is to be built for Yahweh’s name.” +\c 23 +\p +\v 1 Now David was old and full of days; and he made Solomon his son king over Israel. +\v 2 He gathered together all the princes of Israel, with the priests and the Levites. +\v 3 The Levites were counted from thirty years old and upward; and their number by their polls, man by man, was thirty-eight thousand. +\v 4 David said, “Of these, twenty-four thousand were to oversee the work of Yahweh’s house, six thousand were officers and judges, +\v 5 four thousand were doorkeepers, and four thousand praised Yahweh with the instruments which I made for giving praise.” +\p +\v 6 David divided them into divisions according to the sons of Levi: Gershon, Kohath, and Merari. +\p +\v 7 Of the Gershonites: Ladan and Shimei. +\v 8 The sons of Ladan: Jehiel the chief, Zetham, and Joel, three. +\v 9 The sons of Shimei: Shelomoth, Haziel, and Haran, three. These were the heads of the fathers’ households of Ladan. +\v 10 The sons of Shimei: Jahath, Zina, Jeush, and Beriah. These four were the sons of Shimei. +\v 11 Jahath was the chief, and Zizah the second; but Jeush and Beriah didn’t have many sons; therefore they became a fathers’ house in one reckoning. +\p +\v 12 The sons of Kohath: Amram, Izhar, Hebron, and Uzziel, four. +\v 13 The sons of Amram: Aaron and Moses; and Aaron was separated that he should sanctify the most holy things, he and his sons forever, to burn incense before Yahweh, to minister to him, and to bless in his name forever. +\v 14 But as for Moses the man of God, his sons were named among the tribe of Levi. +\v 15 The sons of Moses: Gershom and Eliezer. +\v 16 The sons of Gershom: Shebuel the chief. +\v 17 The son of Eliezer was Rehabiah the chief; and Eliezer had no other sons, but the sons of Rehabiah were very many. +\v 18 The son of Izhar: Shelomith the chief. +\v 19 The sons of Hebron: Jeriah the chief, Amariah the second, Jahaziel the third, and Jekameam the fourth. +\v 20 The sons of Uzziel: Micah the chief, and Isshiah the second. +\p +\v 21 The sons of Merari: Mahli and Mushi. The sons of Mahli: Eleazar and Kish. +\v 22 Eleazar died, and had no sons, but daughters only; and their relatives, the sons of Kish, took them as wives. +\v 23 The sons of Mushi: Mahli, Eder, and Jeremoth, three. +\p +\v 24 These were the sons of Levi after their fathers’ houses, even the heads of the fathers’ houses of those who were counted individually, in the number of names by their polls, who did the work for the service of Yahweh’s house, from twenty years old and upward. +\v 25 For David said, “Yahweh, the God of Israel, has given rest to his people; and he dwells in Jerusalem forever. +\v 26 Also the Levites will no longer need to carry the tabernacle and all its vessels for its service.” +\v 27 For by the last words of David the sons of Levi were counted, from twenty years old and upward. +\v 28 For their duty was to wait on the sons of Aaron for the service of Yahweh’s house—in the courts, in the rooms, and in the purifying of all holy things, even the work of the service of God’s house; +\v 29 for the show bread also, and for the fine flour for a meal offering, whether of unleavened wafers, or of that which is baked in the pan, or of that which is soaked, and for all measurements of quantity and size; +\v 30 and to stand every morning to thank and praise Yahweh, and likewise in the evening; +\v 31 and to offer all burnt offerings to Yahweh on the Sabbaths, on the new moons, and on the set feasts, in number according to the ordinance concerning them, continually before Yahweh; +\v 32 and that they should keep the duty of the Tent of Meeting, the duty of the holy place, and the duty of the sons of Aaron their brothers for the service of Yahweh’s house. +\c 24 +\p +\v 1 These were the divisions of the sons of Aaron. The sons of Aaron: Nadab, Abihu, Eleazar, and Ithamar. +\v 2 But Nadab and Abihu died before their father, and had no children; therefore Eleazar and Ithamar served as priests. +\v 3 David, with Zadok of the sons of Eleazar and Ahimelech of the sons of Ithamar, divided them according to their ordering in their service. +\v 4 There were more chief men found of the sons of Eleazar than of the sons of Ithamar; and they were divided like this: of the sons of Eleazar there were sixteen, heads of fathers’ houses; and of the sons of Ithamar, according to their fathers’ houses, eight. +\v 5 Thus they were divided impartially by drawing lots; for there were princes of the sanctuary and princes of God, both of the sons of Eleazar, and of the sons of Ithamar. +\v 6 Shemaiah the son of Nethanel the scribe, who was of the Levites, wrote them in the presence of the king, the princes, Zadok the priest, Ahimelech the son of Abiathar, and the heads of the fathers’ households of the priests and of the Levites; one fathers’ house being taken for Eleazar, and one taken for Ithamar. +\p +\v 7 Now the first lot came out to Jehoiarib, the second to Jedaiah, +\v 8 the third to Harim, the fourth to Seorim, +\v 9 the fifth to Malchijah, the sixth to Mijamin, +\v 10 the seventh to Hakkoz, the eighth to Abijah, +\v 11 the ninth to Jeshua, the tenth to Shecaniah, +\v 12 the eleventh to Eliashib, the twelfth to Jakim, +\v 13 the thirteenth to Huppah, the fourteenth to Jeshebeab, +\v 14 the fifteenth to Bilgah, the sixteenth to Immer, +\v 15 the seventeenth to Hezir, the eighteenth to Happizzez, +\v 16 the nineteenth to Pethahiah, the twentieth to Jehezkel, +\v 17 the twenty-first to Jachin, the twenty-second to Gamul, +\v 18 the twenty-third to Delaiah, and the twenty-fourth to Maaziah. +\v 19 This was their ordering in their service, to come into Yahweh’s house according to the ordinance given to them by Aaron their father, as Yahweh, the God of Israel, had commanded him. +\p +\v 20 Of the rest of the sons of Levi: of the sons of Amram, Shubael; of the sons of Shubael, Jehdeiah. +\v 21 Of Rehabiah: of the sons of Rehabiah, Isshiah the chief. +\v 22 Of the Izharites, Shelomoth; of the sons of Shelomoth, Jahath. +\v 23 The sons of Hebron: Jeriah, Amariah the second, Jahaziel the third, and Jekameam the fourth. +\v 24 The sons of Uzziel: Micah; of the sons of Micah, Shamir. +\v 25 The brother of Micah: Isshiah; of the sons of Isshiah, Zechariah. +\v 26 The sons of Merari: Mahli and Mushi. The son of Jaaziah: Beno. +\v 27 The sons of Merari by Jaaziah: Beno, Shoham, Zaccur, and Ibri. +\v 28 Of Mahli: Eleazar, who had no sons. +\v 29 Of Kish, the son of Kish: Jerahmeel. +\v 30 The sons of Mushi: Mahli, Eder, and Jerimoth. These were the sons of the Levites after their fathers’ houses. +\v 31 These likewise cast lots even as their brothers the sons of Aaron in the presence of David the king, Zadok, Ahimelech, and the heads of the fathers’ households of the priests and of the Levites, the fathers’ households of the chief even as those of his younger brother. +\c 25 +\p +\v 1 Moreover, David and the captains of the army set apart for the service certain of the sons of Asaph, of Heman, and of Jeduthun, who were to prophesy with harps, with stringed instruments, and with cymbals. The number of those who did the work according to their service was: +\v 2 of the sons of Asaph: Zaccur, Joseph, Nethaniah, and Asharelah. The sons of Asaph were under the hand of Asaph, who prophesied at the order of the king. +\v 3 Of Jeduthun, the sons of Jeduthun: Gedaliah, Zeri, Jeshaiah, Shimei, Hashabiah, and Mattithiah, six, under the hands of their father Jeduthun, who prophesied in giving thanks and praising Yahweh with the harp. +\v 4 Of Heman, the sons of Heman: Bukkiah, Mattaniah, Uzziel, Shebuel, Jerimoth, Hananiah, Hanani, Eliathah, Giddalti, Romamti-Ezer, Joshbekashah, Mallothi, Hothir, and Mahazioth. +\v 5 All these were the sons of Heman the king’s seer in the words of God, to lift up the horn. God gave to Heman fourteen sons and three daughters. +\v 6 All these were under the hands of their father for song in Yahweh’s house, with cymbals, stringed instruments, and harps, for the service of God’s house: Asaph, Jeduthun, and Heman being under the order of the king. +\v 7 The number of them, with their brothers who were instructed in singing to Yahweh, even all who were skillful, was two hundred eighty-eight. +\v 8 They cast lots for their offices, all alike, the small as well as the great, the teacher as well as the student. +\p +\v 9 Now the first lot came out for Asaph to Joseph; the second to Gedaliah, he and his brothers and sons were twelve; +\v 10 the third to Zaccur, his sons and his brothers, twelve; +\v 11 the fourth to Izri, his sons and his brothers, twelve; +\v 12 the fifth to Nethaniah, his sons and his brothers, twelve; +\v 13 the sixth to Bukkiah, his sons and his brothers, twelve; +\v 14 the seventh to Jesharelah, his sons and his brothers, twelve; +\v 15 the eighth to Jeshaiah, his sons and his brothers, twelve; +\v 16 the ninth to Mattaniah, his sons and his brothers, twelve; +\v 17 the tenth to Shimei, his sons and his brothers, twelve; +\v 18 the eleventh to Azarel, his sons and his brothers, twelve; +\v 19 the twelfth to Hashabiah, his sons and his brothers, twelve; +\v 20 for the thirteenth, Shubael, his sons and his brothers, twelve; +\v 21 for the fourteenth, Mattithiah, his sons and his brothers, twelve; +\v 22 for the fifteenth to Jeremoth, his sons and his brothers, twelve; +\v 23 for the sixteenth to Hananiah, his sons and his brothers, twelve; +\v 24 for the seventeenth to Joshbekashah, his sons and his brothers, twelve; +\v 25 for the eighteenth to Hanani, his sons and his brothers, twelve; +\v 26 for the nineteenth to Mallothi, his sons and his brothers, twelve; +\v 27 for the twentieth to Eliathah, his sons and his brothers, twelve; +\v 28 for the twenty-first to Hothir, his sons and his brothers, twelve; +\v 29 for the twenty-second to Giddalti, his sons and his brothers, twelve; +\v 30 for the twenty-third to Mahazioth, his sons and his brothers, twelve; +\v 31 for the twenty-fourth to Romamti-Ezer, his sons and his brothers, twelve. +\c 26 +\p +\v 1 For the divisions of the doorkeepers: of the Korahites, Meshelemiah the son of Kore, of the sons of Asaph. +\v 2 Meshelemiah had sons: Zechariah the firstborn, Jediael the second, Zebadiah the third, Jathniel the fourth, +\v 3 Elam the fifth, Jehohanan the sixth, and Eliehoenai the seventh. +\v 4 Obed-Edom had sons: Shemaiah the firstborn, Jehozabad the second, Joah the third, Sacar the fourth, Nethanel the fifth, +\v 5 Ammiel the sixth, Issachar the seventh, and Peullethai the eighth; for God blessed him. +\v 6 Sons were also born to Shemaiah his son, who ruled over the house of their father; for they were mighty men of valor. +\v 7 The sons of Shemaiah: Othni, Rephael, Obed, and Elzabad, whose relatives were valiant men, Elihu, and Semachiah. +\v 8 All these were of the sons of Obed-Edom with their sons and their brothers, able men in strength for the service: sixty-two of Obed-Edom. +\v 9 Meshelemiah had sons and brothers, eighteen valiant men. +\v 10 Also Hosah, of the children of Merari, had sons: Shimri the chief (for though he was not the firstborn, yet his father made him chief), +\v 11 Hilkiah the second, Tebaliah the third, and Zechariah the fourth. All the sons and brothers of Hosah were thirteen. +\p +\v 12 Of these were the divisions of the doorkeepers, even of the chief men, having offices like their brothers, to minister in Yahweh’s house. +\v 13 They cast lots, the small as well as the great, according to their fathers’ houses, for every gate. +\v 14 The lot eastward fell to Shelemiah. Then for Zechariah his son, a wise counselor, they cast lots; and his lot came out northward. +\v 15 To Obed-Edom southward; and to his sons the storehouse. +\v 16 To Shuppim and Hosah westward, by the gate of Shallecheth, at the causeway that goes up, watchman opposite watchman. +\v 17 Eastward were six Levites, northward four a day, southward four a day, and for the storehouse two and two. +\v 18 For Parbar westward, four at the causeway, and two at Parbar. +\v 19 These were the divisions of the doorkeepers; of the sons of the Korahites, and of the sons of Merari. +\p +\v 20 Of the Levites, Ahijah was over the treasures of God’s house and over the treasures of the dedicated things. +\v 21 The sons of Ladan, the sons of the Gershonites belonging to Ladan, the heads of the fathers’ households belonging to Ladan the Gershonite: Jehieli. +\v 22 The sons of Jehieli: Zetham, and Joel his brother, over the treasures of Yahweh’s house. +\v 23 Of the Amramites, of the Izharites, of the Hebronites, of the Uzzielites: +\v 24 Shebuel the son of Gershom, the son of Moses, was ruler over the treasuries. +\v 25 His brothers: of Eliezer, Rehabiah his son, and Jeshaiah his son, and Joram his son, and Zichri his son, and Shelomoth his son. +\v 26 This Shelomoth and his brothers were over all the treasuries of the dedicated things, which David the king, and the heads of the fathers’ households, the captains over thousands and hundreds, and the captains of the army, had dedicated. +\v 27 They dedicated some of the plunder won in battles to repair Yahweh’s house. +\v 28 All that Samuel the seer, Saul the son of Kish, Abner the son of Ner, and Joab the son of Zeruiah had dedicated, whoever had dedicated anything, it was under the hand of Shelomoth and of his brothers. +\p +\v 29 Of the Izharites, Chenaniah and his sons were appointed to the outward business over Israel, for officers and judges. +\v 30 Of the Hebronites, Hashabiah and his brothers, one thousand seven hundred men of valor, had the oversight of Israel beyond the Jordan westward, for all the business of Yahweh and for the service of the king. +\v 31 Of the Hebronites, Jerijah was the chief of the Hebronites, according to their generations by fathers’ households. They were sought for in the fortieth year of the reign of David, and mighty men of valor were found among them at Jazer of Gilead. +\v 32 His relatives, men of valor, were two thousand seven hundred, heads of fathers’ households, whom King David made overseers over the Reubenites, the Gadites, and the half-tribe of the Manassites, for every matter pertaining to God and for the affairs of the king. +\c 27 +\p +\v 1 Now the children of Israel after their number, the heads of fathers’ households and the captains of thousands and of hundreds, and their officers who served the king in any matter of the divisions which came in and went out month by month throughout all the months of the year—of every division were twenty-four thousand. +\p +\v 2 Over the first division for the first month was Jashobeam the son of Zabdiel. In his division were twenty-four thousand. +\v 3 He was of the children of Perez, the chief of all the captains of the army for the first month. +\v 4 Over the division of the second month was Dodai the Ahohite and his division, and Mikloth the ruler; and in his division were twenty-four thousand. +\v 5 The third captain of the army for the third month was Benaiah, the son of Jehoiada the chief priest. In his division were twenty-four thousand. +\v 6 This is that Benaiah who was the mighty man of the thirty and over the thirty. Of his division was Ammizabad his son. +\v 7 The fourth captain for the fourth month was Asahel the brother of Joab, and Zebadiah his son after him. In his division were twenty-four thousand. +\v 8 The fifth captain for the fifth month was Shamhuth the Izrahite. In his division were twenty-four thousand. +\v 9 The sixth captain for the sixth month was Ira the son of Ikkesh the Tekoite. In his division were twenty-four thousand. +\v 10 The seventh captain for the seventh month was Helez the Pelonite, of the children of Ephraim. In his division were twenty-four thousand. +\v 11 The eighth captain for the eighth month was Sibbecai the Hushathite, of the Zerahites. In his division were twenty-four thousand. +\v 12 The ninth captain for the ninth month was Abiezer the Anathothite, of the Benjamites. In his division were twenty-four thousand. +\v 13 The tenth captain for the tenth month was Maharai the Netophathite, of the Zerahites. In his division were twenty-four thousand. +\v 14 The eleventh captain for the eleventh month was Benaiah the Pirathonite, of the children of Ephraim. In his division were twenty-four thousand. +\v 15 The twelfth captain for the twelfth month was Heldai the Netophathite, of Othniel. In his division were twenty-four thousand. +\p +\v 16 Furthermore over the tribes of Israel: of the Reubenites, Eliezer the son of Zichri was the ruler; of the Simeonites, Shephatiah the son of Maacah; +\v 17 of Levi, Hashabiah the son of Kemuel; of Aaron, Zadok; +\v 18 of Judah, Elihu, one of the brothers of David; of Issachar, Omri the son of Michael; +\v 19 of Zebulun, Ishmaiah the son of Obadiah; of Naphtali, Jeremoth the son of Azriel; +\v 20 of the children of Ephraim, Hoshea the son of Azaziah; of the half-tribe of Manasseh, Joel the son of Pedaiah; +\v 21 of the half-tribe of Manasseh in Gilead, Iddo the son of Zechariah; of Benjamin, Jaasiel the son of Abner; +\v 22 of Dan, Azarel the son of Jeroham. These were the captains of the tribes of Israel. +\v 23 But David didn’t take the number of them from twenty years old and under, because Yahweh had said he would increase Israel like the stars of the sky. +\v 24 Joab the son of Zeruiah began to take a census, but didn’t finish; and wrath came on Israel for this. The number wasn’t put into the account in the chronicles of King David. +\p +\v 25 Over the king’s treasures was Azmaveth the son of Adiel. Over the treasures in the fields, in the cities, in the villages, and in the towers was Jonathan the son of Uzziah; +\v 26 Over those who did the work of the field for tillage of the ground was Ezri the son of Chelub. +\v 27 Over the vineyards was Shimei the Ramathite. Over the increase of the vineyards for the wine cellars was Zabdi the Shiphmite. +\v 28 Over the olive trees and the sycamore trees that were in the lowland was Baal Hanan the Gederite. Over the cellars of oil was Joash. +\v 29 Over the herds that fed in Sharon was Shitrai the Sharonite. Over the herds that were in the valleys was Shaphat the son of Adlai. +\v 30 Over the camels was Obil the Ishmaelite. Over the donkeys was Jehdeiah the Meronothite. Over the flocks was Jaziz the Hagrite. +\v 31 All these were the rulers of the property which was King David’s. +\p +\v 32 Also Jonathan, David’s uncle, was a counselor, a man of understanding, and a scribe. Jehiel the son of Hachmoni was with the king’s sons. +\v 33 Ahithophel was the king’s counselor. Hushai the Archite was the king’s friend. +\v 34 After Ahithophel was Jehoiada the son of Benaiah, and Abiathar. Joab was the captain of the king’s army. +\c 28 +\p +\v 1 David assembled all the princes of Israel, the princes of the tribes, the captains of the companies who served the king by division, the captains of thousands, the captains of hundreds, and the rulers over all the substance and possessions of the king and of his sons, with the officers and the mighty men, even all the mighty men of valor, to Jerusalem. +\v 2 Then David the king stood up on his feet and said, “Hear me, my brothers and my people! As for me, it was in my heart to build a house of rest for the ark of Yahweh’s covenant, and for the footstool of our God; and I had prepared for the building. +\v 3 But God said to me, ‘You shall not build a house for my name, because you are a man of war and have shed blood.’ +\v 4 However Yahweh, the God of Israel, chose me out of all the house of my father to be king over Israel forever. For he has chosen Judah to be prince; and in the house of Judah, the house of my father; and among the sons of my father he took pleasure in me to make me king over all Israel. +\v 5 Of all my sons (for Yahweh has given me many sons), he has chosen Solomon my son to sit on the throne of Yahweh’s kingdom over Israel. +\v 6 He said to me, ‘Solomon, your son, shall build my house and my courts; for I have chosen him to be my son, and I will be his father. +\v 7 I will establish his kingdom forever if he continues to do my commandments and my ordinances, as it is today.’ +\p +\v 8 Now therefore, in the sight of all Israel, Yahweh’s assembly, and in the audience of our God, observe and seek out all the commandments of Yahweh your God, that you may possess this good land, and leave it for an inheritance to your children after you forever. +\p +\v 9 You, Solomon my son, know the God of your father, and serve him with a perfect heart and with a willing mind; for Yahweh searches all hearts, and understands all the imaginations of the thoughts. If you seek him, he will be found by you; but if you forsake him, he will cast you off forever. +\v 10 Take heed now, for Yahweh has chosen you to build a house for the sanctuary. Be strong, and do it.” +\p +\v 11 Then David gave to Solomon his son the plans for the porch of the temple, for its houses, for its treasuries, for its upper rooms, for its inner rooms, for the place of the mercy seat; +\v 12 and the plans of all that he had by the Spirit, for the courts of Yahweh’s house, for all the surrounding rooms, for the treasuries of God’s house, and for the treasuries of the dedicated things; +\v 13 also for the divisions of the priests and the Levites, for all the work of the service of Yahweh’s house, and for all the vessels of service in Yahweh’s house— +\v 14 of gold by weight for the gold for all vessels of every kind of service, for all the vessels of silver by weight, for all vessels of every kind of service; +\v 15 by weight also for the lamp stands of gold, and for its lamps, of gold, by weight for every lamp stand and for its lamps; and for the lamp stands of silver, by weight for every lamp stand and for its lamps, according to the use of every lamp stand; +\v 16 and the gold by weight for the tables of show bread, for every table; and silver for the tables of silver; +\v 17 and the forks, the basins, and the cups, of pure gold; and for the golden bowls by weight for every bowl; and for the silver bowls by weight for every bowl; +\v 18 and for the altar of incense, refined gold by weight; and gold for the plans for the chariot, and the cherubim that spread out and cover the ark of Yahweh’s covenant. +\v 19 “All this”, David said, “I have been made to understand in writing from Yahweh’s hand, even all the works of this pattern.” +\p +\v 20 David said to Solomon his son, “Be strong and courageous, and do it. Don’t be afraid, nor be dismayed, for Yahweh God, even my God, is with you. He will not fail you nor forsake you, until all the work for the service of Yahweh’s house is finished. +\v 21 Behold, there are the divisions of the priests and the Levites for all the service of God’s house. Every willing man who has skill for any kind of service shall be with you in all kinds of work. Also the captains and all the people will be entirely at your command.” +\c 29 +\p +\v 1 David the king said to all the assembly, “Solomon my son, whom alone God has chosen, is yet young and tender, and the work is great; for the palace is not for man, but for Yahweh God. +\v 2 Now I have prepared with all my might for the house of my God the gold for the things of gold, the silver for the things of silver, the bronze for the things of bronze, iron for the things of iron, and wood for the things of wood, also onyx stones, stones to be set, stones for inlaid work of various colors, all kinds of precious stones, and marble stones in abundance. +\v 3 In addition, because I have set my affection on the house of my God, since I have a treasure of my own of gold and silver, I give it to the house of my God, over and above all that I have prepared for the holy house: +\v 4 even three thousand talents of gold,\f + \fr 29:4 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 3000 talents is about 90 metric tons\f* of the gold of Ophir, and seven thousand talents\f + \fr 29:4 \ft about 210 metric tons\f* of refined silver, with which to overlay the walls of the houses; +\v 5 of gold for the things of gold, and of silver for the things of silver, and for all kinds of work to be made by the hands of artisans. Who then offers willingly to consecrate himself today to Yahweh?” +\p +\v 6 Then the princes of the fathers’ households, and the princes of the tribes of Israel, and the captains of thousands and of hundreds, with the rulers over the king’s work, offered willingly; +\v 7 and they gave for the service of God’s house of gold five thousand talents\f + \fr 29:7 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 5000 talents is about 150 metric tons\f* and ten thousand darics,\f + \fr 29:7 \ft a daric was a gold coin issued by a Persian king, weighing about 8.4 grams or about 0.27 troy ounces each.\f* of silver ten thousand talents, of bronze eighteen thousand talents, and of iron one hundred thousand talents. +\v 8 People with whom precious stones were found gave them to the treasure of Yahweh’s house, under the hand of Jehiel the Gershonite. +\v 9 Then the people rejoiced, because they offered willingly, because with a perfect heart they offered willingly to Yahweh; and David the king also rejoiced with great joy. +\p +\v 10 Therefore David blessed Yahweh before all the assembly; and David said, “You are blessed, Yahweh, the God of Israel our father, forever and ever. +\v 11 Yours, Yahweh, is the greatness, the power, the glory, the victory, and the majesty! For all that is in the heavens and in the earth is yours. Yours is the kingdom, Yahweh, and you are exalted as head above all. +\v 12 Both riches and honor come from you, and you rule over all! In your hand is power and might! It is in your hand to make great, and to give strength to all! +\v 13 Now therefore, our God, we thank you and praise your glorious name. +\v 14 But who am I, and what is my people, that we should be able to offer so willingly as this? For all things come from you, and we have given you of your own. +\v 15 For we are strangers before you and foreigners, as all our fathers were. Our days on the earth are as a shadow, and there is no remaining. +\v 16 Yahweh our God, all this store that we have prepared to build you a house for your holy name comes from your hand, and is all your own. +\v 17 I know also, my God, that you try the heart and have pleasure in uprightness. As for me, in the uprightness of my heart I have willingly offered all these things. Now I have seen with joy your people, who are present here, offer willingly to you. +\v 18 Yahweh, the God of Abraham, of Isaac, and of Israel, our fathers, keep this desire forever in the thoughts of the heart of your people, and prepare their heart for you; +\v 19 and give to Solomon my son a perfect heart, to keep your commandments, your testimonies, and your statutes, and to do all these things, and to build the palace, for which I have made provision.” +\p +\v 20 Then David said to all the assembly, “Now bless Yahweh your God!” +\p All the assembly blessed Yahweh, the God of their fathers, and bowed down their heads and prostrated themselves before Yahweh and the king. +\v 21 They sacrificed sacrifices to Yahweh and offered burnt offerings to Yahweh on the next day after that day, even one thousand bulls, one thousand rams, and one thousand lambs, with their drink offerings and sacrifices in abundance for all Israel, +\v 22 and ate and drank before Yahweh on that day with great gladness. They made Solomon the son of David king the second time, and anointed him before Yahweh to be prince, and Zadok to be priest. +\p +\v 23 Then Solomon sat on the throne of Yahweh as king instead of David his father, and prospered; and all Israel obeyed him. +\v 24 All the princes, the mighty men, and also all of the sons of King David submitted themselves to Solomon the king. +\v 25 Yahweh magnified Solomon exceedingly in the sight of all Israel, and gave to him such royal majesty as had not been on any king before him in Israel. +\p +\v 26 Now David the son of Jesse reigned over all Israel. +\v 27 The time that he reigned over Israel was forty years; he reigned seven years in Hebron, and he reigned thirty-three years in Jerusalem. +\v 28 He died at a good old age, full of days, riches, and honor; and Solomon his son reigned in his place. +\v 29 Now the acts of David the king, first and last, behold, they are written in the history of Samuel the seer, and in the history of Nathan the prophet, and in the history of Gad the seer, +\v 30 with all his reign and his might, and the events that involved him, Israel, and all the kingdoms of the lands. diff --git a/c-sharp/assets/WEB/142CHengWEBUS.SFM b/c-sharp/assets/WEB/142CHengWEBUS.SFM new file mode 100644 index 0000000000..7a71d73b75 --- /dev/null +++ b/c-sharp/assets/WEB/142CHengWEBUS.SFM @@ -0,0 +1,1128 @@ +\id 2CH World English Bible (WEB) +\ide UTF-8 +\h 2 Chronicles +\toc1 The Second Book of Chronicles +\toc2 2 Chronicles +\toc3 2 Chronicles +\mt1 The Second Book of Chronicles +\c 1 +\p +\v 1 Solomon the son of David was firmly established in his kingdom, and Yahweh\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* his God\f + \fr 1:1 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* was with him, and made him exceedingly great. +\p +\v 2 Solomon spoke to all Israel, to the captains of thousands and of hundreds, to the judges, and to every prince in all Israel, the heads of the fathers’ households. +\v 3 Then Solomon, and all the assembly with him, went to the high place that was at Gibeon; for God’s Tent of Meeting was there, which Yahweh’s servant Moses had made in the wilderness. +\v 4 But David had brought God’s ark up from Kiriath Jearim to the place that David had prepared for it; for he had pitched a tent for it at Jerusalem. +\v 5 Moreover the bronze altar that Bezalel the son of Uri, the son of Hur, had made was there before Yahweh’s tabernacle; and Solomon and the assembly were seeking counsel there. +\v 6 Solomon went up there to the bronze altar before Yahweh, which was at the Tent of Meeting, and offered one thousand burnt offerings on it. +\p +\v 7 That night, God appeared to Solomon and said to him, “Ask for what you want me to give you.” +\p +\v 8 Solomon said to God, “You have shown great loving kindness to David my father, and have made me king in his place. +\v 9 Now, Yahweh God, let your promise to David my father be established; for you have made me king over a people like the dust of the earth in multitude. +\v 10 Now give me wisdom and knowledge, that I may go out and come in before this people; for who can judge this great people of yours?” +\p +\v 11 God said to Solomon, “Because this was in your heart, and you have not asked riches, wealth, honor, or the life of those who hate you, nor yet have you asked for long life; but have asked for wisdom and knowledge for yourself, that you may judge my people, over whom I have made you king, +\v 12 therefore wisdom and knowledge is granted to you. I will give you riches, wealth, and honor, such as none of the kings have had who have been before you, and none after you will have.” +\p +\v 13 So Solomon came from the high place that was at Gibeon, from before the Tent of Meeting, to Jerusalem; and he reigned over Israel. +\p +\v 14 Solomon gathered chariots and horsemen. He had one thousand four hundred chariots and twelve thousand horsemen that he placed in the chariot cities, and with the king at Jerusalem. +\v 15 The king made silver and gold to be as common as stones in Jerusalem, and he made cedars to be as common as the sycamore trees that are in the lowland. +\v 16 The horses which Solomon had were brought out of Egypt and from Kue. The king’s merchants purchased them from Kue. +\v 17 They imported from Egypt then exported a chariot for six hundred pieces of silver and a horse for one hundred fifty.\f + \fr 1:17 \ft The pieces of silver were probably shekels, so 600 pieces would be about 13.2 pounds or 6 kilograms of silver, and 150 would be about 3.3 pounds or 1.5 kilograms of silver.\f* They also exported them to the Hittite kings and the Syrian\f + \fr 1:17 \ft or, Aramean\f* kings. +\c 2 +\p +\v 1 Now Solomon decided to build a house for Yahweh’s name, and a house for his kingdom. +\v 2 Solomon counted out seventy thousand men to bear burdens, eighty thousand men who were stone cutters in the mountains, and three thousand six hundred to oversee them. +\p +\v 3 Solomon sent to Huram the king of Tyre, saying, “As you dealt with David my father, and sent him cedars to build him a house in which to dwell, so deal with me. +\v 4 Behold,\f + \fr 2:4 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I am about to build a house for the name of Yahweh my God, to dedicate it to him, to burn before him incense of sweet spices, for the continual show bread, and for the burnt offerings morning and evening, on the Sabbaths, on the new moons, and on the set feasts of Yahweh our God. This is an ordinance forever to Israel. +\p +\v 5 “The house which I am building will be great, for our God is greater than all gods. +\v 6 But who is able to build him a house, since heaven and the heaven of heavens can’t contain him? Who am I then, that I should build him a house, except just to burn incense before him? +\p +\v 7 “Now therefore send me a man skillful to work in gold, in silver, in bronze, in iron, and in purple, crimson, and blue, and who knows how to engrave engravings, to be with the skillful men who are with me in Judah and in Jerusalem, whom David my father provided. +\p +\v 8 “Send me also cedar trees, cypress trees, and algum trees out of Lebanon, for I know that your servants know how to cut timber in Lebanon. Behold, my servants will be with your servants, +\v 9 even to prepare me timber in abundance; for the house which I am about to build will be great and wonderful. +\v 10 Behold, I will give to your servants, the cutters who cut timber, twenty thousand cors\f + \fr 2:10 \ft 1 cor is the same as a homer, or about 55.9 U. S. gallons (liquid) or 211 liters or 6 bushels, so 20,000 cors of wheat would weigh about 545 metric tons\f* of beaten wheat, twenty thousand baths\f + \fr 2:10 \ft 1 bath is one tenth of a cor, or about 5.6 U. S. gallons or 21 liters or 2.4 pecks. 20,000 baths of barley would weigh about 262 metric tons.\f* of barley, twenty thousand baths of wine, and twenty thousand baths of oil.” +\p +\v 11 Then Huram the king of Tyre answered in writing, which he sent to Solomon, “Because Yahweh loves his people, he has made you king over them.” +\v 12 Huram continued, “Blessed be Yahweh, the God of Israel, who made heaven and earth, who has given to David the king a wise son, endowed with discretion and understanding, who would build a house for Yahweh and a house for his kingdom. +\p +\v 13 Now I have sent a skillful man, endowed with understanding, Huram-abi,\f + \fr 2:13 \ft or, Huram, my father\f* +\v 14 the son of a woman of the daughters of Dan; and his father was a man of Tyre. He is skillful to work in gold, in silver, in bronze, in iron, in stone, in timber, in purple, in blue, in fine linen, and in crimson, also to engrave any kind of engraving and to devise any device, that there may be a place appointed to him with your skillful men, and with the skillful men of my lord David your father. +\p +\v 15 “Now therefore, the wheat, the barley, the oil, and the wine which my lord has spoken of, let him send to his servants; +\v 16 and we will cut wood out of Lebanon, as much as you need. We will bring it to you in rafts by sea to Joppa; then you shall carry it up to Jerusalem.” +\p +\v 17 Solomon counted all the foreigners who were in the land of Israel, after the census with which David his father had counted them; and they found one hundred fifty-three thousand six hundred. +\v 18 He set seventy thousand of them to bear burdens, eighty thousand who were stone cutters in the mountains, and three thousand six hundred overseers to assign the people their work. +\c 3 + +\p +\v 1 Then Solomon began to build Yahweh’s house at Jerusalem on Mount Moriah, where Yahweh appeared to David his father, which he prepared in the place that David had appointed, on the threshing floor of Ornan the Jebusite. +\v 2 He began to build in the second day of the second month, in the fourth year of his reign. +\v 3 Now these are the foundations which Solomon laid for the building of God’s house: the length by cubits\f + \fr 3:3 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* after the first measure was sixty cubits, and the width twenty cubits. +\v 4 The porch that was in front, its length, across the width of the house, was twenty cubits, and the height one hundred twenty; and he overlaid it within with pure gold. +\v 5 He made the larger room with a ceiling of cypress wood, which he overlaid with fine gold, and ornamented it with palm trees and chains. +\v 6 He decorated the house with precious stones for beauty. The gold was gold from Parvaim. +\v 7 He also overlaid the house, the beams, the thresholds, its walls, and its doors with gold, and engraved cherubim on the walls. +\p +\v 8 He made the most holy place. Its length, according to the width of the house, was twenty cubits, and its width twenty cubits; and he overlaid it with fine gold, amounting to six hundred talents.\f + \fr 3:8 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 600 talents is about 18 metric tons\f* +\v 9 The weight of the nails was fifty shekels\f + \fr 3:9 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 50 shekels was about 0.5 kilograms or about 16 Troy ounces.\f* of gold. He overlaid the upper rooms with gold. +\p +\v 10 In the most holy place he made two cherubim by carving, and they overlaid them with gold. +\v 11 The wings of the cherubim were twenty cubits long: the wing of the one was five cubits, reaching to the wall of the house; and the other wing was five cubits, reaching to the wing of the other cherub. +\v 12 The wing of the other cherub was five cubits, reaching to the wall of the house; and the other wing was five cubits, joining to the wing of the other cherub. +\v 13 The wings of these cherubim spread themselves out twenty cubits. They stood on their feet, and their faces were toward the house. +\v 14 He made the veil of blue, purple, crimson, and fine linen, and ornamented it with cherubim. +\p +\v 15 Also he made before the house two pillars thirty-five cubits high, and the capital that was on the top of each of them was five cubits. +\v 16 He made chains in the inner sanctuary, and put them on the tops of the pillars; and he made one hundred pomegranates, and put them on the chains. +\v 17 He set up the pillars before the temple, one on the right hand and the other on the left; and called the name of that on the right hand Jachin, and the name of that on the left Boaz. +\c 4 +\p +\v 1 Then he made an altar of bronze, twenty cubits\f + \fr 4:1 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* long, twenty cubits wide, and ten cubits high. +\v 2 Also he made the molten sea\f + \fr 4:2 \ft or, pool, or, reservoir\f* of ten cubits from brim to brim. It was round, five cubits high, and thirty cubits in circumference. +\v 3 Under it was the likeness of oxen, which encircled it, for ten cubits, encircling the sea. The oxen were in two rows, cast when it was cast. +\v 4 It stood on twelve oxen, three looking toward the north, three looking toward the west, three looking toward the south, and three looking toward the east; and the sea was set on them above, and all their hindquarters were inward. +\v 5 It was a handbreadth thick. Its brim was made like the brim of a cup, like the flower of a lily. It received and held three thousand baths.\f + \fr 4:5 \ft A bath is about 5.6 U. S. gallons or 21.1 liters, so 3,000 baths is about 16,800 gallons or 63.3 kiloliters.\f* +\v 6 He also made ten basins, and put five on the right hand and five on the left, to wash in them. The things that belonged to the burnt offering were washed in them, but the sea was for the priests to wash in. +\p +\v 7 He made the ten lamp stands of gold according to the ordinance concerning them; and he set them in the temple, five on the right hand and five on the left. +\v 8 He made also ten tables, and placed them in the temple, five on the right side and five on the left. He made one hundred basins of gold. +\v 9 Furthermore he made the court of the priests, the great court, and doors for the court, and overlaid their doors with bronze. +\v 10 He set the sea on the right side of the house eastward, toward the south. +\p +\v 11 Huram made the pots, the shovels, and the basins. +\p So Huram finished doing the work that he did for King Solomon in God’s house: +\v 12 the two pillars, the bowls, the two capitals which were on the top of the pillars, the two networks to cover the two bowls of the capitals that were on the top of the pillars, +\v 13 and the four hundred pomegranates for the two networks—two rows of pomegranates for each network, to cover the two bowls of the capitals that were on the pillars. +\v 14 He also made the bases, and he made the basins on the bases— +\v 15 one sea, and the twelve oxen under it. +\v 16 Huram-abi\f + \fr 4:16 \ft “abi” means “his father”\f* also made the pots, the shovels, the forks, and all its vessels for King Solomon, for Yahweh’s house, of bright bronze. +\v 17 The king cast them in the plain of the Jordan, in the clay ground between Succoth and Zeredah. +\v 18 Thus Solomon made all these vessels in great abundance, so that the weight of the bronze could not be determined. +\p +\v 19 Solomon made all the vessels that were in God’s house: the golden altar, the tables with the show bread on them, +\v 20 and the lamp stands with their lamps to burn according to the ordinance before the inner sanctuary, of pure gold; +\v 21 and the flowers, the lamps, and the tongs of gold that was purest gold; +\v 22 and the snuffers, the basins, the spoons, and the fire pans of pure gold. As for the entry of the house, its inner doors for the most holy place and the doors of the main hall of the temple were of gold. +\c 5 +\p +\v 1 Thus all the work that Solomon did for Yahweh’s house was finished. Solomon brought in the things that David his father had dedicated, even the silver, the gold, and all the vessels, and put them in the treasuries of God’s house. +\p +\v 2 Then Solomon assembled the elders of Israel and all the heads of the tribes, the princes of the fathers’ households of the children of Israel, to Jerusalem, to bring up the ark of Yahweh’s covenant out of David’s city, which is Zion. +\v 3 So all the men of Israel assembled themselves to the king at the feast, which was in the seventh month. +\v 4 All the elders of Israel came. The Levites took up the ark. +\v 5 They brought up the ark, the Tent of Meeting, and all the holy vessels that were in the Tent. The Levitical priests brought these up. +\v 6 King Solomon and all the congregation of Israel who were assembled to him were before the ark, sacrificing sheep and cattle that could not be counted or numbered for multitude. +\v 7 The priests brought in the ark of Yahweh’s covenant to its place, into the inner sanctuary of the house, to the most holy place, even under the wings of the cherubim. +\v 8 For the cherubim spread out their wings over the place of the ark, and the cherubim covered the ark and its poles above. +\v 9 The poles were so long that the ends of the poles were seen from the ark in front of the inner sanctuary, but they were not seen outside; and it is there to this day. +\v 10 There was nothing in the ark except the two tablets which Moses put there at Horeb, when Yahweh made a covenant with the children of Israel, when they came out of Egypt. +\p +\v 11 When the priests had come out of the holy place (for all the priests who were present had sanctified themselves, and didn’t keep their divisions; +\v 12 also the Levites who were the singers, all of them, even Asaph, Heman, Jeduthun, and their sons and their brothers, arrayed in fine linen, with cymbals and stringed instruments and harps, stood at the east end of the altar, and with them one hundred twenty priests sounding with trumpets); +\v 13 when the trumpeters and singers were as one, to make one sound to be heard in praising and thanking Yahweh; and when they lifted up their voice with the trumpets and cymbals and instruments of music, and praised Yahweh, saying, +\q1 “For he is good, +\q2 for his loving kindness endures forever!” +\m then the house was filled with a cloud, even Yahweh’s house, +\v 14 so that the priests could not stand to minister by reason of the cloud; for Yahweh’s glory filled God’s house. +\c 6 +\p +\v 1 Then Solomon said, “Yahweh has said that he would dwell in the thick darkness. +\v 2 But I have built you a house and home, a place for you to dwell in forever.” +\p +\v 3 The king turned his face, and blessed all the assembly of Israel; and all the assembly of Israel stood. +\p +\v 4 He said, “Blessed be Yahweh, the God of Israel, who spoke with his mouth to David my father, and has with his hands fulfilled it, saying, +\v 5 ‘Since the day that I brought my people out of the land of Egypt, I chose no city out of all the tribes of Israel to build a house in, that my name might be there, and I chose no man to be prince over my people Israel; +\v 6 but now I have chosen Jerusalem, that my name might be there; and I have chosen David to be over my people Israel.’ +\v 7 Now it was in the heart of David my father to build a house for the name of Yahweh, the God of Israel. +\v 8 But Yahweh said to David my father, ‘Whereas it was in your heart to build a house for my name, you did well that it was in your heart; +\v 9 nevertheless you shall not build the house, but your son who will come out of your body, he shall build the house for my name.’ +\p +\v 10 “Yahweh has performed his word that he spoke; for I have risen up in the place of David my father, and sit on the throne of Israel, as Yahweh promised, and have built the house for the name of Yahweh, the God of Israel. +\v 11 There I have set the ark, in which is Yahweh’s covenant, which he made with the children of Israel.” +\p +\v 12 He stood before Yahweh’s altar in the presence of all the assembly of Israel, and spread out his hands +\v 13 (for Solomon had made a bronze platform, five cubits\f + \fr 6:13 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* long, five cubits wide, and three cubits high, and had set it in the middle of the court; and he stood on it, and knelt down on his knees before all the assembly of Israel, and spread out his hands toward heaven). +\v 14 Then he said, “Yahweh, the God of Israel, there is no God like you in heaven or on earth—you who keep covenant and loving kindness with your servants who walk before you with all their heart; +\v 15 who have kept with your servant David my father that which you promised him. Yes, you spoke with your mouth, and have fulfilled it with your hand, as it is today. +\p +\v 16 “Now therefore, Yahweh, the God of Israel, keep with your servant David my father that which you have promised him, saying, ‘There shall not fail you a man in my sight to sit on the throne of Israel, if only your children take heed to their way, to walk in my law as you have walked before me.’ +\v 17 Now therefore, Yahweh, the God of Israel, let your word be verified, which you spoke to your servant David. +\p +\v 18 “But will God indeed dwell with men on the earth? Behold, heaven and the heaven of heavens can’t contain you; how much less this house which I have built! +\v 19 Yet have respect for the prayer of your servant and to his supplication, Yahweh my God, to listen to the cry and to the prayer which your servant prays before you; +\v 20 that your eyes may be open toward this house day and night, even toward the place where you have said that you would put your name, to listen to the prayer which your servant will pray toward this place. +\v 21 Listen to the petitions of your servant and of your people Israel, when they pray toward this place. Yes, hear from your dwelling place, even from heaven; and when you hear, forgive. +\p +\v 22 “If a man sins against his neighbor, and an oath is laid on him to cause him to swear, and he comes and swears before your altar in this house, +\v 23 then hear from heaven, act, and judge your servants, bringing retribution to the wicked, to bring his way on his own head; and justifying the righteous, to give him according to his righteousness. +\p +\v 24 “If your people Israel are struck down before the enemy because they have sinned against you, and they turn again and confess your name, and pray and make supplication before you in this house, +\v 25 then hear from heaven, and forgive the sin of your people Israel, and bring them again to the land which you gave to them and to their fathers. +\p +\v 26 “When the sky is shut up and there is no rain because they have sinned against you, if they pray toward this place and confess your name, and turn from their sin when you afflict them, +\v 27 then hear in heaven, and forgive the sin of your servants, your people Israel, when you teach them the good way in which they should walk, and send rain on your land, which you have given to your people for an inheritance. +\p +\v 28 “If there is famine in the land, if there is pestilence, if there is blight or mildew, locust or caterpillar; if their enemies besiege them in the land of their cities; whatever plague or whatever sickness there is— +\v 29 whatever prayer and supplication is made by any man, or by all your people Israel, who will each know his own plague and his own sorrow, and shall spread out his hands toward this house, +\v 30 then hear from heaven your dwelling place and forgive, and render to every man according to all his ways, whose heart you know (for you, even you only, know the hearts of the children of men), +\v 31 that they may fear you, to walk in your ways as long as they live in the land which you gave to our fathers. +\p +\v 32 “Moreover, concerning the foreigner, who is not of your people Israel, when he comes from a far country for your great name’s sake and your mighty hand and your outstretched arm, when they come and pray toward this house, +\v 33 then hear from heaven, even from your dwelling place, and do according to all that the foreigner calls to you for; that all the peoples of the earth may know your name and fear you, as do your people Israel, and that they may know that this house which I have built is called by your name. +\p +\v 34 “If your people go out to battle against their enemies, by whatever way you send them, and they pray to you toward this city which you have chosen, and the house which I have built for your name; +\v 35 then hear from heaven their prayer and their supplication, and maintain their cause. +\p +\v 36 “If they sin against you (for there is no man who doesn’t sin), and you are angry with them and deliver them to the enemy, so that they carry them away captive to a land far off or near; +\v 37 yet if they come to their senses in the land where they are carried captive, and turn again, and make supplication to you in the land of their captivity, saying, ‘We have sinned, we have done perversely, and have dealt wickedly;’ +\v 38 if they return to you with all their heart and with all their soul in the land of their captivity, where they have been taken captive, and pray toward their land which you gave to their fathers, and the city which you have chosen, and toward the house which I have built for your name; +\v 39 then hear from heaven, even from your dwelling place, their prayer and their petitions, and maintain their cause, and forgive your people who have sinned against you. +\p +\v 40 “Now, my God, let, I beg you, your eyes be open, and let your ears be attentive to the prayer that is made in this place. +\p +\v 41 “Now therefore arise, Yahweh God, into your resting place, you, and the ark of your strength. Let your priests, Yahweh God, be clothed with salvation, and let your saints rejoice in goodness. +\p +\v 42 “Yahweh God, don’t turn away the face of your anointed. Remember your loving kindnesses to David your servant.” +\c 7 +\p +\v 1 Now when Solomon had finished praying, fire came down from heaven and consumed the burnt offering and the sacrifices; and Yahweh’s glory filled the house. +\v 2 The priests could not enter into Yahweh’s house, because Yahweh’s glory filled Yahweh’s house. +\v 3 All the children of Israel looked on, when the fire came down, and Yahweh’s glory was on the house. They bowed themselves with their faces to the ground on the pavement, worshiped, and gave thanks to Yahweh, saying, +\q1 “For he is good, +\q2 for his loving kindness endures forever!” +\p +\v 4 Then the king and all the people offered sacrifices before Yahweh. +\v 5 King Solomon offered a sacrifice of twenty-two thousand head of cattle and a hundred twenty thousand sheep. So the king and all the people dedicated God’s house. +\v 6 The priests stood, according to their positions; the Levites also with instruments of music of Yahweh, which David the king had made to give thanks to Yahweh, when David praised by their ministry, saying “For his loving kindness endures forever.” The priests sounded trumpets before them; and all Israel stood. +\p +\v 7 Moreover Solomon made the middle of the court that was before Yahweh’s house holy; for there he offered the burnt offerings and the fat of the peace offerings, because the bronze altar which Solomon had made was not able to receive the burnt offering, the meal offering, and the fat. +\p +\v 8 So Solomon held the feast at that time for seven days, and all Israel with him, a very great assembly, from the entrance of Hamath to the brook of Egypt. +\p +\v 9 On the eighth day, they held a solemn assembly; for they kept the dedication of the altar seven days, and the feast seven days. +\v 10 On the twenty-third day of the seventh month, he sent the people away to their tents, joyful and glad of heart for the goodness that Yahweh had shown to David, to Solomon, and to Israel his people. +\p +\v 11 Thus Solomon finished Yahweh’s house and the king’s house; and he successfully completed all that came into Solomon’s heart to make in Yahweh’s house and in his own house. +\p +\v 12 Then Yahweh appeared to Solomon by night, and said to him, “I have heard your prayer, and have chosen this place for myself for a house of sacrifice. +\p +\v 13 “If I shut up the sky so that there is no rain, or if I command the locust to devour the land, or if I send pestilence among my people, +\v 14 if my people who are called by my name will humble themselves, pray, seek my face, and turn from their wicked ways, then I will hear from heaven, will forgive their sin, and will heal their land. +\v 15 Now my eyes will be open and my ears attentive to prayer that is made in this place. +\v 16 For now I have chosen and made this house holy, that my name may be there forever; and my eyes and my heart will be there perpetually. +\p +\v 17 “As for you, if you will walk before me as David your father walked, and do according to all that I have commanded you, and will keep my statutes and my ordinances, +\v 18 then I will establish the throne of your kingdom, according as I covenanted with David your father, saying, ‘There shall not fail you a man to be ruler in Israel.’ +\p +\v 19 But if you turn away and forsake my statutes and my commandments which I have set before you, and go and serve other gods and worship them, +\v 20 then I will pluck them up by the roots out of my land which I have given them; and this house, which I have made holy for my name, I will cast out of my sight, and I will make it a proverb and a byword among all peoples. +\v 21 This house, which is so high, everyone who passes by it will be astonished and say, ‘Why has Yahweh done this to this land and to this house?’ +\v 22 They shall answer, ‘Because they abandoned Yahweh, the God of their fathers, who brought them out of the land of Egypt, and took other gods, worshiped them, and served them. Therefore he has brought all this evil on them.’” +\c 8 +\p +\v 1 At the end of twenty years, in which Solomon had built Yahweh’s house and his own house, +\v 2 Solomon built the cities which Huram had given to Solomon, and caused the children of Israel to dwell there. +\p +\v 3 Solomon went to Hamath Zobah, and prevailed against it. +\v 4 He built Tadmor in the wilderness, and all the storage cities, which he built in Hamath. +\v 5 Also he built Beth Horon the upper and Beth Horon the lower, fortified cities with walls, gates, and bars; +\v 6 and Baalath, and all the storage cities that Solomon had, and all the cities for his chariots, the cities for his horsemen, and all that Solomon desired to build for his pleasure in Jerusalem, in Lebanon, and in all the land of his dominion. +\p +\v 7 As for all the people who were left of the Hittites, the Amorites, the Perizzites, the Hivites, and the Jebusites, who were not of Israel— +\v 8 of their children who were left after them in the land, whom the children of Israel didn’t consume—of them Solomon conscripted forced labor to this day. +\v 9 But of the children of Israel, Solomon made no servants for his work, but they were men of war, chief of his captains, and rulers of his chariots and of his horsemen. +\v 10 These were the chief officers of King Solomon, even two-hundred fifty, who ruled over the people. +\p +\v 11 Solomon brought up Pharaoh’s daughter out of David’s city to the house that he had built for her; for he said, “My wife shall not dwell in the house of David king of Israel, because the places where Yahweh’s ark has come are holy.” +\p +\v 12 Then Solomon offered burnt offerings to Yahweh on Yahweh’s altar which he had built before the porch, +\v 13 even as the duty of every day required, offering according to the commandment of Moses on the Sabbaths, on the new moons, and on the set feasts, three times per year, during the feast of unleavened bread, during the feast of weeks, and during the feast of booths.\f + \fr 8:13 \ft or, feast of tents (Sukkot)\f* +\p +\v 14 He appointed, according to the ordinance of David his father, the divisions of the priests to their service, and the Levites to their offices, to praise and to minister before the priests, as the duty of every day required, the doorkeepers also by their divisions at every gate, for David the man of God had so commanded. +\v 15 They didn’t depart from the commandment of the king to the priests and Levites concerning any matter or concerning the treasures. +\p +\v 16 Now all the work of Solomon was accomplished from the day of the foundation of Yahweh’s house until it was finished. So Yahweh’s house was completed. +\p +\v 17 Then Solomon went to Ezion Geber and to Eloth, on the seashore in the land of Edom. +\v 18 Huram sent him ships and servants who had knowledge of the sea by the hands of his servants; and they came with the servants of Solomon to Ophir, and brought from there four hundred fifty talents\f + \fr 8:18 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 450 talents is about 13.5 metric tons\f* of gold, and brought them to King Solomon. +\c 9 +\p +\v 1 When the queen of Sheba heard of the fame of Solomon, she came to test Solomon with hard questions at Jerusalem, with a very great caravan, including camels that bore spices, gold in abundance, and precious stones. When she had come to Solomon, she talked with him about all that was in her heart. +\v 2 Solomon answered all her questions. There wasn’t anything hidden from Solomon which he didn’t tell her. +\v 3 When the queen of Sheba had seen the wisdom of Solomon, the house that he had built, +\v 4 the food of his table, the seating of his servants, the attendance of his ministers, their clothing, his cup bearers and their clothing, and his ascent by which he went up to Yahweh’s house, there was no more spirit in her.\f + \fr 9:4 \ft or, she was breathless.\f* +\p +\v 5 She said to the king, “It was a true report that I heard in my own land of your acts and of your wisdom. +\v 6 However I didn’t believe their words until I came, and my eyes had seen it; and behold half of the greatness of your wisdom wasn’t told me. You exceed the fame that I heard! +\v 7 Happy are your men, and happy are these your servants, who stand continually before you and hear your wisdom. +\v 8 Blessed be Yahweh your God, who delighted in you and set you on his throne to be king for Yahweh your God, because your God loved Israel, to establish them forever. Therefore he made you king over them, to do justice and righteousness.” +\p +\v 9 She gave the king one hundred and twenty talents\f + \fr 9:9 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 120 talents is about 3.6 metric tons\f* of gold, spices in great abundance, and precious stones. There was never before such spice as the queen of Sheba gave to King Solomon. +\p +\v 10 The servants of Huram and the servants of Solomon, who brought gold from Ophir, also brought algum trees\f + \fr 9:10 \ft possibly Indian sandalwood, which has nice grain and a pleasant scent and is good for woodworking\f* and precious stones. +\v 11 The king used algum tree wood to make terraces for Yahweh’s house and for the king’s house, and harps and stringed instruments for the singers. There were none like these seen before in the land of Judah. +\v 12 King Solomon gave to the queen of Sheba all her desire, whatever she asked, more than that which she had brought to the king. So she turned and went to her own land, she and her servants. +\p +\v 13 Now the weight of gold that came to Solomon in one year was six hundred sixty-six talents\f + \fr 9:13 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces, so 666 talents is about 20 metric tons\f* of gold, +\v 14 in addition to that which the traders and merchants brought. All the kings of Arabia and the governors of the country brought gold and silver to Solomon. +\v 15 King Solomon made two hundred large shields of beaten gold. Six hundred shekels\f + \fr 9:15 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 600 shekels was about 6 kilograms or about 192 Troy ounces.\f* of beaten gold went to one large shield. +\v 16 He made three hundred shields of beaten gold. Three hundred shekels\f + \fr 9:16 \ft A shekel is about 10 grams or about 0.32 Troy ounces, so 300 shekels was about 3 kilograms or about 96 Troy ounces.\f* of gold went to one shield. The king put them in the House of the Forest of Lebanon. +\v 17 Moreover the king made a great throne of ivory, and overlaid it with pure gold. +\v 18 There were six steps to the throne, with a footstool of gold, which were fastened to the throne, and armrests on either side by the place of the seat, and two lions standing beside the armrests. +\v 19 Twelve lions stood there on the one side and on the other on the six steps. There was nothing like it made in any other kingdom. +\v 20 All King Solomon’s drinking vessels were of gold, and all the vessels of the House of the Forest of Lebanon were of pure gold. Silver was not considered valuable in the days of Solomon. +\v 21 For the king had ships that went to Tarshish with Huram’s servants. Once every three years, the ships of Tarshish came bringing gold, silver, ivory, apes, and peacocks. +\p +\v 22 So King Solomon exceeded all the kings of the earth in riches and wisdom. +\v 23 All the kings of the earth sought the presence of Solomon to hear his wisdom, which God had put in his heart. +\v 24 They each brought tribute: vessels of silver, vessels of gold, clothing, armor, spices, horses, and mules every year. +\v 25 Solomon had four thousand stalls for horses and chariots, and twelve thousand horsemen that he stationed in the chariot cities and with the king at Jerusalem. +\v 26 He ruled over all the kings from the River even to the land of the Philistines, and to the border of Egypt. +\v 27 The king made silver as common in Jerusalem as stones, and he made cedars to be as abundant as the sycamore trees that are in the lowland. +\v 28 They brought horses for Solomon out of Egypt and out of all lands. +\p +\v 29 Now the rest of the acts of Solomon, first and last, aren’t they written in the history of Nathan the prophet, and in the prophecy of Ahijah the Shilonite, and in the visions of Iddo the seer concerning Jeroboam the son of Nebat? +\v 30 Solomon reigned in Jerusalem over all Israel forty years. +\v 31 Solomon slept with his fathers, and he was buried in his father David’s city; and Rehoboam his son reigned in his place. +\c 10 +\p +\v 1 Rehoboam went to Shechem, for all Israel had come to Shechem to make him king. +\v 2 When Jeroboam the son of Nebat heard of it (for he was in Egypt, where he had fled from the presence of King Solomon), Jeroboam returned out of Egypt. +\v 3 They sent and called him; and Jeroboam and all Israel came, and they spoke to Rehoboam, saying, +\v 4 “Your father made our yoke grievous. Now therefore make the grievous service of your father and his heavy yoke which he put on us, lighter, and we will serve you.” +\p +\v 5 He said to them, “Come again to me after three days.” +\p So the people departed. +\p +\v 6 King Rehoboam took counsel with the old men, who had stood before Solomon his father while he yet lived, saying, “What counsel do you give me about how to answer these people?” +\p +\v 7 They spoke to him, saying, “If you are kind to these people, please them, and speak good words to them, then they will be your servants forever.” +\p +\v 8 But he abandoned the counsel of the old men which they had given him, and took counsel with the young men who had grown up with him, who stood before him. +\v 9 He said to them, “What counsel do you give, that we may give an answer to these people, who have spoken to me, saying, ‘Make the yoke that your father put on us lighter?’” +\p +\v 10 The young men who had grown up with him spoke to him, saying, “Thus you shall tell the people who spoke to you, saying, ‘Your father made our yoke heavy, but make it lighter on us;’ thus you shall say to them, ‘My little finger is thicker than my father’s waist. +\v 11 Now whereas my father burdened you with a heavy yoke, I will add to your yoke. My father chastised you with whips, but I will chastise you with scorpions.’” +\p +\v 12 So Jeroboam and all the people came to Rehoboam the third day, as the king asked, saying, “Come to me again the third day.” +\v 13 The king answered them roughly; and King Rehoboam abandoned the counsel of the old men, +\v 14 and spoke to them after the counsel of the young men, saying, “My father made your yoke heavy, but I will add to it. My father chastised you with whips, but I will chastise you with scorpions.” +\p +\v 15 So the king didn’t listen to the people; for it was brought about by God, that Yahweh might establish his word, which he spoke by Ahijah the Shilonite to Jeroboam the son of Nebat. +\p +\v 16 When all Israel saw that the king didn’t listen to them, the people answered the king, saying, “What portion do we have in David? We don’t have an inheritance in the son of Jesse! Every man to your tents, Israel! Now see to your own house, David.” So all Israel departed to their tents. +\p +\v 17 But as for the children of Israel who lived in the cities of Judah, Rehoboam reigned over them. +\v 18 Then King Rehoboam sent Hadoram, who was over the men subject to forced labor; and the children of Israel stoned him to death with stones. King Rehoboam hurried to get himself up to his chariot, to flee to Jerusalem. +\v 19 So Israel rebelled against David’s house to this day. +\c 11 +\p +\v 1 When Rehoboam had come to Jerusalem, he assembled the house of Judah and Benjamin, one hundred eighty thousand chosen men who were warriors, to fight against Israel, to bring the kingdom again to Rehoboam. +\v 2 But Yahweh’s word came to Shemaiah the man of God, saying, +\v 3 “Speak to Rehoboam the son of Solomon, king of Judah, and to all Israel in Judah and Benjamin, saying, +\v 4 ‘Yahweh says, “You shall not go up, nor fight against your brothers! Every man return to his house; for this thing is of me.”’” So they listened to Yahweh’s words, and returned from going against Jeroboam. +\p +\v 5 Rehoboam lived in Jerusalem, and built cities for defense in Judah. +\v 6 He built Bethlehem, Etam, Tekoa, +\v 7 Beth Zur, Soco, Adullam, +\v 8 Gath, Mareshah, Ziph, +\v 9 Adoraim, Lachish, Azekah, +\v 10 Zorah, Aijalon, and Hebron, which are fortified cities in Judah and in Benjamin. +\v 11 He fortified the strongholds and put captains in them with stores of food, oil and wine. +\v 12 He put shields and spears in every city, and made them exceedingly strong. Judah and Benjamin belonged to him. +\p +\v 13 The priests and the Levites who were in all Israel stood with him out of all their territory. +\v 14 For the Levites left their pasture lands and their possessions, and came to Judah and Jerusalem; for Jeroboam and his sons cast them off, that they should not execute the priest’s office to Yahweh. +\v 15 He himself appointed priests for the high places, for the male goat and calf idols which he had made. +\v 16 After them, out of all the tribes of Israel, those who set their hearts to seek Yahweh, the God of Israel, came to Jerusalem to sacrifice to Yahweh, the God of their fathers. +\v 17 So they strengthened the kingdom of Judah and made Rehoboam the son of Solomon strong for three years, for they walked three years in the way of David and Solomon. +\p +\v 18 Rehoboam took a wife for himself, Mahalath the daughter of Jerimoth the son of David and of Abihail the daughter of Eliab the son of Jesse. +\v 19 She bore him sons: Jeush, Shemariah, and Zaham. +\v 20 After her, he took Maacah the granddaughter of Absalom; and she bore him Abijah, Attai, Ziza, and Shelomith. +\v 21 Rehoboam loved Maacah the granddaughter of Absalom above all his wives and his concubines; for he took eighteen wives and sixty concubines, and became the father of twenty-eight sons and sixty daughters. +\v 22 Rehoboam appointed Abijah the son of Maacah to be chief, the prince among his brothers, for he intended to make him king. +\v 23 He dealt wisely, and dispersed some of his sons throughout all the lands of Judah and Benjamin, to every fortified city. He gave them food in abundance; and he sought many wives for them. +\c 12 +\p +\v 1 When the kingdom of Rehoboam was established and he was strong, he abandoned Yahweh’s law, and all Israel with him. +\v 2 In the fifth year of King Rehoboam, Shishak king of Egypt came up against Jerusalem, because they had trespassed against Yahweh, +\v 3 with twelve hundred chariots and sixty thousand horsemen. The people were without number who came with him out of Egypt: the Lubim, the Sukkiim, and the Ethiopians. +\v 4 He took the fortified cities which belonged to Judah, and came to Jerusalem. +\v 5 Now Shemaiah the prophet came to Rehoboam and to the princes of Judah, who were gathered together to Jerusalem because of Shishak, and said to them, “Yahweh says, ‘You have forsaken me, therefore I have also left you in the hand of Shishak.’” +\p +\v 6 Then the princes of Israel and the king humbled themselves; and they said, “Yahweh is righteous.” +\p +\v 7 When Yahweh saw that they humbled themselves, Yahweh’s word came to Shemaiah, saying, “They have humbled themselves. I will not destroy them, but I will grant them some deliverance, and my wrath won’t be poured out on Jerusalem by the hand of Shishak. +\v 8 Nevertheless they will be his servants, that they may know my service, and the service of the kingdoms of the countries.” +\p +\v 9 So Shishak king of Egypt came up against Jerusalem and took away the treasures of Yahweh’s house and the treasures of the king’s house. He took it all away. He also took away the shields of gold which Solomon had made. +\v 10 King Rehoboam made shields of bronze in their place, and committed them to the hands of the captains of the guard, who kept the door of the king’s house. +\v 11 As often as the king entered into Yahweh’s house, the guard came and bore them, then brought them back into the guard room. +\v 12 When he humbled himself, Yahweh’s wrath turned from him, so as not to destroy him altogether. Moreover, there were good things found in Judah. +\p +\v 13 So King Rehoboam strengthened himself in Jerusalem and reigned; for Rehoboam was forty-one years old when he began to reign, and he reigned seventeen years in Jerusalem, the city which Yahweh had chosen out of all the tribes of Israel to put his name there. His mother’s name was Naamah the Ammonitess. +\v 14 He did that which was evil, because he didn’t set his heart to seek Yahweh. +\p +\v 15 Now the acts of Rehoboam, first and last, aren’t they written in the histories of Shemaiah the prophet and of Iddo the seer, in the genealogies? There were wars between Rehoboam and Jeroboam continually. +\v 16 Rehoboam slept with his fathers, and was buried in David’s city; and Abijah his son reigned in his place. +\c 13 +\p +\v 1 In the eighteenth year of King Jeroboam, Abijah began to reign over Judah. +\v 2 He reigned three years in Jerusalem. His mother’s name was Micaiah the daughter of Uriel of Gibeah. There was war between Abijah and Jeroboam. +\v 3 Abijah joined battle with an army of valiant men of war, even four hundred thousand chosen men; and Jeroboam set the battle in array against him with eight hundred thousand chosen men, who were mighty men of valor. +\v 4 Abijah stood up on Mount Zemaraim, which is in the hill country of Ephraim, and said, “Hear me, Jeroboam and all Israel: +\v 5 Ought you not to know that Yahweh, the God of Israel, gave the kingdom over Israel to David forever, even to him and to his sons by a covenant of salt? +\v 6 Yet Jeroboam the son of Nebat, the servant of Solomon the son of David, rose up, and rebelled against his lord. +\v 7 Worthless men were gathered to him, wicked fellows who strengthened themselves against Rehoboam the son of Solomon, when Rehoboam was young and tender hearted, and could not withstand them. +\p +\v 8 “Now you intend to withstand the kingdom of Yahweh in the hand of the sons of David. You are a great multitude, and the golden calves which Jeroboam made you for gods are with you. +\v 9 Haven’t you driven out the priests of Yahweh, the sons of Aaron, and the Levites, and made priests for yourselves according to the ways of the peoples of other lands? Whoever comes to consecrate himself with a young bull and seven rams may be a priest of those who are no gods. +\p +\v 10 “But as for us, Yahweh is our God, and we have not forsaken him. We have priests serving Yahweh, the sons of Aaron, and the Levites in their work. +\v 11 They burn to Yahweh every morning and every evening burnt offerings and sweet incense. They also set the show bread in order on the pure table, and care for the gold lamp stand with its lamps, to burn every evening; for we keep the instruction of Yahweh our God, but you have forsaken him. +\v 12 Behold, God is with us at our head, and his priests with the trumpets of alarm to sound an alarm against you. Children of Israel, don’t fight against Yahweh, the God of your fathers; for you will not prosper.” +\p +\v 13 But Jeroboam caused an ambush to come about behind them; so they were before Judah, and the ambush was behind them. +\v 14 When Judah looked back, behold, the battle was before and behind them; and they cried to Yahweh, and the priests sounded with the trumpets. +\v 15 Then the men of Judah gave a shout. As the men of Judah shouted, God struck Jeroboam and all Israel before Abijah and Judah. +\v 16 The children of Israel fled before Judah, and God delivered them into their hand. +\v 17 Abijah and his people killed them with a great slaughter, so five hundred thousand chosen men of Israel fell down slain. +\v 18 Thus the children of Israel were brought under at that time, and the children of Judah prevailed, because they relied on Yahweh, the God of their fathers. +\v 19 Abijah pursued Jeroboam, and took cities from him: Bethel with its villages, Jeshanah with its villages, and Ephron with its villages. +\p +\v 20 Jeroboam didn’t recover strength again in the days of Abijah. Yahweh struck him, and he died. +\v 21 But Abijah grew mighty and took for himself fourteen wives, and became the father of twenty-two sons and sixteen daughters. +\v 22 The rest of the acts of Abijah, his ways, and his sayings are written in the commentary of the prophet Iddo. +\c 14 +\p +\v 1 So Abijah slept with his fathers, and they buried him in David’s city; and Asa his son reigned in his place. In his days, the land was quiet ten years. +\v 2 Asa did that which was good and right in Yahweh his God’s eyes, +\v 3 for he took away the foreign altars and the high places, broke down the pillars, cut down the Asherah poles, +\v 4 and commanded Judah to seek Yahweh, the God of their fathers, and to obey his law and command. +\v 5 Also he took away out of all the cities of Judah the high places and the sun images; and the kingdom was quiet before him. +\v 6 He built fortified cities in Judah; for the land was quiet, and he had no war in those years, because Yahweh had given him rest. +\v 7 For he said to Judah, “Let’s build these cities and make walls around them, with towers, gates, and bars. The land is yet before us, because we have sought Yahweh our God. We have sought him, and he has given us rest on every side.” So they built and prospered. +\p +\v 8 Asa had an army of three hundred thousand out of Judah who bore bucklers and spears, and two hundred eighty thousand out of Benjamin who bore shields and drew bows. All these were mighty men of valor. +\p +\v 9 Zerah the Ethiopian came out against them with an army of a million troops and three hundred chariots, and he came to Mareshah. +\v 10 Then Asa went out to meet him, and they set the battle in array in the valley of Zephathah at Mareshah. +\v 11 Asa cried to Yahweh his God, and said, “Yahweh, there is no one besides you to help, between the mighty and him who has no strength. Help us, Yahweh our God; for we rely on you, and in your name are we come against this multitude. Yahweh, you are our God. Don’t let man prevail against you.” +\p +\v 12 So Yahweh struck the Ethiopians before Asa and before Judah; and the Ethiopians fled. +\v 13 Asa and the people who were with him pursued them to Gerar. So many of the Ethiopians fell that they could not recover themselves, for they were destroyed before Yahweh and before his army. Judah’s army carried away very much booty. +\v 14 They struck all the cities around Gerar, for the fear of Yahweh came on them. They plundered all the cities, for there was much plunder in them. +\v 15 They also struck the tents of those who had livestock, and carried away sheep and camels in abundance, then returned to Jerusalem. +\c 15 +\p +\v 1 The Spirit of God came on Azariah the son of Oded. +\v 2 He went out to meet Asa, and said to him, “Hear me, Asa, and all Judah and Benjamin! Yahweh is with you while you are with him; and if you seek him, he will be found by you; but if you forsake him, he will forsake you. +\v 3 Now for a long time Israel was without the true God, without a teaching priest, and without law. +\v 4 But when in their distress they turned to Yahweh, the God of Israel, and sought him, he was found by them. +\v 5 In those times there was no peace to him who went out, nor to him who came in; but great troubles were on all the inhabitants of the lands. +\v 6 They were broken in pieces, nation against nation, and city against city; for God troubled them with all adversity. +\v 7 But you be strong! Don’t let your hands be slack, for your work will be rewarded.” +\p +\v 8 When Asa heard these words and the prophecy of Oded the prophet, he took courage, and put away the abominations out of all the land of Judah and Benjamin, and out of the cities which he had taken from the hill country of Ephraim; and he renewed Yahweh’s altar that was before Yahweh’s porch. +\v 9 He gathered all Judah and Benjamin, and those who lived with them out of Ephraim, Manasseh, and Simeon; for they came to him out of Israel in abundance when they saw that Yahweh his God was with him. +\v 10 So they gathered themselves together at Jerusalem in the third month, in the fifteenth year of Asa’s reign. +\v 11 They sacrificed to Yahweh in that day, of the plunder which they had brought, seven hundred head of cattle and seven thousand sheep. +\v 12 They entered into the covenant to seek Yahweh, the God of their fathers, with all their heart and with all their soul; +\v 13 and that whoever would not seek Yahweh, the God of Israel, should be put to death, whether small or great, whether man or woman. +\v 14 They swore to Yahweh with a loud voice, with shouting, with trumpets, and with cornets. +\v 15 All Judah rejoiced at the oath, for they had sworn with all their heart and sought him with their whole desire; and he was found by them. Then Yahweh gave them rest all around. +\p +\v 16 Also Maacah, the mother of Asa the king, he removed from being queen mother, because she had made an abominable image for an Asherah; so Asa cut down her image, ground it into dust, and burned it at the brook Kidron. +\v 17 But the high places were not taken away out of Israel; nevertheless the heart of Asa was perfect all his days. +\v 18 He brought the things that his father had dedicated and that he himself had dedicated, silver, gold, and vessels into God’s house. +\v 19 There was no more war to the thirty-fifth year of Asa’s reign. +\c 16 +\p +\v 1 In the thirty-sixth year of Asa’s reign, Baasha king of Israel went up against Judah, and built Ramah, that he might not allow anyone to go out or come in to Asa king of Judah. +\v 2 Then Asa brought out silver and gold out of the treasures of Yahweh’s house and of the king’s house, and sent to Ben Hadad king of Syria, who lived at Damascus, saying, +\v 3 “Let there be a treaty between me and you, as there was between my father and your father. Behold, I have sent you silver and gold. Go, break your treaty with Baasha king of Israel, that he may depart from me.” +\p +\v 4 Ben Hadad listened to King Asa, and sent the captains of his armies against the cities of Israel; and they struck Ijon, Dan, Abel Maim, and all the storage cities of Naphtali. +\v 5 When Baasha heard of it, he stopped building Ramah, and let his work cease. +\v 6 Then Asa the king took all Judah, and they carried away the stones and timber of Ramah, with which Baasha had built; and he built Geba and Mizpah with them. +\p +\v 7 At that time Hanani the seer came to Asa king of Judah, and said to him, “Because you have relied on the king of Syria, and have not relied on Yahweh your God, therefore the army of the king of Syria has escaped out of your hand. +\v 8 Weren’t the Ethiopians and the Lubim a huge army, with chariots and exceedingly many horsemen? Yet, because you relied on Yahweh, he delivered them into your hand. +\v 9 For Yahweh’s eyes run back and forth throughout the whole earth, to show himself strong in the behalf of them whose heart is perfect toward him. You have done foolishly in this; for from now on you will have wars.” +\p +\v 10 Then Asa was angry with the seer, and put him in the prison; for he was in a rage with him because of this thing. Asa oppressed some of the people at the same time. +\p +\v 11 Behold, the acts of Asa, first and last, behold, they are written in the book of the kings of Judah and Israel. +\v 12 In the thirty-ninth year of his reign, Asa was diseased in his feet. His disease was exceedingly great; yet in his disease he didn’t seek Yahweh, but just the physicians. +\v 13 Asa slept with his fathers, and died in the forty-first year of his reign. +\v 14 They buried him in his own tomb, which he had dug out for himself in David’s city, and laid him in the bed which was filled with sweet odors and various kinds of spices prepared by the perfumers’ art; and they made a very great fire for him. +\c 17 +\p +\v 1 Jehoshaphat his son reigned in his place, and strengthened himself against Israel. +\v 2 He placed forces in all the fortified cities of Judah, and set garrisons in the land of Judah and in the cities of Ephraim, which Asa his father had taken. +\v 3 Yahweh was with Jehoshaphat, because he walked in the first ways of his father David, and didn’t seek the Baals, +\v 4 but sought the God of his father, and walked in his commandments, and not in the ways of Israel. +\v 5 Therefore Yahweh established the kingdom in his hand. All Judah brought tribute to Jehoshaphat, and he had riches and honor in abundance. +\v 6 His heart was lifted up in the ways of Yahweh. Furthermore, he took away the high places and the Asherah poles out of Judah. +\p +\v 7 Also in the third year of his reign he sent his princes, even Ben Hail, Obadiah, Zechariah, Nethanel, and Micaiah, to teach in the cities of Judah; +\v 8 and with them Levites, even Shemaiah, Nethaniah, Zebadiah, Asahel, Shemiramoth, Jehonathan, Adonijah, Tobijah, and Tobadonijah, the Levites; and with them Elishama and Jehoram, the priests. +\v 9 They taught in Judah, having the book of Yahweh’s law with them. They went about throughout all the cities of Judah and taught among the people. +\p +\v 10 The fear of Yahweh fell on all the kingdoms of the lands that were around Judah, so that they made no war against Jehoshaphat. +\v 11 Some of the Philistines brought Jehoshaphat presents and silver for tribute. The Arabians also brought him flocks: seven thousand seven hundred rams and seven thousand seven hundred male goats. +\v 12 Jehoshaphat grew great exceedingly; and he built fortresses and store cities in Judah. +\v 13 He had many works in the cities of Judah; and men of war, mighty men of valor, in Jerusalem. +\v 14 This was the numbering of them according to their fathers’ houses: From Judah, the captains of thousands: Adnah the captain, and with him three hundred thousand mighty men of valor; +\v 15 and next to him Jehohanan the captain, and with him two hundred eighty thousand; +\v 16 and next to him Amasiah the son of Zichri, who willingly offered himself to Yahweh, and with him two hundred thousand mighty men of valor. +\v 17 From Benjamin: Eliada, a mighty man of valor, and with him two hundred thousand armed with bow and shield; +\v 18 and next to him Jehozabad, and with him one hundred eighty thousand ready and prepared for war. +\v 19 These were those who waited on the king, in addition to those whom the king put in the fortified cities throughout all Judah. +\c 18 +\p +\v 1 Now Jehoshaphat had riches and honor in abundance; and he allied himself with Ahab. +\v 2 After some years, he went down to Ahab to Samaria. Ahab killed sheep and cattle for him in abundance, and for the people who were with him, and moved him to go up with him to Ramoth Gilead. +\v 3 Ahab king of Israel said to Jehoshaphat king of Judah, “Will you go with me to Ramoth Gilead?” +\p He answered him, “I am as you are, and my people as your people. We will be with you in the war.” +\v 4 Jehoshaphat said to the king of Israel, “Please inquire first for Yahweh’s word.” +\p +\v 5 Then the king of Israel gathered the prophets together, four hundred men, and said to them, “Shall we go to Ramoth Gilead to battle, or shall I forbear?” +\p They said, “Go up, for God will deliver it into the hand of the king.” +\p +\v 6 But Jehoshaphat said, “Isn’t there here a prophet of Yahweh besides, that we may inquire of him?” +\p +\v 7 The king of Israel said to Jehoshaphat, “There is yet one man by whom we may inquire of Yahweh; but I hate him, for he never prophesies good concerning me, but always evil. He is Micaiah the son of Imla.” +\p Jehoshaphat said, “Don’t let the king say so.” +\p +\v 8 Then the king of Israel called an officer, and said, “Get Micaiah the son of Imla quickly.” +\p +\v 9 Now the king of Israel and Jehoshaphat the king of Judah each sat on his throne, arrayed in their robes, and they were sitting in an open place at the entrance of the gate of Samaria; and all the prophets were prophesying before them. +\v 10 Zedekiah the son of Chenaanah made himself horns of iron and said, “Yahweh says, ‘With these you shall push the Syrians, until they are consumed.’” +\p +\v 11 All the prophets prophesied so, saying, “Go up to Ramoth Gilead, and prosper; for Yahweh will deliver it into the hand of the king.” +\p +\v 12 The messenger who went to call Micaiah spoke to him, saying, “Behold, the words of the prophets declare good to the king with one mouth. Let your word therefore, please be like one of theirs, and speak good.” +\p +\v 13 Micaiah said, “As Yahweh lives, I will say what my God says.” +\p +\v 14 When he had come to the king, the king said to him, “Micaiah, shall we go to Ramoth Gilead to battle, or shall I forbear?” +\p He said, “Go up, and prosper. They shall be delivered into your hand.” +\p +\v 15 The king said to him, “How many times shall I adjure you that you speak to me nothing but the truth in Yahweh’s name?” +\p +\v 16 He said, “I saw all Israel scattered on the mountains, as sheep that have no shepherd. Yahweh said, ‘These have no master. Let them each return to his house in peace.’” +\p +\v 17 The king of Israel said to Jehoshaphat, “Didn’t I tell you that he would not prophesy good concerning me, but evil?” +\p +\v 18 Micaiah said, “Therefore hear Yahweh’s word: I saw Yahweh sitting on his throne, and all the army of heaven standing on his right hand and on his left. +\v 19 Yahweh said, ‘Who will entice Ahab king of Israel, that he may go up and fall at Ramoth Gilead?’ One spoke saying in this way, and another saying in that way. +\v 20 A spirit came out, stood before Yahweh, and said, ‘I will entice him.’ +\p “Yahweh said to him, ‘How?’ +\p +\v 21 “He said, ‘I will go, and will be a lying spirit in the mouth of all his prophets.’ +\p “He said, ‘You will entice him, and will prevail also. Go and do so.’ +\p +\v 22 “Now therefore, behold, Yahweh has put a lying spirit in the mouth of these your prophets; and Yahweh has spoken evil concerning you.” +\p +\v 23 Then Zedekiah the son of Chenaanah came near, and struck Micaiah on the cheek, and said, “Which way did Yahweh’s Spirit go from me to speak to you?” +\p +\v 24 Micaiah said, “Behold, you shall see on that day, when you go into an inner room to hide yourself.” +\p +\v 25 The king of Israel said, “Take Micaiah, and carry him back to Amon the governor of the city, and to Joash the king’s son; +\v 26 and say, ‘The king says, “Put this fellow in the prison, and feed him with bread of affliction and with water of affliction, until I return in peace.”’” +\p +\v 27 Micaiah said, “If you return at all in peace, Yahweh has not spoken by me.” He said, “Listen, you people, all of you!” +\p +\v 28 So the king of Israel and Jehoshaphat the king of Judah went up to Ramoth Gilead. +\v 29 The king of Israel said to Jehoshaphat, “I will disguise myself, and go into the battle; but you put on your robes.” So the king of Israel disguised himself; and they went into the battle. +\v 30 Now the king of Syria had commanded the captains of his chariots, saying, “Don’t fight with small nor great, except only with the king of Israel.” +\p +\v 31 When the captains of the chariots saw Jehoshaphat, they said, “It is the king of Israel!” Therefore they turned around to fight against him. But Jehoshaphat cried out, and Yahweh helped him; and God moved them to depart from him. +\v 32 When the captains of the chariots saw that it was not the king of Israel, they turned back from pursuing him. +\v 33 A certain man drew his bow at random, and struck the king of Israel between the joints of the armor. Therefore he said to the driver of the chariot, “Turn around and carry me out of the battle, for I am severely wounded.” +\v 34 The battle increased that day. However, the king of Israel propped himself up in his chariot against the Syrians until the evening; and at about sunset, he died. +\c 19 +\p +\v 1 Jehoshaphat the king of Judah returned to his house in peace to Jerusalem. +\v 2 Jehu the son of Hanani the seer went out to meet him, and said to King Jehoshaphat, “Should you help the wicked, and love those who hate Yahweh? Because of this, wrath is on you from before Yahweh. +\v 3 Nevertheless there are good things found in you, in that you have put away the Asheroth out of the land, and have set your heart to seek God.” +\p +\v 4 Jehoshaphat lived at Jerusalem; and he went out again among the people from Beersheba to the hill country of Ephraim, and brought them back to Yahweh, the God of their fathers. +\v 5 He set judges in the land throughout all the fortified cities of Judah, city by city, +\v 6 and said to the judges, “Consider what you do, for you don’t judge for man, but for Yahweh; and he is with you in the judgment. +\v 7 Now therefore let the fear of Yahweh be on you. Take heed and do it; for there is no iniquity with Yahweh our God, nor respect of persons, nor taking of bribes.” +\p +\v 8 Moreover in Jerusalem Jehoshaphat appointed certain Levites, priests, and heads of the fathers’ households of Israel to give judgment for Yahweh and for controversies. They returned to Jerusalem. +\v 9 He commanded them, saying, “You shall do this in the fear of Yahweh, faithfully, and with a perfect heart. +\v 10 Whenever any controversy comes to you from your brothers who dwell in their cities, between blood and blood, between law and commandment, statutes and ordinances, you must warn them, that they not be guilty toward Yahweh, and so wrath come on you and on your brothers. Do this, and you will not be guilty. +\v 11 Behold, Amariah the chief priest is over you in all matters of Yahweh; and Zebadiah the son of Ishmael, the ruler of the house of Judah, in all the king’s matters. Also the Levites shall be officers before you. Deal courageously, and may Yahweh be with the good.” +\c 20 +\p +\v 1 After this, the children of Moab, the children of Ammon, and with them some of the Ammonites, came against Jehoshaphat to battle. +\v 2 Then some came who told Jehoshaphat, saying, “A great multitude is coming against you from beyond the sea from Syria. Behold, they are in Hazazon Tamar” (that is, En Gedi). +\v 3 Jehoshaphat was alarmed, and set himself to seek to Yahweh. He proclaimed a fast throughout all Judah. +\v 4 Judah gathered themselves together to seek help from Yahweh. They came out of all the cities of Judah to seek Yahweh. +\p +\v 5 Jehoshaphat stood in the assembly of Judah and Jerusalem, in Yahweh’s house, before the new court; +\v 6 and he said, “Yahweh, the God of our fathers, aren’t you God in heaven? Aren’t you ruler over all the kingdoms of the nations? Power and might are in your hand, so that no one is able to withstand you. +\v 7 Didn’t you, our God, drive out the inhabitants of this land before your people Israel, and give it to the offspring\f + \fr 20:7 \ft or, seed\f* of Abraham your friend forever? +\v 8 They lived in it, and have built you a sanctuary in it for your name, saying, +\v 9 ‘If evil comes on us—the sword, judgment, pestilence, or famine—we will stand before this house, and before you (for your name is in this house), and cry to you in our affliction, and you will hear and save.’ +\v 10 Now, behold, the children of Ammon and Moab and Mount Seir, whom you would not let Israel invade when they came out of the land of Egypt, but they turned away from them, and didn’t destroy them; +\v 11 behold, how they reward us, to come to cast us out of your possession, which you have given us to inherit. +\v 12 Our God, will you not judge them? For we have no might against this great company that comes against us. We don’t know what to do, but our eyes are on you.” +\p +\v 13 All Judah stood before Yahweh, with their little ones, their wives, and their children. +\p +\v 14 Then Yahweh’s Spirit came on Jahaziel the son of Zechariah, the son of Benaiah, the son of Jeiel, the son of Mattaniah, the Levite, of the sons of Asaph, in the middle of the assembly; +\v 15 and he said, “Listen, all Judah, and you inhabitants of Jerusalem, and you, King Jehoshaphat. Yahweh says to you, ‘Don’t be afraid, and don’t be dismayed because of this great multitude; for the battle is not yours, but God’s. +\v 16 Tomorrow, go down against them. Behold, they are coming up by the ascent of Ziz. You will find them at the end of the valley, before the wilderness of Jeruel. +\v 17 You will not need to fight this battle. Set yourselves, stand still, and see the salvation of Yahweh with you, O Judah and Jerusalem. Don’t be afraid, nor be dismayed. Go out against them tomorrow, for Yahweh is with you.’” +\p +\v 18 Jehoshaphat bowed his head with his face to the ground; and all Judah and the inhabitants of Jerusalem fell down before Yahweh, worshiping Yahweh. +\v 19 The Levites, of the children of the Kohathites and of the children of the Korahites, stood up to praise Yahweh, the God of Israel, with an exceedingly loud voice. +\p +\v 20 They rose early in the morning and went out into the wilderness of Tekoa. As they went out, Jehoshaphat stood and said, “Listen to me, Judah and you inhabitants of Jerusalem! Believe in Yahweh your God, so you will be established! Believe his prophets, so you will prosper.” +\p +\v 21 When he had taken counsel with the people, he appointed those who were to sing to Yahweh and give praise in holy array as they go out before the army, and say, “Give thanks to Yahweh, for his loving kindness endures forever.” +\v 22 When they began to sing and to praise, Yahweh set ambushers against the children of Ammon, Moab, and Mount Seir, who had come against Judah; and they were struck. +\v 23 For the children of Ammon and Moab stood up against the inhabitants of Mount Seir to utterly kill and destroy them. When they had finished the inhabitants of Seir, everyone helped to destroy each other. +\p +\v 24 When Judah came to the place overlooking the wilderness, they looked at the multitude; and behold, they were dead bodies fallen to the earth, and there were none who escaped. +\v 25 When Jehoshaphat and his people came to take their plunder, they found among them in abundance both riches and dead bodies with precious jewels, which they stripped off for themselves, more than they could carry away. They took plunder for three days, it was so much. +\v 26 On the fourth day, they assembled themselves in Beracah\f + \fr 20:26 \ft “Beracah” means “blessing”.\f* Valley, for there they blessed Yahweh. Therefore the name of that place was called “Beracah Valley” to this day. +\v 27 Then they returned, every man of Judah and Jerusalem, with Jehoshaphat in front of them, to go again to Jerusalem with joy; for Yahweh had made them to rejoice over their enemies. +\v 28 They came to Jerusalem with stringed instruments, harps, and trumpets to Yahweh’s house. +\v 29 The fear of God was on all the kingdoms of the countries when they heard that Yahweh fought against the enemies of Israel. +\v 30 So the realm of Jehoshaphat was quiet, for his God gave him rest all around. +\p +\v 31 So Jehoshaphat reigned over Judah. He was thirty-five years old when he began to reign. He reigned twenty-five years in Jerusalem. His mother’s name was Azubah the daughter of Shilhi. +\v 32 He walked in the way of Asa his father, and didn’t turn away from it, doing that which was right in Yahweh’s eyes. +\v 33 However the high places were not taken away, and the people had still not set their hearts on the God of their fathers. +\p +\v 34 Now the rest of the acts of Jehoshaphat, first and last, behold, they are written in the history of Jehu the son of Hanani, which is included in the book of the kings of Israel. +\p +\v 35 After this, Jehoshaphat king of Judah joined himself with Ahaziah king of Israel. The same did very wickedly. +\v 36 He joined himself with him to make ships to go to Tarshish. They made the ships in Ezion Geber. +\v 37 Then Eliezer the son of Dodavahu of Mareshah prophesied against Jehoshaphat, saying, “Because you have joined yourself with Ahaziah, Yahweh has destroyed your works.” The ships were wrecked, so that they were not able to go to Tarshish. +\c 21 +\p +\v 1 Jehoshaphat slept with his fathers, and was buried with his fathers in David’s city; and Jehoram his son reigned in his place. +\v 2 He had brothers, the sons of Jehoshaphat: Azariah, Jehiel, Zechariah, Azariah, Michael, and Shephatiah. All these were the sons of Jehoshaphat king of Israel. +\v 3 Their father gave them great gifts of silver, of gold, and of precious things, with fortified cities in Judah; but he gave the kingdom to Jehoram, because he was the firstborn. +\v 4 Now when Jehoram had risen up over the kingdom of his father, and had strengthened himself, he killed all his brothers with the sword, and also some of the princes of Israel. +\v 5 Jehoram was thirty-two years old when he began to reign, and he reigned eight years in Jerusalem. +\v 6 He walked in the way of the kings of Israel, as did Ahab’s house, for he had Ahab’s daughter as his wife. He did that which was evil in Yahweh’s sight. +\v 7 However Yahweh would not destroy David’s house, because of the covenant that he had made with David, and as he promised to give a lamp to him and to his children always. +\p +\v 8 In his days Edom revolted from under the hand of Judah, and made a king over themselves. +\v 9 Then Jehoram went there with his captains and all his chariots with him. He rose up by night and struck the Edomites who surrounded him, along with the captains of the chariots. +\v 10 So Edom has been in revolt from under the hand of Judah to this day. Then Libnah revolted at the same time from under his hand, because he had forsaken Yahweh, the God of his fathers. +\p +\v 11 Moreover he made high places in the mountains of Judah, and made the inhabitants of Jerusalem play the prostitute, and led Judah astray. +\v 12 A letter came to him from Elijah the prophet, saying, “Yahweh, the God of David your father, says, ‘Because you have not walked in the ways of Jehoshaphat your father, nor in the ways of Asa king of Judah, +\v 13 but have walked in the way of the kings of Israel, and have made Judah and the inhabitants of Jerusalem to play the prostitute like Ahab’s house did, and also have slain your brothers of your father’s house, who were better than yourself, +\v 14 behold, Yahweh will strike your people with a great plague, including your children, your wives, and all your possessions; +\v 15 and you will have great sickness with a disease of your bowels, until your bowels fall out by reason of the sickness, day by day.’” +\p +\v 16 Yahweh stirred up against Jehoram the spirit of the Philistines and of the Arabians who are beside the Ethiopians; +\v 17 and they came up against Judah, broke into it, and carried away all the possessions that were found in the king’s house, including his sons and his wives, so that there was no son left to him except Jehoahaz, the youngest of his sons. +\p +\v 18 After all this Yahweh struck him in his bowels with an incurable disease. +\v 19 In process of time, at the end of two years, his bowels fell out by reason of his sickness, and he died of severe diseases. His people made no burning for him, like the burning of his fathers. +\v 20 He was thirty-two years old when he began to reign, and he reigned in Jerusalem eight years. He departed with no one’s regret. They buried him in David’s city, but not in the tombs of the kings. +\c 22 +\p +\v 1 The inhabitants of Jerusalem made Ahaziah his youngest son king in his place, because the band of men who came with the Arabians to the camp had slain all the oldest. So Ahaziah the son of Jehoram king of Judah reigned. +\v 2 Ahaziah was forty-two years old when he began to reign, and he reigned one year in Jerusalem. His mother’s name was Athaliah the daughter of Omri. +\v 3 He also walked in the ways of Ahab’s house, because his mother was his counselor in acting wickedly. +\v 4 He did that which was evil in Yahweh’s sight, as did Ahab’s house, for they were his counselors after the death of his father, to his destruction. +\v 5 He also followed their counsel, and went with Jehoram the son of Ahab king of Israel to war against Hazael king of Syria at Ramoth Gilead; and the Syrians wounded Joram. +\v 6 He returned to be healed in Jezreel of the wounds which they had given him at Ramah, when he fought against Hazael king of Syria. Azariah the son of Jehoram, king of Judah, went down to see Jehoram the son of Ahab in Jezreel, because he was sick. +\p +\v 7 Now the destruction of Ahaziah was of God, in that he went to Joram; for when he had come, he went out with Jehoram against Jehu the son of Nimshi, whom Yahweh had anointed to cut off Ahab’s house. +\v 8 When Jehu was executing judgment on Ahab’s house, he found the princes of Judah and the sons of the brothers of Ahaziah serving Ahaziah, and killed them. +\v 9 He sought Ahaziah, and they caught him (now he was hiding in Samaria), and they brought him to Jehu and killed him; and they buried him, for they said, “He is the son of Jehoshaphat, who sought Yahweh with all his heart.” The house of Ahaziah had no power to hold the kingdom. +\p +\v 10 Now when Athaliah the mother of Ahaziah saw that her son was dead, she arose and destroyed all the royal offspring of the house of Judah. +\v 11 But Jehoshabeath, the king’s daughter, took Joash the son of Ahaziah, and stealthily rescued him from among the king’s sons who were slain, and put him and his nurse in the bedroom. So Jehoshabeath, the daughter of King Jehoram, the wife of Jehoiada the priest (for she was the sister of Ahaziah), hid him from Athaliah, so that she didn’t kill him. +\v 12 He was with them hidden in God’s house six years while Athaliah reigned over the land. +\c 23 +\p +\v 1 In the seventh year, Jehoiada strengthened himself, and took the captains of hundreds—Azariah the son of Jeroham, Ishmael the son of Jehohanan, Azariah the son of Obed, Maaseiah the son of Adaiah, and Elishaphat the son of Zichri—into a covenant with him. +\v 2 They went around in Judah and gathered the Levites out of all the cities of Judah, and the heads of fathers’ households of Israel, and they came to Jerusalem. +\v 3 All the assembly made a covenant with the king in God’s house. Jehoiada\f + \fr 23:3 \ft Hebrew \fq He\f* said to them, “Behold, the king’s son must reign, as Yahweh has spoken concerning the sons of David. +\v 4 This is the thing that you must do: a third part of you, who come in on the Sabbath, of the priests and of the Levites, shall be gatekeepers of the thresholds. +\v 5 A third part shall be at the king’s house; and a third part at the gate of the foundation. All the people will be in the courts of Yahweh’s house. +\v 6 But let no one come into Yahweh’s house except the priests and those who minister of the Levites. They shall come in, for they are holy, but all the people shall follow Yahweh’s instructions. +\v 7 The Levites shall surround the king, every man with his weapons in his hand. Whoever comes into the house, let him be slain. Be with the king when he comes in and when he goes out.” +\p +\v 8 So the Levites and all Judah did according to all that Jehoiada the priest commanded. They each took his men, those who were to come in on the Sabbath, with those who were to go out on the Sabbath, for Jehoiada the priest didn’t dismiss the shift. +\v 9 Jehoiada the priest delivered to the captains of hundreds the spears, bucklers, and shields that had been king David’s, which were in God’s house. +\v 10 He set all the people, every man with his weapon in his hand, from the right side of the house to the left side of the house, near the altar and the house, around the king. +\v 11 Then they brought out the king’s son, put the crown on him, gave him the covenant, and made him king. Jehoiada and his sons anointed him, and they said, “Long live the king!” +\p +\v 12 When Athaliah heard the noise of the people running and praising the king, she came to the people into Yahweh’s house. +\v 13 Then she looked, and behold, the king stood by his pillar at the entrance, with the captains and the trumpeters by the king. All the people of the land rejoiced and blew trumpets. The singers also played musical instruments, and led the singing of praise. Then Athaliah tore her clothes, and said, “Treason! treason!” +\p +\v 14 Jehoiada the priest brought out the captains of hundreds who were set over the army, and said to them, “Bring her out between the ranks; and whoever follows her, let him be slain with the sword.” For the priest said, “Don’t kill her in Yahweh’s house.” +\v 15 So they made way for her. She went to the entrance of the horse gate to the king’s house; and they killed her there. +\p +\v 16 Jehoiada made a covenant between himself, all the people, and the king, that they should be Yahweh’s people. +\v 17 All the people went to the house of Baal, broke it down, broke his altars and his images in pieces, and killed Mattan the priest of Baal before the altars. +\v 18 Jehoiada appointed the officers of Yahweh’s house under the hand of the Levitical priests, whom David had distributed in Yahweh’s house, to offer the burnt offerings of Yahweh, as it is written in the law of Moses, with rejoicing and with singing, as David had ordered. +\v 19 He set the gatekeepers at the gates of Yahweh’s house, that no one who was unclean in anything should enter in. +\v 20 He took the captains of hundreds, the nobles, the governors of the people, and all the people of the land, and brought the king down from Yahweh’s house. They came through the upper gate to the king’s house, and set the king on the throne of the kingdom. +\v 21 So all the people of the land rejoiced, and the city was quiet. They had slain Athaliah with the sword. +\c 24 +\p +\v 1 Joash was seven years old when he began to reign, and he reigned forty years in Jerusalem. His mother’s name was Zibiah, of Beersheba. +\v 2 Joash did that which was right in Yahweh’s eyes all the days of Jehoiada the priest. +\v 3 Jehoiada took for him two wives, and he became the father of sons and daughters. +\p +\v 4 After this, Joash intended to restore Yahweh’s house. +\v 5 He gathered together the priests and the Levites, and said to them, “Go out to the cities of Judah, and gather money to repair the house of your God from all Israel from year to year. See that you expedite this matter.” However the Levites didn’t do it right away. +\v 6 The king called for Jehoiada the chief, and said to him, “Why haven’t you required of the Levites to bring in the tax of Moses the servant of Yahweh, and of the assembly of Israel, out of Judah and out of Jerusalem, for the Tent of the Testimony?” +\v 7 For the sons of Athaliah, that wicked woman, had broken up God’s house; and they also gave all the dedicated things of Yahweh’s house to the Baals. +\p +\v 8 So the king commanded, and they made a chest, and set it outside at the gate of Yahweh’s house. +\v 9 They made a proclamation through Judah and Jerusalem, to bring in for Yahweh the tax that Moses the servant of God laid on Israel in the wilderness. +\v 10 All the princes and all the people rejoiced, and brought in, and cast into the chest, until they had filled it. +\v 11 Whenever the chest was brought to the king’s officers by the hand of the Levites, and when they saw that there was much money, the king’s scribe and the chief priest’s officer came and emptied the chest, and took it, and carried it to its place again. Thus they did day by day, and gathered money in abundance. +\v 12 The king and Jehoiada gave it to those who did the work of the service of Yahweh’s house. They hired masons and carpenters to restore Yahweh’s house, and also those who worked iron and bronze to repair Yahweh’s house. +\v 13 So the workmen worked, and the work of repairing went forward in their hands. They set up God’s house as it was designed, and strengthened it. +\v 14 When they had finished, they brought the rest of the money before the king and Jehoiada, from which were made vessels for Yahweh’s house, even vessels with which to minister and to offer, including spoons and vessels of gold and silver. They offered burnt offerings in Yahweh’s house continually all the days of Jehoiada. +\p +\v 15 But Jehoiada grew old and was full of days, and he died. He was one hundred thirty years old when he died. +\v 16 They buried him in David’s city among the kings, because he had done good in Israel, and toward God and his house. +\p +\v 17 Now after the death of Jehoiada, the princes of Judah came and bowed down to the king. Then the king listened to them. +\v 18 They abandoned the house of Yahweh, the God of their fathers, and served the Asherah poles and the idols, so wrath came on Judah and Jerusalem for this their guiltiness. +\v 19 Yet he sent prophets to them to bring them again to Yahweh, and they testified against them; but they would not listen. +\p +\v 20 The Spirit of God came on Zechariah the son of Jehoiada the priest; and he stood above the people, and said to them, “God says, ‘Why do you disobey Yahweh’s commandments, so that you can’t prosper? Because you have forsaken Yahweh, he has also forsaken you.’” +\p +\v 21 They conspired against him, and stoned him with stones at the commandment of the king in the court of Yahweh’s house. +\v 22 Thus Joash the king didn’t remember the kindness which Jehoiada his father had done to him, but killed his son. When he died, he said, “May Yahweh look at it, and repay it.” +\p +\v 23 At the end of the year, the army of the Syrians came up against him. They came to Judah and Jerusalem, and destroyed all the princes of the people from among the people, and sent all their plunder to the king of Damascus. +\v 24 For the army of the Syrians came with a small company of men; and Yahweh delivered a very great army into their hand, because they had forsaken Yahweh, the God of their fathers. So they executed judgment on Joash. +\p +\v 25 When they had departed from him (for they left him seriously wounded), his own servants conspired against him for the blood of the sons of Jehoiada the priest, and killed him on his bed, and he died. They buried him in David’s city, but they didn’t bury him in the tombs of the kings. +\v 26 These are those who conspired against him: Zabad the son of Shimeath the Ammonitess and Jehozabad the son of Shimrith the Moabitess. +\v 27 Now concerning his sons, the greatness of the burdens laid on him, and the rebuilding of God’s house, behold, they are written in the commentary of the book of the kings. Amaziah his son reigned in his place. +\c 25 +\p +\v 1 Amaziah was twenty-five years old when he began to reign, and he reigned twenty-nine years in Jerusalem. His mother’s name was Jehoaddan, of Jerusalem. +\v 2 He did that which was right in Yahweh’s eyes, but not with a perfect heart. +\v 3 Now when the kingdom was established to him, he killed his servants who had killed his father the king. +\v 4 But he didn’t put their children to death, but did according to that which is written in the law in the book of Moses, as Yahweh commanded, saying, “The fathers shall not die for the children, neither shall the children die for the fathers; but every man shall die for his own sin.” +\p +\v 5 Moreover Amaziah gathered Judah together and ordered them according to their fathers’ houses, under captains of thousands and captains of hundreds, even all Judah and Benjamin. He counted them from twenty years old and upward, and found that there were three hundred thousand chosen men, able to go out to war, who could handle spear and shield. +\v 6 He also hired one hundred thousand mighty men of valor out of Israel for one hundred talents\f + \fr 25:6 \ft A talent is about 30 kilograms or 66 pounds\f* of silver. +\v 7 A man of God came to him, saying, “O king, don’t let the army of Israel go with you, for Yahweh is not with Israel, with all the children of Ephraim. +\v 8 But if you will go, take action, and be strong for the battle. God will overthrow you before the enemy; for God has power to help, and to overthrow.” +\p +\v 9 Amaziah said to the man of God, “But what shall we do for the hundred talents\f + \fr 25:9 \ft A talent is about 30 kilograms or 66 pounds\f* which I have given to the army of Israel?” +\p The man of God answered, “Yahweh is able to give you much more than this.” +\p +\v 10 Then Amaziah separated them, the army that had come to him out of Ephraim, to go home again. Therefore their anger was greatly kindled against Judah, and they returned home in fierce anger. +\p +\v 11 Amaziah took courage, and led his people out and went to the Valley of Salt, and struck ten thousand of the children of Seir. +\v 12 The children of Judah carried away ten thousand alive, and brought them to the top of the rock, and threw them down from the top of the rock, so that they all were broken in pieces. +\v 13 But the men of the army whom Amaziah sent back, that they should not go with him to battle, fell on the cities of Judah from Samaria even to Beth Horon, and struck of them three thousand, and took much plunder. +\p +\v 14 Now after Amaziah had come from the slaughter of the Edomites, he brought the gods of the children of Seir, and set them up to be his gods, and bowed down himself before them and burned incense to them. +\v 15 Therefore Yahweh’s anger burned against Amaziah, and he sent to him a prophet who said to him, “Why have you sought after the gods of the people, which have not delivered their own people out of your hand?” +\p +\v 16 As he talked with him, the king said to him, “Have we made you one of the king’s counselors? Stop! Why should you be struck down?” +\p Then the prophet stopped, and said, “I know that God has determined to destroy you, because you have done this and have not listened to my counsel.” +\p +\v 17 Then Amaziah king of Judah consulted his advisers, and sent to Joash, the son of Jehoahaz, the son of Jehu, king of Israel, saying, “Come! Let’s look one another in the face.” +\p +\v 18 Joash king of Israel sent to Amaziah king of Judah, saying, “The thistle that was in Lebanon sent to the cedar that was in Lebanon, saying, ‘Give your daughter to my son as his wife. Then a wild animal that was in Lebanon passed by and trampled down the thistle. +\v 19 You say to yourself that you have struck Edom; and your heart lifts you up to boast. Now stay at home. Why should you meddle with trouble, that you should fall, even you and Judah with you?’” +\p +\v 20 But Amaziah would not listen; for it was of God, that he might deliver them into the hand of their enemies, because they had sought after the gods of Edom. +\v 21 So Joash king of Israel went up, and he and Amaziah king of Judah looked one another in the face at Beth Shemesh, which belongs to Judah. +\v 22 Judah was defeated by Israel; so every man fled to his tent. +\p +\v 23 Joash king of Israel took Amaziah king of Judah, the son of Joash the son of Jehoahaz, at Beth Shemesh and brought him to Jerusalem, and broke down the wall of Jerusalem from the gate of Ephraim to the corner gate, four hundred cubits.\f + \fr 25:23 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters, so 400 cubits is about 200 yards or 184 meters.\f* +\v 24 He took all the gold and silver, and all the vessels that were found in God’s house with Obed-Edom, and the treasures of the king’s house, and the hostages, and returned to Samaria. +\p +\v 25 Amaziah the son of Joash, king of Judah, lived for fifteen years after the death of Joash, son of Jehoahaz, king of Israel. +\v 26 Now the rest of the acts of Amaziah, first and last, behold, aren’t they written in the book of the kings of Judah and Israel? +\v 27 Now from the time that Amaziah turned away from following Yahweh, they made a conspiracy against him in Jerusalem. He fled to Lachish, but they sent after him to Lachish and killed him there. +\v 28 They brought him on horses and buried him with his fathers in the City of Judah. +\c 26 +\p +\v 1 All the people of Judah took Uzziah, who was sixteen years old, and made him king in the place of his father Amaziah. +\v 2 He built Eloth and restored it to Judah. After that the king slept with his fathers. +\v 3 Uzziah was sixteen years old when he began to reign; and he reigned fifty-two years in Jerusalem. His mother’s name was Jechiliah, of Jerusalem. +\v 4 He did that which was right in Yahweh’s eyes, according to all that his father Amaziah had done. +\v 5 He set himself to seek God in the days of Zechariah, who had understanding in the vision of God; and as long as he sought Yahweh, God made him prosper. +\p +\v 6 He went out and fought against the Philistines, and broke down the wall of Gath, the wall of Jabneh, and the wall of Ashdod; and he built cities in the country of Ashdod, and among the Philistines. +\v 7 God helped him against the Philistines, and against the Arabians who lived in Gur Baal, and the Meunim. +\v 8 The Ammonites gave tribute to Uzziah. His name spread abroad even to the entrance of Egypt, for he grew exceedingly strong. +\v 9 Moreover Uzziah built towers in Jerusalem at the corner gate, at the valley gate, and at the turning of the wall, and fortified them. +\v 10 He built towers in the wilderness, and dug out many cisterns, for he had much livestock, both in the lowlands and in the plains. He had farmers and vineyard keepers in the mountains and in the fruitful fields, for he loved farming. +\v 11 Moreover Uzziah had an army of fighting men who went out to war by bands, according to the number of their reckoning made by Jeiel the scribe and Maaseiah the officer, under the hand of Hananiah, one of the king’s captains. +\v 12 The whole number of the heads of fathers’ households, even the mighty men of valor, was two thousand six hundred. +\v 13 Under their hand was an army, three hundred seven thousand five hundred, who made war with mighty power, to help the king against the enemy. +\v 14 Uzziah prepared for them, even for all the army, shields, spears, helmets, coats of mail, bows, and stones for slinging. +\v 15 In Jerusalem, he made devices, invented by skillful men, to be on the towers and on the battlements, with which to shoot arrows and great stones. His name spread far abroad, because he was marvelously helped until he was strong. +\p +\v 16 But when he was strong, his heart was lifted up, so that he did corruptly and he trespassed against Yahweh his God, for he went into Yahweh’s temple to burn incense on the altar of incense. +\v 17 Azariah the priest went in after him, and with him eighty priests of Yahweh, who were valiant men. +\v 18 They resisted Uzziah the king, and said to him, “It isn’t for you, Uzziah, to burn incense to Yahweh, but for the priests the sons of Aaron, who are consecrated to burn incense. Go out of the sanctuary, for you have trespassed. It will not be for your honor from Yahweh God.” +\p +\v 19 Then Uzziah was angry. He had a censer in his hand to burn incense, and while he was angry with the priests, the leprosy broke out on his forehead before the priests in Yahweh’s house, beside the altar of incense. +\v 20 Azariah the chief priest and all the priests looked at him, and behold, he was leprous in his forehead; and they thrust him out quickly from there. Indeed, he himself also hurried to go out, because Yahweh had struck him. +\v 21 Uzziah the king was a leper to the day of his death, and lived in a separate house, being a leper; for he was cut off from Yahweh’s house. Jotham his son was over the king’s house, judging the people of the land. +\p +\v 22 Now the rest of the acts of Uzziah, first and last, Isaiah the prophet, the son of Amoz, wrote. +\v 23 So Uzziah slept with his fathers; and they buried him with his fathers in the field of burial which belonged to the kings, for they said, “He is a leper.” Jotham his son reigned in his place. +\c 27 +\p +\v 1 Jotham was twenty-five years old when he began to reign, and he reigned sixteen years in Jerusalem. His mother’s name was Jerushah the daughter of Zadok. +\v 2 He did that which was right in Yahweh’s eyes, according to all that his father Uzziah had done. However he didn’t enter into Yahweh’s temple. The people still acted corruptly. +\v 3 He built the upper gate of Yahweh’s house, and he built much on the wall of Ophel. +\v 4 Moreover he built cities in the hill country of Judah, and in the forests he built fortresses and towers. +\v 5 He also fought with the king of the children of Ammon, and prevailed against them. The children of Ammon gave him the same year one hundred talents\f + \fr 27:5 \ft A talent is about 30 kilograms or 66 pounds\f* of silver, ten thousand cors\f + \fr 27:5 \ft 1 cor is the same as a homer, or about 55.9 U. S. gallons (liquid) or 211 liters or 6 bushels. 10,000 cors of wheat would weigh about 1,640 metric tons.\f* of wheat, and ten thousand cors of barley.\f + \fr 27:5 \ft 10,000 cors of barley would weigh about 1,310 metric tons.\f* The children of Ammon also gave that much to him in the second year, and in the third. +\v 6 So Jotham became mighty, because he ordered his ways before Yahweh his God. +\v 7 Now the rest of the acts of Jotham, and all his wars and his ways, behold, they are written in the book of the kings of Israel and Judah. +\v 8 He was twenty-five years old when he began to reign, and reigned sixteen years in Jerusalem. +\v 9 Jotham slept with his fathers, and they buried him in David’s city; and Ahaz his son reigned in his place. +\c 28 +\p +\v 1 Ahaz was twenty years old when he began to reign, and he reigned sixteen years in Jerusalem. He didn’t do that which was right in Yahweh’s eyes, like David his father, +\v 2 but he walked in the ways of the kings of Israel, and also made molten images for the Baals. +\v 3 Moreover he burned incense in the valley of the son of Hinnom, and burned his children in the fire, according to the abominations of the nations whom Yahweh cast out before the children of Israel. +\v 4 He sacrificed and burned incense in the high places, and on the hills, and under every green tree. +\p +\v 5 Therefore Yahweh his God delivered him into the hand of the king of Syria. They struck him, and carried away from him a great multitude of captives, and brought them to Damascus. He was also delivered into the hand of the king of Israel, who struck him with a great slaughter. +\v 6 For Pekah the son of Remaliah killed in Judah one hundred twenty thousand in one day, all of them valiant men, because they had forsaken Yahweh, the God of their fathers. +\v 7 Zichri, a mighty man of Ephraim, killed Maaseiah the king’s son, Azrikam the ruler of the house, and Elkanah who was next to the king. +\v 8 The children of Israel carried away captive of their brothers two hundred thousand women, sons, and daughters, and also took away much plunder from them, and brought the plunder to Samaria. +\v 9 But a prophet of Yahweh was there, whose name was Oded; and he went out to meet the army that came to Samaria, and said to them, “Behold, because Yahweh, the God of your fathers, was angry with Judah, he has delivered them into your hand, and you have slain them in a rage which has reached up to heaven. +\v 10 Now you intend to degrade the children of Judah and Jerusalem as male and female slaves for yourselves. Aren’t there even with you trespasses of your own against Yahweh your God? +\v 11 Now hear me therefore, and send back the captives that you have taken captive from your brothers, for the fierce wrath of Yahweh is on you.” +\v 12 Then some of the heads of the children of Ephraim, Azariah the son of Johanan, Berechiah the son of Meshillemoth, Jehizkiah the son of Shallum, and Amasa the son of Hadlai, stood up against those who came from the war, +\v 13 and said to them, “You must not bring in the captives here, for you intend that which will bring on us a trespass against Yahweh, to add to our sins and to our guilt; for our guilt is great, and there is fierce wrath against Israel.” +\p +\v 14 So the armed men left the captives and the plunder before the princes and all the assembly. +\v 15 The men who have been mentioned by name rose up and took the captives, and with the plunder clothed all who were naked among them, dressed them, gave them sandals, gave them something to eat and to drink, anointed them, carried all the feeble of them on donkeys, and brought them to Jericho, the city of palm trees, to their brothers. Then they returned to Samaria. +\p +\v 16 At that time King Ahaz sent to the kings of Assyria to help him. +\v 17 For again the Edomites had come and struck Judah, and carried away captives. +\v 18 The Philistines also had invaded the cities of the lowland and of the South of Judah, and had taken Beth Shemesh, Aijalon, Gederoth, Soco with its villages, Timnah with its villages, and also Gimzo and its villages; and they lived there. +\v 19 For Yahweh brought Judah low because of Ahaz king of Israel, because he acted without restraint in Judah and trespassed severely against Yahweh. +\v 20 Tilgath-pilneser king of Assyria came to him and gave him trouble, but didn’t strengthen him. +\v 21 For Ahaz took away a portion out of Yahweh’s house, and out of the house of the king and of the princes, and gave it to the king of Assyria; but it didn’t help him. +\p +\v 22 In the time of his distress, he trespassed yet more against Yahweh, this same King Ahaz. +\v 23 For he sacrificed to the gods of Damascus which had defeated him. He said, “Because the gods of the kings of Syria helped them, I will sacrifice to them, that they may help me.” But they were the ruin of him and of all Israel. +\v 24 Ahaz gathered together the vessels of God’s house, cut the vessels of God’s house in pieces, and shut up the doors of Yahweh’s house; and he made himself altars in every corner of Jerusalem. +\v 25 In every city of Judah he made high places to burn incense to other gods, and provoked Yahweh, the God of his fathers, to anger. +\p +\v 26 Now the rest of his acts, and all his ways, first and last, behold, they are written in the book of the kings of Judah and Israel. +\v 27 Ahaz slept with his fathers, and they buried him in the city, even in Jerusalem, because they didn’t bring him into the tombs of the kings of Israel; and Hezekiah his son reigned in his place. +\c 29 +\p +\v 1 Hezekiah began to reign when he was twenty-five years old, and he reigned twenty-nine years in Jerusalem. His mother’s name was Abijah, the daughter of Zechariah. +\v 2 He did that which was right in Yahweh’s eyes, according to all that David his father had done. +\v 3 In the first year of his reign, in the first month, he opened the doors of Yahweh’s house and repaired them. +\v 4 He brought in the priests and the Levites and gathered them together into the wide place on the east, +\v 5 and said to them, “Listen to me, you Levites! Now sanctify yourselves, and sanctify the house of Yahweh, the God of your fathers, and carry the filthiness out of the holy place. +\v 6 For our fathers were unfaithful, and have done that which was evil in Yahweh our God’s sight, and have forsaken him, and have turned away their faces from the habitation of Yahweh, and turned their backs. +\v 7 Also they have shut up the doors of the porch, and put out the lamps, and have not burned incense nor offered burnt offerings in the holy place to the God of Israel. +\v 8 Therefore Yahweh’s wrath was on Judah and Jerusalem, and he has delivered them to be tossed back and forth, to be an astonishment and a hissing, as you see with your eyes. +\v 9 For behold, our fathers have fallen by the sword, and our sons and our daughters and our wives are in captivity for this. +\v 10 Now it is in my heart to make a covenant with Yahweh, the God of Israel, that his fierce anger may turn away from us. +\v 11 My sons, don’t be negligent now; for Yahweh has chosen you to stand before him, to minister to him, and that you should be his ministers and burn incense.” +\p +\v 12 Then the Levites arose: Mahath, the son of Amasai, and Joel the son of Azariah, of the sons of the Kohathites; and of the sons of Merari, Kish the son of Abdi, and Azariah the son of Jehallelel; and of the Gershonites, Joah the son of Zimmah, and Eden the son of Joah; +\v 13 and of the sons of Elizaphan, Shimri and Jeuel; and of the sons of Asaph, Zechariah and Mattaniah; +\v 14 and of the sons of Heman, Jehuel and Shimei; and of the sons of Jeduthun, Shemaiah and Uzziel. +\v 15 They gathered their brothers, sanctified themselves, and went in, according to the commandment of the king by Yahweh’s words, to cleanse Yahweh’s house. +\v 16 The priests went into the inner part of Yahweh’s house to cleanse it, and brought out all the uncleanness that they found in Yahweh’s temple into the court of Yahweh’s house. The Levites took it from there to carry it out to the brook Kidron. +\v 17 Now they began on the first day of the first month to sanctify, and on the eighth day of the month they came to Yahweh’s porch. They sanctified Yahweh’s house in eight days, and on the sixteenth day of the first month they finished. +\v 18 Then they went in to Hezekiah the king within the palace and said, “We have cleansed all Yahweh’s house, including the altar of burnt offering with all its vessels, and the table of show bread with all its vessels. +\v 19 Moreover, we have prepared and sanctified all the vessels which King Ahaz threw away in his reign when he was unfaithful. Behold, they are before Yahweh’s altar.” +\p +\v 20 Then Hezekiah the king arose early, gathered the princes of the city, and went up to Yahweh’s house. +\v 21 They brought seven bulls, seven rams, seven lambs, and seven male goats, for a sin offering for the kingdom, for the sanctuary, and for Judah. He commanded the priests the sons of Aaron to offer them on Yahweh’s altar. +\v 22 So they killed the bulls, and the priests received the blood and sprinkled it on the altar. They killed the rams and sprinkled the blood on the altar. They also killed the lambs and sprinkled the blood on the altar. +\v 23 They brought near the male goats for the sin offering before the king and the assembly; and they laid their hands on them. +\v 24 Then the priests killed them, and they made a sin offering with their blood on the altar, to make atonement for all Israel; for the king commanded that the burnt offering and the sin offering should be made for all Israel. +\p +\v 25 He set the Levites in Yahweh’s house with cymbals, with stringed instruments, and with harps, according to the commandment of David, of Gad the king’s seer, and Nathan the prophet; for the commandment was from Yahweh by his prophets. +\v 26 The Levites stood with David’s instruments, and the priests with the trumpets. +\v 27 Hezekiah commanded them to offer the burnt offering on the altar. When the burnt offering began, Yahweh’s song also began, along with the trumpets and instruments of David king of Israel. +\v 28 All the assembly worshiped, the singers sang, and the trumpeters sounded. All this continued until the burnt offering was finished. +\p +\v 29 When they had finished offering, the king and all who were present with him bowed themselves and worshiped. +\v 30 Moreover Hezekiah the king and the princes commanded the Levites to sing praises to Yahweh with the words of David, and of Asaph the seer. They sang praises with gladness, and they bowed their heads and worshiped. +\p +\v 31 Then Hezekiah answered, “Now you have consecrated yourselves to Yahweh. Come near and bring sacrifices and thank offerings into Yahweh’s house.” The assembly brought in sacrifices and thank offerings, and as many as were of a willing heart brought burnt offerings. +\v 32 The number of the burnt offerings which the assembly brought was seventy bulls, one hundred rams, and two hundred lambs. All these were for a burnt offering to Yahweh. +\v 33 The consecrated things were six hundred head of cattle and three thousand sheep. +\v 34 But the priests were too few, so that they could not skin all the burnt offerings. Therefore their brothers the Levites helped them until the work was ended, and until the priests had sanctified themselves, for the Levites were more upright in heart to sanctify themselves than the priests. +\v 35 Also the burnt offerings were in abundance, with the fat of the peace offerings and with the drink offerings for every burnt offering. So the service of Yahweh’s house was set in order. +\v 36 Hezekiah and all the people rejoiced because of that which God had prepared for the people; for the thing was done suddenly. +\c 30 +\p +\v 1 Hezekiah sent to all Israel and Judah, and wrote letters also to Ephraim and Manasseh, that they should come to Yahweh’s house at Jerusalem, to keep the Passover to Yahweh, the God of Israel. +\v 2 For the king had taken counsel with his princes and all the assembly in Jerusalem to keep the Passover in the second month. +\v 3 For they could not keep it at that time, because the priests had not sanctified themselves in sufficient number, and the people had not gathered themselves together to Jerusalem. +\v 4 The thing was right in the eyes of the king and of all the assembly. +\v 5 So they established a decree to make proclamation throughout all Israel, from Beersheba even to Dan, that they should come to keep the Passover to Yahweh, the God of Israel, at Jerusalem, for they had not kept it in great numbers in the way it is written. +\p +\v 6 So the couriers went with the letters from the king and his princes throughout all Israel and Judah, according to the commandment of the king, saying, “You children of Israel, turn again to Yahweh, the God of Abraham, Isaac, and Israel, that he may return to the remnant of you that have escaped out of the hand of the kings of Assyria. +\v 7 Don’t be like your fathers and like your brothers, who trespassed against Yahweh, the God of their fathers, so that he gave them up to desolation, as you see. +\v 8 Now don’t be stiff-necked, as your fathers were, but yield yourselves to Yahweh, and enter into his sanctuary, which he has sanctified forever, and serve Yahweh your God, that his fierce anger may turn away from you. +\v 9 For if you turn again to Yahweh, your brothers and your children will find compassion with those who led them captive, and will come again into this land, because Yahweh your God is gracious and merciful, and will not turn away his face from you if you return to him.” +\p +\v 10 So the couriers passed from city to city through the country of Ephraim and Manasseh, even to Zebulun, but people ridiculed them and mocked them. +\v 11 Nevertheless some men of Asher, Manasseh, and Zebulun humbled themselves and came to Jerusalem. +\v 12 Also the hand of God came on Judah to give them one heart, to do the commandment of the king and of the princes by Yahweh’s word. +\p +\v 13 Many people assembled at Jerusalem to keep the feast of unleavened bread in the second month, a very great assembly. +\v 14 They arose and took away the altars that were in Jerusalem, and they took away all the altars for incense and threw them into the brook Kidron. +\v 15 Then they killed the Passover on the fourteenth day of the second month. The priests and the Levites were ashamed, and sanctified themselves, and brought burnt offerings into Yahweh’s house. +\v 16 They stood in their place after their order, according to the law of Moses the man of God. The priests sprinkled the blood which they received of the hand of the Levites. +\v 17 For there were many in the assembly who had not sanctified themselves; therefore the Levites were in charge of killing the Passovers for everyone who was not clean, to sanctify them to Yahweh. +\v 18 For a multitude of the people, even many of Ephraim, Manasseh, Issachar, and Zebulun, had not cleansed themselves, yet they ate the Passover other than the way it is written. For Hezekiah had prayed for them, saying, “May the good Yahweh pardon everyone +\v 19 who sets his heart to seek God, Yahweh, the God of his fathers, even if they aren’t clean according to the purification of the sanctuary.” +\p +\v 20 Yahweh listened to Hezekiah, and healed the people. +\v 21 The children of Israel who were present at Jerusalem kept the feast of unleavened bread seven days with great gladness. The Levites and the priests praised Yahweh day by day, singing with loud instruments to Yahweh. +\v 22 Hezekiah spoke encouragingly to all the Levites who had good understanding in the service of Yahweh. So they ate throughout the feast for the seven days, offering sacrifices of peace offerings and making confession to Yahweh, the God of their fathers. +\p +\v 23 The whole assembly took counsel to keep another seven days, and they kept another seven days with gladness. +\v 24 For Hezekiah king of Judah gave to the assembly for offerings one thousand bulls and seven thousand sheep; and the princes gave to the assembly a thousand bulls and ten thousand sheep; and a great number of priests sanctified themselves. +\v 25 All the assembly of Judah, with the priests and the Levites, and all the assembly who came out of Israel, and the foreigners who came out of the land of Israel and who lived in Judah, rejoiced. +\v 26 So there was great joy in Jerusalem; for since the time of Solomon the son of David king of Israel there was nothing like this in Jerusalem. +\v 27 Then the Levitical priests arose and blessed the people. Their voice was heard, and their prayer came up to his holy habitation, even to heaven. +\c 31 +\p +\v 1 Now when all this was finished, all Israel who were present went out to the cities of Judah and broke the pillars in pieces, cut down the Asherah poles, and broke down the high places and the altars out of all Judah and Benjamin, also in Ephraim and Manasseh, until they had destroyed them all. Then all the children of Israel returned, every man to his possession, into their own cities. +\p +\v 2 Hezekiah appointed the divisions of the priests and the Levites after their divisions, every man according to his service, both the priests and the Levites, for burnt offerings and for peace offerings, to minister, to give thanks, and to praise in the gates of Yahweh’s camp. +\v 3 He also appointed the king’s portion of his possessions for the burnt offerings: for the morning and evening burnt offerings, and the burnt offerings for the Sabbaths, for the new moons, and for the set feasts, as it is written in Yahweh’s law. +\v 4 Moreover he commanded the people who lived in Jerusalem to give the portion of the priests and the Levites, that they might give themselves to Yahweh’s law. +\v 5 As soon as the commandment went out, the children of Israel gave in abundance the first fruits of grain, new wine, oil, honey, and of all the increase of the field; and they brought in the tithe of all things abundantly. +\v 6 The children of Israel and Judah, who lived in the cities of Judah, also brought in the tithe of cattle and sheep, and the tithe of dedicated things which were consecrated to Yahweh their God, and laid them in heaps. +\p +\v 7 In the third month, they began to lay the foundation of the heaps, and finished them in the seventh month. +\v 8 When Hezekiah and the princes came and saw the heaps, they blessed Yahweh and his people Israel. +\v 9 Then Hezekiah questioned the priests and the Levites about the heaps. +\v 10 Azariah the chief priest, of the house of Zadok, answered him and said, “Since people began to bring the offerings into Yahweh’s house, we have eaten and had enough, and have plenty left over, for Yahweh has blessed his people; and that which is left is this great store.” +\p +\v 11 Then Hezekiah commanded them to prepare rooms in Yahweh’s house, and they prepared them. +\v 12 They brought in the offerings, the tithes, and the dedicated things faithfully. Conaniah the Levite was ruler over them, and Shimei his brother was second. +\v 13 Jehiel, Azaziah, Nahath, Asahel, Jerimoth, Jozabad, Eliel, Ismachiah, Mahath, and Benaiah were overseers under the hand of Conaniah and Shimei his brother, by the appointment of Hezekiah the king and Azariah the ruler of God’s house. +\v 14 Kore the son of Imnah the Levite, the gatekeeper at the east gate, was over the free will offerings of God, to distribute Yahweh’s offerings and the most holy things. +\v 15 Under him were Eden, Miniamin, Jeshua, Shemaiah, Amariah, and Shecaniah, in the cities of the priests, in their office of trust, to give to their brothers by divisions, to the great as well as to the small; +\v 16 in addition to those who were listed by genealogy of males, from three years old and upward, even everyone who entered into Yahweh’s house, as the duty of every day required, for their service in their offices according to their divisions; +\v 17 and those who were listed by genealogy of the priests by their fathers’ houses, and the Levites from twenty years old and upward, in their offices by their divisions; +\v 18 and those who were listed by genealogy of all their little ones, their wives, their sons, and their daughters, through all the congregation; for in their office of trust they sanctified themselves in holiness. +\v 19 Also for the sons of Aaron the priests, who were in the fields of the pasture lands of their cities, in every city, there were men who were mentioned by name to give portions to all the males among the priests and to all who were listed by genealogy among the Levites. +\p +\v 20 Hezekiah did so throughout all Judah; and he did that which was good, right, and faithful before Yahweh his God. +\v 21 In every work that he began in the service of God’s house, in the law, and in the commandments, to seek his God, he did it with all his heart and prospered. +\c 32 +\p +\v 1 After these things and this faithfulness, Sennacherib king of Assyria came, entered into Judah, encamped against the fortified cities, and intended to win them for himself. +\v 2 When Hezekiah saw that Sennacherib had come, and that he was planning to fight against Jerusalem, +\v 3 he took counsel with his princes and his mighty men to stop the waters of the springs which were outside of the city, and they helped him. +\v 4 Then many people gathered together and they stopped all the springs and the brook that flowed through the middle of the land, saying, “Why should the kings of Assyria come, and find abundant water?” +\p +\v 5 He took courage, built up all the wall that was broken down, and raised it up to the towers, with the other wall outside, and strengthened Millo in David’s city, and made weapons and shields in abundance. +\v 6 He set captains of war over the people, gathered them together to him in the wide place at the gate of the city, and spoke encouragingly to them, saying, +\v 7 “Be strong and courageous. Don’t be afraid or dismayed because of the king of Assyria, nor for all the multitude who is with him; for there is a greater one with us than with him. +\v 8 An arm of flesh is with him, but Yahweh our God is with us to help us and to fight our battles.” The people rested themselves on the words of Hezekiah king of Judah. +\p +\v 9 After this, Sennacherib king of Assyria sent his servants to Jerusalem, (now he was attacking Lachish, and all his forces were with him), to Hezekiah king of Judah, and to all Judah who were at Jerusalem, saying, +\v 10 Sennacherib king of Assyria says, “In whom do you trust, that you remain under siege in Jerusalem? +\v 11 Doesn’t Hezekiah persuade you to give you over to die by famine and by thirst, saying, ‘Yahweh our God will deliver us out of the hand of the king of Assyria?’ +\v 12 Hasn’t the same Hezekiah taken away his high places and his altars, and commanded Judah and Jerusalem, saying, ‘You shall worship before one altar, and you shall burn incense on it?’ +\v 13 Don’t you know what I and my fathers have done to all the peoples of the lands? Were the gods of the nations of those lands in any way able to deliver their land out of my hand? +\v 14 Who was there among all the gods of those nations which my fathers utterly destroyed that could deliver his people out of my hand, that your God should be able to deliver you out of my hand? +\v 15 Now therefore don’t let Hezekiah deceive you nor persuade you in this way. Don’t believe him, for no god of any nation or kingdom was able to deliver his people out of my hand, and out of the hand of my fathers. How much less will your God deliver you out of my hand?” +\p +\v 16 His servants spoke yet more against Yahweh God and against his servant Hezekiah. +\v 17 He also wrote letters insulting Yahweh, the God of Israel, and speaking against him, saying, “As the gods of the nations of the lands, which have not delivered their people out of my hand, so shall the God of Hezekiah not deliver his people out of my hand.” +\v 18 They called out with a loud voice in the Jews’ language to the people of Jerusalem who were on the wall, to frighten them and to trouble them, that they might take the city. +\v 19 They spoke of the God of Jerusalem as of the gods of the peoples of the earth, which are the work of men’s hands. +\p +\v 20 Hezekiah the king and Isaiah the prophet, the son of Amoz, prayed because of this, and cried to heaven. +\p +\v 21 Yahweh sent an angel, who cut off all the mighty men of valor, the leaders, and captains in the camp of the king of Assyria. So he returned with shame of face to his own land. When he had come into the house of his god, those who came out of his own body\f + \fr 32:21 \ft i.e., his own sons\f* killed him there with the sword. +\v 22 Thus Yahweh saved Hezekiah and the inhabitants of Jerusalem from the hand of Sennacherib the king of Assyria and from the hand of all others, and guided them on every side. +\v 23 Many brought gifts to Yahweh to Jerusalem, and precious things to Hezekiah king of Judah, so that he was exalted in the sight of all nations from then on. +\p +\v 24 In those days Hezekiah was terminally ill, and he prayed to Yahweh; and he spoke to him, and gave him a sign. +\v 25 But Hezekiah didn’t reciprocate appropriate to the benefit done for him, because his heart was lifted up. Therefore there was wrath on him, Judah, and Jerusalem. +\v 26 However, Hezekiah humbled himself for the pride of his heart, both he and the inhabitants of Jerusalem, so that Yahweh’s wrath didn’t come on them in the days of Hezekiah. +\p +\v 27 Hezekiah had exceedingly great riches and honor. He provided himself with treasuries for silver, for gold, for precious stones, for spices, for shields, and for all kinds of valuable vessels; +\v 28 also storehouses for the increase of grain, new wine, and oil; and stalls for all kinds of animals, and flocks in folds. +\v 29 Moreover he provided for himself cities, and possessions of flocks and herds in abundance; for God had given him abundant possessions. +\v 30 This same Hezekiah also stopped the upper spring of the waters of Gihon, and brought them straight down on the west side of David’s city. Hezekiah prospered in all his works. +\p +\v 31 However, concerning the ambassadors of the princes of Babylon, who sent to him to inquire of the wonder that was done in the land, God left him to test him, that he might know all that was in his heart. +\p +\v 32 Now the rest of the acts of Hezekiah and his good deeds, behold, they are written in the vision of Isaiah the prophet, the son of Amoz, in the book of the kings of Judah and Israel. +\v 33 Hezekiah slept with his fathers, and they buried him in the ascent to the tombs of the sons of David. All Judah and the inhabitants of Jerusalem honored him at his death. Manasseh his son reigned in his place. +\c 33 +\p +\v 1 Manasseh was twelve years old when he began to reign, and he reigned fifty-five years in Jerusalem. +\v 2 He did that which was evil in Yahweh’s sight, after the abominations of the nations whom Yahweh cast out before the children of Israel. +\v 3 For he built again the high places which Hezekiah his father had broken down; and he raised up altars for the Baals, made Asheroth, and worshiped all the army of the sky, and served them. +\v 4 He built altars in Yahweh’s house, of which Yahweh said, “My name shall be in Jerusalem forever.” +\v 5 He built altars for all the army of the sky in the two courts of Yahweh’s house. +\v 6 He also made his children to pass through the fire in the valley of the son of Hinnom. He practiced sorcery, divination, and witchcraft, and dealt with those who had familiar spirits and with wizards. He did much evil in Yahweh’s sight, to provoke him to anger. +\v 7 He set the engraved image of the idol, which he had made, in God’s house, of which God said to David and to Solomon his son, “In this house, and in Jerusalem, which I have chosen out of all the tribes of Israel, I will put my name forever. +\v 8 I will not any more remove the foot of Israel from off the land which I have appointed for your fathers, if only they will observe to do all that I have commanded them, even all the law, the statutes, and the ordinances given by Moses.” +\v 9 Manasseh seduced Judah and the inhabitants of Jerusalem, so that they did more evil than did the nations whom Yahweh destroyed before the children of Israel. +\p +\v 10 Yahweh spoke to Manasseh and to his people, but they didn’t listen. +\v 11 Therefore Yahweh brought on them the captains of the army of the king of Assyria, who took Manasseh in chains, bound him with fetters, and carried him to Babylon. +\p +\v 12 When he was in distress, he begged Yahweh his God, and humbled himself greatly before the God of his fathers. +\v 13 He prayed to him; and he was entreated by him, and heard his supplication, and brought him again to Jerusalem into his kingdom. Then Manasseh knew that Yahweh was God. +\p +\v 14 Now after this, he built an outer wall to David’s city on the west side of Gihon, in the valley, even to the entrance at the fish gate. He encircled Ophel with it, and raised it up to a very great height; and he put valiant captains in all the fortified cities of Judah. +\v 15 He took away the foreign gods and the idol out of Yahweh’s house, and all the altars that he had built in the mountain of Yahweh’s house and in Jerusalem, and cast them out of the city. +\v 16 He built up Yahweh’s altar, and offered sacrifices of peace offerings and of thanksgiving on it, and commanded Judah to serve Yahweh, the God of Israel. +\v 17 Nevertheless the people still sacrificed in the high places, but only to Yahweh their God. +\p +\v 18 Now the rest of the acts of Manasseh, and his prayer to his God, and the words of the seers who spoke to him in the name of Yahweh, the God of Israel, behold, they are written among the acts of the kings of Israel. +\v 19 His prayer also, and how God listened to his request, and all his sin and his trespass, and the places in which he built high places and set up the Asherah poles and the engraved images before he humbled himself: behold, they are written in the history of Hozai.\f + \fr 33:19 \ft or, the seers\f* +\v 20 So Manasseh slept with his fathers, and they buried him in his own house; and Amon his son reigned in his place. +\p +\v 21 Amon was twenty-two years old when he began to reign; and he reigned two years in Jerusalem. +\v 22 He did that which was evil in Yahweh’s sight, as did Manasseh his father; and Amon sacrificed to all the engraved images which Manasseh his father had made, and served them. +\v 23 He didn’t humble himself before Yahweh, as Manasseh his father had humbled himself; but this same Amon trespassed more and more. +\v 24 His servants conspired against him, and put him to death in his own house. +\v 25 But the people of the land killed all those who had conspired against King Amon; and the people of the land made Josiah his son king in his place. +\c 34 +\p +\v 1 Josiah was eight years old when he began to reign, and he reigned thirty-one years in Jerusalem. +\v 2 He did that which was right in Yahweh’s eyes, and walked in the ways of David his father, and didn’t turn away to the right hand or to the left. +\v 3 For in the eighth year of his reign, while he was yet young, he began to seek after the God of David his father; and in the twelfth year he began to purge Judah and Jerusalem from the high places, the Asherah poles, the engraved images, and the molten images. +\v 4 They broke down the altars of the Baals in his presence; and he cut down the incense altars that were on high above them. He broke the Asherah poles, the engraved images, and the molten images in pieces, made dust of them, and scattered it on the graves of those who had sacrificed to them. +\v 5 He burned the bones of the priests on their altars, and purged Judah and Jerusalem. +\v 6 He did this in the cities of Manasseh, Ephraim, and Simeon, even to Naphtali, around in their ruins. +\v 7 He broke down the altars, beat the Asherah poles and the engraved images into powder, and cut down all the incense altars throughout all the land of Israel, then returned to Jerusalem. +\p +\v 8 Now in the eighteenth year of his reign, when he had purged the land and the house, he sent Shaphan the son of Azaliah, Maaseiah the governor of the city, and Joah the son of Joahaz the recorder to repair the house of Yahweh his God. +\v 9 They came to Hilkiah the high priest and delivered the money that was brought into God’s house, which the Levites, the keepers of the threshold, had gathered from the hands of Manasseh, Ephraim, of all the remnant of Israel, of all Judah and Benjamin, and of the inhabitants of Jerusalem. +\v 10 They delivered it into the hands of the workmen who had the oversight of Yahweh’s house; and the workmen who labored in Yahweh’s house gave it to mend and repair the house. +\v 11 They gave it to the carpenters and to the builders to buy cut stone and timber for couplings, and to make beams for the houses which the kings of Judah had destroyed. +\v 12 The men did the work faithfully. Their overseers were Jahath and Obadiah the Levites, of the sons of Merari; and Zechariah and Meshullam, of the sons of the Kohathites, to give direction; and others of the Levites, who were all skillful with musical instruments. +\v 13 Also they were over the bearers of burdens, and directed all who did the work in every kind of service. Of the Levites, there were scribes, officials, and gatekeepers. +\p +\v 14 When they brought out the money that was brought into Yahweh’s house, Hilkiah the priest found the book of Yahweh’s law given by Moses. +\v 15 Hilkiah answered Shaphan the scribe, “I have found the book of the law in Yahweh’s house.” So Hilkiah delivered the book to Shaphan. +\p +\v 16 Shaphan carried the book to the king, and moreover brought back word to the king, saying, “All that was committed to your servants, they are doing. +\v 17 They have emptied out the money that was found in Yahweh’s house, and have delivered it into the hand of the overseers and into the hand of the workmen.” +\v 18 Shaphan the scribe told the king, saying, “Hilkiah the priest has delivered me a book.” Shaphan read from it to the king. +\p +\v 19 When the king had heard the words of the law, he tore his clothes. +\v 20 The king commanded Hilkiah, Ahikam the son of Shaphan, Abdon the son of Micah, Shaphan the scribe, and Asaiah the king’s servant, saying, +\v 21 “Go inquire of Yahweh for me, and for those who are left in Israel and in Judah, concerning the words of the book that is found; for great is Yahweh’s wrath that is poured out on us, because our fathers have not kept Yahweh’s word, to do according to all that is written in this book.” +\p +\v 22 So Hilkiah and those whom the king had commanded went to Huldah the prophetess, the wife of Shallum the son of Tokhath, the son of Hasrah, keeper of the wardrobe (now she lived in Jerusalem in the second quarter), and they spoke to her to that effect. +\p +\v 23 She said to them, “Yahweh, the God of Israel says: ‘Tell the man who sent you to me, +\v 24 “Yahweh says, ‘Behold, I will bring evil on this place and on its inhabitants, even all the curses that are written in the book which they have read before the king of Judah. +\v 25 Because they have forsaken me, and have burned incense to other gods, that they might provoke me to anger with all the works of their hands, therefore my wrath is poured out on this place, and it will not be quenched.’”’ +\v 26 But to the king of Judah, who sent you to inquire of Yahweh, you shall tell him this, ‘Yahweh, the God of Israel says: “About the words which you have heard, +\v 27 because your heart was tender, and you humbled yourself before God when you heard his words against this place and against its inhabitants, and have humbled yourself before me, and have torn your clothes and wept before me, I also have heard you,” says Yahweh. +\v 28 “Behold, I will gather you to your fathers, and you will be gathered to your grave in peace. Your eyes won’t see all the evil that I will bring on this place and on its inhabitants.”’” +\p They brought back this message to the king. +\p +\v 29 Then the king sent and gathered together all the elders of Judah and Jerusalem. +\v 30 The king went up to Yahweh’s house with all the men of Judah and the inhabitants of Jerusalem—the priests, the Levites, and all the people, both great and small—and he read in their hearing all the words of the book of the covenant that was found in Yahweh’s house. +\v 31 The king stood in his place and made a covenant before Yahweh, to walk after Yahweh, and to keep his commandments, his testimonies, and his statutes with all his heart and with all his soul, to perform the words of the covenant that were written in this book. +\v 32 He caused all who were found in Jerusalem and Benjamin to stand. The inhabitants of Jerusalem did according to the covenant of God, the God of their fathers. +\v 33 Josiah took away all the abominations out of all the countries that belonged to the children of Israel, and made all who were found in Israel to serve, even to serve Yahweh their God. All his days they didn’t depart from following Yahweh, the God of their fathers. +\c 35 +\p +\v 1 Josiah kept a Passover to Yahweh in Jerusalem. They killed the Passover on the fourteenth day of the first month. +\v 2 He set the priests in their offices and encouraged them in the service of Yahweh’s house. +\v 3 He said to the Levites who taught all Israel, who were holy to Yahweh, “Put the holy ark in the house which Solomon the son of David king of Israel built. It will no longer be a burden on your shoulders. Now serve Yahweh your God and his people Israel. +\v 4 Prepare yourselves after your fathers’ houses by your divisions, according to the writing of David king of Israel, and according to the writing of Solomon his son. +\v 5 Stand in the holy place according to the divisions of the fathers’ houses of your brothers the children of the people, and let there be for each a portion of a fathers’ house of the Levites. +\v 6 Kill the Passover lamb, sanctify yourselves, and prepare for your brothers, to do according to Yahweh’s word by Moses.” +\p +\v 7 Josiah gave to the children of the people, of the flock, lambs and young goats, all of them for the Passover offerings, to all who were present, to the number of thirty thousand, and three thousand bulls. These were of the king’s substance. +\v 8 His princes gave a free will offering to the people, to the priests, and to the Levites. Hilkiah, Zechariah, and Jehiel, the rulers of God’s house, gave to the priests for the Passover offerings two thousand six hundred small livestock, and three hundred head of cattle. +\v 9 Conaniah also, and Shemaiah and Nethanel, his brothers, and Hashabiah, Jeiel, and Jozabad, the chiefs of the Levites, gave to the Levites for the Passover offerings five thousand small livestock and five hundred head of cattle. +\p +\v 10 So the service was prepared, and the priests stood in their place, and the Levites by their divisions, according to the king’s commandment. +\v 11 They killed the Passover lambs, and the priests sprinkled the blood which they received from their hands, and the Levites skinned them. +\v 12 They removed the burnt offerings, that they might give them according to the divisions of the fathers’ houses of the children of the people, to offer to Yahweh, as it is written in the book of Moses. They did the same with the cattle. +\v 13 They roasted the Passover with fire according to the ordinance. They boiled the holy offerings in pots, in cauldrons, and in pans, and carried them quickly to all the children of the people. +\v 14 Afterward they prepared for themselves and for the priests, because the priests the sons of Aaron were busy with offering the burnt offerings and the fat until night. Therefore the Levites prepared for themselves and for the priests the sons of Aaron. +\v 15 The singers, the sons of Asaph, were in their place, according to the commandment of David, Asaph, Heman, and Jeduthun the king’s seer; and the gatekeepers were at every gate. They didn’t need to depart from their service, because their brothers the Levites prepared for them. +\p +\v 16 So all the service of Yahweh was prepared the same day, to keep the Passover, and to offer burnt offerings on Yahweh’s altar, according to the commandment of King Josiah. +\v 17 The children of Israel who were present kept the Passover at that time, and the feast of unleavened bread seven days. +\v 18 There was no Passover like that kept in Israel from the days of Samuel the prophet, nor did any of the kings of Israel keep such a Passover as Josiah kept—with the priests, the Levites, and all Judah and Israel who were present, and the inhabitants of Jerusalem. +\v 19 This Passover was kept in the eighteenth year of the reign of Josiah. +\p +\v 20 After all this, when Josiah had prepared the temple, Neco king of Egypt went up to fight against Carchemish by the Euphrates, and Josiah went out against him. +\v 21 But he sent ambassadors to him, saying, “What have I to do with you, you king of Judah? I come not against you today, but against the house with which I have war. God has commanded me to make haste. Beware that it is God who is with me, that he not destroy you.” +\p +\v 22 Nevertheless Josiah would not turn his face from him, but disguised himself, that he might fight with him, and didn’t listen to the words of Neco from the mouth of God, and came to fight in the valley of Megiddo. +\v 23 The archers shot at King Josiah; and the king said to his servants, “Take me away, because I am seriously wounded!” +\p +\v 24 So his servants took him out of the chariot, and put him in the second chariot that he had, and brought him to Jerusalem; and he died, and was buried in the tombs of his fathers. All Judah and Jerusalem mourned for Josiah. +\v 25 Jeremiah lamented for Josiah, and all the singing men and singing women spoke of Josiah in their lamentations to this day; and they made them an ordinance in Israel. Behold, they are written in the lamentations. +\v 26 Now the rest of the acts of Josiah and his good deeds, according to that which is written in Yahweh’s law, +\v 27 and his acts, first and last, behold, they are written in the book of the kings of Israel and Judah. +\c 36 +\p +\v 1 Then the people of the land took Jehoahaz the son of Josiah, and made him king in his father’s place in Jerusalem. +\v 2 Joahaz was twenty-three years old when he began to reign; and he reigned three months in Jerusalem. +\v 3 The king of Egypt removed him from office at Jerusalem, and fined the land one hundred talents of silver and a talent\f + \fr 36:3 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of gold. +\v 4 The king of Egypt made Eliakim his brother king over Judah and Jerusalem, and changed his name to Jehoiakim. Neco took Joahaz his brother, and carried him to Egypt. +\p +\v 5 Jehoiakim was twenty-five years old when he began to reign, and he reigned eleven years in Jerusalem. He did that which was evil in Yahweh his God’s sight. +\v 6 Nebuchadnezzar king of Babylon came up against him, and bound him in fetters to carry him to Babylon. +\v 7 Nebuchadnezzar also carried some of the vessels of Yahweh’s house to Babylon, and put them in his temple at Babylon. +\v 8 Now the rest of the acts of Jehoiakim, and his abominations which he did, and that which was found in him, behold, they are written in the book of the kings of Israel and Judah; and Jehoiachin his son reigned in his place. +\p +\v 9 Jehoiachin was eight years old when he began to reign, and he reigned three months and ten days in Jerusalem. He did that which was evil in Yahweh’s sight. +\v 10 At the return of the year, King Nebuchadnezzar sent and brought him to Babylon, with the valuable vessels of Yahweh’s house, and made Zedekiah his brother king over Judah and Jerusalem. +\p +\v 11 Zedekiah was twenty-one years old when he began to reign, and he reigned eleven years in Jerusalem. +\v 12 He did that which was evil in Yahweh his God’s sight. He didn’t humble himself before Jeremiah the prophet speaking from Yahweh’s mouth. +\v 13 He also rebelled against King Nebuchadnezzar, who had made him swear by God; but he stiffened his neck, and hardened his heart against turning to Yahweh, the God of Israel. +\v 14 Moreover all the chiefs of the priests and the people trespassed very greatly after all the abominations of the nations; and they polluted Yahweh’s house which he had made holy in Jerusalem. +\p +\v 15 Yahweh, the God of their fathers, sent to them by his messengers, rising up early and sending, because he had compassion on his people and on his dwelling place; +\v 16 but they mocked the messengers of God, despised his words, and scoffed at his prophets, until Yahweh’s wrath arose against his people, until there was no remedy. +\p +\v 17 Therefore he brought on them the king of the Chaldeans, who killed their young men with the sword in the house of their sanctuary, and had no compassion on young man or virgin, old man or infirm. He gave them all into his hand. +\v 18 All the vessels of God’s house, great and small, and the treasures of Yahweh’s house, and the treasures of the king and of his princes, all these he brought to Babylon. +\v 19 They burned God’s house, broke down the wall of Jerusalem, burned all its palaces with fire, and destroyed all of its valuable vessels. +\v 20 He carried those who had escaped from the sword away to Babylon, and they were servants to him and his sons until the reign of the kingdom of Persia, +\v 21 to fulfill Yahweh’s word by Jeremiah’s mouth, until the land had enjoyed its Sabbaths. As long as it lay desolate, it kept Sabbath, to fulfill seventy years. +\p +\v 22 Now in the first year of Cyrus king of Persia, that Yahweh’s word by the mouth of Jeremiah might be accomplished, Yahweh stirred up the spirit of Cyrus king of Persia, so that he made a proclamation throughout all his kingdom, and put it also in writing, saying, +\v 23 “Cyrus king of Persia says, ‘Yahweh, the God of heaven, has given all the kingdoms of the earth to me; and he has commanded me to build him a house in Jerusalem, which is in Judah. Whoever there is among you of all his people, Yahweh his God be with him, and let him go up.’” diff --git a/c-sharp/assets/WEB/15EZRengWEBUS.SFM b/c-sharp/assets/WEB/15EZRengWEBUS.SFM new file mode 100644 index 0000000000..23d80b6c10 --- /dev/null +++ b/c-sharp/assets/WEB/15EZRengWEBUS.SFM @@ -0,0 +1,413 @@ +\id EZR World English Bible (WEB) +\ide UTF-8 +\h Ezra +\toc1 The Book of Ezra +\toc2 Ezra +\toc3 Ezra +\mt2 The Book of +\mt1 Ezra +\c 1 +\p +\v 1 Now in the first year of Cyrus king of Persia, that Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word by Jeremiah’s mouth might be accomplished, Yahweh stirred up the spirit of Cyrus king of Persia, so that he made a proclamation throughout all his kingdom, and put it also in writing, saying, +\mi +\v 2 “Cyrus king of Persia says, ‘Yahweh, the God\f + \fr 1:2 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* of heaven, has given me all the kingdoms of the earth; and he has commanded me to build him a house in Jerusalem, which is in Judah. +\v 3 Whoever there is among you of all his people, may his God be with him, and let him go up to Jerusalem, which is in Judah, and build the house of Yahweh, the God of Israel (he is God), which is in Jerusalem. +\v 4 Whoever is left, in any place where he lives, let the men of his place help him with silver, with gold, with goods, and with animals, in addition to the free will offering for God’s house which is in Jerusalem.’” +\p +\v 5 Then the heads of fathers’ households of Judah and Benjamin, the priests and the Levites, all whose spirit God had stirred to go up, rose up to build Yahweh’s house which is in Jerusalem. +\v 6 All those who were around them strengthened their hands with vessels of silver, with gold, with goods, with animals, and with precious things, in addition to all that was willingly offered. +\v 7 Also Cyrus the king brought out the vessels of Yahweh’s house, which Nebuchadnezzar had brought out of Jerusalem, and had put in the house of his gods; +\v 8 even those, Cyrus king of Persia brought out by the hand of Mithredath the treasurer, and counted them out to Sheshbazzar the prince of Judah. +\v 9 This is the number of them: thirty platters of gold, one thousand platters of silver, twenty-nine knives, +\v 10 thirty bowls of gold, four hundred ten silver bowls of a second kind, and one thousand other vessels. +\v 11 All the vessels of gold and of silver were five thousand four hundred. Sheshbazzar brought all these up when the captives were brought up from Babylon to Jerusalem. +\c 2 +\p +\v 1 Now these are the children of the province who went up out of the captivity of those who had been carried away, whom Nebuchadnezzar the king of Babylon had carried away to Babylon, and who returned to Jerusalem and Judah, everyone to his city; +\v 2 who came with Zerubbabel, Jeshua, Nehemiah, Seraiah, Reelaiah, Mordecai, Bilshan, Mispar, Bigvai, Rehum, and Baanah. +\p The number of the men of the people of Israel: +\v 3 The children of Parosh, two thousand one hundred seventy-two. +\v 4 The children of Shephatiah, three hundred seventy-two. +\v 5 The children of Arah, seven hundred seventy-five. +\v 6 The children of Pahathmoab, of the children of Jeshua and Joab, two thousand eight hundred twelve. +\v 7 The children of Elam, one thousand two hundred fifty-four. +\v 8 The children of Zattu, nine hundred forty-five. +\v 9 The children of Zaccai, seven hundred sixty. +\v 10 The children of Bani, six hundred forty-two. +\v 11 The children of Bebai, six hundred twenty-three. +\v 12 The children of Azgad, one thousand two hundred twenty-two. +\v 13 The children of Adonikam, six hundred sixty-six. +\v 14 The children of Bigvai, two thousand fifty-six. +\v 15 The children of Adin, four hundred fifty-four. +\v 16 The children of Ater, of Hezekiah, ninety-eight. +\v 17 The children of Bezai, three hundred twenty-three. +\v 18 The children of Jorah, one hundred twelve. +\v 19 The children of Hashum, two hundred twenty-three. +\v 20 The children of Gibbar, ninety-five. +\v 21 The children of Bethlehem, one hundred twenty-three. +\v 22 The men of Netophah, fifty-six. +\v 23 The men of Anathoth, one hundred twenty-eight. +\v 24 The children of Azmaveth, forty-two. +\v 25 The children of Kiriath Arim, Chephirah, and Beeroth, seven hundred forty-three. +\v 26 The children of Ramah and Geba, six hundred twenty-one. +\v 27 The men of Michmas, one hundred twenty-two. +\v 28 The men of Bethel and Ai, two hundred twenty-three. +\v 29 The children of Nebo, fifty-two. +\v 30 The children of Magbish, one hundred fifty-six. +\v 31 The children of the other Elam, one thousand two hundred fifty-four. +\v 32 The children of Harim, three hundred twenty. +\v 33 The children of Lod, Hadid, and Ono, seven hundred twenty-five. +\v 34 The children of Jericho, three hundred forty-five. +\v 35 The children of Senaah, three thousand six hundred thirty. +\p +\v 36 The priests: the children of Jedaiah, of the house of Jeshua, nine hundred seventy-three. +\v 37 The children of Immer, one thousand fifty-two. +\v 38 The children of Pashhur, one thousand two hundred forty-seven. +\v 39 The children of Harim, one thousand seventeen. +\p +\v 40 The Levites: the children of Jeshua and Kadmiel, of the children of Hodaviah, seventy-four. +\v 41 The singers: the children of Asaph, one hundred twenty-eight. +\v 42 The children of the gatekeepers: the children of Shallum, the children of Ater, the children of Talmon, the children of Akkub, the children of Hatita, the children of Shobai, in all one hundred thirty-nine. +\p +\v 43 The temple servants: the children of Ziha, the children of Hasupha, the children of Tabbaoth, +\v 44 the children of Keros, the children of Siaha, the children of Padon, +\v 45 the children of Lebanah, the children of Hagabah, the children of Akkub, +\v 46 the children of Hagab, the children of Shamlai, the children of Hanan, +\v 47 the children of Giddel, the children of Gahar, the children of Reaiah, +\v 48 the children of Rezin, the children of Nekoda, the children of Gazzam, +\v 49 the children of Uzza, the children of Paseah, the children of Besai, +\v 50 the children of Asnah, the children of Meunim, the children of Nephisim, +\v 51 the children of Bakbuk, the children of Hakupha, the children of Harhur, +\v 52 the children of Bazluth, the children of Mehida, the children of Harsha, +\v 53 the children of Barkos, the children of Sisera, the children of Temah, +\v 54 the children of Neziah, the children of Hatipha. +\p +\v 55 The children of Solomon’s servants: the children of Sotai, the children of Hassophereth, the children of Peruda, +\v 56 the children of Jaalah, the children of Darkon, the children of Giddel, +\v 57 the children of Shephatiah, the children of Hattil, the children of Pochereth Hazzebaim, the children of Ami. +\v 58 All the temple servants, and the children of Solomon’s servants, were three hundred ninety-two. +\p +\v 59 These were those who went up from Tel Melah, Tel Harsha, Cherub, Addan, and Immer; but they could not show their fathers’ houses and their offspring,\f + \fr 2:59 \ft or, seed\f* whether they were of Israel: +\v 60 the children of Delaiah, the children of Tobiah, the children of Nekoda, six hundred fifty-two. +\v 61 Of the children of the priests: the children of Habaiah, the children of Hakkoz, and the children of Barzillai, who took a wife of the daughters of Barzillai the Gileadite, and was called after their name. +\v 62 These sought their place among those who were registered by genealogy, but they were not found; therefore they were deemed disqualified and removed from the priesthood. +\v 63 The governor told them that they should not eat of the most holy things until a priest stood up to serve with Urim and with Thummim. +\p +\v 64 The whole assembly together was forty-two thousand three hundred sixty, +\v 65 in addition to their male servants and their female servants, of whom there were seven thousand three hundred thirty-seven; and they had two hundred singing men and singing women. +\v 66 Their horses were seven hundred thirty-six; their mules, two hundred forty-five; +\v 67 their camels, four hundred thirty-five; their donkeys, six thousand seven hundred twenty. +\p +\v 68 Some of the heads of fathers’ households, when they came to Yahweh’s house which is in Jerusalem, offered willingly for God’s house to set it up in its place. +\v 69 They gave according to their ability into the treasury of the work sixty-one thousand darics of gold,\f + \fr 2:69 \ft a daric was a gold coin issued by a Persian king, weighing about 8.4 grams or about 0.27 troy ounces each.\f* five thousand minas\f + \fr 2:69 \ft A mina is about 600 grams or 1.3 U. S. pounds, so 5,000 minas is about 3 metric tons.\f* of silver, and one hundred priests’ garments. +\p +\v 70 So the priests and the Levites, with some of the people, the singers, the gatekeepers, and the temple servants, lived in their cities, and all Israel in their cities. +\c 3 +\p +\v 1 When the seventh month had come, and the children of Israel were in the cities, the people gathered themselves together as one man to Jerusalem. +\v 2 Then Jeshua the son of Jozadak stood up with his brothers the priests and Zerubbabel the son of Shealtiel and his relatives, and built the altar of the God of Israel, to offer burnt offerings on it, as it is written in the law of Moses the man of God. +\v 3 In spite of their fear because of the peoples of the surrounding lands, they set the altar on its base; and they offered burnt offerings on it to Yahweh, even burnt offerings morning and evening. +\v 4 They kept the feast of booths, as it is written, and offered the daily burnt offerings by number, according to the ordinance, as the duty of every day required; +\v 5 and afterward the continual burnt offering, the offerings of the new moons, of all the set feasts of Yahweh that were consecrated, and of everyone who willingly offered a free will offering to Yahweh. +\v 6 From the first day of the seventh month, they began to offer burnt offerings to Yahweh; but the foundation of Yahweh’s temple was not yet laid. +\v 7 They also gave money to the masons and to the carpenters. They also gave food, drink, and oil to the people of Sidon and Tyre to bring cedar trees from Lebanon to the sea, to Joppa, according to the grant that they had from Cyrus King of Persia. +\p +\v 8 Now in the second year of their coming to God’s house at Jerusalem, in the second month, Zerubbabel the son of Shealtiel, Jeshua the son of Jozadak, and the rest of their brothers the priests and the Levites, and all those who had come out of the captivity to Jerusalem, began the work and appointed the Levites, from twenty years old and upward, to have the oversight of the work of Yahweh’s house. +\v 9 Then Jeshua stood with his sons and his brothers, Kadmiel and his sons, the sons of Judah, together to have the oversight of the workmen in God’s house: the sons of Henadad, with their sons and their brothers the Levites. +\p +\v 10 When the builders laid the foundation of Yahweh’s temple, they set the priests in their vestments with trumpets, with the Levites the sons of Asaph with cymbals, to praise Yahweh, according to the directions of David king of Israel. +\v 11 They sang to one another in praising and giving thanks to Yahweh, “For he is good, for his loving kindness endures forever toward Israel.” All the people shouted with a great shout, when they praised Yahweh, because the foundation of Yahweh’s house had been laid. +\p +\v 12 But many of the priests and Levites and heads of fathers’ households, the old men who had seen the first house, when the foundation of this house was laid before their eyes, wept with a loud voice. Many also shouted aloud for joy, +\v 13 so that the people could not discern the noise of the shout of joy from the noise of the weeping of the people; for the people shouted with a loud shout, and the noise was heard far away. +\c 4 +\p +\v 1 Now when the adversaries of Judah and Benjamin heard that the children of the captivity were building a temple to Yahweh, the God of Israel, +\v 2 they came near to Zerubbabel, and to the heads of fathers’ households, and said to them, “Let us build with you, for we seek your God as you do; and we have been sacrificing to him since the days of Esar Haddon king of Assyria, who brought us up here.” +\p +\v 3 But Zerubbabel, Jeshua, and the rest of the heads of fathers’ households of Israel said to them, “You have nothing to do with us in building a house to our God; but we ourselves together will build to Yahweh, the God of Israel, as King Cyrus the king of Persia has commanded us.” +\p +\v 4 Then the people of the land weakened the hands of the people of Judah, and troubled them in building. +\v 5 They hired counselors against them to frustrate their purpose all the days of Cyrus king of Persia, even until the reign of Darius king of Persia. +\v 6 In the reign of Ahasuerus, in the beginning of his reign, they wrote an accusation against the inhabitants of Judah and Jerusalem. +\p +\v 7 In the days of Artaxerxes, Bishlam, Mithredath, Tabeel, and the rest of his companions wrote to Artaxerxes king of Persia; and the writing of the letter was written in Syrian and delivered in the Syrian language. +\v 8 Rehum the chancellor and Shimshai the scribe wrote a letter against Jerusalem to Artaxerxes the king as follows. +\v 9 Then Rehum the chancellor, Shimshai the scribe, and the rest of their companions, the Dinaites, and the Apharsathchites, the Tarpelites, the Apharsites, the Archevites, the Babylonians, the Shushanchites, the Dehaites, the Elamites, +\v 10 and the rest of the nations whom the great and noble Osnappar brought over and settled in the city of Samaria, and in the rest of the country beyond the River, and so forth, wrote. +\p +\v 11 This is the copy of the letter that they sent: +\b +\mi To King Artaxerxes, from your servants, the people beyond the River. +\pi1 +\v 12 Be it known to the king that the Jews who came up from you have come to us to Jerusalem. They are building the rebellious and bad city, and have finished the walls and repaired the foundations. +\v 13 Be it known now to the king that if this city is built and the walls finished, they will not pay tribute, custom, or toll, and in the end it will be hurtful to the kings. +\v 14 Now because we eat the salt of the palace and it is not appropriate for us to see the king’s dishonor, therefore we have sent and informed the king, +\v 15 that search may be made in the book of the records of your fathers. You will see in the book of the records, and know that this city is a rebellious city, and hurtful to kings and provinces, and that they have started rebellions within it in the past. That is why this city was destroyed. +\v 16 We inform the king that if this city is built and the walls finished, then you will have no possession beyond the River. +\b +\p +\v 17 Then the king sent an answer to Rehum the chancellor, and to Shimshai the scribe, and to the rest of their companions who live in Samaria, and in the rest of the country beyond the River: +\b +\mi Peace. +\b +\pi1 +\v 18 The letter which you sent to us has been plainly read before me. +\v 19 I decreed, and search has been made, and it was found that this city has made insurrection against kings in the past, and that rebellion and revolts have been made in it. +\v 20 There have also been mighty kings over Jerusalem who have ruled over all the country beyond the River; and tribute, custom, and toll was paid to them. +\v 21 Make a decree now to cause these men to cease, and that this city not be built until a decree is made by me. +\v 22 Be careful that you not be slack doing so. Why should damage grow to the hurt of the kings? +\b +\p +\v 23 Then when the copy of King Artaxerxes’ letter was read before Rehum, Shimshai the scribe, and their companions, they went in haste to Jerusalem to the Jews, and made them to cease by force of arms. +\v 24 Then work stopped on God’s house which is at Jerusalem. It stopped until the second year of the reign of Darius king of Persia. +\c 5 + +\p +\v 1 Now the prophets, Haggai the prophet and Zechariah the son of Iddo, prophesied to the Jews who were in Judah and Jerusalem. They prophesied to them in the name of the God of Israel. +\v 2 Then Zerubbabel the son of Shealtiel, and Jeshua the son of Jozadak rose up and began to build God’s house which is at Jerusalem; and with them were the prophets of God, helping them. +\p +\v 3 At the same time Tattenai, the governor beyond the River, came to them, with Shetharbozenai and their companions, and asked them, “Who gave you a decree to build this house and to finish this wall?” +\v 4 They also asked for the names of the men who were making this building. +\v 5 But the eye of their God was on the elders of the Jews, and they didn’t make them cease until the matter should come to Darius, and an answer should be returned by letter concerning it. +\p +\v 6 The copy of the letter that Tattenai, the governor beyond the River, and Shetharbozenai, and his companions the Apharsachites who were beyond the River, sent to Darius the king follows. +\v 7 They sent a letter to him, in which was written: +\b +\mi To Darius the king, all peace. +\pi1 +\v 8 Be it known to the king that we went into the province of Judah, to the house of the great God, which is being built with great stones and timber is laid in the walls. This work goes on with diligence and prospers in their hands. +\v 9 Then we asked those elders, and said to them thus, “Who gave you a decree to build this house, and to finish this wall?” +\v 10 We asked them their names also, to inform you that we might write the names of the men who were at their head. +\v 11 Thus they returned us answer, saying, “We are the servants of the God of heaven and earth and are building the house that was built these many years ago, which a great king of Israel built and finished. +\v 12 But after our fathers had provoked the God of heaven to wrath, he gave them into the hand of Nebuchadnezzar king of Babylon, the Chaldean, who destroyed this house and carried the people away into Babylon. +\v 13 But in the first year of Cyrus king of Babylon, Cyrus the king made a decree to build this house of God. +\v 14 The gold and silver vessels of God’s house, which Nebuchadnezzar took out of the temple that was in Jerusalem and brought into the temple of Babylon, those Cyrus the king also took out of the temple of Babylon, and they were delivered to one whose name was Sheshbazzar, whom he had made governor. +\v 15 He said to him, ‘Take these vessels, go, put them in the temple that is in Jerusalem, and let God’s house be built in its place.’ +\v 16 Then the same Sheshbazzar came and laid the foundations of God’s house which is in Jerusalem. Since that time even until now it has been being built, and yet it is not completed. +\pi1 +\v 17 Now therefore, if it seems good to the king, let a search be made in the king’s treasure house, which is there at Babylon, whether it is so that a decree was made by Cyrus the king to build this house of God at Jerusalem; and let the king send his pleasure to us concerning this matter.” +\c 6 +\p +\v 1 Then Darius the king made a decree, and the house of the archives, where the treasures were laid up in Babylon, was searched. +\v 2 A scroll was found at Achmetha, in the palace that is in the province of Media, and in it this was written for a record: +\b +\pi1 +\v 3 In the first year of Cyrus the king, Cyrus the king made a decree: Concerning God’s house at Jerusalem, let the house be built, the place where they offer sacrifices, and let its foundations be strongly laid, with its height sixty cubits\f + \fr 6:3 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width sixty cubits; +\v 4 with three courses of great stones and a course of new timber. Let the expenses be given out of the king’s house. +\v 5 Also let the gold and silver vessels of God’s house, which Nebuchadnezzar took out of the temple which is at Jerusalem and brought to Babylon, be restored and brought again to the temple which is at Jerusalem, everything to its place. You shall put them in God’s house. +\pi1 +\v 6 Now therefore, Tattenai, governor beyond the River, Shetharbozenai, and your companions the Apharsachites, who are beyond the River, you must stay far from there. +\v 7 Leave the work of this house of God alone; let the governor of the Jews and the elders of the Jews build this house of God in its place. +\v 8 Moreover I make a decree regarding what you shall do for these elders of the Jews for the building of this house of God: that of the king’s goods, even of the tribute beyond the River, expenses must be given with all diligence to these men, that they not be hindered. +\v 9 That which they have need of, including young bulls, rams, and lambs, for burnt offerings to the God of heaven; also wheat, salt, wine, and oil, according to the word of the priests who are at Jerusalem, let it be given them day by day without fail, +\v 10 that they may offer sacrifices of pleasant aroma to the God of heaven, and pray for the life of the king and of his sons. +\v 11 I have also made a decree that whoever alters this message, let a beam be pulled out from his house, and let him be lifted up and fastened on it; and let his house be made a dunghill for this. +\v 12 May the God who has caused his name to dwell there overthrow all kings and peoples who stretch out their hand to alter this, to destroy this house of God which is at Jerusalem. I Darius have made a decree. Let it be done with all diligence. +\b +\p +\v 13 Then Tattenai, the governor beyond the River, Shetharbozenai, and their companions did accordingly with all diligence, because Darius the king had sent a decree. +\p +\v 14 The elders of the Jews built and prospered, through the prophesying of Haggai the prophet and Zechariah the son of Iddo. They built and finished it, according to the commandment of the God of Israel, and according to the decree of Cyrus, Darius, and Artaxerxes king of Persia. +\v 15 This house was finished on the third day of the month Adar, which was in the sixth year of the reign of Darius the king. +\p +\v 16 The children of Israel, the priests, the Levites, and the rest of the children of the captivity, kept the dedication of this house of God with joy. +\v 17 They offered at the dedication of this house of God one hundred bulls, two hundred rams, four hundred lambs; and for a sin offering for all Israel, twelve male goats, according to the number of the tribes of Israel. +\v 18 They set the priests in their divisions and the Levites in their courses, for the service of God which is at Jerusalem, as it is written in the book of Moses. +\p +\v 19 The children of the captivity kept the Passover on the fourteenth day of the first month. +\v 20 Because the priests and the Levites had purified themselves together, all of them were pure. They killed the Passover for all the children of the captivity, for their brothers the priests, and for themselves. +\v 21 The children of Israel who had returned out of the captivity, and all who had separated themselves to them from the filthiness of the nations of the land to seek Yahweh, the God of Israel, ate, +\v 22 and kept the feast of unleavened bread seven days with joy; because Yahweh had made them joyful, and had turned the heart of the king of Assyria to them, to strengthen their hands in the work of God, the God of Israel’s house. +\c 7 +\p +\v 1 Now after these things, in the reign of Artaxerxes king of Persia, Ezra the son of Seraiah, the son of Azariah, the son of Hilkiah, +\v 2 the son of Shallum, the son of Zadok, the son of Ahitub, +\v 3 the son of Amariah, the son of Azariah, the son of Meraioth, +\v 4 the son of Zerahiah, the son of Uzzi, the son of Bukki, +\v 5 the son of Abishua, the son of Phinehas, the son of Eleazar, the son of Aaron the chief priest— +\v 6 this Ezra went up from Babylon. He was a skilled scribe in the law of Moses, which Yahweh, the God of Israel, had given; and the king granted him all his request, according to Yahweh his God’s hand on him. +\v 7 Some of the children of Israel, including some of the priests, the Levites, the singers, the gatekeepers, and the temple servants went up to Jerusalem in the seventh year of Artaxerxes the king. +\v 8 He came to Jerusalem in the fifth month, which was in the seventh year of the king. +\v 9 For on the first day of the first month he began to go up from Babylon; and on the first day of the fifth month he came to Jerusalem, according to the good hand of his God on him. +\v 10 For Ezra had set his heart to seek Yahweh’s law, and to do it, and to teach statutes and ordinances in Israel. +\p +\v 11 Now this is the copy of the letter that King Artaxerxes gave to Ezra the priest, the scribe, even the scribe of the words of Yahweh’s commandments, and of his statutes to Israel: +\b +\mi +\v 12 Artaxerxes, king of kings, +\mi To Ezra the priest, the scribe of the law of the perfect God of heaven. +\pi1 Now +\v 13 I make a decree that all those of the people of Israel and their priests and the Levites in my realm, who intend of their own free will to go to Jerusalem, go with you. +\v 14 Because you are sent by the king and his seven counselors to inquire concerning Judah and Jerusalem, according to the law of your God which is in your hand, +\v 15 and to carry the silver and gold, which the king and his counselors have freely offered to the God of Israel, whose habitation is in Jerusalem, +\v 16 and all the silver and gold that you will find in all the province of Babylon, with the free will offering of the people and of the priests, offering willingly for the house of their God which is in Jerusalem. +\v 17 Therefore you shall with all diligence buy with this money bulls, rams, and lambs with their meal offerings and their drink offerings, and shall offer them on the altar of the house of your God which is in Jerusalem. +\v 18 Whatever seems good to you and to your brothers to do with the rest of the silver and the gold, do that according to the will of your God. +\v 19 The vessels that are given to you for the service of the house of your God, deliver before the God of Jerusalem. +\v 20 Whatever more will be needed for the house of your God, which you may have occasion to give, give it out of the king’s treasure house. +\pi1 +\v 21 I, even I, Artaxerxes the king, make a decree to all the treasurers who are beyond the River, that whatever Ezra the priest, the scribe of the law of the God of heaven, requires of you, it shall be done with all diligence, +\v 22 up to one hundred talents\f + \fr 7:22 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of silver, and to one hundred cors\f + \fr 7:22 \ft 1 cor is the same as a homer, or about 55.9 U. S. gallons (liquid) or 211 liters or 6 bushels.\f* of wheat, and to one hundred baths\f + \fr 7:22 \ft 1 bath is one tenth of a cor, or about 5.6 U. S. gallons or 21 liters or 2.4 pecks. 100 baths would be about 2,100 liters.\f* of wine, and to one hundred baths of oil, and salt without prescribing how much. +\v 23 Whatever is commanded by the God of heaven, let it be done exactly for the house of the God of heaven; for why should there be wrath against the realm of the king and his sons? +\pi1 +\v 24 Also we inform you that it shall not be lawful to impose tribute, custom, or toll on any of the priests, Levites, singers, gatekeepers, temple servants, or laborers of this house of God. +\pi1 +\v 25 You, Ezra, according to the wisdom of your God that is in your hand, appoint magistrates and judges who may judge all the people who are beyond the River, who all know the laws of your God; and teach him who doesn’t know them. +\v 26 Whoever will not do the law of your God and the law of the king, let judgment be executed on him with all diligence, whether it is to death, or to banishment, or to confiscation of goods, or to imprisonment. +\b +\p +\v 27 Blessed be Yahweh, the God of our fathers, who has put such a thing as this in the king’s heart, to beautify Yahweh’s house which is in Jerusalem; +\v 28 and has extended loving kindness to me before the king and his counselors, and before all the king’s mighty princes. I was strengthened according to Yahweh my God’s hand on me, and I gathered together chief men out of Israel to go up with me. +\c 8 +\p +\v 1 Now these are the heads of their fathers’ households, and this is the genealogy of those who went up with me from Babylon, in the reign of Artaxerxes the king: +\li1 +\v 2 Of the sons of Phinehas, Gershom. +\li1 Of the sons of Ithamar, Daniel. +\li1 Of the sons of David, Hattush. +\li1 +\v 3 Of the sons of Shecaniah, of the sons of Parosh, Zechariah; and with him were listed by genealogy of the males one hundred fifty. +\li1 +\v 4 Of the sons of Pahathmoab, Eliehoenai the son of Zerahiah; and with him two hundred males. +\li1 +\v 5 Of the sons of Shecaniah, the son of Jahaziel; and with him three hundred males. +\li1 +\v 6 Of the sons of Adin, Ebed the son of Jonathan; and with him fifty males. +\li1 +\v 7 Of the sons of Elam, Jeshaiah the son of Athaliah; and with him seventy males. +\li1 +\v 8 Of the sons of Shephatiah, Zebadiah the son of Michael; and with him eighty males. +\li1 +\v 9 Of the sons of Joab, Obadiah the son of Jehiel; and with him two hundred eighteen males. +\li1 +\v 10 Of the sons of Shelomith, the son of Josiphiah; and with him one hundred sixty males. +\li1 +\v 11 Of the sons of Bebai, Zechariah the son of Bebai; and with him twenty-eight males. +\li1 +\v 12 Of the sons of Azgad, Johanan the son of Hakkatan; and with him one hundred ten males. +\li1 +\v 13 Of the sons of Adonikam, who were the last, their names are: Eliphelet, Jeuel, and Shemaiah; and with them sixty males. +\li1 +\v 14 Of the sons of Bigvai, Uthai and Zabbud; and with them seventy males. +\p +\v 15 I gathered them together to the river that runs to Ahava; and there we encamped three days. Then I looked around at the people and the priests, and found there were none of the sons of Levi. +\v 16 Then I sent for Eliezer, for Ariel, for Shemaiah, for Elnathan, for Jarib, for Elnathan, for Nathan, for Zechariah, and for Meshullam, chief men; also for Joiarib and for Elnathan, who were teachers. +\v 17 I sent them out to Iddo the chief at the place Casiphia; and I told them what they should tell Iddo and his brothers the temple servants at the place Casiphia, that they should bring to us ministers for the house of our God. +\v 18 According to the good hand of our God on us they brought us a man of discretion, of the sons of Mahli, the son of Levi, the son of Israel, namely Sherebiah, with his sons and his brothers, eighteen; +\v 19 and Hashabiah, and with him Jeshaiah of the sons of Merari, his brothers and their sons, twenty; +\v 20 and of the temple servants, whom David and the princes had given for the service of the Levites, two hundred twenty temple servants. All of them were mentioned by name. +\p +\v 21 Then I proclaimed a fast there at the river Ahava, that we might humble ourselves before our God, to seek from him a straight way for us, for our little ones, and for all our possessions. +\v 22 For I was ashamed to ask of the king a band of soldiers and horsemen to help us against the enemy on the way, because we had spoken to the king, saying, “The hand of our God is on all those who seek him, for good; but his power and his wrath is against all those who forsake him.” +\v 23 So we fasted and begged our God for this, and he granted our request. +\p +\v 24 Then I set apart twelve of the chiefs of the priests, even Sherebiah, Hashabiah, and ten of their brothers with them, +\v 25 and weighed to them the silver, the gold, and the vessels, even the offering for the house of our God, which the king, his counselors, his princes, and all Israel there present, had offered. +\v 26 I weighed into their hand six hundred fifty talents of silver,\f + \fr 8:26 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* one hundred talents of silver vessels, one hundred talents of gold, +\v 27 twenty bowls of gold weighing one thousand darics,\f + \fr 8:27 \ft a daric was a gold coin issued by a Persian king, weighing about 8.4 grams or about 0.27 troy ounces each.\f* and two vessels of fine bright bronze, precious as gold. +\v 28 I said to them, “You are holy to Yahweh, and the vessels are holy. The silver and the gold are a free will offering to Yahweh, the God of your fathers. +\v 29 Watch and keep them until you weigh them before the chiefs of the priests, the Levites, and the princes of the fathers’ households of Israel at Jerusalem, in the rooms of Yahweh’s house.” +\p +\v 30 So the priests and the Levites received the weight of the silver, the gold, and the vessels, to bring them to Jerusalem to the house of our God. +\p +\v 31 Then we departed from the river Ahava on the twelfth day of the first month, to go to Jerusalem. The hand of our God was on us, and he delivered us from the hand of the enemy and the bandits by the way. +\v 32 We came to Jerusalem, and stayed there three days. +\v 33 On the fourth day the silver and the gold and the vessels were weighed in the house of our God into the hand of Meremoth the son of Uriah the priest; and with him was Eleazar the son of Phinehas; and with them were Jozabad the son of Jeshua, and Noadiah the son of Binnui, the Levites. +\v 34 Everything was counted and weighed; and all the weight was written at that time. +\p +\v 35 The children of the captivity, who had come out of exile, offered burnt offerings to the God of Israel: twelve bulls for all Israel, ninety-six rams, seventy-seven lambs, and twelve male goats for a sin offering. All this was a burnt offering to Yahweh. +\v 36 They delivered the king’s commissions to the king’s local governors and to the governors beyond the River. So they supported the people and God’s house. +\c 9 +\p +\v 1 Now when these things were done, the princes came near to me, saying, “The people of Israel, the priests, and the Levites have not separated themselves from the peoples of the lands, following their abominations, even those of the Canaanites, the Hittites, the Perizzites, the Jebusites, the Ammonites, the Moabites, the Egyptians, and the Amorites. +\v 2 For they have taken of their daughters for themselves and for their sons, so that the holy offspring have mixed themselves with the peoples of the lands. Yes, the hand of the princes and rulers has been chief in this trespass.” +\p +\v 3 When I heard this thing, I tore my garment and my robe, and pulled the hair out of my head and of my beard, and sat down confounded. +\v 4 Then everyone who trembled at the words of the God of Israel were assembled to me because of the trespass of the exiles; and I sat confounded until the evening offering. +\p +\v 5 At the evening offering I rose up from my humiliation, even with my garment and my robe torn; and I fell on my knees, and spread out my hands to Yahweh my God; +\v 6 and I said, “My God, I am ashamed and blush to lift up my face to you, my God, for our iniquities have increased over our head, and our guiltiness has grown up to the heavens. +\v 7 Since the days of our fathers we have been exceedingly guilty to this day; and for our iniquities we, our kings, and our priests have been delivered into the hand of the kings of the lands, to the sword, to captivity, to plunder, and to confusion of face, as it is this day. +\v 8 Now for a little moment grace has been shown from Yahweh our God, to leave us a remnant to escape, and to give us a stake in his holy place, that our God may lighten our eyes, and revive us a little in our bondage. +\v 9 For we are bondservants; yet our God has not forsaken us in our bondage, but has extended loving kindness to us in the sight of the kings of Persia, to revive us, to set up the house of our God, and to repair its ruins, and to give us a wall in Judah and in Jerusalem. +\p +\v 10 “Now, our God, what shall we say after this? For we have forsaken your commandments, +\v 11 which you have commanded by your servants the prophets, saying, ‘The land to which you go to possess is an unclean land through the uncleanness of the peoples of the lands, through their abominations, which have filled it from one end to another with their filthiness. +\v 12 Now therefore don’t give your daughters to their sons. Don’t take their daughters to your sons, nor seek their peace or their prosperity forever, that you may be strong and eat the good of the land, and leave it for an inheritance to your children forever.’ +\p +\v 13 “After all that has come on us for our evil deeds and for our great guilt, since you, our God, have punished us less than our iniquities deserve, and have given us such a remnant, +\v 14 shall we again break your commandments, and join ourselves with the peoples that do these abominations? Wouldn’t you be angry with us until you had consumed us, so that there would be no remnant, nor any to escape? +\v 15 Yahweh, the God of Israel, you are righteous; for we are left a remnant that has escaped, as it is today. Behold,\f + \fr 9:15 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* we are before you in our guiltiness; for no one can stand before you because of this.” +\c 10 + +\p +\v 1 Now while Ezra prayed and made confession, weeping and casting himself down before God’s house, there was gathered together to him out of Israel a very great assembly of men and women and children; for the people wept very bitterly. +\v 2 Shecaniah the son of Jehiel, one of the sons of Elam, answered Ezra, “We have trespassed against our God, and have married foreign women of the peoples of the land. Yet now there is hope for Israel concerning this thing. +\v 3 Now therefore let’s make a covenant with our God to put away all the wives and those who are born of them, according to the counsel of my lord and of those who tremble at the commandment of our God. Let it be done according to the law. +\v 4 Arise, for the matter belongs to you and we are with you. Be courageous, and do it.” +\p +\v 5 Then Ezra arose, and made the chiefs of the priests, the Levites, and all Israel to swear that they would do according to this word. So they swore. +\v 6 Then Ezra rose up from before God’s house, and went into the room of Jehohanan the son of Eliashib. When he came there, he didn’t eat bread or drink water, for he mourned because of the trespass of the exiles. +\v 7 They made a proclamation throughout Judah and Jerusalem to all the children of the captivity, that they should gather themselves together to Jerusalem; +\v 8 and that whoever didn’t come within three days, according to the counsel of the princes and the elders, all his possessions should be forfeited, and he himself separated from the assembly of the captivity. +\p +\v 9 Then all the men of Judah and Benjamin gathered themselves together to Jerusalem within the three days. It was the ninth month, on the twentieth day of the month; and all the people sat in the wide place in front of God’s house, trembling because of this matter, and because of the great rain. +\p +\v 10 Ezra the priest stood up and said to them, “You have trespassed, and have married foreign women, increasing the guilt of Israel. +\v 11 Now therefore make confession to Yahweh, the God of your fathers and do his pleasure. Separate yourselves from the peoples of the land and from the foreign women.” +\p +\v 12 Then all the assembly answered with a loud voice, “We must do as you have said concerning us. +\v 13 But the people are many, and it is a time of much rain, and we are not able to stand outside. This is not a work of one day or two, for we have greatly transgressed in this matter. +\v 14 Now let our princes be appointed for all the assembly, and let all those who are in our cities who have married foreign women come at appointed times, and with them the elders of every city and its judges, until the fierce wrath of our God is turned from us, until this matter is resolved.” +\p +\v 15 Only Jonathan the son of Asahel and Jahzeiah the son of Tikvah stood up against this; and Meshullam and Shabbethai the Levite helped them. +\p +\v 16 The children of the captivity did so. Ezra the priest, with certain heads of fathers’ households, after their fathers’ houses, and all of them by their names, were set apart; and they sat down in the first day of the tenth month to examine the matter. +\v 17 They finished with all the men who had married foreign women by the first day of the first month. +\p +\v 18 Among the sons of the priests there were found who had married foreign women: +\li1 of the sons of Jeshua, the son of Jozadak, and his brothers: Maaseiah, Eliezer, Jarib, and Gedaliah. +\v 19 They gave their hand that they would put away their wives; and being guilty, they offered a ram of the flock for their guilt. +\li1 +\v 20 Of the sons of Immer: Hanani and Zebadiah. +\li1 +\v 21 Of the sons of Harim: Maaseiah, Elijah, Shemaiah, Jehiel, and Uzziah. +\li1 +\v 22 Of the sons of Pashhur: Elioenai, Maaseiah, Ishmael, Nethanel, Jozabad, and Elasah. +\li1 +\v 23 Of the Levites: Jozabad, Shimei, Kelaiah (also called Kelita), Pethahiah, Judah, and Eliezer. +\li1 +\v 24 Of the singers: Eliashib. +\li1 Of the gatekeepers: Shallum, Telem, and Uri. +\li1 +\v 25 Of Israel: Of the sons of Parosh: Ramiah, Izziah, Malchijah, Mijamin, Eleazar, Malchijah, and Benaiah. +\li1 +\v 26 Of the sons of Elam: Mattaniah, Zechariah, Jehiel, Abdi, Jeremoth, and Elijah. +\li1 +\v 27 Of the sons of Zattu: Elioenai, Eliashib, Mattaniah, Jeremoth, Zabad, and Aziza. +\li1 +\v 28 Of the sons of Bebai: Jehohanan, Hananiah, Zabbai, and Athlai. +\li1 +\v 29 Of the sons of Bani: Meshullam, Malluch, Adaiah, Jashub, Sheal, and Jeremoth. +\li1 +\v 30 Of the sons of Pahathmoab: Adna, Chelal, Benaiah, Maaseiah, Mattaniah, Bezalel, Binnui, and Manasseh. +\li1 +\v 31 Of the sons of Harim: Eliezer, Isshijah, Malchijah, Shemaiah, Shimeon, +\v 32 Benjamin, Malluch, and Shemariah. +\li1 +\v 33 Of the sons of Hashum: Mattenai, Mattattah, Zabad, Eliphelet, Jeremai, Manasseh, and Shimei. +\li1 +\v 34 Of the sons of Bani: Maadai, Amram, Uel, +\v 35 Benaiah, Bedeiah, Cheluhi, +\v 36 Vaniah, Meremoth, Eliashib, +\v 37 Mattaniah, Mattenai, Jaasu, +\v 38 Bani, Binnui, Shimei, +\v 39 Shelemiah, Nathan, Adaiah, +\v 40 Machnadebai, Shashai, Sharai, +\v 41 Azarel, Shelemiah, Shemariah, +\v 42 Shallum, Amariah, and Joseph. +\li1 +\v 43 Of the sons of Nebo: Jeiel, Mattithiah, Zabad, Zebina, Iddo, Joel, and Benaiah. +\p +\v 44 All these had taken foreign wives. Some of them had wives by whom they had children. diff --git a/c-sharp/assets/WEB/16NEHengWEBUS.SFM b/c-sharp/assets/WEB/16NEHengWEBUS.SFM new file mode 100644 index 0000000000..5364741783 --- /dev/null +++ b/c-sharp/assets/WEB/16NEHengWEBUS.SFM @@ -0,0 +1,577 @@ +\id NEH World English Bible (WEB) +\ide UTF-8 +\h Nehemiah +\toc1 The Book of Nehemiah +\toc2 Nehemiah +\toc3 Nehemiah +\mt2 The Book of +\mt1 Nehemiah +\c 1 +\p +\v 1 The words of Nehemiah the son of Hacaliah. +\p Now in the month Chislev, in the twentieth year, as I was in Susa the palace, +\v 2 Hanani, one of my brothers, came, he and certain men out of Judah; and I asked them about the Jews who had escaped, who were left of the captivity, and concerning Jerusalem. +\v 3 They said to me, “The remnant who are left of the captivity there in the province are in great affliction and reproach. The wall of Jerusalem is also broken down, and its gates are burned with fire.” +\p +\v 4 When I heard these words, I sat down and wept, and mourned several days; and I fasted and prayed before the God\f + \fr 1:4 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* of heaven, +\v 5 and said, “I beg you, Yahweh,\f + \fr 1:5 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* the God of heaven, the great and awesome God who keeps covenant and loving kindness with those who love him and keep his commandments, +\v 6 let your ear now be attentive and your eyes open, that you may listen to the prayer of your servant which I pray before you at this time, day and night, for the children of Israel your servants, while I confess the sins of the children of Israel which we have sinned against you. Yes, I and my father’s house have sinned. +\v 7 We have dealt very corruptly against you, and have not kept the commandments, nor the statutes, nor the ordinances, which you commanded your servant Moses. +\p +\v 8 “Remember, I beg you, the word that you commanded your servant Moses, saying, ‘If you trespass, I will scatter you among the peoples; +\v 9 but if you return to me, and keep my commandments and do them, though your outcasts were in the uttermost part of the heavens, yet I will gather them from there, and will bring them to the place that I have chosen, to cause my name to dwell there.’ +\p +\v 10 “Now these are your servants and your people, whom you have redeemed by your great power and by your strong hand. +\v 11 Lord,\f + \fr 1:11 \ft The word translated “Lord” is “Adonai.”\f* I beg you, let your ear be attentive now to the prayer of your servant, and to the prayer of your servants who delight to fear your name; and please prosper your servant today, and grant him mercy in the sight of this man.” +\p Now I was cup bearer to the king. +\c 2 +\p +\v 1 In the month Nisan, in the twentieth year of Artaxerxes the king, when wine was before him, I picked up the wine, and gave it to the king. Now I had not been sad before in his presence. +\v 2 The king said to me, “Why is your face sad, since you are not sick? This is nothing else but sorrow of heart.” +\p Then I was very much afraid. +\v 3 I said to the king, “Let the king live forever! Why shouldn’t my face be sad, when the city, the place of my fathers’ tombs, lies waste, and its gates have been consumed with fire?” +\p +\v 4 Then the king said to me, “What is your request?” +\p So I prayed to the God of heaven. +\v 5 I said to the king, “If it pleases the king, and if your servant has found favor in your sight, I ask that you would send me to Judah, to the city of my fathers’ tombs, that I may build it.” +\p +\v 6 The king said to me (the queen was also sitting by him), “How long will your journey be? When will you return?” +\p So it pleased the king to send me, and I set a time for him. +\v 7 Moreover I said to the king, “If it pleases the king, let letters be given me to the governors beyond the River, that they may let me pass through until I come to Judah; +\v 8 and a letter to Asaph the keeper of the king’s forest, that he may give me timber to make beams for the gates of the citadel by the temple, for the wall of the city, and for the house that I will occupy.” +\p The king granted my requests, because of the good hand of my God on me. +\v 9 Then I came to the governors beyond the River, and gave them the king’s letters. Now the king had sent captains of the army and horsemen with me. +\v 10 When Sanballat the Horonite and Tobiah the Ammonite servant heard of it, it grieved them exceedingly, because a man had come to seek the welfare of the children of Israel. +\p +\v 11 So I came to Jerusalem, and was there three days. +\v 12 I arose in the night, I and a few men with me. I didn’t tell anyone what my God put into my heart to do for Jerusalem. There wasn’t any animal with me except the animal that I rode on. +\v 13 I went out by night by the valley gate toward the jackal’s well, then to the dung gate; and I inspected the walls of Jerusalem, which were broken down, and its gates were consumed with fire. +\v 14 Then I went on to the spring gate and to the king’s pool, but there was no place for the animal that was under me to pass. +\v 15 Then I went up in the night by the brook and inspected the wall; and I turned back, and entered by the valley gate, and so returned. +\v 16 The rulers didn’t know where I went, or what I did. I had not as yet told it to the Jews, nor to the priests, nor to the nobles, nor to the rulers, nor to the rest who did the work. +\p +\v 17 Then I said to them, “You see the bad situation that we are in, how Jerusalem lies waste, and its gates are burned with fire. Come, let’s build up the wall of Jerusalem, that we won’t be disgraced.” +\v 18 I told them about the hand of my God which was good on me, and also about the king’s words that he had spoken to me. +\p They said, “Let’s rise up and build.” So they strengthened their hands for the good work. +\p +\v 19 But when Sanballat the Horonite, Tobiah the Ammonite servant, and Geshem the Arabian, heard it, they ridiculed us and despised us, and said, “What is this thing that you are doing? Will you rebel against the king?” +\p +\v 20 Then I answered them, and said to them, “The God of heaven will prosper us. Therefore we, his servants, will arise and build; but you have no portion, nor right, nor memorial in Jerusalem.” +\c 3 +\p +\v 1 Then Eliashib the high priest rose up with his brothers the priests, and they built the sheep gate. They sanctified it, and set up its doors. They sanctified it even to the tower of Hammeah, to the tower of Hananel. +\v 2 Next to him the men of Jericho built. Next to them Zaccur the son of Imri built. +\p +\v 3 The sons of Hassenaah built the fish gate. They laid its beams, and set up its doors, its bolts, and its bars. +\v 4 Next to them, Meremoth the son of Uriah, the son of Hakkoz made repairs. Next to them, Meshullam the son of Berechiah, the son of Meshezabel made repairs. Next to them, Zadok the son of Baana made repairs. +\v 5 Next to them, the Tekoites made repairs; but their nobles didn’t put their necks to the Lord’s work. +\p +\v 6 Joiada the son of Paseah and Meshullam the son of Besodeiah repaired the old gate. They laid its beams and set up its doors, its bolts, and its bars. +\v 7 Next to them, Melatiah the Gibeonite and Jadon the Meronothite, the men of Gibeon and of Mizpah, repaired the residence of the governor beyond the River. +\v 8 Next to him, Uzziel the son of Harhaiah, goldsmiths, made repairs. Next to him, Hananiah, one of the perfumers, made repairs, and they fortified Jerusalem even to the wide wall. +\v 9 Next to them, Rephaiah the son of Hur, the ruler of half the district of Jerusalem, made repairs. +\v 10 Next to them, Jedaiah the son of Harumaph made repairs across from his house. Next to him, Hattush the son of Hashabneiah made repairs. +\v 11 Malchijah the son of Harim and Hasshub the son of Pahathmoab repaired another portion and the tower of the furnaces. +\v 12 Next to him, Shallum the son of Hallohesh, the ruler of half the district of Jerusalem, he and his daughters made repairs. +\p +\v 13 Hanun and the inhabitants of Zanoah repaired the valley gate. They built it, and set up its doors, its bolts, and its bars, and one thousand cubits\f + \fr 3:13 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* of the wall to the dung gate. +\p +\v 14 Malchijah the son of Rechab, the ruler of the district of Beth Haccherem, repaired the dung gate. He built it, and set up its doors, its bolts, and its bars. +\p +\v 15 Shallun the son of Colhozeh, the ruler of the district of Mizpah, repaired the spring gate. He built it, covered it, and set up its doors, its bolts, and its bars; and he repaired the wall of the pool of Shelah by the king’s garden, even to the stairs that go down from David’s city. +\v 16 After him, Nehemiah the son of Azbuk, the ruler of half the district of Beth Zur, made repairs to the place opposite the tombs of David, and to the pool that was made, and to the house of the mighty men. +\v 17 After him, the Levites—Rehum the son of Bani made repairs. Next to him, Hashabiah, the ruler of half the district of Keilah, made repairs for his district. +\v 18 After him, their brothers, Bavvai the son of Henadad, the ruler of half the district of Keilah made repairs. +\v 19 Next to him, Ezer the son of Jeshua, the ruler of Mizpah, repaired another portion across from the ascent to the armory at the turning of the wall. +\v 20 After him, Baruch the son of Zabbai earnestly repaired another portion, from the turning of the wall to the door of the house of Eliashib the high priest. +\v 21 After him, Meremoth the son of Uriah the son of Hakkoz repaired another portion, from the door of the house of Eliashib even to the end of the house of Eliashib. +\v 22 After him, the priests, the men of the surrounding area made repairs. +\v 23 After them, Benjamin and Hasshub made repairs across from their house. After them, Azariah the son of Maaseiah the son of Ananiah made repairs beside his own house. +\v 24 After him, Binnui the son of Henadad repaired another portion, from the house of Azariah to the turning of the wall, and to the corner. +\v 25 Palal the son of Uzai made repairs opposite the turning of the wall, and the tower that stands out from the upper house of the king, which is by the court of the guard. After him Pedaiah the son of Parosh made repairs. +\v 26 (Now the temple servants lived in Ophel, to the place opposite the water gate toward the east, and the tower that stands out.) +\v 27 After him the Tekoites repaired another portion, opposite the great tower that stands out, and to the wall of Ophel. +\p +\v 28 Above the horse gate, the priests made repairs, everyone across from his own house. +\v 29 After them, Zadok the son of Immer made repairs across from his own house. After him, Shemaiah the son of Shecaniah, the keeper of the east gate, made repairs. +\v 30 After him, Hananiah the son of Shelemiah, and Hanun, the sixth son of Zalaph, repaired another portion. After him, Meshullam the son of Berechiah made repairs across from his room. +\v 31 After him, Malchijah, one of the goldsmiths to the house of the temple servants, and of the merchants, made repairs opposite the gate of Hammiphkad and to the ascent of the corner. +\v 32 Between the ascent of the corner and the sheep gate, the goldsmiths and the merchants made repairs. +\c 4 +\p +\v 1 But when Sanballat heard that we were building the wall, he was angry, and was very indignant, and mocked the Jews. +\v 2 He spoke before his brothers and the army of Samaria, and said, “What are these feeble Jews doing? Will they fortify themselves? Will they sacrifice? Will they finish in a day? Will they revive the stones out of the heaps of rubbish, since they are burned?” +\p +\v 3 Now Tobiah the Ammonite was by him, and he said, “What they are building, if a fox climbed up it, he would break down their stone wall.” +\p +\v 4 “Hear, our God, for we are despised. Turn back their reproach on their own head. Give them up for a plunder in a land of captivity. +\v 5 Don’t cover their iniquity. Don’t let their sin be blotted out from before you; for they have insulted the builders.” +\p +\v 6 So we built the wall; and all the wall was joined together to half its height, for the people had a mind to work. +\p +\v 7 But when Sanballat, Tobiah, the Arabians, the Ammonites, and the Ashdodites heard that the repairing of the walls of Jerusalem went forward, and that the breaches began to be filled, they were very angry; +\v 8 and they all conspired together to come and fight against Jerusalem, and to cause confusion among us. +\v 9 But we made our prayer to our God, and set a watch against them day and night because of them. +\p +\v 10 Judah said, “The strength of the bearers of burdens is fading and there is much rubble, so that we are not able to build the wall.” +\v 11 Our adversaries said, “They will not know or see, until we come in among them and kill them, and cause the work to cease.” +\p +\v 12 When the Jews who lived by them came, they said to us ten times from all places, “Wherever you turn, they will attack us.” +\p +\v 13 Therefore I set guards in the lowest parts of the space behind the wall, in the open places. I set the people by family groups with their swords, their spears, and their bows. +\v 14 I looked, and rose up, and said to the nobles, to the rulers, and to the rest of the people, “Don’t be afraid of them! Remember the Lord, who is great and awesome, and fight for your brothers, your sons, your daughters, your wives, and your houses.” +\p +\v 15 When our enemies heard that it was known to us, and God had brought their counsel to nothing, all of us returned to the wall, everyone to his work. +\v 16 From that time forth, half of my servants did the work, and half of them held the spears, the shields, the bows, and the coats of mail; and the rulers were behind all the house of Judah. +\v 17 Those who built the wall, and those who bore burdens loaded themselves; everyone with one of his hands did the work, and with the other held his weapon. +\v 18 Among the builders, everyone wore his sword at his side, and so built. He who sounded the trumpet was by me. +\v 19 I said to the nobles, and to the rulers and to the rest of the people, “The work is great and widely spread out, and we are separated on the wall, far from one another. +\v 20 Wherever you hear the sound of the trumpet, rally there to us. Our God will fight for us.” +\p +\v 21 So we did the work. Half of the people held the spears from the rising of the morning until the stars appeared. +\v 22 Likewise at the same time I said to the people, “Let everyone with his servant lodge within Jerusalem, that in the night they may be a guard to us, and may labor in the day.” +\v 23 So neither I, nor my brothers, nor my servants, nor the men of the guard who followed me took off our clothes. Everyone took his weapon to the water. +\c 5 +\p +\v 1 Then there arose a great cry of the people and of their wives against their brothers the Jews. +\v 2 For there were some who said, “We, our sons and our daughters, are many. Let us get grain, that we may eat and live.” +\v 3 There were also some who said, “We are mortgaging our fields, our vineyards, and our houses. Let us get grain, because of the famine.” +\v 4 There were also some who said, “We have borrowed money for the king’s tribute using our fields and our vineyards as collateral. +\v 5 Yet now our flesh is as the flesh of our brothers, our children as their children. Behold,\f + \fr 5:5 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* we bring our sons and our daughters into bondage to be servants, and some of our daughters have been brought into bondage. It is also not in our power to help it, because other men have our fields and our vineyards.” +\p +\v 6 I was very angry when I heard their cry and these words. +\v 7 Then I consulted with myself, and contended with the nobles and the rulers, and said to them, “You exact usury, everyone of his brother.” I held a great assembly against them. +\v 8 I said to them, “We, after our ability, have redeemed our brothers the Jews that were sold to the nations; and would you even sell your brothers, and should they be sold to us?” Then they held their peace, and found not a word to say. +\v 9 Also I said, “The thing that you do is not good. Shouldn’t you walk in the fear of our God because of the reproach of the nations, our enemies? +\v 10 I likewise, my brothers and my servants, lend them money and grain. Please let us stop this usury. +\v 11 Please restore to them, even today, their fields, their vineyards, their olive groves, and their houses, also the hundredth part of the money, and of the grain, the new wine, and the oil, that you are charging them.” +\p +\v 12 Then they said, “We will restore them, and will require nothing of them. We will do so, even as you say.” +\p Then I called the priests, and took an oath of them, that they would do according to this promise. +\v 13 Also I shook out my lap, and said, “So may God shake out every man from his house, and from his labor, that doesn’t perform this promise; even may he be shaken out and emptied like this.” +\p All the assembly said, “Amen,” and praised Yahweh. The people did according to this promise. +\p +\v 14 Moreover from the time that I was appointed to be their governor in the land of Judah, from the twentieth year even to the thirty-second year of Artaxerxes the king, that is, twelve years, I and my brothers have not eaten the bread of the governor. +\v 15 But the former governors who were before me were supported by the people, and took bread and wine from them, plus forty shekels\f + \fr 5:15 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver; yes, even their servants ruled over the people, but I didn’t do so, because of the fear of God. +\v 16 Yes, I also continued in the work of this wall. We didn’t buy any land. All my servants were gathered there to the work. +\v 17 Moreover there were at my table, of the Jews and the rulers, one hundred fifty men, in addition to those who came to us from among the nations that were around us. +\v 18 Now that which was prepared for one day was one ox and six choice sheep. Also fowls were prepared for me, and once in ten days a store of all sorts of wine. Yet for all this, I didn’t demand the governor’s pay, because the bondage was heavy on this people. +\v 19 Remember me, my God, for all the good that I have done for this people. +\c 6 +\p +\v 1 Now when it was reported to Sanballat, Tobiah, Geshem the Arabian, and to the rest of our enemies that I had built the wall, and that there was no breach left in it (though even to that time I had not set up the doors in the gates), +\v 2 Sanballat and Geshem sent to me, saying, “Come! Let’s meet together in the villages in the plain of Ono.” But they intended to harm me. +\p +\v 3 I sent messengers to them, saying, “I am doing a great work, so that I can’t come down. Why should the work cease while I leave it and come down to you?” +\p +\v 4 They sent to me four times like this; and I answered them the same way. +\v 5 Then Sanballat sent his servant to me the same way the fifth time with an open letter in his hand, +\v 6 in which was written, “It is reported among the nations, and Gashmu says it, that you and the Jews intend to rebel. Because of that, you are building the wall. You would be their king, according to these words. +\v 7 You have also appointed prophets to proclaim of you at Jerusalem, saying, ‘There is a king in Judah!’ Now it will be reported to the king according to these words. Come now therefore, and let’s take counsel together.” +\p +\v 8 Then I sent to him, saying, “There are no such things done as you say, but you imagine them out of your own heart.” +\v 9 For they all would have made us afraid, saying, “Their hands will be weakened from the work, that it not be done.” But now, strengthen my hands. +\p +\v 10 I went to the house of Shemaiah the son of Delaiah the son of Mehetabel, who was shut in at his home; and he said, “Let us meet together in God’s house, within the temple, and let’s shut the doors of the temple; for they will come to kill you. Yes, in the night they will come to kill you.” +\p +\v 11 I said, “Should a man like me flee? Who is there that, being such as I, would go into the temple to save his life? I will not go in.” +\v 12 I discerned, and behold, God had not sent him, but he pronounced this prophecy against me. Tobiah and Sanballat had hired him. +\v 13 He was hired so that I would be afraid, do so, and sin, and that they might have material for an evil report, that they might reproach me. +\v 14 “Remember, my God, Tobiah and Sanballat according to these their works, and also the prophetess Noadiah and the rest of the prophets that would have put me in fear.” +\p +\v 15 So the wall was finished in the twenty-fifth day of Elul, in fifty-two days. +\v 16 When all our enemies heard of it, all the nations that were around us were afraid, and they lost their confidence; for they perceived that this work was done by our God. +\v 17 Moreover in those days the nobles of Judah sent many letters to Tobiah, and Tobiah’s letters came to them. +\v 18 For there were many in Judah sworn to him because he was the son-in-law of Shecaniah the son of Arah; and his son Jehohanan had taken the daughter of Meshullam the son of Berechiah as wife. +\v 19 Also they spoke of his good deeds before me, and reported my words to him. Tobiah sent letters to put me in fear. +\c 7 +\p +\v 1 Now when the wall was built and I had set up the doors, and the gatekeepers and the singers and the Levites were appointed, +\v 2 I put my brother Hanani, and Hananiah the governor of the fortress, in charge of Jerusalem; for he was a faithful man and feared God above many. +\v 3 I said to them, “Don’t let the gates of Jerusalem be opened until the sun is hot; and while they stand guard, let them shut the doors, and you bar them; and appoint watches of the inhabitants of Jerusalem, everyone in his watch, with everyone near his house.” +\p +\v 4 Now the city was wide and large; but the people were few therein, and the houses were not built. +\p +\v 5 My God put into my heart to gather together the nobles, and the rulers, and the people, that they might be listed by genealogy. I found the book of the genealogy of those who came up at the first, and I found this written in it: +\p +\v 6 These are the children of the province who went up out of the captivity of those who had been carried away, whom Nebuchadnezzar the king of Babylon had carried away, and who returned to Jerusalem and to Judah, everyone to his city, +\v 7 who came with Zerubbabel, Jeshua, Nehemiah, Azariah, Raamiah, Nahamani, Mordecai, Bilshan, Mispereth, Bigvai, Nehum, and Baanah. +\p The number of the men of the people of Israel: +\li1 +\v 8 The children of Parosh: two thousand one hundred seventy-two. +\li1 +\v 9 The children of Shephatiah: three hundred seventy-two. +\li1 +\v 10 The children of Arah: six hundred fifty-two. +\li1 +\v 11 The children of Pahathmoab, of the children of Jeshua and Joab: two thousand eight hundred eighteen. +\li1 +\v 12 The children of Elam: one thousand two hundred fifty-four. +\li1 +\v 13 The children of Zattu: eight hundred forty-five. +\li1 +\v 14 The children of Zaccai: seven hundred sixty. +\li1 +\v 15 The children of Binnui: six hundred forty-eight. +\li1 +\v 16 The children of Bebai: six hundred twenty-eight. +\li1 +\v 17 The children of Azgad: two thousand three hundred twenty-two. +\li1 +\v 18 The children of Adonikam: six hundred sixty-seven. +\li1 +\v 19 The children of Bigvai: two thousand sixty-seven. +\li1 +\v 20 The children of Adin: six hundred fifty-five. +\li1 +\v 21 The children of Ater: of Hezekiah, ninety-eight. +\li1 +\v 22 The children of Hashum: three hundred twenty-eight. +\li1 +\v 23 The children of Bezai: three hundred twenty-four. +\li1 +\v 24 The children of Hariph: one hundred twelve. +\li1 +\v 25 The children of Gibeon: ninety-five. +\li1 +\v 26 The men of Bethlehem and Netophah: one hundred eighty-eight. +\li1 +\v 27 The men of Anathoth: one hundred twenty-eight. +\li1 +\v 28 The men of Beth Azmaveth: forty-two. +\li1 +\v 29 The men of Kiriath Jearim, Chephirah, and Beeroth: seven hundred forty-three. +\li1 +\v 30 The men of Ramah and Geba: six hundred twenty-one. +\li1 +\v 31 The men of Michmas: one hundred twenty-two. +\li1 +\v 32 The men of Bethel and Ai: one hundred twenty-three. +\li1 +\v 33 The men of the other Nebo: fifty-two. +\li1 +\v 34 The children of the other Elam: one thousand two hundred fifty-four. +\li1 +\v 35 The children of Harim: three hundred twenty. +\li1 +\v 36 The children of Jericho: three hundred forty-five. +\li1 +\v 37 The children of Lod, Hadid, and Ono: seven hundred twenty-one. +\li1 +\v 38 The children of Senaah: three thousand nine hundred thirty. +\b +\li1 +\v 39 The priests: The children of Jedaiah, of the house of Jeshua: nine hundred seventy-three. +\li1 +\v 40 The children of Immer: one thousand fifty-two. +\li1 +\v 41 The children of Pashhur: one thousand two hundred forty-seven. +\li1 +\v 42 The children of Harim: one thousand seventeen. +\b +\li1 +\v 43 The Levites: the children of Jeshua, of Kadmiel, of the children of Hodevah: seventy-four. +\li1 +\v 44 The singers: the children of Asaph: one hundred forty-eight. +\li1 +\v 45 The gatekeepers: the children of Shallum, the children of Ater, the children of Talmon, the children of Akkub, the children of Hatita, the children of Shobai: one hundred thirty-eight. +\p +\v 46 The temple servants: the children of Ziha, the children of Hasupha, the children of Tabbaoth, +\v 47 the children of Keros, the children of Sia, the children of Padon, +\v 48 the children of Lebana, the children of Hagaba, the children of Salmai, +\v 49 the children of Hanan, the children of Giddel, the children of Gahar, +\v 50 the children of Reaiah, the children of Rezin, the children of Nekoda, +\v 51 the children of Gazzam, the children of Uzza, the children of Paseah, +\v 52 the children of Besai, the children of Meunim, the children of Nephushesim, +\v 53 the children of Bakbuk, the children of Hakupha, the children of Harhur, +\v 54 the children of Bazlith, the children of Mehida, the children of Harsha, +\v 55 the children of Barkos, the children of Sisera, the children of Temah, +\v 56 the children of Neziah, and the children of Hatipha. +\p +\v 57 The children of Solomon’s servants: the children of Sotai, the children of Sophereth, the children of Perida, +\v 58 the children of Jaala, the children of Darkon, the children of Giddel, +\v 59 the children of Shephatiah, the children of Hattil, the children of Pochereth Hazzebaim, and the children of Amon. +\v 60 All the temple servants and the children of Solomon’s servants were three hundred ninety-two. +\p +\v 61 These were those who went up from Tel Melah, Tel Harsha, Cherub, Addon, and Immer; but they could not show their fathers’ houses, nor their offspring,\f + \fr 7:61 \ft or, seed\f* whether they were of Israel: +\li1 +\v 62 The children of Delaiah, the children of Tobiah, the children of Nekoda: six hundred forty-two. +\li1 +\v 63 Of the priests: the children of Hobaiah, the children of Hakkoz, the children of Barzillai, who took a wife of the daughters of Barzillai the Gileadite, and was called after their name. +\p +\v 64 These searched for their genealogical records, but couldn’t find them. Therefore they were deemed disqualified and removed from the priesthood. +\v 65 The governor told them not to eat of the most holy things until a priest stood up to minister with Urim and Thummim. +\p +\v 66 The whole assembly together was forty-two thousand three hundred sixty, +\v 67 in addition to their male servants and their female servants, of whom there were seven thousand three hundred thirty-seven. They had two hundred forty-five singing men and singing women. +\v 68 Their horses were seven hundred thirty-six; their mules, two hundred forty-five; +\v 69 their camels, four hundred thirty-five; their donkeys, six thousand seven hundred twenty. +\p +\v 70 Some from among the heads of fathers’ households gave to the work. The governor gave to the treasury one thousand darics of gold,\f + \fr 7:70 \ft a daric was a gold coin issued by a Persian king, weighing about 8.4 grams or about 0.27 troy ounces each.\f* fifty basins, and five hundred thirty priests’ garments. +\v 71 Some of the heads of fathers’ households gave into the treasury of the work twenty thousand darics of gold, and two thousand two hundred minas\f + \fr 7:71 \ft A mina is about 600 grams or 1.3 U. S. pounds, so 2,200 minas is about 1.3 metric tons.\f* of silver. +\v 72 That which the rest of the people gave was twenty thousand darics of gold, plus two thousand minas of silver, and sixty-seven priests’ garments. +\p +\v 73 So the priests, the Levites, the gatekeepers, the singers, some of the people, the temple servants, and all Israel lived in their cities. +\p When the seventh month had come, the children of Israel were in their cities. +\c 8 +\p +\v 1 All the people gathered themselves together as one man into the wide place that was in front of the water gate; and they spoke to Ezra the scribe to bring the book of the law of Moses, which Yahweh had commanded to Israel. +\v 2 Ezra the priest brought the law before the assembly, both men and women, and all who could hear with understanding, on the first day of the seventh month. +\v 3 He read from it before the wide place that was in front of the water gate from early morning until midday, in the presence of the men and the women, and of those who could understand. The ears of all the people were attentive to the book of the law. +\v 4 Ezra the scribe stood on a pulpit of wood, which they had made for the purpose; and beside him stood Mattithiah, Shema, Anaiah, Uriah, Hilkiah, and Maaseiah, on his right hand; and on his left hand, Pedaiah, Mishael, Malchijah, Hashum, Hashbaddanah, Zechariah, and Meshullam. +\v 5 Ezra opened the book in the sight of all the people (for he was above all the people), and when he opened it, all the people stood up. +\v 6 Then Ezra blessed Yahweh, the great God. +\p All the people answered, “Amen, Amen,” with the lifting up of their hands. They bowed their heads, and worshiped Yahweh with their faces to the ground. +\v 7 Also Jeshua, Bani, Sherebiah, Jamin, Akkub, Shabbethai, Hodiah, Maaseiah, Kelita, Azariah, Jozabad, Hanan, Pelaiah, and the Levites, caused the people to understand the law; and the people stayed in their place. +\v 8 They read in the book, in the law of God, distinctly; and they gave the sense, so that they understood the reading. +\p +\v 9 Nehemiah, who was the governor, Ezra the priest and scribe, and the Levites who taught the people said to all the people, “Today is holy to Yahweh your God. Don’t mourn, nor weep.” For all the people wept when they heard the words of the law. +\v 10 Then he said to them, “Go your way. Eat the fat, drink the sweet, and send portions to him for whom nothing is prepared, for today is holy to our Lord. Don’t be grieved, for the joy of Yahweh is your strength.” +\p +\v 11 So the Levites calmed all the people, saying, “Hold your peace, for the day is holy. Don’t be grieved.” +\p +\v 12 All the people went their way to eat, to drink, to send portions, and to celebrate, because they had understood the words that were declared to them. +\p +\v 13 On the second day, the heads of fathers’ households of all the people, the priests, and the Levites were gathered together to Ezra the scribe, to study the words of the law. +\v 14 They found written in the law how Yahweh had commanded by Moses that the children of Israel should dwell in booths in the feast of the seventh month; +\v 15 and that they should publish and proclaim in all their cities and in Jerusalem, saying, “Go out to the mountain, and get olive branches, branches of wild olive, myrtle branches, palm branches, and branches of thick trees, to make temporary shelters,\f + \fr 8:15 \ft or, booths\f* as it is written.” +\p +\v 16 So the people went out and brought them, and made themselves temporary shelters,\f + \fr 8:16 \ft or, booths\f* everyone on the roof of his house, in their courts, in the courts of God’s house, in the wide place of the water gate, and in the wide place of Ephraim’s gate. +\v 17 All the assembly of those who had come back out of the captivity made temporary shelters\f + \fr 8:17 \ft or, booths\f* and lived in the temporary shelters, for since the days of Joshua the son of Nun to that day the children of Israel had not done so. There was very great gladness. +\v 18 Also day by day, from the first day to the last day, he read in the book of the law of God. They kept the feast seven days; and on the eighth day was a solemn assembly, according to the ordinance. +\c 9 +\p +\v 1 Now in the twenty-fourth day of this month the children of Israel were assembled with fasting, with sackcloth, and dirt on them. +\v 2 The offspring of Israel separated themselves from all foreigners and stood and confessed their sins and the iniquities of their fathers. +\v 3 They stood up in their place, and read in the book of the law of Yahweh their God a fourth part of the day; and a fourth part they confessed and worshiped Yahweh their God. +\v 4 Then Jeshua, Bani, Kadmiel, Shebaniah, Bunni, Sherebiah, Bani, and Chenani of the Levites stood up on the stairs, and cried with a loud voice to Yahweh their God. +\p +\v 5 Then the Levites, Jeshua, and Kadmiel, Bani, Hashabneiah, Sherebiah, Hodiah, Shebaniah, and Pethahiah, said, “Stand up and bless Yahweh your God from everlasting to everlasting! Blessed be your glorious name, which is exalted above all blessing and praise! +\v 6 You are Yahweh, even you alone. You have made heaven, the heaven of heavens, with all their army, the earth and all things that are on it, the seas and all that is in them, and you preserve them all. The army of heaven worships you. +\v 7 You are Yahweh, the God who chose Abram, brought him out of Ur of the Chaldees, gave him the name of Abraham, +\v 8 found his heart faithful before you, and made a covenant with him to give the land of the Canaanite, the Hittite, the Amorite, the Perizzite, the Jebusite, and the Girgashite, to give it to his offspring, and have performed your words, for you are righteous. +\p +\v 9 “You saw the affliction of our fathers in Egypt, and heard their cry by the Red Sea, +\v 10 and showed signs and wonders against Pharaoh, against all his servants, and against all the people of his land, for you knew that they dealt proudly against them, and made a name for yourself, as it is today. +\v 11 You divided the sea before them, so that they went through the middle of the sea on the dry land; and you cast their pursuers into the depths, as a stone into the mighty waters. +\v 12 Moreover, in a pillar of cloud you led them by day; and in a pillar of fire by night, to give them light in the way in which they should go. +\p +\v 13 “You also came down on Mount Sinai, and spoke with them from heaven, and gave them right ordinances and true laws, good statutes and commandments, +\v 14 and made known to them your holy Sabbath, and commanded them commandments, statutes, and a law, by Moses your servant, +\v 15 and gave them bread from the sky for their hunger, and brought water out of the rock for them for their thirst, and commanded them that they should go in to possess the land which you had sworn to give them. +\p +\v 16 “But they and our fathers behaved proudly, hardened their neck, didn’t listen to your commandments, +\v 17 and refused to obey. They weren’t mindful of your wonders that you did among them, but hardened their neck, and in their rebellion appointed a captain to return to their bondage. But you are a God ready to pardon, gracious and merciful, slow to anger, and abundant in loving kindness, and didn’t forsake them. +\v 18 Yes, when they had made themselves a molded calf, and said, ‘This is your God who brought you up out of Egypt,’ and had committed awful blasphemies, +\v 19 yet you in your manifold mercies didn’t forsake them in the wilderness. The pillar of cloud didn’t depart from over them by day, to lead them in the way; neither did the pillar of fire by night, to show them light, and the way in which they should go. +\v 20 You gave also your good Spirit to instruct them, and didn’t withhold your manna from their mouth, and gave them water for their thirst. +\p +\v 21 “Yes, forty years you sustained them in the wilderness. They lacked nothing. Their clothes didn’t grow old, and their feet didn’t swell. +\v 22 Moreover you gave them kingdoms and peoples, which you allotted according to their portions. So they possessed the land of Sihon, even the land of the king of Heshbon, and the land of Og king of Bashan. +\v 23 You also multiplied their children as the stars of the sky, and brought them into the land concerning which you said to their fathers that they should go in to possess it. +\p +\v 24 “So the children went in and possessed the land; and you subdued before them the inhabitants of the land, the Canaanites, and gave them into their hands, with their kings and the peoples of the land, that they might do with them as they pleased. +\v 25 They took fortified cities and a rich land, and possessed houses full of all good things, cisterns dug out, vineyards, olive groves, and fruit trees in abundance. So they ate, were filled, became fat, and delighted themselves in your great goodness. +\p +\v 26 “Nevertheless they were disobedient and rebelled against you, cast your law behind their back, killed your prophets that testified against them to turn them again to you, and they committed awful blasphemies. +\v 27 Therefore you delivered them into the hand of their adversaries, who distressed them. In the time of their trouble, when they cried to you, you heard from heaven; and according to your manifold mercies you gave them saviors who saved them out of the hands of their adversaries. +\v 28 But after they had rest, they did evil again before you; therefore you left them in the hands of their enemies, so that they had the dominion over them; yet when they returned and cried to you, you heard from heaven; and many times you delivered them according to your mercies, +\v 29 and testified against them, that you might bring them again to your law. Yet they were arrogant, and didn’t listen to your commandments, but sinned against your ordinances (which if a man does, he shall live in them), turned their backs, stiffened their neck, and would not hear. +\v 30 Yet many years you put up with them, and testified against them by your Spirit through your prophets. Yet they would not listen. Therefore you gave them into the hand of the peoples of the lands. +\p +\v 31 “Nevertheless in your manifold mercies you didn’t make a full end of them, nor forsake them; for you are a gracious and merciful God. +\p +\v 32 Now therefore, our God, the great, the mighty, and the awesome God, who keeps covenant and loving kindness, don’t let all the travail seem little before you that has come on us, on our kings, on our princes, on our priests, on our prophets, on our fathers, and on all your people, since the time of the kings of Assyria to this day. +\v 33 However you are just in all that has come on us; for you have dealt truly, but we have done wickedly. +\v 34 Also our kings, our princes, our priests, and our fathers have not kept your law, nor listened to your commandments and your testimonies with which you testified against them. +\v 35 For they have not served you in their kingdom, and in your great goodness that you gave them, and in the large and rich land which you gave before them. They didn’t turn from their wicked works. +\p +\v 36 “Behold, we are servants today, and as for the land that you gave to our fathers to eat its fruit and its good, behold, we are servants in it. +\v 37 It yields much increase to the kings whom you have set over us because of our sins. Also they have power over our bodies and over our livestock, at their pleasure, and we are in great distress. +\v 38 Yet for all this, we make a sure covenant, and write it; and our princes, our Levites, and our priests, seal it.” +\c 10 +\p +\v 1 Now those who sealed were: Nehemiah the governor, the son of Hacaliah, and Zedekiah, +\v 2 Seraiah, Azariah, Jeremiah, +\v 3 Pashhur, Amariah, Malchijah, +\v 4 Hattush, Shebaniah, Malluch, +\v 5 Harim, Meremoth, Obadiah, +\v 6 Daniel, Ginnethon, Baruch, +\v 7 Meshullam, Abijah, Mijamin, +\v 8 Maaziah, Bilgai, and Shemaiah. These were the priests. +\v 9 The Levites: Jeshua the son of Azaniah, Binnui of the sons of Henadad, Kadmiel; +\v 10 and their brothers, Shebaniah, Hodiah, Kelita, Pelaiah, Hanan, +\v 11 Mica, Rehob, Hashabiah, +\v 12 Zaccur, Sherebiah, Shebaniah, +\v 13 Hodiah, Bani, and Beninu. +\v 14 The chiefs of the people: Parosh, Pahathmoab, Elam, Zattu, Bani, +\v 15 Bunni, Azgad, Bebai, +\v 16 Adonijah, Bigvai, Adin, +\v 17 Ater, Hezekiah, Azzur, +\v 18 Hodiah, Hashum, Bezai, +\v 19 Hariph, Anathoth, Nobai, +\v 20 Magpiash, Meshullam, Hezir, +\v 21 Meshezabel, Zadok, Jaddua, +\v 22 Pelatiah, Hanan, Anaiah, +\v 23 Hoshea, Hananiah, Hasshub, +\v 24 Hallohesh, Pilha, Shobek, +\v 25 Rehum, Hashabnah, Maaseiah, +\v 26 Ahiah, Hanan, Anan, +\v 27 Malluch, Harim, and Baanah. +\p +\v 28 The rest of the people, the priests, the Levites, the gatekeepers, the singers, the temple servants, and all those who had separated themselves from the peoples of the lands to the law of God, their wives, their sons, and their daughters—everyone who had knowledge and understanding— +\v 29 joined with their brothers, their nobles, and entered into a curse and into an oath, to walk in God’s law, which was given by Moses the servant of God, and to observe and do all the commandments of Yahweh our Lord, and his ordinances and his statutes; +\v 30 and that we would not give our daughters to the peoples of the land, nor take their daughters for our sons; +\v 31 and if the peoples of the land bring wares or any grain on the Sabbath day to sell, that we would not buy from them on the Sabbath, or on a holy day; and that we would forego the seventh year crops and the exaction of every debt. +\p +\v 32 Also we made ordinances for ourselves, to charge ourselves yearly with the third part of a shekel\f + \fr 10:32 \ft A shekel is about 10 grams or about 0.35 ounces.\f* for the service of the house of our God: +\v 33 for the show bread, for the continual meal offering, for the continual burnt offering, for the Sabbaths, for the new moons, for the set feasts, for the holy things, for the sin offerings to make atonement for Israel, and for all the work of the house of our God. +\v 34 We, the priests, the Levites, and the people, cast lots for the wood offering, to bring it into the house of our God, according to our fathers’ houses, at times appointed year by year, to burn on Yahweh our God’s altar, as it is written in the law; +\v 35 and to bring the first fruits of our ground and the first fruits of all fruit of all kinds of trees, year by year, to Yahweh’s house; +\v 36 also the firstborn of our sons and of our livestock, as it is written in the law, and the firstborn of our herds and of our flocks, to bring to the house of our God, to the priests who minister in the house of our God; +\v 37 and that we should bring the first fruits of our dough, our wave offerings, the fruit of all kinds of trees, and the new wine and the oil, to the priests, to the rooms of the house of our God; and the tithes of our ground to the Levites; for they, the Levites, take the tithes in all our farming villages. +\v 38 The priest, the descendent of Aaron, shall be with the Levites when the Levites take tithes. The Levites shall bring up the tithe of the tithes to the house of our God, to the rooms, into the treasure house. +\v 39 For the children of Israel and the children of Levi shall bring the wave offering of the grain, of the new wine, and of the oil, to the rooms where the vessels of the sanctuary are, and the priests who minister, with the gatekeepers and the singers. We will not forsake the house of our God. +\c 11 + +\p +\v 1 The princes of the people lived in Jerusalem. The rest of the people also cast lots to bring one of ten to dwell in Jerusalem, the holy city, and nine parts in the other cities. +\v 2 The people blessed all the men who willingly offered themselves to dwell in Jerusalem. +\p +\v 3 Now these are the chiefs of the province who lived in Jerusalem; but in the cities of Judah, everyone lived in his possession in their cities—Israel, the priests, the Levites, the temple servants, and the children of Solomon’s servants. +\v 4 Some of the children of Judah and of the children of Benjamin lived in Jerusalem. Of the children of Judah: Athaiah the son of Uzziah, the son of Zechariah, the son of Amariah, the son of Shephatiah, the son of Mahalalel, of the children of Perez; +\v 5 and Maaseiah the son of Baruch, the son of Colhozeh, the son of Hazaiah, the son of Adaiah, the son of Joiarib, the son of Zechariah, the son of the Shilonite. +\v 6 All the sons of Perez who lived in Jerusalem were four hundred sixty-eight valiant men. +\p +\v 7 These are the sons of Benjamin: Sallu the son of Meshullam, the son of Joed, the son of Pedaiah, the son of Kolaiah, the son of Maaseiah, the son of Ithiel, the son of Jeshaiah. +\v 8 After him Gabbai and Sallai, nine hundred twenty-eight. +\v 9 Joel the son of Zichri was their overseer; and Judah the son of Hassenuah was second over the city. +\p +\v 10 Of the priests: Jedaiah the son of Joiarib, Jachin, +\v 11 Seraiah the son of Hilkiah, the son of Meshullam, the son of Zadok, the son of Meraioth, the son of Ahitub, the ruler of God’s house, +\v 12 and their brothers who did the work of the house, eight hundred twenty-two; and Adaiah the son of Jeroham, the son of Pelaliah, the son of Amzi, the son of Zechariah, the son of Pashhur, the son of Malchijah, +\v 13 and his brothers, chiefs of fathers’ households, two hundred forty-two; and Amashsai the son of Azarel, the son of Ahzai, the son of Meshillemoth, the son of Immer, +\v 14 and their brothers, mighty men of valor, one hundred twenty-eight; and their overseer was Zabdiel, the son of Haggedolim. +\p +\v 15 Of the Levites: Shemaiah the son of Hasshub, the son of Azrikam, the son of Hashabiah, the son of Bunni; +\v 16 and Shabbethai and Jozabad, of the chiefs of the Levites, who had the oversight of the outward business of God’s house; +\v 17 and Mattaniah the son of Mica, the son of Zabdi, the son of Asaph, who was the chief to begin the thanksgiving in prayer, and Bakbukiah, the second among his brothers; and Abda the son of Shammua, the son of Galal, the son of Jeduthun. +\v 18 All the Levites in the holy city were two hundred eighty-four. +\p +\v 19 Moreover the gatekeepers, Akkub, Talmon, and their brothers, who kept watch at the gates, were one hundred seventy-two. +\v 20 The residue of Israel, of the priests, and the Levites were in all the cities of Judah, everyone in his inheritance. +\v 21 But the temple servants lived in Ophel; and Ziha and Gishpa were over the temple servants. +\p +\v 22 The overseer also of the Levites at Jerusalem was Uzzi the son of Bani, the son of Hashabiah, the son of Mattaniah, the son of Mica, of the sons of Asaph, the singers responsible for the service of God’s house. +\v 23 For there was a commandment from the king concerning them, and a settled provision for the singers, as every day required. +\v 24 Pethahiah the son of Meshezabel, of the children of Zerah the son of Judah, was at the king’s hand in all matters concerning the people. +\p +\v 25 As for the villages with their fields, some of the children of Judah lived in Kiriath Arba and its towns, in Dibon and its towns, in Jekabzeel and its villages, +\v 26 in Jeshua, in Moladah, Beth Pelet, +\v 27 in Hazar Shual, in Beersheba and its towns, +\v 28 in Ziklag, in Meconah and in its towns, +\v 29 in En Rimmon, in Zorah, in Jarmuth, +\v 30 Zanoah, Adullam, and their villages, Lachish and its fields, and Azekah and its towns. So they encamped from Beersheba to the valley of Hinnom. +\v 31 The children of Benjamin also lived from Geba onward, at Michmash and Aija, and at Bethel and its towns, +\v 32 at Anathoth, Nob, Ananiah, +\v 33 Hazor, Ramah, Gittaim, +\v 34 Hadid, Zeboim, Neballat, +\v 35 Lod, and Ono, the valley of craftsmen. +\v 36 Of the Levites, certain divisions in Judah settled in Benjamin’s territory. +\c 12 +\p +\v 1 Now these are the priests and the Levites who went up with Zerubbabel the son of Shealtiel, and Jeshua: Seraiah, Jeremiah, Ezra, +\v 2 Amariah, Malluch, Hattush, +\v 3 Shecaniah, Rehum, Meremoth, +\v 4 Iddo, Ginnethoi, Abijah, +\v 5 Mijamin, Maadiah, Bilgah, +\v 6 Shemaiah, Joiarib, Jedaiah, +\v 7 Sallu, Amok, Hilkiah, and Jedaiah. These were the chiefs of the priests and of their brothers in the days of Jeshua. +\p +\v 8 Moreover the Levites were Jeshua, Binnui, Kadmiel, Sherebiah, Judah, and Mattaniah, who was over the thanksgiving songs, he and his brothers. +\v 9 Also Bakbukiah and Unno, their brothers, were close to them according to their offices. +\v 10 Jeshua became the father of Joiakim, and Joiakim became the father of Eliashib, and Eliashib became the father of Joiada, +\v 11 and Joiada became the father of Jonathan, and Jonathan became the father of Jaddua. +\p +\v 12 In the days of Joiakim were priests, heads of fathers’ households: of Seraiah, Meraiah; of Jeremiah, Hananiah; +\v 13 of Ezra, Meshullam; of Amariah, Jehohanan; +\v 14 of Malluchi, Jonathan; of Shebaniah, Joseph; +\v 15 of Harim, Adna; of Meraioth, Helkai; +\v 16 of Iddo, Zechariah; of Ginnethon, Meshullam; +\v 17 of Abijah, Zichri; of Miniamin, of Moadiah, Piltai; +\v 18 of Bilgah, Shammua; of Shemaiah, Jehonathan; +\v 19 of Joiarib, Mattenai; of Jedaiah, Uzzi; +\v 20 of Sallai, Kallai; of Amok, Eber; +\v 21 of Hilkiah, Hashabiah; of Jedaiah, Nethanel. +\p +\v 22 As for the Levites, in the days of Eliashib, Joiada, Johanan, and Jaddua, there were recorded the heads of fathers’ households; also the priests, in the reign of Darius the Persian. +\v 23 The sons of Levi, heads of fathers’ households, were written in the book of the chronicles, even until the days of Johanan the son of Eliashib. +\v 24 The chiefs of the Levites: Hashabiah, Sherebiah, and Jeshua the son of Kadmiel, with their brothers close to them, to praise and give thanks according to the commandment of David the man of God, section next to section. +\v 25 Mattaniah, Bakbukiah, Obadiah, Meshullam, Talmon, and Akkub were gatekeepers keeping the watch at the storehouses of the gates. +\v 26 These were in the days of Joiakim the son of Jeshua, the son of Jozadak, and in the days of Nehemiah the governor, and of Ezra the priest and scribe. +\p +\v 27 At the dedication of the wall of Jerusalem, they sought the Levites out of all their places, to bring them to Jerusalem to keep the dedication with gladness, both with giving thanks and with singing, with cymbals, stringed instruments, and with harps. +\v 28 The sons of the singers gathered themselves together, both out of the plain around Jerusalem and from the villages of the Netophathites; +\v 29 also from Beth Gilgal and out of the fields of Geba and Azmaveth, for the singers had built themselves villages around Jerusalem. +\v 30 The priests and the Levites purified themselves; and they purified the people, the gates, and the wall. +\p +\v 31 Then I brought the princes of Judah up on the wall, and appointed two great companies who gave thanks and went in procession. One went on the right hand on the wall toward the dung gate; +\v 32 and after them went Hoshaiah, with half of the princes of Judah, +\v 33 and Azariah, Ezra, and Meshullam, +\v 34 Judah, Benjamin, Shemaiah, Jeremiah, +\v 35 and some of the priests’ sons with trumpets: Zechariah the son of Jonathan, the son of Shemaiah, the son of Mattaniah, the son of Micaiah, the son of Zaccur, the son of Asaph; +\v 36 and his brothers, Shemaiah, Azarel, Milalai, Gilalai, Maai, Nethanel, Judah, and Hanani, with the musical instruments of David the man of God; and Ezra the scribe was before them. +\v 37 By the spring gate, and straight before them, they went up by the stairs of David’s city, at the ascent of the wall, above David’s house, even to the water gate eastward. +\p +\v 38 The other company of those who gave thanks went to meet them, and I after them, with the half of the people on the wall above the tower of the furnaces, even to the wide wall, +\v 39 and above the gate of Ephraim, and by the old gate, and by the fish gate, the tower of Hananel, and the tower of Hammeah, even to the sheep gate; and they stood still in the gate of the guard. +\v 40 So the two companies of those who gave thanks in God’s house stood, and I and the half of the rulers with me; +\v 41 and the priests, Eliakim, Maaseiah, Miniamin, Micaiah, Elioenai, Zechariah, and Hananiah, with trumpets; +\v 42 and Maaseiah, Shemaiah, Eleazar, Uzzi, Jehohanan, Malchijah, Elam, and Ezer. The singers sang loud, with Jezrahiah their overseer. +\v 43 They offered great sacrifices that day, and rejoiced, for God had made them rejoice with great joy; and the women and the children also rejoiced, so that the joy of Jerusalem was heard even far away. +\p +\v 44 On that day, men were appointed over the rooms for the treasures, for the wave offerings, for the first fruits, and for the tithes, to gather into them according to the fields of the cities the portions appointed by the law for the priests and Levites; for Judah rejoiced for the priests and for the Levites who served. +\v 45 They performed the duty of their God and the duty of the purification, and so did the singers and the gatekeepers, according to the commandment of David and of Solomon his son. +\v 46 For in the days of David and Asaph of old there was a chief of the singers, and songs of praise and thanksgiving to God. +\v 47 All Israel in the days of Zerubbabel and in the days of Nehemiah gave the portions of the singers and the gatekeepers, as every day required; and they set apart that which was for the Levites; and the Levites set apart that which was for the sons of Aaron. +\c 13 +\p +\v 1 On that day they read in the book of Moses in the hearing of the people; and it was found written in it that an Ammonite and a Moabite should not enter into the assembly of God forever, +\v 2 because they didn’t meet the children of Israel with bread and with water, but hired Balaam against them to curse them; however, our God turned the curse into a blessing. +\v 3 It came to pass, when they had heard the law, that they separated all the mixed multitude from Israel. +\p +\v 4 Now before this, Eliashib the priest, who was appointed over the rooms of the house of our God, being allied to Tobiah, +\v 5 had prepared for him a great room, where before they laid the meal offerings, the frankincense, the vessels, and the tithes of the grain, the new wine, and the oil, which were given by commandment to the Levites, the singers, and the gatekeepers; and the wave offerings for the priests. +\v 6 But in all this, I was not at Jerusalem; for in the thirty-second year of Artaxerxes king of Babylon I went to the king; and after some days I asked leave of the king, +\v 7 and I came to Jerusalem, and understood the evil that Eliashib had done for Tobiah, in preparing him a room in the courts of God’s house. +\v 8 It grieved me severely. Therefore I threw all Tobiah’s household stuff out of the room. +\v 9 Then I commanded, and they cleansed the rooms. I brought into them the vessels of God’s house, with the meal offerings and the frankincense again. +\p +\v 10 I perceived that the portions of the Levites had not been given them, so that the Levites and the singers, who did the work, had each fled to his field. +\v 11 Then I contended with the rulers, and said, “Why is God’s house forsaken?” I gathered them together, and set them in their place. +\v 12 Then all Judah brought the tithe of the grain, the new wine, and the oil to the treasuries. +\v 13 I made treasurers over the treasuries, Shelemiah the priest, and Zadok the scribe, and of the Levites, Pedaiah: and next to them was Hanan the son of Zaccur, the son of Mattaniah; for they were counted faithful, and their business was to distribute to their brothers. +\p +\v 14 Remember me, my God, concerning this, and don’t wipe out my good deeds that I have done for the house of my God, and for its observances. +\p +\v 15 In those days I saw some men treading wine presses on the Sabbath in Judah, bringing in sheaves, and loading donkeys with wine, grapes, figs, and all kinds of burdens which they brought into Jerusalem on the Sabbath day; and I testified against them in the day in which they sold food. +\v 16 Some men of Tyre also lived there, who brought in fish and all kinds of wares, and sold on the Sabbath to the children of Judah, and in Jerusalem. +\v 17 Then I contended with the nobles of Judah, and said to them, “What evil thing is this that you do, and profane the Sabbath day? +\v 18 Didn’t your fathers do this, and didn’t our God bring all this evil on us and on this city? Yet you bring more wrath on Israel by profaning the Sabbath.” +\p +\v 19 It came to pass that when the gates of Jerusalem began to be dark before the Sabbath, I commanded that the doors should be shut, and commanded that they should not be opened until after the Sabbath. I set some of my servants over the gates, so that no burden should be brought in on the Sabbath day. +\v 20 So the merchants and sellers of all kinds of wares camped outside of Jerusalem once or twice. +\v 21 Then I testified against them, and said to them, “Why do you stay around the wall? If you do so again, I will lay hands on you.” From that time on, they didn’t come on the Sabbath. +\v 22 I commanded the Levites that they should purify themselves, and that they should come and keep the gates, to sanctify the Sabbath day. Remember me for this also, my God, and spare me according to the greatness of your loving kindness. +\p +\v 23 In those days I also saw the Jews who had married women of Ashdod, of Ammon, and of Moab; +\v 24 and their children spoke half in the speech of Ashdod, and could not speak in the Jews’ language, but according to the language of each people. +\v 25 I contended with them, cursed them, struck certain of them, plucked off their hair, and made them swear by God, “You shall not give your daughters to their sons, nor take their daughters for your sons, or for yourselves. +\v 26 Didn’t Solomon king of Israel sin by these things? Yet among many nations there was no king like him, and he was loved by his God, and God made him king over all Israel. Nevertheless foreign women caused even him to sin. +\v 27 Shall we then listen to you to do all this great evil, to trespass against our God in marrying foreign women?” +\p +\v 28 One of the sons of Joiada, the son of Eliashib the high priest, was son-in-law to Sanballat the Horonite; therefore I chased him from me. +\v 29 Remember them, my God, because they have defiled the priesthood and the covenant of the priesthood and of the Levites. +\p +\v 30 Thus I cleansed them from all foreigners and appointed duties for the priests and for the Levites, everyone in his work; +\v 31 and for the wood offering, at appointed times, and for the first fruits. Remember me, my God, for good. diff --git a/c-sharp/assets/WEB/17ESTengWEBUS.SFM b/c-sharp/assets/WEB/17ESTengWEBUS.SFM new file mode 100644 index 0000000000..f40be962e3 --- /dev/null +++ b/c-sharp/assets/WEB/17ESTengWEBUS.SFM @@ -0,0 +1,251 @@ +\id EST World English Bible (WEB) +\ide UTF-8 +\h Esther +\toc1 The Book of Esther +\toc2 Esther +\toc3 Esther +\mt2 The Book of +\mt1 Esther +\c 1 +\p +\v 1 Now in the days of Ahasuerus (this is Ahasuerus who reigned from India even to Ethiopia, over one hundred twenty-seven provinces), +\v 2 in those days, when the King Ahasuerus sat on the throne of his kingdom, which was in Susa the palace, +\v 3 in the third year of his reign, he made a feast for all his princes and his servants; the army of Persia and Media, the nobles and princes of the provinces being before him. +\v 4 He displayed the riches of his glorious kingdom and the honor of his excellent majesty many days, even one hundred eighty days. +\p +\v 5 When these days were fulfilled, the king made a seven day feast for all the people who were present in Susa the palace, both great and small, in the court of the garden of the king’s palace. +\v 6 There were hangings of white and blue material, fastened with cords of fine linen and purple to silver rings and marble pillars. The couches were of gold and silver, on a pavement of red, white, yellow, and black marble. +\v 7 They gave them drinks in golden vessels of various kinds, including royal wine in abundance, according to the bounty of the king. +\v 8 In accordance with the law, the drinking was not compulsory; for so the king had instructed all the officials of his house, that they should do according to every man’s pleasure. +\p +\v 9 Also Vashti the queen made a feast for the women in the royal house which belonged to King Ahasuerus. +\p +\v 10 On the seventh day, when the heart of the king was merry with wine, he commanded Mehuman, Biztha, Harbona, Bigtha, and Abagtha, Zethar, and Carcass, the seven eunuchs who served in the presence of Ahasuerus the king, +\v 11 to bring Vashti the queen before the king wearing the royal crown, to show the people and the princes her beauty; for she was beautiful. +\v 12 But the queen Vashti refused to come at the king’s commandment by the eunuchs. Therefore the king was very angry, and his anger burned in him. +\p +\v 13 Then the king said to the wise men, who knew the times (for it was the king’s custom to consult those who knew law and judgment; +\v 14 and next to him were Carshena, Shethar, Admatha, Tarshish, Meres, Marsena, and Memucan, the seven princes of Persia and Media, who saw the king’s face, and sat first in the kingdom), +\v 15 “What shall we do to Queen Vashti according to law, because she has not done the bidding of the King Ahasuerus by the eunuchs?” +\p +\v 16 Memucan answered before the king and the princes, “Vashti the queen has not done wrong to just the king, but also to all the princes, and to all the people who are in all the provinces of the King Ahasuerus. +\v 17 For this deed of the queen will become known to all women, causing them to show contempt for their husbands when it is reported, ‘King Ahasuerus commanded Vashti the queen to be brought in before him, but she didn’t come.’ +\v 18 Today, the princesses of Persia and Media who have heard of the queen’s deed will tell all the king’s princes. This will cause much contempt and wrath. +\p +\v 19 “If it pleases the king, let a royal commandment go from him, and let it be written among the laws of the Persians and the Medes, so that it cannot be altered, that Vashti may never again come before King Ahasuerus; and let the king give her royal estate to another who is better than she. +\v 20 When the king’s decree which he shall make is published throughout all his kingdom (for it is great), all the wives will give their husbands honor, both great and small.” +\p +\v 21 This advice pleased the king and the princes, and the king did according to the word of Memucan: +\v 22 for he sent letters into all the king’s provinces, into every province according to its writing, and to every people in their language, that every man should rule his own house, speaking in the language of his own people. +\c 2 +\p +\v 1 After these things, when the wrath of King Ahasuerus was pacified, he remembered Vashti, and what she had done, and what was decreed against her. +\v 2 Then the king’s servants who served him said, “Let beautiful young virgins be sought for the king. +\v 3 Let the king appoint officers in all the provinces of his kingdom, that they may gather together all the beautiful young virgins to the citadel of Susa, to the women’s house, to the custody of Hegai the king’s eunuch, keeper of the women. Let cosmetics be given them; +\v 4 and let the maiden who pleases the king be queen instead of Vashti.” The thing pleased the king, and he did so. +\p +\v 5 There was a certain Jew in the citadel of Susa whose name was Mordecai, the son of Jair, the son of Shimei, the son of Kish, a Benjamite, +\v 6 who had been carried away from Jerusalem with the captives who had been carried away with Jeconiah king of Judah, whom Nebuchadnezzar the king of Babylon had carried away. +\v 7 He brought up Hadassah, that is, Esther, his uncle’s daughter; for she had neither father nor mother. The maiden was fair and beautiful; and when her father and mother were dead, Mordecai took her for his own daughter. +\p +\v 8 So, when the king’s commandment and his decree was heard, and when many maidens were gathered together to the citadel of Susa, to the custody of Hegai, Esther was taken into the king’s house, to the custody of Hegai, keeper of the women. +\v 9 The maiden pleased him, and she obtained kindness from him. He quickly gave her cosmetics and her portions of food, and the seven choice maidens who were to be given her out of the king’s house. He moved her and her maidens to the best place in the women’s house. +\v 10 Esther had not made known her people nor her relatives, because Mordecai had instructed her that she should not make it known. +\v 11 Mordecai walked every day in front of the court of the women’s house, to find out how Esther was doing, and what would become of her. +\p +\v 12 Each young woman’s turn came to go in to King Ahasuerus after her purification for twelve months (for so were the days of their purification accomplished, six months with oil of myrrh, and six months with sweet fragrances and with preparations for beautifying women). +\v 13 The young woman then came to the king like this: whatever she desired was given her to go with her out of the women’s house to the king’s house. +\v 14 In the evening she went, and on the next day she returned into the second women’s house, to the custody of Shaashgaz, the king’s eunuch, who kept the concubines. She came in to the king no more, unless the king delighted in her, and she was called by name. +\p +\v 15 Now when the turn of Esther, the daughter of Abihail the uncle of Mordecai, who had taken her for his daughter, came to go in to the king, she required nothing but what Hegai the king’s eunuch, the keeper of the women, advised. Esther obtained favor in the sight of all those who looked at her. +\p +\v 16 So Esther was taken to King Ahasuerus into his royal house in the tenth month, which is the month Tebeth, in the seventh year of his reign. +\v 17 The king loved Esther more than all the women, and she obtained favor and kindness in his sight more than all the virgins; so that he set the royal crown on her head, and made her queen instead of Vashti. +\p +\v 18 Then the king made a great feast for all his princes and his servants, even Esther’s feast; and he proclaimed a holiday in the provinces, and gave gifts according to the king’s bounty. +\p +\v 19 When the virgins were gathered together the second time, Mordecai was sitting in the king’s gate. +\v 20 Esther had not yet made known her relatives nor her people, as Mordecai had commanded her; for Esther obeyed Mordecai, like she did when she was brought up by him. +\v 21 In those days, while Mordecai was sitting in the king’s gate, two of the king’s eunuchs, Bigthan and Teresh, who were doorkeepers, were angry, and sought to lay hands on the King Ahasuerus. +\v 22 This thing became known to Mordecai, who informed Esther the queen; and Esther informed the king in Mordecai’s name. +\v 23 When this matter was investigated, and it was found to be so, they were both hanged on a gallows; and it was written in the book of the chronicles in the king’s presence. +\c 3 +\p +\v 1 After these things King Ahasuerus promoted Haman the son of Hammedatha the Agagite, and advanced him, and set his seat above all the princes who were with him. +\v 2 All the king’s servants who were in the king’s gate bowed down and paid homage to Haman, for the king had so commanded concerning him. But Mordecai didn’t bow down or pay him homage. +\v 3 Then the king’s servants who were in the king’s gate said to Mordecai, “Why do you disobey the king’s commandment?” +\v 4 Now it came to pass, when they spoke daily to him, and he didn’t listen to them, that they told Haman, to see whether Mordecai’s reason would stand; for he had told them that he was a Jew. +\v 5 When Haman saw that Mordecai didn’t bow down nor pay him homage, Haman was full of wrath. +\v 6 But he scorned the thought of laying hands on Mordecai alone, for they had made known to him Mordecai’s people. Therefore Haman sought to destroy all the Jews who were throughout the whole kingdom of Ahasuerus, even Mordecai’s people. +\p +\v 7 In the first month, which is the month Nisan, in the twelfth year of King Ahasuerus, they cast Pur, that is, the lot, before Haman from day to day, and from month to month, and chose the twelfth month, which is the month Adar. +\v 8 Haman said to King Ahasuerus, “There is a certain people scattered abroad and dispersed among the peoples in all the provinces of your kingdom, and their laws are different from other people’s. They don’t keep the king’s laws. Therefore it is not for the king’s profit to allow them to remain. +\v 9 If it pleases the king, let it be written that they be destroyed; and I will pay ten thousand talents\f + \fr 3:9 \ft A talent is about 30 kilograms or 66 pounds or 965 Troy ounces\f* of silver into the hands of those who are in charge of the king’s business, to bring it into the king’s treasuries.” +\p +\v 10 The king took his ring from his hand, and gave it to Haman the son of Hammedatha the Agagite, the Jews’ enemy. +\v 11 The king said to Haman, “The silver is given to you, the people also, to do with them as it seems good to you.” +\p +\v 12 Then the king’s scribes were called in on the first month, on the thirteenth day of the month; and all that Haman commanded was written to the king’s local governors, and to the governors who were over every province, and to the princes of every people, to every province according to its writing, and to every people in their language. It was written in the name of King Ahasuerus, and it was sealed with the king’s ring. +\v 13 Letters were sent by couriers into all the king’s provinces, to destroy, to kill, and to cause to perish, all Jews, both young and old, little children and women, in one day, even on the thirteenth day of the twelfth month, which is the month Adar, and to plunder their possessions. +\v 14 A copy of the letter, that the decree should be given out in every province, was published to all the peoples, that they should be ready against that day. +\v 15 The couriers went out in haste by the king’s commandment, and the decree was given out in the citadel of Susa. The king and Haman sat down to drink; but the city of Susa was perplexed. +\c 4 +\p +\v 1 Now when Mordecai found out all that was done, Mordecai tore his clothes and put on sackcloth with ashes, and went out into the middle of the city, and wailed loudly and bitterly. +\v 2 He came even before the king’s gate, for no one is allowed inside the king’s gate clothed with sackcloth. +\v 3 In every province, wherever the king’s commandment and his decree came, there was great mourning among the Jews, and fasting, and weeping, and wailing; and many lay in sackcloth and ashes. +\p +\v 4 Esther’s maidens and her eunuchs came and told her this, and the queen was exceedingly grieved. She sent clothing to Mordecai, to replace his sackcloth, but he didn’t receive it. +\v 5 Then Esther called for Hathach, one of the king’s eunuchs, whom he had appointed to attend her, and commanded him to go to Mordecai, to find out what this was, and why it was. +\v 6 So Hathach went out to Mordecai, to the city square which was before the king’s gate. +\v 7 Mordecai told him of all that had happened to him, and the exact sum of the money that Haman had promised to pay to the king’s treasuries for the destruction of the Jews. +\v 8 He also gave him the copy of the writing of the decree that was given out in Susa to destroy them, to show it to Esther, and to declare it to her, and to urge her to go in to the king to make supplication to him, and to make request before him for her people. +\p +\v 9 Hathach came and told Esther the words of Mordecai. +\v 10 Then Esther spoke to Hathach, and gave him a message to Mordecai: +\v 11 “All the king’s servants and the people of the king’s provinces know that whoever, whether man or woman, comes to the king into the inner court without being called, there is one law for him, that he be put to death, except those to whom the king might hold out the golden scepter, that he may live. I have not been called to come in to the king these thirty days.” +\p +\v 12 They told Esther’s words to Mordecai. +\v 13 Then Mordecai asked them to return this answer to Esther: “Don’t think to yourself that you will escape in the king’s house any more than all the Jews. +\v 14 For if you remain silent now, then relief and deliverance will come to the Jews from another place, but you and your father’s house will perish. Who knows if you haven’t come to the kingdom for such a time as this?” +\p +\v 15 Then Esther asked them to answer Mordecai, +\v 16 “Go, gather together all the Jews who are present in Susa, and fast for me, and neither eat nor drink three days, night or day. I and my maidens will also fast the same way. Then I will go in to the king, which is against the law; and if I perish, I perish.” +\v 17 So Mordecai went his way, and did according to all that Esther had commanded him. +\c 5 +\p +\v 1 Now on the third day, Esther put on her royal clothing and stood in the inner court of the king’s house, next to the king’s house. The king sat on his royal throne in the royal house, next to the entrance of the house. +\v 2 When the king saw Esther the queen standing in the court, she obtained favor in his sight; and the king held out to Esther the golden scepter that was in his hand. So Esther came near and touched the top of the scepter. +\p +\v 3 Then the king asked her, “What would you like, queen Esther? What is your request? It shall be given you even to the half of the kingdom.” +\p +\v 4 Esther said, “If it seems good to the king, let the king and Haman come today to the banquet that I have prepared for him.” +\p +\v 5 Then the king said, “Bring Haman quickly, so that it may be done as Esther has said.” So the king and Haman came to the banquet that Esther had prepared. +\p +\v 6 The king said to Esther at the banquet of wine, “What is your petition? It shall be granted you. What is your request? Even to the half of the kingdom it shall be performed.” +\p +\v 7 Then Esther answered and said, “My petition and my request is this. +\v 8 If I have found favor in the sight of the king, and if it pleases the king to grant my petition and to perform my request, let the king and Haman come to the banquet that I will prepare for them, and I will do tomorrow as the king has said.” +\p +\v 9 Then Haman went out that day joyful and glad of heart, but when Haman saw Mordecai in the king’s gate, that he didn’t stand up nor move for him, he was filled with wrath against Mordecai. +\v 10 Nevertheless Haman restrained himself, and went home. There, he sent and called for his friends and Zeresh his wife. +\v 11 Haman recounted to them the glory of his riches, the multitude of his children, all the things in which the king had promoted him, and how he had advanced him above the princes and servants of the king. +\p +\v 12 Haman also said, “Yes, Esther the queen let no man come in with the king to the banquet that she had prepared but myself; and tomorrow I am also invited by her together with the king. +\v 13 Yet all this avails me nothing, so long as I see Mordecai the Jew sitting at the king’s gate.” +\p +\v 14 Then Zeresh his wife and all his friends said to him, “Let a gallows be made fifty cubits\f + \fr 5:14 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* high, and in the morning speak to the king about hanging Mordecai on it. Then go in merrily with the king to the banquet.” This pleased Haman, so he had the gallows made. +\c 6 +\p +\v 1 On that night, the king couldn’t sleep. He commanded the book of records of the chronicles to be brought, and they were read to the king. +\v 2 It was found written that Mordecai had told of Bigthana and Teresh, two of the king’s eunuchs, who were doorkeepers, who had tried to lay hands on the King Ahasuerus. +\v 3 The king said, “What honor and dignity has been given to Mordecai for this?” +\p Then the king’s servants who attended him said, “Nothing has been done for him.” +\p +\v 4 The king said, “Who is in the court?” Now Haman had come into the outer court of the king’s house, to speak to the king about hanging Mordecai on the gallows that he had prepared for him. +\p +\v 5 The king’s servants said to him, “Behold,\f + \fr 6:5 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* Haman stands in the court.” +\p The king said, “Let him come in.” +\v 6 So Haman came in. The king said to him, “What shall be done to the man whom the king delights to honor?” +\p Now Haman said in his heart, “Who would the king delight to honor more than myself?” +\v 7 Haman said to the king, “For the man whom the king delights to honor, +\v 8 let royal clothing be brought which the king uses to wear, and the horse that the king rides on, and on the head of which a royal crown is set. +\v 9 Let the clothing and the horse be delivered to the hand of one of the king’s most noble princes, that they may array the man whom the king delights to honor with them, and have him ride on horseback through the city square, and proclaim before him, ‘Thus it shall be done to the man whom the king delights to honor!’” +\p +\v 10 Then the king said to Haman, “Hurry and take the clothing and the horse, as you have said, and do this for Mordecai the Jew, who sits at the king’s gate. Let nothing fail of all that you have spoken.” +\p +\v 11 Then Haman took the clothing and the horse, and arrayed Mordecai, and had him ride through the city square, and proclaimed before him, “Thus it shall be done to the man whom the king delights to honor!” +\p +\v 12 Mordecai came back to the king’s gate, but Haman hurried to his house, mourning and having his head covered. +\v 13 Haman recounted to Zeresh his wife and all his friends everything that had happened to him. Then his wise men and Zeresh his wife said to him, “If Mordecai, before whom you have begun to fall, is of Jewish descent, you will not prevail against him, but you will surely fall before him.” +\v 14 While they were yet talking with him, the king’s eunuchs came, and hurried to bring Haman to the banquet that Esther had prepared. +\c 7 +\p +\v 1 So the king and Haman came to banquet with Esther the queen. +\v 2 The king said again to Esther on the second day at the banquet of wine, “What is your petition, queen Esther? It shall be granted you. What is your request? Even to the half of the kingdom it shall be performed.” +\p +\v 3 Then Esther the queen answered, “If I have found favor in your sight, O king, and if it pleases the king, let my life be given me at my petition, and my people at my request. +\v 4 For we are sold, I and my people, to be destroyed, to be slain, and to perish. But if we had been sold for male and female slaves, I would have held my peace, although the adversary could not have compensated for the king’s loss.” +\p +\v 5 Then King Ahasuerus said to Esther the queen, “Who is he, and where is he who dared presume in his heart to do so?” +\p +\v 6 Esther said, “An adversary and an enemy, even this wicked Haman!” +\p Then Haman was afraid before the king and the queen. +\v 7 The king arose in his wrath from the banquet of wine and went into the palace garden. Haman stood up to make request for his life to Esther the queen, for he saw that there was evil determined against him by the king. +\v 8 Then the king returned out of the palace garden into the place of the banquet of wine; and Haman had fallen on the couch where Esther was. Then the king said, “Will he even assault the queen in front of me in the house?” As the word went out of the king’s mouth, they covered Haman’s face. +\p +\v 9 Then Harbonah, one of the eunuchs who were with the king, said, “Behold, the gallows fifty cubits\f + \fr 7:9 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* high, which Haman has made for Mordecai, who spoke good for the king, is standing at Haman’s house.” +\p The king said, “Hang him on it!” +\p +\v 10 So they hanged Haman on the gallows that he had prepared for Mordecai. Then the king’s wrath was pacified. +\c 8 +\p +\v 1 On that day, King Ahasuerus gave the house of Haman, the Jews’ enemy, to Esther the queen. Mordecai came before the king; for Esther had told what he was to her. +\v 2 The king took off his ring, which he had taken from Haman, and gave it to Mordecai. Esther set Mordecai over the house of Haman. +\p +\v 3 Esther spoke yet again before the king, and fell down at his feet and begged him with tears to put away the mischief of Haman the Agagite, and his plan that he had planned against the Jews. +\v 4 Then the king held out to Esther the golden scepter. So Esther arose, and stood before the king. +\v 5 She said, “If it pleases the king, and if I have found favor in his sight, and the thing seems right to the king, and I am pleasing in his eyes, let it be written to reverse the letters devised by Haman, the son of Hammedatha the Agagite, which he wrote to destroy the Jews who are in all the king’s provinces. +\v 6 For how can I endure to see the evil that would come to my people? How can I endure to see the destruction of my relatives?” +\p +\v 7 Then King Ahasuerus said to Esther the queen and to Mordecai the Jew, “See, I have given Esther the house of Haman, and they have hanged him on the gallows because he laid his hand on the Jews. +\v 8 Write also to the Jews as it pleases you, in the king’s name, and seal it with the king’s ring; for the writing which is written in the king’s name, and sealed with the king’s ring, may not be reversed by any man.” +\p +\v 9 Then the king’s scribes were called at that time, in the third month, which is the month Sivan, on the twenty-third day of the month; and it was written according to all that Mordecai commanded to the Jews, and to the local governors, and the governors and princes of the provinces which are from India to Ethiopia, one hundred twenty-seven provinces, to every province according to its writing, and to every people in their language, and to the Jews in their writing, and in their language. +\v 10 He wrote in the name of King Ahasuerus, and sealed it with the king’s ring, and sent letters by courier on horseback, riding on royal horses that were bred from swift steeds. +\v 11 In those letters, the king granted the Jews who were in every city to gather themselves together and to defend their lives—to destroy, to kill, and to cause to perish all the power of the people and province that would assault them, their little ones and women, and to plunder their possessions, +\v 12 on one day in all the provinces of King Ahasuerus, on the thirteenth day of the twelfth month, which is the month Adar. +\v 13 A copy of the letter, that the decree should be given out in every province, was published to all the peoples, that the Jews should be ready for that day to avenge themselves on their enemies. +\v 14 So the couriers who rode on royal horses went out, hastened and pressed on by the king’s commandment. The decree was given out in the citadel of Susa. +\p +\v 15 Mordecai went out of the presence of the king in royal clothing of blue and white, and with a great crown of gold, and with a robe of fine linen and purple; and the city of Susa shouted and was glad. +\v 16 The Jews had light, gladness, joy, and honor. +\v 17 In every province and in every city, wherever the king’s commandment and his decree came, the Jews had gladness, joy, a feast and a holiday. Many from among the peoples of the land became Jews, for the fear of the Jews had fallen on them. +\c 9 +\p +\v 1 Now in the twelfth month, which is the month Adar, on the thirteenth day of the month, when the king’s commandment and his decree came near to be put in execution, on the day that the enemies of the Jews hoped to conquer them, (but it turned out that the opposite happened, that the Jews conquered those who hated them), +\v 2 the Jews gathered themselves together in their cities throughout all the provinces of the King Ahasuerus, to lay hands on those who wanted to harm them. No one could withstand them, because the fear of them had fallen on all the people. +\v 3 All the princes of the provinces, the local governors, the governors, and those who did the king’s business helped the Jews, because the fear of Mordecai had fallen on them. +\v 4 For Mordecai was great in the king’s house, and his fame went out throughout all the provinces, for the man Mordecai grew greater and greater. +\v 5 The Jews struck all their enemies with the stroke of the sword, and with slaughter and destruction, and did what they wanted to those who hated them. +\v 6 In the citadel of Susa, the Jews killed and destroyed five hundred men. +\v 7 They killed Parshandatha, Dalphon, Aspatha, +\v 8 Poratha, Adalia, Aridatha, +\v 9 Parmashta, Arisai, Aridai, and Vaizatha, +\v 10 the ten sons of Haman the son of Hammedatha, the Jews’ enemy, but they didn’t lay their hand on the plunder. +\p +\v 11 On that day, the number of those who were slain in the citadel of Susa was brought before the king. +\v 12 The king said to Esther the queen, “The Jews have slain and destroyed five hundred men in the citadel of Susa, including the ten sons of Haman; what then have they done in the rest of the king’s provinces! Now what is your petition? It shall be granted you. What is your further request? It shall be done.” +\p +\v 13 Then Esther said, “If it pleases the king, let it be granted to the Jews who are in Susa to do tomorrow also according to today’s decree, and let Haman’s ten sons be hanged on the gallows.” +\p +\v 14 The king commanded this to be done. A decree was given out in Susa; and they hanged Haman’s ten sons. +\v 15 The Jews who were in Susa gathered themselves together on the fourteenth day also of the month Adar, and killed three hundred men in Susa; but they didn’t lay their hand on the plunder. +\p +\v 16 The other Jews who were in the king’s provinces gathered themselves together, defended their lives, had rest from their enemies, and killed seventy-five thousand of those who hated them; but they didn’t lay their hand on the plunder. +\v 17 This was done on the thirteenth day of the month Adar; and on the fourteenth day of that month they rested and made it a day of feasting and gladness. +\p +\v 18 But the Jews who were in Susa assembled together on the thirteenth and on the fourteenth days of the month; and on the fifteenth day of that month, they rested, and made it a day of feasting and gladness. +\v 19 Therefore the Jews of the villages, who live in the unwalled towns, make the fourteenth day of the month Adar a day of gladness and feasting, a holiday, and a day of sending presents of food to one another. +\p +\v 20 Mordecai wrote these things, and sent letters to all the Jews who were in all the provinces of the King Ahasuerus, both near and far, +\v 21 to enjoin them that they should keep the fourteenth and fifteenth days of the month Adar yearly, +\v 22 as the days in which the Jews had rest from their enemies, and the month which was turned to them from sorrow to gladness, and from mourning into a holiday; that they should make them days of feasting and gladness, and of sending presents of food to one another, and gifts to the needy. +\v 23 The Jews accepted the custom that they had begun, as Mordecai had written to them, +\v 24 because Haman the son of Hammedatha, the Agagite, the enemy of all the Jews, had plotted against the Jews to destroy them, and had cast “Pur”, that is the lot, to consume them and to destroy them; +\v 25 but when this became known to the king, he commanded by letters that his wicked plan, which he had planned against the Jews, should return on his own head, and that he and his sons should be hanged on the gallows. +\p +\v 26 Therefore they called these days “Purim”,\f + \fr 9:26 \ft Purim is the Hebrew plural for pur, which means lot.\f* from the word “Pur.” Therefore because of all the words of this letter, and of that which they had seen concerning this matter, and that which had come to them, +\v 27 the Jews established and imposed on themselves, on their descendants, and on all those who joined themselves to them, so that it should not fail that they would keep these two days according to what was written and according to its appointed time every year; +\v 28 and that these days should be remembered and kept throughout every generation, every family, every province, and every city; and that these days of Purim should not fail from among the Jews, nor their memory perish from their offspring.\f + \fr 9:28 \ft or, seed\f* +\p +\v 29 Then Esther the queen, the daughter of Abihail, and Mordecai the Jew wrote with all authority to confirm this second letter of Purim. +\v 30 He sent letters to all the Jews in the hundred twenty-seven provinces of the kingdom of Ahasuerus with words of peace and truth, +\v 31 to confirm these days of Purim in their appointed times, as Mordecai the Jew and Esther the queen had decreed, and as they had imposed upon themselves and their descendants in the matter of the fastings and their mourning. +\v 32 The commandment of Esther confirmed these matters of Purim; and it was written in the book. +\c 10 +\p +\v 1 King Ahasuerus laid a tribute on the land and on the islands of the sea. +\v 2 Aren’t all the acts of his power and of his might, and the full account of the greatness of Mordecai, to which the king advanced him, written in the book of the chronicles of the kings of Media and Persia? +\v 3 For Mordecai the Jew was next to King Ahasuerus, and great among the Jews and accepted by the multitude of his brothers, seeking the good of his people and speaking peace to all his descendants. diff --git a/c-sharp/assets/WEB/18JOBengWEBUS.SFM b/c-sharp/assets/WEB/18JOBengWEBUS.SFM new file mode 100644 index 0000000000..351e25e1d1 --- /dev/null +++ b/c-sharp/assets/WEB/18JOBengWEBUS.SFM @@ -0,0 +1,3406 @@ +\id JOB World English Bible (WEB) +\ide UTF-8 +\h Job +\toc1 The Book of Job +\toc2 Job +\toc3 Job +\mt2 The Book of +\mt1 Job +\c 1 +\p +\v 1 There was a man in the land of Uz, whose name was Job. That man was blameless and upright, and one who feared God,\f + \fr 1:1 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* and turned away from evil. +\v 2 There were born to him seven sons and three daughters. +\v 3 His possessions also were seven thousand sheep, three thousand camels, five hundred yoke of oxen, five hundred female donkeys, and a very great household; so that this man was the greatest of all the children of the east. +\v 4 His sons went and held a feast in the house of each one on his birthday; and they sent and called for their three sisters to eat and to drink with them. +\v 5 It was so, when the days of their feasting had run their course, that Job sent and sanctified them, and rose up early in the morning, and offered burnt offerings according to the number of them all. For Job said, “It may be that my sons have sinned, and renounced God in their hearts.” Job did so continually. +\p +\v 6 Now on the day when God’s sons came to present themselves before Yahweh,\f + \fr 1:6 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* Satan also came among them. +\v 7 Yahweh said to Satan, “Where have you come from?” +\p Then Satan answered Yahweh, and said, “From going back and forth in the earth, and from walking up and down in it.” +\p +\v 8 Yahweh said to Satan, “Have you considered my servant, Job? For there is no one like him in the earth, a blameless and an upright man, one who fears God, and turns away from evil.” +\p +\v 9 Then Satan answered Yahweh, and said, “Does Job fear God for nothing? +\v 10 Haven’t you made a hedge around him, and around his house, and around all that he has, on every side? You have blessed the work of his hands, and his substance is increased in the land. +\v 11 But stretch out your hand now, and touch all that he has, and he will renounce you to your face.” +\p +\v 12 Yahweh said to Satan, “Behold,\f + \fr 1:12 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* all that he has is in your power. Only on himself don’t stretch out your hand.” +\p So Satan went out from the presence of Yahweh. +\v 13 It fell on a day when his sons and his daughters were eating and drinking wine in their oldest brother’s house, +\v 14 that a messenger came to Job, and said, “The oxen were plowing, and the donkeys feeding beside them, +\v 15 and the Sabeans attacked, and took them away. Yes, they have killed the servants with the edge of the sword, and I alone have escaped to tell you.” +\p +\v 16 While he was still speaking, another also came and said, “The fire of God has fallen from the sky, and has burned up the sheep and the servants, and consumed them, and I alone have escaped to tell you.” +\p +\v 17 While he was still speaking, another also came and said, “The Chaldeans made three bands, and swept down on the camels, and have taken them away, yes, and killed the servants with the edge of the sword; and I alone have escaped to tell you.” +\p +\v 18 While he was still speaking, there came also another, and said, “Your sons and your daughters were eating and drinking wine in their oldest brother’s house, +\v 19 and behold, there came a great wind from the wilderness, and struck the four corners of the house, and it fell on the young men, and they are dead. I alone have escaped to tell you.” +\p +\v 20 Then Job arose, and tore his robe, and shaved his head, and fell down on the ground, and worshiped. +\v 21 He said, “Naked I came out of my mother’s womb, and naked will I return there. Yahweh gave, and Yahweh has taken away. Blessed be Yahweh’s name.” +\v 22 In all this, Job didn’t sin, nor charge God with wrongdoing. +\c 2 +\p +\v 1 Again, on the day when God’s sons came to present themselves before Yahweh, Satan came also among them to present himself before Yahweh. +\v 2 Yahweh said to Satan, “Where have you come from?” +\p Satan answered Yahweh, and said, “From going back and forth in the earth, and from walking up and down in it.” +\p +\v 3 Yahweh said to Satan, “Have you considered my servant Job? For there is no one like him in the earth, a blameless and an upright man, one who fears God, and turns away from evil. He still maintains his integrity, although you incited me against him, to ruin him without cause.” +\p +\v 4 Satan answered Yahweh, and said, “Skin for skin. Yes, all that a man has he will give for his life. +\v 5 But stretch out your hand now, and touch his bone and his flesh, and he will renounce you to your face.” +\p +\v 6 Yahweh said to Satan, “Behold, he is in your hand. Only spare his life.” +\p +\v 7 So Satan went out from the presence of Yahweh, and struck Job with painful sores from the sole of his foot to his head. +\v 8 He took for himself a potsherd to scrape himself with, and he sat among the ashes. +\v 9 Then his wife said to him, “Do you still maintain your integrity? Renounce God, and die.” +\p +\v 10 But he said to her, “You speak as one of the foolish women would speak. What? Shall we receive good at the hand of God, and shall we not receive evil?” +\p In all this Job didn’t sin with his lips. +\v 11 Now when Job’s three friends heard of all this evil that had come on him, they each came from his own place: Eliphaz the Temanite, Bildad the Shuhite, and Zophar the Naamathite; and they made an appointment together to come to sympathize with him and to comfort him. +\v 12 When they lifted up their eyes from a distance, and didn’t recognize him, they raised their voices, and wept; and they each tore his robe, and sprinkled dust on their heads toward the sky. +\v 13 So they sat down with him on the ground seven days and seven nights, and no one spoke a word to him, for they saw that his grief was very great. +\c 3 +\p +\v 1 After this Job opened his mouth, and cursed the day of his birth. +\v 2 Job answered: +\q1 +\v 3 “Let the day perish in which I was born, +\q2 the night which said, ‘There is a boy conceived.’ +\q1 +\v 4 Let that day be darkness. +\q2 Don’t let God from above seek for it, +\q2 neither let the light shine on it. +\q1 +\v 5 Let darkness and the shadow of death claim it for their own. +\q2 Let a cloud dwell on it. +\q2 Let all that makes the day black terrify it. +\q1 +\v 6 As for that night, let thick darkness seize on it. +\q2 Let it not rejoice among the days of the year. +\q2 Let it not come into the number of the months. +\q1 +\v 7 Behold, let that night be barren. +\q2 Let no joyful voice come therein. +\q1 +\v 8 Let them curse it who curse the day, +\q2 who are ready to rouse up leviathan. +\q1 +\v 9 Let the stars of its twilight be dark. +\q2 Let it look for light, but have none, +\q2 neither let it see the eyelids of the morning, +\q1 +\v 10 because it didn’t shut up the doors of my mother’s womb, +\q2 nor did it hide trouble from my eyes. +\b +\q1 +\v 11 “Why didn’t I die from the womb? +\q2 Why didn’t I give up the spirit when my mother bore me? +\q1 +\v 12 Why did the knees receive me? +\q2 Or why the breast, that I should nurse? +\q1 +\v 13 For now I should have lain down and been quiet. +\q2 I should have slept, then I would have been at rest, +\q1 +\v 14 with kings and counselors of the earth, +\q2 who built up waste places for themselves; +\q1 +\v 15 or with princes who had gold, +\q2 who filled their houses with silver; +\q1 +\v 16 or as a hidden untimely birth I had not been, +\q2 as infants who never saw light. +\q1 +\v 17 There the wicked cease from troubling. +\q2 There the weary are at rest. +\q1 +\v 18 There the prisoners are at ease together. +\q2 They don’t hear the voice of the taskmaster. +\q1 +\v 19 The small and the great are there. +\q2 The servant is free from his master. +\b +\q1 +\v 20 “Why is light given to him who is in misery, +\q2 life to the bitter in soul, +\q1 +\v 21 who long for death, but it doesn’t come; +\q2 and dig for it more than for hidden treasures, +\q1 +\v 22 who rejoice exceedingly, +\q2 and are glad, when they can find the grave? +\q1 +\v 23 Why is light given to a man whose way is hidden, +\q2 whom God has hedged in? +\q1 +\v 24 For my sighing comes before I eat. +\q2 My groanings are poured out like water. +\q1 +\v 25 For the thing which I fear comes on me, +\q2 that which I am afraid of comes to me. +\q1 +\v 26 I am not at ease, neither am I quiet, neither do I have rest; +\q2 but trouble comes.” +\c 4 +\p +\v 1 Then Eliphaz the Temanite answered, +\q1 +\v 2 “If someone ventures to talk with you, will you be grieved? +\q2 But who can withhold himself from speaking? +\q1 +\v 3 Behold, you have instructed many, +\q2 you have strengthened the weak hands. +\q1 +\v 4 Your words have supported him who was falling, +\q2 you have made the feeble knees firm. +\q1 +\v 5 But now it has come to you, and you faint. +\q2 It touches you, and you are troubled. +\q1 +\v 6 Isn’t your piety your confidence? +\q2 Isn’t the integrity of your ways your hope? +\b +\q1 +\v 7 “Remember, now, whoever perished, being innocent? +\q2 Or where were the upright cut off? +\q1 +\v 8 According to what I have seen, those who plow iniquity +\q2 and sow trouble, reap the same. +\q1 +\v 9 By the breath of God they perish. +\q2 By the blast of his anger are they consumed. +\q1 +\v 10 The roaring of the lion, +\q2 and the voice of the fierce lion, +\q2 the teeth of the young lions, are broken. +\q1 +\v 11 The old lion perishes for lack of prey. +\q2 The cubs of the lioness are scattered abroad. +\b +\q1 +\v 12 “Now a thing was secretly brought to me. +\q2 My ear received a whisper of it. +\q1 +\v 13 In thoughts from the visions of the night, +\q2 when deep sleep falls on men, +\q1 +\v 14 fear came on me, and trembling, +\q2 which made all my bones shake. +\q1 +\v 15 Then a spirit passed before my face. +\q2 The hair of my flesh stood up. +\q1 +\v 16 It stood still, but I couldn’t discern its appearance. +\q2 A form was before my eyes. +\q2 Silence, then I heard a voice, saying, +\q1 +\v 17 ‘Shall mortal man be more just than God? +\q2 Shall a man be more pure than his Maker? +\q1 +\v 18 Behold, he puts no trust in his servants. +\q2 He charges his angels with error. +\q1 +\v 19 How much more those who dwell in houses of clay, +\q2 whose foundation is in the dust, +\q2 who are crushed before the moth! +\q1 +\v 20 Between morning and evening they are destroyed. +\q2 They perish forever without any regarding it. +\q1 +\v 21 Isn’t their tent cord plucked up within them? +\q2 They die, and that without wisdom.’ +\c 5 +\b +\q1 +\v 1 “Call now; is there any who will answer you? +\q2 To which of the holy ones will you turn? +\q1 +\v 2 For resentment kills the foolish man, +\q2 and jealousy kills the simple. +\q1 +\v 3 I have seen the foolish taking root, +\q2 but suddenly I cursed his habitation. +\q1 +\v 4 His children are far from safety. +\q2 They are crushed in the gate. +\q2 Neither is there any to deliver them, +\q1 +\v 5 whose harvest the hungry eat up, +\q2 and take it even out of the thorns. +\q2 The snare gapes for their substance. +\q1 +\v 6 For affliction doesn’t come out of the dust, +\q2 neither does trouble spring out of the ground; +\q1 +\v 7 but man is born to trouble, +\q2 as the sparks fly upward. +\b +\q1 +\v 8 “But as for me, I would seek God. +\q2 I would commit my cause to God, +\q1 +\v 9 who does great things that can’t be fathomed, +\q2 marvelous things without number; +\q1 +\v 10 who gives rain on the earth, +\q2 and sends waters on the fields; +\q1 +\v 11 so that he sets up on high those who are low, +\q2 those who mourn are exalted to safety. +\q1 +\v 12 He frustrates the plans of the crafty, +\q2 so that their hands can’t perform their enterprise. +\q1 +\v 13 He takes the wise in their own craftiness; +\q2 the counsel of the cunning is carried headlong. +\q1 +\v 14 They meet with darkness in the day time, +\q2 and grope at noonday as in the night. +\q1 +\v 15 But he saves from the sword of their mouth, +\q2 even the needy from the hand of the mighty. +\q1 +\v 16 So the poor has hope, +\q2 and injustice shuts her mouth. +\b +\q1 +\v 17 “Behold, happy is the man whom God corrects. +\q2 Therefore do not despise the chastening of the Almighty. +\q1 +\v 18 For he wounds and binds up. +\q2 He injures and his hands make whole. +\q1 +\v 19 He will deliver you in six troubles; +\q2 yes, in seven no evil will touch you. +\q1 +\v 20 In famine he will redeem you from death; +\q2 in war, from the power of the sword. +\q1 +\v 21 You will be hidden from the scourge of the tongue, +\q2 neither will you be afraid of destruction when it comes. +\q1 +\v 22 You will laugh at destruction and famine, +\q2 neither will you be afraid of the animals of the earth. +\q1 +\v 23 For you will be allied with the stones of the field. +\q2 The animals of the field will be at peace with you. +\q1 +\v 24 You will know that your tent is in peace. +\q2 You will visit your fold, and will miss nothing. +\q1 +\v 25 You will know also that your offspring\f + \fr 5:25 \ft or, seed\f* will be great, +\q2 your offspring as the grass of the earth. +\q1 +\v 26 You will come to your grave in a full age, +\q2 like a shock of grain comes in its season. +\q1 +\v 27 Behold, we have researched it. It is so. +\q2 Hear it, and know it for your good.” +\b +\c 6 +\p +\v 1 Then Job answered, +\q1 +\v 2 “Oh that my anguish were weighed, +\q2 and all my calamity laid in the balances! +\q1 +\v 3 For now it would be heavier than the sand of the seas, +\q2 therefore my words have been rash. +\q1 +\v 4 For the arrows of the Almighty are within me. +\q2 My spirit drinks up their poison. +\q1 The terrors of God set themselves in array against me. +\q2 +\v 5 Does the wild donkey bray when he has grass? +\q1 Or does the ox low over his fodder? +\q2 +\v 6 Can that which has no flavor be eaten without salt? +\q1 Or is there any taste in the white of an egg? +\q2 +\v 7 My soul refuses to touch them. +\q1 They are as loathsome food to me. +\b +\q1 +\v 8 “Oh that I might have my request, +\q2 that God would grant the thing that I long for, +\q1 +\v 9 even that it would please God to crush me; +\q2 that he would let loose his hand, and cut me off! +\q1 +\v 10 Let it still be my consolation, +\q2 yes, let me exult in pain that doesn’t spare, +\q2 that I have not denied the words of the Holy One. +\q1 +\v 11 What is my strength, that I should wait? +\q2 What is my end, that I should be patient? +\q1 +\v 12 Is my strength the strength of stones? +\q2 Or is my flesh of bronze? +\q1 +\v 13 Isn’t it that I have no help in me, +\q2 that wisdom is driven away from me? +\b +\q1 +\v 14 “To him who is ready to faint, kindness should be shown from his friend; +\q2 even to him who forsakes the fear of the Almighty. +\q1 +\v 15 My brothers have dealt deceitfully as a brook, +\q2 as the channel of brooks that pass away; +\q1 +\v 16 which are black by reason of the ice, +\q2 in which the snow hides itself. +\q1 +\v 17 In the dry season, they vanish. +\q2 When it is hot, they are consumed out of their place. +\q1 +\v 18 The caravans that travel beside them turn away. +\q2 They go up into the waste, and perish. +\q1 +\v 19 The caravans of Tema looked. +\q2 The companies of Sheba waited for them. +\q1 +\v 20 They were distressed because they were confident. +\q2 They came there, and were confounded. +\q1 +\v 21 For now you are nothing. +\q2 You see a terror, and are afraid. +\q1 +\v 22 Did I ever say, ‘Give to me?’ +\q2 or, ‘Offer a present for me from your substance?’ +\q1 +\v 23 or, ‘Deliver me from the adversary’s hand?’ +\q2 or, ‘Redeem me from the hand of the oppressors?’ +\b +\q1 +\v 24 “Teach me, and I will hold my peace. +\q2 Cause me to understand my error. +\q1 +\v 25 How forcible are words of uprightness! +\q2 But your reproof, what does it reprove? +\q1 +\v 26 Do you intend to reprove words, +\q2 since the speeches of one who is desperate are as wind? +\q1 +\v 27 Yes, you would even cast lots for the fatherless, +\q2 and make merchandise of your friend. +\q1 +\v 28 Now therefore be pleased to look at me, +\q2 for surely I will not lie to your face. +\q1 +\v 29 Please return. +\q2 Let there be no injustice. +\q2 Yes, return again. +\q2 My cause is righteous. +\q1 +\v 30 Is there injustice on my tongue? +\q2 Can’t my taste discern mischievous things? +\c 7 +\b +\q1 +\v 1 “Isn’t a man forced to labor on earth? +\q2 Aren’t his days like the days of a hired hand? +\q1 +\v 2 As a servant who earnestly desires the shadow, +\q2 as a hireling who looks for his wages, +\q1 +\v 3 so I am made to possess months of misery, +\q2 wearisome nights are appointed to me. +\q1 +\v 4 When I lie down, I say, +\q2 ‘When will I arise, and the night be gone?’ +\q2 I toss and turn until the dawning of the day. +\q1 +\v 5 My flesh is clothed with worms and clods of dust. +\q2 My skin closes up, and breaks out afresh. +\q1 +\v 6 My days are swifter than a weaver’s shuttle, +\q2 and are spent without hope. +\q1 +\v 7 Oh remember that my life is a breath. +\q2 My eye will no more see good. +\q1 +\v 8 The eye of him who sees me will see me no more. +\q2 Your eyes will be on me, but I will not be. +\q1 +\v 9 As the cloud is consumed and vanishes away, +\q2 so he who goes down to Sheol\f + \fr 7:9 \ft Sheol is the place of the dead.\f* will come up no more. +\q1 +\v 10 He will return no more to his house, +\q2 neither will his place know him any more. +\b +\q1 +\v 11 “Therefore I will not keep silent. +\q2 I will speak in the anguish of my spirit. +\q2 I will complain in the bitterness of my soul. +\q1 +\v 12 Am I a sea, or a sea monster, +\q2 that you put a guard over me? +\q1 +\v 13 When I say, ‘My bed will comfort me. +\q2 My couch will ease my complaint,’ +\q1 +\v 14 then you scare me with dreams +\q2 and terrify me through visions, +\q1 +\v 15 so that my soul chooses strangling, +\q2 death rather than my bones. +\q1 +\v 16 I loathe my life. +\q2 I don’t want to live forever. +\q2 Leave me alone, for my days are but a breath. +\q1 +\v 17 What is man, that you should magnify him, +\q2 that you should set your mind on him, +\q1 +\v 18 that you should visit him every morning, +\q2 and test him every moment? +\q1 +\v 19 How long will you not look away from me, +\q2 nor leave me alone until I swallow down my spittle? +\q1 +\v 20 If I have sinned, what do I do to you, you watcher of men? +\q2 Why have you set me as a mark for you, +\q2 so that I am a burden to myself? +\q1 +\v 21 Why do you not pardon my disobedience, and take away my iniquity? +\q2 For now will I lie down in the dust. +\q2 You will seek me diligently, but I will not be.” +\c 8 +\p +\v 1 Then Bildad the Shuhite answered, +\q1 +\v 2 “How long will you speak these things? +\q2 Shall the words of your mouth be a mighty wind? +\q1 +\v 3 Does God pervert justice? +\q2 Or does the Almighty pervert righteousness? +\q1 +\v 4 If your children have sinned against him, +\q2 he has delivered them into the hand of their disobedience. +\q1 +\v 5 If you want to seek God diligently, +\q2 make your supplication to the Almighty. +\q1 +\v 6 If you were pure and upright, +\q2 surely now he would awaken for you, +\q1 and make the habitation of your righteousness prosperous. +\q2 +\v 7 Though your beginning was small, +\q1 yet your latter end would greatly increase. +\b +\q1 +\v 8 “Please inquire of past generations. +\q2 Find out about the learning of their fathers. +\q1 +\v 9 (For we are but of yesterday, and know nothing, +\q2 because our days on earth are a shadow.) +\q1 +\v 10 Shall they not teach you, tell you, +\q2 and utter words out of their heart? +\b +\q1 +\v 11 “Can the papyrus grow up without mire? +\q2 Can the rushes grow without water? +\q1 +\v 12 While it is yet in its greenness, not cut down, +\q2 it withers before any other reed. +\q1 +\v 13 So are the paths of all who forget God. +\q2 The hope of the godless man will perish, +\q1 +\v 14 whose confidence will break apart, +\q2 whose trust is a spider’s web. +\q1 +\v 15 He will lean on his house, but it will not stand. +\q2 He will cling to it, but it will not endure. +\q1 +\v 16 He is green before the sun. +\q2 His shoots go out along his garden. +\q1 +\v 17 His roots are wrapped around the rock pile. +\q2 He sees the place of stones. +\q1 +\v 18 If he is destroyed from his place, +\q2 then it will deny him, saying, ‘I have not seen you.’ +\q1 +\v 19 Behold, this is the joy of his way. +\q2 Out of the earth, others will spring. +\b +\q1 +\v 20 “Behold, God will not cast away a blameless man, +\q2 neither will he uphold the evildoers. +\q1 +\v 21 He will still fill your mouth with laughter, +\q2 your lips with shouting. +\q1 +\v 22 Those who hate you will be clothed with shame. +\q2 The tent of the wicked will be no more.” +\c 9 +\p +\v 1 Then Job answered, +\q1 +\v 2 “Truly I know that it is so, +\q2 but how can man be just with God? +\q1 +\v 3 If he is pleased to contend with him, +\q2 he can’t answer him one time in a thousand. +\q1 +\v 4 God is wise in heart, and mighty in strength. +\q2 Who has hardened himself against him and prospered? +\q1 +\v 5 He removes the mountains, and they don’t know it, +\q2 when he overturns them in his anger. +\q1 +\v 6 He shakes the earth out of its place. +\q2 Its pillars tremble. +\q1 +\v 7 He commands the sun and it doesn’t rise, +\q2 and seals up the stars. +\q1 +\v 8 He alone stretches out the heavens, +\q2 and treads on the waves of the sea. +\q1 +\v 9 He makes the Bear, Orion, and the Pleiades, +\q2 and the rooms of the south. +\q1 +\v 10 He does great things past finding out; +\q2 yes, marvelous things without number. +\q1 +\v 11 Behold, he goes by me, and I don’t see him. +\q2 He passes on also, but I don’t perceive him. +\q1 +\v 12 Behold, he snatches away. +\q2 Who can hinder him? +\q2 Who will ask him, ‘What are you doing?’ +\b +\q1 +\v 13 “God will not withdraw his anger. +\q2 The helpers of Rahab stoop under him. +\q1 +\v 14 How much less will I answer him, +\q2 and choose my words to argue with him? +\q1 +\v 15 Though I were righteous, yet I wouldn’t answer him. +\q2 I would make supplication to my judge. +\q1 +\v 16 If I had called, and he had answered me, +\q2 yet I wouldn’t believe that he listened to my voice. +\q1 +\v 17 For he breaks me with a storm, +\q2 and multiplies my wounds without cause. +\q1 +\v 18 He will not allow me to catch my breath, +\q2 but fills me with bitterness. +\q1 +\v 19 If it is a matter of strength, behold, he is mighty! +\q2 If of justice, ‘Who,’ says he, ‘will summon me?’ +\q1 +\v 20 Though I am righteous, my own mouth will condemn me. +\q2 Though I am blameless, it will prove me perverse. +\q1 +\v 21 I am blameless. +\q2 I don’t respect myself. +\q2 I despise my life. +\b +\q1 +\v 22 “It is all the same. +\q2 Therefore I say he destroys the blameless and the wicked. +\q1 +\v 23 If the scourge kills suddenly, +\q2 he will mock at the trial of the innocent. +\q1 +\v 24 The earth is given into the hand of the wicked. +\q2 He covers the faces of its judges. +\q2 If not he, then who is it? +\b +\q1 +\v 25 “Now my days are swifter than a runner. +\q2 They flee away. They see no good. +\q1 +\v 26 They have passed away as the swift ships, +\q2 as the eagle that swoops on the prey. +\q1 +\v 27 If I say, ‘I will forget my complaint, +\q2 I will put off my sad face, and cheer up,’ +\q1 +\v 28 I am afraid of all my sorrows. +\q2 I know that you will not hold me innocent. +\q1 +\v 29 I will be condemned. +\q2 Why then do I labor in vain? +\q1 +\v 30 If I wash myself with snow, +\q2 and cleanse my hands with lye, +\q1 +\v 31 yet you will plunge me in the ditch. +\q2 My own clothes will abhor me. +\q1 +\v 32 For he is not a man, as I am, that I should answer him, +\q2 that we should come together in judgment. +\q1 +\v 33 There is no umpire between us, +\q2 that might lay his hand on us both. +\q1 +\v 34 Let him take his rod away from me. +\q2 Let his terror not make me afraid; +\q1 +\v 35 then I would speak, and not fear him, +\q2 for I am not so in myself. +\b +\c 10 +\b +\q1 +\v 1 “My soul is weary of my life. +\q2 I will give free course to my complaint. +\q2 I will speak in the bitterness of my soul. +\q1 +\v 2 I will tell God, ‘Do not condemn me. +\q2 Show me why you contend with me. +\q1 +\v 3 Is it good to you that you should oppress, +\q2 that you should despise the work of your hands, +\q2 and smile on the counsel of the wicked? +\q1 +\v 4 Do you have eyes of flesh? +\q2 Or do you see as man sees? +\q1 +\v 5 Are your days as the days of mortals, +\q2 or your years as man’s years, +\q1 +\v 6 that you inquire after my iniquity, +\q2 and search after my sin? +\q1 +\v 7 Although you know that I am not wicked, +\q2 there is no one who can deliver out of your hand. +\b +\q1 +\v 8 “‘Your hands have framed me and fashioned me altogether, +\q2 yet you destroy me. +\q1 +\v 9 Remember, I beg you, that you have fashioned me as clay. +\q2 Will you bring me into dust again? +\q1 +\v 10 Haven’t you poured me out like milk, +\q2 and curdled me like cheese? +\q1 +\v 11 You have clothed me with skin and flesh, +\q2 and knit me together with bones and sinews. +\q1 +\v 12 You have granted me life and loving kindness. +\q2 Your visitation has preserved my spirit. +\q1 +\v 13 Yet you hid these things in your heart. +\q2 I know that this is with you: +\q1 +\v 14 if I sin, then you mark me. +\q2 You will not acquit me from my iniquity. +\q1 +\v 15 If I am wicked, woe to me. +\q2 If I am righteous, I still will not lift up my head, +\q2 being filled with disgrace, +\q2 and conscious of my affliction. +\q1 +\v 16 If my head is held high, you hunt me like a lion. +\q2 Again you show yourself powerful to me. +\q1 +\v 17 You renew your witnesses against me, +\q2 and increase your indignation on me. +\q2 Changes and warfare are with me. +\b +\q1 +\v 18 “‘Why, then, have you brought me out of the womb? +\q2 I wish I had given up the spirit, and no eye had seen me. +\q1 +\v 19 I should have been as though I had not been. +\q2 I should have been carried from the womb to the grave. +\q1 +\v 20 Aren’t my days few? +\q2 Stop! +\q1 Leave me alone, that I may find a little comfort, +\q2 +\v 21 before I go where I will not return from, +\q2 to the land of darkness and of the shadow of death; +\q1 +\v 22 the land dark as midnight, +\q2 of the shadow of death, +\q2 without any order, +\q2 where the light is as midnight.’” +\c 11 +\p +\v 1 Then Zophar, the Naamathite, answered, +\q1 +\v 2 “Shouldn’t the multitude of words be answered? +\q2 Should a man full of talk be justified? +\q1 +\v 3 Should your boastings make men hold their peace? +\q2 When you mock, will no man make you ashamed? +\q1 +\v 4 For you say, ‘My doctrine is pure. +\q2 I am clean in your eyes.’ +\q1 +\v 5 But oh that God would speak, +\q2 and open his lips against you, +\q1 +\v 6 that he would show you the secrets of wisdom! +\q2 For true wisdom has two sides. +\q2 Know therefore that God exacts of you less than your iniquity deserves. +\b +\q1 +\v 7 “Can you fathom the mystery of God? +\q2 Or can you probe the limits of the Almighty? +\q1 +\v 8 They are high as heaven. What can you do? +\q2 They are deeper than Sheol.\f + \fr 11:8 \ft Sheol is the place of the dead.\f* What can you know? +\q1 +\v 9 Its measure is longer than the earth, +\q2 and broader than the sea. +\q1 +\v 10 If he passes by, or confines, +\q2 or convenes a court, then who can oppose him? +\q1 +\v 11 For he knows false men. +\q2 He sees iniquity also, even though he doesn’t consider it. +\q1 +\v 12 An empty-headed man becomes wise +\q2 when a man is born as a wild donkey’s colt. +\b +\q1 +\v 13 “If you set your heart aright, +\q2 stretch out your hands toward him. +\q1 +\v 14 If iniquity is in your hand, put it far away. +\q2 Don’t let unrighteousness dwell in your tents. +\q1 +\v 15 Surely then you will lift up your face without spot. +\q2 Yes, you will be steadfast, and will not fear, +\q2 +\v 16 for you will forget your misery. +\q2 You will remember it like waters that have passed away. +\q1 +\v 17 Life will be clearer than the noonday. +\q2 Though there is darkness, it will be as the morning. +\q1 +\v 18 You will be secure, because there is hope. +\q2 Yes, you will search, and will take your rest in safety. +\q1 +\v 19 Also you will lie down, and no one will make you afraid. +\q2 Yes, many will court your favor. +\q1 +\v 20 But the eyes of the wicked will fail. +\q2 They will have no way to flee. +\q2 Their hope will be the giving up of the spirit.” +\c 12 +\p +\v 1 Then Job answered, +\q1 +\v 2 “No doubt, but you are the people, +\q2 and wisdom will die with you. +\q1 +\v 3 But I have understanding as well as you; +\q2 I am not inferior to you. +\q2 Yes, who doesn’t know such things as these? +\q1 +\v 4 I am like one who is a joke to his neighbor, +\q2 I, who called on God, and he answered. +\q2 The just, the blameless man is a joke. +\q1 +\v 5 In the thought of him who is at ease there is contempt for misfortune. +\q2 It is ready for them whose foot slips. +\q1 +\v 6 The tents of robbers prosper. +\q2 Those who provoke God are secure, +\q2 who carry their god in their hands. +\b +\q1 +\v 7 “But ask the animals now, and they will teach you; +\q2 the birds of the sky, and they will tell you. +\q1 +\v 8 Or speak to the earth, and it will teach you. +\q2 The fish of the sea will declare to you. +\q1 +\v 9 Who doesn’t know that in all these, +\q2 Yahweh’s hand has done this, +\q1 +\v 10 in whose hand is the life of every living thing, +\q2 and the breath of all mankind? +\q1 +\v 11 Doesn’t the ear try words, +\q2 even as the palate tastes its food? +\q1 +\v 12 With aged men is wisdom, +\q2 in length of days understanding. +\b +\q1 +\v 13 “With God is wisdom and might. +\q2 He has counsel and understanding. +\q1 +\v 14 Behold, he breaks down, and it can’t be built again. +\q2 He imprisons a man, and there can be no release. +\q1 +\v 15 Behold, he withholds the waters, and they dry up. +\q2 Again, he sends them out, and they overturn the earth. +\q1 +\v 16 With him is strength and wisdom. +\q2 The deceived and the deceiver are his. +\q1 +\v 17 He leads counselors away stripped. +\q2 He makes judges fools. +\q1 +\v 18 He loosens the bond of kings. +\q2 He binds their waist with a belt. +\q1 +\v 19 He leads priests away stripped, +\q2 and overthrows the mighty. +\q1 +\v 20 He removes the speech of those who are trusted, +\q2 and takes away the understanding of the elders. +\q1 +\v 21 He pours contempt on princes, +\q2 and loosens the belt of the strong. +\q1 +\v 22 He uncovers deep things out of darkness, +\q2 and brings out to light the shadow of death. +\q1 +\v 23 He increases the nations, and he destroys them. +\q2 He enlarges the nations, and he leads them captive. +\q1 +\v 24 He takes away understanding from the chiefs of the people of the earth, +\q2 and causes them to wander in a wilderness where there is no way. +\q1 +\v 25 They grope in the dark without light. +\q2 He makes them stagger like a drunken man. +\b +\c 13 +\b +\q1 +\v 1 “Behold, my eye has seen all this. +\q2 My ear has heard and understood it. +\q1 +\v 2 What you know, I know also. +\q2 I am not inferior to you. +\b +\q1 +\v 3 “Surely I would speak to the Almighty. +\q2 I desire to reason with God. +\q1 +\v 4 But you are forgers of lies. +\q2 You are all physicians of no value. +\q1 +\v 5 Oh that you would be completely silent! +\q2 Then you would be wise. +\q1 +\v 6 Hear now my reasoning. +\q2 Listen to the pleadings of my lips. +\q1 +\v 7 Will you speak unrighteously for God, +\q2 and talk deceitfully for him? +\q1 +\v 8 Will you show partiality to him? +\q2 Will you contend for God? +\q1 +\v 9 Is it good that he should search you out? +\q2 Or as one deceives a man, will you deceive him? +\q1 +\v 10 He will surely reprove you +\q2 if you secretly show partiality. +\q1 +\v 11 Won’t his majesty make you afraid +\q2 and his dread fall on you? +\q1 +\v 12 Your memorable sayings are proverbs of ashes. +\q2 Your defenses are defenses of clay. +\b +\q1 +\v 13 “Be silent! +\q2 Leave me alone, that I may speak. +\q2 Let come on me what will. +\q1 +\v 14 Why should I take my flesh in my teeth, +\q2 and put my life in my hand? +\q1 +\v 15 Behold, he will kill me. +\q2 I have no hope. +\q2 Nevertheless, I will maintain my ways before him. +\q1 +\v 16 This also will be my salvation, +\q2 that a godless man will not come before him. +\q1 +\v 17 Listen carefully to my speech. +\q2 Let my declaration be in your ears. +\q1 +\v 18 See now, I have set my cause in order. +\q2 I know that I am righteous. +\q1 +\v 19 Who is he who will contend with me? +\q2 For then would I hold my peace and give up the spirit. +\b +\q1 +\v 20 “Only don’t do two things to me, +\q2 then I will not hide myself from your face: +\q1 +\v 21 withdraw your hand far from me, +\q2 and don’t let your terror make me afraid. +\q1 +\v 22 Then call, and I will answer, +\q2 or let me speak, and you answer me. +\q1 +\v 23 How many are my iniquities and sins? +\q2 Make me know my disobedience and my sin. +\q1 +\v 24 Why do you hide your face, +\q2 and consider me your enemy? +\q1 +\v 25 Will you harass a driven leaf? +\q2 Will you pursue the dry stubble? +\q1 +\v 26 For you write bitter things against me, +\q2 and make me inherit the iniquities of my youth. +\q1 +\v 27 You also put my feet in the stocks, +\q2 and mark all my paths. +\q2 You set a bound to the soles of my feet, +\q1 +\v 28 though I am decaying like a rotten thing, +\q2 like a garment that is moth-eaten. +\b +\c 14 +\b +\q1 +\v 1 “Man, who is born of a woman, +\q2 is of few days, and full of trouble. +\q1 +\v 2 He grows up like a flower, and is cut down. +\q2 He also flees like a shadow, and doesn’t continue. +\q1 +\v 3 Do you open your eyes on such a one, +\q2 and bring me into judgment with you? +\q1 +\v 4 Who can bring a clean thing out of an unclean? +\q2 Not one. +\q2 +\v 5 Seeing his days are determined, +\q2 the number of his months is with you, +\q2 and you have appointed his bounds that he can’t pass. +\q1 +\v 6 Look away from him, that he may rest, +\q2 until he accomplishes, as a hireling, his day. +\b +\q1 +\v 7 “For there is hope for a tree if it is cut down, +\q2 that it will sprout again, +\q2 that the tender branch of it will not cease. +\q1 +\v 8 Though its root grows old in the earth, +\q2 and its stock dies in the ground, +\q1 +\v 9 yet through the scent of water it will bud, +\q2 and sprout boughs like a plant. +\q1 +\v 10 But man dies, and is laid low. +\q2 Yes, man gives up the spirit, and where is he? +\q1 +\v 11 As the waters fail from the sea, +\q2 and the river wastes and dries up, +\q1 +\v 12 so man lies down and doesn’t rise. +\q2 Until the heavens are no more, they will not awake, +\q2 nor be roused out of their sleep. +\b +\q1 +\v 13 “Oh that you would hide me in Sheol,\f + \fr 14:13 \ft Sheol is the place of the dead.\f* +\q2 that you would keep me secret until your wrath is past, +\q2 that you would appoint me a set time and remember me! +\q1 +\v 14 If a man dies, will he live again? +\q2 I would wait all the days of my warfare, +\q2 until my release should come. +\q1 +\v 15 You would call, and I would answer you. +\q2 You would have a desire for the work of your hands. +\q1 +\v 16 But now you count my steps. +\q2 Don’t you watch over my sin? +\q1 +\v 17 My disobedience is sealed up in a bag. +\q2 You fasten up my iniquity. +\b +\q1 +\v 18 “But the mountain falling comes to nothing. +\q2 The rock is removed out of its place. +\q1 +\v 19 The waters wear the stones. +\q2 The torrents of it wash away the dust of the earth. +\q2 So you destroy the hope of man. +\q1 +\v 20 You forever prevail against him, and he departs. +\q2 You change his face, and send him away. +\q1 +\v 21 His sons come to honor, and he doesn’t know it. +\q2 They are brought low, but he doesn’t perceive it of them. +\q1 +\v 22 But his flesh on him has pain, +\q2 and his soul within him mourns.” +\b +\c 15 +\p +\v 1 Then Eliphaz the Temanite answered, +\q1 +\v 2 “Should a wise man answer with vain knowledge, +\q2 and fill himself with the east wind? +\q1 +\v 3 Should he reason with unprofitable talk, +\q2 or with speeches with which he can do no good? +\q1 +\v 4 Yes, you do away with fear, +\q2 and hinder devotion before God. +\q1 +\v 5 For your iniquity teaches your mouth, +\q2 and you choose the language of the crafty. +\q1 +\v 6 Your own mouth condemns you, and not I. +\q2 Yes, your own lips testify against you. +\b +\q1 +\v 7 “Are you the first man who was born? +\q2 Or were you brought out before the hills? +\q1 +\v 8 Have you heard the secret counsel of God? +\q2 Do you limit wisdom to yourself? +\q1 +\v 9 What do you know that we don’t know? +\q2 What do you understand which is not in us? +\q1 +\v 10 With us are both the gray-headed and the very aged men, +\q2 much older than your father. +\q1 +\v 11 Are the consolations of God too small for you, +\q2 even the word that is gentle toward you? +\q1 +\v 12 Why does your heart carry you away? +\q2 Why do your eyes flash, +\q1 +\v 13 that you turn your spirit against God, +\q2 and let such words go out of your mouth? +\q1 +\v 14 What is man, that he should be clean? +\q2 What is he who is born of a woman, that he should be righteous? +\q1 +\v 15 Behold, he puts no trust in his holy ones. +\q2 Yes, the heavens are not clean in his sight; +\q1 +\v 16 how much less one who is abominable and corrupt, +\q2 a man who drinks iniquity like water! +\b +\q1 +\v 17 “I will show you, listen to me; +\q2 that which I have seen I will declare +\q1 +\v 18 (which wise men have told by their fathers, +\q2 and have not hidden it; +\q1 +\v 19 to whom alone the land was given, +\q2 and no stranger passed among them): +\q1 +\v 20 the wicked man writhes in pain all his days, +\q2 even the number of years that are laid up for the oppressor. +\q1 +\v 21 A sound of terrors is in his ears. +\q2 In prosperity the destroyer will come on him. +\q1 +\v 22 He doesn’t believe that he will return out of darkness. +\q2 He is waited for by the sword. +\q1 +\v 23 He wanders abroad for bread, saying, ‘Where is it?’ +\q2 He knows that the day of darkness is ready at his hand. +\q1 +\v 24 Distress and anguish make him afraid. +\q2 They prevail against him, as a king ready to the battle. +\q1 +\v 25 Because he has stretched out his hand against God, +\q2 and behaves himself proudly against the Almighty, +\q1 +\v 26 he runs at him with a stiff neck, +\q2 with the thick shields of his bucklers, +\q1 +\v 27 because he has covered his face with his fatness, +\q2 and gathered fat on his thighs. +\q1 +\v 28 He has lived in desolate cities, +\q2 in houses which no one inhabited, +\q2 which were ready to become heaps. +\q1 +\v 29 He will not be rich, neither will his substance continue, +\q2 neither will their possessions be extended on the earth. +\q1 +\v 30 He will not depart out of darkness. +\q2 The flame will dry up his branches. +\q2 He will go away by the breath of God’s mouth. +\q1 +\v 31 Let him not trust in emptiness, deceiving himself, +\q2 for emptiness will be his reward. +\q1 +\v 32 It will be accomplished before his time. +\q2 His branch will not be green. +\q1 +\v 33 He will shake off his unripe grape as the vine, +\q2 and will cast off his flower as the olive tree. +\q1 +\v 34 For the company of the godless will be barren, +\q2 and fire will consume the tents of bribery. +\q1 +\v 35 They conceive mischief and produce iniquity. +\q2 Their heart prepares deceit.” +\b +\c 16 +\p +\v 1 Then Job answered, +\q1 +\v 2 “I have heard many such things. +\q2 You are all miserable comforters! +\q1 +\v 3 Shall vain words have an end? +\q2 Or what provokes you that you answer? +\q1 +\v 4 I also could speak as you do. +\q2 If your soul were in my soul’s place, +\q2 I could join words together against you, +\q2 and shake my head at you, +\q1 +\v 5 but I would strengthen you with my mouth. +\q2 The solace of my lips would relieve you. +\b +\q1 +\v 6 “Though I speak, my grief is not subsided. +\q2 Though I forbear, what am I eased? +\q1 +\v 7 But now, God, you have surely worn me out. +\q2 You have made all my company desolate. +\q1 +\v 8 You have shriveled me up. This is a witness against me. +\q2 My leanness rises up against me. +\q2 It testifies to my face. +\q1 +\v 9 He has torn me in his wrath and persecuted me. +\q2 He has gnashed on me with his teeth. +\q2 My adversary sharpens his eyes on me. +\q1 +\v 10 They have gaped on me with their mouth. +\q2 They have struck me on the cheek reproachfully. +\q2 They gather themselves together against me. +\q1 +\v 11 God delivers me to the ungodly, +\q2 and casts me into the hands of the wicked. +\q1 +\v 12 I was at ease, and he broke me apart. +\q2 Yes, he has taken me by the neck, and dashed me to pieces. +\q2 He has also set me up for his target. +\q1 +\v 13 His archers surround me. +\q2 He splits my kidneys apart, and does not spare. +\q2 He pours out my bile on the ground. +\q1 +\v 14 He breaks me with breach on breach. +\q2 He runs at me like a giant. +\q1 +\v 15 I have sewed sackcloth on my skin, +\q2 and have thrust my horn in the dust. +\q1 +\v 16 My face is red with weeping. +\q2 Deep darkness is on my eyelids, +\q1 +\v 17 although there is no violence in my hands, +\q2 and my prayer is pure. +\b +\q1 +\v 18 “Earth, don’t cover my blood. +\q2 Let my cry have no place to rest. +\q1 +\v 19 Even now, behold, my witness is in heaven. +\q2 He who vouches for me is on high. +\q1 +\v 20 My friends scoff at me. +\q2 My eyes pour out tears to God, +\q1 +\v 21 that he would maintain the right of a man with God, +\q2 of a son of man with his neighbor! +\q1 +\v 22 For when a few years have come, +\q2 I will go the way of no return. +\b +\c 17 +\q1 +\v 1 “My spirit is consumed. +\q2 My days are extinct +\q2 and the grave is ready for me. +\q1 +\v 2 Surely there are mockers with me. +\q2 My eye dwells on their provocation. +\b +\q1 +\v 3 “Now give a pledge. Be collateral for me with yourself. +\q2 Who is there who will strike hands with me? +\q1 +\v 4 For you have hidden their heart from understanding, +\q2 therefore you will not exalt them. +\q1 +\v 5 He who denounces his friends for plunder, +\q2 even the eyes of his children will fail. +\b +\q1 +\v 6 “But he has made me a byword of the people. +\q2 They spit in my face. +\q1 +\v 7 My eye also is dim by reason of sorrow. +\q2 All my members are as a shadow. +\q1 +\v 8 Upright men will be astonished at this. +\q2 The innocent will stir himself up against the godless. +\q1 +\v 9 Yet the righteous will hold to his way. +\q2 He who has clean hands will grow stronger and stronger. +\q1 +\v 10 But as for you all, come back. +\q2 I will not find a wise man among you. +\q1 +\v 11 My days are past. +\q2 My plans are broken off, +\q2 as are the thoughts of my heart. +\q1 +\v 12 They change the night into day, +\q2 saying ‘The light is near’ in the presence of darkness. +\q1 +\v 13 If I look for Sheol\f + \fr 17:13 \ft Sheol is the place of the dead.\f* as my house, +\q2 if I have spread my couch in the darkness, +\q1 +\v 14 if I have said to corruption, ‘You are my father,’ +\q2 and to the worm, ‘My mother,’ and ‘My sister,’ +\q1 +\v 15 where then is my hope? +\q2 As for my hope, who will see it? +\q1 +\v 16 Shall it go down with me to the gates of Sheol,\f + \fr 17:16 \ft Sheol is the place of the dead.\f* +\q2 or descend together into the dust?” +\b +\c 18 +\p +\v 1 Then Bildad the Shuhite answered, +\q1 +\v 2 “How long will you hunt for words? +\q2 Consider, and afterwards we will speak. +\q1 +\v 3 Why are we counted as animals, +\q2 which have become unclean in your sight? +\q1 +\v 4 You who tear yourself in your anger, +\q2 will the earth be forsaken for you? +\q2 Or will the rock be removed out of its place? +\b +\q1 +\v 5 “Yes, the light of the wicked will be put out. +\q2 The spark of his fire won’t shine. +\q1 +\v 6 The light will be dark in his tent. +\q2 His lamp above him will be put out. +\q1 +\v 7 The steps of his strength will be shortened. +\q2 His own counsel will cast him down. +\q1 +\v 8 For he is cast into a net by his own feet, +\q2 and he wanders into its mesh. +\q1 +\v 9 A snare will take him by the heel. +\q2 A trap will catch him. +\q1 +\v 10 A noose is hidden for him in the ground, +\q2 a trap for him on the path. +\q1 +\v 11 Terrors will make him afraid on every side, +\q2 and will chase him at his heels. +\q1 +\v 12 His strength will be famished. +\q2 Calamity will be ready at his side. +\q1 +\v 13 The members of his body will be devoured. +\q2 The firstborn of death will devour his members. +\q1 +\v 14 He will be rooted out of the security of his tent. +\q2 He will be brought to the king of terrors. +\q1 +\v 15 There will dwell in his tent that which is none of his. +\q2 Sulfur will be scattered on his habitation. +\q1 +\v 16 His roots will be dried up beneath. +\q2 His branch will be cut off above. +\q1 +\v 17 His memory will perish from the earth. +\q2 He will have no name in the street. +\q1 +\v 18 He will be driven from light into darkness, +\q2 and chased out of the world. +\q1 +\v 19 He will have neither son nor grandson among his people, +\q2 nor any remaining where he lived. +\q1 +\v 20 Those who come after will be astonished at his day, +\q2 as those who went before were frightened. +\q1 +\v 21 Surely such are the dwellings of the unrighteous. +\q2 This is the place of him who doesn’t know God.” +\c 19 +\p +\v 1 Then Job answered, +\q1 +\v 2 “How long will you torment me, +\q2 and crush me with words? +\q1 +\v 3 You have reproached me ten times. +\q2 You aren’t ashamed that you attack me. +\q1 +\v 4 If it is true that I have erred, +\q2 my error remains with myself. +\q1 +\v 5 If indeed you will magnify yourselves against me, +\q2 and plead against me my reproach, +\q1 +\v 6 know now that God has subverted me, +\q2 and has surrounded me with his net. +\b +\q1 +\v 7 “Behold, I cry out of wrong, but I am not heard. +\q2 I cry for help, but there is no justice. +\q1 +\v 8 He has walled up my way so that I can’t pass, +\q2 and has set darkness in my paths. +\q1 +\v 9 He has stripped me of my glory, +\q2 and taken the crown from my head. +\q1 +\v 10 He has broken me down on every side, and I am gone. +\q2 He has plucked my hope up like a tree. +\q1 +\v 11 He has also kindled his wrath against me. +\q2 He counts me among his adversaries. +\q1 +\v 12 His troops come on together, +\q2 build a siege ramp against me, +\q2 and encamp around my tent. +\b +\q1 +\v 13 “He has put my brothers far from me. +\q2 My acquaintances are wholly estranged from me. +\q1 +\v 14 My relatives have gone away. +\q2 My familiar friends have forgotten me. +\q1 +\v 15 Those who dwell in my house and my maids consider me a stranger. +\q2 I am an alien in their sight. +\q1 +\v 16 I call to my servant, and he gives me no answer. +\q2 I beg him with my mouth. +\q1 +\v 17 My breath is offensive to my wife. +\q2 I am loathsome to the children of my own mother. +\q1 +\v 18 Even young children despise me. +\q2 If I arise, they speak against me. +\q1 +\v 19 All my familiar friends abhor me. +\q2 They whom I loved have turned against me. +\q1 +\v 20 My bones stick to my skin and to my flesh. +\q2 I have escaped by the skin of my teeth. +\b +\q1 +\v 21 “Have pity on me. Have pity on me, you my friends, +\q2 for the hand of God has touched me. +\q1 +\v 22 Why do you persecute me as God, +\q2 and are not satisfied with my flesh? +\b +\q1 +\v 23 “Oh that my words were now written! +\q2 Oh that they were inscribed in a book! +\q1 +\v 24 That with an iron pen and lead +\q2 they were engraved in the rock forever! +\q1 +\v 25 But as for me, I know that my Redeemer lives. +\q2 In the end, he will stand upon the earth. +\q1 +\v 26 After my skin is destroyed, +\q2 then I will see God in my flesh, +\q1 +\v 27 whom I, even I, will see on my side. +\q2 My eyes will see, and not as a stranger. +\b +\q1 “My heart is consumed within me. +\q1 +\v 28 If you say, ‘How we will persecute him!’ +\q2 because the root of the matter is found in me, +\q1 +\v 29 be afraid of the sword, +\q2 for wrath brings the punishments of the sword, +\q2 that you may know there is a judgment.” +\c 20 +\p +\v 1 Then Zophar the Naamathite answered, +\q1 +\v 2 “Therefore my thoughts answer me, +\q2 even by reason of my haste that is in me. +\q1 +\v 3 I have heard the reproof which puts me to shame. +\q2 The spirit of my understanding answers me. +\q1 +\v 4 Don’t you know this from old time, +\q2 since man was placed on earth, +\q1 +\v 5 that the triumphing of the wicked is short, +\q2 the joy of the godless but for a moment? +\q1 +\v 6 Though his height mount up to the heavens, +\q2 and his head reach to the clouds, +\q1 +\v 7 yet he will perish forever like his own dung. +\q2 Those who have seen him will say, ‘Where is he?’ +\q1 +\v 8 He will fly away as a dream, and will not be found. +\q2 Yes, he will be chased away like a vision of the night. +\q1 +\v 9 The eye which saw him will see him no more, +\q2 neither will his place see him any more. +\q1 +\v 10 His children will seek the favor of the poor. +\q2 His hands will give back his wealth. +\q1 +\v 11 His bones are full of his youth, +\q2 but youth will lie down with him in the dust. +\b +\q1 +\v 12 “Though wickedness is sweet in his mouth, +\q2 though he hide it under his tongue, +\q1 +\v 13 though he spare it, and will not let it go, +\q2 but keep it still within his mouth, +\q1 +\v 14 yet his food in his bowels is turned. +\q2 It is cobra venom within him. +\q1 +\v 15 He has swallowed down riches, and he will vomit them up again. +\q2 God will cast them out of his belly. +\q1 +\v 16 He will suck cobra venom. +\q2 The viper’s tongue will kill him. +\q1 +\v 17 He will not look at the rivers, +\q2 the flowing streams of honey and butter. +\q1 +\v 18 He will restore that for which he labored, and will not swallow it down. +\q2 He will not rejoice according to the substance that he has gotten. +\q1 +\v 19 For he has oppressed and forsaken the poor. +\q2 He has violently taken away a house, and he will not build it up. +\b +\q1 +\v 20 “Because he knew no quietness within him, +\q2 he will not save anything of that in which he delights. +\q1 +\v 21 There was nothing left that he didn’t devour, +\q2 therefore his prosperity will not endure. +\q1 +\v 22 In the fullness of his sufficiency, distress will overtake him. +\q2 The hand of everyone who is in misery will come on him. +\q1 +\v 23 When he is about to fill his belly, God will cast the fierceness of his wrath on him. +\q2 It will rain on him while he is eating. +\q1 +\v 24 He will flee from the iron weapon. +\q2 The bronze arrow will strike him through. +\q1 +\v 25 He draws it out, and it comes out of his body. +\q2 Yes, the glittering point comes out of his liver. +\q2 Terrors are on him. +\q1 +\v 26 All darkness is laid up for his treasures. +\q2 An unfanned fire will devour him. +\q2 It will consume that which is left in his tent. +\q1 +\v 27 The heavens will reveal his iniquity. +\q2 The earth will rise up against him. +\q1 +\v 28 The increase of his house will depart. +\q2 They will rush away in the day of his wrath. +\q1 +\v 29 This is the portion of a wicked man from God, +\q2 the heritage appointed to him by God.” +\c 21 +\p +\v 1 Then Job answered, +\q1 +\v 2 “Listen diligently to my speech. +\q2 Let this be your consolation. +\q1 +\v 3 Allow me, and I also will speak. +\q2 After I have spoken, mock on. +\q1 +\v 4 As for me, is my complaint to man? +\q2 Why shouldn’t I be impatient? +\q1 +\v 5 Look at me, and be astonished. +\q2 Lay your hand on your mouth. +\q1 +\v 6 When I remember, I am troubled. +\q2 Horror takes hold of my flesh. +\b +\q1 +\v 7 “Why do the wicked live, +\q2 become old, yes, and grow mighty in power? +\q1 +\v 8 Their child is established with them in their sight, +\q2 their offspring before their eyes. +\q1 +\v 9 Their houses are safe from fear, +\q2 neither is the rod of God upon them. +\q1 +\v 10 Their bulls breed without fail. +\q2 Their cows calve, and don’t miscarry. +\q1 +\v 11 They send out their little ones like a flock. +\q2 Their children dance. +\q1 +\v 12 They sing to the tambourine and harp, +\q2 and rejoice at the sound of the pipe. +\q1 +\v 13 They spend their days in prosperity. +\q2 In an instant they go down to Sheol.\f + \fr 21:13 \ft Sheol is the place of the dead. \f* +\q1 +\v 14 They tell God, ‘Depart from us, +\q2 for we don’t want to know about your ways. +\q1 +\v 15 What is the Almighty, that we should serve him? +\q2 What profit should we have, if we pray to him?’ +\q1 +\v 16 Behold, their prosperity is not in their hand. +\q2 The counsel of the wicked is far from me. +\b +\q1 +\v 17 “How often is it that the lamp of the wicked is put out, +\q2 that their calamity comes on them, +\q2 that God distributes sorrows in his anger? +\q1 +\v 18 How often is it that they are as stubble before the wind, +\q2 as chaff that the storm carries away? +\q1 +\v 19 You say, ‘God lays up his iniquity for his children.’ +\q2 Let him recompense it to himself, that he may know it. +\q1 +\v 20 Let his own eyes see his destruction. +\q2 Let him drink of the wrath of the Almighty. +\q1 +\v 21 For what does he care for his house after him, +\q2 when the number of his months is cut off? +\b +\q1 +\v 22 “Shall any teach God knowledge, +\q2 since he judges those who are high? +\q1 +\v 23 One dies in his full strength, +\q2 being wholly at ease and quiet. +\q1 +\v 24 His pails are full of milk. +\q2 The marrow of his bones is moistened. +\q1 +\v 25 Another dies in bitterness of soul, +\q2 and never tastes of good. +\q1 +\v 26 They lie down alike in the dust. +\q2 The worm covers them. +\b +\q1 +\v 27 “Behold, I know your thoughts, +\q2 the plans with which you would wrong me. +\q1 +\v 28 For you say, ‘Where is the house of the prince? +\q2 Where is the tent in which the wicked lived?’ +\q1 +\v 29 Haven’t you asked wayfaring men? +\q2 Don’t you know their evidences, +\q1 +\v 30 that the evil man is reserved to the day of calamity, +\q2 that they are led out to the day of wrath? +\q1 +\v 31 Who will declare his way to his face? +\q2 Who will repay him what he has done? +\q1 +\v 32 Yet he will be borne to the grave. +\q2 Men will keep watch over the tomb. +\q1 +\v 33 The clods of the valley will be sweet to him. +\q2 All men will draw after him, +\q2 as there were innumerable before him. +\q1 +\v 34 So how can you comfort me with nonsense, +\q2 because in your answers there remains only falsehood?” +\c 22 +\p +\v 1 Then Eliphaz the Temanite answered, +\q1 +\v 2 “Can a man be profitable to God? +\q2 Surely he who is wise is profitable to himself. +\q1 +\v 3 Is it any pleasure to the Almighty that you are righteous? +\q2 Or does it benefit him that you make your ways perfect? +\q1 +\v 4 Is it for your piety that he reproves you, +\q2 that he enters with you into judgment? +\q1 +\v 5 Isn’t your wickedness great? +\q2 Neither is there any end to your iniquities. +\q1 +\v 6 For you have taken pledges from your brother for nothing, +\q2 and stripped the naked of their clothing. +\q1 +\v 7 You haven’t given water to the weary to drink, +\q2 and you have withheld bread from the hungry. +\q1 +\v 8 But as for the mighty man, he had the earth. +\q2 The honorable man, he lived in it. +\q1 +\v 9 You have sent widows away empty, +\q2 and the arms of the fatherless have been broken. +\q1 +\v 10 Therefore snares are around you. +\q2 Sudden fear troubles you, +\q1 +\v 11 or darkness, so that you can not see, +\q2 and floods of waters cover you. +\b +\q1 +\v 12 “Isn’t God in the heights of heaven? +\q2 See the height of the stars, how high they are! +\q1 +\v 13 You say, ‘What does God know? +\q2 Can he judge through the thick darkness? +\q1 +\v 14 Thick clouds are a covering to him, so that he doesn’t see. +\q2 He walks on the vault of the sky.’ +\q1 +\v 15 Will you keep the old way, +\q2 which wicked men have trodden, +\q1 +\v 16 who were snatched away before their time, +\q2 whose foundation was poured out as a stream, +\q1 +\v 17 who said to God, ‘Depart from us!’ +\q2 and, ‘What can the Almighty do for us?’ +\q1 +\v 18 Yet he filled their houses with good things, +\q2 but the counsel of the wicked is far from me. +\q1 +\v 19 The righteous see it, and are glad. +\q2 The innocent ridicule them, +\q1 +\v 20 saying, ‘Surely those who rose up against us are cut off. +\q2 The fire has consumed their remnant.’ +\b +\q1 +\v 21 “Acquaint yourself with him now, and be at peace. +\q2 By it, good will come to you. +\q1 +\v 22 Please receive instruction from his mouth, +\q2 and lay up his words in your heart. +\q1 +\v 23 If you return to the Almighty, you will be built up, +\q2 if you put away unrighteousness far from your tents. +\q1 +\v 24 Lay your treasure in the dust, +\q2 the gold of Ophir among the stones of the brooks. +\q1 +\v 25 The Almighty will be your treasure, +\q2 and precious silver to you. +\q1 +\v 26 For then you will delight yourself in the Almighty, +\q2 and will lift up your face to God. +\q1 +\v 27 You will make your prayer to him, and he will hear you. +\q2 You will pay your vows. +\q1 +\v 28 You will also decree a thing, and it will be established to you. +\q2 Light will shine on your ways. +\q1 +\v 29 When they cast down, you will say, ‘be lifted up.’ +\q2 He will save the humble person. +\q1 +\v 30 He will even deliver him who is not innocent. +\q2 Yes, he will be delivered through the cleanness of your hands.” +\c 23 +\p +\v 1 Then Job answered, +\q1 +\v 2 “Even today my complaint is rebellious. +\q2 His hand is heavy in spite of my groaning. +\q1 +\v 3 Oh that I knew where I might find him! +\q2 That I might come even to his seat! +\q1 +\v 4 I would set my cause in order before him, +\q2 and fill my mouth with arguments. +\q1 +\v 5 I would know the words which he would answer me, +\q2 and understand what he would tell me. +\q1 +\v 6 Would he contend with me in the greatness of his power? +\q2 No, but he would listen to me. +\q1 +\v 7 There the upright might reason with him, +\q2 so I should be delivered forever from my judge. +\b +\q1 +\v 8 “If I go east, he is not there. +\q2 If I go west, I can’t find him. +\q1 +\v 9 He works to the north, but I can’t see him. +\q2 He turns south, but I can’t catch a glimpse of him. +\b +\q1 +\v 10 But he knows the way that I take. +\q2 When he has tried me, I will come out like gold. +\q1 +\v 11 My foot has held fast to his steps. +\q2 I have kept his way, and not turned away. +\q1 +\v 12 I haven’t gone back from the commandment of his lips. +\q2 I have treasured up the words of his mouth more than my necessary food. +\q1 +\v 13 But he stands alone, and who can oppose him? +\q2 What his soul desires, even that he does. +\q1 +\v 14 For he performs that which is appointed for me. +\q2 Many such things are with him. +\q1 +\v 15 Therefore I am terrified at his presence. +\q2 When I consider, I am afraid of him. +\q1 +\v 16 For God has made my heart faint. +\q2 The Almighty has terrified me. +\q1 +\v 17 Because I was not cut off before the darkness, +\q2 neither did he cover the thick darkness from my face. +\b +\c 24 +\b +\q1 +\v 1 “Why aren’t times laid up by the Almighty? +\q2 Why don’t those who know him see his days? +\q1 +\v 2 There are people who remove the landmarks. +\q2 They violently take away flocks, and feed them. +\q1 +\v 3 They drive away the donkey of the fatherless, +\q2 and they take the widow’s ox for a pledge. +\q1 +\v 4 They turn the needy out of the way. +\q2 The poor of the earth all hide themselves. +\q1 +\v 5 Behold, as wild donkeys in the desert, +\q2 they go out to their work, seeking diligently for food. +\q1 The wilderness yields them bread for their children. +\q2 +\v 6 They cut their food in the field. +\q1 They glean the vineyard of the wicked. +\q2 +\v 7 They lie all night naked without clothing, +\q1 and have no covering in the cold. +\q2 +\v 8 They are wet with the showers of the mountains, +\q1 and embrace the rock for lack of a shelter. +\q2 +\v 9 There are those who pluck the fatherless from the breast, +\q1 and take a pledge of the poor, +\q2 +\v 10 so that they go around naked without clothing. +\q2 Being hungry, they carry the sheaves. +\q1 +\v 11 They make oil within the walls of these men. +\q2 They tread wine presses, and suffer thirst. +\q1 +\v 12 From out of the populous city, men groan. +\q2 The soul of the wounded cries out, +\q2 yet God doesn’t regard the folly. +\b +\q1 +\v 13 “These are of those who rebel against the light. +\q2 They don’t know its ways, +\q2 nor stay in its paths. +\q1 +\v 14 The murderer rises with the light. +\q2 He kills the poor and needy. +\q2 In the night he is like a thief. +\q1 +\v 15 The eye also of the adulterer waits for the twilight, +\q2 saying, ‘No eye will see me.’ +\q2 He disguises his face. +\q1 +\v 16 In the dark they dig through houses. +\q2 They shut themselves up in the daytime. +\q2 They don’t know the light. +\q1 +\v 17 For the morning is to all of them like thick darkness, +\q2 for they know the terrors of the thick darkness. +\b +\q1 +\v 18 “They are foam on the surface of the waters. +\q2 Their portion is cursed in the earth. +\q2 They don’t turn into the way of the vineyards. +\q1 +\v 19 Drought and heat consume the snow waters, +\q2 so does Sheol\f + \fr 24:19 \ft Sheol is the place of the dead.\f* those who have sinned. +\q1 +\v 20 The womb will forget him. +\q2 The worm will feed sweetly on him. +\q2 He will be no more remembered. +\q2 Unrighteousness will be broken as a tree. +\q1 +\v 21 He devours the barren who don’t bear. +\q2 He shows no kindness to the widow. +\q1 +\v 22 Yet God preserves the mighty by his power. +\q2 He rises up who has no assurance of life. +\q1 +\v 23 God gives them security, and they rest in it. +\q2 His eyes are on their ways. +\q1 +\v 24 They are exalted; yet a little while, and they are gone. +\q2 Yes, they are brought low, they are taken out of the way as all others, +\q2 and are cut off as the tops of the ears of grain. +\q1 +\v 25 If it isn’t so now, who will prove me a liar, +\q2 and make my speech worth nothing?” +\b +\c 25 +\p +\v 1 Then Bildad the Shuhite answered, +\q1 +\v 2 “Dominion and fear are with him. +\q2 He makes peace in his high places. +\q1 +\v 3 Can his armies be counted? +\q2 On whom does his light not arise? +\q1 +\v 4 How then can man be just with God? +\q2 Or how can he who is born of a woman be clean? +\q1 +\v 5 Behold, even the moon has no brightness, +\q2 and the stars are not pure in his sight; +\q1 +\v 6 How much less man, who is a worm, +\q2 and the son of man, who is a worm!” +\c 26 +\p +\v 1 Then Job answered, +\q1 +\v 2 “How have you helped him who is without power! +\q2 How have you saved the arm that has no strength! +\q1 +\v 3 How have you counseled him who has no wisdom, +\q2 and plentifully declared sound knowledge! +\q1 +\v 4 To whom have you uttered words? +\q2 Whose spirit came out of you? +\b +\q1 +\v 5 “The departed spirits tremble, +\q2 those beneath the waters and all that live in them. +\q1 +\v 6 Sheol\f + \fr 26:6 \ft Sheol is the place of the dead.\f* is naked before God, +\q2 and Abaddon\f + \fr 26:6 \ft Abaddon means Destroyer.\f* has no covering. +\q1 +\v 7 He stretches out the north over empty space, +\q2 and hangs the earth on nothing. +\q1 +\v 8 He binds up the waters in his thick clouds, +\q2 and the cloud is not burst under them. +\q1 +\v 9 He encloses the face of his throne, +\q2 and spreads his cloud on it. +\q1 +\v 10 He has described a boundary on the surface of the waters, +\q2 and to the confines of light and darkness. +\q1 +\v 11 The pillars of heaven tremble +\q2 and are astonished at his rebuke. +\q1 +\v 12 He stirs up the sea with his power, +\q2 and by his understanding he strikes through Rahab. +\q1 +\v 13 By his Spirit the heavens are garnished. +\q2 His hand has pierced the swift serpent. +\q1 +\v 14 Behold, these are but the outskirts of his ways. +\q2 How small a whisper do we hear of him! +\q2 But the thunder of his power who can understand?” +\c 27 +\p +\v 1 Job again took up his parable, and said, +\q1 +\v 2 “As God lives, who has taken away my right, +\q2 the Almighty, who has made my soul bitter +\q1 +\v 3 (for the length of my life is still in me, +\q2 and the spirit of God is in my nostrils); +\q1 +\v 4 surely my lips will not speak unrighteousness, +\q2 neither will my tongue utter deceit. +\q1 +\v 5 Far be it from me that I should justify you. +\q2 Until I die I will not put away my integrity from me. +\q1 +\v 6 I hold fast to my righteousness, and will not let it go. +\q2 My heart will not reproach me so long as I live. +\b +\q1 +\v 7 “Let my enemy be as the wicked. +\q2 Let him who rises up against me be as the unrighteous. +\b +\q1 +\v 8 For what is the hope of the godless, when he is cut off, +\q2 when God takes away his life? +\q1 +\v 9 Will God hear his cry when trouble comes on him? +\q1 +\v 10 Will he delight himself in the Almighty, +\q2 and call on God at all times? +\q1 +\v 11 I will teach you about the hand of God. +\q2 I will not conceal that which is with the Almighty. +\q1 +\v 12 Behold, all of you have seen it yourselves; +\q2 why then have you become altogether vain? +\b +\q1 +\v 13 “This is the portion of a wicked man with God, +\q2 the heritage of oppressors, which they receive from the Almighty. +\q1 +\v 14 If his children are multiplied, it is for the sword. +\q2 His offspring will not be satisfied with bread. +\q1 +\v 15 Those who remain of him will be buried in death. +\q2 His widows will make no lamentation. +\q1 +\v 16 Though he heap up silver as the dust, +\q2 and prepare clothing as the clay; +\q1 +\v 17 he may prepare it, but the just will put it on, +\q2 and the innocent will divide the silver. +\q1 +\v 18 He builds his house as the moth, +\q2 as a booth which the watchman makes. +\q1 +\v 19 He lies down rich, but he will not do so again. +\q2 He opens his eyes, and he is not. +\q1 +\v 20 Terrors overtake him like waters. +\q2 A storm steals him away in the night. +\q1 +\v 21 The east wind carries him away, and he departs. +\q2 It sweeps him out of his place. +\q1 +\v 22 For it hurls at him, and does not spare, +\q2 as he flees away from his hand. +\q1 +\v 23 Men will clap their hands at him, +\q2 and will hiss him out of his place. +\b +\c 28 +\b +\q1 +\v 1 “Surely there is a mine for silver, +\q2 and a place for gold which they refine. +\q1 +\v 2 Iron is taken out of the earth, +\q2 and copper is smelted out of the ore. +\q1 +\v 3 Man sets an end to darkness, +\q2 and searches out, to the furthest bound, +\q2 the stones of obscurity and of thick darkness. +\q1 +\v 4 He breaks open a shaft away from where people live. +\q2 They are forgotten by the foot. +\q2 They hang far from men, they swing back and forth. +\q1 +\v 5 As for the earth, out of it comes bread. +\q2 Underneath it is turned up as it were by fire. +\q1 +\v 6 Sapphires come from its rocks. +\q2 It has dust of gold. +\q1 +\v 7 That path no bird of prey knows, +\q2 neither has the falcon’s eye seen it. +\q1 +\v 8 The proud animals have not trodden it, +\q2 nor has the fierce lion passed by there. +\q1 +\v 9 He puts his hand on the flinty rock, +\q2 and he overturns the mountains by the roots. +\q1 +\v 10 He cuts out channels among the rocks. +\q2 His eye sees every precious thing. +\q1 +\v 11 He binds the streams that they don’t trickle. +\q2 The thing that is hidden he brings out to light. +\b +\q1 +\v 12 “But where will wisdom be found? +\q2 Where is the place of understanding? +\q1 +\v 13 Man doesn’t know its price, +\q2 and it isn’t found in the land of the living. +\q1 +\v 14 The deep says, ‘It isn’t in me.’ +\q2 The sea says, ‘It isn’t with me.’ +\q1 +\v 15 It can’t be gotten for gold, +\q2 neither will silver be weighed for its price. +\q1 +\v 16 It can’t be valued with the gold of Ophir, +\q2 with the precious onyx, or the sapphire.\f + \fr 28:16 \ft or, lapis lazuli\f* +\q1 +\v 17 Gold and glass can’t equal it, +\q2 neither will it be exchanged for jewels of fine gold. +\q1 +\v 18 No mention will be made of coral or of crystal. +\q2 Yes, the price of wisdom is above rubies. +\q1 +\v 19 The topaz of Ethiopia will not equal it. +\q2 It won’t be valued with pure gold. +\q1 +\v 20 Where then does wisdom come from? +\q2 Where is the place of understanding? +\q1 +\v 21 Seeing it is hidden from the eyes of all living, +\q2 and kept close from the birds of the sky. +\q1 +\v 22 Destruction and Death say, +\q2 ‘We have heard a rumor of it with our ears.’ +\b +\q1 +\v 23 “God understands its way, +\q2 and he knows its place. +\q1 +\v 24 For he looks to the ends of the earth, +\q2 and sees under the whole sky. +\q1 +\v 25 He establishes the force of the wind. +\q2 Yes, he measures out the waters by measure. +\q1 +\v 26 When he made a decree for the rain, +\q2 and a way for the lightning of the thunder, +\q1 +\v 27 then he saw it, and declared it. +\q2 He established it, yes, and searched it out. +\q1 +\v 28 To man he said, +\q2 ‘Behold, the fear of the Lord,\f + \fr 28:28 \ft The word translated “Lord” is “Adonai.” \f* that is wisdom. +\q2 To depart from evil is understanding.’” +\b +\c 29 +\p +\v 1 Job again took up his parable, and said, +\q1 +\v 2 “Oh that I were as in the months of old, +\q2 as in the days when God watched over me; +\q1 +\v 3 when his lamp shone on my head, +\q2 and by his light I walked through darkness, +\q1 +\v 4 as I was in my prime, +\q2 when the friendship of God was in my tent, +\q1 +\v 5 when the Almighty was yet with me, +\q2 and my children were around me, +\q1 +\v 6 when my steps were washed with butter, +\q2 and the rock poured out streams of oil for me, +\q1 +\v 7 when I went out to the city gate, +\q2 when I prepared my seat in the street. +\q1 +\v 8 The young men saw me and hid themselves. +\q2 The aged rose up and stood. +\q1 +\v 9 The princes refrained from talking, +\q2 and laid their hand on their mouth. +\q1 +\v 10 The voice of the nobles was hushed, +\q2 and their tongue stuck to the roof of their mouth. +\q1 +\v 11 For when the ear heard me, then it blessed me, +\q2 and when the eye saw me, it commended me, +\q1 +\v 12 because I delivered the poor who cried, +\q2 and the fatherless also, who had no one to help him, +\q1 +\v 13 the blessing of him who was ready to perish came on me, +\q2 and I caused the widow’s heart to sing for joy. +\q1 +\v 14 I put on righteousness, and it clothed me. +\q2 My justice was as a robe and a diadem. +\q1 +\v 15 I was eyes to the blind, +\q2 and feet to the lame. +\q1 +\v 16 I was a father to the needy. +\q2 I researched the cause of him whom I didn’t know. +\q1 +\v 17 I broke the jaws of the unrighteous +\q2 and plucked the prey out of his teeth. +\q1 +\v 18 Then I said, ‘I will die in my own house, +\q2 I will count my days as the sand. +\q1 +\v 19 My root is spread out to the waters. +\q2 The dew lies all night on my branch. +\q1 +\v 20 My glory is fresh in me. +\q2 My bow is renewed in my hand.’ +\b +\q1 +\v 21 “Men listened to me, waited, +\q2 and kept silence for my counsel. +\q1 +\v 22 After my words they didn’t speak again. +\q2 My speech fell on them. +\q1 +\v 23 They waited for me as for the rain. +\q2 Their mouths drank as with the spring rain. +\q1 +\v 24 I smiled on them when they had no confidence. +\q2 They didn’t reject the light of my face. +\q1 +\v 25 I chose out their way, and sat as chief. +\q2 I lived as a king in the army, +\q2 as one who comforts the mourners. +\b +\c 30 +\b +\q1 +\v 1 “But now those who are younger than I have me in derision, +\q2 whose fathers I considered unworthy to put with my sheep dogs. +\q1 +\v 2 Of what use is the strength of their hands to me, +\q2 men in whom ripe age has perished? +\q1 +\v 3 They are gaunt from lack and famine. +\q2 They gnaw the dry ground, in the gloom of waste and desolation. +\q1 +\v 4 They pluck salt herbs by the bushes. +\q2 The roots of the broom tree are their food. +\q1 +\v 5 They are driven out from among men. +\q2 They cry after them as after a thief, +\q1 +\v 6 so that they live in frightful valleys, +\q2 and in holes of the earth and of the rocks. +\q1 +\v 7 They bray among the bushes. +\q2 They are gathered together under the nettles. +\q1 +\v 8 They are children of fools, yes, children of wicked men. +\q2 They were flogged out of the land. +\b +\q1 +\v 9 “Now I have become their song. +\q2 Yes, I am a byword to them. +\q1 +\v 10 They abhor me, they stand aloof from me, +\q2 and don’t hesitate to spit in my face. +\q1 +\v 11 For he has untied his cord, and afflicted me; +\q2 and they have thrown off restraint before me. +\q1 +\v 12 On my right hand rise the rabble. +\q2 They thrust aside my feet. +\q2 They cast their ways of destruction up against me. +\q1 +\v 13 They mar my path. +\q2 They promote my destruction +\q2 without anyone’s help. +\q1 +\v 14 As through a wide breach they come. +\q2 They roll themselves in amid the ruin. +\q1 +\v 15 Terrors have turned on me. +\q2 They chase my honor as the wind. +\q2 My welfare has passed away as a cloud. +\b +\q1 +\v 16 “Now my soul is poured out within me. +\q2 Days of affliction have taken hold of me. +\q1 +\v 17 In the night season my bones are pierced in me, +\q2 and the pains that gnaw me take no rest. +\q1 +\v 18 My garment is disfigured by great force. +\q2 It binds me about as the collar of my tunic. +\q1 +\v 19 He has cast me into the mire. +\q2 I have become like dust and ashes. +\q1 +\v 20 I cry to you, and you do not answer me. +\q2 I stand up, and you gaze at me. +\q1 +\v 21 You have turned to be cruel to me. +\q2 With the might of your hand you persecute me. +\q1 +\v 22 You lift me up to the wind, and drive me with it. +\q2 You dissolve me in the storm. +\q1 +\v 23 For I know that you will bring me to death, +\q2 to the house appointed for all living. +\b +\q1 +\v 24 “However doesn’t one stretch out a hand in his fall? +\q2 Or in his calamity therefore cry for help? +\q1 +\v 25 Didn’t I weep for him who was in trouble? +\q2 Wasn’t my soul grieved for the needy? +\q1 +\v 26 When I looked for good, then evil came. +\q2 When I waited for light, darkness came. +\q1 +\v 27 My heart is troubled, and doesn’t rest. +\q2 Days of affliction have come on me. +\q1 +\v 28 I go mourning without the sun. +\q2 I stand up in the assembly, and cry for help. +\q1 +\v 29 I am a brother to jackals, +\q2 and a companion to ostriches. +\q1 +\v 30 My skin grows black and peels from me. +\q2 My bones are burned with heat. +\q1 +\v 31 Therefore my harp has turned to mourning, +\q2 and my pipe into the voice of those who weep. +\b +\c 31 +\b +\q1 +\v 1 “I made a covenant with my eyes; +\q2 how then should I look lustfully at a young woman? +\q1 +\v 2 For what is the portion from God above, +\q2 and the heritage from the Almighty on high? +\q1 +\v 3 Is it not calamity to the unrighteous, +\q2 and disaster to the workers of iniquity? +\q1 +\v 4 Doesn’t he see my ways, +\q2 and count all my steps? +\b +\q1 +\v 5 “If I have walked with falsehood, +\q2 and my foot has hurried to deceit +\q1 +\v 6 (let me be weighed in an even balance, +\q2 that God may know my integrity); +\q1 +\v 7 if my step has turned out of the way, +\q2 if my heart walked after my eyes, +\q2 if any defilement has stuck to my hands, +\q1 +\v 8 then let me sow, and let another eat. +\q2 Yes, let the produce of my field be rooted out. +\b +\q1 +\v 9 “If my heart has been enticed to a woman, +\q2 and I have laid wait at my neighbor’s door, +\q1 +\v 10 then let my wife grind for another, +\q2 and let others sleep with her. +\q1 +\v 11 For that would be a heinous crime. +\q2 Yes, it would be an iniquity to be punished by the judges, +\q1 +\v 12 for it is a fire that consumes to destruction, +\q2 and would root out all my increase. +\q1 +\v 13 “If I have despised the cause of my male servant +\q2 or of my female servant, +\q2 when they contended with me, +\q1 +\v 14 what then will I do when God rises up? +\q2 When he visits, what will I answer him? +\q1 +\v 15 Didn’t he who made me in the womb make him? +\q2 Didn’t one fashion us in the womb? +\q1 +\v 16 “If I have withheld the poor from their desire, +\q2 or have caused the eyes of the widow to fail, +\q1 +\v 17 or have eaten my morsel alone, +\q2 and the fatherless has not eaten of it +\q1 +\v 18 (no, from my youth he grew up with me as with a father, +\q2 I have guided her from my mother’s womb); +\q1 +\v 19 if I have seen any perish for want of clothing, +\q2 or that the needy had no covering; +\q1 +\v 20 if his heart hasn’t blessed me, +\q2 if he hasn’t been warmed with my sheep’s fleece; +\q1 +\v 21 if I have lifted up my hand against the fatherless, +\q2 because I saw my help in the gate; +\q1 +\v 22 then let my shoulder fall from the shoulder blade, +\q2 and my arm be broken from the bone. +\q1 +\v 23 For calamity from God is a terror to me. +\q2 Because of his majesty, I can do nothing. +\q1 +\v 24 “If I have made gold my hope, +\q2 and have said to the fine gold, ‘You are my confidence;’ +\q1 +\v 25 If I have rejoiced because my wealth was great, +\q2 and because my hand had gotten much; +\q1 +\v 26 if I have seen the sun when it shined, +\q2 or the moon moving in splendor, +\q1 +\v 27 and my heart has been secretly enticed, +\q2 and my hand threw a kiss from my mouth; +\q1 +\v 28 this also would be an iniquity to be punished by the judges, +\q2 for I would have denied the God who is above. +\q1 +\v 29 “If I have rejoiced at the destruction of him who hated me, +\q2 or lifted up myself when evil found him +\q1 +\v 30 (I have certainly not allowed my mouth to sin +\q2 by asking his life with a curse); +\q1 +\v 31 if the men of my tent have not said, +\q2 ‘Who can find one who has not been filled with his meat?’ +\q1 +\v 32 (the foreigner has not camped in the street, +\q2 but I have opened my doors to the traveler); +\q1 +\v 33 if like Adam I have covered my transgressions, +\q2 by hiding my iniquity in my heart, +\q1 +\v 34 because I feared the great multitude, +\q2 and the contempt of families terrified me, +\q2 so that I kept silence, and didn’t go out of the door— +\q1 +\v 35 oh that I had one to hear me! +\q2 Behold, here is my signature! Let the Almighty answer me! +\q2 Let the accuser write my indictment! +\q1 +\v 36 Surely I would carry it on my shoulder, +\q2 and I would bind it to me as a crown. +\q1 +\v 37 I would declare to him the number of my steps. +\q2 I would go near to him like a prince. +\q1 +\v 38 If my land cries out against me, +\q2 and its furrows weep together; +\q1 +\v 39 if I have eaten its fruits without money, +\q2 or have caused its owners to lose their life, +\q1 +\v 40 let briers grow instead of wheat, +\q2 and stinkweed instead of barley.” +\b +\p The words of Job are ended. +\c 32 +\p +\v 1 So these three men ceased to answer Job, because he was righteous in his own eyes. +\v 2 Then the wrath of Elihu the son of Barachel, the Buzite, of the family of Ram, was kindled against Job. His wrath was kindled because he justified himself rather than God. +\v 3 Also his wrath was kindled against his three friends, because they had found no answer, and yet had condemned Job. +\v 4 Now Elihu had waited to speak to Job, because they were older than he. +\v 5 When Elihu saw that there was no answer in the mouth of these three men, his wrath was kindled. +\b +\p +\v 6 Elihu the son of Barachel the Buzite answered, +\q1 “I am young, and you are very old. +\q2 Therefore I held back, and didn’t dare show you my opinion. +\q1 +\v 7 I said, ‘Days should speak, +\q2 and multitude of years should teach wisdom.’ +\q1 +\v 8 But there is a spirit in man, +\q2 and the Spirit\f + \fr 32:8 \ft or, breath\f* of the Almighty gives them understanding. +\q1 +\v 9 It is not the great who are wise, +\q2 nor the aged who understand justice. +\q1 +\v 10 Therefore I said, ‘Listen to me; +\q2 I also will show my opinion.’ +\b +\q1 +\v 11 “Behold, I waited for your words, +\q2 and I listened for your reasoning, +\q2 while you searched out what to say. +\q1 +\v 12 Yes, I gave you my full attention, +\q2 but there was no one who convinced Job, +\q2 or who answered his words, among you. +\q1 +\v 13 Beware lest you say, ‘We have found wisdom. +\q2 God may refute him, not man;’ +\q1 +\v 14 for he has not directed his words against me; +\q2 neither will I answer him with your speeches. +\b +\q1 +\v 15 “They are amazed. They answer no more. +\q2 They don’t have a word to say. +\q1 +\v 16 Shall I wait, because they don’t speak, +\q2 because they stand still, and answer no more? +\q1 +\v 17 I also will answer my part, +\q2 and I also will show my opinion. +\q1 +\v 18 For I am full of words. +\q2 The spirit within me constrains me. +\q1 +\v 19 Behold, my breast is as wine which has no vent; +\q2 like new wineskins it is ready to burst. +\q1 +\v 20 I will speak, that I may be refreshed. +\q2 I will open my lips and answer. +\q1 +\v 21 Please don’t let me respect any man’s person, +\q2 neither will I give flattering titles to any man. +\q1 +\v 22 For I don’t know how to give flattering titles, +\q2 or else my Maker would soon take me away. +\b +\c 33 +\b +\q1 +\v 1 “However, Job, please hear my speech, +\q2 and listen to all my words. +\q1 +\v 2 See now, I have opened my mouth. +\q2 My tongue has spoken in my mouth. +\q1 +\v 3 My words will utter the uprightness of my heart. +\q2 That which my lips know they will speak sincerely. +\q1 +\v 4 The Spirit of God has made me, +\q2 and the breath of the Almighty gives me life. +\q1 +\v 5 If you can, answer me. +\q2 Set your words in order before me, and stand up. +\q1 +\v 6 Behold, I am toward God even as you are. +\q2 I am also formed out of the clay. +\q1 +\v 7 Behold, my terror will not make you afraid, +\q2 neither will my pressure be heavy on you. +\b +\q1 +\v 8 “Surely you have spoken in my hearing, +\q2 I have heard the voice of your words, saying, +\q1 +\v 9 ‘I am clean, without disobedience. +\q2 I am innocent, neither is there iniquity in me. +\q1 +\v 10 Behold, he finds occasions against me. +\q2 He counts me for his enemy. +\q1 +\v 11 He puts my feet in the stocks. +\q2 He marks all my paths.’ +\b +\q1 +\v 12 “Behold, I will answer you. In this you are not just, +\q2 for God is greater than man. +\q1 +\v 13 Why do you strive against him, +\q2 because he doesn’t give account of any of his matters? +\q1 +\v 14 For God speaks once, +\q2 yes twice, though man pays no attention. +\q1 +\v 15 In a dream, in a vision of the night, +\q2 when deep sleep falls on men, +\q2 in slumbering on the bed, +\q1 +\v 16 then he opens the ears of men, +\q2 and seals their instruction, +\q1 +\v 17 that he may withdraw man from his purpose, +\q2 and hide pride from man. +\q1 +\v 18 He keeps back his soul from the pit, +\q2 and his life from perishing by the sword. +\b +\q1 +\v 19 “He is chastened also with pain on his bed, +\q2 with continual strife in his bones, +\q1 +\v 20 so that his life abhors bread, +\q2 and his soul dainty food. +\q1 +\v 21 His flesh is so consumed away that it can’t be seen. +\q2 His bones that were not seen stick out. +\q1 +\v 22 Yes, his soul draws near to the pit, +\q2 and his life to the destroyers. +\b +\q1 +\v 23 “If there is beside him an angel, +\q2 an interpreter, one among a thousand, +\q2 to show to man what is right for him, +\q1 +\v 24 then God is gracious to him, and says, +\q2 ‘Deliver him from going down to the pit, +\q2 I have found a ransom.’ +\q1 +\v 25 His flesh will be fresher than a child’s. +\q2 He returns to the days of his youth. +\q1 +\v 26 He prays to God, and he is favorable to him, +\q2 so that he sees his face with joy. +\q2 He restores to man his righteousness. +\q1 +\v 27 He sings before men, and says, +\q2 ‘I have sinned, and perverted that which was right, +\q2 and it didn’t profit me. +\q1 +\v 28 He has redeemed my soul from going into the pit. +\q2 My life will see the light.’ +\b +\q1 +\v 29 “Behold, God does all these things, +\q2 twice, yes three times, with a man, +\q1 +\v 30 to bring back his soul from the pit, +\q2 that he may be enlightened with the light of the living. +\q1 +\v 31 Mark well, Job, and listen to me. +\q2 Hold your peace, and I will speak. +\q1 +\v 32 If you have anything to say, answer me. +\q2 Speak, for I desire to justify you. +\q1 +\v 33 If not, listen to me. +\q2 Hold your peace, and I will teach you wisdom.” +\b +\c 34 +\p +\v 1 Moreover Elihu answered, +\q1 +\v 2 “Hear my words, you wise men. +\q2 Give ear to me, you who have knowledge. +\q1 +\v 3 For the ear tries words, +\q2 as the palate tastes food. +\q1 +\v 4 Let us choose for us that which is right. +\q2 Let us know among ourselves what is good. +\q1 +\v 5 For Job has said, ‘I am righteous, +\q2 God has taken away my right. +\q1 +\v 6 Notwithstanding my right I am considered a liar. +\q2 My wound is incurable, though I am without disobedience.’ +\q1 +\v 7 What man is like Job, +\q2 who drinks scorn like water, +\q1 +\v 8 who goes in company with the workers of iniquity, +\q2 and walks with wicked men? +\q1 +\v 9 For he has said, ‘It profits a man nothing +\q2 that he should delight himself with God.’ +\b +\q1 +\v 10 “Therefore listen to me, you men of understanding: +\q2 far be it from God, that he should do wickedness, +\q2 from the Almighty, that he should commit iniquity. +\q1 +\v 11 For the work of a man he will render to him, +\q2 and cause every man to find according to his ways. +\q1 +\v 12 Yes surely, God will not do wickedly, +\q2 neither will the Almighty pervert justice. +\q1 +\v 13 Who put him in charge of the earth? +\q2 Or who has appointed him over the whole world? +\q1 +\v 14 If he set his heart on himself, +\q2 if he gathered to himself his spirit and his breath, +\q1 +\v 15 all flesh would perish together, +\q2 and man would turn again to dust. +\b +\q1 +\v 16 “If now you have understanding, hear this. +\q2 Listen to the voice of my words. +\q1 +\v 17 Should even one who hates justice govern? +\q2 Will you condemn him who is righteous and mighty, +\q1 +\v 18 who says to a king, ‘Vile!’ +\q2 or to nobles, ‘Wicked!’? +\q1 +\v 19 He doesn’t respect the persons of princes, +\q2 nor respect the rich more than the poor, +\q2 for they all are the work of his hands. +\q1 +\v 20 In a moment they die, even at midnight. +\q2 The people are shaken and pass away. +\q2 The mighty are taken away without a hand. +\b +\q1 +\v 21 “For his eyes are on the ways of a man. +\q2 He sees all his goings. +\q1 +\v 22 There is no darkness, nor thick gloom, +\q2 where the workers of iniquity may hide themselves. +\q1 +\v 23 For he doesn’t need to consider a man further, +\q2 that he should go before God in judgment. +\q1 +\v 24 He breaks mighty men in pieces in ways past finding out, +\q2 and sets others in their place. +\q1 +\v 25 Therefore he takes knowledge of their works. +\q2 He overturns them in the night, so that they are destroyed. +\q1 +\v 26 He strikes them as wicked men +\q2 in the open sight of others; +\q1 +\v 27 because they turned away from following him, +\q2 and wouldn’t pay attention to any of his ways, +\q1 +\v 28 so that they caused the cry of the poor to come to him. +\q2 He heard the cry of the afflicted. +\q1 +\v 29 When he gives quietness, who then can condemn? +\q2 When he hides his face, who then can see him? +\q2 He is over a nation or a man alike, +\q1 +\v 30 that the godless man may not reign, +\q2 that there be no one to ensnare the people. +\b +\q1 +\v 31 “For has any said to God, +\q2 ‘I am guilty, but I will not offend any more. +\q1 +\v 32 Teach me that which I don’t see. +\q2 If I have done iniquity, I will do it no more’? +\q1 +\v 33 Shall his recompense be as you desire, that you refuse it? +\q2 For you must choose, and not I. +\q2 Therefore speak what you know. +\q1 +\v 34 Men of understanding will tell me, +\q2 yes, every wise man who hears me: +\q1 +\v 35 ‘Job speaks without knowledge. +\q2 His words are without wisdom.’ +\q1 +\v 36 I wish that Job were tried to the end, +\q2 because of his answering like wicked men. +\q1 +\v 37 For he adds rebellion to his sin. +\q2 He claps his hands among us, +\q2 and multiplies his words against God.” +\b +\c 35 +\p +\v 1 Moreover Elihu answered, +\q1 +\v 2 “Do you think this to be your right, +\q2 or do you say, ‘My righteousness is more than God’s,’ +\q1 +\v 3 that you ask, ‘What advantage will it be to you? +\q2 What profit will I have, more than if I had sinned?’ +\q1 +\v 4 I will answer you, +\q2 and your companions with you. +\q1 +\v 5 Look to the skies, and see. +\q2 See the skies, which are higher than you. +\q1 +\v 6 If you have sinned, what effect do you have against him? +\q2 If your transgressions are multiplied, what do you do to him? +\q1 +\v 7 If you are righteous, what do you give him? +\q2 Or what does he receive from your hand? +\q1 +\v 8 Your wickedness may hurt a man as you are, +\q2 and your righteousness may profit a son of man. +\b +\q1 +\v 9 “By reason of the multitude of oppressions they cry out. +\q2 They cry for help by reason of the arm of the mighty. +\q1 +\v 10 But no one says, ‘Where is God my Maker, +\q2 who gives songs in the night, +\q1 +\v 11 who teaches us more than the animals of the earth, +\q2 and makes us wiser than the birds of the sky?’ +\q1 +\v 12 There they cry, but no one answers, +\q2 because of the pride of evil men. +\q1 +\v 13 Surely God will not hear an empty cry, +\q2 neither will the Almighty regard it. +\q1 +\v 14 How much less when you say you don’t see him. +\q2 The cause is before him, and you wait for him! +\q1 +\v 15 But now, because he has not visited in his anger, +\q2 neither does he greatly regard arrogance, +\q1 +\v 16 therefore Job opens his mouth with empty talk, +\q2 and he multiplies words without knowledge.” +\b +\c 36 +\p +\v 1 Elihu also continued, and said, +\q1 +\v 2 “Bear with me a little, and I will show you; +\q2 for I still have something to say on God’s behalf. +\q1 +\v 3 I will get my knowledge from afar, +\q2 and will ascribe righteousness to my Maker. +\q1 +\v 4 For truly my words are not false. +\q2 One who is perfect in knowledge is with you. +\b +\q1 +\v 5 “Behold, God is mighty, and doesn’t despise anyone. +\q2 He is mighty in strength of understanding. +\q1 +\v 6 He doesn’t preserve the life of the wicked, +\q2 but gives justice to the afflicted. +\q1 +\v 7 He doesn’t withdraw his eyes from the righteous, +\q2 but with kings on the throne, +\q2 he sets them forever, and they are exalted. +\q1 +\v 8 If they are bound in fetters, +\q2 and are taken in the cords of afflictions, +\q1 +\v 9 then he shows them their work, +\q2 and their transgressions, that they have behaved themselves proudly. +\q1 +\v 10 He also opens their ears to instruction, +\q2 and commands that they return from iniquity. +\q1 +\v 11 If they listen and serve him, +\q2 they will spend their days in prosperity, +\q2 and their years in pleasures. +\q1 +\v 12 But if they don’t listen, they will perish by the sword; +\q2 they will die without knowledge. +\b +\q1 +\v 13 “But those who are godless in heart lay up anger. +\q2 They don’t cry for help when he binds them. +\q1 +\v 14 They die in youth. +\q2 Their life perishes among the unclean. +\q1 +\v 15 He delivers the afflicted by their affliction, +\q2 and opens their ear in oppression. +\q1 +\v 16 Yes, he would have allured you out of distress, +\q2 into a wide place, where there is no restriction. +\q2 That which is set on your table would be full of fatness. +\b +\q1 +\v 17 “But you are full of the judgment of the wicked. +\q2 Judgment and justice take hold of you. +\q1 +\v 18 Don’t let riches entice you to wrath, +\q2 neither let the great size of a bribe turn you aside. +\q1 +\v 19 Would your wealth sustain you in distress, +\q2 or all the might of your strength? +\q1 +\v 20 Don’t desire the night, +\q2 when people are cut off in their place. +\q1 +\v 21 Take heed, don’t regard iniquity; +\q2 for you have chosen this rather than affliction. +\q1 +\v 22 Behold, God is exalted in his power. +\q2 Who is a teacher like him? +\q1 +\v 23 Who has prescribed his way for him? +\q2 Or who can say, ‘You have committed unrighteousness?’ +\b +\q1 +\v 24 “Remember that you magnify his work, +\q2 about which men have sung. +\q1 +\v 25 All men have looked on it. +\q2 Man sees it afar off. +\q1 +\v 26 Behold, God is great, and we don’t know him. +\q2 The number of his years is unsearchable. +\q1 +\v 27 For he draws up the drops of water, +\q2 which distill in rain from his vapor, +\q1 +\v 28 which the skies pour down +\q2 and which drop on man abundantly. +\q1 +\v 29 Indeed, can anyone understand the spreading of the clouds +\q2 and the thunderings of his pavilion? +\q1 +\v 30 Behold, he spreads his light around him. +\q2 He covers the bottom of the sea. +\q1 +\v 31 For by these he judges the people. +\q2 He gives food in abundance. +\q1 +\v 32 He covers his hands with the lightning, +\q2 and commands it to strike the mark. +\q1 +\v 33 Its noise tells about him, +\q2 and the livestock also, concerning the storm that comes up. +\b +\c 37 +\q1 +\v 1 “Yes, at this my heart trembles, +\q2 and is moved out of its place. +\q1 +\v 2 Hear, oh, hear the noise of his voice, +\q2 the sound that goes out of his mouth. +\q1 +\v 3 He sends it out under the whole sky, +\q2 and his lightning to the ends of the earth. +\q1 +\v 4 After it a voice roars. +\q2 He thunders with the voice of his majesty. +\q2 He doesn’t hold back anything when his voice is heard. +\q1 +\v 5 God thunders marvelously with his voice. +\q2 He does great things, which we can’t comprehend. +\q1 +\v 6 For he says to the snow, ‘Fall on the earth,’ +\q2 likewise to the shower of rain, +\q2 and to the showers of his mighty rain. +\q1 +\v 7 He seals up the hand of every man, +\q2 that all men whom he has made may know it. +\q1 +\v 8 Then the animals take cover, +\q2 and remain in their dens. +\q1 +\v 9 Out of its room comes the storm, +\q2 and cold out of the north. +\q1 +\v 10 By the breath of God, ice is given, +\q2 and the width of the waters is frozen. +\q1 +\v 11 Yes, he loads the thick cloud with moisture. +\q2 He spreads abroad the cloud of his lightning. +\q1 +\v 12 It is turned around by his guidance, +\q2 that they may do whatever he commands them +\q2 on the surface of the habitable world, +\q1 +\v 13 whether it is for correction, or for his land, +\q2 or for loving kindness, that he causes it to come. +\b +\q1 +\v 14 “Listen to this, Job. +\q2 Stand still, and consider the wondrous works of God. +\q1 +\v 15 Do you know how God controls them, +\q2 and causes the lightning of his cloud to shine? +\q1 +\v 16 Do you know the workings of the clouds, +\q2 the wondrous works of him who is perfect in knowledge? +\q1 +\v 17 You whose clothing is warm +\q2 when the earth is still by reason of the south wind? +\q1 +\v 18 Can you, with him, spread out the sky, +\q2 which is strong as a cast metal mirror? +\q1 +\v 19 Teach us what we will tell him, +\q2 for we can’t make our case by reason of darkness. +\q1 +\v 20 Will it be told him that I would speak? +\q2 Or should a man wish that he were swallowed up? +\b +\q1 +\v 21 Now men don’t see the light which is bright in the skies, +\q2 but the wind passes, and clears them. +\q1 +\v 22 Out of the north comes golden splendor. +\q2 With God is awesome majesty. +\q1 +\v 23 We can’t reach the Almighty. +\q2 He is exalted in power. +\q2 In justice and great righteousness, he will not oppress. +\q1 +\v 24 Therefore men revere him. +\q2 He doesn’t regard any who are wise of heart.” +\b +\c 38 +\p +\v 1 Then Yahweh answered Job out of the whirlwind, +\q1 +\v 2 “Who is this who darkens counsel +\q2 by words without knowledge? +\q1 +\v 3 Brace yourself like a man, +\q2 for I will question you, then you answer me! +\b +\q1 +\v 4 “Where were you when I laid the foundations of the earth? +\q2 Declare, if you have understanding. +\q1 +\v 5 Who determined its measures, if you know? +\q2 Or who stretched the line on it? +\q1 +\v 6 What were its foundations fastened on? +\q2 Or who laid its cornerstone, +\q1 +\v 7 when the morning stars sang together, +\q2 and all the sons of God shouted for joy? +\b +\q1 +\v 8 “Or who shut up the sea with doors, +\q2 when it broke out of the womb, +\q1 +\v 9 when I made clouds its garment, +\q2 and wrapped it in thick darkness, +\q1 +\v 10 marked out for it my bound, +\q2 set bars and doors, +\q1 +\v 11 and said, ‘You may come here, but no further. +\q2 Your proud waves shall be stopped here’? +\b +\q1 +\v 12 “Have you commanded the morning in your days, +\q2 and caused the dawn to know its place, +\q1 +\v 13 that it might take hold of the ends of the earth, +\q2 and shake the wicked out of it? +\q1 +\v 14 It is changed as clay under the seal, +\q2 and presented as a garment. +\q1 +\v 15 From the wicked, their light is withheld. +\q2 The high arm is broken. +\b +\q1 +\v 16 “Have you entered into the springs of the sea? +\q2 Or have you walked in the recesses of the deep? +\q1 +\v 17 Have the gates of death been revealed to you? +\q2 Or have you seen the gates of the shadow of death? +\q1 +\v 18 Have you comprehended the earth in its width? +\q2 Declare, if you know it all. +\b +\q1 +\v 19 “What is the way to the dwelling of light? +\q2 As for darkness, where is its place, +\q1 +\v 20 that you should take it to its bound, +\q2 that you should discern the paths to its house? +\q1 +\v 21 Surely you know, for you were born then, +\q2 and the number of your days is great! +\q1 +\v 22 Have you entered the storehouses of the snow, +\q2 or have you seen the storehouses of the hail, +\q1 +\v 23 which I have reserved against the time of trouble, +\q2 against the day of battle and war? +\q1 +\v 24 By what way is the lightning distributed, +\q2 or the east wind scattered on the earth? +\b +\q1 +\v 25 Who has cut a channel for the flood water, +\q2 or the path for the thunderstorm, +\q1 +\v 26 to cause it to rain on a land where there is no man, +\q2 on the wilderness, in which there is no man, +\q1 +\v 27 to satisfy the waste and desolate ground, +\q2 to cause the tender grass to grow? +\q1 +\v 28 Does the rain have a father? +\q2 Or who fathers the drops of dew? +\q1 +\v 29 Whose womb did the ice come out of? +\q2 Who has given birth to the gray frost of the sky? +\q1 +\v 30 The waters become hard like stone, +\q2 when the surface of the deep is frozen. +\b +\q1 +\v 31 “Can you bind the cluster of the Pleiades, +\q2 or loosen the cords of Orion? +\q1 +\v 32 Can you lead the constellations out in their season? +\q2 Or can you guide the Bear with her cubs? +\q1 +\v 33 Do you know the laws of the heavens? +\q2 Can you establish its dominion over the earth? +\b +\q1 +\v 34 “Can you lift up your voice to the clouds, +\q2 that abundance of waters may cover you? +\q1 +\v 35 Can you send out lightnings, that they may go? +\q2 Do they report to you, ‘Here we are’? +\q1 +\v 36 Who has put wisdom in the inward parts? +\q2 Or who has given understanding to the mind? +\q1 +\v 37 Who can count the clouds by wisdom? +\q2 Or who can pour out the containers of the sky, +\q1 +\v 38 when the dust runs into a mass, +\q2 and the clods of earth stick together? +\b +\q1 +\v 39 “Can you hunt the prey for the lioness, +\q2 or satisfy the appetite of the young lions, +\q1 +\v 40 when they crouch in their dens, +\q2 and lie in wait in the thicket? +\q1 +\v 41 Who provides for the raven his prey, +\q2 when his young ones cry to God, +\q2 and wander for lack of food? +\b +\c 39 +\q1 +\v 1 “Do you know the time when the mountain goats give birth? +\q2 Do you watch when the doe bears fawns? +\q1 +\v 2 Can you count the months that they fulfill? +\q2 Or do you know the time when they give birth? +\q1 +\v 3 They bow themselves. They bear their young. +\q2 They end their labor pains. +\q1 +\v 4 Their young ones become strong. +\q2 They grow up in the open field. +\q2 They go out, and don’t return again. +\b +\q1 +\v 5 “Who has set the wild donkey free? +\q2 Or who has loosened the bonds of the swift donkey, +\q1 +\v 6 whose home I have made the wilderness, +\q2 and the salt land his dwelling place? +\q1 +\v 7 He scorns the tumult of the city, +\q2 neither does he hear the shouting of the driver. +\q1 +\v 8 The range of the mountains is his pasture. +\q2 He searches after every green thing. +\b +\q1 +\v 9 “Will the wild ox be content to serve you? +\q2 Or will he stay by your feeding trough? +\q1 +\v 10 Can you hold the wild ox in the furrow with his harness? +\q2 Or will he till the valleys after you? +\q1 +\v 11 Will you trust him, because his strength is great? +\q2 Or will you leave to him your labor? +\q1 +\v 12 Will you confide in him, that he will bring home your seed, +\q2 and gather the grain of your threshing floor? +\b +\q1 +\v 13 “The wings of the ostrich wave proudly, +\q2 but are they the feathers and plumage of love? +\q1 +\v 14 For she leaves her eggs on the earth, +\q2 warms them in the dust, +\q1 +\v 15 and forgets that the foot may crush them, +\q2 or that the wild animal may trample them. +\q1 +\v 16 She deals harshly with her young ones, as if they were not hers. +\q2 Though her labor is in vain, she is without fear, +\q1 +\v 17 because God has deprived her of wisdom, +\q2 neither has he imparted to her understanding. +\q1 +\v 18 When she lifts up herself on high, +\q2 she scorns the horse and his rider. +\b +\q1 +\v 19 “Have you given the horse might? +\q2 Have you clothed his neck with a quivering mane? +\q1 +\v 20 Have you made him to leap as a locust? +\q2 The glory of his snorting is awesome. +\q1 +\v 21 He paws in the valley, and rejoices in his strength. +\q2 He goes out to meet the armed men. +\q1 +\v 22 He mocks at fear, and is not dismayed, +\q2 neither does he turn back from the sword. +\q1 +\v 23 The quiver rattles against him, +\q2 the flashing spear and the javelin. +\q1 +\v 24 He eats up the ground with fierceness and rage, +\q2 neither does he stand still at the sound of the trumpet. +\q1 +\v 25 As often as the trumpet sounds he snorts, ‘Aha!’ +\q2 He smells the battle afar off, +\q2 the thunder of the captains, and the shouting. +\b +\q1 +\v 26 “Is it by your wisdom that the hawk soars, +\q2 and stretches her wings toward the south? +\q1 +\v 27 Is it at your command that the eagle mounts up, +\q2 and makes his nest on high? +\q1 +\v 28 On the cliff he dwells and makes his home, +\q2 on the point of the cliff and the stronghold. +\q1 +\v 29 From there he spies out the prey. +\q2 His eyes see it afar off. +\q1 +\v 30 His young ones also suck up blood. +\q2 Where the slain are, there he is.” +\b +\c 40 +\p +\v 1 Moreover Yahweh answered Job, +\q1 +\v 2 “Shall he who argues contend with the Almighty? +\q2 He who argues with God, let him answer it.” +\b +\p +\v 3 Then Job answered Yahweh, +\q1 +\v 4 “Behold, I am of small account. What will I answer you? +\q2 I lay my hand on my mouth. +\q1 +\v 5 I have spoken once, and I will not answer; +\q2 Yes, twice, but I will proceed no further.” +\b +\p +\v 6 Then Yahweh answered Job out of the whirlwind: +\q1 +\v 7 “Now brace yourself like a man. +\q2 I will question you, and you will answer me. +\q1 +\v 8 Will you even annul my judgment? +\q2 Will you condemn me, that you may be justified? +\q1 +\v 9 Or do you have an arm like God? +\q2 Can you thunder with a voice like him? +\b +\q1 +\v 10 “Now deck yourself with excellency and dignity. +\q2 Array yourself with honor and majesty. +\q1 +\v 11 Pour out the fury of your anger. +\q2 Look at everyone who is proud, and bring him low. +\q1 +\v 12 Look at everyone who is proud, and humble him. +\q2 Crush the wicked in their place. +\q1 +\v 13 Hide them in the dust together. +\q2 Bind their faces in the hidden place. +\q1 +\v 14 Then I will also admit to you +\q2 that your own right hand can save you. +\b +\q1 +\v 15 “See now behemoth, which I made as well as you. +\q2 He eats grass as an ox. +\q1 +\v 16 Look now, his strength is in his thighs. +\q2 His force is in the muscles of his belly. +\q1 +\v 17 He moves his tail like a cedar. +\q2 The sinews of his thighs are knit together. +\q1 +\v 18 His bones are like tubes of bronze. +\q2 His limbs are like bars of iron. +\b +\q1 +\v 19 He is the chief of the ways of God. +\q2 He who made him gives him his sword. +\q1 +\v 20 Surely the mountains produce food for him, +\q2 where all the animals of the field play. +\q1 +\v 21 He lies under the lotus trees, +\q2 in the covert of the reed, and the marsh. +\q1 +\v 22 The lotuses cover him with their shade. +\q2 The willows of the brook surround him. +\q1 +\v 23 Behold, if a river overflows, he doesn’t tremble. +\q2 He is confident, though the Jordan swells even to his mouth. +\q1 +\v 24 Shall any take him when he is on the watch, +\q2 or pierce through his nose with a snare? +\b +\c 41 +\b +\q1 +\v 1 “Can you draw out Leviathan\f + \fr 41:1 \ft Leviathan is a name for a crocodile or similar creature.\f* with a fish hook, +\q2 or press down his tongue with a cord? +\q1 +\v 2 Can you put a rope into his nose, +\q2 or pierce his jaw through with a hook? +\q1 +\v 3 Will he make many petitions to you, +\q2 or will he speak soft words to you? +\q1 +\v 4 Will he make a covenant with you, +\q2 that you should take him for a servant forever? +\q1 +\v 5 Will you play with him as with a bird? +\q2 Or will you bind him for your girls? +\q1 +\v 6 Will traders barter for him? +\q2 Will they part him among the merchants? +\q1 +\v 7 Can you fill his skin with barbed irons, +\q2 or his head with fish spears? +\q1 +\v 8 Lay your hand on him. +\q2 Remember the battle, and do so no more. +\q1 +\v 9 Behold, the hope of him is in vain. +\q2 Won’t one be cast down even at the sight of him? +\b +\q1 +\v 10 None is so fierce that he dare stir him up. +\q2 Who then is he who can stand before me? +\q1 +\v 11 Who has first given to me, that I should repay him? +\q2 Everything under the heavens is mine. +\b +\q1 +\v 12 “I will not keep silence concerning his limbs, +\q2 nor his mighty strength, nor his goodly frame. +\q1 +\v 13 Who can strip off his outer garment? +\q2 Who will come within his jaws? +\q1 +\v 14 Who can open the doors of his face? +\q2 Around his teeth is terror. +\q1 +\v 15 Strong scales are his pride, +\q2 shut up together with a close seal. +\b +\q1 +\v 16 One is so near to another, +\q2 that no air can come between them. +\q1 +\v 17 They are joined to one another. +\q2 They stick together, so that they can’t be pulled apart. +\q1 +\v 18 His sneezing flashes out light. +\q2 His eyes are like the eyelids of the morning. +\q1 +\v 19 Out of his mouth go burning torches. +\q2 Sparks of fire leap out. +\q1 +\v 20 Out of his nostrils a smoke goes, +\q2 as of a boiling pot over a fire of reeds. +\q1 +\v 21 His breath kindles coals. +\q2 A flame goes out of his mouth. +\q1 +\v 22 There is strength in his neck. +\q2 Terror dances before him. +\q1 +\v 23 The flakes of his flesh are joined together. +\q2 They are firm on him. +\q2 They can’t be moved. +\q1 +\v 24 His heart is as firm as a stone, +\q2 yes, firm as the lower millstone. +\q1 +\v 25 When he raises himself up, the mighty are afraid. +\q2 They retreat before his thrashing. +\q1 +\v 26 If one attacks him with the sword, it can’t prevail; +\q2 nor the spear, the dart, nor the pointed shaft. +\q1 +\v 27 He counts iron as straw, +\q2 and bronze as rotten wood. +\q1 +\v 28 The arrow can’t make him flee. +\q2 Sling stones are like chaff to him. +\q1 +\v 29 Clubs are counted as stubble. +\q2 He laughs at the rushing of the javelin. +\q1 +\v 30 His undersides are like sharp potsherds, +\q2 leaving a trail in the mud like a threshing sledge. +\q1 +\v 31 He makes the deep to boil like a pot. +\q2 He makes the sea like a pot of ointment. +\q1 +\v 32 He makes a path shine after him. +\q2 One would think the deep had white hair. +\q1 +\v 33 On earth there is not his equal, +\q2 that is made without fear. +\q1 +\v 34 He sees everything that is high. +\q2 He is king over all the sons of pride.” +\b +\c 42 +\p +\v 1 Then Job answered Yahweh: +\q1 +\v 2 “I know that you can do all things, +\q2 and that no purpose of yours can be restrained. +\q1 +\v 3 You asked, ‘Who is this who hides counsel without knowledge?’ +\q2 therefore I have uttered that which I didn’t understand, +\q2 things too wonderful for me, which I didn’t know. +\q1 +\v 4 You said, ‘Listen, now, and I will speak; +\q2 I will question you, and you will answer me.’ +\q1 +\v 5 I had heard of you by the hearing of the ear, +\q2 but now my eye sees you. +\q1 +\v 6 Therefore I abhor myself, +\q2 and repent in dust and ashes.” +\b +\p +\v 7 It was so, that after Yahweh had spoken these words to Job, Yahweh said to Eliphaz the Temanite, “My wrath is kindled against you, and against your two friends; for you have not spoken of me the thing that is right, as my servant Job has. +\v 8 Now therefore, take to yourselves seven bulls and seven rams, and go to my servant Job, and offer up for yourselves a burnt offering; and my servant Job shall pray for you, for I will accept him, that I not deal with you according to your folly. For you have not spoken of me the thing that is right, as my servant Job has.” +\p +\v 9 So Eliphaz the Temanite and Bildad the Shuhite and Zophar the Naamathite went and did what Yahweh commanded them, and Yahweh accepted Job. +\p +\v 10 Yahweh restored Job’s prosperity when he prayed for his friends. Yahweh gave Job twice as much as he had before. +\v 11 Then all his brothers, all his sisters, and all those who had been of his acquaintance before, came to him and ate bread with him in his house. They comforted him, and consoled him concerning all the evil that Yahweh had brought on him. Everyone also gave him a piece of money,\f + \fr 42:11 \ft literally, kesitah, a unit of money, probably silver\f* and everyone a ring of gold. +\p +\v 12 So Yahweh blessed the latter end of Job more than his beginning. He had fourteen thousand sheep, six thousand camels, one thousand yoke of oxen, and a thousand female donkeys. +\v 13 He had also seven sons and three daughters. +\v 14 He called the name of the first, Jemimah; and the name of the second, Keziah; and the name of the third, Keren Happuch. +\v 15 In all the land were no women found so beautiful as the daughters of Job. Their father gave them an inheritance among their brothers. +\v 16 After this Job lived one hundred forty years, and saw his sons, and his sons’ sons, to four generations. +\v 17 So Job died, being old and full of days. diff --git a/c-sharp/assets/WEB/19PSAengWEBUS.SFM b/c-sharp/assets/WEB/19PSAengWEBUS.SFM new file mode 100644 index 0000000000..89b77632aa --- /dev/null +++ b/c-sharp/assets/WEB/19PSAengWEBUS.SFM @@ -0,0 +1,8334 @@ +\id PSA World English Bible (WEB) +\ide UTF-8 +\h Psalms +\toc1 The Psalms +\toc2 Psalms +\toc3 Psalm +\mt1 The Psalms +\cl Psalm +\c 1 +\ms1 BOOK 1 +\q1 +\v 1 Blessed is the man who doesn’t walk in the counsel of the wicked, +\q2 nor stand on the path of sinners, +\q2 nor sit in the seat of scoffers; +\q1 +\v 2 but his delight is in Yahweh’s\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* law. +\q2 On his law he meditates day and night. +\q1 +\v 3 He will be like a tree planted by the streams of water, +\q2 that produces its fruit in its season, +\q2 whose leaf also does not wither. +\q2 Whatever he does shall prosper. +\q1 +\v 4 The wicked are not so, +\q2 but are like the chaff which the wind drives away. +\q1 +\v 5 Therefore the wicked shall not stand in the judgment, +\q2 nor sinners in the congregation of the righteous. +\q1 +\v 6 For Yahweh knows the way of the righteous, +\q2 but the way of the wicked shall perish. +\c 2 +\q1 +\v 1 Why do the nations rage, +\q2 and the peoples plot a vain thing? +\q1 +\v 2 The kings of the earth take a stand, +\q2 and the rulers take counsel together, +\q2 against Yahweh, and against his Anointed,\f + \fr 2:2 \ft The word “Anointed” is the same as the word for “Messiah” or “Christ”\f* saying, +\q1 +\v 3 “Let’s break their bonds apart, +\q2 and cast their cords from us.” +\q1 +\v 4 He who sits in the heavens will laugh. +\q2 The Lord\f + \fr 2:4 \ft The word translated “Lord” is “Adonai.”\f* will have them in derision. +\q1 +\v 5 Then he will speak to them in his anger, +\q2 and terrify them in his wrath: +\q1 +\v 6 “Yet I have set my King on my holy hill of Zion.” +\q2 +\v 7 I will tell of the decree: +\q1 Yahweh said to me, “You are my son. +\q2 Today I have become your father. +\q1 +\v 8 Ask of me, and I will give the nations for your inheritance, +\q2 the uttermost parts of the earth for your possession. +\q1 +\v 9 You shall break them with a rod of iron. +\q2 You shall dash them in pieces like a potter’s vessel.” +\q1 +\v 10 Now therefore be wise, you kings. +\q2 Be instructed, you judges of the earth. +\q1 +\v 11 Serve Yahweh with fear, +\q2 and rejoice with trembling. +\q1 +\v 12 Give sincere homage to the Son,\f + \fr 2:12 \ft or, Kiss the son\f* lest he be angry, and you perish on the way, +\q2 for his wrath will soon be kindled. +\q2 Blessed are all those who take refuge in him. +\c 3 +\d A Psalm by David, when he fled from Absalom his son. +\q1 +\v 1 Yahweh, how my adversaries have increased! +\q2 Many are those who rise up against me. +\q1 +\v 2 Many there are who say of my soul, +\q2 “There is no help for him in God.”\f + \fr 3:2 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* \qs Selah.\qs* +\q1 +\v 3 But you, Yahweh, are a shield around me, +\q2 my glory, and the one who lifts up my head. +\q1 +\v 4 I cry to Yahweh with my voice, +\q2 and he answers me out of his holy hill. \qs Selah.\qs* +\q1 +\v 5 I laid myself down and slept. +\q2 I awakened, for Yahweh sustains me. +\q1 +\v 6 I will not be afraid of tens of thousands of people +\q2 who have set themselves against me on every side. +\q1 +\v 7 Arise, Yahweh! +\q2 Save me, my God! +\q1 For you have struck all of my enemies on the cheek bone. +\q2 You have broken the teeth of the wicked. +\q1 +\v 8 Salvation belongs to Yahweh. +\q2 May your blessing be on your people. \qs Selah.\qs* +\c 4 +\d For the Chief Musician; on stringed instruments. A Psalm by David. +\q1 +\v 1 Answer me when I call, God of my righteousness. +\q2 Give me relief from my distress. +\q2 Have mercy on me, and hear my prayer. +\q1 +\v 2 You sons of men, how long shall my glory be turned into dishonor? +\q2 Will you love vanity and seek after falsehood? \qs Selah.\qs* +\q1 +\v 3 But know that Yahweh has set apart for himself him who is godly; +\q2 Yahweh will hear when I call to him. +\q1 +\v 4 Stand in awe, and don’t sin. +\q2 Search your own heart on your bed, and be still. \qs Selah.\qs* +\q1 +\v 5 Offer the sacrifices of righteousness. +\q2 Put your trust in Yahweh. +\q1 +\v 6 Many say, “Who will show us any good?” +\q2 Yahweh, let the light of your face shine on us. +\q1 +\v 7 You have put gladness in my heart, +\q2 more than when their grain and their new wine are increased. +\q1 +\v 8 In peace I will both lay myself down and sleep, +\q2 for you alone, Yahweh, make me live in safety. +\c 5 +\d For the Chief Musician, with the flutes. A Psalm by David. +\q1 +\v 1 Give ear to my words, Yahweh. +\q2 Consider my meditation. +\q1 +\v 2 Listen to the voice of my cry, my King and my God, +\q2 for I pray to you. +\q1 +\v 3 Yahweh, in the morning you will hear my voice. +\q2 In the morning I will lay my requests before you, and will watch expectantly. +\q1 +\v 4 For you are not a God who has pleasure in wickedness. +\q2 Evil can’t live with you. +\q1 +\v 5 The arrogant will not stand in your sight. +\q2 You hate all workers of iniquity. +\q1 +\v 6 You will destroy those who speak lies. +\q2 Yahweh abhors the bloodthirsty and deceitful man. +\q1 +\v 7 But as for me, in the abundance of your loving kindness I will come into your house. +\q2 I will bow toward your holy temple in reverence of you. +\q1 +\v 8 Lead me, Yahweh, in your righteousness because of my enemies. +\q2 Make your way straight before my face. +\q1 +\v 9 For there is no faithfulness in their mouth. +\q2 Their heart is destruction. +\q2 Their throat is an open tomb. +\q2 They flatter with their tongue. +\q1 +\v 10 Hold them guilty, God. +\q2 Let them fall by their own counsels. +\q1 Thrust them out in the multitude of their transgressions, +\q2 for they have rebelled against you. +\q1 +\v 11 But let all those who take refuge in you rejoice. +\q2 Let them always shout for joy, because you defend them. +\q1 Let them also who love your name be joyful in you. +\q2 +\v 12 For you will bless the righteous. +\q1 Yahweh, you will surround him with favor as with a shield. +\c 6 +\d For the Chief Musician; on stringed instruments, upon the eight-stringed lyre. A Psalm by David. +\q1 +\v 1 Yahweh, don’t rebuke me in your anger, +\q2 neither discipline me in your wrath. +\q1 +\v 2 Have mercy on me, Yahweh, for I am faint. +\q2 Yahweh, heal me, for my bones are troubled. +\q1 +\v 3 My soul is also in great anguish. +\q2 But you, Yahweh—how long? +\q1 +\v 4 Return, Yahweh. Deliver my soul, +\q2 and save me for your loving kindness’ sake. +\q1 +\v 5 For in death there is no memory of you. +\q2 In Sheol,\f + \fr 6:5 \ft Sheol is the place of the dead.\f* who shall give you thanks? +\q1 +\v 6 I am weary with my groaning. +\q2 Every night I flood my bed. +\q2 I drench my couch with my tears. +\q1 +\v 7 My eye wastes away because of grief. +\q2 It grows old because of all my adversaries. +\q1 +\v 8 Depart from me, all you workers of iniquity, +\q2 for Yahweh has heard the voice of my weeping. +\q1 +\v 9 Yahweh has heard my supplication. +\q2 Yahweh accepts my prayer. +\q1 +\v 10 May all my enemies be ashamed and dismayed. +\q2 They shall turn back, they shall be disgraced suddenly. +\c 7 +\d A meditation by David, which he sang to Yahweh, concerning the words of Cush, the Benjamite. +\q1 +\v 1 Yahweh, my God, I take refuge in you. +\q2 Save me from all those who pursue me, and deliver me, +\q1 +\v 2 lest they tear apart my soul like a lion, +\q2 ripping it in pieces, while there is no one to deliver. +\q1 +\v 3 Yahweh, my God, if I have done this, +\q2 if there is iniquity in my hands, +\q1 +\v 4 if I have rewarded evil to him who was at peace with me +\q2 (yes, I have delivered him who without cause was my adversary), +\q2 +\v 5 let the enemy pursue my soul, and overtake it; +\q1 yes, let him tread my life down to the earth, +\q2 and lay my glory in the dust. \qs Selah.\qs* +\q1 +\v 6 Arise, Yahweh, in your anger. +\q2 Lift up yourself against the rage of my adversaries. +\q1 Awake for me. You have commanded judgment. +\q2 +\v 7 Let the congregation of the peoples surround you. +\q2 Rule over them on high. +\q1 +\v 8 Yahweh administers judgment to the peoples. +\q2 Judge me, Yahweh, according to my righteousness, +\q2 and to my integrity that is in me. +\q1 +\v 9 Oh let the wickedness of the wicked come to an end, +\q2 but establish the righteous; +\q2 their minds and hearts are searched by the righteous God. +\q1 +\v 10 My shield is with God, +\q2 who saves the upright in heart. +\q1 +\v 11 God is a righteous judge, +\q2 yes, a God who has indignation every day. +\q1 +\v 12 If a man doesn’t repent, he will sharpen his sword; +\q2 he has bent and strung his bow. +\q1 +\v 13 He has also prepared for himself the instruments of death. +\q2 He makes ready his flaming arrows. +\q1 +\v 14 Behold,\f + \fr 7:14 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* he travails with iniquity. +\q2 Yes, he has conceived mischief, +\q2 and brought out falsehood. +\q1 +\v 15 He has dug a hole, +\q2 and has fallen into the pit which he made. +\q1 +\v 16 The trouble he causes shall return to his own head. +\q2 His violence shall come down on the crown of his own head. +\q1 +\v 17 I will give thanks to Yahweh according to his righteousness, +\q2 and will sing praise to the name of Yahweh Most High. +\c 8 +\d For the Chief Musician; on an instrument of Gath. A Psalm by David. +\q1 +\v 1 Yahweh, our Lord, how majestic is your name in all the earth! +\q2 You have set your glory above the heavens! +\q1 +\v 2 From the lips of babes and infants you have established strength, +\q2 because of your adversaries, that you might silence the enemy and the avenger. +\q1 +\v 3 When I consider your heavens, the work of your fingers, +\q2 the moon and the stars, which you have ordained, +\q1 +\v 4 what is man, that you think of him? +\q2 What is the son of man, that you care for him? +\q1 +\v 5 For you have made him a little lower than the angels,\f + \fr 8:5 \ft Hebrew: Elohim. The word Elohim, used here, usually means “God”, but can also mean “gods”, “princes”, or “angels”. The Septuagint reads “angels” here. See also the quote from the Septuagint in Hebrews 2:7.\f* +\q2 and crowned him with glory and honor. +\q1 +\v 6 You make him ruler over the works of your hands. +\q2 You have put all things under his feet: +\q1 +\v 7 All sheep and cattle, +\q2 yes, and the animals of the field, +\q2 +\v 8 the birds of the sky, the fish of the sea, +\q2 and whatever passes through the paths of the seas. +\q1 +\v 9 Yahweh, our Lord, +\q2 how majestic is your name in all the earth! +\c 9 +\d For the Chief Musician. Set to “The Death of the Son.” A Psalm by David. +\q1 +\v 1 I will give thanks to Yahweh with my whole heart. +\q2 I will tell of all your marvelous works. +\q1 +\v 2 I will be glad and rejoice in you. +\q2 I will sing praise to your name, O Most High. +\q1 +\v 3 When my enemies turn back, +\q2 they stumble and perish in your presence. +\q1 +\v 4 For you have maintained my just cause. +\q2 You sit on the throne judging righteously. +\q1 +\v 5 You have rebuked the nations. +\q2 You have destroyed the wicked. +\q2 You have blotted out their name forever and ever. +\q1 +\v 6 The enemy is overtaken by endless ruin. +\q2 The very memory of the cities which you have overthrown has perished. +\q1 +\v 7 But Yahweh reigns forever. +\q2 He has prepared his throne for judgment. +\q1 +\v 8 He will judge the world in righteousness. +\q2 He will administer judgment to the peoples in uprightness. +\q1 +\v 9 Yahweh will also be a high tower for the oppressed; +\q2 a high tower in times of trouble. +\q1 +\v 10 Those who know your name will put their trust in you, +\q2 for you, Yahweh, have not forsaken those who seek you. +\q1 +\v 11 Sing praises to Yahweh, who dwells in Zion, +\q2 and declare among the people what he has done. +\q1 +\v 12 For he who avenges blood remembers them. +\q2 He doesn’t forget the cry of the afflicted. +\q1 +\v 13 Have mercy on me, Yahweh. +\q2 See my affliction by those who hate me, +\q1 and lift me up from the gates of death, +\q2 +\v 14 that I may show all of your praise. +\q2 I will rejoice in your salvation in the gates of the daughter of Zion. +\q1 +\v 15 The nations have sunk down in the pit that they made. +\q2 In the net which they hid, their own foot is taken. +\q1 +\v 16 Yahweh has made himself known. +\q2 He has executed judgment. +\q2 The wicked is snared by the work of his own hands. \qs Meditation. Selah.\qs* +\q1 +\v 17 The wicked shall be turned back to Sheol,\f + \fr 9:17 \ft Sheol is the place of the dead.\f* +\q2 even all the nations that forget God. +\q1 +\v 18 For the needy shall not always be forgotten, +\q2 nor the hope of the poor perish forever. +\q1 +\v 19 Arise, Yahweh! Don’t let man prevail. +\q2 Let the nations be judged in your sight. +\q1 +\v 20 Put them in fear, Yahweh. +\q2 Let the nations know that they are only men. \qs Selah.\qs* +\c 10 +\q1 +\v 1 Why do you stand far off, Yahweh? +\q2 Why do you hide yourself in times of trouble? +\q1 +\v 2 In arrogance, the wicked hunt down the weak. +\q2 They are caught in the schemes that they devise. +\q1 +\v 3 For the wicked boasts of his heart’s cravings. +\q2 He blesses the greedy and condemns Yahweh. +\q1 +\v 4 The wicked, in the pride of his face, +\q2 has no room in his thoughts for God. +\q1 +\v 5 His ways are prosperous at all times. +\q2 He is arrogant, and your laws are far from his sight. +\q1 As for all his adversaries, he sneers at them. +\q2 +\v 6 He says in his heart, “I shall not be shaken. +\q2 For generations I shall have no trouble.” +\q1 +\v 7 His mouth is full of cursing, deceit, and oppression. +\q2 Under his tongue is mischief and iniquity. +\q1 +\v 8 He lies in wait near the villages. +\q2 From ambushes, he murders the innocent. +\q1 His eyes are secretly set against the helpless. +\q1 +\v 9 He lurks in secret as a lion in his ambush. +\q2 He lies in wait to catch the helpless. +\q2 He catches the helpless when he draws him in his net. +\q1 +\v 10 The helpless are crushed. +\q2 They collapse. +\q2 They fall under his strength. +\q1 +\v 11 He says in his heart, “God has forgotten. +\q2 He hides his face. +\q2 He will never see it.” +\b +\q1 +\v 12 Arise, Yahweh! +\q2 God, lift up your hand! +\q2 Don’t forget the helpless. +\q1 +\v 13 Why does the wicked person condemn God, +\q2 and say in his heart, “God won’t call me into account?” +\q1 +\v 14 But you do see trouble and grief. +\q2 You consider it to take it into your hand. +\q2 You help the victim and the fatherless. +\q1 +\v 15 Break the arm of the wicked. +\q2 As for the evil man, seek out his wickedness until you find none. +\q1 +\v 16 Yahweh is King forever and ever! +\q2 The nations will perish out of his land. +\q1 +\v 17 Yahweh, you have heard the desire of the humble. +\q2 You will prepare their heart. +\q2 You will cause your ear to hear, +\q2 +\v 18 to judge the fatherless and the oppressed, +\q2 that man who is of the earth may terrify no more. +\c 11 +\d For the Chief Musician. By David. +\q1 +\v 1 In Yahweh, I take refuge. +\q2 How can you say to my soul, “Flee as a bird to your mountain”? +\q1 +\v 2 For, behold, the wicked bend their bows. +\q2 They set their arrows on the strings, +\q2 that they may shoot in darkness at the upright in heart. +\q1 +\v 3 If the foundations are destroyed, +\q2 what can the righteous do? +\q1 +\v 4 Yahweh is in his holy temple. +\q2 Yahweh is on his throne in heaven. +\q1 His eyes observe. +\q2 His eyes examine the children of men. +\q1 +\v 5 Yahweh examines the righteous, +\q2 but his soul hates the wicked and him who loves violence. +\q1 +\v 6 On the wicked he will rain blazing coals; +\q2 fire, sulfur, and scorching wind shall be the portion of their cup. +\q1 +\v 7 For Yahweh is righteous. +\q2 He loves righteousness. +\q2 The upright shall see his face. +\c 12 +\d For the Chief Musician; upon an eight-stringed lyre. A Psalm of David. +\q1 +\v 1 Help, Yahweh; for the godly man ceases. +\q2 For the faithful fail from among the children of men. +\q1 +\v 2 Everyone lies to his neighbor. +\q2 They speak with flattering lips, and with a double heart. +\q1 +\v 3 May Yahweh cut off all flattering lips, +\q2 and the tongue that boasts, +\q1 +\v 4 who have said, “With our tongue we will prevail. +\q2 Our lips are our own. +\q2 Who is lord over us?” +\q1 +\v 5 “Because of the oppression of the weak and because of the groaning of the needy, +\q2 I will now arise,” says Yahweh; +\q1 “I will set him in safety from those who malign him.” +\q1 +\v 6 Yahweh’s words are flawless words, +\q2 as silver refined in a clay furnace, purified seven times. +\q1 +\v 7 You will keep them, Yahweh. +\q2 You will preserve them from this generation forever. +\q1 +\v 8 The wicked walk on every side, +\q2 when what is vile is exalted among the sons of men. +\c 13 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 How long, Yahweh? +\q2 Will you forget me forever? +\q2 How long will you hide your face from me? +\q1 +\v 2 How long shall I take counsel in my soul, +\q2 having sorrow in my heart every day? +\q2 How long shall my enemy triumph over me? +\q1 +\v 3 Behold, and answer me, Yahweh, my God. +\q2 Give light to my eyes, lest I sleep in death; +\q2 +\v 4 lest my enemy say, “I have prevailed against him;” +\q2 lest my adversaries rejoice when I fall. +\b +\q1 +\v 5 But I trust in your loving kindness. +\q2 My heart rejoices in your salvation. +\q1 +\v 6 I will sing to Yahweh, +\q2 because he has been good to me. +\c 14 +\d For the Chief Musician. By David. +\q1 +\v 1 The fool has said in his heart, “There is no God.” +\q2 They are corrupt. +\q2 They have done abominable deeds. +\q2 There is no one who does good. +\q1 +\v 2 Yahweh looked down from heaven on the children of men, +\q2 to see if there were any who understood, +\q2 who sought after God. +\q1 +\v 3 They have all gone aside. +\q2 They have together become corrupt. +\q2 There is no one who does good, no, not one. +\q1 +\v 4 Have all the workers of iniquity no knowledge, +\q2 who eat up my people as they eat bread, +\q2 and don’t call on Yahweh? +\q1 +\v 5 There they were in great fear, +\q2 for God is in the generation of the righteous. +\q1 +\v 6 You frustrate the plan of the poor, +\q2 because Yahweh is his refuge. +\q1 +\v 7 Oh that the salvation of Israel would come out of Zion! +\q2 When Yahweh restores the fortunes of his people, +\q2 then Jacob shall rejoice, and Israel shall be glad. +\c 15 +\d A Psalm by David. +\q1 +\v 1 Yahweh, who shall dwell in your sanctuary? +\q2 Who shall live on your holy hill? +\q1 +\v 2 He who walks blamelessly and does what is right, +\q2 and speaks truth in his heart; +\q1 +\v 3 he who doesn’t slander with his tongue, +\q2 nor does evil to his friend, +\q2 nor casts slurs against his fellow man; +\q1 +\v 4 in whose eyes a vile man is despised, +\q2 but who honors those who fear Yahweh; +\q2 he who keeps an oath even when it hurts, and doesn’t change; +\q1 +\v 5 he who doesn’t lend out his money for usury, +\q2 nor take a bribe against the innocent. +\b +\q1 He who does these things shall never be shaken. +\c 16 +\d A Poem by David. +\q1 +\v 1 Preserve me, God, for I take refuge in you. +\q1 +\v 2 My soul, you have said to Yahweh, “You are my Lord. +\q2 Apart from you I have no good thing.” +\q1 +\v 3 As for the saints who are in the earth, +\q2 they are the excellent ones in whom is all my delight. +\b +\q1 +\v 4 Their sorrows shall be multiplied who give gifts to another god. +\q2 Their drink offerings of blood I will not offer, +\q2 nor take their names on my lips. +\q1 +\v 5 Yahweh assigned my portion and my cup. +\q2 You made my lot secure. +\b +\q1 +\v 6 The lines have fallen to me in pleasant places. +\q2 Yes, I have a good inheritance. +\q1 +\v 7 I will bless Yahweh, who has given me counsel. +\q2 Yes, my heart instructs me in the night seasons. +\q1 +\v 8 I have set Yahweh always before me. +\q2 Because he is at my right hand, I shall not be moved. +\q1 +\v 9 Therefore my heart is glad, and my tongue rejoices. +\q2 My body shall also dwell in safety. +\q1 +\v 10 For you will not leave my soul in Sheol,\f + \fr 16:10 \ft Sheol is the place of the dead.\f* +\q2 neither will you allow your holy one to see corruption. +\q1 +\v 11 You will show me the path of life. +\q2 In your presence is fullness of joy. +\q1 In your right hand there are pleasures forever more. +\c 17 +\d A Prayer by David. +\q1 +\v 1 Hear, Yahweh, my righteous plea. +\q2 Give ear to my prayer that doesn’t go out of deceitful lips. +\q1 +\v 2 Let my sentence come out of your presence. +\q2 Let your eyes look on equity. +\q1 +\v 3 You have proved my heart. +\q2 You have visited me in the night. +\q2 You have tried me, and found nothing. +\q2 I have resolved that my mouth shall not disobey. +\q1 +\v 4 As for the deeds of men, by the word of your lips, +\q2 I have kept myself from the ways of the violent. +\q1 +\v 5 My steps have held fast to your paths. +\q2 My feet have not slipped. +\q1 +\v 6 I have called on you, for you will answer me, God. +\q2 Turn your ear to me. +\q2 Hear my speech. +\q1 +\v 7 Show your marvelous loving kindness, +\q2 you who save those who take refuge by your right hand from their enemies. +\q1 +\v 8 Keep me as the apple of your eye. +\q2 Hide me under the shadow of your wings, +\q1 +\v 9 from the wicked who oppress me, +\q2 my deadly enemies, who surround me. +\q1 +\v 10 They close up their callous hearts. +\q2 With their mouth they speak proudly. +\q1 +\v 11 They have now surrounded us in our steps. +\q2 They set their eyes to cast us down to the earth. +\q1 +\v 12 He is like a lion that is greedy of his prey, +\q2 as it were a young lion lurking in secret places. +\q1 +\v 13 Arise, Yahweh, confront him. +\q2 Cast him down. +\q1 Deliver my soul from the wicked by your sword, +\q2 +\v 14 from men by your hand, Yahweh, +\q2 from men of the world, whose portion is in this life. +\q1 You fill the belly of your cherished ones. +\q2 Your sons have plenty, +\q2 and they store up wealth for their children. +\q1 +\v 15 As for me, I shall see your face in righteousness. +\q2 I shall be satisfied, when I awake, with seeing your form. +\c 18 +\d For the Chief Musician. By David the servant of Yahweh, who spoke to Yahweh the words of this song in the day that Yahweh delivered him from the hand of all his enemies, and from the hand of Saul. He said, +\q1 +\v 1 I love you, Yahweh, my strength. +\q1 +\v 2 Yahweh is my rock, my fortress, and my deliverer; +\q2 my God, my rock, in whom I take refuge; +\q2 my shield, and the horn of my salvation, my high tower. +\q1 +\v 3 I call on Yahweh, who is worthy to be praised; +\q2 and I am saved from my enemies. +\q1 +\v 4 The cords of death surrounded me. +\q2 The floods of ungodliness made me afraid. +\q1 +\v 5 The cords of Sheol\f + \fr 18:5 \ft Sheol is the place of the dead.\f* were around me. +\q2 The snares of death came on me. +\q1 +\v 6 In my distress I called on Yahweh, +\q2 and cried to my God. +\q1 He heard my voice out of his temple. +\q2 My cry before him came into his ears. +\q1 +\v 7 Then the earth shook and trembled. +\q2 The foundations also of the mountains quaked and were shaken, +\q2 because he was angry. +\q1 +\v 8 Smoke went out of his nostrils. +\q2 Consuming fire came out of his mouth. +\q2 Coals were kindled by it. +\q1 +\v 9 He bowed the heavens also, and came down. +\q2 Thick darkness was under his feet. +\q1 +\v 10 He rode on a cherub, and flew. +\q2 Yes, he soared on the wings of the wind. +\q1 +\v 11 He made darkness his hiding place, his pavilion around him, +\q2 darkness of waters, thick clouds of the skies. +\q1 +\v 12 At the brightness before him his thick clouds passed, +\q2 hailstones and coals of fire. +\q1 +\v 13 Yahweh also thundered in the sky. +\q2 The Most High uttered his voice: +\q2 hailstones and coals of fire. +\q1 +\v 14 He sent out his arrows, and scattered them. +\q2 He routed them with great lightning bolts. +\q1 +\v 15 Then the channels of waters appeared. +\q2 The foundations of the world were laid bare at your rebuke, Yahweh, +\q2 at the blast of the breath of your nostrils. +\q1 +\v 16 He sent from on high. +\q2 He took me. +\q2 He drew me out of many waters. +\q1 +\v 17 He delivered me from my strong enemy, +\q2 from those who hated me; for they were too mighty for me. +\q1 +\v 18 They came on me in the day of my calamity, +\q2 but Yahweh was my support. +\q1 +\v 19 He brought me out also into a large place. +\q2 He delivered me, because he delighted in me. +\q1 +\v 20 Yahweh has rewarded me according to my righteousness. +\q2 According to the cleanness of my hands, he has recompensed me. +\q1 +\v 21 For I have kept the ways of Yahweh, +\q2 and have not wickedly departed from my God. +\q1 +\v 22 For all his ordinances were before me. +\q2 I didn’t put away his statutes from me. +\q1 +\v 23 I was also blameless with him. +\q2 I kept myself from my iniquity. +\q1 +\v 24 Therefore Yahweh has rewarded me according to my righteousness, +\q2 according to the cleanness of my hands in his eyesight. +\q1 +\v 25 With the merciful you will show yourself merciful. +\q2 With the perfect man, you will show yourself perfect. +\q1 +\v 26 With the pure, you will show yourself pure. +\q2 With the crooked you will show yourself shrewd. +\q1 +\v 27 For you will save the afflicted people, +\q2 but the arrogant eyes you will bring down. +\q1 +\v 28 For you will light my lamp, Yahweh. +\q2 My God will light up my darkness. +\q1 +\v 29 For by you, I advance through a troop. +\q2 By my God, I leap over a wall. +\q1 +\v 30 As for God, his way is perfect. +\q2 Yahweh’s word is tried. +\q2 He is a shield to all those who take refuge in him. +\q1 +\v 31 For who is God, except Yahweh? +\q2 Who is a rock, besides our God, +\q2 +\v 32 the God who arms me with strength, and makes my way perfect? +\q1 +\v 33 He makes my feet like deer’s feet, +\q2 and sets me on my high places. +\q1 +\v 34 He teaches my hands to war, +\q2 so that my arms bend a bow of bronze. +\q1 +\v 35 You have also given me the shield of your salvation. +\q2 Your right hand sustains me. +\q2 Your gentleness has made me great. +\q1 +\v 36 You have enlarged my steps under me, +\q2 My feet have not slipped. +\q1 +\v 37 I will pursue my enemies, and overtake them. +\q2 I won’t turn away until they are consumed. +\q1 +\v 38 I will strike them through, so that they will not be able to rise. +\q2 They shall fall under my feet. +\q1 +\v 39 For you have armed me with strength to the battle. +\q2 You have subdued under me those who rose up against me. +\q1 +\v 40 You have also made my enemies turn their backs to me, +\q2 that I might cut off those who hate me. +\q1 +\v 41 They cried, but there was no one to save; +\q2 even to Yahweh, but he didn’t answer them. +\q1 +\v 42 Then I beat them small as the dust before the wind. +\q2 I cast them out as the mire of the streets. +\q1 +\v 43 You have delivered me from the strivings of the people. +\q2 You have made me the head of the nations. +\q1 A people whom I have not known shall serve me. +\q2 +\v 44 As soon as they hear of me they shall obey me. +\q2 The foreigners shall submit themselves to me. +\q1 +\v 45 The foreigners shall fade away, +\q2 and shall come trembling out of their strongholds. +\q1 +\v 46 Yahweh lives! Blessed be my rock. +\q2 Exalted be the God of my salvation, +\q1 +\v 47 even the God who executes vengeance for me, +\q2 and subdues peoples under me. +\q1 +\v 48 He rescues me from my enemies. +\q2 Yes, you lift me up above those who rise up against me. +\q2 You deliver me from the violent man. +\q1 +\v 49 Therefore I will give thanks to you, Yahweh, among the nations, +\q2 and will sing praises to your name. +\q1 +\v 50 He gives great deliverance to his king, +\q2 and shows loving kindness to his anointed, +\q2 to David and to his offspring,\f + \fr 18:50 \ft or, seed\f* forever more. +\c 19 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 The heavens declare the glory of God. +\q2 The expanse shows his handiwork. +\q1 +\v 2 Day after day they pour out speech, +\q2 and night after night they display knowledge. +\q1 +\v 3 There is no speech nor language +\q2 where their voice is not heard. +\q1 +\v 4 Their voice has gone out through all the earth, +\q2 their words to the end of the world. +\q1 In them he has set a tent for the sun, +\q2 +\v 5 which is as a bridegroom coming out of his room, +\q2 like a strong man rejoicing to run his course. +\q1 +\v 6 His going out is from the end of the heavens, +\q2 his circuit to its ends. +\q2 There is nothing hidden from its heat. +\b +\q1 +\v 7 Yahweh’s law is perfect, restoring the soul. +\q2 Yahweh’s covenant is sure, making wise the simple. +\q1 +\v 8 Yahweh’s precepts are right, rejoicing the heart. +\q2 Yahweh’s commandment is pure, enlightening the eyes. +\q1 +\v 9 The fear of Yahweh is clean, enduring forever. +\q2 Yahweh’s ordinances are true, and righteous altogether. +\q1 +\v 10 They are more to be desired than gold, yes, than much fine gold, +\q2 sweeter also than honey and the extract of the honeycomb. +\q1 +\v 11 Moreover your servant is warned by them. +\q2 In keeping them there is great reward. +\q1 +\v 12 Who can discern his errors? +\q2 Forgive me from hidden errors. +\b +\q1 +\v 13 Keep back your servant also from presumptuous sins. +\q2 Let them not have dominion over me. +\q1 Then I will be upright. +\q2 I will be blameless and innocent of great transgression. +\q1 +\v 14 Let the words of my mouth and the meditation of my heart +\q2 be acceptable in your sight, +\q2 Yahweh, my rock, and my redeemer. +\c 20 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 May Yahweh answer you in the day of trouble. +\q2 May the name of the God of Jacob set you up on high, +\q2 +\v 2 send you help from the sanctuary, +\q2 grant you support from Zion, +\q2 +\v 3 remember all your offerings, +\q2 and accept your burned sacrifice. \qs Selah.\qs* +\q1 +\v 4 May he grant you your heart’s desire, +\q2 and fulfill all your counsel. +\q1 +\v 5 We will triumph in your salvation. +\q2 In the name of our God, we will set up our banners. +\q2 May Yahweh grant all your requests. +\q1 +\v 6 Now I know that Yahweh saves his anointed. +\q2 He will answer him from his holy heaven, +\q2 with the saving strength of his right hand. +\q1 +\v 7 Some trust in chariots, and some in horses, +\q2 but we trust in the name of Yahweh our God. +\q1 +\v 8 They are bowed down and fallen, +\q2 but we rise up, and stand upright. +\q1 +\v 9 Save, Yahweh! +\q2 Let the King answer us when we call! +\c 21 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 The king rejoices in your strength, Yahweh! +\q2 How greatly he rejoices in your salvation! +\q1 +\v 2 You have given him his heart’s desire, +\q2 and have not withheld the request of his lips. \qs Selah.\qs* +\q1 +\v 3 For you meet him with the blessings of goodness. +\q2 You set a crown of fine gold on his head. +\q1 +\v 4 He asked life of you and you gave it to him, +\q2 even length of days forever and ever. +\q1 +\v 5 His glory is great in your salvation. +\q2 You lay honor and majesty on him. +\q1 +\v 6 For you make him most blessed forever. +\q2 You make him glad with joy in your presence. +\q1 +\v 7 For the king trusts in Yahweh. +\q2 Through the loving kindness of the Most High, he shall not be moved. +\q1 +\v 8 Your hand will find out all of your enemies. +\q2 Your right hand will find out those who hate you. +\q1 +\v 9 You will make them as a fiery furnace in the time of your anger. +\q2 Yahweh will swallow them up in his wrath. +\q2 The fire shall devour them. +\q1 +\v 10 You will destroy their descendants from the earth, +\q2 their posterity from among the children of men. +\q1 +\v 11 For they intended evil against you. +\q2 They plotted evil against you which cannot succeed. +\q1 +\v 12 For you will make them turn their back, +\q2 when you aim drawn bows at their face. +\q1 +\v 13 Be exalted, Yahweh, in your strength, +\q2 so we will sing and praise your power. +\c 22 +\d For the Chief Musician; set to “The Doe of the Morning.” A Psalm by David. +\q1 +\v 1 My God, my God, why have you forsaken me? +\q2 Why are you so far from helping me, and from the words of my groaning? +\q1 +\v 2 My God, I cry in the daytime, but you don’t answer; +\q2 in the night season, and am not silent. +\q1 +\v 3 But you are holy, +\q2 you who inhabit the praises of Israel. +\q1 +\v 4 Our fathers trusted in you. +\q2 They trusted, and you delivered them. +\q1 +\v 5 They cried to you, and were delivered. +\q2 They trusted in you, and were not disappointed. +\q1 +\v 6 But I am a worm, and no man; +\q2 a reproach of men, and despised by the people. +\q1 +\v 7 All those who see me mock me. +\q2 They insult me with their lips. They shake their heads, saying, +\q2 +\v 8 “He trusts in Yahweh. +\q2 Let him deliver him. +\q2 Let him rescue him, since he delights in him.” +\q1 +\v 9 But you brought me out of the womb. +\q2 You made me trust while at my mother’s breasts. +\q1 +\v 10 I was thrown on you from my mother’s womb. +\q2 You are my God since my mother bore me. +\q1 +\v 11 Don’t be far from me, for trouble is near. +\q2 For there is no one to help. +\q1 +\v 12 Many bulls have surrounded me. +\q2 Strong bulls of Bashan have encircled me. +\q1 +\v 13 They open their mouths wide against me, +\q2 lions tearing prey and roaring. +\q1 +\v 14 I am poured out like water. +\q2 All my bones are out of joint. +\q1 My heart is like wax. +\q2 It is melted within me. +\q1 +\v 15 My strength is dried up like a potsherd. +\q2 My tongue sticks to the roof of my mouth. +\q1 You have brought me into the dust of death. +\q1 +\v 16 For dogs have surrounded me. +\q2 A company of evildoers have enclosed me. +\q2 They have pierced my hands and feet.\f + \fr 22:16 \ft So Dead Sea Scrolls. Masoretic Text reads, “Like a lion, they pin my hands and feet.”\f* +\q1 +\v 17 I can count all of my bones. +\q1 They look and stare at me. +\q1 +\v 18 They divide my garments among them. +\q2 They cast lots for my clothing. +\b +\q1 +\v 19 But don’t be far off, Yahweh. +\q2 You are my help. Hurry to help me! +\q1 +\v 20 Deliver my soul from the sword, +\q2 my precious life from the power of the dog. +\q1 +\v 21 Save me from the lion’s mouth! +\q2 Yes, you have rescued me from the horns of the wild oxen. +\b +\q1 +\v 22 I will declare your name to my brothers. +\q2 Among the assembly, I will praise you. +\q1 +\v 23 You who fear Yahweh, praise him! +\q2 All you descendants of Jacob, glorify him! +\q2 Stand in awe of him, all you descendants of Israel! +\q1 +\v 24 For he has not despised nor abhorred the affliction of the afflicted, +\q2 neither has he hidden his face from him; +\q2 but when he cried to him, he heard. +\b +\q1 +\v 25 My praise of you comes in the great assembly. +\q2 I will pay my vows before those who fear him. +\q1 +\v 26 The humble shall eat and be satisfied. +\q2 They shall praise Yahweh who seek after him. +\q2 Let your hearts live forever. +\q1 +\v 27 All the ends of the earth shall remember and turn to Yahweh. +\q2 All the relatives of the nations shall worship before you. +\q1 +\v 28 For the kingdom is Yahweh’s. +\q2 He is the ruler over the nations. +\q1 +\v 29 All the rich ones of the earth shall eat and worship. +\q2 All those who go down to the dust shall bow before him, +\q2 even he who can’t keep his soul alive. +\q1 +\v 30 Posterity shall serve him. +\q2 Future generations shall be told about the Lord. +\q1 +\v 31 They shall come and shall declare his righteousness to a people that shall be born, +\q2 for he has done it. +\c 23 +\d A Psalm by David. +\q1 +\v 1 Yahweh is my shepherd; +\q2 I shall lack nothing. +\q1 +\v 2 He makes me lie down in green pastures. +\q2 He leads me beside still waters. +\q1 +\v 3 He restores my soul. +\q2 He guides me in the paths of righteousness for his name’s sake. +\q1 +\v 4 Even though I walk through the valley of the shadow of death, +\q2 I will fear no evil, for you are with me. +\q1 Your rod and your staff, +\q2 they comfort me. +\q1 +\v 5 You prepare a table before me +\q2 in the presence of my enemies. +\q1 You anoint my head with oil. +\q2 My cup runs over. +\q1 +\v 6 Surely goodness and loving kindness shall follow me all the days of my life, +\q2 and I will dwell in Yahweh’s house forever. +\c 24 +\d A Psalm by David. +\q1 +\v 1 The earth is Yahweh’s, with its fullness; +\q2 the world, and those who dwell in it. +\q1 +\v 2 For he has founded it on the seas, +\q2 and established it on the floods. +\b +\q1 +\v 3 Who may ascend to Yahweh’s hill? +\q2 Who may stand in his holy place? +\q1 +\v 4 He who has clean hands and a pure heart; +\q2 who has not lifted up his soul to falsehood, +\q2 and has not sworn deceitfully. +\q1 +\v 5 He shall receive a blessing from Yahweh, +\q2 righteousness from the God of his salvation. +\q1 +\v 6 This is the generation of those who seek Him, +\q2 who seek your face—even Jacob. \qs Selah.\qs* +\b +\q1 +\v 7 Lift up your heads, you gates! +\q2 Be lifted up, you everlasting doors, +\q2 and the King of glory will come in. +\q1 +\v 8 Who is the King of glory? +\q2 Yahweh strong and mighty, +\q2 Yahweh mighty in battle. +\q1 +\v 9 Lift up your heads, you gates; +\q2 yes, lift them up, you everlasting doors, +\q2 and the King of glory will come in. +\q1 +\v 10 Who is this King of glory? +\q2 Yahweh of Armies is the King of glory! \qs Selah.\qs* +\c 25 +\d By David. +\q1 +\v 1 To you, Yahweh, I lift up my soul. +\q1 +\v 2 My God, I have trusted in you. +\q2 Don’t let me be shamed. +\q2 Don’t let my enemies triumph over me. +\q1 +\v 3 Yes, no one who waits for you will be shamed. +\q2 They will be shamed who deal treacherously without cause. +\b +\q1 +\v 4 Show me your ways, Yahweh. +\q2 Teach me your paths. +\q1 +\v 5 Guide me in your truth, and teach me, +\q2 for you are the God of my salvation. +\q2 I wait for you all day long. +\q1 +\v 6 Yahweh, remember your tender mercies and your loving kindness, +\q2 for they are from old times. +\q1 +\v 7 Don’t remember the sins of my youth, nor my transgressions. +\q2 Remember me according to your loving kindness, +\q2 for your goodness’ sake, Yahweh. +\q1 +\v 8 Good and upright is Yahweh, +\q2 therefore he will instruct sinners in the way. +\q1 +\v 9 He will guide the humble in justice. +\q2 He will teach the humble his way. +\q1 +\v 10 All the paths of Yahweh are loving kindness and truth +\q2 to such as keep his covenant and his testimonies. +\q1 +\v 11 For your name’s sake, Yahweh, +\q2 pardon my iniquity, for it is great. +\q1 +\v 12 What man is he who fears Yahweh? +\q2 He shall instruct him in the way that he shall choose. +\q1 +\v 13 His soul will dwell at ease. +\q2 His offspring will inherit the land. +\q1 +\v 14 The friendship of Yahweh is with those who fear him. +\q2 He will show them his covenant. +\b +\q1 +\v 15 My eyes are ever on Yahweh, +\q2 for he will pluck my feet out of the net. +\q1 +\v 16 Turn to me, and have mercy on me, +\q2 for I am desolate and afflicted. +\q1 +\v 17 The troubles of my heart are enlarged. +\q2 Oh bring me out of my distresses. +\q1 +\v 18 Consider my affliction and my travail. +\q2 Forgive all my sins. +\q1 +\v 19 Consider my enemies, for they are many. +\q2 They hate me with cruel hatred. +\q1 +\v 20 Oh keep my soul, and deliver me. +\q2 Let me not be disappointed, for I take refuge in you. +\q1 +\v 21 Let integrity and uprightness preserve me, +\q2 for I wait for you. +\q1 +\v 22 God, redeem Israel +\q2 out of all his troubles. +\c 26 +\d By David. +\q1 +\v 1 Judge me, Yahweh, for I have walked in my integrity. +\q2 I have trusted also in Yahweh without wavering. +\q1 +\v 2 Examine me, Yahweh, and prove me. +\q2 Try my heart and my mind. +\q1 +\v 3 For your loving kindness is before my eyes. +\q2 I have walked in your truth. +\q1 +\v 4 I have not sat with deceitful men, +\q2 neither will I go in with hypocrites. +\q1 +\v 5 I hate the assembly of evildoers, +\q2 and will not sit with the wicked. +\q1 +\v 6 I will wash my hands in innocence, +\q2 so I will go about your altar, Yahweh, +\q2 +\v 7 that I may make the voice of thanksgiving to be heard +\q2 and tell of all your wondrous deeds. +\q1 +\v 8 Yahweh, I love the habitation of your house, +\q2 the place where your glory dwells. +\q1 +\v 9 Don’t gather my soul with sinners, +\q2 nor my life with bloodthirsty men +\q2 +\v 10 in whose hands is wickedness; +\q2 their right hand is full of bribes. +\b +\q1 +\v 11 But as for me, I will walk in my integrity. +\q2 Redeem me, and be merciful to me. +\q1 +\v 12 My foot stands in an even place. +\q2 In the congregations I will bless Yahweh. +\c 27 +\d By David. +\q1 +\v 1 Yahweh is my light and my salvation. +\q2 Whom shall I fear? +\q1 Yahweh is the strength of my life. +\q2 Of whom shall I be afraid? +\q1 +\v 2 When evildoers came at me to eat up my flesh, +\q2 even my adversaries and my foes, they stumbled and fell. +\q1 +\v 3 Though an army should encamp against me, +\q2 my heart shall not fear. +\q1 Though war should rise against me, +\q2 even then I will be confident. +\q1 +\v 4 One thing I have asked of Yahweh, that I will seek after: +\q2 that I may dwell in Yahweh’s house all the days of my life, +\q2 to see Yahweh’s beauty, +\q2 and to inquire in his temple. +\q1 +\v 5 For in the day of trouble, he will keep me secretly in his pavilion. +\q2 In the secret place of his tabernacle, he will hide me. +\q2 He will lift me up on a rock. +\q1 +\v 6 Now my head will be lifted up above my enemies around me. +\q1 I will offer sacrifices of joy in his tent. +\q2 I will sing, yes, I will sing praises to Yahweh. +\b +\q1 +\v 7 Hear, Yahweh, when I cry with my voice. +\q2 Have mercy also on me, and answer me. +\q1 +\v 8 When you said, “Seek my face,” +\q2 my heart said to you, “I will seek your face, Yahweh.” +\q1 +\v 9 Don’t hide your face from me. +\q2 Don’t put your servant away in anger. +\q1 You have been my help. +\q2 Don’t abandon me, +\q2 neither forsake me, God of my salvation. +\q1 +\v 10 When my father and my mother forsake me, +\q2 then Yahweh will take me up. +\q1 +\v 11 Teach me your way, Yahweh. +\q2 Lead me in a straight path, because of my enemies. +\q1 +\v 12 Don’t deliver me over to the desire of my adversaries, +\q2 for false witnesses have risen up against me, +\q2 such as breathe out cruelty. +\q1 +\v 13 I am still confident of this: +\q2 I will see the goodness of Yahweh in the land of the living. +\q1 +\v 14 Wait for Yahweh. +\q2 Be strong, and let your heart take courage. +\q1 Yes, wait for Yahweh. +\c 28 +\d By David. +\q1 +\v 1 To you, Yahweh, I call. +\q2 My rock, don’t be deaf to me, +\q2 lest, if you are silent to me, +\q2 I would become like those who go down into the pit. +\q1 +\v 2 Hear the voice of my petitions, when I cry to you, +\q2 when I lift up my hands toward your Most Holy Place. +\q1 +\v 3 Don’t draw me away with the wicked, +\q2 with the workers of iniquity who speak peace with their neighbors, +\q2 but mischief is in their hearts. +\q1 +\v 4 Give them according to their work, and according to the wickedness of their doings. +\q2 Give them according to the operation of their hands. +\q2 Bring back on them what they deserve. +\q1 +\v 5 Because they don’t respect the works of Yahweh, +\q2 nor the operation of his hands, +\q2 he will break them down and not build them up. +\b +\q1 +\v 6 Blessed be Yahweh, +\q2 because he has heard the voice of my petitions. +\q1 +\v 7 Yahweh is my strength and my shield. +\q2 My heart has trusted in him, and I am helped. +\q1 Therefore my heart greatly rejoices. +\q2 With my song I will thank him. +\q1 +\v 8 Yahweh is their strength. +\q2 He is a stronghold of salvation to his anointed. +\q1 +\v 9 Save your people, +\q2 and bless your inheritance. +\q1 Be their shepherd also, +\q2 and bear them up forever. +\c 29 +\d A Psalm by David. +\q1 +\v 1 Ascribe to Yahweh, you sons of the mighty, +\q2 ascribe to Yahweh glory and strength. +\q1 +\v 2 Ascribe to Yahweh the glory due to his name. +\q2 Worship Yahweh in holy array. +\b +\q1 +\v 3 Yahweh’s voice is on the waters. +\q2 The God of glory thunders, even Yahweh on many waters. +\q1 +\v 4 Yahweh’s voice is powerful. +\q2 Yahweh’s voice is full of majesty. +\q1 +\v 5 Yahweh’s voice breaks the cedars. +\q2 Yes, Yahweh breaks in pieces the cedars of Lebanon. +\q1 +\v 6 He makes them also to skip like a calf; +\q2 Lebanon and Sirion like a young, wild ox. +\q1 +\v 7 Yahweh’s voice strikes with flashes of lightning. +\q2 +\v 8 Yahweh’s voice shakes the wilderness. +\q2 Yahweh shakes the wilderness of Kadesh. +\q1 +\v 9 Yahweh’s voice makes the deer calve, +\q2 and strips the forests bare. +\q2 In his temple everything says, “Glory!” +\b +\q1 +\v 10 Yahweh sat enthroned at the Flood. +\q2 Yes, Yahweh sits as King forever. +\q1 +\v 11 Yahweh will give strength to his people. +\q2 Yahweh will bless his people with peace. +\c 30 +\d A Psalm. A Song for the Dedication of the Temple. By David. +\q1 +\v 1 I will extol you, Yahweh, for you have raised me up, +\q2 and have not made my foes to rejoice over me. +\q1 +\v 2 Yahweh my God, I cried to you, +\q2 and you have healed me. +\q1 +\v 3 Yahweh, you have brought up my soul from Sheol.\f + \fr 30:3 \ft Sheol is the place of the dead.\f* +\q2 You have kept me alive, that I should not go down to the pit. +\q1 +\v 4 Sing praise to Yahweh, you saints of his. +\q2 Give thanks to his holy name. +\q1 +\v 5 For his anger is but for a moment. +\q2 His favor is for a lifetime. +\q1 Weeping may stay for the night, +\q2 but joy comes in the morning. +\q1 +\v 6 As for me, I said in my prosperity, +\q2 “I shall never be moved.” +\q1 +\v 7 You, Yahweh, when you favored me, made my mountain stand strong; +\q2 but when you hid your face, I was troubled. +\q1 +\v 8 I cried to you, Yahweh. +\q2 I made supplication to the Lord: +\q1 +\v 9 “What profit is there in my destruction, if I go down to the pit? +\q2 Shall the dust praise you? +\q2 Shall it declare your truth? +\q1 +\v 10 Hear, Yahweh, and have mercy on me. +\q2 Yahweh, be my helper.” +\q1 +\v 11 You have turned my mourning into dancing for me. +\q2 You have removed my sackcloth, and clothed me with gladness, +\q2 +\v 12 to the end that my heart may sing praise to you, and not be silent. +\q1 Yahweh my God, I will give thanks to you forever! +\c 31 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 In you, Yahweh, I take refuge. +\q2 Let me never be disappointed. +\q2 Deliver me in your righteousness. +\q1 +\v 2 Bow down your ear to me. +\q2 Deliver me speedily. +\q1 Be to me a strong rock, +\q2 a house of defense to save me. +\q1 +\v 3 For you are my rock and my fortress, +\q2 therefore for your name’s sake lead me and guide me. +\q1 +\v 4 Pluck me out of the net that they have laid secretly for me, +\q2 for you are my stronghold. +\q1 +\v 5 Into your hand I commend my spirit. +\q2 You redeem me, Yahweh, God of truth. +\q1 +\v 6 I hate those who regard lying vanities, +\q2 but I trust in Yahweh. +\q1 +\v 7 I will be glad and rejoice in your loving kindness, +\q2 for you have seen my affliction. +\q2 You have known my soul in adversities. +\q1 +\v 8 You have not shut me up into the hand of the enemy. +\q2 You have set my feet in a large place. +\q1 +\v 9 Have mercy on me, Yahweh, for I am in distress. +\q2 My eye, my soul, and my body waste away with grief. +\q1 +\v 10 For my life is spent with sorrow, +\q2 my years with sighing. +\q1 My strength fails because of my iniquity. +\q2 My bones are wasted away. +\q1 +\v 11 Because of all my adversaries I have become utterly contemptible to my neighbors, +\q2 a horror to my acquaintances. +\q2 Those who saw me on the street fled from me. +\q1 +\v 12 I am forgotten from their hearts like a dead man. +\q2 I am like broken pottery. +\q1 +\v 13 For I have heard the slander of many, terror on every side, +\q2 while they conspire together against me, +\q2 they plot to take away my life. +\q1 +\v 14 But I trust in you, Yahweh. +\q2 I said, “You are my God.” +\q1 +\v 15 My times are in your hand. +\q2 Deliver me from the hand of my enemies, and from those who persecute me. +\q1 +\v 16 Make your face to shine on your servant. +\q2 Save me in your loving kindness. +\q1 +\v 17 Let me not be disappointed, Yahweh, for I have called on you. +\q2 Let the wicked be disappointed. +\q2 Let them be silent in Sheol.\f + \fr 31:17 \ft Sheol is the place of the dead.\f* +\q1 +\v 18 Let the lying lips be mute, +\q2 which speak against the righteous insolently, with pride and contempt. +\q1 +\v 19 Oh how great is your goodness, +\q2 which you have laid up for those who fear you, +\q2 which you have worked for those who take refuge in you, +\q2 before the sons of men! +\q1 +\v 20 In the shelter of your presence you will hide them from the plotting of man. +\q2 You will keep them secretly in a dwelling away from the strife of tongues. +\q1 +\v 21 Praise be to Yahweh, +\q2 for he has shown me his marvelous loving kindness in a strong city. +\q1 +\v 22 As for me, I said in my haste, “I am cut off from before your eyes.” +\q2 Nevertheless you heard the voice of my petitions when I cried to you. +\q1 +\v 23 Oh love Yahweh, all you his saints! +\q2 Yahweh preserves the faithful, +\q1 and fully recompenses him who behaves arrogantly. +\q1 +\v 24 Be strong, and let your heart take courage, +\q2 all you who hope in Yahweh. +\c 32 +\d By David. A contemplative psalm. +\q1 +\v 1 Blessed is he whose disobedience is forgiven, +\q2 whose sin is covered. +\q1 +\v 2 Blessed is the man to whom Yahweh doesn’t impute iniquity, +\q2 in whose spirit there is no deceit. +\q1 +\v 3 When I kept silence, my bones wasted away through my groaning all day long. +\q1 +\v 4 For day and night your hand was heavy on me. +\q2 My strength was sapped in the heat of summer. \qs Selah.\qs* +\q1 +\v 5 I acknowledged my sin to you. +\q2 I didn’t hide my iniquity. +\q1 I said, I will confess my transgressions to Yahweh, +\q2 and you forgave the iniquity of my sin. \qs Selah.\qs* +\q1 +\v 6 For this, let everyone who is godly pray to you in a time when you may be found. +\q2 Surely when the great waters overflow, they shall not reach to him. +\q1 +\v 7 You are my hiding place. +\q2 You will preserve me from trouble. +\q2 You will surround me with songs of deliverance. \qs Selah.\qs* +\q1 +\v 8 I will instruct you and teach you in the way which you shall go. +\q2 I will counsel you with my eye on you. +\q1 +\v 9 Don’t be like the horse, or like the mule, which have no understanding, +\q2 who are controlled by bit and bridle, or else they will not come near to you. +\q1 +\v 10 Many sorrows come to the wicked, +\q2 but loving kindness shall surround him who trusts in Yahweh. +\q1 +\v 11 Be glad in Yahweh, and rejoice, you righteous! +\q2 Shout for joy, all you who are upright in heart! +\c 33 +\q1 +\v 1 Rejoice in Yahweh, you righteous! +\q2 Praise is fitting for the upright. +\q1 +\v 2 Give thanks to Yahweh with the lyre. +\q2 Sing praises to him with the harp of ten strings. +\q1 +\v 3 Sing to him a new song. +\q2 Play skillfully with a shout of joy! +\q1 +\v 4 For Yahweh’s word is right. +\q2 All his work is done in faithfulness. +\q1 +\v 5 He loves righteousness and justice. +\q2 The earth is full of the loving kindness of Yahweh. +\q1 +\v 6 By Yahweh’s word, the heavens were made: +\q2 all their army by the breath of his mouth. +\q1 +\v 7 He gathers the waters of the sea together as a heap. +\q2 He lays up the deeps in storehouses. +\q1 +\v 8 Let all the earth fear Yahweh. +\q2 Let all the inhabitants of the world stand in awe of him. +\q1 +\v 9 For he spoke, and it was done. +\q2 He commanded, and it stood firm. +\q1 +\v 10 Yahweh brings the counsel of the nations to nothing. +\q2 He makes the thoughts of the peoples to be of no effect. +\q1 +\v 11 The counsel of Yahweh stands fast forever, +\q2 the thoughts of his heart to all generations. +\q1 +\v 12 Blessed is the nation whose God is Yahweh, +\q2 the people whom he has chosen for his own inheritance. +\q1 +\v 13 Yahweh looks from heaven. +\q2 He sees all the sons of men. +\q1 +\v 14 From the place of his habitation he looks out on all the inhabitants of the earth, +\q2 +\v 15 he who fashions all of their hearts; +\q2 and he considers all of their works. +\q1 +\v 16 There is no king saved by the multitude of an army. +\q2 A mighty man is not delivered by great strength. +\q1 +\v 17 A horse is a vain thing for safety, +\q2 neither does he deliver any by his great power. +\q1 +\v 18 Behold, Yahweh’s eye is on those who fear him, +\q2 on those who hope in his loving kindness, +\q2 +\v 19 to deliver their soul from death, +\q2 to keep them alive in famine. +\q1 +\v 20 Our soul has waited for Yahweh. +\q2 He is our help and our shield. +\q1 +\v 21 For our heart rejoices in him, +\q2 because we have trusted in his holy name. +\q1 +\v 22 Let your loving kindness be on us, Yahweh, +\q2 since we have hoped in you. +\c 34 +\d By David; when he pretended to be insane before Abimelech, who drove him away, and he departed. +\q1 +\v 1 \f + \fr 34:1 \ft Psalm 34 is an acrostic poem, with each verse starting with a letter of the alphabet (ordered from Alef to Tav).\f* I will bless Yahweh at all times. +\q2 His praise will always be in my mouth. +\q1 +\v 2 My soul shall boast in Yahweh. +\q2 The humble shall hear of it and be glad. +\q1 +\v 3 Oh magnify Yahweh with me. +\q2 Let’s exalt his name together. +\q1 +\v 4 I sought Yahweh, and he answered me, +\q2 and delivered me from all my fears. +\q1 +\v 5 They looked to him, and were radiant. +\q2 Their faces shall never be covered with shame. +\q1 +\v 6 This poor man cried, and Yahweh heard him, +\q2 and saved him out of all his troubles. +\q1 +\v 7 Yahweh’s angel encamps around those who fear him, +\q2 and delivers them. +\q1 +\v 8 Oh taste and see that Yahweh is good. +\q2 Blessed is the man who takes refuge in him. +\q1 +\v 9 Oh fear Yahweh, you his saints, +\q2 for there is no lack with those who fear him. +\q1 +\v 10 The young lions do lack, and suffer hunger, +\q2 but those who seek Yahweh shall not lack any good thing. +\b +\q1 +\v 11 Come, you children, listen to me. +\q2 I will teach you the fear of Yahweh. +\q1 +\v 12 Who is someone who desires life, +\q2 and loves many days, that he may see good? +\q1 +\v 13 Keep your tongue from evil, +\q2 and your lips from speaking lies. +\q1 +\v 14 Depart from evil, and do good. +\q2 Seek peace, and pursue it. +\q1 +\v 15 Yahweh’s eyes are toward the righteous. +\q2 His ears listen to their cry. +\q1 +\v 16 Yahweh’s face is against those who do evil, +\q2 to cut off their memory from the earth. +\q1 +\v 17 The righteous cry, and Yahweh hears, +\q2 and delivers them out of all their troubles. +\q1 +\v 18 Yahweh is near to those who have a broken heart, +\q2 and saves those who have a crushed spirit. +\q1 +\v 19 Many are the afflictions of the righteous, +\q2 but Yahweh delivers him out of them all. +\q1 +\v 20 He protects all of his bones. +\q2 Not one of them is broken. +\q1 +\v 21 Evil shall kill the wicked. +\q2 Those who hate the righteous shall be condemned. +\q1 +\v 22 Yahweh redeems the soul of his servants. +\q2 None of those who take refuge in him shall be condemned. +\c 35 +\d By David. +\q1 +\v 1 Contend, Yahweh, with those who contend with me. +\q2 Fight against those who fight against me. +\q1 +\v 2 Take hold of shield and buckler, +\q2 and stand up for my help. +\q1 +\v 3 Brandish the spear and block those who pursue me. +\q2 Tell my soul, “I am your salvation.” +\q1 +\v 4 Let those who seek after my soul be disappointed and brought to dishonor. +\q2 Let those who plot my ruin be turned back and confounded. +\q1 +\v 5 Let them be as chaff before the wind, +\q2 Yahweh’s angel driving them on. +\q1 +\v 6 Let their way be dark and slippery, +\q2 Yahweh’s angel pursuing them. +\q1 +\v 7 For without cause they have hidden their net in a pit for me. +\q2 Without cause they have dug a pit for my soul. +\q1 +\v 8 Let destruction come on him unawares. +\q2 Let his net that he has hidden catch himself. +\q2 Let him fall into that destruction. +\b +\q1 +\v 9 My soul shall be joyful in Yahweh. +\q2 It shall rejoice in his salvation. +\q1 +\v 10 All my bones shall say, “Yahweh, who is like you, +\q2 who delivers the poor from him who is too strong for him; +\q2 yes, the poor and the needy from him who robs him?” +\q1 +\v 11 Unrighteous witnesses rise up. +\q2 They ask me about things that I don’t know about. +\q1 +\v 12 They reward me evil for good, +\q2 to the bereaving of my soul. +\b +\q1 +\v 13 But as for me, when they were sick, my clothing was sackcloth. +\q2 I afflicted my soul with fasting. +\q2 My prayer returned into my own bosom. +\q1 +\v 14 I behaved myself as though it had been my friend or my brother. +\q2 I bowed down mourning, as one who mourns his mother. +\q1 +\v 15 But in my adversity, they rejoiced, and gathered themselves together. +\q2 The attackers gathered themselves together against me, and I didn’t know it. +\q2 They tore at me, and didn’t cease. +\q1 +\v 16 Like the profane mockers in feasts, +\q2 they gnashed their teeth at me. +\q1 +\v 17 Lord, how long will you look on? +\q2 Rescue my soul from their destruction, +\q2 my precious life from the lions. +\q1 +\v 18 I will give you thanks in the great assembly. +\q2 I will praise you among many people. +\q1 +\v 19 Don’t let those who are my enemies wrongfully rejoice over me; +\q2 neither let those who hate me without a cause wink their eyes. +\q1 +\v 20 For they don’t speak peace, +\q2 but they devise deceitful words against those who are quiet in the land. +\q1 +\v 21 Yes, they opened their mouth wide against me. +\q2 They said, “Aha! Aha! Our eye has seen it!” +\q1 +\v 22 You have seen it, Yahweh. Don’t keep silent. +\q2 Lord, don’t be far from me. +\q1 +\v 23 Wake up! Rise up to defend me, my God! +\q2 My Lord, contend for me! +\q1 +\v 24 Vindicate me, Yahweh my God, according to your righteousness. +\q2 Don’t let them gloat over me. +\q1 +\v 25 Don’t let them say in their heart, “Aha! That’s the way we want it!” +\q2 Don’t let them say, “We have swallowed him up!” +\q1 +\v 26 Let them be disappointed and confounded together who rejoice at my calamity. +\q2 Let them be clothed with shame and dishonor who magnify themselves against me. +\b +\q1 +\v 27 Let those who favor my righteous cause shout for joy and be glad. +\q2 Yes, let them say continually, “May Yahweh be magnified, +\q2 who has pleasure in the prosperity of his servant!” +\q1 +\v 28 My tongue shall talk about your righteousness and about your praise all day long. +\c 36 +\d For the Chief Musician. By David, the servant of Yahweh. +\q1 +\v 1 A revelation is within my heart about the disobedience of the wicked: +\q2 There is no fear of God before his eyes. +\q1 +\v 2 For he flatters himself in his own eyes, +\q2 too much to detect and hate his sin. +\q1 +\v 3 The words of his mouth are iniquity and deceit. +\q2 He has ceased to be wise and to do good. +\q1 +\v 4 He plots iniquity on his bed. +\q2 He sets himself in a way that is not good. +\q2 He doesn’t abhor evil. +\b +\q1 +\v 5 Your loving kindness, Yahweh, is in the heavens. +\q2 Your faithfulness reaches to the skies. +\q1 +\v 6 Your righteousness is like the mountains of God. +\q2 Your judgments are like a great deep. +\q2 Yahweh, you preserve man and animal. +\q1 +\v 7 How precious is your loving kindness, God! +\q2 The children of men take refuge under the shadow of your wings. +\q1 +\v 8 They shall be abundantly satisfied with the abundance of your house. +\q2 You will make them drink of the river of your pleasures. +\q1 +\v 9 For with you is the spring of life. +\q2 In your light we will see light. +\q1 +\v 10 Oh continue your loving kindness to those who know you, +\q2 your righteousness to the upright in heart. +\q1 +\v 11 Don’t let the foot of pride come against me. +\q2 Don’t let the hand of the wicked drive me away. +\q1 +\v 12 There the workers of iniquity are fallen. +\q2 They are thrust down, and shall not be able to rise. +\c 37 +\d By David. +\q1 +\v 1 Don’t fret because of evildoers, +\q2 neither be envious against those who work unrighteousness. +\q1 +\v 2 For they shall soon be cut down like the grass, +\q2 and wither like the green herb. +\q1 +\v 3 Trust in Yahweh, and do good. +\q2 Dwell in the land, and enjoy safe pasture. +\q1 +\v 4 Also delight yourself in Yahweh, +\q2 and he will give you the desires of your heart. +\q1 +\v 5 Commit your way to Yahweh. +\q2 Trust also in him, and he will do this: +\q1 +\v 6 he will make your righteousness shine out like light, +\q2 and your justice as the noon day sun. +\q1 +\v 7 Rest in Yahweh, and wait patiently for him. +\q2 Don’t fret because of him who prospers in his way, +\q2 because of the man who makes wicked plots happen. +\q1 +\v 8 Cease from anger, and forsake wrath. +\q2 Don’t fret; it leads only to evildoing. +\q1 +\v 9 For evildoers shall be cut off, +\q2 but those who wait for Yahweh shall inherit the land. +\q1 +\v 10 For yet a little while, and the wicked will be no more. +\q2 Yes, though you look for his place, he isn’t there. +\q1 +\v 11 But the humble shall inherit the land, +\q2 and shall delight themselves in the abundance of peace. +\q1 +\v 12 The wicked plots against the just, +\q2 and gnashes at him with his teeth. +\q1 +\v 13 The Lord will laugh at him, +\q2 for he sees that his day is coming. +\q1 +\v 14 The wicked have drawn out the sword, and have bent their bow, +\q2 to cast down the poor and needy, +\q2 to kill those who are upright on the path. +\q1 +\v 15 Their sword shall enter into their own heart. +\q2 Their bows shall be broken. +\q1 +\v 16 Better is a little that the righteous has, +\q2 than the abundance of many wicked. +\q1 +\v 17 For the arms of the wicked shall be broken, +\q2 but Yahweh upholds the righteous. +\q1 +\v 18 Yahweh knows the days of the perfect. +\q2 Their inheritance shall be forever. +\q1 +\v 19 They shall not be disappointed in the time of evil. +\q2 In the days of famine they shall be satisfied. +\b +\q1 +\v 20 But the wicked shall perish. +\q2 The enemies of Yahweh shall be like the beauty of the fields. +\q2 They will vanish— +\q2 vanish like smoke. +\q1 +\v 21 The wicked borrow, and don’t pay back, +\q2 but the righteous give generously. +\q1 +\v 22 For such as are blessed by him shall inherit the land. +\q2 Those who are cursed by him shall be cut off. +\q1 +\v 23 A man’s steps are established by Yahweh. +\q2 He delights in his way. +\q1 +\v 24 Though he stumble, he shall not fall, +\q2 for Yahweh holds him up with his hand. +\q1 +\v 25 I have been young, and now am old, +\q2 yet I have not seen the righteous forsaken, +\q2 nor his children begging for bread. +\q1 +\v 26 All day long he deals graciously, and lends. +\q2 His offspring is blessed. +\q1 +\v 27 Depart from evil, and do good. +\q2 Live securely forever. +\q1 +\v 28 For Yahweh loves justice, +\q2 and doesn’t forsake his saints. +\q2 They are preserved forever, +\q2 but the children of the wicked shall be cut off. +\q1 +\v 29 The righteous shall inherit the land, +\q2 and live in it forever. +\b +\q1 +\v 30 The mouth of the righteous talks of wisdom. +\q2 His tongue speaks justice. +\q1 +\v 31 The law of his God is in his heart. +\q2 None of his steps shall slide. +\q1 +\v 32 The wicked watch the righteous, +\q2 and seek to kill him. +\q1 +\v 33 Yahweh will not leave him in his hand, +\q2 nor condemn him when he is judged. +\q1 +\v 34 Wait for Yahweh, and keep his way, +\q2 and he will exalt you to inherit the land. +\q2 When the wicked are cut off, you shall see it. +\b +\q1 +\v 35 I have seen the wicked in great power, +\q2 spreading himself like a green tree in its native soil. +\q1 +\v 36 But he passed away, and behold, he was not. +\q2 Yes, I sought him, but he could not be found. +\q1 +\v 37 Mark the perfect man, and see the upright, +\q2 for there is a future for the man of peace. +\q1 +\v 38 As for transgressors, they shall be destroyed together. +\q2 The future of the wicked shall be cut off. +\q1 +\v 39 But the salvation of the righteous is from Yahweh. +\q2 He is their stronghold in the time of trouble. +\q1 +\v 40 Yahweh helps them and rescues them. +\q2 He rescues them from the wicked and saves them, +\q2 because they have taken refuge in him. +\c 38 +\d A Psalm by David, for a memorial. +\q1 +\v 1 Yahweh, don’t rebuke me in your wrath, +\q2 neither chasten me in your hot displeasure. +\q1 +\v 2 For your arrows have pierced me, +\q2 your hand presses hard on me. +\q1 +\v 3 There is no soundness in my flesh because of your indignation, +\q2 neither is there any health in my bones because of my sin. +\q1 +\v 4 For my iniquities have gone over my head. +\q2 As a heavy burden, they are too heavy for me. +\q1 +\v 5 My wounds are loathsome and corrupt +\q2 because of my foolishness. +\q1 +\v 6 I am in pain and bowed down greatly. +\q2 I go mourning all day long. +\q1 +\v 7 For my waist is filled with burning. +\q2 There is no soundness in my flesh. +\q1 +\v 8 I am faint and severely bruised. +\q2 I have groaned by reason of the anguish of my heart. +\q1 +\v 9 Lord, all my desire is before you. +\q2 My groaning is not hidden from you. +\q1 +\v 10 My heart throbs. +\q2 My strength fails me. +\q2 As for the light of my eyes, it has also left me. +\q1 +\v 11 My lovers and my friends stand aloof from my plague. +\q2 My kinsmen stand far away. +\q1 +\v 12 They also who seek after my life lay snares. +\q2 Those who seek my hurt speak mischievous things, +\q2 and meditate deceits all day long. +\q1 +\v 13 But I, as a deaf man, don’t hear. +\q2 I am as a mute man who doesn’t open his mouth. +\q1 +\v 14 Yes, I am as a man who doesn’t hear, +\q2 in whose mouth are no reproofs. +\q1 +\v 15 For I hope in you, Yahweh. +\q2 You will answer, Lord my God. +\q1 +\v 16 For I said, “Don’t let them gloat over me, +\q2 or exalt themselves over me when my foot slips.” +\q1 +\v 17 For I am ready to fall. +\q2 My pain is continually before me. +\q1 +\v 18 For I will declare my iniquity. +\q2 I will be sorry for my sin. +\q1 +\v 19 But my enemies are vigorous and many. +\q2 Those who hate me without reason are numerous. +\q1 +\v 20 They who render evil for good are also adversaries to me, +\q2 because I follow what is good. +\q1 +\v 21 Don’t forsake me, Yahweh. +\q2 My God, don’t be far from me. +\q1 +\v 22 Hurry to help me, +\q2 Lord, my salvation. +\c 39 +\d For the Chief Musician. For Jeduthun. A Psalm by David. +\q1 +\v 1 I said, “I will watch my ways, so that I don’t sin with my tongue. +\q2 I will keep my mouth with a bridle while the wicked is before me.” +\q1 +\v 2 I was mute with silence. +\q2 I held my peace, even from good. +\q2 My sorrow was stirred. +\q1 +\v 3 My heart was hot within me. +\q2 While I meditated, the fire burned. +\q1 I spoke with my tongue: +\q2 +\v 4 “Yahweh, show me my end, +\q2 what is the measure of my days. +\q2 Let me know how frail I am. +\q1 +\v 5 Behold, you have made my days hand widths. +\q2 My lifetime is as nothing before you. +\q1 Surely every man stands as a breath.” \qs Selah.\qs* +\q1 +\v 6 “Surely every man walks like a shadow. +\q2 Surely they busy themselves in vain. +\q2 He heaps up, and doesn’t know who shall gather. +\q1 +\v 7 Now, Lord, what do I wait for? +\q2 My hope is in you. +\q1 +\v 8 Deliver me from all my transgressions. +\q2 Don’t make me the reproach of the foolish. +\q1 +\v 9 I was mute. +\q2 I didn’t open my mouth, +\q2 because you did it. +\q1 +\v 10 Remove your scourge away from me. +\q2 I am overcome by the blow of your hand. +\q1 +\v 11 When you rebuke and correct man for iniquity, +\q2 you consume his wealth like a moth. +\q1 Surely every man is but a breath.” \qs Selah.\qs* +\q1 +\v 12 “Hear my prayer, Yahweh, and give ear to my cry. +\q2 Don’t be silent at my tears. +\q1 For I am a stranger with you, +\q2 a foreigner, as all my fathers were. +\q1 +\v 13 Oh spare me, that I may recover strength, +\q2 before I go away and exist no more.” +\c 40 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 I waited patiently for Yahweh. +\q2 He turned to me, and heard my cry. +\q1 +\v 2 He brought me up also out of a horrible pit, +\q2 out of the miry clay. +\q1 He set my feet on a rock, +\q2 and gave me a firm place to stand. +\q1 +\v 3 He has put a new song in my mouth, even praise to our God. +\q2 Many shall see it, and fear, and shall trust in Yahweh. +\q1 +\v 4 Blessed is the man who makes Yahweh his trust, +\q2 and doesn’t respect the proud, nor such as turn away to lies. +\q1 +\v 5 Many, Yahweh, my God, are the wonderful works which you have done, +\q2 and your thoughts which are toward us. +\q1 They can’t be declared back to you. +\q2 If I would declare and speak of them, they are more than can be counted. +\q1 +\v 6 Sacrifice and offering you didn’t desire. +\q2 You have opened my ears. +\q2 You have not required burnt offering and sin offering. +\q1 +\v 7 Then I said, “Behold, I have come. +\q2 It is written about me in the book in the scroll. +\q1 +\v 8 I delight to do your will, my God. +\q2 Yes, your law is within my heart.” +\q1 +\v 9 I have proclaimed glad news of righteousness in the great assembly. +\q2 Behold, I will not seal my lips, Yahweh, you know. +\q1 +\v 10 I have not hidden your righteousness within my heart. +\q2 I have declared your faithfulness and your salvation. +\q2 I have not concealed your loving kindness and your truth from the great assembly. +\q1 +\v 11 Don’t withhold your tender mercies from me, Yahweh. +\q2 Let your loving kindness and your truth continually preserve me. +\q1 +\v 12 For innumerable evils have surrounded me. +\q2 My iniquities have overtaken me, so that I am not able to look up. +\q1 They are more than the hairs of my head. +\q2 My heart has failed me. +\q1 +\v 13 Be pleased, Yahweh, to deliver me. +\q2 Hurry to help me, Yahweh. +\q1 +\v 14 Let them be disappointed and confounded together who seek after my soul to destroy it. +\q2 Let them be turned backward and brought to dishonor who delight in my hurt. +\q1 +\v 15 Let them be desolate by reason of their shame that tell me, “Aha! Aha!” +\q1 +\v 16 Let all those who seek you rejoice and be glad in you. +\q2 Let such as love your salvation say continually, “Let Yahweh be exalted!” +\q1 +\v 17 But I am poor and needy. +\q2 May the Lord think about me. +\q1 You are my help and my deliverer. +\q2 Don’t delay, my God. +\c 41 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 Blessed is he who considers the poor. +\q2 Yahweh will deliver him in the day of evil. +\q1 +\v 2 Yahweh will preserve him, and keep him alive. +\q2 He shall be blessed on the earth, +\q2 and he will not surrender him to the will of his enemies. +\q1 +\v 3 Yahweh will sustain him on his sickbed, +\q2 and restore him from his bed of illness. +\q1 +\v 4 I said, “Yahweh, have mercy on me! +\q2 Heal me, for I have sinned against you.” +\q1 +\v 5 My enemies speak evil against me: +\q2 “When will he die, and his name perish?” +\q1 +\v 6 If he comes to see me, he speaks falsehood. +\q2 His heart gathers iniquity to itself. +\q2 When he goes abroad, he tells it. +\q1 +\v 7 All who hate me whisper together against me. +\q2 They imagine the worst for me. +\q1 +\v 8 “An evil disease”, they say, “has afflicted him. +\q2 Now that he lies he shall rise up no more.” +\q1 +\v 9 Yes, my own familiar friend, in whom I trusted, +\q2 who ate bread with me, +\q2 has lifted up his heel against me. +\b +\q1 +\v 10 But you, Yahweh, have mercy on me, and raise me up, +\q2 that I may repay them. +\q1 +\v 11 By this I know that you delight in me, +\q2 because my enemy doesn’t triumph over me. +\q1 +\v 12 As for me, you uphold me in my integrity, +\q2 and set me in your presence forever. +\b +\q1 +\v 13 Blessed be Yahweh, the God of Israel, +\q2 from everlasting and to everlasting! +\q1 Amen and amen. +\c 42 +\ms1 BOOK 2 +\d For the Chief Musician. A contemplation by the sons of Korah. +\q1 +\v 1 As the deer pants for the water brooks, +\q2 so my soul pants after you, God.\f + \fr 42:1 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q1 +\v 2 My soul thirsts for God, for the living God. +\q2 When shall I come and appear before God? +\q1 +\v 3 My tears have been my food day and night, +\q2 while they continually ask me, “Where is your God?” +\q1 +\v 4 These things I remember, and pour out my soul within me, +\q2 how I used to go with the crowd, and led them to God’s house, +\q2 with the voice of joy and praise, a multitude keeping a holy day. +\q1 +\v 5 Why are you in despair, my soul? +\q2 Why are you disturbed within me? +\q1 Hope in God! +\q2 For I shall still praise him for the saving help of his presence. +\q1 +\v 6 My God, my soul is in despair within me. +\q2 Therefore I remember you from the land of the Jordan, +\q2 the heights of Hermon, from the hill Mizar. +\q1 +\v 7 Deep calls to deep at the noise of your waterfalls. +\q2 All your waves and your billows have swept over me. +\b +\q1 +\v 8 Yahweh\f + \fr 42:8 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* will command his loving kindness in the daytime. +\q2 In the night his song shall be with me: +\q2 a prayer to the God of my life. +\q1 +\v 9 I will ask God, my rock, “Why have you forgotten me? +\q2 Why do I go mourning because of the oppression of the enemy?” +\q1 +\v 10 As with a sword in my bones, my adversaries reproach me, +\q2 while they continually ask me, “Where is your God?” +\q1 +\v 11 Why are you in despair, my soul? +\q2 Why are you disturbed within me? +\q1 Hope in God! For I shall still praise him, +\q2 the saving help of my countenance, and my God. +\c 43 +\q1 +\v 1 Vindicate me, God, and plead my cause against an ungodly nation. +\q2 Oh, deliver me from deceitful and wicked men. +\q1 +\v 2 For you are the God of my strength. Why have you rejected me? +\q2 Why do I go mourning because of the oppression of the enemy? +\q1 +\v 3 Oh, send out your light and your truth. +\q2 Let them lead me. +\q2 Let them bring me to your holy hill, +\q2 to your tents. +\q1 +\v 4 Then I will go to the altar of God, +\q2 to God, my exceeding joy. +\q1 I will praise you on the harp, God, my God. +\q1 +\v 5 Why are you in despair, my soul? +\q2 Why are you disturbed within me? +\q1 Hope in God! +\q2 For I shall still praise him: +\q2 my Savior, my helper, and my God. +\c 44 +\d For the Chief Musician. By the sons of Korah. A contemplative psalm. +\q1 +\v 1 We have heard with our ears, God; +\q2 our fathers have told us what work you did in their days, +\q2 in the days of old. +\q1 +\v 2 You drove out the nations with your hand, +\q2 but you planted them. +\q1 You afflicted the peoples, +\q2 but you spread them abroad. +\q1 +\v 3 For they didn’t get the land in possession by their own sword, +\q2 neither did their own arm save them; +\q1 but your right hand, your arm, and the light of your face, +\q2 because you were favorable to them. +\q1 +\v 4 God, you are my King. +\q2 Command victories for Jacob! +\q1 +\v 5 Through you, we will push down our adversaries. +\q2 Through your name, we will tread down those who rise up against us. +\q1 +\v 6 For I will not trust in my bow, +\q2 neither will my sword save me. +\q1 +\v 7 But you have saved us from our adversaries, +\q2 and have shamed those who hate us. +\q1 +\v 8 In God we have made our boast all day long. +\q2 We will give thanks to your name forever. \qs Selah.\qs* +\b +\q1 +\v 9 But now you rejected us, and brought us to dishonor, +\q2 and don’t go out with our armies. +\q1 +\v 10 You make us turn back from the adversary. +\q2 Those who hate us take plunder for themselves. +\q1 +\v 11 You have made us like sheep for food, +\q2 and have scattered us among the nations. +\q1 +\v 12 You sell your people for nothing, +\q2 and have gained nothing from their sale. +\q1 +\v 13 You make us a reproach to our neighbors, +\q2 a scoffing and a derision to those who are around us. +\q1 +\v 14 You make us a byword among the nations, +\q2 a shaking of the head among the peoples. +\q1 +\v 15 All day long my dishonor is before me, +\q2 and shame covers my face, +\q2 +\v 16 at the taunt of one who reproaches and verbally abuses, +\q2 because of the enemy and the avenger. +\q1 +\v 17 All this has come on us, +\q2 yet we haven’t forgotten you. +\q2 We haven’t been false to your covenant. +\q1 +\v 18 Our heart has not turned back, +\q2 neither have our steps strayed from your path, +\q2 +\v 19 though you have crushed us in the haunt of jackals, +\q2 and covered us with the shadow of death. +\q1 +\v 20 If we have forgotten the name of our God, +\q2 or spread out our hands to a strange god, +\q2 +\v 21 won’t God search this out? +\q2 For he knows the secrets of the heart. +\q1 +\v 22 Yes, for your sake we are killed all day long. +\q2 We are regarded as sheep for the slaughter. +\q1 +\v 23 Wake up! +\q2 Why do you sleep, Lord?\f + \fr 44:23 \ft The word translated “Lord” is “Adonai.” \f* +\q1 Arise! +\q2 Don’t reject us forever. +\q1 +\v 24 Why do you hide your face, +\q2 and forget our affliction and our oppression? +\q1 +\v 25 For our soul is bowed down to the dust. +\q2 Our body clings to the earth. +\q1 +\v 26 Rise up to help us. +\q2 Redeem us for your loving kindness’ sake. +\c 45 +\d For the Chief Musician. Set to “The Lilies.” A contemplation by the sons of Korah. A wedding song. +\q1 +\v 1 My heart overflows with a noble theme. +\q2 I recite my verses for the king. +\q2 My tongue is like the pen of a skillful writer. +\q1 +\v 2 You are the most excellent of the sons of men. +\q2 Grace has anointed your lips, +\q2 therefore God has blessed you forever. +\q1 +\v 3 Strap your sword on your thigh, O mighty one, +\q2 in your splendor and your majesty. +\q1 +\v 4 In your majesty ride on victoriously on behalf of truth, humility, and righteousness. +\q2 Let your right hand display awesome deeds. +\q1 +\v 5 Your arrows are sharp. +\q2 The nations fall under you, with arrows in the heart of the king’s enemies. +\q1 +\v 6 Your throne, God, is forever and ever. +\q2 A scepter of equity is the scepter of your kingdom. +\q1 +\v 7 You have loved righteousness, and hated wickedness. +\q2 Therefore God, your God, has anointed you with the oil of gladness above your fellows. +\q1 +\v 8 All your garments smell like myrrh, aloes, and cassia. +\q2 Out of ivory palaces stringed instruments have made you glad. +\q1 +\v 9 Kings’ daughters are among your honorable women. +\q2 At your right hand the queen stands in gold of Ophir. +\q1 +\v 10 Listen, daughter, consider, and turn your ear. +\q2 Forget your own people, and also your father’s house. +\q2 +\v 11 So the king will desire your beauty, +\q2 honor him, for he is your lord. +\q1 +\v 12 The daughter of Tyre comes with a gift. +\q2 The rich among the people entreat your favor. +\q1 +\v 13 The princess inside is all glorious. +\q2 Her clothing is interwoven with gold. +\q1 +\v 14 She shall be led to the king in embroidered work. +\q2 The virgins, her companions who follow her, shall be brought to you. +\q1 +\v 15 With gladness and rejoicing they shall be led. +\q2 They shall enter into the king’s palace. +\q1 +\v 16 Your sons will take the place of your fathers. +\q2 You shall make them princes in all the earth. +\q1 +\v 17 I will make your name to be remembered in all generations. +\q2 Therefore the peoples shall give you thanks forever and ever. +\c 46 +\d For the Chief Musician. By the sons of Korah. According to Alamoth.\f + \fr 46:0 \ft Alamoth is a musical term.\f* +\q1 +\v 1 God is our refuge and strength, +\q2 a very present help in trouble. +\q1 +\v 2 Therefore we won’t be afraid, though the earth changes, +\q2 though the mountains are shaken into the heart of the seas; +\q2 +\v 3 though its waters roar and are troubled, +\q2 though the mountains tremble with their swelling. \qs Selah.\qs* +\b +\q1 +\v 4 There is a river, the streams of which make the city of God glad, +\q2 the holy place of the tents of the Most High. +\q1 +\v 5 God is within her. She shall not be moved. +\q2 God will help her at dawn. +\q1 +\v 6 The nations raged. The kingdoms were moved. +\q2 He lifted his voice and the earth melted. +\q1 +\v 7 Yahweh of Armies is with us. +\q2 The God of Jacob is our refuge. \qs Selah.\qs* +\b +\q1 +\v 8 Come, see Yahweh’s works, +\q2 what desolations he has made in the earth. +\q1 +\v 9 He makes wars cease to the end of the earth. +\q2 He breaks the bow, and shatters the spear. +\q2 He burns the chariots in the fire. +\q1 +\v 10 “Be still, and know that I am God. +\q2 I will be exalted among the nations. +\q2 I will be exalted in the earth.” +\q1 +\v 11 Yahweh of Armies is with us. +\q2 The God of Jacob is our refuge. \qs Selah.\qs* +\b +\c 47 +\d For the Chief Musician. A Psalm by the sons of Korah. +\q1 +\v 1 Oh clap your hands, all you nations. +\q2 Shout to God with the voice of triumph! +\q1 +\v 2 For Yahweh Most High is awesome. +\q2 He is a great King over all the earth. +\q1 +\v 3 He subdues nations under us, +\q2 and peoples under our feet. +\q1 +\v 4 He chooses our inheritance for us, +\q2 the glory of Jacob whom he loved. \qs Selah.\qs* +\q1 +\v 5 God has gone up with a shout, +\q2 Yahweh with the sound of a trumpet. +\q1 +\v 6 Sing praises to God! Sing praises! +\q2 Sing praises to our King! Sing praises! +\q1 +\v 7 For God is the King of all the earth. +\q2 Sing praises with understanding. +\q1 +\v 8 God reigns over the nations. +\q2 God sits on his holy throne. +\q1 +\v 9 The princes of the peoples are gathered together, +\q1 the people of the God of Abraham. +\q2 For the shields of the earth belong to God. +\q2 He is greatly exalted! +\c 48 +\d A Song. A Psalm by the sons of Korah. +\q1 +\v 1 Great is Yahweh, and greatly to be praised, +\q2 in the city of our God, in his holy mountain. +\q1 +\v 2 Beautiful in elevation, the joy of the whole earth, +\q2 is Mount Zion, on the north sides, +\q2 the city of the great King. +\q1 +\v 3 God has shown himself in her citadels as a refuge. +\q1 +\v 4 For, behold, the kings assembled themselves, +\q2 they passed by together. +\q1 +\v 5 They saw it, then they were amazed. +\q2 They were dismayed. +\q2 They hurried away. +\q1 +\v 6 Trembling took hold of them there, +\q2 pain, as of a woman in travail. +\q1 +\v 7 With the east wind, you break the ships of Tarshish. +\q1 +\v 8 As we have heard, so we have seen, +\q2 in the city of Yahweh of Armies, in the city of our God. +\q1 God will establish it forever. \qs Selah.\qs* +\q1 +\v 9 We have thought about your loving kindness, God, +\q2 in the middle of your temple. +\q1 +\v 10 As is your name, God, +\q2 so is your praise to the ends of the earth. +\q2 Your right hand is full of righteousness. +\q1 +\v 11 Let Mount Zion be glad! +\q2 Let the daughters of Judah rejoice because of your judgments. +\q1 +\v 12 Walk about Zion, and go around her. +\q2 Number its towers. +\q1 +\v 13 Notice her bulwarks. +\q2 Consider her palaces, +\q2 that you may tell it to the next generation. +\q1 +\v 14 For this God is our God forever and ever. +\q2 He will be our guide even to death. +\c 49 +\d For the Chief Musician. A Psalm by the sons of Korah. +\q1 +\v 1 Hear this, all you peoples. +\q2 Listen, all you inhabitants of the world, +\q2 +\v 2 both low and high, +\q2 rich and poor together. +\q1 +\v 3 My mouth will speak words of wisdom. +\q2 My heart will utter understanding. +\q1 +\v 4 I will incline my ear to a proverb. +\q2 I will solve my riddle on the harp. +\q1 +\v 5 Why should I fear in the days of evil, +\q2 when iniquity at my heels surrounds me? +\q1 +\v 6 Those who trust in their wealth, +\q2 and boast in the multitude of their riches— +\q2 +\v 7 none of them can by any means redeem his brother, +\q2 nor give God a ransom for him. +\q1 +\v 8 For the redemption of their life is costly, +\q2 no payment is ever enough, +\q2 +\v 9 that he should live on forever, +\q2 that he should not see corruption. +\q1 +\v 10 For he sees that wise men die; +\q2 likewise the fool and the senseless perish, +\q2 and leave their wealth to others. +\q1 +\v 11 Their inward thought is that their houses will endure forever, +\q2 and their dwelling places to all generations. +\q2 They name their lands after themselves. +\q1 +\v 12 But man, despite his riches, doesn’t endure. +\q2 He is like the animals that perish. +\b +\q1 +\v 13 This is the destiny of those who are foolish, +\q2 and of those who approve their sayings. \qs Selah.\qs* +\q1 +\v 14 They are appointed as a flock for Sheol.\f + \fr 49:14 \ft Sheol is the place of the dead.\f* +\q2 Death shall be their shepherd. +\q1 The upright shall have dominion over them in the morning. +\q2 Their beauty shall decay in Sheol,\f + \fr 49:14 \ft Sheol is the place of the dead. \f* +\q2 far from their mansion. +\q1 +\v 15 But God will redeem my soul from the power of Sheol,\f + \fr 49:15 \ft Sheol is the place of the dead.\f* +\q2 for he will receive me. \qs Selah.\qs* +\q1 +\v 16 Don’t be afraid when a man is made rich, +\q2 when the glory of his house is increased; +\q1 +\v 17 for when he dies he will carry nothing away. +\q2 His glory won’t descend after him. +\q1 +\v 18 Though while he lived he blessed his soul— +\q2 and men praise you when you do well for yourself— +\q2 +\v 19 he shall go to the generation of his fathers. +\q2 They shall never see the light. +\q1 +\v 20 A man who has riches without understanding, +\q2 is like the animals that perish. +\c 50 +\d A Psalm by Asaph. +\q1 +\v 1 The Mighty One, God, Yahweh, speaks, +\q2 and calls the earth from sunrise to sunset. +\q1 +\v 2 Out of Zion, the perfection of beauty, +\q2 God shines out. +\q1 +\v 3 Our God comes, and does not keep silent. +\q2 A fire devours before him. +\q2 It is very stormy around him. +\q1 +\v 4 He calls to the heavens above, +\q2 to the earth, that he may judge his people: +\q1 +\v 5 “Gather my saints together to me, +\q2 those who have made a covenant with me by sacrifice.” +\q1 +\v 6 The heavens shall declare his righteousness, +\q2 for God himself is judge. \qs Selah.\qs* +\q1 +\v 7 “Hear, my people, and I will speak. +\q2 Israel, I will testify against you. +\q1 I am God, your God. +\q1 +\v 8 I don’t rebuke you for your sacrifices. +\q2 Your burnt offerings are continually before me. +\q1 +\v 9 I have no need for a bull from your stall, +\q2 nor male goats from your pens. +\q1 +\v 10 For every animal of the forest is mine, +\q2 and the livestock on a thousand hills. +\q1 +\v 11 I know all the birds of the mountains. +\q2 The wild animals of the field are mine. +\q1 +\v 12 If I were hungry, I would not tell you, +\q2 for the world is mine, and all that is in it. +\q1 +\v 13 Will I eat the meat of bulls, +\q2 or drink the blood of goats? +\q1 +\v 14 Offer to God the sacrifice of thanksgiving. +\q2 Pay your vows to the Most High. +\q1 +\v 15 Call on me in the day of trouble. +\q2 I will deliver you, and you will honor me.” +\b +\q1 +\v 16 But to the wicked God says, +\q2 “What right do you have to declare my statutes, +\q2 that you have taken my covenant on your lips, +\q2 +\v 17 since you hate instruction, +\q2 and throw my words behind you? +\q1 +\v 18 When you saw a thief, you consented with him, +\q2 and have participated with adulterers. +\b +\q1 +\v 19 “You give your mouth to evil. +\q2 Your tongue frames deceit. +\q1 +\v 20 You sit and speak against your brother. +\q2 You slander your own mother’s son. +\q1 +\v 21 You have done these things, and I kept silent. +\q2 You thought that I was just like you. +\q2 I will rebuke you, and accuse you in front of your eyes. +\b +\q1 +\v 22 “Now consider this, you who forget God, +\q2 lest I tear you into pieces, and there be no one to deliver. +\q1 +\v 23 Whoever offers the sacrifice of thanksgiving glorifies me, +\q2 and prepares his way so that I will show God’s salvation to him.” +\c 51 +\d For the Chief Musician. A Psalm by David, when Nathan the prophet came to him, after he had gone in to Bathsheba. +\q1 +\v 1 Have mercy on me, God, according to your loving kindness. +\q2 According to the multitude of your tender mercies, blot out my transgressions. +\q1 +\v 2 Wash me thoroughly from my iniquity. +\q2 Cleanse me from my sin. +\q1 +\v 3 For I know my transgressions. +\q2 My sin is constantly before me. +\q1 +\v 4 Against you, and you only, I have sinned, +\q2 and done that which is evil in your sight, +\q1 so you may be proved right when you speak, +\q2 and justified when you judge. +\q1 +\v 5 Behold, I was born in iniquity. +\q2 My mother conceived me in sin. +\q1 +\v 6 Behold, you desire truth in the inward parts. +\q2 You teach me wisdom in the inmost place. +\q1 +\v 7 Purify me with hyssop, and I will be clean. +\q2 Wash me, and I will be whiter than snow. +\q1 +\v 8 Let me hear joy and gladness, +\q2 that the bones which you have broken may rejoice. +\q1 +\v 9 Hide your face from my sins, +\q2 and blot out all of my iniquities. +\q1 +\v 10 Create in me a clean heart, O God. +\q2 Renew a right spirit within me. +\q1 +\v 11 Don’t throw me from your presence, +\q2 and don’t take your Holy Spirit from me. +\q1 +\v 12 Restore to me the joy of your salvation. +\q2 Uphold me with a willing spirit. +\q1 +\v 13 Then I will teach transgressors your ways. +\q2 Sinners will be converted to you. +\q1 +\v 14 Deliver me from the guilt of bloodshed, O God, the God of my salvation. +\q2 My tongue will sing aloud of your righteousness. +\q1 +\v 15 Lord, open my lips. +\q2 My mouth will declare your praise. +\q1 +\v 16 For you don’t delight in sacrifice, or else I would give it. +\q2 You have no pleasure in burnt offering. +\q1 +\v 17 The sacrifices of God are a broken spirit. +\q2 O God, you will not despise a broken and contrite heart. +\b +\q1 +\v 18 Do well in your good pleasure to Zion. +\q2 Build the walls of Jerusalem. +\q1 +\v 19 Then you will delight in the sacrifices of righteousness, +\q2 in burnt offerings and in whole burnt offerings. +\q1 Then they will offer bulls on your altar. +\c 52 +\d For the Chief Musician. A contemplation by David, when Doeg the Edomite came and told Saul, “David has come to Ahimelech’s house.” +\q1 +\v 1 Why do you boast of mischief, mighty man? +\q2 God’s loving kindness endures continually. +\q1 +\v 2 Your tongue plots destruction, +\q2 like a sharp razor, working deceitfully. +\q1 +\v 3 You love evil more than good, +\q2 lying rather than speaking the truth. \qs Selah.\qs* +\q1 +\v 4 You love all devouring words, +\q2 you deceitful tongue. +\q1 +\v 5 God will likewise destroy you forever. +\q2 He will take you up, and pluck you out of your tent, +\q2 and root you out of the land of the living. \qs Selah.\qs* +\q1 +\v 6 The righteous also will see it, and fear, +\q2 and laugh at him, saying, +\q1 +\v 7 “Behold, this is the man who didn’t make God his strength, +\q2 but trusted in the abundance of his riches, +\q2 and strengthened himself in his wickedness.” +\q1 +\v 8 But as for me, I am like a green olive tree in God’s house. +\q2 I trust in God’s loving kindness forever and ever. +\q1 +\v 9 I will give you thanks forever, because you have done it. +\q2 I will hope in your name, for it is good, +\q2 in the presence of your saints. +\c 53 +\d For the Chief Musician. To the tune of “Mahalath.” A contemplation by David. +\q1 +\v 1 The fool has said in his heart, “There is no God.” +\q2 They are corrupt, and have done abominable iniquity. +\q2 There is no one who does good. +\q1 +\v 2 God looks down from heaven on the children of men, +\q2 to see if there are any who understood, +\q2 who seek after God. +\q1 +\v 3 Every one of them has gone back. +\q2 They have become filthy together. +\q2 There is no one who does good, no, not one. +\q1 +\v 4 Have the workers of iniquity no knowledge, +\q2 who eat up my people as they eat bread, +\q2 and don’t call on God? +\q1 +\v 5 There they were in great fear, where no fear was, +\q2 for God has scattered the bones of him who encamps against you. +\q1 You have put them to shame, +\q2 because God has rejected them. +\q1 +\v 6 Oh that the salvation of Israel would come out of Zion! +\q2 When God brings back his people from captivity, +\q2 then Jacob shall rejoice, +\q2 and Israel shall be glad. +\c 54 +\d For the Chief Musician. On stringed instruments. A contemplation by David, when the Ziphites came and said to Saul, “Isn’t David hiding himself among us?” +\q1 +\v 1 Save me, God, by your name. +\q2 Vindicate me in your might. +\q1 +\v 2 Hear my prayer, God. +\q2 Listen to the words of my mouth. +\q1 +\v 3 For strangers have risen up against me. +\q2 Violent men have sought after my soul. +\q2 They haven’t set God before them. \qs Selah.\qs* +\q1 +\v 4 Behold, God is my helper. +\q2 The Lord is the one who sustains my soul. +\q1 +\v 5 He will repay the evil to my enemies. +\q2 Destroy them in your truth. +\q1 +\v 6 With a free will offering, I will sacrifice to you. +\q2 I will give thanks to your name, Yahweh, for it is good. +\q1 +\v 7 For he has delivered me out of all trouble. +\q2 My eye has seen triumph over my enemies. +\c 55 +\d For the Chief Musician. On stringed instruments. A contemplation by David. +\q1 +\v 1 Listen to my prayer, God. +\q2 Don’t hide yourself from my supplication. +\q1 +\v 2 Attend to me, and answer me. +\q2 I am restless in my complaint, +\q2 and moan +\v 3 because of the voice of the enemy, +\q2 because of the oppression of the wicked. +\q1 For they bring suffering on me. +\q2 In anger they hold a grudge against me. +\q1 +\v 4 My heart is severely pained within me. +\q2 The terrors of death have fallen on me. +\q1 +\v 5 Fearfulness and trembling have come on me. +\q2 Horror has overwhelmed me. +\q1 +\v 6 I said, “Oh that I had wings like a dove! +\q2 Then I would fly away, and be at rest. +\q1 +\v 7 Behold, then I would wander far off. +\q2 I would lodge in the wilderness.” \qs Selah.\qs* +\q1 +\v 8 “I would hurry to a shelter from the stormy wind and storm.” +\q1 +\v 9 Confuse them, Lord, and confound their language, +\q2 for I have seen violence and strife in the city. +\q1 +\v 10 Day and night they prowl around on its walls. +\q2 Malice and abuse are also within her. +\q1 +\v 11 Destructive forces are within her. +\q2 Threats and lies don’t depart from her streets. +\q1 +\v 12 For it was not an enemy who insulted me, +\q2 then I could have endured it. +\q1 Neither was it he who hated me who raised himself up against me, +\q2 then I would have hidden myself from him. +\q1 +\v 13 But it was you, a man like me, +\q2 my companion, and my familiar friend. +\q1 +\v 14 We took sweet fellowship together. +\q2 We walked in God’s house with company. +\q1 +\v 15 Let death come suddenly on them. +\q2 Let them go down alive into Sheol.\f + \fr 55:15 \ft Sheol is the place of the dead. \f* +\q2 For wickedness is among them, in their dwelling. +\q1 +\v 16 As for me, I will call on God. +\q2 Yahweh will save me. +\q1 +\v 17 Evening, morning, and at noon, I will cry out in distress. +\q2 He will hear my voice. +\q1 +\v 18 He has redeemed my soul in peace from the battle that was against me, +\q2 although there are many who oppose me. +\q1 +\v 19 God, who is enthroned forever, +\q2 will hear and answer them. \qs Selah.\qs* +\b +\q1 They never change +\q2 and don’t fear God. +\q1 +\v 20 He raises his hands against his friends. +\q2 He has violated his covenant. +\q1 +\v 21 His mouth was smooth as butter, +\q2 but his heart was war. +\q1 His words were softer than oil, +\q2 yet they were drawn swords. +\b +\q1 +\v 22 Cast your burden on Yahweh and he will sustain you. +\q2 He will never allow the righteous to be moved. +\q1 +\v 23 But you, God, will bring them down into the pit of destruction. +\q2 Bloodthirsty and deceitful men shall not live out half their days, +\q2 but I will trust in you. +\c 56 +\d For the Chief Musician. To the tune of “Silent Dove in Distant Lands.” A poem by David, when the Philistines seized him in Gath. +\q1 +\v 1 Be merciful to me, God, for man wants to swallow me up. +\q2 All day long, he attacks and oppresses me. +\q1 +\v 2 My enemies want to swallow me up all day long, +\q2 for they are many who fight proudly against me. +\q1 +\v 3 When I am afraid, +\q2 I will put my trust in you. +\q1 +\v 4 In God, I praise his word. +\q2 In God, I put my trust. +\q1 I will not be afraid. +\q2 What can flesh do to me? +\q1 +\v 5 All day long they twist my words. +\q2 All their thoughts are against me for evil. +\q1 +\v 6 They conspire and lurk, +\q2 watching my steps. +\q2 They are eager to take my life. +\q1 +\v 7 Shall they escape by iniquity? +\q2 In anger cast down the peoples, God. +\q1 +\v 8 You count my wanderings. +\q2 You put my tears into your container. +\q2 Aren’t they in your book? +\q1 +\v 9 Then my enemies shall turn back in the day that I call. +\q2 I know this: that God is for me. +\q1 +\v 10 In God, I will praise his word. +\q2 In Yahweh, I will praise his word. +\q1 +\v 11 I have put my trust in God. +\q2 I will not be afraid. +\q2 What can man do to me? +\q1 +\v 12 Your vows are on me, God. +\q2 I will give thank offerings to you. +\q1 +\v 13 For you have delivered my soul from death, +\q2 and prevented my feet from falling, +\q2 that I may walk before God in the light of the living. +\c 57 +\d For the Chief Musician. To the tune of “Do Not Destroy.” A poem by David, when he fled from Saul, in the cave. +\q1 +\v 1 Be merciful to me, God, be merciful to me, +\q2 for my soul takes refuge in you. +\q1 Yes, in the shadow of your wings, I will take refuge, +\q2 until disaster has passed. +\q1 +\v 2 I cry out to God Most High, +\q1 to God who accomplishes my requests for me. +\q1 +\v 3 He will send from heaven, and save me, +\q2 he rebukes the one who is pursuing me. \qs Selah.\qs* +\q1 God will send out his loving kindness and his truth. +\q1 +\v 4 My soul is among lions. +\q2 I lie among those who are set on fire, +\q2 even the sons of men, whose teeth are spears and arrows, +\q2 and their tongue a sharp sword. +\q1 +\v 5 Be exalted, God, above the heavens! +\q2 Let your glory be above all the earth! +\b +\q1 +\v 6 They have prepared a net for my steps. +\q2 My soul is bowed down. +\q1 They dig a pit before me. +\q2 They fall into the middle of it themselves. \qs Selah.\qs* +\q1 +\v 7 My heart is steadfast, God. +\q2 My heart is steadfast. +\q2 I will sing, yes, I will sing praises. +\q1 +\v 8 Wake up, my glory! Wake up, lute and harp! +\q2 I will wake up the dawn. +\q1 +\v 9 I will give thanks to you, Lord, among the peoples. +\q2 I will sing praises to you among the nations. +\q1 +\v 10 For your great loving kindness reaches to the heavens, +\q2 and your truth to the skies. +\q1 +\v 11 Be exalted, God, above the heavens. +\q2 Let your glory be over all the earth. +\c 58 +\d For the Chief Musician. To the tune of “Do Not Destroy.” A poem by David. +\q1 +\v 1 Do you indeed speak righteousness, silent ones? +\q2 Do you judge blamelessly, you sons of men? +\q1 +\v 2 No, in your heart you plot injustice. +\q2 You measure out the violence of your hands in the earth. +\q1 +\v 3 The wicked go astray from the womb. +\q2 They are wayward as soon as they are born, speaking lies. +\q1 +\v 4 Their poison is like the poison of a snake, +\q2 like a deaf cobra that stops its ear, +\q2 +\v 5 which doesn’t listen to the voice of charmers, +\q2 no matter how skillful the charmer may be. +\q1 +\v 6 Break their teeth, God, in their mouth. +\q2 Break out the great teeth of the young lions, Yahweh. +\q1 +\v 7 Let them vanish like water that flows away. +\q2 When they draw the bow, let their arrows be made blunt. +\q1 +\v 8 Let them be like a snail which melts and passes away, +\q2 like the stillborn child, who has not seen the sun. +\q1 +\v 9 Before your pots can feel the heat of the thorns, +\q2 he will sweep away the green and the burning alike. +\q1 +\v 10 The righteous shall rejoice when he sees the vengeance. +\q2 He shall wash his feet in the blood of the wicked, +\q1 +\v 11 so that men shall say, “Most certainly there is a reward for the righteous. +\q2 Most certainly there is a God who judges the earth.” +\c 59 +\d For the Chief Musician. To the tune of “Do Not Destroy.” A poem by David, when Saul sent, and they watched the house to kill him. +\q1 +\v 1 Deliver me from my enemies, my God. +\q2 Set me on high from those who rise up against me. +\q1 +\v 2 Deliver me from the workers of iniquity. +\q2 Save me from the bloodthirsty men. +\q1 +\v 3 For, behold, they lie in wait for my soul. +\q2 The mighty gather themselves together against me, +\q2 not for my disobedience, nor for my sin, Yahweh. +\q1 +\v 4 I have done no wrong, yet they are ready to attack me. +\q2 Rise up, behold, and help me! +\q1 +\v 5 You, Yahweh God of Armies, the God of Israel, +\q2 rouse yourself to punish the nations. +\q2 Show no mercy to the wicked traitors. \qs Selah.\qs* +\q1 +\v 6 They return at evening, howling like dogs, +\q2 and prowl around the city. +\q1 +\v 7 Behold, they spew with their mouth. +\q2 Swords are in their lips, +\q2 “For”, they say, “who hears us?” +\q1 +\v 8 But you, Yahweh, laugh at them. +\q2 You scoff at all the nations. +\q1 +\v 9 Oh, my Strength, I watch for you, +\q2 for God is my high tower. +\q1 +\v 10 My God will go before me with his loving kindness. +\q2 God will let me look at my enemies in triumph. +\q1 +\v 11 Don’t kill them, or my people may forget. +\q2 Scatter them by your power, and bring them down, Lord our shield. +\q1 +\v 12 For the sin of their mouth, and the words of their lips, +\q2 let them be caught in their pride, +\q2 for the curses and lies which they utter. +\q1 +\v 13 Consume them in wrath. +\q2 Consume them, and they will be no more. +\q1 Let them know that God rules in Jacob, +\q2 to the ends of the earth. \qs Selah.\qs* +\q1 +\v 14 At evening let them return. +\q2 Let them howl like a dog, and go around the city. +\q1 +\v 15 They shall wander up and down for food, +\q2 and wait all night if they aren’t satisfied. +\b +\q1 +\v 16 But I will sing of your strength. +\q2 Yes, I will sing aloud of your loving kindness in the morning. +\q1 For you have been my high tower, +\q2 a refuge in the day of my distress. +\q1 +\v 17 To you, my strength, I will sing praises. +\q2 For God is my high tower, the God of my mercy. +\c 60 +\d For the Chief Musician. To the tune of “The Lily of the Covenant.” A teaching poem by David, when he fought with Aram Naharaim and with Aram Zobah, and Joab returned, and killed twelve thousand of Edom in the Valley of Salt. +\q1 +\v 1 God, you have rejected us. +\q2 You have broken us down. +\q1 You have been angry. +\q2 Restore us, again. +\q1 +\v 2 You have made the land tremble. +\q2 You have torn it. +\q1 Mend its fractures, +\q2 for it quakes. +\q1 +\v 3 You have shown your people hard things. +\q2 You have made us drink the wine that makes us stagger. +\q1 +\v 4 You have given a banner to those who fear you, +\q2 that it may be displayed because of the truth. \qs Selah.\qs* +\b +\q1 +\v 5 So that your beloved may be delivered, +\q2 save with your right hand, and answer us. +\q1 +\v 6 God has spoken from his sanctuary: +\q2 “I will triumph. +\q2 I will divide Shechem, +\q2 and measure out the valley of Succoth. +\q1 +\v 7 Gilead is mine, and Manasseh is mine. +\q2 Ephraim also is the defense of my head. +\q2 Judah is my scepter. +\q1 +\v 8 Moab is my wash basin. +\q2 I will throw my sandal on Edom. +\q2 I shout in triumph over Philistia.” +\b +\q1 +\v 9 Who will bring me into the strong city? +\q2 Who has led me to Edom? +\q1 +\v 10 Haven’t you, God, rejected us? +\q2 You don’t go out with our armies, God. +\q1 +\v 11 Give us help against the adversary, +\q2 for the help of man is vain. +\q1 +\v 12 Through God we will do valiantly, +\q2 for it is he who will tread down our adversaries. +\c 61 +\d For the Chief Musician. For a stringed instrument. By David. +\q1 +\v 1 Hear my cry, God. +\q2 Listen to my prayer. +\q1 +\v 2 From the end of the earth, I will call to you when my heart is overwhelmed. +\q2 Lead me to the rock that is higher than I. +\q1 +\v 3 For you have been a refuge for me, +\q2 a strong tower from the enemy. +\q1 +\v 4 I will dwell in your tent forever. +\q2 I will take refuge in the shelter of your wings. \qs Selah.\qs* +\q1 +\v 5 For you, God, have heard my vows. +\q2 You have given me the heritage of those who fear your name. +\q1 +\v 6 You will prolong the king’s life. +\q2 His years will be for generations. +\q1 +\v 7 He shall be enthroned in God’s presence forever. +\q2 Appoint your loving kindness and truth, that they may preserve him. +\q1 +\v 8 So I will sing praise to your name forever, +\q2 that I may fulfill my vows daily. +\c 62 +\d For the Chief Musician. To Jeduthun. A Psalm by David. +\q1 +\v 1 My soul rests in God alone. +\q2 My salvation is from him. +\q1 +\v 2 He alone is my rock, my salvation, and my fortress. +\q2 I will never be greatly shaken. +\q1 +\v 3 How long will you assault a man? +\q2 Would all of you throw him down, +\q2 like a leaning wall, like a tottering fence? +\q1 +\v 4 They fully intend to throw him down from his lofty place. +\q2 They delight in lies. +\q2 They bless with their mouth, but they curse inwardly. \qs Selah.\qs* +\q1 +\v 5 My soul, wait in silence for God alone, +\q2 for my expectation is from him. +\q1 +\v 6 He alone is my rock and my salvation, my fortress. +\q2 I will not be shaken. +\q1 +\v 7 My salvation and my honor is with God. +\q2 The rock of my strength, and my refuge, is in God. +\q1 +\v 8 Trust in him at all times, you people. +\q2 Pour out your heart before him. +\q2 God is a refuge for us. \qs Selah.\qs* +\q1 +\v 9 Surely men of low degree are just a breath, +\q2 and men of high degree are a lie. +\q1 In the balances they will go up. +\q2 They are together lighter than a breath. +\q1 +\v 10 Don’t trust in oppression. +\q2 Don’t become vain in robbery. +\q1 If riches increase, +\q2 don’t set your heart on them. +\q1 +\v 11 God has spoken once; +\q2 twice I have heard this, +\q2 that power belongs to God. +\q1 +\v 12 Also to you, Lord, belongs loving kindness, +\q2 for you reward every man according to his work. +\c 63 +\d A Psalm by David, when he was in the desert of Judah. +\q1 +\v 1 God, you are my God. +\q2 I will earnestly seek you. +\q1 My soul thirsts for you. +\q2 My flesh longs for you, +\q2 in a dry and weary land, where there is no water. +\q1 +\v 2 So I have seen you in the sanctuary, +\q2 watching your power and your glory. +\q1 +\v 3 Because your loving kindness is better than life, +\q2 my lips shall praise you. +\q1 +\v 4 So I will bless you while I live. +\q2 I will lift up my hands in your name. +\q1 +\v 5 My soul shall be satisfied as with the richest food. +\q2 My mouth shall praise you with joyful lips, +\q2 +\v 6 when I remember you on my bed, +\q2 and think about you in the night watches. +\q1 +\v 7 For you have been my help. +\q2 I will rejoice in the shadow of your wings. +\q1 +\v 8 My soul stays close to you. +\q2 Your right hand holds me up. +\q1 +\v 9 But those who seek my soul to destroy it +\q2 shall go into the lower parts of the earth. +\q1 +\v 10 They shall be given over to the power of the sword. +\q2 They shall be jackal food. +\q1 +\v 11 But the king shall rejoice in God. +\q2 Everyone who swears by him will praise him, +\q2 for the mouth of those who speak lies shall be silenced. +\c 64 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 Hear my voice, God, in my complaint. +\q2 Preserve my life from fear of the enemy. +\q1 +\v 2 Hide me from the conspiracy of the wicked, +\q2 from the noisy crowd of the ones doing evil; +\q1 +\v 3 who sharpen their tongue like a sword, +\q2 and aim their arrows, deadly words, +\q2 +\v 4 to shoot innocent men from ambushes. +\q2 They shoot at him suddenly and fearlessly. +\q1 +\v 5 They encourage themselves in evil plans. +\q2 They talk about laying snares secretly. +\q2 They say, “Who will see them?” +\q1 +\v 6 They plot injustice, saying, “We have made a perfect plan!” +\q2 Surely man’s mind and heart are cunning. +\q1 +\v 7 But God will shoot at them. +\q2 They will be suddenly struck down with an arrow. +\q1 +\v 8 Their own tongues shall ruin them. +\q2 All who see them will shake their heads. +\q1 +\v 9 All mankind shall be afraid. +\q2 They shall declare the work of God, +\q2 and shall wisely ponder what he has done. +\q1 +\v 10 The righteous shall be glad in Yahweh, +\q2 and shall take refuge in him. +\q2 All the upright in heart shall praise him! +\c 65 +\d For the Chief Musician. A Psalm by David. A song. +\q1 +\v 1 Praise waits for you, God, in Zion. +\q2 Vows shall be performed to you. +\q1 +\v 2 You who hear prayer, +\q2 all men will come to you. +\q1 +\v 3 Sins overwhelmed me, +\q2 but you atoned for our transgressions. +\q1 +\v 4 Blessed is the one whom you choose and cause to come near, +\q2 that he may live in your courts. +\q2 We will be filled with the goodness of your house, +\q2 your holy temple. +\q1 +\v 5 By awesome deeds of righteousness, you answer us, +\q2 God of our salvation. +\q1 You who are the hope of all the ends of the earth, +\q2 of those who are far away on the sea. +\q1 +\v 6 By your power, you form the mountains, +\q2 having armed yourself with strength. +\q1 +\v 7 You still the roaring of the seas, +\q2 the roaring of their waves, +\q2 and the turmoil of the nations. +\q1 +\v 8 They also who dwell in faraway places are afraid at your wonders. +\q2 You call the morning’s dawn and the evening with songs of joy. +\q1 +\v 9 You visit the earth, and water it. +\q2 You greatly enrich it. +\q1 The river of God is full of water. +\q2 You provide them grain, for so you have ordained it. +\q1 +\v 10 You drench its furrows. +\q2 You level its ridges. +\q2 You soften it with showers. +\q2 You bless it with a crop. +\q1 +\v 11 You crown the year with your bounty. +\q2 Your carts overflow with abundance. +\q1 +\v 12 The wilderness grasslands overflow. +\q2 The hills are clothed with gladness. +\q1 +\v 13 The pastures are covered with flocks. +\q2 The valleys also are clothed with grain. +\q1 They shout for joy! +\q2 They also sing. +\c 66 +\d For the Chief Musician. A song. A Psalm. +\q1 +\v 1 Make a joyful shout to God, all the earth! +\q2 +\v 2 Sing to the glory of his name! +\q2 Offer glory and praise! +\q1 +\v 3 Tell God, “How awesome are your deeds! +\q2 Through the greatness of your power, your enemies submit themselves to you. +\q1 +\v 4 All the earth will worship you, +\q2 and will sing to you; +\q2 they will sing to your name.” \qs Selah.\qs* +\q1 +\v 5 Come, and see God’s deeds— +\q2 awesome work on behalf of the children of men. +\q1 +\v 6 He turned the sea into dry land. +\q2 They went through the river on foot. +\q2 There, we rejoiced in him. +\q1 +\v 7 He rules by his might forever. +\q2 His eyes watch the nations. +\q2 Don’t let the rebellious rise up against him. \qs Selah.\qs* +\q1 +\v 8 Praise our God, you peoples! +\q2 Make the sound of his praise heard, +\q1 +\v 9 who preserves our life among the living, +\q2 and doesn’t allow our feet to be moved. +\q1 +\v 10 For you, God, have tested us. +\q2 You have refined us, as silver is refined. +\q1 +\v 11 You brought us into prison. +\q2 You laid a burden on our backs. +\q1 +\v 12 You allowed men to ride over our heads. +\q2 We went through fire and through water, +\q2 but you brought us to the place of abundance. +\q1 +\v 13 I will come into your temple with burnt offerings. +\q2 I will pay my vows to you, +\v 14 which my lips promised, +\q2 and my mouth spoke, when I was in distress. +\q1 +\v 15 I will offer to you burnt offerings of fat animals, +\q2 with the offering of rams, +\q2 I will offer bulls with goats. \qs Selah.\qs* +\q1 +\v 16 Come and hear, all you who fear God. +\q2 I will declare what he has done for my soul. +\q1 +\v 17 I cried to him with my mouth. +\q2 He was extolled with my tongue. +\q1 +\v 18 If I cherished sin in my heart, +\q2 the Lord wouldn’t have listened. +\q1 +\v 19 But most certainly, God has listened. +\q2 He has heard the voice of my prayer. +\q1 +\v 20 Blessed be God, who has not turned away my prayer, +\q2 nor his loving kindness from me. +\c 67 +\d For the Chief Musician. With stringed instruments. A Psalm. A song. +\q1 +\v 1 May God be merciful to us, bless us, +\q2 and cause his face to shine on us. \qs Selah.\qs* +\q1 +\v 2 That your way may be known on earth, +\q2 and your salvation among all nations, +\q1 +\v 3 let the peoples praise you, God. +\q2 Let all the peoples praise you. +\q1 +\v 4 Oh let the nations be glad and sing for joy, +\q2 for you will judge the peoples with equity, +\q2 and govern the nations on earth. \qs Selah.\qs* +\q1 +\v 5 Let the peoples praise you, God. +\q2 Let all the peoples praise you. +\q1 +\v 6 The earth has yielded its increase. +\q2 God, even our own God, will bless us. +\q1 +\v 7 God will bless us. +\q2 All the ends of the earth shall fear him. +\c 68 +\d For the Chief Musician. A Psalm by David. A song. +\q1 +\v 1 Let God arise! +\q2 Let his enemies be scattered! +\q2 Let them who hate him also flee before him. +\q1 +\v 2 As smoke is driven away, +\q2 so drive them away. +\q1 As wax melts before the fire, +\q2 so let the wicked perish at the presence of God. +\q1 +\v 3 But let the righteous be glad. +\q2 Let them rejoice before God. +\q2 Yes, let them rejoice with gladness. +\q1 +\v 4 Sing to God! Sing praises to his name! +\q2 Extol him who rides on the clouds: +\q1 to Yah, his name! +\q2 Rejoice before him! +\q1 +\v 5 A father of the fatherless, and a defender of the widows, +\q2 is God in his holy habitation. +\q1 +\v 6 God sets the lonely in families. +\q1 He brings out the prisoners with singing, +\q2 but the rebellious dwell in a sun-scorched land. +\b +\q1 +\v 7 God, when you went out before your people, +\q2 when you marched through the wilderness... \qs Selah.\qs* +\q1 +\v 8 The earth trembled. +\q2 The sky also poured down rain at the presence of the God of Sinai— +\q2 at the presence of God, the God of Israel. +\q1 +\v 9 You, God, sent a plentiful rain. +\q2 You confirmed your inheritance when it was weary. +\q1 +\v 10 Your congregation lived therein. +\q2 You, God, prepared your goodness for the poor. +\q1 +\v 11 The Lord announced the word. +\q2 The ones who proclaim it are a great company. +\q1 +\v 12 “Kings of armies flee! They flee!” +\q2 She who waits at home divides the plunder, +\q2 +\v 13 while you sleep among the camp fires, +\q2 the wings of a dove sheathed with silver, +\q2 her feathers with shining gold. +\q1 +\v 14 When the Almighty scattered kings in her, +\q2 it snowed on Zalmon. +\q1 +\v 15 The mountains of Bashan are majestic mountains. +\q2 The mountains of Bashan are rugged. +\q1 +\v 16 Why do you look in envy, you rugged mountains, +\q2 at the mountain where God chooses to reign? +\q2 Yes, Yahweh will dwell there forever. +\q1 +\v 17 The chariots of God are tens of thousands and thousands of thousands. +\q2 The Lord is among them, from Sinai, into the sanctuary. +\q1 +\v 18 You have ascended on high. +\q2 You have led away captives. +\q1 You have received gifts among people, +\q2 yes, among the rebellious also, that Yah God might dwell there. +\b +\q1 +\v 19 Blessed be the Lord, who daily bears our burdens, +\q2 even the God who is our salvation. \qs Selah.\qs* +\q1 +\v 20 God is to us a God of deliverance. +\q2 To Yahweh, the Lord, belongs escape from death. +\q1 +\v 21 But God will strike through the head of his enemies, +\q2 the hairy scalp of such a one as still continues in his guiltiness. +\q1 +\v 22 The Lord said, “I will bring you again from Bashan, +\q2 I will bring you again from the depths of the sea, +\q1 +\v 23 that you may crush them, dipping your foot in blood, +\q2 that the tongues of your dogs may have their portion from your enemies.” +\q1 +\v 24 They have seen your processions, God, +\q2 even the processions of my God, my King, into the sanctuary. +\q1 +\v 25 The singers went before, the minstrels followed after, +\q2 among the ladies playing with tambourines, +\q1 +\v 26 “Bless God in the congregations, +\q2 even the Lord in the assembly of Israel!” +\q1 +\v 27 There is little Benjamin, their ruler, +\q2 the princes of Judah, their council, +\q2 the princes of Zebulun, and the princes of Naphtali. +\b +\q1 +\v 28 Your God has commanded your strength. +\q2 Strengthen, God, that which you have done for us. +\q1 +\v 29 Because of your temple at Jerusalem, +\q2 kings shall bring presents to you. +\q1 +\v 30 Rebuke the wild animal of the reeds, +\q2 the multitude of the bulls with the calves of the peoples. +\q1 Trample under foot the bars of silver. +\q2 Scatter the nations who delight in war. +\q1 +\v 31 Princes shall come out of Egypt. +\q2 Ethiopia shall hurry to stretch out her hands to God. +\q1 +\v 32 Sing to God, you kingdoms of the earth! +\q2 Sing praises to the Lord— \qs Selah—\qs* +\q1 +\v 33 to him who rides on the heaven of heavens, which are of old; +\q2 behold, he utters his voice, a mighty voice. +\q1 +\v 34 Ascribe strength to God! +\q2 His excellency is over Israel, +\q2 his strength is in the skies. +\q1 +\v 35 You are awesome, God, in your sanctuaries. +\q2 The God of Israel gives strength and power to his people. +\q2 Praise be to God! +\c 69 +\d For the Chief Musician. To the tune of “Lilies.” By David. +\q1 +\v 1 Save me, God, +\q2 for the waters have come up to my neck! +\q1 +\v 2 I sink in deep mire, where there is no foothold. +\q2 I have come into deep waters, where the floods overflow me. +\q1 +\v 3 I am weary with my crying. +\q2 My throat is dry. +\q2 My eyes fail looking for my God. +\q1 +\v 4 Those who hate me without a cause are more than the hairs of my head. +\q2 Those who want to cut me off, being my enemies wrongfully, are mighty. +\q2 I have to restore what I didn’t take away. +\q1 +\v 5 God, you know my foolishness. +\q2 My sins aren’t hidden from you. +\q1 +\v 6 Don’t let those who wait for you be shamed through me, Lord Yahweh of Armies. +\q2 Don’t let those who seek you be brought to dishonor through me, God of Israel. +\q1 +\v 7 Because for your sake, I have borne reproach. +\q2 Shame has covered my face. +\q1 +\v 8 I have become a stranger to my brothers, +\q2 an alien to my mother’s children. +\q1 +\v 9 For the zeal of your house consumes me. +\q2 The reproaches of those who reproach you have fallen on me. +\q1 +\v 10 When I wept and I fasted, +\q2 that was to my reproach. +\q1 +\v 11 When I made sackcloth my clothing, +\q2 I became a byword to them. +\q1 +\v 12 Those who sit in the gate talk about me. +\q2 I am the song of the drunkards. +\q1 +\v 13 But as for me, my prayer is to you, Yahweh, in an acceptable time. +\q2 God, in the abundance of your loving kindness, answer me in the truth of your salvation. +\q1 +\v 14 Deliver me out of the mire, and don’t let me sink. +\q2 Let me be delivered from those who hate me, and out of the deep waters. +\q1 +\v 15 Don’t let the flood waters overwhelm me, +\q2 neither let the deep swallow me up. +\q2 Don’t let the pit shut its mouth on me. +\q1 +\v 16 Answer me, Yahweh, for your loving kindness is good. +\q2 According to the multitude of your tender mercies, turn to me. +\q1 +\v 17 Don’t hide your face from your servant, +\q2 for I am in distress. +\q2 Answer me speedily! +\q1 +\v 18 Draw near to my soul and redeem it. +\q2 Ransom me because of my enemies. +\q1 +\v 19 You know my reproach, my shame, and my dishonor. +\q2 My adversaries are all before you. +\q1 +\v 20 Reproach has broken my heart, and I am full of heaviness. +\q2 I looked for some to take pity, but there was none; +\q2 for comforters, but I found none. +\q1 +\v 21 They also gave me poison for my food. +\q2 In my thirst, they gave me vinegar to drink. +\q1 +\v 22 Let their table before them become a snare. +\q2 May it become a retribution and a trap. +\q1 +\v 23 Let their eyes be darkened, so that they can’t see. +\q2 Let their backs be continually bent. +\q1 +\v 24 Pour out your indignation on them. +\q2 Let the fierceness of your anger overtake them. +\q1 +\v 25 Let their habitation be desolate. +\q2 Let no one dwell in their tents. +\q1 +\v 26 For they persecute him whom you have wounded. +\q2 They tell of the sorrow of those whom you have hurt. +\q1 +\v 27 Charge them with crime upon crime. +\q2 Don’t let them come into your righteousness. +\q1 +\v 28 Let them be blotted out of the book of life, +\q2 and not be written with the righteous. +\q1 +\v 29 But I am in pain and distress. +\q2 Let your salvation, God, protect me. +\q1 +\v 30 I will praise the name of God with a song, +\q2 and will magnify him with thanksgiving. +\q1 +\v 31 It will please Yahweh better than an ox, +\q2 or a bull that has horns and hoofs. +\q1 +\v 32 The humble have seen it, and are glad. +\q2 You who seek after God, let your heart live. +\q1 +\v 33 For Yahweh hears the needy, +\q2 and doesn’t despise his captive people. +\q1 +\v 34 Let heaven and earth praise him; +\q2 the seas, and everything that moves therein! +\q1 +\v 35 For God will save Zion, and build the cities of Judah. +\q2 They shall settle there, and own it. +\q1 +\v 36 The children also of his servants shall inherit it. +\q2 Those who love his name shall dwell therein. +\c 70 +\d For the Chief Musician. By David. A reminder. +\q1 +\v 1 Hurry, God, to deliver me. +\q2 Come quickly to help me, Yahweh. +\q1 +\v 2 Let them be disappointed and confounded who seek my soul. +\q2 Let those who desire my ruin be turned back in disgrace. +\q1 +\v 3 Let them be turned because of their shame +\q2 who say, “Aha! Aha!” +\q1 +\v 4 Let all those who seek you rejoice and be glad in you. +\q2 Let those who love your salvation continually say, +\q2 “Let God be exalted!” +\q1 +\v 5 But I am poor and needy. +\q2 Come to me quickly, God. +\q1 You are my help and my deliverer. +\q2 Yahweh, don’t delay. +\b +\c 71 +\q1 +\v 1 In you, Yahweh, I take refuge. +\q2 Never let me be disappointed. +\q1 +\v 2 Deliver me in your righteousness, and rescue me. +\q2 Turn your ear to me, and save me. +\q1 +\v 3 Be to me a rock of refuge to which I may always go. +\q2 Give the command to save me, +\q2 for you are my rock and my fortress. +\q1 +\v 4 Rescue me, my God, from the hand of the wicked, +\q2 from the hand of the unrighteous and cruel man. +\q1 +\v 5 For you are my hope, Lord Yahweh, +\q2 my confidence from my youth. +\q1 +\v 6 I have relied on you from the womb. +\q2 You are he who took me out of my mother’s womb. +\q2 I will always praise you. +\q1 +\v 7 I am a marvel to many, +\q2 but you are my strong refuge. +\q1 +\v 8 My mouth shall be filled with your praise, +\q2 with your honor all day long. +\q1 +\v 9 Don’t reject me in my old age. +\q2 Don’t forsake me when my strength fails. +\q1 +\v 10 For my enemies talk about me. +\q2 Those who watch for my soul conspire together, +\q2 +\v 11 saying, “God has forsaken him. +\q2 Pursue and take him, for no one will rescue him.” +\q1 +\v 12 God, don’t be far from me. +\q2 My God, hurry to help me. +\q1 +\v 13 Let my accusers be disappointed and consumed. +\q2 Let them be covered with disgrace and scorn who want to harm me. +\q1 +\v 14 But I will always hope, +\q2 and will add to all of your praise. +\q1 +\v 15 My mouth will tell about your righteousness, +\q2 and of your salvation all day, +\q2 though I don’t know its full measure. +\q1 +\v 16 I will come with the mighty acts of the Lord Yahweh. +\q2 I will make mention of your righteousness, even of yours alone. +\q1 +\v 17 God, you have taught me from my youth. +\q2 Until now, I have declared your wondrous works. +\q1 +\v 18 Yes, even when I am old and gray-haired, God, don’t forsake me, +\q2 until I have declared your strength to the next generation, +\q2 your might to everyone who is to come. +\q1 +\v 19 God, your righteousness also reaches to the heavens. +\q2 You have done great things. +\q2 God, who is like you? +\q1 +\v 20 You, who have shown us many and bitter troubles, +\q2 you will let me live. +\q2 You will bring us up again from the depths of the earth. +\q1 +\v 21 Increase my honor +\q2 and comfort me again. +\q1 +\v 22 I will also praise you with the harp for your faithfulness, my God. +\q2 I sing praises to you with the lyre, Holy One of Israel. +\q1 +\v 23 My lips shall shout for joy! +\q2 My soul, which you have redeemed, sings praises to you! +\q1 +\v 24 My tongue will also talk about your righteousness all day long, +\q2 for they are disappointed, and they are confounded, +\q2 who want to harm me. +\c 72 +\d By Solomon. +\q1 +\v 1 God, give the king your justice; +\q2 your righteousness to the royal son. +\q1 +\v 2 He will judge your people with righteousness, +\q2 and your poor with justice. +\q1 +\v 3 The mountains shall bring prosperity to the people. +\q2 The hills bring the fruit of righteousness. +\q1 +\v 4 He will judge the poor of the people. +\q2 He will save the children of the needy, +\q2 and will break the oppressor in pieces. +\q1 +\v 5 They shall fear you while the sun endures; +\q2 and as long as the moon, throughout all generations. +\q1 +\v 6 He will come down like rain on the mown grass, +\q2 as showers that water the earth. +\q1 +\v 7 In his days, the righteous shall flourish, +\q2 and abundance of peace, until the moon is no more. +\q1 +\v 8 He shall have dominion also from sea to sea, +\q2 from the River to the ends of the earth. +\q1 +\v 9 Those who dwell in the wilderness shall bow before him. +\q2 His enemies shall lick the dust. +\q1 +\v 10 The kings of Tarshish and of the islands will bring tribute. +\q2 The kings of Sheba and Seba shall offer gifts. +\q1 +\v 11 Yes, all kings shall fall down before him. +\q2 All nations shall serve him. +\q1 +\v 12 For he will deliver the needy when he cries; +\q2 the poor, who has no helper. +\q1 +\v 13 He will have pity on the poor and needy. +\q2 He will save the souls of the needy. +\q1 +\v 14 He will redeem their soul from oppression and violence. +\q2 Their blood will be precious in his sight. +\q1 +\v 15 He will live; and Sheba’s gold will be given to him. +\q2 Men will pray for him continually. +\q2 They will bless him all day long. +\q1 +\v 16 Abundance of grain shall be throughout the land. +\q2 Its fruit sways like Lebanon. +\q2 Let it flourish, thriving like the grass of the field. +\q1 +\v 17 His name endures forever. +\q2 His name continues as long as the sun. +\q1 Men shall be blessed by him. +\q2 All nations will call him blessed. +\b +\q1 +\v 18 Praise be to Yahweh God, the God of Israel, +\q2 who alone does marvelous deeds. +\q1 +\v 19 Blessed be his glorious name forever! +\q2 Let the whole earth be filled with his glory! +\q1 Amen and amen. +\b +\p +\v 20 This ends the prayers by David, the son of Jesse. +\c 73 +\ms1 BOOK 3 +\d A Psalm by Asaph. +\q1 +\v 1 Surely God\f + \fr 73:1 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* is good to Israel, +\q2 to those who are pure in heart. +\q1 +\v 2 But as for me, my feet were almost gone. +\q2 My steps had nearly slipped. +\q1 +\v 3 For I was envious of the arrogant, +\q2 when I saw the prosperity of the wicked. +\q1 +\v 4 For there are no struggles in their death, +\q2 but their strength is firm. +\q1 +\v 5 They are free from burdens of men, +\q2 neither are they plagued like other men. +\q1 +\v 6 Therefore pride is like a chain around their neck. +\q2 Violence covers them like a garment. +\q1 +\v 7 Their eyes bulge with fat. +\q2 Their minds pass the limits of conceit. +\q1 +\v 8 They scoff and speak with malice. +\q2 In arrogance, they threaten oppression. +\q1 +\v 9 They have set their mouth in the heavens. +\q2 Their tongue walks through the earth. +\q1 +\v 10 Therefore their people return to them, +\q2 and they drink up waters of abundance. +\q1 +\v 11 They say, “How does God know? +\q2 Is there knowledge in the Most High?” +\q1 +\v 12 Behold, these are the wicked. +\q2 Being always at ease, they increase in riches. +\q1 +\v 13 Surely I have cleansed my heart in vain, +\q2 and washed my hands in innocence, +\q1 +\v 14 For all day long I have been plagued, +\q2 and punished every morning. +\q1 +\v 15 If I had said, “I will speak thus”, +\q2 behold, I would have betrayed the generation of your children. +\q1 +\v 16 When I tried to understand this, +\q2 it was too painful for me— +\q1 +\v 17 until I entered God’s sanctuary, +\q2 and considered their latter end. +\q1 +\v 18 Surely you set them in slippery places. +\q2 You throw them down to destruction. +\q1 +\v 19 How they are suddenly destroyed! +\q2 They are completely swept away with terrors. +\q1 +\v 20 As a dream when one wakes up, +\q2 so, Lord,\f + \fr 73:20 \ft The word translated “Lord” is “Adonai.”\f* when you awake, you will despise their fantasies. +\q1 +\v 21 For my soul was grieved. +\q2 I was embittered in my heart. +\q1 +\v 22 I was so senseless and ignorant. +\q2 I was a brute beast before you. +\q1 +\v 23 Nevertheless, I am continually with you. +\q2 You have held my right hand. +\q1 +\v 24 You will guide me with your counsel, +\q2 and afterward receive me to glory. +\q1 +\v 25 Whom do I have in heaven? +\q2 There is no one on earth whom I desire besides you. +\q1 +\v 26 My flesh and my heart fails, +\q2 but God is the strength of my heart and my portion forever. +\q1 +\v 27 For, behold, those who are far from you shall perish. +\q2 You have destroyed all those who are unfaithful to you. +\q1 +\v 28 But it is good for me to come close to God. +\q2 I have made the Lord Yahweh\f + \fr 73:28 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* my refuge, +\q2 that I may tell of all your works. +\b +\c 74 +\d A contemplation by Asaph. +\q1 +\v 1 God, why have you rejected us forever? +\q2 Why does your anger smolder against the sheep of your pasture? +\q1 +\v 2 Remember your congregation, which you purchased of old, +\q2 which you have redeemed to be the tribe of your inheritance: +\q2 Mount Zion, in which you have lived. +\q1 +\v 3 Lift up your feet to the perpetual ruins, +\q2 all the evil that the enemy has done in the sanctuary. +\q1 +\v 4 Your adversaries have roared in the middle of your assembly. +\q2 They have set up their standards as signs. +\q1 +\v 5 They behaved like men wielding axes, +\q2 cutting through a thicket of trees. +\q1 +\v 6 Now they break all its carved work down with hatchet and hammers. +\q2 +\v 7 They have burned your sanctuary to the ground. +\q2 They have profaned the dwelling place of your Name. +\q1 +\v 8 They said in their heart, “We will crush them completely.” +\q2 They have burned up all the places in the land where God was worshiped. +\q1 +\v 9 We see no miraculous signs. +\q2 There is no longer any prophet, +\q2 neither is there among us anyone who knows how long. +\q1 +\v 10 How long, God, shall the adversary reproach? +\q2 Shall the enemy blaspheme your name forever? +\q1 +\v 11 Why do you draw back your hand, even your right hand? +\q2 Take it from your chest and consume them! +\b +\q1 +\v 12 Yet God is my King of old, +\q2 working salvation throughout the earth. +\q1 +\v 13 You divided the sea by your strength. +\q2 You broke the heads of the sea monsters in the waters. +\q1 +\v 14 You broke the heads of Leviathan in pieces. +\q2 You gave him as food to people and desert creatures. +\q1 +\v 15 You opened up spring and stream. +\q2 You dried up mighty rivers. +\q1 +\v 16 The day is yours, the night is also yours. +\q2 You have prepared the light and the sun. +\q1 +\v 17 You have set all the boundaries of the earth. +\q2 You have made summer and winter. +\b +\q1 +\v 18 Remember this, that the enemy has mocked you, Yahweh. +\q2 Foolish people have blasphemed your name. +\q1 +\v 19 Don’t deliver the soul of your dove to wild beasts. +\q2 Don’t forget the life of your poor forever. +\q1 +\v 20 Honor your covenant, +\q2 for haunts of violence fill the dark places of the earth. +\q1 +\v 21 Don’t let the oppressed return ashamed. +\q2 Let the poor and needy praise your name. +\q1 +\v 22 Arise, God! Plead your own cause. +\q2 Remember how the foolish man mocks you all day. +\q1 +\v 23 Don’t forget the voice of your adversaries. +\q2 The tumult of those who rise up against you ascends continually. +\b +\c 75 +\d For the Chief Musician. To the tune of “Do Not Destroy.” A Psalm by Asaph. A song. +\q1 +\v 1 We give thanks to you, God. +\q2 We give thanks, for your Name is near. +\q2 Men tell about your wondrous works. +\b +\q1 +\v 2 When I choose the appointed time, +\q2 I will judge blamelessly. +\q1 +\v 3 The earth and all its inhabitants quake. +\q2 I firmly hold its pillars. \qs Selah.\qs* +\q1 +\v 4 I said to the arrogant, “Don’t boast!” +\q2 I said to the wicked, “Don’t lift up the horn. +\q1 +\v 5 Don’t lift up your horn on high. +\q2 Don’t speak with a stiff neck.” +\q1 +\v 6 For neither from the east, nor from the west, +\q2 nor yet from the south, comes exaltation. +\q1 +\v 7 But God is the judge. +\q2 He puts down one, and lifts up another. +\q1 +\v 8 For in Yahweh’s hand there is a cup, +\q2 full of foaming wine mixed with spices. +\q1 He pours it out. +\q2 Indeed the wicked of the earth drink and drink it to its very dregs. +\b +\q1 +\v 9 But I will declare this forever: +\q2 I will sing praises to the God of Jacob. +\q1 +\v 10 I will cut off all the horns of the wicked, +\q2 but the horns of the righteous shall be lifted up. +\b +\c 76 +\d For the Chief Musician. On stringed instruments. A Psalm by Asaph. A song. +\q1 +\v 1 In Judah, God is known. +\q2 His name is great in Israel. +\q1 +\v 2 His tabernacle is also in Salem. +\q2 His dwelling place in Zion. +\q1 +\v 3 There he broke the flaming arrows of the bow, +\q2 the shield, and the sword, and the weapons of war. \qs Selah.\qs* +\q1 +\v 4 Glorious are you, and excellent, +\q2 more than mountains of game. +\q1 +\v 5 Valiant men lie plundered, +\q2 they have slept their last sleep. +\q2 None of the men of war can lift their hands. +\q1 +\v 6 At your rebuke, God of Jacob, +\q2 both chariot and horse are cast into a dead sleep. +\q1 +\v 7 You, even you, are to be feared. +\q2 Who can stand in your sight when you are angry? +\q1 +\v 8 You pronounced judgment from heaven. +\q2 The earth feared, and was silent, +\q2 +\v 9 when God arose to judgment, +\q2 to save all the afflicted ones of the earth. \qs Selah.\qs* +\q1 +\v 10 Surely the wrath of man praises you. +\q2 The survivors of your wrath are restrained. +\q1 +\v 11 Make vows to Yahweh your God, and fulfill them! +\q2 Let all of his neighbors bring presents to him who is to be feared. +\q1 +\v 12 He will cut off the spirit of princes. +\q2 He is feared by the kings of the earth. +\b +\c 77 +\d For the Chief Musician. To Jeduthun. A Psalm by Asaph. +\q1 +\v 1 My cry goes to God! +\q2 Indeed, I cry to God for help, +\q2 and for him to listen to me. +\q1 +\v 2 In the day of my trouble I sought the Lord. +\q2 My hand was stretched out in the night, and didn’t get tired. +\q2 My soul refused to be comforted. +\q1 +\v 3 I remember God, and I groan. +\q2 I complain, and my spirit is overwhelmed. \qs Selah.\qs* +\b +\q1 +\v 4 You hold my eyelids open. +\q2 I am so troubled that I can’t speak. +\q1 +\v 5 I have considered the days of old, +\q2 the years of ancient times. +\q1 +\v 6 I remember my song in the night. +\q2 I consider in my own heart; +\q2 my spirit diligently inquires: +\q1 +\v 7 “Will the Lord reject us forever? +\q2 Will he be favorable no more? +\q1 +\v 8 Has his loving kindness vanished forever? +\q2 Does his promise fail for generations? +\q1 +\v 9 Has God forgotten to be gracious? +\q2 Has he, in anger, withheld his compassion?” \qs Selah.\qs* +\q1 +\v 10 Then I thought, “I will appeal to this: +\q2 the years of the right hand of the Most High.” +\q1 +\v 11 I will remember Yah’s deeds; +\q2 for I will remember your wonders of old. +\q1 +\v 12 I will also meditate on all your work, +\q2 and consider your doings. +\q1 +\v 13 Your way, God, is in the sanctuary. +\q2 What god is great like God? +\q1 +\v 14 You are the God who does wonders. +\q2 You have made your strength known among the peoples. +\q1 +\v 15 You have redeemed your people with your arm, +\q2 the sons of Jacob and Joseph. \qs Selah.\qs* +\q1 +\v 16 The waters saw you, God. +\q2 The waters saw you, and they writhed. +\q2 The depths also convulsed. +\q1 +\v 17 The clouds poured out water. +\q2 The skies resounded with thunder. +\q2 Your arrows also flashed around. +\q1 +\v 18 The voice of your thunder was in the whirlwind. +\q2 The lightnings lit up the world. +\q2 The earth trembled and shook. +\q1 +\v 19 Your way was through the sea, +\q2 your paths through the great waters. +\q2 Your footsteps were not known. +\q1 +\v 20 You led your people like a flock, +\q2 by the hand of Moses and Aaron. +\b +\c 78 +\d A contemplation by Asaph. +\q1 +\v 1 Hear my teaching, my people. +\q2 Turn your ears to the words of my mouth. +\q1 +\v 2 I will open my mouth in a parable. +\q2 I will utter dark sayings of old, +\q1 +\v 3 which we have heard and known, +\q2 and our fathers have told us. +\q1 +\v 4 We will not hide them from their children, +\q2 telling to the generation to come the praises of Yahweh, +\q2 his strength, and his wondrous deeds that he has done. +\q1 +\v 5 For he established a covenant in Jacob, +\q2 and appointed a teaching in Israel, +\q2 which he commanded our fathers, +\q2 that they should make them known to their children; +\q1 +\v 6 that the generation to come might know, even the children who should be born; +\q2 who should arise and tell their children, +\q1 +\v 7 that they might set their hope in God, +\q2 and not forget God’s deeds, +\q2 but keep his commandments, +\q1 +\v 8 and might not be as their fathers— +\q2 a stubborn and rebellious generation, +\q2 a generation that didn’t make their hearts loyal, +\q2 whose spirit was not steadfast with God. +\q1 +\v 9 The children of Ephraim, being armed and carrying bows, +\q2 turned back in the day of battle. +\q1 +\v 10 They didn’t keep God’s covenant, +\q2 and refused to walk in his law. +\q1 +\v 11 They forgot his doings, +\q2 his wondrous deeds that he had shown them. +\q1 +\v 12 He did marvelous things in the sight of their fathers, +\q2 in the land of Egypt, in the field of Zoan. +\q1 +\v 13 He split the sea, and caused them to pass through. +\q2 He made the waters stand as a heap. +\q1 +\v 14 In the daytime he also led them with a cloud, +\q2 and all night with a light of fire. +\q1 +\v 15 He split rocks in the wilderness, +\q2 and gave them drink abundantly as out of the depths. +\q1 +\v 16 He brought streams also out of the rock, +\q2 and caused waters to run down like rivers. +\q1 +\v 17 Yet they still went on to sin against him, +\q2 to rebel against the Most High in the desert. +\q1 +\v 18 They tempted God in their heart +\q2 by asking food according to their desire. +\q1 +\v 19 Yes, they spoke against God. +\q2 They said, “Can God prepare a table in the wilderness? +\q1 +\v 20 Behold, he struck the rock, so that waters gushed out, +\q2 and streams overflowed. +\q1 Can he give bread also? +\q2 Will he provide meat for his people?” +\q1 +\v 21 Therefore Yahweh heard, and was angry. +\q2 A fire was kindled against Jacob, +\q2 anger also went up against Israel, +\q1 +\v 22 because they didn’t believe in God, +\q2 and didn’t trust in his salvation. +\q1 +\v 23 Yet he commanded the skies above, +\q2 and opened the doors of heaven. +\q1 +\v 24 He rained down manna on them to eat, +\q2 and gave them food from the sky. +\q1 +\v 25 Man ate the bread of angels. +\q2 He sent them food to the full. +\q1 +\v 26 He caused the east wind to blow in the sky. +\q2 By his power he guided the south wind. +\q1 +\v 27 He also rained meat on them as the dust, +\q2 winged birds as the sand of the seas. +\q1 +\v 28 He let them fall in the middle of their camp, +\q2 around their habitations. +\q1 +\v 29 So they ate, and were well filled. +\q2 He gave them their own desire. +\q1 +\v 30 They didn’t turn from their cravings. +\q2 Their food was yet in their mouths, +\q2 +\v 31 when the anger of God went up against them, +\q2 killed some of their strongest, +\q2 and struck down the young men of Israel. +\q1 +\v 32 For all this they still sinned, +\q2 and didn’t believe in his wondrous works. +\q1 +\v 33 Therefore he consumed their days in vanity, +\q2 and their years in terror. +\q1 +\v 34 When he killed them, then they inquired after him. +\q2 They returned and sought God earnestly. +\q1 +\v 35 They remembered that God was their rock, +\q2 the Most High God, their redeemer. +\q1 +\v 36 But they flattered him with their mouth, +\q2 and lied to him with their tongue. +\q1 +\v 37 For their heart was not right with him, +\q2 neither were they faithful in his covenant. +\q1 +\v 38 But he, being merciful, forgave iniquity, and didn’t destroy them. +\q2 Yes, many times he turned his anger away, +\q2 and didn’t stir up all his wrath. +\q1 +\v 39 He remembered that they were but flesh, +\q2 a wind that passes away, and doesn’t come again. +\q1 +\v 40 How often they rebelled against him in the wilderness, +\q2 and grieved him in the desert! +\q1 +\v 41 They turned again and tempted God, +\q2 and provoked the Holy One of Israel. +\q1 +\v 42 They didn’t remember his hand, +\q2 nor the day when he redeemed them from the adversary; +\q1 +\v 43 how he set his signs in Egypt, +\q2 his wonders in the field of Zoan, +\q1 +\v 44 he turned their rivers into blood, +\q2 and their streams, so that they could not drink. +\q1 +\v 45 He sent among them swarms of flies, which devoured them; +\q2 and frogs, which destroyed them. +\q1 +\v 46 He also gave their increase to the caterpillar, +\q2 and their labor to the locust. +\q1 +\v 47 He destroyed their vines with hail, +\q2 their sycamore fig trees with frost. +\q1 +\v 48 He also gave over their livestock to the hail, +\q2 and their flocks to hot thunderbolts. +\q1 +\v 49 He threw on them the fierceness of his anger, +\q2 wrath, indignation, and trouble, +\q2 and a band of angels of evil. +\q1 +\v 50 He made a path for his anger. +\q2 He didn’t spare their soul from death, +\q2 but gave their life over to the pestilence, +\q1 +\v 51 and struck all the firstborn in Egypt, +\q2 the chief of their strength in the tents of Ham. +\q1 +\v 52 But he led out his own people like sheep, +\q2 and guided them in the wilderness like a flock. +\q1 +\v 53 He led them safely, so that they weren’t afraid, +\q2 but the sea overwhelmed their enemies. +\q1 +\v 54 He brought them to the border of his sanctuary, +\q2 to this mountain, which his right hand had taken. +\q1 +\v 55 He also drove out the nations before them, +\q2 allotted them for an inheritance by line, +\q2 and made the tribes of Israel to dwell in their tents. +\q1 +\v 56 Yet they tempted and rebelled against the Most High God, +\q2 and didn’t keep his testimonies, +\q1 +\v 57 but turned back, and dealt treacherously like their fathers. +\q2 They were twisted like a deceitful bow. +\q1 +\v 58 For they provoked him to anger with their high places, +\q2 and moved him to jealousy with their engraved images. +\q1 +\v 59 When God heard this, he was angry, +\q2 and greatly abhorred Israel, +\q1 +\v 60 so that he abandoned the tent of Shiloh, +\q2 the tent which he placed among men, +\q1 +\v 61 and delivered his strength into captivity, +\q2 his glory into the adversary’s hand. +\q1 +\v 62 He also gave his people over to the sword, +\q2 and was angry with his inheritance. +\q1 +\v 63 Fire devoured their young men. +\q2 Their virgins had no wedding song. +\q1 +\v 64 Their priests fell by the sword, +\q2 and their widows couldn’t weep. +\q1 +\v 65 Then the Lord awakened as one out of sleep, +\q2 like a mighty man who shouts by reason of wine. +\q1 +\v 66 He struck his adversaries backward. +\q2 He put them to a perpetual reproach. +\q1 +\v 67 Moreover he rejected the tent of Joseph, +\q2 and didn’t choose the tribe of Ephraim, +\q1 +\v 68 But chose the tribe of Judah, +\q2 Mount Zion which he loved. +\q1 +\v 69 He built his sanctuary like the heights, +\q2 like the earth which he has established forever. +\q1 +\v 70 He also chose David his servant, +\q2 and took him from the sheepfolds; +\q1 +\v 71 from following the ewes that have their young, +\q2 he brought him to be the shepherd of Jacob, his people, +\q2 and Israel, his inheritance. +\q1 +\v 72 So he was their shepherd according to the integrity of his heart, +\q2 and guided them by the skillfulness of his hands. +\b +\c 79 +\d A Psalm by Asaph. +\q1 +\v 1 God, the nations have come into your inheritance. +\q2 They have defiled your holy temple. +\q2 They have laid Jerusalem in heaps. +\q1 +\v 2 They have given the dead bodies of your servants to be food for the birds of the sky, +\q2 the flesh of your saints to the animals of the earth. +\q1 +\v 3 They have shed their blood like water around Jerusalem. +\q2 There was no one to bury them. +\q1 +\v 4 We have become a reproach to our neighbors, +\q2 a scoffing and derision to those who are around us. +\q1 +\v 5 How long, Yahweh? +\q2 Will you be angry forever? +\q2 Will your jealousy burn like fire? +\q1 +\v 6 Pour out your wrath on the nations that don’t know you, +\q2 on the kingdoms that don’t call on your name, +\q1 +\v 7 for they have devoured Jacob, +\q2 and destroyed his homeland. +\q1 +\v 8 Don’t hold the iniquities of our forefathers against us. +\q2 Let your tender mercies speedily meet us, +\q2 for we are in desperate need. +\q1 +\v 9 Help us, God of our salvation, for the glory of your name. +\q2 Deliver us, and forgive our sins, for your name’s sake. +\q1 +\v 10 Why should the nations say, “Where is their God?” +\q2 Let it be known among the nations, before our eyes, +\q2 that vengeance for your servants’ blood is being poured out. +\q1 +\v 11 Let the sighing of the prisoner come before you. +\q2 According to the greatness of your power, preserve those who are sentenced to death. +\q1 +\v 12 Pay back to our neighbors seven times into their bosom +\q2 their reproach with which they have reproached you, Lord. +\q1 +\v 13 So we, your people and sheep of your pasture, +\q2 will give you thanks forever. +\q2 We will praise you forever, to all generations. +\b +\c 80 +\d For the Chief Musician. To the tune of “The Lilies of the Covenant.” A Psalm by Asaph. +\q1 +\v 1 Hear us, Shepherd of Israel, +\q2 you who lead Joseph like a flock, +\q2 you who sit above the cherubim, shine out. +\q1 +\v 2 Before Ephraim, Benjamin, and Manasseh, stir up your might! +\q2 Come to save us! +\q1 +\v 3 Turn us again, God. +\q2 Cause your face to shine, +\q2 and we will be saved. +\b +\q1 +\v 4 Yahweh God of Armies, +\q2 how long will you be angry against the prayer of your people? +\q1 +\v 5 You have fed them with the bread of tears, +\q2 and given them tears to drink in large measure. +\q1 +\v 6 You make us a source of contention to our neighbors. +\q2 Our enemies laugh among themselves. +\q1 +\v 7 Turn us again, God of Armies. +\q2 Cause your face to shine, +\q2 and we will be saved. +\b +\q1 +\v 8 You brought a vine out of Egypt. +\q2 You drove out the nations, and planted it. +\q1 +\v 9 You cleared the ground for it. +\q2 It took deep root, and filled the land. +\q1 +\v 10 The mountains were covered with its shadow. +\q2 Its boughs were like God’s cedars. +\q1 +\v 11 It sent out its branches to the sea, +\q2 its shoots to the River. +\q1 +\v 12 Why have you broken down its walls, +\q2 so that all those who pass by the way pluck it? +\q1 +\v 13 The boar out of the wood ravages it. +\q2 The wild animals of the field feed on it. +\q1 +\v 14 Turn again, we beg you, God of Armies. +\q2 Look down from heaven, and see, and visit this vine, +\q1 +\v 15 the stock which your right hand planted, +\q2 the branch that you made strong for yourself. +\q1 +\v 16 It’s burned with fire. +\q2 It’s cut down. +\q2 They perish at your rebuke. +\q1 +\v 17 Let your hand be on the man of your right hand, +\q2 on the son of man whom you made strong for yourself. +\q1 +\v 18 So we will not turn away from you. +\q2 Revive us, and we will call on your name. +\q1 +\v 19 Turn us again, Yahweh God of Armies. +\q2 Cause your face to shine, and we will be saved. +\c 81 +\d For the Chief Musician. On an instrument of Gath. By Asaph. +\q1 +\v 1 Sing aloud to God, our strength! +\q2 Make a joyful shout to the God of Jacob! +\q1 +\v 2 Raise a song, and bring here the tambourine, +\q2 the pleasant lyre with the harp. +\q1 +\v 3 Blow the trumpet at the New Moon, +\q2 at the full moon, on our feast day. +\q1 +\v 4 For it is a statute for Israel, +\q2 an ordinance of the God of Jacob. +\q1 +\v 5 He appointed it in Joseph for a covenant, +\q2 when he went out over the land of Egypt, +\q2 I heard a language that I didn’t know. +\q1 +\v 6 “I removed his shoulder from the burden. +\q2 His hands were freed from the basket. +\q1 +\v 7 You called in trouble, and I delivered you. +\q2 I answered you in the secret place of thunder. +\q2 I tested you at the waters of Meribah.” \qs Selah.\qs* +\b +\q1 +\v 8 “Hear, my people, and I will testify to you, +\q2 Israel, if you would listen to me! +\q1 +\v 9 There shall be no strange god in you, +\q2 neither shall you worship any foreign god. +\q1 +\v 10 I am Yahweh, your God, +\q2 who brought you up out of the land of Egypt. +\q2 Open your mouth wide, and I will fill it. +\q1 +\v 11 But my people didn’t listen to my voice. +\q2 Israel desired none of me. +\q1 +\v 12 So I let them go after the stubbornness of their hearts, +\q2 that they might walk in their own counsels. +\q1 +\v 13 Oh that my people would listen to me, +\q2 that Israel would walk in my ways! +\q1 +\v 14 I would soon subdue their enemies, +\q2 and turn my hand against their adversaries. +\q1 +\v 15 The haters of Yahweh would cringe before him, +\q2 and their punishment would last forever. +\q1 +\v 16 But he would have also fed them with the finest of the wheat. +\q2 I will satisfy you with honey out of the rock.” +\c 82 +\d A Psalm by Asaph. +\q1 +\v 1 God presides in the great assembly. +\q2 He judges among the gods. +\q1 +\v 2 “How long will you judge unjustly, +\q2 and show partiality to the wicked?” \qs Selah.\qs* +\b +\q1 +\v 3 “Defend the weak, the poor, and the fatherless. +\q2 Maintain the rights of the poor and oppressed. +\q1 +\v 4 Rescue the weak and needy. +\q2 Deliver them out of the hand of the wicked.” +\q1 +\v 5 They don’t know, neither do they understand. +\q2 They walk back and forth in darkness. +\q2 All the foundations of the earth are shaken. +\q1 +\v 6 I said, “You are gods, +\q2 all of you are sons of the Most High. +\q1 +\v 7 Nevertheless you shall die like men, +\q2 and fall like one of the rulers.” +\q1 +\v 8 Arise, God, judge the earth, +\q2 for you inherit all of the nations. +\c 83 +\d A song. A Psalm by Asaph. +\q1 +\v 1 God, don’t keep silent. +\q2 Don’t keep silent, +\q2 and don’t be still, God. +\q1 +\v 2 For, behold, your enemies are stirred up. +\q2 Those who hate you have lifted up their heads. +\q1 +\v 3 They conspire with cunning against your people. +\q2 They plot against your cherished ones. +\q1 +\v 4 “Come,” they say, “let’s destroy them as a nation, +\q2 that the name of Israel may be remembered no more.” +\q1 +\v 5 For they have conspired together with one mind. +\q2 They form an alliance against you. +\q1 +\v 6 The tents of Edom and the Ishmaelites; +\q2 Moab, and the Hagrites; +\q1 +\v 7 Gebal, Ammon, and Amalek; +\q2 Philistia with the inhabitants of Tyre; +\q1 +\v 8 Assyria also is joined with them. +\q2 They have helped the children of Lot. \qs Selah.\qs* +\q1 +\v 9 Do to them as you did to Midian, +\q2 as to Sisera, as to Jabin, at the river Kishon; +\q1 +\v 10 who perished at Endor, +\q2 who became as dung for the earth. +\q1 +\v 11 Make their nobles like Oreb and Zeeb, +\q2 yes, all their princes like Zebah and Zalmunna, +\q2 +\v 12 who said, “Let’s take possession of God’s pasture lands.” +\q1 +\v 13 My God, make them like tumbleweed, +\q2 like chaff before the wind. +\q1 +\v 14 As the fire that burns the forest, +\q2 as the flame that sets the mountains on fire, +\q2 +\v 15 so pursue them with your tempest, +\q2 and terrify them with your storm. +\q1 +\v 16 Fill their faces with confusion, +\q2 that they may seek your name, Yahweh. +\q1 +\v 17 Let them be disappointed and dismayed forever. +\q2 Yes, let them be confounded and perish; +\q1 +\v 18 that they may know that you alone, whose name is Yahweh, +\q2 are the Most High over all the earth. +\c 84 +\d For the Chief Musician. On an instrument of Gath. A Psalm by the sons of Korah. +\q1 +\v 1 How lovely are your dwellings, +\q2 Yahweh of Armies! +\q1 +\v 2 My soul longs, and even faints for the courts of Yahweh. +\q2 My heart and my flesh cry out for the living God. +\q1 +\v 3 Yes, the sparrow has found a home, +\q2 and the swallow a nest for herself, where she may have her young, +\q2 near your altars, Yahweh of Armies, my King, and my God. +\q1 +\v 4 Blessed are those who dwell in your house. +\q2 They are always praising you. \qs Selah.\qs* +\q1 +\v 5 Blessed are those whose strength is in you, +\q2 who have set their hearts on a pilgrimage. +\q1 +\v 6 Passing through the valley of Weeping, they make it a place of springs. +\q2 Yes, the autumn rain covers it with blessings. +\q1 +\v 7 They go from strength to strength. +\q2 Every one of them appears before God in Zion. +\q1 +\v 8 Yahweh, God of Armies, hear my prayer. +\q2 Listen, God of Jacob. \qs Selah.\qs* +\q1 +\v 9 Behold, God our shield, +\q2 look at the face of your anointed. +\q1 +\v 10 For a day in your courts is better than a thousand. +\q2 I would rather be a doorkeeper in the house of my God, +\q2 than to dwell in the tents of wickedness. +\q1 +\v 11 For Yahweh God is a sun and a shield. +\q2 Yahweh will give grace and glory. +\q2 He withholds no good thing from those who walk blamelessly. +\q1 +\v 12 Yahweh of Armies, +\q2 blessed is the man who trusts in you. +\c 85 +\d For the Chief Musician. A Psalm by the sons of Korah. +\q1 +\v 1 Yahweh, you have been favorable to your land. +\q2 You have restored the fortunes of Jacob. +\q1 +\v 2 You have forgiven the iniquity of your people. +\q2 You have covered all their sin. \qs Selah.\qs* +\q1 +\v 3 You have taken away all your wrath. +\q2 You have turned from the fierceness of your anger. +\q1 +\v 4 Turn us, God of our salvation, +\q2 and cause your indignation toward us to cease. +\q1 +\v 5 Will you be angry with us forever? +\q2 Will you draw out your anger to all generations? +\q1 +\v 6 Won’t you revive us again, +\q2 that your people may rejoice in you? +\q1 +\v 7 Show us your loving kindness, Yahweh. +\q2 Grant us your salvation. +\q1 +\v 8 I will hear what God, Yahweh, will speak, +\q2 for he will speak peace to his people, his saints; +\q2 but let them not turn again to folly. +\q1 +\v 9 Surely his salvation is near those who fear him, +\q2 that glory may dwell in our land. +\q1 +\v 10 Mercy and truth meet together. +\q2 Righteousness and peace have kissed each other. +\q1 +\v 11 Truth springs out of the earth. +\q2 Righteousness has looked down from heaven. +\q1 +\v 12 Yes, Yahweh will give that which is good. +\q2 Our land will yield its increase. +\q1 +\v 13 Righteousness goes before him, +\q2 and prepares the way for his steps. +\c 86 +\d A Prayer by David. +\q1 +\v 1 Hear, Yahweh, and answer me, +\q2 for I am poor and needy. +\q1 +\v 2 Preserve my soul, for I am godly. +\q2 You, my God, save your servant who trusts in you. +\q1 +\v 3 Be merciful to me, Lord, +\q2 for I call to you all day long. +\q1 +\v 4 Bring joy to the soul of your servant, +\q2 for to you, Lord, do I lift up my soul. +\q1 +\v 5 For you, Lord, are good, and ready to forgive, +\q2 abundant in loving kindness to all those who call on you. +\q1 +\v 6 Hear, Yahweh, my prayer. +\q2 Listen to the voice of my petitions. +\q1 +\v 7 In the day of my trouble I will call on you, +\q2 for you will answer me. +\q1 +\v 8 There is no one like you among the gods, Lord, +\q2 nor any deeds like your deeds. +\q1 +\v 9 All nations you have made will come and worship before you, Lord. +\q2 They shall glorify your name. +\q1 +\v 10 For you are great, and do wondrous things. +\q2 You are God alone. +\q1 +\v 11 Teach me your way, Yahweh. +\q2 I will walk in your truth. +\q2 Make my heart undivided to fear your name. +\q1 +\v 12 I will praise you, Lord my God, with my whole heart. +\q2 I will glorify your name forever more. +\q1 +\v 13 For your loving kindness is great toward me. +\q2 You have delivered my soul from the lowest Sheol.\f + \fr 86:13 \ft Sheol is the place of the dead.\f* +\q1 +\v 14 God, the proud have risen up against me. +\q2 A company of violent men have sought after my soul, +\q2 and they don’t hold regard for you before them. +\q1 +\v 15 But you, Lord, are a merciful and gracious God, +\q2 slow to anger, and abundant in loving kindness and truth. +\q1 +\v 16 Turn to me, and have mercy on me! +\q2 Give your strength to your servant. +\q2 Save the son of your servant. +\q1 +\v 17 Show me a sign of your goodness, +\q2 that those who hate me may see it, and be shamed, +\q2 because you, Yahweh, have helped me, and comforted me. +\c 87 +\d A Psalm by the sons of Korah; a Song. +\q1 +\v 1 His foundation is in the holy mountains. +\q2 +\v 2 Yahweh loves the gates of Zion more than all the dwellings of Jacob. +\q1 +\v 3 Glorious things are spoken about you, city of God. \qs Selah.\qs* +\q1 +\v 4 I will record Rahab\f + \fr 87:4 \ft Rahab is a reference to Egypt.\f* and Babylon among those who acknowledge me. +\q2 Behold, Philistia, Tyre, and also Ethiopia: +\q2 “This one was born there.” +\q1 +\v 5 Yes, of Zion it will be said, “This one and that one was born in her;” +\q2 the Most High himself will establish her. +\q1 +\v 6 Yahweh will count, when he writes up the peoples, +\q2 “This one was born there.” \qs Selah.\qs* +\q1 +\v 7 Those who sing as well as those who dance say, +\q2 “All my springs are in you.” +\c 88 +\d A Song. A Psalm by the sons of Korah. For the Chief Musician. To the tune of “The Suffering of Affliction.” A contemplation by Heman, the Ezrahite. +\q1 +\v 1 Yahweh, the God of my salvation, +\q2 I have cried day and night before you. +\q1 +\v 2 Let my prayer enter into your presence. +\q2 Turn your ear to my cry. +\q1 +\v 3 For my soul is full of troubles. +\q2 My life draws near to Sheol.\f + \fr 88:3 \ft Sheol is the place of the dead.\f* +\q1 +\v 4 I am counted among those who go down into the pit. +\q2 I am like a man who has no help, +\q2 +\v 5 set apart among the dead, +\q2 like the slain who lie in the grave, +\q2 whom you remember no more. +\q2 They are cut off from your hand. +\q1 +\v 6 You have laid me in the lowest pit, +\q2 in the darkest depths. +\q1 +\v 7 Your wrath lies heavily on me. +\q2 You have afflicted me with all your waves. \qs Selah.\qs* +\q1 +\v 8 You have taken my friends from me. +\q2 You have made me an abomination to them. +\q2 I am confined, and I can’t escape. +\q1 +\v 9 My eyes are dim from grief. +\q2 I have called on you daily, Yahweh. +\q2 I have spread out my hands to you. +\q1 +\v 10 Do you show wonders to the dead? +\q2 Do the departed spirits rise up and praise you? \qs Selah.\qs* +\q1 +\v 11 Is your loving kindness declared in the grave? +\q2 Or your faithfulness in Destruction? +\q1 +\v 12 Are your wonders made known in the dark? +\q2 Or your righteousness in the land of forgetfulness? +\q1 +\v 13 But to you, Yahweh, I have cried. +\q2 In the morning, my prayer comes before you. +\q1 +\v 14 Yahweh, why do you reject my soul? +\q2 Why do you hide your face from me? +\q1 +\v 15 I am afflicted and ready to die from my youth up. +\q2 While I suffer your terrors, I am distracted. +\q1 +\v 16 Your fierce wrath has gone over me. +\q2 Your terrors have cut me off. +\q1 +\v 17 They came around me like water all day long. +\q2 They completely engulfed me. +\q1 +\v 18 You have put lover and friend far from me, +\q2 and my friends into darkness. +\c 89 +\d A contemplation by Ethan, the Ezrahite. +\q1 +\v 1 I will sing of the loving kindness of Yahweh forever. +\q2 With my mouth, I will make known your faithfulness to all generations. +\q1 +\v 2 I indeed declare, “Love stands firm forever. +\q2 You established the heavens. +\q2 Your faithfulness is in them.” +\b +\q1 +\v 3 “I have made a covenant with my chosen one, +\q2 I have sworn to David, my servant, +\q1 +\v 4 ‘I will establish your offspring forever, +\q2 and build up your throne to all generations.’” \qs Selah.\qs* +\q1 +\v 5 The heavens will praise your wonders, Yahweh, +\q2 your faithfulness also in the assembly of the holy ones. +\q1 +\v 6 For who in the skies can be compared to Yahweh? +\q2 Who among the sons of the heavenly beings is like Yahweh, +\q1 +\v 7 a very awesome God in the council of the holy ones, +\q2 to be feared above all those who are around him? +\q1 +\v 8 Yahweh, God of Armies, who is a mighty one, like you? +\q2 Yah, your faithfulness is around you. +\q1 +\v 9 You rule the pride of the sea. +\q2 When its waves rise up, you calm them. +\q1 +\v 10 You have broken Rahab in pieces, like one of the slain. +\q2 You have scattered your enemies with your mighty arm. +\q1 +\v 11 The heavens are yours. +\q2 The earth also is yours, +\q2 the world and its fullness. +\q2 You have founded them. +\q1 +\v 12 You have created the north and the south. +\q2 Tabor and Hermon rejoice in your name. +\q1 +\v 13 You have a mighty arm. +\q2 Your hand is strong, and your right hand is exalted. +\q1 +\v 14 Righteousness and justice are the foundation of your throne. +\q2 Loving kindness and truth go before your face. +\q1 +\v 15 Blessed are the people who learn to acclaim you. +\q2 They walk in the light of your presence, Yahweh. +\q1 +\v 16 In your name they rejoice all day. +\q2 In your righteousness, they are exalted. +\q1 +\v 17 For you are the glory of their strength. +\q2 In your favor, our horn will be exalted. +\q1 +\v 18 For our shield belongs to Yahweh, +\q2 our king to the Holy One of Israel. +\b +\q1 +\v 19 Then you spoke in vision to your saints, +\q2 and said, “I have given strength to the warrior. +\q2 I have exalted a young man from the people. +\q1 +\v 20 I have found David, my servant. +\q2 I have anointed him with my holy oil, +\q1 +\v 21 with whom my hand shall be established. +\q2 My arm will also strengthen him. +\q1 +\v 22 No enemy will tax him. +\q2 No wicked man will oppress him. +\q1 +\v 23 I will beat down his adversaries before him, +\q2 and strike those who hate him. +\q1 +\v 24 But my faithfulness and my loving kindness will be with him. +\q2 In my name, his horn will be exalted. +\q1 +\v 25 I will set his hand also on the sea, +\q2 and his right hand on the rivers. +\q1 +\v 26 He will call to me, ‘You are my Father, +\q2 my God, and the rock of my salvation!’ +\q1 +\v 27 I will also appoint him my firstborn, +\q2 the highest of the kings of the earth. +\q1 +\v 28 I will keep my loving kindness for him forever more. +\q2 My covenant will stand firm with him. +\q1 +\v 29 I will also make his offspring endure forever, +\q2 and his throne as the days of heaven. +\q1 +\v 30 If his children forsake my law, +\q2 and don’t walk in my ordinances; +\q1 +\v 31 if they break my statutes, +\q2 and don’t keep my commandments; +\q1 +\v 32 then I will punish their sin with the rod, +\q2 and their iniquity with stripes. +\q1 +\v 33 But I will not completely take my loving kindness from him, +\q2 nor allow my faithfulness to fail. +\q1 +\v 34 I will not break my covenant, +\q2 nor alter what my lips have uttered. +\q1 +\v 35 Once I have sworn by my holiness, +\q2 I will not lie to David. +\q1 +\v 36 His offspring will endure forever, +\q2 his throne like the sun before me. +\q1 +\v 37 It will be established forever like the moon, +\q2 the faithful witness in the sky.” \qs Selah.\qs* +\b +\q1 +\v 38 But you have rejected and spurned. +\q2 You have been angry with your anointed. +\q1 +\v 39 You have renounced the covenant of your servant. +\q2 You have defiled his crown in the dust. +\q1 +\v 40 You have broken down all his hedges. +\q2 You have brought his strongholds to ruin. +\q1 +\v 41 All who pass by the way rob him. +\q1 He has become a reproach to his neighbors. +\q1 +\v 42 You have exalted the right hand of his adversaries. +\q2 You have made all of his enemies rejoice. +\q1 +\v 43 Yes, you turn back the edge of his sword, +\q2 and haven’t supported him in battle. +\q1 +\v 44 You have ended his splendor, +\q2 and thrown his throne down to the ground. +\q1 +\v 45 You have shortened the days of his youth. +\q2 You have covered him with shame. \qs Selah.\qs* +\q1 +\v 46 How long, Yahweh? +\q2 Will you hide yourself forever? +\q2 Will your wrath burn like fire? +\q1 +\v 47 Remember how short my time is, +\q2 for what vanity you have created all the children of men! +\q1 +\v 48 What man is he who shall live and not see death, +\q2 who shall deliver his soul from the power of Sheol?\f + \fr 89:48 \ft Sheol is the place of the dead.\f* \qs Selah.\qs* +\q1 +\v 49 Lord, where are your former loving kindnesses, +\q2 which you swore to David in your faithfulness? +\q1 +\v 50 Remember, Lord, the reproach of your servants, +\q2 how I bear in my heart the taunts of all the mighty peoples, +\q1 +\v 51 With which your enemies have mocked, Yahweh, +\q2 with which they have mocked the footsteps of your anointed one. +\b +\q1 +\v 52 Blessed be Yahweh forever more. +\q1 Amen, and Amen. +\c 90 +\ms1 BOOK 4 +\d A Prayer by Moses, the man of God.\f + \fr 90:0 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q1 +\v 1 Lord,\f + \fr 90:1 \ft The word translated “Lord” is “Adonai.”\f* you have been our dwelling place for all generations. +\q2 +\v 2 Before the mountains were born, +\q2 before you had formed the earth and the world, +\q2 even from everlasting to everlasting, you are God. +\q1 +\v 3 You turn man to destruction, saying, +\q2 “Return, you children of men.” +\q1 +\v 4 For a thousand years in your sight are just like yesterday when it is past, +\q2 like a watch in the night. +\q1 +\v 5 You sweep them away as they sleep. +\q2 In the morning they sprout like new grass. +\q1 +\v 6 In the morning it sprouts and springs up. +\q2 By evening, it is withered and dry. +\q1 +\v 7 For we are consumed in your anger. +\q2 We are troubled in your wrath. +\q1 +\v 8 You have set our iniquities before you, +\q2 our secret sins in the light of your presence. +\q1 +\v 9 For all our days have passed away in your wrath. +\q2 We bring our years to an end as a sigh. +\q1 +\v 10 The days of our years are seventy, +\q2 or even by reason of strength eighty years; +\q2 yet their pride is but labor and sorrow, +\q2 for it passes quickly, and we fly away. +\q1 +\v 11 Who knows the power of your anger, +\q2 your wrath according to the fear that is due to you? +\q1 +\v 12 So teach us to count our days, +\q2 that we may gain a heart of wisdom. +\q1 +\v 13 Relent, Yahweh!\f + \fr 90:13 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* +\q2 How long? +\q2 Have compassion on your servants! +\q1 +\v 14 Satisfy us in the morning with your loving kindness, +\q2 that we may rejoice and be glad all our days. +\q1 +\v 15 Make us glad for as many days as you have afflicted us, +\q2 for as many years as we have seen evil. +\q1 +\v 16 Let your work appear to your servants, +\q2 your glory to their children. +\q1 +\v 17 Let the favor of the Lord our God be on us. +\q2 Establish the work of our hands for us. +\q2 Yes, establish the work of our hands. +\c 91 +\q1 +\v 1 He who dwells in the secret place of the Most High +\q2 will rest in the shadow of the Almighty. +\q1 +\v 2 I will say of Yahweh, “He is my refuge and my fortress; +\q2 my God, in whom I trust.” +\q1 +\v 3 For he will deliver you from the snare of the fowler, +\q2 and from the deadly pestilence. +\q1 +\v 4 He will cover you with his feathers. +\q2 Under his wings you will take refuge. +\q2 His faithfulness is your shield and rampart. +\q1 +\v 5 You shall not be afraid of the terror by night, +\q2 nor of the arrow that flies by day, +\q2 +\v 6 nor of the pestilence that walks in darkness, +\q2 nor of the destruction that wastes at noonday. +\q1 +\v 7 A thousand may fall at your side, +\q2 and ten thousand at your right hand; +\q2 but it will not come near you. +\q1 +\v 8 You will only look with your eyes, +\q2 and see the recompense of the wicked. +\q1 +\v 9 Because you have made Yahweh your refuge, +\q2 and the Most High your dwelling place, +\q1 +\v 10 no evil shall happen to you, +\q2 neither shall any plague come near your dwelling. +\q1 +\v 11 For he will put his angels in charge of you, +\q2 to guard you in all your ways. +\q1 +\v 12 They will bear you up in their hands, +\q2 so that you won’t dash your foot against a stone. +\q1 +\v 13 You will tread on the lion and cobra. +\q2 You will trample the young lion and the serpent underfoot. +\q1 +\v 14 “Because he has set his love on me, therefore I will deliver him. +\q2 I will set him on high, because he has known my name. +\q1 +\v 15 He will call on me, and I will answer him. +\q2 I will be with him in trouble. +\q2 I will deliver him, and honor him. +\q1 +\v 16 I will satisfy him with long life, +\q2 and show him my salvation.” +\c 92 +\d A Psalm. A song for the Sabbath day. +\q1 +\v 1 It is a good thing to give thanks to Yahweh, +\q2 to sing praises to your name, Most High, +\q1 +\v 2 to proclaim your loving kindness in the morning, +\q2 and your faithfulness every night, +\q1 +\v 3 with the ten-stringed lute, with the harp, +\q2 and with the melody of the lyre. +\q1 +\v 4 For you, Yahweh, have made me glad through your work. +\q2 I will triumph in the works of your hands. +\q1 +\v 5 How great are your works, Yahweh! +\q2 Your thoughts are very deep. +\q1 +\v 6 A senseless man doesn’t know, +\q2 neither does a fool understand this: +\q1 +\v 7 though the wicked spring up as the grass, +\q2 and all the evildoers flourish, +\q2 they will be destroyed forever. +\q1 +\v 8 But you, Yahweh, are on high forever more. +\q1 +\v 9 For behold, your enemies, Yahweh, +\q2 for behold, your enemies shall perish. +\q2 All the evildoers will be scattered. +\q1 +\v 10 But you have exalted my horn like that of the wild ox. +\q2 I am anointed with fresh oil. +\q1 +\v 11 My eye has also seen my enemies. +\q2 My ears have heard of the wicked enemies who rise up against me. +\q1 +\v 12 The righteous shall flourish like the palm tree. +\q2 He will grow like a cedar in Lebanon. +\q1 +\v 13 They are planted in Yahweh’s house. +\q2 They will flourish in our God’s courts. +\q1 +\v 14 They will still produce fruit in old age. +\q2 They will be full of sap and green, +\q2 +\v 15 to show that Yahweh is upright. +\q1 He is my rock, +\q2 and there is no unrighteousness in him. +\c 93 +\q1 +\v 1 Yahweh reigns! +\q2 He is clothed with majesty! +\q2 Yahweh is armed with strength. +\q1 The world also is established. +\q2 It can’t be moved. +\q1 +\v 2 Your throne is established from long ago. +\q2 You are from everlasting. +\q1 +\v 3 The floods have lifted up, Yahweh, +\q2 the floods have lifted up their voice. +\q2 The floods lift up their waves. +\q1 +\v 4 Above the voices of many waters, +\q2 the mighty breakers of the sea, +\q2 Yahweh on high is mighty. +\q1 +\v 5 Your statutes stand firm. +\q2 Holiness adorns your house, +\q2 Yahweh, forever more. +\c 94 +\q1 +\v 1 Yahweh, you God to whom vengeance belongs, +\q2 you God to whom vengeance belongs, shine out. +\q1 +\v 2 Rise up, you judge of the earth. +\q2 Pay back the proud what they deserve. +\q1 +\v 3 Yahweh, how long will the wicked, +\q2 how long will the wicked triumph? +\q1 +\v 4 They pour out arrogant words. +\q2 All the evildoers boast. +\q1 +\v 5 They break your people in pieces, Yahweh, +\q2 and afflict your heritage. +\q1 +\v 6 They kill the widow and the alien, +\q2 and murder the fatherless. +\q1 +\v 7 They say, “Yah will not see, +\q2 neither will Jacob’s God consider.” +\q1 +\v 8 Consider, you senseless among the people; +\q2 you fools, when will you be wise? +\q1 +\v 9 He who implanted the ear, won’t he hear? +\q2 He who formed the eye, won’t he see? +\q1 +\v 10 He who disciplines the nations, won’t he punish? +\q2 He who teaches man knows. +\q1 +\v 11 Yahweh knows the thoughts of man, +\q2 that they are futile. +\q1 +\v 12 Blessed is the man whom you discipline, Yah, +\q2 and teach out of your law, +\q1 +\v 13 that you may give him rest from the days of adversity, +\q2 until the pit is dug for the wicked. +\q1 +\v 14 For Yahweh won’t reject his people, +\q2 neither will he forsake his inheritance. +\q1 +\v 15 For judgment will return to righteousness. +\q2 All the upright in heart shall follow it. +\q1 +\v 16 Who will rise up for me against the wicked? +\q2 Who will stand up for me against the evildoers? +\q1 +\v 17 Unless Yahweh had been my help, +\q2 my soul would have soon lived in silence. +\q1 +\v 18 When I said, “My foot is slipping!” +\q2 Your loving kindness, Yahweh, held me up. +\q1 +\v 19 In the multitude of my thoughts within me, +\q2 your comforts delight my soul. +\q1 +\v 20 Shall the throne of wickedness have fellowship with you, +\q2 which brings about mischief by statute? +\q1 +\v 21 They gather themselves together against the soul of the righteous, +\q2 and condemn the innocent blood. +\q1 +\v 22 But Yahweh has been my high tower, +\q2 my God, the rock of my refuge. +\q1 +\v 23 He has brought on them their own iniquity, +\q2 and will cut them off in their own wickedness. +\q2 Yahweh, our God, will cut them off. +\c 95 +\q1 +\v 1 Oh come, let’s sing to Yahweh. +\q2 Let’s shout aloud to the rock of our salvation! +\q1 +\v 2 Let’s come before his presence with thanksgiving. +\q2 Let’s extol him with songs! +\q1 +\v 3 For Yahweh is a great God, +\q2 a great King above all gods. +\q1 +\v 4 In his hand are the deep places of the earth. +\q2 The heights of the mountains are also his. +\q1 +\v 5 The sea is his, and he made it. +\q2 His hands formed the dry land. +\q1 +\v 6 Oh come, let’s worship and bow down. +\q2 Let’s kneel before Yahweh, our Maker, +\q2 +\v 7 for he is our God. +\q1 We are the people of his pasture, +\q2 and the sheep in his care. +\q1 Today, oh that you would hear his voice! +\q2 +\v 8 Don’t harden your heart, as at Meribah, +\q2 as in the day of Massah in the wilderness, +\q1 +\v 9 when your fathers tempted me, +\q2 tested me, and saw my work. +\q1 +\v 10 Forty long years I was grieved with that generation, +\q2 and said, “They are a people who err in their heart. +\q2 They have not known my ways.” +\q1 +\v 11 Therefore I swore in my wrath, +\q2 “They won’t enter into my rest.” +\c 96 +\q1 +\v 1 Sing to Yahweh a new song! +\q2 Sing to Yahweh, all the earth. +\q1 +\v 2 Sing to Yahweh! +\q2 Bless his name! +\q2 Proclaim his salvation from day to day! +\q1 +\v 3 Declare his glory among the nations, +\q2 his marvelous works among all the peoples. +\q1 +\v 4 For Yahweh is great, and greatly to be praised! +\q2 He is to be feared above all gods. +\q1 +\v 5 For all the gods of the peoples are idols, +\q2 but Yahweh made the heavens. +\q1 +\v 6 Honor and majesty are before him. +\q2 Strength and beauty are in his sanctuary. +\q1 +\v 7 Ascribe to Yahweh, you families of nations, +\q2 ascribe to Yahweh glory and strength. +\q1 +\v 8 Ascribe to Yahweh the glory due to his name. +\q2 Bring an offering, and come into his courts. +\q1 +\v 9 Worship Yahweh in holy array. +\q2 Tremble before him, all the earth. +\q1 +\v 10 Say among the nations, “Yahweh reigns.” +\q2 The world is also established. +\q2 It can’t be moved. +\q2 He will judge the peoples with equity. +\q1 +\v 11 Let the heavens be glad, and let the earth rejoice. +\q2 Let the sea roar, and its fullness! +\q2 +\v 12 Let the field and all that is in it exult! +\q2 Then all the trees of the woods shall sing for joy +\q2 +\v 13 before Yahweh; for he comes, +\q2 for he comes to judge the earth. +\q1 He will judge the world with righteousness, +\q2 the peoples with his truth. +\c 97 +\q1 +\v 1 Yahweh reigns! +\q2 Let the earth rejoice! +\q2 Let the multitude of islands be glad! +\q1 +\v 2 Clouds and darkness are around him. +\q2 Righteousness and justice are the foundation of his throne. +\q1 +\v 3 A fire goes before him, +\q2 and burns up his adversaries on every side. +\q1 +\v 4 His lightning lights up the world. +\q2 The earth sees, and trembles. +\q1 +\v 5 The mountains melt like wax at the presence of Yahweh, +\q2 at the presence of the Lord of the whole earth. +\q1 +\v 6 The heavens declare his righteousness. +\q2 All the peoples have seen his glory. +\q1 +\v 7 Let all them be shamed who serve engraved images, +\q2 who boast in their idols. +\q2 Worship him, all you gods!\f + \fr 97:7 \ft LXX reads “angels” instead of “gods”.\f* +\q1 +\v 8 Zion heard and was glad. +\q2 The daughters of Judah rejoiced +\q2 because of your judgments, Yahweh. +\q1 +\v 9 For you, Yahweh, are most high above all the earth. +\q2 You are exalted far above all gods. +\q1 +\v 10 You who love Yahweh, hate evil! +\q2 He preserves the souls of his saints. +\q2 He delivers them out of the hand of the wicked. +\q1 +\v 11 Light is sown for the righteous, +\q2 and gladness for the upright in heart. +\q1 +\v 12 Be glad in Yahweh, you righteous people! +\q2 Give thanks to his holy Name. +\c 98 +\d A Psalm. +\q1 +\v 1 Sing to Yahweh a new song, +\q2 for he has done marvelous things! +\q2 His right hand and his holy arm have worked salvation for him. +\q1 +\v 2 Yahweh has made known his salvation. +\q2 He has openly shown his righteousness in the sight of the nations. +\q1 +\v 3 He has remembered his loving kindness and his faithfulness toward the house of Israel. +\q2 All the ends of the earth have seen the salvation of our God. +\q1 +\v 4 Make a joyful noise to Yahweh, all the earth! +\q2 Burst out and sing for joy, yes, sing praises! +\q1 +\v 5 Sing praises to Yahweh with the harp, +\q2 with the harp and the voice of melody. +\q1 +\v 6 With trumpets and sound of the ram’s horn, +\q2 make a joyful noise before the King, Yahweh. +\q1 +\v 7 Let the sea roar with its fullness; +\q2 the world, and those who dwell therein. +\q1 +\v 8 Let the rivers clap their hands. +\q2 Let the mountains sing for joy together. +\q1 +\v 9 Let them sing before Yahweh, +\q2 for he comes to judge the earth. +\q1 He will judge the world with righteousness, +\q2 and the peoples with equity. +\c 99 +\q1 +\v 1 Yahweh reigns! Let the peoples tremble. +\q2 He sits enthroned among the cherubim. +\q2 Let the earth be moved. +\q1 +\v 2 Yahweh is great in Zion. +\q2 He is high above all the peoples. +\q1 +\v 3 Let them praise your great and awesome name. +\q2 He is Holy! +\b +\q1 +\v 4 The King’s strength also loves justice. +\q2 You establish equity. +\q2 You execute justice and righteousness in Jacob. +\q1 +\v 5 Exalt Yahweh our God. +\q2 Worship at his footstool. +\q2 He is Holy! +\b +\q1 +\v 6 Moses and Aaron were among his priests, +\q2 Samuel was among those who call on his name. +\q2 They called on Yahweh, and he answered them. +\q1 +\v 7 He spoke to them in the pillar of cloud. +\q2 They kept his testimonies, +\q2 the statute that he gave them. +\q1 +\v 8 You answered them, Yahweh our God. +\q2 You are a God who forgave them, +\q2 although you took vengeance for their doings. +\q1 +\v 9 Exalt Yahweh, our God. +\q2 Worship at his holy hill, +\q2 for Yahweh, our God, is holy! +\c 100 +\d A Psalm of thanksgiving. +\q1 +\v 1 Shout for joy to Yahweh, all you lands! +\q2 +\v 2 Serve Yahweh with gladness. +\q2 Come before his presence with singing. +\q1 +\v 3 Know that Yahweh, he is God. +\q2 It is he who has made us, and we are his. +\q2 We are his people, and the sheep of his pasture. +\q1 +\v 4 Enter into his gates with thanksgiving, +\q2 and into his courts with praise. +\q2 Give thanks to him, and bless his name. +\q1 +\v 5 For Yahweh is good. +\q2 His loving kindness endures forever, +\q2 his faithfulness to all generations. +\c 101 +\d A Psalm by David. +\q1 +\v 1 I will sing of loving kindness and justice. +\q2 To you, Yahweh, I will sing praises. +\q1 +\v 2 I will be careful to live a blameless life. +\q2 When will you come to me? +\q2 I will walk within my house with a blameless heart. +\q1 +\v 3 I will set no vile thing before my eyes. +\q2 I hate the deeds of faithless men. +\q2 They will not cling to me. +\q1 +\v 4 A perverse heart will be far from me. +\q2 I will have nothing to do with evil. +\q1 +\v 5 I will silence whoever secretly slanders his neighbor. +\q2 I won’t tolerate one who is arrogant and conceited. +\q1 +\v 6 My eyes will be on the faithful of the land, +\q2 that they may dwell with me. +\q1 He who walks in a perfect way, +\q2 he will serve me. +\q1 +\v 7 He who practices deceit won’t dwell within my house. +\q2 He who speaks falsehood won’t be established before my eyes. +\q1 +\v 8 Morning by morning, I will destroy all the wicked of the land, +\q2 to cut off all the workers of iniquity from Yahweh’s city. +\c 102 +\d A Prayer of the afflicted, when he is overwhelmed and pours out his complaint before Yahweh. +\q1 +\v 1 Hear my prayer, Yahweh! +\q2 Let my cry come to you. +\q1 +\v 2 Don’t hide your face from me in the day of my distress. +\q2 Turn your ear to me. +\q2 Answer me quickly in the day when I call. +\q1 +\v 3 For my days consume away like smoke. +\q2 My bones are burned as a torch. +\q1 +\v 4 My heart is blighted like grass, and withered, +\q2 for I forget to eat my bread. +\q1 +\v 5 By reason of the voice of my groaning, +\q2 my bones stick to my skin. +\q1 +\v 6 I am like a pelican of the wilderness. +\q2 I have become as an owl of the waste places. +\q2 +\v 7 I watch, and have become like a sparrow that is alone on the housetop. +\q1 +\v 8 My enemies reproach me all day. +\q2 Those who are mad at me use my name as a curse. +\q1 +\v 9 For I have eaten ashes like bread, +\q2 and mixed my drink with tears, +\q2 +\v 10 because of your indignation and your wrath; +\q2 for you have taken me up and thrown me away. +\q1 +\v 11 My days are like a long shadow. +\q2 I have withered like grass. +\b +\q1 +\v 12 But you, Yahweh, will remain forever; +\q2 your renown endures to all generations. +\q1 +\v 13 You will arise and have mercy on Zion, +\q2 for it is time to have pity on her. +\q2 Yes, the set time has come. +\q1 +\v 14 For your servants take pleasure in her stones, +\q2 and have pity on her dust. +\q1 +\v 15 So the nations will fear Yahweh’s name, +\q2 all the kings of the earth your glory. +\q1 +\v 16 For Yahweh has built up Zion. +\q2 He has appeared in his glory. +\q1 +\v 17 He has responded to the prayer of the destitute, +\q2 and has not despised their prayer. +\q1 +\v 18 This will be written for the generation to come. +\q2 A people which will be created will praise Yah, +\q1 +\v 19 for he has looked down from the height of his sanctuary. +\q2 From heaven, Yahweh saw the earth, +\q1 +\v 20 to hear the groans of the prisoner, +\q2 to free those who are condemned to death, +\q1 +\v 21 that men may declare Yahweh’s name in Zion, +\q2 and his praise in Jerusalem, +\q1 +\v 22 when the peoples are gathered together, +\q2 the kingdoms, to serve Yahweh. +\b +\q1 +\v 23 He weakened my strength along the course. +\q2 He shortened my days. +\q1 +\v 24 I said, “My God, don’t take me away in the middle of my days. +\q2 Your years are throughout all generations. +\q1 +\v 25 Of old, you laid the foundation of the earth. +\q2 The heavens are the work of your hands. +\q1 +\v 26 They will perish, but you will endure. +\q2 Yes, all of them will wear out like a garment. +\q2 You will change them like a cloak, and they will be changed. +\q1 +\v 27 But you are the same. +\q2 Your years will have no end. +\q1 +\v 28 The children of your servants will continue. +\q2 Their offspring will be established before you.” +\c 103 +\d By David. +\q1 +\v 1 Praise Yahweh, my soul! +\q2 All that is within me, praise his holy name! +\q1 +\v 2 Praise Yahweh, my soul, +\q2 and don’t forget all his benefits, +\q1 +\v 3 who forgives all your sins, +\q2 who heals all your diseases, +\q1 +\v 4 who redeems your life from destruction, +\q2 who crowns you with loving kindness and tender mercies, +\q1 +\v 5 who satisfies your desire with good things, +\q2 so that your youth is renewed like the eagle’s. +\q1 +\v 6 Yahweh executes righteous acts, +\q2 and justice for all who are oppressed. +\q1 +\v 7 He made known his ways to Moses, +\q2 his deeds to the children of Israel. +\q1 +\v 8 Yahweh is merciful and gracious, +\q2 slow to anger, and abundant in loving kindness. +\q1 +\v 9 He will not always accuse; +\q2 neither will he stay angry forever. +\q1 +\v 10 He has not dealt with us according to our sins, +\q2 nor repaid us for our iniquities. +\q1 +\v 11 For as the heavens are high above the earth, +\q2 so great is his loving kindness toward those who fear him. +\q1 +\v 12 As far as the east is from the west, +\q2 so far has he removed our transgressions from us. +\q1 +\v 13 Like a father has compassion on his children, +\q2 so Yahweh has compassion on those who fear him. +\q1 +\v 14 For he knows how we are made. +\q2 He remembers that we are dust. +\q1 +\v 15 As for man, his days are like grass. +\q2 As a flower of the field, so he flourishes. +\q1 +\v 16 For the wind passes over it, and it is gone. +\q2 Its place remembers it no more. +\q1 +\v 17 But Yahweh’s loving kindness is from everlasting to everlasting with those who fear him, +\q2 his righteousness to children’s children, +\q1 +\v 18 to those who keep his covenant, +\q2 to those who remember to obey his precepts. +\q1 +\v 19 Yahweh has established his throne in the heavens. +\q2 His kingdom rules over all. +\q1 +\v 20 Praise Yahweh, you angels of his, +\q2 who are mighty in strength, who fulfill his word, +\q2 obeying the voice of his word. +\q1 +\v 21 Praise Yahweh, all you armies of his, +\q2 you servants of his, who do his pleasure. +\q1 +\v 22 Praise Yahweh, all you works of his, +\q2 in all places of his dominion. +\q2 Praise Yahweh, my soul! +\c 104 +\q1 +\v 1 Bless Yahweh, my soul. +\q2 Yahweh, my God, you are very great. +\q2 You are clothed with honor and majesty. +\q1 +\v 2 He covers himself with light as with a garment. +\q2 He stretches out the heavens like a curtain. +\q1 +\v 3 He lays the beams of his rooms in the waters. +\q2 He makes the clouds his chariot. +\q2 He walks on the wings of the wind. +\q1 +\v 4 He makes his messengers\f + \fr 104:4 \ft or, angels\f* winds, +\q2 and his servants flames of fire. +\q1 +\v 5 He laid the foundations of the earth, +\q2 that it should not be moved forever. +\q1 +\v 6 You covered it with the deep as with a cloak. +\q2 The waters stood above the mountains. +\q1 +\v 7 At your rebuke they fled. +\q2 At the voice of your thunder they hurried away. +\q1 +\v 8 The mountains rose, +\q2 the valleys sank down, +\q2 to the place which you had assigned to them. +\q1 +\v 9 You have set a boundary that they may not pass over, +\q2 that they don’t turn again to cover the earth. +\q1 +\v 10 He sends springs into the valleys. +\q2 They run among the mountains. +\q1 +\v 11 They give drink to every animal of the field. +\q2 The wild donkeys quench their thirst. +\q1 +\v 12 The birds of the sky nest by them. +\q2 They sing among the branches. +\q1 +\v 13 He waters the mountains from his rooms. +\q2 The earth is filled with the fruit of your works. +\q1 +\v 14 He causes the grass to grow for the livestock, +\q2 and plants for man to cultivate, +\q2 that he may produce food out of the earth: +\q1 +\v 15 wine that makes the heart of man glad, +\q2 oil to make his face to shine, +\q2 and bread that strengthens man’s heart. +\q1 +\v 16 Yahweh’s trees are well watered, +\q2 the cedars of Lebanon, which he has planted, +\q1 +\v 17 where the birds make their nests. +\q2 The stork makes its home in the cypress trees. +\q1 +\v 18 The high mountains are for the wild goats. +\q2 The rocks are a refuge for the rock badgers. +\q1 +\v 19 He appointed the moon for seasons. +\q2 The sun knows when to set. +\q1 +\v 20 You make darkness, and it is night, +\q2 in which all the animals of the forest prowl. +\q1 +\v 21 The young lions roar after their prey, +\q2 and seek their food from God. +\q1 +\v 22 The sun rises, and they steal away, +\q2 and lie down in their dens. +\q1 +\v 23 Man goes out to his work, +\q2 to his labor until the evening. +\q1 +\v 24 Yahweh, how many are your works! +\q2 In wisdom, you have made them all. +\q2 The earth is full of your riches. +\q1 +\v 25 There is the sea, great and wide, +\q2 in which are innumerable living things, +\q2 both small and large animals. +\q1 +\v 26 There the ships go, +\q2 and leviathan, whom you formed to play there. +\q1 +\v 27 These all wait for you, +\q2 that you may give them their food in due season. +\q1 +\v 28 You give to them; they gather. +\q2 You open your hand; they are satisfied with good. +\q1 +\v 29 You hide your face; they are troubled. +\q2 You take away their breath; they die and return to the dust. +\q1 +\v 30 You send out your Spirit and they are created. +\q2 You renew the face of the ground. +\q1 +\v 31 Let Yahweh’s glory endure forever. +\q2 Let Yahweh rejoice in his works. +\q1 +\v 32 He looks at the earth, and it trembles. +\q2 He touches the mountains, and they smoke. +\q1 +\v 33 I will sing to Yahweh as long as I live. +\q2 I will sing praise to my God while I have any being. +\q1 +\v 34 Let my meditation be sweet to him. +\q2 I will rejoice in Yahweh. +\q1 +\v 35 Let sinners be consumed out of the earth. +\q2 Let the wicked be no more. +\q2 Bless Yahweh, my soul. +\q2 Praise Yah! +\c 105 +\q1 +\v 1 Give thanks to Yahweh! Call on his name! +\q2 Make his doings known among the peoples. +\q1 +\v 2 Sing to him, sing praises to him! +\q2 Tell of all his marvelous works. +\q1 +\v 3 Glory in his holy name. +\q2 Let the heart of those who seek Yahweh rejoice. +\q1 +\v 4 Seek Yahweh and his strength. +\q2 Seek his face forever more. +\q1 +\v 5 Remember his marvelous works that he has done: +\q2 his wonders, and the judgments of his mouth, +\q1 +\v 6 you offspring of Abraham, his servant, +\q2 you children of Jacob, his chosen ones. +\q1 +\v 7 He is Yahweh, our God. +\q2 His judgments are in all the earth. +\q1 +\v 8 He has remembered his covenant forever, +\q2 the word which he commanded to a thousand generations, +\q1 +\v 9 the covenant which he made with Abraham, +\q2 his oath to Isaac, +\q1 +\v 10 and confirmed it to Jacob for a statute; +\q2 to Israel for an everlasting covenant, +\q1 +\v 11 saying, “To you I will give the land of Canaan, +\q2 the lot of your inheritance,” +\q1 +\v 12 when they were but a few men in number, +\q2 yes, very few, and foreigners in it. +\q1 +\v 13 They went about from nation to nation, +\q2 from one kingdom to another people. +\q1 +\v 14 He allowed no one to do them wrong. +\q2 Yes, he reproved kings for their sakes, +\q1 +\v 15 “Don’t touch my anointed ones! +\q2 Do my prophets no harm!” +\q1 +\v 16 He called for a famine on the land. +\q2 He destroyed the food supplies. +\q1 +\v 17 He sent a man before them. +\q2 Joseph was sold for a slave. +\q1 +\v 18 They bruised his feet with shackles. +\q2 His neck was locked in irons, +\q1 +\v 19 until the time that his word happened, +\q2 and Yahweh’s word proved him true. +\q1 +\v 20 The king sent and freed him, +\q2 even the ruler of peoples, and let him go free. +\q1 +\v 21 He made him lord of his house, +\q2 and ruler of all of his possessions, +\q1 +\v 22 to discipline his princes at his pleasure, +\q2 and to teach his elders wisdom. +\q1 +\v 23 Israel also came into Egypt. +\q2 Jacob lived in the land of Ham. +\q1 +\v 24 He increased his people greatly, +\q2 and made them stronger than their adversaries. +\q1 +\v 25 He turned their heart to hate his people, +\q2 to conspire against his servants. +\q1 +\v 26 He sent Moses, his servant, +\q2 and Aaron, whom he had chosen. +\q1 +\v 27 They performed miracles among them, +\q2 and wonders in the land of Ham. +\q1 +\v 28 He sent darkness, and made it dark. +\q2 They didn’t rebel against his words. +\q1 +\v 29 He turned their waters into blood, +\q2 and killed their fish. +\q1 +\v 30 Their land swarmed with frogs, +\q2 even in the rooms of their kings. +\q1 +\v 31 He spoke, and swarms of flies came, +\q2 and lice in all their borders. +\q1 +\v 32 He gave them hail for rain, +\q2 with lightning in their land. +\q1 +\v 33 He struck their vines and also their fig trees, +\q2 and shattered the trees of their country. +\q1 +\v 34 He spoke, and the locusts came +\q2 with the grasshoppers, without number. +\q1 +\v 35 They ate up every plant in their land, +\q2 and ate up the fruit of their ground. +\q1 +\v 36 He struck also all the firstborn in their land, +\q2 the first fruits of all their manhood. +\q1 +\v 37 He brought them out with silver and gold. +\q2 There was not one feeble person among his tribes. +\q1 +\v 38 Egypt was glad when they departed, +\q2 for the fear of them had fallen on them. +\q1 +\v 39 He spread a cloud for a covering, +\q2 fire to give light in the night. +\q1 +\v 40 They asked, and he brought quails, +\q2 and satisfied them with the bread of the sky. +\q1 +\v 41 He opened the rock, and waters gushed out. +\q2 They ran as a river in the dry places. +\q1 +\v 42 For he remembered his holy word, +\q2 and Abraham, his servant. +\q1 +\v 43 He brought his people out with joy, +\q2 his chosen with singing. +\q1 +\v 44 He gave them the lands of the nations. +\q2 They took the labor of the peoples in possession, +\q1 +\v 45 that they might keep his statutes, +\q2 and observe his laws. +\q2 Praise Yah! +\c 106 +\q1 +\v 1 Praise Yahweh! +\q2 Give thanks to Yahweh, for he is good, +\q2 for his loving kindness endures forever. +\q1 +\v 2 Who can utter the mighty acts of Yahweh, +\q2 or fully declare all his praise? +\q1 +\v 3 Blessed are those who keep justice. +\q2 Blessed is one who does what is right at all times. +\q1 +\v 4 Remember me, Yahweh, with the favor that you show to your people. +\q2 Visit me with your salvation, +\q1 +\v 5 that I may see the prosperity of your chosen, +\q2 that I may rejoice in the gladness of your nation, +\q2 that I may glory with your inheritance. +\b +\q1 +\v 6 We have sinned with our fathers. +\q2 We have committed iniquity. +\q2 We have done wickedly. +\q1 +\v 7 Our fathers didn’t understand your wonders in Egypt. +\q2 They didn’t remember the multitude of your loving kindnesses, +\q2 but were rebellious at the sea, even at the Red Sea. +\q1 +\v 8 Nevertheless he saved them for his name’s sake, +\q2 that he might make his mighty power known. +\q1 +\v 9 He rebuked the Red Sea also, and it was dried up; +\q2 so he led them through the depths, as through a desert. +\q1 +\v 10 He saved them from the hand of him who hated them, +\q2 and redeemed them from the hand of the enemy. +\q1 +\v 11 The waters covered their adversaries. +\q2 There was not one of them left. +\q1 +\v 12 Then they believed his words. +\q2 They sang his praise. +\b +\q1 +\v 13 They soon forgot his works. +\q2 They didn’t wait for his counsel, +\q2 +\v 14 but gave in to craving in the desert, +\q2 and tested God in the wasteland. +\q1 +\v 15 He gave them their request, +\q2 but sent leanness into their soul. +\q1 +\v 16 They envied Moses also in the camp, +\q2 and Aaron, Yahweh’s saint. +\q1 +\v 17 The earth opened and swallowed up Dathan, +\q2 and covered the company of Abiram. +\q1 +\v 18 A fire was kindled in their company. +\q2 The flame burned up the wicked. +\q1 +\v 19 They made a calf in Horeb, +\q2 and worshiped a molten image. +\q1 +\v 20 Thus they exchanged their glory +\q2 for an image of a bull that eats grass. +\q1 +\v 21 They forgot God, their Savior, +\q2 who had done great things in Egypt, +\q2 +\v 22 wondrous works in the land of Ham, +\q2 and awesome things by the Red Sea. +\q1 +\v 23 Therefore he said that he would destroy them, +\q2 had Moses, his chosen, not stood before him in the breach, +\q2 to turn away his wrath, so that he wouldn’t destroy them. +\q1 +\v 24 Yes, they despised the pleasant land. +\q2 They didn’t believe his word, +\q2 +\v 25 but murmured in their tents, +\q2 and didn’t listen to Yahweh’s voice. +\q1 +\v 26 Therefore he swore to them +\q2 that he would overthrow them in the wilderness, +\q2 +\v 27 that he would overthrow their offspring among the nations, +\q2 and scatter them in the lands. +\q1 +\v 28 They joined themselves also to Baal Peor, +\q2 and ate the sacrifices of the dead. +\q1 +\v 29 Thus they provoked him to anger with their deeds. +\q2 The plague broke in on them. +\q1 +\v 30 Then Phinehas stood up and executed judgment, +\q2 so the plague was stopped. +\q1 +\v 31 That was credited to him for righteousness, +\q2 for all generations to come. +\q1 +\v 32 They angered him also at the waters of Meribah, +\q2 so that Moses was troubled for their sakes; +\q1 +\v 33 because they were rebellious against his spirit, +\q2 he spoke rashly with his lips. +\q1 +\v 34 They didn’t destroy the peoples, +\q2 as Yahweh commanded them, +\q2 +\v 35 but mixed themselves with the nations, +\q2 and learned their works. +\q1 +\v 36 They served their idols, +\q2 which became a snare to them. +\q1 +\v 37 Yes, they sacrificed their sons and their daughters to demons. +\q2 +\v 38 They shed innocent blood, +\q2 even the blood of their sons and of their daughters, +\q2 whom they sacrificed to the idols of Canaan. +\q2 The land was polluted with blood. +\q1 +\v 39 Thus they were defiled with their works, +\q2 and prostituted themselves in their deeds. +\q1 +\v 40 Therefore Yahweh burned with anger against his people. +\q2 He abhorred his inheritance. +\q1 +\v 41 He gave them into the hand of the nations. +\q2 Those who hated them ruled over them. +\q1 +\v 42 Their enemies also oppressed them. +\q2 They were brought into subjection under their hand. +\q1 +\v 43 He rescued them many times, +\q2 but they were rebellious in their counsel, +\q2 and were brought low in their iniquity. +\q1 +\v 44 Nevertheless he regarded their distress, +\q2 when he heard their cry. +\q1 +\v 45 He remembered for them his covenant, +\q2 and repented according to the multitude of his loving kindnesses. +\q1 +\v 46 He made them also to be pitied +\q2 by all those who carried them captive. +\b +\q1 +\v 47 Save us, Yahweh, our God, +\q2 gather us from among the nations, +\q2 to give thanks to your holy name, +\q2 to triumph in your praise! +\b +\q1 +\v 48 Blessed be Yahweh, the God of Israel, +\q2 from everlasting even to everlasting! +\q1 Let all the people say, “Amen.” +\q2 Praise Yah! +\c 107 +\ms1 BOOK 5 +\q1 +\v 1 Give thanks to Yahweh,\f + \fr 107:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* for he is good, +\q2 for his loving kindness endures forever. +\q1 +\v 2 Let the redeemed by Yahweh say so, +\q2 whom he has redeemed from the hand of the adversary, +\q2 +\v 3 and gathered out of the lands, +\q2 from the east and from the west, +\q2 from the north and from the south. +\b +\q1 +\v 4 They wandered in the wilderness in a desert way. +\q2 They found no city to live in. +\q1 +\v 5 Hungry and thirsty, +\q2 their soul fainted in them. +\q1 +\v 6 Then they cried to Yahweh in their trouble, +\q2 and he delivered them out of their distresses. +\q1 +\v 7 He led them also by a straight way, +\q2 that they might go to a city to live in. +\q1 +\v 8 Let them praise Yahweh for his loving kindness, +\q2 for his wonderful deeds to the children of men! +\b +\q1 +\v 9 For he satisfies the longing soul. +\q2 He fills the hungry soul with good. +\b +\q1 +\v 10 Some sat in darkness and in the shadow of death, +\q2 being bound in affliction and iron, +\q2 +\v 11 because they rebelled against the words of God,\f + \fr 107:11 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q2 and condemned the counsel of the Most High. +\q1 +\v 12 Therefore he brought down their heart with labor. +\q2 They fell down, and there was no one to help. +\q1 +\v 13 Then they cried to Yahweh in their trouble, +\q2 and he saved them out of their distresses. +\q1 +\v 14 He brought them out of darkness and the shadow of death, +\q2 and broke away their chains. +\q1 +\v 15 Let them praise Yahweh for his loving kindness, +\q2 for his wonderful deeds to the children of men! +\b +\q1 +\v 16 For he has broken the gates of bronze, +\q2 and cut through bars of iron. +\b +\q1 +\v 17 Fools are afflicted because of their disobedience, +\q2 and because of their iniquities. +\q1 +\v 18 Their soul abhors all kinds of food. +\q2 They draw near to the gates of death. +\q1 +\v 19 Then they cry to Yahweh in their trouble, +\q2 and he saves them out of their distresses. +\q1 +\v 20 He sends his word, and heals them, +\q2 and delivers them from their graves. +\q1 +\v 21 Let them praise Yahweh for his loving kindness, +\q2 for his wonderful deeds to the children of men! +\b +\q1 +\v 22 Let them offer the sacrifices of thanksgiving, +\q2 and declare his deeds with singing. +\b +\q1 +\v 23 Those who go down to the sea in ships, +\q2 who do business in great waters, +\q2 +\v 24 these see Yahweh’s deeds, +\q2 and his wonders in the deep. +\q1 +\v 25 For he commands, and raises the stormy wind, +\q2 which lifts up its waves. +\q1 +\v 26 They mount up to the sky; they go down again to the depths. +\q2 Their soul melts away because of trouble. +\q1 +\v 27 They reel back and forth, and stagger like a drunken man, +\q2 and are at their wits’ end. +\q1 +\v 28 Then they cry to Yahweh in their trouble, +\q2 and he brings them out of their distress. +\q1 +\v 29 He makes the storm a calm, +\q2 so that its waves are still. +\q1 +\v 30 Then they are glad because it is calm, +\q2 so he brings them to their desired haven. +\q1 +\v 31 Let them praise Yahweh for his loving kindness, +\q2 for his wonderful deeds for the children of men! +\b +\q1 +\v 32 Let them exalt him also in the assembly of the people, +\q2 and praise him in the seat of the elders. +\b +\q1 +\v 33 He turns rivers into a desert, +\q2 water springs into a thirsty ground, +\q2 +\v 34 and a fruitful land into a salt waste, +\q2 for the wickedness of those who dwell in it. +\q1 +\v 35 He turns a desert into a pool of water, +\q2 and a dry land into water springs. +\q1 +\v 36 There he makes the hungry live, +\q2 that they may prepare a city to live in, +\q2 +\v 37 sow fields, plant vineyards, +\q2 and reap the fruits of increase. +\q1 +\v 38 He blesses them also, so that they are multiplied greatly. +\q2 He doesn’t allow their livestock to decrease. +\q1 +\v 39 Again, they are diminished and bowed down +\q2 through oppression, trouble, and sorrow. +\q1 +\v 40 He pours contempt on princes, +\q2 and causes them to wander in a trackless waste. +\q1 +\v 41 Yet he lifts the needy out of their affliction, +\q2 and increases their families like a flock. +\q1 +\v 42 The upright will see it, and be glad. +\q2 All the wicked will shut their mouths. +\q1 +\v 43 Whoever is wise will pay attention to these things. +\q2 They will consider the loving kindnesses of Yahweh. +\c 108 +\d A Song. A Psalm by David. +\q1 +\v 1 My heart is steadfast, God. +\q2 I will sing and I will make music with my soul. +\q1 +\v 2 Wake up, harp and lyre! +\q2 I will wake up the dawn. +\q1 +\v 3 I will give thanks to you, Yahweh, among the nations. +\q2 I will sing praises to you among the peoples. +\q1 +\v 4 For your loving kindness is great above the heavens. +\q2 Your faithfulness reaches to the skies. +\q1 +\v 5 Be exalted, God, above the heavens! +\q2 Let your glory be over all the earth. +\q1 +\v 6 That your beloved may be delivered, +\q2 save with your right hand, and answer us. +\q1 +\v 7 God has spoken from his sanctuary: “In triumph, +\q2 I will divide Shechem, and measure out the valley of Succoth. +\q1 +\v 8 Gilead is mine. Manasseh is mine. +\q2 Ephraim also is my helmet. +\q2 Judah is my scepter. +\q1 +\v 9 Moab is my wash pot. +\q2 I will toss my sandal on Edom. +\q2 I will shout over Philistia.” +\q1 +\v 10 Who will bring me into the fortified city? +\q2 Who will lead me to Edom? +\q1 +\v 11 Haven’t you rejected us, God? +\q2 You don’t go out, God, with our armies. +\q1 +\v 12 Give us help against the enemy, +\q2 for the help of man is vain. +\q1 +\v 13 Through God, we will do valiantly, +\q2 for it is he who will tread down our enemies. +\c 109 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 God of my praise, don’t remain silent, +\q2 +\v 2 for they have opened the mouth of the wicked and the mouth of deceit against me. +\q2 They have spoken to me with a lying tongue. +\q1 +\v 3 They have also surrounded me with words of hatred, +\q2 and fought against me without a cause. +\q1 +\v 4 In return for my love, they are my adversaries; +\q2 but I am in prayer. +\q1 +\v 5 They have rewarded me evil for good, +\q2 and hatred for my love. +\q1 +\v 6 Set a wicked man over him. +\q2 Let an adversary stand at his right hand. +\q1 +\v 7 When he is judged, let him come out guilty. +\q2 Let his prayer be turned into sin. +\q1 +\v 8 Let his days be few. +\q2 Let another take his office. +\q1 +\v 9 Let his children be fatherless, +\q2 and his wife a widow. +\q1 +\v 10 Let his children be wandering beggars. +\q2 Let them be sought from their ruins. +\q1 +\v 11 Let the creditor seize all that he has. +\q2 Let strangers plunder the fruit of his labor. +\q1 +\v 12 Let there be no one to extend kindness to him, +\q2 neither let there be anyone to have pity on his fatherless children. +\q1 +\v 13 Let his posterity be cut off. +\q2 In the generation following let their name be blotted out. +\q1 +\v 14 Let the iniquity of his fathers be remembered by Yahweh. +\q2 Don’t let the sin of his mother be blotted out. +\q1 +\v 15 Let them be before Yahweh continually, +\q2 that he may cut off their memory from the earth; +\q1 +\v 16 because he didn’t remember to show kindness, +\q2 but persecuted the poor and needy man, +\q2 the broken in heart, to kill them. +\q1 +\v 17 Yes, he loved cursing, and it came to him. +\q2 He didn’t delight in blessing, and it was far from him. +\q1 +\v 18 He clothed himself also with cursing as with his garment. +\q2 It came into his inward parts like water, +\q2 like oil into his bones. +\q1 +\v 19 Let it be to him as the clothing with which he covers himself, +\q2 for the belt that is always around him. +\q1 +\v 20 This is the reward of my adversaries from Yahweh, +\q2 of those who speak evil against my soul. +\b +\q1 +\v 21 But deal with me, Yahweh the Lord,\f + \fr 109:21 \ft The word translated “Lord” is “Adonai.”\f* for your name’s sake, +\q2 because your loving kindness is good, deliver me; +\q2 +\v 22 for I am poor and needy. +\q2 My heart is wounded within me. +\q1 +\v 23 I fade away like an evening shadow. +\q2 I am shaken off like a locust. +\q1 +\v 24 My knees are weak through fasting. +\q2 My body is thin and lacks fat. +\q1 +\v 25 I have also become a reproach to them. +\q2 When they see me, they shake their head. +\q1 +\v 26 Help me, Yahweh, my God. +\q2 Save me according to your loving kindness; +\q1 +\v 27 that they may know that this is your hand; +\q2 that you, Yahweh, have done it. +\q1 +\v 28 They may curse, but you bless. +\q2 When they arise, they will be shamed, +\q2 but your servant shall rejoice. +\q1 +\v 29 Let my adversaries be clothed with dishonor. +\q2 Let them cover themselves with their own shame as with a robe. +\q1 +\v 30 I will give great thanks to Yahweh with my mouth. +\q2 Yes, I will praise him among the multitude. +\q1 +\v 31 For he will stand at the right hand of the needy, +\q2 to save him from those who judge his soul. +\c 110 +\d A Psalm by David. +\q1 +\v 1 Yahweh says to my Lord, “Sit at my right hand, +\q2 until I make your enemies your footstool for your feet.” +\q1 +\v 2 Yahweh will send out the rod of your strength out of Zion. +\q2 Rule among your enemies. +\q1 +\v 3 Your people offer themselves willingly in the day of your power, in holy array. +\q2 Out of the womb of the morning, you have the dew of your youth. +\q1 +\v 4 Yahweh has sworn, and will not change his mind: +\q2 “You are a priest forever in the order of Melchizedek.” +\q1 +\v 5 The Lord is at your right hand. +\q2 He will crush kings in the day of his wrath. +\q1 +\v 6 He will judge among the nations. +\q2 He will heap up dead bodies. +\q2 He will crush the ruler of the whole earth. +\q1 +\v 7 He will drink of the brook on the way; +\q2 therefore he will lift up his head. +\c 111 +\q1 +\v 1 Praise Yah!\f + \fr 111:1 \ft Psalm 111 is an acrostic poem, with each verse after the initial “Praise Yah!” starting with a letter of the alphabet (ordered from Alef to Tav).\f* +\q2 I will give thanks to Yahweh with my whole heart, +\q2 in the council of the upright, and in the congregation. +\q1 +\v 2 Yahweh’s works are great, +\q2 pondered by all those who delight in them. +\q1 +\v 3 His work is honor and majesty. +\q2 His righteousness endures forever. +\q1 +\v 4 He has caused his wonderful works to be remembered. +\q2 Yahweh is gracious and merciful. +\q1 +\v 5 He has given food to those who fear him. +\q2 He always remembers his covenant. +\q1 +\v 6 He has shown his people the power of his works, +\q2 in giving them the heritage of the nations. +\q1 +\v 7 The works of his hands are truth and justice. +\q2 All his precepts are sure. +\q1 +\v 8 They are established forever and ever. +\q2 They are done in truth and uprightness. +\q1 +\v 9 He has sent redemption to his people. +\q2 He has ordained his covenant forever. +\q2 His name is holy and awesome! +\q1 +\v 10 The fear of Yahweh is the beginning of wisdom. +\q2 All those who do his work have a good understanding. +\q1 His praise endures forever! +\c 112 +\q1 +\v 1 Praise Yah!\f + \fr 112:1 \ft Psalm 112 is an acrostic poem, with each verse after the initial “Praise Yah!” starting with a letter of the alphabet (ordered from Alef to Tav).\f* +\q2 Blessed is the man who fears Yahweh, +\q2 who delights greatly in his commandments. +\q1 +\v 2 His offspring will be mighty in the land. +\q2 The generation of the upright will be blessed. +\q1 +\v 3 Wealth and riches are in his house. +\q2 His righteousness endures forever. +\q1 +\v 4 Light dawns in the darkness for the upright, +\q2 gracious, merciful, and righteous. +\q1 +\v 5 It is well with the man who deals graciously and lends. +\q2 He will maintain his cause in judgment. +\q1 +\v 6 For he will never be shaken. +\q2 The righteous will be remembered forever. +\q1 +\v 7 He will not be afraid of evil news. +\q2 His heart is steadfast, trusting in Yahweh. +\q1 +\v 8 His heart is established. +\q2 He will not be afraid in the end when he sees his adversaries. +\q1 +\v 9 He has dispersed, he has given to the poor. +\q2 His righteousness endures forever. +\q2 His horn will be exalted with honor. +\q1 +\v 10 The wicked will see it, and be grieved. +\q2 He shall gnash with his teeth, and melt away. +\q2 The desire of the wicked will perish. +\c 113 +\q1 +\v 1 Praise Yah! +\q2 Praise, you servants of Yahweh, +\q2 praise Yahweh’s name. +\q1 +\v 2 Blessed be Yahweh’s name, +\q2 from this time forward and forever more. +\q1 +\v 3 From the rising of the sun to its going down, +\q2 Yahweh’s name is to be praised. +\q1 +\v 4 Yahweh is high above all nations, +\q2 his glory above the heavens. +\q1 +\v 5 Who is like Yahweh, our God, +\q2 who has his seat on high, +\q2 +\v 6 who stoops down to see in heaven and in the earth? +\q1 +\v 7 He raises up the poor out of the dust, +\q2 and lifts up the needy from the ash heap, +\q1 +\v 8 that he may set him with princes, +\q2 even with the princes of his people. +\q1 +\v 9 He settles the barren woman in her home +\q2 as a joyful mother of children. +\q1 Praise Yah! +\c 114 +\q1 +\v 1 When Israel went out of Egypt, +\q2 the house of Jacob from a people of foreign language, +\q1 +\v 2 Judah became his sanctuary, +\q2 Israel his dominion. +\q1 +\v 3 The sea saw it, and fled. +\q2 The Jordan was driven back. +\q1 +\v 4 The mountains skipped like rams, +\q2 the little hills like lambs. +\q1 +\v 5 What was it, you sea, that you fled? +\q2 You Jordan, that you turned back? +\q1 +\v 6 You mountains, that you skipped like rams? +\q2 You little hills, like lambs? +\q1 +\v 7 Tremble, you earth, at the presence of the Lord, +\q2 at the presence of the God of Jacob, +\q1 +\v 8 who turned the rock into a pool of water, +\q2 the flint into a spring of waters. +\c 115 +\q1 +\v 1 Not to us, Yahweh, not to us, +\q2 but to your name give glory, +\q2 for your loving kindness, and for your truth’s sake. +\q1 +\v 2 Why should the nations say, +\q2 “Where is their God, now?” +\q1 +\v 3 But our God is in the heavens. +\q2 He does whatever he pleases. +\q1 +\v 4 Their idols are silver and gold, +\q2 the work of men’s hands. +\q1 +\v 5 They have mouths, but they don’t speak. +\q2 They have eyes, but they don’t see. +\q1 +\v 6 They have ears, but they don’t hear. +\q2 They have noses, but they don’t smell. +\q1 +\v 7 They have hands, but they don’t feel. +\q2 They have feet, but they don’t walk, +\q2 neither do they speak through their throat. +\q1 +\v 8 Those who make them will be like them; +\q2 yes, everyone who trusts in them. +\q1 +\v 9 Israel, trust in Yahweh! +\q2 He is their help and their shield. +\q1 +\v 10 House of Aaron, trust in Yahweh! +\q2 He is their help and their shield. +\q1 +\v 11 You who fear Yahweh, trust in Yahweh! +\q2 He is their help and their shield. +\q1 +\v 12 Yahweh remembers us. He will bless us. +\q2 He will bless the house of Israel. +\q2 He will bless the house of Aaron. +\q1 +\v 13 He will bless those who fear Yahweh, +\q2 both small and great. +\q1 +\v 14 May Yahweh increase you more and more, +\q2 you and your children. +\q1 +\v 15 Blessed are you by Yahweh, +\q2 who made heaven and earth. +\q1 +\v 16 The heavens are Yahweh’s heavens, +\q2 but he has given the earth to the children of men. +\q1 +\v 17 The dead don’t praise Yah, +\q2 nor any who go down into silence, +\q1 +\v 18 but we will bless Yah, +\q2 from this time forward and forever more. +\q1 Praise Yah! +\c 116 +\q1 +\v 1 I love Yahweh, because he listens to my voice, +\q2 and my cries for mercy. +\q1 +\v 2 Because he has turned his ear to me, +\q2 therefore I will call on him as long as I live. +\q1 +\v 3 The cords of death surrounded me, +\q2 the pains of Sheol\f + \fr 116:3 \ft Sheol is the place of the dead.\f* got a hold of me. +\q2 I found trouble and sorrow. +\q1 +\v 4 Then I called on Yahweh’s name: +\q2 “Yahweh, I beg you, deliver my soul.” +\q1 +\v 5 Yahweh is gracious and righteous. +\q2 Yes, our God is merciful. +\q1 +\v 6 Yahweh preserves the simple. +\q2 I was brought low, and he saved me. +\q1 +\v 7 Return to your rest, my soul, +\q2 for Yahweh has dealt bountifully with you. +\q1 +\v 8 For you have delivered my soul from death, +\q2 my eyes from tears, +\q2 and my feet from falling. +\q1 +\v 9 I will walk before Yahweh in the land of the living. +\q1 +\v 10 I believed, therefore I said, +\q2 “I was greatly afflicted.” +\q1 +\v 11 I said in my haste, +\q2 “All people are liars.” +\q1 +\v 12 What will I give to Yahweh for all his benefits toward me? +\q2 +\v 13 I will take the cup of salvation, and call on Yahweh’s name. +\q1 +\v 14 I will pay my vows to Yahweh, +\q2 yes, in the presence of all his people. +\q1 +\v 15 Precious in Yahweh’s sight is the death of his saints. +\q1 +\v 16 Yahweh, truly I am your servant. +\q2 I am your servant, the son of your servant girl. +\q2 You have freed me from my chains. +\q1 +\v 17 I will offer to you the sacrifice of thanksgiving, +\q2 and will call on Yahweh’s name. +\q1 +\v 18 I will pay my vows to Yahweh, +\q2 yes, in the presence of all his people, +\q1 +\v 19 in the courts of Yahweh’s house, +\q2 in the middle of you, Jerusalem. +\q1 Praise Yah! +\c 117 +\q1 +\v 1 Praise Yahweh, all you nations! +\q2 Extol him, all you peoples! +\q1 +\v 2 For his loving kindness is great toward us. +\q2 Yahweh’s faithfulness endures forever. +\q1 Praise Yah! +\c 118 +\q1 +\v 1 Give thanks to Yahweh, for he is good, +\q2 for his loving kindness endures forever. +\q1 +\v 2 Let Israel now say +\q2 that his loving kindness endures forever. +\q1 +\v 3 Let the house of Aaron now say +\q2 that his loving kindness endures forever. +\q1 +\v 4 Now let those who fear Yahweh say +\q2 that his loving kindness endures forever. +\q1 +\v 5 Out of my distress, I called on Yah. +\q2 Yah answered me with freedom. +\q1 +\v 6 Yahweh is on my side. I will not be afraid. +\q2 What can man do to me? +\q1 +\v 7 Yahweh is on my side among those who help me. +\q2 Therefore I will look in triumph at those who hate me. +\q1 +\v 8 It is better to take refuge in Yahweh, +\q2 than to put confidence in man. +\q1 +\v 9 It is better to take refuge in Yahweh, +\q2 than to put confidence in princes. +\q1 +\v 10 All the nations surrounded me, +\q2 but in Yahweh’s name I cut them off. +\q1 +\v 11 They surrounded me, yes, they surrounded me. +\q2 In Yahweh’s name I indeed cut them off. +\q1 +\v 12 They surrounded me like bees. +\q2 They are quenched like the burning thorns. +\q2 In Yahweh’s name I cut them off. +\q1 +\v 13 You pushed me back hard, to make me fall, +\q2 but Yahweh helped me. +\q1 +\v 14 Yah is my strength and song. +\q2 He has become my salvation. +\q1 +\v 15 The voice of rejoicing and salvation is in the tents of the righteous. +\q2 “The right hand of Yahweh does valiantly. +\q1 +\v 16 The right hand of Yahweh is exalted! +\q2 The right hand of Yahweh does valiantly!” +\q1 +\v 17 I will not die, but live, +\q2 and declare Yah’s works. +\q1 +\v 18 Yah has punished me severely, +\q2 but he has not given me over to death. +\q1 +\v 19 Open to me the gates of righteousness. +\q2 I will enter into them. +\q2 I will give thanks to Yah. +\q1 +\v 20 This is the gate of Yahweh; +\q2 the righteous will enter into it. +\q1 +\v 21 I will give thanks to you, for you have answered me, +\q2 and have become my salvation. +\q1 +\v 22 The stone which the builders rejected +\q2 has become the cornerstone.\f + \fr 118:22 \ft Literally, \fqa head of the corner\f* +\q1 +\v 23 This is Yahweh’s doing. +\q2 It is marvelous in our eyes. +\q1 +\v 24 This is the day that Yahweh has made. +\q2 We will rejoice and be glad in it! +\q1 +\v 25 Save us now, we beg you, Yahweh! +\q2 Yahweh, we beg you, send prosperity now. +\q1 +\v 26 Blessed is he who comes in Yahweh’s name! +\q2 We have blessed you out of Yahweh’s house. +\q1 +\v 27 Yahweh is God, and he has given us light. +\q2 Bind the sacrifice with cords, even to the horns of the altar. +\q1 +\v 28 You are my God, and I will give thanks to you. +\q2 You are my God, I will exalt you. +\q1 +\v 29 Oh give thanks to Yahweh, for he is good, +\q2 for his loving kindness endures forever. +\c 119 +\d ALEPH +\q1 +\v 1 Blessed are those whose ways are blameless, +\q2 who walk according to Yahweh’s law. +\q1 +\v 2 Blessed are those who keep his statutes, +\q2 who seek him with their whole heart. +\q1 +\v 3 Yes, they do nothing wrong. +\q2 They walk in his ways. +\q1 +\v 4 You have commanded your precepts, +\q2 that we should fully obey them. +\q1 +\v 5 Oh that my ways were steadfast +\q2 to obey your statutes! +\q1 +\v 6 Then I wouldn’t be disappointed, +\q2 when I consider all of your commandments. +\q1 +\v 7 I will give thanks to you with uprightness of heart, +\q2 when I learn your righteous judgments. +\q1 +\v 8 I will observe your statutes. +\q2 Don’t utterly forsake me. +\d BETH +\q1 +\v 9 How can a young man keep his way pure? +\q2 By living according to your word. +\q1 +\v 10 With my whole heart I have sought you. +\q2 Don’t let me wander from your commandments. +\q1 +\v 11 I have hidden your word in my heart, +\q2 that I might not sin against you. +\q1 +\v 12 Blessed are you, Yahweh. +\q2 Teach me your statutes. +\q1 +\v 13 With my lips, +\q2 I have declared all the ordinances of your mouth. +\q1 +\v 14 I have rejoiced in the way of your testimonies, +\q2 as much as in all riches. +\q1 +\v 15 I will meditate on your precepts, +\q2 and consider your ways. +\q1 +\v 16 I will delight myself in your statutes. +\q2 I will not forget your word. +\d GIMEL +\q1 +\v 17 Do good to your servant. +\q2 I will live and I will obey your word. +\q1 +\v 18 Open my eyes, +\q2 that I may see wondrous things out of your law. +\q1 +\v 19 I am a stranger on the earth. +\q2 Don’t hide your commandments from me. +\q1 +\v 20 My soul is consumed with longing for your ordinances at all times. +\q1 +\v 21 You have rebuked the proud who are cursed, +\q2 who wander from your commandments. +\q1 +\v 22 Take reproach and contempt away from me, +\q2 for I have kept your statutes. +\q1 +\v 23 Though princes sit and slander me, +\q2 your servant will meditate on your statutes. +\q1 +\v 24 Indeed your statutes are my delight, +\q2 and my counselors. +\d DALETH +\q1 +\v 25 My soul is laid low in the dust. +\q2 Revive me according to your word! +\q1 +\v 26 I declared my ways, and you answered me. +\q2 Teach me your statutes. +\q1 +\v 27 Let me understand the teaching of your precepts! +\q2 Then I will meditate on your wondrous works. +\q1 +\v 28 My soul is weary with sorrow; +\q2 strengthen me according to your word. +\q1 +\v 29 Keep me from the way of deceit. +\q2 Grant me your law graciously! +\q1 +\v 30 I have chosen the way of truth. +\q2 I have set your ordinances before me. +\q1 +\v 31 I cling to your statutes, Yahweh. +\q2 Don’t let me be disappointed. +\q1 +\v 32 I run in the path of your commandments, +\q2 for you have set my heart free. +\d HE +\q1 +\v 33 Teach me, Yahweh, the way of your statutes. +\q2 I will keep them to the end. +\q1 +\v 34 Give me understanding, and I will keep your law. +\q2 Yes, I will obey it with my whole heart. +\q1 +\v 35 Direct me in the path of your commandments, +\q2 for I delight in them. +\q1 +\v 36 Turn my heart toward your statutes, +\q2 not toward selfish gain. +\q1 +\v 37 Turn my eyes away from looking at worthless things. +\q2 Revive me in your ways. +\q1 +\v 38 Fulfill your promise to your servant, +\q2 that you may be feared. +\q1 +\v 39 Take away my disgrace that I dread, +\q2 for your ordinances are good. +\q1 +\v 40 Behold, I long for your precepts! +\q2 Revive me in your righteousness. +\d VAV +\q1 +\v 41 Let your loving kindness also come to me, Yahweh, +\q2 your salvation, according to your word. +\q1 +\v 42 So I will have an answer for him who reproaches me, +\q2 for I trust in your word. +\q1 +\v 43 Don’t snatch the word of truth out of my mouth, +\q2 for I put my hope in your ordinances. +\q1 +\v 44 So I will obey your law continually, +\q2 forever and ever. +\q1 +\v 45 I will walk in liberty, +\q2 for I have sought your precepts. +\q1 +\v 46 I will also speak of your statutes before kings, +\q2 and will not be disappointed. +\q1 +\v 47 I will delight myself in your commandments, +\q2 because I love them. +\q1 +\v 48 I reach out my hands for your commandments, which I love. +\q2 I will meditate on your statutes. +\d ZAYIN +\q1 +\v 49 Remember your word to your servant, +\q2 because you gave me hope. +\q1 +\v 50 This is my comfort in my affliction, +\q2 for your word has revived me. +\q1 +\v 51 The arrogant mock me excessively, +\q2 but I don’t swerve from your law. +\q1 +\v 52 I remember your ordinances of old, Yahweh, +\q2 and have comforted myself. +\q1 +\v 53 Indignation has taken hold on me, +\q2 because of the wicked who forsake your law. +\q1 +\v 54 Your statutes have been my songs +\q2 in the house where I live. +\q1 +\v 55 I have remembered your name, Yahweh, in the night, +\q2 and I obey your law. +\q1 +\v 56 This is my way, +\q2 that I keep your precepts. +\d HETH +\q1 +\v 57 Yahweh is my portion. +\q2 I promised to obey your words. +\q1 +\v 58 I sought your favor with my whole heart. +\q2 Be merciful to me according to your word. +\q1 +\v 59 I considered my ways, +\q2 and turned my steps to your statutes. +\q1 +\v 60 I will hurry, and not delay, +\q2 to obey your commandments. +\q1 +\v 61 The ropes of the wicked bind me, +\q2 but I won’t forget your law. +\q1 +\v 62 At midnight I will rise to give thanks to you, +\q2 because of your righteous ordinances. +\q1 +\v 63 I am a friend of all those who fear you, +\q2 of those who observe your precepts. +\q1 +\v 64 The earth is full of your loving kindness, Yahweh. +\q2 Teach me your statutes. +\d TETH +\q1 +\v 65 You have treated your servant well, +\q2 according to your word, Yahweh. +\q1 +\v 66 Teach me good judgment and knowledge, +\q2 for I believe in your commandments. +\q1 +\v 67 Before I was afflicted, I went astray; +\q2 but now I observe your word. +\q1 +\v 68 You are good, and do good. +\q2 Teach me your statutes. +\q1 +\v 69 The proud have smeared a lie upon me. +\q2 With my whole heart, I will keep your precepts. +\q1 +\v 70 Their heart is as callous as the fat, +\q2 but I delight in your law. +\q1 +\v 71 It is good for me that I have been afflicted, +\q2 that I may learn your statutes. +\q1 +\v 72 The law of your mouth is better to me than thousands of pieces of gold and silver. +\d YODH +\q1 +\v 73 Your hands have made me and formed me. +\q2 Give me understanding, that I may learn your commandments. +\q1 +\v 74 Those who fear you will see me and be glad, +\q2 because I have put my hope in your word. +\q1 +\v 75 Yahweh, I know that your judgments are righteous, +\q2 that in faithfulness you have afflicted me. +\q1 +\v 76 Please let your loving kindness be for my comfort, +\q2 according to your word to your servant. +\q1 +\v 77 Let your tender mercies come to me, that I may live; +\q2 for your law is my delight. +\q1 +\v 78 Let the proud be disappointed, for they have overthrown me wrongfully. +\q2 I will meditate on your precepts. +\q1 +\v 79 Let those who fear you turn to me. +\q2 They will know your statutes. +\q1 +\v 80 Let my heart be blameless toward your decrees, +\q2 that I may not be disappointed. +\d KAPF +\q1 +\v 81 My soul faints for your salvation. +\q2 I hope in your word. +\q1 +\v 82 My eyes fail for your word. +\q2 I say, “When will you comfort me?” +\q1 +\v 83 For I have become like a wineskin in the smoke. +\q2 I don’t forget your statutes. +\q1 +\v 84 How many are the days of your servant? +\q2 When will you execute judgment on those who persecute me? +\q1 +\v 85 The proud have dug pits for me, +\q2 contrary to your law. +\q1 +\v 86 All of your commandments are faithful. +\q2 They persecute me wrongfully. +\q2 Help me! +\q1 +\v 87 They had almost wiped me from the earth, +\q2 but I didn’t forsake your precepts. +\q1 +\v 88 Preserve my life according to your loving kindness, +\q2 so I will obey the statutes of your mouth. +\d LAMEDH +\q1 +\v 89 Yahweh, your word is settled in heaven forever. +\q1 +\v 90 Your faithfulness is to all generations. +\q2 You have established the earth, and it remains. +\q1 +\v 91 Your laws remain to this day, +\q2 for all things serve you. +\q1 +\v 92 Unless your law had been my delight, +\q2 I would have perished in my affliction. +\q1 +\v 93 I will never forget your precepts, +\q2 for with them, you have revived me. +\q1 +\v 94 I am yours. +\q2 Save me, for I have sought your precepts. +\q1 +\v 95 The wicked have waited for me, to destroy me. +\q2 I will consider your statutes. +\q1 +\v 96 I have seen a limit to all perfection, +\q2 but your commands are boundless. +\d MEM +\q1 +\v 97 How I love your law! +\q2 It is my meditation all day. +\q1 +\v 98 Your commandments make me wiser than my enemies, +\q2 for your commandments are always with me. +\q1 +\v 99 I have more understanding than all my teachers, +\q2 for your testimonies are my meditation. +\q1 +\v 100 I understand more than the aged, +\q2 because I have kept your precepts. +\q1 +\v 101 I have kept my feet from every evil way, +\q2 that I might observe your word. +\q1 +\v 102 I have not turned away from your ordinances, +\q2 for you have taught me. +\q1 +\v 103 How sweet are your promises to my taste, +\q2 more than honey to my mouth! +\q1 +\v 104 Through your precepts, I get understanding; +\q2 therefore I hate every false way. +\d NUN +\q1 +\v 105 Your word is a lamp to my feet, +\q2 and a light for my path. +\q1 +\v 106 I have sworn, and have confirmed it, +\q2 that I will obey your righteous ordinances. +\q1 +\v 107 I am afflicted very much. +\q2 Revive me, Yahweh, according to your word. +\q1 +\v 108 Accept, I beg you, the willing offerings of my mouth. +\q2 Yahweh, teach me your ordinances. +\q1 +\v 109 My soul is continually in my hand, +\q2 yet I won’t forget your law. +\q1 +\v 110 The wicked have laid a snare for me, +\q2 yet I haven’t gone astray from your precepts. +\q1 +\v 111 I have taken your testimonies as a heritage forever, +\q2 for they are the joy of my heart. +\q1 +\v 112 I have set my heart to perform your statutes forever, +\q2 even to the end. +\d SAMEKH +\q1 +\v 113 I hate double-minded men, +\q2 but I love your law. +\q1 +\v 114 You are my hiding place and my shield. +\q2 I hope in your word. +\q1 +\v 115 Depart from me, you evildoers, +\q2 that I may keep the commandments of my God. +\q1 +\v 116 Uphold me according to your word, that I may live. +\q2 Let me not be ashamed of my hope. +\q1 +\v 117 Hold me up, and I will be safe, +\q2 and will have respect for your statutes continually. +\q1 +\v 118 You reject all those who stray from your statutes, +\q2 for their deceit is in vain. +\q1 +\v 119 You put away all the wicked of the earth like dross. +\q2 Therefore I love your testimonies. +\q1 +\v 120 My flesh trembles for fear of you. +\q2 I am afraid of your judgments. +\d AYIN +\q1 +\v 121 I have done what is just and righteous. +\q2 Don’t leave me to my oppressors. +\q1 +\v 122 Ensure your servant’s well-being. +\q2 Don’t let the proud oppress me. +\q1 +\v 123 My eyes fail looking for your salvation, +\q2 for your righteous word. +\q1 +\v 124 Deal with your servant according to your loving kindness. +\q2 Teach me your statutes. +\q1 +\v 125 I am your servant. Give me understanding, +\q2 that I may know your testimonies. +\q1 +\v 126 It is time to act, Yahweh, +\q2 for they break your law. +\q1 +\v 127 Therefore I love your commandments more than gold, +\q2 yes, more than pure gold. +\q1 +\v 128 Therefore I consider all of your precepts to be right. +\q2 I hate every false way. +\d PE +\q1 +\v 129 Your testimonies are wonderful, +\q2 therefore my soul keeps them. +\q1 +\v 130 The entrance of your words gives light. +\q2 It gives understanding to the simple. +\q1 +\v 131 I opened my mouth wide and panted, +\q2 for I longed for your commandments. +\q1 +\v 132 Turn to me, and have mercy on me, +\q2 as you always do to those who love your name. +\q1 +\v 133 Establish my footsteps in your word. +\q2 Don’t let any iniquity have dominion over me. +\q1 +\v 134 Redeem me from the oppression of man, +\q2 so I will observe your precepts. +\q1 +\v 135 Make your face shine on your servant. +\q2 Teach me your statutes. +\q1 +\v 136 Streams of tears run down my eyes, +\q2 because they don’t observe your law. +\d TZADHE +\q1 +\v 137 You are righteous, Yahweh. +\q2 Your judgments are upright. +\q1 +\v 138 You have commanded your statutes in righteousness. +\q2 They are fully trustworthy. +\q1 +\v 139 My zeal wears me out, +\q2 because my enemies ignore your words. +\q1 +\v 140 Your promises have been thoroughly tested, +\q2 and your servant loves them. +\q1 +\v 141 I am small and despised. +\q2 I don’t forget your precepts. +\q1 +\v 142 Your righteousness is an everlasting righteousness. +\q2 Your law is truth. +\q1 +\v 143 Trouble and anguish have taken hold of me. +\q2 Your commandments are my delight. +\q1 +\v 144 Your testimonies are righteous forever. +\q2 Give me understanding, that I may live. +\d QOPH +\q1 +\v 145 I have called with my whole heart. +\q2 Answer me, Yahweh! +\q2 I will keep your statutes. +\q1 +\v 146 I have called to you. Save me! +\q2 I will obey your statutes. +\q1 +\v 147 I rise before dawn and cry for help. +\q2 I put my hope in your words. +\q1 +\v 148 My eyes stay open through the night watches, +\q2 that I might meditate on your word. +\q1 +\v 149 Hear my voice according to your loving kindness. +\q2 Revive me, Yahweh, according to your ordinances. +\q1 +\v 150 They draw near who follow after wickedness. +\q2 They are far from your law. +\q1 +\v 151 You are near, Yahweh. +\q2 All your commandments are truth. +\q1 +\v 152 Of old I have known from your testimonies, +\q2 that you have founded them forever. +\d RESH +\q1 +\v 153 Consider my affliction, and deliver me, +\q2 for I don’t forget your law. +\q1 +\v 154 Plead my cause, and redeem me! +\q2 Revive me according to your promise. +\q1 +\v 155 Salvation is far from the wicked, +\q2 for they don’t seek your statutes. +\q1 +\v 156 Great are your tender mercies, Yahweh. +\q2 Revive me according to your ordinances. +\q1 +\v 157 Many are my persecutors and my adversaries. +\q2 I haven’t swerved from your testimonies. +\q1 +\v 158 I look at the faithless with loathing, +\q2 because they don’t observe your word. +\q1 +\v 159 Consider how I love your precepts. +\q2 Revive me, Yahweh, according to your loving kindness. +\q1 +\v 160 All of your words are truth. +\q2 Every one of your righteous ordinances endures forever. +\d SIN AND SHIN +\q1 +\v 161 Princes have persecuted me without a cause, +\q2 but my heart stands in awe of your words. +\q1 +\v 162 I rejoice at your word, +\q2 as one who finds great plunder. +\q1 +\v 163 I hate and abhor falsehood. +\q2 I love your law. +\q1 +\v 164 Seven times a day, I praise you, +\q2 because of your righteous ordinances. +\q1 +\v 165 Those who love your law have great peace. +\q2 Nothing causes them to stumble. +\q1 +\v 166 I have hoped for your salvation, Yahweh. +\q2 I have done your commandments. +\q1 +\v 167 My soul has observed your testimonies. +\q2 I love them exceedingly. +\q1 +\v 168 I have obeyed your precepts and your testimonies, +\q2 for all my ways are before you. +\d TAV +\q1 +\v 169 Let my cry come before you, Yahweh. +\q2 Give me understanding according to your word. +\q1 +\v 170 Let my supplication come before you. +\q2 Deliver me according to your word. +\q1 +\v 171 Let my lips utter praise, +\q2 for you teach me your statutes. +\q1 +\v 172 Let my tongue sing of your word, +\q2 for all your commandments are righteousness. +\q1 +\v 173 Let your hand be ready to help me, +\q2 for I have chosen your precepts. +\q1 +\v 174 I have longed for your salvation, Yahweh. +\q2 Your law is my delight. +\q1 +\v 175 Let my soul live, that I may praise you. +\q2 Let your ordinances help me. +\q1 +\v 176 I have gone astray like a lost sheep. +\q2 Seek your servant, for I don’t forget your commandments. +\c 120 +\d A Song of Ascents. +\q1 +\v 1 In my distress, I cried to Yahweh. +\q2 He answered me. +\q1 +\v 2 Deliver my soul, Yahweh, from lying lips, +\q2 from a deceitful tongue. +\q1 +\v 3 What will be given to you, and what will be done more to you, +\q2 you deceitful tongue? +\q1 +\v 4 Sharp arrows of the mighty, +\q2 with coals of juniper. +\q1 +\v 5 Woe is me, that I live in Meshech, +\q2 that I dwell among the tents of Kedar! +\q1 +\v 6 My soul has had her dwelling too long +\q2 with him who hates peace. +\q1 +\v 7 I am for peace, +\q2 but when I speak, they are for war. +\c 121 +\d A Song of Ascents. +\q1 +\v 1 I will lift up my eyes to the hills. +\q2 Where does my help come from? +\q1 +\v 2 My help comes from Yahweh, +\q2 who made heaven and earth. +\b +\q1 +\v 3 He will not allow your foot to be moved. +\q2 He who keeps you will not slumber. +\q1 +\v 4 Behold, he who keeps Israel +\q2 will neither slumber nor sleep. +\q1 +\v 5 Yahweh is your keeper. +\q2 Yahweh is your shade on your right hand. +\q1 +\v 6 The sun will not harm you by day, +\q2 nor the moon by night. +\q1 +\v 7 Yahweh will keep you from all evil. +\q2 He will keep your soul. +\q1 +\v 8 Yahweh will keep your going out and your coming in, +\q2 from this time forward, and forever more. +\c 122 +\d A Song of Ascents. By David. +\q1 +\v 1 I was glad when they said to me, +\q2 “Let’s go to Yahweh’s house!” +\q1 +\v 2 Our feet are standing within your gates, Jerusalem! +\q2 +\v 3 Jerusalem is built as a city that is compact together, +\q1 +\v 4 where the tribes go up, even Yah’s tribes, +\q2 according to an ordinance for Israel, +\q2 to give thanks to Yahweh’s name. +\q1 +\v 5 For there are set thrones for judgment, +\q2 the thrones of David’s house. +\q1 +\v 6 Pray for the peace of Jerusalem. +\q2 Those who love you will prosper. +\q1 +\v 7 Peace be within your walls, +\q2 and prosperity within your palaces. +\q1 +\v 8 For my brothers’ and companions’ sakes, +\q2 I will now say, “Peace be within you.” +\q1 +\v 9 For the sake of the house of Yahweh our God, +\q2 I will seek your good. +\c 123 +\d A Song of Ascents. +\q1 +\v 1 I lift up my eyes to you, +\q2 you who sit in the heavens. +\q1 +\v 2 Behold, as the eyes of servants look to the hand of their master, +\q2 as the eyes of a maid to the hand of her mistress, +\q2 so our eyes look to Yahweh, our God, +\q2 until he has mercy on us. +\q1 +\v 3 Have mercy on us, Yahweh, have mercy on us, +\q2 for we have endured much contempt. +\q1 +\v 4 Our soul is exceedingly filled with the scoffing of those who are at ease, +\q2 with the contempt of the proud. +\c 124 +\d A Song of Ascents. By David. +\q1 +\v 1 If it had not been Yahweh who was on our side, +\q2 let Israel now say, +\q1 +\v 2 if it had not been Yahweh who was on our side, +\q2 when men rose up against us, +\q1 +\v 3 then they would have swallowed us up alive, +\q2 when their wrath was kindled against us, +\q1 +\v 4 then the waters would have overwhelmed us, +\q2 the stream would have gone over our soul. +\q1 +\v 5 Then the proud waters would have gone over our soul. +\q1 +\v 6 Blessed be Yahweh, +\q2 who has not given us as a prey to their teeth. +\q1 +\v 7 Our soul has escaped like a bird out of the fowler’s snare. +\q2 The snare is broken, and we have escaped. +\q1 +\v 8 Our help is in Yahweh’s name, +\q2 who made heaven and earth. +\c 125 +\d A Song of Ascents. +\q1 +\v 1 Those who trust in Yahweh are as Mount Zion, +\q2 which can’t be moved, but remains forever. +\q1 +\v 2 As the mountains surround Jerusalem, +\q2 so Yahweh surrounds his people from this time forward and forever more. +\q1 +\v 3 For the scepter of wickedness won’t remain over the allotment of the righteous, +\q2 so that the righteous won’t use their hands to do evil. +\q1 +\v 4 Do good, Yahweh, to those who are good, +\q2 to those who are upright in their hearts. +\q1 +\v 5 But as for those who turn away to their crooked ways, +\q2 Yahweh will lead them away with the workers of iniquity. +\q1 Peace be on Israel. +\c 126 +\d A Song of Ascents. +\q1 +\v 1 When Yahweh brought back those who returned to Zion, +\q2 we were like those who dream. +\q1 +\v 2 Then our mouth was filled with laughter, +\q2 and our tongue with singing. +\q1 Then they said among the nations, +\q2 “Yahweh has done great things for them.” +\q1 +\v 3 Yahweh has done great things for us, +\q2 and we are glad. +\q1 +\v 4 Restore our fortunes again, Yahweh, +\q2 like the streams in the Negev. +\q1 +\v 5 Those who sow in tears will reap in joy. +\q2 +\v 6 He who goes out weeping, carrying seed for sowing, +\q2 will certainly come again with joy, carrying his sheaves. +\c 127 +\d A Song of Ascents. By Solomon. +\q1 +\v 1 Unless Yahweh builds the house, +\q2 they who build it labor in vain. +\q1 Unless Yahweh watches over the city, +\q2 the watchman guards it in vain. +\q1 +\v 2 It is vain for you to rise up early, +\q2 to stay up late, +\q2 eating the bread of toil, +\q2 for he gives sleep to his loved ones. +\q1 +\v 3 Behold, children are a heritage of Yahweh. +\q2 The fruit of the womb is his reward. +\q1 +\v 4 As arrows in the hand of a mighty man, +\q2 so are the children of youth. +\q1 +\v 5 Happy is the man who has his quiver full of them. +\q2 They won’t be disappointed when they speak with their enemies in the gate. +\c 128 +\d A Song of Ascents. +\q1 +\v 1 Blessed is everyone who fears Yahweh, +\q2 who walks in his ways. +\q1 +\v 2 For you will eat the labor of your hands. +\q2 You will be happy, and it will be well with you. +\q1 +\v 3 Your wife will be as a fruitful vine in the innermost parts of your house, +\q2 your children like olive shoots around your table. +\q1 +\v 4 Behold, this is how the man who fears Yahweh is blessed. +\q2 +\v 5 May Yahweh bless you out of Zion, +\q2 and may you see the good of Jerusalem all the days of your life. +\q1 +\v 6 Yes, may you see your children’s children. +\q2 Peace be upon Israel. +\c 129 +\d A Song of Ascents. +\q1 +\v 1 Many times they have afflicted me from my youth up. +\q2 Let Israel now say: +\q1 +\v 2 many times they have afflicted me from my youth up, +\q2 yet they have not prevailed against me. +\q1 +\v 3 The plowers plowed on my back. +\q2 They made their furrows long. +\q1 +\v 4 Yahweh is righteous. +\q2 He has cut apart the cords of the wicked. +\q1 +\v 5 Let them be disappointed and turned backward, +\q2 all those who hate Zion. +\q1 +\v 6 Let them be as the grass on the housetops, +\q2 which withers before it grows up, +\q1 +\v 7 with which the reaper doesn’t fill his hand, +\q2 nor he who binds sheaves, his bosom. +\q1 +\v 8 Neither do those who go by say, +\q2 “The blessing of Yahweh be on you. +\q2 We bless you in Yahweh’s name.” +\c 130 +\d A Song of Ascents. +\q1 +\v 1 Out of the depths I have cried to you, Yahweh. +\q1 +\v 2 Lord, hear my voice. +\q2 Let your ears be attentive to the voice of my petitions. +\q1 +\v 3 If you, Yah, kept a record of sins, +\q2 Lord, who could stand? +\q1 +\v 4 But there is forgiveness with you, +\q2 therefore you are feared. +\q1 +\v 5 I wait for Yahweh. +\q2 My soul waits. +\q2 I hope in his word. +\q1 +\v 6 My soul longs for the Lord more than watchmen long for the morning, +\q2 more than watchmen for the morning. +\q1 +\v 7 Israel, hope in Yahweh, +\q2 for there is loving kindness with Yahweh. +\q2 Abundant redemption is with him. +\q1 +\v 8 He will redeem Israel from all their sins. +\c 131 +\d A Song of Ascents. By David. +\q1 +\v 1 Yahweh, my heart isn’t arrogant, nor my eyes lofty; +\q2 nor do I concern myself with great matters, +\q2 or things too wonderful for me. +\q1 +\v 2 Surely I have stilled and quieted my soul, +\q2 like a weaned child with his mother, +\q2 like a weaned child is my soul within me. +\q1 +\v 3 Israel, hope in Yahweh, +\q2 from this time forward and forever more. +\c 132 +\d A Song of Ascents. +\q1 +\v 1 Yahweh, remember David and all his affliction, +\q1 +\v 2 how he swore to Yahweh, +\q2 and vowed to the Mighty One of Jacob: +\q1 +\v 3 “Surely I will not come into the structure of my house, +\q2 nor go up into my bed; +\q1 +\v 4 I will not give sleep to my eyes, +\q2 or slumber to my eyelids, +\q1 +\v 5 until I find out a place for Yahweh, +\q2 a dwelling for the Mighty One of Jacob.” +\q1 +\v 6 Behold, we heard of it in Ephrathah. +\q2 We found it in the field of Jaar. +\q1 +\v 7 “We will go into his dwelling place. +\q2 We will worship at his footstool.” +\q1 +\v 8 Arise, Yahweh, into your resting place, +\q2 you, and the ark of your strength. +\q1 +\v 9 Let your priests be clothed with righteousness. +\q2 Let your saints shout for joy! +\q1 +\v 10 For your servant David’s sake, +\q2 don’t turn away the face of your anointed one. +\q1 +\v 11 Yahweh has sworn to David in truth. +\q2 He will not turn from it: +\q2 “I will set the fruit of your body on your throne. +\q1 +\v 12 If your children will keep my covenant, +\q2 my testimony that I will teach them, +\q2 their children also will sit on your throne forever more.” +\q1 +\v 13 For Yahweh has chosen Zion. +\q2 He has desired it for his habitation. +\q1 +\v 14 “This is my resting place forever. +\q2 I will live here, for I have desired it. +\q1 +\v 15 I will abundantly bless her provision. +\q2 I will satisfy her poor with bread. +\q1 +\v 16 I will also clothe her priests with salvation. +\q2 Her saints will shout aloud for joy. +\q1 +\v 17 I will make the horn of David to bud there. +\q2 I have ordained a lamp for my anointed. +\q1 +\v 18 I will clothe his enemies with shame, +\q2 but on himself, his crown will shine.” +\c 133 +\d A Song of Ascents. By David. +\q1 +\v 1 See how good and how pleasant it is +\q2 for brothers to live together in unity! +\q1 +\v 2 It is like the precious oil on the head, +\q2 that ran down on the beard, +\q2 even Aaron’s beard, +\q2 that came down on the edge of his robes, +\q1 +\v 3 like the dew of Hermon, +\q2 that comes down on the hills of Zion; +\q2 for there Yahweh gives the blessing, +\q2 even life forever more. +\c 134 +\d A Song of Ascents. +\q1 +\v 1 Look! Praise Yahweh, all you servants of Yahweh, +\q2 who stand by night in Yahweh’s house! +\q1 +\v 2 Lift up your hands in the sanctuary. +\q2 Praise Yahweh! +\q1 +\v 3 May Yahweh bless you from Zion, +\q2 even he who made heaven and earth. +\c 135 +\q1 +\v 1 Praise Yah! +\q2 Praise Yahweh’s name! +\q2 Praise him, you servants of Yahweh, +\q1 +\v 2 you who stand in Yahweh’s house, +\q2 in the courts of our God’s house. +\q1 +\v 3 Praise Yah, for Yahweh is good. +\q2 Sing praises to his name, for that is pleasant. +\q1 +\v 4 For Yah has chosen Jacob for himself, +\q2 Israel for his own possession. +\q1 +\v 5 For I know that Yahweh is great, +\q2 that our Lord is above all gods. +\q1 +\v 6 Whatever Yahweh pleased, that he has done, +\q2 in heaven and in earth, in the seas and in all deeps. +\q1 +\v 7 He causes the clouds to rise from the ends of the earth. +\q2 He makes lightnings with the rain. +\q2 He brings the wind out of his treasuries. +\q1 +\v 8 He struck the firstborn of Egypt, +\q2 both of man and animal. +\q1 +\v 9 He sent signs and wonders into the middle of you, Egypt, +\q2 on Pharaoh, and on all his servants. +\q1 +\v 10 He struck many nations, +\q2 and killed mighty kings— +\q1 +\v 11 Sihon king of the Amorites, +\q2 Og king of Bashan, +\q2 and all the kingdoms of Canaan— +\q1 +\v 12 and gave their land for a heritage, +\q2 a heritage to Israel, his people. +\q1 +\v 13 Your name, Yahweh, endures forever; +\q2 your renown, Yahweh, throughout all generations. +\q1 +\v 14 For Yahweh will judge his people +\q2 and have compassion on his servants. +\b +\q1 +\v 15 The idols of the nations are silver and gold, +\q2 the work of men’s hands. +\q1 +\v 16 They have mouths, but they can’t speak. +\q2 They have eyes, but they can’t see. +\q1 +\v 17 They have ears, but they can’t hear, +\q2 neither is there any breath in their mouths. +\q1 +\v 18 Those who make them will be like them, +\q2 yes, everyone who trusts in them. +\q1 +\v 19 House of Israel, praise Yahweh! +\q2 House of Aaron, praise Yahweh! +\q1 +\v 20 House of Levi, praise Yahweh! +\q2 You who fear Yahweh, praise Yahweh! +\q1 +\v 21 Blessed be Yahweh from Zion, +\q2 who dwells in Jerusalem. +\q1 Praise Yah! +\c 136 +\q1 +\v 1 Give thanks to Yahweh, for he is good, +\q2 for his loving kindness endures forever. +\q1 +\v 2 Give thanks to the God of gods, +\q2 for his loving kindness endures forever. +\q1 +\v 3 Give thanks to the Lord of lords, +\q2 for his loving kindness endures forever; +\q1 +\v 4 to him who alone does great wonders, +\q2 for his loving kindness endures forever; +\q1 +\v 5 to him who by understanding made the heavens, +\q2 for his loving kindness endures forever; +\q1 +\v 6 to him who spread out the earth above the waters, +\q2 for his loving kindness endures forever; +\q1 +\v 7 to him who made the great lights, +\q2 for his loving kindness endures forever; +\q1 +\v 8 the sun to rule by day, +\q2 for his loving kindness endures forever; +\q1 +\v 9 the moon and stars to rule by night, +\q2 for his loving kindness endures forever; +\q1 +\v 10 to him who struck down the Egyptian firstborn, +\q2 for his loving kindness endures forever; +\q1 +\v 11 and brought out Israel from among them, +\q2 for his loving kindness endures forever; +\q1 +\v 12 with a strong hand, and with an outstretched arm, +\q2 for his loving kindness endures forever; +\q1 +\v 13 to him who divided the Red Sea apart, +\q2 for his loving kindness endures forever; +\q1 +\v 14 and made Israel to pass through the middle of it, +\q2 for his loving kindness endures forever; +\q1 +\v 15 but overthrew Pharaoh and his army in the Red Sea, +\q2 for his loving kindness endures forever; +\q1 +\v 16 to him who led his people through the wilderness, +\q2 for his loving kindness endures forever; +\q1 +\v 17 to him who struck great kings, +\q2 for his loving kindness endures forever; +\q1 +\v 18 and killed mighty kings, +\q2 for his loving kindness endures forever; +\q1 +\v 19 Sihon king of the Amorites, +\q2 for his loving kindness endures forever; +\q1 +\v 20 Og king of Bashan, +\q2 for his loving kindness endures forever; +\q1 +\v 21 and gave their land as an inheritance, +\q2 for his loving kindness endures forever; +\q1 +\v 22 even a heritage to Israel his servant, +\q2 for his loving kindness endures forever; +\q1 +\v 23 who remembered us in our low estate, +\q2 for his loving kindness endures forever; +\q1 +\v 24 and has delivered us from our adversaries, +\q2 for his loving kindness endures forever; +\q1 +\v 25 who gives food to every creature, +\q2 for his loving kindness endures forever. +\q1 +\v 26 Oh give thanks to the God of heaven, +\q2 for his loving kindness endures forever. +\c 137 +\q1 +\v 1 By the rivers of Babylon, there we sat down. +\q2 Yes, we wept, when we remembered Zion. +\q1 +\v 2 On the willows in that land, +\q2 we hung up our harps. +\q1 +\v 3 For there, those who led us captive asked us for songs. +\q2 Those who tormented us demanded songs of joy: +\q2 “Sing us one of the songs of Zion!” +\q1 +\v 4 How can we sing Yahweh’s song in a foreign land? +\q1 +\v 5 If I forget you, Jerusalem, +\q2 let my right hand forget its skill. +\q1 +\v 6 Let my tongue stick to the roof of my mouth if I don’t remember you, +\q2 if I don’t prefer Jerusalem above my chief joy. +\q1 +\v 7 Remember, Yahweh, against the children of Edom in the day of Jerusalem, +\q2 who said, “Raze it! +\q2 Raze it even to its foundation!” +\q1 +\v 8 Daughter of Babylon, doomed to destruction, +\q2 he will be happy who repays you, +\q2 as you have done to us. +\q1 +\v 9 Happy shall he be, +\q2 who takes and dashes your little ones against the rock. +\c 138 +\d By David. +\q1 +\v 1 I will give you thanks with my whole heart. +\q2 Before the gods,\f + \fr 138:1 \ft The word elohim, used here, usually means “God” but can also mean “gods”, “princes”, or “angels”.\f* I will sing praises to you. +\q1 +\v 2 I will bow down toward your holy temple, +\q2 and give thanks to your Name for your loving kindness and for your truth; +\q2 for you have exalted your Name and your Word above all. +\q1 +\v 3 In the day that I called, you answered me. +\q2 You encouraged me with strength in my soul. +\q1 +\v 4 All the kings of the earth will give you thanks, Yahweh, +\q2 for they have heard the words of your mouth. +\q1 +\v 5 Yes, they will sing of the ways of Yahweh, +\q2 for Yahweh’s glory is great! +\q1 +\v 6 For though Yahweh is high, yet he looks after the lowly; +\q2 but he knows the proud from afar. +\q1 +\v 7 Though I walk in the middle of trouble, you will revive me. +\q2 You will stretch out your hand against the wrath of my enemies. +\q2 Your right hand will save me. +\q1 +\v 8 Yahweh will fulfill that which concerns me. +\q2 Your loving kindness, Yahweh, endures forever. +\q2 Don’t forsake the works of your own hands. +\c 139 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 Yahweh, you have searched me, +\q2 and you know me. +\q1 +\v 2 You know my sitting down and my rising up. +\q2 You perceive my thoughts from afar. +\q1 +\v 3 You search out my path and my lying down, +\q2 and are acquainted with all my ways. +\q1 +\v 4 For there is not a word on my tongue, +\q2 but behold, Yahweh, you know it altogether. +\q1 +\v 5 You hem me in behind and before. +\q2 You laid your hand on me. +\q1 +\v 6 This knowledge is beyond me. +\q2 It’s lofty. +\q2 I can’t attain it. +\q1 +\v 7 Where could I go from your Spirit? +\q2 Or where could I flee from your presence? +\q1 +\v 8 If I ascend up into heaven, you are there. +\q2 If I make my bed in Sheol,\f + \fr 139:8 \ft Sheol is the place of the dead.\f* behold, you are there! +\q1 +\v 9 If I take the wings of the dawn, +\q2 and settle in the uttermost parts of the sea, +\q1 +\v 10 even there your hand will lead me, +\q2 and your right hand will hold me. +\q1 +\v 11 If I say, “Surely the darkness will overwhelm me. +\q2 The light around me will be night,” +\q1 +\v 12 even the darkness doesn’t hide from you, +\q2 but the night shines as the day. +\q2 The darkness is like light to you. +\q1 +\v 13 For you formed my inmost being. +\q2 You knit me together in my mother’s womb. +\q1 +\v 14 I will give thanks to you, +\q2 for I am fearfully and wonderfully made. +\q1 Your works are wonderful. +\q2 My soul knows that very well. +\q1 +\v 15 My frame wasn’t hidden from you, +\q2 when I was made in secret, +\q2 woven together in the depths of the earth. +\q1 +\v 16 Your eyes saw my body. +\q2 In your book they were all written, +\q2 the days that were ordained for me, +\q2 when as yet there were none of them. +\q1 +\v 17 How precious to me are your thoughts, God! +\q2 How vast is their sum! +\q1 +\v 18 If I would count them, they are more in number than the sand. +\q2 When I wake up, I am still with you. +\q1 +\v 19 If only you, God, would kill the wicked. +\q2 Get away from me, you bloodthirsty men! +\q1 +\v 20 For they speak against you wickedly. +\q2 Your enemies take your name in vain. +\q1 +\v 21 Yahweh, don’t I hate those who hate you? +\q2 Am I not grieved with those who rise up against you? +\q1 +\v 22 I hate them with perfect hatred. +\q2 They have become my enemies. +\q1 +\v 23 Search me, God, and know my heart. +\q2 Try me, and know my thoughts. +\q1 +\v 24 See if there is any wicked way in me, +\q2 and lead me in the everlasting way. +\c 140 +\d For the Chief Musician. A Psalm by David. +\q1 +\v 1 Deliver me, Yahweh, from evil men. +\q2 Preserve me from violent men: +\q1 +\v 2 those who devise mischief in their hearts. +\q2 They continually gather themselves together for war. +\q1 +\v 3 They have sharpened their tongues like a serpent. +\q2 Viper’s poison is under their lips. \qs Selah.\qs* +\q1 +\v 4 Yahweh, keep me from the hands of the wicked. +\q2 Preserve me from the violent men who have determined to trip my feet. +\q1 +\v 5 The proud have hidden a snare for me, +\q2 they have spread the cords of a net by the path. +\q2 They have set traps for me. \qs Selah.\qs* +\q1 +\v 6 I said to Yahweh, “You are my God.” +\q2 Listen to the cry of my petitions, Yahweh. +\q1 +\v 7 Yahweh, the Lord, the strength of my salvation, +\q2 you have covered my head in the day of battle. +\q1 +\v 8 Yahweh, don’t grant the desires of the wicked. +\q2 Don’t let their evil plans succeed, or they will become proud. \qs Selah.\qs* +\q1 +\v 9 As for the head of those who surround me, +\q2 let the mischief of their own lips cover them. +\q1 +\v 10 Let burning coals fall on them. +\q2 Let them be thrown into the fire, +\q2 into miry pits, from where they never rise. +\q1 +\v 11 An evil speaker won’t be established in the earth. +\q2 Evil will hunt the violent man to overthrow him. +\q1 +\v 12 I know that Yahweh will maintain the cause of the afflicted, +\q2 and justice for the needy. +\q1 +\v 13 Surely the righteous will give thanks to your name. +\q2 The upright will dwell in your presence. +\c 141 +\d A Psalm by David. +\q1 +\v 1 Yahweh, I have called on you. +\q2 Come to me quickly! +\q2 Listen to my voice when I call to you. +\q1 +\v 2 Let my prayer be set before you like incense; +\q2 the lifting up of my hands like the evening sacrifice. +\q1 +\v 3 Set a watch, Yahweh, before my mouth. +\q2 Keep the door of my lips. +\q1 +\v 4 Don’t incline my heart to any evil thing, +\q2 to practice deeds of wickedness with men who work iniquity. +\q2 Don’t let me eat of their delicacies. +\q1 +\v 5 Let the righteous strike me, it is kindness; +\q2 let him reprove me, it is like oil on the head; +\q2 don’t let my head refuse it; +\q2 Yet my prayer is always against evil deeds. +\q1 +\v 6 Their judges are thrown down by the sides of the rock. +\q2 They will hear my words, for they are well spoken. +\q1 +\v 7 “As when one plows and breaks up the earth, +\q2 our bones are scattered at the mouth of Sheol.”\f + \fr 141:7 \ft Sheol is the place of the dead.\f* +\q1 +\v 8 For my eyes are on you, Yahweh, the Lord. +\q2 I take refuge in you. +\q2 Don’t leave my soul destitute. +\q1 +\v 9 Keep me from the snare which they have laid for me, +\q2 from the traps of the workers of iniquity. +\q1 +\v 10 Let the wicked fall together into their own nets +\q2 while I pass by. +\c 142 +\d A contemplation by David, when he was in the cave. A Prayer. +\q1 +\v 1 I cry with my voice to Yahweh. +\q2 With my voice, I ask Yahweh for mercy. +\q1 +\v 2 I pour out my complaint before him. +\q2 I tell him my troubles. +\q1 +\v 3 When my spirit was overwhelmed within me, +\q2 you knew my route. +\q1 On the path in which I walk, +\q2 they have hidden a snare for me. +\q1 +\v 4 Look on my right, and see; +\q2 for there is no one who is concerned for me. +\q2 Refuge has fled from me. +\q2 No one cares for my soul. +\q1 +\v 5 I cried to you, Yahweh. +\q2 I said, “You are my refuge, +\q2 my portion in the land of the living.” +\q1 +\v 6 Listen to my cry, +\q2 for I am in desperate need. +\q1 Deliver me from my persecutors, +\q2 for they are too strong for me. +\q1 +\v 7 Bring my soul out of prison, +\q2 that I may give thanks to your name. +\q1 The righteous will surround me, +\q2 for you will be good to me. +\c 143 +\d A Psalm by David. +\q1 +\v 1 Hear my prayer, Yahweh. +\q2 Listen to my petitions. +\q2 In your faithfulness and righteousness, relieve me. +\q1 +\v 2 Don’t enter into judgment with your servant, +\q2 for in your sight no man living is righteous. +\q1 +\v 3 For the enemy pursues my soul. +\q2 He has struck my life down to the ground. +\q2 He has made me live in dark places, as those who have been long dead. +\q1 +\v 4 Therefore my spirit is overwhelmed within me. +\q2 My heart within me is desolate. +\q1 +\v 5 I remember the days of old. +\q2 I meditate on all your doings. +\q2 I contemplate the work of your hands. +\q1 +\v 6 I spread out my hands to you. +\q2 My soul thirsts for you, like a parched land. \qs Selah.\qs* +\q1 +\v 7 Hurry to answer me, Yahweh. +\q2 My spirit fails. +\q1 Don’t hide your face from me, +\q2 so that I don’t become like those who go down into the pit. +\q1 +\v 8 Cause me to hear your loving kindness in the morning, +\q2 for I trust in you. +\q1 Cause me to know the way in which I should walk, +\q2 for I lift up my soul to you. +\q1 +\v 9 Deliver me, Yahweh, from my enemies. +\q2 I flee to you to hide me. +\q1 +\v 10 Teach me to do your will, +\q2 for you are my God. +\q1 Your Spirit is good. +\q2 Lead me in the land of uprightness. +\q1 +\v 11 Revive me, Yahweh, for your name’s sake. +\q2 In your righteousness, bring my soul out of trouble. +\q1 +\v 12 In your loving kindness, cut off my enemies, +\q2 and destroy all those who afflict my soul, +\q2 for I am your servant. +\c 144 +\d By David. +\q1 +\v 1 Blessed be Yahweh, my rock, +\q2 who trains my hands to war, +\q2 and my fingers to battle— +\q1 +\v 2 my loving kindness, my fortress, +\q2 my high tower, my deliverer, +\q2 my shield, and he in whom I take refuge, +\q2 who subdues my people under me. +\q1 +\v 3 Yahweh, what is man, that you care for him? +\q2 Or the son of man, that you think of him? +\q1 +\v 4 Man is like a breath. +\q2 His days are like a shadow that passes away. +\q1 +\v 5 Part your heavens, Yahweh, and come down. +\q2 Touch the mountains, and they will smoke. +\q1 +\v 6 Throw out lightning, and scatter them. +\q2 Send out your arrows, and rout them. +\q1 +\v 7 Stretch out your hand from above, +\q2 rescue me, and deliver me out of great waters, +\q2 out of the hands of foreigners, +\q2 +\v 8 whose mouths speak deceit, +\q2 whose right hand is a right hand of falsehood. +\q1 +\v 9 I will sing a new song to you, God. +\q2 On a ten-stringed lyre, I will sing praises to you. +\q1 +\v 10 You are he who gives salvation to kings, +\q2 who rescues David, his servant, from the deadly sword. +\q1 +\v 11 Rescue me, and deliver me out of the hands of foreigners, +\q2 whose mouths speak deceit, +\q2 whose right hand is a right hand of falsehood. +\b +\q1 +\v 12 Then our sons will be like well-nurtured plants, +\q2 our daughters like pillars carved to adorn a palace. +\q1 +\v 13 Our barns are full, filled with all kinds of provision. +\q2 Our sheep produce thousands and ten thousands in our fields. +\q1 +\v 14 Our oxen will pull heavy loads. +\q2 There is no breaking in, and no going away, +\q2 and no outcry in our streets. +\q1 +\v 15 Happy are the people who are in such a situation. +\q2 Happy are the people whose God is Yahweh. +\c 145 +\d A praise psalm by David.\f + \fr 145:0 \ft This is an acrostic psalm, with every verse (including the second half of verse 13) starting with a consecutive letter of the Hebrew alphabet.\f* +\q1 +\v 1 I will exalt you, my God, the King. +\q2 I will praise your name forever and ever. +\q1 +\v 2 Every day I will praise you. +\q2 I will extol your name forever and ever. +\q1 +\v 3 Great is Yahweh, and greatly to be praised! +\q2 His greatness is unsearchable. +\q1 +\v 4 One generation will commend your works to another, +\q2 and will declare your mighty acts. +\q1 +\v 5 I will meditate on the glorious majesty of your honor, +\q2 on your wondrous works. +\q1 +\v 6 Men will speak of the might of your awesome acts. +\q2 I will declare your greatness. +\q1 +\v 7 They will utter the memory of your great goodness, +\q2 and will sing of your righteousness. +\q1 +\v 8 Yahweh is gracious, merciful, +\q2 slow to anger, and of great loving kindness. +\q1 +\v 9 Yahweh is good to all. +\q2 His tender mercies are over all his works. +\q1 +\v 10 All your works will give thanks to you, Yahweh. +\q2 Your saints will extol you. +\q1 +\v 11 They will speak of the glory of your kingdom, +\q2 and talk about your power, +\q1 +\v 12 to make known to the sons of men his mighty acts, +\q2 the glory of the majesty of his kingdom. +\q1 +\v 13 Your kingdom is an everlasting kingdom. +\q2 Your dominion endures throughout all generations. +\q1 Yahweh is faithful in all his words, +\q2 and loving in all his deeds.\f + \fr 145:13 \ft Some manuscripts omit these last two lines.\f* +\q1 +\v 14 Yahweh upholds all who fall, +\q2 and raises up all those who are bowed down. +\q1 +\v 15 The eyes of all wait for you. +\q2 You give them their food in due season. +\q1 +\v 16 You open your hand, +\q2 and satisfy the desire of every living thing. +\q1 +\v 17 Yahweh is righteous in all his ways, +\q2 and gracious in all his works. +\q1 +\v 18 Yahweh is near to all those who call on him, +\q2 to all who call on him in truth. +\q1 +\v 19 He will fulfill the desire of those who fear him. +\q2 He also will hear their cry, and will save them. +\q1 +\v 20 Yahweh preserves all those who love him, +\q2 but he will destroy all the wicked. +\q1 +\v 21 My mouth will speak the praise of Yahweh. +\q2 Let all flesh bless his holy name forever and ever. +\b +\c 146 +\q1 +\v 1 Praise Yah! +\q2 Praise Yahweh, my soul. +\q1 +\v 2 While I live, I will praise Yahweh. +\q2 I will sing praises to my God as long as I exist. +\q1 +\v 3 Don’t put your trust in princes, +\q2 in a son of man in whom there is no help. +\q1 +\v 4 His spirit departs, and he returns to the earth. +\q2 In that very day, his thoughts perish. +\q1 +\v 5 Happy is he who has the God of Jacob for his help, +\q2 whose hope is in Yahweh, his God, +\q1 +\v 6 who made heaven and earth, +\q2 the sea, and all that is in them; +\q2 who keeps truth forever; +\q1 +\v 7 who executes justice for the oppressed; +\q2 who gives food to the hungry. +\q1 Yahweh frees the prisoners. +\q2 +\v 8 Yahweh opens the eyes of the blind. +\q2 Yahweh raises up those who are bowed down. +\q2 Yahweh loves the righteous. +\q1 +\v 9 Yahweh preserves the foreigners. +\q2 He upholds the fatherless and widow, +\q2 but he turns the way of the wicked upside down. +\q1 +\v 10 Yahweh will reign forever; +\q2 your God, O Zion, to all generations. +\q1 Praise Yah! +\b +\c 147 +\q1 +\v 1 Praise Yah, +\q2 for it is good to sing praises to our God; +\q2 for it is pleasant and fitting to praise him. +\q1 +\v 2 Yahweh builds up Jerusalem. +\q2 He gathers together the outcasts of Israel. +\q1 +\v 3 He heals the broken in heart, +\q2 and binds up their wounds. +\q1 +\v 4 He counts the number of the stars. +\q2 He calls them all by their names. +\q1 +\v 5 Great is our Lord, and mighty in power. +\q2 His understanding is infinite. +\q1 +\v 6 Yahweh upholds the humble. +\q2 He brings the wicked down to the ground. +\q1 +\v 7 Sing to Yahweh with thanksgiving. +\q2 Sing praises on the harp to our God, +\q1 +\v 8 who covers the sky with clouds, +\q2 who prepares rain for the earth, +\q2 who makes grass grow on the mountains. +\q1 +\v 9 He provides food for the livestock, +\q2 and for the young ravens when they call. +\q1 +\v 10 He doesn’t delight in the strength of the horse. +\q2 He takes no pleasure in the legs of a man. +\q1 +\v 11 Yahweh takes pleasure in those who fear him, +\q2 in those who hope in his loving kindness. +\q1 +\v 12 Praise Yahweh, Jerusalem! +\q2 Praise your God, Zion! +\q1 +\v 13 For he has strengthened the bars of your gates. +\q2 He has blessed your children within you. +\q1 +\v 14 He makes peace in your borders. +\q2 He fills you with the finest of the wheat. +\q1 +\v 15 He sends out his commandment to the earth. +\q2 His word runs very swiftly. +\q1 +\v 16 He gives snow like wool, +\q2 and scatters frost like ashes. +\q1 +\v 17 He hurls down his hail like pebbles. +\q2 Who can stand before his cold? +\q1 +\v 18 He sends out his word, and melts them. +\q2 He causes his wind to blow, and the waters flow. +\q1 +\v 19 He shows his word to Jacob, +\q2 his statutes and his ordinances to Israel. +\q1 +\v 20 He has not done this for just any nation. +\q2 They don’t know his ordinances. +\q1 Praise Yah! +\b +\c 148 +\q1 +\v 1 Praise Yah! +\q2 Praise Yahweh from the heavens! +\q2 Praise him in the heights! +\q1 +\v 2 Praise him, all his angels! +\q2 Praise him, all his army! +\q1 +\v 3 Praise him, sun and moon! +\q2 Praise him, all you shining stars! +\q1 +\v 4 Praise him, you heavens of heavens, +\q2 you waters that are above the heavens. +\q1 +\v 5 Let them praise Yahweh’s name, +\q2 for he commanded, and they were created. +\q1 +\v 6 He has also established them forever and ever. +\q2 He has made a decree which will not pass away. +\q1 +\v 7 Praise Yahweh from the earth, +\q2 you great sea creatures, and all depths, +\q1 +\v 8 lightning and hail, snow and clouds, +\q2 stormy wind, fulfilling his word, +\q1 +\v 9 mountains and all hills, +\q2 fruit trees and all cedars, +\q1 +\v 10 wild animals and all livestock, +\q2 small creatures and flying birds, +\q1 +\v 11 kings of the earth and all peoples, +\q2 princes and all judges of the earth, +\q1 +\v 12 both young men and maidens, +\q2 old men and children. +\q1 +\v 13 Let them praise Yahweh’s name, +\q2 for his name alone is exalted. +\q2 His glory is above the earth and the heavens. +\q1 +\v 14 He has lifted up the horn of his people, +\q2 the praise of all his saints, +\q2 even of the children of Israel, a people near to him. +\q1 Praise Yah! +\b +\c 149 +\q1 +\v 1 Praise Yahweh! +\q2 Sing to Yahweh a new song, +\q2 his praise in the assembly of the saints. +\q1 +\v 2 Let Israel rejoice in him who made them. +\q2 Let the children of Zion be joyful in their King. +\q1 +\v 3 Let them praise his name in the dance! +\q2 Let them sing praises to him with tambourine and harp! +\q1 +\v 4 For Yahweh takes pleasure in his people. +\q2 He crowns the humble with salvation. +\q1 +\v 5 Let the saints rejoice in honor. +\q2 Let them sing for joy on their beds. +\q1 +\v 6 May the high praises of God be in their mouths, +\q2 and a two-edged sword in their hand, +\q1 +\v 7 to execute vengeance on the nations, +\q2 and punishments on the peoples; +\q1 +\v 8 to bind their kings with chains, +\q2 and their nobles with fetters of iron; +\q1 +\v 9 to execute on them the written judgment. +\q2 All his saints have this honor. +\q1 Praise Yah! +\b +\c 150 +\q1 +\v 1 Praise Yah! +\q2 Praise God in his sanctuary! +\q2 Praise him in his heavens for his acts of power! +\q1 +\v 2 Praise him for his mighty acts! +\q2 Praise him according to his excellent greatness! +\q1 +\v 3 Praise him with the sounding of the trumpet! +\q2 Praise him with harp and lyre! +\q1 +\v 4 Praise him with tambourine and dancing! +\q2 Praise him with stringed instruments and flute! +\q1 +\v 5 Praise him with loud cymbals! +\q2 Praise him with resounding cymbals! +\q1 +\v 6 Let everything that has breath praise Yah! +\q2 Praise Yah! diff --git a/c-sharp/assets/WEB/20PROengWEBUS.SFM b/c-sharp/assets/WEB/20PROengWEBUS.SFM new file mode 100644 index 0000000000..76c624193c --- /dev/null +++ b/c-sharp/assets/WEB/20PROengWEBUS.SFM @@ -0,0 +1,2906 @@ +\id PRO World English Bible (WEB) +\ide UTF-8 +\h Proverbs +\toc1 The Proverbs +\toc2 Proverbs +\toc3 Proverbs +\mt1 The Proverbs +\c 1 +\p +\v 1 The proverbs of Solomon, the son of David, king of Israel: +\q1 +\v 2 to know wisdom and instruction; +\q2 to discern the words of understanding; +\q1 +\v 3 to receive instruction in wise dealing, +\q2 in righteousness, justice, and equity; +\q1 +\v 4 to give prudence to the simple, +\q2 knowledge and discretion to the young man— +\q1 +\v 5 that the wise man may hear, and increase in learning; +\q2 that the man of understanding may attain to sound counsel; +\q1 +\v 6 to understand a proverb and parables, +\q2 the words and riddles of the wise. +\b +\q1 +\v 7 The fear of Yahweh\f + \fr 1:7 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* is the beginning of knowledge, +\q2 but the foolish despise wisdom and instruction. +\q1 +\v 8 My son, listen to your father’s instruction, +\q2 and don’t forsake your mother’s teaching; +\q1 +\v 9 for they will be a garland to grace your head, +\q2 and chains around your neck. +\q1 +\v 10 My son, if sinners entice you, +\q2 don’t consent. +\q1 +\v 11 If they say, “Come with us. +\q2 Let’s lie in wait for blood. +\q2 Let’s lurk secretly for the innocent without cause. +\q1 +\v 12 Let’s swallow them up alive like Sheol,\f + \fr 1:12 \ft Sheol is the place of the dead.\f* +\q2 and whole, like those who go down into the pit. +\q1 +\v 13 We’ll find all valuable wealth. +\q2 We’ll fill our houses with plunder. +\q1 +\v 14 You shall cast your lot among us. +\q2 We’ll all have one purse”— +\q1 +\v 15 my son, don’t walk on the path with them. +\q2 Keep your foot from their path, +\q1 +\v 16 for their feet run to evil. +\q2 They hurry to shed blood. +\q1 +\v 17 For the net is spread in vain in the sight of any bird; +\q1 +\v 18 but these lay in wait for their own blood. +\q2 They lurk secretly for their own lives. +\q1 +\v 19 So are the ways of everyone who is greedy for gain. +\q2 It takes away the life of its owners. +\b +\q1 +\v 20 Wisdom calls aloud in the street. +\q2 She utters her voice in the public squares. +\q1 +\v 21 She calls at the head of noisy places. +\q2 At the entrance of the city gates, she utters her words: +\q1 +\v 22 “How long, you simple ones, will you love simplicity? +\q2 How long will mockers delight themselves in mockery, +\q2 and fools hate knowledge? +\q1 +\v 23 Turn at my reproof. +\q2 Behold,\f + \fr 1:23 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I will pour out my spirit on you. +\q2 I will make known my words to you. +\q1 +\v 24 Because I have called, and you have refused; +\q2 I have stretched out my hand, and no one has paid attention; +\q1 +\v 25 but you have ignored all my counsel, +\q2 and wanted none of my reproof; +\q1 +\v 26 I also will laugh at your disaster. +\q2 I will mock when calamity overtakes you, +\q1 +\v 27 when calamity overtakes you like a storm, +\q2 when your disaster comes on like a whirlwind, +\q2 when distress and anguish come on you. +\q1 +\v 28 Then they will call on me, but I will not answer. +\q2 They will seek me diligently, but they will not find me, +\q1 +\v 29 because they hated knowledge, +\q2 and didn’t choose the fear of Yahweh. +\q1 +\v 30 They wanted none of my counsel. +\q2 They despised all my reproof. +\q1 +\v 31 Therefore they will eat of the fruit of their own way, +\q2 and be filled with their own schemes. +\q1 +\v 32 For the backsliding of the simple will kill them. +\q2 The careless ease of fools will destroy them. +\q1 +\v 33 But whoever listens to me will dwell securely, +\q2 and will be at ease, without fear of harm.” +\c 2 +\q1 +\v 1 My son, if you will receive my words, +\q2 and store up my commandments within you, +\q1 +\v 2 so as to turn your ear to wisdom, +\q2 and apply your heart to understanding; +\q1 +\v 3 yes, if you call out for discernment, +\q2 and lift up your voice for understanding; +\q1 +\v 4 if you seek her as silver, +\q2 and search for her as for hidden treasures; +\q1 +\v 5 then you will understand the fear of Yahweh, +\q2 and find the knowledge of God.\f + \fr 2:5 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q1 +\v 6 For Yahweh gives wisdom. +\q2 Out of his mouth comes knowledge and understanding. +\q1 +\v 7 He lays up sound wisdom for the upright. +\q2 He is a shield to those who walk in integrity, +\q1 +\v 8 that he may guard the paths of justice, +\q2 and preserve the way of his saints. +\q1 +\v 9 Then you will understand righteousness and justice, +\q2 equity and every good path. +\q1 +\v 10 For wisdom will enter into your heart. +\q2 Knowledge will be pleasant to your soul. +\q1 +\v 11 Discretion will watch over you. +\q2 Understanding will keep you, +\q1 +\v 12 to deliver you from the way of evil, +\q2 from the men who speak perverse things, +\q1 +\v 13 who forsake the paths of uprightness, +\q2 to walk in the ways of darkness, +\q1 +\v 14 who rejoice to do evil, +\q2 and delight in the perverseness of evil, +\q1 +\v 15 who are crooked in their ways, +\q2 and wayward in their paths, +\q1 +\v 16 to deliver you from the strange woman, +\q2 even from the foreigner who flatters with her words, +\q1 +\v 17 who forsakes the friend of her youth, +\q2 and forgets the covenant of her God; +\q1 +\v 18 for her house leads down to death, +\q2 her paths to the departed spirits. +\q1 +\v 19 None who go to her return again, +\q2 neither do they attain to the paths of life. +\q1 +\v 20 Therefore walk in the way of good men, +\q2 and keep the paths of the righteous. +\q1 +\v 21 For the upright will dwell in the land. +\q2 The perfect will remain in it. +\q1 +\v 22 But the wicked will be cut off from the land. +\q2 The treacherous will be rooted out of it. +\c 3 +\q1 +\v 1 My son, don’t forget my teaching, +\q2 but let your heart keep my commandments, +\q1 +\v 2 for they will add to you length of days, +\q2 years of life, and peace. +\q1 +\v 3 Don’t let kindness and truth forsake you. +\q2 Bind them around your neck. +\q2 Write them on the tablet of your heart. +\q1 +\v 4 So you will find favor, +\q2 and good understanding in the sight of God and man. +\q1 +\v 5 Trust in Yahweh with all your heart, +\q2 and don’t lean on your own understanding. +\q1 +\v 6 In all your ways acknowledge him, +\q2 and he will make your paths straight. +\q1 +\v 7 Don’t be wise in your own eyes. +\q2 Fear Yahweh, and depart from evil. +\q1 +\v 8 It will be health to your body, +\q2 and nourishment to your bones. +\q1 +\v 9 Honor Yahweh with your substance, +\q2 with the first fruits of all your increase; +\q1 +\v 10 so your barns will be filled with plenty, +\q2 and your vats will overflow with new wine. +\q1 +\v 11 My son, don’t despise Yahweh’s discipline, +\q2 neither be weary of his correction; +\q1 +\v 12 for whom Yahweh loves, he corrects, +\q2 even as a father reproves the son in whom he delights. +\b +\q1 +\v 13 Happy is the man who finds wisdom, +\q2 the man who gets understanding. +\q1 +\v 14 For her good profit is better than getting silver, +\q2 and her return is better than fine gold. +\q1 +\v 15 She is more precious than rubies. +\q2 None of the things you can desire are to be compared to her. +\q1 +\v 16 Length of days is in her right hand. +\q2 In her left hand are riches and honor. +\q1 +\v 17 Her ways are ways of pleasantness. +\q2 All her paths are peace. +\q1 +\v 18 She is a tree of life to those who lay hold of her. +\q2 Happy is everyone who retains her. +\q1 +\v 19 By wisdom Yahweh founded the earth. +\q2 By understanding, he established the heavens. +\q1 +\v 20 By his knowledge, the depths were broken up, +\q2 and the skies drop down the dew. +\q1 +\v 21 My son, let them not depart from your eyes. +\q2 Keep sound wisdom and discretion, +\q1 +\v 22 so they will be life to your soul, +\q2 and grace for your neck. +\q1 +\v 23 Then you shall walk in your way securely. +\q2 Your foot won’t stumble. +\q1 +\v 24 When you lie down, you will not be afraid. +\q2 Yes, you will lie down, and your sleep will be sweet. +\q1 +\v 25 Don’t be afraid of sudden fear, +\q2 neither of the desolation of the wicked, when it comes; +\q1 +\v 26 for Yahweh will be your confidence, +\q2 and will keep your foot from being taken. +\b +\q1 +\v 27 Don’t withhold good from those to whom it is due, +\q2 when it is in the power of your hand to do it. +\q1 +\v 28 Don’t say to your neighbor, “Go, and come again; +\q2 tomorrow I will give it to you,” +\q2 when you have it by you. +\q1 +\v 29 Don’t devise evil against your neighbor, +\q2 since he dwells securely by you. +\q1 +\v 30 Don’t strive with a man without cause, +\q2 if he has done you no harm. +\q1 +\v 31 Don’t envy the man of violence. +\q2 Choose none of his ways. +\q1 +\v 32 For the perverse is an abomination to Yahweh, +\q2 but his friendship is with the upright. +\q1 +\v 33 Yahweh’s curse is in the house of the wicked, +\q2 but he blesses the habitation of the righteous. +\q1 +\v 34 Surely he mocks the mockers, +\q2 but he gives grace to the humble. +\q1 +\v 35 The wise will inherit glory, +\q2 but shame will be the promotion of fools. +\c 4 +\q1 +\v 1 Listen, sons, to a father’s instruction. +\q2 Pay attention and know understanding; +\q1 +\v 2 for I give you sound learning. +\q2 Don’t forsake my law. +\q1 +\v 3 For I was a son to my father, +\q2 tender and an only child in the sight of my mother. +\q1 +\v 4 He taught me, and said to me: +\q2 “Let your heart retain my words. +\q2 Keep my commandments, and live. +\q1 +\v 5 Get wisdom. +\q2 Get understanding. +\q2 Don’t forget, and don’t deviate from the words of my mouth. +\q1 +\v 6 Don’t forsake her, and she will preserve you. +\q2 Love her, and she will keep you. +\q1 +\v 7 Wisdom is supreme. +\q2 Get wisdom. +\q2 Yes, though it costs all your possessions, get understanding. +\q1 +\v 8 Esteem her, and she will exalt you. +\q2 She will bring you to honor when you embrace her. +\q1 +\v 9 She will give to your head a garland of grace. +\q2 She will deliver a crown of splendor to you.” +\b +\q1 +\v 10 Listen, my son, and receive my sayings. +\q2 The years of your life will be many. +\q1 +\v 11 I have taught you in the way of wisdom. +\q2 I have led you in straight paths. +\q1 +\v 12 When you go, your steps will not be hampered. +\q2 When you run, you will not stumble. +\q1 +\v 13 Take firm hold of instruction. +\q2 Don’t let her go. +\q2 Keep her, for she is your life. +\q1 +\v 14 Don’t enter into the path of the wicked. +\q2 Don’t walk in the way of evil men. +\q1 +\v 15 Avoid it, and don’t pass by it. +\q2 Turn from it, and pass on. +\q1 +\v 16 For they don’t sleep unless they do evil. +\q2 Their sleep is taken away, unless they make someone fall. +\q1 +\v 17 For they eat the bread of wickedness +\q2 and drink the wine of violence. +\q1 +\v 18 But the path of the righteous is like the dawning light +\q2 that shines more and more until the perfect day. +\q1 +\v 19 The way of the wicked is like darkness. +\q2 They don’t know what they stumble over. +\b +\q1 +\v 20 My son, attend to my words. +\q2 Turn your ear to my sayings. +\q1 +\v 21 Let them not depart from your eyes. +\q2 Keep them in the center of your heart. +\q1 +\v 22 For they are life to those who find them, +\q2 and health to their whole body. +\q1 +\v 23 Keep your heart with all diligence, +\q2 for out of it is the wellspring of life. +\q1 +\v 24 Put away from yourself a perverse mouth. +\q2 Put corrupt lips far from you. +\q1 +\v 25 Let your eyes look straight ahead. +\q2 Fix your gaze directly before you. +\q1 +\v 26 Make the path of your feet level. +\q2 Let all of your ways be established. +\q1 +\v 27 Don’t turn to the right hand nor to the left. +\q2 Remove your foot from evil. +\c 5 +\q1 +\v 1 My son, pay attention to my wisdom. +\q2 Turn your ear to my understanding, +\q1 +\v 2 that you may maintain discretion, +\q2 that your lips may preserve knowledge. +\q1 +\v 3 For the lips of an adulteress drip honey. +\q2 Her mouth is smoother than oil, +\q1 +\v 4 but in the end she is as bitter as wormwood, +\q2 and as sharp as a two-edged sword. +\q1 +\v 5 Her feet go down to death. +\q2 Her steps lead straight to Sheol.\f + \fr 5:5 \ft Sheol is the place of the dead. \f* +\q1 +\v 6 She gives no thought to the way of life. +\q2 Her ways are crooked, and she doesn’t know it. +\b +\q1 +\v 7 Now therefore, my sons, listen to me. +\q2 Don’t depart from the words of my mouth. +\q1 +\v 8 Remove your way far from her. +\q2 Don’t come near the door of her house, +\q1 +\v 9 lest you give your honor to others, +\q2 and your years to the cruel one; +\q1 +\v 10 lest strangers feast on your wealth, +\q2 and your labors enrich another man’s house. +\q1 +\v 11 You will groan at your latter end, +\q2 when your flesh and your body are consumed, +\q1 +\v 12 and say, “How I have hated instruction, +\q2 and my heart despised reproof. +\q1 +\v 13 I haven’t obeyed the voice of my teachers, +\q2 nor turned my ear to those who instructed me! +\q1 +\v 14 I have come to the brink of utter ruin, +\q2 among the gathered assembly.” +\b +\q1 +\v 15 Drink water out of your own cistern, +\q2 running water out of your own well. +\q1 +\v 16 Should your springs overflow in the streets, +\q2 streams of water in the public squares? +\q1 +\v 17 Let them be for yourself alone, +\q2 not for strangers with you. +\q1 +\v 18 Let your spring be blessed. +\q2 Rejoice in the wife of your youth. +\q1 +\v 19 A loving doe and a graceful deer— +\q2 let her breasts satisfy you at all times. +\q2 Be captivated always with her love. +\q1 +\v 20 For why should you, my son, be captivated with an adulteress? +\q2 Why embrace the bosom of another? +\q1 +\v 21 For the ways of man are before Yahweh’s eyes. +\q2 He examines all his paths. +\q1 +\v 22 The evil deeds of the wicked ensnare him. +\q2 The cords of his sin hold him firmly. +\q1 +\v 23 He will die for lack of instruction. +\q2 In the greatness of his folly, he will go astray. +\c 6 +\q1 +\v 1 My son, if you have become collateral for your neighbor, +\q2 if you have struck your hands in pledge for a stranger, +\q1 +\v 2 you are trapped by the words of your mouth; +\q2 you are ensnared with the words of your mouth. +\q1 +\v 3 Do this now, my son, and deliver yourself, +\q2 since you have come into the hand of your neighbor. +\q1 Go, humble yourself. +\q2 Press your plea with your neighbor. +\q1 +\v 4 Give no sleep to your eyes, +\q2 nor slumber to your eyelids. +\q1 +\v 5 Free yourself, like a gazelle from the hand of the hunter, +\q2 like a bird from the snare of the fowler. +\b +\q1 +\v 6 Go to the ant, you sluggard. +\q2 Consider her ways, and be wise; +\q1 +\v 7 which having no chief, overseer, or ruler, +\q2 +\v 8 provides her bread in the summer, +\q2 and gathers her food in the harvest. +\q1 +\v 9 How long will you sleep, sluggard? +\q2 When will you arise out of your sleep? +\q1 +\v 10 A little sleep, a little slumber, +\q2 a little folding of the hands to sleep— +\q1 +\v 11 so your poverty will come as a robber, +\q2 and your scarcity as an armed man. +\b +\q1 +\v 12 A worthless person, a man of iniquity, +\q2 is he who walks with a perverse mouth, +\q1 +\v 13 who winks with his eyes, who signals with his feet, +\q2 who motions with his fingers, +\q1 +\v 14 in whose heart is perverseness, +\q2 who devises evil continually, +\q2 who always sows discord. +\q1 +\v 15 Therefore his calamity will come suddenly. +\q2 He will be broken suddenly, and that without remedy. +\b +\q1 +\v 16 There are six things which Yahweh hates; +\q2 yes, seven which are an abomination to him: +\q1 +\v 17 arrogant eyes, a lying tongue, +\q2 hands that shed innocent blood, +\q1 +\v 18 a heart that devises wicked schemes, +\q2 feet that are swift in running to mischief, +\q1 +\v 19 a false witness who utters lies, +\q2 and he who sows discord among brothers. +\b +\q1 +\v 20 My son, keep your father’s commandment, +\q2 and don’t forsake your mother’s teaching. +\q1 +\v 21 Bind them continually on your heart. +\q2 Tie them around your neck. +\q1 +\v 22 When you walk, it will lead you. +\q2 When you sleep, it will watch over you. +\q2 When you awake, it will talk with you. +\q1 +\v 23 For the commandment is a lamp, +\q2 and the law is light. +\q2 Reproofs of instruction are the way of life, +\q1 +\v 24 to keep you from the immoral woman, +\q2 from the flattery of the wayward wife’s tongue. +\q1 +\v 25 Don’t lust after her beauty in your heart, +\q2 neither let her captivate you with her eyelids. +\q1 +\v 26 For a prostitute reduces you to a piece of bread. +\q2 The adulteress hunts for your precious life. +\q1 +\v 27 Can a man scoop fire into his lap, +\q2 and his clothes not be burned? +\q1 +\v 28 Or can one walk on hot coals, +\q2 and his feet not be scorched? +\q1 +\v 29 So is he who goes in to his neighbor’s wife. +\q2 Whoever touches her will not be unpunished. +\q1 +\v 30 Men don’t despise a thief +\q2 if he steals to satisfy himself when he is hungry, +\q1 +\v 31 but if he is found, he shall restore seven times. +\q2 He shall give all the wealth of his house. +\q1 +\v 32 He who commits adultery with a woman is void of understanding. +\q2 He who does it destroys his own soul. +\q1 +\v 33 He will get wounds and dishonor. +\q2 His reproach will not be wiped away. +\q1 +\v 34 For jealousy arouses the fury of the husband. +\q2 He won’t spare in the day of vengeance. +\q1 +\v 35 He won’t regard any ransom, +\q2 neither will he rest content, though you give many gifts. +\c 7 +\q1 +\v 1 My son, keep my words. +\q2 Lay up my commandments within you. +\q1 +\v 2 Keep my commandments and live! +\q2 Guard my teaching as the apple of your eye. +\q1 +\v 3 Bind them on your fingers. +\q2 Write them on the tablet of your heart. +\q1 +\v 4 Tell wisdom, “You are my sister.” +\q2 Call understanding your relative, +\q1 +\v 5 that they may keep you from the strange woman, +\q2 from the foreigner who flatters with her words. +\q1 +\v 6 For at the window of my house, +\q2 I looked out through my lattice. +\q1 +\v 7 I saw among the simple ones. +\q2 I discerned among the youths a young man void of understanding, +\q1 +\v 8 passing through the street near her corner, +\q2 he went the way to her house, +\q1 +\v 9 in the twilight, in the evening of the day, +\q2 in the middle of the night and in the darkness. +\q1 +\v 10 Behold, there a woman met him with the attire of a prostitute, +\q2 and with crafty intent. +\q1 +\v 11 She is loud and defiant. +\q2 Her feet don’t stay in her house. +\q1 +\v 12 Now she is in the streets, now in the squares, +\q2 and lurking at every corner. +\q1 +\v 13 So she caught him, and kissed him. +\q2 With an impudent face she said to him: +\q1 +\v 14 “Sacrifices of peace offerings are with me. +\q2 Today I have paid my vows. +\q1 +\v 15 Therefore I came out to meet you, +\q2 to diligently seek your face, +\q2 and I have found you. +\q1 +\v 16 I have spread my couch with carpets of tapestry, +\q2 with striped cloths of the yarn of Egypt. +\q1 +\v 17 I have perfumed my bed with myrrh, aloes, and cinnamon. +\q1 +\v 18 Come, let’s take our fill of loving until the morning. +\q2 Let’s solace ourselves with loving. +\q1 +\v 19 For my husband isn’t at home. +\q2 He has gone on a long journey. +\q1 +\v 20 He has taken a bag of money with him. +\q2 He will come home at the full moon.” +\q1 +\v 21 With persuasive words, she led him astray. +\q2 With the flattering of her lips, she seduced him. +\q1 +\v 22 He followed her immediately, +\q2 as an ox goes to the slaughter, +\q2 as a fool stepping into a noose. +\q1 +\v 23 Until an arrow strikes through his liver, +\q2 as a bird hurries to the snare, +\q2 and doesn’t know that it will cost his life. +\b +\q1 +\v 24 Now therefore, sons, listen to me. +\q2 Pay attention to the words of my mouth. +\q1 +\v 25 Don’t let your heart turn to her ways. +\q2 Don’t go astray in her paths, +\q1 +\v 26 for she has thrown down many wounded. +\q2 Yes, all her slain are a mighty army. +\q1 +\v 27 Her house is the way to Sheol,\f + \fr 7:27 \ft Sheol is the place of the dead. \f* +\q2 going down to the rooms of death. +\c 8 +\q1 +\v 1 Doesn’t wisdom cry out? +\q2 Doesn’t understanding raise her voice? +\q1 +\v 2 On the top of high places by the way, +\q2 where the paths meet, she stands. +\q1 +\v 3 Beside the gates, at the entry of the city, +\q2 at the entry doors, she cries aloud: +\q1 +\v 4 “I call to you men! +\q2 I send my voice to the sons of mankind. +\q1 +\v 5 You simple, understand prudence! +\q2 You fools, be of an understanding heart! +\q1 +\v 6 Hear, for I will speak excellent things. +\q2 The opening of my lips is for right things. +\q1 +\v 7 For my mouth speaks truth. +\q2 Wickedness is an abomination to my lips. +\q1 +\v 8 All the words of my mouth are in righteousness. +\q2 There is nothing crooked or perverse in them. +\q1 +\v 9 They are all plain to him who understands, +\q2 right to those who find knowledge. +\q1 +\v 10 Receive my instruction rather than silver, +\q2 knowledge rather than choice gold. +\q1 +\v 11 For wisdom is better than rubies. +\q2 All the things that may be desired can’t be compared to it. +\b +\q1 +\v 12 “I, wisdom, have made prudence my dwelling. +\q2 Find out knowledge and discretion. +\q1 +\v 13 The fear of Yahweh is to hate evil. +\q2 I hate pride, arrogance, the evil way, and the perverse mouth. +\q1 +\v 14 Counsel and sound knowledge are mine. +\q2 I have understanding and power. +\q1 +\v 15 By me kings reign, +\q2 and princes decree justice. +\q1 +\v 16 By me princes rule, +\q2 nobles, and all the righteous rulers of the earth. +\q1 +\v 17 I love those who love me. +\q2 Those who seek me diligently will find me. +\q1 +\v 18 With me are riches, honor, +\q2 enduring wealth, and prosperity. +\q1 +\v 19 My fruit is better than gold, yes, than fine gold, +\q2 my yield than choice silver. +\q1 +\v 20 I walk in the way of righteousness, +\q2 in the middle of the paths of justice, +\q1 +\v 21 that I may give wealth to those who love me. +\q2 I fill their treasuries. +\b +\q1 +\v 22 “Yahweh possessed me in the beginning of his work, +\q2 before his deeds of old. +\q1 +\v 23 I was set up from everlasting, from the beginning, +\q2 before the earth existed. +\q1 +\v 24 When there were no depths, I was born, +\q2 when there were no springs abounding with water. +\q1 +\v 25 Before the mountains were settled in place, +\q2 before the hills, I was born; +\q1 +\v 26 while as yet he had not made the earth, nor the fields, +\q2 nor the beginning of the dust of the world. +\q1 +\v 27 When he established the heavens, I was there. +\q2 When he set a circle on the surface of the deep, +\q1 +\v 28 when he established the clouds above, +\q2 when the springs of the deep became strong, +\q1 +\v 29 when he gave to the sea its boundary, +\q2 that the waters should not violate his commandment, +\q2 when he marked out the foundations of the earth, +\q1 +\v 30 then I was the craftsman by his side. +\q2 I was a delight day by day, +\q2 always rejoicing before him, +\q1 +\v 31 rejoicing in his whole world. +\q2 My delight was with the sons of men. +\b +\q1 +\v 32 “Now therefore, my sons, listen to me, +\q2 for blessed are those who keep my ways. +\q1 +\v 33 Hear instruction, and be wise. +\q2 Don’t refuse it. +\q1 +\v 34 Blessed is the man who hears me, +\q2 watching daily at my gates, +\q2 waiting at my door posts. +\q1 +\v 35 For whoever finds me finds life, +\q2 and will obtain favor from Yahweh. +\q1 +\v 36 But he who sins against me wrongs his own soul. +\q2 All those who hate me love death.” +\c 9 +\q1 +\v 1 Wisdom has built her house. +\q2 She has carved out her seven pillars. +\q1 +\v 2 She has prepared her meat. +\q2 She has mixed her wine. +\q2 She has also set her table. +\q1 +\v 3 She has sent out her maidens. +\q2 She cries from the highest places of the city: +\q1 +\v 4 “Whoever is simple, let him turn in here!” +\q2 As for him who is void of understanding, she says to him, +\q1 +\v 5 “Come, eat some of my bread, +\q2 Drink some of the wine which I have mixed! +\q1 +\v 6 Leave your simple ways, and live. +\q2 Walk in the way of understanding.” +\b +\q1 +\v 7 One who corrects a mocker invites insult. +\q2 One who reproves a wicked man invites abuse. +\q1 +\v 8 Don’t reprove a scoffer, lest he hate you. +\q2 Reprove a wise person, and he will love you. +\q1 +\v 9 Instruct a wise person, and he will be still wiser. +\q2 Teach a righteous person, and he will increase in learning. +\q1 +\v 10 The fear of Yahweh is the beginning of wisdom. +\q2 The knowledge of the Holy One is understanding. +\q1 +\v 11 For by me your days will be multiplied. +\q2 The years of your life will be increased. +\q1 +\v 12 If you are wise, you are wise for yourself. +\q2 If you mock, you alone will bear it. +\b +\q1 +\v 13 The foolish woman is loud, +\q2 undisciplined, and knows nothing. +\q1 +\v 14 She sits at the door of her house, +\q2 on a seat in the high places of the city, +\q1 +\v 15 to call to those who pass by, +\q2 who go straight on their ways, +\q1 +\v 16 “Whoever is simple, let him turn in here.” +\q2 As for him who is void of understanding, she says to him, +\q1 +\v 17 “Stolen water is sweet. +\q2 Food eaten in secret is pleasant.” +\q1 +\v 18 But he doesn’t know that the departed spirits are there, +\q2 that her guests are in the depths of Sheol.\f + \fr 9:18 \ft Sheol is the place of the dead.\f* +\c 10 +\p +\v 1 The proverbs of Solomon. +\q1 A wise son makes a glad father; +\q2 but a foolish son brings grief to his mother. +\q1 +\v 2 Treasures of wickedness profit nothing, +\q2 but righteousness delivers from death. +\q1 +\v 3 Yahweh will not allow the soul of the righteous to go hungry, +\q2 but he thrusts away the desire of the wicked. +\q1 +\v 4 He becomes poor who works with a lazy hand, +\q2 but the hand of the diligent brings wealth. +\q1 +\v 5 He who gathers in summer is a wise son, +\q2 but he who sleeps during the harvest is a son who causes shame. +\q1 +\v 6 Blessings are on the head of the righteous, +\q2 but violence covers the mouth of the wicked. +\q1 +\v 7 The memory of the righteous is blessed, +\q2 but the name of the wicked will rot. +\q1 +\v 8 The wise in heart accept commandments, +\q2 but a chattering fool will fall. +\q1 +\v 9 He who walks blamelessly walks surely, +\q2 but he who perverts his ways will be found out. +\q1 +\v 10 One who winks with the eye causes sorrow, +\q2 but a chattering fool will fall. +\q1 +\v 11 The mouth of the righteous is a spring of life, +\q2 but violence covers the mouth of the wicked. +\q1 +\v 12 Hatred stirs up strife, +\q2 but love covers all wrongs. +\q1 +\v 13 Wisdom is found on the lips of him who has discernment, +\q2 but a rod is for the back of him who is void of understanding. +\q1 +\v 14 Wise men lay up knowledge, +\q2 but the mouth of the foolish is near ruin. +\q1 +\v 15 The rich man’s wealth is his strong city. +\q2 The destruction of the poor is their poverty. +\q1 +\v 16 The labor of the righteous leads to life. +\q2 The increase of the wicked leads to sin. +\q1 +\v 17 He is in the way of life who heeds correction, +\q2 but he who forsakes reproof leads others astray. +\q1 +\v 18 He who hides hatred has lying lips. +\q2 He who utters a slander is a fool. +\q1 +\v 19 In the multitude of words there is no lack of disobedience, +\q2 but he who restrains his lips does wisely. +\q1 +\v 20 The tongue of the righteous is like choice silver. +\q2 The heart of the wicked is of little worth. +\q1 +\v 21 The lips of the righteous feed many, +\q2 but the foolish die for lack of understanding. +\q1 +\v 22 Yahweh’s blessing brings wealth, +\q2 and he adds no trouble to it. +\q1 +\v 23 It is a fool’s pleasure to do wickedness, +\q2 but wisdom is a man of understanding’s pleasure. +\q1 +\v 24 What the wicked fear will overtake them, +\q2 but the desire of the righteous will be granted. +\q1 +\v 25 When the whirlwind passes, the wicked is no more; +\q2 but the righteous stand firm forever. +\q1 +\v 26 As vinegar to the teeth, and as smoke to the eyes, +\q2 so is the sluggard to those who send him. +\q1 +\v 27 The fear of Yahweh prolongs days, +\q2 but the years of the wicked shall be shortened. +\q1 +\v 28 The prospect of the righteous is joy, +\q2 but the hope of the wicked will perish. +\q1 +\v 29 The way of Yahweh is a stronghold to the upright, +\q2 but it is a destruction to the workers of iniquity. +\q1 +\v 30 The righteous will never be removed, +\q2 but the wicked will not dwell in the land. +\q1 +\v 31 The mouth of the righteous produces wisdom, +\q2 but the perverse tongue will be cut off. +\q1 +\v 32 The lips of the righteous know what is acceptable, +\q2 but the mouth of the wicked is perverse. +\c 11 +\q1 +\v 1 A false balance is an abomination to Yahweh, +\q2 but accurate weights are his delight. +\q1 +\v 2 When pride comes, then comes shame, +\q2 but with humility comes wisdom. +\q1 +\v 3 The integrity of the upright shall guide them, +\q2 but the perverseness of the treacherous shall destroy them. +\q1 +\v 4 Riches don’t profit in the day of wrath, +\q2 but righteousness delivers from death. +\q1 +\v 5 The righteousness of the blameless will direct his way, +\q2 but the wicked shall fall by his own wickedness. +\q1 +\v 6 The righteousness of the upright shall deliver them, +\q2 but the unfaithful will be trapped by evil desires. +\q1 +\v 7 When a wicked man dies, hope perishes, +\q2 and expectation of power comes to nothing. +\q1 +\v 8 A righteous person is delivered out of trouble, +\q2 and the wicked takes his place. +\q1 +\v 9 With his mouth the godless man destroys his neighbor, +\q2 but the righteous will be delivered through knowledge. +\q1 +\v 10 When it goes well with the righteous, the city rejoices. +\q2 When the wicked perish, there is shouting. +\q1 +\v 11 By the blessing of the upright, the city is exalted, +\q2 but it is overthrown by the mouth of the wicked. +\q1 +\v 12 One who despises his neighbor is void of wisdom, +\q2 but a man of understanding holds his peace. +\q1 +\v 13 One who brings gossip betrays a confidence, +\q2 but one who is of a trustworthy spirit is one who keeps a secret. +\q1 +\v 14 Where there is no wise guidance, the nation falls, +\q2 but in the multitude of counselors there is victory. +\q1 +\v 15 He who is collateral for a stranger will suffer for it, +\q2 but he who refuses pledges of collateral is secure. +\q1 +\v 16 A gracious woman obtains honor, +\q2 but violent men obtain riches. +\q1 +\v 17 The merciful man does good to his own soul, +\q2 but he who is cruel troubles his own flesh. +\q1 +\v 18 Wicked people earn deceitful wages, +\q2 but one who sows righteousness reaps a sure reward. +\q1 +\v 19 He who is truly righteous gets life. +\q2 He who pursues evil gets death. +\q1 +\v 20 Those who are perverse in heart are an abomination to Yahweh, +\q2 but those whose ways are blameless are his delight. +\q1 +\v 21 Most certainly, the evil man will not be unpunished, +\q2 but the offspring\f + \fr 11:21 \ft or, seed\f* of the righteous will be delivered. +\q1 +\v 22 Like a gold ring in a pig’s snout, +\q2 is a beautiful woman who lacks discretion. +\q1 +\v 23 The desire of the righteous is only good. +\q2 The expectation of the wicked is wrath. +\q1 +\v 24 There is one who scatters, and increases yet more. +\q2 There is one who withholds more than is appropriate, but gains poverty. +\q1 +\v 25 The liberal soul shall be made fat. +\q2 He who waters shall be watered also himself. +\q1 +\v 26 People curse someone who withholds grain, +\q2 but blessing will be on the head of him who sells it. +\q1 +\v 27 He who diligently seeks good seeks favor, +\q2 but he who searches after evil, it shall come to him. +\q1 +\v 28 He who trusts in his riches will fall, +\q2 but the righteous shall flourish as the green leaf. +\q1 +\v 29 He who troubles his own house shall inherit the wind. +\q2 The foolish shall be servant to the wise of heart. +\q1 +\v 30 The fruit of the righteous is a tree of life. +\q2 He who is wise wins souls. +\q1 +\v 31 Behold, the righteous shall be repaid in the earth, +\q2 how much more the wicked and the sinner! +\c 12 +\q1 +\v 1 Whoever loves correction loves knowledge, +\q2 but he who hates reproof is stupid. +\q1 +\v 2 A good man shall obtain favor from Yahweh, +\q2 but he will condemn a man of wicked plans. +\q1 +\v 3 A man shall not be established by wickedness, +\q2 but the root of the righteous shall not be moved. +\q1 +\v 4 A worthy woman is the crown of her husband, +\q2 but a disgraceful wife is as rottenness in his bones. +\q1 +\v 5 The thoughts of the righteous are just, +\q2 but the advice of the wicked is deceitful. +\q1 +\v 6 The words of the wicked are about lying in wait for blood, +\q2 but the speech of the upright rescues them. +\q1 +\v 7 The wicked are overthrown, and are no more, +\q2 but the house of the righteous shall stand. +\q1 +\v 8 A man shall be commended according to his wisdom, +\q2 but he who has a warped mind shall be despised. +\q1 +\v 9 Better is he who is little known, and has a servant, +\q2 than he who honors himself and lacks bread. +\q1 +\v 10 A righteous man respects the life of his animal, +\q2 but the tender mercies of the wicked are cruel. +\q1 +\v 11 He who tills his land shall have plenty of bread, +\q2 but he who chases fantasies is void of understanding. +\q1 +\v 12 The wicked desires the plunder of evil men, +\q2 but the root of the righteous flourishes. +\q1 +\v 13 An evil man is trapped by sinfulness of lips, +\q2 but the righteous shall come out of trouble. +\q1 +\v 14 A man shall be satisfied with good by the fruit of his mouth. +\q2 The work of a man’s hands shall be rewarded to him. +\q1 +\v 15 The way of a fool is right in his own eyes, +\q2 but he who is wise listens to counsel. +\q1 +\v 16 A fool shows his annoyance the same day, +\q2 but one who overlooks an insult is prudent. +\q1 +\v 17 He who is truthful testifies honestly, +\q2 but a false witness lies. +\q1 +\v 18 There is one who speaks rashly like the piercing of a sword, +\q2 but the tongue of the wise heals. +\q1 +\v 19 Truth’s lips will be established forever, +\q2 but a lying tongue is only momentary. +\q1 +\v 20 Deceit is in the heart of those who plot evil, +\q2 but joy comes to the promoters of peace. +\q1 +\v 21 No mischief shall happen to the righteous, +\q2 but the wicked shall be filled with evil. +\q1 +\v 22 Lying lips are an abomination to Yahweh, +\q2 but those who do the truth are his delight. +\q1 +\v 23 A prudent man keeps his knowledge, +\q2 but the hearts of fools proclaim foolishness. +\q1 +\v 24 The hands of the diligent ones shall rule, +\q2 but laziness ends in slave labor. +\q1 +\v 25 Anxiety in a man’s heart weighs it down, +\q2 but a kind word makes it glad. +\q1 +\v 26 A righteous person is cautious in friendship, +\q2 but the way of the wicked leads them astray. +\q1 +\v 27 The slothful man doesn’t roast his game, +\q2 but the possessions of diligent men are prized. +\q1 +\v 28 In the way of righteousness is life; +\q2 in its path there is no death. +\c 13 +\q1 +\v 1 A wise son listens to his father’s instruction, +\q2 but a scoffer doesn’t listen to rebuke. +\q1 +\v 2 By the fruit of his lips, a man enjoys good things, +\q2 but the unfaithful crave violence. +\q1 +\v 3 He who guards his mouth guards his soul. +\q2 One who opens wide his lips comes to ruin. +\q1 +\v 4 The soul of the sluggard desires, and has nothing, +\q2 but the desire of the diligent shall be fully satisfied. +\q1 +\v 5 A righteous man hates lies, +\q2 but a wicked man brings shame and disgrace. +\q1 +\v 6 Righteousness guards the way of integrity, +\q2 but wickedness overthrows the sinner. +\q1 +\v 7 There are some who pretend to be rich, yet have nothing. +\q2 There are some who pretend to be poor, yet have great wealth. +\q1 +\v 8 The ransom of a man’s life is his riches, +\q2 but the poor hear no threats. +\q1 +\v 9 The light of the righteous shines brightly, +\q2 but the lamp of the wicked is snuffed out. +\q1 +\v 10 Pride only breeds quarrels, +\q2 but wisdom is with people who take advice. +\q1 +\v 11 Wealth gained dishonestly dwindles away, +\q2 but he who gathers by hand makes it grow. +\q1 +\v 12 Hope deferred makes the heart sick, +\q2 but when longing is fulfilled, it is a tree of life. +\q1 +\v 13 Whoever despises instruction will pay for it, +\q2 but he who respects a command will be rewarded. +\q1 +\v 14 The teaching of the wise is a spring of life, +\q2 to turn from the snares of death. +\q1 +\v 15 Good understanding wins favor, +\q2 but the way of the unfaithful is hard. +\q1 +\v 16 Every prudent man acts from knowledge, +\q2 but a fool exposes folly. +\q1 +\v 17 A wicked messenger falls into trouble, +\q2 but a trustworthy envoy gains healing. +\q1 +\v 18 Poverty and shame come to him who refuses discipline, +\q2 but he who heeds correction shall be honored. +\q1 +\v 19 Longing fulfilled is sweet to the soul, +\q2 but fools detest turning from evil. +\q1 +\v 20 One who walks with wise men grows wise, +\q2 but a companion of fools suffers harm. +\q1 +\v 21 Misfortune pursues sinners, +\q2 but prosperity rewards the righteous. +\q1 +\v 22 A good man leaves an inheritance to his children’s children, +\q2 but the wealth of the sinner is stored for the righteous. +\q1 +\v 23 An abundance of food is in poor people’s fields, +\q2 but injustice sweeps it away. +\q1 +\v 24 One who spares the rod hates his son, +\q2 but one who loves him is careful to discipline him. +\q1 +\v 25 The righteous one eats to the satisfying of his soul, +\q2 but the belly of the wicked goes hungry. +\c 14 +\q1 +\v 1 Every wise woman builds her house, +\q2 but the foolish one tears it down with her own hands. +\q1 +\v 2 He who walks in his uprightness fears Yahweh, +\q2 but he who is perverse in his ways despises him. +\q1 +\v 3 The fool’s talk brings a rod to his back, +\q2 but the lips of the wise protect them. +\q1 +\v 4 Where no oxen are, the crib is clean, +\q2 but much increase is by the strength of the ox. +\q1 +\v 5 A truthful witness will not lie, +\q2 but a false witness pours out lies. +\q1 +\v 6 A scoffer seeks wisdom, and doesn’t find it, +\q2 but knowledge comes easily to a discerning person. +\q1 +\v 7 Stay away from a foolish man, +\q2 for you won’t find knowledge on his lips. +\q1 +\v 8 The wisdom of the prudent is to think about his way, +\q2 but the folly of fools is deceit. +\q1 +\v 9 Fools mock at making atonement for sins, +\q2 but among the upright there is good will. +\q1 +\v 10 The heart knows its own bitterness and joy; +\q2 he will not share these with a stranger. +\q1 +\v 11 The house of the wicked will be overthrown, +\q2 but the tent of the upright will flourish. +\q1 +\v 12 There is a way which seems right to a man, +\q2 but in the end it leads to death. +\q1 +\v 13 Even in laughter the heart may be sorrowful, +\q2 and mirth may end in heaviness. +\q1 +\v 14 The unfaithful will be repaid for his own ways; +\q2 likewise a good man will be rewarded for his ways. +\q1 +\v 15 A simple man believes everything, +\q2 but the prudent man carefully considers his ways. +\q1 +\v 16 A wise man fears and shuns evil, +\q2 but the fool is hot headed and reckless. +\q1 +\v 17 He who is quick to become angry will commit folly, +\q2 and a crafty man is hated. +\q1 +\v 18 The simple inherit folly, +\q2 but the prudent are crowned with knowledge. +\q1 +\v 19 The evil bow down before the good, +\q2 and the wicked at the gates of the righteous. +\q1 +\v 20 The poor person is shunned even by his own neighbor, +\q2 but the rich person has many friends. +\q1 +\v 21 He who despises his neighbor sins, +\q2 but he who has pity on the poor is blessed. +\q1 +\v 22 Don’t they go astray who plot evil? +\q2 But love and faithfulness belong to those who plan good. +\q1 +\v 23 In all hard work there is profit, +\q2 but the talk of the lips leads only to poverty. +\q1 +\v 24 The crown of the wise is their riches, +\q2 but the folly of fools crowns them with folly. +\q1 +\v 25 A truthful witness saves souls, +\q2 but a false witness is deceitful. +\q1 +\v 26 In the fear of Yahweh is a secure fortress, +\q2 and he will be a refuge for his children. +\q1 +\v 27 The fear of Yahweh is a fountain of life, +\q2 turning people from the snares of death. +\q1 +\v 28 In the multitude of people is the king’s glory, +\q2 but in the lack of people is the destruction of the prince. +\q1 +\v 29 He who is slow to anger has great understanding, +\q2 but he who has a quick temper displays folly. +\q1 +\v 30 The life of the body is a heart at peace, +\q2 but envy rots the bones. +\q1 +\v 31 He who oppresses the poor shows contempt for his Maker, +\q2 but he who is kind to the needy honors him. +\q1 +\v 32 The wicked is brought down in his calamity, +\q2 but in death, the righteous has a refuge. +\q1 +\v 33 Wisdom rests in the heart of one who has understanding, +\q2 and is even made known in the inward part of fools. +\q1 +\v 34 Righteousness exalts a nation, +\q2 but sin is a disgrace to any people. +\q1 +\v 35 The king’s favor is toward a servant who deals wisely, +\q2 but his wrath is toward one who causes shame. +\c 15 +\q1 +\v 1 A gentle answer turns away wrath, +\q2 but a harsh word stirs up anger. +\q1 +\v 2 The tongue of the wise commends knowledge, +\q2 but the mouths of fools gush out folly. +\q1 +\v 3 Yahweh’s eyes are everywhere, +\q2 keeping watch on the evil and the good. +\q1 +\v 4 A gentle tongue is a tree of life, +\q2 but deceit in it crushes the spirit. +\q1 +\v 5 A fool despises his father’s correction, +\q2 but he who heeds reproof shows prudence. +\q1 +\v 6 In the house of the righteous is much treasure, +\q2 but the income of the wicked brings trouble. +\q1 +\v 7 The lips of the wise spread knowledge; +\q2 not so with the heart of fools. +\q1 +\v 8 The sacrifice made by the wicked is an abomination to Yahweh, +\q2 but the prayer of the upright is his delight. +\q1 +\v 9 The way of the wicked is an abomination to Yahweh, +\q2 but he loves him who follows after righteousness. +\q1 +\v 10 There is stern discipline for one who forsakes the way. +\q2 Whoever hates reproof shall die. +\q1 +\v 11 Sheol\f + \fr 15:11 \ft Sheol is the place of the dead.\f* and Abaddon are before Yahweh— +\q2 how much more then the hearts of the children of men! +\q1 +\v 12 A scoffer doesn’t love to be reproved; +\q2 he will not go to the wise. +\q1 +\v 13 A glad heart makes a cheerful face, +\q2 but an aching heart breaks the spirit. +\q1 +\v 14 The heart of one who has understanding seeks knowledge, +\q2 but the mouths of fools feed on folly. +\q1 +\v 15 All the days of the afflicted are wretched, +\q2 but one who has a cheerful heart enjoys a continual feast. +\q1 +\v 16 Better is little, with the fear of Yahweh, +\q2 than great treasure with trouble. +\q1 +\v 17 Better is a dinner of herbs, where love is, +\q2 than a fattened calf with hatred. +\q1 +\v 18 A wrathful man stirs up contention, +\q2 but one who is slow to anger appeases strife. +\q1 +\v 19 The way of the sluggard is like a thorn patch, +\q2 but the path of the upright is a highway. +\q1 +\v 20 A wise son makes a father glad, +\q2 but a foolish man despises his mother. +\q1 +\v 21 Folly is joy to one who is void of wisdom, +\q2 but a man of understanding keeps his way straight. +\q1 +\v 22 Where there is no counsel, plans fail; +\q2 but in a multitude of counselors they are established. +\q1 +\v 23 Joy comes to a man with the reply of his mouth. +\q2 How good is a word at the right time! +\q1 +\v 24 The path of life leads upward for the wise, +\q2 to keep him from going downward to Sheol.\f + \fr 15:24 \ft Sheol is the place of the dead.\f* +\q1 +\v 25 Yahweh will uproot the house of the proud, +\q2 but he will keep the widow’s borders intact. +\q1 +\v 26 Yahweh detests the thoughts of the wicked, +\q2 but the thoughts of the pure are pleasing. +\q1 +\v 27 He who is greedy for gain troubles his own house, +\q2 but he who hates bribes will live. +\q1 +\v 28 The heart of the righteous weighs answers, +\q2 but the mouth of the wicked gushes out evil. +\q1 +\v 29 Yahweh is far from the wicked, +\q2 but he hears the prayer of the righteous. +\q1 +\v 30 The light of the eyes rejoices the heart. +\q2 Good news gives health to the bones. +\q1 +\v 31 The ear that listens to reproof lives, +\q2 and will be at home among the wise. +\q1 +\v 32 He who refuses correction despises his own soul, +\q2 but he who listens to reproof gets understanding. +\q1 +\v 33 The fear of Yahweh teaches wisdom. +\q2 Before honor is humility. +\c 16 +\q1 +\v 1 The plans of the heart belong to man, +\q2 but the answer of the tongue is from Yahweh. +\q1 +\v 2 All the ways of a man are clean in his own eyes, +\q2 but Yahweh weighs the motives. +\q1 +\v 3 Commit your deeds to Yahweh, +\q2 and your plans shall succeed. +\q1 +\v 4 Yahweh has made everything for its own end— +\q2 yes, even the wicked for the day of evil. +\q1 +\v 5 Everyone who is proud in heart is an abomination to Yahweh; +\q2 they shall certainly not be unpunished. +\q1 +\v 6 By mercy and truth iniquity is atoned for. +\q2 By the fear of Yahweh men depart from evil. +\q1 +\v 7 When a man’s ways please Yahweh, +\q2 he makes even his enemies to be at peace with him. +\q1 +\v 8 Better is a little with righteousness, +\q2 than great revenues with injustice. +\q1 +\v 9 A man’s heart plans his course, +\q2 but Yahweh directs his steps. +\q1 +\v 10 Inspired judgments are on the lips of the king. +\q2 He shall not betray his mouth. +\q1 +\v 11 Honest balances and scales are Yahweh’s; +\q2 all the weights in the bag are his work. +\q1 +\v 12 It is an abomination for kings to do wrong, +\q2 for the throne is established by righteousness. +\q1 +\v 13 Righteous lips are the delight of kings. +\q2 They value one who speaks the truth. +\q1 +\v 14 The king’s wrath is a messenger of death, +\q2 but a wise man will pacify it. +\q1 +\v 15 In the light of the king’s face is life. +\q2 His favor is like a cloud of the spring rain. +\q1 +\v 16 How much better it is to get wisdom than gold! +\q2 Yes, to get understanding is to be chosen rather than silver. +\q1 +\v 17 The highway of the upright is to depart from evil. +\q2 He who keeps his way preserves his soul. +\q1 +\v 18 Pride goes before destruction, +\q2 and an arrogant spirit before a fall. +\q1 +\v 19 It is better to be of a lowly spirit with the poor, +\q2 than to divide the plunder with the proud. +\q1 +\v 20 He who heeds the Word finds prosperity. +\q2 Whoever trusts in Yahweh is blessed. +\q1 +\v 21 The wise in heart shall be called prudent. +\q2 Pleasantness of the lips promotes instruction. +\q1 +\v 22 Understanding is a fountain of life to one who has it, +\q2 but the punishment of fools is their folly. +\q1 +\v 23 The heart of the wise instructs his mouth, +\q2 and adds learning to his lips. +\q1 +\v 24 Pleasant words are a honeycomb, +\q2 sweet to the soul, and health to the bones. +\q1 +\v 25 There is a way which seems right to a man, +\q2 but in the end it leads to death. +\q1 +\v 26 The appetite of the laboring man labors for him, +\q2 for his mouth urges him on. +\q1 +\v 27 A worthless man devises mischief. +\q2 His speech is like a scorching fire. +\q1 +\v 28 A perverse man stirs up strife. +\q2 A whisperer separates close friends. +\q1 +\v 29 A man of violence entices his neighbor, +\q2 and leads him in a way that is not good. +\q1 +\v 30 One who winks his eyes to plot perversities, +\q2 one who compresses his lips, is bent on evil. +\q1 +\v 31 Gray hair is a crown of glory. +\q2 It is attained by a life of righteousness. +\q1 +\v 32 One who is slow to anger is better than the mighty; +\q2 one who rules his spirit, than he who takes a city. +\q1 +\v 33 The lot is cast into the lap, +\q2 but its every decision is from Yahweh. +\c 17 +\q1 +\v 1 Better is a dry morsel with quietness, +\q2 than a house full of feasting with strife. +\q1 +\v 2 A servant who deals wisely will rule over a son who causes shame, +\q2 and shall have a part in the inheritance among the brothers. +\q1 +\v 3 The refining pot is for silver, and the furnace for gold, +\q2 but Yahweh tests the hearts. +\q1 +\v 4 An evildoer heeds wicked lips. +\q2 A liar gives ear to a mischievous tongue. +\q1 +\v 5 Whoever mocks the poor reproaches his Maker. +\q2 He who is glad at calamity shall not be unpunished. +\q1 +\v 6 Children’s children are the crown of old men; +\q2 the glory of children is their parents. +\q1 +\v 7 Excellent speech isn’t fitting for a fool, +\q2 much less do lying lips fit a prince. +\q1 +\v 8 A bribe is a precious stone in the eyes of him who gives it; +\q2 wherever he turns, he prospers. +\q1 +\v 9 He who covers an offense promotes love; +\q2 but he who repeats a matter separates best friends. +\q1 +\v 10 A rebuke enters deeper into one who has understanding +\q2 than a hundred lashes into a fool. +\q1 +\v 11 An evil man seeks only rebellion; +\q2 therefore a cruel messenger shall be sent against him. +\q1 +\v 12 Let a bear robbed of her cubs meet a man, +\q2 rather than a fool in his folly. +\q1 +\v 13 Whoever rewards evil for good, +\q2 evil shall not depart from his house. +\q1 +\v 14 The beginning of strife is like breaching a dam, +\q2 therefore stop contention before quarreling breaks out. +\q1 +\v 15 He who justifies the wicked, and he who condemns the righteous, +\q2 both of them alike are an abomination to Yahweh. +\q1 +\v 16 Why is there money in the hand of a fool to buy wisdom, +\q2 since he has no understanding? +\q1 +\v 17 A friend loves at all times; +\q2 and a brother is born for adversity. +\q1 +\v 18 A man void of understanding strikes hands, +\q2 and becomes collateral in the presence of his neighbor. +\q1 +\v 19 He who loves disobedience loves strife. +\q2 One who builds a high gate seeks destruction. +\q1 +\v 20 One who has a perverse heart doesn’t find prosperity, +\q2 and one who has a deceitful tongue falls into trouble. +\q1 +\v 21 He who becomes the father of a fool grieves. +\q2 The father of a fool has no joy. +\q1 +\v 22 A cheerful heart makes good medicine, +\q2 but a crushed spirit dries up the bones. +\q1 +\v 23 A wicked man receives a bribe in secret, +\q2 to pervert the ways of justice. +\q1 +\v 24 Wisdom is before the face of one who has understanding, +\q2 but the eyes of a fool wander to the ends of the earth. +\q1 +\v 25 A foolish son brings grief to his father, +\q2 and bitterness to her who bore him. +\q1 +\v 26 Also to punish the righteous is not good, +\q2 nor to flog officials for their integrity. +\q1 +\v 27 He who spares his words has knowledge. +\q2 He who is even tempered is a man of understanding. +\q1 +\v 28 Even a fool, when he keeps silent, is counted wise. +\q2 When he shuts his lips, he is thought to be discerning. +\c 18 +\q1 +\v 1 A man who isolates himself pursues selfishness, +\q2 and defies all sound judgment. +\q1 +\v 2 A fool has no delight in understanding, +\q2 but only in revealing his own opinion. +\q1 +\v 3 When wickedness comes, contempt also comes, +\q2 and with shame comes disgrace. +\q1 +\v 4 The words of a man’s mouth are like deep waters. +\q2 The fountain of wisdom is like a flowing brook. +\q1 +\v 5 To be partial to the faces of the wicked is not good, +\q2 nor to deprive the innocent of justice. +\q1 +\v 6 A fool’s lips come into strife, +\q2 and his mouth invites beatings. +\q1 +\v 7 A fool’s mouth is his destruction, +\q2 and his lips are a snare to his soul. +\q1 +\v 8 The words of a gossip are like dainty morsels: +\q2 they go down into a person’s innermost parts. +\q1 +\v 9 One who is slack in his work +\q2 is brother to him who is a master of destruction. +\q1 +\v 10 Yahweh’s name is a strong tower: +\q2 the righteous run to him, and are safe. +\q1 +\v 11 The rich man’s wealth is his strong city, +\q2 like an unscalable wall in his own imagination. +\q1 +\v 12 Before destruction the heart of man is proud, +\q2 but before honor is humility. +\q1 +\v 13 He who answers before he hears, +\q2 that is folly and shame to him. +\q1 +\v 14 A man’s spirit will sustain him in sickness, +\q2 but a crushed spirit, who can bear? +\q1 +\v 15 The heart of the discerning gets knowledge. +\q2 The ear of the wise seeks knowledge. +\q1 +\v 16 A man’s gift makes room for him, +\q2 and brings him before great men. +\q1 +\v 17 He who pleads his cause first seems right— +\q2 until another comes and questions him. +\q1 +\v 18 The lot settles disputes, +\q2 and keeps strong ones apart. +\q1 +\v 19 A brother offended is more difficult than a fortified city. +\q2 Disputes are like the bars of a fortress. +\q1 +\v 20 A man’s stomach is filled with the fruit of his mouth. +\q2 With the harvest of his lips he is satisfied. +\q1 +\v 21 Death and life are in the power of the tongue; +\q2 those who love it will eat its fruit. +\q1 +\v 22 Whoever finds a wife finds a good thing, +\q2 and obtains favor of Yahweh. +\q1 +\v 23 The poor plead for mercy, +\q2 but the rich answer harshly. +\q1 +\v 24 A man of many companions may be ruined, +\q2 but there is a friend who sticks closer than a brother. +\c 19 +\q1 +\v 1 Better is the poor who walks in his integrity +\q2 than he who is perverse in his lips and is a fool. +\q1 +\v 2 It isn’t good to have zeal without knowledge, +\q2 nor being hasty with one’s feet and missing the way. +\q1 +\v 3 The foolishness of man subverts his way; +\q2 his heart rages against Yahweh. +\q1 +\v 4 Wealth adds many friends, +\q2 but the poor is separated from his friend. +\q1 +\v 5 A false witness shall not be unpunished. +\q2 He who pours out lies shall not go free. +\q1 +\v 6 Many will entreat the favor of a ruler, +\q2 and everyone is a friend to a man who gives gifts. +\q1 +\v 7 All the relatives of the poor shun him; +\q2 how much more do his friends avoid him! +\q2 He pursues them with pleas, but they are gone. +\q1 +\v 8 He who gets wisdom loves his own soul. +\q2 He who keeps understanding shall find good. +\q1 +\v 9 A false witness shall not be unpunished. +\q2 He who utters lies shall perish. +\q1 +\v 10 Delicate living is not appropriate for a fool, +\q2 much less for a servant to have rule over princes. +\q1 +\v 11 The discretion of a man makes him slow to anger. +\q2 It is his glory to overlook an offense. +\q1 +\v 12 The king’s wrath is like the roaring of a lion, +\q2 but his favor is like dew on the grass. +\q1 +\v 13 A foolish son is the calamity of his father. +\q2 A wife’s quarrels are a continual dripping. +\q1 +\v 14 House and riches are an inheritance from fathers, +\q2 but a prudent wife is from Yahweh. +\q1 +\v 15 Slothfulness casts into a deep sleep. +\q2 The idle soul shall suffer hunger. +\q1 +\v 16 He who keeps the commandment keeps his soul, +\q2 but he who is contemptuous in his ways shall die. +\q1 +\v 17 He who has pity on the poor lends to Yahweh; +\q2 he will reward him. +\q1 +\v 18 Discipline your son, for there is hope; +\q2 don’t be a willing party to his death. +\q1 +\v 19 A hot-tempered man must pay the penalty, +\q2 for if you rescue him, you must do it again. +\q1 +\v 20 Listen to counsel and receive instruction, +\q2 that you may be wise in your latter end. +\q1 +\v 21 There are many plans in a man’s heart, +\q2 but Yahweh’s counsel will prevail. +\q1 +\v 22 That which makes a man to be desired is his kindness. +\q2 A poor man is better than a liar. +\q1 +\v 23 The fear of Yahweh leads to life, then contentment; +\q2 he rests and will not be touched by trouble. +\q1 +\v 24 The sluggard buries his hand in the dish; +\q2 he will not so much as bring it to his mouth again. +\q1 +\v 25 Flog a scoffer, and the simple will learn prudence; +\q2 rebuke one who has understanding, and he will gain knowledge. +\q1 +\v 26 He who robs his father and drives away his mother +\q2 is a son who causes shame and brings reproach. +\q1 +\v 27 If you stop listening to instruction, my son, +\q2 you will stray from the words of knowledge. +\q1 +\v 28 A corrupt witness mocks justice, +\q2 and the mouth of the wicked gulps down iniquity. +\q1 +\v 29 Penalties are prepared for scoffers, +\q2 and beatings for the backs of fools. +\b +\c 20 +\q1 +\v 1 Wine is a mocker and beer is a brawler. +\q2 Whoever is led astray by them is not wise. +\q1 +\v 2 The terror of a king is like the roaring of a lion. +\q2 He who provokes him to anger forfeits his own life. +\q1 +\v 3 It is an honor for a man to keep aloof from strife, +\q2 but every fool will be quarreling. +\q1 +\v 4 The sluggard will not plow by reason of the winter; +\q2 therefore he shall beg in harvest, and have nothing. +\q1 +\v 5 Counsel in the heart of man is like deep water, +\q2 but a man of understanding will draw it out. +\q1 +\v 6 Many men claim to be men of unfailing love, +\q2 but who can find a faithful man? +\q1 +\v 7 A righteous man walks in integrity. +\q2 Blessed are his children after him. +\q1 +\v 8 A king who sits on the throne of judgment +\q2 scatters away all evil with his eyes. +\q1 +\v 9 Who can say, “I have made my heart pure. +\q2 I am clean and without sin?” +\q1 +\v 10 Differing weights and differing measures, +\q2 both of them alike are an abomination to Yahweh. +\q1 +\v 11 Even a child makes himself known by his doings, +\q2 whether his work is pure, and whether it is right. +\q1 +\v 12 The hearing ear, and the seeing eye, +\q2 Yahweh has made even both of them. +\q1 +\v 13 Don’t love sleep, lest you come to poverty. +\q2 Open your eyes, and you shall be satisfied with bread. +\q1 +\v 14 “It’s no good, it’s no good,” says the buyer; +\q2 but when he is gone his way, then he boasts. +\q1 +\v 15 There is gold and abundance of rubies, +\q2 but the lips of knowledge are a rare jewel. +\q1 +\v 16 Take the garment of one who puts up collateral for a stranger; +\q2 and hold him in pledge for a wayward woman. +\q1 +\v 17 Fraudulent food is sweet to a man, +\q2 but afterwards his mouth is filled with gravel. +\q1 +\v 18 Plans are established by advice; +\q2 by wise guidance you wage war! +\q1 +\v 19 He who goes about as a tale-bearer reveals secrets; +\q2 therefore don’t keep company with him who opens wide his lips. +\q1 +\v 20 Whoever curses his father or his mother, +\q2 his lamp shall be put out in blackness of darkness. +\q1 +\v 21 An inheritance quickly gained at the beginning +\q2 won’t be blessed in the end. +\q1 +\v 22 Don’t say, “I will pay back evil.” +\q2 Wait for Yahweh, and he will save you. +\q1 +\v 23 Yahweh detests differing weights, +\q2 and dishonest scales are not pleasing. +\q1 +\v 24 A man’s steps are from Yahweh; +\q2 how then can man understand his way? +\q1 +\v 25 It is a snare to a man to make a rash dedication, +\q2 then later to consider his vows. +\q1 +\v 26 A wise king winnows out the wicked, +\q2 and drives the threshing wheel over them. +\q1 +\v 27 The spirit of man is Yahweh’s lamp, +\q2 searching all his innermost parts. +\q1 +\v 28 Love and faithfulness keep the king safe. +\q2 His throne is sustained by love. +\q1 +\v 29 The glory of young men is their strength. +\q2 The splendor of old men is their gray hair. +\q1 +\v 30 Wounding blows cleanse away evil, +\q2 and beatings purge the innermost parts. +\b +\c 21 +\q1 +\v 1 The king’s heart is in Yahweh’s hand like the watercourses. +\q2 He turns it wherever he desires. +\q1 +\v 2 Every way of a man is right in his own eyes, +\q2 but Yahweh weighs the hearts. +\q1 +\v 3 To do righteousness and justice +\q2 is more acceptable to Yahweh than sacrifice. +\q1 +\v 4 A high look and a proud heart, +\q2 the lamp of the wicked, is sin. +\q1 +\v 5 The plans of the diligent surely lead to profit; +\q2 and everyone who is hasty surely rushes to poverty. +\q1 +\v 6 Getting treasures by a lying tongue +\q2 is a fleeting vapor for those who seek death. +\q1 +\v 7 The violence of the wicked will drive them away, +\q2 because they refuse to do what is right. +\q1 +\v 8 The way of the guilty is devious, +\q2 but the conduct of the innocent is upright. +\q1 +\v 9 It is better to dwell in the corner of the housetop +\q2 than to share a house with a contentious woman. +\q1 +\v 10 The soul of the wicked desires evil; +\q2 his neighbor finds no mercy in his eyes. +\q1 +\v 11 When the mocker is punished, the simple gains wisdom. +\q2 When the wise is instructed, he receives knowledge. +\q1 +\v 12 The Righteous One considers the house of the wicked, +\q2 and brings the wicked to ruin. +\q1 +\v 13 Whoever stops his ears at the cry of the poor, +\q2 he will also cry out, but shall not be heard. +\q1 +\v 14 A gift in secret pacifies anger, +\q2 and a bribe in the cloak, strong wrath. +\q1 +\v 15 It is joy to the righteous to do justice; +\q2 but it is a destruction to the workers of iniquity. +\q1 +\v 16 The man who wanders out of the way of understanding +\q2 shall rest in the assembly of the departed spirits. +\q1 +\v 17 He who loves pleasure will be a poor man. +\q2 He who loves wine and oil won’t be rich. +\q1 +\v 18 The wicked is a ransom for the righteous, +\q2 the treacherous for the upright. +\q1 +\v 19 It is better to dwell in a desert land, +\q2 than with a contentious and fretful woman. +\q1 +\v 20 There is precious treasure and oil in the dwelling of the wise, +\q2 but a foolish man swallows it up. +\q1 +\v 21 He who follows after righteousness and kindness +\q2 finds life, righteousness, and honor. +\q1 +\v 22 A wise man scales the city of the mighty, +\q2 and brings down the strength of its confidence. +\q1 +\v 23 Whoever guards his mouth and his tongue +\q2 keeps his soul from troubles. +\q1 +\v 24 The proud and arrogant man—“Scoffer” is his name— +\q2 he works in the arrogance of pride. +\q1 +\v 25 The desire of the sluggard kills him, +\q2 for his hands refuse to labor. +\q1 +\v 26 There are those who covet greedily all day long; +\q2 but the righteous give and don’t withhold. +\q1 +\v 27 The sacrifice of the wicked is an abomination— +\q2 how much more, when he brings it with a wicked mind! +\q1 +\v 28 A false witness will perish. +\q2 A man who listens speaks to eternity. +\q1 +\v 29 A wicked man hardens his face; +\q2 but as for the upright, he establishes his ways. +\q1 +\v 30 There is no wisdom nor understanding +\q2 nor counsel against Yahweh. +\q1 +\v 31 The horse is prepared for the day of battle; +\q2 but victory is with Yahweh. +\b +\c 22 +\q1 +\v 1 A good name is more desirable than great riches, +\q2 and loving favor is better than silver and gold. +\q1 +\v 2 The rich and the poor have this in common: +\q2 Yahweh is the maker of them all. +\q1 +\v 3 A prudent man sees danger and hides himself; +\q2 but the simple pass on, and suffer for it. +\q1 +\v 4 The result of humility and the fear of Yahweh +\q2 is wealth, honor, and life. +\q1 +\v 5 Thorns and snares are in the path of the wicked; +\q2 whoever guards his soul stays from them. +\q1 +\v 6 Train up a child in the way he should go, +\q2 and when he is old he will not depart from it. +\q1 +\v 7 The rich rule over the poor. +\q2 The borrower is servant to the lender. +\q1 +\v 8 He who sows wickedness reaps trouble, +\q2 and the rod of his fury will be destroyed. +\q1 +\v 9 He who has a generous eye will be blessed, +\q2 for he shares his food with the poor. +\q1 +\v 10 Drive out the mocker, and strife will go out; +\q2 yes, quarrels and insults will stop. +\q1 +\v 11 He who loves purity of heart and speaks gracefully +\q2 is the king’s friend. +\q1 +\v 12 Yahweh’s eyes watch over knowledge, +\q2 but he frustrates the words of the unfaithful. +\q1 +\v 13 The sluggard says, “There is a lion outside! +\q2 I will be killed in the streets!” +\q1 +\v 14 The mouth of an adulteress is a deep pit. +\q2 He who is under Yahweh’s wrath will fall into it. +\q1 +\v 15 Folly is bound up in the heart of a child; +\q2 the rod of discipline drives it far from him. +\q1 +\v 16 Whoever oppresses the poor for his own increase and whoever gives to the rich, +\q2 both come to poverty. +\b +\q1 +\v 17 Turn your ear, and listen to the words of the wise. +\q2 Apply your heart to my teaching. +\q1 +\v 18 For it is a pleasant thing if you keep them within you, +\q2 if all of them are ready on your lips. +\q1 +\v 19 I teach you today, even you, +\q2 so that your trust may be in Yahweh. +\q1 +\v 20 Haven’t I written to you thirty excellent things +\q2 of counsel and knowledge, +\q1 +\v 21 To teach you truth, reliable words, +\q2 to give sound answers to the ones who sent you? +\b +\q1 +\v 22 Don’t exploit the poor because he is poor; +\q2 and don’t crush the needy in court; +\q1 +\v 23 for Yahweh will plead their case, +\q2 and plunder the life of those who plunder them. +\b +\q1 +\v 24 Don’t befriend a hot-tempered man. +\q2 Don’t associate with one who harbors anger, +\q1 +\v 25 lest you learn his ways +\q2 and ensnare your soul. +\b +\q1 +\v 26 Don’t you be one of those who strike hands, +\q2 of those who are collateral for debts. +\q1 +\v 27 If you don’t have means to pay, +\q2 why should he take away your bed from under you? +\b +\q1 +\v 28 Don’t move the ancient boundary stone +\q2 which your fathers have set up. +\b +\q1 +\v 29 Do you see a man skilled in his work? +\q2 He will serve kings. +\q2 He won’t serve obscure men. +\b +\c 23 +\q1 +\v 1 When you sit to eat with a ruler, +\q2 consider diligently what is before you; +\q1 +\v 2 put a knife to your throat +\q2 if you are a man given to appetite. +\q1 +\v 3 Don’t be desirous of his dainties, +\q2 since they are deceitful food. +\q1 +\v 4 Don’t weary yourself to be rich. +\q2 In your wisdom, show restraint. +\q1 +\v 5 Why do you set your eyes on that which is not? +\q2 For it certainly sprouts wings like an eagle and flies in the sky. +\q1 +\v 6 Don’t eat the food of him who has a stingy eye, +\q2 and don’t crave his delicacies, +\q2 +\v 7 for as he thinks about the cost, so he is. +\q2 “Eat and drink!” he says to you, +\q2 but his heart is not with you. +\q1 +\v 8 You will vomit up the morsel which you have eaten +\q2 and waste your pleasant words. +\b +\q1 +\v 9 Don’t speak in the ears of a fool, +\q2 for he will despise the wisdom of your words. +\b +\q1 +\v 10 Don’t move the ancient boundary stone. +\q2 Don’t encroach on the fields of the fatherless, +\q1 +\v 11 for their Defender is strong. +\q2 He will plead their case against you. +\b +\q1 +\v 12 Apply your heart to instruction, +\q2 and your ears to the words of knowledge. +\q1 +\v 13 Don’t withhold correction from a child. +\q2 If you punish him with the rod, he will not die. +\q1 +\v 14 Punish him with the rod, +\q2 and save his soul from Sheol.\f + \fr 23:14 \ft Sheol is the place of the dead.\f* +\b +\q1 +\v 15 My son, if your heart is wise, +\q2 then my heart will be glad, even mine. +\q1 +\v 16 Yes, my heart will rejoice +\q2 when your lips speak what is right. +\q1 +\v 17 Don’t let your heart envy sinners, +\q2 but rather fear Yahweh all day long. +\q1 +\v 18 Indeed surely there is a future hope, +\q2 and your hope will not be cut off. +\q1 +\v 19 Listen, my son, and be wise, +\q2 and keep your heart on the right path! +\q1 +\v 20 Don’t be among ones drinking too much wine, +\q2 or those who gorge themselves on meat; +\q1 +\v 21 for the drunkard and the glutton shall become poor; +\q2 and drowsiness clothes them in rags. +\q1 +\v 22 Listen to your father who gave you life, +\q2 and don’t despise your mother when she is old. +\q1 +\v 23 Buy the truth, and don’t sell it. +\q2 Get wisdom, discipline, and understanding. +\q1 +\v 24 The father of the righteous has great joy. +\q2 Whoever fathers a wise child delights in him. +\q1 +\v 25 Let your father and your mother be glad! +\q2 Let her who bore you rejoice! +\q1 +\v 26 My son, give me your heart; +\q2 and let your eyes keep in my ways. +\q1 +\v 27 For a prostitute is a deep pit; +\q2 and a wayward wife is a narrow well. +\q1 +\v 28 Yes, she lies in wait like a robber, +\q2 and increases the unfaithful among men. +\b +\q1 +\v 29 Who has woe? +\q2 Who has sorrow? +\q2 Who has strife? +\q2 Who has complaints? +\q2 Who has needless bruises? +\q2 Who has bloodshot eyes? +\q1 +\v 30 Those who stay long at the wine; +\q2 those who go to seek out mixed wine. +\q1 +\v 31 Don’t look at the wine when it is red, +\q2 when it sparkles in the cup, +\q2 when it goes down smoothly. +\q1 +\v 32 In the end, it bites like a snake, +\q2 and poisons like a viper. +\q1 +\v 33 Your eyes will see strange things, +\q2 and your mind will imagine confusing things. +\q1 +\v 34 Yes, you will be as he who lies down in the middle of the sea, +\q2 or as he who lies on top of the rigging: +\q1 +\v 35 “They hit me, and I was not hurt! +\q2 They beat me, and I don’t feel it! +\q2 When will I wake up? I can do it again. +\q2 I will look for more.” +\b +\c 24 +\q1 +\v 1 Don’t be envious of evil men, +\q2 neither desire to be with them; +\q1 +\v 2 for their hearts plot violence +\q2 and their lips talk about mischief. +\q1 +\v 3 Through wisdom a house is built; +\q2 by understanding it is established; +\q1 +\v 4 by knowledge the rooms are filled +\q2 with all rare and beautiful treasure. +\q1 +\v 5 A wise man has great power. +\q2 A knowledgeable man increases strength, +\q1 +\v 6 for by wise guidance you wage your war, +\q2 and victory is in many advisors. +\q1 +\v 7 Wisdom is too high for a fool. +\q2 He doesn’t open his mouth in the gate. +\q1 +\v 8 One who plots to do evil +\q2 will be called a schemer. +\q1 +\v 9 The schemes of folly are sin. +\q2 The mocker is detested by men. +\q1 +\v 10 If you falter in the time of trouble, +\q2 your strength is small. +\q1 +\v 11 Rescue those who are being led away to death! +\q2 Indeed, hold back those who are staggering to the slaughter! +\q1 +\v 12 If you say, “Behold, we didn’t know this,” +\q2 doesn’t he who weighs the hearts consider it? +\q1 He who keeps your soul, doesn’t he know it? +\q2 Shall he not render to every man according to his work? +\q1 +\v 13 My son, eat honey, for it is good, +\q2 the droppings of the honeycomb, which are sweet to your taste; +\q1 +\v 14 so you shall know wisdom to be to your soul. +\q2 If you have found it, then there will be a reward: +\q2 Your hope will not be cut off. +\q1 +\v 15 Don’t lay in wait, wicked man, against the habitation of the righteous. +\q2 Don’t destroy his resting place; +\q1 +\v 16 for a righteous man falls seven times and rises up again, +\q2 but the wicked are overthrown by calamity. +\q1 +\v 17 Don’t rejoice when your enemy falls. +\q2 Don’t let your heart be glad when he is overthrown, +\q1 +\v 18 lest Yahweh see it, and it displease him, +\q2 and he turn away his wrath from him. +\q1 +\v 19 Don’t fret yourself because of evildoers, +\q2 neither be envious of the wicked; +\q1 +\v 20 for there will be no reward to the evil man. +\q2 The lamp of the wicked will be snuffed out. +\q1 +\v 21 My son, fear Yahweh and the king. +\q2 Don’t join those who are rebellious, +\q1 +\v 22 for their calamity will rise suddenly. +\q2 Who knows what destruction may come from them both? +\b +\p +\v 23 These also are sayings of the wise: +\b +\q1 To show partiality in judgment is not good. +\q1 +\v 24 He who says to the wicked, “You are righteous,” +\q2 peoples will curse him, and nations will abhor him— +\q1 +\v 25 but it will go well with those who convict the guilty, +\q2 and a rich blessing will come on them. +\q1 +\v 26 An honest answer +\q2 is like a kiss on the lips. +\q1 +\v 27 Prepare your work outside, +\q2 and get your fields ready. +\q2 Afterwards, build your house. +\q1 +\v 28 Don’t be a witness against your neighbor without cause. +\q2 Don’t deceive with your lips. +\q1 +\v 29 Don’t say, “I will do to him as he has done to me; +\q2 I will repay the man according to his work.” +\q1 +\v 30 I went by the field of the sluggard, +\q2 by the vineyard of the man void of understanding. +\q1 +\v 31 Behold, it was all grown over with thorns. +\q2 Its surface was covered with nettles, +\q2 and its stone wall was broken down. +\q1 +\v 32 Then I saw, and considered well. +\q2 I saw, and received instruction: +\q1 +\v 33 a little sleep, a little slumber, +\q2 a little folding of the hands to sleep, +\q1 +\v 34 so your poverty will come as a robber +\q2 and your want as an armed man. +\c 25 +\p +\v 1 These also are proverbs of Solomon, which the men of Hezekiah king of Judah copied out. +\q1 +\v 2 It is the glory of God to conceal a thing, +\q2 but the glory of kings is to search out a matter. +\q1 +\v 3 As the heavens for height, and the earth for depth, +\q2 so the hearts of kings are unsearchable. +\q1 +\v 4 Take away the dross from the silver, +\q2 and material comes out for the refiner. +\q1 +\v 5 Take away the wicked from the king’s presence, +\q2 and his throne will be established in righteousness. +\q1 +\v 6 Don’t exalt yourself in the presence of the king, +\q2 or claim a place among great men; +\q1 +\v 7 for it is better that it be said to you, “Come up here,” +\q2 than that you should be put lower in the presence of the prince, +\q2 whom your eyes have seen. +\q1 +\v 8 Don’t be hasty in bringing charges to court. +\q2 What will you do in the end when your neighbor shames you? +\q1 +\v 9 Debate your case with your neighbor, +\q2 and don’t betray the confidence of another, +\q2 +\v 10 lest one who hears it put you to shame, +\q2 and your bad reputation never depart. +\b +\q1 +\v 11 A word fitly spoken +\q2 is like apples of gold in settings of silver. +\q1 +\v 12 As an earring of gold, and an ornament of fine gold, +\q2 so is a wise reprover to an obedient ear. +\q1 +\v 13 As the cold of snow in the time of harvest, +\q2 so is a faithful messenger to those who send him; +\q2 for he refreshes the soul of his masters. +\q1 +\v 14 As clouds and wind without rain, +\q2 so is he who boasts of gifts deceptively. +\q1 +\v 15 By patience a ruler is persuaded. +\q2 A soft tongue breaks the bone. +\q1 +\v 16 Have you found honey? +\q2 Eat as much as is sufficient for you, +\q2 lest you eat too much, and vomit it. +\q1 +\v 17 Let your foot be seldom in your neighbor’s house, +\q2 lest he be weary of you, and hate you. +\q1 +\v 18 A man who gives false testimony against his neighbor +\q2 is like a club, a sword, or a sharp arrow. +\q1 +\v 19 Confidence in someone unfaithful in time of trouble +\q2 is like a bad tooth or a lame foot. +\q1 +\v 20 As one who takes away a garment in cold weather, +\q2 or vinegar on soda, +\q2 so is one who sings songs to a heavy heart. +\q1 +\v 21 If your enemy is hungry, give him food to eat. +\q2 If he is thirsty, give him water to drink; +\q1 +\v 22 for you will heap coals of fire on his head, +\q2 and Yahweh will reward you. +\q1 +\v 23 The north wind produces rain; +\q2 so a backbiting tongue brings an angry face. +\q1 +\v 24 It is better to dwell in the corner of the housetop +\q2 than to share a house with a contentious woman. +\q1 +\v 25 Like cold water to a thirsty soul, +\q2 so is good news from a far country. +\q1 +\v 26 Like a muddied spring and a polluted well, +\q2 so is a righteous man who gives way before the wicked. +\q1 +\v 27 It is not good to eat much honey, +\q2 nor is it honorable to seek one’s own honor. +\q1 +\v 28 Like a city that is broken down and without walls +\q2 is a man whose spirit is without restraint. +\c 26 +\q1 +\v 1 Like snow in summer, and as rain in harvest, +\q2 so honor is not fitting for a fool. +\q1 +\v 2 Like a fluttering sparrow, +\q2 like a darting swallow, +\q2 so the undeserved curse doesn’t come to rest. +\q1 +\v 3 A whip is for the horse, +\q2 a bridle for the donkey, +\q2 and a rod for the back of fools! +\q1 +\v 4 Don’t answer a fool according to his folly, +\q2 lest you also be like him. +\q1 +\v 5 Answer a fool according to his folly, +\q2 lest he be wise in his own eyes. +\q1 +\v 6 One who sends a message by the hand of a fool +\q2 is cutting off feet and drinking violence. +\q1 +\v 7 Like the legs of the lame that hang loose, +\q2 so is a parable in the mouth of fools. +\q1 +\v 8 As one who binds a stone in a sling, +\q2 so is he who gives honor to a fool. +\q1 +\v 9 Like a thorn bush that goes into the hand of a drunkard, +\q2 so is a parable in the mouth of fools. +\q1 +\v 10 As an archer who wounds all, +\q2 so is he who hires a fool +\q2 or he who hires those who pass by. +\q1 +\v 11 As a dog that returns to his vomit, +\q2 so is a fool who repeats his folly. +\q1 +\v 12 Do you see a man wise in his own eyes? +\q2 There is more hope for a fool than for him. +\q1 +\v 13 The sluggard says, “There is a lion in the road! +\q2 A fierce lion roams the streets!” +\q1 +\v 14 As the door turns on its hinges, +\q2 so does the sluggard on his bed. +\q1 +\v 15 The sluggard buries his hand in the dish. +\q2 He is too lazy to bring it back to his mouth. +\q1 +\v 16 The sluggard is wiser in his own eyes +\q2 than seven men who answer with discretion. +\q1 +\v 17 Like one who grabs a dog’s ears +\q2 is one who passes by and meddles in a quarrel not his own. +\q1 +\v 18 Like a madman who shoots torches, arrows, and death, +\q2 +\v 19 is the man who deceives his neighbor and says, “Am I not joking?” +\q1 +\v 20 For lack of wood a fire goes out. +\q2 Without gossip, a quarrel dies down. +\q1 +\v 21 As coals are to hot embers, +\q2 and wood to fire, +\q2 so is a contentious man to kindling strife. +\q1 +\v 22 The words of a whisperer are as dainty morsels, +\q2 they go down into the innermost parts. +\q1 +\v 23 Like silver dross on an earthen vessel +\q2 are the lips of a fervent one with an evil heart. +\q1 +\v 24 A malicious man disguises himself with his lips, +\q2 but he harbors evil in his heart. +\q1 +\v 25 When his speech is charming, don’t believe him, +\q2 for there are seven abominations in his heart. +\q1 +\v 26 His malice may be concealed by deception, +\q2 but his wickedness will be exposed in the assembly. +\q1 +\v 27 Whoever digs a pit shall fall into it. +\q2 Whoever rolls a stone, it will come back on him. +\q1 +\v 28 A lying tongue hates those it hurts; +\q2 and a flattering mouth works ruin. +\c 27 +\q1 +\v 1 Don’t boast about tomorrow; +\q2 for you don’t know what a day may bring. +\q1 +\v 2 Let another man praise you, +\q2 and not your own mouth; +\q2 a stranger, and not your own lips. +\q1 +\v 3 A stone is heavy, +\q2 and sand is a burden; +\q2 but a fool’s provocation is heavier than both. +\q1 +\v 4 Wrath is cruel, +\q2 and anger is overwhelming; +\q2 but who is able to stand before jealousy? +\q1 +\v 5 Better is open rebuke +\q2 than hidden love. +\q1 +\v 6 The wounds of a friend are faithful, +\q2 although the kisses of an enemy are profuse. +\q1 +\v 7 A full soul loathes a honeycomb; +\q2 but to a hungry soul, every bitter thing is sweet. +\q1 +\v 8 As a bird that wanders from her nest, +\q2 so is a man who wanders from his home. +\q1 +\v 9 Perfume and incense bring joy to the heart; +\q2 so does earnest counsel from a man’s friend. +\q1 +\v 10 Don’t forsake your friend and your father’s friend. +\q2 Don’t go to your brother’s house in the day of your disaster. +\q2 A neighbor who is near is better than a distant brother. +\q1 +\v 11 Be wise, my son, +\q2 and bring joy to my heart, +\q2 then I can answer my tormentor. +\q1 +\v 12 A prudent man sees danger and takes refuge; +\q2 but the simple pass on, and suffer for it. +\q1 +\v 13 Take his garment when he puts up collateral for a stranger. +\q2 Hold it for a wayward woman! +\q1 +\v 14 He who blesses his neighbor with a loud voice early in the morning, +\q2 it will be taken as a curse by him. +\q1 +\v 15 A continual dropping on a rainy day +\q2 and a contentious wife are alike: +\q1 +\v 16 restraining her is like restraining the wind, +\q2 or like grasping oil in his right hand. +\b +\q1 +\v 17 Iron sharpens iron; +\q2 so a man sharpens his friend’s countenance. +\q1 +\v 18 Whoever tends the fig tree shall eat its fruit. +\q2 He who looks after his master shall be honored. +\q1 +\v 19 Like water reflects a face, +\q2 so a man’s heart reflects the man. +\q1 +\v 20 Sheol\f + \fr 27:20 \ft Sheol is the place of the dead.\f* and Abaddon are never satisfied; +\q2 and a man’s eyes are never satisfied. +\q1 +\v 21 The crucible is for silver, +\q2 and the furnace for gold; +\q2 but man is refined by his praise. +\q1 +\v 22 Though you grind a fool in a mortar with a pestle along with grain, +\q2 yet his foolishness will not be removed from him. +\b +\q1 +\v 23 Know well the state of your flocks, +\q2 and pay attention to your herds, +\q1 +\v 24 for riches are not forever, +\q2 nor does the crown endure to all generations. +\q1 +\v 25 The hay is removed, and the new growth appears, +\q2 the grasses of the hills are gathered in. +\q1 +\v 26 The lambs are for your clothing, +\q2 and the goats are the price of a field. +\q1 +\v 27 There will be plenty of goats’ milk for your food, +\q2 for your family’s food, +\q2 and for the nourishment of your servant girls. +\c 28 +\q1 +\v 1 The wicked flee when no one pursues; +\q2 but the righteous are as bold as a lion. +\q1 +\v 2 In rebellion, a land has many rulers, +\q2 but order is maintained by a man of understanding and knowledge. +\q1 +\v 3 A needy man who oppresses the poor +\q2 is like a driving rain which leaves no crops. +\q1 +\v 4 Those who forsake the law praise the wicked; +\q2 but those who keep the law contend with them. +\q1 +\v 5 Evil men don’t understand justice; +\q2 but those who seek Yahweh understand it fully. +\q1 +\v 6 Better is the poor who walks in his integrity +\q2 than he who is perverse in his ways, and he is rich. +\q1 +\v 7 Whoever keeps the law is a wise son; +\q2 but he who is a companion of gluttons shames his father. +\q1 +\v 8 He who increases his wealth by excessive interest +\q2 gathers it for one who has pity on the poor. +\q1 +\v 9 He who turns away his ear from hearing the law, +\q2 even his prayer is an abomination. +\q1 +\v 10 Whoever causes the upright to go astray in an evil way, +\q2 he will fall into his own trap; +\q2 but the blameless will inherit good. +\q1 +\v 11 The rich man is wise in his own eyes; +\q2 but the poor who has understanding sees through him. +\q1 +\v 12 When the righteous triumph, there is great glory; +\q2 but when the wicked rise, men hide themselves. +\q1 +\v 13 He who conceals his sins doesn’t prosper, +\q2 but whoever confesses and renounces them finds mercy. +\q1 +\v 14 Blessed is the man who always fears; +\q2 but one who hardens his heart falls into trouble. +\q1 +\v 15 As a roaring lion or a charging bear, +\q2 so is a wicked ruler over helpless people. +\q1 +\v 16 A tyrannical ruler lacks judgment. +\q2 One who hates ill-gotten gain will have long days. +\q1 +\v 17 A man who is tormented by blood guilt will be a fugitive until death. +\q2 No one will support him. +\q1 +\v 18 Whoever walks blamelessly is kept safe; +\q2 but one with perverse ways will fall suddenly. +\q1 +\v 19 One who works his land will have an abundance of food; +\q2 but one who chases fantasies will have his fill of poverty. +\q1 +\v 20 A faithful man is rich with blessings; +\q2 but one who is eager to be rich will not go unpunished. +\q1 +\v 21 To show partiality is not good, +\q2 yet a man will do wrong for a piece of bread. +\q1 +\v 22 A stingy man hurries after riches, +\q2 and doesn’t know that poverty waits for him. +\q1 +\v 23 One who rebukes a man will afterward find more favor +\q2 than one who flatters with the tongue. +\q1 +\v 24 Whoever robs his father or his mother and says, “It’s not wrong,” +\q2 is a partner with a destroyer. +\q1 +\v 25 One who is greedy stirs up strife; +\q2 but one who trusts in Yahweh will prosper. +\q1 +\v 26 One who trusts in himself is a fool; +\q2 but one who walks in wisdom is kept safe. +\q1 +\v 27 One who gives to the poor has no lack; +\q2 but one who closes his eyes will have many curses. +\q1 +\v 28 When the wicked rise, men hide themselves; +\q2 but when they perish, the righteous thrive. +\c 29 +\q1 +\v 1 He who is often rebuked and stiffens his neck +\q2 will be destroyed suddenly, with no remedy. +\q1 +\v 2 When the righteous thrive, the people rejoice; +\q2 but when the wicked rule, the people groan. +\q1 +\v 3 Whoever loves wisdom brings joy to his father; +\q2 but a companion of prostitutes squanders his wealth. +\q1 +\v 4 The king by justice makes the land stable, +\q2 but he who takes bribes tears it down. +\q1 +\v 5 A man who flatters his neighbor +\q2 spreads a net for his feet. +\q1 +\v 6 An evil man is snared by his sin, +\q2 but the righteous can sing and be glad. +\q1 +\v 7 The righteous care about justice for the poor. +\q2 The wicked aren’t concerned about knowledge. +\q1 +\v 8 Mockers stir up a city, +\q2 but wise men turn away anger. +\q1 +\v 9 If a wise man goes to court with a foolish man, +\q2 the fool rages or scoffs, and there is no peace. +\q1 +\v 10 The bloodthirsty hate a man of integrity; +\q2 and they seek the life of the upright. +\q1 +\v 11 A fool vents all of his anger, +\q2 but a wise man brings himself under control. +\q1 +\v 12 If a ruler listens to lies, +\q2 all of his officials are wicked. +\q1 +\v 13 The poor man and the oppressor have this in common: +\q2 Yahweh gives sight to the eyes of both. +\q1 +\v 14 The king who fairly judges the poor, +\q2 his throne shall be established forever. +\q1 +\v 15 The rod of correction gives wisdom, +\q2 but a child left to himself causes shame to his mother. +\q1 +\v 16 When the wicked increase, sin increases; +\q2 but the righteous will see their downfall. +\q1 +\v 17 Correct your son, and he will give you peace; +\q2 yes, he will bring delight to your soul. +\q1 +\v 18 Where there is no revelation, the people cast off restraint; +\q2 but one who keeps the law is blessed. +\q1 +\v 19 A servant can’t be corrected by words. +\q2 Though he understands, yet he will not respond. +\q1 +\v 20 Do you see a man who is hasty in his words? +\q2 There is more hope for a fool than for him. +\q1 +\v 21 He who pampers his servant from youth +\q2 will have him become a son in the end. +\q1 +\v 22 An angry man stirs up strife, +\q2 and a wrathful man abounds in sin. +\q1 +\v 23 A man’s pride brings him low, +\q2 but one of lowly spirit gains honor. +\q1 +\v 24 Whoever is an accomplice of a thief is an enemy of his own soul. +\q2 He takes an oath, but dares not testify. +\q1 +\v 25 The fear of man proves to be a snare, +\q2 but whoever puts his trust in Yahweh is kept safe. +\q1 +\v 26 Many seek the ruler’s favor, +\q2 but a man’s justice comes from Yahweh. +\q1 +\v 27 A dishonest man detests the righteous, +\q2 and the upright in their ways detest the wicked. +\c 30 +\p +\v 1 The words of Agur the son of Jakeh, the revelation: +\q1 the man says to Ithiel, +\q2 to Ithiel and Ucal: +\q1 +\v 2 “Surely I am the most ignorant man, +\q2 and don’t have a man’s understanding. +\q1 +\v 3 I have not learned wisdom, +\q2 neither do I have the knowledge of the Holy One. +\q1 +\v 4 Who has ascended up into heaven, and descended? +\q2 Who has gathered the wind in his fists? +\q2 Who has bound the waters in his garment? +\q2 Who has established all the ends of the earth? +\q2 What is his name, and what is his son’s name, if you know? +\b +\q1 +\v 5 “Every word of God is flawless. +\q2 He is a shield to those who take refuge in him. +\q1 +\v 6 Don’t you add to his words, +\q2 lest he reprove you, and you be found a liar. +\b +\q1 +\v 7 “Two things I have asked of you. +\q2 Don’t deny me before I die. +\q1 +\v 8 Remove far from me falsehood and lies. +\q2 Give me neither poverty nor riches. +\q2 Feed me with the food that is needful for me, +\q1 +\v 9 lest I be full, deny you, and say, ‘Who is Yahweh?’ +\q2 or lest I be poor, and steal, +\q2 and so dishonor the name of my God. +\b +\q1 +\v 10 “Don’t slander a servant to his master, +\q2 lest he curse you, and you be held guilty. +\b +\q1 +\v 11 There is a generation that curses their father, +\q2 and doesn’t bless their mother. +\q1 +\v 12 There is a generation that is pure in their own eyes, +\q2 yet are not washed from their filthiness. +\q1 +\v 13 There is a generation, oh how lofty are their eyes! +\q2 Their eyelids are lifted up. +\q1 +\v 14 There is a generation whose teeth are like swords, +\q2 and their jaws like knives, +\q2 to devour the poor from the earth, and the needy from among men. +\b +\q1 +\v 15 “The leech has two daughters: +\q2 ‘Give, give.’ +\b +\q1 “There are three things that are never satisfied; +\q2 four that don’t say, ‘Enough!’: +\q2 +\v 16 Sheol,\f + \fr 30:16 \ft Sheol is the place of the dead.\f* +\q2 the barren womb, +\q2 the earth that is not satisfied with water, +\q2 and the fire that doesn’t say, ‘Enough!’ +\b +\q1 +\v 17 “The eye that mocks at his father, +\q2 and scorns obedience to his mother, +\q2 the ravens of the valley shall pick it out, +\q2 the young eagles shall eat it. +\b +\q1 +\v 18 “There are three things which are too amazing for me, +\q2 four which I don’t understand: +\q2 +\v 19 The way of an eagle in the air, +\q2 the way of a serpent on a rock, +\q2 the way of a ship in the middle of the sea, +\q2 and the way of a man with a maiden. +\b +\q1 +\v 20 “So is the way of an adulterous woman: +\q2 She eats and wipes her mouth, +\q2 and says, ‘I have done nothing wrong.’ +\b +\q1 +\v 21 “For three things the earth trembles, +\q2 and under four, it can’t bear up: +\q2 +\v 22 For a servant when he is king, +\q2 a fool when he is filled with food, +\q2 +\v 23 for an unloved woman when she is married, +\q2 and a servant who is heir to her mistress. +\b +\q1 +\v 24 “There are four things which are little on the earth, +\q2 but they are exceedingly wise: +\q2 +\v 25 The ants are not a strong people, +\q2 yet they provide their food in the summer. +\q2 +\v 26 The hyraxes are but a feeble folk, +\q2 yet make they their houses in the rocks. +\q2 +\v 27 The locusts have no king, +\q2 yet they advance in ranks. +\q2 +\v 28 You can catch a lizard with your hands, +\q2 yet it is in kings’ palaces. +\b +\q1 +\v 29 “There are three things which are stately in their march, +\q2 four which are stately in going: +\q2 +\v 30 The lion, which is mightiest among animals, +\q2 and doesn’t turn away for any; +\q2 +\v 31 the greyhound; +\q2 the male goat; +\q2 and the king against whom there is no rising up. +\b +\q1 +\v 32 “If you have done foolishly in lifting up yourself, +\q2 or if you have thought evil, +\q1 put your hand over your mouth. +\q2 +\v 33 For as the churning of milk produces butter, +\q2 and the wringing of the nose produces blood, +\q2 so the forcing of wrath produces strife.” +\c 31 +\p +\v 1 The words of King Lemuel—the revelation which his mother taught him: +\b +\q1 +\v 2 “Oh, my son! +\q2 Oh, son of my womb! +\q2 Oh, son of my vows! +\q1 +\v 3 Don’t give your strength to women, +\q2 nor your ways to that which destroys kings. +\q1 +\v 4 It is not for kings, Lemuel, +\q2 it is not for kings to drink wine, +\q2 nor for princes to say, ‘Where is strong drink?’ +\q1 +\v 5 lest they drink, and forget the law, +\q2 and pervert the justice due to anyone who is afflicted. +\q1 +\v 6 Give strong drink to him who is ready to perish, +\q2 and wine to the bitter in soul. +\q1 +\v 7 Let him drink, and forget his poverty, +\q2 and remember his misery no more. +\q1 +\v 8 Open your mouth for the mute, +\q2 in the cause of all who are left desolate. +\q1 +\v 9 Open your mouth, judge righteously, +\q2 and serve justice to the poor and needy.” +\b +\q1 +\v 10 \f + \fr 31:10 \ft Proverbs 31:10-31 form an acrostic, with each verse starting with each letter of the Hebrew alphabet, in order.\f*Who can find a worthy woman? +\q2 For her value is far above rubies. +\q1 +\v 11 The heart of her husband trusts in her. +\q2 He shall have no lack of gain. +\q1 +\v 12 She does him good, and not harm, +\q2 all the days of her life. +\q1 +\v 13 She seeks wool and flax, +\q2 and works eagerly with her hands. +\q1 +\v 14 She is like the merchant ships. +\q2 She brings her bread from afar. +\q1 +\v 15 She rises also while it is yet night, +\q2 gives food to her household, +\q2 and portions for her servant girls. +\q1 +\v 16 She considers a field, and buys it. +\q2 With the fruit of her hands, she plants a vineyard. +\q1 +\v 17 She arms her waist with strength, +\q2 and makes her arms strong. +\q1 +\v 18 She perceives that her merchandise is profitable. +\q2 Her lamp doesn’t go out by night. +\q1 +\v 19 She lays her hands to the distaff, +\q2 and her hands hold the spindle. +\q1 +\v 20 She opens her arms to the poor; +\q2 yes, she extends her hands to the needy. +\q1 +\v 21 She is not afraid of the snow for her household, +\q2 for all her household are clothed with scarlet. +\q1 +\v 22 She makes for herself carpets of tapestry. +\q2 Her clothing is fine linen and purple. +\q1 +\v 23 Her husband is respected in the gates, +\q2 when he sits among the elders of the land. +\q1 +\v 24 She makes linen garments and sells them, +\q2 and delivers sashes to the merchant. +\q1 +\v 25 Strength and dignity are her clothing. +\q2 She laughs at the time to come. +\q1 +\v 26 She opens her mouth with wisdom. +\q2 Kind instruction is on her tongue. +\q1 +\v 27 She looks well to the ways of her household, +\q2 and doesn’t eat the bread of idleness. +\q1 +\v 28 Her children rise up and call her blessed. +\q2 Her husband also praises her: +\q1 +\v 29 “Many women do noble things, +\q2 but you excel them all.” +\q1 +\v 30 Charm is deceitful, and beauty is vain; +\q2 but a woman who fears Yahweh, she shall be praised. +\q1 +\v 31 Give her of the fruit of her hands! +\q2 Let her works praise her in the gates! diff --git a/c-sharp/assets/WEB/21ECCengWEBUS.SFM b/c-sharp/assets/WEB/21ECCengWEBUS.SFM new file mode 100644 index 0000000000..4646730c80 --- /dev/null +++ b/c-sharp/assets/WEB/21ECCengWEBUS.SFM @@ -0,0 +1,391 @@ +\id ECC World English Bible (WEB) +\ide UTF-8 +\h Ecclesiastes +\toc1 Ecclesiates or, The Preacher +\toc2 Ecclesiastes +\toc3 Ecclesiastes +\mt1 Ecclesiastes +\mt2 or, The Preacher +\c 1 +\p +\v 1 The words of the Preacher, the son of David, king in Jerusalem: +\p +\v 2 “Vanity of vanities,” says the Preacher; “Vanity of vanities, all is vanity.” +\v 3 What does man gain from all his labor in which he labors under the sun? +\v 4 One generation goes, and another generation comes; but the earth remains forever. +\v 5 The sun also rises, and the sun goes down, and hurries to its place where it rises. +\v 6 The wind goes toward the south, and turns around to the north. It turns around continually as it goes, and the wind returns again to its courses. +\v 7 All the rivers run into the sea, yet the sea is not full. To the place where the rivers flow, there they flow again. +\v 8 All things are full of weariness beyond uttering. The eye is not satisfied with seeing, nor the ear filled with hearing. +\v 9 That which has been is that which shall be, and that which has been done is that which shall be done; and there is no new thing under the sun. +\v 10 Is there a thing of which it may be said, “Behold,\f + \fr 1:10 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* this is new?” It has been long ago, in the ages which were before us. +\v 11 There is no memory of the former; neither shall there be any memory of the latter that are to come, among those that shall come after. +\p +\v 12 I, the Preacher, was king over Israel in Jerusalem. +\v 13 I applied my heart to seek and to search out by wisdom concerning all that is done under the sky. It is a heavy burden that God\f + \fr 1:13 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* has given to the sons of men to be afflicted with. +\v 14 I have seen all the works that are done under the sun; and behold, all is vanity and a chasing after wind. +\v 15 That which is crooked can’t be made straight; and that which is lacking can’t be counted. +\v 16 I said to myself, “Behold, I have obtained for myself great wisdom above all who were before me in Jerusalem. Yes, my heart has had great experience of wisdom and knowledge.” +\v 17 I applied my heart to know wisdom, and to know madness and folly. I perceived that this also was a chasing after wind. +\v 18 For in much wisdom is much grief; and he who increases knowledge increases sorrow. +\c 2 +\p +\v 1 I said in my heart, “Come now, I will test you with mirth; therefore enjoy pleasure;” and behold, this also was vanity. +\v 2 I said of laughter, “It is foolishness;” and of mirth, “What does it accomplish?” +\p +\v 3 I searched in my heart how to cheer my flesh with wine, my heart yet guiding me with wisdom, and how to lay hold of folly, until I might see what it was good for the sons of men that they should do under heaven all the days of their lives. +\v 4 I made myself great works. I built myself houses. I planted myself vineyards. +\v 5 I made myself gardens and parks, and I planted trees in them of all kinds of fruit. +\v 6 I made myself pools of water, to water the forest where trees were grown. +\v 7 I bought male servants and female servants, and had servants born in my house. I also had great possessions of herds and flocks, above all who were before me in Jerusalem. +\v 8 I also gathered silver and gold for myself, and the treasure of kings and of the provinces. I got myself male and female singers, and the delights of the sons of men: musical instruments of all sorts. +\v 9 So I was great, and increased more than all who were before me in Jerusalem. My wisdom also remained with me. +\v 10 Whatever my eyes desired, I didn’t keep from them. I didn’t withhold my heart from any joy, for my heart rejoiced because of all my labor, and this was my portion from all my labor. +\v 11 Then I looked at all the works that my hands had worked, and at the labor that I had labored to do; and behold, all was vanity and a chasing after wind, and there was no profit under the sun. +\p +\v 12 I turned myself to consider wisdom, madness, and folly; for what can the king’s successor do? Just that which has been done long ago. +\v 13 Then I saw that wisdom excels folly, as far as light excels darkness. +\v 14 The wise man’s eyes are in his head, and the fool walks in darkness—and yet I perceived that one event happens to them all. +\v 15 Then I said in my heart, “As it happens to the fool, so will it happen even to me; and why was I then more wise?” Then I said in my heart that this also is vanity. +\v 16 For of the wise man, even as of the fool, there is no memory forever, since in the days to come all will have been long forgotten. Indeed, the wise man must die just like the fool! +\p +\v 17 So I hated life, because the work that is worked under the sun was grievous to me; for all is vanity and a chasing after wind. +\v 18 I hated all my labor in which I labored under the sun, because I must leave it to the man who comes after me. +\v 19 Who knows whether he will be a wise man or a fool? Yet he will have rule over all of my labor in which I have labored, and in which I have shown myself wise under the sun. This also is vanity. +\p +\v 20 Therefore I began to cause my heart to despair concerning all the labor in which I had labored under the sun. +\v 21 For there is a man whose labor is with wisdom, with knowledge, and with skillfulness; yet he shall leave it for his portion to a man who has not labored for it. This also is vanity and a great evil. +\v 22 For what does a man have of all his labor and of the striving of his heart, in which he labors under the sun? +\v 23 For all his days are sorrows, and his travail is grief; yes, even in the night his heart takes no rest. This also is vanity. +\v 24 There is nothing better for a man than that he should eat and drink, and make his soul enjoy good in his labor. This also I saw, that it is from the hand of God. +\v 25 For who can eat, or who can have enjoyment, more than I? +\v 26 For to the man who pleases him, God gives wisdom, knowledge, and joy; but to the sinner he gives travail, to gather and to heap up, that he may give to him who pleases God. This also is vanity and a chasing after wind. +\c 3 +\p +\v 1 For everything there is a season, and a time for every purpose under heaven: +\q1 +\v 2 a time to be born, +\q2 and a time to die; +\q1 a time to plant, +\q2 and a time to pluck up that which is planted; +\q1 +\v 3 a time to kill, +\q2 and a time to heal; +\q1 a time to break down, +\q2 and a time to build up; +\q1 +\v 4 a time to weep, +\q2 and a time to laugh; +\q1 a time to mourn, +\q2 and a time to dance; +\q1 +\v 5 a time to cast away stones, +\q2 and a time to gather stones together; +\q1 a time to embrace, +\q2 and a time to refrain from embracing; +\q1 +\v 6 a time to seek, +\q2 and a time to lose; +\q1 a time to keep, +\q2 and a time to cast away; +\q1 +\v 7 a time to tear, +\q2 and a time to sew; +\q1 a time to keep silence, +\q2 and a time to speak; +\q1 +\v 8 a time to love, +\q2 and a time to hate; +\q1 a time for war, +\q2 and a time for peace. +\p +\v 9 What profit has he who works in that in which he labors? +\v 10 I have seen the burden which God has given to the sons of men to be afflicted with. +\v 11 He has made everything beautiful in its time. He has also set eternity in their hearts, yet so that man can’t find out the work that God has done from the beginning even to the end. +\v 12 I know that there is nothing better for them than to rejoice, and to do good as long as they live. +\v 13 Also that every man should eat and drink, and enjoy good in all his labor, is the gift of God. +\v 14 I know that whatever God does, it shall be forever. Nothing can be added to it, nor anything taken from it; and God has done it, that men should fear before him. +\v 15 That which is has been long ago, and that which is to be has been long ago. God seeks again that which is passed away. +\p +\v 16 Moreover I saw under the sun, in the place of justice, that wickedness was there; and in the place of righteousness, that wickedness was there. +\v 17 I said in my heart, “God will judge the righteous and the wicked; for there is a time there for every purpose and for every work.” +\v 18 I said in my heart, “As for the sons of men, God tests them, so that they may see that they themselves are like animals. +\v 19 For that which happens to the sons of men happens to animals. Even one thing happens to them. As the one dies, so the other dies. Yes, they have all one breath; and man has no advantage over the animals, for all is vanity. +\v 20 All go to one place. All are from the dust, and all turn to dust again. +\v 21 Who knows the spirit of man, whether it goes upward, and the spirit of the animal, whether it goes downward to the earth?” +\p +\v 22 Therefore I saw that there is nothing better than that a man should rejoice in his works, for that is his portion; for who can bring him to see what will be after him? +\c 4 +\p +\v 1 Then I returned and saw all the oppressions that are done under the sun: and behold, the tears of those who were oppressed, and they had no comforter; and on the side of their oppressors there was power; but they had no comforter. +\v 2 Therefore I praised the dead who have been long dead more than the living who are yet alive. +\v 3 Yes, better than them both is him who has not yet been, who has not seen the evil work that is done under the sun. +\v 4 Then I saw all the labor and achievement that is the envy of a man’s neighbor. This also is vanity and a striving after wind. +\p +\v 5 The fool folds his hands together and ruins himself. +\v 6 Better is a handful, with quietness, than two handfuls with labor and chasing after wind. +\p +\v 7 Then I returned and saw vanity under the sun. +\v 8 There is one who is alone, and he has neither son nor brother. There is no end to all of his labor, neither are his eyes satisfied with wealth. “For whom then do I labor and deprive my soul of enjoyment?” This also is vanity. Yes, it is a miserable business. +\p +\v 9 Two are better than one, because they have a good reward for their labor. +\v 10 For if they fall, the one will lift up his fellow; but woe to him who is alone when he falls, and doesn’t have another to lift him up. +\v 11 Again, if two lie together, then they have warmth; but how can one keep warm alone? +\v 12 If a man prevails against one who is alone, two shall withstand him; and a threefold cord is not quickly broken. +\p +\v 13 Better is a poor and wise youth than an old and foolish king who doesn’t know how to receive admonition any more. +\v 14 For out of prison he came out to be king; yes, even in his kingdom he was born poor. +\v 15 I saw all the living who walk under the sun, that they were with the youth, the other, who succeeded him. +\v 16 There was no end of all the people, even of all them over whom he was—yet those who come after shall not rejoice in him. Surely this also is vanity and a chasing after wind. +\c 5 +\p +\v 1 Guard your steps when you go to God’s house; for to draw near to listen is better than to give the sacrifice of fools, for they don’t know that they do evil. +\v 2 Don’t be rash with your mouth, and don’t let your heart be hasty to utter anything before God; for God is in heaven, and you on earth. Therefore let your words be few. +\v 3 For as a dream comes with a multitude of cares, so a fool’s speech with a multitude of words. +\v 4 When you vow a vow to God, don’t defer to pay it; for he has no pleasure in fools. Pay that which you vow. +\v 5 It is better that you should not vow, than that you should vow and not pay. +\v 6 Don’t allow your mouth to lead you into sin. Don’t protest before the messenger that this was a mistake. Why should God be angry at your voice, and destroy the work of your hands? +\v 7 For in the multitude of dreams there are vanities, as well as in many words; but you must fear God. +\p +\v 8 If you see the oppression of the poor, and the violent taking away of justice and righteousness in a district, don’t marvel at the matter, for one official is eyed by a higher one, and there are officials over them. +\v 9 Moreover the profit of the earth is for all. The king profits from the field. +\p +\v 10 He who loves silver shall not be satisfied with silver, nor he who loves abundance, with increase. This also is vanity. +\v 11 When goods increase, those who eat them are increased; and what advantage is there to its owner, except to feast on them with his eyes? +\p +\v 12 The sleep of a laboring man is sweet, whether he eats little or much; but the abundance of the rich will not allow him to sleep. +\p +\v 13 There is a grievous evil which I have seen under the sun: wealth kept by its owner to his harm. +\v 14 Those riches perish by misfortune, and if he has fathered a son, there is nothing in his hand. +\v 15 As he came out of his mother’s womb, naked shall he go again as he came, and shall take nothing for his labor, which he may carry away in his hand. +\v 16 This also is a grievous evil, that in all points as he came, so shall he go. And what profit does he have who labors for the wind? +\v 17 All his days he also eats in darkness, he is frustrated, and has sickness and wrath. +\p +\v 18 Behold, that which I have seen to be good and proper is for one to eat and to drink, and to enjoy good in all his labor, in which he labors under the sun, all the days of his life which God has given him; for this is his portion. +\v 19 Every man also to whom God has given riches and wealth, and has given him power to eat of it, and to take his portion, and to rejoice in his labor—this is the gift of God. +\v 20 For he shall not often reflect on the days of his life, because God occupies him with the joy of his heart. +\c 6 +\p +\v 1 There is an evil which I have seen under the sun, and it is heavy on men: +\v 2 a man to whom God gives riches, wealth, and honor, so that he lacks nothing for his soul of all that he desires, yet God gives him no power to eat of it, but an alien eats it. This is vanity, and it is an evil disease. +\p +\v 3 If a man fathers a hundred children, and lives many years, so that the days of his years are many, but his soul is not filled with good, and moreover he has no burial, I say that a stillborn child is better than he; +\v 4 for it comes in vanity, and departs in darkness, and its name is covered with darkness. +\v 5 Moreover it has not seen the sun nor known it. This has rest rather than the other. +\v 6 Yes, though he live a thousand years twice told, and yet fails to enjoy good, don’t all go to one place? +\v 7 All the labor of man is for his mouth, and yet the appetite is not filled. +\v 8 For what advantage has the wise more than the fool? What has the poor man, that knows how to walk before the living? +\v 9 Better is the sight of the eyes than the wandering of the desire. This also is vanity and a chasing after wind. +\v 10 Whatever has been, its name was given long ago; and it is known what man is; neither can he contend with him who is mightier than he. +\v 11 For there are many words that create vanity. What does that profit man? +\v 12 For who knows what is good for man in life, all the days of his vain life which he spends like a shadow? For who can tell a man what will be after him under the sun? +\c 7 +\p +\v 1 A good name is better than fine perfume; and the day of death better than the day of one’s birth. +\v 2 It is better to go to the house of mourning than to go to the house of feasting; for that is the end of all men, and the living should take this to heart. +\v 3 Sorrow is better than laughter; for by the sadness of the face the heart is made good. +\v 4 The heart of the wise is in the house of mourning; but the heart of fools is in the house of mirth. +\v 5 It is better to hear the rebuke of the wise than for a man to hear the song of fools. +\v 6 For as the crackling of thorns under a pot, so is the laughter of the fool. This also is vanity. +\v 7 Surely extortion makes the wise man foolish; and a bribe destroys the understanding. +\v 8 Better is the end of a thing than its beginning. +\p The patient in spirit is better than the proud in spirit. +\v 9 Don’t be hasty in your spirit to be angry, for anger rests in the bosom of fools. +\v 10 Don’t say, “Why were the former days better than these?” For you do not ask wisely about this. +\p +\v 11 Wisdom is as good as an inheritance. Yes, it is more excellent for those who see the sun. +\v 12 For wisdom is a defense, even as money is a defense; but the excellency of knowledge is that wisdom preserves the life of him who has it. +\p +\v 13 Consider the work of God, for who can make that straight which he has made crooked? +\v 14 In the day of prosperity be joyful, and in the day of adversity consider; yes, God has made the one side by side with the other, to the end that man should not find out anything after him. +\p +\v 15 All this I have seen in my days of vanity: there is a righteous man who perishes in his righteousness, and there is a wicked man who lives long in his evildoing. +\v 16 Don’t be overly righteous, neither make yourself overly wise. Why should you destroy yourself? +\v 17 Don’t be too wicked, neither be foolish. Why should you die before your time? +\v 18 It is good that you should take hold of this. Yes, also don’t withdraw your hand from that; for he who fears God will come out of them all. +\v 19 Wisdom is a strength to the wise man more than ten rulers who are in a city. +\v 20 Surely there is not a righteous man on earth who does good and doesn’t sin. +\v 21 Also don’t take heed to all words that are spoken, lest you hear your servant curse you; +\v 22 for often your own heart knows that you yourself have likewise cursed others. +\v 23 All this I have proved in wisdom. I said, “I will be wise;” but it was far from me. +\v 24 That which is, is far off and exceedingly deep. Who can find it out? +\v 25 I turned around, and my heart sought to know and to search out, and to seek wisdom and the scheme of things, and to know that wickedness is stupidity, and that foolishness is madness. +\p +\v 26 I find more bitter than death the woman whose heart is snares and traps, whose hands are chains. Whoever pleases God shall escape from her; but the sinner will be ensnared by her. +\p +\v 27 “Behold, I have found this,” says the Preacher, “to one another, to find an explanation +\v 28 which my soul still seeks, but I have not found. I have found one man among a thousand, but I have not found a woman among all those. +\v 29 Behold, I have only found this: that God made mankind upright; but they search for many inventions.” +\c 8 +\p +\v 1 Who is like the wise man? And who knows the interpretation of a thing? A man’s wisdom makes his face shine, and the hardness of his face is changed. +\p +\v 2 I say, “Keep the king’s command!” because of the oath to God. +\v 3 Don’t be hasty to go out of his presence. Don’t persist in an evil thing, for he does whatever pleases him, +\v 4 for the king’s word is supreme. Who can say to him, “What are you doing?” +\v 5 Whoever keeps the commandment shall not come to harm, and his wise heart will know the time and procedure. +\v 6 For there is a time and procedure for every purpose, although the misery of man is heavy on him. +\v 7 For he doesn’t know that which will be; for who can tell him how it will be? +\v 8 There is no man who has power over the spirit to contain the spirit; neither does he have power over the day of death. There is no discharge in war; neither shall wickedness deliver those who practice it. +\p +\v 9 All this I have seen, and applied my mind to every work that is done under the sun. There is a time in which one man has power over another to his hurt. +\v 10 So I saw the wicked buried. Indeed they came also from holiness. They went and were forgotten in the city where they did this. This also is vanity. +\v 11 Because sentence against an evil work is not executed speedily, therefore the heart of the sons of men is fully set in them to do evil. +\v 12 Though a sinner commits crimes a hundred times, and lives long, yet surely I know that it will be better with those who fear God, who are reverent before him. +\v 13 But it shall not be well with the wicked, neither shall he lengthen days like a shadow, because he doesn’t fear God. +\p +\v 14 There is a vanity which is done on the earth, that there are righteous men to whom it happens according to the work of the wicked. Again, there are wicked men to whom it happens according to the work of the righteous. I said that this also is vanity. +\v 15 Then I commended mirth, because a man has no better thing under the sun than to eat, to drink, and to be joyful: for that will accompany him in his labor all the days of his life which God has given him under the sun. +\p +\v 16 When I applied my heart to know wisdom, and to see the business that is done on the earth (even though eyes see no sleep day or night), +\v 17 then I saw all the work of God, that man can’t find out the work that is done under the sun, because however much a man labors to seek it out, yet he won’t find it. Yes even though a wise man thinks he can comprehend it, he won’t be able to find it. +\c 9 +\p +\v 1 For all this I laid to my heart, even to explore all this: that the righteous, and the wise, and their works, are in the hand of God; whether it is love or hatred, man doesn’t know it; all is before them. +\v 2 All things come alike to all. There is one event to the righteous and to the wicked; to the good, to the clean, to the unclean, to him who sacrifices, and to him who doesn’t sacrifice. As is the good, so is the sinner; he who takes an oath, as he who fears an oath. +\v 3 This is an evil in all that is done under the sun, that there is one event to all. Yes also, the heart of the sons of men is full of evil, and madness is in their heart while they live, and after that they go to the dead. +\v 4 For to him who is joined with all the living there is hope; for a living dog is better than a dead lion. +\v 5 For the living know that they will die, but the dead don’t know anything, neither do they have any more a reward; for their memory is forgotten. +\v 6 Also their love, their hatred, and their envy has perished long ago; neither do they any longer have a portion forever in anything that is done under the sun. +\p +\v 7 Go your way—eat your bread with joy, and drink your wine with a merry heart; for God has already accepted your works. +\v 8 Let your garments be always white, and don’t let your head lack oil. +\v 9 Live joyfully with the wife whom you love all the days of your life of vanity, which he has given you under the sun, all your days of vanity, for that is your portion in life, and in your labor in which you labor under the sun. +\v 10 Whatever your hand finds to do, do it with your might; for there is no work, nor plan, nor knowledge, nor wisdom, in Sheol,\f + \fr 9:10 \ft Sheol is the place of the dead.\f* where you are going. +\p +\v 11 I returned and saw under the sun that the race is not to the swift, nor the battle to the strong, neither yet bread to the wise, nor yet riches to men of understanding, nor yet favor to men of skill; but time and chance happen to them all. +\v 12 For man also doesn’t know his time. As the fish that are taken in an evil net, and as the birds that are caught in the snare, even so are the sons of men snared in an evil time, when it falls suddenly on them. +\p +\v 13 I have also seen wisdom under the sun in this way, and it seemed great to me. +\v 14 There was a little city, and few men within it; and a great king came against it, besieged it, and built great bulwarks against it. +\v 15 Now a poor wise man was found in it, and he by his wisdom delivered the city; yet no man remembered that same poor man. +\v 16 Then I said, “Wisdom is better than strength.” Nevertheless the poor man’s wisdom is despised, and his words are not heard. +\v 17 The words of the wise heard in quiet are better than the cry of him who rules among fools. +\v 18 Wisdom is better than weapons of war; but one sinner destroys much good. +\c 10 +\q1 +\v 1 Dead flies cause the oil of the perfumer to produce an evil odor; +\q2 so does a little folly outweigh wisdom and honor. +\q1 +\v 2 A wise man’s heart is at his right hand, +\q2 but a fool’s heart at his left. +\v 3 Yes also when the fool walks by the way, his understanding fails him, and he says to everyone that he is a fool. +\v 4 If the spirit of the ruler rises up against you, don’t leave your place; for gentleness lays great offenses to rest. +\p +\v 5 There is an evil which I have seen under the sun, the sort of error which proceeds from the ruler. +\v 6 Folly is set in great dignity, and the rich sit in a low place. +\v 7 I have seen servants on horses, and princes walking like servants on the earth. +\v 8 He who digs a pit may fall into it; and whoever breaks through a wall may be bitten by a snake. +\v 9 Whoever carves out stones may be injured by them. Whoever splits wood may be endangered by it. +\v 10 If the ax is blunt, and one doesn’t sharpen the edge, then he must use more strength; but skill brings success. +\p +\v 11 If the snake bites before it is charmed, then is there no profit for the charmer’s tongue. +\v 12 The words of a wise man’s mouth are gracious; but a fool is swallowed by his own lips. +\v 13 The beginning of the words of his mouth is foolishness; and the end of his talk is mischievous madness. +\v 14 A fool also multiplies words. +\p Man doesn’t know what will be; and that which will be after him, who can tell him? +\v 15 The labor of fools wearies every one of them; for he doesn’t know how to go to the city. +\q1 +\v 16 Woe to you, land, when your king is a child, +\q2 and your princes eat in the morning! +\q1 +\v 17 Happy are you, land, when your king is the son of nobles, +\q2 and your princes eat in due season, +\q2 for strength, and not for drunkenness! +\q1 +\v 18 By slothfulness the roof sinks in; +\q2 and through idleness of the hands the house leaks. +\q1 +\v 19 A feast is made for laughter, +\q2 and wine makes the life glad; +\q2 and money is the answer for all things. +\q1 +\v 20 Don’t curse the king, no, not in your thoughts; +\q2 and don’t curse the rich in your bedroom, +\q2 for a bird of the sky may carry your voice, +\q2 and that which has wings may tell the matter. +\c 11 +\p +\v 1 Cast your bread on the waters; +\q2 for you shall find it after many days. +\q1 +\v 2 Give a portion to seven, yes, even to eight; +\q2 for you don’t know what evil will be on the earth. +\q1 +\v 3 If the clouds are full of rain, they empty themselves on the earth; +\q2 and if a tree falls toward the south, or toward the north, +\q2 in the place where the tree falls, there shall it be. +\q1 +\v 4 He who observes the wind won’t sow; +\q2 and he who regards the clouds won’t reap. +\q1 +\v 5 As you don’t know what is the way of the wind, +\q2 nor how the bones grow in the womb of her who is with child; +\q2 even so you don’t know the work of God who does all. +\q1 +\v 6 In the morning sow your seed, +\q2 and in the evening don’t withhold your hand; +\q2 for you don’t know which will prosper, whether this or that, +\q2 or whether they both will be equally good. +\q1 +\v 7 Truly the light is sweet, +\q2 and it is a pleasant thing for the eyes to see the sun. +\q1 +\v 8 Yes, if a man lives many years, let him rejoice in them all; +\q2 but let him remember the days of darkness, for they shall be many. +\q2 All that comes is vanity. +\q1 +\v 9 Rejoice, young man, in your youth, +\q2 and let your heart cheer you in the days of your youth, +\q2 and walk in the ways of your heart, +\q2 and in the sight of your eyes; +\q2 but know that for all these things God will bring you into judgment. +\q1 +\v 10 Therefore remove sorrow from your heart, +\q2 and put away evil from your flesh; +\q2 for youth and the dawn of life are vanity. +\c 12 +\p +\v 1 Remember also your Creator in the days of your youth, +\q2 before the evil days come, and the years draw near, +\q2 when you will say, “I have no pleasure in them;” +\q1 +\v 2 Before the sun, the light, the moon, and the stars are darkened, +\q2 and the clouds return after the rain; +\q1 +\v 3 in the day when the keepers of the house shall tremble, +\q2 and the strong men shall bow themselves, +\q2 and the grinders cease because they are few, +\q2 and those who look out of the windows are darkened, +\q1 +\v 4 and the doors shall be shut in the street; +\q2 when the sound of the grinding is low, +\q2 and one shall rise up at the voice of a bird, +\q2 and all the daughters of music shall be brought low; +\q1 +\v 5 yes, they shall be afraid of heights, +\q2 and terrors will be on the way; +\q2 and the almond tree shall blossom, +\q2 and the grasshopper shall be a burden, +\q2 and desire shall fail; +\q2 because man goes to his everlasting home, +\q2 and the mourners go about the streets; +\q1 +\v 6 before the silver cord is severed, +\q2 or the golden bowl is broken, +\q2 or the pitcher is broken at the spring, +\q2 or the wheel broken at the cistern, +\q1 +\v 7 and the dust returns to the earth as it was, +\q2 and the spirit returns to God who gave it. +\q2 +\v 8 “Vanity of vanities,” says the Preacher. +\q2 “All is vanity!” +\p +\v 9 Further, because the Preacher was wise, he still taught the people knowledge. Yes, he pondered, sought out, and set in order many proverbs. +\v 10 The Preacher sought to find out acceptable words, and that which was written blamelessly, words of truth. +\v 11 The words of the wise are like goads; and like nails well fastened are words from the masters of assemblies, which are given from one shepherd. +\v 12 Furthermore, my son, be admonished: of making many books there is no end; and much study is a weariness of the flesh. +\p +\v 13 This is the end of the matter. All has been heard. Fear God and keep his commandments; for this is the whole duty of man. +\v 14 For God will bring every work into judgment, with every hidden thing, whether it is good, or whether it is evil. diff --git a/c-sharp/assets/WEB/22SNGengWEBUS.SFM b/c-sharp/assets/WEB/22SNGengWEBUS.SFM new file mode 100644 index 0000000000..e257b79746 --- /dev/null +++ b/c-sharp/assets/WEB/22SNGengWEBUS.SFM @@ -0,0 +1,550 @@ +\id SNG World English Bible (WEB) +\ide UTF-8 +\h Song of Solomon +\toc1 The Song of Solomon +\toc2 Song of Solomon +\toc3 Song of Solomon +\mt1 The Song of Solomon +\c 1 +\p +\v 1 The Song of songs, which is Solomon’s. +\sp Beloved +\q1 +\v 2 Let him kiss me with the kisses of his mouth; +\q2 for your love is better than wine. +\q1 +\v 3 Your oils have a pleasing fragrance. +\q2 Your name is oil poured out, +\q2 therefore the virgins love you. +\q1 +\v 4 Take me away with you. +\q2 Let’s hurry. +\q2 The king has brought me into his rooms. +\sp Friends +\q1 We will be glad and rejoice in you. +\q2 We will praise your love more than wine! +\sp Beloved +\q1 They are right to love you. +\q1 +\v 5 I am dark, but lovely, +\q2 you daughters of Jerusalem, +\q2 like Kedar’s tents, +\q2 like Solomon’s curtains. +\q1 +\v 6 Don’t stare at me because I am dark, +\q2 because the sun has scorched me. +\q1 My mother’s sons were angry with me. +\q2 They made me keeper of the vineyards. +\q2 I haven’t kept my own vineyard. +\q1 +\v 7 Tell me, you whom my soul loves, +\q2 where you graze your flock, +\q2 where you rest them at noon; +\q2 for why should I be as one who is veiled +\q2 beside the flocks of your companions? +\sp Lover +\q1 +\v 8 If you don’t know, most beautiful among women, +\q2 follow the tracks of the sheep. +\q2 Graze your young goats beside the shepherds’ tents. +\b +\q1 +\v 9 I have compared you, my love, +\q2 to a steed in Pharaoh’s chariots. +\q1 +\v 10 Your cheeks are beautiful with earrings, +\q2 your neck with strings of jewels. +\sp Friends +\q1 +\v 11 We will make you earrings of gold, +\q2 with studs of silver. +\sp Beloved +\q1 +\v 12 While the king sat at his table, +\q2 my perfume spread its fragrance. +\q1 +\v 13 My beloved is to me a sachet of myrrh, +\q2 that lies between my breasts. +\q1 +\v 14 My beloved is to me a cluster of henna blossoms +\q2 from the vineyards of En Gedi. +\sp Lover +\q1 +\v 15 Behold,\f + \fr 1:15 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* you are beautiful, my love. +\q2 Behold, you are beautiful. +\q2 Your eyes are like doves. +\sp Beloved +\q1 +\v 16 Behold, you are beautiful, my beloved, yes, pleasant; +\q2 and our couch is verdant. +\sp Lover +\q1 +\v 17 The beams of our house are cedars. +\q2 Our rafters are firs. +\c 2 +\sp Beloved +\q1 +\v 1 I am a rose of Sharon, +\q2 a lily of the valleys. +\sp Lover +\q1 +\v 2 As a lily among thorns, +\q2 so is my love among the daughters. +\sp Beloved +\q1 +\v 3 As the apple tree among the trees of the wood, +\q2 so is my beloved among the sons. +\q1 I sat down under his shadow with great delight, +\q2 his fruit was sweet to my taste. +\q1 +\v 4 He brought me to the banquet hall. +\q2 His banner over me is love. +\q1 +\v 5 Strengthen me with raisins, +\q2 refresh me with apples; +\q2 for I am faint with love. +\q1 +\v 6 His left hand is under my head. +\q2 His right hand embraces me. +\q1 +\v 7 I adjure you, daughters of Jerusalem, +\q2 by the roes, or by the hinds of the field, +\q2 that you not stir up, nor awaken love, +\q2 until it so desires. +\b +\q1 +\v 8 The voice of my beloved! +\q2 Behold, he comes, +\q2 leaping on the mountains, +\q2 skipping on the hills. +\q1 +\v 9 My beloved is like a roe or a young deer. +\q2 Behold, he stands behind our wall! +\q1 He looks in at the windows. +\q2 He glances through the lattice. +\b +\q1 +\v 10 My beloved spoke, and said to me, +\q2 “Rise up, my love, my beautiful one, and come away. +\q1 +\v 11 For behold, the winter is past. +\q2 The rain is over and gone. +\q1 +\v 12 The flowers appear on the earth. +\q2 The time of the singing has come, +\q2 and the voice of the turtledove is heard in our land. +\q1 +\v 13 The fig tree ripens her green figs. +\q2 The vines are in blossom. +\q2 They give out their fragrance. +\q1 Arise, my love, my beautiful one, +\q2 and come away.” +\sp Lover +\q1 +\v 14 My dove in the clefts of the rock, +\q2 in the hiding places of the mountainside, +\q2 let me see your face. +\q2 Let me hear your voice; +\q2 for your voice is sweet and your face is lovely. +\q1 +\v 15 Catch for us the foxes, +\q2 the little foxes that plunder the vineyards; +\q2 for our vineyards are in blossom. +\sp Beloved +\q1 +\v 16 My beloved is mine, and I am his. +\q2 He browses among the lilies. +\q1 +\v 17 Until the day is cool, and the shadows flee away, +\q2 turn, my beloved, +\q2 and be like a roe or a young deer on the mountains of Bether. +\c 3 +\p +\v 1 By night on my bed, +\q2 I sought him whom my soul loves. +\q2 I sought him, but I didn’t find him. +\q1 +\v 2 I will get up now, and go about the city; +\q2 in the streets and in the squares I will seek him whom my soul loves. +\q2 I sought him, but I didn’t find him. +\q1 +\v 3 The watchmen who go about the city found me; +\q2 “Have you seen him whom my soul loves?” +\q1 +\v 4 I had scarcely passed from them, +\q2 when I found him whom my soul loves. +\q1 I held him, and would not let him go, +\q2 until I had brought him into my mother’s house, +\q2 into the room of her who conceived me. +\b +\q1 +\v 5 I adjure you, daughters of Jerusalem, +\q2 by the roes, or by the hinds of the field, +\q2 that you not stir up nor awaken love, +\q2 until it so desires. +\b +\q1 +\v 6 Who is this who comes up from the wilderness like pillars of smoke, +\q2 perfumed with myrrh and frankincense, +\q2 with all spices of the merchant? +\q1 +\v 7 Behold, it is Solomon’s carriage! +\q2 Sixty mighty men are around it, +\q2 of the mighty men of Israel. +\q1 +\v 8 They all handle the sword, and are expert in war. +\q2 Every man has his sword on his thigh, +\q2 because of fear in the night. +\b +\q1 +\v 9 King Solomon made himself a carriage +\q2 of the wood of Lebanon. +\q1 +\v 10 He made its pillars of silver, +\q2 its bottom of gold, its seat of purple, +\q2 the middle of it being paved with love, +\q2 from the daughters of Jerusalem. +\q1 +\v 11 Go out, you daughters of Zion, and see King Solomon, +\q2 with the crown with which his mother has crowned him, +\q2 in the day of his weddings, +\q2 in the day of the gladness of his heart. +\c 4 +\sp Lover +\p +\v 1 Behold, you are beautiful, my love. +\q2 Behold, you are beautiful. +\q1 Your eyes are like doves behind your veil. +\q2 Your hair is as a flock of goats, +\q2 that descend from Mount Gilead. +\q1 +\v 2 Your teeth are like a newly shorn flock, +\q2 which have come up from the washing, +\q2 where every one of them has twins. +\q2 None is bereaved among them. +\q1 +\v 3 Your lips are like scarlet thread. +\q2 Your mouth is lovely. +\q2 Your temples are like a piece of a pomegranate behind your veil. +\q1 +\v 4 Your neck is like David’s tower built for an armory, +\q2 on which a thousand shields hang, +\q2 all the shields of the mighty men. +\q1 +\v 5 Your two breasts are like two fawns +\q2 that are twins of a roe, +\q2 which feed among the lilies. +\b +\q1 +\v 6 Until the day is cool, and the shadows flee away, +\q2 I will go to the mountain of myrrh, +\q2 to the hill of frankincense. +\b +\q1 +\v 7 You are all beautiful, my love. +\q2 There is no spot in you. +\q1 +\v 8 Come with me from Lebanon, my bride, +\q2 with me from Lebanon. +\q2 Look from the top of Amana, +\q2 from the top of Senir and Hermon, +\q2 from the lions’ dens, +\q2 from the mountains of the leopards. +\b +\q1 +\v 9 You have ravished my heart, my sister, my bride. +\q2 You have ravished my heart with one of your eyes, +\q2 with one chain of your neck. +\q1 +\v 10 How beautiful is your love, my sister, my bride! +\q2 How much better is your love than wine, +\q2 the fragrance of your perfumes than all kinds of spices! +\q1 +\v 11 Your lips, my bride, drip like the honeycomb. +\q2 Honey and milk are under your tongue. +\q2 The smell of your garments is like the smell of Lebanon. +\q1 +\v 12 My sister, my bride, is a locked up garden; +\q2 a locked up spring, +\q2 a sealed fountain. +\q1 +\v 13 Your shoots are an orchard of pomegranates, with precious fruits, +\q2 henna with spikenard plants, +\q2 +\v 14 spikenard and saffron, +\q2 calamus and cinnamon, with every kind of incense tree; +\q2 myrrh and aloes, with all the best spices, +\q2 +\v 15 a fountain of gardens, +\q2 a well of living waters, +\q2 flowing streams from Lebanon. +\sp Beloved +\q1 +\v 16 Awake, north wind, and come, you south! +\q2 Blow on my garden, that its spices may flow out. +\q1 Let my beloved come into his garden, +\q2 and taste his precious fruits. +\c 5 +\sp Lover +\q1 +\v 1 I have come into my garden, my sister, my bride. +\q2 I have gathered my myrrh with my spice; +\q2 I have eaten my honeycomb with my honey; +\q2 I have drunk my wine with my milk. +\sp Friends +\q1 Eat, friends! +\q2 Drink, yes, drink abundantly, beloved. +\sp Beloved +\q1 +\v 2 I was asleep, but my heart was awake. +\q2 It is the voice of my beloved who knocks: +\q2 “Open to me, my sister, my love, my dove, my undefiled; +\q2 for my head is filled with dew, +\q2 and my hair with the dampness of the night.” +\q1 +\v 3 I have taken off my robe. Indeed, must I put it on? +\q2 I have washed my feet. Indeed, must I soil them? +\q1 +\v 4 My beloved thrust his hand in through the latch opening. +\q2 My heart pounded for him. +\q1 +\v 5 I rose up to open for my beloved. +\q2 My hands dripped with myrrh, +\q2 my fingers with liquid myrrh, +\q2 on the handles of the lock. +\q1 +\v 6 I opened to my beloved; +\q2 but my beloved left, and had gone away. +\q1 My heart went out when he spoke. +\q2 I looked for him, but I didn’t find him. +\q2 I called him, but he didn’t answer. +\q1 +\v 7 The watchmen who go about the city found me. +\q2 They beat me. +\q2 They bruised me. +\q2 The keepers of the walls took my cloak away from me. +\b +\q1 +\v 8 I adjure you, daughters of Jerusalem, +\q2 If you find my beloved, +\q2 that you tell him that I am faint with love. +\sp Friends +\q1 +\v 9 How is your beloved better than another beloved, +\q2 you fairest among women? +\q1 How is your beloved better than another beloved, +\q1 that you do so adjure us? +\sp Beloved +\q1 +\v 10 My beloved is white and ruddy. +\q2 The best among ten thousand. +\q1 +\v 11 His head is like the purest gold. +\q2 His hair is bushy, black as a raven. +\q1 +\v 12 His eyes are like doves beside the water brooks, +\q2 washed with milk, mounted like jewels. +\q1 +\v 13 His cheeks are like a bed of spices with towers of perfumes. +\q2 His lips are like lilies, dropping liquid myrrh. +\q1 +\v 14 His hands are like rings of gold set with beryl. +\q2 His body is like ivory work overlaid with sapphires. +\q1 +\v 15 His legs are like pillars of marble set on sockets of fine gold. +\q2 His appearance is like Lebanon, excellent as the cedars. +\q1 +\v 16 His mouth is sweetness; +\q2 yes, he is altogether lovely. +\q1 This is my beloved, and this is my friend, +\q2 daughters of Jerusalem. +\c 6 +\sp Friends +\q1 +\v 1 Where has your beloved gone, you fairest among women? +\q2 Where has your beloved turned, that we may seek him with you? +\sp Beloved +\q1 +\v 2 My beloved has gone down to his garden, +\q2 to the beds of spices, +\q2 to pasture his flock in the gardens, and to gather lilies. +\q1 +\v 3 I am my beloved’s, and my beloved is mine. +\q2 He browses among the lilies. +\b +\sp Lover +\q1 +\v 4 You are beautiful, my love, as Tirzah, +\q2 lovely as Jerusalem, +\q2 awesome as an army with banners. +\q1 +\v 5 Turn away your eyes from me, +\q2 for they have overcome me. +\q1 Your hair is like a flock of goats, +\q2 that lie along the side of Gilead. +\q1 +\v 6 Your teeth are like a flock of ewes, +\q2 which have come up from the washing, +\q2 of which every one has twins; +\q2 not one is bereaved among them. +\q1 +\v 7 Your temples are like a piece of a pomegranate behind your veil. +\b +\q1 +\v 8 There are sixty queens, eighty concubines, +\q2 and virgins without number. +\q1 +\v 9 My dove, my perfect one, is unique. +\q2 She is her mother’s only daughter. +\q2 She is the favorite one of her who bore her. +\q1 The daughters saw her, and called her blessed. +\q2 The queens and the concubines saw her, and they praised her. +\b +\q1 +\v 10 Who is she who looks out as the morning, +\q2 beautiful as the moon, +\q2 clear as the sun, +\q2 and awesome as an army with banners? +\b +\q1 +\v 11 I went down into the nut tree grove, +\q2 to see the green plants of the valley, +\q2 to see whether the vine budded, +\q2 and the pomegranates were in flower. +\q1 +\v 12 Without realizing it, +\q2 my desire set me with my royal people’s chariots. +\sp Friends +\q1 +\v 13 Return, return, Shulammite! +\q2 Return, return, that we may gaze at you. +\sp Lover +\q1 Why do you desire to gaze at the Shulammite, +\q2 as at the dance of Mahanaim? +\c 7 +\p +\v 1 How beautiful are your feet in sandals, prince’s daughter! +\q2 Your rounded thighs are like jewels, +\q2 the work of the hands of a skillful workman. +\q1 +\v 2 Your body is like a round goblet, +\q2 no mixed wine is wanting. +\q1 Your waist is like a heap of wheat, +\q2 set about with lilies. +\q1 +\v 3 Your two breasts are like two fawns, +\q2 that are twins of a roe. +\q1 +\v 4 Your neck is like an ivory tower. +\q2 Your eyes are like the pools in Heshbon by the gate of Bathrabbim. +\q2 Your nose is like the tower of Lebanon which looks toward Damascus. +\q1 +\v 5 Your head on you is like Carmel. +\q2 The hair of your head like purple. +\q2 The king is held captive in its tresses. +\q1 +\v 6 How beautiful and how pleasant you are, +\q2 love, for delights! +\q1 +\v 7 This, your stature, is like a palm tree, +\q2 your breasts like its fruit. +\q1 +\v 8 I said, “I will climb up into the palm tree. +\q2 I will take hold of its fruit.” +\q1 Let your breasts be like clusters of the vine, +\q2 the smell of your breath like apples. +\q1 +\v 9 Your mouth is like the best wine, +\q2 that goes down smoothly for my beloved, +\q2 gliding through the lips of those who are asleep. +\sp Beloved +\q1 +\v 10 I am my beloved’s. +\q2 His desire is toward me. +\q1 +\v 11 Come, my beloved! Let’s go out into the field. +\q2 Let’s lodge in the villages. +\q1 +\v 12 Let’s go early up to the vineyards. +\q2 Let’s see whether the vine has budded, +\q2 its blossom is open, +\q2 and the pomegranates are in flower. +\q2 There I will give you my love. +\q1 +\v 13 The mandrakes produce fragrance. +\q2 At our doors are all kinds of precious fruits, new and old, +\q2 which I have stored up for you, my beloved. +\c 8 + +\p +\v 1 Oh that you were like my brother, +\q2 who nursed from the breasts of my mother! +\q1 If I found you outside, I would kiss you; +\q2 yes, and no one would despise me. +\q1 +\v 2 I would lead you, bringing you into the house of my mother, +\q2 who would instruct me. +\q1 I would have you drink spiced wine, +\q2 of the juice of my pomegranate. +\q1 +\v 3 His left hand would be under my head. +\q2 His right hand would embrace me. +\b +\q1 +\v 4 I adjure you, daughters of Jerusalem, +\q2 that you not stir up, nor awaken love, +\q2 until it so desires. +\sp Friends +\q1 +\v 5 Who is this who comes up from the wilderness, +\q2 leaning on her beloved? +\b +\sp Beloved +\q1 Under the apple tree I awakened you. +\q2 There your mother conceived you. +\q2 There she was in labor and bore you. +\b +\q1 +\v 6 Set me as a seal on your heart, +\q2 as a seal on your arm; +\q2 for love is strong as death. +\q2 Jealousy is as cruel as Sheol.\f + \fr 8:6 \ft Sheol is the place of the dead. \f* +\q2 Its flashes are flashes of fire, +\q2 a very flame of Yah.\f + \fr 8:6 \ft “Yah” is a short form of “Yahweh”, which is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* +\q1 +\v 7 Many waters can’t quench love, +\q2 neither can floods drown it. +\q1 If a man would give all the wealth of his house for love, +\q2 he would be utterly scorned. +\sp Brothers +\q1 +\v 8 We have a little sister. +\q2 She has no breasts. +\q1 What shall we do for our sister +\q2 in the day when she is to be spoken for? +\b +\q1 +\v 9 If she is a wall, +\q2 we will build on her a turret of silver. +\q1 If she is a door, +\q2 we will enclose her with boards of cedar. +\sp Beloved +\q1 +\v 10 I am a wall, and my breasts like towers, +\q2 then I was in his eyes like one who found peace. +\q1 +\v 11 Solomon had a vineyard at Baal Hamon. +\q2 He leased out the vineyard to keepers. +\q2 Each was to bring a thousand shekels\f + \fr 8:11 \ft A shekel is about 10 grams or about 0.35 ounces, so 1000 shekels is about 10 kilograms or about 22 pounds.\f* of silver for its fruit. +\q1 +\v 12 My own vineyard is before me. +\q2 The thousand are for you, Solomon, +\q2 two hundred for those who tend its fruit. +\sp Lover +\q1 +\v 13 You who dwell in the gardens, with friends in attendance, +\q2 let me hear your voice! +\sp Beloved +\q1 +\v 14 Come away, my beloved! +\q2 Be like a gazelle or a young stag on the mountains of spices! diff --git a/c-sharp/assets/WEB/23ISAengWEBUS.SFM b/c-sharp/assets/WEB/23ISAengWEBUS.SFM new file mode 100644 index 0000000000..e1fc8f120c --- /dev/null +++ b/c-sharp/assets/WEB/23ISAengWEBUS.SFM @@ -0,0 +1,4442 @@ +\id ISA 23-ISA-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Isaiah +\toc1 The Book of Isaiah +\toc2 Isaiah +\toc3 Isaiah +\mt2 The Book of the Prophet +\mt1 Isaiah +\c 1 +\p +\v 1 The vision of Isaiah the son of Amoz, which he saw concerning Judah and Jerusalem, in the days of Uzziah, Jotham, Ahaz, and Hezekiah, kings of Judah. +\q1 +\v 2 Hear, heavens, +\q2 and listen, earth; for Yahweh\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* has spoken: +\q1 “I have nourished and brought up children +\q2 and they have rebelled against me. +\q1 +\v 3 The ox knows his owner, +\q2 and the donkey his master’s crib; +\q2 but Israel doesn’t know. +\q2 My people don’t consider.” +\q1 +\v 4 Ah sinful nation, +\q2 a people loaded with iniquity, +\q2 offspring\f + \fr 1:4 \ft or, seed\f* of evildoers, +\q2 children who deal corruptly! +\q1 They have forsaken Yahweh. +\q2 They have despised the Holy One of Israel. +\q2 They are estranged and backward. +\q1 +\v 5 Why should you be beaten more, +\q2 that you revolt more and more? +\q1 The whole head is sick, +\q2 and the whole heart faint. +\q1 +\v 6 From the sole of the foot even to the head there is no soundness in it, +\q2 but wounds, welts, and open sores. +\q2 They haven’t been closed, bandaged, or soothed with oil. +\q1 +\v 7 Your country is desolate. +\q2 Your cities are burned with fire. +\q2 Strangers devour your land in your presence +\q2 and it is desolate, +\q2 as overthrown by strangers. +\q1 +\v 8 The daughter of Zion is left like a shelter in a vineyard, +\q2 like a hut in a field of melons, +\q2 like a besieged city. +\q1 +\v 9 Unless Yahweh of Armies had left to us a very small remnant, +\q2 we would have been as Sodom. +\q2 We would have been like Gomorrah. +\b +\q1 +\v 10 Hear Yahweh’s word, you rulers of Sodom! +\q2 Listen to the law of our God,\f + \fr 1:10 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* you people of Gomorrah! +\q1 +\v 11 “What are the multitude of your sacrifices to me?”, says Yahweh. +\q2 “I have had enough of the burnt offerings of rams +\q2 and the fat of fed animals. +\q2 I don’t delight in the blood of bulls, +\q2 or of lambs, +\q2 or of male goats. +\q1 +\v 12 When you come to appear before me, +\q2 who has required this at your hand, to trample my courts? +\q1 +\v 13 Bring no more vain offerings. +\q2 Incense is an abomination to me. +\q2 New moons, Sabbaths, and convocations— +\q2 I can’t stand evil assemblies. +\q1 +\v 14 My soul hates your New Moons and your appointed feasts. +\q2 They are a burden to me. +\q2 I am weary of bearing them. +\q1 +\v 15 When you spread out your hands, I will hide my eyes from you. +\q2 Yes, when you make many prayers, I will not hear. +\q2 Your hands are full of blood. +\q1 +\v 16 Wash yourselves. Make yourself clean. +\q2 Put away the evil of your doings from before my eyes. +\q2 Cease to do evil. +\q1 +\v 17 Learn to do well. +\q2 Seek justice. +\q2 Relieve the oppressed. +\q1 Defend the fatherless. +\q2 Plead for the widow.” +\b +\q1 +\v 18 “Come now, and let’s reason together,” says Yahweh: +\q2 “Though your sins are as scarlet, they shall be as white as snow. +\q2 Though they are red like crimson, they shall be as wool. +\q1 +\v 19 If you are willing and obedient, +\q2 you will eat the good of the land; +\q2 +\v 20 but if you refuse and rebel, you will be devoured with the sword; +\q2 for Yahweh’s mouth has spoken it.” +\b +\q1 +\v 21 How the faithful city has become a prostitute! +\q2 She was full of justice. +\q1 Righteousness lodged in her, +\q2 but now there are murderers. +\q1 +\v 22 Your silver has become dross, +\q2 your wine mixed with water. +\q1 +\v 23 Your princes are rebellious and companions of thieves. +\q2 Everyone loves bribes and follows after rewards. +\q2 They don’t defend the fatherless, +\q2 neither does the cause of the widow come to them. +\b +\q1 +\v 24 Therefore the Lord,\f + \fr 1:24 \ft The word translated “Lord” is “Adonai.” \f* Yahweh of Armies, +\q2 the Mighty One of Israel, says: +\q1 “Ah, I will get relief from my adversaries, +\q2 and avenge myself on my enemies. +\q1 +\v 25 I will turn my hand on you, +\q2 thoroughly purge away your dross, +\q2 and will take away all your tin.\f + \fr 1:25 \ft tin is a metal that is separated from silver during the refining and purification process.\f* +\q1 +\v 26 I will restore your judges as at the first, +\q2 and your counselors as at the beginning. +\q1 Afterward you shall be called ‘The city of righteousness, +\q2 a faithful town.’ +\q1 +\v 27 Zion shall be redeemed with justice, +\q2 and her converts with righteousness. +\q1 +\v 28 But the destruction of transgressors and sinners shall be together, +\q2 and those who forsake Yahweh shall be consumed. +\q1 +\v 29 For they shall be ashamed of the oaks which you have desired, +\q2 and you shall be confounded for the gardens that you have chosen. +\q1 +\v 30 For you shall be as an oak whose leaf fades, +\q2 and as a garden that has no water. +\q1 +\v 31 The strong will be like tinder, +\q2 and his work like a spark. +\q1 They will both burn together, +\q2 and no one will quench them.” +\c 2 +\p +\v 1 This is what Isaiah the son of Amoz saw concerning Judah and Jerusalem. +\q1 +\v 2 It shall happen in the latter days, that the mountain of Yahweh’s house shall be established on the top of the mountains, +\q2 and shall be raised above the hills; +\q2 and all nations shall flow to it. +\q1 +\v 3 Many peoples shall go and say, +\q2 “Come, let’s go up to the mountain of Yahweh, +\q2 to the house of the God of Jacob; +\q2 and he will teach us of his ways, +\q2 and we will walk in his paths.” +\q1 For the law shall go out of Zion, +\q2 and Yahweh’s word from Jerusalem. +\q1 +\v 4 He will judge between the nations, +\q2 and will decide concerning many peoples. +\q2 They shall beat their swords into plowshares, +\q2 and their spears into pruning hooks. +\q1 Nation shall not lift up sword against nation, +\q2 neither shall they learn war any more. +\b +\q1 +\v 5 House of Jacob, come, and let’s walk in the light of Yahweh. +\q1 +\v 6 For you have forsaken your people, the house of Jacob, +\q2 because they are filled from the east, +\q2 with those who practice divination like the Philistines, +\q2 and they clasp hands with the children of foreigners. +\q1 +\v 7 Their land is full of silver and gold, +\q2 neither is there any end of their treasures. +\q1 Their land also is full of horses, +\q2 neither is there any end of their chariots. +\q1 +\v 8 Their land also is full of idols. +\q2 They worship the work of their own hands, +\q2 that which their own fingers have made. +\q1 +\v 9 Man is brought low, +\q2 and mankind is humbled; +\q2 therefore don’t forgive them. +\q1 +\v 10 Enter into the rock, +\q2 and hide in the dust, +\q1 from before the terror of Yahweh, +\q2 and from the glory of his majesty. +\q1 +\v 11 The lofty looks of man will be brought low, +\q2 the arrogance of men will be bowed down, +\q2 and Yahweh alone will be exalted in that day. +\b +\q1 +\v 12 For there will be a day of Yahweh of Armies for all that is proud and arrogant, +\q2 and for all that is lifted up, +\q2 and it shall be brought low— +\q2 +\v 13 for all the cedars of Lebanon, that are high and lifted up, +\q2 for all the oaks of Bashan, +\q2 +\v 14 for all the high mountains, +\q2 for all the hills that are lifted up, +\q2 +\v 15 for every lofty tower, +\q2 for every fortified wall, +\q2 +\v 16 for all the ships of Tarshish, +\q2 and for all pleasant imagery. +\q1 +\v 17 The loftiness of man shall be bowed down, +\q2 and the arrogance of men shall be brought low; +\q2 and Yahweh alone shall be exalted in that day. +\q1 +\v 18 The idols shall utterly pass away. +\q1 +\v 19 Men shall go into the caves of the rocks, +\q2 and into the holes of the earth, +\q2 from before the terror of Yahweh, +\q2 and from the glory of his majesty, +\q2 when he arises to shake the earth mightily. +\q1 +\v 20 In that day, men shall cast away their idols of silver +\q2 and their idols of gold, +\q2 which have been made for themselves to worship, +\q2 to the moles and to the bats, +\q2 +\v 21 to go into the caverns of the rocks, +\q2 and into the clefts of the ragged rocks, +\q2 from before the terror of Yahweh, +\q2 and from the glory of his majesty, +\q2 when he arises to shake the earth mightily. +\q1 +\v 22 Stop trusting in man, whose breath is in his nostrils; +\q2 for of what account is he? +\c 3 +\q1 +\v 1 For, behold,\f + \fr 3:1 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the Lord, Yahweh of Armies, takes away from Jerusalem and from Judah supply and support, +\q2 the whole supply of bread, +\q2 and the whole supply of water; +\q2 +\v 2 the mighty man, +\q2 the man of war, +\q2 the judge, +\q2 the prophet, +\q2 the diviner, +\q2 the elder, +\q2 +\v 3 the captain of fifty, +\q2 the honorable man, +\q2 the counselor, +\q2 the skilled craftsman, +\q2 and the clever enchanter. +\q1 +\v 4 I will give boys to be their princes, +\q2 and children shall rule over them. +\q1 +\v 5 The people will be oppressed, +\q2 everyone by another, +\q2 and everyone by his neighbor. +\q1 The child will behave himself proudly against the old man, +\q2 and the wicked against the honorable. +\q1 +\v 6 Indeed a man shall take hold of his brother in the house of his father, saying, +\q2 “You have clothing, you be our ruler, +\q2 and let this ruin be under your hand.” +\q1 +\v 7 In that day he will cry out, saying, “I will not be a healer; +\q2 for in my house is neither bread nor clothing. +\q2 You shall not make me ruler of the people.” +\q1 +\v 8 For Jerusalem is ruined, and Judah is fallen; +\q2 because their tongue and their doings are against Yahweh, +\q1 to provoke the eyes of his glory. +\q1 +\v 9 The look of their faces testify against them. +\q2 They parade their sin like Sodom. +\q2 They don’t hide it. +\q2 Woe to their soul! +\q2 For they have brought disaster upon themselves. +\q1 +\v 10 Tell the righteous that it will be well with them, +\q2 for they will eat the fruit of their deeds. +\q1 +\v 11 Woe to the wicked! +\q2 Disaster is upon them, +\q2 for the deeds of their hands will be paid back to them. +\q1 +\v 12 As for my people, children are their oppressors, +\q2 and women rule over them. +\q2 My people, those who lead you cause you to err, +\q2 and destroy the way of your paths. +\b +\q1 +\v 13 Yahweh stands up to contend, +\q2 and stands to judge the peoples. +\q1 +\v 14 Yahweh will enter into judgment with the elders of his people +\q2 and their leaders: +\q2 “It is you who have eaten up the vineyard. +\q2 The plunder of the poor is in your houses. +\q2 +\v 15 What do you mean that you crush my people, +\q2 and grind the face of the poor?” says the Lord, Yahweh of Armies. +\b +\q1 +\v 16 Moreover Yahweh said, “Because the daughters of Zion are arrogant, +\q2 and walk with outstretched necks and flirting eyes, +\q2 walking daintily as they go, +\q2 jingling ornaments on their feet; +\q1 +\v 17 therefore the Lord brings sores on the crown of the head of the women of Zion, +\q2 and Yahweh will make their scalps bald.” +\p +\v 18 In that day the Lord will take away the beauty of their anklets, the headbands, the crescent necklaces, +\v 19 the earrings, the bracelets, the veils, +\v 20 the headdresses, the ankle chains, the sashes, the perfume containers, the charms, +\v 21 the signet rings, the nose rings, +\v 22 the fine robes, the capes, the cloaks, the purses, +\v 23 the hand mirrors, the fine linen garments, the tiaras, and the shawls. +\q1 +\v 24 It shall happen that instead of sweet spices, there shall be rottenness; +\q2 instead of a belt, a rope; +\q2 instead of well set hair, baldness; +\q2 instead of a robe, a wearing of sackcloth; +\q2 and branding instead of beauty. +\q1 +\v 25 Your men shall fall by the sword, +\q2 and your mighty in the war. +\q1 +\v 26 Her gates shall lament and mourn. +\q2 She shall be desolate and sit on the ground. +\c 4 +\p +\v 1 Seven women shall take hold of one man in that day, saying, “We will eat our own bread, and wear our own clothing. Just let us be called by your name. Take away our reproach.” +\p +\v 2 In that day, Yahweh’s branch will be beautiful and glorious, and the fruit of the land will be the beauty and glory of the survivors of Israel. +\v 3 It will happen that he who is left in Zion and he who remains in Jerusalem shall be called holy, even everyone who is written among the living in Jerusalem, +\v 4 when the Lord shall have washed away the filth of the daughters of Zion, and shall have purged the blood of Jerusalem from within it, by the spirit of justice and by the spirit of burning. +\v 5 Yahweh will create over the whole habitation of Mount Zion and over her assemblies, a cloud and smoke by day, and the shining of a flaming fire by night, for over all the glory will be a canopy. +\v 6 There will be a pavilion for a shade in the daytime from the heat, and for a refuge and for a shelter from storm and from rain. +\c 5 +\q1 +\v 1 Let me sing for my well beloved a song of my beloved about his vineyard. +\q2 My beloved had a vineyard on a very fruitful hill. +\q1 +\v 2 He dug it up, +\q2 gathered out its stones, +\q2 planted it with the choicest vine, +\q2 built a tower in the middle of it, +\q2 and also cut out a wine press in it. +\q1 He looked for it to yield grapes, +\q2 but it yielded wild grapes. +\b +\q1 +\v 3 “Now, inhabitants of Jerusalem and men of Judah, +\q2 please judge between me and my vineyard. +\q1 +\v 4 What could have been done more to my vineyard, that I have not done in it? +\q2 Why, when I looked for it to yield grapes, did it yield wild grapes? +\q1 +\v 5 Now I will tell you what I will do to my vineyard. +\q2 I will take away its hedge, and it will be eaten up. +\q2 I will break down its wall, and it will be trampled down. +\q1 +\v 6 I will lay it a wasteland. +\q2 It won’t be pruned or hoed, +\q2 but it will grow briers and thorns. +\q2 I will also command the clouds that they rain no rain on it.” +\q1 +\v 7 For the vineyard of Yahweh of Armies is the house of Israel, +\q2 and the men of Judah his pleasant plant. +\q2 He looked for justice, but behold, oppression, +\q2 for righteousness, but behold, a cry of distress. +\b +\q1 +\v 8 Woe to those who join house to house, +\q2 who lay field to field, until there is no room, +\q2 and you are made to dwell alone in the middle of the land! +\q1 +\v 9 In my ears, Yahweh of Armies says: “Surely many houses will be desolate, +\q2 even great and beautiful, unoccupied. +\q1 +\v 10 For ten acres\f + \fr 5:10 \ft literally, ten yokes, or the amount of land that ten yokes of oxen can plow in one day, which is about 10 acres or 4 hectares.\f* of vineyard shall yield one bath,\f + \fr 5:10 \ft 1 bath is about 22 liters or 5.8 U. S. gallons\f* +\q2 and a homer\f + \fr 5:10 \ft 1 homer is about 220 liters or 6 bushels\f* of seed shall yield an ephah.”\f + \fr 5:10 \ft 1 ephah is about 22 liters or 0.6 bushels or about 2 pecks—only one tenth of what was sown.\f* +\q1 +\v 11 Woe to those who rise up early in the morning, that they may follow strong drink, +\q2 who stay late into the night, until wine inflames them! +\q1 +\v 12 The harp, lyre, tambourine, and flute, with wine, are at their feasts; +\q2 but they don’t respect the work of Yahweh, +\q2 neither have they considered the operation of his hands. +\b +\q1 +\v 13 Therefore my people go into captivity for lack of knowledge. +\q2 Their honorable men are famished, +\q2 and their multitudes are parched with thirst. +\q1 +\v 14 Therefore Sheol\f + \fr 5:14 \ft Sheol is the place of the dead.\f* has enlarged its desire, +\q2 and opened its mouth without measure; +\q2 and their glory, their multitude, their pomp, and he who rejoices among them, descend into it. +\q1 +\v 15 So man is brought low, +\q2 mankind is humbled, +\q2 and the eyes of the arrogant ones are humbled; +\q1 +\v 16 but Yahweh of Armies is exalted in justice, +\q2 and God the Holy One is sanctified in righteousness. +\q1 +\v 17 Then the lambs will graze as in their pasture, +\q2 and strangers will eat the ruins of the rich. +\b +\q1 +\v 18 Woe to those who draw iniquity with cords of falsehood, +\q2 and wickedness as with cart rope, +\q1 +\v 19 who say, “Let him make haste, let him hasten his work, that we may see it; +\q2 let the counsel of the Holy One of Israel draw near and come, +\q2 that we may know it!” +\q1 +\v 20 Woe to those who call evil good, and good evil; +\q2 who put darkness for light, +\q2 and light for darkness; +\q1 who put bitter for sweet, +\q2 and sweet for bitter! +\q1 +\v 21 Woe to those who are wise in their own eyes, +\q2 and prudent in their own sight! +\q1 +\v 22 Woe to those who are mighty to drink wine, +\q2 and champions at mixing strong drink; +\q1 +\v 23 who acquit the guilty for a bribe, +\q2 but deny justice for the innocent! +\b +\q1 +\v 24 Therefore as the tongue of fire devours the stubble, +\q2 and as the dry grass sinks down in the flame, +\q2 so their root shall be as rottenness, +\q2 and their blossom shall go up as dust, +\q1 because they have rejected the law of Yahweh of Armies, +\q2 and despised the word of the Holy One of Israel. +\q1 +\v 25 Therefore Yahweh’s anger burns against his people, +\q2 and he has stretched out his hand against them and has struck them. +\q1 The mountains tremble, +\q2 and their dead bodies are as refuse in the middle of the streets. +\q1 For all this, his anger is not turned away, +\q2 but his hand is still stretched out. +\b +\q1 +\v 26 He will lift up a banner to the nations from far away, +\q2 and he will whistle for them from the end of the earth. +\q2 Behold, they will come speedily and swiftly. +\q1 +\v 27 No one shall be weary nor stumble among them; +\q2 no one shall slumber nor sleep, +\q2 neither shall the belt of their waist be untied, +\q2 nor the strap of their sandals be broken, +\q1 +\v 28 whose arrows are sharp, +\q2 and all their bows bent. +\q1 Their horses’ hoofs will be like flint, +\q2 and their wheels like a whirlwind. +\q1 +\v 29 Their roaring will be like a lioness. +\q2 They will roar like young lions. +\q1 Yes, they shall roar, +\q2 and seize their prey and carry it off, +\q2 and there will be no one to deliver. +\q1 +\v 30 They will roar against them in that day like the roaring of the sea. +\q2 If one looks to the land, behold, darkness and distress. +\q2 The light is darkened in its clouds. +\c 6 +\p +\v 1 In the year that King Uzziah died, I saw the Lord sitting on a throne, high and lifted up; and his train filled the temple. +\v 2 Above him stood the seraphim. Each one had six wings. With two he covered his face. With two he covered his feet. With two he flew. +\v 3 One called to another, and said, +\q1 “Holy, holy, holy, is Yahweh of Armies! +\q2 The whole earth is full of his glory!” +\p +\v 4 The foundations of the thresholds shook at the voice of him who called, and the house was filled with smoke. +\v 5 Then I said, “Woe is me! For I am undone, because I am a man of unclean lips and I live among a people of unclean lips, for my eyes have seen the King, Yahweh of Armies!” +\p +\v 6 Then one of the seraphim flew to me, having a live coal in his hand, which he had taken with the tongs from off the altar. +\v 7 He touched my mouth with it, and said, “Behold, this has touched your lips; and your iniquity is taken away, and your sin forgiven.” +\p +\v 8 I heard the Lord’s voice, saying, “Whom shall I send, and who will go for us?” +\p Then I said, “Here I am. Send me!” +\p +\v 9 He said, “Go, and tell this people, +\q1 ‘You hear indeed, +\q2 but don’t understand. +\q1 You see indeed, +\q2 but don’t perceive.’ +\q1 +\v 10 Make the heart of this people fat. +\q2 Make their ears heavy, and shut their eyes; +\q1 lest they see with their eyes, +\q2 hear with their ears, +\q2 understand with their heart, +\q2 and turn again, and be healed.” +\p +\v 11 Then I said, “Lord, how long?” +\p He answered, +\q1 “Until cities are waste without inhabitant, +\q2 houses without man, +\q2 the land becomes utterly waste, +\q2 +\v 12 and Yahweh has removed men far away, +\q2 and the forsaken places are many within the land. +\q1 +\v 13 If there is a tenth left in it, +\q2 that also will in turn be consumed, +\q1 as a terebinth, and as an oak whose stump remains when they are cut down, +\q2 so the holy seed is its stump.” +\c 7 +\p +\v 1 In the days of Ahaz the son of Jotham, the son of Uzziah, king of Judah, Rezin the king of Syria and Pekah the son of Remaliah, king of Israel, went up to Jerusalem to war against it, but could not prevail against it. +\v 2 David’s house was told, “Syria is allied with Ephraim.” His heart trembled, and the heart of his people, as the trees of the forest tremble with the wind. +\p +\v 3 Then Yahweh said to Isaiah, “Go out now to meet Ahaz, you, and Shearjashub your son, at the end of the conduit of the upper pool, on the highway of the fuller’s field. +\v 4 Tell him, ‘Be careful, and keep calm. Don’t be afraid, neither let your heart be faint because of these two tails of smoking torches, for the fierce anger of Rezin and Syria, and of the son of Remaliah. +\v 5 Because Syria, Ephraim, and the son of Remaliah, have plotted evil against you, saying, +\v 6 “Let’s go up against Judah, and tear it apart, and let’s divide it among ourselves, and set up a king within it, even the son of Tabeel.” +\v 7 This is what the Lord Yahweh says: “It shall not stand, neither shall it happen.” +\v 8 For the head of Syria is Damascus, and the head of Damascus is Rezin. Within sixty-five years Ephraim shall be broken in pieces, so that it shall not be a people. +\v 9 The head of Ephraim is Samaria, and the head of Samaria is Remaliah’s son. If you will not believe, surely you shall not be established.’” +\p +\v 10 Yahweh spoke again to Ahaz, saying, +\v 11 “Ask a sign of Yahweh your God; ask it either in the depth, or in the height above.” +\p +\v 12 But Ahaz said, “I won’t ask. I won’t tempt Yahweh.” +\p +\v 13 He said, “Listen now, house of David. Is it not enough for you to try the patience of men, that you will try the patience of my God also? +\v 14 Therefore the Lord himself will give you a sign. Behold, the virgin will conceive, and bear a son, and shall call his name Immanuel.\f + \fr 7:14 \ft “Immanuel” means “God with us”.\f* +\v 15 He shall eat butter and honey when he knows to refuse the evil and choose the good. +\v 16 For before the child knows to refuse the evil and choose the good, the land whose two kings you abhor shall be forsaken. +\v 17 Yahweh will bring on you, on your people, and on your father’s house days that have not come, from the day that Ephraim departed from Judah, even the king of Assyria. +\p +\v 18 It will happen in that day that Yahweh will whistle for the fly that is in the uttermost part of the rivers of Egypt, and for the bee that is in the land of Assyria. +\v 19 They shall come, and shall all rest in the desolate valleys, in the clefts of the rocks, on all thorn hedges, and on all pastures. +\p +\v 20 In that day the Lord will shave with a razor that is hired in the parts beyond the River, even with the king of Assyria, the head and the hair of the feet; and it shall also consume the beard. +\p +\v 21 It shall happen in that day that a man shall keep alive a young cow, and two sheep. +\v 22 It shall happen, that because of the abundance of milk which they shall give he shall eat butter, for everyone will eat butter and honey that is left within the land. +\p +\v 23 It will happen in that day that every place where there were a thousand vines worth a thousand silver shekels,\f + \fr 7:23 \ft A shekel is about 10 grams or about 0.35 ounces, so 1000 shekels is about 10 kilograms or 22 pounds.\f* will be for briers and thorns. +\v 24 People will go there with arrows and with bow, because all the land will be briers and thorns. +\v 25 All the hills that were cultivated with the hoe, you shall not come there for fear of briers and thorns; but it shall be for the sending out of oxen, and for sheep to tread on.” +\c 8 +\p +\v 1 Yahweh said to me, “Take a large tablet, and write on it with a man’s pen, ‘For Maher Shalal Hash Baz’;\f + \fr 8:1 \ft “Maher Shalal Hash Baz” means “quick to the plunder, swift to the prey”.\f* +\v 2 and I will take for myself faithful witnesses to testify: Uriah the priest, and Zechariah the son of Jeberechiah.” +\p +\v 3 I went to the prophetess, and she conceived, and bore a son. Then Yahweh said to me, “Call his name ‘Maher Shalal Hash Baz.’ +\v 4 For before the child knows how to say, ‘My father’ and ‘My mother,’ the riches of Damascus and the plunder of Samaria will be carried away by the king of Assyria.” +\p +\v 5 Yahweh spoke to me yet again, saying, +\v 6 “Because this people has refused the waters of Shiloah that go softly, and rejoice in Rezin and Remaliah’s son; +\v 7 now therefore, behold, the Lord brings upon them the mighty flood waters of the River: the king of Assyria and all his glory. It will come up over all its channels, and go over all its banks. +\v 8 It will sweep onward into Judah. It will overflow and pass through. It will reach even to the neck. The stretching out of its wings will fill the width of your land, O Immanuel. +\p +\v 9 Make an uproar, you peoples, and be broken in pieces! Listen, all you from far countries: dress for battle, and be shattered! Dress for battle, and be shattered! +\v 10 Take counsel together, and it will be brought to nothing; speak the word, and it will not stand, for God is with us.” +\p +\v 11 For Yahweh spoke this to me with a strong hand, and instructed me not to walk in the way of this people, saying, +\v 12 “Don’t call a conspiracy all that this people call a conspiracy. Don’t fear their threats or be terrorized. +\v 13 Yahweh of Armies is who you must respect as holy. He is the one you must fear. He is the one you must dread. +\v 14 He will be a sanctuary, but for both houses of Israel, he will be a stumbling stone and a rock that makes them fall. For the people of Jerusalem, he will be a trap and a snare. +\v 15 Many will stumble over it, fall, be broken, be snared, and be captured.” +\p +\v 16 Wrap up the covenant. Seal the law among my disciples. +\v 17 I will wait for Yahweh, who hides his face from the house of Jacob, and I will look for him. +\v 18 Behold, I and the children whom Yahweh has given me are for signs and for wonders in Israel from Yahweh of Armies, who dwells in Mount Zion. +\p +\v 19 When they tell you, “Consult with those who have familiar spirits and with the wizards, who chirp and who mutter,” shouldn’t a people consult with their God? Should they consult the dead on behalf of the living? +\v 20 Turn to the law and to the covenant! If they don’t speak according to this word, surely there is no morning for them. +\v 21 They will pass through it, very distressed and hungry. It will happen that when they are hungry, they will worry, and curse their king and their God. They will turn their faces upward, +\v 22 then look to the earth and see distress, darkness, and the gloom of anguish. They will be driven into thick darkness. +\c 9 +\p +\v 1 But there shall be no more gloom for her who was in anguish. In the former time, he brought into contempt the land of Zebulun and the land of Naphtali; but in the latter time he has made it glorious, by the way of the sea, beyond the Jordan, Galilee of the nations. +\p +\v 2 The people who walked in darkness have seen a great light. +\q2 The light has shined on those who lived in the land of the shadow of death. +\q1 +\v 3 You have multiplied the nation. +\q2 You have increased their joy. +\p They rejoice before you according to the joy in harvest, as men rejoice when they divide the plunder. +\v 4 For the yoke of his burden, and the staff of his shoulder, the rod of his oppressor, you have broken as in the day of Midian. +\v 5 For all the armor of the armed man in the noisy battle, and the garments rolled in blood, will be for burning, fuel for the fire. +\v 6 For a child is born to us. A son is given to us; and the government will be on his shoulders. His name will be called Wonderful Counselor, Mighty God, Everlasting Father, Prince of Peace. +\v 7 Of the increase of his government and of peace there shall be no end, on David’s throne, and on his kingdom, to establish it, and to uphold it with justice and with righteousness from that time on, even forever. The zeal of Yahweh of Armies will perform this. +\p +\v 8 The Lord sent a word into Jacob, +\q2 and it falls on Israel. +\q1 +\v 9 All the people will know, +\q2 including Ephraim and the inhabitants of Samaria, who say in pride and in arrogance of heart, +\q1 +\v 10 “The bricks have fallen, +\q2 but we will build with cut stone. +\q1 The sycamore fig trees have been cut down, +\q2 but we will put cedars in their place.” +\q1 +\v 11 Therefore Yahweh will set up on high against him the adversaries of Rezin, +\q2 and will stir up his enemies, +\q2 +\v 12 The Syrians in front, +\q2 and the Philistines behind; +\q2 and they will devour Israel with open mouth. +\q1 For all this, his anger is not turned away, +\q2 but his hand is stretched out still. +\b +\q1 +\v 13 Yet the people have not turned to him who struck them, +\q2 neither have they sought Yahweh of Armies. +\q1 +\v 14 Therefore Yahweh will cut off from Israel head and tail, +\q2 palm branch and reed, in one day. +\q1 +\v 15 The elder and the honorable man is the head, +\q2 and the prophet who teaches lies is the tail. +\q1 +\v 16 For those who lead this people lead them astray; +\q2 and those who are led by them are destroyed. +\q1 +\v 17 Therefore the Lord will not rejoice over their young men, +\q2 neither will he have compassion on their fatherless and widows; +\q1 for everyone is profane and an evildoer, +\q2 and every mouth speaks folly. +\q1 For all this his anger is not turned away, +\q2 but his hand is stretched out still. +\b +\q1 +\v 18 For wickedness burns like a fire. +\q2 It devours the briers and thorns; +\q2 yes, it kindles in the thickets of the forest, +\q2 and they roll upward in a column of smoke. +\q1 +\v 19 Through Yahweh of Armies’ wrath, the land is burned up; +\q2 and the people are the fuel for the fire. +\q2 No one spares his brother. +\q1 +\v 20 One will devour on the right hand, and be hungry; +\q2 and he will eat on the left hand, and they will not be satisfied. +\q1 Everyone will eat the flesh of his own arm: +\q2 +\v 21 Manasseh eating Ephraim and Ephraim eating Manasseh, and they together will be against Judah. +\q1 For all this his anger is not turned away, +\q2 but his hand is stretched out still. +\c 10 +\p +\v 1 Woe to those who decree unrighteous decrees, and to the writers who write oppressive decrees +\v 2 to deprive the needy of justice, and to rob the poor among my people of their rights, that widows may be their plunder, and that they may make the fatherless their prey! +\v 3 What will you do in the day of visitation, and in the desolation which will come from afar? To whom will you flee for help? Where will you leave your wealth? +\p +\v 4 They will only bow down under the prisoners, +\q2 and will fall under the slain. +\q1 For all this his anger is not turned away, +\q2 but his hand is stretched out still. +\b +\p +\v 5 Alas Assyrian, the rod of my anger, the staff in whose hand is my indignation! +\v 6 I will send him against a profane nation, and against the people who anger me I will give him a command to take the plunder and to take the prey, and to tread them down like the mire of the streets. +\v 7 However, he doesn’t mean so, neither does his heart think so; but it is in his heart to destroy, and to cut off not a few nations. +\v 8 For he says, “Aren’t all of my princes kings? +\v 9 Isn’t Calno like Carchemish? Isn’t Hamath like Arpad? Isn’t Samaria like Damascus?” +\v 10 As my hand has found the kingdoms of the idols, whose engraved images exceeded those of Jerusalem and of Samaria, +\v 11 shall I not, as I have done to Samaria and her idols, so do to Jerusalem and her idols? +\p +\v 12 Therefore it will happen that when the Lord has performed his whole work on Mount Zion and on Jerusalem, I will punish the fruit of the willful proud heart of the king of Assyria, and the insolence of his arrogant looks. +\v 13 For he has said, “By the strength of my hand I have done it, and by my wisdom, for I have understanding. I have removed the boundaries of the peoples, and have robbed their treasures. Like a valiant man I have brought down their rulers. +\v 14 My hand has found the riches of the peoples like a nest, and like one gathers eggs that are abandoned, I have gathered all the earth. There was no one who moved their wing, or that opened their mouth, or chirped.” +\p +\v 15 Should an ax brag against him who chops with it? Should a saw exalt itself above him who saws with it? As if a rod should lift those who lift it up, or as if a staff should lift up someone who is not wood. +\v 16 Therefore the Lord, Yahweh of Armies, will send among his fat ones leanness; and under his glory a burning will be kindled like the burning of fire. +\v 17 The light of Israel will be for a fire, and his Holy One for a flame; and it will burn and devour his thorns and his briers in one day. +\v 18 He will consume the glory of his forest and of his fruitful field, both soul and body. It will be as when a standard bearer faints. +\v 19 The remnant of the trees of his forest shall be few, so that a child could write their number. +\p +\v 20 It will come to pass in that day that the remnant of Israel, and those who have escaped from the house of Jacob will no more again lean on him who struck them, but shall lean on Yahweh, the Holy One of Israel, in truth. +\v 21 A remnant will return, even the remnant of Jacob, to the mighty God. +\v 22 For though your people, Israel, are like the sand of the sea, only a remnant of them will return. A destruction is determined, overflowing with righteousness. +\v 23 For the Lord, Yahweh of Armies, will make a full end, and that determined, throughout all the earth. +\p +\v 24 Therefore the Lord, Yahweh of Armies, says, “My people who dwell in Zion, don’t be afraid of the Assyrian, though he strike you with the rod, and lift up his staff against you, as Egypt did. +\v 25 For yet a very little while, and the indignation against you will be accomplished, and my anger will be directed to his destruction.” +\v 26 Yahweh of Armies will stir up a scourge against him, as in the slaughter of Midian at the rock of Oreb. His rod will be over the sea, and he will lift it up like he did against Egypt. +\v 27 It will happen in that day that his burden will depart from off your shoulder, and his yoke from off your neck, and the yoke shall be destroyed because of the anointing oil. +\p +\v 28 He has come to Aiath. He has passed through Migron. At Michmash he stores his baggage. +\v 29 They have gone over the pass. They have taken up their lodging at Geba. Ramah trembles. Gibeah of Saul has fled. +\v 30 Cry aloud with your voice, daughter of Gallim! Listen, Laishah! You poor Anathoth! +\v 31 Madmenah is a fugitive. The inhabitants of Gebim flee for safety. +\v 32 This very day he will halt at Nob. He shakes his hand at the mountain of the daughter of Zion, the hill of Jerusalem. +\p +\v 33 Behold, the Lord, Yahweh of Armies, will lop the boughs with terror. The tall will be cut down, and the lofty will be brought low. +\v 34 He will cut down the thickets of the forest with iron, and Lebanon will fall by the Mighty One. +\c 11 +\q1 +\v 1 A shoot will come out of the stock of Jesse, +\q2 and a branch out of his roots will bear fruit. +\q1 +\v 2 Yahweh’s Spirit will rest on him: +\q2 the spirit of wisdom and understanding, +\q2 the spirit of counsel and might, +\q2 the spirit of knowledge and of the fear of Yahweh. +\q1 +\v 3 His delight will be in the fear of Yahweh. +\q1 He will not judge by the sight of his eyes, +\q2 neither decide by the hearing of his ears; +\q1 +\v 4 but he will judge the poor with righteousness, +\q2 and decide with equity for the humble of the earth. +\q1 He will strike the earth with the rod of his mouth; +\q2 and with the breath of his lips he will kill the wicked. +\q1 +\v 5 Righteousness will be the belt around his waist, +\q2 and faithfulness the belt around his waist. +\b +\q1 +\v 6 The wolf will live with the lamb, +\q2 and the leopard will lie down with the young goat, +\q2 the calf, the young lion, and the fattened calf together; +\q2 and a little child will lead them. +\q1 +\v 7 The cow and the bear will graze. +\q2 Their young ones will lie down together. +\q2 The lion will eat straw like the ox. +\q1 +\v 8 The nursing child will play near a cobra’s hole, +\q2 and the weaned child will put his hand on the viper’s den. +\q1 +\v 9 They will not hurt nor destroy in all my holy mountain; +\q2 for the earth will be full of the knowledge of Yahweh, +\q2 as the waters cover the sea. +\b +\p +\v 10 It will happen in that day that the nations will seek the root of Jesse, who stands as a banner of the peoples; and his resting place will be glorious. +\p +\v 11 It will happen in that day that the Lord will set his hand again the second time to recover the remnant that is left of his people from Assyria, from Egypt, from Pathros, from Cush, from Elam, from Shinar, from Hamath, and from the islands of the sea. +\v 12 He will set up a banner for the nations, and will assemble the outcasts of Israel, and gather together the dispersed of Judah from the four corners of the earth. +\v 13 The envy also of Ephraim will depart, and those who persecute Judah will be cut off. Ephraim won’t envy Judah, and Judah won’t persecute Ephraim. +\v 14 They will fly down on the shoulders of the Philistines on the west. Together they will plunder the children of the east. They will extend their power over Edom and Moab, and the children of Ammon will obey them. +\v 15 Yahweh will utterly destroy the tongue of the Egyptian sea; and with his scorching wind he will wave his hand over the River, and will split it into seven streams, and cause men to march over in sandals. +\v 16 There will be a highway for the remnant that is left of his people from Assyria, like there was for Israel in the day that he came up out of the land of Egypt. +\c 12 +\p +\v 1 In that day you will say, “I will give thanks to you, Yahweh; for though you were angry with me, your anger has turned away and you comfort me. +\v 2 Behold, God is my salvation. I will trust, and will not be afraid; for Yah, Yahweh, is my strength and song; and he has become my salvation.” +\v 3 Therefore with joy you will draw water out of the wells of salvation. +\v 4 In that day you will say, “Give thanks to Yahweh! Call on his name! Declare his doings among the peoples! Proclaim that his name is exalted! +\v 5 Sing to Yahweh, for he has done excellent things! Let this be known in all the earth! +\v 6 Cry aloud and shout, you inhabitant of Zion, for the Holy One of Israel is great among you!” +\c 13 +\p +\v 1 The burden of Babylon, which Isaiah the son of Amoz saw. +\p +\v 2 Set up a banner on the bare mountain! Lift up your voice to them! Wave your hand, that they may go into the gates of the nobles. +\v 3 I have commanded my consecrated ones; yes, I have called my mighty men for my anger, even my proudly exulting ones. +\v 4 The noise of a multitude is in the mountains, as of a great people; the noise of an uproar of the kingdoms of the nations gathered together! Yahweh of Armies is mustering the army for the battle. +\v 5 They come from a far country, from the uttermost part of heaven, even Yahweh, and the weapons of his indignation, to destroy the whole land. +\p +\v 6 Wail, for Yahweh’s day is at hand! It will come as destruction from the Almighty. +\v 7 Therefore all hands will be feeble, and everyone’s heart will melt. +\v 8 They will be dismayed. Pangs and sorrows will seize them. They will be in pain like a woman in labor. They will look in amazement one at another. Their faces will be faces of flame. +\v 9 Behold, the day of Yahweh comes, cruel, with wrath and fierce anger; to make the land a desolation, and to destroy its sinners out of it. +\v 10 For the stars of the sky and its constellations will not give their light. The sun will be darkened in its going out, and the moon will not cause its light to shine. +\v 11 I will punish the world for their evil, and the wicked for their iniquity. I will cause the arrogance of the proud to cease, and will humble the arrogance of the terrible. +\v 12 I will make people more rare than fine gold, even a person than the pure gold of Ophir. +\v 13 Therefore I will make the heavens tremble, and the earth will be shaken out of its place in Yahweh of Armies’ wrath, and in the day of his fierce anger. +\v 14 It will happen that like a hunted gazelle and like sheep that no one gathers, they will each turn to their own people, and will each flee to their own land. +\v 15 Everyone who is found will be thrust through. Everyone who is captured will fall by the sword. +\v 16 Their infants also will be dashed in pieces before their eyes. Their houses will be ransacked, and their wives raped. +\p +\v 17 Behold, I will stir up the Medes against them, who will not value silver, and as for gold, they will not delight in it. +\v 18 Their bows will dash the young men in pieces; and they shall have no pity on the fruit of the womb. Their eyes will not spare children. +\v 19 Babylon, the glory of kingdoms, the beauty of the Chaldeans’ pride, will be like when God overthrew Sodom and Gomorrah. +\v 20 It will never be inhabited, neither will it be lived in from generation to generation. The Arabian will not pitch a tent there, neither will shepherds make their flocks lie down there. +\v 21 But wild animals of the desert will lie there, and their houses will be full of jackals. Ostriches will dwell there, and wild goats will frolic there. +\v 22 Hyenas will cry in their fortresses, and jackals in the pleasant palaces. Her time is near to come, and her days will not be prolonged. +\c 14 +\p +\v 1 For Yahweh will have compassion on Jacob, and will yet choose Israel, and set them in their own land. The foreigner will join himself with them, and they will unite with the house of Jacob. +\v 2 The peoples will take them, and bring them to their place. The house of Israel will possess them in Yahweh’s land for servants and for handmaids. They will take as captives those whose captives they were; and they shall rule over their oppressors. +\p +\v 3 It will happen in the day that Yahweh will give you rest from your sorrow, from your trouble, and from the hard service in which you were made to serve, +\v 4 that you will take up this parable against the king of Babylon, and say, “How the oppressor has ceased! The golden city has ceased!” +\v 5 Yahweh has broken the staff of the wicked, the scepter of the rulers, +\v 6 who struck the peoples in wrath with a continual stroke, who ruled the nations in anger, with a persecution that no one restrained. +\v 7 The whole earth is at rest, and is quiet. They break out in song. +\v 8 Yes, the cypress trees rejoice with you, with the cedars of Lebanon, saying, “Since you are humbled, no lumberjack has come up against us.” +\v 9 Sheol\f + \fr 14:9 \ft Sheol is the place of the dead.\f* from beneath has moved for you to meet you at your coming. It stirs up the departed spirits for you, even all the rulers of the earth. It has raised up from their thrones all the kings of the nations. +\v 10 They all will answer and ask you, “Have you also become as weak as we are? Have you become like us?” +\v 11 Your pomp is brought down to Sheol,\f + \fr 14:11 \ft Sheol is the place of the dead. \f* with the sound of your stringed instruments. Maggots are spread out under you, and worms cover you. +\p +\v 12 How you have fallen from heaven, shining one, son of the dawn! How you are cut down to the ground, who laid the nations low! +\v 13 You said in your heart, “I will ascend into heaven! I will exalt my throne above the stars of God! I will sit on the mountain of assembly, in the far north! +\v 14 I will ascend above the heights of the clouds! I will make myself like the Most High!” +\v 15 Yet you shall be brought down to Sheol,\f + \fr 14:15 \ft Sheol is the place of the dead.\f* to the depths of the pit. +\v 16 Those who see you will stare at you. They will ponder you, saying, “Is this the man who made the earth to tremble, who shook kingdoms, +\v 17 who made the world like a wilderness, and overthrew its cities, who didn’t release his prisoners to their home?” +\p +\v 18 All the kings of the nations sleep in glory, everyone in his own house. +\v 19 But you are cast away from your tomb like an abominable branch, clothed with the slain who are thrust through with the sword, who go down to the stones of the pit; like a dead body trodden under foot. +\v 20 You will not join them in burial, because you have destroyed your land. You have killed your people. The offspring of evildoers will not be named forever. +\p +\v 21 Prepare for slaughter of his children because of the iniquity of their fathers, that they not rise up and possess the earth, and fill the surface of the world with cities. +\v 22 “I will rise up against them,” says Yahweh of Armies, “and cut off from Babylon name and remnant, and son and son’s son,” says Yahweh. +\v 23 “I will also make it a possession for the porcupine, and pools of water. I will sweep it with the broom of destruction,” says Yahweh of Armies. +\p +\v 24 Yahweh of Armies has sworn, saying, “Surely, as I have thought, so shall it happen; and as I have purposed, so shall it stand: +\v 25 that I will break the Assyrian in my land, and tread him under foot on my mountains. Then his yoke will leave them, and his burden leave their shoulders. +\v 26 This is the plan that is determined for the whole earth. This is the hand that is stretched out over all the nations. +\v 27 For Yahweh of Armies has planned, and who can stop it? His hand is stretched out, and who can turn it back?” +\p +\v 28 This burden was in the year that King Ahaz died. +\p +\v 29 Don’t rejoice, O Philistia, all of you, because the rod that struck you is broken; for out of the serpent’s root an adder will emerge, and his fruit will be a fiery flying serpent. +\v 30 The firstborn of the poor will eat, and the needy will lie down in safety; and I will kill your root with famine, and your remnant will be killed. +\p +\v 31 Howl, gate! Cry, city! You are melted away, Philistia, all of you; for smoke comes out of the north, and there is no straggler in his ranks. +\p +\v 32 What will they answer the messengers of the nation? That Yahweh has founded Zion, and in her the afflicted of his people will take refuge. +\c 15 +\p +\v 1 The burden of Moab. +\p For in a night, Ar of Moab is laid waste, and brought to nothing. For in a night Kir of Moab is laid waste, and brought to nothing. +\v 2 They have gone up to Bayith, and to Dibon, to the high places, to weep. Moab wails over Nebo and over Medeba. Baldness is on all of their heads. Every beard is cut off. +\v 3 In their streets, they clothe themselves in sackcloth. In their streets and on their housetops, everyone wails, weeping abundantly. +\v 4 Heshbon cries out with Elealeh. Their voice is heard even to Jahaz. Therefore the armed men of Moab cry aloud. Their souls tremble within them. +\v 5 My heart cries out for Moab! Her nobles flee to Zoar, to Eglath Shelishiyah; for they go up by the ascent of Luhith with weeping; for on the way to Horonaim, they raise up a cry of destruction. +\v 6 For the waters of Nimrim will be desolate; for the grass has withered away, the tender grass fails, there is no green thing. +\v 7 Therefore they will carry away the abundance they have gotten, and that which they have stored up, over the brook of the willows. +\v 8 For the cry has gone around the borders of Moab, its wailing to Eglaim, and its wailing to Beer Elim. +\v 9 For the waters of Dimon are full of blood; for I will bring yet more on Dimon, a lion on those of Moab who escape, and on the remnant of the land. +\c 16 +\p +\v 1 Send the lambs for the ruler of the land from Selah to the wilderness, to the mountain of the daughter of Zion. +\v 2 For it will be that as wandering birds, as a scattered nest, so will the daughters of Moab be at the fords of the Arnon. +\v 3 Give counsel! Execute justice! Make your shade like the night in the middle of the noonday! Hide the outcasts! Don’t betray the fugitive! +\v 4 Let my outcasts dwell with you! As for Moab, be a hiding place for him from the face of the destroyer. For the extortionist is brought to nothing. Destruction ceases. The oppressors are consumed out of the land. +\v 5 A throne will be established in loving kindness. One will sit on it in truth, in the tent of David, judging, seeking justice, and swift to do righteousness. +\p +\v 6 We have heard of the pride of Moab, that he is very proud; even of his arrogance, his pride, and his wrath. His boastings are nothing. +\v 7 Therefore Moab will wail for Moab. Everyone will wail. You will mourn for the raisin cakes of Kir Hareseth, utterly stricken. +\v 8 For the fields of Heshbon languish with the vine of Sibmah. The lords of the nations have broken down its choice branches, which reached even to Jazer, which wandered into the wilderness. Its shoots were spread abroad. They passed over the sea. +\v 9 Therefore I will weep with the weeping of Jazer for the vine of Sibmah. I will water you with my tears, Heshbon, and Elealeh: for on your summer fruits and on your harvest the battle shout has fallen. +\v 10 Gladness is taken away, and joy out of the fruitful field; and in the vineyards there will be no singing, neither joyful noise. Nobody will tread out wine in the presses. I have made the shouting stop. +\v 11 Therefore my heart sounds like a harp for Moab, and my inward parts for Kir Heres. +\v 12 It will happen that when Moab presents himself, when he wearies himself on the high place, and comes to his sanctuary to pray, that he will not prevail. +\p +\v 13 This is the word that Yahweh spoke concerning Moab in time past. +\v 14 But now Yahweh has spoken, saying, “Within three years, as a worker bound by contract would count them, the glory of Moab shall be brought into contempt, with all his great multitude; and the remnant will be very small and feeble.” +\c 17 +\p +\v 1 The burden of Damascus. +\p “Behold, Damascus is taken away from being a city, and it will be a ruinous heap. +\v 2 The cities of Aroer are forsaken. They will be for flocks, which shall lie down, and no one shall make them afraid. +\v 3 The fortress shall cease from Ephraim, and the kingdom from Damascus, and the remnant of Syria. They will be as the glory of the children of Israel,” says Yahweh of Armies. +\p +\v 4 “It will happen in that day that the glory of Jacob will be made thin, and the fatness of his flesh will become lean. +\v 5 It will be like when the harvester gathers the wheat, and his arm reaps the grain. Yes, it will be like when one gleans grain in the valley of Rephaim. +\v 6 Yet gleanings will be left there, like the shaking of an olive tree, two or three olives in the top of the uppermost bough, four or five in the outermost branches of a fruitful tree,” says Yahweh, the God of Israel. +\v 7 In that day, people will look to their Maker, and their eyes will have respect for the Holy One of Israel. +\v 8 They will not look to the altars, the work of their hands; neither shall they respect that which their fingers have made, either the Asherah poles or the incense altars. +\v 9 In that day, their strong cities will be like the forsaken places in the woods and on the mountain top, which were forsaken from before the children of Israel; and it will be a desolation. +\v 10 For you have forgotten the God of your salvation, and have not remembered the rock of your strength. Therefore you plant pleasant plants, and set out foreign seedlings. +\v 11 In the day of your planting, you hedge it in. In the morning, you make your seed blossom, but the harvest flees away in the day of grief and of desperate sorrow. +\p +\v 12 Ah, the uproar of many peoples who roar like the roaring of the seas; and the rushing of nations that rush like the rushing of mighty waters! +\v 13 The nations will rush like the rushing of many waters, but he will rebuke them, and they will flee far off, and will be chased like the chaff of the mountains before the wind, and like the whirling dust before the storm. +\v 14 At evening, behold, terror! Before the morning, they are no more. This is the portion of those who plunder us, and the lot of those who rob us. +\c 18 +\p +\v 1 Ah, the land of the rustling of wings, which is beyond the rivers of Ethiopia; +\v 2 that sends ambassadors by the sea, even in vessels of papyrus on the waters, saying, “Go, you swift messengers, to a nation tall and smooth, to a people awesome from their beginning onward, a nation that measures out and treads down, whose land the rivers divide!” +\v 3 All you inhabitants of the world, and you dwellers on the earth, when a banner is lifted up on the mountains, look! When the trumpet is blown, listen! +\p +\v 4 For Yahweh said to me, “I will be still, and I will see in my dwelling place, like clear heat in sunshine, like a cloud of dew in the heat of harvest.” +\v 5 For before the harvest, when the blossom is over, and the flower becomes a ripening grape, he will cut off the sprigs with pruning hooks, and he will cut down and take away the spreading branches. +\v 6 They will be left together for the ravenous birds of the mountains, and for the animals of the earth. The ravenous birds will eat them in the summer, and all the animals of the earth will eat them in the winter. +\v 7 In that time, a present will be brought to Yahweh of Armies from a people tall and smooth, even from a people awesome from their beginning onward, a nation that measures out and treads down, whose land the rivers divide, to the place of the name of Yahweh of Armies, Mount Zion. +\c 19 +\p +\v 1 The burden of Egypt. +\p “Behold, Yahweh rides on a swift cloud, and comes to Egypt. The idols of Egypt will tremble at his presence; and the heart of Egypt will melt within it. +\v 2 I will stir up the Egyptians against the Egyptians, and they will fight everyone against his brother, and everyone against his neighbor; city against city, and kingdom against kingdom. +\v 3 The spirit of the Egyptians will fail within them. I will destroy their counsel. They will seek the idols, the charmers, those who have familiar spirits, and the wizards. +\v 4 I will give over the Egyptians into the hand of a cruel lord. A fierce king will rule over them,” says the Lord, Yahweh of Armies. +\p +\v 5 The waters will fail from the sea, and the river will be wasted and become dry. +\v 6 The rivers will become foul. The streams of Egypt will be diminished and dried up. The reeds and flags will wither away. +\v 7 The meadows by the Nile, by the brink of the Nile, and all the sown fields of the Nile, will become dry, be driven away, and be no more. +\v 8 The fishermen will lament, and all those who fish in the Nile will mourn, and those who spread nets on the waters will languish. +\v 9 Moreover those who work in combed flax, and those who weave white cloth, will be confounded. +\v 10 The pillars will be broken in pieces. All those who work for hire will be grieved in soul. +\p +\v 11 The princes of Zoan are utterly foolish. The counsel of the wisest counselors of Pharaoh has become stupid. How do you say to Pharaoh, “I am the son of the wise, the son of ancient kings?” +\v 12 Where then are your wise men? Let them tell you now; and let them know what Yahweh of Armies has purposed concerning Egypt. +\v 13 The princes of Zoan have become fools. The princes of Memphis are deceived. They have caused Egypt to go astray, those who are the cornerstone of her tribes. +\v 14 Yahweh has mixed a spirit of perverseness in the middle of her; and they have caused Egypt to go astray in all of its works, like a drunken man staggers in his vomit. +\v 15 Neither shall there be any work for Egypt, which head or tail, palm branch or rush, may do. +\v 16 In that day the Egyptians will be like women. They will tremble and fear because of the shaking of Yahweh of Armies’s hand, which he shakes over them. +\v 17 The land of Judah will become a terror to Egypt. Everyone to whom mention is made of it will be afraid, because of the plans of Yahweh of Armies, which he determines against it. +\v 18 In that day, there will be five cities in the land of Egypt that speak the language of Canaan, and swear to Yahweh of Armies. One will be called “The city of destruction.” +\p +\v 19 In that day, there will be an altar to Yahweh in the middle of the land of Egypt, and a pillar to Yahweh at its border. +\v 20 It will be for a sign and for a witness to Yahweh of Armies in the land of Egypt; for they will cry to Yahweh because of oppressors, and he will send them a savior and a defender, and he will deliver them. +\v 21 Yahweh will be known to Egypt, and the Egyptians will know Yahweh in that day. Yes, they will worship with sacrifice and offering, and will vow a vow to Yahweh, and will perform it. +\v 22 Yahweh will strike Egypt, striking and healing. They will return to Yahweh, and he will be entreated by them, and will heal them. +\p +\v 23 In that day there will be a highway out of Egypt to Assyria, and the Assyrian shall come into Egypt, and the Egyptian into Assyria; and the Egyptians will worship with the Assyrians. +\p +\v 24 In that day, Israel will be the third with Egypt and with Assyria, a blessing within the earth; +\v 25 because Yahweh of Armies has blessed them, saying, “Blessed be Egypt my people, Assyria the work of my hands, and Israel my inheritance.” +\c 20 +\p +\v 1 In the year that Tartan came to Ashdod, when Sargon the king of Assyria sent him, and he fought against Ashdod and took it; +\v 2 at that time Yahweh spoke by Isaiah the son of Amoz, saying, “Go, and loosen the sackcloth from off your waist, and take your sandals from off your feet.” He did so, walking naked and barefoot. +\v 3 Yahweh said, “As my servant Isaiah has walked naked and barefoot three years for a sign and a wonder concerning Egypt and concerning Ethiopia, +\v 4 so the king of Assyria will lead away the captives of Egypt and the exiles of Ethiopia, young and old, naked and barefoot, and with buttocks uncovered, to the shame of Egypt. +\v 5 They will be dismayed and confounded, because of Ethiopia their expectation, and of Egypt their glory. +\v 6 The inhabitants of this coast land will say in that day, ‘Behold, this is our expectation, where we fled for help to be delivered from the king of Assyria. And we, how will we escape?’” +\c 21 +\p +\v 1 The burden of the wilderness of the sea. +\p As whirlwinds in the South sweep through, it comes from the wilderness, from an awesome land. +\v 2 A grievous vision is declared to me. The treacherous man deals treacherously, and the destroyer destroys. Go up, Elam; attack! I have stopped all of Media’s sighing. +\v 3 Therefore my thighs are filled with anguish. Pains have seized me, like the pains of a woman in labor. I am in so much pain that I can’t hear. I am so dismayed that I can’t see. +\v 4 My heart flutters. Horror has frightened me. The twilight that I desired has been turned into trembling for me. +\v 5 They prepare the table. They set the watch. They eat. They drink. Rise up, you princes, oil the shield! +\v 6 For the Lord said to me, “Go, set a watchman. Let him declare what he sees. +\v 7 When he sees a troop, horsemen in pairs, a troop of donkeys, a troop of camels, he shall listen diligently with great attentiveness.” +\v 8 He cried like a lion: “Lord, I stand continually on the watchtower in the daytime, and every night I stay at my post. +\v 9 Behold, here comes a troop of men, horsemen in pairs.” He answered, “Fallen, fallen is Babylon; and all the engraved images of her gods are broken to the ground. +\p +\v 10 You are my threshing, and the grain of my floor!” That which I have heard from Yahweh of Armies, the God of Israel, I have declared to you. +\p +\v 11 The burden of Dumah. +\p One calls to me out of Seir, “Watchman, what of the night? Watchman, what of the night?” +\v 12 The watchman said, “The morning comes, and also the night. If you will inquire, inquire. Come back again.” +\p +\v 13 The burden on Arabia. +\p You will lodge in the thickets in Arabia, you caravans of Dedanites. +\v 14 They brought water to him who was thirsty. The inhabitants of the land of Tema met the fugitives with their bread. +\v 15 For they fled away from the swords, from the drawn sword, from the bent bow, and from the heat of battle. +\v 16 For the Lord said to me, “Within a year, as a worker bound by contract would count it, all the glory of Kedar will fail, +\v 17 and the residue of the number of the archers, the mighty men of the children of Kedar, will be few; for Yahweh, the God of Israel, has spoken it.” +\c 22 +\p +\v 1 The burden of the valley of vision. +\p What ails you now, that you have all gone up to the housetops? +\v 2 You that are full of shouting, a tumultuous city, a joyous town, your slain are not slain with the sword, neither are they dead in battle. +\v 3 All your rulers fled away together. They were bound by the archers. All who were found by you were bound together. They fled far away. +\v 4 Therefore I said, “Look away from me. I will weep bitterly. Don’t labor to comfort me for the destruction of the daughter of my people. +\p +\v 5 For it is a day of confusion, and of treading down, and of perplexity from the Lord, Yahweh of Armies, in the valley of vision, a breaking down of the walls, and a crying to the mountains.” +\v 6 Elam carried his quiver, with chariots of men and horsemen; and Kir uncovered the shield. +\v 7 Your choicest valleys were full of chariots, and the horsemen set themselves in array at the gate. +\v 8 He took away the covering of Judah; and you looked in that day to the armor in the house of the forest. +\v 9 You saw the breaches of David’s city, that they were many; and you gathered together the waters of the lower pool. +\v 10 You counted the houses of Jerusalem, and you broke down the houses to fortify the wall. +\v 11 You also made a reservoir between the two walls for the water of the old pool. But you didn’t look to him who had done this, neither did you have respect for him who planned it long ago. +\p +\v 12 In that day, the Lord, Yahweh of Armies, called to weeping, to mourning, to baldness, and to dressing in sackcloth; +\v 13 and behold, there is joy and gladness, killing cattle and killing sheep, eating meat and drinking wine: “Let’s eat and drink, for tomorrow we will die.” +\v 14 Yahweh of Armies revealed himself in my ears, “Surely this iniquity will not be forgiven you until you die,” says the Lord, Yahweh of Armies. +\p +\v 15 The Lord, Yahweh of Armies says, “Go, get yourself to this treasurer, even to Shebna, who is over the house, and say, +\v 16 ‘What are you doing here? Who has you here, that you have dug out a tomb here?’ Cutting himself out a tomb on high, chiseling a habitation for himself in the rock!” +\v 17 Behold, Yahweh will overcome you and hurl you away violently. Yes, he will grasp you firmly. +\v 18 He will surely wind you around and around, and throw you like a ball into a large country. There you will die, and there the chariots of your glory will be, you disgrace of your lord’s house. +\v 19 I will thrust you from your office. You will be pulled down from your station. +\p +\v 20 It will happen in that day that I will call my servant Eliakim the son of Hilkiah, +\v 21 and I will clothe him with your robe, and strengthen him with your belt. I will commit your government into his hand; and he will be a father to the inhabitants of Jerusalem, and to the house of Judah. +\v 22 I will lay the key of David’s house on his shoulder. He will open, and no one will shut. He will shut, and no one will open. +\v 23 I will fasten him like a nail in a sure place. He will be for a throne of glory to his father’s house. +\v 24 They will hang on him all the glory of his father’s house, the offspring and the issue, every small vessel, from the cups even to all the pitchers. +\v 25 “In that day,” says Yahweh of Armies, “the nail that was fastened in a sure place will give way. It will be cut down and fall. The burden that was on it will be cut off, for Yahweh has spoken it.” +\c 23 +\p +\v 1 The burden of Tyre. +\p Howl, you ships of Tarshish! For it is laid waste, so that there is no house, no entering in. From the land of Kittim it is revealed to them. +\v 2 Be still, you inhabitants of the coast, you whom the merchants of Sidon that pass over the sea have replenished. +\v 3 On great waters, the seed of the Shihor, the harvest of the Nile, was her revenue. She was the market of nations. +\v 4 Be ashamed, Sidon; for the sea has spoken, the stronghold of the sea, saying, “I have not travailed, nor given birth, neither have I nourished young men, nor brought up virgins.” +\v 5 When the report comes to Egypt, they will be in anguish at the report of Tyre. +\v 6 Pass over to Tarshish! Wail, you inhabitants of the coast! +\v 7 Is this your joyous city, whose antiquity is of ancient days, whose feet carried her far away to travel? +\p +\v 8 Who has planned this against Tyre, the giver of crowns, whose merchants are princes, whose traders are the honorable of the earth? +\v 9 Yahweh of Armies has planned it, to stain the pride of all glory, to bring into contempt all the honorable of the earth. +\v 10 Pass through your land like the Nile, daughter of Tarshish. There is no restraint any more. +\v 11 He has stretched out his hand over the sea. He has shaken the kingdoms. Yahweh has ordered the destruction of Canaan’s strongholds. +\v 12 He said, “You shall rejoice no more, you oppressed virgin daughter of Sidon. Arise, pass over to Kittim. Even there you will have no rest.” +\p +\v 13 Behold, the land of the Chaldeans. This people didn’t exist. The Assyrians founded it for those who dwell in the wilderness. They set up their towers. They overthrew its palaces. They made it a ruin. +\v 14 Howl, you ships of Tarshish, for your stronghold is laid waste! +\v 15 It will come to pass in that day that Tyre will be forgotten seventy years, according to the days of one king. After the end of seventy years it will be to Tyre like in the song of the prostitute. +\v 16 Take a harp; go about the city, you prostitute that has been forgotten. Make sweet melody. Sing many songs, that you may be remembered. +\v 17 It will happen after the end of seventy years that Yahweh will visit Tyre. She will return to her wages, and will play the prostitute with all the kingdoms of the world on the surface of the earth. +\v 18 Her merchandise and her wages will be holiness to Yahweh. It will not be treasured nor laid up; for her merchandise will be for those who dwell before Yahweh, to eat sufficiently, and for durable clothing. +\c 24 +\p +\v 1 Behold, Yahweh makes the earth empty, makes it waste, turns it upside down, and scatters its inhabitants. +\v 2 It will be as with the people, so with the priest; as with the servant, so with his master; as with the maid, so with her mistress; as with the buyer, so with the seller; as with the creditor, so with the debtor; as with the taker of interest, so with the giver of interest. +\v 3 The earth will be utterly emptied and utterly laid waste; for Yahweh has spoken this word. +\v 4 The earth mourns and fades away. The world languishes and fades away. The lofty people of the earth languish. +\v 5 The earth also is polluted under its inhabitants, because they have transgressed the laws, violated the statutes, and broken the everlasting covenant. +\v 6 Therefore the curse has devoured the earth, and those who dwell therein are found guilty. Therefore the inhabitants of the earth are burned, and few men are left. +\v 7 The new wine mourns. The vine languishes. All the merry-hearted sigh. +\v 8 The mirth of tambourines ceases. The sound of those who rejoice ends. The joy of the harp ceases. +\v 9 They will not drink wine with a song. Strong drink will be bitter to those who drink it. +\v 10 The confused city is broken down. Every house is shut up, that no man may come in. +\v 11 There is a crying in the streets because of the wine. All joy is darkened. The mirth of the land is gone. +\v 12 The city is left in desolation, and the gate is struck with destruction. +\v 13 For it will be so within the earth among the peoples, as the shaking of an olive tree, as the gleanings when the vintage is done. +\p +\v 14 These shall lift up their voice. They will shout for the majesty of Yahweh. They cry aloud from the sea. +\v 15 Therefore glorify Yahweh in the east, even the name of Yahweh, the God of Israel, in the islands of the sea! +\v 16 From the uttermost part of the earth have we heard songs. Glory to the righteous! +\p But I said, “I pine away! I pine away! woe is me!” The treacherous have dealt treacherously. Yes, the treacherous have dealt very treacherously. +\v 17 Fear, the pit, and the snare are on you who inhabit the earth. +\v 18 It will happen that he who flees from the noise of the fear will fall into the pit; and he who comes up out of the middle of the pit will be taken in the snare; for the windows on high are opened, and the foundations of the earth tremble. +\v 19 The earth is utterly broken. The earth is torn apart. The earth is shaken violently. +\v 20 The earth will stagger like a drunken man, and will sway back and forth like a hammock. Its disobedience will be heavy on it, and it will fall and not rise again. +\p +\v 21 It will happen in that day that Yahweh will punish the army of the high ones on high, and the kings of the earth on the earth. +\v 22 They will be gathered together, as prisoners are gathered in the pit, and will be shut up in the prison; and after many days they will be visited. +\v 23 Then the moon will be confounded, and the sun ashamed; for Yahweh of Armies will reign on Mount Zion and in Jerusalem; and glory will be before his elders. +\c 25 +\p +\v 1 Yahweh, you are my God. I will exalt you! I will praise your name, for you have done wonderful things, things planned long ago, in complete faithfulness and truth. +\v 2 For you have made a city into a heap, a fortified city into a ruin, a palace of strangers to be no city. It will never be built. +\v 3 Therefore a strong people will glorify you. A city of awesome nations will fear you. +\v 4 For you have been a stronghold to the poor, a stronghold to the needy in his distress, a refuge from the storm, a shade from the heat, when the blast of the dreaded ones is like a storm against the wall. +\v 5 As the heat in a dry place you will bring down the noise of strangers; as the heat by the shade of a cloud, the song of the dreaded ones will be brought low. +\p +\v 6 In this mountain, Yahweh of Armies will make all peoples a feast of choice meat,\f + \fr 25:6 \ft literally, fat things\f* a feast of choice wines, of choice meat full of marrow, of well refined choice wines. +\v 7 He will destroy in this mountain the surface of the covering that covers all peoples, and the veil that is spread over all nations. +\v 8 He has swallowed up death forever! The Lord Yahweh will wipe away tears from off all faces. He will take the reproach of his people away from off all the earth, for Yahweh has spoken it. +\p +\v 9 It shall be said in that day, “Behold, this is our God! We have waited for him, and he will save us! This is Yahweh! We have waited for him. We will be glad and rejoice in his salvation!” +\v 10 For Yahweh’s hand will rest in this mountain. +\p Moab will be trodden down in his place, even like straw is trodden down in the water of the dunghill. +\v 11 He will spread out his hands in the middle of it, like one who swims spreads out hands to swim, but his pride will be humbled together with the craft of his hands. +\v 12 He has brought the high fortress of your walls down, laid low, and brought to the ground, even to the dust. +\c 26 +\p +\v 1 In that day, this song will be sung in the land of Judah: +\q1 “We have a strong city. +\q2 God appoints salvation for walls and bulwarks. +\q1 +\v 2 Open the gates, that the righteous nation may enter: +\q2 the one which keeps faith. +\q1 +\v 3 You will keep whoever’s mind is steadfast in perfect peace, +\q2 because he trusts in you. +\q1 +\v 4 Trust in Yahweh forever; +\q2 for in Yah, Yahweh, is an everlasting Rock. +\q1 +\v 5 For he has brought down those who dwell on high, the lofty city. +\q2 He lays it low. +\q2 He lays it low even to the ground. +\q2 He brings it even to the dust. +\q1 +\v 6 The foot shall tread it down, +\q2 even the feet of the poor +\q2 and the steps of the needy.” +\q1 +\v 7 The way of the just is uprightness. +\q2 You who are upright make the path of the righteous level. +\b +\q1 +\v 8 Yes, in the way of your judgments, Yahweh, we have waited for you. +\q2 Your name and your renown are the desire of our soul. +\q1 +\v 9 With my soul I have desired you in the night. +\q2 Yes, with my spirit within me I will seek you earnestly; +\q2 for when your judgments are in the earth, the inhabitants of the world learn righteousness. +\q1 +\v 10 Let favor be shown to the wicked, +\q2 yet he will not learn righteousness. +\q1 In the land of uprightness he will deal wrongfully, +\q2 and will not see Yahweh’s majesty. +\b +\q1 +\v 11 Yahweh, your hand is lifted up, yet they don’t see; +\q2 but they will see your zeal for the people and be disappointed. +\q2 Yes, fire will consume your adversaries. +\q1 +\v 12 Yahweh, you will ordain peace for us, +\q2 for you have also done all our work for us. +\q1 +\v 13 Yahweh our God, other lords besides you have had dominion over us, +\q2 but we will only acknowledge your name. +\q1 +\v 14 The dead shall not live. +\q2 The departed spirits shall not rise. +\q1 Therefore you have visited and destroyed them, +\q2 and caused all memory of them to perish. +\q1 +\v 15 You have increased the nation, O Yahweh. +\q2 You have increased the nation! +\q1 You are glorified! +\q2 You have enlarged all the borders of the land. +\b +\q1 +\v 16 Yahweh, in trouble they have visited you. +\q2 They poured out a prayer when your chastening was on them. +\q1 +\v 17 Just as a woman with child, who draws near the time of her delivery, +\q2 is in pain and cries out in her pangs, +\q2 so we have been before you, Yahweh. +\q1 +\v 18 We have been with child. +\q2 We have been in pain. +\q1 We gave birth, it seems, only to wind. +\q2 We have not worked any deliverance in the earth; +\q2 neither have the inhabitants of the world fallen. +\q1 +\v 19 Your dead shall live. +\q2 Their dead bodies shall arise. +\q1 Awake and sing, you who dwell in the dust; +\q2 for your dew is like the dew of herbs, +\q2 and the earth will cast out the departed spirits. +\b +\q1 +\v 20 Come, my people, enter into your rooms, +\q2 and shut your doors behind you. +\q1 Hide yourself for a little moment, +\q2 until the indignation is past. +\q1 +\v 21 For, behold, Yahweh comes out of his place to punish the inhabitants of the earth for their iniquity. +\q2 The earth also will disclose her blood, and will no longer cover her slain. +\c 27 +\p +\v 1 In that day, Yahweh with his hard and great and strong sword will punish leviathan, the fleeing serpent, and leviathan, the twisted serpent; and he will kill the dragon that is in the sea. +\p +\v 2 In that day, sing to her, “A pleasant vineyard! +\v 3 I, Yahweh, am its keeper. I will water it every moment. Lest anyone damage it, I will keep it night and day. +\v 4 Wrath is not in me, but if I should find briers and thorns, I would do battle! I would march on them and I would burn them together. +\v 5 Or else let him take hold of my strength, that he may make peace with me. Let him make peace with me.” +\p +\v 6 In days to come, Jacob will take root. Israel will blossom and bud. They will fill the surface of the world with fruit. +\v 7 Has he struck them as he struck those who struck them? Or are they killed like those who killed them were killed? +\v 8 In measure, when you send them away, you contend with them. He has removed them with his rough blast in the day of the east wind. +\v 9 Therefore by this the iniquity of Jacob will be forgiven, and this is all the fruit of taking away his sin: that he makes all the stones of the altar as chalk stones that are beaten in pieces, so that the Asherah poles and the incense altars shall rise no more. +\v 10 For the fortified city is solitary, a habitation deserted and forsaken, like the wilderness. The calf will feed there, and there he will lie down, and consume its branches. +\v 11 When its boughs are withered, they will be broken off. The women will come and set them on fire, for they are a people of no understanding. Therefore he who made them will not have compassion on them, and he who formed them will show them no favor. +\p +\v 12 It will happen in that day that Yahweh will thresh from the flowing stream of the Euphrates to the brook of Egypt; and you will be gathered one by one, children of Israel. +\p +\v 13 It will happen in that day that a great trumpet will be blown; and those who were ready to perish in the land of Assyria, and those who were outcasts in the land of Egypt, shall come; and they will worship Yahweh in the holy mountain at Jerusalem. +\c 28 +\p +\v 1 Woe to the crown of pride of the drunkards of Ephraim, and to the fading flower of his glorious beauty, which is on the head of the fertile valley of those who are overcome with wine! +\v 2 Behold, the Lord has one who is mighty and strong. Like a storm of hail, a destroying storm, and like a storm of mighty waters overflowing, he will cast them down to the earth with his hand. +\v 3 The crown of pride of the drunkards of Ephraim will be trodden under foot. +\v 4 The fading flower of his glorious beauty, which is on the head of the fertile valley, shall be like the first-ripe fig before the summer, which someone picks and eats as soon as he sees it. +\v 5 In that day, Yahweh of Armies will become a crown of glory and a diadem of beauty to the residue of his people, +\v 6 and a spirit of justice to him who sits in judgment, and strength to those who turn back the battle at the gate. +\p +\v 7 They also reel with wine, and stagger with strong drink. The priest and the prophet reel with strong drink. They are swallowed up by wine. They stagger with strong drink. They err in vision. They stumble in judgment. +\v 8 For all tables are completely full of filthy vomit and filthiness. +\p +\v 9 Whom will he teach knowledge? To whom will he explain the message? Those who are weaned from the milk, and drawn from the breasts? +\v 10 For it is precept on precept, precept on precept; line on line, line on line; here a little, there a little. +\p +\v 11 But he will speak to this nation with stammering lips and in another language, +\v 12 to whom he said, “This is the resting place. Give rest to the weary,” and “This is the refreshing;” yet they would not hear. +\v 13 Therefore Yahweh’s word will be to them precept on precept, precept on precept; line on line, line on line; here a little, there a little; that they may go, fall backward, be broken, be snared, and be taken. +\p +\v 14 Therefore hear Yahweh’s word, you scoffers, that rule this people in Jerusalem: +\v 15 “Because you have said, ‘We have made a covenant with death, and we are in agreement with Sheol.\f + \fr 28:15 \ft Sheol is the place of the dead.\f* When the overflowing scourge passes through, it won’t come to us; for we have made lies our refuge, and we have hidden ourselves under falsehood.’” +\v 16 Therefore the Lord Yahweh says, “Behold, I lay in Zion for a foundation a stone, a tried stone, a precious cornerstone of a sure foundation. He who believes shall not act hastily. +\v 17 I will make justice the measuring line, and righteousness the plumb line. The hail will sweep away the refuge of lies, and the waters will overflow the hiding place. +\v 18 Your covenant with death shall be annulled, and your agreement with Sheol\f + \fr 28:18 \ft Sheol is the place of the dead.\f* shall not stand. When the overflowing scourge passes through, then you will be trampled down by it. +\v 19 As often as it passes through, it will seize you; for morning by morning it will pass through, by day and by night; and it will be nothing but terror to understand the message.” +\v 20 For the bed is too short to stretch out on, and the blanket is too narrow to wrap oneself in. +\v 21 For Yahweh will rise up as on Mount Perazim. He will be angry as in the valley of Gibeon; that he may do his work, his unusual work, and bring to pass his act, his extraordinary act. +\v 22 Now therefore don’t be scoffers, lest your bonds be made strong; for I have heard a decree of destruction from the Lord, Yahweh of Armies, on the whole earth. +\p +\v 23 Give ear, and hear my voice! Listen, and hear my speech! +\v 24 Does he who plows to sow plow continually? Does he keep turning the soil and breaking the clods? +\v 25 When he has leveled its surface, doesn’t he plant the dill, and scatter the cumin seed, and put in the wheat in rows, the barley in the appointed place, and the spelt in its place? +\v 26 For his God instructs him in right judgment and teaches him. +\v 27 For the dill isn’t threshed with a sharp instrument, neither is a cart wheel turned over the cumin; but the dill is beaten out with a stick, and the cumin with a rod. +\v 28 Bread flour must be ground; so he will not always be threshing it. Although he drives the wheel of his threshing cart over it, his horses don’t grind it. +\v 29 This also comes out from Yahweh of Armies, who is wonderful in counsel, and excellent in wisdom. +\c 29 +\p +\v 1 Woe to Ariel! Ariel, the city where David encamped! Add year to year; let the feasts come around; +\v 2 then I will distress Ariel, and there will be mourning and lamentation. She shall be to me as an altar hearth.\f + \fr 29:2 \ft or, Ariel\f* +\v 3 I will encamp against you all around you, and will lay siege against you with posted troops. I will raise siege works against you. +\v 4 You will be brought down, and will speak out of the ground. Your speech will mumble out of the dust. Your voice will be as of one who has a familiar spirit, out of the ground, and your speech will whisper out of the dust. +\p +\v 5 But the multitude of your foes will be like fine dust, and the multitude of the ruthless ones like chaff that blows away. Yes, it will be in an instant, suddenly. +\v 6 She will be visited by Yahweh of Armies with thunder, with earthquake, with great noise, with whirlwind and storm, and with the flame of a devouring fire. +\v 7 The multitude of all the nations that fight against Ariel, even all who fight against her and her stronghold, and who distress her, will be like a dream, a vision of the night. +\v 8 It will be like when a hungry man dreams, and behold, he eats; but he awakes, and his hunger isn’t satisfied; or like when a thirsty man dreams, and behold, he drinks; but he awakes, and behold, he is faint, and he is still thirsty. The multitude of all the nations that fight against Mount Zion will be like that. +\p +\v 9 Pause and wonder! Blind yourselves and be blind! They are drunken, but not with wine; they stagger, but not with strong drink. +\v 10 For Yahweh has poured out on you a spirit of deep sleep, and has closed your eyes, the prophets; and he has covered your heads, the seers. +\v 11 All vision has become to you like the words of a book that is sealed, which men deliver to one who is educated, saying, “Read this, please;” and he says, “I can’t, for it is sealed;” +\v 12 and the book is delivered to one who is not educated, saying, “Read this, please;” and he says, “I can’t read.” +\p +\v 13 The Lord said, “Because this people draws near with their mouth and honors me with their lips, but they have removed their heart far from me, and their fear of me is a commandment of men which has been taught; +\v 14 therefore, behold, I will proceed to do a marvelous work among this people, even a marvelous work and a wonder; and the wisdom of their wise men will perish, and the understanding of their prudent men will be hidden.” +\p +\v 15 Woe to those who deeply hide their counsel from Yahweh, and whose deeds are in the dark, and who say, “Who sees us?” and “Who knows us?” +\v 16 You turn things upside down! Should the potter be thought to be like clay, that the thing made should say about him who made it, “He didn’t make me;” or the thing formed say of him who formed it, “He has no understanding?” +\p +\v 17 Isn’t it yet a very little while, and Lebanon will be turned into a fruitful field, and the fruitful field will be regarded as a forest? +\v 18 In that day, the deaf will hear the words of the book, and the eyes of the blind will see out of obscurity and out of darkness. +\v 19 The humble also will increase their joy in Yahweh, and the poor among men will rejoice in the Holy One of Israel. +\v 20 For the ruthless is brought to nothing, and the scoffer ceases, and all those who are alert to do evil are cut off— +\v 21 who cause a person to be indicted by a word, and lay a snare for one who reproves in the gate, and who deprive the innocent of justice with false testimony. +\p +\v 22 Therefore Yahweh, who redeemed Abraham, says concerning the house of Jacob: “Jacob shall no longer be ashamed, neither shall his face grow pale. +\v 23 But when he sees his children, the work of my hands, in the middle of him, they will sanctify my name. Yes, they will sanctify the Holy One of Jacob, and will stand in awe of the God of Israel. +\v 24 They also who err in spirit will come to understanding, and those who grumble will receive instruction.” +\c 30 +\p +\v 1 “Woe to the rebellious children”, says Yahweh, “who take counsel, but not from me; and who make an alliance, but not with my Spirit, that they may add sin to sin; +\v 2 who set out to go down into Egypt without asking for my advice, to strengthen themselves in the strength of Pharaoh, and to take refuge in the shadow of Egypt! +\v 3 Therefore the strength of Pharaoh will be your shame, and the refuge in the shadow of Egypt your confusion. +\v 4 For their princes are at Zoan, and their ambassadors have come to Hanes. +\v 5 They shall all be ashamed because of a people that can’t profit them, that are not a help nor profit, but a shame, and also a reproach.” +\p +\v 6 The burden of the animals of the South. +\p Through the land of trouble and anguish, of the lioness and the lion, the viper and fiery flying serpent, they carry their riches on the shoulders of young donkeys, and their treasures on the humps of camels, to an unprofitable people. +\v 7 For Egypt helps in vain, and to no purpose; therefore I have called her Rahab who sits still. +\v 8 Now go, write it before them on a tablet, and inscribe it in a book, that it may be for the time to come forever and ever. +\v 9 For it is a rebellious people, lying children, children who will not hear Yahweh’s law; +\v 10 who tell the seers, “Don’t see!” and the prophets, “Don’t prophesy to us right things. Tell us pleasant things. Prophesy deceits. +\v 11 Get out of the way. Turn away from the path. Cause the Holy One of Israel to cease from before us.” +\v 12 Therefore the Holy One of Israel says, “Because you despise this word, and trust in oppression and perverseness, and rely on it, +\v 13 therefore this iniquity shall be to you like a breach ready to fall, swelling out in a high wall, whose breaking comes suddenly in an instant. +\v 14 He will break it as a potter’s vessel is broken, breaking it in pieces without sparing, so that there won’t be found among the broken pieces a piece good enough to take fire from the hearth, or to dip up water out of the cistern.” +\p +\v 15 For thus said the Lord Yahweh, the Holy One of Israel, “You will be saved in returning and rest. Your strength will be in quietness and in confidence.” You refused, +\v 16 but you said, “No, for we will flee on horses;” therefore you will flee; and, “We will ride on the swift;” therefore those who pursue you will be swift. +\v 17 One thousand will flee at the threat of one. At the threat of five, you will flee until you are left like a beacon on the top of a mountain, and like a banner on a hill. +\p +\v 18 Therefore Yahweh will wait, that he may be gracious to you; and therefore he will be exalted, that he may have mercy on you, for Yahweh is a God of justice. Blessed are all those who wait for him. +\v 19 For the people will dwell in Zion at Jerusalem. You will weep no more. He will surely be gracious to you at the voice of your cry. When he hears you, he will answer you. +\v 20 Though the Lord may give you the bread of adversity and the water of affliction, yet your teachers won’t be hidden any more, but your eyes will see your teachers; +\v 21 and when you turn to the right hand, and when you turn to the left, your ears will hear a voice behind you, saying, “This is the way. Walk in it.” +\v 22 You shall defile the overlaying of your engraved images of silver, and the plating of your molten images of gold. You shall cast them away as an unclean thing. You shall tell it, “Go away!” +\p +\v 23 He will give the rain for your seed, with which you will sow the ground; and bread of the increase of the ground will be rich and plentiful. In that day, your livestock will feed in large pastures. +\v 24 The oxen likewise and the young donkeys that till the ground will eat savory feed, which has been winnowed with the shovel and with the fork. +\v 25 There will be brooks and streams of water on every lofty mountain and on every high hill in the day of the great slaughter, when the towers fall. +\v 26 Moreover the light of the moon will be like the light of the sun, and the light of the sun will be seven times brighter, like the light of seven days, in the day that Yahweh binds up the fracture of his people, and heals the wound they were struck with. +\p +\v 27 Behold, Yahweh’s name comes from far away, burning with his anger, and in thick rising smoke. His lips are full of indignation. His tongue is as a devouring fire. +\v 28 His breath is as an overflowing stream that reaches even to the neck, to sift the nations with the sieve of destruction. A bridle that leads to ruin will be in the jaws of the peoples. +\v 29 You will have a song, as in the night when a holy feast is kept, and gladness of heart, as when one goes with a flute to come to Yahweh’s mountain, to Israel’s Rock. +\v 30 Yahweh will cause his glorious voice to be heard, and will show the descent of his arm, with the indignation of his anger and the flame of a devouring fire, with a blast, storm, and hailstones. +\v 31 For through Yahweh’s voice the Assyrian will be dismayed. He will strike him with his rod. +\v 32 Every stroke of the rod of punishment, which Yahweh will lay on him, will be with the sound of tambourines and harps. He will fight with them in battles, brandishing weapons. +\v 33 For his burning place has long been ready. Yes, it is prepared for the king. He has made its pyre deep and large with fire and much wood. Yahweh’s breath, like a stream of sulfur, kindles it. +\c 31 +\q1 +\v 1 Woe to those who go down to Egypt for help, +\q2 and rely on horses, +\q2 and trust in chariots because they are many, +\q2 and in horsemen because they are very strong, +\q2 but they don’t look to the Holy One of Israel, +\q2 and they don’t seek Yahweh! +\q1 +\v 2 Yet he also is wise, and will bring disaster, +\q2 and will not call back his words, but will arise against the house of the evildoers, +\q2 and against the help of those who work iniquity. +\q1 +\v 3 Now the Egyptians are men, and not God; +\q2 and their horses flesh, and not spirit. +\q1 When Yahweh stretches out his hand, both he who helps shall stumble, +\q2 and he who is helped shall fall, +\q2 and they all shall be consumed together. +\b +\q1 +\v 4 For Yahweh says to me, +\q1 “As the lion and the young lion growling over his prey, +\q2 if a multitude of shepherds is called together against him, +\q2 will not be dismayed at their voice, +\q2 nor abase himself for their noise, +\q2 so Yahweh of Armies will come down to fight on Mount Zion and on its heights. +\q1 +\v 5 As birds hovering, so Yahweh of Armies will protect Jerusalem. +\q2 He will protect and deliver it. +\q2 He will pass over and preserve it.” +\q1 +\v 6 Return to him from whom you have deeply revolted, children of Israel. +\v 7 For in that day everyone shall cast away his idols of silver and his idols of gold—sin which your own hands have made for you. +\p +\v 8 “The Assyrian will fall by the sword, not of man; +\q2 and the sword, not of mankind, shall devour him. +\q1 He will flee from the sword, +\q2 and his young men will become subject to forced labor. +\q1 +\v 9 His rock will pass away by reason of terror, +\q2 and his princes will be afraid of the banner,” +\q1 says Yahweh, whose fire is in Zion, +\q2 and his furnace in Jerusalem. +\c 32 +\q1 +\v 1 Behold, a king shall reign in righteousness, +\q2 and princes shall rule in justice. +\q1 +\v 2 A man shall be as a hiding place from the wind, +\q2 and a covert from the storm, +\q2 as streams of water in a dry place, +\q2 as the shade of a large rock in a weary land. +\q1 +\v 3 The eyes of those who see will not be dim, +\q2 and the ears of those who hear will listen. +\q1 +\v 4 The heart of the rash will understand knowledge, +\q2 and the tongue of the stammerers will be ready to speak plainly. +\q1 +\v 5 The fool will no longer be called noble, +\q2 nor the scoundrel be highly respected. +\q1 +\v 6 For the fool will speak folly, +\q2 and his heart will work iniquity, +\q2 to practice profanity, +\q2 and to utter error against Yahweh, +\q2 to make empty the soul of the hungry, +\q2 and to cause the drink of the thirsty to fail. +\q1 +\v 7 The ways of the scoundrel are evil. +\q2 He devises wicked plans to destroy the humble with lying words, +\q2 even when the needy speaks right. +\q1 +\v 8 But the noble devises noble things, +\q2 and he will continue in noble things. +\b +\q1 +\v 9 Rise up, you women who are at ease! Hear my voice! +\q2 You careless daughters, give ear to my speech! +\q1 +\v 10 For days beyond a year you will be troubled, you careless women; +\q2 for the vintage will fail. +\q2 The harvest won’t come. +\q1 +\v 11 Tremble, you women who are at ease! +\q2 Be troubled, you careless ones! +\q2 Strip yourselves, make yourselves naked, +\q2 and put sackcloth on your waist. +\q1 +\v 12 Beat your breasts for the pleasant fields, +\q2 for the fruitful vine. +\q1 +\v 13 Thorns and briers will come up on my people’s land; +\q2 yes, on all the houses of joy in the joyous city. +\q1 +\v 14 For the palace will be forsaken. +\q2 The populous city will be deserted. +\q2 The hill and the watchtower will be for dens forever, +\q2 a delight for wild donkeys, +\q2 a pasture of flocks, +\q1 +\v 15 until the Spirit is poured on us from on high, +\q2 and the wilderness becomes a fruitful field, +\q2 and the fruitful field is considered a forest. +\b +\q1 +\v 16 Then justice will dwell in the wilderness; +\q2 and righteousness will remain in the fruitful field. +\q1 +\v 17 The work of righteousness will be peace, +\q2 and the effect of righteousness, quietness and confidence forever. +\q1 +\v 18 My people will live in a peaceful habitation, +\q2 in safe dwellings, +\q2 and in quiet resting places, +\q1 +\v 19 though hail flattens the forest, +\q2 and the city is leveled completely. +\q1 +\v 20 Blessed are you who sow beside all waters, +\q2 who send out the feet of the ox and the donkey. +\c 33 +\q1 +\v 1 Woe to you who destroy, but you weren’t destroyed, +\q2 and who betray, but nobody betrayed you! +\q1 When you have finished destroying, you will be destroyed; +\q2 and when you have finished betrayal, you will be betrayed. +\b +\q1 +\v 2 Yahweh, be gracious to us. We have waited for you. +\q2 Be our strength every morning, +\q2 our salvation also in the time of trouble. +\q1 +\v 3 At the noise of the thunder, the peoples have fled. +\q2 When you lift yourself up, the nations are scattered. +\q1 +\v 4 Your plunder will be gathered as the caterpillar gathers. +\q2 Men will leap on it as locusts leap. +\q1 +\v 5 Yahweh is exalted, for he dwells on high. +\q2 He has filled Zion with justice and righteousness. +\q1 +\v 6 There will be stability in your times, abundance of salvation, wisdom, and knowledge. +\q2 The fear of Yahweh is your treasure. +\b +\q1 +\v 7 Behold, their valiant ones cry outside; +\q2 the ambassadors of peace weep bitterly. +\q1 +\v 8 The highways are desolate. +\q2 The traveling man ceases. +\q2 The covenant is broken. +\q2 He has despised the cities. +\q2 He doesn’t respect man. +\q1 +\v 9 The land mourns and languishes. +\q2 Lebanon is confounded and withers away. +\q2 Sharon is like a desert, and Bashan and Carmel are stripped bare. +\q1 +\v 10 “Now I will arise,” says Yahweh. +\q2 “Now I will lift myself up. +\q2 Now I will be exalted. +\q1 +\v 11 You will conceive chaff. +\q2 You will give birth to stubble. +\q2 Your breath is a fire that will devour you. +\q1 +\v 12 The peoples will be like the burning of lime, +\q2 like thorns that are cut down and burned in the fire. +\b +\q1 +\v 13 Hear, you who are far off, what I have done; +\q2 and, you who are near, acknowledge my might.” +\q1 +\v 14 The sinners in Zion are afraid. +\q2 Trembling has seized the godless ones. +\q1 Who among us can live with the devouring fire? +\q2 Who among us can live with everlasting burning? +\q1 +\v 15 He who walks righteously +\q2 and speaks blamelessly, +\q2 he who despises the gain of oppressions, +\q2 who gestures with his hands, refusing to take a bribe, +\q2 who stops his ears from hearing of bloodshed, +\q2 and shuts his eyes from looking at evil— +\q1 +\v 16 he will dwell on high. +\q2 His place of defense will be the fortress of rocks. +\q2 His bread will be supplied. +\q2 His waters will be sure. +\b +\q1 +\v 17 Your eyes will see the king in his beauty. +\q2 They will see a distant land. +\q1 +\v 18 Your heart will meditate on the terror. +\q2 Where is he who counted? +\q2 Where is he who weighed? +\q2 Where is he who counted the towers? +\q1 +\v 19 You will no longer see the fierce people, +\q2 a people of a deep speech that you can’t comprehend, +\q2 with a strange language that you can’t understand. +\q1 +\v 20 Look at Zion, the city of our appointed festivals. +\q2 Your eyes will see Jerusalem, a quiet habitation, +\q2 a tent that won’t be removed. +\q1 Its stakes will never be plucked up, +\q2 nor will any of its cords be broken. +\q1 +\v 21 But there Yahweh will be with us in majesty, +\q2 a place of wide rivers and streams, +\q2 in which no galley with oars will go, +\q2 neither will any gallant ship pass by there. +\q1 +\v 22 For Yahweh is our judge. +\q2 Yahweh is our lawgiver. +\q2 Yahweh is our king. +\q2 He will save us. +\b +\q1 +\v 23 Your rigging is untied. +\q2 They couldn’t strengthen the foot of their mast. +\q2 They couldn’t spread the sail. +\q1 Then the prey of a great plunder was divided. +\q2 The lame took the prey. +\b +\q1 +\v 24 The inhabitant won’t say, “I am sick.” +\q2 The people who dwell therein will be forgiven their iniquity. +\c 34 +\q1 +\v 1 Come near, you nations, to hear! +\q2 Listen, you peoples. +\q2 Let the earth and all it contains hear, +\q2 the world, and everything that comes from it. +\q1 +\v 2 For Yahweh is enraged against all the nations, +\q2 and angry with all their armies. +\q1 He has utterly destroyed them. +\q2 He has given them over for slaughter. +\q1 +\v 3 Their slain will also be cast out, +\q2 and the stench of their dead bodies will come up. +\q2 The mountains will melt in their blood. +\q1 +\v 4 All of the army of the sky will be dissolved. +\q2 The sky will be rolled up like a scroll, +\q2 and all its armies will fade away, +\q2 as a leaf fades from off a vine or a fig tree. +\q1 +\v 5 For my sword has drunk its fill in the sky. +\q2 Behold, it will come down on Edom, +\q2 and on the people of my curse, for judgment. +\q1 +\v 6 Yahweh’s sword is filled with blood. +\q2 It is covered with fat, with the blood of lambs and goats, +\q2 with the fat of the kidneys of rams; +\q2 for Yahweh has a sacrifice in Bozrah, +\q2 and a great slaughter in the land of Edom. +\q1 +\v 7 The wild oxen will come down with them, +\q2 and the young bulls with the mighty bulls; +\q2 and their land will be drunken with blood, +\q2 and their dust made greasy with fat. +\b +\q1 +\v 8 For Yahweh has a day of vengeance, +\q2 a year of recompense for the cause of Zion. +\q1 +\v 9 Its streams will be turned into pitch, +\q2 its dust into sulfur, +\q2 and its land will become burning pitch. +\q1 +\v 10 It won’t be quenched night or day. +\q2 Its smoke will go up forever. +\q2 From generation to generation, it will lie waste. +\q2 No one will pass through it forever and ever. +\q1 +\v 11 But the pelican and the porcupine will possess it. +\q2 The owl and the raven will dwell in it. +\q1 He will stretch the line of confusion over it, +\q2 and the plumb line of emptiness. +\q1 +\v 12 They shall call its nobles to the kingdom, but none shall be there; +\q2 and all its princes shall be nothing. +\q1 +\v 13 Thorns will come up in its palaces, +\q2 nettles and thistles in its fortresses; +\q2 and it will be a habitation of jackals, +\q2 a court for ostriches. +\q1 +\v 14 The wild animals of the desert will meet with the wolves, +\q2 and the wild goat will cry to his fellow. +\q1 Yes, the night creature\f + \fr 34:14 \ft literally, lilith, which could also be a night demon or night monster\f* shall settle there, +\q2 and shall find herself a place of rest. +\q1 +\v 15 The arrow snake will make her nest there, +\q2 and lay, hatch, and gather under her shade. +\q2 Yes, the kites will be gathered there, every one with her mate. +\b +\q1 +\v 16 Search in the book of Yahweh, and read: +\q2 not one of these will be missing. +\q2 None will lack her mate. +\q2 For my mouth has commanded, +\q2 and his Spirit has gathered them. +\q1 +\v 17 He has cast the lot for them, +\q2 and his hand has divided it to them with a measuring line. +\q2 They shall possess it forever. +\q2 From generation to generation they will dwell in it. +\b +\c 35 +\q1 +\v 1 The wilderness and the dry land will be glad. +\q2 The desert will rejoice and blossom like a rose. +\q1 +\v 2 It will blossom abundantly, +\q2 and rejoice even with joy and singing. +\q2 Lebanon’s glory will be given to it, +\q2 the excellence of Carmel and Sharon. +\q2 They will see Yahweh’s glory, +\q2 the excellence of our God. +\b +\q1 +\v 3 Strengthen the weak hands, +\q2 and make the feeble knees firm. +\q1 +\v 4 Tell those who have a fearful heart, “Be strong! +\q2 Don’t be afraid! +\q1 Behold, your God will come with vengeance, God’s retribution. +\q2 He will come and save you. +\b +\q1 +\v 5 Then the eyes of the blind will be opened, +\q2 and the ears of the deaf will be unstopped. +\q1 +\v 6 Then the lame man will leap like a deer, +\q2 and the tongue of the mute will sing; +\q2 for waters will break out in the wilderness, +\q2 and streams in the desert. +\q1 +\v 7 The burning sand will become a pool, +\q2 and the thirsty ground springs of water. +\q2 Grass with reeds and rushes will be in the habitation of jackals, where they lay. +\q1 +\v 8 A highway will be there, a road, +\q2 and it will be called “The Holy Way”. +\q1 The unclean shall not pass over it, +\q2 but it will be for those who walk in the Way. +\q2 Wicked fools shall not go there. +\q1 +\v 9 No lion will be there, +\q2 nor will any ravenous animal go up on it. +\q2 They will not be found there; +\q2 but the redeemed will walk there. +\q1 +\v 10 Then Yahweh’s ransomed ones will return, +\q2 and come with singing to Zion; +\q2 and everlasting joy will be on their heads. +\q1 They will obtain gladness and joy, +\q2 and sorrow and sighing will flee away.” +\c 36 +\p +\v 1 Now in the fourteenth year of King Hezekiah, Sennacherib king of Assyria attacked all of the fortified cities of Judah and captured them. +\v 2 The king of Assyria sent Rabshakeh from Lachish to Jerusalem to King Hezekiah with a large army. He stood by the aqueduct from the upper pool in the fuller’s field highway. +\v 3 Then Eliakim the son of Hilkiah, who was over the household, and Shebna the scribe, and Joah, the son of Asaph the recorder came out to him. +\p +\v 4 Rabshakeh said to them, “Now tell Hezekiah, ‘The great king, the king of Assyria, says, “What confidence is this in which you trust? +\v 5 I say that your counsel and strength for the war are only vain words. Now in whom do you trust, that you have rebelled against me? +\v 6 Behold, you trust in the staff of this bruised reed, even in Egypt, which if a man leans on it, it will go into his hand and pierce it. So is Pharaoh king of Egypt to all who trust in him. +\v 7 But if you tell me, ‘We trust in Yahweh our God,’ isn’t that he whose high places and whose altars Hezekiah has taken away, and has said to Judah and to Jerusalem, ‘You shall worship before this altar?’” +\v 8 Now therefore, please make a pledge to my master the king of Assyria, and I will give you two thousand horses, if you are able on your part to set riders on them. +\v 9 How then can you turn away the face of one captain of the least of my master’s servants, and put your trust in Egypt for chariots and for horsemen? +\v 10 Have I come up now without Yahweh against this land to destroy it? Yahweh said to me, “Go up against this land, and destroy it.”’” +\p +\v 11 Then Eliakim, Shebna and Joah said to Rabshakeh, “Please speak to your servants in Aramaic, for we understand it. Don’t speak to us in the Jews’ language in the hearing of the people who are on the wall.” +\p +\v 12 But Rabshakeh said, “Has my master sent me only to your master and to you, to speak these words, and not to the men who sit on the wall, who will eat their own dung and drink their own urine with you?” +\v 13 Then Rabshakeh stood, and called out with a loud voice in the Jews’ language, and said, “Hear the words of the great king, the king of Assyria! +\v 14 The king says, ‘Don’t let Hezekiah deceive you; for he will not be able to deliver you. +\v 15 Don’t let Hezekiah make you trust in Yahweh, saying, “Yahweh will surely deliver us. This city won’t be given into the hand of the king of Assyria.”’ +\v 16 Don’t listen to Hezekiah, for the king of Assyria says, ‘Make your peace with me, and come out to me; and each of you eat from his vine, and each one from his fig tree, and each one of you drink the waters of his own cistern; +\v 17 until I come and take you away to a land like your own land, a land of grain and new wine, a land of bread and vineyards. +\v 18 Beware lest Hezekiah persuade you, saying, “Yahweh will deliver us.” Have any of the gods of the nations delivered their lands from the hand of the king of Assyria? +\v 19 Where are the gods of Hamath and Arpad? Where are the gods of Sepharvaim? Have they delivered Samaria from my hand? +\v 20 Who are they among all the gods of these countries that have delivered their country out of my hand, that Yahweh should deliver Jerusalem out of my hand?’” +\p +\v 21 But they remained silent, and said nothing in reply, for the king’s commandment was, “Don’t answer him.” +\p +\v 22 Then Eliakim the son of Hilkiah, who was over the household, and Shebna the scribe, and Joah, the son of Asaph the recorder, came to Hezekiah with their clothes torn, and told him the words of Rabshakeh. +\c 37 +\p +\v 1 When King Hezekiah heard it, he tore his clothes, covered himself with sackcloth, and went into Yahweh’s house. +\v 2 He sent Eliakim, who was over the household, and Shebna the scribe, and the elders of the priests, covered with sackcloth, to Isaiah the prophet, the son of Amoz. +\v 3 They said to him, “Hezekiah says, ‘Today is a day of trouble, and of rebuke, and of rejection; for the children have come to the birth, and there is no strength to give birth. +\v 4 It may be Yahweh your God will hear the words of Rabshakeh, whom the king of Assyria his master has sent to defy the living God, and will rebuke the words which Yahweh your God has heard. Therefore lift up your prayer for the remnant that is left.’” +\p +\v 5 So the servants of King Hezekiah came to Isaiah. +\p +\v 6 Isaiah said to them, “Tell your master, ‘Yahweh says, “Don’t be afraid of the words that you have heard, with which the servants of the king of Assyria have blasphemed me. +\v 7 Behold, I will put a spirit in him and he will hear news, and will return to his own land. I will cause him to fall by the sword in his own land.”’” +\p +\v 8 So Rabshakeh returned, and found the king of Assyria warring against Libnah, for he heard that he had departed from Lachish. +\v 9 He heard news concerning Tirhakah king of Ethiopia, “He has come out to fight against you.” When he heard it, he sent messengers to Hezekiah, saying, +\v 10 “Thus you shall speak to Hezekiah king of Judah, saying, ‘Don’t let your God in whom you trust deceive you, saying, “Jerusalem won’t be given into the hand of the king of Assyria.” +\v 11 Behold, you have heard what the kings of Assyria have done to all lands, by destroying them utterly. Shall you be delivered? +\v 12 Have the gods of the nations delivered them, which my fathers have destroyed, Gozan, Haran, Rezeph, and the children of Eden who were in Telassar? +\v 13 Where is the king of Hamath, and the king of Arpad, and the king of the city of Sepharvaim, of Hena, and Ivvah?’” +\p +\v 14 Hezekiah received the letter from the hand of the messengers and read it. Then Hezekiah went up to Yahweh’s house, and spread it before Yahweh. +\v 15 Hezekiah prayed to Yahweh, saying, +\v 16 “Yahweh of Armies, the God of Israel, who is enthroned among the cherubim, you are the God, even you alone, of all the kingdoms of the earth. You have made heaven and earth. +\v 17 Turn your ear, Yahweh, and hear. Open your eyes, Yahweh, and behold. Hear all of the words of Sennacherib, who has sent to defy the living God. +\v 18 Truly, Yahweh, the kings of Assyria have destroyed all the countries and their land, +\v 19 and have cast their gods into the fire; for they were no gods, but the work of men’s hands, wood and stone; therefore they have destroyed them. +\v 20 Now therefore, Yahweh our God, save us from his hand, that all the kingdoms of the earth may know that you are Yahweh, even you only.” +\p +\v 21 Then Isaiah the son of Amoz sent to Hezekiah, saying, “Yahweh, the God of Israel says, ‘Because you have prayed to me against Sennacherib king of Assyria, +\v 22 this is the word which Yahweh has spoken concerning him: The virgin daughter of Zion has despised you and ridiculed you. The daughter of Jerusalem has shaken her head at you. +\v 23 Whom have you defied and blasphemed? Against whom have you exalted your voice and lifted up your eyes on high? Against the Holy One of Israel. +\v 24 By your servants, you have defied the Lord, and have said, “With the multitude of my chariots I have come up to the height of the mountains, to the innermost parts of Lebanon. I will cut down its tall cedars and its choice cypress trees. I will enter into its farthest height, the forest of its fruitful field. +\v 25 I have dug and drunk water, and with the sole of my feet I will dry up all the rivers of Egypt.” +\p +\v 26 “‘Have you not heard how I have done it long ago, and formed it in ancient times? Now I have brought it to pass, that it should be yours to destroy fortified cities, turning them into ruinous heaps. +\v 27 Therefore their inhabitants had little power. They were dismayed and confounded. They were like the grass of the field, and like the green herb, like the grass on the housetops, and like a field before its crop has grown. +\v 28 But I know your sitting down, your going out, your coming in, and your raging against me. +\v 29 Because of your raging against me, and because your arrogance has come up into my ears, therefore I will put my hook in your nose and my bridle in your lips, and I will turn you back by the way by which you came. +\p +\v 30 “‘This shall be the sign to you: You will eat this year that which grows of itself, and in the second year that which springs from it; and in the third year sow and reap and plant vineyards, and eat their fruit. +\v 31 The remnant that is escaped of the house of Judah will again take root downward, and bear fruit upward. +\v 32 For out of Jerusalem a remnant will go out, and survivors will escape from Mount Zion. The zeal of Yahweh of Armies will perform this.’ +\p +\v 33 “Therefore Yahweh says concerning the king of Assyria, ‘He will not come to this city, nor shoot an arrow there, neither will he come before it with shield, nor cast up a mound against it. +\v 34 He will return the way that he came, and he won’t come to this city,’ says Yahweh. +\v 35 ‘For I will defend this city to save it, for my own sake, and for my servant David’s sake.’” +\p +\v 36 Then Yahweh’s angel went out and struck one hundred and eighty-five thousand men in the camp of the Assyrians. When men arose early in the morning, behold, these were all dead bodies. +\v 37 So Sennacherib king of Assyria departed, went away, returned to Nineveh, and stayed there. +\v 38 As he was worshiping in the house of Nisroch his god, Adrammelech and Sharezer his sons struck him with the sword; and they escaped into the land of Ararat. Esar Haddon his son reigned in his place. +\c 38 +\p +\v 1 In those days Hezekiah was sick and near death. Isaiah the prophet, the son of Amoz, came to him, and said to him, “Yahweh says, ‘Set your house in order, for you will die, and not live.’” +\p +\v 2 Then Hezekiah turned his face to the wall and prayed to Yahweh, +\v 3 and said, “Remember now, Yahweh, I beg you, how I have walked before you in truth and with a perfect heart, and have done that which is good in your sight.” Then Hezekiah wept bitterly. +\p +\v 4 Then Yahweh’s word came to Isaiah, saying, +\v 5 “Go, and tell Hezekiah, ‘Yahweh, the God of David your father, says, “I have heard your prayer. I have seen your tears. Behold, I will add fifteen years to your life. +\v 6 I will deliver you and this city out of the hand of the king of Assyria, and I will defend this city. +\v 7 This shall be the sign to you from Yahweh, that Yahweh will do this thing that he has spoken. +\v 8 Behold, I will cause the shadow on the sundial, which has gone down on the sundial of Ahaz with the sun, to return backward ten steps.”’” So the sun returned ten steps on the sundial on which it had gone down. +\p +\v 9 The writing of Hezekiah king of Judah, when he had been sick, and had recovered of his sickness: +\q1 +\v 10 I said, “In the middle of my life I go into the gates of Sheol.\f + \fr 38:10 \ft Sheol is the place of the dead.\f* +\q2 I am deprived of the residue of my years.” +\q1 +\v 11 I said, “I won’t see Yah, +\q2 Yah in the land of the living. +\q2 I will see man no more with the inhabitants of the world. +\q1 +\v 12 My dwelling is removed, +\q2 and is carried away from me like a shepherd’s tent. +\q1 I have rolled up my life like a weaver. +\q2 He will cut me off from the loom. +\q2 From day even to night you will make an end of me. +\q1 +\v 13 I waited patiently until morning. +\q2 He breaks all my bones like a lion. +\q2 From day even to night you will make an end of me. +\q1 +\v 14 I chattered like a swallow or a crane. +\q2 I moaned like a dove. +\q2 My eyes weaken looking upward. +\q2 Lord, I am oppressed. +\q2 Be my security.” +\q1 +\v 15 What will I say? +\q2 He has both spoken to me, and himself has done it. +\q2 I will walk carefully all my years because of the anguish of my soul. +\q1 +\v 16 Lord, men live by these things; +\q2 and my spirit finds life in all of them. +\q2 You restore me, and cause me to live. +\q1 +\v 17 Behold, for peace I had great anguish, +\q2 but you have in love for my soul delivered it from the pit of corruption; +\q2 for you have cast all my sins behind your back. +\q1 +\v 18 For Sheol\f + \fr 38:18 \ft Sheol is the place of the dead.\f* can’t praise you. +\q2 Death can’t celebrate you. +\q1 Those who go down into the pit can’t hope for your truth. +\q1 +\v 19 The living, the living, he shall praise you, as I do today. +\q2 The father shall make known your truth to the children. +\q1 +\v 20 Yahweh will save me. +\q2 Therefore we will sing my songs with stringed instruments all the days of our life in Yahweh’s house. +\p +\v 21 Now Isaiah had said, “Let them take a cake of figs, and lay it for a poultice on the boil, and he shall recover.” +\v 22 Hezekiah also had said, “What is the sign that I will go up to Yahweh’s house?” +\c 39 +\p +\v 1 At that time, Merodach-baladan the son of Baladan, king of Babylon, sent letters and a present to Hezekiah, for he heard that he had been sick, and had recovered. +\v 2 Hezekiah was pleased with them, and showed them the house of his precious things, the silver, the gold, the spices, and the precious oil, and all the house of his armor, and all that was found in his treasures. There was nothing in his house, nor in all his dominion, that Hezekiah didn’t show them. +\v 3 Then Isaiah the prophet came to King Hezekiah, and asked him, “What did these men say? From where did they come to you?” +\p Hezekiah said, “They have come from a country far from me, even from Babylon.” +\p +\v 4 Then he asked, “What have they seen in your house?” +\p Hezekiah answered, “They have seen all that is in my house. There is nothing among my treasures that I have not shown them.” +\p +\v 5 Then Isaiah said to Hezekiah, “Hear the word of Yahweh of Armies: +\v 6 ‘Behold, the days are coming when all that is in your house, and that which your fathers have stored up until today, will be carried to Babylon. Nothing will be left,’ says Yahweh. +\v 7 ‘They will take away your sons who will issue from you, whom you shall father, and they will be eunuchs in the king of Babylon’s palace.’” +\p +\v 8 Then Hezekiah said to Isaiah, “Yahweh’s word which you have spoken is good.” He said moreover, “For there will be peace and truth in my days.” +\c 40 + +\p +\v 1 “Comfort, comfort my people,” says your God. +\v 2 “Speak comfortably to Jerusalem, and call out to her that her warfare is accomplished, that her iniquity is pardoned, that she has received of Yahweh’s hand double for all her sins.” +\q1 +\v 3 The voice of one who calls out, +\q2 “Prepare the way of Yahweh in the wilderness! +\q2 Make a level highway in the desert for our God. +\q1 +\v 4 Every valley shall be exalted, +\q2 and every mountain and hill shall be made low. +\q2 The uneven shall be made level, +\q2 and the rough places a plain. +\q1 +\v 5 Yahweh’s glory shall be revealed, +\q2 and all flesh shall see it together; +\q2 for the mouth of Yahweh has spoken it.” +\b +\q1 +\v 6 The voice of one saying, “Cry out!” +\q2 One said, “What shall I cry?” +\q1 “All flesh is like grass, +\q2 and all its glory is like the flower of the field. +\q1 +\v 7 The grass withers, +\q2 the flower fades, +\q2 because Yahweh’s breath blows on it. +\q2 Surely the people are like grass. +\q1 +\v 8 The grass withers, +\q2 the flower fades; +\q2 but the word of our God stands forever.” +\b +\q1 +\v 9 You who tell good news to Zion, go up on a high mountain. +\q2 You who tell good news to Jerusalem, lift up your voice with strength! +\q2 Lift it up! Don’t be afraid! +\q2 Say to the cities of Judah, “Behold, your God!” +\q1 +\v 10 Behold, the Lord Yahweh will come as a mighty one, +\q2 and his arm will rule for him. +\q2 Behold, his reward is with him, +\q2 and his recompense before him. +\q1 +\v 11 He will feed his flock like a shepherd. +\q2 He will gather the lambs in his arm, +\q2 and carry them in his bosom. +\q2 He will gently lead those who have their young. +\b +\q1 +\v 12 Who has measured the waters in the hollow of his hand, +\q2 and marked off the sky with his span, +\q2 and calculated the dust of the earth in a measuring basket, +\q2 and weighed the mountains in scales, +\q2 and the hills in a balance? +\q1 +\v 13 Who has directed Yahweh’s Spirit, +\q2 or has taught him as his counselor? +\q1 +\v 14 Who did he take counsel with, +\q2 and who instructed him, +\q2 and taught him in the path of justice, +\q2 and taught him knowledge, +\q2 and showed him the way of understanding? +\q1 +\v 15 Behold, the nations are like a drop in a bucket, +\q2 and are regarded as a speck of dust on a balance. +\q2 Behold, he lifts up the islands like a very little thing. +\q1 +\v 16 Lebanon is not sufficient to burn, +\q2 nor its animals sufficient for a burnt offering. +\q1 +\v 17 All the nations are like nothing before him. +\q2 They are regarded by him as less than nothing, and vanity. +\b +\q1 +\v 18 To whom then will you liken God? +\q2 Or what likeness will you compare to him? +\q1 +\v 19 A workman has cast an image, +\q2 and the goldsmith overlays it with gold, +\q2 and casts silver chains for it. +\q1 +\v 20 He who is too impoverished for such an offering chooses a tree that will not rot. +\q2 He seeks a skillful workman to set up a carved image for him that will not be moved. +\b +\q1 +\v 21 Haven’t you known? +\q2 Haven’t you heard? +\q2 Haven’t you been told from the beginning? +\q2 Haven’t you understood from the foundations of the earth? +\q1 +\v 22 It is he who sits above the circle of the earth, +\q2 and its inhabitants are like grasshoppers; +\q2 who stretches out the heavens like a curtain, +\q2 and spreads them out like a tent to dwell in, +\q2 +\v 23 who brings princes to nothing, +\q2 who makes the judges of the earth meaningless. +\q1 +\v 24 They are planted scarcely. +\q2 They are sown scarcely. +\q2 Their stock has scarcely taken root in the ground. +\q2 He merely blows on them, and they wither, +\q2 and the whirlwind takes them away as stubble. +\b +\q1 +\v 25 “To whom then will you liken me? +\q2 Who is my equal?” says the Holy One. +\q1 +\v 26 Lift up your eyes on high, +\q2 and see who has created these, +\q2 who brings out their army by number. +\q2 He calls them all by name. +\q2 By the greatness of his might, +\q2 and because he is strong in power, +\q2 not one is lacking. +\b +\q1 +\v 27 Why do you say, Jacob, +\q2 and speak, Israel, +\q2 “My way is hidden from Yahweh, +\q2 and the justice due me is disregarded by my God?” +\q1 +\v 28 Haven’t you known? +\q2 Haven’t you heard? +\q2 The everlasting God, Yahweh, +\q2 the Creator of the ends of the earth, doesn’t faint. +\q2 He isn’t weary. +\q2 His understanding is unsearchable. +\q1 +\v 29 He gives power to the weak. +\q2 He increases the strength of him who has no might. +\q1 +\v 30 Even the youths faint and get weary, +\q2 and the young men utterly fall; +\q2 +\v 31 but those who wait for Yahweh will renew their strength. +\q2 They will mount up with wings like eagles. +\q2 They will run, and not be weary. +\q2 They will walk, and not faint. +\c 41 +\q1 +\v 1 “Keep silent before me, islands, +\q2 and let the peoples renew their strength. +\q1 Let them come near, +\q2 then let them speak. +\q2 Let’s meet together for judgment. +\q1 +\v 2 Who has raised up one from the east? +\q2 Who called him to his feet in righteousness? +\q2 He hands over nations to him +\q2 and makes him rule over kings. +\q2 He gives them like the dust to his sword, +\q2 like the driven stubble to his bow. +\q1 +\v 3 He pursues them +\q2 and passes by safely, +\q2 even by a way that he had not gone with his feet. +\q1 +\v 4 Who has worked and done it, +\q2 calling the generations from the beginning? +\q2 I, Yahweh, the first, and with the last, I am he.” +\b +\q1 +\v 5 The islands have seen, and fear. +\q2 The ends of the earth tremble. +\q2 They approach, and come. +\q1 +\v 6 Everyone helps his neighbor. +\q2 They say to their brothers, “Be strong!” +\q1 +\v 7 So the carpenter encourages the goldsmith. +\q2 He who smooths with the hammer encourages him who strikes the anvil, +\q2 saying of the soldering, “It is good;” +\q2 and he fastens it with nails, that it might not totter. +\b +\q1 +\v 8 “But you, Israel, my servant, +\q2 Jacob whom I have chosen, +\q2 the offspring of Abraham my friend, +\q2 +\v 9 you whom I have taken hold of from the ends of the earth, +\q2 and called from its corners, +\q2 and said to you, ‘You are my servant. I have chosen you and have not cast you away.’ +\q1 +\v 10 Don’t you be afraid, for I am with you. +\q2 Don’t be dismayed, for I am your God. +\q2 I will strengthen you. +\q2 Yes, I will help you. +\q2 Yes, I will uphold you with the right hand of my righteousness. +\q1 +\v 11 Behold, all those who are incensed against you will be disappointed and confounded. +\q2 Those who strive with you will be like nothing, and shall perish. +\q1 +\v 12 You will seek them, and won’t find them, +\q2 even those who contend with you. +\q2 Those who war against you will be as nothing, +\q2 as a nonexistent thing. +\q1 +\v 13 For I, Yahweh your God, will hold your right hand, +\q2 saying to you, ‘Don’t be afraid. +\q2 I will help you.’ +\q1 +\v 14 Don’t be afraid, you worm Jacob, +\q2 and you men of Israel. +\q2 I will help you,” says Yahweh. +\q2 “Your Redeemer is the Holy One of Israel. +\q1 +\v 15 Behold, I have made you into a new sharp threshing instrument with teeth. +\q2 You will thresh the mountains, +\q2 and beat them small, +\q2 and will make the hills like chaff. +\q1 +\v 16 You will winnow them, +\q2 and the wind will carry them away, +\q2 and the whirlwind will scatter them. +\q1 You will rejoice in Yahweh. +\q2 You will glory in the Holy One of Israel. +\b +\q1 +\v 17 The poor and needy seek water, and there is none. +\q2 Their tongue fails for thirst. +\q1 I, Yahweh, will answer them. +\q2 I, the God of Israel, will not forsake them. +\q1 +\v 18 I will open rivers on the bare heights, +\q2 and springs in the middle of the valleys. +\q2 I will make the wilderness a pool of water, +\q2 and the dry land springs of water. +\q1 +\v 19 I will put cedar, acacia, myrtle, and oil trees in the wilderness. +\q2 I will set cypress trees, pine, and box trees together in the desert; +\q2 +\v 20 that they may see, know, consider, and understand together, +\q2 that Yahweh’s hand has done this, +\q2 and the Holy One of Israel has created it. +\b +\q1 +\v 21 Produce your cause,” says Yahweh. +\q2 “Bring out your strong reasons!” says the King of Jacob. +\q1 +\v 22 “Let them announce and declare to us what will happen! +\q2 Declare the former things, what they are, +\q2 that we may consider them, and know the latter end of them; +\q2 or show us things to come. +\q1 +\v 23 Declare the things that are to come hereafter, +\q2 that we may know that you are gods. +\q1 Yes, do good, or do evil, +\q2 that we may be dismayed, +\q2 and see it together. +\q1 +\v 24 Behold, you are nothing, +\q2 and your work is nothing. +\q2 He who chooses you is an abomination. +\b +\q1 +\v 25 “I have raised up one from the north, and he has come, +\q2 from the rising of the sun, one who calls on my name, +\q2 and he shall come on rulers as on mortar, +\q2 and as the potter treads clay. +\q1 +\v 26 Who has declared it from the beginning, that we may know? +\q2 and before, that we may say, ‘He is right?’ +\q1 Surely, there is no one who declares. +\q2 Surely, there is no one who shows. +\q2 Surely, there is no one who hears your words. +\q1 +\v 27 I am the first to say to Zion, ‘Behold, look at them;’ +\q2 and I will give one who brings good news to Jerusalem. +\q1 +\v 28 When I look, there is no man, +\q2 even among them there is no counselor who, when I ask, can answer a word. +\q1 +\v 29 Behold, all of their deeds are vanity and nothing. +\q2 Their molten images are wind and confusion. +\c 42 +\q1 +\v 1 “Behold, my servant, whom I uphold, +\q2 my chosen, in whom my soul delights: +\q2 I have put my Spirit on him. +\q2 He will bring justice to the nations. +\q1 +\v 2 He will not shout, +\q2 nor raise his voice, +\q2 nor cause it to be heard in the street. +\q1 +\v 3 He won’t break a bruised reed. +\q2 He won’t quench a dimly burning wick. +\q2 He will faithfully bring justice. +\q1 +\v 4 He will not fail nor be discouraged, +\q2 until he has set justice in the earth, +\q2 and the islands wait for his law.” +\b +\q1 +\v 5 God Yahweh, +\q2 he who created the heavens and stretched them out, +\q2 he who spread out the earth and that which comes out of it, +\q2 he who gives breath to its people and spirit to those who walk in it, says: +\q1 +\v 6 “I, Yahweh, have called you in righteousness. +\q2 I will hold your hand. +\q2 I will keep you, +\q2 and make you a covenant for the people, +\q2 as a light for the nations, +\q2 +\v 7 to open the blind eyes, +\q2 to bring the prisoners out of the dungeon, +\q2 and those who sit in darkness out of the prison. +\b +\q1 +\v 8 “I am Yahweh. +\q2 That is my name. +\q2 I will not give my glory to another, +\q2 nor my praise to engraved images. +\q1 +\v 9 Behold, the former things have happened +\q2 and I declare new things. +\q2 I tell you about them before they come up.” +\b +\q1 +\v 10 Sing to Yahweh a new song, +\q2 and his praise from the end of the earth, +\q2 you who go down to the sea, +\q2 and all that is therein, +\q2 the islands and their inhabitants. +\q1 +\v 11 Let the wilderness and its cities raise their voices, +\q2 with the villages that Kedar inhabits. +\q2 Let the inhabitants of Sela sing. +\q2 Let them shout from the top of the mountains! +\q1 +\v 12 Let them give glory to Yahweh, +\q2 and declare his praise in the islands. +\q1 +\v 13 Yahweh will go out like a mighty man. +\q2 He will stir up zeal like a man of war. +\q2 He will raise a war cry. +\q2 Yes, he will shout aloud. +\q2 He will triumph over his enemies. +\b +\q1 +\v 14 “I have been silent a long time. +\q2 I have been quiet and restrained myself. +\q2 Now I will cry out like a travailing woman. I will both gasp and pant. +\q1 +\v 15 I will destroy mountains and hills, +\q2 and dry up all their herbs. +\q2 I will make the rivers islands, +\q2 and will dry up the pools. +\q1 +\v 16 I will bring the blind by a way that they don’t know. +\q2 I will lead them in paths that they don’t know. +\q2 I will make darkness light before them, +\q2 and crooked places straight. +\q2 I will do these things, +\q2 and I will not forsake them. +\b +\q1 +\v 17 “Those who trust in engraved images, +\q2 who tell molten images, +\q2 ‘You are our gods,’ +\q2 will be turned back. +\q2 They will be utterly disappointed. +\b +\q1 +\v 18 “Hear, you deaf, +\q2 and look, you blind, +\q2 that you may see. +\q1 +\v 19 Who is blind, but my servant? +\q2 Or who is as deaf as my messenger whom I send? +\q1 Who is as blind as he who is at peace, +\q2 and as blind as Yahweh’s servant? +\q1 +\v 20 You see many things, but don’t observe. +\q2 His ears are open, but he doesn’t listen. +\q1 +\v 21 It pleased Yahweh, for his righteousness’ sake, to magnify the law +\q2 and make it honorable. +\q1 +\v 22 But this is a robbed and plundered people. +\q2 All of them are snared in holes, +\q2 and they are hidden in prisons. +\q1 They have become captives, and no one delivers, +\q2 and a plunder, and no one says, ‘Restore them!’ +\b +\q1 +\v 23 Who is there among you who will give ear to this? +\q2 Who will listen and hear for the time to come? +\q1 +\v 24 Who gave Jacob as plunder, +\q2 and Israel to the robbers? +\q2 Didn’t Yahweh, he against whom we have sinned? +\q2 For they would not walk in his ways, +\q2 and they disobeyed his law. +\q1 +\v 25 Therefore he poured the fierceness of his anger on him, +\q2 and the strength of battle. +\q1 It set him on fire all around, but he didn’t know. +\q2 It burned him, but he didn’t take it to heart.” +\c 43 +\q1 +\v 1 But now Yahweh who created you, Jacob, +\q2 and he who formed you, Israel, says: +\q1 “Don’t be afraid, for I have redeemed you. +\q2 I have called you by your name. +\q2 You are mine. +\q1 +\v 2 When you pass through the waters, I will be with you, +\q2 and through the rivers, they will not overflow you. +\q1 When you walk through the fire, you will not be burned, +\q2 and flame will not scorch you. +\q1 +\v 3 For I am Yahweh your God, +\q2 the Holy One of Israel, +\q2 your Savior. +\q1 I have given Egypt as your ransom, +\q2 Ethiopia and Seba in your place. +\q1 +\v 4 Since you have been precious and honored in my sight, +\q2 and I have loved you, +\q2 therefore I will give people in your place, +\q2 and nations instead of your life. +\q1 +\v 5 Don’t be afraid, for I am with you. +\q2 I will bring your offspring from the east, +\q2 and gather you from the west. +\q1 +\v 6 I will tell the north, ‘Give them up!’ +\q2 and tell the south, ‘Don’t hold them back! +\q2 Bring my sons from far away, +\q2 and my daughters from the ends of the earth— +\q1 +\v 7 everyone who is called by my name, +\q2 and whom I have created for my glory, +\q2 whom I have formed, +\q2 yes, whom I have made.’” +\b +\q1 +\v 8 Bring out the blind people who have eyes, +\q2 and the deaf who have ears. +\q1 +\v 9 Let all the nations be gathered together, +\q2 and let the peoples be assembled. +\q1 Who among them can declare this, +\q2 and show us former things? +\q1 Let them bring their witnesses, that they may be justified, +\q2 or let them hear, and say, “That is true.” +\b +\q1 +\v 10 “You are my witnesses,” says Yahweh, +\q2 “With my servant whom I have chosen; +\q2 that you may know and believe me, +\q2 and understand that I am he. +\q1 Before me there was no God formed, +\q2 neither will there be after me. +\q1 +\v 11 I myself am Yahweh. +\q2 Besides me, there is no savior. +\q1 +\v 12 I have declared, I have saved, and I have shown, +\q2 and there was no strange god among you. +\q1 Therefore you are my witnesses”, +\q2 says Yahweh, “and I am God. +\q1 +\v 13 Yes, since the day was, I am he. +\q2 There is no one who can deliver out of my hand. +\q2 I will work, and who can hinder it?” +\p +\v 14 Yahweh, your Redeemer, the Holy One of Israel says: “For your sake, I have sent to Babylon, and I will bring all of them down as fugitives, even the Chaldeans, in the ships of their rejoicing. +\v 15 I am Yahweh, your Holy One, the Creator of Israel, your King.” +\p +\v 16 Yahweh, who makes a way in the sea, +\q2 and a path in the mighty waters, +\q1 +\v 17 who brings out the chariot and horse, +\q2 the army and the mighty man +\q2 (they lie down together, they shall not rise; +\q2 they are extinct, they are quenched like a wick) says: +\q1 +\v 18 “Don’t remember the former things, +\q2 and don’t consider the things of old. +\q1 +\v 19 Behold, I will do a new thing. +\q2 It springs out now. +\q2 Don’t you know it? +\q1 I will even make a way in the wilderness, +\q2 and rivers in the desert. +\q1 +\v 20 The animals of the field, the jackals and the ostriches, shall honor me, +\q2 because I give water in the wilderness and rivers in the desert, +\q2 to give drink to my people, my chosen, +\q2 +\v 21 the people which I formed for myself, +\q2 that they might declare my praise. +\b +\q1 +\v 22 Yet you have not called on me, Jacob; +\q2 but you have been weary of me, Israel. +\q1 +\v 23 You have not brought me any of your sheep for burnt offerings, +\q2 neither have you honored me with your sacrifices. +\q1 I have not burdened you with offerings, +\q2 nor wearied you with frankincense. +\q1 +\v 24 You have bought me no sweet cane with money, +\q2 nor have you filled me with the fat of your sacrifices, +\q1 but you have burdened me with your sins. +\q2 You have wearied me with your iniquities. +\b +\q1 +\v 25 I, even I, am he who blots out your transgressions for my own sake; +\q2 and I will not remember your sins. +\q1 +\v 26 Put me in remembrance. +\q2 Let us plead together. +\q1 Declare your case, +\q2 that you may be justified. +\q1 +\v 27 Your first father sinned, +\q2 and your teachers have transgressed against me. +\q1 +\v 28 Therefore I will profane the princes of the sanctuary; +\q2 and I will make Jacob a curse, +\q2 and Israel an insult.” +\c 44 +\q1 +\v 1 Yet listen now, Jacob my servant, +\q2 and Israel, whom I have chosen. +\q1 +\v 2 This is what Yahweh who made you, +\q2 and formed you from the womb, +\q2 who will help you says: +\q1 “Don’t be afraid, Jacob my servant; +\q2 and you, Jeshurun, whom I have chosen. +\q1 +\v 3 For I will pour water on him who is thirsty, +\q2 and streams on the dry ground. +\q1 I will pour my Spirit on your descendants, +\q2 and my blessing on your offspring; +\q1 +\v 4 and they will spring up among the grass, +\q2 as willows by the watercourses. +\q1 +\v 5 One will say, ‘I am Yahweh’s.’ +\q2 Another will be called by the name of Jacob; +\q2 and another will write with his hand ‘to Yahweh,’ +\q2 and honor the name of Israel.” +\b +\q1 +\v 6 This is what Yahweh, the King of Israel, +\q2 and his Redeemer, Yahweh of Armies, says: +\q1 “I am the first, and I am the last; +\q2 and besides me there is no God. +\q1 +\v 7 Who is like me? +\q2 Who will call, +\q2 and will declare it, +\q2 and set it in order for me, +\q2 since I established the ancient people? +\q1 Let them declare the things that are coming, +\q2 and that will happen. +\q1 +\v 8 Don’t fear, +\q2 neither be afraid. +\q1 Haven’t I declared it to you long ago, +\q2 and shown it? +\q1 You are my witnesses. +\q2 Is there a God besides me? +\q1 Indeed, there is not. +\q2 I don’t know any other Rock.” +\b +\q1 +\v 9 Everyone who makes a carved image is vain. +\q2 The things that they delight in will not profit. +\q2 Their own witnesses don’t see, nor know, that they may be disappointed. +\q1 +\v 10 Who has fashioned a god, +\q2 or molds an image that is profitable for nothing? +\q1 +\v 11 Behold, all his fellows will be disappointed; +\q2 and the workmen are mere men. +\q1 Let them all be gathered together. +\q2 Let them stand up. +\q2 They will fear. +\q2 They will be put to shame together. +\b +\q1 +\v 12 The blacksmith takes an ax, +\q2 works in the coals, +\q2 fashions it with hammers, +\q2 and works it with his strong arm. +\q1 He is hungry, +\q2 and his strength fails; +\q1 he drinks no water, +\q2 and is faint. +\q1 +\v 13 The carpenter stretches out a line. +\q2 He marks it out with a pencil. +\q2 He shapes it with planes. +\q2 He marks it out with compasses, +\q2 and shapes it like the figure of a man, +\q2 with the beauty of a man, +\q2 to reside in a house. +\q1 +\v 14 He cuts down cedars for himself, +\q2 and takes the cypress and the oak, +\q2 and strengthens for himself one among the trees of the forest. +\q1 He plants a cypress tree, +\q2 and the rain nourishes it. +\q1 +\v 15 Then it will be for a man to burn; +\q2 and he takes some of it and warms himself. +\q2 Yes, he burns it and bakes bread. +\q1 Yes, he makes a god and worships it; +\q2 he makes it a carved image, and falls down to it. +\q1 +\v 16 He burns part of it in the fire. +\q2 With part of it, he eats meat. +\q2 He roasts a roast and is satisfied. +\q1 Yes, he warms himself +\q2 and says, “Aha! I am warm. I have seen the fire.” +\q1 +\v 17 The rest of it he makes into a god, +\q2 even his engraved image. +\q1 He bows down to it and worships, +\q2 and prays to it, and says, “Deliver me, for you are my god!” +\b +\q1 +\v 18 They don’t know, neither do they consider, +\q2 for he has shut their eyes, that they can’t see, +\q2 and their hearts, that they can’t understand. +\q1 +\v 19 No one thinks, +\q2 neither is there knowledge nor understanding to say, +\q2 “I have burned part of it in the fire. +\q2 Yes, I have also baked bread on its coals. +\q2 I have roasted meat and eaten it. +\q2 Shall I make the rest of it into an abomination? +\q2 Shall I bow down to a tree trunk?” +\q1 +\v 20 He feeds on ashes. +\q2 A deceived heart has turned him aside; +\q2 and he can’t deliver his soul, +\q2 nor say, “Isn’t there a lie in my right hand?” +\b +\q1 +\v 21 Remember these things, Jacob and Israel, +\q2 for you are my servant. +\q2 I have formed you. +\q2 You are my servant. +\q2 Israel, you will not be forgotten by me. +\q1 +\v 22 I have blotted out, as a thick cloud, your transgressions, +\q2 and, as a cloud, your sins. +\q2 Return to me, for I have redeemed you. +\b +\q1 +\v 23 Sing, you heavens, for Yahweh has done it! +\q2 Shout, you lower parts of the earth! +\q2 Break out into singing, you mountains, O forest, all of your trees, +\q2 for Yahweh has redeemed Jacob, +\q2 and will glorify himself in Israel. +\b +\q1 +\v 24 Yahweh, your Redeemer, +\q2 and he who formed you from the womb says: +\q1 “I am Yahweh, who makes all things; +\q2 who alone stretches out the heavens; +\q2 who spreads out the earth by myself; +\q1 +\v 25 who frustrates the signs of the liars, +\q2 and makes diviners mad; +\q1 who turns wise men backward, +\q2 and makes their knowledge foolish; +\q1 +\v 26 who confirms the word of his servant, +\q2 and performs the counsel of his messengers; +\q1 who says of Jerusalem, ‘She will be inhabited;’ +\q2 and of the cities of Judah, ‘They will be built,’ +\q2 and ‘I will raise up its waste places;’ +\q1 +\v 27 who says to the deep, ‘Be dry,’ +\q2 and ‘I will dry up your rivers,’ +\q1 +\v 28 who says of Cyrus, ‘He is my shepherd, and shall perform all my pleasure,’ +\q2 even saying of Jerusalem, ‘She will be built;’ +\q2 and of the temple, ‘Your foundation will be laid.’” +\c 45 +\p +\v 1 Yahweh says to his anointed, to Cyrus, whose right hand I have held to subdue nations before him and strip kings of their armor, to open the doors before him, and the gates shall not be shut: +\q1 +\v 2 “I will go before you +\q2 and make the rough places smooth. +\q1 I will break the doors of bronze in pieces +\q2 and cut apart the bars of iron. +\q1 +\v 3 I will give you the treasures of darkness +\q2 and hidden riches of secret places, +\q1 that you may know that it is I, Yahweh, who calls you by your name, +\q2 even the God of Israel. +\q1 +\v 4 For Jacob my servant’s sake, +\q2 and Israel my chosen, +\q1 I have called you by your name. +\q2 I have given you a title, +\q2 though you have not known me. +\q1 +\v 5 I am Yahweh, and there is no one else. +\q2 Besides me, there is no God. +\q1 I will strengthen\f + \fr 45:5 \ft or, equip\f* you, +\q2 though you have not known me, +\q1 +\v 6 that they may know from the rising of the sun, +\q2 and from the west, +\q1 that there is no one besides me. +\q2 I am Yahweh, and there is no one else. +\q1 +\v 7 I form the light +\q2 and create darkness. +\q1 I make peace +\q2 and create calamity. +\q1 I am Yahweh, +\q2 who does all these things. +\b +\q1 +\v 8 Rain, you heavens, from above, +\q2 and let the skies pour down righteousness. +\q1 Let the earth open, that it may produce salvation, +\q2 and let it cause righteousness to spring up with it. +\q1 I, Yahweh, have created it. +\b +\q1 +\v 9 Woe to him who strives with his Maker— +\q2 a clay pot among the clay pots of the earth! +\q1 Shall the clay ask him who fashions it, ‘What are you making?’ +\q2 or your work, ‘He has no hands?’ +\q1 +\v 10 Woe to him who says to a father, ‘What have you become the father of?’ +\q2 or to a mother, ‘What have you given birth to?’” +\b +\q1 +\v 11 Yahweh, the Holy One of Israel +\q2 and his Maker says: +\q1 “You ask me about the things that are to come, concerning my sons, +\q2 and you command me concerning the work of my hands! +\q1 +\v 12 I have made the earth, and created man on it. +\q2 I, even my hands, have stretched out the heavens. +\q2 I have commanded all their army. +\q1 +\v 13 I have raised him up in righteousness, +\q2 and I will make all his ways straight. +\q1 He shall build my city, +\q2 and he shall let my exiles go free, +\q2 not for price nor reward,” says Yahweh of Armies. +\b +\q1 +\v 14 Yahweh says: “The labor of Egypt, +\q2 and the merchandise of Ethiopia, +\q2 and the Sabeans, men of stature, will come over to you, +\q2 and they will be yours. +\q1 They will go after you. +\q2 They shall come over in chains. +\q2 They will bow down to you. +\q1 They will make supplication to you: +\q2 ‘Surely God is in you; and there is no one else. +\q2 There is no other god. +\q1 +\v 15 Most certainly you are a God who has hidden yourself, +\q2 God of Israel, the Savior.’” +\q1 +\v 16 They will be disappointed, +\q2 yes, confounded, all of them. +\q2 Those who are makers of idols will go into confusion together. +\q1 +\v 17 Israel will be saved by Yahweh with an everlasting salvation. +\q2 You will not be disappointed nor confounded to ages everlasting. +\b +\q1 +\v 18 For Yahweh who created the heavens, +\q2 the God who formed the earth and made it, +\q2 who established it and didn’t create it a waste, +\q2 who formed it to be inhabited says: +\q1 “I am Yahweh. +\q2 There is no other. +\q1 +\v 19 I have not spoken in secret, +\q2 in a place of the land of darkness. +\q1 I didn’t say to the offspring of Jacob, ‘Seek me in vain.’ +\q2 I, Yahweh, speak righteousness. +\q2 I declare things that are right. +\b +\q1 +\v 20 “Assemble yourselves and come. +\q2 Draw near together, you who have escaped from the nations. +\q1 Those have no knowledge who carry the wood of their engraved image, +\q2 and pray to a god that can’t save. +\q1 +\v 21 Declare and present it. +\q2 Yes, let them take counsel together. +\q1 Who has shown this from ancient time? +\q2 Who has declared it of old? +\q2 Haven’t I, Yahweh? +\q1 There is no other God besides me, a just God and a Savior. +\q2 There is no one besides me. +\b +\q1 +\v 22 “Look to me, and be saved, all the ends of the earth; +\q2 for I am God, and there is no other. +\q1 +\v 23 I have sworn by myself. +\q2 The word has gone out of my mouth in righteousness, and will not be revoked, +\q1 that to me every knee shall bow, +\q2 every tongue shall take an oath. +\q1 +\v 24 They will say of me, +\q2 ‘There is righteousness and strength only in Yahweh.’” +\q1 Even to him will men come. +\q2 All those who raged against him will be disappointed. +\q1 +\v 25 All the offspring of Israel will be justified in Yahweh, +\q2 and will rejoice! +\c 46 +\q1 +\v 1 Bel bows down. +\q2 Nebo stoops. +\q1 Their idols are carried by animals, +\q2 and on the livestock. +\q1 The things that you carried around are heavy loads, +\q2 a burden for the weary. +\q1 +\v 2 They stoop and they bow down together. +\q2 They could not deliver the burden, +\q2 but they have gone into captivity. +\b +\q1 +\v 3 “Listen to me, house of Jacob, +\q2 and all the remnant of the house of Israel, +\q2 that have been carried from their birth, +\q2 that have been carried from the womb. +\q1 +\v 4 Even to old age I am he, +\q2 and even to gray hairs I will carry you. +\q1 I have made, and I will bear. +\q2 Yes, I will carry, and will deliver. +\b +\q1 +\v 5 “To whom will you compare me, and consider my equal, +\q2 and compare me, as if we were the same? +\q1 +\v 6 Some pour out gold from the bag, +\q2 and weigh silver in the balance. +\q1 They hire a goldsmith, +\q2 and he makes it a god. +\q1 They fall down— +\q2 yes, they worship. +\q1 +\v 7 They bear it on their shoulder. +\q2 They carry it, and set it in its place, and it stands there. +\q2 It cannot move from its place. +\q1 Yes, one may cry to it, yet it can not answer. +\q2 It cannot save him out of his trouble. +\b +\q1 +\v 8 “Remember this, and show yourselves men. +\q2 Bring it to mind again, you transgressors. +\q1 +\v 9 Remember the former things of old; +\q2 for I am God, and there is no other. +\q2 I am God, and there is none like me. +\q1 +\v 10 I declare the end from the beginning, +\q2 and from ancient times things that are not yet done. +\q1 I say: My counsel will stand, +\q2 and I will do all that I please. +\q1 +\v 11 I call a ravenous bird from the east, +\q2 the man of my counsel from a far country. +\q1 Yes, I have spoken. +\q2 I will also bring it to pass. +\q1 I have planned. +\q2 I will also do it. +\b +\q1 +\v 12 Listen to me, you stubborn-hearted, +\q2 who are far from righteousness! +\q1 +\v 13 I bring my righteousness near. +\q2 It is not far off, +\q2 and my salvation will not wait. +\q1 I will grant salvation to Zion, +\q2 my glory to Israel. +\b +\c 47 +\p +\v 1 “Come down and sit in the dust, virgin daughter of Babylon. +\q2 Sit on the ground without a throne, daughter of the Chaldeans. +\q2 For you will no longer be called tender and delicate. +\q1 +\v 2 Take the millstones and grind flour. +\q2 Remove your veil, lift up your skirt, uncover your legs, +\q2 and wade through the rivers. +\q1 +\v 3 Your nakedness will be uncovered. +\q2 Yes, your shame will be seen. +\q1 I will take vengeance, +\q2 and will spare no one.” +\b +\q1 +\v 4 Our Redeemer, Yahweh of Armies is his name, +\q2 is the Holy One of Israel. +\b +\q1 +\v 5 “Sit in silence, and go into darkness, +\q2 daughter of the Chaldeans. +\q1 For you shall no longer be called +\q2 the mistress of kingdoms. +\q1 +\v 6 I was angry with my people. +\q2 I profaned my inheritance +\q2 and gave them into your hand. +\q1 You showed them no mercy. +\q2 You laid a very heavy yoke on the aged. +\q1 +\v 7 You said, ‘I will be a princess forever,’ +\q2 so that you didn’t lay these things to your heart, +\q2 nor did you remember the results. +\b +\q1 +\v 8 “Now therefore hear this, you who are given to pleasures, +\q2 who sit securely, +\q1 who say in your heart, +\q2 ‘I am, and there is no one else besides me. +\q1 I won’t sit as a widow, +\q2 neither will I know the loss of children.’ +\q1 +\v 9 But these two things will come to you in a moment in one day: +\q2 the loss of children and widowhood. +\q1 They will come on you in their full measure, +\q2 in the multitude of your sorceries, +\q2 and the great abundance of your enchantments. +\q1 +\v 10 For you have trusted in your wickedness. +\q2 You have said, ‘No one sees me.’ +\q1 Your wisdom and your knowledge has perverted you. +\q2 You have said in your heart, ‘I am, and there is no one else besides me.’ +\q1 +\v 11 Therefore disaster will come on you. +\q2 You won’t know when it dawns. +\q1 Mischief will fall on you. +\q2 You won’t be able to put it away. +\q1 Desolation will come on you suddenly, +\q2 which you don’t understand. +\b +\q1 +\v 12 “Stand now with your enchantments +\q2 and with the multitude of your sorceries, +\q2 in which you have labored from your youth, +\q1 as if you might profit, +\q2 as if you might prevail. +\q1 +\v 13 You are wearied in the multitude of your counsels. +\q2 Now let the astrologers, the stargazers, and the monthly prognosticators stand up and save you from the things that will happen to you. +\q1 +\v 14 Behold, they are like stubble. +\q2 The fire will burn them. +\q2 They won’t deliver themselves from the power of the flame. +\q1 It won’t be a coal to warm at +\q2 or a fire to sit by. +\q1 +\v 15 The things that you labored in will be like this: +\q2 those who have trafficked with you from your youth will each wander in his own way. +\q2 There will be no one to save you. +\b +\c 48 +\q1 +\v 1 “Hear this, house of Jacob, +\q2 you who are called by the name of Israel, +\q2 and have come out of the waters of Judah. +\q1 You swear by Yahweh’s name, +\q2 and make mention of the God of Israel, +\q2 but not in truth, nor in righteousness— +\q1 +\v 2 for they call themselves citizens of the holy city, +\q2 and rely on the God of Israel; +\q2 Yahweh of Armies is his name. +\q1 +\v 3 I have declared the former things from of old. +\q2 Yes, they went out of my mouth, and I revealed them. +\q2 I did them suddenly, and they happened. +\q1 +\v 4 Because I knew that you are obstinate, +\q2 and your neck is an iron sinew, +\q2 and your brow bronze; +\q1 +\v 5 therefore I have declared it to you from of old; +\q2 before it came to pass I showed it to you; +\q2 lest you should say, ‘My idol has done them. +\q2 My engraved image and my molten image has commanded them.’ +\q1 +\v 6 You have heard it. +\q2 Now see all this. +\q2 And you, won’t you declare it? +\b +\q1 “I have shown you new things from this time, +\q2 even hidden things, which you have not known. +\q1 +\v 7 They are created now, and not from of old. +\q2 Before today, you didn’t hear them, +\q2 lest you should say, ‘Behold, I knew them.’ +\q1 +\v 8 Yes, you didn’t hear. +\q2 Yes, you didn’t know. +\q2 Yes, from of old your ear was not opened, +\q1 for I knew that you dealt very treacherously, +\q2 and were called a transgressor from the womb. +\q1 +\v 9 For my name’s sake, I will defer my anger, +\q2 and for my praise, I hold it back for you +\q2 so that I don’t cut you off. +\q1 +\v 10 Behold, I have refined you, +\q2 but not as silver. +\q2 I have chosen you in the furnace of affliction. +\q1 +\v 11 For my own sake, +\q2 for my own sake, I will do it; +\q1 for how would my name be profaned? +\q2 I will not give my glory to another. +\b +\q1 +\v 12 “Listen to me, O Jacob, +\q2 and Israel my called: +\q1 I am he. +\q2 I am the first. +\q2 I am also the last. +\q1 +\v 13 Yes, my hand has laid the foundation of the earth, +\q2 and my right hand has spread out the heavens. +\q2 when I call to them, they stand up together. +\b +\q1 +\v 14 “Assemble yourselves, all of you, and hear! +\q2 Who among them has declared these things? +\q1 He whom Yahweh loves will do what he likes to Babylon, +\q2 and his arm will be against the Chaldeans. +\q1 +\v 15 I, even I, have spoken. +\q2 Yes, I have called him. +\q1 I have brought him +\q2 and he shall make his way prosperous. +\p +\v 16 “Come near to me and hear this: +\b +\q1 “From the beginning I have not spoken in secret; +\q2 from the time that it happened, I was there.” +\b +\q1 Now the Lord Yahweh has sent me +\q2 with his Spirit. +\b +\q1 +\v 17 Yahweh, +\q2 your Redeemer, +\q2 the Holy One of Israel, says: +\q1 “I am Yahweh your God, +\q2 who teaches you to profit, +\q2 who leads you by the way that you should go. +\q1 +\v 18 Oh that you had listened to my commandments! +\q2 Then your peace would have been like a river +\q2 and your righteousness like the waves of the sea. +\q1 +\v 19 Your offspring also would have been as the sand +\q2 and the descendants of your body like its grains. +\q2 His name would not be cut off nor destroyed from before me.” +\b +\q1 +\v 20 Leave Babylon! +\q2 Flee from the Chaldeans! +\q1 With a voice of singing announce this, +\q2 tell it even to the end of the earth; +\q2 say, “Yahweh has redeemed his servant Jacob!” +\q1 +\v 21 They didn’t thirst when he led them through the deserts. +\q2 He caused the waters to flow out of the rock for them. +\q2 He also split the rock and the waters gushed out. +\b +\q1 +\v 22 “There is no peace”, says Yahweh, “for the wicked.” +\c 49 +\q1 +\v 1 Listen, islands, to me. +\q2 Listen, you peoples, from afar: +\q1 Yahweh has called me from the womb; +\q2 from the inside of my mother, he has mentioned my name. +\q1 +\v 2 He has made my mouth like a sharp sword. +\q2 He has hidden me in the shadow of his hand. +\q1 He has made me a polished shaft. +\q2 He has kept me close in his quiver. +\q1 +\v 3 He said to me, “You are my servant, +\q2 Israel, in whom I will be glorified.” +\q1 +\v 4 But I said, “I have labored in vain. +\q2 I have spent my strength in vain for nothing; +\q1 yet surely the justice due to me is with Yahweh, +\q2 and my reward with my God.” +\b +\q1 +\v 5 Now Yahweh, he who formed me from the womb to be his servant, +\q2 says to bring Jacob again to him, +\q2 and to gather Israel to him, +\q2 for I am honorable in Yahweh’s eyes, +\q2 and my God has become my strength. +\q1 +\v 6 Indeed, he says, “It is too light a thing that you should be my servant to raise up the tribes of Jacob, +\q2 and to restore the preserved of Israel. +\q1 I will also give you as a light to the nations, +\q2 that you may be my salvation to the end of the earth.” +\q1 +\v 7 Yahweh, the Redeemer of Israel, and his Holy One, +\q2 says to him whom man despises, to him whom the nation abhors, to a servant of rulers: +\q1 “Kings shall see and rise up, +\q2 princes, and they shall worship, +\q2 because of Yahweh who is faithful, even the Holy One of Israel, who has chosen you.” +\b +\q1 +\v 8 Yahweh says, “I have answered you in an acceptable time. +\q2 I have helped you in a day of salvation. +\q1 I will preserve you and give you for a covenant of the people, +\q2 to raise up the land, to make them inherit the desolate heritage, +\q1 +\v 9 saying to those who are bound, ‘Come out!’; +\q2 to those who are in darkness, ‘Show yourselves!’ +\q1 “They shall feed along the paths, +\q2 and their pasture shall be on all treeless heights. +\q1 +\v 10 They shall not hunger nor thirst; +\q2 neither shall the heat nor sun strike them, +\q2 for he who has mercy on them will lead them. +\q2 He will guide them by springs of water. +\q1 +\v 11 I will make all my mountains a road, +\q2 and my highways shall be exalted. +\q1 +\v 12 Behold, these shall come from afar, +\q2 and behold, these from the north and from the west, +\q2 and these from the land of Sinim.” +\q1 +\v 13 Sing, heavens, and be joyful, earth! +\q2 Break out into singing, mountains! +\q1 For Yahweh has comforted his people, +\q2 and will have compassion on his afflicted. +\b +\q1 +\v 14 But Zion said, “Yahweh has forsaken me, +\q2 and the Lord has forgotten me.” +\q1 +\v 15 “Can a woman forget her nursing child, +\q2 that she should not have compassion on the son of her womb? +\q1 Yes, these may forget, +\q2 yet I will not forget you! +\q1 +\v 16 Behold, I have engraved you on the palms of my hands. +\q2 Your walls are continually before me. +\q1 +\v 17 Your children hurry. +\q2 Your destroyers and those who devastated you will leave you. +\q1 +\v 18 Lift up your eyes all around, and see: +\q2 all these gather themselves together, and come to you. +\q1 As I live,” says Yahweh, “you shall surely clothe yourself with them all as with an ornament, +\q2 and dress yourself with them, like a bride. +\q1 +\v 19 “For, as for your waste and your desolate places, +\q2 and your land that has been destroyed, +\q1 surely now that land will be too small for the inhabitants, +\q2 and those who swallowed you up will be far away. +\q1 +\v 20 The children of your bereavement will say in your ears, +\q2 ‘This place is too small for me. +\q2 Give me a place to live in.’ +\q1 +\v 21 Then you will say in your heart, ‘Who has conceived these for me, since I have been bereaved of my children +\q2 and am alone, an exile, and wandering back and forth? +\q1 Who has brought these up? +\q2 Behold, I was left alone. Where were these?’” +\b +\q1 +\v 22 The Lord Yahweh says, “Behold, I will lift up my hand to the nations, +\q2 and lift up my banner to the peoples. +\q1 They shall bring your sons in their bosom, +\q2 and your daughters shall be carried on their shoulders. +\q1 +\v 23 Kings shall be your foster fathers, +\q2 and their queens your nursing mothers. +\q1 They will bow down to you with their faces to the earth, +\q2 and lick the dust of your feet. +\q1 Then you will know that I am Yahweh; +\q2 and those who wait for me won’t be disappointed.” +\b +\q1 +\v 24 Shall the plunder be taken from the mighty, +\q2 or the lawful captives be delivered? +\q1 +\v 25 But Yahweh says, “Even the captives of the mighty shall be taken away, +\q2 and the plunder retrieved from the fierce, +\q1 for I will contend with him who contends with you +\q2 and I will save your children. +\q1 +\v 26 I will feed those who oppress you with their own flesh; +\q2 and they will be drunk on their own blood, as with sweet wine. +\q1 Then all flesh shall know that I, Yahweh, am your Savior +\q2 and your Redeemer, the Mighty One of Jacob.” +\c 50 +\q1 +\v 1 Yahweh says, “Where is the bill of your mother’s divorce, with which I have put her away? +\q2 Or to which of my creditors have I sold you? +\q1 Behold, you were sold for your iniquities, +\q2 and your mother was put away for your transgressions. +\q1 +\v 2 Why, when I came, was there no one? +\q2 When I called, why was there no one to answer? +\q1 Is my hand shortened at all, that it can’t redeem? +\q2 Or have I no power to deliver? +\q1 Behold, at my rebuke I dry up the sea. +\q2 I make the rivers a wilderness. +\q2 Their fish stink because there is no water, and die of thirst. +\q1 +\v 3 I clothe the heavens with blackness. +\q2 I make sackcloth their covering.” +\b +\q1 +\v 4 The Lord Yahweh has given me the tongue of those who are taught, +\q2 that I may know how to sustain with words him who is weary. +\q1 He awakens morning by morning, +\q2 he awakens my ear to hear as those who are taught. +\q1 +\v 5 The Lord Yahweh has opened my ear. +\q2 I was not rebellious. +\q2 I have not turned back. +\q1 +\v 6 I gave my back to those who beat me, +\q2 and my cheeks to those who plucked off the hair. +\q2 I didn’t hide my face from shame and spitting. +\q1 +\v 7 For the Lord Yahweh will help me. +\q2 Therefore I have not been confounded. +\q1 Therefore I have set my face like a flint, +\q2 and I know that I won’t be disappointed. +\q1 +\v 8 He who justifies me is near. +\q2 Who will bring charges against me? +\q1 Let us stand up together. +\q2 Who is my adversary? +\q2 Let him come near to me. +\q1 +\v 9 Behold, the Lord Yahweh will help me! +\q2 Who is he who will condemn me? +\q1 Behold, they will all grow old like a garment. +\q2 The moths will eat them up. +\b +\q1 +\v 10 Who among you fears Yahweh +\q2 and obeys the voice of his servant? +\q1 He who walks in darkness +\q2 and has no light, +\q1 let him trust in Yahweh’s name, +\q2 and rely on his God. +\q1 +\v 11 Behold, all you who kindle a fire, +\q2 who adorn yourselves with torches around yourselves, +\q1 walk in the flame of your fire, +\q2 and among the torches that you have kindled. +\q1 You will have this from my hand: +\q2 you will lie down in sorrow. +\c 51 +\q1 +\v 1 “Listen to me, you who follow after righteousness, +\q2 you who seek Yahweh. +\q1 Look to the rock you were cut from, +\q2 and to the quarry you were dug from. +\q1 +\v 2 Look to Abraham your father, +\q2 and to Sarah who bore you; +\q1 for when he was but one I called him, +\q2 I blessed him, +\q2 and made him many. +\q1 +\v 3 For Yahweh has comforted Zion. +\q2 He has comforted all her waste places, +\q2 and has made her wilderness like Eden, +\q2 and her desert like the garden of Yahweh. +\q1 Joy and gladness will be found in them, +\q2 thanksgiving, and the voice of melody. +\b +\q1 +\v 4 “Listen to me, my people; +\q2 and hear me, my nation, +\q1 for a law will go out from me, +\q2 and I will establish my justice for a light to the peoples. +\q1 +\v 5 My righteousness is near. +\q2 My salvation has gone out, +\q2 and my arms will judge the peoples. +\q1 The islands will wait for me, +\q2 and they will trust my arm. +\q1 +\v 6 Lift up your eyes to the heavens, +\q2 and look at the earth beneath; +\q1 for the heavens will vanish away like smoke, +\q2 and the earth will wear out like a garment. +\q1 Its inhabitants will die in the same way, +\q2 but my salvation will be forever, +\q2 and my righteousness will not be abolished. +\b +\q1 +\v 7 “Listen to me, you who know righteousness, +\q2 the people in whose heart is my law. +\q1 Don’t fear the reproach of men, +\q2 and don’t be dismayed at their insults. +\q1 +\v 8 For the moth will eat them up like a garment, +\q2 and the worm will eat them like wool; +\q1 but my righteousness will be forever, +\q2 and my salvation to all generations.” +\b +\q1 +\v 9 Awake, awake, put on strength, arm of Yahweh! +\q2 Awake, as in the days of old, +\q2 the generations of ancient times. +\q1 Isn’t it you who cut Rahab in pieces, +\q2 who pierced the monster? +\q1 +\v 10 Isn’t it you who dried up the sea, +\q2 the waters of the great deep; +\q2 who made the depths of the sea a way for the redeemed to pass over? +\q1 +\v 11 Those ransomed by Yahweh will return, +\q2 and come with singing to Zion. +\q2 Everlasting joy shall be on their heads. +\q1 They will obtain gladness and joy. +\q2 Sorrow and sighing shall flee away. +\b +\q1 +\v 12 “I, even I, am he who comforts you. +\q2 Who are you, that you are afraid of man who shall die, +\q2 and of the son of man who will be made as grass? +\q1 +\v 13 Have you forgotten Yahweh your Maker, +\q2 who stretched out the heavens, +\q2 and laid the foundations of the earth? +\q1 Do you live in fear continually all day because of the fury of the oppressor, +\q2 when he prepares to destroy? +\q2 Where is the fury of the oppressor? +\q1 +\v 14 The captive exile will speedily be freed. +\q2 He will not die and go down into the pit. +\q2 His bread won’t fail. +\q1 +\v 15 For I am Yahweh your God, who stirs up the sea +\q2 so that its waves roar. +\q2 Yahweh of Armies is his name. +\q1 +\v 16 I have put my words in your mouth +\q2 and have covered you in the shadow of my hand, +\q1 that I may plant the heavens, +\q2 and lay the foundations of the earth, +\q2 and tell Zion, ‘You are my people.’” +\b +\q1 +\v 17 Awake, awake! +\q2 Stand up, Jerusalem, +\q2 you who have drunk from Yahweh’s hand the cup of his wrath. +\q1 You have drunken the bowl of the cup of staggering, +\q2 and drained it. +\q1 +\v 18 There is no one to guide her among all the sons to whom she has given birth; +\q2 and there is no one who takes her by the hand among all the sons whom she has brought up. +\q1 +\v 19 These two things have happened to you— +\q2 who will grieve with you?— +\q1 desolation and destruction, +\q2 and famine and the sword. +\q2 How can I comfort you? +\q1 +\v 20 Your sons have fainted. +\q2 They lie at the head of all the streets, +\q2 like an antelope in a net. +\q1 They are full of Yahweh’s wrath, +\q2 the rebuke of your God. +\b +\q1 +\v 21 Therefore now hear this, you afflicted, +\q2 and drunken, but not with wine: +\q1 +\v 22 Your Lord Yahweh, +\q2 your God who pleads the cause of his people, says, +\q1 “Behold, I have taken out of your hand the cup of staggering, +\q2 even the bowl of the cup of my wrath. +\q2 You will not drink it any more. +\q1 +\v 23 I will put it into the hand of those who afflict you, +\q2 who have said to your soul, ‘Bow down, that we may walk over you;’ +\q2 and you have laid your back as the ground, +\q2 like a street to those who walk over.” +\c 52 +\q1 +\v 1 Awake, awake! Put on your strength, Zion. +\q2 Put on your beautiful garments, Jerusalem, the holy city, +\q2 for from now on the uncircumcised and the unclean will no more come into you. +\q1 +\v 2 Shake yourself from the dust! +\q2 Arise, sit up, Jerusalem! +\q2 Release yourself from the bonds of your neck, captive daughter of Zion! +\b +\q1 +\v 3 For Yahweh says, “You were sold for nothing; +\q2 and you will be redeemed without money.” +\b +\p +\v 4 For the Lord Yahweh says: +\q1 “My people went down at the first into Egypt to live there; +\q2 and the Assyrian has oppressed them without cause. +\b +\q1 +\v 5 “Now therefore, what do I do here,” says Yahweh, +\q2 “seeing that my people are taken away for nothing? +\q1 Those who rule over them mock,” says Yahweh, +\q2 “and my name is blasphemed continually all day long. +\q1 +\v 6 Therefore my people shall know my name. +\q2 Therefore they shall know in that day that I am he who speaks. +\q2 Behold, it is I.” +\b +\q1 +\v 7 How beautiful on the mountains are the feet of him who brings good news, +\q2 who publishes peace, +\q2 who brings good news, +\q2 who proclaims salvation, +\q2 who says to Zion, “Your God reigns!” +\q1 +\v 8 Your watchmen lift up their voice. +\q2 Together they sing; +\q2 for they shall see eye to eye when Yahweh returns to Zion. +\q1 +\v 9 Break out into joy! +\q2 Sing together, you waste places of Jerusalem; +\q2 for Yahweh has comforted his people. +\q2 He has redeemed Jerusalem. +\q1 +\v 10 Yahweh has made his holy arm bare in the eyes of all the nations. +\q2 All the ends of the earth have seen the salvation of our God. +\b +\q1 +\v 11 Depart! Depart! Go out from there! Touch no unclean thing! +\q2 Go out from among her! +\q2 Cleanse yourselves, you who carry Yahweh’s vessels. +\q1 +\v 12 For you shall not go out in haste, +\q2 neither shall you go by flight; +\q1 for Yahweh will go before you, +\q2 and the God of Israel will be your rear guard. +\b +\q1 +\v 13 Behold, my servant will deal wisely. +\q2 He will be exalted and lifted up, +\q2 and will be very high. +\q1 +\v 14 Just as many were astonished at you— +\q2 his appearance was marred more than any man, and his form more than the sons of men— +\q1 +\v 15 so he will cleanse\f + \fr 52:15 \ft or, sprinkle\f* many nations. +\q2 Kings will shut their mouths at him; +\q2 for they will see that which had not been told them, +\q2 and they will understand that which they had not heard. +\c 53 +\q1 +\v 1 Who has believed our message? +\q2 To whom has Yahweh’s arm been revealed? +\q1 +\v 2 For he grew up before him as a tender plant, +\q2 and as a root out of dry ground. +\q1 He has no good looks or majesty. +\q2 When we see him, there is no beauty that we should desire him. +\q1 +\v 3 He was despised +\q2 and rejected by men, +\q1 a man of suffering +\q2 and acquainted with disease. +\q1 He was despised as one from whom men hide their face; +\q2 and we didn’t respect him. +\b +\q1 +\v 4 Surely he has borne our sickness +\q2 and carried our suffering; +\q1 yet we considered him plagued, +\q2 struck by God, and afflicted. +\q1 +\v 5 But he was pierced for our transgressions. +\q2 He was crushed for our iniquities. +\q1 The punishment that brought our peace was on him; +\q2 and by his wounds we are healed. +\q1 +\v 6 All we like sheep have gone astray. +\q2 Everyone has turned to his own way; +\q2 and Yahweh has laid on him the iniquity of us all. +\b +\q1 +\v 7 He was oppressed, +\q2 yet when he was afflicted he didn’t open his mouth. +\q1 As a lamb that is led to the slaughter, +\q2 and as a sheep that before its shearers is silent, +\q2 so he didn’t open his mouth. +\q1 +\v 8 He was taken away by oppression and judgment. +\q2 As for his generation, +\q2 who considered that he was cut off out of the land of the living +\q2 and stricken for the disobedience of my people? +\q1 +\v 9 They made his grave with the wicked, +\q2 and with a rich man in his death, +\q1 although he had done no violence, +\q2 nor was any deceit in his mouth. +\b +\q1 +\v 10 Yet it pleased Yahweh to bruise him. +\q2 He has caused him to suffer. +\q1 When you make his soul an offering for sin, +\q2 he will see his offspring. +\q1 He will prolong his days +\q2 and Yahweh’s pleasure will prosper in his hand. +\q1 +\v 11 After the suffering of his soul, +\q2 he will see the light\f + \fr 53:11 \ft So read the Dead Sea Scrolls and Septuagint. Masoretic Text omits “the light”.\f* and be satisfied. +\q1 My righteous servant will justify many by the knowledge of himself; +\q2 and he will bear their iniquities. +\q1 +\v 12 Therefore I will give him a portion with the great. +\q2 He will divide the plunder with the strong, +\q1 because he poured out his soul to death +\q2 and was counted with the transgressors; +\q1 yet he bore the sins of many +\q2 and made intercession for the transgressors. +\c 54 +\q1 +\v 1 “Sing, barren, you who didn’t give birth! +\q2 Break out into singing, and cry aloud, you who didn’t travail with child! +\q2 For more are the children of the desolate than the children of the married wife,” says Yahweh. +\q1 +\v 2 “Enlarge the place of your tent, +\q2 and let them stretch out the curtains of your habitations; +\q2 don’t spare; lengthen your cords, and strengthen your stakes. +\q1 +\v 3 For you will spread out on the right hand and on the left; +\q2 and your offspring will possess the nations +\q2 and settle in desolate cities. +\b +\q1 +\v 4 “Don’t be afraid, for you will not be ashamed. +\q2 Don’t be confounded, for you will not be disappointed. +\q1 For you will forget the shame of your youth. +\q2 You will remember the reproach of your widowhood no more. +\q1 +\v 5 For your Maker is your husband; Yahweh of Armies is his name. +\q2 The Holy One of Israel is your Redeemer. +\q2 He will be called the God of the whole earth. +\q1 +\v 6 For Yahweh has called you as a wife forsaken and grieved in spirit, +\q2 even a wife of youth, when she is cast off,” says your God. +\b +\q1 +\v 7 “For a small moment I have forsaken you, +\q2 but I will gather you with great mercies. +\q1 +\v 8 In overflowing wrath I hid my face from you for a moment, +\q2 but with everlasting loving kindness I will have mercy on you,” says Yahweh your Redeemer. +\b +\q1 +\v 9 “For this is like the waters of Noah to me; +\q2 for as I have sworn that the waters of Noah will no more go over the earth, +\q2 so I have sworn that I will not be angry with you, nor rebuke you. +\q1 +\v 10 For the mountains may depart, +\q2 and the hills be removed, +\q1 but my loving kindness will not depart from you, +\q2 and my covenant of peace will not be removed,” +\q2 says Yahweh who has mercy on you. +\b +\q1 +\v 11 “You afflicted, tossed with storms, and not comforted, +\q2 behold, I will set your stones in beautiful colors, +\q2 and lay your foundations with sapphires. +\q1 +\v 12 I will make your pinnacles of rubies, +\q2 your gates of sparkling jewels, +\q2 and all your walls of precious stones. +\q1 +\v 13 All your children will be taught by Yahweh, +\q2 and your children’s peace will be great. +\q1 +\v 14 You will be established in righteousness. +\q2 You will be far from oppression, +\q2 for you will not be afraid, +\q2 and far from terror, +\q2 for it shall not come near you. +\q1 +\v 15 Behold, they may gather together, but not by me. +\q2 Whoever gathers together against you will fall because of you. +\b +\q1 +\v 16 “Behold, I have created the blacksmith who fans the coals into flame, +\q2 and forges a weapon for his work; +\q2 and I have created the destroyer to destroy. +\q1 +\v 17 No weapon that is formed against you will prevail; +\q2 and you will condemn every tongue that rises against you in judgment. +\q1 This is the heritage of Yahweh’s servants, +\q2 and their righteousness is of me,” says Yahweh. +\c 55 +\q1 +\v 1 “Hey! Come, everyone who thirsts, to the waters! +\q2 Come, he who has no money, buy, and eat! +\q2 Yes, come, buy wine and milk without money and without price. +\q1 +\v 2 Why do you spend money for that which is not bread, +\q2 and your labor for that which doesn’t satisfy? +\q1 Listen diligently to me, and eat that which is good, +\q2 and let your soul delight itself in richness. +\q1 +\v 3 Turn your ear, and come to me. +\q2 Hear, and your soul will live. +\q2 I will make an everlasting covenant with you, even the sure mercies of David. +\q1 +\v 4 Behold, I have given him for a witness to the peoples, +\q2 a leader and commander to the peoples. +\q1 +\v 5 Behold, you shall call a nation that you don’t know; +\q2 and a nation that didn’t know you shall run to you, +\q2 because of Yahweh your God, +\q2 and for the Holy One of Israel; +\q2 for he has glorified you.” +\b +\q1 +\v 6 Seek Yahweh while he may be found. +\q2 Call on him while he is near. +\q1 +\v 7 Let the wicked forsake his way, +\q2 and the unrighteous man his thoughts. +\q1 Let him return to Yahweh, and he will have mercy on him, +\q2 to our God, for he will freely pardon. +\b +\q1 +\v 8 “For my thoughts are not your thoughts, +\q2 and your ways are not my ways,” says Yahweh. +\q1 +\v 9 “For as the heavens are higher than the earth, +\q2 so are my ways higher than your ways, +\q2 and my thoughts than your thoughts. +\q1 +\v 10 For as the rain comes down and the snow from the sky, +\q2 and doesn’t return there, but waters the earth, +\q2 and makes it grow and bud, +\q2 and gives seed to the sower and bread to the eater; +\q1 +\v 11 so is my word that goes out of my mouth: +\q2 it will not return to me void, +\q2 but it will accomplish that which I please, +\q2 and it will prosper in the thing I sent it to do. +\q1 +\v 12 For you shall go out with joy, +\q2 and be led out with peace. +\q1 The mountains and the hills will break out before you into singing; +\q2 and all the trees of the fields will clap their hands. +\q1 +\v 13 Instead of the thorn the cypress tree will come up; +\q2 and instead of the brier the myrtle tree will come up. +\q1 It will make a name for Yahweh, +\q2 for an everlasting sign that will not be cut off.” +\c 56 +\p +\v 1 Yahweh says: +\q1 “Maintain justice +\q2 and do what is right, +\q1 for my salvation is near +\q2 and my righteousness will soon be revealed. +\q1 +\v 2 Blessed is the man who does this, +\q2 and the son of man who holds it fast; +\q1 who keeps the Sabbath without profaning it +\q2 and keeps his hand from doing any evil.” +\b +\q1 +\v 3 Let no foreigner who has joined himself to Yahweh speak, saying, +\q2 “Yahweh will surely separate me from his people.” +\q2 Do not let the eunuch say, “Behold, I am a dry tree.” +\b +\q1 +\v 4 For Yahweh says, “To the eunuchs who keep my Sabbaths, +\q2 choose the things that please me, +\q2 and hold fast to my covenant, +\q1 +\v 5 I will give them in my house and within my walls a memorial and a name better than of sons and of daughters. +\q2 I will give them an everlasting name that will not be cut off. +\b +\q1 +\v 6 Also the foreigners who join themselves to Yahweh +\q2 to serve him, +\q1 and to love Yahweh’s name, +\q2 to be his servants, +\q1 everyone who keeps the Sabbath from profaning it, +\q2 and holds fast my covenant, +\q1 +\v 7 I will bring these to my holy mountain, +\q2 and make them joyful in my house of prayer. +\q1 Their burnt offerings and their sacrifices will be accepted on my altar; +\q2 for my house will be called a house of prayer for all peoples.” +\q1 +\v 8 The Lord Yahweh, who gathers the outcasts of Israel, says, +\q2 “I will yet gather others to him, +\q2 in addition to his own who are gathered.” +\b +\q1 +\v 9 All you animals of the field, +\q2 come to devour, +\q2 all you animals in the forest. +\q1 +\v 10 His watchmen are blind. +\q2 They are all without knowledge. +\q1 They are all mute dogs. +\q2 They can’t bark— +\q2 dreaming, lying down, loving to slumber. +\q1 +\v 11 Yes, the dogs are greedy. +\q2 They can never have enough. +\q1 They are shepherds who can’t understand. +\q2 They have all turned to their own way, +\q2 each one to his gain, from every quarter. +\q1 +\v 12 “Come,” they say, “I will get wine, +\q2 and we will fill ourselves with strong drink; +\q2 and tomorrow will be as today, +\q2 great beyond measure.” +\c 57 +\q1 +\v 1 The righteous perish, +\q2 and no one lays it to heart. +\q1 Merciful men are taken away, +\q2 and no one considers that the righteous is taken away from the evil. +\q1 +\v 2 He enters into peace. +\q2 They rest in their beds, +\q2 each one who walks in his uprightness. +\b +\q1 +\v 3 “But draw near here, you sons of a sorceress, +\q2 you offspring of adulterers and prostitutes. +\q1 +\v 4 Whom do you mock? +\q2 Against whom do you make a wide mouth +\q2 and stick out your tongue? +\q1 Aren’t you children of disobedience +\q2 and offspring of falsehood, +\q1 +\v 5 you who inflame yourselves among the oaks, +\q2 under every green tree; +\q1 who kill the children in the valleys, +\q2 under the clefts of the rocks? +\q1 +\v 6 Among the smooth stones of the valley is your portion. +\q2 They, they are your lot. +\q1 You have even poured a drink offering to them. +\q2 You have offered an offering. +\q2 Shall I be appeased for these things? +\q1 +\v 7 On a high and lofty mountain you have set your bed. +\q2 You also went up there to offer sacrifice. +\q1 +\v 8 You have set up your memorial behind the doors and the posts, +\q2 for you have exposed yourself to someone besides me, +\q2 and have gone up. +\q1 You have enlarged your bed +\q2 and made you a covenant with them. +\q2 You loved what you saw on their bed. +\q1 +\v 9 You went to the king with oil, +\q2 increased your perfumes, +\q2 sent your ambassadors far off, +\q2 and degraded yourself even to Sheol.\f + \fr 57:9 \ft Sheol is the place of the dead.\f* +\q1 +\v 10 You were wearied with the length of your ways; +\q2 yet you didn’t say, ‘It is in vain.’ +\q1 You found a reviving of your strength; +\q2 therefore you weren’t faint. +\b +\q1 +\v 11 “Whom have you dreaded and feared, +\q2 so that you lie, +\q2 and have not remembered me, nor laid it to your heart? +\q1 Haven’t I held my peace for a long time, +\q2 and you don’t fear me? +\q1 +\v 12 I will declare your righteousness; +\q2 and as for your works, they will not benefit you. +\q1 +\v 13 When you cry, +\q2 let those whom you have gathered deliver you, +\q1 but the wind will take them. +\q2 A breath will carry them all away, +\q1 but he who takes refuge in me will possess the land, +\q2 and will inherit my holy mountain.” +\b +\q1 +\v 14 He will say, “Build up, build up, prepare the way! +\q2 Remove the stumbling-block out of the way of my people.” +\q1 +\v 15 For the high and lofty One who inhabits eternity, +\q2 whose name is Holy, says: +\q1 “I dwell in the high and holy place, with him also who is of a contrite and humble spirit, +\q2 to revive the spirit of the humble, +\q2 and to revive the heart of the contrite. +\q1 +\v 16 For I will not contend forever, neither will I always be angry; +\q2 for the spirit would faint before me, +\q2 and the souls whom I have made. +\q1 +\v 17 I was angry because of the iniquity of his covetousness and struck him. +\q2 I hid myself and was angry; +\q2 and he went on backsliding in the way of his heart. +\q1 +\v 18 I have seen his ways, and will heal him. +\q2 I will lead him also, +\q2 and restore comforts to him and to his mourners. +\q1 +\v 19 I create the fruit of the lips: +\q2 Peace, peace, to him who is far off and to him who is near,” +\q2 says Yahweh; “and I will heal them.” +\q1 +\v 20 But the wicked are like the troubled sea; +\q2 for it can’t rest and its waters cast up mire and mud. +\q1 +\v 21 “There is no peace”, says my God, +\q2 “for the wicked.” +\c 58 +\q1 +\v 1 “Cry aloud! Don’t spare! +\q2 Lift up your voice like a trumpet! +\q1 Declare to my people their disobedience, +\q2 and to the house of Jacob their sins. +\q1 +\v 2 Yet they seek me daily, +\q2 and delight to know my ways. +\q1 As a nation that did righteousness, +\q2 and didn’t forsake the ordinance of their God, +\q1 they ask of me righteous judgments. +\q2 They delight to draw near to God. +\q1 +\v 3 ‘Why have we fasted,’ they say, ‘and you don’t see? +\q2 Why have we afflicted our soul, and you don’t notice?’ +\b +\q1 “Behold, in the day of your fast you find pleasure, +\q2 and oppress all your laborers. +\q1 +\v 4 Behold, you fast for strife and contention, +\q2 and to strike with the fist of wickedness. +\q2 You don’t fast today so as to make your voice to be heard on high. +\q1 +\v 5 Is this the fast that I have chosen? +\q2 A day for a man to humble his soul? +\q1 Is it to bow down his head like a reed, +\q2 and to spread sackcloth and ashes under himself? +\q1 Will you call this a fast, +\q2 and an acceptable day to Yahweh? +\b +\q1 +\v 6 “Isn’t this the fast that I have chosen: +\q2 to release the bonds of wickedness, +\q2 to undo the straps of the yoke, +\q2 to let the oppressed go free, +\q2 and that you break every yoke? +\q1 +\v 7 Isn’t it to distribute your bread to the hungry, +\q2 and that you bring the poor who are cast out to your house? +\q1 When you see the naked, +\q2 that you cover him; +\q2 and that you not hide yourself from your own flesh? +\q1 +\v 8 Then your light will break out as the morning, +\q2 and your healing will appear quickly; +\q1 then your righteousness shall go before you, +\q2 and Yahweh’s glory will be your rear guard. +\q1 +\v 9 Then you will call, and Yahweh will answer. +\q2 You will cry for help, and he will say, ‘Here I am.’ +\b +\q1 “If you take away from among you the yoke, +\q2 finger pointing, +\q2 and speaking wickedly; +\q1 +\v 10 and if you pour out your soul to the hungry, +\q2 and satisfy the afflicted soul, +\q1 then your light will rise in darkness, +\q2 and your obscurity will be as the noonday; +\q1 +\v 11 and Yahweh will guide you continually, +\q2 satisfy your soul in dry places, +\q2 and make your bones strong. +\q1 You will be like a watered garden, +\q2 and like a spring of water +\q2 whose waters don’t fail. +\q1 +\v 12 Those who will be of you will build the old waste places. +\q2 You will raise up the foundations of many generations. +\q1 You will be called Repairer of the Breach, +\q2 Restorer of Paths with Dwellings. +\b +\q1 +\v 13 “If you turn away your foot from the Sabbath, +\q2 from doing your pleasure on my holy day, +\q1 and call the Sabbath a delight, +\q2 and the holy of Yahweh honorable, +\q2 and honor it, +\q2 not doing your own ways, +\q2 nor finding your own pleasure, +\q2 nor speaking your own words, +\q1 +\v 14 then you will delight yourself in Yahweh, +\q2 and I will make you to ride on the high places of the earth, +\q2 and I will feed you with the heritage of Jacob your father;” +\q2 for Yahweh’s mouth has spoken it. +\c 59 +\q1 +\v 1 Behold, Yahweh’s hand is not shortened, that it can’t save; +\q2 nor his ear dull, that it can’t hear. +\q1 +\v 2 But your iniquities have separated you and your God, +\q2 and your sins have hidden his face from you, +\q2 so that he will not hear. +\q1 +\v 3 For your hands are defiled with blood, +\q2 and your fingers with iniquity. +\q1 Your lips have spoken lies. +\q2 Your tongue mutters wickedness. +\q1 +\v 4 No one sues in righteousness, +\q2 and no one pleads in truth. +\q1 They trust in vanity +\q2 and speak lies. +\q1 They conceive mischief +\q2 and give birth to iniquity. +\q1 +\v 5 They hatch adders’ eggs +\q2 and weave the spider’s web. +\q1 He who eats of their eggs dies; +\q2 and that which is crushed breaks out into a viper. +\q1 +\v 6 Their webs won’t become garments. +\q2 They won’t cover themselves with their works. +\q1 Their works are works of iniquity, +\q2 and acts of violence are in their hands. +\q1 +\v 7 Their feet run to evil, +\q2 and they hurry to shed innocent blood. +\q1 Their thoughts are thoughts of iniquity. +\q2 Desolation and destruction are in their paths. +\q1 +\v 8 They don’t know the way of peace; +\q2 and there is no justice in their ways. +\q1 They have made crooked paths for themselves; +\q2 whoever goes in them doesn’t know peace. +\b +\q1 +\v 9 Therefore justice is far from us, +\q2 and righteousness doesn’t overtake us. +\q1 We look for light, but see darkness; +\q2 for brightness, but we walk in obscurity. +\q1 +\v 10 We grope for the wall like the blind. +\q2 Yes, we grope as those who have no eyes. +\q1 We stumble at noon as if it were twilight. +\q2 Among those who are strong, we are like dead men. +\q1 +\v 11 We all roar like bears +\q2 and moan sadly like doves. +\q1 We look for justice, but there is none, +\q2 for salvation, but it is far off from us. +\b +\q1 +\v 12 For our transgressions are multiplied before you, +\q2 and our sins testify against us; +\q1 for our transgressions are with us, +\q2 and as for our iniquities, we know them: +\q1 +\v 13 transgressing and denying Yahweh, +\q2 and turning away from following our God, +\q2 speaking oppression and revolt, +\q2 conceiving and uttering from the heart words of falsehood. +\q1 +\v 14 Justice is turned away backward, +\q2 and righteousness stands far away; +\q1 for truth has fallen in the street, +\q2 and uprightness can’t enter. +\q1 +\v 15 Yes, truth is lacking; +\q2 and he who departs from evil makes himself a prey. +\b +\q1 Yahweh saw it, +\q2 and it displeased him that there was no justice. +\q1 +\v 16 He saw that there was no man, +\q2 and wondered that there was no intercessor. +\q1 Therefore his own arm brought salvation to him; +\q2 and his righteousness sustained him. +\q1 +\v 17 He put on righteousness as a breastplate, +\q2 and a helmet of salvation on his head. +\q1 He put on garments of vengeance for clothing, +\q2 and was clad with zeal as a mantle. +\q1 +\v 18 According to their deeds, +\q2 he will repay as appropriate: +\q2 wrath to his adversaries, +\q2 recompense to his enemies. +\q2 He will repay the islands their due. +\q1 +\v 19 So they will fear Yahweh’s name from the west, +\q2 and his glory from the rising of the sun; +\q1 for he will come as a rushing stream, +\q2 which Yahweh’s breath drives. +\b +\q1 +\v 20 “A Redeemer will come to Zion, +\q2 and to those who turn from disobedience in Jacob,” says Yahweh. +\p +\v 21 “As for me, this is my covenant with them,” says Yahweh. “My Spirit who is on you, and my words which I have put in your mouth shall not depart out of your mouth, nor out of the mouth of your offspring, nor out of the mouth of your offspring’s offspring,” says Yahweh, “from now on and forever.” +\c 60 +\q1 +\v 1 “Arise, shine; for your light has come, +\q2 and Yahweh’s glory has risen on you! +\q1 +\v 2 For behold, darkness will cover the earth, +\q2 and thick darkness the peoples; +\q1 but Yahweh will arise on you, +\q2 and his glory shall be seen on you. +\q1 +\v 3 Nations will come to your light, +\q2 and kings to the brightness of your rising. +\b +\q1 +\v 4 “Lift up your eyes all around, and see: +\q2 they all gather themselves together. +\q2 They come to you. +\q1 Your sons will come from far away, +\q2 and your daughters will be carried in arms. +\q1 +\v 5 Then you shall see and be radiant, +\q2 and your heart will thrill and be enlarged; +\q1 because the abundance of the sea will be turned to you. +\q2 The wealth of the nations will come to you. +\q1 +\v 6 A multitude of camels will cover you, +\q2 the dromedaries of Midian and Ephah. +\q1 All from Sheba will come. +\q2 They will bring gold and frankincense, +\q2 and will proclaim the praises of Yahweh. +\q1 +\v 7 All the flocks of Kedar will be gathered together to you. +\q2 The rams of Nebaioth will serve you. +\q1 They will be accepted as offerings on my altar; +\q2 and I will beautify my glorious house. +\b +\q1 +\v 8 “Who are these who fly as a cloud, +\q2 and as the doves to their windows? +\q1 +\v 9 Surely the islands will wait for me, +\q2 and the ships of Tarshish first, +\q1 to bring your sons from far away, +\q2 their silver and their gold with them, +\q1 for the name of Yahweh your God, +\q2 and for the Holy One of Israel, +\q2 because he has glorified you. +\b +\q1 +\v 10 “Foreigners will build up your walls, +\q2 and their kings will serve you; +\q1 for in my wrath I struck you, +\q2 but in my favor I have had mercy on you. +\q1 +\v 11 Your gates also shall be open continually; they shall not be shut day nor night, that men may bring to you the wealth of the nations, and their kings led captive. +\q1 +\v 12 For that nation and kingdom that will not serve you shall perish; yes, those nations shall be utterly wasted. +\b +\q1 +\v 13 “The glory of Lebanon shall come to you, the cypress tree, the pine, and the box tree together, to beautify the place of my sanctuary; and I will make the place of my feet glorious. +\q1 +\v 14 The sons of those who afflicted you will come bowing to you; +\q2 and all those who despised you will bow themselves down at the soles of your feet. +\q1 They will call you Yahweh’s City, +\q2 the Zion of the Holy One of Israel. +\b +\q1 +\v 15 “Whereas you have been forsaken and hated, +\q2 so that no one passed through you, +\q1 I will make you an eternal excellency, +\q2 a joy of many generations. +\q1 +\v 16 You will also drink the milk of the nations, +\q2 and will nurse from royal breasts. +\q1 Then you will know that I, Yahweh, am your Savior, +\q2 your Redeemer, +\q2 the Mighty One of Jacob. +\q1 +\v 17 For bronze I will bring gold; +\q2 for iron I will bring silver; +\q2 for wood, bronze, +\q2 and for stones, iron. +\q1 I will also make peace your governor, +\q2 and righteousness your ruler. +\q1 +\v 18 Violence shall no more be heard in your land, +\q2 nor desolation or destruction within your borders; +\q1 but you will call your walls Salvation, +\q2 and your gates Praise. +\q1 +\v 19 The sun will be no more your light by day, +\q2 nor will the brightness of the moon give light to you, +\q1 but Yahweh will be your everlasting light, +\q2 and your God will be your glory. +\q1 +\v 20 Your sun will not go down any more, +\q2 nor will your moon withdraw itself; +\q1 for Yahweh will be your everlasting light, +\q2 and the days of your mourning will end. +\q1 +\v 21 Then your people will all be righteous. +\q2 They will inherit the land forever, +\q2 the branch of my planting, +\q2 the work of my hands, +\q2 that I may be glorified. +\q1 +\v 22 The little one will become a thousand, +\q2 and the small one a strong nation. +\q2 I, Yahweh, will do this quickly in its time.” +\c 61 +\q1 +\v 1 The Lord Yahweh’s Spirit is on me, +\q2 because Yahweh has anointed me to preach good news to the humble. +\q1 He has sent me to bind up the broken hearted, +\q2 to proclaim liberty to the captives +\q2 and release to those who are bound,\f + \fr 61:1 \ft LXX and DSS add: recovery of sight to the blind\f* +\q1 +\v 2 to proclaim the year of Yahweh’s favor +\q2 and the day of vengeance of our God, +\q2 to comfort all who mourn, +\q1 +\v 3 to provide for those who mourn in Zion, +\q2 to give to them a garland for ashes, +\q2 the oil of joy for mourning, +\q2 the garment of praise for the spirit of heaviness, +\q1 that they may be called trees of righteousness, +\q2 the planting of Yahweh, +\q2 that he may be glorified. +\b +\q1 +\v 4 They will rebuild the old ruins. +\q2 They will raise up the former devastated places. +\q1 They will repair the ruined cities +\q2 that have been devastated for many generations. +\q1 +\v 5 Strangers will stand and feed your flocks. +\q2 Foreigners will work your fields and your vineyards. +\q1 +\v 6 But you will be called Yahweh’s priests. +\q2 Men will call you the servants of our God. +\q1 You will eat the wealth of the nations. +\q2 You will boast in their glory. +\q1 +\v 7 Instead of your shame you will have double. +\q2 Instead of dishonor, they will rejoice in their portion. +\q1 Therefore in their land they will possess double. +\q2 Everlasting joy will be to them. +\q1 +\v 8 “For I, Yahweh, love justice. +\q2 I hate robbery and iniquity. +\q1 I will give them their reward in truth +\q2 and I will make an everlasting covenant with them. +\q1 +\v 9 Their offspring will be known among the nations, +\q2 and their offspring among the peoples. +\q1 All who see them will acknowledge them, +\q2 that they are the offspring which Yahweh has blessed.” +\b +\q1 +\v 10 I will greatly rejoice in Yahweh! +\q2 My soul will be joyful in my God, +\q1 for he has clothed me with the garments of salvation. +\q2 He has covered me with the robe of righteousness, +\q2 as a bridegroom decks himself with a garland +\q2 and as a bride adorns herself with her jewels. +\q1 +\v 11 For as the earth produces its bud, +\q2 and as the garden causes the things that are sown in it to spring up, +\q2 so the Lord Yahweh will cause righteousness and praise to spring up before all the nations. +\c 62 +\q1 +\v 1 For Zion’s sake I will not hold my peace, +\q2 and for Jerusalem’s sake I will not rest, +\q1 until her righteousness shines out like the dawn, +\q2 and her salvation like a burning lamp. +\q1 +\v 2 The nations will see your righteousness, +\q2 and all kings your glory. +\q1 You will be called by a new name, +\q2 which Yahweh’s mouth will name. +\q1 +\v 3 You will also be a crown of beauty in Yahweh’s hand, +\q2 and a royal diadem in your God’s hand. +\q1 +\v 4 You will not be called Forsaken any more, +\q2 nor will your land be called Desolate any more; +\q1 but you will be called Hephzibah,\f + \fr 62:4 \ft Hephzibah means “I delight in her”.\f* +\q2 and your land Beulah;\f + \fr 62:4 \ft Beulah means “married”\f* +\q1 for Yahweh delights in you, +\q2 and your land will be married. +\q1 +\v 5 For as a young man marries a virgin, +\q2 so your sons will marry you. +\q1 As a bridegroom rejoices over his bride, +\q2 so your God will rejoice over you. +\b +\q1 +\v 6 I have set watchmen on your walls, Jerusalem. +\q2 They will never be silent day nor night. +\q1 You who call on Yahweh, take no rest, +\q2 +\v 7 and give him no rest until he establishes, +\q2 and until he makes Jerusalem a praise in the earth. +\b +\q1 +\v 8 Yahweh has sworn by his right hand, +\q2 and by the arm of his strength, +\q1 “Surely I will no more give your grain to be food for your enemies, +\q2 and foreigners will not drink your new wine, for which you have labored, +\q1 +\v 9 but those who have harvested it will eat it, and praise Yahweh. +\q2 Those who have gathered it will drink it in the courts of my sanctuary.” +\b +\q1 +\v 10 Go through, go through the gates! +\q2 Prepare the way of the people! +\q1 Build up, build up the highway! +\q2 Gather out the stones! +\q2 Lift up a banner for the peoples. +\q1 +\v 11 Behold, Yahweh has proclaimed to the end of the earth: +\q2 “Say to the daughter of Zion, +\q2 ‘Behold, your salvation comes! +\q1 Behold, his reward is with him, +\q2 and his recompense before him!’” +\q1 +\v 12 They will call them “The Holy People, +\q2 Yahweh’s Redeemed”. +\q1 You will be called “Sought Out, +\q2 A City Not Forsaken”. +\c 63 +\q1 +\v 1 Who is this who comes from Edom, +\q2 with dyed garments from Bozrah? +\q1 Who is this who is glorious in his clothing, +\q2 marching in the greatness of his strength? +\q1 “It is I who speak in righteousness, +\q2 mighty to save.” +\q1 +\v 2 Why is your clothing red, +\q2 and your garments like him who treads in the wine vat? +\b +\q1 +\v 3 “I have trodden the wine press alone. +\q2 Of the peoples, no one was with me. +\q1 Yes, I trod them in my anger +\q2 and trampled them in my wrath. +\q1 Their lifeblood is sprinkled on my garments, +\q2 and I have stained all my clothing. +\q1 +\v 4 For the day of vengeance was in my heart, +\q2 and the year of my redeemed has come. +\q1 +\v 5 I looked, and there was no one to help; +\q2 and I wondered that there was no one to uphold. +\q1 Therefore my own arm brought salvation to me. +\q2 My own wrath upheld me. +\q1 +\v 6 I trod down the peoples in my anger +\q2 and made them drunk in my wrath. +\q2 I poured their lifeblood out on the earth.” +\b +\q1 +\v 7 I will tell of the loving kindnesses of Yahweh +\q2 and the praises of Yahweh, +\q2 according to all that Yahweh has given to us, +\q1 and the great goodness toward the house of Israel, +\q2 which he has given to them according to his mercies, +\q2 and according to the multitude of his loving kindnesses. +\q1 +\v 8 For he said, “Surely, they are my people, +\q2 children who will not deal falsely;” +\q2 so he became their Savior. +\q1 +\v 9 In all their affliction he was afflicted, +\q2 and the angel of his presence saved them. +\q1 In his love and in his pity he redeemed them. +\q2 He bore them, +\q2 and carried them all the days of old. +\b +\q1 +\v 10 But they rebelled +\q2 and grieved his Holy Spirit. +\q1 Therefore he turned and became their enemy, +\q2 and he himself fought against them. +\b +\q1 +\v 11 Then he remembered the days of old, +\q2 Moses and his people, saying, +\q1 “Where is he who brought them up out of the sea with the shepherds of his flock? +\q2 Where is he who put his Holy Spirit among them?” +\q1 +\v 12 Who caused his glorious arm to be at Moses’ right hand? +\q2 Who divided the waters before them, to make himself an everlasting name? +\q1 +\v 13 Who led them through the depths, +\q2 like a horse in the wilderness, +\q2 so that they didn’t stumble? +\q1 +\v 14 As the livestock that go down into the valley, +\q2 Yahweh’s Spirit caused them to rest. +\q2 So you led your people to make yourself a glorious name. +\b +\q1 +\v 15 Look down from heaven, +\q2 and see from the habitation of your holiness and of your glory. +\q1 Where are your zeal and your mighty acts? +\q2 The yearning of your heart and your compassion is restrained toward me. +\q1 +\v 16 For you are our Father, +\q2 though Abraham doesn’t know us, +\q2 and Israel does not acknowledge us. +\q1 You, Yahweh, are our Father. +\q2 Our Redeemer from everlasting is your name. +\q1 +\v 17 O Yahweh, why do you make us wander from your ways, +\q2 and harden our heart from your fear? +\q1 Return for your servants’ sake, +\q2 the tribes of your inheritance. +\q1 +\v 18 Your holy people possessed it but a little while. +\q2 Our adversaries have trodden down your sanctuary. +\q1 +\v 19 We have become like those over whom you never ruled, +\q2 like those who were not called by your name. +\c 64 +\q1 +\v 1 Oh that you would tear the heavens, +\q2 that you would come down, +\q2 that the mountains might quake at your presence— +\q1 +\v 2 as when fire kindles the brushwood, +\q2 and the fire causes the water to boil. +\q1 Make your name known to your adversaries, +\q2 that the nations may tremble at your presence! +\q1 +\v 3 When you did awesome things which we didn’t look for, +\q2 you came down, and the mountains quaked at your presence. +\q1 +\v 4 For from of old men have not heard, +\q2 nor perceived by the ear, +\q2 nor has the eye seen a God besides you, +\q2 who works for him who waits for him. +\q1 +\v 5 You meet him who rejoices and does righteousness, +\q2 those who remember you in your ways. +\q1 Behold, you were angry, and we sinned. +\q2 We have been in sin for a long time. +\q2 Shall we be saved? +\q1 +\v 6 For we have all become like one who is unclean, +\q2 and all our righteousness is like a polluted garment. +\q1 We all fade like a leaf; +\q2 and our iniquities, like the wind, take us away. +\q1 +\v 7 There is no one who calls on your name, +\q2 who stirs himself up to take hold of you; +\q1 for you have hidden your face from us, +\q2 and have consumed us by means of our iniquities. +\b +\q1 +\v 8 But now, Yahweh, you are our Father. +\q2 We are the clay and you our potter. +\q2 We all are the work of your hand. +\q1 +\v 9 Don’t be furious, Yahweh. +\q2 Don’t remember iniquity forever. +\q1 Look and see, we beg you, +\q2 we are all your people. +\q1 +\v 10 Your holy cities have become a wilderness. +\q2 Zion has become a wilderness, +\q2 Jerusalem a desolation. +\q1 +\v 11 Our holy and our beautiful house where our fathers praised you +\q2 is burned with fire. +\q2 All our pleasant places are laid waste. +\q1 +\v 12 Will you hold yourself back for these things, Yahweh? +\q2 Will you keep silent and punish us very severely? +\c 65 +\q1 +\v 1 “I am inquired of by those who didn’t ask. +\q2 I am found by those who didn’t seek me. +\q2 I said, ‘See me, see me,’ to a nation that was not called by my name. +\q1 +\v 2 I have spread out my hands all day to a rebellious people, +\q2 who walk in a way that is not good, +\q2 after their own thoughts; +\q1 +\v 3 a people who provoke me to my face continually, +\q2 sacrificing in gardens, +\q2 and burning incense on bricks; +\q1 +\v 4 who sit among the graves, +\q2 and spend nights in secret places; +\q1 who eat pig’s meat, +\q2 and broth of abominable things is in their vessels; +\q1 +\v 5 who say, ‘Stay by yourself, +\q2 don’t come near to me, +\q2 for I am holier than you.’ +\q1 These are smoke in my nose, +\q2 a fire that burns all day. +\b +\q1 +\v 6 “Behold, it is written before me: +\q2 I will not keep silence, +\q2 but will repay, +\q2 yes, I will repay into their bosom +\q1 +\v 7 your own iniquities and the iniquities of your fathers together”, says Yahweh, +\q2 “who have burned incense on the mountains, +\q2 and blasphemed me on the hills. +\q2 Therefore I will first measure their work into their bosom.” +\b +\p +\v 8 Yahweh says, +\q1 “As the new wine is found in the cluster, +\q2 and one says, ‘Don’t destroy it, for a blessing is in it:’ +\q1 so I will do for my servants’ sake, +\q2 that I may not destroy them all. +\q1 +\v 9 I will bring offspring out of Jacob, +\q2 and out of Judah an inheritor of my mountains. +\q1 My chosen will inherit it, +\q2 and my servants will dwell there. +\q1 +\v 10 Sharon will be a fold of flocks, +\q2 and the valley of Achor a place for herds to lie down in, +\q2 for my people who have sought me. +\b +\q1 +\v 11 “But you who forsake Yahweh, +\q2 who forget my holy mountain, +\q2 who prepare a table for Fortune, +\q2 and who fill up mixed wine to Destiny; +\q1 +\v 12 I will destine you to the sword, +\q2 and you will all bow down to the slaughter; +\q1 because when I called, you didn’t answer. +\q2 When I spoke, you didn’t listen; +\q1 but you did that which was evil in my eyes, +\q2 and chose that in which I didn’t delight.” +\b +\p +\v 13 Therefore the Lord Yahweh says, +\q1 “Behold, my servants will eat, +\q2 but you will be hungry; +\q1 behold, my servants will drink, +\q2 but you will be thirsty. +\q1 Behold, my servants will rejoice, +\q2 but you will be disappointed. +\q1 +\v 14 Behold, my servants will sing for joy of heart, +\q2 but you will cry for sorrow of heart, +\q2 and will wail for anguish of spirit. +\q1 +\v 15 You will leave your name for a curse to my chosen, +\q2 and the Lord Yahweh will kill you. +\q1 He will call his servants by another name, +\q2 +\v 16 so that he who blesses himself in the earth will bless himself in the God of truth; +\q2 and he who swears in the earth will swear by the God of truth; +\q1 because the former troubles are forgotten, +\q2 and because they are hidden from my eyes. +\b +\q1 +\v 17 “For, behold, I create new heavens and a new earth; +\q2 and the former things will not be remembered, +\q2 nor come into mind. +\q1 +\v 18 But be glad and rejoice forever in that which I create; +\q2 for, behold, I create Jerusalem to be a delight, +\q2 and her people a joy. +\q1 +\v 19 I will rejoice in Jerusalem, +\q2 and delight in my people; +\q1 and the voice of weeping and the voice of crying +\q2 will be heard in her no more. +\b +\q1 +\v 20 “No more will there be an infant who only lives a few days, +\q2 nor an old man who has not filled his days; +\q1 for the child will die one hundred years old, +\q2 and the sinner being one hundred years old will be accursed. +\q1 +\v 21 They will build houses and inhabit them. +\q2 They will plant vineyards and eat their fruit. +\q1 +\v 22 They will not build and another inhabit. +\q2 They will not plant and another eat; +\q1 for the days of my people will be like the days of a tree, +\q2 and my chosen will long enjoy the work of their hands. +\q1 +\v 23 They will not labor in vain +\q2 nor give birth for calamity; +\q1 for they are the offspring of Yahweh’s blessed +\q2 and their descendants with them. +\q1 +\v 24 It will happen that before they call, I will answer; +\q2 and while they are yet speaking, I will hear. +\q1 +\v 25 The wolf and the lamb will feed together. +\q2 The lion will eat straw like the ox. +\q2 Dust will be the serpent’s food. +\q1 They will not hurt nor destroy in all my holy mountain,” +\q2 says Yahweh. +\c 66 +\p +\v 1 Yahweh says: +\q1 “Heaven is my throne, and the earth is my footstool. +\q2 What kind of house will you build to me? +\q2 Where will I rest? +\q1 +\v 2 For my hand has made all these things, +\q2 and so all these things came to be,” says Yahweh: +\q1 “but I will look to this man, +\q2 even to he who is poor and of a contrite spirit, +\q2 and who trembles at my word. +\q1 +\v 3 He who kills an ox is as he who kills a man; +\q2 he who sacrifices a lamb, as he who breaks a dog’s neck; +\q2 he who offers an offering, as he who offers pig’s blood; +\q2 he who burns frankincense, as he who blesses an idol. +\q1 Yes, they have chosen their own ways, +\q2 and their soul delights in their abominations. +\q1 +\v 4 I also will choose their delusions, +\q2 and will bring their fears on them, +\q1 because when I called, no one answered; +\q2 when I spoke, they didn’t listen, +\q1 but they did that which was evil in my eyes, +\q2 and chose that in which I didn’t delight.” +\b +\q1 +\v 5 Hear Yahweh’s word, +\q2 you who tremble at his word: +\q1 “Your brothers who hate you, +\q2 who cast you out for my name’s sake, have said, +\q1 ‘Let Yahweh be glorified, +\q2 that we may see your joy;’ +\q2 but it is those who shall be disappointed. +\q1 +\v 6 A voice of tumult from the city, +\q2 a voice from the temple, +\q2 a voice of Yahweh that repays his enemies what they deserve. +\b +\q1 +\v 7 “Before she travailed, she gave birth. +\q2 Before her pain came, she delivered a son. +\q1 +\v 8 Who has heard of such a thing? +\q2 Who has seen such things? +\q1 Shall a land be born in one day? +\q2 Shall a nation be born at once? +\q1 For as soon as Zion travailed, +\q2 she gave birth to her children. +\q1 +\v 9 Shall I bring to the birth, and not cause to be delivered?” says Yahweh. +\q2 “Shall I who cause to give birth shut the womb?” says your God. +\b +\q1 +\v 10 “Rejoice with Jerusalem, and be glad for her, all you who love her. +\q2 Rejoice for joy with her, all you who mourn over her; +\q1 +\v 11 that you may nurse and be satisfied at the comforting breasts; +\q2 that you may drink deeply, +\q2 and be delighted with the abundance of her glory.” +\b +\q1 +\v 12 For Yahweh says, “Behold, I will extend peace to her like a river, +\q2 and the glory of the nations like an overflowing stream, +\q2 and you will nurse. +\q1 You will be carried on her side, +\q2 and will be dandled on her knees. +\q1 +\v 13 As one whom his mother comforts, +\q2 so I will comfort you. +\q2 You will be comforted in Jerusalem.” +\b +\q1 +\v 14 You will see it, and your heart shall rejoice, +\q2 and your bones will flourish like the tender grass. +\q1 Yahweh’s hand will be known among his servants; +\q2 and he will have indignation against his enemies. +\b +\q1 +\v 15 For, behold, Yahweh will come with fire, +\q2 and his chariots will be like the whirlwind; +\q1 to render his anger with fierceness, +\q2 and his rebuke with flames of fire. +\q1 +\v 16 For Yahweh will execute judgment by fire and by his sword on all flesh; +\q2 and those slain by Yahweh will be many. +\p +\v 17 “Those who sanctify themselves and purify themselves to go to the gardens, following one in the middle, eating pig’s meat, abominable things, and the mouse, they shall come to an end together,” says Yahweh. +\p +\v 18 “For I know their works and their thoughts. The time comes that I will gather all nations and languages, and they will come, and will see my glory. +\p +\v 19 “I will set a sign among them, and I will send those who escape of them to the nations, to Tarshish, Pul, and Lud, who draw the bow, to Tubal and Javan, to far-away islands, who have not heard my fame, nor have seen my glory; and they shall declare my glory among the nations. +\v 20 They shall bring all your brothers out of all the nations for an offering to Yahweh, on horses, in chariots, in litters, on mules, and on camels, to my holy mountain Jerusalem, says Yahweh, as the children of Israel bring their offering in a clean vessel into Yahweh’s house. +\v 21 Of them I will also select priests and Levites,” says Yahweh. +\p +\v 22 “For as the new heavens and the new earth, which I will make, shall remain before me,” says Yahweh, “so your offspring and your name shall remain. +\v 23 It shall happen that from one new moon to another, and from one Sabbath to another, all flesh will come to worship before me,” says Yahweh. +\v 24 “They will go out, and look at the dead bodies of the men who have transgressed against me; for their worm will not die, nor will their fire be quenched, and they will be loathsome to all mankind.” diff --git a/c-sharp/assets/WEB/24JERengWEBUS.SFM b/c-sharp/assets/WEB/24JERengWEBUS.SFM new file mode 100644 index 0000000000..f61e846a9a --- /dev/null +++ b/c-sharp/assets/WEB/24JERengWEBUS.SFM @@ -0,0 +1,3819 @@ +\id JER 24-JER-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Jeremiah +\toc1 The Book of Jeremiah +\toc2 Jeremiah +\toc3 Jeremiah +\mt2 The Book of +\mt1 Jeremiah +\c 1 +\p +\v 1 The words of Jeremiah the son of Hilkiah, one of the priests who were in Anathoth in the land of Benjamin. +\v 2 Yahweh’s\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word came to him in the days of Josiah the son of Amon, king of Judah, in the thirteenth year of his reign. +\v 3 It came also in the days of Jehoiakim the son of Josiah, king of Judah, to the end of the eleventh year of Zedekiah, the son of Josiah, king of Judah, to the carrying away of Jerusalem captive in the fifth month. +\v 4 Now Yahweh’s word came to me, saying, +\q1 +\v 5 “Before I formed you in the womb, I knew you. +\q2 Before you were born, I sanctified you. +\q2 I have appointed you a prophet to the nations.” +\p +\v 6 Then I said, “Ah, Lord\f + \fr 1:6 \ft The word translated “Lord” is “Adonai.” \f* Yahweh! Behold,\f + \fr 1:6 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I don’t know how to speak; for I am a child.” +\p +\v 7 But Yahweh said to me, “Don’t say, ‘I am a child;’ for you must go to whomever I send you, and you must say whatever I command you. +\v 8 Don’t be afraid because of them, for I am with you to rescue you,” says Yahweh. +\p +\v 9 Then Yahweh stretched out his hand and touched my mouth. Then Yahweh said to me, “Behold, I have put my words in your mouth. +\v 10 Behold, I have today set you over the nations and over the kingdoms, to uproot and to tear down, to destroy and to overthrow, to build and to plant.” +\p +\v 11 Moreover Yahweh’s word came to me, saying, “Jeremiah, what do you see?” +\p I said, “I see a branch of an almond tree.” +\p +\v 12 Then Yahweh said to me, “You have seen well; for I watch over my word to perform it.” +\p +\v 13 Yahweh’s word came to me the second time, saying, “What do you see?” +\p I said, “I see a boiling cauldron; and it is tipping away from the north.” +\p +\v 14 Then Yahweh said to me, “Out of the north, evil will break out on all the inhabitants of the land. +\v 15 For behold, I will call all the families of the kingdoms of the north,” says Yahweh. +\q1 “They will come, and they will each set his throne at the entrance of the gates of Jerusalem, +\q2 and against all its walls all around, and against all the cities of Judah. +\q1 +\v 16 I will utter my judgments against them concerning all their wickedness, +\q2 in that they have forsaken me, +\q2 and have burned incense to other gods, +\q2 and worshiped the works of their own hands. +\p +\v 17 “You therefore put your belt on your waist, arise, and say to them all that I command you. Don’t be dismayed at them, lest I dismay you before them. +\v 18 For behold, I have made you today a fortified city, an iron pillar, and bronze walls against the whole land—against the kings of Judah, against its princes, against its priests, and against the people of the land. +\v 19 They will fight against you, but they will not prevail against you; for I am with you”, says Yahweh, “to rescue you.” +\c 2 + +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Go and proclaim in the ears of Jerusalem, saying, ‘Yahweh says, +\q1 “I remember for you the kindness of your youth, +\q2 your love as a bride, +\q1 how you went after me in the wilderness, +\q2 in a land that was not sown. +\q1 +\v 3 Israel was holiness to Yahweh, +\q2 the first fruits of his increase. +\q1 All who devour him will be held guilty. +\q2 Evil will come on them,”’ says Yahweh.” +\p +\v 4 Hear Yahweh’s word, O house of Jacob, and all the families of the house of Israel! +\v 5 Yahweh says, +\q1 “What unrighteousness have your fathers found in me, +\q2 that they have gone far from me, +\q1 and have walked after worthless vanity, +\q2 and have become worthless? +\q1 +\v 6 They didn’t say, ‘Where is Yahweh who brought us up out of the land of Egypt, +\q2 who led us through the wilderness, +\q2 through a land of deserts and of pits, +\q2 through a land of drought and of the shadow of death, +\q2 through a land that no one passed through, +\q2 and where no man lived?’ +\q1 +\v 7 I brought you into a plentiful land +\q2 to eat its fruit and its goodness; +\q1 but when you entered, you defiled my land, +\q2 and made my heritage an abomination. +\q1 +\v 8 The priests didn’t say, ‘Where is Yahweh?’ +\q2 and those who handle the law didn’t know me. +\q1 The rulers also transgressed against me, +\q2 and the prophets prophesied by Baal +\q2 and followed things that do not profit. +\q1 +\v 9 “Therefore I will yet contend with you,” says Yahweh, +\q2 “and I will contend with your children’s children. +\q1 +\v 10 For pass over to the islands of Kittim, and see. +\q2 Send to Kedar, and consider diligently, +\q2 and see if there has been such a thing. +\q1 +\v 11 Has a nation changed its gods, +\q2 which really are no gods? +\q2 But my people have changed their glory for that which doesn’t profit. +\q1 +\v 12 “Be astonished, you heavens, at this +\q2 and be horribly afraid. +\q2 Be very desolate,” says Yahweh. +\q1 +\v 13 “For my people have committed two evils: +\q2 they have forsaken me, the spring of living waters, +\q2 and cut out cisterns for themselves: broken cisterns that can’t hold water. +\q1 +\v 14 Is Israel a slave? +\q2 Is he born into slavery? +\q2 Why has he become a captive? +\q1 +\v 15 The young lions have roared at him and raised their voices. +\q2 They have made his land waste. +\q2 His cities are burned up, without inhabitant. +\q2 +\v 16 The children also of Memphis and Tahpanhes have broken the crown of your head. +\q1 +\v 17 “Haven’t you brought this on yourself, +\q2 in that you have forsaken Yahweh your God,\f + \fr 2:17 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* when he led you by the way? +\q1 +\v 18 Now what do you gain by going to Egypt, to drink the waters of the Shihor? +\q2 Or why do you go on the way to Assyria, to drink the waters of the River?\f + \fr 2:18 \ft i.e., the Euphrates River\f* +\q1 +\v 19 “Your own wickedness will correct you, +\q2 and your backsliding will rebuke you. +\q1 Know therefore and see that it is an evil and bitter thing, +\q2 that you have forsaken Yahweh your God, +\q2 and that my fear is not in you,” says the Lord, Yahweh of Armies. +\q1 +\v 20 “For long ago I broke off your yoke, +\q2 and burst your bonds. +\q1 You said, ‘I will not serve;’ +\q2 for on every high hill and under every green tree you bowed yourself, +\q2 playing the prostitute. +\q1 +\v 21 Yet I had planted you a noble vine, +\q2 a pure and faithful seed. +\q2 How then have you turned into the degenerate branches of a foreign vine to me? +\q1 +\v 22 For though you wash yourself with lye, +\q2 and use much soap, +\q2 yet your iniquity is marked before me,” says the Lord Yahweh. +\q1 +\v 23 “How can you say, ‘I am not defiled. +\q2 I have not gone after the Baals’? +\q1 See your way in the valley. +\q2 Know what you have done. +\q1 You are a swift dromedary traversing her ways, +\v 24 a wild donkey used to the wilderness, that sniffs the wind in her craving. +\q2 When she is in heat, who can turn her away? +\q2 All those who seek her will not weary themselves. In her month, they will find her. +\q1 +\v 25 “Keep your feet from being bare, +\q2 and your throat from thirst. +\q1 But you said, ‘It is in vain. +\q2 No, for I have loved strangers, +\q2 and I will go after them.’ +\q1 +\v 26 As the thief is ashamed when he is found, +\q2 so the house of Israel is ashamed— +\q2 they, their kings, their princes, their priests, and their prophets, +\q1 +\v 27 who tell wood, ‘You are my father,’ +\q2 and a stone, ‘You have given birth to me,’ +\q1 for they have turned their back to me, +\q2 and not their face, +\q2 but in the time of their trouble they will say, ‘Arise, and save us!’ +\q1 +\v 28 “But where are your gods that you have made for yourselves? +\q2 Let them arise, if they can save you in the time of your trouble, +\q2 for you have as many gods as you have towns, O Judah. +\q1 +\v 29 “Why will you contend with me? +\q2 You all have transgressed against me,” says Yahweh. +\q1 +\v 30 “I have struck your children in vain. +\q2 They received no correction. +\q1 Your own sword has devoured your prophets, +\q2 like a destroying lion. +\q1 +\v 31 Generation, consider Yahweh’s word. +\q2 Have I been a wilderness to Israel? +\q2 Or a land of thick darkness? +\q1 Why do my people say, ‘We have broken loose. +\q2 We will come to you no more’? +\q1 +\v 32 “Can a virgin forget her ornaments, +\q2 or a bride her attire? +\q2 Yet my people have forgotten me for days without number. +\q1 +\v 33 How well you prepare your way to seek love! +\q2 Therefore you have even taught the wicked women your ways. +\q1 +\v 34 Also the blood of the souls of the innocent poor is found in your skirts. +\q2 You didn’t find them breaking in, +\q2 but it is because of all these things. +\q1 +\v 35 “Yet you said, ‘I am innocent. +\q2 Surely his anger has turned away from me.’ +\q1 “Behold, I will judge you, +\q2 because you say, ‘I have not sinned.’ +\q1 +\v 36 Why do you go about so much to change your ways? +\q2 You will be ashamed of Egypt also, +\q2 as you were ashamed of Assyria. +\q1 +\v 37 You will also leave that place with your hands on your head; +\q2 for Yahweh has rejected those in whom you trust, +\q2 and you won’t prosper with them. +\c 3 +\p +\v 1 “They say, ‘If a man puts away his wife, and she goes from him, and becomes another man’s, should he return to her again?’ Wouldn’t that land be greatly polluted? But you have played the prostitute with many lovers; yet return again to me,” says Yahweh. +\p +\v 2 “Lift up your eyes to the bare heights, and see! Where have you not been lain with? You have sat waiting for them by the road, as an Arabian in the wilderness. You have polluted the land with your prostitution and with your wickedness. +\v 3 Therefore the showers have been withheld and there has been no latter rain; yet you have had a prostitute’s forehead and you refused to be ashamed. +\v 4 Will you not from this time cry to me, ‘My Father, you are the guide of my youth!’? +\p +\v 5 “‘Will he retain his anger forever? Will he keep it to the end?’ Behold, you have spoken and have done evil things, and have had your way.” +\p +\v 6 Moreover, Yahweh said to me in the days of Josiah the king, “Have you seen that which backsliding Israel has done? She has gone up on every high mountain and under every green tree, and has played the prostitute there. +\v 7 I said after she had done all these things, ‘She will return to me;’ but she didn’t return, and her treacherous sister Judah saw it. +\v 8 I saw when, for this very cause, that backsliding Israel had committed adultery, I had put her away and given her a certificate of divorce, yet treacherous Judah, her sister, had no fear, but she also went and played the prostitute. +\v 9 Because she took her prostitution lightly, the land was polluted, and she committed adultery with stones and with wood. +\v 10 Yet for all this her treacherous sister, Judah, has not returned to me with her whole heart, but only in pretense,” says Yahweh. +\p +\v 11 Yahweh said to me, “Backsliding Israel has shown herself more righteous than treacherous Judah. +\v 12 Go, and proclaim these words toward the north, and say, ‘Return, you backsliding Israel,’ says Yahweh; ‘I will not look in anger on you, for I am merciful,’ says Yahweh. ‘I will not keep anger forever. +\v 13 Only acknowledge your iniquity, that you have transgressed against Yahweh your God, and have scattered your ways to the strangers under every green tree, and you have not obeyed my voice,’” says Yahweh. +\v 14 “Return, backsliding children,” says Yahweh, “for I am a husband to you. I will take one of you from a city, and two from a family, and I will bring you to Zion. +\v 15 I will give you shepherds according to my heart, who will feed you with knowledge and understanding. +\v 16 It will come to pass, when you are multiplied and increased in the land in those days,” says Yahweh, “they will no longer say, ‘the ark of Yahweh’s covenant!’ It will not come to mind. They won’t remember it. They won’t miss it, nor will another be made. +\v 17 At that time they will call Jerusalem ‘Yahweh’s Throne;’ and all the nations will be gathered to it, to Yahweh’s name, to Jerusalem. They will no longer walk after the stubbornness of their evil heart. +\v 18 In those days the house of Judah will walk with the house of Israel, and they will come together out of the land of the north to the land that I gave for an inheritance to your fathers. +\p +\v 19 “But I said, ‘How I desire to put you among the children, and give you a pleasant land, a goodly heritage of the armies of the nations!’ and I said, ‘You shall call me “My Father”, and shall not turn away from following me.’ +\p +\v 20 “Surely as a wife treacherously departs from her husband, so you have dealt treacherously with me, house of Israel,” says Yahweh. +\v 21 A voice is heard on the bare heights, the weeping and the petitions of the children of Israel; because they have perverted their way, they have forgotten Yahweh their God. +\v 22 Return, you backsliding children, and I will heal your backsliding. +\p “Behold, we have come to you; for you are Yahweh our God. +\v 23 Truly help from the hills, the tumult on the mountains, is in vain. Truly the salvation of Israel is in Yahweh our God. +\v 24 But the shameful thing has devoured the labor of our fathers from our youth, their flocks and their herds, their sons and their daughters. +\v 25 Let us lie down in our shame, and let our confusion cover us; for we have sinned against Yahweh our God, we and our fathers, from our youth even to this day. We have not obeyed Yahweh our God’s voice.” +\c 4 +\p +\v 1 “If you will return, Israel,” says Yahweh, “if you will return to me, and if you will put away your abominations out of my sight; then you will not be removed; +\v 2 and you will swear, ‘As Yahweh lives,’ in truth, in justice, and in righteousness. The nations will bless themselves in him, and they will glory in him.” +\p +\v 3 For Yahweh says to the men of Judah and to Jerusalem, “Break up your fallow ground, and don’t sow among thorns. +\v 4 Circumcise yourselves to Yahweh, and take away the foreskins of your heart, you men of Judah and inhabitants of Jerusalem; lest my wrath go out like fire, and burn so that no one can quench it, because of the evil of your doings. +\v 5 Declare in Judah, and publish in Jerusalem; and say, ‘Blow the trumpet in the land!’ Cry aloud and say, ‘Assemble yourselves! Let’s go into the fortified cities!’ +\v 6 Set up a standard toward Zion. Flee for safety! Don’t wait; for I will bring evil from the north, and a great destruction.” +\p +\v 7 A lion has gone up from his thicket, and a destroyer of nations. He is on his way. He has gone out from his place, to make your land desolate, that your cities be laid waste, without inhabitant. +\v 8 For this, clothe yourself with sackcloth, lament and wail; for the fierce anger of Yahweh hasn’t turned back from us. +\v 9 “It will happen at that day,” says Yahweh, “that the heart of the king will perish, along with the heart of the princes. The priests will be astonished, and the prophets will wonder.” +\p +\v 10 Then I said, “Ah, Lord Yahweh! Surely you have greatly deceived this people and Jerusalem, saying, ‘You will have peace;’ whereas the sword reaches to the heart.” +\p +\v 11 At that time it will be said to this people and to Jerusalem, “A hot wind blows from the bare heights in the wilderness toward the daughter of my people, not to winnow, nor to cleanse. +\v 12 A full wind from these will come for me. Now I will also utter judgments against them.” +\p +\v 13 Behold, he will come up as clouds, and his chariots will be as the whirlwind. His horses are swifter than eagles. Woe to us! For we are ruined. +\v 14 Jerusalem, wash your heart from wickedness, that you may be saved. How long will your evil thoughts lodge within you? +\v 15 For a voice declares from Dan, and publishes evil from the hills of Ephraim: +\v 16 “Tell the nations, behold, publish against Jerusalem, ‘Watchers come from a far country, and raise their voice against the cities of Judah. +\v 17 As keepers of a field, they are against her all around, because she has been rebellious against me,’” says Yahweh. +\v 18 “Your way and your doings have brought these things to you. This is your wickedness, for it is bitter, for it reaches to your heart.” +\p +\v 19 My anguish, my anguish! I am pained at my very heart! My heart trembles within me. I can’t hold my peace, because you have heard, O my soul, the sound of the trumpet, the alarm of war. +\v 20 Destruction on destruction is decreed, for the whole land is laid waste. Suddenly my tents are destroyed, and my curtains gone in a moment. +\v 21 How long will I see the standard and hear the sound of the trumpet? +\p +\v 22 “For my people are foolish. They don’t know me. They are foolish children, and they have no understanding. They are skillful in doing evil, but they don’t know how to do good.” +\v 23 I saw the earth and, behold, it was waste and void, and the heavens, and they had no light. +\v 24 I saw the mountains, and behold, they trembled, and all the hills moved back and forth. +\v 25 I saw, and behold, there was no man, and all the birds of the sky had fled. +\v 26 I saw, and behold, the fruitful field was a wilderness, and all its cities were broken down at the presence of Yahweh, before his fierce anger. +\v 27 For Yahweh says, “The whole land will be a desolation; yet I will not make a full end. +\v 28 For this the earth will mourn, and the heavens above be black, because I have spoken it. I have planned it, and I have not repented, neither will I turn back from it.” +\p +\v 29 Every city flees for the noise of the horsemen and archers. They go into the thickets and climb up on the rocks. Every city is forsaken, and not a man dwells therein. +\v 30 You, when you are made desolate, what will you do? Though you clothe yourself with scarlet, though you deck yourself with ornaments of gold, though you enlarge your eyes with makeup, you make yourself beautiful in vain. Your lovers despise you. They seek your life. +\v 31 For I have heard a voice as of a woman in travail, the anguish as of her who gives birth to her first child, the voice of the daughter of Zion, who gasps for breath, who spreads her hands, saying, “Woe is me now! For my soul faints before the murderers.” +\c 5 +\p +\v 1 “Run back and forth through the streets of Jerusalem, and see now, and know, and seek in its wide places, if you can find a man, if there is anyone who does justly, who seeks truth, then I will pardon her. +\v 2 Though they say, ‘As Yahweh lives,’ surely they swear falsely.” +\p +\v 3 O Yahweh, don’t your eyes look on truth? You have stricken them, but they were not grieved. You have consumed them, but they have refused to receive correction. They have made their faces harder than a rock. They have refused to return. +\p +\v 4 Then I said, “Surely these are poor. They are foolish; for they don’t know Yahweh’s way, nor the law of their God. +\v 5 I will go to the great men and will speak to them, for they know the way of Yahweh, and the law of their God.” But these with one accord have broken the yoke, and burst the bonds. +\v 6 Therefore a lion out of the forest will kill them. A wolf of the evenings will destroy them. A leopard will watch against their cities. Everyone who goes out there will be torn in pieces, because their transgressions are many and their backsliding has increased. +\p +\v 7 “How can I pardon you? Your children have forsaken me, and sworn by what are no gods. When I had fed them to the full, they committed adultery, and assembled themselves in troops at the prostitutes’ houses. +\v 8 They were as fed horses roaming at large. Everyone neighed after his neighbor’s wife. +\v 9 Shouldn’t I punish them for these things?” says Yahweh. “Shouldn’t my soul be avenged on such a nation as this? +\p +\v 10 “Go up on her walls, and destroy, but don’t make a full end. Take away her branches, for they are not Yahweh’s. +\v 11 For the house of Israel and the house of Judah have dealt very treacherously against me,” says Yahweh. +\p +\v 12 They have denied Yahweh, and said, “It is not he. Evil won’t come on us. We won’t see sword or famine. +\v 13 The prophets will become wind, and the word is not in them. Thus it will be done to them.” +\p +\v 14 Therefore Yahweh, the God of Armies says, “Because you speak this word, behold, I will make my words in your mouth fire, and this people wood, and it will devour them. +\v 15 Behold, I will bring a nation on you from far away, house of Israel,” says Yahweh. “It is a mighty nation. It is an ancient nation, a nation whose language you don’t know and don’t understand what they say. +\v 16 Their quiver is an open tomb. They are all mighty men. +\v 17 They will eat up your harvest and your bread, which your sons and your daughters should eat. They will eat up your flocks and your herds. They will eat up your vines and your fig trees. They will beat down your fortified cities in which you trust with the sword. +\p +\v 18 “But even in those days,” says Yahweh, “I will not make a full end of you. +\v 19 It will happen when you say, ‘Why has Yahweh our God done all these things to us?’ Then you shall say to them, ‘Just as you have forsaken me and served foreign gods in your land, so you will serve strangers in a land that is not yours.’ +\p +\v 20 “Declare this in the house of Jacob, and publish it in Judah, saying, +\v 21 ‘Hear this now, foolish people without understanding, who have eyes, and don’t see, who have ears, and don’t hear: +\v 22 Don’t you fear me?’ says Yahweh; ‘Won’t you tremble at my presence, who have placed the sand for the bound of the sea by a perpetual decree, that it can’t pass it? Though its waves toss themselves, yet they can’t prevail. Though they roar, they still can’t pass over it.’ +\p +\v 23 “But this people has a revolting and a rebellious heart. They have revolted and gone. +\v 24 They don’t say in their heart, ‘Let’s now fear Yahweh our God, who gives rain, both the former and the latter, in its season, who preserves to us the appointed weeks of the harvest.’ +\p +\v 25 “Your iniquities have turned away these things, and your sins have withheld good from you. +\v 26 For wicked men are found among my people. They watch, as fowlers lie in wait. They set a trap. They catch men. +\v 27 As a cage is full of birds, so are their houses full of deceit. Therefore they have become great, and grew rich. +\v 28 They have grown fat. They shine; yes, they excel in deeds of wickedness. They don’t plead the cause, the cause of the fatherless, that they may prosper; and they don’t defend the rights of the needy. +\p +\v 29 “Shouldn’t I punish for these things?” says Yahweh. “Shouldn’t my soul be avenged on such a nation as this? +\p +\v 30 “An astonishing and horrible thing has happened in the land. +\v 31 The prophets prophesy falsely, and the priests rule by their own authority; and my people love to have it so. What will you do in the end of it? +\c 6 +\p +\v 1 “Flee for safety, you children of Benjamin, out of the middle of Jerusalem! Blow the trumpet in Tekoa and raise up a signal on Beth Haccherem, for evil looks out from the north with a great destruction. +\v 2 I will cut off the beautiful and delicate one, the daughter of Zion. +\v 3 Shepherds with their flocks will come to her. They will pitch their tents against her all around. They will feed everyone in his place.” +\p +\v 4 “Prepare war against her! Arise! Let’s go up at noon. Woe to us! For the day declines, for the shadows of the evening are stretched out. +\v 5 Arise! Let’s go up by night, and let’s destroy her palaces.” +\v 6 For Yahweh of Armies said, “Cut down trees, and cast up a mound against Jerusalem. This is the city to be visited. She is filled with oppression within herself. +\v 7 As a well produces its waters, so she produces her wickedness. Violence and destruction is heard in her. Sickness and wounds are continually before me. +\v 8 Be instructed, Jerusalem, lest my soul be alienated from you, lest I make you a desolation, an uninhabited land.” +\p +\v 9 Yahweh of Armies says, “They will thoroughly glean the remnant of Israel like a vine. Turn again your hand as a grape gatherer into the baskets.” +\p +\v 10 To whom should I speak and testify, that they may hear? Behold, their ear is uncircumcised, and they can’t listen. Behold, Yahweh’s word has become a reproach to them. They have no delight in it. +\v 11 Therefore I am full of Yahweh’s wrath. I am weary with holding it in. +\q1 “Pour it out on the children in the street, +\q2 and on the assembly of young men together; +\q1 for even the husband with the wife will be taken, +\q2 the aged with him who is full of days. +\q1 +\v 12 Their houses will be turned to others, +\q2 their fields and their wives together; +\q1 for I will stretch out my hand on the inhabitants of the land, says Yahweh.” +\q1 +\v 13 “For from their least even to their greatest, everyone is given to covetousness. +\q2 From the prophet even to the priest, everyone deals falsely. +\q1 +\v 14 They have healed also the hurt of my people superficially, +\q2 saying, ‘Peace, peace!’ when there is no peace. +\q1 +\v 15 Were they ashamed when they had committed abomination? +\q2 No, they were not at all ashamed, neither could they blush. +\q1 Therefore they will fall among those who fall. +\q2 When I visit them, they will be cast down,” says Yahweh. +\p +\v 16 Yahweh says, “Stand in the ways and see, and ask for the old paths, ‘Where is the good way?’ and walk in it, and you will find rest for your souls. But they said, ‘We will not walk in it.’ +\v 17 I set watchmen over you, saying, ‘Listen to the sound of the trumpet!’ But they said, ‘We will not listen!’ +\v 18 Therefore hear, you nations, and know, congregation, what is among them. +\v 19 Hear, earth! Behold, I will bring evil on this people, even the fruit of their thoughts, because they have not listened to my words; and as for my law, they have rejected it. +\v 20 To what purpose does frankincense from Sheba come to me, and the sweet cane from a far country? Your burnt offerings are not acceptable, and your sacrifices are not pleasing to me.” +\p +\v 21 Therefore Yahweh says, “Behold, I will lay stumbling blocks before this people. The fathers and the sons together will stumble against them. The neighbor and his friend will perish.” +\v 22 Yahweh says, “Behold, a people comes from the north country. A great nation will be stirred up from the uttermost parts of the earth. +\v 23 They take hold of bow and spear. They are cruel, and have no mercy. Their voice roars like the sea, and they ride on horses, everyone set in array, as a man to the battle, against you, daughter of Zion.” +\p +\v 24 We have heard its report. Our hands become feeble. Anguish has taken hold of us, and pains as of a woman in labor. +\v 25 Don’t go out into the field or walk by the way; for the sword of the enemy and terror are on every side. +\v 26 Daughter of my people, clothe yourself with sackcloth, and wallow in ashes! Mourn, as for an only son, most bitter lamentation, for the destroyer will suddenly come on us. +\p +\v 27 “I have made you a tester of metals and a fortress among my people, that you may know and try their way. +\v 28 They are all grievous rebels, going around to slander. They are bronze and iron. All of them deal corruptly. +\v 29 The bellows blow fiercely. The lead is consumed in the fire. In vain they go on refining, for the wicked are not plucked away. +\v 30 Men will call them rejected silver, because Yahweh has rejected them.” +\c 7 +\p +\v 1 The word that came to Jeremiah from Yahweh, saying, +\v 2 “Stand in the gate of Yahweh’s house, and proclaim this word there, and say, ‘Hear Yahweh’s word, all you of Judah, who enter in at these gates to worship Yahweh.’” +\p +\v 3 Yahweh of Armies, the God of Israel says, “Amend your ways and your doings, and I will cause you to dwell in this place. +\v 4 Don’t trust in lying words, saying, ‘Yahweh’s temple, Yahweh’s temple, Yahweh’s temple, are these.’ +\v 5 For if you thoroughly amend your ways and your doings, if you thoroughly execute justice between a man and his neighbor; +\v 6 if you don’t oppress the foreigner, the fatherless, and the widow, and don’t shed innocent blood in this place, and don’t walk after other gods to your own hurt, +\v 7 then I will cause you to dwell in this place, in the land that I gave to your fathers, from of old even forever more. +\v 8 Behold, you trust in lying words that can’t profit. +\v 9 Will you steal, murder, commit adultery, swear falsely, burn incense to Baal, and walk after other gods that you have not known, +\v 10 then come and stand before me in this house, which is called by my name, and say, ‘We are delivered,’ that you may do all these abominations? +\v 11 Has this house, which is called by my name, become a den of robbers in your eyes? Behold, I myself have seen it,” says Yahweh. +\p +\v 12 “But go now to my place which was in Shiloh, where I caused my name to dwell at the first, and see what I did to it for the wickedness of my people Israel. +\v 13 Now, because you have done all these works,” says Yahweh, “and I spoke to you, rising up early and speaking, but you didn’t hear; and I called you, but you didn’t answer; +\v 14 therefore I will do to the house which is called by my name, in which you trust, and to the place which I gave to you and to your fathers, as I did to Shiloh. +\v 15 I will cast you out of my sight, as I have cast out all your brothers, even the whole offspring\f + \fr 7:15 \ft or, seed\f* of Ephraim. +\p +\v 16 “Therefore don’t pray for this people. Don’t lift up a cry or prayer for them or make intercession to me; for I will not hear you. +\v 17 Don’t you see what they do in the cities of Judah and in the streets of Jerusalem? +\v 18 The children gather wood, and the fathers kindle the fire, and the women knead the dough, to make cakes to the queen of the sky, and to pour out drink offerings to other gods, that they may provoke me to anger. +\v 19 Do they provoke me to anger?” says Yahweh. “Don’t they provoke themselves, to the confusion of their own faces?” +\p +\v 20 Therefore the Lord Yahweh says: “Behold, my anger and my wrath will be poured out on this place, on man, on animal, on the trees of the field, and on the fruit of the ground; and it will burn and will not be quenched.” +\p +\v 21 Yahweh of Armies, the God of Israel says: “Add your burnt offerings to your sacrifices and eat meat. +\v 22 For I didn’t speak to your fathers or command them in the day that I brought them out of the land of Egypt concerning burnt offerings or sacrifices; +\v 23 but this thing I commanded them, saying, ‘Listen to my voice, and I will be your God, and you shall be my people. Walk in all the way that I command you, that it may be well with you.’ +\v 24 But they didn’t listen or turn their ear, but walked in their own counsels and in the stubbornness of their evil heart, and went backward, and not forward. +\v 25 Since the day that your fathers came out of the land of Egypt to this day, I have sent to you all my servants the prophets, daily rising up early and sending them. +\v 26 Yet they didn’t listen to me or incline their ear, but made their neck stiff. They did worse than their fathers. +\p +\v 27 “You shall speak all these words to them, but they will not listen to you. You shall also call to them, but they will not answer you. +\v 28 You shall tell them, ‘This is the nation that has not listened to Yahweh their God’s voice, nor received instruction. Truth has perished, and is cut off from their mouth.’ +\v 29 Cut off your hair, and throw it away, and take up a lamentation on the bare heights; for Yahweh has rejected and forsaken the generation of his wrath. +\p +\v 30 “For the children of Judah have done that which is evil in my sight,” says Yahweh. “They have set their abominations in the house which is called by my name, to defile it. +\v 31 They have built the high places of Topheth, which is in the valley of the son of Hinnom, to burn their sons and their daughters in the fire, which I didn’t command, nor did it come into my mind. +\v 32 Therefore behold, the days come”, says Yahweh, “that it will no more be called ‘Topheth’ or ‘The valley of the son of Hinnom’, but ‘The valley of Slaughter’; for they will bury in Topheth until there is no place to bury. +\v 33 The dead bodies of this people will be food for the birds of the sky, and for the animals of the earth. No one will frighten them away. +\v 34 Then I will cause to cease from the cities of Judah and from the streets of Jerusalem the voice of mirth and the voice of gladness, the voice of the bridegroom and the voice of the bride; for the land will become a waste.” +\c 8 +\p +\v 1 “At that time,” says Yahweh, “they will bring the bones of the kings of Judah, the bones of his princes, the bones of the priests, the bones of the prophets, and the bones of the inhabitants of Jerusalem, out of their graves. +\v 2 They will spread them before the sun, the moon, and all the army of the sky, which they have loved, which they have served, after which they have walked, which they have sought, and which they have worshiped. They will not be gathered or be buried. They will be like dung on the surface of the earth. +\v 3 Death will be chosen rather than life by all the residue that remain of this evil family, that remain in all the places where I have driven them,” says Yahweh of Armies. +\v 4 “Moreover you shall tell them, ‘Yahweh says: +\q1 “‘Do men fall, and not rise up again? +\q2 Does one turn away, and not return? +\q1 +\v 5 Why then have the people of Jerusalem fallen back by a perpetual backsliding? +\q2 They cling to deceit. +\q2 They refuse to return. +\q1 +\v 6 I listened and heard, but they didn’t say what is right. +\q2 No one repents of his wickedness, saying, “What have I done?” +\q1 Everyone turns to his course, +\q2 as a horse that rushes headlong in the battle. +\q1 +\v 7 Yes, the stork in the sky knows her appointed times. +\q2 The turtledove, the swallow, and the crane observe the time of their coming; +\q2 but my people don’t know Yahweh’s law. +\b +\q1 +\v 8 “‘How do you say, “We are wise, and Yahweh’s law is with us?” +\q2 But, behold, the false pen of the scribes has made that a lie. +\q1 +\v 9 The wise men are disappointed. +\q2 They are dismayed and trapped. +\q1 Behold, they have rejected Yahweh’s word. +\q2 What kind of wisdom is in them? +\q1 +\v 10 Therefore I will give their wives to others +\q2 and their fields to those who will possess them. +\q1 For everyone from the least even to the greatest is given to covetousness; +\q2 from the prophet even to the priest everyone deals falsely. +\q1 +\v 11 They have healed the hurt of the daughter of my people slightly, saying, +\q2 “Peace, peace,” when there is no peace. +\q1 +\v 12 Were they ashamed when they had committed abomination? +\q2 No, they were not at all ashamed. +\q2 They couldn’t blush. +\q1 Therefore they will fall among those who fall. +\q2 In the time of their visitation they will be cast down, says Yahweh. +\b +\q1 +\v 13 “‘I will utterly consume them, says Yahweh. +\q2 No grapes will be on the vine, +\q2 no figs on the fig tree, +\q2 and the leaf will fade. +\q1 The things that I have given them +\q2 will pass away from them.’” +\b +\q1 +\v 14 “Why do we sit still? +\q2 Assemble yourselves! +\q2 Let’s enter into the fortified cities, +\q2 and let’s be silent there; +\q1 for Yahweh our God has put us to silence, +\q2 and given us poisoned water to drink, +\q2 because we have sinned against Yahweh. +\q1 +\v 15 We looked for peace, but no good came; +\q2 and for a time of healing, and behold, dismay! +\q1 +\v 16 The snorting of his horses is heard from Dan. +\q2 The whole land trembles at the sound of the neighing of his strong ones; +\q1 for they have come, and have devoured the land and all that is in it, +\q2 the city and those who dwell therein.” +\q1 +\v 17 “For, behold, I will send serpents, +\q2 adders among you, +\q2 which will not be charmed; +\q2 and they will bite you,” says Yahweh. +\q1 +\v 18 Oh that I could comfort myself against sorrow! +\q2 My heart is faint within me. +\q1 +\v 19 Behold, the voice of the cry of the daughter of my people from a land that is very far off: +\q2 “Isn’t Yahweh in Zion? +\q2 Isn’t her King in her?” +\b +\q1 “Why have they provoked me to anger with their engraved images, +\q2 and with foreign idols?” +\b +\q1 +\v 20 “The harvest is past. +\q2 The summer has ended, +\q2 and we are not saved.” +\b +\q1 +\v 21 For the hurt of the daughter of my people, I am hurt. +\q2 I mourn. +\q2 Dismay has taken hold of me. +\q1 +\v 22 Is there no balm in Gilead? +\q2 Is there no physician there? +\q1 Why then isn’t the health of the daughter of my people recovered? +\c 9 +\q1 +\v 1 Oh that my head were waters, +\q2 and my eyes a spring of tears, +\q1 that I might weep day and night +\q2 for the slain of the daughter of my people! +\q1 +\v 2 Oh that I had in the wilderness +\q2 a lodging place of wayfaring men, +\q1 that I might leave my people +\q2 and go from them! +\q1 For they are all adulterers, +\q2 an assembly of treacherous men. +\q1 +\v 3 “They bend their tongue, +\q2 as their bow, for falsehood. +\q1 They have grown strong in the land, +\q2 but not for truth; +\q1 for they proceed from evil to evil, +\q2 and they don’t know me,” says Yahweh. +\q1 +\v 4 “Everyone beware of his neighbor, +\q2 and don’t trust in any brother; +\q1 for every brother will utterly supplant, +\q2 and every neighbor will go around like a slanderer. +\q1 +\v 5 Friends deceive each other, +\q2 and will not speak the truth. +\q1 They have taught their tongue to speak lies. +\q2 They weary themselves committing iniquity. +\q1 +\v 6 Your habitation is in the middle of deceit. +\q2 Through deceit, they refuse to know me,” says Yahweh. +\p +\v 7 Therefore Yahweh of Armies says, +\q1 “Behold, I will melt them and test them; +\q2 for how should I deal with the daughter of my people? +\q1 +\v 8 Their tongue is a deadly arrow. +\q2 It speaks deceit. +\q1 One speaks peaceably to his neighbor with his mouth, +\q2 but in his heart, he waits to ambush him. +\q1 +\v 9 Shouldn’t I punish them for these things?” says Yahweh. +\q2 “Shouldn’t my soul be avenged on a nation such as this? +\q1 +\v 10 I will weep and wail for the mountains, +\q2 and lament for the pastures of the wilderness, +\q1 because they are burned up, so that no one passes through; +\q2 Men can’t hear the voice of the livestock. +\q1 Both the birds of the sky and the animals have fled. +\q2 They are gone. +\b +\q1 +\v 11 “I will make Jerusalem heaps, +\q2 a dwelling place of jackals. +\q1 I will make the cities of Judah a desolation, +\q2 without inhabitant.” +\p +\v 12 Who is wise enough to understand this? Who is he to whom the mouth of Yahweh has spoken, that he may declare it? Why has the land perished and burned up like a wilderness, so that no one passes through? +\p +\v 13 Yahweh says, “Because they have forsaken my law which I set before them, and have not obeyed my voice or walked in my ways, +\v 14 but have walked after the stubbornness of their own heart and after the Baals, which their fathers taught them.” +\v 15 Therefore Yahweh of Armies, the God of Israel, says, “Behold, I will feed them, even this people, with wormwood and give them poisoned water to drink. +\v 16 I will scatter them also among the nations, whom neither they nor their fathers have known. I will send the sword after them, until I have consumed them.” +\p +\v 17 Yahweh of Armies says, +\q1 “Consider, and call for the mourning women, that they may come. +\q2 Send for the skillful women, that they may come. +\q1 +\v 18 Let them make haste +\q2 and take up a wailing for us, +\q1 that our eyes may run down with tears +\q2 and our eyelids gush out with waters. +\q1 +\v 19 For a voice of wailing is heard out of Zion, +\q2 ‘How we are ruined! +\q1 We are greatly confounded +\q2 because we have forsaken the land, +\q2 because they have cast down our dwellings.’” +\b +\q1 +\v 20 Yet hear Yahweh’s word, you women. +\q2 Let your ear receive the word of his mouth. +\q1 Teach your daughters wailing. +\q2 Everyone teach her neighbor a lamentation. +\q1 +\v 21 For death has come up into our windows. +\q2 It has entered into our palaces +\q1 to cut off the children from outside, +\q2 and the young men from the streets. +\p +\v 22 Speak, “Yahweh says, +\q1 “‘The dead bodies of men will fall as dung on the open field, +\q2 and as the handful after the harvester. +\q2 No one will gather them.’” +\p +\v 23 Yahweh says, +\q1 “Don’t let the wise man glory in his wisdom. +\q2 Don’t let the mighty man glory in his might. +\q2 Don’t let the rich man glory in his riches. +\q1 +\v 24 But let him who glories glory in this, +\q2 that he has understanding, and knows me, +\q1 that I am Yahweh who exercises loving kindness, justice, and righteousness in the earth, +\q2 for I delight in these things,” says Yahweh. +\p +\v 25 “Behold, the days come,” says Yahweh, “that I will punish all those who are circumcised only in their flesh: +\v 26 Egypt, Judah, Edom, the children of Ammon, Moab, and all who have the corners of their hair cut off, who dwell in the wilderness, for all the nations are uncircumcised, and all the house of Israel are uncircumcised in heart.” +\c 10 +\p +\v 1 Hear the word which Yahweh speaks to you, house of Israel! +\v 2 Yahweh says, +\q1 “Don’t learn the way of the nations, +\q2 and don’t be dismayed at the signs of the sky; +\q2 for the nations are dismayed at them. +\q1 +\v 3 For the customs of the peoples are vanity; +\q2 for one cuts a tree out of the forest, +\q2 the work of the hands of the workman with the ax. +\q1 +\v 4 They deck it with silver and with gold. +\q2 They fasten it with nails and with hammers, +\q2 so that it can’t move. +\q1 +\v 5 They are like a palm tree, of turned work, +\q2 and don’t speak. +\q1 They must be carried, +\q2 because they can’t move. +\q1 Don’t be afraid of them; +\q2 for they can’t do evil, +\q2 neither is it in them to do good.” +\q1 +\v 6 There is no one like you, Yahweh. +\q2 You are great, +\q2 and your name is great in might. +\q1 +\v 7 Who shouldn’t fear you, +\q2 King of the nations? +\q2 For it belongs to you. +\q1 Because among all the wise men of the nations, +\q2 and in all their royal estate, +\q2 there is no one like you. +\q1 +\v 8 But they are together brutish and foolish, +\q2 instructed by idols! +\q2 It is just wood. +\q1 +\v 9 There is silver beaten into plates, which is brought from Tarshish, +\q2 and gold from Uphaz, +\q2 the work of the engraver and of the hands of the goldsmith. +\q1 Their clothing is blue and purple. +\q2 They are all the work of skillful men. +\q1 +\v 10 But Yahweh is the true God. +\q2 He is the living God, +\q2 and an everlasting King. +\q1 At his wrath, the earth trembles. +\q2 The nations aren’t able to withstand his indignation. +\p +\v 11 “You shall say this to them: ‘The gods that have not made the heavens and the earth will perish from the earth, and from under the heavens.’” +\q1 +\v 12 God has made the earth by his power. +\q2 He has established the world by his wisdom, +\q2 and by his understanding has he stretched out the heavens. +\q1 +\v 13 When he utters his voice, +\q2 the waters in the heavens roar, +\q2 and he causes the vapors to ascend from the ends of the earth. +\q1 He makes lightnings for the rain, +\q2 and brings the wind out of his treasuries. +\q1 +\v 14 Every man has become brutish and without knowledge. +\q2 Every goldsmith is disappointed by his engraved image; +\q1 for his molten image is falsehood, +\q2 and there is no breath in them. +\q1 +\v 15 They are vanity, a work of delusion. +\q2 In the time of their visitation they will perish. +\q1 +\v 16 The portion of Jacob is not like these; +\q2 for he is the maker of all things; +\q1 and Israel is the tribe of his inheritance. +\q2 Yahweh of Armies is his name. +\q1 +\v 17 Gather up your wares out of the land, +\q2 you who live under siege. +\q1 +\v 18 For Yahweh says, +\q2 “Behold, I will sling out the inhabitants of the land at this time, +\q2 and will distress them, that they may feel it.” +\q1 +\v 19 Woe is me because of my injury! +\q2 My wound is serious; +\q1 but I said, +\q2 “Truly this is my grief, and I must bear it.” +\q1 +\v 20 My tent has been destroyed, +\q2 and all my cords are broken. +\q1 My children have gone away from me, and they are no more. +\q2 There is no one to spread my tent any more, +\q2 to set up my curtains. +\q1 +\v 21 For the shepherds have become brutish, +\q2 and have not inquired of Yahweh. +\q1 Therefore they have not prospered, +\q2 and all their flocks have scattered. +\q1 +\v 22 The voice of news, behold, it comes, +\q2 and a great commotion out of the north country, +\q1 to make the cities of Judah a desolation, +\q2 a dwelling place of jackals. +\q1 +\v 23 Yahweh, I know that the way of man is not in himself. +\q2 It is not in man who walks to direct his steps. +\q1 +\v 24 Yahweh, correct me, but gently; +\q2 not in your anger, +\q2 lest you reduce me to nothing. +\q1 +\v 25 Pour out your wrath on the nations that don’t know you, +\q2 and on the families that don’t call on your name; +\q1 for they have devoured Jacob. +\q2 Yes, they have devoured him, consumed him, +\q2 and have laid waste his habitation. +\c 11 +\p +\v 1 The word that came to Jeremiah from Yahweh, saying, +\v 2 “Hear the words of this covenant, and speak to the men of Judah, and to the inhabitants of Jerusalem; +\v 3 and say to them, Yahweh, the God of Israel says: ‘Cursed is the man who doesn’t hear the words of this covenant, +\v 4 which I commanded your fathers in the day that I brought them out of the land of Egypt, out of the iron furnace,’ saying, ‘Obey my voice and do them, according to all which I command you; so you shall be my people, and I will be your God; +\v 5 that I may establish the oath which I swore to your fathers, to give them a land flowing with milk and honey,’ as it is today.” +\p Then I answered, and said, “Amen, Yahweh.” +\p +\v 6 Yahweh said to me, “Proclaim all these words in the cities of Judah, and in the streets of Jerusalem, saying, ‘Hear the words of this covenant, and do them. +\v 7 For I earnestly protested to your fathers in the day that I brought them up out of the land of Egypt, even to this day, rising early and protesting, saying, “Obey my voice.” +\v 8 Yet they didn’t obey, nor turn their ear, but everyone walked in the stubbornness of their evil heart. Therefore I brought on them all the words of this covenant, which I commanded them to do, but they didn’t do them.’” +\p +\v 9 Yahweh said to me, “A conspiracy is found among the men of Judah, and among the inhabitants of Jerusalem. +\v 10 They have turned back to the iniquities of their forefathers, who refused to hear my words. They have gone after other gods to serve them. The house of Israel and the house of Judah have broken my covenant which I made with their fathers. +\v 11 Therefore Yahweh says, ‘Behold, I will bring evil on them which they will not be able to escape; and they will cry to me, but I will not listen to them. +\v 12 Then the cities of Judah and the inhabitants of Jerusalem will go and cry to the gods to which they offer incense, but they will not save them at all in the time of their trouble. +\v 13 For according to the number of your cities are your gods, Judah; and according to the number of the streets of Jerusalem you have set up altars to the shameful thing, even altars to burn incense to Baal.’ +\p +\v 14 “Therefore don’t pray for this people. Don’t lift up cry or prayer for them; for I will not hear them in the time that they cry to me because of their trouble. +\q1 +\v 15 What has my beloved to do in my house, +\q2 since she has behaved lewdly with many, +\q2 and the holy flesh has passed from you? +\q1 When you do evil, +\q2 then you rejoice.” +\b +\q1 +\v 16 Yahweh called your name, “A green olive tree, +\q2 beautiful with goodly fruit.” +\q1 With the noise of a great roar he has kindled fire on it, +\q2 and its branches are broken. +\m +\v 17 For Yahweh of Armies, who planted you, has pronounced evil against you, because of the evil of the house of Israel and of the house of Judah, which they have done to themselves in provoking me to anger by offering incense to Baal. +\p +\v 18 Yahweh gave me knowledge of it, and I knew it. Then you showed me their doings. +\v 19 But I was like a gentle lamb that is led to the slaughter. I didn’t know that they had devised plans against me, saying, +\q1 “Let’s destroy the tree with its fruit, +\q2 and let’s cut him off from the land of the living, +\q2 that his name may be no more remembered.” +\q1 +\v 20 But, Yahweh of Armies, who judges righteously, +\q2 who tests the heart and the mind, +\q1 I will see your vengeance on them; +\q2 for to you I have revealed my cause. +\p +\v 21 “Therefore Yahweh says concerning the men of Anathoth, who seek your life, saying, ‘You shall not prophesy in Yahweh’s name, that you not die by our hand’— +\v 22 therefore Yahweh of Armies says, ‘Behold, I will punish them. The young men will die by the sword. Their sons and their daughters will die by famine. +\v 23 There will be no remnant to them, for I will bring evil on the men of Anathoth, even the year of their visitation.’” +\c 12 +\q1 +\v 1 You are righteous, Yahweh, +\q2 when I contend with you; +\q1 yet I would like to plead a case with you. +\q2 Why does the way of the wicked prosper? +\q2 Why are they all at ease who deal very treacherously? +\q1 +\v 2 You have planted them. Yes, they have taken root. +\q2 They grow. Yes, they produce fruit. +\q1 You are near in their mouth, +\q2 and far from their heart. +\q1 +\v 3 But you, Yahweh, know me. +\q2 You see me, and test my heart toward you. +\q1 Pull them out like sheep for the slaughter, +\q2 and prepare them for the day of slaughter. +\q1 +\v 4 How long will the land mourn, +\q2 and the herbs of the whole country wither? +\q1 Because of the wickedness of those who dwell therein, +\q2 the animals and birds are consumed; +\q1 because they said, +\q2 “He won’t see our latter end.” +\q1 +\v 5 “If you have run with the footmen, +\q2 and they have wearied you, +\q2 then how can you contend with horses? +\q1 Though in a land of peace you are secure, +\q2 yet how will you do in the pride of the Jordan? +\q1 +\v 6 For even your brothers, and the house of your father, +\q2 even they have dealt treacherously with you! +\q2 Even they have cried aloud after you! +\q1 Don’t believe them, +\q2 though they speak beautiful words to you. +\b +\q1 +\v 7 “I have forsaken my house. +\q2 I have cast off my heritage. +\q2 I have given the dearly beloved of my soul into the hand of her enemies. +\q1 +\v 8 My heritage has become to me as a lion in the forest. +\q2 She has uttered her voice against me. +\q2 Therefore I have hated her. +\q1 +\v 9 Is my heritage to me as a speckled bird of prey? +\q2 Are the birds of prey against her all around? +\q1 Go, assemble all the animals of the field. +\q2 Bring them to devour. +\q1 +\v 10 Many shepherds have destroyed my vineyard. +\q2 They have trodden my portion under foot. +\q2 They have made my pleasant portion a desolate wilderness. +\q1 +\v 11 They have made it a desolation. +\q2 It mourns to me, being desolate. +\q1 The whole land is made desolate, +\q2 because no one cares. +\q1 +\v 12 Destroyers have come on all the bare heights in the wilderness; +\q2 for the sword of Yahweh devours from the one end of the land even to the other end of the land. +\q2 No flesh has peace. +\q1 +\v 13 They have sown wheat, +\q2 and have reaped thorns. +\q1 They have exhausted themselves, +\q2 and profit nothing. +\q1 You will be ashamed of your fruits, +\q2 because of Yahweh’s fierce anger.” +\b +\p +\v 14 Yahweh says, “Concerning all my evil neighbors, who touch the inheritance which I have caused my people Israel to inherit: Behold, I will pluck them up from off their land, and will pluck up the house of Judah from among them. +\v 15 It will happen that after I have plucked them up, I will return and have compassion on them. I will bring them again, every man to his heritage, and every man to his land. +\v 16 It will happen, if they will diligently learn the ways of my people, to swear by my name, ‘As Yahweh lives;’ even as they taught my people to swear by Baal, then they will be built up in the middle of my people. +\v 17 But if they will not hear, then I will pluck up that nation, plucking up and destroying it,” says Yahweh. +\c 13 +\p +\v 1 Yahweh said to me, “Go, and buy yourself a linen belt, and put it on your waist, and don’t put it in water.” +\p +\v 2 So I bought a belt according to Yahweh’s word, and put it on my waist. +\p +\v 3 Yahweh’s word came to me the second time, saying, +\v 4 “Take the belt that you have bought, which is on your waist, and arise, go to the Euphrates, and hide it there in a cleft of the rock.” +\p +\v 5 So I went and hid it by the Euphrates, as Yahweh commanded me. +\p +\v 6 After many days, Yahweh said to me, “Arise, go to the Euphrates, and take the belt from there, which I commanded you to hide there.” +\p +\v 7 Then I went to the Euphrates, and dug, and took the belt from the place where I had hidden it; and behold, the belt was ruined. It was profitable for nothing. +\p +\v 8 Then Yahweh’s word came to me, saying, +\v 9 “Yahweh says, ‘In this way I will ruin the pride of Judah, and the great pride of Jerusalem. +\v 10 This evil people, who refuse to hear my words, who walk in the stubbornness of their heart, and have gone after other gods to serve them and to worship them, will even be as this belt, which is profitable for nothing. +\v 11 For as the belt clings to the waist of a man, so I have caused the whole house of Israel and the whole house of Judah to cling to me,’ says Yahweh; ‘that they may be to me for a people, for a name, for praise, and for glory; but they would not hear.’ +\p +\v 12 “Therefore you shall speak to them this word: ‘Yahweh, the God of Israel says, “Every container should be filled with wine.”’ They will tell you, ‘Do we not certainly know that every container should be filled with wine?’ +\v 13 Then tell them, ‘Yahweh says, “Behold, I will fill all the inhabitants of this land, even the kings who sit on David’s throne, the priests, the prophets, and all the inhabitants of Jerusalem, with drunkenness. +\v 14 I will dash them one against another, even the fathers and the sons together,” says Yahweh: “I will not pity, spare, or have compassion, that I should not destroy them.”’” +\q1 +\v 15 Hear, and give ear. +\q2 Don’t be proud, +\q2 for Yahweh has spoken. +\q1 +\v 16 Give glory to Yahweh your God, +\q2 before he causes darkness, +\q2 and before your feet stumble on the dark mountains, +\q1 and while you look for light, +\q2 he turns it into the shadow of death, +\q2 and makes it deep darkness. +\q1 +\v 17 But if you will not hear it, +\q2 my soul will weep in secret for your pride. +\q1 My eye will weep bitterly, +\q2 and run down with tears, +\q2 because Yahweh’s flock has been taken captive. +\q1 +\v 18 Say to the king and to the queen mother, +\q2 “Humble yourselves. +\q1 Sit down, for your crowns have come down, +\q2 even the crown of your glory. +\q1 +\v 19 The cities of the South are shut up, +\q2 and there is no one to open them. +\q1 Judah is carried away captive: all of them. +\q2 They are wholly carried away captive. +\q1 +\v 20 Lift up your eyes, +\q2 and see those who come from the north. +\q1 Where is the flock that was given to you, +\q2 your beautiful flock? +\q1 +\v 21 What will you say when he sets over you as head those whom you have yourself taught to be friends to you? +\q2 Won’t sorrows take hold of you, as of a woman in travail? +\q1 +\v 22 If you say in your heart, +\q2 “Why have these things come on me?” +\q1 Your skirts are uncovered because of the greatness of your iniquity, +\q2 and your heels suffer violence. +\q1 +\v 23 Can the Ethiopian change his skin, +\q2 or the leopard his spots? +\q1 Then may you also do good, +\q2 who are accustomed to do evil. +\b +\q1 +\v 24 “Therefore I will scatter them +\q2 as the stubble that passes away +\q2 by the wind of the wilderness. +\q1 +\v 25 This is your lot, +\q2 the portion measured to you from me,” says Yahweh, +\q1 “because you have forgotten me, +\q2 and trusted in falsehood.” +\q1 +\v 26 Therefore I will also uncover your skirts on your face, +\q2 and your shame will appear. +\q1 +\v 27 I have seen your abominations, even your adulteries +\q2 and your neighing, the lewdness of your prostitution, +\q2 on the hills in the field. +\q1 Woe to you, Jerusalem! +\q2 You will not be made clean. +\q2 How long will it yet be?” +\c 14 +\p +\v 1 This is Yahweh’s word that came to Jeremiah concerning the drought: +\q1 +\v 2 “Judah mourns, +\q2 and its gates languish. +\q1 They sit in black on the ground. +\q2 The cry of Jerusalem goes up. +\q1 +\v 3 Their nobles send their little ones to the waters. +\q2 They come to the cisterns, +\q2 and find no water. +\q1 They return with their vessels empty. +\q2 They are disappointed and confounded, +\q2 and cover their heads. +\q1 +\v 4 Because of the ground which is cracked, +\q2 because no rain has been in the land, +\q1 the plowmen are disappointed. +\q2 They cover their heads. +\q1 +\v 5 Yes, the doe in the field also calves and forsakes her young, +\q2 because there is no grass. +\q1 +\v 6 The wild donkeys stand on the bare heights. +\q2 They pant for air like jackals. +\q1 Their eyes fail, +\q2 because there is no vegetation. +\q1 +\v 7 Though our iniquities testify against us, +\q2 work for your name’s sake, Yahweh; +\q1 for our rebellions are many. +\q2 We have sinned against you. +\q1 +\v 8 You hope of Israel, +\q2 its Savior in the time of trouble, +\q1 why should you be as a foreigner in the land, +\q2 and as a wayfaring man who turns aside to stay for a night? +\q1 +\v 9 Why should you be like a scared man, +\q2 as a mighty man who can’t save? +\q1 Yet you, Yahweh, are in the middle of us, +\q2 and we are called by your name. +\q2 Don’t leave us. +\p +\v 10 Yahweh says to this people: +\q1 “Even so they have loved to wander. +\q2 They have not restrained their feet. +\q1 Therefore Yahweh does not accept them. +\q2 Now he will remember their iniquity, +\q2 and punish them for their sins.” +\p +\v 11 Yahweh said to me, “Don’t pray for this people for their good. +\v 12 When they fast, I will not hear their cry; and when they offer burnt offering and meal offering, I will not accept them; but I will consume them by the sword, by famine, and by pestilence.” +\p +\v 13 Then I said, “Ah, Lord Yahweh! Behold, the prophets tell them, ‘You will not see the sword, neither will you have famine; but I will give you assured peace in this place.’” +\p +\v 14 Then Yahweh said to me, “The prophets prophesy lies in my name. I didn’t send them. I didn’t command them. I didn’t speak to them. They prophesy to you a lying vision, divination, and a thing of nothing, and the deceit of their own heart. +\v 15 Therefore Yahweh says concerning the prophets who prophesy in my name, but I didn’t send them, yet they say, ‘Sword and famine will not be in this land.’ Those prophets will be consumed by sword and famine. +\v 16 The people to whom they prophesy will be cast out in the streets of Jerusalem because of the famine and the sword. They will have no one to bury them—them, their wives, their sons, or their daughters, for I will pour their wickedness on them. +\p +\v 17 “You shall say this word to them: +\q1 “‘Let my eyes run down with tears night and day, +\q2 and let them not cease; +\q1 for the virgin daughter of my people is broken with a great breach, +\q2 with a very grievous wound. +\q1 +\v 18 If I go out into the field, +\q2 then behold, the slain with the sword! +\q1 If I enter into the city, +\q2 then behold, those who are sick with famine! +\q1 For both the prophet and the priest go about in the land, +\q2 and have no knowledge.’” +\b +\q1 +\v 19 Have you utterly rejected Judah? +\q2 Has your soul loathed Zion? +\q1 Why have you struck us, and there is no healing for us? +\q2 We looked for peace, but no good came; +\q2 and for a time of healing, and behold, dismay! +\q1 +\v 20 We acknowledge, Yahweh, our wickedness, +\q2 and the iniquity of our fathers; +\q2 for we have sinned against you. +\q1 +\v 21 Do not abhor us, for your name’s sake. +\q2 Do not disgrace the throne of your glory. +\q2 Remember, and don’t break your covenant with us. +\q1 +\v 22 Are there any among the vanities of the nations that can cause rain? +\q2 Or can the sky give showers? +\q2 Aren’t you he, Yahweh our God? +\q1 Therefore we will wait for you; +\q2 for you have made all these things. +\c 15 +\p +\v 1 Then Yahweh said to me, “Though Moses and Samuel stood before me, yet my mind would not turn toward this people. Cast them out of my sight, and let them go out! +\v 2 It will happen when they ask you, ‘Where shall we go out?’ then you shall tell them, ‘Yahweh says: +\q1 “Such as are for death, to death; +\q1 such as are for the sword, to the sword; +\q1 such as are for the famine, to the famine; +\q1 and such as are for captivity, to captivity.”’ +\p +\v 3 “I will appoint over them four kinds,” says Yahweh: “the sword to kill, the dogs to tear, the birds of the sky, and the animals of the earth, to devour and to destroy. +\v 4 I will cause them to be tossed back and forth among all the kingdoms of the earth, because of Manasseh, the son of Hezekiah, king of Judah, for that which he did in Jerusalem. +\q1 +\v 5 For who will have pity on you, Jerusalem? +\q2 Who will mourn you? +\q2 Who will come to ask of your welfare? +\q1 +\v 6 You have rejected me,” says Yahweh. +\q2 “You have gone backward. +\q1 Therefore I have stretched out my hand against you +\q2 and destroyed you. +\q2 I am weary of showing compassion. +\q1 +\v 7 I have winnowed them with a fan in the gates of the land. +\q2 I have bereaved them of children. +\q1 I have destroyed my people. +\q2 They didn’t return from their ways. +\q1 +\v 8 Their widows are increased more than the sand of the seas. +\q2 I have brought on them against the mother of the young men a destroyer at noonday. +\q2 I have caused anguish and terrors to fall on her suddenly. +\q1 +\v 9 She who has borne seven languishes. +\q2 She has given up the spirit. +\q1 Her sun has gone down while it was yet day. +\q2 She has been disappointed and confounded. +\q2 I will deliver their residue to the sword before their enemies,” says Yahweh. +\b +\q1 +\v 10 Woe is me, my mother, that you have borne me, a man of strife, +\q2 and a man of contention to the whole earth! +\q1 I have not lent, neither have men lent to me; +\q2 yet every one of them curses me. +\p +\v 11 Yahweh said, +\q1 “Most certainly I will strengthen you for good. +\q2 Most certainly I will cause the enemy to make supplication to you in the time of evil +\q2 and in the time of affliction. +\q1 +\v 12 Can one break iron, +\q2 even iron from the north, and bronze? +\q1 +\v 13 I will give your substance and your treasures for a plunder without price, +\q2 and that for all your sins, +\q2 even in all your borders. +\q1 +\v 14 I will make them to pass with your enemies into a land which you don’t know; +\q2 for a fire is kindled in my anger, +\q2 which will burn on you.” +\b +\q1 +\v 15 Yahweh, you know. +\q2 Remember me, visit me, +\q2 and avenge me of my persecutors. +\q1 You are patient, so don’t take me away. +\q2 Know that for your sake I have suffered reproach. +\q1 +\v 16 Your words were found, +\q2 and I ate them. +\q1 Your words were to me a joy and the rejoicing of my heart, +\q2 for I am called by your name, Yahweh, God of Armies. +\q1 +\v 17 I didn’t sit in the assembly of those who make merry and rejoice. +\q2 I sat alone because of your hand, +\q2 for you have filled me with indignation. +\q1 +\v 18 Why is my pain perpetual, +\q2 and my wound incurable, +\q2 which refuses to be healed? +\q1 Will you indeed be to me as a deceitful brook, +\q2 like waters that fail? +\p +\v 19 Therefore Yahweh says, +\q1 “If you return, then I will bring you again, +\q2 that you may stand before me; +\q1 and if you take out the precious from the vile, +\q2 you will be as my mouth. +\q1 They will return to you, +\q2 but you will not return to them. +\q1 +\v 20 I will make you to this people a fortified bronze wall. +\q2 They will fight against you, +\q2 but they will not prevail against you; +\q1 for I am with you to save you +\q2 and to deliver you,” says Yahweh. +\q1 +\v 21 “I will deliver you out of the hand of the wicked, +\q2 and I will redeem you out of the hand of the terrible.” +\c 16 +\p +\v 1 Then Yahweh’s word came to me, saying, +\v 2 “You shall not take a wife, neither shall you have sons or daughters, in this place.” +\v 3 For Yahweh says concerning the sons and concerning the daughters who are born in this place, and concerning their mothers who bore them, and concerning their fathers who became their father in this land: +\v 4 “They will die grievous deaths. They will not be lamented, neither will they be buried. They will be as dung on the surface of the ground. They will be consumed by the sword and by famine. Their dead bodies will be food for the birds of the sky and for the animals of the earth.” +\p +\v 5 For Yahweh says, “Don’t enter into the house of mourning. Don’t go to lament. Don’t bemoan them, for I have taken away my peace from this people,” says Yahweh, “even loving kindness and tender mercies. +\v 6 Both great and small will die in this land. They will not be buried. Men won’t lament for them, cut themselves, or make themselves bald for them. +\v 7 Men won’t break bread for them in mourning, to comfort them for the dead. Men won’t give them the cup of consolation to drink for their father or for their mother. +\p +\v 8 “You shall not go into the house of feasting to sit with them, to eat and to drink.” +\v 9 For Yahweh of Armies, the God of Israel says: “Behold, I will cause to cease out of this place, before your eyes and in your days, the voice of mirth and the voice of gladness, the voice of the bridegroom and the voice of the bride. +\v 10 It will happen, when you tell this people all these words, and they ask you, ‘Why has Yahweh pronounced all this great evil against us?’ or ‘What is our iniquity?’ or ‘What is our sin that we have committed against Yahweh our God?’ +\v 11 then you shall tell them, ‘Because your fathers have forsaken me,’ says Yahweh, ‘and have walked after other gods, have served them, have worshiped them, have forsaken me, and have not kept my law. +\v 12 You have done evil more than your fathers, for behold, you each walk after the stubbornness of his evil heart, so that you don’t listen to me. +\v 13 Therefore I will cast you out of this land into the land that you have not known, neither you nor your fathers. There you will serve other gods day and night, for I will show you no favor.’ +\p +\v 14 “Therefore behold, the days come,” says Yahweh, “that it will no more be said, ‘As Yahweh lives, who brought up the children of Israel out of the land of Egypt;’ +\v 15 but, ‘As Yahweh lives, who brought up the children of Israel from the land of the north, and from all the countries where he had driven them.’ I will bring them again into their land that I gave to their fathers. +\p +\v 16 “Behold, I will send for many fishermen,” says Yahweh, “and they will fish them up. Afterward I will send for many hunters, and they will hunt them from every mountain, from every hill, and out of the clefts of the rocks. +\v 17 For my eyes are on all their ways. They are not hidden from my face. Their iniquity isn’t concealed from my eyes. +\v 18 First I will recompense their iniquity and their sin double, because they have polluted my land with the carcasses of their detestable things, and have filled my inheritance with their abominations.” +\b +\q1 +\v 19 Yahweh, my strength, my stronghold, +\q2 and my refuge in the day of affliction, +\q1 the nations will come to you from the ends of the earth, +\q2 and will say, +\q1 “Our fathers have inherited nothing but lies, +\q2 vanity and things in which there is no profit. +\q1 +\v 20 Should a man make to himself gods +\q2 which yet are no gods?” +\b +\q1 +\v 21 “Therefore behold, I will cause them to know, +\q2 this once I will cause them to know my hand and my might. +\q2 Then they will know that my name is Yahweh.” +\c 17 +\q1 +\v 1 “The sin of Judah is written with a pen of iron, +\q2 and with the point of a diamond. +\q1 It is engraved on the tablet of their heart, +\q2 and on the horns of your altars. +\q1 +\v 2 Even their children remember their altars +\q2 and their Asherah poles by the green trees on the high hills. +\q1 +\v 3 My mountain in the field, +\q2 I will give your substance and all your treasures for a plunder, +\q2 and your high places, because of sin, throughout all your borders. +\q1 +\v 4 You, even of yourself, will discontinue from your heritage that I gave you. +\q2 I will cause you to serve your enemies in the land which you don’t know, +\q2 for you have kindled a fire in my anger which will burn forever.” +\p +\v 5 Yahweh says: +\q1 “Cursed is the man who trusts in man, +\q2 relies on strength of flesh, +\q2 and whose heart departs from Yahweh. +\q1 +\v 6 For he will be like a bush in the desert, +\q2 and will not see when good comes, +\q1 but will inhabit the parched places in the wilderness, +\q2 an uninhabited salt land. +\b +\q1 +\v 7 “Blessed is the man who trusts in Yahweh, +\q2 and whose confidence is in Yahweh. +\q1 +\v 8 For he will be as a tree planted by the waters, +\q2 who spreads out its roots by the river, +\q1 and will not fear when heat comes, +\q2 but its leaf will be green, +\q1 and will not be concerned in the year of drought. +\q2 It won’t cease from yielding fruit. +\q1 +\v 9 The heart is deceitful above all things +\q2 and it is exceedingly corrupt. +\q2 Who can know it? +\b +\q1 +\v 10 “I, Yahweh, search the mind. +\q2 I try the heart, +\q1 even to give every man according to his ways, +\q2 according to the fruit of his doings.” +\b +\q1 +\v 11 As the partridge that sits on eggs which she has not laid, +\q2 so is he who gets riches, and not by right. +\q1 In the middle of his days, they will leave him. +\q2 At his end, he will be a fool. +\q1 +\v 12 A glorious throne, set on high from the beginning, +\q2 is the place of our sanctuary. +\q1 +\v 13 Yahweh, the hope of Israel, +\q2 all who forsake you will be disappointed. +\q1 Those who depart from me will be written in the earth, +\q2 because they have forsaken Yahweh, +\q2 the spring of living waters. +\q1 +\v 14 Heal me, O Yahweh, and I will be healed. +\q2 Save me, and I will be saved; +\q2 for you are my praise. +\q1 +\v 15 Behold, they ask me, +\q2 “Where is Yahweh’s word? +\q2 Let it be fulfilled now.” +\q1 +\v 16 As for me, I have not hurried from being a shepherd after you. +\q2 I haven’t desired the woeful day. You know. +\q2 That which came out of my lips was before your face. +\q1 +\v 17 Don’t be a terror to me. +\q2 You are my refuge in the day of evil. +\q1 +\v 18 Let them be disappointed who persecute me, +\q2 but don’t let me be disappointed. +\q1 Let them be dismayed, +\q2 but don’t let me be dismayed. +\q1 Bring on them the day of evil, +\q2 and destroy them with double destruction. +\p +\v 19 Yahweh said this to me: “Go and stand in the gate of the children of the people, through which the kings of Judah come in and by which they go out, and in all the gates of Jerusalem. +\v 20 Tell them, ‘Hear Yahweh’s word, you kings of Judah, all Judah, and all the inhabitants of Jerusalem, that enter in by these gates: +\v 21 Yahweh says, “Be careful, and bear no burden on the Sabbath day, nor bring it in by the gates of Jerusalem. +\v 22 Don’t carry a burden out of your houses on the Sabbath day. Don’t do any work, but make the Sabbath day holy, as I commanded your fathers. +\v 23 But they didn’t listen. They didn’t turn their ear, but made their neck stiff, that they might not hear, and might not receive instruction. +\v 24 It will happen, if you diligently listen to me,” says Yahweh, “to bring in no burden through the gates of this city on the Sabbath day, but to make the Sabbath day holy, to do no work therein; +\v 25 then there will enter in by the gates of this city kings and princes sitting on David’s throne, riding in chariots and on horses, they and their princes, the men of Judah and the inhabitants of Jerusalem; and this city will remain forever. +\v 26 They will come from the cities of Judah, and from the places around Jerusalem, from the land of Benjamin, from the lowland, from the hill country, and from the South, bringing burnt offerings, sacrifices, meal offerings, and frankincense, and bringing sacrifices of thanksgiving to Yahweh’s house. +\v 27 But if you will not listen to me to make the Sabbath day holy, and not to bear a burden and enter in at the gates of Jerusalem on the Sabbath day, then I will kindle a fire in its gates, and it will devour the palaces of Jerusalem. It will not be quenched.”’” +\c 18 +\p +\v 1 The word which came to Jeremiah from Yahweh, saying, +\v 2 “Arise, and go down to the potter’s house, and there I will cause you to hear my words.” +\p +\v 3 Then I went down to the potter’s house, and behold, he was making something on the wheels. +\v 4 When the vessel that he made of the clay was marred in the hand of the potter, he made it again another vessel, as seemed good to the potter to make it. +\p +\v 5 Then Yahweh’s word came to me, saying, +\v 6 “House of Israel, can’t I do with you as this potter?” says Yahweh. “Behold, as the clay in the potter’s hand, so are you in my hand, house of Israel. +\v 7 At the instant I speak concerning a nation, and concerning a kingdom, to pluck up and to break down and to destroy it, +\v 8 if that nation, concerning which I have spoken, turns from their evil, I will repent of the evil that I thought to do to them. +\v 9 At the instant I speak concerning a nation, and concerning a kingdom, to build and to plant it, +\v 10 if they do that which is evil in my sight, that they not obey my voice, then I will repent of the good with which I said I would benefit them. +\p +\v 11 “Now therefore, speak to the men of Judah, and to the inhabitants of Jerusalem, saying, ‘Yahweh says: “Behold, I frame evil against you, and devise a plan against you. Everyone return from his evil way now, and amend your ways and your doings.”’ +\v 12 But they say, ‘It is in vain; for we will walk after our own plans, and we will each follow the stubbornness of his evil heart.’” +\p +\v 13 Therefore Yahweh says: +\q1 “Ask now among the nations, +\q2 ‘Who has heard such things?’ +\q2 The virgin of Israel has done a very horrible thing. +\q1 +\v 14 Will the snow of Lebanon fail from the rock of the field? +\q2 Will the cold waters that flow down from afar be dried up? +\q1 +\v 15 For my people have forgotten me. +\q2 They have burned incense to false gods. +\q1 They have been made to stumble in their ways +\q2 in the ancient paths, +\q2 to walk in byways, in a way not built up, +\q1 +\v 16 to make their land an astonishment, +\q2 and a perpetual hissing. +\q1 Everyone who passes by it will be astonished, +\q2 and shake his head. +\q1 +\v 17 I will scatter them as with an east wind before the enemy. +\q2 I will show them the back, and not the face, +\q2 in the day of their calamity. +\p +\v 18 Then they said, “Come! Let’s devise plans against Jeremiah; for the law won’t perish from the priest, nor counsel from the wise, nor the word from the prophet. Come, and let’s strike him with the tongue, and let’s not give heed to any of his words.” +\q1 +\v 19 Give heed to me, Yahweh, +\q2 and listen to the voice of those who contend with me. +\q1 +\v 20 Should evil be recompensed for good? +\q2 For they have dug a pit for my soul. +\q1 Remember how I stood before you to speak good for them, +\q2 to turn away your wrath from them. +\q1 +\v 21 Therefore deliver up their children to the famine, +\q2 and give them over to the power of the sword. +\q1 Let their wives become childless and widows. +\q2 Let their men be killed +\q2 and their young men struck by the sword in battle. +\q1 +\v 22 Let a cry be heard from their houses +\q2 when you bring a troop suddenly on them; +\q1 for they have dug a pit to take me +\q2 and hidden snares for my feet. +\q1 +\v 23 Yet, Yahweh, you know all their counsel against me to kill me. +\q2 Don’t forgive their iniquity. +\q2 Don’t blot out their sin from your sight, +\q1 Let them be overthrown before you. +\q2 Deal with them in the time of your anger. +\c 19 +\p +\v 1 Thus said Yahweh, “Go, and buy a potter’s earthen container, and take some of the elders of the people and of the elders of the priests; +\v 2 and go out to the valley of the son of Hinnom, which is by the entry of the gate Harsith, and proclaim there the words that I will tell you. +\v 3 Say, ‘Hear Yahweh’s word, kings of Judah and inhabitants of Jerusalem: Yahweh of Armies, the God of Israel says, “Behold, I will bring evil on this place, which whoever hears, his ears will tingle. +\v 4 Because they have forsaken me, and have defiled this place, and have burned incense in it to other gods that they didn’t know—they, their fathers, and the kings of Judah—and have filled this place with the blood of innocents, +\v 5 and have built the high places of Baal to burn their children in the fire for burnt offerings to Baal, which I didn’t command, nor speak, which didn’t even enter into my mind. +\v 6 Therefore, behold, the days come,” says Yahweh, “that this place will no more be called ‘Topheth’, nor ‘The Valley of the son of Hinnom’, but ‘The valley of Slaughter’. +\p +\v 7 “‘“I will make the counsel of Judah and Jerusalem void in this place. I will cause them to fall by the sword before their enemies, and by the hand of those who seek their life. I will give their dead bodies to be food for the birds of the sky and for the animals of the earth. +\v 8 I will make this city an astonishment and a hissing. Everyone who passes by it will be astonished and hiss because of all its plagues. +\v 9 I will cause them to eat the flesh of their sons and the flesh of their daughters. They will each eat the flesh of his friend in the siege and in the distress with which their enemies, and those who seek their life, will distress them.”’ +\p +\v 10 “Then you shall break the container in the sight of the men who go with you, +\v 11 and shall tell them, ‘Yahweh of Armies says: “Even so I will break this people and this city as one breaks a potter’s vessel, that can’t be made whole again. They will bury in Topheth until there is no place to bury. +\v 12 This is what I will do to this place,” says Yahweh, “and to its inhabitants, even making this city as Topheth. +\v 13 The houses of Jerusalem and the houses of the kings of Judah, which are defiled, will be as the place of Topheth, even all the houses on whose roofs they have burned incense to all the army of the sky and have poured out drink offerings to other gods.”’” +\p +\v 14 Then Jeremiah came from Topheth, where Yahweh had sent him to prophesy, and he stood in the court of Yahweh’s house, and said to all the people: +\v 15 “Yahweh of Armies, the God of Israel says, ‘Behold, I will bring on this city and on all its towns all the evil that I have pronounced against it, because they have made their neck stiff, that they may not hear my words.’” +\c 20 +\p +\v 1 Now Pashhur, the son of Immer the priest, who was chief officer in Yahweh’s house, heard Jeremiah prophesying these things. +\v 2 Then Pashhur struck Jeremiah the prophet and put him in the stocks that were in the upper gate of Benjamin, which was in Yahweh’s house. +\v 3 On the next day, Pashhur released Jeremiah out of the stocks. Then Jeremiah said to him, “Yahweh has not called your name Pashhur, but Magormissabib.\f + \fr 20:3 \ft “Magormissabib” means “surrounded by terror”\f* +\v 4 For Yahweh says, ‘Behold, I will make you a terror to yourself and to all your friends. They will fall by the sword of their enemies, and your eyes will see it. I will give all Judah into the hand of the king of Babylon, and he will carry them captive to Babylon, and will kill them with the sword. +\v 5 Moreover I will give all the riches of this city, and all its gains, and all its precious things, yes, I will give all the treasures of the kings of Judah into the hand of their enemies. They will make them captives, take them, and carry them to Babylon. +\v 6 You, Pashhur, and all who dwell in your house will go into captivity. You will come to Babylon, and there you will die, and there you will be buried, you, and all your friends, to whom you have prophesied falsely.’” +\b +\q1 +\v 7 Yahweh, you have persuaded me, and I was persuaded. +\q2 You are stronger than I, and have prevailed. +\q1 I have become a laughingstock all day. +\q2 Everyone mocks me. +\q1 +\v 8 For as often as I speak, I cry out; +\q2 I cry, “Violence and destruction!” +\q1 because Yahweh’s word has been made a reproach to me, +\q2 and a derision, all day. +\q1 +\v 9 If I say that I will not make mention of him, +\q2 or speak any more in his name, +\q1 then there is in my heart as it were a burning fire shut up in my bones. +\q2 I am weary with holding it in. +\q2 I can’t. +\q1 +\v 10 For I have heard the defaming of many: +\q2 “Terror on every side! +\q2 Denounce, and we will denounce him!” +\q1 say all my familiar friends, +\q2 those who watch for my fall. +\q1 “Perhaps he will be persuaded, +\q2 and we will prevail against him, +\q2 and we will take our revenge on him.” +\q1 +\v 11 But Yahweh is with me as an awesome mighty one. +\q2 Therefore my persecutors will stumble, +\q2 and they won’t prevail. +\q1 They will be utterly disappointed +\q2 because they have not dealt wisely, +\q2 even with an everlasting dishonor which will never be forgotten. +\q1 +\v 12 But Yahweh of Armies, who tests the righteous, +\q2 who sees the heart and the mind, +\q1 let me see your vengeance on them, +\q2 for I have revealed my cause to you. +\q1 +\v 13 Sing to Yahweh! +\q2 Praise Yahweh, +\q2 for he has delivered the soul of the needy from the hand of evildoers. +\q1 +\v 14 Cursed is the day in which I was born. +\q2 Don’t let the day in which my mother bore me be blessed. +\q1 +\v 15 Cursed is the man who brought news to my father, saying, +\q2 “A boy is born to you,” making him very glad. +\q1 +\v 16 Let that man be as the cities which Yahweh overthrew, +\q2 and didn’t repent. +\q1 Let him hear a cry in the morning, +\q2 and shouting at noontime, +\q1 +\v 17 because he didn’t kill me from the womb. +\q2 So my mother would have been my grave, +\q2 and her womb always great. +\q1 +\v 18 Why did I come out of the womb to see labor and sorrow, +\q2 that my days should be consumed with shame? +\c 21 +\p +\v 1 The word which came to Jeremiah from Yahweh, when King Zedekiah sent to him Pashhur the son of Malchijah, and Zephaniah the son of Maaseiah, the priest, saying, +\v 2 “Please inquire of Yahweh for us; for Nebuchadnezzar king of Babylon makes war against us. Perhaps Yahweh will deal with us according to all his wondrous works, that he may withdraw from us.” +\p +\v 3 Then Jeremiah said to them, “Tell Zedekiah: +\v 4 ‘Yahweh, the God of Israel says, “Behold, I will turn back the weapons of war that are in your hands, with which you fight against the king of Babylon, and against the Chaldeans who besiege you outside the walls; and I will gather them into the middle of this city. +\v 5 I myself will fight against you with an outstretched hand and with a strong arm, even in anger, in wrath, and in great indignation. +\v 6 I will strike the inhabitants of this city, both man and animal. They will die of a great pestilence. +\v 7 Afterward,” says Yahweh, “I will deliver Zedekiah king of Judah, his servants, and the people, even those who are left in this city from the pestilence, from the sword, and from the famine, into the hand of Nebuchadnezzar king of Babylon, and into the hand of their enemies, and into the hand of those who seek their life. He will strike them with the edge of the sword. He will not spare them, have pity, or have mercy.”’ +\p +\v 8 “You shall say to this people, ‘Yahweh says: “Behold, I set before you the way of life and the way of death. +\v 9 He who remains in this city will die by the sword, by the famine, and by the pestilence, but he who goes out and passes over to the Chaldeans who besiege you, he will live, and he will escape with his life. +\v 10 For I have set my face on this city for evil, and not for good,” says Yahweh. “It will be given into the hand of the king of Babylon, and he will burn it with fire.”’ +\p +\v 11 “Concerning the house of the king of Judah, hear Yahweh’s word: +\v 12 House of David, Yahweh says, +\q1 ‘Execute justice in the morning, +\q2 and deliver him who is robbed out of the hand of the oppressor, +\q1 lest my wrath go out like fire, +\q2 and burn so that no one can quench it, +\q2 because of the evil of your doings. +\q1 +\v 13 Behold, I am against you, O inhabitant of the valley, +\q2 and of the rock of the plain,’ says Yahweh. +\q1 ‘You that say, “Who would come down against us?” +\q2 or, “Who would enter into our homes?” +\q1 +\v 14 I will punish you according to the fruit of your doings, says Yahweh; +\q2 and I will kindle a fire in her forest, +\q2 and it will devour all that is around her.’” +\c 22 +\p +\v 1 Yahweh said, “Go down to the house of the king of Judah, and speak this word there: +\v 2 ‘Hear Yahweh’s word, king of Judah, who sits on David’s throne—you, your servants, and your people who enter in by these gates. +\v 3 Yahweh says: “Execute justice and righteousness, and deliver him who is robbed out of the hand of the oppressor. Do no wrong. Do no violence to the foreigner, the fatherless, or the widow. Don’t shed innocent blood in this place. +\v 4 For if you do this thing indeed, then kings sitting on David’s throne will enter in by the gates of this house, riding in chariots and on horses—they, their servants, and their people. +\v 5 But if you will not hear these words, I swear by myself,” says Yahweh, “that this house will become a desolation.”’” +\p +\v 6 For Yahweh says concerning the house of the king of Judah: +\q1 “You are Gilead to me, +\q2 the head of Lebanon. +\q1 Yet surely I will make you a wilderness, +\q2 cities which are not inhabited. +\q1 +\v 7 I will prepare destroyers against you, +\q2 everyone with his weapons, +\q1 and they will cut down your choice cedars, +\q2 and cast them into the fire. +\p +\v 8 “Many nations will pass by this city, and they will each ask his neighbor, ‘Why has Yahweh done this to this great city?’ +\v 9 Then they will answer, ‘Because they abandoned the covenant of Yahweh their God, worshiped other gods, and served them.’” +\q1 +\v 10 Don’t weep for the dead. +\q2 Don’t bemoan him; +\q1 but weep bitterly for him who goes away, +\q2 for he will return no more, +\q2 and not see his native country. +\m +\v 11 For Yahweh says touching Shallum the son of Josiah, king of Judah, who reigned instead of Josiah his father, and who went out of this place: “He won’t return there any more. +\v 12 But he will die in the place where they have led him captive. He will see this land no more.” +\q1 +\v 13 “Woe to him who builds his house by unrighteousness, +\q2 and his rooms by injustice; +\q1 who uses his neighbor’s service without wages, +\q2 and doesn’t give him his hire; +\q1 +\v 14 who says, ‘I will build myself a wide house and spacious rooms,’ +\q2 and cuts out windows for himself, +\q1 with a cedar ceiling, +\q2 and painted with red. +\b +\q1 +\v 15 “Should you reign because you strive to excel in cedar? +\q2 Didn’t your father eat and drink, +\q2 and do justice and righteousness? +\q2 Then it was well with him. +\q1 +\v 16 He judged the cause of the poor and needy; +\q2 so then it was well. +\q1 Wasn’t this to know me?” +\q2 says Yahweh. +\q1 +\v 17 But your eyes and your heart are only for your covetousness, +\q2 for shedding innocent blood, +\q2 for oppression, and for doing violence.” +\m +\v 18 Therefore Yahweh says concerning Jehoiakim the son of Josiah, king of Judah: +\q1 “They won’t lament for him, +\q2 saying, ‘Ah my brother!’ or, ‘Ah sister!’ +\q1 They won’t lament for him, +\q2 saying ‘Ah lord!’ or, ‘Ah his glory!’ +\q1 +\v 19 He will be buried with the burial of a donkey, +\q2 drawn and cast out beyond the gates of Jerusalem.” +\b +\q1 +\v 20 “Go up to Lebanon, and cry out. +\q2 Lift up your voice in Bashan, +\q1 and cry from Abarim; +\q2 for all your lovers have been destroyed. +\q1 +\v 21 I spoke to you in your prosperity, +\q2 but you said, ‘I will not listen.’ +\q1 This has been your way from your youth, +\q2 that you didn’t obey my voice. +\q1 +\v 22 The wind will feed all your shepherds, +\q2 and your lovers will go into captivity. +\q1 Surely then you will be ashamed +\q2 and confounded for all your wickedness. +\q1 +\v 23 Inhabitant of Lebanon, +\q2 who makes your nest in the cedars, +\q1 how greatly to be pitied you will be when pangs come on you, +\q2 the pain as of a woman in travail! +\p +\v 24 “As I live,” says Yahweh, “though Coniah the son of Jehoiakim king of Judah were the signet on my right hand, I would still pluck you from there. +\v 25 I would give you into the hand of those who seek your life, and into the hand of them of whom you are afraid, even into the hand of Nebuchadnezzar king of Babylon, and into the hand of the Chaldeans. +\v 26 I will cast you out with your mother who bore you into another country, where you were not born; and there you will die. +\v 27 But to the land to which their soul longs to return, there they will not return.” +\q1 +\v 28 Is this man Coniah a despised broken vessel? +\q2 Is he a vessel in which no one delights? +\q1 Why are they cast out, he and his offspring, +\q2 and cast into a land which they don’t know? +\q1 +\v 29 O earth, earth, earth, +\q2 hear Yahweh’s word! +\q1 +\v 30 Yahweh says, +\q2 “Record this man as childless, +\q2 a man who will not prosper in his days; +\q1 for no more will a man of his offspring prosper, +\q2 sitting on David’s throne +\q2 and ruling in Judah.” +\c 23 +\p +\v 1 “Woe to the shepherds who destroy and scatter the sheep of my pasture!” says Yahweh. +\v 2 Therefore Yahweh, the God of Israel, says against the shepherds who feed my people: “You have scattered my flock, driven them away, and have not visited them. Behold, I will visit on you the evil of your doings,” says Yahweh. +\v 3 “I will gather the remnant of my flock out of all the countries where I have driven them, and will bring them again to their folds; and they will be fruitful and multiply. +\v 4 I will set up shepherds over them who will feed them. They will no longer be afraid or dismayed, neither will any be lacking,” says Yahweh. +\q1 +\v 5 “Behold, the days come,” says Yahweh, +\q2 “that I will raise to David a righteous Branch; +\q1 and he will reign as king and deal wisely, +\q2 and will execute justice and righteousness in the land. +\q1 +\v 6 In his days Judah will be saved, +\q2 and Israel will dwell safely. +\q1 This is his name by which he will be called: +\q2 Yahweh our righteousness. +\m +\v 7 “Therefore, behold, the days come,” says Yahweh, “that they will no more say, ‘As Yahweh lives, who brought up the children of Israel out of the land of Egypt;’ +\v 8 but, ‘As Yahweh lives, who brought up and who led the offspring of the house of Israel out of the north country, and from all the countries where I had driven them.’ Then they will dwell in their own land.” +\p +\v 9 Concerning the prophets: +\q1 My heart within me is broken. +\q2 All my bones shake. +\q1 I am like a drunken man, +\q2 and like a man whom wine has overcome, +\q1 because of Yahweh, +\q2 and because of his holy words. +\q1 +\v 10 “For the land is full of adulterers; +\q2 for because of the curse the land mourns. +\q1 The pastures of the wilderness have dried up. +\q2 Their course is evil, +\q2 and their might is not right; +\q1 +\v 11 for both prophet and priest are profane. +\q2 Yes, in my house I have found their wickedness,” says Yahweh. +\q1 +\v 12 Therefore their way will be to them as slippery places in the darkness. +\q2 They will be driven on, +\q2 and fall therein; +\q1 for I will bring evil on them, +\q2 even the year of their visitation,” says Yahweh. +\b +\q1 +\v 13 “I have seen folly in the prophets of Samaria. +\q2 They prophesied by Baal, +\q2 and caused my people Israel to err. +\q1 +\v 14 In the prophets of Jerusalem I have also seen a horrible thing: +\q2 they commit adultery and walk in lies. +\q1 They strengthen the hands of evildoers, +\q2 so that no one returns from his wickedness. +\q1 They have all become to me as Sodom, +\q2 and its inhabitants as Gomorrah.” +\p +\v 15 Therefore Yahweh of Armies says concerning the prophets: +\q1 “Behold, I will feed them with wormwood, +\q2 and make them drink poisoned water; +\q2 for from the prophets of Jerusalem ungodliness has gone out into all the land.” +\p +\v 16 Yahweh of Armies says, +\q1 “Don’t listen to the words of the prophets who prophesy to you. +\q2 They teach you vanity. +\q2 They speak a vision of their own heart, +\q2 and not out of the mouth of Yahweh. +\q1 +\v 17 They say continually to those who despise me, +\q2 ‘Yahweh has said, “You will have peace;”’ +\q1 and to everyone who walks in the stubbornness of his own heart they say, +\q2 ‘No evil will come on you.’ +\q1 +\v 18 For who has stood in the council of Yahweh, +\q2 that he should perceive and hear his word? +\q2 Who has listened to my word, and heard it? +\q1 +\v 19 Behold, Yahweh’s storm, his wrath, has gone out. +\q2 Yes, a whirling storm! +\q2 It will burst on the head of the wicked. +\q1 +\v 20 Yahweh’s anger will not return until he has executed +\q2 and performed the intents of his heart. +\q2 In the latter days, you will understand it perfectly. +\q1 +\v 21 I didn’t send these prophets, yet they ran. +\q2 I didn’t speak to them, yet they prophesied. +\q1 +\v 22 But if they had stood in my council, +\q2 then they would have caused my people to hear my words, +\q1 and would have turned them from their evil way, +\q2 and from the evil of their doings. +\b +\q1 +\v 23 “Am I a God at hand,” says Yahweh, +\q2 “and not a God afar off? +\q1 +\v 24 Can anyone hide himself in secret places +\q2 so that I can’t see him?” says Yahweh. +\q2 “Don’t I fill heaven and earth?” says Yahweh. +\p +\v 25 “I have heard what the prophets have said, who prophesy lies in my name, saying, ‘I had a dream! I had a dream!’ +\v 26 How long will this be in the heart of the prophets who prophesy lies, even the prophets of the deceit of their own heart? +\v 27 They intend to cause my people to forget my name by their dreams which they each tell his neighbor, as their fathers forgot my name because of Baal. +\v 28 The prophet who has a dream, let him tell a dream; and he who has my word, let him speak my word faithfully. What is the straw to the wheat?” says Yahweh. +\v 29 “Isn’t my word like fire?” says Yahweh; “and like a hammer that breaks the rock in pieces? +\p +\v 30 “Therefore behold, I am against the prophets,” says Yahweh, “who each steal my words from his neighbor. +\v 31 Behold, I am against the prophets,” says Yahweh, “who use their tongues, and say, ‘He says.’ +\v 32 Behold, I am against those who prophesy lying dreams,” says Yahweh, “who tell them, and cause my people to err by their lies, and by their vain boasting; yet I didn’t send them or command them. They don’t profit this people at all,” says Yahweh. +\p +\v 33 “When this people, or the prophet, or a priest, asks you, saying, ‘What is the message from Yahweh?’ Then you shall tell them, ‘“What message? I will cast you off,” says Yahweh.’ +\v 34 As for the prophet, the priest, and the people, who say, ‘The message from Yahweh,’ I will even punish that man and his household. +\v 35 You will say everyone to his neighbor, and everyone to his brother, ‘What has Yahweh answered?’ and, ‘What has Yahweh said?’ +\v 36 You will mention the message from Yahweh no more, for every man’s own word has become his message; for you have perverted the words of the living God, of Yahweh of Armies, our God. +\v 37 You will say to the prophet, ‘What has Yahweh answered you?’ and, ‘What has Yahweh spoken?’ +\v 38 Although you say, ‘The message from Yahweh,’ therefore Yahweh says: ‘Because you say this word, “The message from Yahweh,” and I have sent to you, telling you not to say, “The message from Yahweh,” +\v 39 therefore behold, I will utterly forget you, and I will cast you off with the city that I gave to you and to your fathers, away from my presence. +\v 40 I will bring an everlasting reproach on you, and a perpetual shame, which will not be forgotten.’” +\c 24 +\p +\v 1 Yahweh showed me, and behold, two baskets of figs were set before Yahweh’s temple, after Nebuchadnezzar king of Babylon had carried away captive Jeconiah the son of Jehoiakim, king of Judah, and the princes of Judah, with the craftsmen and smiths, from Jerusalem, and had brought them to Babylon. +\v 2 One basket had very good figs, like the figs that are first-ripe; and the other basket had very bad figs, which could not be eaten, they were so bad. +\p +\v 3 Then Yahweh asked me, “What do you see, Jeremiah?” +\p I said, “Figs. The good figs are very good, and the bad are very bad, so bad that they can’t be eaten.” +\p +\v 4 Yahweh’s word came to me, saying, +\v 5 “Yahweh, the God of Israel says: ‘Like these good figs, so I will regard the captives of Judah, whom I have sent out of this place into the land of the Chaldeans, as good. +\v 6 For I will set my eyes on them for good, and I will bring them again to this land. I will build them, and not pull them down. I will plant them, and not pluck them up. +\v 7 I will give them a heart to know me, that I am Yahweh. They will be my people, and I will be their God; for they will return to me with their whole heart. +\p +\v 8 “‘As the bad figs, which can’t be eaten, they are so bad,’ surely Yahweh says, ‘So I will give up Zedekiah the king of Judah, and his princes, and the remnant of Jerusalem who remain in this land, and those who dwell in the land of Egypt. +\v 9 I will even give them up to be tossed back and forth among all the kingdoms of the earth for evil, to be a reproach and a proverb, a taunt and a curse, in all places where I will drive them. +\v 10 I will send the sword, the famine, and the pestilence among them, until they are consumed from off the land that I gave to them and to their fathers.’” +\c 25 +\p +\v 1 The word that came to Jeremiah concerning all the people of Judah, in the fourth year of Jehoiakim the son of Josiah, king of Judah (this was the first year of Nebuchadnezzar king of Babylon), +\v 2 which Jeremiah the prophet spoke to all the people of Judah, and to all the inhabitants of Jerusalem: +\v 3 From the thirteenth year of Josiah the son of Amon, king of Judah, even to this day, these twenty-three years, Yahweh’s word has come to me, and I have spoken to you, rising up early and speaking; but you have not listened. +\p +\v 4 Yahweh has sent to you all his servants the prophets, rising up early and sending them (but you have not listened or inclined your ear to hear), +\v 5 saying, “Return now everyone from his evil way, and from the evil of your doings, and dwell in the land that Yahweh has given to you and to your fathers, from of old and even forever more. +\v 6 Don’t go after other gods to serve them or worship them, and don’t provoke me to anger with the work of your hands; then I will do you no harm.” +\p +\v 7 “Yet you have not listened to me,” says Yahweh, “that you may provoke me to anger with the work of your hands to your own hurt.” +\p +\v 8 Therefore Yahweh of Armies says: “Because you have not heard my words, +\v 9 behold, I will send and take all the families of the north,” says Yahweh, “and I will send to Nebuchadnezzar the king of Babylon, my servant, and will bring them against this land, and against its inhabitants, and against all these nations around. I will utterly destroy them, and make them an astonishment, and a hissing, and perpetual desolations. +\v 10 Moreover I will take from them the voice of mirth and the voice of gladness, the voice of the bridegroom and the voice of the bride, the sound of the millstones, and the light of the lamp. +\v 11 This whole land will be a desolation, and an astonishment; and these nations will serve the king of Babylon seventy years. +\p +\v 12 “It will happen, when seventy years are accomplished, that I will punish the king of Babylon and that nation,” says Yahweh, “for their iniquity. I will make the land of the Chaldeans desolate forever. +\v 13 I will bring on that land all my words which I have pronounced against it, even all that is written in this book, which Jeremiah has prophesied against all the nations. +\v 14 For many nations and great kings will make bondservants of them, even of them. I will recompense them according to their deeds, and according to the work of their hands.” +\p +\v 15 For Yahweh, the God of Israel, says to me: “Take this cup of the wine of wrath from my hand, and cause all the nations to whom I send you to drink it. +\v 16 They will drink, and reel back and forth, and be insane, because of the sword that I will send among them.” +\p +\v 17 Then I took the cup at Yahweh’s hand, and made all the nations to drink, to whom Yahweh had sent me: +\v 18 Jerusalem, and the cities of Judah, with its kings and its princes, to make them a desolation, an astonishment, a hissing, and a curse, as it is today; +\v 19 Pharaoh king of Egypt, with his servants, his princes, and all his people; +\v 20 and all the mixed people, and all the kings of the land of Uz, all the kings of the Philistines, Ashkelon, Gaza, Ekron, and the remnant of Ashdod; +\v 21 Edom, Moab, and the children of Ammon; +\v 22 and all the kings of Tyre, all the kings of Sidon, and the kings of the isle which is beyond the sea; +\v 23 Dedan, Tema, Buz, and all who have the corners of their beard cut off; +\v 24 and all the kings of Arabia, all the kings of the mixed people who dwell in the wilderness; +\v 25 and all the kings of Zimri, all the kings of Elam, and all the kings of the Medes; +\v 26 and all the kings of the north, far and near, one with another; and all the kingdoms of the world, which are on the surface of the earth. The king of Sheshach will drink after them. +\p +\v 27 “You shall tell them, ‘Yahweh of Armies, the God of Israel says: “Drink, and be drunk, vomit, fall, and rise no more, because of the sword which I will send among you.”’ +\v 28 It shall be, if they refuse to take the cup at your hand to drink, then you shall tell them, ‘Yahweh of Armies says: “You shall surely drink. +\v 29 For, behold, I begin to work evil at the city which is called by my name; and should you be utterly unpunished? You will not be unpunished; for I will call for a sword on all the inhabitants of the earth, says Yahweh of Armies.”’ +\p +\v 30 “Therefore prophesy against them all these words, and tell them, +\q1 “‘Yahweh will roar from on high, +\q2 and utter his voice from his holy habitation. +\q2 He will mightily roar against his fold. +\q1 He will give a shout, as those who tread grapes, +\q2 against all the inhabitants of the earth. +\q1 +\v 31 A noise will come even to the end of the earth; +\q2 for Yahweh has a controversy with the nations. +\q1 He will enter into judgment with all flesh. +\q2 As for the wicked, he will give them to the sword,”’ says Yahweh.” +\p +\v 32 Yahweh of Armies says, +\q1 “Behold, evil will go out from nation to nation, +\q2 and a great storm will be raised up from the uttermost parts of the earth.” +\m +\v 33 The slain of Yahweh will be at that day from one end of the earth even to the other end of the earth. They won’t be lamented. They won’t be gathered or buried. They will be dung on the surface of the ground. +\q1 +\v 34 Wail, you shepherds, and cry. +\q2 Wallow in dust, you leader of the flock; +\q1 for the days of your slaughter and of your dispersions have fully come, +\q2 and you will fall like fine pottery. +\q1 +\v 35 The shepherds will have no way to flee. +\q2 The leader of the flock will have no escape. +\q1 +\v 36 A voice of the cry of the shepherds, +\q2 and the wailing of the leader of the flock, +\q2 for Yahweh destroys their pasture. +\q1 +\v 37 The peaceful folds are brought to silence +\q2 because of the fierce anger of Yahweh. +\q1 +\v 38 He has left his covert, as the lion; +\q2 for their land has become an astonishment because of the fierceness of the oppression, +\q2 and because of his fierce anger. +\c 26 +\p +\v 1 In the beginning of the reign of Jehoiakim the son of Josiah, king of Judah, this word came from Yahweh: +\v 2 “Yahweh says: ‘Stand in the court of Yahweh’s house, and speak to all the cities of Judah which come to worship in Yahweh’s house, all the words that I command you to speak to them. Don’t omit a word. +\v 3 It may be they will listen, and every man turn from his evil way, that I may relent from the evil which I intend to do to them because of the evil of their doings.’” +\v 4 You shall tell them, “Yahweh says: ‘If you will not listen to me, to walk in my law which I have set before you, +\v 5 to listen to the words of my servants the prophets whom I send to you, even rising up early and sending them—but you have not listened— +\v 6 then I will make this house like Shiloh, and will make this city a curse to all the nations of the earth.’” +\p +\v 7 The priests and the prophets and all the people heard Jeremiah speaking these words in Yahweh’s house. +\v 8 When Jeremiah had finished speaking all that Yahweh had commanded him to speak to all the people, the priests and the prophets and all the people seized him, saying, “You shall surely die! +\v 9 Why have you prophesied in Yahweh’s name, saying, ‘This house will be like Shiloh, and this city will be desolate, without inhabitant?’” All the people were crowded around Jeremiah in Yahweh’s house. +\p +\v 10 When the princes of Judah heard these things, they came up from the king’s house to Yahweh’s house; and they sat in the entry of the new gate of Yahweh’s house. +\v 11 Then the priests and the prophets spoke to the princes and to all the people, saying, “This man is worthy of death, for he has prophesied against this city, as you have heard with your ears.” +\p +\v 12 Then Jeremiah spoke to all the princes and to all the people, saying, “Yahweh sent me to prophesy against this house and against this city all the words that you have heard. +\v 13 Now therefore amend your ways and your doings, and obey Yahweh your God’s voice; then Yahweh will relent from the evil that he has pronounced against you. +\v 14 But as for me, behold, I am in your hand. Do with me what is good and right in your eyes. +\v 15 Only know for certain that if you put me to death, you will bring innocent blood on yourselves, on this city, and on its inhabitants; for in truth Yahweh has sent me to you to speak all these words in your ears.” +\p +\v 16 Then the princes and all the people said to the priests and to the prophets: “This man is not worthy of death; for he has spoken to us in the name of Yahweh our God.” +\p +\v 17 Then certain of the elders of the land rose up, and spoke to all the assembly of the people, saying, +\v 18 “Micah the Morashtite prophesied in the days of Hezekiah king of Judah; and he spoke to all the people of Judah, saying, ‘Yahweh of Armies says: +\q1 “‘Zion will be plowed as a field, +\q2 and Jerusalem will become heaps, +\q2 and the mountain of the house as the high places of a forest.’ +\m +\v 19 Did Hezekiah king of Judah and all Judah put him to death? Didn’t he fear Yahweh, and entreat the favor of Yahweh, and Yahweh relented of the disaster which he had pronounced against them? We would commit great evil against our own souls that way!” +\p +\v 20 There was also a man who prophesied in Yahweh’s name, Uriah the son of Shemaiah of Kiriath Jearim; and he prophesied against this city and against this land according to all the words of Jeremiah. +\v 21 When Jehoiakim the king, with all his mighty men and all the princes heard his words, the king sought to put him to death; but when Uriah heard it, he was afraid, and fled, and went into Egypt. +\v 22 Then Jehoiakim the king sent Elnathan the son of Achbor and certain men with him into Egypt. +\v 23 They fetched Uriah out of Egypt and brought him to Jehoiakim the king, who killed him with the sword and cast his dead body into the graves of the common people. +\p +\v 24 But the hand of Ahikam the son of Shaphan was with Jeremiah, so that they didn’t give him into the hand of the people to put him to death. +\c 27 +\p +\v 1 In the beginning of the reign of Jehoiakim the son of Josiah, king of Judah, this word came to Jeremiah from Yahweh, saying, +\v 2 Yahweh says to me: “Make bonds and bars, and put them on your neck. +\v 3 Then send them to the king of Edom, to the king of Moab, to the king of the children of Ammon, to the king of Tyre, and to the king of Sidon, by the hand of the messengers who come to Jerusalem to Zedekiah king of Judah. +\v 4 Give them a command to their masters, saying, ‘Yahweh of Armies, the God of Israel says, “You shall tell your masters: +\v 5 ‘I have made the earth, the men, and the animals that are on the surface of the earth by my great power and by my outstretched arm. I give it to whom it seems right to me. +\v 6 Now I have given all these lands into the hand of Nebuchadnezzar the king of Babylon, my servant. I have also given the animals of the field to him to serve him. +\v 7 All the nations will serve him, his son, and his son’s son, until the time of his own land comes. Then many nations and great kings will make him their bondservant. +\p +\v 8 “‘“‘It will happen that I will punish the nation and the kingdom which will not serve the same Nebuchadnezzar king of Babylon, and that will not put their neck under the yoke of the king of Babylon,’ says Yahweh, ‘with the sword, with famine, and with pestilence, until I have consumed them by his hand. +\v 9 But as for you, don’t listen to your prophets, to your diviners, to your dreams, to your soothsayers, or to your sorcerers, who speak to you, saying, “You shall not serve the king of Babylon;” +\v 10 for they prophesy a lie to you, to remove you far from your land, so that I would drive you out, and you would perish. +\v 11 But the nation that brings their neck under the yoke of the king of Babylon and serves him, that nation I will let remain in their own land,’ says Yahweh; ‘and they will till it and dwell in it.’”’” +\p +\v 12 I spoke to Zedekiah king of Judah according to all these words, saying, “Bring your necks under the yoke of the king of Babylon, and serve him and his people, and live. +\v 13 Why will you die, you and your people, by the sword, by the famine, and by the pestilence, as Yahweh has spoken concerning the nation that will not serve the king of Babylon? +\v 14 Don’t listen to the words of the prophets who speak to you, saying, ‘You shall not serve the king of Babylon;’ for they prophesy a lie to you. +\v 15 For I have not sent them,” says Yahweh, “but they prophesy falsely in my name; that I may drive you out, and that you may perish, you, and the prophets who prophesy to you.” +\p +\v 16 Also I spoke to the priests and to all this people, saying, Yahweh says, “Don’t listen to the words of your prophets who prophesy to you, saying, ‘Behold, the vessels of Yahweh’s house will now shortly be brought again from Babylon;’ for they prophesy a lie to you. +\v 17 Don’t listen to them. Serve the king of Babylon, and live. Why should this city become a desolation? +\v 18 But if they are prophets, and if Yahweh’s word is with them, let them now make intercession to Yahweh of Armies, that the vessels which are left in Yahweh’s house, in the house of the king of Judah, and at Jerusalem, don’t go to Babylon. +\v 19 For Yahweh of Armies says concerning the pillars, concerning the sea, concerning the bases, and concerning the rest of the vessels that are left in this city, +\v 20 which Nebuchadnezzar king of Babylon didn’t take when he carried away captive Jeconiah the son of Jehoiakim, king of Judah, from Jerusalem to Babylon, and all the nobles of Judah and Jerusalem— +\v 21 yes, Yahweh of Armies, the God of Israel, says concerning the vessels that are left in Yahweh’s house, and in the house of the king of Judah, and at Jerusalem: +\v 22 ‘They will be carried to Babylon, and there they will be, until the day that I visit them,’ says Yahweh; ‘then I will bring them up, and restore them to this place.’” +\c 28 +\p +\v 1 That same year, in the beginning of the reign of Zedekiah king of Judah, in the fourth year, in the fifth month, Hananiah the son of Azzur, the prophet, who was of Gibeon, spoke to me in Yahweh’s house, in the presence of the priests and of all the people, saying, +\v 2 “Yahweh of Armies, the God of Israel, says, ‘I have broken the yoke of the king of Babylon. +\v 3 Within two full years I will bring again into this place all the vessels of Yahweh’s house that Nebuchadnezzar king of Babylon took away from this place and carried to Babylon. +\v 4 I will bring again to this place Jeconiah the son of Jehoiakim, king of Judah, with all the captives of Judah, who went to Babylon,’ says Yahweh; ‘for I will break the yoke of the king of Babylon.’” +\p +\v 5 Then the prophet Jeremiah said to the prophet Hananiah in the presence of the priests, and in the presence of all the people who stood in Yahweh’s house, +\v 6 even the prophet Jeremiah said, “Amen! May Yahweh do so. May Yahweh perform your words which you have prophesied, to bring again the vessels of Yahweh’s house, and all those who are captives, from Babylon to this place. +\v 7 Nevertheless listen now to this word that I speak in your ears, and in the ears of all the people: +\v 8 The prophets who have been before me and before you of old prophesied against many countries, and against great kingdoms, of war, of evil, and of pestilence. +\v 9 As for the prophet who prophesies of peace, when the word of the prophet happens, then the prophet will be known, that Yahweh has truly sent him.” +\p +\v 10 Then Hananiah the prophet took the bar from off the prophet Jeremiah’s neck, and broke it. +\v 11 Hananiah spoke in the presence of all the people, saying, “Yahweh says: ‘Even so I will break the yoke of Nebuchadnezzar king of Babylon from off the neck of all the nations within two full years.’” Then the prophet Jeremiah went his way. +\p +\v 12 Then Yahweh’s word came to Jeremiah, after Hananiah the prophet had broken the bar from off the neck of the prophet Jeremiah, saying, +\v 13 “Go, and tell Hananiah, saying, ‘Yahweh says, “You have broken the bars of wood, but you have made in their place bars of iron.” +\v 14 For Yahweh of Armies, the God of Israel says, “I have put a yoke of iron on the neck of all these nations, that they may serve Nebuchadnezzar king of Babylon; and they will serve him. I have also given him the animals of the field.”’” +\p +\v 15 Then the prophet Jeremiah said to Hananiah the prophet, “Listen, Hananiah! Yahweh has not sent you, but you make this people trust in a lie. +\v 16 Therefore Yahweh says, ‘Behold, I will send you away from off the surface of the earth. This year you will die, because you have spoken rebellion against Yahweh.’” +\p +\v 17 So Hananiah the prophet died the same year in the seventh month. +\c 29 +\p +\v 1 Now these are the words of the letter that Jeremiah the prophet sent from Jerusalem to the residue of the elders of the captivity, and to the priests, to the prophets, and to all the people whom Nebuchadnezzar had carried away captive from Jerusalem to Babylon, +\v 2 (after Jeconiah the king, the queen mother, the eunuchs, the princes of Judah and Jerusalem, the craftsmen, and the smiths had departed from Jerusalem), +\v 3 by the hand of Elasah the son of Shaphan and Gemariah the son of Hilkiah, (whom Zedekiah king of Judah sent to Babylon to Nebuchadnezzar king of Babylon). It said: +\pi1 +\v 4 Yahweh of Armies, the God of Israel, says to all the captives whom I have caused to be carried away captive from Jerusalem to Babylon: +\v 5 “Build houses and dwell in them. Plant gardens and eat their fruit. +\v 6 Take wives and father sons and daughters. Take wives for your sons, and give your daughters to husbands, that they may bear sons and daughters. Multiply there, and don’t be diminished. +\v 7 Seek the peace of the city where I have caused you to be carried away captive, and pray to Yahweh for it; for in its peace you will have peace.” +\v 8 For Yahweh of Armies, the God of Israel says: “Don’t let your prophets who are among you and your diviners deceive you. Don’t listen to your dreams which you cause to be dreamed. +\v 9 For they prophesy falsely to you in my name. I have not sent them,” says Yahweh. +\v 10 For Yahweh says, “After seventy years are accomplished for Babylon, I will visit you and perform my good word toward you, in causing you to return to this place. +\v 11 For I know the thoughts that I think toward you,” says Yahweh, “thoughts of peace, and not of evil, to give you hope and a future. +\v 12 You shall call on me, and you shall go and pray to me, and I will listen to you. +\v 13 You shall seek me and find me, when you search for me with all your heart. +\v 14 I will be found by you,” says Yahweh, “and I will turn again your captivity, and I will gather you from all the nations, and from all the places where I have driven you, says Yahweh. I will bring you again to the place from where I caused you to be carried away captive.” +\pi1 +\v 15 Because you have said, “Yahweh has raised us up prophets in Babylon,” +\v 16 Yahweh says concerning the king who sits on David’s throne, and concerning all the people who dwell in this city, your brothers who haven’t gone with you into captivity, +\v 17 Yahweh of Armies says: “Behold, I will send on them the sword, the famine, and the pestilence, and will make them like rotten figs that can’t be eaten, they are so bad. +\v 18 I will pursue after them with the sword, with the famine, and with the pestilence, and will deliver them to be tossed back and forth among all the kingdoms of the earth, to be an object of horror, an astonishment, a hissing, and a reproach among all the nations where I have driven them, +\v 19 because they have not listened to my words,” says Yahweh, “with which I sent to them my servants the prophets, rising up early and sending them; but you would not hear,” says Yahweh. +\pi1 +\v 20 Hear therefore Yahweh’s word, all you captives whom I have sent away from Jerusalem to Babylon. +\v 21 Yahweh of Armies, the God of Israel, says concerning Ahab the son of Kolaiah, and concerning Zedekiah the son of Maaseiah, who prophesy a lie to you in my name: “Behold, I will deliver them into the hand of Nebuchadnezzar king of Babylon; and he will kill them before your eyes. +\v 22 A curse will be taken up about them by all the captives of Judah who are in Babylon, saying, ‘Yahweh make you like Zedekiah and like Ahab, whom the king of Babylon roasted in the fire;’ +\v 23 because they have done foolish things in Israel, and have committed adultery with their neighbors’ wives, and have spoken words in my name falsely, which I didn’t command them. I am he who knows, and am witness,” says Yahweh. +\p +\v 24 Concerning Shemaiah the Nehelamite you shall speak, saying, +\v 25 “Yahweh of Armies, the God of Israel, says, ‘Because you have sent letters in your own name to all the people who are at Jerusalem, and to Zephaniah the son of Maaseiah, the priest, and to all the priests, saying, +\v 26 “Yahweh has made you priest in the place of Jehoiada the priest, that there may be officers in Yahweh’s house, for every man who is crazy and makes himself a prophet, that you should put him in the stocks and in shackles. +\v 27 Now therefore, why have you not rebuked Jeremiah of Anathoth, who makes himself a prophet to you, +\v 28 because he has sent to us in Babylon, saying, The captivity is long. Build houses, and dwell in them. Plant gardens, and eat their fruit?”’” +\p +\v 29 Zephaniah the priest read this letter in the hearing of Jeremiah the prophet. +\v 30 Then Yahweh’s word came to Jeremiah, saying, +\v 31 “Send to all of the captives, saying, ‘Yahweh says concerning Shemaiah the Nehelamite: “Because Shemaiah has prophesied to you, and I didn’t send him, and he has caused you to trust in a lie,” +\v 32 therefore Yahweh says, “Behold, I will punish Shemaiah the Nehelamite and his offspring. He will not have a man to dwell among this people. He won’t see the good that I will do to my people,” says Yahweh, “because he has spoken rebellion against Yahweh.”’” +\c 30 +\p +\v 1 The word that came to Jeremiah from Yahweh, saying, +\v 2 “Yahweh, the God of Israel, says, ‘Write all the words that I have spoken to you in a book. +\v 3 For, behold, the days come,’ says Yahweh, ‘that I will reverse the captivity of my people Israel and Judah,’ says Yahweh. ‘I will cause them to return to the land that I gave to their fathers, and they will possess it.’” +\p +\v 4 These are the words that Yahweh spoke concerning Israel and concerning Judah. +\v 5 For Yahweh says: +\q1 “We have heard a voice of trembling; +\q2 a voice of fear, and not of peace. +\q1 +\v 6 Ask now, and see whether a man travails with child. +\q2 Why do I see every man with his hands on his waist, as a woman in travail, +\q2 and all faces are turned pale? +\q1 +\v 7 Alas, for that day is great, so that none is like it! +\q2 It is even the time of Jacob’s trouble; +\q2 but he will be saved out of it. +\q1 +\v 8 It will come to pass in that day, says Yahweh of Armies, that I will break his yoke from off your neck, +\q2 and will burst your bonds. +\q2 Strangers will no more make them their bondservants; +\q1 +\v 9 but they will serve Yahweh their God, +\q2 and David their king, +\q2 whom I will raise up to them. +\q1 +\v 10 Therefore don’t be afraid, O Jacob my servant, says Yahweh. +\q2 Don’t be dismayed, Israel. +\q1 For, behold, I will save you from afar, +\q2 and save your offspring from the land of their captivity. +\q1 Jacob will return, +\q2 and will be quiet and at ease. +\q2 No one will make him afraid. +\q1 +\v 11 For I am with you, says Yahweh, to save you; +\q2 for I will make a full end of all the nations where I have scattered you, +\q2 but I will not make a full end of you; +\q1 but I will correct you in measure, +\q2 and will in no way leave you unpunished.” +\p +\v 12 For Yahweh says, +\q1 “Your hurt is incurable. +\q2 Your wound is grievous. +\q1 +\v 13 There is no one to plead your cause, +\q2 that you may be bound up. +\q2 You have no healing medicines. +\q1 +\v 14 All your lovers have forgotten you. +\q2 They don’t seek you. +\q1 For I have wounded you with the wound of an enemy, +\q2 with the chastisement of a cruel one, +\q1 for the greatness of your iniquity, +\q2 because your sins were increased. +\q1 +\v 15 Why do you cry over your injury? +\q2 Your pain is incurable. +\q1 For the greatness of your iniquity, +\q2 because your sins have increased, +\q2 I have done these things to you. +\q1 +\v 16 Therefore all those who devour you will be devoured. +\q2 All your adversaries, everyone of them, will go into captivity. +\q1 Those who plunder you will be plunder. +\q2 I will make all who prey on you become prey. +\q1 +\v 17 For I will restore health to you, +\q2 and I will heal you of your wounds,” says Yahweh, +\q1 “because they have called you an outcast, +\q2 saying, ‘It is Zion, whom no man seeks after.’” +\p +\v 18 Yahweh says: +\q1 “Behold, I will reverse the captivity of Jacob’s tents, +\q2 and have compassion on his dwelling places. +\q1 The city will be built on its own hill, +\q2 and the palace will be inhabited in its own place. +\q1 +\v 19 Thanksgiving will proceed out of them +\q2 with the voice of those who make merry. +\q1 I will multiply them, +\q2 and they will not be few; +\q1 I will also glorify them, +\q2 and they will not be small. +\q1 +\v 20 Their children also will be as before, +\q2 and their congregation will be established before me. +\q2 I will punish all who oppress them. +\q1 +\v 21 Their prince will be one of them, +\q2 and their ruler will proceed from among them. +\q1 I will cause him to draw near, +\q2 and he will approach me; +\q2 for who is he who has had boldness to approach me?” says Yahweh. +\q1 +\v 22 “You shall be my people, +\q2 and I will be your God. +\q1 +\v 23 Behold, Yahweh’s storm, his wrath, has gone out, +\q2 a sweeping storm; +\q2 it will burst on the head of the wicked. +\q1 +\v 24 The fierce anger of Yahweh will not return until he has accomplished, +\q2 and until he has performed the intentions of his heart. +\q2 In the latter days you will understand it.” +\c 31 +\p +\v 1 “At that time,” says Yahweh, “I will be the God of all the families of Israel, and they will be my people.” +\p +\v 2 Yahweh says, “The people who survive the sword found favor in the wilderness; even Israel, when I went to cause him to rest.” +\p +\v 3 Yahweh appeared of old to me, saying, +\q1 “Yes, I have loved you with an everlasting love. +\q2 Therefore I have drawn you with loving kindness. +\q1 +\v 4 I will build you again, +\q2 and you will be built, O virgin of Israel. +\q1 You will again be adorned with your tambourines, +\q2 and will go out in the dances of those who make merry. +\q1 +\v 5 Again you will plant vineyards on the mountains of Samaria. +\q2 The planters will plant, +\q2 and will enjoy its fruit. +\q1 +\v 6 For there will be a day that the watchmen on the hills of Ephraim cry, +\q2 ‘Arise! Let’s go up to Zion to Yahweh our God.’” +\p +\v 7 For Yahweh says, +\q1 “Sing with gladness for Jacob, +\q2 and shout for the chief of the nations. +\q1 Publish, praise, and say, +\q2 ‘Yahweh, save your people, +\q2 the remnant of Israel!’ +\q1 +\v 8 Behold, I will bring them from the north country, +\q2 and gather them from the uttermost parts of the earth, +\q1 along with the blind and the lame, +\q2 the woman with child and her who travails with child together. +\q2 They will return as a great company. +\q1 +\v 9 They will come with weeping. +\q2 I will lead them with petitions. +\q1 I will cause them to walk by rivers of waters, +\q2 in a straight way in which they won’t stumble; +\q1 for I am a father to Israel. +\q2 Ephraim is my firstborn. +\b +\q1 +\v 10 “Hear Yahweh’s word, you nations, +\q2 and declare it in the distant islands. Say, +\q1 ‘He who scattered Israel will gather him, +\q2 and keep him, as a shepherd does his flock.’ +\q1 +\v 11 For Yahweh has ransomed Jacob, +\q2 and redeemed him from the hand of him who was stronger than he. +\q1 +\v 12 They will come and sing in the height of Zion, +\q2 and will flow to the goodness of Yahweh, +\q1 to the grain, to the new wine, to the oil, +\q2 and to the young of the flock and of the herd. +\q1 Their soul will be as a watered garden. +\q2 They will not sorrow any more at all. +\q1 +\v 13 Then the virgin will rejoice in the dance, +\q2 the young men and the old together; +\q1 for I will turn their mourning into joy, +\q2 and will comfort them, and make them rejoice from their sorrow. +\q1 +\v 14 I will satiate the soul of the priests with fatness, +\q2 and my people will be satisfied with my goodness,” says Yahweh. +\b +\p +\v 15 Yahweh says: +\q1 “A voice is heard in Ramah, +\q2 lamentation and bitter weeping, +\q1 Rachel weeping for her children. +\q2 She refuses to be comforted for her children, +\q2 because they are no more.” +\p +\v 16 Yahweh says: +\q1 “Refrain your voice from weeping, +\q2 and your eyes from tears, +\q2 for your work will be rewarded,” says Yahweh. +\q2 “They will come again from the land of the enemy. +\q1 +\v 17 There is hope for your latter end,” says Yahweh. +\q2 “Your children will come again to their own territory. +\b +\q1 +\v 18 “I have surely heard Ephraim grieving thus, +\q2 ‘You have chastised me, +\q2 and I was chastised, as an untrained calf. +\q1 Turn me, and I will be turned, +\q2 for you are Yahweh my God. +\q1 +\v 19 Surely after that I was turned. +\q2 I repented. +\q1 After that I was instructed. +\q2 I struck my thigh. +\q1 I was ashamed, yes, even confounded, +\q2 because I bore the reproach of my youth.’ +\q1 +\v 20 Is Ephraim my dear son? +\q2 Is he a darling child? +\q1 For as often as I speak against him, +\q2 I still earnestly remember him. +\q1 Therefore my heart yearns for him. +\q2 I will surely have mercy on him,” says Yahweh. +\b +\q1 +\v 21 “Set up road signs. +\q2 Make guideposts. +\q1 Set your heart toward the highway, +\q2 even the way by which you went. +\q1 Turn again, virgin of Israel. +\q2 Turn again to these your cities. +\q1 +\v 22 How long will you go here and there, +\q2 you backsliding daughter? +\q1 For Yahweh has created a new thing in the earth: +\q2 a woman will encompass a man.” +\b +\p +\v 23 Yahweh of Armies, the God of Israel, says: “Yet again they will use this speech in the land of Judah and in its cities, when I reverse their captivity: ‘Yahweh bless you, habitation of righteousness, mountain of holiness.’ +\v 24 Judah and all its cities will dwell therein together, the farmers, and those who go about with flocks. +\v 25 For I have satiated the weary soul, and I have replenished every sorrowful soul.” +\p +\v 26 On this I awakened, and saw; and my sleep was sweet to me. +\p +\v 27 “Behold, the days come,” says Yahweh, “that I will sow the house of Israel and the house of Judah with the seed of man and with the seed of animal. +\v 28 It will happen that, like as I have watched over them to pluck up and to break down and to overthrow and to destroy and to afflict, so I will watch over them to build and to plant,” says Yahweh. +\v 29 “In those days they will say no more, +\q1 “‘The fathers have eaten sour grapes, +\q2 and the children’s teeth are set on edge.’ +\m +\v 30 But everyone will die for his own iniquity. Every man who eats the sour grapes, his teeth will be set on edge. +\p +\v 31 “Behold, the days come,” says Yahweh, “that I will make a new covenant with the house of Israel, and with the house of Judah, +\v 32 not according to the covenant that I made with their fathers in the day that I took them by the hand to bring them out of the land of Egypt, which covenant of mine they broke, although I was a husband to them,” says Yahweh. +\v 33 “But this is the covenant that I will make with the house of Israel after those days,” says Yahweh: +\q1 “I will put my law in their inward parts, +\q2 and I will write it in their heart. +\q1 I will be their God, +\q2 and they shall be my people. +\q1 +\v 34 They will no longer each teach his neighbor, +\q2 and every man teach his brother, saying, ‘Know Yahweh;’ +\q1 for they will all know me, +\q2 from their least to their greatest,” says Yahweh, +\q1 “for I will forgive their iniquity, +\q2 and I will remember their sin no more.” +\q1 +\v 35 Yahweh, who gives the sun for a light by day, +\q2 and the ordinances of the moon and of the stars for a light by night, +\q1 who stirs up the sea, so that its waves roar— +\q2 Yahweh of Armies is his name, says: +\q1 +\v 36 “If these ordinances depart from before me,” says Yahweh, +\q2 “then the offspring of Israel also will cease from being a nation before me forever.” +\q1 +\v 37 Yahweh says: “If heaven above can be measured, +\q2 and the foundations of the earth searched out beneath, +\q2 then I will also cast off all the offspring of Israel for all that they have done,” says Yahweh. +\p +\v 38 “Behold, the days come,” says Yahweh, “that the city will be built to Yahweh from the tower of Hananel to the gate of the corner. +\v 39 The measuring line will go out further straight onward to the hill Gareb, and will turn toward Goah. +\v 40 The whole valley of the dead bodies and of the ashes, and all the fields to the brook Kidron, to the corner of the horse gate toward the east, will be holy to Yahweh. It will not be plucked up or thrown down any more forever.” +\c 32 +\p +\v 1 This is the word that came to Jeremiah from Yahweh in the tenth year of Zedekiah king of Judah, which was the eighteenth year of Nebuchadnezzar. +\v 2 Now at that time the king of Babylon’s army was besieging Jerusalem. Jeremiah the prophet was shut up in the court of the guard, which was in the king of Judah’s house. +\p +\v 3 For Zedekiah king of Judah had shut him up, saying, “Why do you prophesy, and say, ‘Yahweh says, “Behold, I will give this city into the hand of the king of Babylon, and he will take it; +\v 4 and Zedekiah king of Judah won’t escape out of the hand of the Chaldeans, but will surely be delivered into the hand of the king of Babylon, and will speak with him mouth to mouth, and his eyes will see his eyes; +\v 5 and he will bring Zedekiah to Babylon, and he will be there until I visit him,” says Yahweh, “though you fight with the Chaldeans, you will not prosper?”’” +\p +\v 6 Jeremiah said, “Yahweh’s word came to me, saying, +\v 7 ‘Behold, Hanamel the son of Shallum your uncle will come to you, saying, “Buy my field that is in Anathoth; for the right of redemption is yours to buy it.”’” +\p +\v 8 “So Hanamel my uncle’s son came to me in the court of the guard according to Yahweh’s word, and said to me, ‘Please buy my field that is in Anathoth, which is in the land of Benjamin; for the right of inheritance is yours, and the redemption is yours. Buy it for yourself.’ +\p “Then I knew that this was Yahweh’s word. +\v 9 I bought the field that was in Anathoth of Hanamel my uncle’s son, and weighed him the money, even seventeen shekels\f + \fr 32:9 \ft A shekel is about 10 grams or about 0.35 ounces.\f* of silver. +\v 10 I signed the deed, sealed it, called witnesses, and weighed the money in the balances to him. +\v 11 So I took the deed of the purchase, both that which was sealed, containing the terms and conditions, and that which was open; +\v 12 and I delivered the deed of the purchase to Baruch the son of Neriah, the son of Mahseiah, in the presence of Hanamel my uncle’s son, and in the presence of the witnesses who signed the deed of the purchase, before all the Jews who sat in the court of the guard. +\p +\v 13 “I commanded Baruch before them, saying, +\v 14 Yahweh of Armies, the God of Israel, says: ‘Take these deeds, this deed of the purchase which is sealed, and this deed which is open, and put them in an earthen vessel, that they may last many days.’ +\v 15 For Yahweh of Armies, the God of Israel says: ‘Houses and fields and vineyards will yet again be bought in this land.’ +\p +\v 16 Now after I had delivered the deed of the purchase to Baruch the son of Neriah, I prayed to Yahweh, saying, +\b +\mi +\v 17 “Ah Lord Yahweh! Behold, you have made the heavens and the earth by your great power and by your outstretched arm. There is nothing too hard for you. +\v 18 You show loving kindness to thousands, and repay the iniquity of the fathers into the bosom of their children after them. The great, the mighty God, Yahweh of Armies is your name: +\v 19 great in counsel, and mighty in work; whose eyes are open to all the ways of the children of men, to give everyone according to his ways, and according to the fruit of his doings; +\v 20 who performed signs and wonders in the land of Egypt, even to this day, both in Israel and among other men; and made yourself a name, as it is today; +\v 21 and brought your people Israel out of the land of Egypt with signs, with wonders, with a strong hand, with an outstretched arm, and with great terror; +\v 22 and gave them this land, which you swore to their fathers to give them, a land flowing with milk and honey. +\v 23 They came in and possessed it, but they didn’t obey your voice and didn’t walk in your law. They have done nothing of all that you commanded them to do. Therefore you have caused all this evil to come upon them. +\pi1 +\v 24 “Behold, siege ramps have been built against the city to take it. The city is given into the hand of the Chaldeans who fight against it, because of the sword, of the famine, and of the pestilence. What you have spoken has happened. Behold, you see it. +\v 25 You have said to me, Lord Yahweh, ‘Buy the field for money, and call witnesses;’ whereas the city is given into the hand of the Chaldeans.” +\p +\v 26 Then Yahweh’s word came to Jeremiah, saying, +\v 27 “Behold, I am Yahweh, the God of all flesh. Is there anything too hard for me? +\v 28 Therefore Yahweh says: Behold, I will give this city into the hand of the Chaldeans, and into the hand of Nebuchadnezzar king of Babylon, and he will take it. +\v 29 The Chaldeans, who fight against this city, will come and set this city on fire, and burn it with the houses on whose roofs they have offered incense to Baal, and poured out drink offerings to other gods, to provoke me to anger. +\p +\v 30 “For the children of Israel and the children of Judah have done only that which was evil in my sight from their youth; for the children of Israel have only provoked me to anger with the work of their hands, says Yahweh. +\v 31 For this city has been to me a provocation of my anger and of my wrath from the day that they built it even to this day, so that I should remove it from before my face, +\v 32 because of all the evil of the children of Israel and of the children of Judah, which they have done to provoke me to anger—they, their kings, their princes, their priests, their prophets, the men of Judah, and the inhabitants of Jerusalem. +\v 33 They have turned their backs to me, and not their faces. Although I taught them, rising up early and teaching them, yet they have not listened to receive instruction. +\v 34 But they set their abominations in the house which is called by my name, to defile it. +\v 35 They built the high places of Baal, which are in the valley of the son of Hinnom, to cause their sons and their daughters to pass through fire to Molech, which I didn’t command them. It didn’t even come into my mind, that they should do this abomination, to cause Judah to sin.” +\p +\v 36 Now therefore Yahweh, the God of Israel, says concerning this city, about which you say, “It is given into the hand of the king of Babylon by the sword, by the famine, and by the pestilence:” +\v 37 “Behold, I will gather them out of all the countries where I have driven them in my anger, and in my wrath, and in great indignation; and I will bring them again to this place. I will cause them to dwell safely. +\v 38 Then they will be my people, and I will be their God. +\v 39 I will give them one heart and one way, that they may fear me forever, for their good and the good of their children after them. +\v 40 I will make an everlasting covenant with them, that I will not turn away from following them, to do them good. I will put my fear in their hearts, that they may not depart from me. +\v 41 Yes, I will rejoice over them to do them good, and I will plant them in this land assuredly with my whole heart and with my whole soul.” +\p +\v 42 For Yahweh says: “Just as I have brought all this great evil on this people, so I will bring on them all the good that I have promised them. +\v 43 Fields will be bought in this land, about which you say, ‘It is desolate, without man or animal. It is given into the hand of the Chaldeans.’ +\v 44 Men will buy fields for money, sign the deeds, seal them, and call witnesses, in the land of Benjamin, and in the places around Jerusalem, in the cities of Judah, in the cities of the hill country, in the cities of the lowland, and in the cities of the South; for I will cause their captivity to be reversed,” says Yahweh. +\c 33 +\nb +\v 1 Moreover Yahweh’s word came to Jeremiah the second time, while he was still locked up in the court of the guard, saying, +\v 2 “Yahweh who does it, Yahweh who forms it to establish it—Yahweh is his name, says: +\v 3 ‘Call to me, and I will answer you, and will show you great and difficult things, which you don’t know.’ +\v 4 For Yahweh, the God of Israel, says concerning the houses of this city and concerning the houses of the kings of Judah, which are broken down to make a defense against the mounds and against the sword: +\v 5 ‘While men come to fight with the Chaldeans, and to fill them with the dead bodies of men, whom I have killed in my anger and in my wrath, and for all whose wickedness I have hidden my face from this city, +\v 6 behold, I will bring it health and healing, and I will cure them; and I will reveal to them abundance of peace and truth. +\v 7 I will restore the fortunes of Judah and Israel, and will build them as at the first. +\v 8 I will cleanse them from all their iniquity by which they have sinned against me. I will pardon all their iniquities by which they have sinned against me and by which they have transgressed against me. +\v 9 This city will be to me for a name of joy, for praise, and for glory, before all the nations of the earth, which will hear all the good that I do to them, and will fear and tremble for all the good and for all the peace that I provide to it.’” +\p +\v 10 Yahweh says: “Yet again there will be heard in this place, about which you say, ‘It is waste, without man and without animal, even in the cities of Judah, and in the streets of Jerusalem, that are desolate, without man and without inhabitant and without animal,’ +\v 11 the voice of joy and the voice of gladness, the voice of the bridegroom and the voice of the bride, the voice of those who say, ‘Give thanks to Yahweh of Armies, for Yahweh is good, for his loving kindness endures forever;’ who bring thanksgiving into Yahweh’s house. For I will cause the captivity of the land to be reversed as at the first,” says Yahweh. +\p +\v 12 Yahweh of Armies says: “Yet again there will be in this place, which is waste, without man and without animal, and in all its cities, a habitation of shepherds causing their flocks to lie down. +\v 13 In the cities of the hill country, in the cities of the lowland, in the cities of the South, in the land of Benjamin, in the places around Jerusalem, and in the cities of Judah, the flocks will again pass under the hands of him who counts them,” says Yahweh. +\p +\v 14 “Behold, the days come,” says Yahweh, “that I will perform that good word which I have spoken concerning the house of Israel and concerning the house of Judah. +\q1 +\v 15 “In those days and at that time, +\q2 I will cause a Branch of righteousness to grow up to David. +\q2 He will execute justice and righteousness in the land. +\q1 +\v 16 In those days Judah will be saved, +\q2 and Jerusalem will dwell safely. +\q1 This is the name by which she will be called: +\q2 Yahweh our righteousness.” +\p +\v 17 For Yahweh says: “David will never lack a man to sit on the throne of the house of Israel. +\v 18 The Levitical priests won’t lack a man before me to offer burnt offerings, to burn meal offerings, and to do sacrifice continually.” +\p +\v 19 Yahweh’s word came to Jeremiah, saying, +\v 20 “Yahweh says: ‘If you can break my covenant of the day and my covenant of the night, so that there will not be day and night in their time, +\v 21 then my covenant could also be broken with David my servant, that he won’t have a son to reign on his throne; and with the Levitical priests, my ministers. +\v 22 As the army of the sky can’t be counted, and the sand of the sea can’t be measured, so I will multiply the offspring of David my servant and the Levites who minister to me.’” +\p +\v 23 Yahweh’s word came to Jeremiah, saying, +\v 24 “Don’t consider what this people has spoken, saying, ‘Has Yahweh cast off the two families which he chose?’ Thus they despise my people, that they should be no more a nation before them.” +\v 25 Yahweh says: “If my covenant of day and night fails, if I have not appointed the ordinances of heaven and earth, +\v 26 then I will also cast away the offspring of Jacob, and of David my servant, so that I will not take of his offspring to be rulers over the offspring of Abraham, Isaac, and Jacob; for I will cause their captivity to be reversed and will have mercy on them.” +\c 34 +\p +\v 1 The word which came to Jeremiah from Yahweh, when Nebuchadnezzar king of Babylon, with all his army, all the kingdoms of the earth that were under his dominion, and all the peoples, were fighting against Jerusalem and against all its cities, saying: +\v 2 “Yahweh, the God of Israel, says, ‘Go, and speak to Zedekiah king of Judah, and tell him, Yahweh says, “Behold, I will give this city into the hand of the king of Babylon and he will burn it with fire. +\v 3 You won’t escape out of his hand, but will surely be taken and delivered into his hand. Your eyes will see the eyes of the king of Babylon, and he will speak with you mouth to mouth. You will go to Babylon.”’ +\p +\v 4 “Yet hear Yahweh’s word, O Zedekiah king of Judah. Yahweh says concerning you, ‘You won’t die by the sword. +\v 5 You will die in peace; and with the burnings of your fathers, the former kings who were before you, so they will make a burning for you. They will lament you, saying, “Ah Lord!” for I have spoken the word,’ says Yahweh.” +\p +\v 6 Then Jeremiah the prophet spoke all these words to Zedekiah king of Judah in Jerusalem, +\v 7 when the king of Babylon’s army was fighting against Jerusalem and against all the cities of Judah that were left, against Lachish and against Azekah; for these alone remained of the cities of Judah as fortified cities. +\p +\v 8 The word came to Jeremiah from Yahweh, after King Zedekiah had made a covenant with all the people who were at Jerusalem, to proclaim liberty to them, +\v 9 that every man should let his male servant, and every man his female servant, who is a Hebrew or a Hebrewess, go free, that no one should make bondservants of them, of a Jew his brother. +\v 10 All the princes and all the people obeyed who had entered into the covenant, that everyone should let his male servant and everyone his female servant go free, that no one should make bondservants of them any more. They obeyed and let them go, +\v 11 but afterwards they turned, and caused the servants and the handmaids whom they had let go free to return, and brought them into subjection for servants and for handmaids. +\p +\v 12 Therefore Yahweh’s word came to Jeremiah from Yahweh, saying, +\v 13 “Yahweh, the God of Israel, says: ‘I made a covenant with your fathers in the day that I brought them out of the land of Egypt, out of the house of bondage, saying: +\v 14 At the end of seven years, every man of you shall release his brother who is a Hebrew, who has been sold to you, and has served you six years. You shall let him go free from you. But your fathers didn’t listen to me, and didn’t incline their ear. +\v 15 You had now turned, and had done that which is right in my eyes, in every man proclaiming liberty to his neighbor. You had made a covenant before me in the house which is called by my name; +\v 16 but you turned and profaned my name, and every man caused his servant and every man his handmaid, whom you had let go free at their pleasure, to return. You brought them into subjection, to be to you for servants and for handmaids.’” +\p +\v 17 Therefore Yahweh says: “You have not listened to me, to proclaim liberty, every man to his brother, and every man to his neighbor. Behold, I proclaim to you a liberty,” says Yahweh, “to the sword, to the pestilence, and to the famine. I will make you be tossed back and forth among all the kingdoms of the earth. +\v 18 I will give the men who have transgressed my covenant, who have not performed the words of the covenant which they made before me when they cut the calf in two and passed between its parts: +\v 19 the princes of Judah, the princes of Jerusalem, the eunuchs, the priests, and all the people of the land, who passed between the parts of the calf. +\v 20 I will even give them into the hand of their enemies and into the hand of those who seek their life. Their dead bodies will be food for the birds of the sky and for the animals of the earth. +\p +\v 21 “I will give Zedekiah king of Judah and his princes into the hands of their enemies, into the hands of those who seek their life and into the hands of the king of Babylon’s army, who has gone away from you. +\v 22 Behold, I will command,” says Yahweh, “and cause them to return to this city. They will fight against it, take it, and burn it with fire. I will make the cities of Judah a desolation, without inhabitant.” +\c 35 +\p +\v 1 The word which came to Jeremiah from Yahweh in the days of Jehoiakim the son of Josiah, king of Judah, saying, +\v 2 “Go to the house of the Rechabites, and speak to them, and bring them into Yahweh’s house, into one of the rooms, and give them wine to drink.” +\p +\v 3 Then I took Jaazaniah the son of Jeremiah, the son of Habazziniah, with his brothers, all his sons, and the whole house of the Rechabites; +\v 4 and I brought them into Yahweh’s house, into the room of the sons of Hanan the son of Igdaliah, the man of God, which was by the room of the princes, which was above the room of Maaseiah the son of Shallum, the keeper of the threshold. +\v 5 I set before the sons of the house of the Rechabites bowls full of wine, and cups; and I said to them, “Drink wine!” +\p +\v 6 But they said, “We will drink no wine; for Jonadab the son of Rechab, our father, commanded us, saying, ‘You shall drink no wine, neither you nor your children, forever. +\v 7 You shall not build a house, sow seed, plant a vineyard, or have any; but all your days you shall dwell in tents, that you may live many days in the land in which you live as nomads.’ +\v 8 We have obeyed the voice of Jonadab the son of Rechab, our father, in all that he commanded us, to drink no wine all our days, we, our wives, our sons, or our daughters; +\v 9 and not to build houses for ourselves to dwell in. We have no vineyard, field, or seed; +\v 10 but we have lived in tents, and have obeyed, and done according to all that Jonadab our father commanded us. +\v 11 But when Nebuchadnezzar king of Babylon came up into the land, we said, ‘Come! Let’s go to Jerusalem for fear of the army of the Chaldeans, and for fear of the army of the Syrians; so we will dwell at Jerusalem.’” +\p +\v 12 Then Yahweh’s word came to Jeremiah, saying, +\v 13 “Yahweh of Armies, the God of Israel, says: ‘Go and tell the men of Judah and the inhabitants of Jerusalem, “Will you not receive instruction to listen to my words?” says Yahweh. +\v 14 “The words of Jonadab the son of Rechab that he commanded his sons, not to drink wine, are performed; and to this day they drink none, for they obey their father’s commandment; but I have spoken to you, rising up early and speaking, and you have not listened to me. +\v 15 I have sent also to you all my servants the prophets, rising up early and sending them, saying, ‘Every one of you must return now from his evil way, amend your doings, and don’t go after other gods to serve them. Then you will dwell in the land which I have given to you and to your fathers;’ but you have not inclined your ear, nor listened to me. +\v 16 The sons of Jonadab the son of Rechab have performed the commandment of their father which he commanded them, but this people has not listened to me.”’ +\p +\v 17 “Therefore Yahweh, the God of Armies, the God of Israel, says: ‘Behold, I will bring on Judah and on all the inhabitants of Jerusalem all the evil that I have pronounced against them, because I have spoken to them, but they have not heard; and I have called to them, but they have not answered.’” +\p +\v 18 Jeremiah said to the house of the Rechabites, “Yahweh of Armies, the God of Israel, says: ‘Because you have obeyed the commandment of Jonadab your father, and kept all his precepts, and done according to all that he commanded you,’ +\v 19 therefore Yahweh of Armies, the God of Israel, says: ‘Jonadab the son of Rechab will not lack a man to stand before me forever.’” +\c 36 +\p +\v 1 In the fourth year of Jehoiakim the son of Josiah, king of Judah, this word came to Jeremiah from Yahweh, saying, +\v 2 “Take a scroll of a book, and write in it all the words that I have spoken to you against Israel, against Judah, and against all the nations, from the day I spoke to you, from the days of Josiah even to this day. +\v 3 It may be that the house of Judah will hear all the evil which I intend to do to them, that they may each return from his evil way; that I may forgive their iniquity and their sin.” +\p +\v 4 Then Jeremiah called Baruch the son of Neriah; and Baruch wrote from the mouth of Jeremiah all Yahweh’s words, which he had spoken to him, on a scroll of a book. +\v 5 Jeremiah commanded Baruch, saying, “I am restricted. I can’t go into Yahweh’s house. +\v 6 Therefore you go, and read from the scroll which you have written from my mouth, Yahweh’s words, in the ears of the people in Yahweh’s house on the fast day. Also you shall read them in the ears of all Judah who come out of their cities. +\v 7 It may be they will present their supplication before Yahweh, and will each return from his evil way; for Yahweh has pronounced great anger and wrath against this people.” +\p +\v 8 Baruch the son of Neriah did according to all that Jeremiah the prophet commanded him, reading in the book Yahweh’s words in Yahweh’s house. +\v 9 Now in the fifth year of Jehoiakim the son of Josiah, king of Judah, in the ninth month, all the people in Jerusalem and all the people who came from the cities of Judah to Jerusalem, proclaimed a fast before Yahweh. +\v 10 Then Baruch read the words of Jeremiah from the book in Yahweh’s house, in the room of Gemariah the son of Shaphan the scribe, in the upper court, at the entry of the new gate of Yahweh’s house, in the ears of all the people. +\p +\v 11 When Micaiah the son of Gemariah, the son of Shaphan, had heard out of the book all Yahweh’s words, +\v 12 he went down into the king’s house, into the scribe’s room; and behold, all the princes were sitting there, Elishama the scribe, Delaiah the son of Shemaiah, Elnathan the son of Achbor, Gemariah the son of Shaphan, Zedekiah the son of Hananiah, and all the princes. +\v 13 Then Micaiah declared to them all the words that he had heard, when Baruch read the book in the ears of the people. +\v 14 Therefore all the princes sent Jehudi the son of Nethaniah, the son of Shelemiah, the son of Cushi, to Baruch, saying, “Take in your hand the scroll in which you have read in the ears of the people, and come.” +\p So Baruch the son of Neriah took the scroll in his hand, and came to them. +\v 15 They said to him, “Sit down now, and read it in our hearing.” +\p So Baruch read it in their hearing. +\p +\v 16 Now when they had heard all the words, they turned in fear one toward another, and said to Baruch, “We will surely tell the king of all these words.” +\v 17 They asked Baruch, saying, “Tell us now, how did you write all these words at his mouth?” +\p +\v 18 Then Baruch answered them, “He dictated all these words to me with his mouth, and I wrote them with ink in the book.” +\p +\v 19 Then the princes said to Baruch, “You and Jeremiah go hide. Don’t let anyone know where you are.” +\p +\v 20 They went in to the king into the court, but they had laid up the scroll in the room of Elishama the scribe. Then they told all the words in the hearing of the king. +\v 21 So the king sent Jehudi to get the scroll, and he took it out of the room of Elishama the scribe. Jehudi read it in the hearing of the king, and in the hearing of all the princes who stood beside the king. +\v 22 Now the king was sitting in the winter house in the ninth month, and there was a fire in the brazier burning before him. +\v 23 When Jehudi had read three or four columns, the king cut it with the penknife, and cast it into the fire that was in the brazier, until all the scroll was consumed in the fire that was in the brazier. +\v 24 The king and his servants who heard all these words were not afraid, and didn’t tear their garments. +\v 25 Moreover Elnathan and Delaiah and Gemariah had made intercession to the king that he would not burn the scroll; but he would not listen to them. +\v 26 The king commanded Jerahmeel the king’s son, and Seraiah the son of Azriel, and Shelemiah the son of Abdeel, to arrest Baruch the scribe and Jeremiah the prophet; but Yahweh hid them. +\p +\v 27 Then Yahweh’s word came to Jeremiah, after the king had burned the scroll, and the words which Baruch wrote at the mouth of Jeremiah, saying, +\v 28 “Take again another scroll, and write in it all the former words that were in the first scroll, which Jehoiakim the king of Judah has burned. +\v 29 Concerning Jehoiakim king of Judah you shall say, ‘Yahweh says: “You have burned this scroll, saying, “Why have you written therein, saying, ‘The king of Babylon will certainly come and destroy this land, and will cause to cease from there man and animal?’”’ +\v 30 Therefore Yahweh says concerning Jehoiakim king of Judah: “He will have no one to sit on David’s throne. His dead body will be cast out in the day to the heat, and in the night to the frost. +\v 31 I will punish him, his offspring, and his servants for their iniquity. I will bring on them, on the inhabitants of Jerusalem, and on the men of Judah, all the evil that I have pronounced against them, but they didn’t listen.”’” +\p +\v 32 Then Jeremiah took another scroll, and gave it to Baruch the scribe, the son of Neriah, who wrote therein from the mouth of Jeremiah all the words of the book which Jehoiakim king of Judah had burned in the fire; and many similar words were added to them. +\c 37 +\p +\v 1 Zedekiah the son of Josiah reigned as king instead of Coniah the son of Jehoiakim, whom Nebuchadnezzar king of Babylon made king in the land of Judah. +\v 2 But neither he, nor his servants, nor the people of the land, listened to Yahweh’s words, which he spoke by the prophet Jeremiah. +\p +\v 3 Zedekiah the king sent Jehucal the son of Shelemiah and Zephaniah the son of Maaseiah, the priest, to the prophet Jeremiah, saying, “Pray now to Yahweh our God for us.” +\p +\v 4 Now Jeremiah came in and went out among the people, for they had not put him into prison. +\v 5 Pharaoh’s army had come out of Egypt; and when the Chaldeans who were besieging Jerusalem heard news of them, they withdrew from Jerusalem. +\p +\v 6 Then Yahweh’s word came to the prophet Jeremiah, saying, +\v 7 “Yahweh, the God of Israel, says, ‘You shall tell the king of Judah, who sent you to me to inquire of me: “Behold, Pharaoh’s army, which has come out to help you, will return to Egypt into their own land. +\v 8 The Chaldeans will come again, and fight against this city. They will take it and burn it with fire.”’ +\p +\v 9 “Yahweh says, ‘Don’t deceive yourselves, saying, “The Chaldeans will surely depart from us;” for they will not depart. +\v 10 For though you had struck the whole army of the Chaldeans who fight against you, and only wounded men remained among them, they would each rise up in his tent and burn this city with fire.’” +\p +\v 11 When the army of the Chaldeans had withdrawn from Jerusalem for fear of Pharaoh’s army, +\v 12 then Jeremiah went out of Jerusalem to go into the land of Benjamin, to receive his portion there, in the middle of the people. +\v 13 When he was in Benjamin’s gate, a captain of the guard was there, whose name was Irijah, the son of Shelemiah, the son of Hananiah; and he seized Jeremiah the prophet, saying, “You are defecting to the Chaldeans!” +\p +\v 14 Then Jeremiah said, “That is false! I am not defecting to the Chaldeans.” +\p But he didn’t listen to him; so Irijah seized Jeremiah, and brought him to the princes. +\v 15 The princes were angry with Jeremiah, and struck him, and put him in prison in the house of Jonathan the scribe; for they had made that the prison. +\p +\v 16 When Jeremiah had come into the dungeon house and into the cells, and Jeremiah had remained there many days, +\v 17 then Zedekiah the king sent and had him brought out. The king asked him secretly in his house, “Is there any word from Yahweh?” +\p Jeremiah said, “There is.” He also said, “You will be delivered into the hand of the king of Babylon.” +\p +\v 18 Moreover Jeremiah said to King Zedekiah, “How have I sinned against you, against your servants, or against this people, that you have put me in prison? +\v 19 Now where are your prophets who prophesied to you, saying, ‘The king of Babylon will not come against you, nor against this land?’ +\v 20 Now please hear, my lord the king: please let my supplication be presented before you, that you not cause me to return to the house of Jonathan the scribe, lest I die there.” +\p +\v 21 Then Zedekiah the king commanded, and they committed Jeremiah into the court of the guard. They gave him daily a loaf of bread out of the bakers’ street, until all the bread in the city was gone. Thus Jeremiah remained in the court of the guard. +\c 38 +\p +\v 1 Shephatiah the son of Mattan, Gedaliah the son of Pashhur, Jucal the son of Shelemiah, and Pashhur the son of Malchijah heard the words that Jeremiah spoke to all the people, saying, +\v 2 “Yahweh says, ‘He who remains in this city will die by the sword, by the famine, and by the pestilence, but he who goes out to the Chaldeans will live. He will escape with his life and he will live.’ +\v 3 Yahweh says, ‘This city will surely be given into the hand of the army of the king of Babylon, and he will take it.’” +\p +\v 4 Then the princes said to the king, “Please let this man be put to death, because he weakens the hands of the men of war who remain in this city, and the hands of all the people, in speaking such words to them; for this man doesn’t seek the welfare of this people, but harm.” +\p +\v 5 Zedekiah the king said, “Behold, he is in your hand; for the king can’t do anything to oppose you.” +\p +\v 6 Then they took Jeremiah and threw him into the dungeon of Malchijah the king’s son, that was in the court of the guard. They let down Jeremiah with cords. In the dungeon there was no water, but mire; and Jeremiah sank in the mire. +\p +\v 7 Now when Ebedmelech the Ethiopian, a eunuch, who was in the king’s house, heard that they had put Jeremiah in the dungeon (the king was then sitting in Benjamin’s gate), +\v 8 Ebedmelech went out of the king’s house, and spoke to the king, saying, +\v 9 “My lord the king, these men have done evil in all that they have done to Jeremiah the prophet, whom they have cast into the dungeon. He is likely to die in the place where he is, because of the famine; for there is no more bread in the city.” +\p +\v 10 Then the king commanded Ebedmelech the Ethiopian, saying, “Take from here thirty men with you, and take up Jeremiah the prophet out of the dungeon, before he dies.” +\p +\v 11 So Ebedmelech took the men with him, and went into the house of the king under the treasury, and took from there rags and worn-out garments, and let them down by cords into the dungeon to Jeremiah. +\v 12 Ebedmelech the Ethiopian said to Jeremiah, “Now put these rags and worn-out garments under your armpits under the cords.” +\p Jeremiah did so. +\v 13 So they lifted Jeremiah up with the cords, and took him up out of the dungeon; and Jeremiah remained in the court of the guard. +\p +\v 14 Then Zedekiah the king sent and took Jeremiah the prophet to himself into the third entry that is in Yahweh’s house. Then the king said to Jeremiah, “I will ask you something. Hide nothing from me.” +\p +\v 15 Then Jeremiah said to Zedekiah, “If I declare it to you, will you not surely put me to death? If I give you counsel, you will not listen to me.” +\p +\v 16 So Zedekiah the king swore secretly to Jeremiah, saying, “As Yahweh lives, who made our souls, I will not put you to death, neither will I give you into the hand of these men who seek your life.” +\p +\v 17 Then Jeremiah said to Zedekiah, “Yahweh, the God of Armies, the God of Israel, says: ‘If you will go out to the king of Babylon’s princes, then your soul will live, and this city will not be burned with fire. You will live, along with your house. +\v 18 But if you will not go out to the king of Babylon’s princes, then this city will be given into the hand of the Chaldeans, and they will burn it with fire, and you won’t escape out of their hand.’” +\p +\v 19 Zedekiah the king said to Jeremiah, “I am afraid of the Jews who have defected to the Chaldeans, lest they deliver me into their hand, and they mock me.” +\p +\v 20 But Jeremiah said, “They won’t deliver you. Obey, I beg you, Yahweh’s voice, in that which I speak to you; so it will be well with you, and your soul will live. +\v 21 But if you refuse to go out, this is the word that Yahweh has shown me: +\v 22 ‘Behold, all the women who are left in the king of Judah’s house will be brought out to the king of Babylon’s princes, and those women will say, +\q1 “Your familiar friends have turned on you, +\q2 and have prevailed over you. +\q1 Your feet are sunk in the mire, +\q2 they have turned away from you.” +\p +\v 23 They will bring out all your wives and your children to the Chaldeans. You won’t escape out of their hand, but will be taken by the hand of the king of Babylon. You will cause this city to be burned with fire.’” +\p +\v 24 Then Zedekiah said to Jeremiah, “Let no man know of these words, and you won’t die. +\v 25 But if the princes hear that I have talked with you, and they come to you, and tell you, ‘Declare to us now what you have said to the king; don’t hide it from us, and we will not put you to death; also tell us what the king said to you;’ +\v 26 then you shall tell them, ‘I presented my supplication before the king, that he would not cause me to return to Jonathan’s house, to die there.’” +\p +\v 27 Then all the princes came to Jeremiah, and asked him; and he told them according to all these words that the king had commanded. So they stopped speaking with him, for the matter was not perceived. +\p +\v 28 So Jeremiah stayed in the court of the guard until the day that Jerusalem was taken. +\c 39 +\p +\v 1 In the ninth year of Zedekiah king of Judah, in the tenth month, Nebuchadnezzar king of Babylon and all his army came against Jerusalem, and besieged it. +\v 2 In the eleventh year of Zedekiah, in the fourth month, the ninth day of the month, a breach was made in the city. +\v 3 All the princes of the king of Babylon came in, and sat in the middle gate: Nergal Sharezer, Samgarnebo, Sarsechim the Rabsaris, Nergal Sharezer the Rabmag, with all the rest of the princes of the king of Babylon. +\v 4 When Zedekiah the king of Judah and all the men of war saw them, then they fled and went out of the city by night, by the way of the king’s garden, through the gate between the two walls; and he went out toward the Arabah. +\p +\v 5 But the army of the Chaldeans pursued them, and overtook Zedekiah in the plains of Jericho. When they had taken him, they brought him up to Nebuchadnezzar king of Babylon to Riblah in the land of Hamath; and he pronounced judgment on him. +\v 6 Then the king of Babylon killed Zedekiah’s sons in Riblah before his eyes. The king of Babylon also killed all the nobles of Judah. +\v 7 Moreover he put out Zedekiah’s eyes and bound him in fetters, to carry him to Babylon. +\p +\v 8 The Chaldeans burned the king’s house and the people’s houses with fire and broke down the walls of Jerusalem. +\v 9 Then Nebuzaradan the captain of the guard carried away captive into Babylon the rest of the people who remained in the city, the deserters also who fell away to him, and the rest of the people who remained. +\v 10 But Nebuzaradan the captain of the guard left of the poor of the people, who had nothing, in the land of Judah, and gave them vineyards and fields at the same time. +\p +\v 11 Now Nebuchadnezzar king of Babylon commanded Nebuzaradan the captain of the guard concerning Jeremiah, saying, +\v 12 “Take him and take care of him. Do him no harm; but do to him even as he tells you.” +\p +\v 13 So Nebuzaradan the captain of the guard, Nebushazban, Rabsaris, and Nergal Sharezer, Rabmag, and all the chief officers of the king of Babylon +\v 14 sent and took Jeremiah out of the court of the guard, and committed him to Gedaliah the son of Ahikam, the son of Shaphan, that he should bring him home. So he lived among the people. +\p +\v 15 Now Yahweh’s word came to Jeremiah while he was shut up in the court of the guard, saying, +\v 16 “Go, and speak to Ebedmelech the Ethiopian, saying, ‘Yahweh of Armies, the God of Israel, says: “Behold, I will bring my words on this city for evil, and not for good; and they will be accomplished before you in that day. +\v 17 But I will deliver you in that day,” says Yahweh; “and you will not be given into the hand of the men of whom you are afraid. +\v 18 For I will surely save you. You won’t fall by the sword, but you will escape with your life, because you have put your trust in me,” says Yahweh.’” +\c 40 +\p +\v 1 The word which came to Jeremiah from Yahweh, after Nebuzaradan the captain of the guard had let him go from Ramah, when he had taken him being bound in chains among all the captives of Jerusalem and Judah who were carried away captive to Babylon. +\v 2 The captain of the guard took Jeremiah and said to him, “Yahweh your God pronounced this evil on this place; +\v 3 and Yahweh has brought it, and done according as he spoke. Because you have sinned against Yahweh, and have not obeyed his voice, therefore this thing has come on you. +\v 4 Now, behold, I release you today from the chains which are on your hand. If it seems good to you to come with me into Babylon, come, and I will take care of you; but if it seems bad to you to come with me into Babylon, don’t. Behold, all the land is before you. Where it seems good and right to you to go, go there.” +\v 5 Now while he had not yet gone back, “Go back then,” he said, “to Gedaliah the son of Ahikam, the son of Shaphan, whom the king of Babylon has made governor over the cities of Judah, and dwell with him among the people; or go wherever it seems right to you to go.” +\p So the captain of the guard gave him food and a present, and let him go. +\v 6 Then Jeremiah went to Gedaliah the son of Ahikam to Mizpah, and lived with him among the people who were left in the land. +\p +\v 7 Now when all the captains of the forces who were in the fields, even they and their men, heard that the king of Babylon had made Gedaliah the son of Ahikam governor in the land, and had committed to him men, women, children, and of the poorest of the land, of those who were not carried away captive to Babylon, +\v 8 then Ishmael the son of Nethaniah, and Johanan and Jonathan the sons of Kareah, and Seraiah the son of Tanhumeth, and the sons of Ephai the Netophathite, and Jezaniah the son of the Maacathite, they and their men came to Gedaliah to Mizpah. +\v 9 Gedaliah the son of Ahikam the son of Shaphan swore to them and to their men, saying, “Don’t be afraid to serve the Chaldeans. Dwell in the land, and serve the king of Babylon, and it will be well with you. +\v 10 As for me, behold, I will dwell at Mizpah, to stand before the Chaldeans who will come to us; but you, gather wine and summer fruits and oil, and put them in your vessels, and dwell in your cities that you have taken.” +\p +\v 11 Likewise when all the Jews who were in Moab, and among the children of Ammon, and in Edom, and who were in all the countries, heard that the king of Babylon had left a remnant of Judah, and that he had set over them Gedaliah the son of Ahikam, the son of Shaphan, +\v 12 then all the Jews returned out of all places where they were driven, and came to the land of Judah, to Gedaliah, to Mizpah, and gathered very much wine and summer fruits. +\p +\v 13 Moreover Johanan the son of Kareah, and all the captains of the forces who were in the fields, came to Gedaliah to Mizpah, +\v 14 and said to him, “Do you know that Baalis the king of the children of Ammon has sent Ishmael the son of Nethaniah to take your life?” +\p But Gedaliah the son of Ahikam didn’t believe them. +\p +\v 15 Then Johanan the son of Kareah spoke to Gedaliah in Mizpah secretly, saying, “Please let me go, and I will kill Ishmael the son of Nethaniah, and no man will know it. Why should he take your life, that all the Jews who are gathered to you should be scattered, and the remnant of Judah perish?” +\p +\v 16 But Gedaliah the son of Ahikam said to Johanan the son of Kareah, “You shall not do this thing, for you speak falsely of Ishmael.” +\c 41 +\p +\v 1 Now in the seventh month, Ishmael the son of Nethaniah, the son of Elishama, of the royal offspring and one of the chief officers of the king, and ten men with him, came to Gedaliah the son of Ahikam to Mizpah; and there they ate bread together in Mizpah. +\v 2 Then Ishmael the son of Nethaniah arose, and the ten men who were with him, and struck Gedaliah the son of Ahikam the son of Shaphan with the sword and killed him, whom the king of Babylon had made governor over the land. +\v 3 Ishmael also killed all the Jews who were with Gedaliah at Mizpah, and the Chaldean men of war who were found there. +\p +\v 4 The second day after he had killed Gedaliah, and no man knew it, +\v 5 men came from Shechem, from Shiloh, and from Samaria, even eighty men, having their beards shaved and their clothes torn, and having cut themselves, with meal offerings and frankincense in their hand, to bring them to Yahweh’s house. +\v 6 Ishmael the son of Nethaniah went out from Mizpah to meet them, weeping all along as he went, and as he met them, he said to them, “Come to Gedaliah the son of Ahikam.” +\v 7 It was so, when they came into the middle of the city, that Ishmael the son of Nethaniah killed them, and cast them into the middle of the pit, he, and the men who were with him. +\v 8 But ten men were found among those who said to Ishmael, “Don’t kill us; for we have stores hidden in the field, of wheat, and of barley, and of oil, and of honey.” +\p So he stopped, and didn’t kill them among their brothers. +\v 9 Now the pit in which Ishmael cast all the dead bodies of the men whom he had killed, by the side of Gedaliah (this was that which Asa the king had made for fear of Baasha king of Israel), Ishmael the son of Nethaniah filled it with those who were killed. +\p +\v 10 Then Ishmael carried away captive all of the people who were left in Mizpah, even the king’s daughters, and all the people who remained in Mizpah, whom Nebuzaradan the captain of the guard had committed to Gedaliah the son of Ahikam. Ishmael the son of Nethaniah carried them away captive, and departed to go over to the children of Ammon. +\p +\v 11 But when Johanan the son of Kareah, and all the captains of the forces who were with him, heard of all the evil that Ishmael the son of Nethaniah had done, +\v 12 then they took all the men, and went to fight with Ishmael the son of Nethaniah, and found him by the great waters that are in Gibeon. +\v 13 Now when all the people who were with Ishmael saw Johanan the son of Kareah, and all the captains of the forces who were with him, then they were glad. +\v 14 So all the people who Ishmael had carried away captive from Mizpah turned about and came back, and went to Johanan the son of Kareah. +\v 15 But Ishmael the son of Nethaniah escaped from Johanan with eight men, and went to the children of Ammon. +\p +\v 16 Then Johanan the son of Kareah and all the captains of the forces who were with him took all the remnant of the people whom he had recovered from Ishmael the son of Nethaniah, from Mizpah, after he had killed Gedaliah the son of Ahikam—the men of war, with the women, the children, and the eunuchs, whom he had brought back from Gibeon. +\v 17 They departed and lived in Geruth Chimham, which is by Bethlehem, to go to enter into Egypt +\v 18 because of the Chaldeans; for they were afraid of them, because Ishmael the son of Nethaniah had killed Gedaliah the son of Ahikam, whom the king of Babylon made governor over the land. +\c 42 +\p +\v 1 Then all the captains of the forces, and Johanan the son of Kareah, and Jezaniah the son of Hoshaiah, and all the people from the least even to the greatest, came near, +\v 2 and said to Jeremiah the prophet, “Please let our supplication be presented before you, and pray for us to Yahweh your God, even for all this remnant, for we are left but a few of many, as your eyes see us, +\v 3 that Yahweh your God may show us the way in which we should walk, and the things that we should do.” +\p +\v 4 Then Jeremiah the prophet said to them, “I have heard you. Behold, I will pray to Yahweh your God according to your words; and it will happen that whatever thing Yahweh answers you, I will declare it to you. I will keep nothing back from you.” +\p +\v 5 Then they said to Jeremiah, “May Yahweh be a true and faithful witness among us, if we don’t do according to all the word with which Yahweh your God sends you to tell us. +\v 6 Whether it is good, or whether it is bad, we will obey the voice of Yahweh our God, to whom we send you; that it may be well with us, when we obey the voice of Yahweh our God.” +\p +\v 7 After ten days, Yahweh’s word came to Jeremiah. +\v 8 Then he called Johanan the son of Kareah, and all the captains of the forces who were with him, and all the people from the least even to the greatest, +\v 9 and said to them, “Yahweh, the God of Israel, to whom you sent me to present your supplication before him, says: +\v 10 ‘If you will still live in this land, then I will build you, and not pull you down, and I will plant you, and not pluck you up; for I grieve over the distress that I have brought on you. +\v 11 Don’t be afraid of the king of Babylon, of whom you are afraid. Don’t be afraid of him,’ says Yahweh, ‘for I am with you to save you, and to deliver you from his hand. +\v 12 I will grant you mercy, that he may have mercy on you, and cause you to return to your own land. +\p +\v 13 “‘But if you say, “We will not dwell in this land,” so that you don’t obey Yahweh your God’s voice, +\v 14 saying, “No, but we will go into the land of Egypt, where we will see no war, nor hear the sound of the trumpet, nor have hunger of bread; and there we will dwell;”’ +\v 15 now therefore hear Yahweh’s word, O remnant of Judah! Yahweh of Armies, the God of Israel, says, ‘If you indeed set your faces to enter into Egypt, and go to live there, +\v 16 then it will happen that the sword, which you fear, will overtake you there in the land of Egypt; and the famine, about which you are afraid, will follow close behind you there in Egypt; and you will die there. +\v 17 So will it be with all the men who set their faces to go into Egypt to live there. They will die by the sword, by the famine, and by the pestilence. None of them will remain or escape from the evil that I will bring on them.’ +\v 18 For Yahweh of Armies, the God of Israel, says: ‘As my anger and my wrath has been poured out on the inhabitants of Jerusalem, so my wrath will be poured out on you, when you enter into Egypt; and you will be an object of horror, an astonishment, a curse, and a reproach; and you will see this place no more.’ +\p +\v 19 “Yahweh has spoken concerning you, remnant of Judah, ‘Don’t go into Egypt!’ Know certainly that I have testified to you today. +\v 20 For you have dealt deceitfully against your own souls; for you sent me to Yahweh your God, saying, ‘Pray for us to Yahweh our God; and according to all that Yahweh our God says, so declare to us, and we will do it.’ +\v 21 I have declared it to you today; but you have not obeyed Yahweh your God’s voice in anything for which he has sent me to you. +\v 22 Now therefore know certainly that you will die by the sword, by the famine, and by the pestilence in the place where you desire to go to live.” +\c 43 +\p +\v 1 When Jeremiah had finished speaking to all the people all the words of Yahweh their God, with which Yahweh their God had sent him to them, even all these words, +\v 2 then Azariah the son of Hoshaiah, Johanan the son of Kareah, and all the proud men spoke, saying to Jeremiah, “You speak falsely. Yahweh our God has not sent you to say, ‘You shall not go into Egypt to live there;’ +\v 3 but Baruch the son of Neriah has turned you against us, to deliver us into the hand of the Chaldeans, that they may put us to death or carry us away captive to Babylon.” +\p +\v 4 So Johanan the son of Kareah, and all the captains of the forces, and all the people, didn’t obey Yahweh’s voice, to dwell in the land of Judah. +\v 5 But Johanan the son of Kareah and all the captains of the forces took all the remnant of Judah, who had returned from all the nations where they had been driven, to live in the land of Judah— +\v 6 the men, the women, the children, the king’s daughters, and every person who Nebuzaradan the captain of the guard had left with Gedaliah the son of Ahikam, the son of Shaphan; and Jeremiah the prophet, and Baruch the son of Neriah. +\v 7 They came into the land of Egypt, for they didn’t obey Yahweh’s voice; and they came to Tahpanhes. +\p +\v 8 Then Yahweh’s word came to Jeremiah in Tahpanhes, saying, +\v 9 “Take great stones in your hand and hide them in mortar in the brick work which is at the entry of Pharaoh’s house in Tahpanhes, in the sight of the men of Judah. +\v 10 Tell them, Yahweh of Armies, the God of Israel, says: ‘Behold, I will send and take Nebuchadnezzar the king of Babylon, my servant, and will set his throne on these stones that I have hidden; and he will spread his royal pavilion over them. +\v 11 He will come, and will strike the land of Egypt; such as are for death will be put to death, and such as are for captivity to captivity, and such as are for the sword to the sword. +\v 12 I will kindle a fire in the houses of the gods of Egypt. He will burn them, and carry them away captive. He will array himself with the land of Egypt, as a shepherd puts on his garment; and he will go out from there in peace. +\v 13 He will also break the pillars of Beth Shemesh that is in the land of Egypt; and he will burn the houses of the gods of Egypt with fire.’” +\c 44 +\p +\v 1 The word that came to Jeremiah concerning all the Jews who lived in the land of Egypt, who lived at Migdol, and at Tahpanhes, and at Memphis, and in the country of Pathros, saying, +\v 2 “Yahweh of Armies, the God of Israel, says: ‘You have seen all the evil that I have brought on Jerusalem, and on all the cities of Judah. Behold, today they are a desolation, and no man dwells in them, +\v 3 because of their wickedness which they have committed to provoke me to anger, in that they went to burn incense, to serve other gods that they didn’t know, neither they, nor you, nor your fathers. +\v 4 However I sent to you all my servants the prophets, rising up early and sending them, saying, “Oh, don’t do this abominable thing that I hate.” +\v 5 But they didn’t listen and didn’t incline their ear. They didn’t turn from their wickedness, to stop burning incense to other gods. +\v 6 Therefore my wrath and my anger was poured out, and was kindled in the cities of Judah and in the streets of Jerusalem; and they are wasted and desolate, as it is today.’ +\p +\v 7 “Therefore now Yahweh, the God of Armies, the God of Israel, says: ‘Why do you commit great evil against your own souls, to cut off from yourselves man and woman, infant and nursing child out of the middle of Judah, to leave yourselves no one remaining, +\v 8 in that you provoke me to anger with the works of your hands, burning incense to other gods in the land of Egypt where you have gone to live, that you may be cut off, and that you may be a curse and a reproach among all the nations of the earth? +\v 9 Have you forgotten the wickedness of your fathers, the wickedness of the kings of Judah, the wickedness of their wives, your own wickedness, and the wickedness of your wives which they committed in the land of Judah and in the streets of Jerusalem? +\v 10 They are not humbled even to this day, neither have they feared, nor walked in my law, nor in my statutes, that I set before you and before your fathers.’ +\p +\v 11 “Therefore Yahweh of Armies, the God of Israel, says: ‘Behold, I will set my face against you for evil, even to cut off all Judah. +\v 12 I will take the remnant of Judah that have set their faces to go into the land of Egypt to live there, and they will all be consumed. They will fall in the land of Egypt. They will be consumed by the sword and by the famine. They will die, from the least even to the greatest, by the sword and by the famine. They will be an object of horror, an astonishment, a curse, and a reproach. +\v 13 For I will punish those who dwell in the land of Egypt, as I have punished Jerusalem, by the sword, by the famine, and by the pestilence; +\v 14 so that none of the remnant of Judah, who have gone into the land of Egypt to live there, will escape or be left to return into the land of Judah, to which they have a desire to return to dwell there; for no one will return except those who will escape.’” +\p +\v 15 Then all the men who knew that their wives burned incense to other gods, and all the women who stood by, a great assembly, even all the people who lived in the land of Egypt, in Pathros, answered Jeremiah, saying, +\v 16 “As for the word that you have spoken to us in Yahweh’s name, we will not listen to you. +\v 17 But we will certainly perform every word that has gone out of our mouth, to burn incense to the queen of the sky and to pour out drink offerings to her, as we have done, we and our fathers, our kings and our princes, in the cities of Judah and in the streets of Jerusalem; for then we had plenty of food, and were well, and saw no evil. +\v 18 But since we stopped burning incense to the queen of the sky, and pouring out drink offerings to her, we have lacked all things, and have been consumed by the sword and by the famine.” +\p +\v 19 The women said, “When we burned incense to the queen of the sky and poured out drink offerings to her, did we make her cakes to worship her, and pour out drink offerings to her, without our husbands?” +\p +\v 20 Then Jeremiah said to all the people—to the men and to the women, even to all the people who had given him an answer, saying, +\v 21 “The incense that you burned in the cities of Judah, and in the streets of Jerusalem, you and your fathers, your kings and your princes, and the people of the land, didn’t Yahweh remember them, and didn’t it come into his mind? +\v 22 Thus Yahweh could no longer bear it, because of the evil of your doings and because of the abominations which you have committed. Therefore your land has become a desolation, an astonishment, and a curse, without inhabitant, as it is today. +\v 23 Because you have burned incense and because you have sinned against Yahweh, and have not obeyed Yahweh’s voice, nor walked in his law, nor in his statutes, nor in his testimonies; therefore this evil has happened to you, as it is today.” +\p +\v 24 Moreover Jeremiah said to all the people, including all the women, “Hear Yahweh’s word, all Judah who are in the land of Egypt! +\v 25 Yahweh of Armies, the God of Israel, says, ‘You and your wives have both spoken with your mouths, and with your hands have fulfilled it, saying, “We will surely perform our vows that we have vowed, to burn incense to the queen of the sky, and to pour out drink offerings to her.” +\p “‘Establish then your vows, and perform your vows.’ +\p +\v 26 “Therefore hear Yahweh’s word, all Judah who dwell in the land of Egypt: ‘Behold, I have sworn by my great name,’ says Yahweh, ‘that my name will no more be named in the mouth of any man of Judah in all the land of Egypt, saying, “As the Lord Yahweh lives.” +\v 27 Behold, I watch over them for evil, and not for good; and all the men of Judah who are in the land of Egypt will be consumed by the sword and by the famine, until they are all gone. +\v 28 Those who escape the sword will return out of the land of Egypt into the land of Judah few in number. All the remnant of Judah, who have gone into the land of Egypt to live there, will know whose word will stand, mine or theirs. +\p +\v 29 “‘This will be the sign to you,’ says Yahweh, ‘that I will punish you in this place, that you may know that my words will surely stand against you for evil.’ +\v 30 Yahweh says, ‘Behold, I will give Pharaoh Hophra king of Egypt into the hand of his enemies and into the hand of those who seek his life, just as I gave Zedekiah king of Judah into the hand of Nebuchadnezzar king of Babylon, who was his enemy and sought his life.’” +\c 45 +\p +\v 1 The message that Jeremiah the prophet spoke to Baruch the son of Neriah, when he wrote these words in a book at the mouth of Jeremiah, in the fourth year of Jehoiakim the son of Josiah, king of Judah, saying, +\v 2 “Yahweh, the God of Israel, says to you, Baruch: +\v 3 ‘You said, “Woe is me now! For Yahweh has added sorrow to my pain! I am weary with my groaning, and I find no rest.”’ +\p +\v 4 “You shall tell him, Yahweh says: ‘Behold, that which I have built, I will break down, and that which I have planted I will pluck up; and this in the whole land. +\v 5 Do you seek great things for yourself? Don’t seek them; for, behold, I will bring evil on all flesh,’ says Yahweh, ‘but I will let you escape with your life wherever you go.’” +\c 46 +\p +\v 1 Yahweh’s word which came to Jeremiah the prophet concerning the nations. +\p +\v 2 Of Egypt: concerning the army of Pharaoh Necoh king of Egypt, which was by the river Euphrates in Carchemish, which Nebuchadnezzar king of Babylon struck in the fourth year of Jehoiakim the son of Josiah, king of Judah. +\q1 +\v 3 “Prepare the buckler and shield, +\q2 and draw near to battle! +\q1 +\v 4 Harness the horses, and get up, you horsemen, +\q2 and stand up with your helmets. +\q1 Polish the spears, +\q2 put on the coats of mail. +\q1 +\v 5 Why have I seen it? +\q2 They are dismayed and are turned backward. +\q1 Their mighty ones are beaten down, +\q2 have fled in haste, +\q2 and don’t look back. +\q1 Terror is on every side,” +\q2 says Yahweh. +\q1 +\v 6 “Don’t let the swift flee away, +\q2 nor the mighty man escape. +\q1 In the north by the river Euphrates +\q2 they have stumbled and fallen. +\b +\q1 +\v 7 “Who is this who rises up like the Nile, +\q2 like rivers whose waters surge? +\q1 +\v 8 Egypt rises up like the Nile, +\q2 like rivers whose waters surge. +\q1 He says, ‘I will rise up. I will cover the earth. +\q2 I will destroy cities and its inhabitants.’ +\q1 +\v 9 Go up, you horses! +\q2 Rage, you chariots! +\q1 Let the mighty men go out: +\q2 Cush and Put, who handle the shield; +\q2 and the Ludim, who handle and bend the bow. +\q1 +\v 10 For that day is of the Lord, Yahweh of Armies, +\q2 a day of vengeance, +\q2 that he may avenge himself of his adversaries. +\q1 The sword will devour and be satiated, +\q2 and will drink its fill of their blood; +\q2 for the Lord, Yahweh of Armies, has a sacrifice in the north country by the river Euphrates. +\q1 +\v 11 Go up into Gilead, and take balm, virgin daughter of Egypt. +\q2 You use many medicines in vain. +\q2 There is no healing for you. +\q1 +\v 12 The nations have heard of your shame, +\q2 and the earth is full of your cry; +\q2 for the mighty man has stumbled against the mighty, +\q2 they both fall together.” +\b +\p +\v 13 The word that Yahweh spoke to Jeremiah the prophet, how that Nebuchadnezzar king of Babylon should come and strike the land of Egypt: +\q1 +\v 14 “Declare in Egypt, +\q2 publish in Migdol, +\q2 and publish in Memphis and in Tahpanhes; +\q1 say, ‘Stand up, and prepare, +\q2 for the sword has devoured around you.’ +\q1 +\v 15 Why are your strong ones swept away? +\q2 They didn’t stand, because Yahweh pushed them. +\q1 +\v 16 He made many to stumble. +\q2 Yes, they fell on one another. +\q1 They said, ‘Arise! Let’s go again to our own people, +\q2 and to the land of our birth, +\q2 from the oppressing sword.’ +\q1 +\v 17 They cried there, ‘Pharaoh king of Egypt is but a noise; +\q2 he has let the appointed time pass by.’ +\b +\q1 +\v 18 “As I live,” says the King, +\q2 whose name is Yahweh of Armies, +\q1 “surely like Tabor among the mountains, +\q2 and like Carmel by the sea, +\q2 so he will come. +\q1 +\v 19 You daughter who dwells in Egypt, +\q2 furnish yourself to go into captivity; +\q1 for Memphis will become a desolation, +\q2 and will be burned up, +\q2 without inhabitant. +\b +\q1 +\v 20 “Egypt is a very beautiful heifer; +\q2 but destruction out of the north has come. +\q2 It has come. +\q1 +\v 21 Also her hired men in the middle of her are like calves of the stall, +\q2 for they also are turned back. +\q2 They have fled away together. +\q1 They didn’t stand, +\q2 for the day of their calamity has come on them, +\q2 the time of their visitation. +\q1 +\v 22 Its sound will go like the serpent, +\q2 for they will march with an army, +\q2 and come against her with axes, as wood cutters. +\q1 +\v 23 They will cut down her forest,” says Yahweh, +\q2 “though it can’t be searched; +\q1 because they are more than the locusts, +\q2 and are innumerable. +\q1 +\v 24 The daughter of Egypt will be disappointed; +\q2 she will be delivered into the hand of the people of the north.” +\p +\v 25 Yahweh of Armies, the God of Israel, says: “Behold, I will punish Amon of No, and Pharaoh, and Egypt, with her gods and her kings, even Pharaoh, and those who trust in him. +\v 26 I will deliver them into the hand of those who seek their lives, and into the hand of Nebuchadnezzar king of Babylon, and into the hand of his servants. Afterwards it will be inhabited, as in the days of old,” says Yahweh. +\q1 +\v 27 “But don’t you be afraid, Jacob my servant. +\q2 Don’t be dismayed, Israel; +\q1 for, behold, I will save you from afar, +\q2 and your offspring from the land of their captivity. +\q1 Jacob will return, +\q2 and will be quiet and at ease. +\q2 No one will make him afraid. +\q1 +\v 28 Don’t be afraid, O Jacob my servant,” says Yahweh, +\q2 “for I am with you; +\q2 for I will make a full end of all the nations where I have driven you, +\q1 but I will not make a full end of you, +\q2 but I will correct you in measure, +\q2 and will in no way leave you unpunished.” +\c 47 +\p +\v 1 Yahweh’s word that came to Jeremiah the prophet concerning the Philistines, before Pharaoh struck Gaza. +\p +\v 2 Yahweh says: +\q1 “Behold, waters rise up out of the north, +\q2 and will become an overflowing stream, +\q1 and will overflow the land and all that is therein, +\q2 the city and those who dwell therein. +\q1 The men will cry, +\q2 and all the inhabitants of the land will wail. +\q1 +\v 3 At the noise of the stamping of the hoofs of his strong ones, +\q2 at the rushing of his chariots, +\q2 at the rumbling of his wheels, +\q1 the fathers don’t look back for their children +\q2 because their hands are so feeble, +\q1 +\v 4 because of the day that comes to destroy all the Philistines, +\q2 to cut off from Tyre and Sidon every helper who remains; +\q1 for Yahweh will destroy the Philistines, +\q2 the remnant of the isle of Caphtor. +\q1 +\v 5 Baldness has come on Gaza; +\q2 Ashkelon is brought to nothing. +\q1 You remnant of their valley, +\q2 how long will you cut yourself? +\b +\q1 +\v 6 “‘You sword of Yahweh, how long will it be before you are quiet? +\q2 Put yourself back into your scabbard; +\q2 rest, and be still.’ +\b +\q1 +\v 7 “How can you be quiet, +\q2 since Yahweh has given you a command? +\q1 Against Ashkelon, and against the seashore, +\q2 there he has appointed it.” +\c 48 +\p +\v 1 Of Moab. Yahweh of Armies, the God of Israel, says: +\q1 “Woe to Nebo! +\q2 For it is laid waste. +\q1 Kiriathaim is disappointed. +\q2 It is taken. +\q1 Misgab\f + \fr 48:1 \ft or, The stronghold\f* is put to shame +\q2 and broken down. +\q1 +\v 2 The praise of Moab is no more. +\q2 In Heshbon they have devised evil against her: +\q2 ‘Come! Let’s cut her off from being a nation.’ +\q1 You also, Madmen, will be brought to silence. +\q2 The sword will pursue you. +\q1 +\v 3 The sound of a cry from Horonaim, +\q2 desolation and great destruction! +\q1 +\v 4 Moab is destroyed. +\q2 Her little ones have caused a cry to be heard. +\q1 +\v 5 For they will go up by the ascent of Luhith with continual weeping. +\q2 For at the descent of Horonaim they have heard the distress of the cry of destruction. +\q1 +\v 6 Flee! Save your lives! +\q2 Be like the juniper bush in the wilderness. +\q1 +\v 7 For, because you have trusted in your works and in your treasures, +\q2 you also will be taken. +\q1 Chemosh will go out into captivity, +\q2 his priests and his princes together. +\q1 +\v 8 The destroyer will come on every city, +\q2 and no city will escape; +\q1 the valley also will perish, +\q2 and the plain will be destroyed, as Yahweh has spoken. +\q1 +\v 9 Give wings to Moab, +\q2 that she may fly and get herself away: +\q1 and her cities will become a desolation, +\q2 without anyone to dwell in them. +\b +\q1 +\v 10 “Cursed is he who does the work of Yahweh negligently; +\q2 and cursed is he who keeps back his sword from blood. +\b +\q1 +\v 11 “Moab has been at ease from his youth, +\q2 and he has settled on his dregs, +\q1 and has not been emptied from vessel to vessel, +\q2 neither has he gone into captivity; +\q1 therefore his taste remains in him, +\q2 and his scent is not changed. +\q1 +\v 12 Therefore behold, the days come,” says Yahweh, +\q2 “that I will send to him those who pour off, +\q1 and they will pour him off; +\q2 and they will empty his vessels, +\q2 and break their containers in pieces. +\q1 +\v 13 Moab will be ashamed of Chemosh, +\q2 as the house of Israel was ashamed of Bethel, their confidence. +\b +\q1 +\v 14 “How do you say, ‘We are mighty men, +\q2 and valiant men for the war’? +\q1 +\v 15 Moab is laid waste, +\q2 and they have gone up into his cities, +\q2 and his chosen young men have gone down to the slaughter,” +\q2 says the King, whose name is Yahweh of Armies. +\q1 +\v 16 “The calamity of Moab is near to come, +\q2 and his affliction hurries fast. +\q1 +\v 17 All you who are around him, bemoan him; +\q2 and all you who know his name, say, +\q1 ‘How the strong staff is broken, +\q2 the beautiful rod!’ +\b +\q1 +\v 18 “You daughter who dwells in Dibon, +\q2 come down from your glory, +\q2 and sit in thirst; +\q1 for the destroyer of Moab has come up against you. +\q2 He has destroyed your strongholds. +\q1 +\v 19 Inhabitant of Aroer, stand by the way and watch. +\q2 Ask him who flees, and her who escapes; +\q2 say, ‘What has been done?’ +\q1 +\v 20 Moab is disappointed; +\q2 for it is broken down. +\q1 Wail and cry! +\q2 Tell it by the Arnon, that Moab is laid waste. +\q1 +\v 21 Judgment has come on the plain country— +\q2 on Holon, on Jahzah, on Mephaath, +\q2 +\v 22 on Dibon, on Nebo, on Beth Diblathaim, +\q2 +\v 23 on Kiriathaim, on Beth Gamul, on Beth Meon, +\q2 +\v 24 on Kerioth, on Bozrah, +\q2 and on all the cities of the land of Moab, far or near. +\q1 +\v 25 The horn of Moab is cut off, +\q2 and his arm is broken,” says Yahweh. +\b +\q1 +\v 26 “Make him drunk, +\q2 for he magnified himself against Yahweh. +\q1 Moab will wallow in his vomit, +\q2 and he also will be in derision. +\q1 +\v 27 For wasn’t Israel a derision to you? +\q2 Was he found among thieves? +\q1 For as often as you speak of him, +\q2 you shake your head. +\q1 +\v 28 You inhabitants of Moab, leave the cities, and dwell in the rock. +\q2 Be like the dove that makes her nest over the mouth of the abyss. +\b +\q1 +\v 29 “We have heard of the pride of Moab. +\q2 He is very proud in his loftiness, his pride, +\q2 his arrogance, and the arrogance of his heart. +\q1 +\v 30 I know his wrath,” says Yahweh, “that it is nothing; +\q2 his boastings have done nothing. +\q1 +\v 31 Therefore I will wail for Moab. +\q2 Yes, I will cry out for all Moab. +\q2 They will mourn for the men of Kir Heres. +\q1 +\v 32 With more than the weeping of Jazer +\q2 I will weep for you, vine of Sibmah. +\q1 Your branches passed over the sea. +\q2 They reached even to the sea of Jazer. +\q1 The destroyer has fallen on your summer fruits +\q2 and on your vintage. +\q1 +\v 33 Gladness and joy is taken away from the fruitful field +\q2 and from the land of Moab. +\q1 I have caused wine to cease from the wine presses. +\q2 No one will tread with shouting. +\q2 The shouting will be no shouting. +\q1 +\v 34 From the cry of Heshbon even to Elealeh, +\q2 even to Jahaz they have uttered their voice, +\q2 from Zoar even to Horonaim, to Eglath Shelishiyah; +\q2 for the waters of Nimrim will also become desolate. +\q1 +\v 35 Moreover I will cause to cease in Moab,” says Yahweh, +\q2 “him who offers in the high place, +\q2 and him who burns incense to his gods. +\q1 +\v 36 Therefore my heart sounds for Moab like flutes, +\q2 and my heart sounds like flutes for the men of Kir Heres. +\q2 Therefore the abundance that he has gotten has perished. +\q1 +\v 37 For every head is bald, +\q2 and every beard clipped. +\q1 There are cuttings on all the hands, +\q2 and sackcloth on the waist. +\q1 +\v 38 On all the housetops of Moab, +\q2 and in its streets, there is lamentation everywhere; +\q2 for I have broken Moab like a vessel in which no one delights,” says Yahweh. +\q1 +\v 39 “How it is broken down! +\q2 How they wail! +\q1 How Moab has turned the back with shame! +\q2 So will Moab become a derision +\q2 and a terror to all who are around him.” +\q1 +\v 40 For Yahweh says: “Behold, he will fly as an eagle, +\q2 and will spread out his wings against Moab. +\q1 +\v 41 Kerioth is taken, +\q2 and the strongholds are seized. +\q1 The heart of the mighty men of Moab at that day +\q2 will be as the heart of a woman in her pangs. +\q1 +\v 42 Moab will be destroyed from being a people, +\q2 because he has magnified himself against Yahweh. +\q1 +\v 43 Terror, the pit, and the snare are on you, +\q2 inhabitant of Moab,” says Yahweh. +\q1 +\v 44 “He who flees from the terror will fall into the pit; +\q2 and he who gets up out of the pit will be taken in the snare, +\q1 for I will bring on him, even on Moab, +\q2 the year of their visitation,” says Yahweh. +\b +\q1 +\v 45 “Those who fled stand without strength under the shadow of Heshbon; +\q2 for a fire has gone out of Heshbon, +\q2 and a flame from the middle of Sihon, +\q1 and has devoured the corner of Moab, +\q2 and the crown of the head of the tumultuous ones. +\q1 +\v 46 Woe to you, O Moab! +\q2 The people of Chemosh are undone; +\q1 for your sons are taken away captive, +\q2 and your daughters into captivity. +\b +\q1 +\v 47 “Yet I will reverse the captivity of Moab in the latter days,” +\q2 says Yahweh. +\p Thus far is the judgment of Moab. +\c 49 +\p +\v 1 Of the children of Ammon. Yahweh says: +\q1 “Has Israel no sons? +\q2 Has he no heir? +\q1 Why then does Malcam possess Gad, +\q2 and his people dwell in its cities? +\q1 +\v 2 Therefore behold, the days come,” +\q2 says Yahweh, +\q1 “that I will cause an alarm of war to be heard against Rabbah of the children of Ammon, +\q2 and it will become a desolate heap, +\q2 and her daughters will be burned with fire; +\q1 then Israel will possess those who possessed him,” +\q2 says Yahweh. +\q1 +\v 3 “Wail, Heshbon, for Ai is laid waste! +\q2 Cry, you daughters of Rabbah! +\q1 Clothe yourself in sackcloth. +\q2 Lament, and run back and forth among the fences; +\q1 for Malcam will go into captivity, +\q2 his priests and his princes together. +\q1 +\v 4 Why do you boast in the valleys, +\q2 your flowing valley, backsliding daughter? +\q1 You trusted in her treasures, +\q2 saying, ‘Who will come to me?’ +\q1 +\v 5 Behold, I will bring a terror on you,” +\q2 says the Lord, Yahweh of Armies, +\q1 “from all who are around you. +\q2 All of you will be driven completely out, +\q2 and there will be no one to gather together the fugitives. +\b +\q1 +\v 6 “But afterward I will reverse the captivity of the children of Ammon,” +\q2 says Yahweh. +\b +\p +\v 7 Of Edom, Yahweh of Armies says: +\q1 “Is wisdom no more in Teman? +\q2 Has counsel perished from the prudent? +\q2 Has their wisdom vanished? +\q1 +\v 8 Flee! Turn back! +\q2 Dwell in the depths, inhabitants of Dedan; +\q2 for I will bring the calamity of Esau on him when I visit him. +\q1 +\v 9 If grape gatherers came to you, +\q2 would they not leave some gleaning grapes? +\q1 If thieves came by night, +\q2 wouldn’t they steal until they had enough? +\q1 +\v 10 But I have made Esau bare, +\q2 I have uncovered his secret places, +\q2 and he will not be able to hide himself. +\q1 His offspring is destroyed, +\q2 with his brothers and his neighbors; +\q2 and he is no more. +\q1 +\v 11 Leave your fatherless children. +\q2 I will preserve them alive. +\q2 Let your widows trust in me.” +\p +\v 12 For Yahweh says: “Behold, they to whom it didn’t pertain to drink of the cup will certainly drink; and are you he who will altogether go unpunished? You won’t go unpunished, but you will surely drink. +\v 13 For I have sworn by myself,” says Yahweh, “that Bozrah will become an astonishment, a reproach, a waste, and a curse. All its cities will be perpetual wastes.” +\q1 +\v 14 I have heard news from Yahweh, +\q2 and an ambassador is sent among the nations, +\q1 saying, “Gather yourselves together! +\q2 Come against her! +\q2 Rise up to the battle!” +\b +\q1 +\v 15 “For, behold, I have made you small among the nations, +\q2 and despised among men. +\q1 +\v 16 As for your terror, +\q2 the pride of your heart has deceived you, +\q1 O you who dwell in the clefts of the rock, +\q2 who hold the height of the hill, +\q1 though you should make your nest as high as the eagle, +\q2 I will bring you down from there,” says Yahweh. +\q1 +\v 17 “Edom will become an astonishment. +\q2 Everyone who passes by it will be astonished, +\q2 and will hiss at all its plagues. +\q1 +\v 18 As in the overthrow of Sodom and Gomorrah and its neighbor cities,” says Yahweh, +\q2 “no man will dwell there, +\q2 neither will any son of man live therein. +\b +\q1 +\v 19 “Behold, he will come up like a lion from the pride of the Jordan against the strong habitation; +\q2 for I will suddenly make them run away from it, +\q1 and whoever is chosen, +\q2 I will appoint him over it. +\q1 For who is like me? +\q2 Who will appoint me a time? +\q2 Who is the shepherd who will stand before me?” +\q1 +\v 20 Therefore hear the counsel of Yahweh, that he has taken against Edom, +\q2 and his purposes that he has purposed against the inhabitants of Teman: +\q1 Surely they will drag them away, +\q2 the little ones of the flock. +\q2 Surely he will make their habitation desolate over them. +\q1 +\v 21 The earth trembles at the noise of their fall; +\q2 there is a cry, the noise which is heard in the Red Sea. +\q1 +\v 22 Behold, he will come up and fly as the eagle, +\q2 and spread out his wings against Bozrah. +\q2 The heart of the mighty men of Edom at that day will be as the heart of a woman in her pangs. +\b +\p +\v 23 Of Damascus: +\q1 “Hamath and Arpad are confounded, +\q2 for they have heard evil news. +\q2 They have melted away. +\q1 There is sorrow on the sea. +\q2 It can’t be quiet. +\q1 +\v 24 Damascus has grown feeble, +\q2 she turns herself to flee, +\q2 and trembling has seized her. +\q1 Anguish and sorrows have taken hold of her, +\q2 as of a woman in travail. +\q1 +\v 25 How is the city of praise not forsaken, +\q2 the city of my joy? +\q1 +\v 26 Therefore her young men will fall in her streets, +\q2 and all the men of war will be brought to silence in that day,” +\q2 says Yahweh of Armies. +\q1 +\v 27 “I will kindle a fire in the wall of Damascus, +\q2 and it will devour the palaces of Ben Hadad.” +\b +\q1 +\v 28 Of Kedar, and of the kingdoms of Hazor, which Nebuchadnezzar king of Babylon struck, Yahweh says: +\q1 “Arise, go up to Kedar, +\q2 and destroy the children of the east. +\q1 +\v 29 They will take their tents and their flocks. +\q2 they will carry away for themselves their curtains, +\q2 all their vessels, and their camels; +\q2 and they will cry to them, ‘Terror on every side!’ +\q1 +\v 30 Flee! +\q2 Wander far off! +\q1 Dwell in the depths, you inhabitants of Hazor,” says Yahweh; +\q2 “for Nebuchadnezzar king of Babylon has taken counsel against you, +\q2 and has conceived a purpose against you. +\q1 +\v 31 Arise! Go up to a nation that is at ease, +\q2 that dwells without care,” says Yahweh; +\q2 “that has neither gates nor bars, +\q2 that dwells alone. +\q1 +\v 32 Their camels will be a booty, +\q2 and the multitude of their livestock a plunder. +\q1 I will scatter to all winds those who have the corners of their beards cut off; +\q2 and I will bring their calamity from every side of them,” +\q2 says Yahweh. +\q1 +\v 33 Hazor will be a dwelling place of jackals, +\q2 a desolation forever. +\q1 No man will dwell there, +\q2 neither will any son of man live therein.” +\b +\p +\v 34 Yahweh’s word that came to Jeremiah the prophet concerning Elam, in the beginning of the reign of Zedekiah king of Judah, saying, +\v 35 “Yahweh of Armies says: +\q1 ‘Behold, I will break the bow of Elam, +\q2 the chief of their might. +\q1 +\v 36 I will bring on Elam the four winds from the four quarters of the sky, +\q2 and will scatter them toward all those winds. +\q2 There will be no nation where the outcasts of Elam will not come. +\q1 +\v 37 I will cause Elam to be dismayed before their enemies, +\q2 and before those who seek their life. +\q1 I will bring evil on them, even my fierce anger,’ says Yahweh; +\q2 ‘and I will send the sword after them, +\q2 until I have consumed them. +\q1 +\v 38 I will set my throne in Elam, +\q2 and will destroy from there king and princes,’ says Yahweh. +\q1 +\v 39 ‘But it will happen in the latter days +\q2 that I will reverse the captivity of Elam,’ says Yahweh.” +\c 50 +\p +\v 1 The word that Yahweh spoke concerning Babylon, concerning the land of the Chaldeans, by Jeremiah the prophet. +\q1 +\v 2 “Declare among the nations and publish, +\q2 and set up a standard; +\q2 publish, and don’t conceal; +\q1 say, ‘Babylon has been taken, +\q2 Bel is disappointed, +\q2 Merodach is dismayed! +\q1 Her images are disappointed. +\q2 Her idols are dismayed.’ +\q1 +\v 3 For a nation comes up out of the north against her, +\q2 which will make her land desolate, +\q2 and no one will dwell in it. +\q1 They have fled. +\q2 They are gone, +\q2 both man and animal. +\b +\q1 +\v 4 “In those days, and in that time,” says Yahweh, +\q2 “the children of Israel will come, +\q2 they and the children of Judah together; +\q1 they will go on their way weeping, +\q2 and will seek Yahweh their God. +\q1 +\v 5 They will inquire concerning Zion with their faces turned toward it, +\q2 saying, ‘Come, and join yourselves to Yahweh in an everlasting covenant +\q2 that will not be forgotten.’ +\q1 +\v 6 My people have been lost sheep. +\q2 Their shepherds have caused them to go astray. +\q1 They have turned them away on the mountains. +\q2 They have gone from mountain to hill. +\q2 They have forgotten their resting place. +\q1 +\v 7 All who found them have devoured them. +\q2 Their adversaries said, ‘We are not guilty, +\q1 because they have sinned against Yahweh, +\q2 the habitation of righteousness, +\q2 even Yahweh, the hope of their fathers.’ +\b +\q1 +\v 8 “Flee out of the middle of Babylon! +\q2 Go out of the land of the Chaldeans, +\q2 and be as the male goats before the flocks. +\q1 +\v 9 For, behold, I will stir up +\q2 and cause to come up against Babylon a company of great nations from the north country; +\q2 and they will set themselves in array against her. +\q1 She will be taken from there. +\q2 Their arrows will be as of an expert mighty man. +\q2 None of them will return in vain. +\q1 +\v 10 Chaldea will be a prey. +\q2 All who prey on her will be satisfied,” says Yahweh. +\b +\q1 +\v 11 “Because you are glad, +\q2 because you rejoice, +\q1 O you who plunder my heritage, +\q2 because you are wanton as a heifer that treads out the grain, +\q2 and neigh as strong horses, +\q1 +\v 12 your mother will be utterly disappointed. +\q2 She who bore you will be confounded. +\q1 Behold, she will be the least of the nations, +\q2 a wilderness, a dry land, and a desert. +\q1 +\v 13 Because of Yahweh’s wrath she won’t be inhabited, +\q2 but she will be wholly desolate. +\q1 Everyone who goes by Babylon will be astonished, +\q2 and hiss at all her plagues. +\q1 +\v 14 Set yourselves in array against Babylon all around, +\q2 all you who bend the bow; +\q2 shoot at her. +\q1 Spare no arrows, +\q2 for she has sinned against Yahweh. +\q1 +\v 15 Shout against her all around. +\q2 She has submitted herself. +\q2 Her bulwarks have fallen. +\q1 Her walls have been thrown down, +\q2 for it is the vengeance of Yahweh. +\q1 Take vengeance on her. +\q2 As she has done, do to her. +\q1 +\v 16 Cut off the sower from Babylon, +\q2 and him who handles the sickle in the time of harvest. +\q1 For fear of the oppressing sword, +\q2 they will each return to their own people, +\q2 and they will each flee to their own land. +\b +\q1 +\v 17 “Israel is a hunted sheep. +\q2 The lions have driven him away. +\q1 First, the king of Assyria devoured him, +\q2 and now at last Nebuchadnezzar king of Babylon has broken his bones.” +\p +\v 18 Therefore Yahweh of Armies, the God of Israel, says: +\q1 “Behold, I will punish the king of Babylon and his land, +\q2 as I have punished the king of Assyria. +\q1 +\v 19 I will bring Israel again to his pasture, +\q2 and he will feed on Carmel and Bashan. +\q2 His soul will be satisfied on the hills of Ephraim and in Gilead. +\q1 +\v 20 In those days, and in that time,” says Yahweh, +\q2 “the iniquity of Israel will be sought for, +\q2 and there will be none, +\q1 also the sins of Judah, +\q2 and they won’t be found; +\q2 for I will pardon them whom I leave as a remnant. +\b +\q1 +\v 21 “Go up against the land of Merathaim, +\q2 even against it, and against the inhabitants of Pekod. +\q1 Kill and utterly destroy after them,” says Yahweh, +\q2 “and do according to all that I have commanded you. +\q1 +\v 22 A sound of battle is in the land, +\q2 and of great destruction. +\q1 +\v 23 How the hammer of the whole earth is cut apart and broken! +\q2 How Babylon has become a desolation among the nations! +\q1 +\v 24 I have laid a snare for you, +\q2 and you are also taken, Babylon, +\q2 and you weren’t aware. +\q1 You are found, +\q2 and also caught, +\q2 because you have fought against Yahweh. +\q1 +\v 25 Yahweh has opened his armory, +\q2 and has brought out the weapons of his indignation; +\q2 for the Lord, Yahweh of Armies, has a work to do in the land of the Chaldeans. +\q1 +\v 26 Come against her from the farthest border. +\q2 Open her storehouses. +\q2 Cast her up as heaps. +\q1 Destroy her utterly. +\q2 Let nothing of her be left. +\q1 +\v 27 Kill all her bulls. +\q2 Let them go down to the slaughter. +\q1 Woe to them! For their day has come, +\q2 the time of their visitation. +\q1 +\v 28 Listen to those who flee and escape out of the land of Babylon, +\q2 to declare in Zion the vengeance of Yahweh our God, +\q2 the vengeance of his temple. +\b +\q1 +\v 29 “Call together the archers against Babylon, +\q2 all those who bend the bow. +\q1 Encamp against her all around. +\q2 Let none of it escape. +\q1 Pay her back according to her work. +\q2 According to all that she has done, do to her; +\q1 for she has been proud against Yahweh, +\q2 against the Holy One of Israel. +\q1 +\v 30 Therefore her young men will fall in her streets. +\q2 All her men of war will be brought to silence in that day,” says Yahweh. +\q1 +\v 31 “Behold, I am against you, you proud one,” says the Lord, Yahweh of Armies; +\q2 “for your day has come, +\q2 the time that I will visit you. +\q1 +\v 32 The proud one will stumble and fall, +\q2 and no one will raise him up. +\q1 I will kindle a fire in his cities, +\q2 and it will devour all who are around him.” +\q1 +\v 33 Yahweh of Armies says: “The children of Israel and the children of Judah are oppressed together. +\q2 All who took them captive hold them fast. +\q2 They refuse to let them go. +\q1 +\v 34 Their Redeemer is strong. +\q2 Yahweh of Armies is his name. +\q1 He will thoroughly plead their cause, +\q2 that he may give rest to the earth, +\q2 and disquiet the inhabitants of Babylon. +\b +\q1 +\v 35 “A sword is on the Chaldeans,” says Yahweh, +\q2 “and on the inhabitants of Babylon, +\q2 on her princes, +\q2 and on her wise men. +\q1 +\v 36 A sword is on the boasters, +\q2 and they will become fools. +\q1 A sword is on her mighty men, +\q2 and they will be dismayed. +\q1 +\v 37 A sword is on their horses, +\q2 on their chariots, +\q2 and on all the mixed people who are in the middle of her; +\q2 and they will become as women. +\q1 A sword is on her treasures, +\q2 and they will be robbed. +\q1 +\v 38 A drought is on her waters, +\q2 and they will be dried up; +\q1 for it is a land of engraved images, +\q2 and they are mad over idols. +\q1 +\v 39 Therefore the wild animals of the desert +\q2 with the wolves will dwell there. +\q1 The ostriches will dwell therein. +\q2 It will be inhabited no more forever, +\q2 neither will it be lived in from generation to generation. +\q1 +\v 40 As when God overthrew Sodom and Gomorrah and its neighbor cities,” says Yahweh, +\q2 “so no man will dwell there, +\q2 neither will any son of man live therein. +\b +\q1 +\v 41 “Behold, a people comes from the north. +\q2 A great nation and many kings will be stirred up from the uttermost parts of the earth. +\q1 +\v 42 They take up bow and spear. +\q2 They are cruel, and have no mercy. +\q2 Their voice roars like the sea. +\q1 They ride on horses, +\q2 everyone set in array, +\q2 as a man to the battle, +\q2 against you, daughter of Babylon. +\q1 +\v 43 The king of Babylon has heard the news of them, +\q2 and his hands become feeble. +\q1 Anguish has taken hold of him, +\q2 pains as of a woman in labor. +\q1 +\v 44 Behold, the enemy will come up like a lion +\q2 from the thickets of the Jordan against the strong habitation; +\q2 for I will suddenly make them run away from it. +\q1 Whoever is chosen, +\q2 I will appoint him over it, +\q2 for who is like me? +\q1 Who will appoint me a time? +\q2 Who is the shepherd who can stand before me?” +\q1 +\v 45 Therefore hear the counsel of Yahweh +\q2 that he has taken against Babylon; +\q1 and his purposes +\q2 that he has purposed against the land of the Chaldeans: +\q1 Surely they will drag them away, +\q2 even the little ones of the flock. +\q2 Surely he will make their habitation desolate over them. +\q1 +\v 46 The earth trembles at the noise of the taking of Babylon. +\q2 The cry is heard among the nations. +\c 51 +\p +\v 1 Yahweh says: +\q1 “Behold, I will raise up against Babylon, +\q2 and against those who dwell in Lebkamai, a destroying wind. +\q1 +\v 2 I will send to Babylon strangers, who will winnow her. +\q2 They will empty her land; +\q2 for in the day of trouble they will be against her all around. +\q1 +\v 3 Against him who bends, let the archer bend his bow, +\q2 also against him who lifts himself up in his coat of mail. +\q1 Don’t spare her young men! +\q2 Utterly destroy all her army! +\q1 +\v 4 They will fall down slain in the land of the Chaldeans, +\q2 and thrust through in her streets. +\q1 +\v 5 For Israel is not forsaken, nor Judah, by his God, +\q2 by Yahweh of Armies; +\q2 though their land is full of guilt against the Holy One of Israel. +\b +\q1 +\v 6 “Flee out of the middle of Babylon! +\q2 Everyone save his own life! +\q1 Don’t be cut off in her iniquity, +\q2 for it is the time of Yahweh’s vengeance. +\q2 He will render to her a recompense. +\q1 +\v 7 Babylon has been a golden cup in Yahweh’s hand, +\q2 who made all the earth drunk. +\q1 The nations have drunk of her wine; +\q2 therefore the nations have gone mad. +\q1 +\v 8 Babylon has suddenly fallen and been destroyed! +\q2 Wail for her! +\q1 Take balm for her pain. +\q2 Perhaps she may be healed. +\b +\q1 +\v 9 “We would have healed Babylon, +\q2 but she is not healed. +\q1 Forsake her, +\q2 and let’s each go into his own country; +\q1 for her judgment reaches to heaven, +\q2 and is lifted up even to the skies. +\q1 +\v 10 ‘Yahweh has produced our righteousness. +\q2 Come, and let’s declare in Zion the work of Yahweh our God.’ +\b +\q1 +\v 11 “Make the arrows sharp! +\q2 Hold the shields firmly! +\q1 Yahweh has stirred up the spirit of the kings of the Medes, +\q2 because his purpose is against Babylon, to destroy it; +\q1 for it is the vengeance of Yahweh, +\q2 the vengeance of his temple. +\q1 +\v 12 Set up a standard against the walls of Babylon! +\q2 Make the watch strong! +\q1 Set the watchmen, +\q2 and prepare the ambushes; +\q1 for Yahweh has both purposed and done +\q2 that which he spoke concerning the inhabitants of Babylon. +\q1 +\v 13 You who dwell on many waters, abundant in treasures, +\q2 your end has come, the measure of your covetousness. +\q1 +\v 14 Yahweh of Armies has sworn by himself, saying, +\q2 ‘Surely I will fill you with men, +\q2 as with locusts, +\q2 and they will lift up a shout against you.’ +\b +\q1 +\v 15 “He has made the earth by his power. +\q2 He has established the world by his wisdom. +\q2 By his understanding he has stretched out the heavens. +\q1 +\v 16 When he utters his voice, +\q2 there is a roar of waters in the heavens, +\q2 and he causes the vapors to ascend from the ends of the earth. +\q1 He makes lightning for the rain, +\q2 and brings the wind out of his treasuries. +\b +\q1 +\v 17 “Every man has become stupid and without knowledge. +\q2 Every goldsmith is disappointed by his image, +\q1 for his molten images are falsehood, +\q2 and there is no breath in them. +\q1 +\v 18 They are vanity, +\q2 a work of delusion. +\q2 In the time of their visitation, they will perish. +\q1 +\v 19 The portion of Jacob is not like these, +\q2 for he formed all things, +\q2 including the tribe of his inheritance. +\q2 Yahweh of Armies is his name. +\b +\q1 +\v 20 “You are my battle ax and weapons of war. +\q2 With you I will break the nations into pieces. +\q2 With you I will destroy kingdoms. +\q1 +\v 21 With you I will break in pieces +\q2 the horse and his rider. +\q1 +\v 22 With you I will break in pieces +\q2 the chariot and him who rides therein. +\q1 With you I will break in pieces +\q2 man and woman. +\q1 With you I will break in pieces +\q2 the old man and the youth. +\q1 With you I will break in pieces +\q2 the young man and the virgin. +\q1 +\v 23 With you I will break in pieces +\q2 the shepherd and his flock. +\q1 With you I will break in pieces +\q2 the farmer and his yoke. +\q1 With you I will break in pieces +\q2 governors and deputies. +\p +\v 24 “I will render to Babylon and to all the inhabitants of Chaldea all their evil that they have done in Zion in your sight,” says Yahweh. +\q1 +\v 25 “Behold, I am against you, destroying mountain,” says Yahweh, +\q2 “which destroys all the earth. +\q1 I will stretch out my hand on you, +\q2 roll you down from the rocks, +\q2 and will make you a burned mountain. +\q1 +\v 26 They won’t take a cornerstone from you, +\q2 nor a stone for foundations; +\q2 but you will be desolate forever,” says Yahweh. +\b +\q1 +\v 27 “Set up a standard in the land! +\q2 Blow the trumpet among the nations! +\q1 Prepare the nations against her! +\q2 Call together against her the kingdoms of Ararat, Minni, and Ashkenaz! +\q1 Appoint a marshal against her! +\q2 Cause the horses to come up as the swarming locusts! +\q1 +\v 28 Prepare against her the nations, +\q2 the kings of the Medes, its governors, and all its deputies, and all the land of their dominion! +\q1 +\v 29 The land trembles and is in pain; +\q2 for the purposes of Yahweh against Babylon stand, +\q2 to make the land of Babylon a desolation, without inhabitant. +\q1 +\v 30 The mighty men of Babylon have stopped fighting, +\q2 they remain in their strongholds. +\q1 Their might has failed. +\q2 They have become as women. +\q1 Her dwelling places are set on fire. +\q2 Her bars are broken. +\q1 +\v 31 One runner will run to meet another, +\q2 and one messenger to meet another, +\q2 to show the king of Babylon that his city is taken on every quarter. +\q1 +\v 32 So the passages are seized. +\q2 They have burned the reeds with fire. +\q2 The men of war are frightened.” +\p +\v 33 For Yahweh of Armies, the God of Israel says: +\q1 “The daughter of Babylon is like a threshing floor at the time when it is trodden. +\q2 Yet a little while, and the time of harvest comes for her.” +\b +\q1 +\v 34 “Nebuchadnezzar the king of Babylon has devoured me. +\q2 He has crushed me. +\q2 He has made me an empty vessel. +\q1 He has, like a monster, swallowed me up. +\q2 He has filled his mouth with my delicacies. +\q2 He has cast me out. +\q1 +\v 35 May the violence done to me and to my flesh be on Babylon!” +\q2 the inhabitant of Zion will say; and, +\q1 “May my blood be on the inhabitants of Chaldea!” +\q2 will Jerusalem say. +\b +\p +\v 36 Therefore Yahweh says: +\q1 “Behold, I will plead your cause, +\q2 and take vengeance for you. +\q1 I will dry up her sea, +\q2 and make her fountain dry. +\q1 +\v 37 Babylon will become heaps, +\q2 a dwelling place for jackals, +\q2 an astonishment, and a hissing, +\q2 without inhabitant. +\q1 +\v 38 They will roar together like young lions. +\q2 They will growl as lions’ cubs. +\q1 +\v 39 When they are inflamed, I will make their feast, +\q2 and I will make them drunk, +\q1 that they may rejoice, +\q2 and sleep a perpetual sleep, +\q2 and not wake up,” says Yahweh. +\b +\q1 +\v 40 “I will bring them down like lambs to the slaughter, +\q2 like rams with male goats. +\b +\q1 +\v 41 “How Sheshach is taken! +\q2 How the praise of the whole earth is seized! +\q2 How Babylon has become a desolation among the nations! +\q1 +\v 42 The sea has come up on Babylon. +\q2 She is covered with the multitude of its waves. +\q1 +\v 43 Her cities have become a desolation, +\q2 a dry land, and a desert, +\q2 a land in which no man dwells. +\q2 No son of man passes by it. +\q1 +\v 44 I will execute judgment on Bel in Babylon, +\q2 and I will bring out of his mouth that which he has swallowed up. +\q1 The nations will not flow any more to him. +\q2 Yes, the wall of Babylon will fall. +\b +\q1 +\v 45 “My people, go away from the middle of her, +\q2 and each of you save yourselves from Yahweh’s fierce anger. +\q1 +\v 46 Don’t let your heart faint. +\q2 Don’t fear for the news that will be heard in the land. +\q1 For news will come one year, +\q2 and after that in another year news will come, +\q2 and violence in the land, +\q2 ruler against ruler. +\q1 +\v 47 Therefore behold, the days come that I will execute judgment on the engraved images of Babylon; +\q2 and her whole land will be confounded. +\q2 All her slain will fall in the middle of her. +\q1 +\v 48 Then the heavens and the earth, +\q2 and all that is therein, +\q1 will sing for joy over Babylon; +\q2 for the destroyers will come to her from the north,” says Yahweh. +\b +\q1 +\v 49 “As Babylon has caused the slain of Israel to fall, +\q2 so the slain of all the land will fall at Babylon. +\q1 +\v 50 You who have escaped the sword, go! +\q2 Don’t stand still! +\q1 Remember Yahweh from afar, +\q2 and let Jerusalem come into your mind.” +\b +\q1 +\v 51 “We are confounded +\q2 because we have heard reproach. +\q1 Confusion has covered our faces, +\q2 for strangers have come into the sanctuaries of Yahweh’s house.” +\b +\q1 +\v 52 “Therefore behold, the days come,” says Yahweh, +\q2 “that I will execute judgment on her engraved images; +\q2 and through all her land the wounded will groan. +\q1 +\v 53 Though Babylon should mount up to the sky, +\q2 and though she should fortify the height of her strength, +\q2 yet destroyers will come to her from me,” says Yahweh. +\b +\q1 +\v 54 “The sound of a cry comes from Babylon, +\q2 and of great destruction from the land of the Chaldeans! +\q1 +\v 55 For Yahweh lays Babylon waste, +\q2 and destroys out of her the great voice! +\q1 Their waves roar like many waters. +\q2 The noise of their voice is uttered. +\q1 +\v 56 For the destroyer has come on her, +\q2 even on Babylon. +\q1 Her mighty men are taken. +\q2 Their bows are broken in pieces, +\q1 for Yahweh is a God of retribution. +\q2 He will surely repay. +\q1 +\v 57 I will make her princes, her wise men, +\q2 her governors, her deputies, and her mighty men drunk. +\q1 They will sleep a perpetual sleep, +\q2 and not wake up,” +\q2 says the King, whose name is Yahweh of Armies. +\p +\v 58 Yahweh of Armies says: +\q1 “The wide walls of Babylon will be utterly overthrown. +\q2 Her high gates will be burned with fire. +\q1 The peoples will labor for vanity, +\q2 and the nations for the fire; +\q2 and they will be weary.” +\p +\v 59 The word which Jeremiah the prophet commanded Seraiah the son of Neriah, the son of Mahseiah, when he went with Zedekiah the king of Judah to Babylon in the fourth year of his reign. Now Seraiah was chief quartermaster. +\v 60 Jeremiah wrote in a book all the evil that should come on Babylon, even all these words that are written concerning Babylon. +\v 61 Jeremiah said to Seraiah, “When you come to Babylon, then see that you read all these words, +\v 62 and say, ‘Yahweh, you have spoken concerning this place, to cut it off, that no one will dwell in it, neither man nor animal, but that it will be desolate forever.’ +\v 63 It will be, when you have finished reading this book, that you shall bind a stone to it, and cast it into the middle of the Euphrates. +\v 64 Then you shall say, ‘Thus will Babylon sink, and will not rise again because of the evil that I will bring on her; and they will be weary.’” +\p Thus far are the words of Jeremiah. +\c 52 +\p +\v 1 Zedekiah was twenty-one years old when he began to reign. He reigned eleven years in Jerusalem. His mother’s name was Hamutal the daughter of Jeremiah of Libnah. +\v 2 He did that which was evil in Yahweh’s sight, according to all that Jehoiakim had done. +\v 3 For through Yahweh’s anger this happened in Jerusalem and Judah, until he had cast them out from his presence. +\p Zedekiah rebelled against the king of Babylon. +\v 4 In the ninth year of his reign, in the tenth month, in the tenth day of the month, Nebuchadnezzar king of Babylon came, he and all his army, against Jerusalem, and encamped against it; and they built forts against it round about. +\v 5 So the city was besieged to the eleventh year of King Zedekiah. +\p +\v 6 In the fourth month, in the ninth day of the month, the famine was severe in the city, so that there was no bread for the people of the land. +\v 7 Then a breach was made in the city, and all the men of war fled, and went out of the city by night by the way of the gate between the two walls, which was by the king’s garden. Now the Chaldeans were against the city all around. The men of war went toward the Arabah, +\v 8 but the army of the Chaldeans pursued the king, and overtook Zedekiah in the plains of Jericho; and all his army was scattered from him. +\v 9 Then they took the king, and carried him up to the king of Babylon to Riblah in the land of Hamath; and he pronounced judgment on him. +\v 10 The king of Babylon killed the sons of Zedekiah before his eyes. He also killed all the princes of Judah in Riblah. +\v 11 He put out the eyes of Zedekiah; and the king of Babylon bound him in fetters, and carried him to Babylon, and put him in prison until the day of his death. +\p +\v 12 Now in the fifth month, in the tenth day of the month, which was the nineteenth year of King Nebuchadnezzar, king of Babylon, Nebuzaradan the captain of the guard, who stood before the king of Babylon, came into Jerusalem. +\v 13 He burned Yahweh’s house, and the king’s house; and all the houses of Jerusalem, even every great house, he burned with fire. +\v 14 All the army of the Chaldeans, who were with the captain of the guard, broke down all the walls of Jerusalem all around. +\v 15 Then Nebuzaradan the captain of the guard carried away captive of the poorest of the people, and the rest of the people who were left in the city, and those who fell away, who defected to the king of Babylon, and the rest of the multitude. +\v 16 But Nebuzaradan the captain of the guard left of the poorest of the land to be vineyard keepers and farmers. +\p +\v 17 The Chaldeans broke the pillars of bronze that were in Yahweh’s house and the bases and the bronze sea that were in Yahweh’s house in pieces, and carried all of their bronze to Babylon. +\v 18 They also took away the pots, the shovels, the snuffers, the basins, the spoons, and all the vessels of bronze with which they ministered. +\v 19 The captain of the guard took away the cups, the fire pans, the basins, the pots, the lamp stands, the spoons, and the bowls; that which was of gold, as gold, and that which was of silver, as silver. +\p +\v 20 They took the two pillars, the one sea, and the twelve bronze bulls that were under the bases, which King Solomon had made for Yahweh’s house. The bronze of all these vessels was without weight. +\v 21 As for the pillars, the height of the one pillar was eighteen cubits;\f + \fr 52:21 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and a line of twelve cubits encircled it; and its thickness was four fingers. It was hollow. +\v 22 A capital of bronze was on it; and the height of the one capital was five cubits,\f + \fr 52:22 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* with network and pomegranates on the capital all around, all of bronze. The second pillar also had the same, with pomegranates. +\v 23 There were ninety-six pomegranates on the sides; all the pomegranates were one hundred on the network all around. +\p +\v 24 The captain of the guard took Seraiah the chief priest, and Zephaniah the second priest, and the three keepers of the threshold, +\v 25 and out of the city he took an officer who was set over the men of war; and seven men of those who saw the king’s face, who were found in the city; and the scribe of the captain of the army, who mustered the people of the land; and sixty men of the people of the land, who were found in the middle of the city. +\v 26 Nebuzaradan the captain of the guard took them, and brought them to the king of Babylon to Riblah. +\v 27 The king of Babylon struck them, and put them to death at Riblah in the land of Hamath. +\p So Judah was carried away captive out of his land. +\v 28 This is the number of the people whom Nebuchadnezzar carried away captive: +\m in the seventh year, three thousand twenty-three Jews; +\m +\v 29 in the eighteenth year of Nebuchadnezzar, he carried away captive from Jerusalem eight hundred thirty-two persons; +\m +\v 30 in the twenty-third year of Nebuchadnezzar, Nebuzaradan the captain of the guard carried away captive of the Jews seven hundred forty-five people. +\m All the people numbered four thousand six hundred. +\p +\v 31 In the thirty-seventh year of the captivity of Jehoiachin king of Judah, in the twelfth month, in the twenty-fifth day of the month, Evilmerodach king of Babylon, in the first year of his reign, lifted up the head of Jehoiachin king of Judah, and released him from prison. +\v 32 He spoke kindly to him, and set his throne above the throne of the kings who were with him in Babylon, +\v 33 and changed his prison garments. Jehoiachin ate bread before him continually all the days of his life. +\v 34 For his allowance, there was a continual allowance given him by the king of Babylon, every day a portion until the day of his death, all the days of his life. diff --git a/c-sharp/assets/WEB/25LAMengWEBUS.SFM b/c-sharp/assets/WEB/25LAMengWEBUS.SFM new file mode 100644 index 0000000000..d74202bdfd --- /dev/null +++ b/c-sharp/assets/WEB/25LAMengWEBUS.SFM @@ -0,0 +1,714 @@ +\id LAM 25-LAM-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Lamentations +\toc1 The Lamentations of Jeremiah +\toc2 Lamentations +\toc3 Lamentations +\mt2 The +\mt1 Lamentations +\mt2 of Jeremiah +\c 1 +\p +\v 1 How the city sits solitary, +\q2 that was full of people! +\q1 She has become as a widow, +\q2 who was great among the nations! +\q1 She who was a princess among the provinces +\q2 has become a slave! +\b +\q1 +\v 2 She weeps bitterly in the night. +\q2 Her tears are on her cheeks. +\q1 Among all her lovers +\q2 she has no one to comfort her. +\q1 All her friends have dealt treacherously with her. +\q2 They have become her enemies. +\b +\q1 +\v 3 Judah has gone into captivity because of affliction +\q2 and because of great servitude. +\q1 She dwells among the nations. +\q2 She finds no rest. +\q2 All her persecutors overtook her in her distress. +\b +\q1 +\v 4 The roads to Zion mourn, +\q2 because no one comes to the solemn assembly. +\q1 All her gates are desolate. +\q2 Her priests sigh. +\q1 Her virgins are afflicted, +\q2 and she herself is in bitterness. +\b +\q1 +\v 5 Her adversaries have become the head. +\q2 Her enemies prosper; +\q1 for Yahweh\f + \fr 1:5 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* has afflicted her for the multitude of her transgressions. +\q2 Her young children have gone into captivity before the adversary. +\b +\q1 +\v 6 All majesty has departed from the daughter of Zion. +\q2 Her princes have become like deer that find no pasture. +\q2 They have gone without strength before the pursuer. +\b +\q1 +\v 7 Jerusalem remembers in the days of her affliction and of her miseries +\q2 all her pleasant things that were from the days of old; +\q1 when her people fell into the hand of the adversary, +\q2 and no one helped her. +\q1 The adversaries saw her. +\q2 They mocked at her desolations. +\b +\q1 +\v 8 Jerusalem has grievously sinned. +\q2 Therefore she has become unclean. +\q1 All who honored her despise her, +\q2 because they have seen her nakedness. +\q2 Yes, she sighs and turns backward. +\b +\q1 +\v 9 Her filthiness was in her skirts. +\q2 She didn’t remember her latter end. +\q1 Therefore she has come down astoundingly. +\q2 She has no comforter. +\q1 “See, Yahweh, my affliction; +\q2 for the enemy has magnified himself.” +\b +\q1 +\v 10 The adversary has spread out his hand on all her pleasant things; +\q2 for she has seen that the nations have entered into her sanctuary, +\q2 concerning whom you commanded that they should not enter into your assembly. +\b +\q1 +\v 11 All her people sigh. +\q2 They seek bread. +\q2 They have given their pleasant things for food to refresh their soul. +\q1 “Look, Yahweh, and see, +\q2 for I have become despised.” +\b +\q1 +\v 12 “Is it nothing to you, all you who pass by? +\q2 Look, and see if there is any sorrow like my sorrow, +\q2 which is brought on me, +\q2 with which Yahweh has afflicted me in the day of his fierce anger. +\b +\q1 +\v 13 “From on high has he sent fire into my bones, +\q2 and it prevails against them. +\q1 He has spread a net for my feet. +\q2 He has turned me back. +\q2 He has made me desolate and I faint all day long. +\b +\q1 +\v 14 “The yoke of my transgressions is bound by his hand. +\q2 They are knit together. +\q2 They have come up on my neck. +\q2 He made my strength fail. +\q1 The Lord\f + \fr 1:14 \ft The word translated “Lord” is “Adonai.”\f* has delivered me into their hands, +\q2 against whom I am not able to stand. +\b +\q1 +\v 15 “The Lord has set at nothing all my mighty men within me. +\q2 He has called a solemn assembly against me to crush my young men. +\q2 The Lord has trodden the virgin daughter of Judah as in a wine press. +\b +\q1 +\v 16 “For these things I weep. +\q2 My eye, my eye runs down with water, +\q2 because the comforter who should refresh my soul is far from me. +\q1 My children are desolate, +\q2 because the enemy has prevailed.” +\b +\q1 +\v 17 Zion spreads out her hands. +\q2 There is no one to comfort her. +\q1 Yahweh has commanded concerning Jacob, +\q2 that those who are around him should be his adversaries. +\q2 Jerusalem is among them as an unclean thing. +\b +\q1 +\v 18 “Yahweh is righteous, +\q2 for I have rebelled against his commandment. +\q1 Please hear all you peoples, +\q2 and see my sorrow. +\q2 My virgins and my young men have gone into captivity. +\b +\q1 +\v 19 “I called for my lovers, +\q2 but they deceived me. +\q1 My priests and my elders gave up the spirit in the city, +\q2 while they sought food for themselves to refresh their souls. +\b +\q1 +\v 20 “Look, Yahweh; for I am in distress. +\q2 My heart is troubled. +\q1 My heart turns over within me, +\q2 for I have grievously rebelled. +\q1 Abroad, the sword bereaves. +\q2 At home, it is like death. +\b +\q1 +\v 21 “They have heard that I sigh. +\q2 There is no one to comfort me. +\q1 All my enemies have heard of my trouble. +\q2 They are glad that you have done it. +\q1 You will bring the day that you have proclaimed, +\q2 and they will be like me. +\b +\q1 +\v 22 “Let all their wickedness come before you. +\q2 Do to them as you have done to me for all my transgressions. +\q1 For my sighs are many, +\q2 and my heart is faint. +\c 2 +\p +\v 1 How has the Lord covered the daughter of Zion with a cloud in his anger! +\q2 He has cast the beauty of Israel down from heaven to the earth, +\q2 and hasn’t remembered his footstool in the day of his anger. +\b +\q1 +\v 2 The Lord has swallowed up all the dwellings of Jacob +\q2 without pity. +\q1 He has thrown down in his wrath the strongholds of the daughter of Judah. +\q2 He has brought them down to the ground. +\q2 He has profaned the kingdom and its princes. +\b +\q1 +\v 3 He has cut off all the horn of Israel in fierce anger. +\q2 He has drawn back his right hand from before the enemy. +\q1 He has burned up Jacob like a flaming fire, +\q2 which devours all around. +\b +\q1 +\v 4 He has bent his bow like an enemy. +\q2 He has stood with his right hand as an adversary. +\q1 He has killed all that were pleasant to the eye. +\q2 In the tent of the daughter of Zion, he has poured out his wrath like fire. +\b +\q1 +\v 5 The Lord has become as an enemy. +\q2 He has swallowed up Israel. +\q1 He has swallowed up all her palaces. +\q2 He has destroyed his strongholds. +\q2 He has multiplied mourning and lamentation in the daughter of Judah. +\b +\q1 +\v 6 He has violently taken away his tabernacle, +\q2 as if it were a garden. +\q1 He has destroyed his place of assembly. +\q2 Yahweh has caused solemn assembly and Sabbath to be forgotten in Zion. +\q2 In the indignation of his anger, he has despised the king and the priest. +\b +\q1 +\v 7 The Lord has cast off his altar. +\q2 He has abhorred his sanctuary. +\q1 He has given the walls of her palaces into the hand of the enemy. +\q2 They have made a noise in Yahweh’s house, +\q2 as in the day of a solemn assembly. +\b +\q1 +\v 8 Yahweh has purposed to destroy the wall of the daughter of Zion. +\q2 He has stretched out the line. +\q2 He has not withdrawn his hand from destroying; +\q1 He has made the rampart and wall lament. +\q2 They languish together. +\b +\q1 +\v 9 Her gates have sunk into the ground. +\q2 He has destroyed and broken her bars. +\q1 Her king and her princes are among the nations where the law is not. +\q2 Yes, her prophets find no vision from Yahweh. +\b +\q1 +\v 10 The elders of the daughter of Zion sit on the ground. +\q2 They keep silence. +\q1 They have cast up dust on their heads. +\q2 They have clothed themselves with sackcloth. +\q2 The virgins of Jerusalem hang down their heads to the ground. +\b +\q1 +\v 11 My eyes fail with tears. +\q2 My heart is troubled. +\q1 My bile is poured on the earth, +\q2 because of the destruction of the daughter of my people, +\q2 because the young children and the infants swoon in the streets of the city. +\b +\q1 +\v 12 They ask their mothers, +\q2 “Where is grain and wine?” +\q2 when they swoon as the wounded in the streets of the city, +\q2 when their soul is poured out into their mothers’ bosom. +\b +\q1 +\v 13 What shall I testify to you? +\q2 What shall I liken to you, daughter of Jerusalem? +\q1 What shall I compare to you, +\q2 that I may comfort you, virgin daughter of Zion? +\q1 For your breach is as big as the sea. +\q2 Who can heal you? +\b +\q1 +\v 14 Your prophets have seen false and foolish visions for you. +\q2 They have not uncovered your iniquity, +\q2 to reverse your captivity, +\q2 but have seen for you false revelations and causes of banishment. +\b +\q1 +\v 15 All that pass by clap their hands at you. +\q2 They hiss and wag their head at the daughter of Jerusalem, saying, +\q1 “Is this the city that men called ‘The perfection of beauty, +\q2 the joy of the whole earth’?” +\b +\q1 +\v 16 All your enemies have opened their mouth wide against you. +\q2 They hiss and gnash their teeth. +\q2 They say, “We have swallowed her up. +\q1 Certainly this is the day that we looked for. +\q2 We have found it. +\q2 We have seen it.” +\b +\q1 +\v 17 Yahweh has done that which he planned. +\q2 He has fulfilled his word that he commanded in the days of old. +\q1 He has thrown down, +\q2 and has not pitied. +\q1 He has caused the enemy to rejoice over you. +\q2 He has exalted the horn of your adversaries. +\b +\q1 +\v 18 Their heart cried to the Lord. +\q2 O wall of the daughter of Zion, +\q2 let tears run down like a river day and night. +\q1 Give yourself no relief. +\q2 Don’t let your eyes rest. +\b +\q1 +\v 19 Arise, cry out in the night, +\q2 at the beginning of the watches! +\q1 Pour out your heart like water before the face of the Lord. +\q2 Lift up your hands toward him for the life of your young children, +\q2 who faint for hunger at the head of every street. +\b +\q1 +\v 20 “Look, Yahweh, and see to whom you have done thus! +\q2 Should the women eat their offspring, +\q2 the children that they held and bounced on their knees? +\q2 Should the priest and the prophet be killed in the sanctuary of the Lord? +\b +\q1 +\v 21 “The youth and the old man lie on the ground in the streets. +\q2 My virgins and my young men have fallen by the sword. +\q1 You have killed them in the day of your anger. +\q2 You have slaughtered, and not pitied. +\b +\q1 +\v 22 “You have called, as in the day of a solemn assembly, my terrors on every side. +\q2 There was no one that escaped or remained in the day of Yahweh’s anger. +\q2 My enemy has consumed those whom I have cared for and brought up. +\c 3 +\q1 +\v 1 I am the man who has seen affliction +\q2 by the rod of his wrath. +\q1 +\v 2 He has led me and caused me to walk in darkness, +\q2 and not in light. +\q1 +\v 3 Surely he turns his hand against me +\q2 again and again all day long. +\b +\q1 +\v 4 He has made my flesh and my skin old. +\q2 He has broken my bones. +\q1 +\v 5 He has built against me, +\q2 and surrounded me with bitterness and hardship. +\q1 +\v 6 He has made me dwell in dark places, +\q2 as those who have been long dead. +\b +\q1 +\v 7 He has walled me about, so that I can’t go out. +\q2 He has made my chain heavy. +\q1 +\v 8 Yes, when I cry, and call for help, +\q2 he shuts out my prayer. +\q1 +\v 9 He has walled up my ways with cut stone. +\q2 He has made my paths crooked. +\b +\q1 +\v 10 He is to me as a bear lying in wait, +\q2 as a lion in hiding. +\q1 +\v 11 He has turned away my path, +\q2 and pulled me in pieces. +\q2 He has made me desolate. +\q1 +\v 12 He has bent his bow, +\q2 and set me as a mark for the arrow. +\b +\q1 +\v 13 He has caused the shafts of his quiver to enter into my kidneys. +\q2 +\v 14 I have become a derision to all my people, +\q2 and their song all day long. +\q1 +\v 15 He has filled me with bitterness. +\q2 He has stuffed me with wormwood. +\b +\q1 +\v 16 He has also broken my teeth with gravel. +\q2 He has covered me with ashes. +\q1 +\v 17 You have removed my soul far away from peace. +\q2 I forgot prosperity. +\q1 +\v 18 I said, “My strength has perished, +\q2 along with my expectation from Yahweh.” +\b +\q1 +\v 19 Remember my affliction and my misery, +\q2 the wormwood and the bitterness. +\q1 +\v 20 My soul still remembers them, +\q2 and is bowed down within me. +\q1 +\v 21 This I recall to my mind; +\q2 therefore I have hope. +\b +\q1 +\v 22 It is because of Yahweh’s loving kindnesses that we are not consumed, +\q2 because his mercies don’t fail. +\q1 +\v 23 They are new every morning. +\q2 Great is your faithfulness. +\q1 +\v 24 “Yahweh is my portion,” says my soul. +\q2 “Therefore I will hope in him.” +\b +\q1 +\v 25 Yahweh is good to those who wait for him, +\q2 to the soul who seeks him. +\q1 +\v 26 It is good that a man should hope +\q2 and quietly wait for the salvation of Yahweh. +\q2 +\v 27 It is good for a man that he bear the yoke in his youth. +\b +\q1 +\v 28 Let him sit alone and keep silence, +\q2 because he has laid it on him. +\q1 +\v 29 Let him put his mouth in the dust, +\q2 if it is so that there may be hope. +\q1 +\v 30 Let him give his cheek to him who strikes him. +\q2 Let him be filled full of reproach. +\b +\q1 +\v 31 For the Lord will not cast off forever. +\q2 +\v 32 For though he causes grief, +\q2 yet he will have compassion according to the multitude of his loving kindnesses. +\q1 +\v 33 For he does not afflict willingly, +\q2 nor grieve the children of men. +\b +\q1 +\v 34 To crush under foot all the prisoners of the earth, +\q2 +\v 35 to turn away the right of a man before the face of the Most High, +\q2 +\v 36 to subvert a man in his cause, the Lord doesn’t approve. +\b +\q1 +\v 37 Who is he who says, and it comes to pass, +\q2 when the Lord doesn’t command it? +\q1 +\v 38 Doesn’t evil and good come out of the mouth of the Most High? +\q2 +\v 39 Why should a living man complain, +\q2 a man for the punishment of his sins? +\b +\q1 +\v 40 Let us search and try our ways, +\q2 and turn again to Yahweh. +\q1 +\v 41 Let’s lift up our heart with our hands to God\f + \fr 3:41 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* in the heavens. +\q2 +\v 42 “We have transgressed and have rebelled. +\q2 You have not pardoned. +\b +\q1 +\v 43 “You have covered us with anger and pursued us. +\q2 You have killed. +\q2 You have not pitied. +\q1 +\v 44 You have covered yourself with a cloud, +\q2 so that no prayer can pass through. +\q1 +\v 45 You have made us an off-scouring and refuse +\q2 in the middle of the peoples. +\b +\q1 +\v 46 “All our enemies have opened their mouth wide against us. +\q2 +\v 47 Terror and the pit have come on us, +\q2 devastation and destruction.” +\b +\q1 +\v 48 My eye runs down with streams of water, +\q2 for the destruction of the daughter of my people. +\q1 +\v 49 My eye pours down +\q2 and doesn’t cease, +\q2 without any intermission, +\q1 +\v 50 until Yahweh looks down, +\q2 and sees from heaven. +\q1 +\v 51 My eye affects my soul, +\q2 because of all the daughters of my city. +\b +\q1 +\v 52 They have chased me relentlessly like a bird, +\q2 those who are my enemies without cause. +\q1 +\v 53 They have cut off my life in the dungeon, +\q2 and have cast a stone on me. +\q1 +\v 54 Waters flowed over my head. +\q2 I said, “I am cut off.” +\b +\q1 +\v 55 I called on your name, Yahweh, +\q2 out of the lowest dungeon. +\q1 +\v 56 You heard my voice: +\q2 “Don’t hide your ear from my sighing, +\q2 and my cry.” +\b +\q1 +\v 57 You came near in the day that I called on you. +\q2 You said, “Don’t be afraid.” +\b +\q1 +\v 58 Lord, you have pleaded the causes of my soul. +\q2 You have redeemed my life. +\q1 +\v 59 Yahweh, you have seen my wrong. +\q2 Judge my cause. +\q1 +\v 60 You have seen all their vengeance +\q2 and all their plans against me. +\b +\q1 +\v 61 You have heard their reproach, Yahweh, +\q2 and all their plans against me, +\q1 +\v 62 the lips of those that rose up against me, +\q2 and their plots against me all day long. +\q1 +\v 63 You see their sitting down and their rising up. +\q2 I am their song. +\b +\q1 +\v 64 You will pay them back, Yahweh, +\q2 according to the work of their hands. +\q1 +\v 65 You will give them hardness of heart, +\q2 your curse to them. +\q1 +\v 66 You will pursue them in anger, +\q2 and destroy them from under the heavens of Yahweh. +\c 4 +\q1 +\v 1 How the gold has become dim! +\q2 The most pure gold has changed! +\q1 The stones of the sanctuary are poured out +\q2 at the head of every street. +\b +\q1 +\v 2 The precious sons of Zion, +\q2 comparable to fine gold, +\q1 how they are esteemed as earthen pitchers, +\q2 the work of the hands of the potter! +\b +\q1 +\v 3 Even the jackals offer their breast. +\q2 They nurse their young ones. +\q1 But the daughter of my people has become cruel, +\q2 like the ostriches in the wilderness. +\b +\q1 +\v 4 The tongue of the nursing child clings to the roof of his mouth for thirst. +\q2 The young children ask for bread, +\q2 and no one breaks it for them. +\b +\q1 +\v 5 Those who ate delicacies are desolate in the streets. +\q2 Those who were brought up in purple embrace dunghills. +\b +\q1 +\v 6 For the iniquity of the daughter of my people is greater than the sin of Sodom, +\q2 which was overthrown as in a moment. +\q2 No hands were laid on her. +\b +\q1 +\v 7 Her nobles were purer than snow. +\q2 They were whiter than milk. +\q1 They were more ruddy in body than rubies. +\q2 Their polishing was like sapphire. +\b +\q1 +\v 8 Their appearance is blacker than a coal. +\q2 They are not known in the streets. +\q1 Their skin clings to their bones. +\q2 It is withered. +\q2 It has become like wood. +\b +\q1 +\v 9 Those who are killed with the sword are better than those who are killed with hunger; +\q2 for these pine away, stricken through, +\q2 for lack of the fruits of the field. +\b +\q1 +\v 10 The hands of the pitiful women have boiled their own children. +\q2 They were their food in the destruction of the daughter of my people. +\b +\q1 +\v 11 Yahweh has accomplished his wrath. +\q2 He has poured out his fierce anger. +\q1 He has kindled a fire in Zion, +\q2 which has devoured its foundations. +\b +\q1 +\v 12 The kings of the earth didn’t believe, +\q2 neither did all the inhabitants of the world, +\q2 that the adversary and the enemy would enter into the gates of Jerusalem. +\b +\q1 +\v 13 It is because of the sins of her prophets +\q2 and the iniquities of her priests, +\q2 that have shed the blood of the just in the middle of her. +\b +\q1 +\v 14 They wander as blind men in the streets. +\q2 They are polluted with blood, +\q2 So that men can’t touch their garments. +\b +\q1 +\v 15 “Go away!” they cried to them. +\q2 “Unclean! Go away! Go away! Don’t touch! +\q1 When they fled away and wandered, men said among the nations, +\q2 “They can’t live here any more.” +\b +\q1 +\v 16 Yahweh’s anger has scattered them. +\q2 He will not pay attention to them any more. +\q1 They didn’t respect the persons of the priests. +\q2 They didn’t favor the elders. +\b +\q1 +\v 17 Our eyes still fail, +\q2 looking in vain for our help. +\q2 In our watching we have watched for a nation that could not save. +\b +\q1 +\v 18 They hunt our steps, +\q2 so that we can’t go in our streets. +\q1 Our end is near. +\q2 Our days are fulfilled, +\q2 for our end has come. +\b +\q1 +\v 19 Our pursuers were swifter than the eagles of the sky. +\q2 They chased us on the mountains. +\q2 They set an ambush for us in the wilderness. +\b +\q1 +\v 20 The breath of our nostrils, +\q2 the anointed of Yahweh, +\q2 was taken in their pits; +\q1 of whom we said, +\q2 under his shadow we will live among the nations. +\b +\q1 +\v 21 Rejoice and be glad, daughter of Edom, +\q2 who dwells in the land of Uz. +\q1 The cup will pass through to you also. +\q2 You will be drunken, +\q2 and will make yourself naked. +\b +\q1 +\v 22 The punishment of your iniquity is accomplished, daughter of Zion. +\q2 He will no more carry you away into captivity. +\q1 He will visit your iniquity, daughter of Edom. +\q2 He will uncover your sins. +\c 5 +\q1 +\v 1 Remember, Yahweh, what has come on us. +\q2 Look, and see our reproach. +\q1 +\v 2 Our inheritance has been turned over to strangers, +\q2 our houses to aliens. +\q1 +\v 3 We are orphans and fatherless. +\q2 Our mothers are as widows. +\q1 +\v 4 We must pay for water to drink. +\q2 Our wood is sold to us. +\q1 +\v 5 Our pursuers are on our necks. +\q2 We are weary, and have no rest. +\q1 +\v 6 We have given our hands to the Egyptians, +\q2 and to the Assyrians, to be satisfied with bread. +\q1 +\v 7 Our fathers sinned, and are no more. +\q2 We have borne their iniquities. +\q1 +\v 8 Servants rule over us. +\q2 There is no one to deliver us out of their hand. +\q1 +\v 9 We get our bread at the peril of our lives, +\q2 because of the sword in the wilderness. +\q1 +\v 10 Our skin is black like an oven, +\q2 because of the burning heat of famine. +\q1 +\v 11 They ravished the women in Zion, +\q2 the virgins in the cities of Judah. +\q1 +\v 12 Princes were hanged up by their hands. +\q2 The faces of elders were not honored. +\q1 +\v 13 The young men carry millstones. +\q2 The children stumbled under loads of wood. +\q1 +\v 14 The elders have ceased from the gate, +\q2 and the young men from their music. +\q1 +\v 15 The joy of our heart has ceased. +\q2 Our dance is turned into mourning. +\q1 +\v 16 The crown has fallen from our head. +\q2 Woe to us, for we have sinned! +\q1 +\v 17 For this our heart is faint. +\q2 For these things our eyes are dim: +\q1 +\v 18 for the mountain of Zion, which is desolate. +\q2 The foxes walk on it. +\b +\q1 +\v 19 You, Yahweh, remain forever. +\q2 Your throne is from generation to generation. +\q1 +\v 20 Why do you forget us forever, +\q2 and forsake us for so long a time? +\q1 +\v 21 Turn us to yourself, Yahweh, and we will be turned. +\q2 Renew our days as of old. +\q1 +\v 22 But you have utterly rejected us. +\q2 You are very angry against us. diff --git a/c-sharp/assets/WEB/26EZKengWEBUS.SFM b/c-sharp/assets/WEB/26EZKengWEBUS.SFM new file mode 100644 index 0000000000..bd92b9d5d7 --- /dev/null +++ b/c-sharp/assets/WEB/26EZKengWEBUS.SFM @@ -0,0 +1,2232 @@ +\id EZK 6-EZK-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Ezekiel +\toc1 The Book of Ezekiel +\toc2 Ezekiel +\toc3 Ezekiel +\mt2 The Book of +\mt1 Ezekiel +\c 1 +\p +\v 1 Now in the thirtieth year, in the fourth month, in the fifth day of the month, as I was among the captives by the river Chebar, the heavens were opened, and I saw visions of God.\f + \fr 1:1 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\p +\v 2 In the fifth of the month, which was the fifth year of King Jehoiachin’s captivity, +\v 3 Yahweh’s\f + \fr 1:3 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word came to Ezekiel the priest, the son of Buzi, in the land of the Chaldeans by the river Chebar; and Yahweh’s hand was there on him. +\p +\v 4 I looked, and behold,\f + \fr 1:4 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* a stormy wind came out of the north: a great cloud, with flashing lightning, and a brightness around it, and out of the middle of it as it were glowing metal, out of the middle of the fire. +\v 5 Out of its center came the likeness of four living creatures. This was their appearance: They had the likeness of a man. +\v 6 Everyone had four faces, and each one of them had four wings. +\v 7 Their feet were straight feet. The sole of their feet was like the sole of a calf’s foot; and they sparkled like burnished bronze. +\v 8 They had the hands of a man under their wings on their four sides. The four of them had their faces and their wings like this: +\v 9 Their wings were joined to one another. They didn’t turn when they went. Each one went straight forward. +\p +\v 10 As for the likeness of their faces, they had the face of a man. The four of them had the face of a lion on the right side. The four of them had the face of an ox on the left side. The four of them also had the face of an eagle. +\v 11 Such were their faces. Their wings were spread out above. Two wings of each one touched another, and two covered their bodies. +\v 12 Each one went straight forward. Where the spirit was to go, they went. They didn’t turn when they went. +\v 13 As for the likeness of the living creatures, their appearance was like burning coals of fire, like the appearance of torches. The fire went up and down among the living creatures. The fire was bright, and lightning went out of the fire. +\v 14 The living creatures ran and returned as the appearance of a flash of lightning. +\p +\v 15 Now as I saw the living creatures, behold, there was one wheel on the earth beside the living creatures, for each of the four faces of it. +\v 16 The appearance of the wheels and their work was like a beryl. The four of them had one likeness. Their appearance and their work was as it were a wheel within a wheel. +\v 17 When they went, they went in their four directions. They didn’t turn when they went. +\v 18 As for their rims, they were high and dreadful; and the four of them had their rims full of eyes all around. +\p +\v 19 When the living creatures went, the wheels went beside them. When the living creatures were lifted up from the earth, the wheels were lifted up. +\v 20 Wherever the spirit was to go, they went. The spirit was to go there. The wheels were lifted up beside them; for the spirit of the living creature was in the wheels. +\v 21 When those went, these went. When those stood, these stood. When those were lifted up from the earth, the wheels were lifted up beside them; for the spirit of the living creature was in the wheels. +\p +\v 22 Over the head of the living creature there was the likeness of an expanse, like an awesome crystal to look at, stretched out over their heads above. +\v 23 Under the expanse, their wings were straight, one toward the other. Each one had two which covered on this side, and each one had two which covered their bodies on that side. +\v 24 When they went, I heard the noise of their wings like the noise of great waters, like the voice of the Almighty, a noise of tumult like the noise of an army. When they stood, they let down their wings. +\p +\v 25 There was a voice above the expanse that was over their heads. When they stood, they let down their wings. +\v 26 Above the expanse that was over their heads was the likeness of a throne, as the appearance of a sapphire\f + \fr 1:26 \ft or, lapis lazuli\f* stone. On the likeness of the throne was a likeness as the appearance of a man on it above. +\v 27 I saw as it were glowing metal, as the appearance of fire within it all around, from the appearance of his waist and upward; and from the appearance of his waist and downward I saw as it were the appearance of fire, and there was brightness around him. +\v 28 As the appearance of the rainbow that is in the cloud in the day of rain, so was the appearance of the brightness all around. +\p This was the appearance of the likeness of Yahweh’s glory. When I saw it, I fell on my face, and I heard a voice of one that spoke. +\c 2 +\p +\v 1 He said to me, “Son of man, stand on your feet, and I will speak with you.” +\v 2 The Spirit entered into me when he spoke to me, and set me on my feet; and I heard him who spoke to me. +\p +\v 3 He said to me, “Son of man, I send you to the children of Israel, to a nation of rebels who have rebelled against me. They and their fathers have transgressed against me even to this very day. +\v 4 The children are impudent and stiff-hearted. I am sending you to them, and you shall tell them, ‘This is what the Lord\f + \fr 2:4 \ft The word translated “Lord” is “Adonai.”\f* Yahweh says.’ +\v 5 They, whether they will hear, or whether they will refuse—for they are a rebellious house—yet they will know that there has been a prophet among them. +\v 6 You, son of man, don’t be afraid of them, neither be afraid of their words, though briers and thorns are with you, and you dwell among scorpions. Don’t be afraid of their words, nor be dismayed at their looks, though they are a rebellious house. +\v 7 You shall speak my words to them, whether they will hear or whether they will refuse; for they are most rebellious. +\v 8 But you, son of man, hear what I tell you. Don’t be rebellious like that rebellious house. Open your mouth, and eat that which I give you.” +\p +\v 9 When I looked, behold, a hand was stretched out to me; and behold, a scroll of a book was in it. +\v 10 He spread it before me. It was written within and without; and lamentations, mourning, and woe were written in it. +\c 3 +\p +\v 1 He said to me, “Son of man, eat what you find. Eat this scroll, and go, speak to the house of Israel.” +\p +\v 2 So I opened my mouth, and he caused me to eat the scroll. +\p +\v 3 He said to me, “Son of man, eat this scroll that I give you and fill your belly and your bowels with it.” +\p Then I ate it. It was as sweet as honey in my mouth. +\p +\v 4 He said to me, “Son of man, go to the house of Israel, and speak my words to them. +\v 5 For you are not sent to a people of a strange speech and of a hard language, but to the house of Israel— +\v 6 not to many peoples of a strange speech and of a hard language, whose words you can’t understand. Surely, if I sent you to them, they would listen to you. +\v 7 But the house of Israel will not listen to you, for they will not listen to me; for all the house of Israel are obstinate\f + \fr 3:7 \ft Literally, have a hard forehead\f* and hard-hearted. +\v 8 Behold, I have made your face hard against their faces, and your forehead hard against their foreheads. +\v 9 I have made your forehead as a diamond, harder than flint. Don’t be afraid of them, neither be dismayed at their looks, though they are a rebellious house.” +\p +\v 10 Moreover he said to me, “Son of man, receive in your heart and hear with your ears all my words that I speak to you. +\v 11 Go to them of the captivity, to the children of your people, and speak to them, and tell them, ‘This is what the Lord Yahweh says,’ whether they will hear, or whether they will refuse.” +\p +\v 12 Then the Spirit lifted me up, and I heard behind me the voice of a great rushing, saying, “Blessed be Yahweh’s glory from his place.” +\v 13 I heard the noise of the wings of the living creatures as they touched one another, and the noise of the wheels beside them, even the noise of a great rushing. +\v 14 So the Spirit lifted me up, and took me away; and I went in bitterness, in the heat of my spirit; and Yahweh’s hand was strong on me. +\v 15 Then I came to them of the captivity at Tel Aviv who lived by the river Chebar, and to where they lived; and I sat there overwhelmed among them seven days. +\p +\v 16 At the end of seven days, Yahweh’s word came to me, saying, +\v 17 “Son of man, I have made you a watchman to the house of Israel. Therefore hear the word from my mouth, and warn them from me. +\v 18 When I tell the wicked, ‘You will surely die;’ and you give him no warning, nor speak to warn the wicked from his wicked way, to save his life, that wicked man will die in his iniquity; but I will require his blood at your hand. +\v 19 Yet if you warn the wicked, and he doesn’t turn from his wickedness, nor from his wicked way, he will die in his iniquity; but you have delivered your soul.” +\p +\v 20 “Again, when a righteous man turns from his righteousness and commits iniquity, and I lay a stumbling block before him, he will die. Because you have not given him warning, he will die in his sin, and his righteous deeds which he has done will not be remembered; but I will require his blood at your hand. +\v 21 Nevertheless if you warn the righteous man, that the righteous not sin, and he does not sin, he will surely live, because he took warning; and you have delivered your soul.” +\p +\v 22 Yahweh’s hand was there on me; and he said to me, “Arise, go out into the plain, and I will talk with you there.” +\p +\v 23 Then I arose, and went out into the plain, and behold, Yahweh’s glory stood there, like the glory which I saw by the river Chebar. Then I fell on my face. +\p +\v 24 Then the Spirit entered into me and set me on my feet. He spoke with me, and said to me, “Go, shut yourself inside your house. +\v 25 But you, son of man, behold, they will put ropes on you, and will bind you with them, and you will not go out among them. +\v 26 I will make your tongue stick to the roof of your mouth so that you will be mute and will not be able to correct them, for they are a rebellious house. +\v 27 But when I speak with you, I will open your mouth, and you shall tell them, ‘This is what the Lord Yahweh says.’ He who hears, let him hear; and he who refuses, let him refuse; for they are a rebellious house.” +\c 4 +\p +\v 1 “You also, son of man, take a tile, and lay it before yourself, and portray on it a city, even Jerusalem. +\v 2 Lay siege against it, build forts against it, and cast up a mound against it. Also set camps against it and plant battering rams against it all around. +\v 3 Take for yourself an iron pan and set it for a wall of iron between you and the city. Then set your face toward it. It will be besieged, and you shall lay siege against it. This shall be a sign to the house of Israel. +\p +\v 4 “Moreover lie on your left side, and lay the iniquity of the house of Israel on it. According to the number of the days that you shall lie on it, you shall bear their iniquity. +\v 5 For I have appointed the years of their iniquity to be to you a number of days, even three hundred ninety days. So you shall bear the iniquity of the house of Israel. +\p +\v 6 “Again, when you have accomplished these, you shall lie on your right side, and shall bear the iniquity of the house of Judah. I have appointed forty days, each day for a year, to you. +\v 7 You shall set your face toward the siege of Jerusalem, with your arm uncovered; and you shall prophesy against it. +\v 8 Behold, I put ropes on you, and you shall not turn yourself from one side to the other, until you have accomplished the days of your siege. +\p +\v 9 “Take for yourself also wheat, barley, beans, lentils, millet, and spelt, and put them in one vessel. Make bread of it. According to the number of the days that you will lie on your side, even three hundred ninety days, you shall eat of it. +\v 10 Your food which you shall eat shall be by weight, twenty shekels\f + \fr 4:10 \ft A shekel is about 10 grams or about 0.35 ounces.\f* a day. From time to time you shall eat it. +\v 11 You shall drink water by measure, the sixth part of a hin.\f + \fr 4:11 \ft A hin is about 6.5 liters or 1.7 gallons.\f* From time to time you shall drink. +\v 12 You shall eat it as barley cakes, and you shall bake it in their sight with dung that comes out of man.” +\v 13 Yahweh said, “Even thus will the children of Israel eat their bread unclean, among the nations where I will drive them.” +\p +\v 14 Then I said, “Ah Lord Yahweh! Behold, my soul has not been polluted; for from my youth up even until now I have not eaten of that which dies of itself, or is torn of animals. No abominable meat has come into my mouth!” +\p +\v 15 Then he said to me, “Behold, I have given you cow’s dung for man’s dung, and you shall prepare your bread on it.” +\p +\v 16 Moreover he said to me, “Son of man, behold, I will break the staff of bread in Jerusalem. They will eat bread by weight, and with fearfulness. They will drink water by measure, and in dismay; +\v 17 that they may lack bread and water, be dismayed one with another, and pine away in their iniquity. +\c 5 +\p +\v 1 “You, son of man, take a sharp sword. You shall take it as a barber’s razor to yourself, and shall cause it to pass over your head and over your beard. Then take balances to weigh and divide the hair. +\v 2 A third part you shall burn in the fire in the middle of the city, when the days of the siege are fulfilled. You shall take a third part, and strike with the sword around it. A third part you shall scatter to the wind, and I will draw out a sword after them. +\v 3 You shall take a small number of these and bind them in the folds of your robe. +\v 4 Of these again you shall take, and cast them into the middle of the fire, and burn them in the fire. From it a fire will come out into all the house of Israel. +\p +\v 5 “The Lord Yahweh says: ‘This is Jerusalem. I have set her in the middle of the nations, and countries are around her. +\v 6 She has rebelled against my ordinances in doing wickedness more than the nations, and against my statutes more than the countries that are around her; for they have rejected my ordinances, and as for my statutes, they have not walked in them.’ +\p +\v 7 “Therefore the Lord Yahweh says: ‘Because you are more turbulent than the nations that are around you, and have not walked in my statutes, neither have kept my ordinances, neither have followed the ordinances of the nations that are around you; +\v 8 therefore the Lord Yahweh says: ‘Behold, I, even I, am against you; and I will execute judgments among you in the sight of the nations. +\v 9 I will do in you that which I have not done, and which I will not do anything like it any more, because of all your abominations. +\v 10 Therefore the fathers will eat the sons within you, and the sons will eat their fathers. I will execute judgments on you; and I will scatter the whole remnant of you to all the winds. +\v 11 Therefore as I live,’ says the Lord Yahweh, ‘surely, because you have defiled my sanctuary with all your detestable things, and with all your abominations, therefore I will also diminish you. My eye won’t spare, and I will have no pity. +\v 12 A third part of you will die with the pestilence, and they will be consumed with famine within you. A third part will fall by the sword around you. A third part I will scatter to all the winds, and will draw out a sword after them. +\p +\v 13 “‘Thus my anger will be accomplished, and I will cause my wrath toward them to rest, and I will be comforted. They will know that I, Yahweh, have spoken in my zeal, when I have accomplished my wrath on them. +\p +\v 14 “‘Moreover I will make you a desolation and a reproach among the nations that are around you, in the sight of all that pass by. +\v 15 So it will be a reproach and a taunt, an instruction and an astonishment, to the nations that are around you, when I execute judgments on you in anger and in wrath, and in wrathful rebukes—I, Yahweh, have spoken it— +\v 16 when I send on them the evil arrows of famine that are for destruction, which I will send to destroy you. I will increase the famine on you and will break your staff of bread. +\v 17 I will send on you famine and evil animals, and they will bereave you. Pestilence and blood will pass through you. I will bring the sword on you. I, Yahweh, have spoken it.’” +\c 6 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face toward the mountains of Israel, and prophesy to them, +\v 3 and say, ‘You mountains of Israel, hear the word of the Lord Yahweh! The Lord Yahweh says to the mountains and to the hills, to the watercourses and to the valleys: “Behold, I, even I, will bring a sword on you, and I will destroy your high places. +\v 4 Your altars will become desolate, and your incense altars will be broken. I will cast down your slain men before your idols. +\v 5 I will lay the dead bodies of the children of Israel before their idols. I will scatter your bones around your altars. +\v 6 In all your dwelling places, the cities will be laid waste and the high places will be desolate, so that your altars may be laid waste and made desolate, and your idols may be broken and cease, and your incense altars may be cut down, and your works may be abolished. +\v 7 The slain will fall among you, and you will know that I am Yahweh. +\p +\v 8 “‘“Yet I will leave a remnant, in that you will have some that escape the sword among the nations, when you are scattered through the countries. +\v 9 Those of you that escape will remember me among the nations where they are carried captive, how I have been broken with their lewd heart, which has departed from me, and with their eyes, which play the prostitute after their idols. Then they will loathe themselves in their own sight for the evils which they have committed in all their abominations. +\v 10 They will know that I am Yahweh. I have not said in vain that I would do this evil to them.”’ +\p +\v 11 “The Lord Yahweh says: ‘Strike with your hand, and stamp with your foot, and say, “Alas!”, because of all the evil abominations of the house of Israel; for they will fall by the sword, by the famine, and by the pestilence. +\v 12 He who is far off will die of the pestilence. He who is near will fall by the sword. He who remains and is besieged will die by the famine. Thus I will accomplish my wrath on them. +\v 13 You will know that I am Yahweh when their slain men are among their idols around their altars, on every high hill, on all the tops of the mountains, under every green tree, and under every thick oak—the places where they offered pleasant aroma to all their idols. +\v 14 I will stretch out my hand on them and make the land desolate and waste, from the wilderness toward Diblah, throughout all their habitations. Then they will know that I am Yahweh.’” +\b +\c 7 +\p +\v 1 Moreover Yahweh’s word came to me, saying, +\v 2 “You, son of man, the Lord Yahweh says to the land of Israel, ‘An end! The end has come on the four corners of the land. +\v 3 Now the end is on you, and I will send my anger on you, and will judge you according to your ways. I will bring on you all your abominations. +\v 4 My eye will not spare you, neither will I have pity; but I will bring your ways on you, and your abominations will be among you. Then you will know that I am Yahweh.’ +\p +\v 5 “The Lord Yahweh says: ‘A disaster! A unique disaster! Behold, it comes. +\v 6 An end has come. The end has come! It awakes against you. Behold, it comes. +\v 7 Your doom has come to you, inhabitant of the land! The time has come! The day is near, a day of tumult, and not of joyful shouting, on the mountains. +\v 8 Now I will shortly pour out my wrath on you, and accomplish my anger against you, and will judge you according to your ways. I will bring on you all your abominations. +\v 9 My eye won’t spare, neither will I have pity. I will punish you according to your ways. Your abominations will be among you. Then you will know that I, Yahweh, strike. +\p +\v 10 “‘Behold, the day! Behold, it comes! Your doom has gone out. The rod has blossomed. Pride has budded. +\v 11 Violence has risen up into a rod of wickedness. None of them will remain, nor of their multitude, nor of their wealth. There will be nothing of value among them. +\v 12 The time has come! The day draws near. Don’t let the buyer rejoice, nor the seller mourn; for wrath is on all its multitude. +\v 13 For the seller won’t return to that which is sold, although they are still alive; for the vision concerns the whole multitude of it. None will return. None will strengthen himself in the iniquity of his life. +\v 14 They have blown the trumpet, and have made all ready; but no one goes to the battle, for my wrath is on all its multitude. +\p +\v 15 “‘The sword is outside, and the pestilence and the famine within. He who is in the field will die by the sword. He who is in the city will be devoured by famine and pestilence. +\v 16 But of those who escape, they will escape and will be on the mountains like doves of the valleys, all of them moaning, everyone in his iniquity. +\v 17 All hands will be feeble, and all knees will be weak as water. +\v 18 They will also clothe themselves with sackcloth, and horror will cover them. Shame will be on all faces, and baldness on all their heads. +\v 19 They will cast their silver in the streets, and their gold will be as an unclean thing. Their silver and their gold won’t be able to deliver them in the day of Yahweh’s wrath. They won’t satisfy their souls or fill their bellies; because it has been the stumbling block of their iniquity. +\v 20 As for the beauty of his ornament, he set it in majesty; but they made the images of their abominations and their detestable things therein. Therefore I have made it to them as an unclean thing. +\v 21 I will give it into the hands of the strangers for a prey, and to the wicked of the earth for a plunder; and they will profane it. +\v 22 I will also turn my face from them, and they will profane my secret place. Robbers will enter into it, and profane it. +\p +\v 23 “‘Make chains, for the land is full of bloody crimes, and the city is full of violence. +\v 24 Therefore I will bring the worst of the nations, and they will possess their houses. I will also make the pride of the strong to cease. Their holy places will be profaned. +\v 25 Destruction comes! They will seek peace, and there will be none. +\v 26 Mischief will come on mischief, and rumor will be on rumor. They will seek a vision of the prophet; but the law will perish from the priest, and counsel from the elders. +\v 27 The king will mourn, and the prince will be clothed with desolation. The hands of the people of the land will be troubled. I will do to them after their way, and according to their own judgments I will judge them. Then they will know that I am Yahweh.’” +\c 8 +\p +\v 1 In the sixth year, in the sixth month, in the fifth day of the month, as I sat in my house, and the elders of Judah sat before me, the Lord Yahweh’s hand fell on me there. +\v 2 Then I saw, and behold, a likeness as the appearance of fire—from the appearance of his waist and downward, fire, and from his waist and upward, as the appearance of brightness, as it were glowing metal. +\v 3 He stretched out the form of a hand, and took me by a lock of my head; and the Spirit lifted me up between earth and the sky, and brought me in the visions of God to Jerusalem, to the door of the gate of the inner court that looks toward the north, where there was the seat of the image of jealousy, which provokes to jealousy. +\v 4 Behold, the glory of the God of Israel was there, according to the appearance that I saw in the plain. +\p +\v 5 Then he said to me, “Son of man, lift up your eyes now the way toward the north.” +\p So I lifted up my eyes the way toward the north, and saw, northward of the gate of the altar this image of jealousy in the entry. +\p +\v 6 He said to me, “Son of man, do you see what they do? Even the great abominations that the house of Israel commit here, that I should go far off from my sanctuary? But you will again see yet other great abominations.” +\p +\v 7 He brought me to the door of the court; and when I looked, behold, a hole in the wall. +\v 8 Then he said to me, “Son of man, dig now in the wall.” +\p When I had dug in the wall, I saw a door. +\p +\v 9 He said to me, “Go in, and see the wicked abominations that they do here.” +\p +\v 10 So I went in and looked, and saw every form of creeping things, abominable animals, and all the idols of the house of Israel, portrayed around on the wall. +\v 11 Seventy men of the elders of the house of Israel stood before them. In the middle of them Jaazaniah the son of Shaphan stood, every man with his censer in his hand; and the smell of the cloud of incense went up. +\p +\v 12 Then he said to me, “Son of man, have you seen what the elders of the house of Israel do in the dark, every man in his rooms of imagery? For they say, ‘Yahweh doesn’t see us. Yahweh has forsaken the land.’” +\v 13 He said also to me, “You will again see more of the great abominations which they do.” +\p +\v 14 Then he brought me to the door of the gate of Yahweh’s house which was toward the north; and I saw the women sit there weeping for Tammuz. +\v 15 Then he said to me, “Have you seen this, son of man? You will again see yet greater abominations than these.” +\p +\v 16 He brought me into the inner court of Yahweh’s house; and I saw at the door of Yahweh’s temple, between the porch and the altar, there were about twenty-five men with their backs toward Yahweh’s temple and their faces toward the east. They were worshiping the sun toward the east. +\p +\v 17 Then he said to me, “Have you seen this, son of man? Is it a light thing to the house of Judah that they commit the abominations which they commit here? For they have filled the land with violence, and have turned again to provoke me to anger. Behold, they put the branch to their nose. +\v 18 Therefore I will also deal in wrath. My eye won’t spare, neither will I have pity. Though they cry in my ears with a loud voice, yet I will not hear them.” +\c 9 +\p +\v 1 Then he cried in my ears with a loud voice, saying, “Cause those who are in charge of the city to draw near, each man with his destroying weapon in his hand.” +\v 2 Behold, six men came from the way of the upper gate, which lies toward the north, every man with his slaughter weapon in his hand. One man in the middle of them was clothed in linen, with a writer’s inkhorn by his side. They went in, and stood beside the bronze altar. +\p +\v 3 The glory of the God of Israel went up from the cherub, whereupon it was, to the threshold of the house; and he called to the man clothed in linen, who had the writer’s inkhorn by his side. +\v 4 Yahweh said to him, “Go through the middle of the city, through the middle of Jerusalem, and set a mark on the foreheads of the men that sigh and that cry over all the abominations that are done within it.” +\p +\v 5 To the others he said in my hearing, “Go through the city after him, and strike. Don’t let your eye spare, neither have pity. +\v 6 Kill utterly the old man, the young man, the virgin, little children and women; but don’t come near any man on whom is the mark. Begin at my sanctuary.” +\p Then they began at the old men who were before the house. +\p +\v 7 He said to them, “Defile the house, and fill the courts with the slain. Go out!” +\p They went out, and struck in the city. +\p +\v 8 While they were killing, and I was left, I fell on my face, and cried, and said, “Ah Lord Yahweh! Will you destroy all the residue of Israel in your pouring out of your wrath on Jerusalem?” +\p +\v 9 Then he said to me, “The iniquity of the house of Israel and Judah is exceedingly great, and the land is full of blood, and the city full of perversion; for they say, ‘Yahweh has forsaken the land, and Yahweh doesn’t see.’ +\v 10 As for me also, my eye won’t spare, neither will I have pity, but I will bring their way on their head.” +\p +\v 11 Behold, the man clothed in linen, who had the inkhorn by his side, reported the matter, saying, “I have done as you have commanded me.” +\c 10 +\p +\v 1 Then I looked, and see, in the expanse that was over the head of the cherubim there appeared above them as it were a sapphire\f + \fr 10:1 \ft or, lapis lazuli \f* stone, as the appearance of the likeness of a throne. +\v 2 He spoke to the man clothed in linen, and said, “Go in between the whirling wheels, even under the cherub, and fill both your hands with coals of fire from between the cherubim, and scatter them over the city.” +\p He went in as I watched. +\v 3 Now the cherubim stood on the right side of the house when the man went in; and the cloud filled the inner court. +\v 4 Yahweh’s glory mounted up from the cherub, and stood over the threshold of the house; and the house was filled with the cloud, and the court was full of the brightness of Yahweh’s glory. +\v 5 The sound of the wings of the cherubim was heard even to the outer court, as the voice of God Almighty when he speaks. +\p +\v 6 It came to pass, when he commanded the man clothed in linen, saying, “Take fire from between the whirling wheels, from between the cherubim,” that he went in and stood beside a wheel. +\v 7 The cherub stretched out his hand from between the cherubim to the fire that was between the cherubim, and took some of it, and put it into the hands of him who was clothed in linen, who took it and went out. +\v 8 The form of a man’s hand appeared here in the cherubim under their wings. +\p +\v 9 I looked, and behold, there were four wheels beside the cherubim, one wheel beside one cherub, and another wheel beside another cherub. The appearance of the wheels was like a beryl stone. +\v 10 As for their appearance, the four of them had one likeness, like a wheel within a wheel. +\v 11 When they went, they went in their four directions. They didn’t turn as they went, but to the place where the head looked they followed it. They didn’t turn as they went. +\v 12 Their whole body, including their backs, their hands, their wings, and the wheels, were full of eyes all around, even the wheels that the four of them had. +\v 13 As for the wheels, they were called in my hearing, “the whirling wheels”. +\v 14 Every one them had four faces. The first face was the face of the cherub. The second face was the face of a man. The third face was the face of a lion. The fourth was the face of an eagle. +\p +\v 15 The cherubim mounted up. This is the living creature that I saw by the river Chebar. +\v 16 When the cherubim went, the wheels went beside them; and when the cherubim lifted up their wings to mount up from the earth, the wheels also didn’t turn from beside them. +\v 17 When they stood, these stood. When they mounted up, these mounted up with them; for the spirit of the living creature was in them. +\p +\v 18 Yahweh’s glory went out from over the threshold of the house and stood over the cherubim. +\v 19 The cherubim lifted up their wings and mounted up from the earth in my sight when they went out, with the wheels beside them. Then they stood at the door of the east gate of Yahweh’s house; and the glory of the God of Israel was over them above. +\p +\v 20 This is the living creature that I saw under the God of Israel by the river Chebar; and I knew that they were cherubim. +\v 21 Every one had four faces, and every one four wings. The likeness of the hands of a man was under their wings. +\v 22 As for the likeness of their faces, they were the faces which I saw by the river Chebar, their appearances and themselves. They each went straight forward. +\c 11 +\p +\v 1 Moreover the Spirit lifted me up and brought me to the east gate of Yahweh’s house, which looks eastward. Behold, twenty-five men were at the door of the gate; and I saw among them Jaazaniah the son of Azzur, and Pelatiah the son of Benaiah, princes of the people. +\v 2 He said to me, “Son of man, these are the men who devise iniquity, and who give wicked counsel in this city; +\v 3 who say, ‘The time is not near to build houses. This is the cauldron, and we are the meat.’ +\v 4 Therefore prophesy against them. Prophesy, son of man.” +\p +\v 5 Yahweh’s Spirit fell on me, and he said to me, “Speak, ‘Yahweh says: “Thus you have said, house of Israel; for I know the things that come into your mind. +\v 6 You have multiplied your slain in this city, and you have filled its streets with the slain.” +\p +\v 7 “‘Therefore the Lord Yahweh says: “Your slain whom you have laid in the middle of it, they are the meat, and this is the cauldron; but you will be brought out of the middle of it. +\v 8 You have feared the sword; and I will bring the sword on you,” says the Lord Yahweh. +\v 9 “I will bring you out of the middle of it, and deliver you into the hands of strangers, and will execute judgments among you. +\v 10 You will fall by the sword. I will judge you in the border of Israel. Then you will know that I am Yahweh. +\v 11 This will not be your cauldron, neither will you be the meat in the middle of it. I will judge you in the border of Israel. +\v 12 You will know that I am Yahweh, for you have not walked in my statutes. You have not executed my ordinances, but have done after the ordinances of the nations that are around you.”’” +\p +\v 13 When I prophesied, Pelatiah the son of Benaiah died. Then I fell down on my face, and cried with a loud voice, and said, “Ah Lord Yahweh! Will you make a full end of the remnant of Israel?” +\p +\v 14 Yahweh’s word came to me, saying, +\v 15 “Son of man, your brothers, even your brothers, the men of your relatives, and all the house of Israel, all of them, are the ones to whom the inhabitants of Jerusalem have said, ‘Go far away from Yahweh. This land has been given to us for a possession.’ +\p +\v 16 “Therefore say, ‘The Lord Yahweh says: “Whereas I have removed them far off among the nations, and whereas I have scattered them among the countries, yet I will be to them a sanctuary for a little while in the countries where they have come.”’ +\p +\v 17 “Therefore say, ‘The Lord Yahweh says: “I will gather you from the peoples, and assemble you out of the countries where you have been scattered, and I will give you the land of Israel.” +\p +\v 18 “‘They will come there, and they will take away all its detestable things and all its abominations from there. +\v 19 I will give them one heart, and I will put a new spirit within them. I will take the stony heart out of their flesh, and will give them a heart of flesh, +\v 20 that they may walk in my statutes, and keep my ordinances, and do them. They will be my people, and I will be their God. +\v 21 But as for them whose heart walks after the heart of their detestable things and their abominations, I will bring their way on their own heads,’ says the Lord Yahweh.” +\p +\v 22 Then the cherubim lifted up their wings, and the wheels were beside them. The glory of the God of Israel was over them above. +\v 23 Yahweh’s glory went up from the middle of the city, and stood on the mountain which is on the east side of the city. +\v 24 The Spirit lifted me up, and brought me in the vision by the Spirit of God into Chaldea, to the captives. +\p So the vision that I had seen went up from me. +\v 25 Then I spoke to the captives all the things that Yahweh had shown me. +\c 12 +\p +\v 1 Yahweh’s word also came to me, saying, +\v 2 “Son of man, you dwell in the middle of the rebellious house, who have eyes to see, and don’t see, who have ears to hear, and don’t hear; for they are a rebellious house. +\p +\v 3 “Therefore, you son of man, prepare your baggage for moving, and move by day in their sight. You shall move from your place to another place in their sight. It may be they will consider, though they are a rebellious house. +\v 4 You shall bring out your baggage by day in their sight, as baggage for moving. You shall go out yourself at evening in their sight, as when men go out into exile. +\v 5 Dig through the wall in their sight, and carry your baggage out that way. +\v 6 In their sight you shall bear it on your shoulder, and carry it out in the dark. You shall cover your face, so that you don’t see the land, for I have set you for a sign to the house of Israel.” +\p +\v 7 I did so as I was commanded. I brought out my baggage by day, as baggage for moving, and in the evening I dug through the wall with my hand. I brought it out in the dark, and bore it on my shoulder in their sight. +\p +\v 8 In the morning, Yahweh’s word came to me, saying, +\v 9 “Son of man, hasn’t the house of Israel, the rebellious house, said to you, ‘What are you doing?’ +\p +\v 10 “Say to them, ‘The Lord Yahweh says: “This burden concerns the prince in Jerusalem, and all the house of Israel among whom they are.”’ +\p +\v 11 “Say, ‘I am your sign. As I have done, so will it be done to them. They will go into exile, into captivity. +\p +\v 12 “‘The prince who is among them will bear his baggage on his shoulder in the dark, and will go out. They will dig through the wall to carry things out that way. He will cover his face, because he will not see the land with his eyes. +\v 13 I will also spread my net on him, and he will be taken in my snare. I will bring him to Babylon to the land of the Chaldeans; yet he will not see it, though he will die there. +\v 14 I will scatter toward every wind all who are around him to help him, and all his bands. I will draw out the sword after them. +\p +\v 15 “‘They will know that I am Yahweh when I disperse them among the nations and scatter them through the countries. +\v 16 But I will leave a few men of them from the sword, from the famine, and from the pestilence, that they may declare all their abominations among the nations where they come. Then they will know that I am Yahweh.’” +\p +\v 17 Moreover Yahweh’s word came to me, saying, +\v 18 “Son of man, eat your bread with quaking, and drink your water with trembling and with fearfulness. +\v 19 Tell the people of the land, ‘The Lord Yahweh says concerning the inhabitants of Jerusalem and the land of Israel: “They will eat their bread with fearfulness and drink their water in dismay, that her land may be desolate, and all that is therein, because of the violence of all those who dwell therein. +\v 20 The cities that are inhabited will be laid waste, and the land will be a desolation. Then you will know that I am Yahweh.”’” +\p +\v 21 Yahweh’s word came to me, saying, +\v 22 “Son of man, what is this proverb that you have in the land of Israel, saying, ‘The days are prolonged, and every vision fails?’ +\v 23 Tell them therefore, ‘The Lord Yahweh says: “I will make this proverb to cease, and they will no more use it as a proverb in Israel;”’ but tell them, ‘“The days are at hand, and the fulfillment of every vision. +\v 24 For there will be no more any false vision nor flattering divination within the house of Israel. +\v 25 For I am Yahweh. I will speak, and the word that I speak will be performed. It will be no more deferred; for in your days, rebellious house, I will speak the word and will perform it,” says the Lord Yahweh.’” +\p +\v 26 Again Yahweh’s word came to me, saying, +\v 27 “Son of man, behold, they of the house of Israel say, ‘The vision that he sees is for many days to come, and he prophesies of times that are far off.’ +\p +\v 28 “Therefore tell them, ‘The Lord Yahweh says: “None of my words will be deferred any more, but the word which I speak will be performed,” says the Lord Yahweh.’” +\c 13 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, prophesy against the prophets of Israel who prophesy, and say to those who prophesy out of their own heart, ‘Hear Yahweh’s word: +\v 3 The Lord Yahweh says, “Woe to the foolish prophets, who follow their own spirit, and have seen nothing! +\v 4 Israel, your prophets have been like foxes in the waste places. +\v 5 You have not gone up into the gaps or built up the wall for the house of Israel, to stand in the battle in Yahweh’s day. +\v 6 They have seen falsehood and lying divination, who say, ‘Yahweh says;’ but Yahweh has not sent them. They have made men to hope that the word would be confirmed. +\v 7 Haven’t you seen a false vision, and haven’t you spoken a lying divination, in that you say, ‘Yahweh says;’ but I have not spoken?” +\p +\v 8 “‘Therefore the Lord Yahweh says: “Because you have spoken falsehood and seen lies, therefore, behold, I am against you,” says the Lord Yahweh. +\v 9 “My hand will be against the prophets who see false visions and who utter lying divinations. They will not be in the council of my people, neither will they be written in the writing of the house of Israel, neither will they enter into the land of Israel. Then you will know that I am the Lord Yahweh.” +\p +\v 10 “‘Because, even because they have seduced my people, saying, “Peace;” and there is no peace. When one builds up a wall, behold, they plaster it with whitewash. +\v 11 Tell those who plaster it with whitewash that it will fall. There will be an overflowing shower; and you, great hailstones, will fall. A stormy wind will tear it. +\v 12 Behold, when the wall has fallen, won’t it be said to you, “Where is the plaster with which you have plastered it?” +\p +\v 13 “‘Therefore the Lord Yahweh says: “I will even tear it with a stormy wind in my wrath. There will be an overflowing shower in my anger, and great hailstones in wrath to consume it. +\v 14 So I will break down the wall that you have plastered with whitewash, and bring it down to the ground, so that its foundation will be uncovered. It will fall, and you will be consumed in the middle of it. Then you will know that I am Yahweh. +\v 15 Thus I will accomplish my wrath on the wall, and on those who have plastered it with whitewash. I will tell you, ‘The wall is no more, nor those who plastered it— +\v 16 to wit, the prophets of Israel who prophesy concerning Jerusalem, and who see visions of peace for her, and there is no peace,’” says the Lord Yahweh.’” +\p +\v 17 You, son of man, set your face against the daughters of your people, who prophesy out of their own heart; and prophesy against them, +\v 18 and say, “The Lord Yahweh says: ‘Woe to the women who sew magic bands on all elbows and make veils for the head of persons of every stature to hunt souls! Will you hunt the souls of my people and save souls alive for yourselves? +\v 19 You have profaned me among my people for handfuls of barley and for pieces of bread, to kill the souls who should not die and to save the souls alive who should not live, by your lying to my people who listen to lies.’ +\p +\v 20 “Therefore the Lord Yahweh says: ‘Behold, I am against your magic bands, with which you hunt the souls to make them fly, and I will tear them from your arms. I will let the souls fly free, even the souls whom you ensnare like birds. +\v 21 I will also tear your veils and deliver my people out of your hand; and they will no longer be in your hand to be ensnared. Then you will know that I am Yahweh. +\v 22 Because with lies you have grieved the heart of the righteous, whom I have not made sad; and strengthened the hands of the wicked, that he should not return from his wicked way, and be saved alive. +\v 23 Therefore you shall no more see false visions nor practice divination. I will deliver my people out of your hand. Then you will know that I am Yahweh.’” +\c 14 +\p +\v 1 Then some of the elders of Israel came to me and sat before me. +\v 2 Yahweh’s word came to me, saying, +\v 3 “Son of man, these men have taken their idols into their heart, and put the stumbling block of their iniquity before their face. Should I be inquired of at all by them? +\v 4 Therefore speak to them and tell them, ‘The Lord Yahweh says: “Every man of the house of Israel who takes his idols into his heart and puts the stumbling block of his iniquity before his face then comes to the prophet, I Yahweh will answer him there according to the multitude of his idols, +\v 5 that I may take the house of Israel in their own heart, because they are all estranged from me through their idols.”’ +\p +\v 6 “Therefore tell the house of Israel, ‘The Lord Yahweh says: “Return, and turn yourselves from your idols! Turn away your faces from all your abominations. +\p +\v 7 “‘“For everyone of the house of Israel, or of the strangers who live in Israel, who separates himself from me and takes his idols into his heart, and puts the stumbling block of his iniquity before his face, and comes to the prophet to inquire for himself of me, I Yahweh will answer him by myself. +\v 8 I will set my face against that man and will make him an astonishment, for a sign and a proverb, and I will cut him off from among my people. Then you will know that I am Yahweh. +\p +\v 9 “‘“If the prophet is deceived and speaks a word, I, Yahweh, have deceived that prophet, and I will stretch out my hand on him, and will destroy him from among my people Israel. +\v 10 They will bear their iniquity. The iniquity of the prophet will be even as the iniquity of him who seeks him, +\v 11 that the house of Israel may no more go astray from me, neither defile themselves any more with all their transgressions; but that they may be my people, and I may be their God,” says the Lord Yahweh.’” +\p +\v 12 Yahweh’s word came to me, saying, +\v 13 “Son of man, when a land sins against me by committing a trespass, and I stretch out my hand on it, and break the staff of its bread and send famine on it, and cut off from it man and animal— +\v 14 though these three men, Noah, Daniel, and Job, were in it, they would deliver only their own souls by their righteousness,” says the Lord Yahweh. +\p +\v 15 “If I cause evil animals to pass through the land, and they ravage it and it is made desolate, so that no man may pass through because of the animals— +\v 16 though these three men were in it, as I live,” says the Lord Yahweh, “they would deliver neither sons nor daughters. They only would be delivered, but the land would be desolate. +\p +\v 17 “Or if I bring a sword on that land, and say, ‘Sword, go through the land, so that I cut off from it man and animal’— +\v 18 though these three men were in it, as I live,” says the Lord Yahweh, “they would deliver neither sons nor daughters, but they only would be delivered themselves. +\p +\v 19 “Or if I send a pestilence into that land, and pour out my wrath on it in blood, to cut off from it man and animal— +\v 20 though Noah, Daniel, and Job, were in it, as I live,” says the Lord Yahweh, “they would deliver neither son nor daughter; they would deliver only their own souls by their righteousness.” +\p +\v 21 For the Lord Yahweh says: “How much more when I send my four severe judgments on Jerusalem—the sword, the famine, the evil animals, and the pestilence—to cut off from it man and animal! +\v 22 Yet, behold, there will be left a remnant in it that will be carried out, both sons and daughters. Behold, they will come out to you, and you will see their way and their doings. Then you will be comforted concerning the evil that I have brought on Jerusalem, even concerning all that I have brought on it. +\v 23 They will comfort you, when you see their way and their doings; then you will know that I have not done all that I have done in it without cause,” says the Lord Yahweh. +\c 15 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, what is the vine tree more than any tree, the vine branch which is among the trees of the forest? +\v 3 Will wood be taken of it to make anything? Will men take a pin of it to hang any vessel on it? +\v 4 Behold, it is cast into the fire for fuel; the fire has devoured both its ends, and the middle of it is burned. Is it profitable for any work? +\v 5 Behold, when it was whole, it was suitable for no work. How much less, when the fire has devoured it, and it has been burned, will it yet be suitable for any work?” +\p +\v 6 Therefore the Lord Yahweh says: “As the vine wood among the trees of the forest, which I have given to the fire for fuel, so I will give the inhabitants of Jerusalem. +\v 7 I will set my face against them. They will go out from the fire, but the fire will still devour them. Then you will know that I am Yahweh, when I set my face against them. +\v 8 I will make the land desolate, because they have acted unfaithfully,” says the Lord Yahweh. +\c 16 +\p +\v 1 Again Yahweh’s word came to me, saying, +\v 2 “Son of man, cause Jerusalem to know her abominations; +\v 3 and say, ‘The Lord Yahweh says to Jerusalem: “Your origin and your birth is of the land of the Canaanite. An Amorite was your father, and your mother was a Hittite. +\v 4 As for your birth, in the day you were born your navel was not cut. You weren’t washed in water to cleanse you. You weren’t salted at all, nor wrapped in blankets at all. +\v 5 No eye pitied you, to do any of these things to you, to have compassion on you; but you were cast out in the open field, because you were abhorred in the day that you were born. +\p +\v 6 “‘“When I passed by you, and saw you wallowing in your blood, I said to you, ‘Though you are in your blood, live!’ Yes, I said to you, ‘Though you are in your blood, live!’ +\v 7 I caused you to multiply as that which grows in the field, and you increased and grew great, and you attained to excellent beauty. Your breasts were formed, and your hair grew; yet you were naked and bare. +\p +\v 8 “‘“Now when I passed by you, and looked at you, behold, your time was the time of love; and I spread my garment over you and covered your nakedness. Yes, I pledged myself to you and entered into a covenant with you,” says the Lord Yahweh, “and you became mine. +\p +\v 9 “‘“Then I washed you with water. Yes, I thoroughly washed away your blood from you, and I anointed you with oil. +\v 10 I clothed you also with embroidered work and put leather sandals on you. I dressed you with fine linen and covered you with silk. +\v 11 I decked you with ornaments, put bracelets on your hands, and put a chain on your neck. +\v 12 I put a ring on your nose, earrings in your ears, and a beautiful crown on your head. +\v 13 Thus you were decked with gold and silver. Your clothing was of fine linen, silk, and embroidered work. You ate fine flour, honey, and oil. You were exceedingly beautiful, and you prospered to royal estate. +\v 14 Your renown went out among the nations for your beauty; for it was perfect, through my majesty which I had put on you,” says the Lord Yahweh. +\p +\v 15 “‘“But you trusted in your beauty, and played the prostitute because of your renown, and poured out your prostitution on everyone who passed by. It was his. +\v 16 You took some of your garments, and made for yourselves high places decked with various colors, and played the prostitute on them. This shouldn’t happen, neither shall it be. +\v 17 You also took your beautiful jewels of my gold and of my silver, which I had given you, and made for yourself images of men, and played the prostitute with them. +\v 18 You took your embroidered garments, covered them, and set my oil and my incense before them. +\v 19 My bread also which I gave you, fine flour, oil, and honey, with which I fed you, you even set it before them for a pleasant aroma; and so it was,” says the Lord Yahweh. +\p +\v 20 “‘“Moreover you have taken your sons and your daughters, whom you have borne to me, and you have sacrificed these to them to be devoured. Was your prostitution a small matter, +\v 21 that you have slain my children and delivered them up, in causing them to pass through the fire to them? +\v 22 In all your abominations and your prostitution you have not remembered the days of your youth, when you were naked and bare, and were wallowing in your blood. +\p +\v 23 “‘“It has happened after all your wickedness—woe, woe to you!” says the Lord Yahweh— +\v 24 “that you have built for yourselves a vaulted place, and have made yourselves a lofty place in every street. +\v 25 You have built your lofty place at the head of every way, and have made your beauty an abomination, and have opened your feet to everyone who passed by, and multiplied your prostitution. +\v 26 You have also committed sexual immorality with the Egyptians, your neighbors, great of flesh; and have multiplied your prostitution, to provoke me to anger. +\v 27 See therefore, I have stretched out my hand over you, and have diminished your portion, and delivered you to the will of those who hate you, the daughters of the Philistines, who are ashamed of your lewd way. +\v 28 You have played the prostitute also with the Assyrians, because you were insatiable; yes, you have played the prostitute with them, and yet you weren’t satisfied. +\v 29 You have moreover multiplied your prostitution to the land of merchants, to Chaldea; and yet you weren’t satisfied with this. +\p +\v 30 “‘“How weak is your heart,” says the Lord Yahweh, “since you do all these things, the work of an impudent prostitute; +\v 31 in that you build your vaulted place at the head of every way, and make your lofty place in every street, and have not been as a prostitute, in that you scorn pay. +\p +\v 32 “‘“Adulterous wife, who takes strangers instead of her husband! +\v 33 People give gifts to all prostitutes; but you give your gifts to all your lovers, and bribe them, that they may come to you on every side for your prostitution. +\v 34 You are different from other women in your prostitution, in that no one follows you to play the prostitute; and whereas you give hire, and no hire is given to you, therefore you are different.”’ +\p +\v 35 “Therefore, prostitute, hear Yahweh’s word: +\v 36 ‘The Lord Yahweh says, “Because your filthiness was poured out, and your nakedness uncovered through your prostitution with your lovers; and because of all the idols of your abominations, and for the blood of your children, that you gave to them; +\v 37 therefore see, I will gather all your lovers, with whom you have taken pleasure, and all those whom you have loved, with all those whom you have hated. I will even gather them against you on every side, and will uncover your nakedness to them, that they may see all your nakedness. +\v 38 I will judge you as women who break wedlock and shed blood are judged; and I will bring on you the blood of wrath and jealousy. +\v 39 I will also give you into their hand, and they will throw down your vaulted place, and break down your lofty places. They will strip you of your clothes and take your beautiful jewels. They will leave you naked and bare. +\v 40 They will also bring up a company against you, and they will stone you with stones, and thrust you through with their swords. +\v 41 They will burn your houses with fire, and execute judgments on you in the sight of many women. I will cause you to cease from playing the prostitute, and you will also give no hire any more. +\v 42 So I will cause my wrath toward you to rest, and my jealousy will depart from you. I will be quiet, and will not be angry any more. +\p +\v 43 “‘“Because you have not remembered the days of your youth, but have raged against me in all these things; therefore, behold, I also will bring your way on your head,” says the Lord Yahweh: “and you shall not commit this lewdness with all your abominations. +\p +\v 44 “‘“Behold, everyone who uses proverbs will use this proverb against you, saying, ‘As is the mother, so is her daughter.’ +\v 45 You are the daughter of your mother, who loathes her husband and her children; and you are the sister of your sisters, who loathed their husbands and their children. Your mother was a Hittite, and your father an Amorite. +\v 46 Your elder sister is Samaria, who dwells at your left hand, she and her daughters; and your younger sister, who dwells at your right hand, is Sodom with her daughters. +\v 47 Yet you have not walked in their ways, nor done their abominations; but soon you were more corrupt than they in all your ways. +\v 48 As I live,” says the Lord Yahweh, “Sodom your sister has not done, she nor her daughters, as you have done, you and your daughters. +\p +\v 49 “‘“Behold, this was the iniquity of your sister Sodom: pride, fullness of bread, and prosperous ease was in her and in her daughters. She also didn’t strengthen the hand of the poor and needy. +\v 50 They were arrogant and committed abomination before me. Therefore I took them away when I saw it. +\v 51 Samaria hasn’t committed half of your sins; but you have multiplied your abominations more than they, and have justified your sisters by all your abominations which you have done. +\v 52 You also bear your own shame yourself, in that you have given judgment for your sisters; through your sins that you have committed more abominable than they, they are more righteous than you. Yes, be also confounded, and bear your shame, in that you have justified your sisters. +\p +\v 53 “‘“I will reverse their captivity, the captivity of Sodom and her daughters, and the captivity of Samaria and her daughters, and the captivity of your captives among them; +\v 54 that you may bear your own shame, and may be ashamed because of all that you have done, in that you are a comfort to them. +\v 55 Your sisters, Sodom and her daughters, will return to their former estate; and Samaria and her daughters will return to their former estate; and you and your daughters will return to your former estate. +\v 56 For your sister Sodom was not mentioned by your mouth in the day of your pride, +\v 57 before your wickedness was uncovered, as at the time of the reproach of the daughters of Syria, and of all who are around her, the daughters of the Philistines, who despise you all around. +\v 58 You have borne your lewdness and your abominations,” says Yahweh. +\p +\v 59 “‘For the Lord Yahweh says: “I will also deal with you as you have done, who have despised the oath in breaking the covenant. +\v 60 Nevertheless I will remember my covenant with you in the days of your youth, and I will establish an everlasting covenant with you. +\v 61 Then you will remember your ways and be ashamed when you receive your sisters, your elder sisters and your younger; and I will give them to you for daughters, but not by your covenant. +\v 62 I will establish my covenant with you. Then you will know that I am Yahweh; +\v 63 that you may remember, and be confounded, and never open your mouth any more because of your shame, when I have forgiven you all that you have done,” says the Lord Yahweh.’” +\c 17 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, tell a riddle, and speak a parable to the house of Israel; +\v 3 and say, ‘The Lord Yahweh says: “A great eagle with great wings and long feathers, full of feathers which had various colors, came to Lebanon and took the top of the cedar. +\v 4 He cropped off the topmost of its young twigs, and carried it to a land of traffic. He planted it in a city of merchants. +\p +\v 5 “‘“He also took some of the seed of the land and planted it in fruitful soil. He placed it beside many waters. He set it as a willow tree. +\v 6 It grew and became a spreading vine of low stature, whose branches turned toward him, and its roots were under him. So it became a vine, produced branches, and shot out sprigs. +\p +\v 7 “‘“There was also another great eagle with great wings and many feathers. Behold, this vine bent its roots toward him, and shot out its branches toward him, from the ground where it was planted, that he might water it. +\v 8 It was planted in a good soil by many waters, that it might produce branches and that it might bear fruit, that it might be a good vine.”’ +\p +\v 9 “Say, ‘The Lord Yahweh says: “Will it prosper? Won’t he pull up its roots and cut off its fruit, that it may wither, that all its fresh springing leaves may wither? It can’t be raised from its roots by a strong arm or many people. +\v 10 Yes, behold, being planted, will it prosper? Won’t it utterly wither when the east wind touches it? It will wither in the ground where it grew.”’” +\p +\v 11 Moreover Yahweh’s word came to me, saying, +\v 12 “Say now to the rebellious house, ‘Don’t you know what these things mean?’ Tell them, ‘Behold, the king of Babylon came to Jerusalem, and took its king, and its princes, and brought them to him to Babylon. +\v 13 He took one of the royal offspring,\f + \fr 17:13 \ft or, seed\f* and made a covenant with him. He also brought him under an oath, and took away the mighty of the land, +\v 14 that the kingdom might be brought low, that it might not lift itself up, but that by keeping his covenant it might stand. +\v 15 But he rebelled against him in sending his ambassadors into Egypt, that they might give him horses and many people. Will he prosper? Will he who does such things escape? Will he break the covenant, and still escape? +\p +\v 16 “‘As I live,’ says the Lord Yahweh, ‘surely in the place where the king dwells who made him king, whose oath he despised, and whose covenant he broke, even with him in the middle of Babylon he will die. +\v 17 Pharaoh with his mighty army and great company won’t help him in the war, when they cast up mounds and build forts to cut off many persons. +\v 18 For he has despised the oath by breaking the covenant; and behold, he had given his hand, and yet has done all these things. He won’t escape. +\p +\v 19 “Therefore the Lord Yahweh says: ‘As I live, I will surely bring on his own head my oath that he has despised and my covenant that he has broken. +\v 20 I will spread my net on him, and he will be taken in my snare. I will bring him to Babylon, and will enter into judgment with him there for his trespass that he has trespassed against me. +\v 21 All his fugitives in all his bands will fall by the sword, and those who remain will be scattered toward every wind. Then you will know that I, Yahweh, have spoken it.’ +\p +\v 22 “The Lord Yahweh says: ‘I will also take some of the lofty top of the cedar, and will plant it. I will crop off from the topmost of its young twigs a tender one, and I will plant it on a high and lofty mountain. +\v 23 I will plant it in the mountain of the height of Israel; and it will produce boughs, and bear fruit, and be a good cedar. Birds of every kind will dwell in the shade of its branches. +\v 24 All the trees of the field will know that I, Yahweh, have brought down the high tree, have exalted the low tree, have dried up the green tree, and have made the dry tree flourish. +\p “‘I, Yahweh, have spoken and have done it.’” +\c 18 +\p +\v 1 Yahweh’s word came to me again, saying, +\v 2 “What do you mean, that you use this proverb concerning the land of Israel, saying, +\q1 ‘The fathers have eaten sour grapes, +\q2 and the children’s teeth are set on edge’? +\p +\v 3 “As I live,” says the Lord Yahweh, “you shall not use this proverb any more in Israel. +\v 4 Behold, all souls are mine; as the soul of the father, so also the soul of the son is mine. The soul who sins, he shall die. +\b +\q1 +\v 5 “But if a man is just, +\q2 and does that which is lawful and right, +\q1 +\v 6 and has not eaten on the mountains, +\q2 hasn’t lifted up his eyes to the idols of the house of Israel, +\q1 hasn’t defiled his neighbor’s wife, +\q2 hasn’t come near a woman in her impurity, +\q1 +\v 7 and has not wronged any, +\q2 but has restored to the debtor his pledge, +\q1 has taken nothing by robbery, +\q2 has given his bread to the hungry, +\q2 and has covered the naked with a garment; +\q1 +\v 8 he who hasn’t lent to them with interest, +\q2 hasn’t taken any increase from them, +\q1 who has withdrawn his hand from iniquity, +\q2 has executed true justice between man and man, +\q1 +\v 9 has walked in my statutes, +\q2 and has kept my ordinances, +\q2 to deal truly; +\q1 he is just, +\q2 he shall surely live,” says the Lord Yahweh. +\b +\p +\v 10 “If he fathers a son who is a robber who sheds blood, and who does any one of these things, +\v 11 or who does not do any of those things +\q1 but has eaten at the mountain shrines +\q2 and defiled his neighbor’s wife, +\q1 +\v 12 has wronged the poor and needy, +\q2 has taken by robbery, +\q1 has not restored the pledge, +\q2 and has lifted up his eyes to the idols, +\q2 has committed abomination, +\q1 +\v 13 has lent with interest, +\q2 and has taken increase from the poor, +\m shall he then live? He shall not live. He has done all these abominations. He shall surely die. His blood will be on him. +\p +\v 14 “Now, behold, if he fathers a son who sees all his father’s sins which he has done, and fears, and doesn’t do likewise, +\q1 +\v 15 who hasn’t eaten on the mountains, +\q2 hasn’t lifted up his eyes to the idols of the house of Israel, +\q2 hasn’t defiled his neighbor’s wife, +\q1 +\v 16 hasn’t wronged any, +\q2 hasn’t taken anything to pledge, +\q1 hasn’t taken by robbery, +\q2 but has given his bread to the hungry, +\q2 and has covered the naked with a garment; +\q1 +\v 17 who has withdrawn his hand from the poor, +\q2 who hasn’t received interest or increase, +\q1 has executed my ordinances, +\q2 has walked in my statutes; +\m he shall not die for the iniquity of his father. He shall surely live. +\v 18 As for his father, because he cruelly oppressed, robbed his brother, and did that which is not good among his people, behold, he will die in his iniquity. +\p +\v 19 “Yet you say, ‘Why doesn’t the son bear the iniquity of the father?’ When the son has done that which is lawful and right, and has kept all my statutes, and has done them, he will surely live. +\v 20 The soul who sins, he shall die. The son shall not bear the iniquity of the father, neither shall the father bear the iniquity of the son. The righteousness of the righteous shall be on him, and the wickedness of the wicked shall be on him. +\p +\v 21 “But if the wicked turns from all his sins that he has committed, and keeps all my statutes, and does that which is lawful and right, he shall surely live. He shall not die. +\v 22 None of his transgressions that he has committed will be remembered against him. In his righteousness that he has done, he shall live. +\v 23 Have I any pleasure in the death of the wicked?” says the Lord Yahweh, “and not rather that he should return from his way, and live? +\p +\v 24 “But when the righteous turns away from his righteousness, and commits iniquity, and does according to all the abominations that the wicked man does, should he live? None of his righteous deeds that he has done will be remembered. In his trespass that he has trespassed, and in his sin that he has sinned, in them he shall die. +\p +\v 25 “Yet you say, ‘The way of the Lord is not equal.’ Hear now, house of Israel: Is my way not equal? Aren’t your ways unequal? +\v 26 When the righteous man turns away from his righteousness, and commits iniquity, and dies in it, then he dies in his iniquity that he has done. +\v 27 Again, when the wicked man turns away from his wickedness that he has committed, and does that which is lawful and right, he will save his soul alive. +\v 28 Because he considers, and turns away from all his transgressions that he has committed, he shall surely live. He shall not die. +\v 29 Yet the house of Israel says, ‘The way of the Lord is not fair.’ House of Israel, aren’t my ways fair? Aren’t your ways unfair? +\p +\v 30 “Therefore I will judge you, house of Israel, everyone according to his ways,” says the Lord Yahweh. “Return, and turn yourselves from all your transgressions, so iniquity will not be your ruin. +\v 31 Cast away from you all your transgressions in which you have transgressed; and make yourself a new heart and a new spirit. For why will you die, house of Israel? +\v 32 For I have no pleasure in the death of him who dies,” says the Lord Yahweh. “Therefore turn yourselves, and live! +\c 19 +\p +\v 1 “Moreover, take up a lamentation for the princes of Israel, +\v 2 and say, +\q1 ‘What was your mother? +\q2 A lioness. +\q1 She couched among lions, +\q2 in the middle of the young lions she nourished her cubs. +\q1 +\v 3 She brought up one of her cubs. +\q2 He became a young lion. +\q1 He learned to catch the prey. +\q2 He devoured men. +\q1 +\v 4 The nations also heard of him. +\q2 He was taken in their pit; +\q2 and they brought him with hooks to the land of Egypt. +\b +\q1 +\v 5 “‘Now when she saw that she had waited, +\q2 and her hope was lost, +\q1 then she took another of her cubs, +\q2 and made him a young lion. +\q1 +\v 6 He went up and down among the lions. +\q2 He became a young lion. +\q1 He learned to catch the prey. +\q2 He devoured men. +\q1 +\v 7 He knew their palaces, +\q2 and laid waste their cities. +\q1 The land was desolate with its fullness, +\q2 because of the noise of his roaring. +\q1 +\v 8 Then the nations attacked him on every side from the provinces. +\q2 They spread their net over him. +\q2 He was taken in their pit. +\q1 +\v 9 They put him in a cage with hooks, +\q2 and brought him to the king of Babylon. +\q1 They brought him into strongholds, +\q2 so that his voice should no more be heard on the mountains of Israel. +\b +\q1 +\v 10 “‘Your mother was like a vine in your blood, planted by the waters. +\q2 It was fruitful and full of branches by reason of many waters. +\q1 +\v 11 It had strong branches for the scepters of those who ruled. +\q2 Their stature was exalted among the thick boughs. +\q1 They were seen in their height +\q2 with the multitude of their branches. +\q1 +\v 12 But it was plucked up in fury. +\q2 It was cast down to the ground, +\q1 and the east wind dried up its fruit. +\q2 Its strong branches were broken off and withered. +\q2 The fire consumed them. +\q1 +\v 13 Now it is planted in the wilderness, +\q2 in a dry and thirsty land. +\q1 +\v 14 Fire has gone out of its branches. +\q2 It has devoured its fruit, +\q2 so that there is in it no strong branch to be a scepter to rule.’ +\m This is a lamentation, and shall be for a lamentation.” +\c 20 +\p +\v 1 In the seventh year, in the fifth month, the tenth day of the month, some of the elders of Israel came to inquire of Yahweh, and sat before me. +\p +\v 2 Yahweh’s word came to me, saying, +\v 3 “Son of man, speak to the elders of Israel, and tell them, ‘The Lord Yahweh says: “Is it to inquire of me that you have come? As I live,” says the Lord Yahweh, “I will not be inquired of by you.”’ +\p +\v 4 “Will you judge them, son of man? Will you judge them? Cause them to know the abominations of their fathers. +\v 5 Tell them, ‘The Lord Yahweh says: “In the day when I chose Israel, and swore to the offspring of the house of Jacob, and made myself known to them in the land of Egypt, when I swore to them, saying, ‘I am Yahweh your God;’ +\v 6 in that day I swore to them to bring them out of the land of Egypt into a land that I had searched out for them, flowing with milk and honey, which is the glory of all lands. +\v 7 I said to them, ‘Each of you throw away the abominations of his eyes. Don’t defile yourselves with the idols of Egypt. I am Yahweh your God.’ +\p +\v 8 “‘“But they rebelled against me and wouldn’t listen to me. They didn’t all throw away the abominations of their eyes. They also didn’t forsake the idols of Egypt. Then I said I would pour out my wrath on them, to accomplish my anger against them in the middle of the land of Egypt. +\v 9 But I worked for my name’s sake, that it should not be profaned in the sight of the nations among which they were, in whose sight I made myself known to them in bringing them out of the land of Egypt. +\v 10 So I caused them to go out of the land of Egypt and brought them into the wilderness. +\v 11 I gave them my statutes and showed them my ordinances, which if a man does, he will live in them. +\v 12 Moreover also I gave them my Sabbaths, to be a sign between me and them, that they might know that I am Yahweh who sanctifies them. +\p +\v 13 “‘“But the house of Israel rebelled against me in the wilderness. They didn’t walk in my statutes and they rejected my ordinances, which if a man keeps, he shall live in them. They greatly profaned my Sabbaths. Then I said I would pour out my wrath on them in the wilderness, to consume them. +\v 14 But I worked for my name’s sake, that it should not be profaned in the sight of the nations, in whose sight I brought them out. +\v 15 Moreover also I swore to them in the wilderness that I would not bring them into the land which I had given them, flowing with milk and honey, which is the glory of all lands, +\v 16 because they rejected my ordinances, and didn’t walk in my statutes, and profaned my Sabbaths; for their heart went after their idols. +\v 17 Nevertheless my eye spared them, and I didn’t destroy them. I didn’t make a full end of them in the wilderness. +\v 18 I said to their children in the wilderness, ‘Don’t walk in the statutes of your fathers. Don’t observe their ordinances or defile yourselves with their idols. +\v 19 I am Yahweh your God. Walk in my statutes, keep my ordinances, and do them. +\v 20 Make my Sabbaths holy. They shall be a sign between me and you, that you may know that I am Yahweh your God.’ +\p +\v 21 “‘“But the children rebelled against me. They didn’t walk in my statutes, and didn’t keep my ordinances to do them, which if a man does, he shall live in them. They profaned my Sabbaths. Then I said I would pour out my wrath on them, to accomplish my anger against them in the wilderness. +\v 22 Nevertheless I withdrew my hand and worked for my name’s sake, that it should not be profaned in the sight of the nations, in whose sight I brought them out. +\v 23 Moreover I swore to them in the wilderness, that I would scatter them among the nations and disperse them through the countries, +\v 24 because they had not executed my ordinances, but had rejected my statutes, and had profaned my Sabbaths, and their eyes were after their fathers’ idols. +\v 25 Moreover also I gave them statutes that were not good, and ordinances in which they couldn’t live. +\v 26 I polluted them in their own gifts, in that they caused all that opens the womb to pass through the fire, that I might make them desolate, to the end that they might know that I am Yahweh.”’ +\p +\v 27 “Therefore, son of man, speak to the house of Israel, and tell them, ‘The Lord Yahweh says: “Moreover, in this your fathers have blasphemed me, in that they have committed a trespass against me. +\v 28 For when I had brought them into the land which I swore to give to them, then they saw every high hill and every thick tree, and they offered there their sacrifices, and there they presented the provocation of their offering. There they also made their pleasant aroma, and there they poured out their drink offerings. +\v 29 Then I said to them, ‘What does the high place where you go mean?’ So its name is called Bamah\f + \fr 20:29 \ft “Bamah” means “High Place”.\f* to this day.”’ +\p +\v 30 “Therefore tell the house of Israel, ‘The Lord Yahweh says: “Do you pollute yourselves in the way of your fathers? Do you play the prostitute after their abominations? +\v 31 When you offer your gifts, when you make your sons pass through the fire, do you pollute yourselves with all your idols to this day? Should I be inquired of by you, house of Israel? As I live, says the Lord Yahweh, I will not be inquired of by you! +\p +\v 32 “‘“That which comes into your mind will not be at all, in that you say, ‘We will be as the nations, as the families of the countries, to serve wood and stone.’ +\v 33 As I live,” says the Lord Yahweh, “surely with a mighty hand, with an outstretched arm, and with wrath poured out, I will be king over you. +\v 34 I will bring you out from the peoples, and will gather you out of the countries in which you are scattered with a mighty hand, with an outstretched arm, and with wrath poured out. +\v 35 I will bring you into the wilderness of the peoples, and there I will enter into judgment with you face to face. +\v 36 Just as I entered into judgment with your fathers in the wilderness of the land of Egypt, so I will enter into judgment with you,” says the Lord Yahweh. +\v 37 “I will cause you to pass under the rod, and I will bring you into the bond of the covenant. +\v 38 I will purge out from among you the rebels and those who disobey me. I will bring them out of the land where they live, but they shall not enter into the land of Israel. Then you will know that I am Yahweh.” +\p +\v 39 “‘As for you, house of Israel, the Lord Yahweh says: “Go, everyone serve his idols, and hereafter also, if you will not listen to me; but you shall no more profane my holy name with your gifts and with your idols. +\v 40 For in my holy mountain, in the mountain of the height of Israel,” says the Lord Yahweh, “there all the house of Israel, all of them, shall serve me in the land. There I will accept them, and there I will require your offerings and the first fruits of your offerings, with all your holy things. +\v 41 I will accept you as a pleasant aroma when I bring you out from the peoples and gather you out of the countries in which you have been scattered. I will be sanctified in you in the sight of the nations. +\v 42 You will know that I am Yahweh when I bring you into the land of Israel, into the country which I swore to give to your fathers. +\v 43 There you will remember your ways, and all your deeds in which you have polluted yourselves. Then you will loathe yourselves in your own sight for all your evils that you have committed. +\v 44 You will know that I am Yahweh, when I have dealt with you for my name’s sake, not according to your evil ways, nor according to your corrupt doings, you house of Israel,” says the Lord Yahweh.’” +\p +\v 45 Yahweh’s word came to me, saying, +\v 46 “Son of man, set your face toward the south, and preach toward the south, and prophesy against the forest of the field in the south. +\v 47 Tell the forest of the south, ‘Hear Yahweh’s word: The Lord Yahweh says, “Behold, I will kindle a fire in you, and it will devour every green tree in you, and every dry tree. The burning flame will not be quenched, and all faces from the south to the north will be burned by it. +\v 48 All flesh will see that I, Yahweh, have kindled it. It will not be quenched.”’” +\p +\v 49 Then I said, “Ah Lord Yahweh! They say of me, ‘Isn’t he a speaker of parables?’” +\c 21 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face toward Jerusalem, and preach toward the sanctuaries, and prophesy against the land of Israel. +\v 3 Tell the land of Israel, ‘Yahweh says: “Behold, I am against you, and will draw my sword out of its sheath, and will cut off from you the righteous and the wicked. +\v 4 Seeing then that I will cut off from you the righteous and the wicked, therefore my sword will go out of its sheath against all flesh from the south to the north. +\v 5 All flesh will know that I, Yahweh, have drawn my sword out of its sheath. It will not return any more.”’ +\p +\v 6 “Therefore sigh, you son of man. You shall sigh before their eyes with a broken heart\f + \fr 21:6 \ft literally, the breaking of your thighs\f* and with bitterness. +\v 7 It shall be, when they ask you, ‘Why do you sigh?’ that you shall say, ‘Because of the news, for it comes! Every heart will melt, all hands will be feeble, every spirit will faint, and all knees will be weak as water. Behold, it comes, and it shall be done, says the Lord Yahweh.’” +\p +\v 8 Yahweh’s word came to me, saying, +\v 9 “Son of man, prophesy, and say, ‘Yahweh says: +\q1 “A sword! A sword! +\q2 It is sharpened, +\q2 and also polished. +\q1 +\v 10 It is sharpened that it may make a slaughter. +\q2 It is polished that it may be as lightning. +\q1 Should we then make mirth? +\q2 The rod of my son condemns every tree. +\q1 +\v 11 It is given to be polished, +\q2 that it may be handled. +\q1 The sword is sharpened. +\q2 Yes, it is polished +\q2 to give it into the hand of the killer.”’ +\q1 +\v 12 Cry and wail, son of man; +\q2 for it is on my people. +\q2 It is on all the princes of Israel. +\q1 They are delivered over to the sword with my people. +\q2 Therefore beat your thigh. +\b +\p +\v 13 “For there is a trial. What if even the rod that condemns will be no more?” says the Lord Yahweh. +\q1 +\v 14 “You therefore, son of man, prophesy, +\q2 and strike your hands together. +\q1 Let the sword be doubled the third time, +\q2 the sword of the fatally wounded. +\q1 It is the sword of the great one who is fatally wounded, +\q2 which enters into their rooms. +\q1 +\v 15 I have set the threatening sword against all their gates, +\q2 that their heart may melt, +\q2 and their stumblings be multiplied. +\q1 Ah! It is made as lightning. +\q2 It is pointed for slaughter. +\q1 +\v 16 Gather yourselves together. +\q2 Go to the right. +\q1 Set yourselves in array. +\q2 Go to the left, +\q2 wherever your face is set. +\q1 +\v 17 I will also strike my hands together, +\q2 and I will cause my wrath to rest. +\q2 I, Yahweh, have spoken it.” +\p +\v 18 Yahweh’s word came to me again, saying, +\v 19 “Also, you son of man, appoint two ways, that the sword of the king of Babylon may come. They both will come out of one land, and mark out a place. Mark it out at the head of the way to the city. +\v 20 You shall appoint a way for the sword to come to Rabbah of the children of Ammon, and to Judah in Jerusalem the fortified. +\v 21 For the king of Babylon stood at the parting of the way, at the head of the two ways, to use divination. He shook the arrows back and forth. He consulted the teraphim.\f + \fr 21:21 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* He looked in the liver. +\v 22 In his right hand was the lot for Jerusalem, to set battering rams, to open the mouth in the slaughter, to lift up the voice with shouting, to set battering rams against the gates, to cast up mounds, and to build forts. +\v 23 It will be to them as a false divination in their sight, who have sworn oaths to them; but he brings iniquity to memory, that they may be taken. +\p +\v 24 “Therefore the Lord Yahweh says: ‘Because you have caused your iniquity to be remembered, in that your transgressions are uncovered, so that in all your doings your sins appear; because you have come to memory, you will be taken with the hand. +\p +\v 25 “‘You, deadly wounded wicked one, the prince of Israel, whose day has come, in the time of the iniquity of the end, +\v 26 the Lord Yahweh says: “Remove the turban, and take off the crown. This will not be as it was. Exalt that which is low, and humble that which is high. +\v 27 I will overturn, overturn, overturn it. This also will be no more, until he comes whose right it is; and I will give it.”’ +\p +\v 28 “You, son of man, prophesy and say, ‘The Lord Yahweh says this concerning the children of Ammon, and concerning their reproach: +\q1 “A sword! A sword is drawn! +\q2 It is polished for the slaughter, +\q1 to cause it to devour, +\q2 that it may be as lightning; +\q1 +\v 29 while they see for you false visions, +\q2 while they divine lies to you, +\q1 to lay you on the necks of the wicked who are deadly wounded, +\q2 whose day has come in the time of the iniquity of the end. +\q1 +\v 30 Cause it to return into its sheath. +\q2 In the place where you were created, +\q2 in the land of your birth, I will judge you. +\q1 +\v 31 I will pour out my indignation on you. +\q2 I will blow on you with the fire of my wrath. +\q1 I will deliver you into the hand of brutish men, +\q2 skillful to destroy. +\q1 +\v 32 You will be for fuel to the fire. +\q2 Your blood will be in the middle of the land. +\q1 You will be remembered no more; +\q2 for I, Yahweh, have spoken it.”’” +\c 22 +\p +\v 1 Moreover Yahweh’s word came to me, saying, +\v 2 “You, son of man, will you judge? Will you judge the bloody city? Then cause her to know all her abominations. +\v 3 You shall say, ‘The Lord Yahweh says: “A city that sheds blood within herself, that her time may come, and that makes idols against herself to defile her! +\v 4 You have become guilty in your blood that you have shed, and are defiled in your idols which you have made! You have caused your days to draw near, and have come to the end of your years. Therefore I have made you a reproach to the nations, and a mocking to all the countries. +\v 5 Those who are near and those who are far from you will mock you, you infamous one, full of tumult. +\p +\v 6 “‘“Behold, the princes of Israel, everyone according to his power, have been in you to shed blood. +\v 7 In you have they treated father and mother with contempt.\f + \fr 22:7 \ft Literally, \fqa made light of father and mother.\f* Among you they have oppressed the foreigner. In you they have wronged the fatherless and the widow. +\v 8 You have despised my holy things, and have profaned my Sabbaths. +\v 9 Slanderous men have been in you to shed blood. In you they have eaten on the mountains. They have committed lewdness among you. +\v 10 In you have they uncovered their fathers’ nakedness. In you have they humbled her who was unclean in her impurity. +\v 11 One has committed abomination with his neighbor’s wife, and another has lewdly defiled his daughter-in-law. Another in you has humbled his sister, his father’s daughter. +\v 12 In you have they taken bribes to shed blood. You have taken interest and increase, and you have greedily gained of your neighbors by oppression, and have forgotten me,” says the Lord Yahweh. +\p +\v 13 “‘“Behold, therefore I have struck my hand at your dishonest gain which you have made, and at the blood which has been shed within you. +\v 14 Can your heart endure, or can your hands be strong, in the days that I will deal with you? I, Yahweh, have spoken it, and will do it. +\v 15 I will scatter you among the nations, and disperse you through the countries. I will purge your filthiness out of you. +\v 16 You will be profaned in yourself in the sight of the nations. Then you will know that I am Yahweh.”’” +\p +\v 17 Yahweh’s word came to me, saying, +\v 18 “Son of man, the house of Israel has become dross to me. All of them are bronze, tin, iron, and lead in the middle of the furnace. They are the dross of silver. +\v 19 Therefore the Lord Yahweh says: ‘Because you have all become dross, therefore, behold, I will gather you into the middle of Jerusalem. +\v 20 As they gather silver, bronze, iron, lead, and tin into the middle of the furnace, to blow the fire on it, to melt it, so I will gather you in my anger and in my wrath, and I will lay you there and melt you. +\v 21 Yes, I will gather you, and blow on you with the fire of my wrath, and you will be melted in the middle of it. +\v 22 As silver is melted in the middle of the furnace, so you will be melted in the middle of it; and you will know that I, Yahweh, have poured out my wrath on you.’” +\p +\v 23 Yahweh’s word came to me, saying, +\v 24 “Son of man, tell her, ‘You are a land that is not cleansed nor rained on in the day of indignation.’ +\v 25 There is a conspiracy of her prophets within it, like a roaring lion ravening the prey. They have devoured souls. They take treasure and precious things. They have made many widows within it. +\v 26 Her priests have done violence to my law and have profaned my holy things. They have made no distinction between the holy and the common, neither have they caused men to discern between the unclean and the clean, and have hidden their eyes from my Sabbaths. So I am profaned among them. +\v 27 Her princes within it are like wolves ravening the prey, to shed blood and to destroy souls, that they may get dishonest gain. +\v 28 Her prophets have plastered for them with whitewash, seeing false visions, and divining lies to them, saying, ‘The Lord Yahweh says,’ when Yahweh has not spoken. +\v 29 The people of the land have used oppression and exercised robbery. Yes, they have troubled the poor and needy, and have oppressed the foreigner wrongfully. +\p +\v 30 “I sought for a man among them who would build up the wall and stand in the gap before me for the land, that I would not destroy it; but I found no one. +\v 31 Therefore I have poured out my indignation on them. I have consumed them with the fire of my wrath. I have brought their own way on their heads,” says the Lord Yahweh. +\c 23 +\p +\v 1 Yahweh’s word came again to me, saying, +\v 2 “Son of man, there were two women, the daughters of one mother. +\v 3 They played the prostitute in Egypt. They played the prostitute in their youth. Their breasts were fondled there, and their youthful nipples were caressed there. +\v 4 Their names were Oholah the elder, and Oholibah her sister. They became mine, and they bore sons and daughters. As for their names, Samaria is Oholah, and Jerusalem Oholibah. +\p +\v 5 “Oholah played the prostitute when she was mine. She doted on her lovers, on the Assyrians her neighbors, +\v 6 who were clothed with blue—governors and rulers, all of them desirable young men, horsemen riding on horses. +\v 7 She gave herself as a prostitute to them, all of them the choicest men of Assyria. She defiled herself with the idols of whoever she lusted after. +\v 8 She hasn’t left her prostitution since leaving Egypt; for in her youth they lay with her. They caressed her youthful nipples and they poured out their prostitution on her. +\p +\v 9 “Therefore I delivered her into the hand of her lovers, into the hand of the Assyrians on whom she doted. +\v 10 These uncovered her nakedness. They took her sons and her daughters, and they killed her with the sword. She became a byword among women; for they executed judgments on her. +\p +\v 11 “Her sister Oholibah saw this, yet she was more corrupt in her lusting than she, and in her prostitution which was more depraved than the prostitution of her sister. +\v 12 She lusted after the Assyrians, governors and rulers—her neighbors, clothed most gorgeously, horsemen riding on horses, all of them desirable young men. +\v 13 I saw that she was defiled. They both went the same way. +\p +\v 14 “She increased her prostitution; for she saw men portrayed on the wall, the images of the Chaldeans portrayed with red, +\v 15 dressed with belts on their waists, with flowing turbans on their heads, all of them looking like princes, after the likeness of the Babylonians in Chaldea, the land of their birth. +\v 16 As soon as she saw them, she lusted after them and sent messengers to them into Chaldea. +\v 17 The Babylonians came to her into the bed of love, and they defiled her with their prostitution. She was polluted with them, and her soul was alienated from them. +\v 18 So she uncovered her prostitution and uncovered her nakedness. Then my soul was alienated from her, just like my soul was alienated from her sister. +\v 19 Yet she multiplied her prostitution, remembering the days of her youth, in which she had played the prostitute in the land of Egypt. +\v 20 She lusted after their lovers, whose flesh is as the flesh of donkeys, and whose issue is like the issue of horses. +\v 21 Thus you called to memory the lewdness of your youth, in the caressing of your nipples by the Egyptians because of your youthful breasts. +\p +\v 22 “Therefore, Oholibah, the Lord Yahweh says: ‘Behold, I will raise up your lovers against you, from whom your soul is alienated, and I will bring them against you on every side: +\v 23 the Babylonians and all the Chaldeans, Pekod, Shoa, Koa, and all the Assyrians with them; all of them desirable young men, governors and rulers, princes and men of renown, all of them riding on horses. +\v 24 They will come against you with weapons, chariots, and wagons, and with a company of peoples. They will set themselves against you with buckler, shield, and helmet all around. I will commit the judgment to them, and they will judge you according to their judgments. +\v 25 I will set my jealousy against you, and they will deal with you in fury. They will take away your nose and your ears. Your remnant will fall by the sword. They will take your sons and your daughters; and the rest of you will be devoured by the fire. +\v 26 They will also strip you of your clothes and take away your beautiful jewels. +\v 27 Thus I will make your lewdness to cease from you, and remove your prostitution from the land of Egypt, so that you will not lift up your eyes to them, nor remember Egypt any more.’ +\p +\v 28 “For the Lord Yahweh says: ‘Behold, I will deliver you into the hand of them whom you hate, into the hand of them from whom your soul is alienated. +\v 29 They will deal with you in hatred, and will take away all your labor, and will leave you naked and bare. The nakedness of your prostitution will be uncovered, both your lewdness and your prostitution. +\v 30 These things will be done to you because you have played the prostitute after the nations, and because you are polluted with their idols. +\v 31 You have walked in the way of your sister; therefore I will give her cup into your hand.’ +\p +\v 32 “The Lord Yahweh says: +\q1 ‘You will drink of your sister’s cup, +\q2 which is deep and large. +\q1 You will be ridiculed and held in derision. +\q2 It contains much. +\q1 +\v 33 You will be filled with drunkenness and sorrow, +\q2 with the cup of astonishment and desolation, +\q2 with the cup of your sister Samaria. +\q1 +\v 34 You will even drink it and drain it out. +\q2 You will gnaw the broken pieces of it, +\q2 and will tear your breasts; +\m for I have spoken it,’ says the Lord Yahweh. +\p +\v 35 “Therefore the Lord Yahweh says: ‘Because you have forgotten me and cast me behind your back, therefore you also bear your lewdness and your prostitution.’” +\p +\v 36 Yahweh said moreover to me: “Son of man, will you judge Oholah and Oholibah? Then declare to them their abominations. +\v 37 For they have committed adultery, and blood is in their hands. They have committed adultery with their idols. They have also caused their sons, whom they bore to me, to pass through the fire to them to be devoured. +\v 38 Moreover this they have done to me: they have defiled my sanctuary in the same day, and have profaned my Sabbaths. +\v 39 For when they had slain their children to their idols, then they came the same day into my sanctuary to profane it; and behold, they have done this in the middle of my house. +\p +\v 40 “Furthermore you sisters have sent for men who come from far away, to whom a messenger was sent, and behold, they came; for whom you washed yourself, painted your eyes, decorated yourself with ornaments, +\v 41 and sat on a stately bed, with a table prepared before it, whereupon you set my incense and my oil. +\p +\v 42 “The voice of a multitude being at ease was with her. With men of the common sort were brought drunkards from the wilderness; and they put bracelets on their hands, and beautiful crowns on their heads. +\v 43 Then I said of her who was old in adulteries, ‘Now they will play the prostitute with her, and she with them.’ +\v 44 They went in to her, as they go in to a prostitute. So they went in to Oholah and to Oholibah, the lewd women. +\v 45 Righteous men will judge them with the judgment of adulteresses and with the judgment of women who shed blood, because they are adulteresses, and blood is in their hands. +\p +\v 46 “For the Lord Yahweh says: ‘I will bring up a mob against them, and will give them to be tossed back and forth and robbed. +\v 47 The company will stone them with stones and dispatch them with their swords. They will kill their sons and their daughters, and burn up their houses with fire. +\p +\v 48 “‘Thus I will cause lewdness to cease out of the land, that all women may be taught not to be lewd like you. +\v 49 They will recompense your lewdness on you, and you will bear the sins of your idols. Then you will know that I am the Lord Yahweh.’” +\c 24 +\p +\v 1 Again, in the ninth year, in the tenth month, in the tenth day of the month, Yahweh’s word came to me, saying, +\v 2 “Son of man, write the name of the day, this same day. The king of Babylon drew close to Jerusalem this same day. +\v 3 Utter a parable to the rebellious house, and tell them, ‘The Lord Yahweh says, +\q1 “Put the cauldron on the fire. +\q2 Put it on, +\q2 and also pour water into it. +\q1 +\v 4 Gather its pieces into it, +\q2 even every good piece: +\q2 the thigh and the shoulder. +\q2 Fill it with the choice bones. +\q1 +\v 5 Take the choice of the flock, +\q2 and also a pile of wood for the bones under the cauldron. +\q1 Make it boil well. +\q2 Yes, let its bones be boiled within it.” +\m +\v 6 “‘Therefore the Lord Yahweh says: +\q1 “Woe to the bloody city, +\q2 to the cauldron whose rust is in it, +\q2 and whose rust hasn’t gone out of it! +\q1 Take out of it piece after piece +\q2 without casting lots for it. +\b +\q1 +\v 7 “‘“For the blood she shed is in the middle of her. +\q2 She set it on the bare rock. +\q1 She didn’t pour it on the ground, +\q2 to cover it with dust. +\q1 +\v 8 That it may cause wrath to come up to take vengeance, +\q2 I have set her blood on the bare rock, +\q2 that it should not be covered.” +\m +\v 9 “‘Therefore the Lord Yahweh says: +\q1 “Woe to the bloody city! +\q2 I also will make the pile great. +\q1 +\v 10 Heap on the wood. +\q2 Make the fire hot. +\q1 Boil the meat well. +\q2 Make the broth thick, +\q2 and let the bones be burned. +\q1 +\v 11 Then set it empty on its coals, +\q2 that it may be hot, +\q1 and its bronze may burn, +\q2 and that its filthiness may be molten in it, +\q2 that its rust may be consumed. +\q1 +\v 12 She is weary with toil; +\q2 yet her great rust, +\q2 rust by fire, doesn’t leave her. +\p +\v 13 “‘“In your filthiness is lewdness. Because I have cleansed you and you weren’t cleansed, you won’t be cleansed from your filthiness any more, until I have caused my wrath toward you to rest. +\p +\v 14 “‘“I, Yahweh, have spoken it. It will happen, and I will do it. I won’t go back. I won’t spare. I won’t repent. According to your ways and according to your doings, they will judge you,” says the Lord Yahweh.’” +\p +\v 15 Also Yahweh’s word came to me, saying, +\v 16 “Son of man, behold, I will take away from you the desire of your eyes with one stroke; yet you shall neither mourn nor weep, neither shall your tears run down. +\v 17 Sigh, but not aloud. Make no mourning for the dead. Bind your headdress on you, and put your sandals on your feet. Don’t cover your lips, and don’t eat mourner’s bread.” +\p +\v 18 So I spoke to the people in the morning, and at evening my wife died. So I did in the morning as I was commanded. +\p +\v 19 The people asked me, “Won’t you tell us what these things mean to us, that you act like this?” +\p +\v 20 Then I said to them, “Yahweh’s word came to me, saying, +\v 21 ‘Speak to the house of Israel, “The Lord Yahweh says: ‘Behold, I will profane my sanctuary, the pride of your power, the desire of your eyes, and that which your soul pities; and your sons and your daughters whom you have left behind will fall by the sword. +\v 22 You will do as I have done. You won’t cover your lips or eat mourner’s bread. +\v 23 Your turbans will be on your heads, and your sandals on your feet. You won’t mourn or weep; but you will pine away in your iniquities, and moan one toward another. +\v 24 Thus Ezekiel will be a sign to you; according to all that he has done, you will do. When this comes, then you will know that I am the Lord Yahweh.’”’” +\p +\v 25 “You, son of man, shouldn’t it be in the day when I take from them their strength, the joy of their glory, the desire of their eyes, and that whereupon they set their heart—their sons and their daughters— +\v 26 that in that day he who escapes will come to you, to cause you to hear it with your ears? +\v 27 In that day your mouth will be opened to him who has escaped, and you will speak and be no more mute. So you will be a sign to them. Then they will know that I am Yahweh.” +\c 25 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face toward the children of Ammon, and prophesy against them. +\v 3 Tell the children of Ammon, ‘Hear the word of the Lord Yahweh! The Lord Yahweh says, “Because you said, ‘Aha!’ against my sanctuary when it was profaned, and against the land of Israel when it was made desolate, and against the house of Judah when they went into captivity, +\v 4 therefore, behold, I will deliver you to the children of the east for a possession. They will set their encampments in you and make their dwellings in you. They will eat your fruit and they will drink your milk. +\v 5 I will make Rabbah a stable for camels and the children of Ammon a resting place for flocks. Then you will know that I am Yahweh.” +\v 6 For the Lord Yahweh says: “Because you have clapped your hands, stamped with the feet, and rejoiced with all the contempt of your soul against the land of Israel, +\v 7 therefore, behold, I have stretched out my hand on you, and will deliver you for a plunder to the nations. I will cut you off from the peoples, and I will cause you to perish out of the countries. I will destroy you. Then you will know that I am Yahweh.” +\p +\v 8 “‘The Lord Yahweh says: “Because Moab and Seir say, ‘Behold, the house of Judah is like all the nations,’ +\v 9 therefore, behold, I will open the side of Moab from the cities, from his cities which are on its frontiers, the glory of the country, Beth Jeshimoth, Baal Meon, and Kiriathaim, +\v 10 to the children of the east, to go against the children of Ammon; and I will give them for a possession, that the children of Ammon may not be remembered among the nations. +\v 11 I will execute judgments on Moab. Then they will know that I am Yahweh.” +\p +\v 12 “‘The Lord Yahweh says: “Because Edom has dealt against the house of Judah by taking vengeance, and has greatly offended, and taken revenge on them,” +\v 13 therefore the Lord Yahweh says, “I will stretch out my hand on Edom, and will cut off man and animal from it; and I will make it desolate from Teman. They will fall by the sword even to Dedan. +\v 14 I will lay my vengeance on Edom by the hand of my people Israel. They will do in Edom according to my anger and according to my wrath. Then they will know my vengeance,” says the Lord Yahweh. +\p +\v 15 “‘The Lord Yahweh says: “Because the Philistines have taken revenge, and have taken vengeance with contempt of soul to destroy with perpetual hostility,” +\v 16 therefore the Lord Yahweh says, “Behold, I will stretch out my hand on the Philistines, and I will cut off the Cherethites, and destroy the remnant of the sea coast. +\v 17 I will execute great vengeance on them with wrathful rebukes. Then they will know that I am Yahweh, when I lay my vengeance on them.”’” +\c 26 +\p +\v 1 In the eleventh year, in the first of the month, Yahweh’s word came to me, saying, +\v 2 “Son of man, because Tyre has said against Jerusalem, ‘Aha! She is broken! She who was the gateway of the peoples has been returned to me. I will be replenished, now that she is laid waste;’ +\v 3 therefore the Lord Yahweh says, ‘Behold, I am against you, Tyre, and will cause many nations to come up against you, as the sea causes its waves to come up. +\v 4 They will destroy the walls of Tyre, and break down her towers. I will also scrape her dust from her, and make her a bare rock. +\v 5 She will be a place for the spreading of nets in the middle of the sea; for I have spoken it,’ says the Lord Yahweh. ‘She will become plunder for the nations. +\v 6 Her daughters who are in the field will be slain with the sword. Then they will know that I am Yahweh.’ +\p +\v 7 “For the Lord Yahweh says: ‘Behold, I will bring on Tyre Nebuchadnezzar king of Babylon, king of kings, from the north, with horses, with chariots, with horsemen, and an army with many people. +\v 8 He will kill your daughters in the field with the sword. He will make forts against you, cast up a mound against you, and raise up the buckler against you. +\v 9 He will set his battering engines against your walls, and with his axes he will break down your towers. +\v 10 By reason of the abundance of his horses, their dust will cover you. Your walls will shake at the noise of the horsemen, of the wagons, and of the chariots, when he enters into your gates, as men enter into a city which is broken open. +\v 11 He will tread down all your streets with the hoofs of his horses. He will kill your people with the sword. The pillars of your strength will go down to the ground. +\v 12 They will make a plunder of your riches and make a prey of your merchandise. They will break down your walls and destroy your pleasant houses. They will lay your stones, your timber, and your dust in the middle of the waters. +\v 13 I will cause the noise of your songs to cease. The sound of your harps won’t be heard any more. +\v 14 I will make you a bare rock. You will be a place for the spreading of nets. You will be built no more; for I Yahweh have spoken it,’ says the Lord Yahweh. +\p +\v 15 “The Lord Yahweh says to Tyre: ‘Won’t the islands shake at the sound of your fall, when the wounded groan, when the slaughter is made within you? +\v 16 Then all the princes of the sea will come down from their thrones, and lay aside their robes, and strip off their embroidered garments. They will clothe themselves with trembling. They will sit on the ground, and will tremble every moment, and be astonished at you. +\v 17 They will take up a lamentation over you, and tell you, +\q1 “How you are destroyed, +\q2 who were inhabited by seafaring men, +\q1 the renowned city, +\q2 who was strong in the sea, +\q1 she and her inhabitants, +\q2 who caused their terror to be on all who lived there!” +\q1 +\v 18 Now the islands will tremble in the day of your fall. +\q2 Yes, the islands that are in the sea will be dismayed at your departure.’ +\p +\v 19 “For the Lord Yahweh says: ‘When I make you a desolate city, like the cities that are not inhabited, when I bring up the deep on you, and the great waters cover you, +\v 20 then I will bring you down with those who descend into the pit, to the people of old time, and will make you dwell in the lower parts of the earth, in the places that are desolate of old, with those who go down to the pit, that you be not inhabited; and I will set glory in the land of the living. +\v 21 I will make you a terror, and you will no more have any being. Though you are sought for, yet you will never be found again,’ says the Lord Yahweh.” +\c 27 +\p +\v 1 Yahweh’s word came again to me, saying, +\v 2 “You, son of man, take up a lamentation over Tyre; +\v 3 and tell Tyre, ‘You who dwell at the entry of the sea, who are the merchant of the peoples to many islands, the Lord Yahweh says: +\q1 “You, Tyre, have said, +\q2 ‘I am perfect in beauty.’ +\q1 +\v 4 Your borders are in the heart of the seas. +\q2 Your builders have perfected your beauty. +\q1 +\v 5 They have made all your planks of cypress trees from Senir. +\q2 They have taken a cedar from Lebanon to make a mast for you. +\q1 +\v 6 They have made your oars of the oaks of Bashan. +\q2 They have made your benches of ivory inlaid in cypress wood from the islands of Kittim. +\q1 +\v 7 Your sail was of fine linen with embroidered work from Egypt, +\q2 that it might be to you for a banner. +\q2 Blue and purple from the islands of Elishah was your awning. +\q1 +\v 8 The inhabitants of Sidon and Arvad were your rowers. +\q2 Your wise men, Tyre, were in you. +\q2 They were your pilots. +\q1 +\v 9 The old men of Gebal +\q2 and its wise men were your repairers of ship seams in you. +\q1 All the ships of the sea with their mariners were in you +\q2 to deal in your merchandise. +\b +\q1 +\v 10 “‘“Persia, Lud, and Put were in your army, +\q2 your men of war. +\q1 They hung the shield and helmet in you. +\q2 They showed your beauty. +\q1 +\v 11 The men of Arvad with your army were on your walls all around, +\q2 and valiant men were in your towers. +\q1 They hung their shields on your walls all around. +\q2 They have perfected your beauty. +\p +\v 12 “‘“Tarshish was your merchant by reason of the multitude of all kinds of riches. They traded for your wares with silver, iron, tin, and lead. +\p +\v 13 “‘“Javan, Tubal, and Meshech were your traders. They traded the persons of men and vessels of bronze for your merchandise. +\p +\v 14 “‘“They of the house of Togarmah traded for your wares with horses, war horses, and mules. +\p +\v 15 “‘“The men of Dedan traded with you. Many islands were the market of your hand. They brought you horns of ivory and ebony in exchange. +\p +\v 16 “‘“Syria was your merchant by reason of the multitude of your handiworks. They traded for your wares with emeralds, purple, embroidered work, fine linen, coral, and rubies. +\p +\v 17 “‘“Judah and the land of Israel were your traders. They traded wheat of Minnith, confections, honey, oil, and balm for your merchandise. +\p +\v 18 “‘“Damascus was your merchant for the multitude of your handiworks by reason of the multitude of all kinds of riches, with the wine of Helbon, and white wool. +\p +\v 19 “‘“Vedan and Javan traded with yarn for your wares; wrought iron, cassia, and calamus were among your merchandise. +\p +\v 20 “‘“Dedan was your merchant in precious saddle blankets for riding. +\p +\v 21 “‘“Arabia and all the princes of Kedar were your favorite dealers in lambs, rams, and goats. In these, they were your merchants. +\p +\v 22 “‘“The traders of Sheba and Raamah were your traders. They traded for your wares with the best of all spices, all precious stones, and gold. +\p +\v 23 “‘“Haran, Canneh, Eden, the traders of Sheba, Asshur and Chilmad, were your traders. +\v 24 These were your traders in choice wares, in wrappings of blue and embroidered work, and in cedar chests of rich clothing bound with cords, among your merchandise. +\q1 +\v 25 “‘“The ships of Tarshish were your caravans for your merchandise. +\q2 You were replenished +\q2 and made very glorious in the heart of the seas. +\q1 +\v 26 Your rowers have brought you into great waters. +\q2 The east wind has broken you in the heart of the seas. +\q1 +\v 27 Your riches, your wares, your merchandise, +\q2 your mariners, your pilots, your repairers of ship seams, +\q1 the dealers in your merchandise, +\q2 and all your men of war who are in you, +\q1 with all your company which is among you, +\q2 will fall into the heart of the seas in the day of your ruin. +\q1 +\v 28 At the sound of the cry of your pilots, +\q2 the pasture lands will shake. +\q1 +\v 29 All who handle the oars, +\q2 the mariners and all the pilots of the sea, +\q2 will come down from their ships. +\q1 They will stand on the land, +\q2 +\v 30 and will cause their voice to be heard over you, +\q2 and will cry bitterly. +\q1 They will cast up dust on their heads. +\q2 They will wallow in the ashes. +\q1 +\v 31 They will make themselves bald for you, +\q2 and clothe themselves with sackcloth. +\q1 They will weep for you in bitterness of soul, +\q2 with bitter mourning. +\q1 +\v 32 In their wailing they will take up a lamentation for you, +\q2 and lament over you, saying, +\q1 ‘Who is there like Tyre, +\q2 like her who is brought to silence in the middle of the sea?’ +\q1 +\v 33 When your wares came from the seas, +\q2 you filled many peoples. +\q1 You enriched the kings of the earth +\q2 with the multitude of your riches and of your merchandise. +\q1 +\v 34 In the time that you were broken by the seas, +\q2 in the depths of the waters, +\q2 your merchandise and all your company fell within you. +\q1 +\v 35 All the inhabitants of the islands are astonished at you, +\q2 and their kings are horribly afraid. +\q2 They are troubled in their face. +\q1 +\v 36 The merchants among the peoples hiss at you. +\q2 You have come to a terrible end, +\q2 and you will be no more.”’” +\c 28 +\p +\v 1 Yahweh’s word came again to me, saying, +\v 2 “Son of man, tell the prince of Tyre, ‘The Lord Yahweh says: +\q1 “Because your heart is lifted up, +\q2 and you have said, ‘I am a god, +\q1 I sit in the seat of God, +\q2 in the middle of the seas;’ +\q1 yet you are man, +\q2 and no god, +\q2 though you set your heart as the heart of a god— +\q1 +\v 3 behold, you are wiser than Daniel. +\q2 There is no secret that is hidden from you. +\q1 +\v 4 By your wisdom and by your understanding you have gotten yourself riches, +\q2 and have gotten gold and silver into your treasuries. +\q1 +\v 5 By your great wisdom +\q2 and by your trading you have increased your riches, +\q2 and your heart is lifted up because of your riches—” +\p +\v 6 “‘therefore the Lord Yahweh says: +\q1 “Because you have set your heart as the heart of God, +\q2 +\v 7 therefore, behold, I will bring strangers on you, +\q2 the terrible of the nations. +\q1 They will draw their swords against the beauty of your wisdom. +\q2 They will defile your brightness. +\q1 +\v 8 They will bring you down to the pit. +\q2 You will die the death of those who are slain +\q2 in the heart of the seas. +\q1 +\v 9 Will you yet say before him who kills you, ‘I am God’? +\q2 But you are man, and not God, +\q2 in the hand of him who wounds you. +\q1 +\v 10 You will die the death of the uncircumcised +\q2 by the hand of strangers; +\q2 for I have spoken it,” says the Lord Yahweh.’” +\b +\p +\v 11 Moreover Yahweh’s word came to me, saying, +\v 12 “Son of man, take up a lamentation over the king of Tyre, and tell him, ‘The Lord Yahweh says: +\q1 “You were the seal of full measure, +\q2 full of wisdom, +\q2 and perfect in beauty. +\q1 +\v 13 You were in Eden, +\q2 the garden of God. +\q1 Every precious stone adorned you: +\q2 ruby, topaz, emerald, +\q2 chrysolite, onyx, jasper, +\q2 sapphire,\f + \fr 28:13 \ft or, lapis lazuli \f* turquoise, and beryl. +\q1 Gold work of tambourines +\q2 and of pipes was in you. +\q2 They were prepared in the day that you were created. +\q1 +\v 14 You were the anointed cherub who covers. +\q2 Then I set you up on the holy mountain of God. +\q2 You have walked up and down in the middle of the stones of fire. +\q1 +\v 15 You were perfect in your ways from the day that you were created, +\q2 until unrighteousness was found in you. +\q1 +\v 16 By the abundance of your commerce, your insides were filled with violence, +\q2 and you have sinned. +\q1 Therefore I have cast you as profane out of God’s mountain. +\q2 I have destroyed you, covering cherub, +\q2 from the middle of the stones of fire. +\q1 +\v 17 Your heart was lifted up because of your beauty. +\q2 You have corrupted your wisdom by reason of your splendor. +\q1 I have cast you to the ground. +\q2 I have laid you before kings, +\q2 that they may see you. +\q1 +\v 18 By the multitude of your iniquities, +\q2 in the unrighteousness of your commerce, +\q2 you have profaned your sanctuaries. +\q1 Therefore I have brought out a fire from the middle of you. +\q2 It has devoured you. +\q1 I have turned you to ashes on the earth +\q2 in the sight of all those who see you. +\q1 +\v 19 All those who know you among the peoples will be astonished at you. +\q2 You have become a terror, +\q2 and you will exist no more.”’” +\b +\p +\v 20 Yahweh’s word came to me, saying, +\v 21 “Son of man, set your face toward Sidon, and prophesy against it, +\v 22 and say, ‘The Lord Yahweh says: +\q1 “Behold, I am against you, Sidon. +\q2 I will be glorified among you. +\q1 Then they will know that I am Yahweh, +\q2 when I have executed judgments in her, +\q2 and am sanctified in her. +\q1 +\v 23 For I will send pestilence into her, +\q2 and blood into her streets. +\q1 The wounded will fall within her, +\q2 with the sword on her on every side. +\q2 Then they will know that I am Yahweh. +\p +\v 24 “‘“There will no longer be a pricking brier to the house of Israel, nor a hurting thorn of any that are around them that scorned them. Then they will know that I am the Lord Yahweh.” +\p +\v 25 “‘The Lord Yahweh says: “When I have gathered the house of Israel from the peoples among whom they are scattered, and am shown as holy among them in the sight of the nations, then they will dwell in their own land which I gave to my servant Jacob. +\v 26 They will dwell in it securely. Yes, they will build houses, plant vineyards, and will dwell securely when I have executed judgments on all those around them who have treated them with contempt. Then they will know that I am Yahweh their God.”’” +\c 29 +\p +\v 1 In the tenth year, in the tenth month, on the twelfth day of the month, Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face against Pharaoh king of Egypt, and prophesy against him and against all Egypt. +\v 3 Speak and say, ‘The Lord Yahweh says: +\q1 “Behold, I am against you, Pharaoh king of Egypt, +\q2 the great monster that lies in the middle of his rivers, +\q1 that has said, ‘My river is my own, +\q2 and I have made it for myself.’ +\q1 +\v 4 I will put hooks in your jaws, +\q2 and I will make the fish of your rivers stick to your scales. +\q1 I will bring you up out of the middle of your rivers, +\q2 with all the fish of your rivers which stick to your scales. +\q1 +\v 5 I’ll cast you out into the wilderness, +\q2 you and all the fish of your rivers. +\q1 You’ll fall on the open field. +\q2 You won’t be brought together or gathered. +\q1 I have given you for food to the animals of the earth +\q2 and to the birds of the sky. +\p +\v 6 “‘“All the inhabitants of Egypt will know that I am Yahweh, because they have been a staff of reed to the house of Israel. +\v 7 When they took hold of you by your hand, you broke and tore all their shoulders. When they leaned on you, you broke and paralyzed all of their thighs.” +\p +\v 8 “‘Therefore the Lord Yahweh says: “Behold, I will bring a sword on you, and will cut off man and animal from you. +\v 9 The land of Egypt will be a desolation and a waste. Then they will know that I am Yahweh. +\p “‘“Because he has said, ‘The river is mine, and I have made it,’ +\v 10 therefore, behold, I am against you and against your rivers. I will make the land of Egypt an utter waste and desolation, from the tower of Seveneh even to the border of Ethiopia. +\v 11 No foot of man will pass through it, nor will any animal foot pass through it. It won’t be inhabited for forty years. +\v 12 I will make the land of Egypt a desolation in the middle of the countries that are desolate. Her cities among the cities that are laid waste will be a desolation forty years. I will scatter the Egyptians among the nations, and will disperse them through the countries.” +\p +\v 13 “‘For the Lord Yahweh says: “At the end of forty years I will gather the Egyptians from the peoples where they were scattered. +\v 14 I will reverse the captivity of Egypt, and will cause them to return into the land of Pathros, into the land of their birth. There they will be a lowly kingdom. +\v 15 It will be the lowest of the kingdoms. It won’t lift itself up above the nations any more. I will diminish them so that they will no longer rule over the nations. +\v 16 It will no longer be the confidence of the house of Israel, bringing iniquity to memory, when they turn to look after them. Then they will know that I am the Lord Yahweh.”’” +\b +\p +\v 17 It came to pass in the twenty-seventh year, in the first month, in the first day of the month, Yahweh’s word came to me, saying, +\v 18 “Son of man, Nebuchadnezzar king of Babylon caused his army to serve a great service against Tyre. Every head was made bald, and every shoulder was worn; yet he had no wages, nor did his army, from Tyre, for the service that he had served against it. +\v 19 Therefore the Lord Yahweh says: ‘Behold, I will give the land of Egypt to Nebuchadnezzar king of Babylon. He will carry off her multitude, take her plunder, and take her prey. That will be the wages for his army. +\v 20 I have given him the land of Egypt as his payment for which he served, because they worked for me,’ says the Lord Yahweh. +\p +\v 21 “In that day I will cause a horn to sprout for the house of Israel, and I will open your mouth among them. Then they will know that I am Yahweh.” +\c 30 +\p +\v 1 Yahweh’s word came again to me, saying, +\v 2 “Son of man, prophesy, and say, ‘The Lord Yahweh says: +\q1 “Wail, ‘Alas for the day!’ +\q2 +\v 3 For the day is near, +\q2 even Yahweh’s day is near. +\q1 It will be a day of clouds, +\q2 a time of the nations. +\q1 +\v 4 A sword will come on Egypt, +\q2 and anguish will be in Ethiopia, +\q2 when the slain fall in Egypt. +\q1 They take away her multitude, +\q2 and her foundations are broken down. +\p +\v 5 “‘“Ethiopia, Put, Lud, all the mixed people, Cub, and the children of the land that is allied with them, will fall with them by the sword.” +\p +\v 6 “‘Yahweh says: +\q1 “They also who uphold Egypt will fall. +\q2 The pride of her power will come down. +\q1 They will fall by the sword in it from the tower of Seveneh,” +\q2 says the Lord Yahweh. +\q1 +\v 7 “They will be desolate in the middle of the countries that are desolate. +\q2 Her cities will be among the cities that are wasted. +\q1 +\v 8 They will know that I am Yahweh +\q2 when I have set a fire in Egypt, +\q2 and all her helpers are destroyed. +\p +\v 9 “‘“In that day messengers will go out from before me in ships to make the careless Ethiopians afraid. There will be anguish on them, as in the day of Egypt; for, behold, it comes.” +\p +\v 10 “‘The Lord Yahweh says: +\q1 “I will also make the multitude of Egypt to cease, +\q2 by the hand of Nebuchadnezzar king of Babylon. +\q1 +\v 11 He and his people with him, +\q2 the terrible of the nations, +\q1 will be brought in to destroy the land. +\q2 They will draw their swords against Egypt, +\q2 and fill the land with the slain. +\q1 +\v 12 I will make the rivers dry, +\q2 and will sell the land into the hand of evil men. +\q1 I will make the land desolate, +\q2 and all that is therein, +\q2 by the hand of foreigners. +\q2 I, Yahweh, have spoken it.” +\p +\v 13 “‘The Lord Yahweh says: +\q1 “I will also destroy the idols, +\q2 and I will cause the images to cease from Memphis. +\q1 There will be no more a prince from the land of Egypt. +\q2 I will put a fear in the land of Egypt. +\q1 +\v 14 I will make Pathros desolate, +\q2 and will set a fire in Zoan, +\q2 and will execute judgments on No. +\q1 +\v 15 I will pour my wrath on Sin, +\q2 the stronghold of Egypt. +\q2 I will cut off the multitude of No. +\q1 +\v 16 I will set a fire in Egypt +\q2 Sin will be in great anguish. +\q1 No will be broken up. +\q2 Memphis will have adversaries in the daytime. +\q1 +\v 17 The young men of Aven and of Pibeseth will fall by the sword. +\q2 They will go into captivity. +\q1 +\v 18 At Tehaphnehes also the day will withdraw itself, +\q2 when I break the yokes of Egypt there. +\q1 The pride of her power will cease in her. +\q2 As for her, a cloud will cover her, +\q2 and her daughters will go into captivity. +\q1 +\v 19 Thus I will execute judgments on Egypt. +\q2 Then they will know that I am Yahweh.”’” +\b +\p +\v 20 In the eleventh year, in the first month, in the seventh day of the month, Yahweh’s word came to me, saying, +\v 21 “Son of man, I have broken the arm of Pharaoh king of Egypt. Behold, it has not been bound up, to apply medicines, to put a bandage to bind it, that it may become strong to hold the sword. +\v 22 Therefore the Lord Yahweh says: ‘Behold, I am against Pharaoh king of Egypt, and will break his arms, the strong arm, and that which was broken. I will cause the sword to fall out of his hand. +\v 23 I will scatter the Egyptians among the nations, and will disperse them through the countries. +\v 24 I will strengthen the arms of the king of Babylon, and put my sword in his hand; but I will break the arms of Pharaoh, and he will groan before the king of Babylon with the groaning of a mortally wounded man. +\v 25 I will hold up the arms of the king of Babylon, but the arms of Pharaoh will fall down. Then they will know that I am Yahweh when I put my sword into the hand of the king of Babylon, and he stretches it out on the land of Egypt. +\v 26 I will scatter the Egyptians among the nations and disperse them through the countries. Then they will know that I am Yahweh.’” +\c 31 +\p +\v 1 In the eleventh year, in the third month, in the first day of the month, Yahweh’s word came to me, saying, +\v 2 “Son of man, tell Pharaoh king of Egypt and his multitude: +\q1 ‘Whom are you like in your greatness? +\q1 +\v 3 Behold, the Assyrian was a cedar in Lebanon +\q2 with beautiful branches, +\q1 and with a forest-like shade, +\q2 of high stature; +\q2 and its top was among the thick boughs. +\q1 +\v 4 The waters nourished it. +\q2 The deep made it to grow. +\q1 Its rivers ran all around its plantation. +\q2 It sent out its channels to all the trees of the field. +\q1 +\v 5 Therefore its stature was exalted above all the trees of the field; +\q2 and its boughs were multiplied. +\q1 Its branches became long by reason of many waters, +\q2 when it spread them out. +\q1 +\v 6 All the birds of the sky made their nests in its boughs. +\q2 Under its branches, all the animals of the field gave birth to their young. +\q2 All great nations lived under its shadow. +\q1 +\v 7 Thus it was beautiful in its greatness, +\q2 in the length of its branches; +\q2 for its root was by many waters. +\q1 +\v 8 The cedars in the garden of God could not hide it. +\q2 The cypress trees were not like its branches. +\q1 The pine trees were not like its branches; +\q2 nor was any tree in the garden of God like it in its beauty. +\q1 +\v 9 I made it beautiful by the multitude of its branches, +\q2 so that all the trees of Eden, +\q2 that were in the garden of God, envied it.’ +\p +\v 10 “Therefore thus said the Lord Yahweh: ‘Because he is exalted in stature, and he has set his top among the thick branches, and his heart is lifted up in his height, +\v 11 I will deliver him into the hand of the mighty one of the nations. He will surely deal with him. I have driven him out for his wickedness. +\v 12 Foreigners, the tyrants of the nations, have cut him off and have left him. His branches have fallen on the mountains and in all the valleys, and his boughs are broken by all the watercourses of the land. All the peoples of the earth have gone down from his shadow and have left him. +\v 13 All the birds of the sky will dwell on his ruin, and all the animals of the field will be on his branches, +\v 14 to the end that none of all the trees by the waters exalt themselves in their stature, and don’t set their top among the thick boughs. Their mighty ones don’t stand up on their height, even all who drink water; for they are all delivered to death, to the lower parts of the earth, among the children of men, with those who go down to the pit.’ +\p +\v 15 “The Lord Yahweh says: ‘In the day when he went down to Sheol,\f + \fr 31:15 \ft Sheol is the place of the dead.\f* I caused a mourning. I covered the deep for him, and I restrained its rivers. The great waters were stopped. I caused Lebanon to mourn for him, and all the trees of the field fainted for him. +\v 16 I made the nations to shake at the sound of his fall, when I cast him down to Sheol\f + \fr 31:16 \ft Sheol is the place of the dead.\f* with those who descend into the pit. All the trees of Eden, the choice and best of Lebanon, all that drink water, were comforted in the lower parts of the earth. +\v 17 They also went down into Sheol with him to those who are slain by the sword; yes, those who were his arm, who lived under his shadow in the middle of the nations. +\p +\v 18 “‘To whom are you thus like in glory and in greatness among the trees of Eden? Yet you will be brought down with the trees of Eden to the lower parts of the earth. You will lie in the middle of the uncircumcised, with those who are slain by the sword. +\p “‘This is Pharaoh and all his multitude,’ says the Lord Yahweh.” +\c 32 +\p +\v 1 In the twelfth year, in the twelfth month, in the first day of the month, “Yahweh’s word came to me, saying, +\v 2 ‘Son of man, take up a lamentation over Pharaoh king of Egypt, and tell him, +\q1 “You were likened to a young lion of the nations; +\q2 yet you are as a monster in the seas. +\q1 You broke out with your rivers, +\q2 and troubled the waters with your feet, +\q2 and fouled their rivers.” +\q1 +\v 3 The Lord Yahweh says: +\q2 “I will spread out my net on you with a company of many peoples. +\q2 They will bring you up in my net. +\q1 +\v 4 I will leave you on the land. +\q2 I will cast you out on the open field, +\q1 and will cause all the birds of the sky to settle on you. +\q2 I will satisfy the animals of the whole earth with you. +\q1 +\v 5 I will lay your flesh on the mountains, +\q2 and fill the valleys with your height. +\q1 +\v 6 I will also water the land in which you swim with your blood, +\q2 even to the mountains. +\q2 The watercourses will be full of you. +\q1 +\v 7 When I extinguish you, I will cover the heavens +\q2 and make its stars dark. +\q1 I will cover the sun with a cloud, +\q2 and the moon won’t give its light. +\q1 +\v 8 I will make all the bright lights of the sky dark over you, +\q2 and set darkness on your land,” says the Lord Yahweh. +\q1 +\v 9 “I will also trouble the hearts of many peoples, +\q2 when I bring your destruction among the nations, +\q2 into the countries which you have not known. +\q1 +\v 10 Yes, I will make many peoples amazed at you, +\q2 and their kings will be horribly afraid for you, +\q1 when I brandish my sword before them. +\q2 They will tremble at every moment, +\q1 every man for his own life, +\q2 in the day of your fall.” +\q1 +\v 11 For the Lord Yahweh says: +\q2 “The sword of the king of Babylon will come on you. +\q1 +\v 12 I will cause your multitude to fall by the swords of the mighty. +\q2 They are all the ruthless of the nations. +\q1 They will bring the pride of Egypt to nothing, +\q2 and all its multitude will be destroyed. +\q1 +\v 13 I will destroy also all its animals from beside many waters. +\q2 The foot of man won’t trouble them any more, +\q2 nor will the hoofs of animals trouble them. +\q1 +\v 14 Then I will make their waters clear, +\q2 and cause their rivers to run like oil,” +\q2 says the Lord Yahweh. +\q1 +\v 15 “When I make the land of Egypt desolate and waste, +\q2 a land destitute of that of which it was full, +\q1 when I strike all those who dwell therein, +\q2 then they will know that I am Yahweh. +\p +\v 16 “‘“This is the lamentation with which they will lament. The daughters of the nations will lament with this. They will lament with it over Egypt, and over all her multitude,” says the Lord Yahweh.’” +\b +\p +\v 17 Also in the twelfth year, in the fifteenth day of the month, Yahweh’s word came to me, saying, +\v 18 “Son of man, wail for the multitude of Egypt, and cast them down, even her and the daughters of the famous nations, to the lower parts of the earth, with those who go down into the pit. +\v 19 Whom do you pass in beauty? Go down, and be laid with the uncircumcised. +\v 20 They will fall among those who are slain by the sword. She is delivered to the sword. Draw her away with all her multitudes. +\v 21 The strong among the mighty will speak to him out of the middle of Sheol\f + \fr 32:21 \ft Sheol is the place of the dead.\f* with those who help him. They have gone down. The uncircumcised lie still, slain by the sword. +\p +\v 22 “Asshur is there with all her company. Her graves are all around her. All of them are slain, fallen by the sword, +\v 23 whose graves are set in the uttermost parts of the pit, and her company is around her grave, all of them slain, fallen by the sword, who caused terror in the land of the living. +\p +\v 24 “There is Elam and all her multitude around her grave; all of them slain, fallen by the sword, who have gone down uncircumcised into the lower parts of the earth, who caused their terror in the land of the living, and have borne their shame with those who go down to the pit. +\v 25 They have made Elam a bed among the slain with all her multitude. Her graves are around her, all of them uncircumcised, slain by the sword; for their terror was caused in the land of the living, and they have borne their shame with those who go down to the pit. He is put among those who are slain. +\p +\v 26 “There is Meshech, Tubal, and all their multitude. Their graves are around them, all of them uncircumcised, slain by the sword; for they caused their terror in the land of the living. +\v 27 They will not lie with the mighty who are fallen of the uncircumcised, who have gone down to Sheol with their weapons of war and have laid their swords under their heads. Their iniquities are on their bones; for they were the terror of the mighty in the land of the living. +\p +\v 28 “But you will be broken among the uncircumcised, and will lie with those who are slain by the sword. +\p +\v 29 “There is Edom, her kings, and all her princes, who in their might are laid with those who are slain by the sword. They will lie with the uncircumcised, and with those who go down to the pit. +\p +\v 30 “There are the princes of the north, all of them, and all the Sidonians, who have gone down with the slain. They are put to shame in the terror which they caused by their might. They lie uncircumcised with those who are slain by the sword, and bear their shame with those who go down to the pit. +\p +\v 31 “Pharaoh will see them and will be comforted over all his multitude, even Pharaoh and all his army, slain by the sword,” says the Lord Yahweh. +\v 32 “For I have put his terror in the land of the living. He will be laid among the uncircumcised, with those who are slain by the sword, even Pharaoh and all his multitude,” says the Lord Yahweh. +\c 33 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, speak to the children of your people, and tell them, ‘When I bring the sword on a land, and the people of the land take a man from among them, and set him for their watchman, +\v 3 if, when he sees the sword come on the land, he blows the trumpet and warns the people, +\v 4 then whoever hears the sound of the trumpet and doesn’t heed the warning, if the sword comes and takes him away, his blood will be on his own head. +\v 5 He heard the sound of the trumpet and didn’t take warning. His blood will be on him; whereas if he had heeded the warning, he would have delivered his soul. +\v 6 But if the watchman sees the sword come and doesn’t blow the trumpet, and the people aren’t warned, and the sword comes and takes any person from among them, he is taken away in his iniquity, but his blood I will require at the watchman’s hand.’ +\p +\v 7 “So you, son of man, I have set you a watchman to the house of Israel. Therefore hear the word from my mouth, and give them warnings from me. +\v 8 When I tell the wicked, ‘O wicked man, you will surely die,’ and you don’t speak to warn the wicked from his way, that wicked man will die in his iniquity, but I will require his blood at your hand. +\v 9 Nevertheless, if you warn the wicked of his way to turn from it, and he doesn’t turn from his way; he will die in his iniquity, but you have delivered your soul. +\p +\v 10 “You, son of man, tell the house of Israel: ‘You say this, “Our transgressions and our sins are on us, and we pine away in them. How then can we live?”’ +\v 11 Tell them, ‘“As I live,” says the Lord Yahweh, “I have no pleasure in the death of the wicked, but that the wicked turn from his way and live. Turn, turn from your evil ways! For why will you die, house of Israel?”’ +\p +\v 12 “You, son of man, tell the children of your people, ‘The righteousness of the righteous will not deliver him in the day of his disobedience. And as for the wickedness of the wicked, he will not fall by it in the day that he turns from his wickedness; neither will he who is righteous be able to live by it in the day that he sins. +\v 13 When I tell the righteous that he will surely live, if he trusts in his righteousness and commits iniquity, none of his righteous deeds will be remembered; but he will die in his iniquity that he has committed. +\v 14 Again, when I say to the wicked, “You will surely die,” if he turns from his sin and does that which is lawful and right, +\v 15 if the wicked restore the pledge, give again that which he had taken by robbery, walk in the statutes of life, committing no iniquity, he will surely live. He will not die. +\v 16 None of his sins that he has committed will be remembered against him. He has done that which is lawful and right. He will surely live. +\p +\v 17 “‘Yet the children of your people say, “The way of the Lord is not fair;” but as for them, their way is not fair. +\v 18 When the righteous turns from his righteousness and commits iniquity, he will even die therein. +\v 19 When the wicked turns from his wickedness and does that which is lawful and right, he will live by it. +\v 20 Yet you say, “The way of the Lord is not fair.” House of Israel, I will judge every one of you after his ways.’” +\b +\p +\v 21 In the twelfth year of our captivity, in the tenth month, in the fifth day of the month, one who had escaped out of Jerusalem came to me, saying, “The city has been defeated!” +\v 22 Now Yahweh’s hand had been on me in the evening, before he who had escaped came; and he had opened my mouth until he came to me in the morning; and my mouth was opened, and I was no longer mute. +\p +\v 23 Yahweh’s word came to me, saying, +\v 24 “Son of man, those who inhabit the waste places in the land of Israel speak, saying, ‘Abraham was one, and he inherited the land; but we are many. The land is given us for inheritance.’ +\v 25 Therefore tell them, ‘The Lord Yahweh says: “You eat with the blood, and lift up your eyes to your idols, and shed blood. So should you possess the land? +\v 26 You stand on your sword, you work abomination, and every one of you defiles his neighbor’s wife. So should you possess the land?”’ +\p +\v 27 “You shall tell them, ‘The Lord Yahweh says: “As I live, surely those who are in the waste places will fall by the sword. I will give whoever is in the open field to the animals to be devoured, and those who are in the strongholds and in the caves will die of the pestilence. +\v 28 I will make the land a desolation and an astonishment. The pride of her power will cease. The mountains of Israel will be desolate, so that no one will pass through. +\v 29 Then they will know that I am Yahweh, when I have made the land a desolation and an astonishment because of all their abominations which they have committed.”’ +\p +\v 30 “As for you, son of man, the children of your people talk about you by the walls and in the doors of the houses, and speak to one another, everyone to his brother, saying, ‘Please come and hear what the word is that comes out from Yahweh.’ +\v 31 They come to you as the people come, and they sit before you as my people, and they hear your words, but don’t do them; for with their mouth they show much love, but their heart goes after their gain. +\v 32 Behold, you are to them as a very lovely song of one who has a pleasant voice, and can play well on an instrument; for they hear your words, but they don’t do them. +\p +\v 33 “When this comes to pass—behold, it comes—then they will know that a prophet has been among them.” +\c 34 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, prophesy against the shepherds of Israel. Prophesy, and tell them, even the shepherds, ‘The Lord Yahweh says: “Woe to the shepherds of Israel who feed themselves! Shouldn’t the shepherds feed the sheep? +\v 3 You eat the fat. You clothe yourself with the wool. You kill the fatlings, but you don’t feed the sheep. +\v 4 You haven’t strengthened the diseased. You haven’t healed that which was sick. You haven’t bound up that which was broken. You haven’t brought back that which was driven away. You haven’t sought that which was lost, but you have ruled over them with force and with rigor. +\v 5 They were scattered, because there was no shepherd. They became food to all the animals of the field, and were scattered. +\v 6 My sheep wandered through all the mountains and on every high hill. Yes, my sheep were scattered on all the surface of the earth. There was no one who searched or sought.” +\p +\v 7 “‘Therefore, you shepherds, hear Yahweh’s word: +\v 8 “As I live,” says the Lord Yahweh, “surely because my sheep became a prey, and my sheep became food to all the animals of the field, because there was no shepherd, and my shepherds didn’t search for my sheep, but the shepherds fed themselves, and didn’t feed my sheep, +\v 9 therefore, you shepherds, hear Yahweh’s word!” +\v 10 The Lord Yahweh says: “Behold, I am against the shepherds. I will require my sheep at their hand, and cause them to cease from feeding the sheep. The shepherds won’t feed themselves any more. I will deliver my sheep from their mouth, that they may not be food for them.” +\p +\v 11 “‘For the Lord Yahweh says: “Behold, I myself, even I, will search for my sheep, and will seek them out. +\v 12 As a shepherd seeks out his flock in the day that he is among his sheep that are scattered abroad, so I will seek out my sheep. I will deliver them out of all places where they have been scattered in the cloudy and dark day. +\v 13 I will bring them out from the peoples, and gather them from the countries, and will bring them into their own land. I will feed them on the mountains of Israel, by the watercourses, and in all the inhabited places of the country. +\v 14 I will feed them with good pasture, and their fold will be on the mountains of the height of Israel. There they will lie down in a good fold. They will feed on rich pasture on the mountains of Israel. +\v 15 I myself will be the shepherd of my sheep, and I will cause them to lie down,” says the Lord Yahweh. +\v 16 “I will seek that which was lost, and will bring back that which was driven away, and will bind up that which was broken, and will strengthen that which was sick; but I will destroy the fat and the strong. I will feed them in justice.”’ +\p +\v 17 “As for you, O my flock, the Lord Yahweh says: ‘Behold, I judge between sheep and sheep, the rams and the male goats. +\v 18 Does it seem a small thing to you to have fed on the good pasture, but you must tread down with your feet the residue of your pasture? And to have drunk of the clear waters, but must you foul the residue with your feet? +\v 19 As for my sheep, they eat that which you have trodden with your feet, and they drink that which you have fouled with your feet.’ +\p +\v 20 “Therefore the Lord Yahweh says to them: ‘Behold, I, even I, will judge between the fat sheep and the lean sheep. +\v 21 Because you thrust with side and with shoulder, and push all the diseased with your horns, until you have scattered them abroad, +\v 22 therefore I will save my flock, and they will no more be a prey. I will judge between sheep and sheep. +\v 23 I will set up one shepherd over them, and he will feed them, even my servant David. He will feed them, and he will be their shepherd. +\v 24 I, Yahweh, will be their God, and my servant David prince among them. I, Yahweh, have spoken it. +\p +\v 25 “‘I will make with them a covenant of peace, and will cause evil animals to cease out of the land. They will dwell securely in the wilderness and sleep in the woods. +\v 26 I will make them and the places around my hill a blessing. I will cause the shower to come down in its season. There will be showers of blessing. +\v 27 The tree of the field will yield its fruit, and the earth will yield its increase, and they will be secure in their land. Then they will know that I am Yahweh, when I have broken the bars of their yoke, and have delivered them out of the hand of those who made slaves of them. +\v 28 They will no more be a prey to the nations, neither will the animals of the earth devour them; but they will dwell securely, and no one will make them afraid. +\v 29 I will raise up to them a plantation for renown, and they will no more be consumed with famine in the land, and not bear the shame of the nations any more. +\v 30 They will know that I, Yahweh, their God am with them, and that they, the house of Israel, are my people, says the Lord Yahweh. +\v 31 You my sheep, the sheep of my pasture, are men, and I am your God,’ says the Lord Yahweh.” +\c 35 +\p +\v 1 Moreover Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face against Mount Seir, and prophesy against it, +\v 3 and tell it, ‘The Lord Yahweh says: “Behold, I am against you, Mount Seir, and I will stretch out my hand against you. I will make you a desolation and an astonishment. +\v 4 I will lay your cities waste, and you will be desolate. Then you will know that I am Yahweh. +\p +\v 5 “‘“Because you have had a perpetual hostility, and have given over the children of Israel to the power of the sword in the time of their calamity, in the time of the iniquity of the end, +\v 6 therefore, as I live,” says the Lord Yahweh, “I will prepare you for blood, and blood will pursue you. Since you have not hated blood, therefore blood will pursue you. +\v 7 Thus I will make Mount Seir an astonishment and a desolation. I will cut off from it him who passes through and him who returns. +\v 8 I will fill its mountains with its slain. The slain with the sword will fall in your hills and in your valleys and in all your watercourses. +\v 9 I will make you a perpetual desolation, and your cities will not be inhabited. Then you will know that I am Yahweh. +\p +\v 10 “‘“Because you have said, ‘These two nations and these two countries will be mine, and we will possess it,’ although Yahweh was there, +\v 11 therefore, as I live,” says the Lord Yahweh, “I will do according to your anger, and according to your envy which you have shown out of your hatred against them; and I will make myself known among them when I judge you. +\v 12 You will know that I, Yahweh, have heard all your insults which you have spoken against the mountains of Israel, saying, ‘They have been laid desolate. They have been given to us to devour.’ +\v 13 You have magnified yourselves against me with your mouth, and have multiplied your words against me. I have heard it.” +\v 14 The Lord Yahweh says: “When the whole earth rejoices, I will make you desolate. +\v 15 As you rejoiced over the inheritance of the house of Israel because it was desolate, so I will do to you. You will be desolate, Mount Seir, and all Edom, even all of it. Then they will know that I am Yahweh.’” +\c 36 +\p +\v 1 You, son of man, prophesy to the mountains of Israel, and say, “You mountains of Israel, hear Yahweh’s word. +\v 2 The Lord Yahweh says: ‘Because the enemy has said against you, “Aha!” and, “The ancient high places are ours in possession!”’ +\v 3 therefore prophesy, and say, ‘The Lord Yahweh says: “Because, even because they have made you desolate, and swallowed you up on every side, that you might be a possession to the residue of the nations, and you are taken up in the lips of talkers, and the evil report of the people;” +\v 4 therefore, you mountains of Israel, hear the word of the Lord Yahweh: The Lord Yahweh says to the mountains and to the hills, to the watercourses and to the valleys, to the desolate wastes and to the cities that are forsaken, which have become a prey and derision to the residue of the nations that are all around; +\v 5 therefore the Lord Yahweh says: “Surely in the fire of my jealousy I have spoken against the residue of the nations, and against all Edom, that have appointed my land to themselves for a possession with the joy of all their heart, with despite of soul, to cast it out for a prey.”’ +\v 6 Therefore prophesy concerning the land of Israel, and tell the mountains, the hills, the watercourses and the valleys, ‘The Lord Yahweh says: “Behold, I have spoken in my jealousy and in my wrath, because you have borne the shame of the nations.” +\v 7 Therefore the Lord Yahweh says: “I have sworn, ‘Surely the nations that are around you will bear their shame.’ +\p +\v 8 “‘“But you, mountains of Israel, you shall shoot out your branches and yield your fruit to my people Israel; for they are at hand to come. +\v 9 For, behold, I am for you, and I will come to you, and you will be tilled and sown. +\v 10 I will multiply men on you, all the house of Israel, even all of it. The cities will be inhabited and the waste places will be built. +\v 11 I will multiply man and animal on you. They will increase and be fruitful. I will cause you to be inhabited as you were before, and you will do better than at your beginnings. Then you will know that I am Yahweh. +\v 12 Yes, I will cause men to walk on you, even my people Israel. They will possess you, and you will be their inheritance, and you will never again bereave them of their children.” +\p +\v 13 “‘The Lord Yahweh says: “Because they say to you, ‘You are a devourer of men, and have been a bereaver of your nation;’ +\v 14 therefore you shall devour men no more, and not bereave your nation any more,” says the Lord Yahweh. +\v 15 “I won’t let you hear the shame of the nations any more. You won’t bear the reproach of the peoples any more, and you won’t cause your nation to stumble any more,” says the Lord Yahweh.’” +\p +\v 16 Moreover Yahweh’s word came to me, saying, +\v 17 “Son of man, when the house of Israel lived in their own land, they defiled it by their ways and by their deeds. Their way before me was as the uncleanness of a woman in her impurity. +\v 18 Therefore I poured out my wrath on them for the blood which they had poured out on the land, and because they had defiled it with their idols. +\v 19 I scattered them among the nations, and they were dispersed through the countries. I judged them according to their way and according to their deeds. +\v 20 When they came to the nations where they went, they profaned my holy name, in that men said of them, ‘These are Yahweh’s people, and have left his land.’ +\v 21 But I had respect for my holy name, which the house of Israel had profaned among the nations where they went. +\p +\v 22 “Therefore tell the house of Israel, ‘The Lord Yahweh says: “I don’t do this for your sake, house of Israel, but for my holy name, which you have profaned among the nations where you went. +\v 23 I will sanctify my great name, which has been profaned among the nations, which you have profaned among them. Then the nations will know that I am Yahweh,” says the Lord Yahweh, “when I am proven holy in you before their eyes. +\p +\v 24 “‘“For I will take you from among the nations and gather you out of all the countries, and will bring you into your own land. +\v 25 I will sprinkle clean water on you, and you will be clean. I will cleanse you from all your filthiness and from all your idols. +\v 26 I will also give you a new heart, and I will put a new spirit within you. I will take away the stony heart out of your flesh, and I will give you a heart of flesh. +\v 27 I will put my Spirit within you, and cause you to walk in my statutes. You will keep my ordinances and do them. +\v 28 You will dwell in the land that I gave to your fathers. You will be my people, and I will be your God. +\v 29 I will save you from all your uncleanness. I will call for the grain and will multiply it, and lay no famine on you. +\v 30 I will multiply the fruit of the tree and the increase of the field, that you may receive no more the reproach of famine among the nations. +\p +\v 31 “‘“Then you will remember your evil ways, and your deeds that were not good; and you will loathe yourselves in your own sight for your iniquities and for your abominations. +\v 32 I don’t do this for your sake,” says the Lord Yahweh. “Let it be known to you. Be ashamed and confounded for your ways, house of Israel.” +\p +\v 33 “‘The Lord Yahweh says: “In the day that I cleanse you from all your iniquities, I will cause the cities to be inhabited and the waste places will be built. +\v 34 The land that was desolate will be tilled instead of being a desolation in the sight of all who passed by. +\v 35 They will say, ‘This land that was desolate has become like the garden of Eden. The waste, desolate, and ruined cities are fortified and inhabited.’ +\v 36 Then the nations that are left around you will know that I, Yahweh, have built the ruined places and planted that which was desolate. I, Yahweh, have spoken it, and I will do it.” +\p +\v 37 “‘The Lord Yahweh says: “For this, moreover, I will be inquired of by the house of Israel, to do it for them: I will increase them with men like a flock. +\v 38 As the flock for sacrifice, as the flock of Jerusalem in her appointed feasts, so the waste cities will be filled with flocks of men. Then they will know that I am Yahweh.’” +\c 37 +\p +\v 1 Yahweh’s hand was on me, and he brought me out in Yahweh’s Spirit, and set me down in the middle of the valley; and it was full of bones. +\v 2 He caused me to pass by them all around; and behold, there were very many in the open valley, and behold, they were very dry. +\v 3 He said to me, “Son of man, can these bones live?” +\p I answered, “Lord Yahweh, you know.” +\p +\v 4 Again he said to me, “Prophesy over these bones, and tell them, ‘You dry bones, hear Yahweh’s word. +\v 5 The Lord Yahweh says to these bones: “Behold, I will cause breath to enter into you, and you will live. +\v 6 I will lay sinews on you, and will bring up flesh on you, and cover you with skin, and put breath in you, and you will live. Then you will know that I am Yahweh.”’” +\p +\v 7 So I prophesied as I was commanded. As I prophesied, there was a noise, and behold, there was an earthquake. Then the bones came together, bone to its bone. +\v 8 I saw, and, behold, there were sinews on them, and flesh came up, and skin covered them above; but there was no breath in them. +\p +\v 9 Then he said to me, “Prophesy to the wind, prophesy, son of man, and tell the wind, ‘The Lord Yahweh says: “Come from the four winds, breath, and breathe on these slain, that they may live.”’” +\p +\v 10 So I prophesied as he commanded me, and the breath came into them, and they lived, and stood up on their feet, an exceedingly great army. +\p +\v 11 Then he said to me, “Son of man, these bones are the whole house of Israel. Behold, they say, ‘Our bones are dried up, and our hope is lost. We are completely cut off.’ +\v 12 Therefore prophesy, and tell them, ‘The Lord Yahweh says: “Behold, I will open your graves, and cause you to come up out of your graves, my people; and I will bring you into the land of Israel. +\v 13 You will know that I am Yahweh, when I have opened your graves and caused you to come up out of your graves, my people. +\v 14 I will put my Spirit in you, and you will live. Then I will place you in your own land; and you will know that I, Yahweh, have spoken it and performed it,” says Yahweh.’” +\b +\p +\v 15 Yahweh’s word came again to me, saying, +\v 16 “You, son of man, take one stick and write on it, ‘For Judah, and for the children of Israel his companions.’ Then take another stick, and write on it, ‘For Joseph, the stick of Ephraim, and for all the house of Israel his companions.’ +\v 17 Then join them for yourself to one another into one stick, that they may become one in your hand. +\p +\v 18 “When the children of your people speak to you, saying, ‘Won’t you show us what you mean by these?’ +\v 19 tell them, ‘The Lord Yahweh says: “Behold, I will take the stick of Joseph, which is in the hand of Ephraim, and the tribes of Israel his companions; and I will put them with it, with the stick of Judah, and make them one stick, and they will be one in my hand. +\v 20 The sticks on which you write will be in your hand before their eyes.”’ +\v 21 Say to them, ‘The Lord Yahweh says: “Behold, I will take the children of Israel from among the nations where they have gone, and will gather them on every side, and bring them into their own land. +\v 22 I will make them one nation in the land, on the mountains of Israel. One king will be king to them all. They will no longer be two nations. They won’t be divided into two kingdoms any more at all. +\v 23 They won’t defile themselves any more with their idols, nor with their detestable things, nor with any of their transgressions; but I will save them out of all their dwelling places in which they have sinned, and will cleanse them. So they will be my people, and I will be their God. +\p +\v 24 “‘“My servant David will be king over them. They all will have one shepherd. They will also walk in my ordinances and observe my statutes, and do them. +\v 25 They will dwell in the land that I have given to Jacob my servant, in which your fathers lived. They will dwell therein, they, and their children, and their children’s children, forever. David my servant will be their prince forever. +\v 26 Moreover I will make a covenant of peace with them. It will be an everlasting covenant with them. I will place them, multiply them, and will set my sanctuary among them forever more. +\v 27 My tent also will be with them. I will be their God, and they will be my people. +\v 28 The nations will know that I am Yahweh who sanctifies Israel, when my sanctuary is among them forever more.”’” +\c 38 +\p +\v 1 Yahweh’s word came to me, saying, +\v 2 “Son of man, set your face toward Gog, of the land of Magog, the prince of Rosh, Meshech, and Tubal, and prophesy against him, +\v 3 and say, ‘The Lord Yahweh says: “Behold, I am against you, Gog, prince of Rosh, Meshech, and Tubal. +\v 4 I will turn you around, and put hooks into your jaws, and I will bring you out, with all your army, horses and horsemen, all of them clothed in full armor, a great company with buckler and shield, all of them handling swords; +\v 5 Persia, Cush, and Put with them, all of them with shield and helmet; +\v 6 Gomer, and all his hordes; the house of Togarmah in the uttermost parts of the north, and all his hordes—even many peoples with you. +\p +\v 7 “‘“Be prepared, yes, prepare yourself, you, and all your companies who are assembled to you, and be a guard to them. +\v 8 After many days you will be visited. In the latter years you will come into the land that is brought back from the sword, that is gathered out of many peoples, on the mountains of Israel, which have been a continual waste; but it is brought out of the peoples and they will dwell securely, all of them. +\v 9 You will ascend. You will come like a storm. You will be like a cloud to cover the land, you and all your hordes, and many peoples with you.” +\p +\v 10 “‘The Lord Yahweh says: “It will happen in that day that things will come into your mind, and you will devise an evil plan. +\v 11 You will say, ‘I will go up to the land of unwalled villages. I will go to those who are at rest, who dwell securely, all of them dwelling without walls, and having neither bars nor gates, +\v 12 to take the plunder and to take prey; to turn your hand against the waste places that are inhabited, and against the people who are gathered out of the nations, who have gotten livestock and goods, who dwell in the middle of the earth.’ +\v 13 Sheba, Dedan, and the merchants of Tarshish, with all its young lions, will ask you, ‘Have you come to take the plunder? Have you assembled your company to take the prey, to carry away silver and gold, to take away livestock and goods, to take great plunder?’”’ +\p +\v 14 “Therefore, son of man, prophesy, and tell Gog, ‘The Lord Yahweh says: “In that day when my people Israel dwells securely, will you not know it? +\v 15 You will come from your place out of the uttermost parts of the north, you, and many peoples with you, all of them riding on horses, a great company and a mighty army. +\v 16 You will come up against my people Israel as a cloud to cover the land. It will happen in the latter days that I will bring you against my land, that the nations may know me when I am sanctified in you, Gog, before their eyes.” +\p +\v 17 “‘The Lord Yahweh says: “Are you he of whom I spoke in old time by my servants the prophets of Israel, who prophesied in those days for years that I would bring you against them? +\v 18 It will happen in that day, when Gog comes against the land of Israel,” says the Lord Yahweh, “that my wrath will come up into my nostrils. +\v 19 For in my jealousy and in the fire of my wrath I have spoken. Surely in that day there will be a great shaking in the land of Israel, +\v 20 so that the fish of the sea, the birds of the sky, the animals of the field, all creeping things who creep on the earth, and all the men who are on the surface of the earth will shake at my presence. Then the mountains will be thrown down, the steep places will fall, and every wall will fall to the ground. +\v 21 I will call for a sword against him to all my mountains,” says the Lord Yahweh. “Every man’s sword will be against his brother. +\v 22 I will enter into judgment with him with pestilence and with blood. I will rain on him, on his hordes, and on the many peoples who are with him, torrential rains with great hailstones, fire, and sulfur. +\v 23 I will magnify myself and sanctify myself, and I will make myself known in the eyes of many nations. Then they will know that I am Yahweh.”’ +\c 39 +\p +\v 1 “You, son of man, prophesy against Gog, and say, ‘The Lord Yahweh says: “Behold, I am against you, Gog, prince of Rosh, Meshech, and Tubal. +\v 2 I will turn you around, will lead you on, and will cause you to come up from the uttermost parts of the north; and I will bring you onto the mountains of Israel. +\v 3 I will strike your bow out of your left hand, and will cause your arrows to fall out of your right hand. +\v 4 You will fall on the mountains of Israel, you, and all your hordes, and the peoples who are with you. I will give you to the ravenous birds of every sort and to the animals of the field to be devoured. +\v 5 You will fall on the open field, for I have spoken it,” says the Lord Yahweh. +\v 6 “I will send a fire on Magog and on those who dwell securely in the islands. Then they will know that I am Yahweh. +\p +\v 7 “‘“I will make my holy name known among my people Israel. I won’t allow my holy name to be profaned any more. Then the nations will know that I am Yahweh, the Holy One in Israel. +\v 8 Behold, it comes, and it will be done,” says the Lord Yahweh. “This is the day about which I have spoken. +\p +\v 9 “‘“Those who dwell in the cities of Israel will go out and will make fires of the weapons and burn them, both the shields and the bucklers, the bows and the arrows, and the war clubs and the spears, and they will make fires with them for seven years; +\v 10 so that they will take no wood out of the field, and not cut down any out of the forests; for they will make fires with the weapons. They will plunder those who plundered them, and rob those who robbed them,” says the Lord Yahweh. +\p +\v 11 “‘“It will happen in that day, that I will give to Gog a place for burial in Israel, the valley of those who pass through on the east of the sea; and it will stop those who pass through. They will bury Gog and all his multitude there, and they will call it ‘The valley of Hamon Gog’. +\p +\v 12 “‘“The house of Israel will be burying them for seven months, that they may cleanse the land. +\v 13 Yes, all the people of the land will bury them; and they will become famous in the day that I will be glorified,” says the Lord Yahweh. +\p +\v 14 “‘“They will set apart men of continual employment who will pass through the land. Those who pass through will go with those who bury those who remain on the surface of the land, to cleanse it. After the end of seven months they will search. +\v 15 Those who search through the land will pass through; and when anyone sees a man’s bone, then he will set up a sign by it, until the undertakers have buried it in the valley of Hamon Gog. +\v 16 Hamonah will also be the name of a city. Thus they will cleanse the land.”’ +\p +\v 17 “You, son of man, the Lord Yahweh says: ‘Speak to the birds of every sort, and to every animal of the field, “Assemble yourselves, and come; gather yourselves on every side to my sacrifice that I sacrifice for you, even a great sacrifice on the mountains of Israel, that you may eat meat and drink blood. +\v 18 You shall eat the flesh of the mighty, and drink the blood of the princes of the earth, of rams, of lambs, and of goats, of bulls, all of them fatlings of Bashan. +\v 19 You shall eat fat until you are full, and drink blood until you are drunk, of my sacrifice which I have sacrificed for you. +\v 20 You shall be filled at my table with horses and charioteers, with mighty men, and with all men of war,” says the Lord Yahweh.’ +\p +\v 21 “I will set my glory among the nations. Then all the nations will see my judgment that I have executed, and my hand that I have laid on them. +\v 22 So the house of Israel will know that I am Yahweh their God, from that day and forward. +\v 23 The nations will know that the house of Israel went into captivity for their iniquity, because they trespassed against me, and I hid my face from them; so I gave them into the hand of their adversaries, and they all fell by the sword. +\v 24 I did to them according to their uncleanness and according to their transgressions. I hid my face from them. +\p +\v 25 “Therefore the Lord Yahweh says: ‘Now I will reverse the captivity of Jacob and have mercy on the whole house of Israel. I will be jealous for my holy name. +\v 26 They will forget their shame and all their trespasses by which they have trespassed against me, when they dwell securely in their land. No one will make them afraid +\v 27 when I have brought them back from the peoples, gathered them out of their enemies’ lands, and am shown holy among them in the sight of many nations. +\v 28 They will know that I am Yahweh their God, in that I caused them to go into captivity among the nations, and have gathered them to their own land. Then I will leave none of them captive any more. +\v 29 I won’t hide my face from them any more, for I have poured out my Spirit on the house of Israel,’ says the Lord Yahweh.” +\c 40 +\p +\v 1 In the twenty-fifth year of our captivity, in the beginning of the year, in the tenth day of the month, in the fourteenth year after the city was struck, in the same day, Yahweh’s hand was on me, and he brought me there. +\v 2 In the visions of God he brought me into the land of Israel, and set me down on a very high mountain, on which was something like the frame of a city to the south. +\v 3 He brought me there; and, behold, there was a man whose appearance was like the appearance of bronze, with a line of flax in his hand and a measuring reed; and he stood in the gate. +\v 4 The man said to me, “Son of man, see with your eyes, and hear with your ears, and set your heart on all that I will show you; for you have been brought here so that I may show them to you. Declare all that you see to the house of Israel.” +\p +\v 5 Behold, there was a wall on the outside of the house all around, and in the man’s hand a measuring reed six cubits\f + \fr 40:5 \ft A normal cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters. A handbreadth is about 4.3 inches or 11 centimeters, so the long cubit described here would be about 22.3 inches or 57 centimeters long. Thus, a 6 long cubit measuring reed would have been about 3 yards 26.6 inches or about 3.42 meters long.\f* long, of a cubit and a hand width each. So he measured the thickness of the building, one reed; and the height, one reed. +\p +\v 6 Then he came to the gate which looks toward the east, and went up its steps. He measured the threshold of the gate, one reed wide; and the other threshold, one reed wide. +\v 7 Every lodge was one reed long and one reed wide. Between the lodges was five cubits. The threshold of the gate by the porch of the gate toward the house was one reed. +\p +\v 8 He measured also the porch of the gate toward the house, one reed. +\v 9 Then he measured the porch of the gate, eight cubits; and its posts, two cubits; and the porch of the gate was toward the house. +\p +\v 10 The side rooms of the gate eastward were three on this side, and three on that side. The three of them were of one measure. The posts had one measure on this side and on that side. +\v 11 He measured the width of the opening of the gate, ten cubits; and the length of the gate, thirteen cubits; +\v 12 and a border before the lodges, one cubit on this side, and a border, one cubit on that side; and the side rooms, six cubits on this side, and six cubits on that side. +\v 13 He measured the gate from the roof of the one side room to the roof of the other, a width of twenty-five cubits, door against door. +\v 14 He also made posts, sixty cubits; and the court reached to the posts, around the gate. +\v 15 From the forefront of the gate at the entrance to the forefront of the inner porch of the gate were fifty cubits. +\v 16 There were closed windows to the side rooms, and to their posts within the gate all around, and likewise to the arches. Windows were around inward. Palm trees were on each post. +\p +\v 17 Then he brought me into the outer court. Behold, there were rooms and a pavement made for the court all around. Thirty rooms were on the pavement. +\v 18 The pavement was by the side of the gates, corresponding to the length of the gates, even the lower pavement. +\v 19 Then he measured the width from the forefront of the lower gate to the forefront of the inner court outside, one hundred cubits, both on the east and on the north. +\p +\v 20 He measured the length and width of the gate of the outer court which faces toward the north. +\v 21 The lodges of it were three on this side and three on that side. Its posts and its arches were the same as the measure of the first gate: its length was fifty cubits, and the width twenty-five cubits. +\v 22 Its windows, its arches, and its palm trees were the same as the measure of the gate which faces toward the east. They went up to it by seven steps. Its arches were before them. +\v 23 There was a gate to the inner court facing the other gate, on the north and on the east. He measured one hundred cubits from gate to gate. +\p +\v 24 He led me toward the south; and behold, there was a gate toward the south. He measured its posts and its arches according to these measurements. +\v 25 There were windows in it and in its arches all around, like the other windows: the length was fifty cubits, and the width twenty-five cubits. +\v 26 There were seven steps to go up to it, and its arches were before them. It had palm trees, one on this side, and another on that side, on its posts. +\v 27 There was a gate to the inner court toward the south. He measured one hundred cubits from gate to gate toward the south. +\p +\v 28 Then he brought me to the inner court by the south gate. He measured the south gate according to these measurements; +\v 29 with its lodges, its posts, and its arches, according to these measurements. There were windows in it and in its arches all around. It was fifty cubits long, and twenty-five cubits wide. +\v 30 There were arches all around, twenty-five cubits long and five cubits wide. +\v 31 Its arches were toward the outer court. Palm trees were on its posts. The ascent to it had eight steps. +\p +\v 32 He brought me into the inner court toward the east. He measured the gate according to these measurements; +\v 33 with its lodges, its posts, and its arches, according to these measurements. There were windows in it and in its arches all around. It was fifty cubits long, and twenty-five cubits wide. +\v 34 Its arches were toward the outer court. Palm trees were on its posts on this side and on that side. The ascent to it had eight steps. +\p +\v 35 He brought me to the north gate, and he measured it according to these measurements— +\v 36 its lodges, its posts, and its arches. There were windows in it all around. The length was fifty cubits and the width twenty-five cubits. +\v 37 Its posts were toward the outer court. Palm trees were on its posts on this side and on that side. The ascent to it had eight steps. +\p +\v 38 A room with its door was by the posts at the gates. They washed the burnt offering there. +\v 39 In the porch of the gate were two tables on this side and two tables on that side, on which to kill the burnt offering, the sin offering, and the trespass offering. +\v 40 On the one side outside, as one goes up to the entry of the gate toward the north, were two tables; and on the other side, which belonged to the porch of the gate, were two tables. +\v 41 Four tables were on this side, and four tables on that side, by the side of the gate: eight tables, on which they killed the sacrifices. +\v 42 There were four cut stone tables for the burnt offering, a cubit and a half long, a cubit and a half wide, and one cubit high. They laid the instruments with which they killed the burnt offering and the sacrifice on them. +\v 43 The hooks, a hand width long, were fastened within all around. The meat of the offering was on the tables. +\p +\v 44 Outside of the inner gate were rooms for the singers in the inner court, which was at the side of the north gate. They faced toward the south. One at the side of the east gate faced toward the north. +\v 45 He said to me, “This room, which faces toward the south, is for the priests who perform the duty of the house. +\v 46 The room which faces toward the north is for the priests who perform the duty of the altar. These are the sons of Zadok, who from among the sons of Levi come near to Yahweh to minister to him.” +\v 47 He measured the court, one hundred cubits long and one hundred cubits wide, square. The altar was before the house. +\p +\v 48 Then he brought me to the porch of the house, and measured each post of the porch, five cubits on this side, and five cubits on that side. The width of the gate was three cubits on this side and three cubits on that side. +\v 49 The length of the porch was twenty cubits and the width eleven cubits, even by the steps by which they went up to it. There were pillars by the posts, one on this side, and another on that side. +\c 41 +\p +\v 1 He brought me to the nave and measured the posts, six cubits wide on the one side and six cubits wide on the other side, which was the width of the tent. +\v 2 The width of the entrance was ten cubits,\f + \fr 41:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and the sides of the entrance were five cubits on the one side, and five cubits on the other side. He measured its length, forty cubits, and the width, twenty cubits. +\p +\v 3 Then he went inward and measured each post of the entrance, two cubits; and the entrance, six cubits; and the width of the entrance, seven cubits. +\v 4 He measured its length, twenty cubits, and the width, twenty cubits, before the nave. He said to me, “This is the most holy place.” +\p +\v 5 Then he measured the wall of the house, six cubits; and the width of every side room, four cubits, all around the house on every side. +\v 6 The side rooms were in three stories, one over another, and thirty in each story. They entered into the wall which belonged to the house for the side rooms all around, that they might be supported and not penetrate the wall of the house. +\v 7 The side rooms were wider on the higher levels, because the walls were narrower at the higher levels. Therefore the width of the house increased upward; and so one went up from the lowest level to the highest through the middle level. +\p +\v 8 I saw also that the house had a raised base all around. The foundations of the side rooms were a full reed of six great cubits. +\v 9 The thickness of the outer wall of the side rooms was five cubits. That which was left was the place of the side rooms that belonged to the house. +\v 10 Between the rooms was a width of twenty cubits around the house on every side. +\v 11 The doors of the side rooms were toward an open area that was left, one door toward the north, and another door toward the south. The width of the open area was five cubits all around. +\p +\v 12 The building that was before the separate place at the side toward the west was seventy cubits wide; and the wall of the building was five cubits thick all around, and its length ninety cubits. +\p +\v 13 So he measured the temple, one hundred cubits long; and the separate place, and the building, with its walls, one hundred cubits long; +\v 14 also the width of the face of the temple, and of the separate place toward the east, one hundred cubits. +\p +\v 15 He measured the length of the building before the separate place which was at its back, and its galleries on the one side and on the other side, one hundred cubits from the inner temple, and the porches of the court, +\v 16 the thresholds, and the closed windows, and the galleries around on their three stories, opposite the threshold, with wood ceilings all around, and from the ground up to the windows, (now the windows were covered), +\v 17 to the space above the door, even to the inner house, and outside, and by all the wall all around inside and outside, by measure. +\v 18 It was made with cherubim and palm trees. A palm tree was between cherub and cherub, and every cherub had two faces, +\v 19 so that there was the face of a man toward the palm tree on the one side, and the face of a young lion toward the palm tree on the other side. It was made like this through all the house all around. +\v 20 Cherubim and palm trees were made from the ground to above the door. The wall of the temple was like this. +\p +\v 21 The door posts of the nave were squared. As for the face of the nave, its appearance was as the appearance of the temple. +\v 22 The altar was of wood, three cubits high, and its length two cubits. Its corners, its base, and its walls were of wood. He said to me, “This is the table that is before Yahweh.” +\v 23 The temple and the sanctuary had two doors. +\v 24 The doors had two leaves each, two turning leaves: two for the one door, and two leaves for the other. +\v 25 There were made on them, on the doors of the nave, cherubim and palm trees, like those made on the walls. There was a threshold of wood on the face of the porch outside. +\v 26 There were closed windows and palm trees on the one side and on the other side, on the sides of the porch. This is how the side rooms of the temple and the thresholds were arranged. +\c 42 +\p +\v 1 Then he brought me out into the outer court, the way toward the north. Then he brought me into the room that was opposite the separate place, and which was opposite the building toward the north. +\v 2 Facing the length of one hundred cubits\f + \fr 42:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* was the north door, and the width was fifty cubits. +\v 3 Opposite the twenty cubits which belonged to the inner court, and opposite the pavement which belonged to the outer court, was gallery against gallery in the three stories. +\v 4 Before the rooms was a walk of ten cubits’ width inward, a way of one cubit; and their doors were toward the north. +\v 5 Now the upper rooms were shorter; for the galleries took away from these more than from the lower and the middle in the building. +\v 6 For they were in three stories, and they didn’t have pillars as the pillars of the courts. Therefore the uppermost was set back more than the lowest and the middle from the ground. +\v 7 The wall that was outside by the side of the rooms, toward the outer court before the rooms, was fifty cubits long. +\v 8 For the length of the rooms that were in the outer court was fifty cubits. Behold, those facing the temple were one hundred cubits. +\v 9 From under these rooms was the entry on the east side, as one goes into them from the outer court. +\p +\v 10 In the thickness of the wall of the court toward the east, before the separate place, and before the building, there were rooms. +\v 11 The way before them was like the appearance of the rooms which were toward the north. Their length and width were the same. All their exits had the same arrangement and doors. +\v 12 Like the doors of the rooms that were toward the south was a door at the head of the way, even the way directly before the wall toward the east, as one enters into them. +\p +\v 13 Then he said to me, “The north rooms and the south rooms, which are opposite the separate place, are the holy rooms, where the priests who are near to Yahweh shall eat the most holy things. There they shall lay the most holy things, with the meal offering, the sin offering, and the trespass offering; for the place is holy. +\v 14 When the priests enter in, then they shall not go out of the holy place into the outer court until they lay their garments in which they minister there; for they are holy. Then they shall put on other garments, and shall approach that which is for the people.” +\p +\v 15 Now when he had finished measuring the inner house, he brought me out by the way of the gate which faces toward the east, and measured it all around. +\v 16 He measured on the east side with the measuring reed five hundred reeds, with the measuring reed all around. +\v 17 He measured on the north side five hundred reeds with the measuring reed all around. +\v 18 He measured on the south side five hundred reeds with the measuring reed. +\v 19 He turned about to the west side, and measured five hundred reeds with the measuring reed. +\v 20 He measured it on the four sides. It had a wall around it, the length five hundred cubits, and the width five hundred cubits, to make a separation between that which was holy and that which was common. +\c 43 +\p +\v 1 Afterward he brought me to the gate, even the gate that looks toward the east. +\v 2 Behold, the glory of the God of Israel came from the way of the east. His voice was like the sound of many waters; and the earth was illuminated with his glory. +\v 3 It was like the appearance of the vision which I saw, even according to the vision that I saw when I came to destroy the city; and the visions were like the vision that I saw by the river Chebar; and I fell on my face. +\v 4 Yahweh’s glory came into the house by the way of the gate which faces toward the east. +\v 5 The Spirit took me up and brought me into the inner court; and behold, Yahweh’s glory filled the house. +\p +\v 6 I heard one speaking to me out of the house, and a man stood by me. +\v 7 He said to me, “Son of man, this is the place of my throne and the place of the soles of my feet, where I will dwell among the children of Israel forever. The house of Israel will no more defile my holy name, neither they nor their kings, by their prostitution and by the dead bodies of their kings in their high places; +\v 8 in their setting of their threshold by my threshold and their door post beside my door post. There was a wall between me and them; and they have defiled my holy name by their abominations which they have committed. Therefore I have consumed them in my anger. +\v 9 Now let them put away their prostitution, and the dead bodies of their kings far from me. Then I will dwell among them forever. +\p +\v 10 “You, son of man, show the house to the house of Israel, that they may be ashamed of their iniquities; and let them measure the pattern. +\v 11 If they are ashamed of all that they have done, make known to them the form of the house, its fashion, its exits, its entrances, its structure, all its ordinances, all its forms, and all its laws; and write it in their sight, that they may keep the whole form of it, and all its ordinances, and do them. +\p +\v 12 “This is the law of the house. On the top of the mountain the whole limit around it shall be most holy. Behold, this is the law of the house. +\p +\v 13 “These are the measurements of the altar by cubits (the cubit\f + \fr 43:13 \ft A normal cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters. A hand width is about 4.3 inches or 11 cm.\f* is a cubit and a hand width): the bottom shall be a cubit, and the width a cubit, and its border around its edge a span;\f + \fr 43:13 \ft A span is the length from the tip of a man’s thumb to the tip of his little finger when his hand is stretched out (about half a cubit, or 9 inches, or 22.8 cm.)\f* and this shall be the base of the altar. +\v 14 From the bottom on the ground to the lower ledge shall be two cubits, and the width one cubit; and from the lesser ledge to the greater ledge shall be four cubits, and the width a cubit. +\v 15 The upper altar shall be four cubits; and from the altar hearth and upward there shall be four horns. +\v 16 The altar hearth shall be twelve cubits long by twelve wide, square in its four sides. +\v 17 The ledge shall be fourteen cubits long by fourteen wide in its four sides; and the border about it shall be half a cubit; and its bottom shall be a cubit around; and its steps shall look toward the east.” +\p +\v 18 He said to me, “Son of man, the Lord Yahweh says: ‘These are the ordinances of the altar in the day when they make it, to offer burnt offerings on it, and to sprinkle blood on it. +\v 19 You shall give to the Levitical priests who are of the offspring of Zadok, who are near to me, to minister to me,’ says the Lord Yahweh, ‘a young bull for a sin offering. +\v 20 You shall take of its blood and put it on its four horns, and on the four corners of the ledge, and on the border all around. You shall cleanse it and make atonement for it that way. +\v 21 You shall also take the bull of the sin offering, and it shall be burned in the appointed place of the house, outside of the sanctuary. +\p +\v 22 “On the second day you shall offer a male goat without defect for a sin offering; and they shall cleanse the altar, as they cleansed it with the bull. +\v 23 When you have finished cleansing it, you shall offer a young bull without defect and a ram out of the flock without defect. +\v 24 You shall bring them near to Yahweh, and the priests shall cast salt on them, and they shall offer them up for a burnt offering to Yahweh. +\p +\v 25 “Seven days you shall prepare every day a goat for a sin offering. They shall also prepare a young bull and a ram out of the flock, without defect. +\v 26 Seven days shall they make atonement for the altar and purify it. So shall they consecrate it. +\v 27 When they have accomplished the days, it shall be that on the eighth day and onward, the priests shall make your burnt offerings on the altar and your peace offerings. Then I will accept you,’ says the Lord Yahweh.” +\c 44 +\p +\v 1 Then he brought me back by the way of the outer gate of the sanctuary, which looks toward the east; and it was shut. +\v 2 Yahweh said to me, “This gate shall be shut. It shall not be opened, no man shall enter in by it; for Yahweh, the God of Israel, has entered in by it. Therefore it shall be shut. +\v 3 As for the prince, he shall sit in it as prince to eat bread before Yahweh. He shall enter by the way of the porch of the gate, and shall go out the same way.” +\p +\v 4 Then he brought me by the way of the north gate before the house; and I looked, and behold, Yahweh’s glory filled Yahweh’s house; so I fell on my face. +\p +\v 5 Yahweh said to me, “Son of man, mark well, and see with your eyes, and hear with your ears all that I tell you concerning all the ordinances of Yahweh’s house and all its laws; and mark well the entrance of the house, with every exit of the sanctuary. +\v 6 You shall tell the rebellious, even the house of Israel, ‘The Lord Yahweh says: “You house of Israel, let that be enough of all your abominations, +\v 7 in that you have brought in foreigners, uncircumcised in heart and uncircumcised in flesh, to be in my sanctuary, to profane it, even my house, when you offer my bread, the fat and the blood; and they have broken my covenant, to add to all your abominations. +\v 8 You have not performed the duty of my holy things; but you have set performers of my duty in my sanctuary for yourselves.” +\v 9 The Lord Yahweh says, “No foreigner, uncircumcised in heart and uncircumcised in flesh, shall enter into my sanctuary, of any foreigners who are among the children of Israel. +\p +\v 10 “‘“But the Levites who went far from me when Israel went astray, who went astray from me after their idols, they will bear their iniquity. +\v 11 Yet they shall be ministers in my sanctuary, having oversight at the gates of the house, and ministering in the house. They shall kill the burnt offering and the sacrifice for the people, and they shall stand before them to minister to them. +\v 12 Because they ministered to them before their idols, and became a stumbling block of iniquity to the house of Israel, therefore I have lifted up my hand against them,” says the Lord Yahweh, “and they will bear their iniquity. +\v 13 They shall not come near to me, to execute the office of priest to me, nor to come near to any of my holy things, to the things that are most holy; but they will bear their shame and their abominations which they have committed. +\v 14 Yet I will make them performers of the duty of the house, for all its service and for all that will be done therein. +\p +\v 15 “‘“But the Levitical priests, the sons of Zadok, who performed the duty of my sanctuary when the children of Israel went astray from me, shall come near to me to minister to me. They shall stand before me to offer to me the fat and the blood,” says the Lord Yahweh. +\v 16 “They shall enter into my sanctuary, and they shall come near to my table, to minister to me, and they shall keep my instruction. +\p +\v 17 “‘“It will be that when they enter in at the gates of the inner court, they shall be clothed with linen garments. No wool shall come on them while they minister in the gates of the inner court, and within. +\v 18 They shall have linen turbans on their heads, and shall have linen trousers on their waists. They shall not clothe themselves with anything that makes them sweat. +\v 19 When they go out into the outer court, even into the outer court to the people, they shall put off their garments in which they minister and lay them in the holy rooms. They shall put on other garments, that they not sanctify the people with their garments. +\p +\v 20 “‘“They shall not shave their heads, or allow their locks to grow long. They shall only cut off the hair of their heads. +\v 21 None of the priests shall drink wine when they enter into the inner court. +\v 22 They shall not take for their wives a widow, or her who is put away; but they shall take virgins of the offspring of the house of Israel, or a widow who is the widow of a priest. +\v 23 They shall teach my people the difference between the holy and the common, and cause them to discern between the unclean and the clean. +\p +\v 24 “‘“In a controversy they shall stand to judge. They shall judge it according to my ordinances. They shall keep my laws and my statutes in all my appointed feasts. They shall make my Sabbaths holy. +\p +\v 25 “‘“They shall go in to no dead person to defile themselves; but for father, or for mother, or for son, or for daughter, for brother, or for sister who has had no husband, they may defile themselves. +\v 26 After he is cleansed, they shall reckon to him seven days. +\v 27 In the day that he goes into the sanctuary, into the inner court, to minister in the sanctuary, he shall offer his sin offering,” says the Lord Yahweh. +\p +\v 28 “‘They shall have an inheritance: I am their inheritance; and you shall give them no possession in Israel. I am their possession. +\v 29 They shall eat the meal offering, and the sin offering, and the trespass offering; and every devoted thing in Israel shall be theirs. +\v 30 The first of all the first fruits of every thing, and every offering of everything, of all your offerings, shall be for the priest. You shall also give to the priests the first of your dough, to cause a blessing to rest on your house. +\v 31 The priests shall not eat of anything that dies of itself or is torn, whether it is bird or animal. +\c 45 +\p +\v 1 “‘“Moreover, when you divide by lot the land for inheritance, you shall offer an offering to Yahweh, a holy portion of the land. The length shall be the length of twenty-five thousand reeds, and the width shall be ten thousand. It shall be holy in all its border all around. +\v 2 Of this there shall be a five hundred by five hundred square for the holy place, and fifty cubits\f + \fr 45:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* for its pasture lands all around. +\v 3 Of this measure you shall measure a length of twenty-five thousand, and a width of ten thousand. In it shall be the sanctuary, which is most holy. +\v 4 It is a holy portion of the land; it shall be for the priests, the ministers of the sanctuary, who come near to minister to Yahweh. It shall be a place for their houses and a holy place for the sanctuary. +\v 5 Twenty-five thousand cubits in length and ten thousand in width shall be for the Levites, the ministers of the house, as a possession for themselves, for twenty rooms. +\p +\v 6 “‘“You shall appoint the possession of the city five thousand cubits wide and twenty-five thousand long, side by side with the offering of the holy portion. It shall be for the whole house of Israel. +\p +\v 7 “‘“What is for the prince shall be on the one side and on the other side of the holy allotment and of the possession of the city, in front of the holy allotment and in front of the possession of the city, on the west side westward, and on the east side eastward, and in length corresponding to one of the portions, from the west border to the east border. +\v 8 In the land it shall be to him for a possession in Israel. My princes shall no more oppress my people, but they shall give the land to the house of Israel according to their tribes.” +\p +\v 9 “‘The Lord Yahweh says: “Enough you, princes of Israel! Remove violence and plunder, and execute justice and righteousness! Stop dispossessing my people!” says the Lord Yahweh. +\v 10 “You shall have just balances, a just ephah,\f + \fr 45:10 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* and a just bath. +\v 11 The ephah and the bath shall be of one measure, that the bath may contain one tenth of a homer,\f + \fr 45:11 \ft 1 homer is about 220 liters or 6 bushels\f* and the ephah one tenth of a homer. Its measure shall be the same as the homer. +\v 12 The shekel\f + \fr 45:12 \ft A shekel is about 10 grams or about 0.35 ounces.\f* shall be twenty gerahs.\f + \fr 45:12 \ft a gerah is about 0.5 grams or about 7.7 grains\f* Twenty shekels plus twenty-five shekels plus fifteen shekels shall be your mina.\f + \fr 45:12 \ft A mina is about 600 grams or 1.3 U. S. pounds.\f* +\p +\v 13 “‘“This is the offering that you shall offer: the sixth part of an ephah from a homer of wheat, and you shall give the sixth part of an ephah from a homer of barley, +\v 14 and the set portion of oil, of the bath of oil, one tenth of a bath out of the cor, which is ten baths, even a homer (for ten baths are a homer),\f + \fr 45:14 \ft 1 cor is the same as 1 homer in volume, and is about 211 liters, 55.9 gallons, or 6 bushels. 1 bath is about 21.1 liters, 5.59 gallons, or 2.4 pecks.\f* +\v 15 and one lamb of the flock out of two hundred, from the well-watered pastures of Israel—for a meal offering, for a burnt offering, and for peace offerings, to make atonement for them,” says the Lord Yahweh. +\v 16 “All the people of the land shall give to this offering for the prince in Israel. +\v 17 It shall be the prince’s part to give the burnt offerings, the meal offerings, and the drink offerings, in the feasts, and on the new moons, and on the Sabbaths, in all the appointed feasts of the house of Israel. He shall prepare the sin offering, the meal offering, the burnt offering, and the peace offerings, to make atonement for the house of Israel.” +\p +\v 18 “‘The Lord Yahweh says: “In the first month, on the first day of the month, you shall take a young bull without defect, and you shall cleanse the sanctuary. +\v 19 The priest shall take of the blood of the sin offering and put it on the door posts of the house, and on the four corners of the ledge of the altar, and on the posts of the gate of the inner court. +\v 20 So you shall do on the seventh day of the month for everyone who errs, and for him who is simple. So you shall make atonement for the house. +\p +\v 21 “‘“In the first month, on the fourteenth day of the month, you shall have the Passover, a feast of seven days; unleavened bread shall be eaten. +\v 22 On that day the prince shall prepare for himself and for all the people of the land a bull for a sin offering. +\v 23 The seven days of the feast he shall prepare a burnt offering to Yahweh, seven bulls and seven rams without defect daily the seven days; and a male goat daily for a sin offering. +\v 24 He shall prepare a meal offering, an ephah\f + \fr 45:24 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* for a bull, an ephah for a ram, and a hin\f + \fr 45:24 \ft A hin is about 6.5 liters or 1.7 gallons.\f* of oil to an ephah. +\p +\v 25 “‘“In the seventh month, on the fifteenth day of the month, during the feast, he shall do like that for seven days. He shall make the same provision for sin offering, the burnt offering, the meal offering, and the oil.” +\c 46 +\p +\v 1 “‘The Lord Yahweh says: “The gate of the inner court that looks toward the east shall be shut the six working days; but on the Sabbath day it shall be opened, and on the day of the new moon it shall be opened. +\v 2 The prince shall enter by the way of the porch of the gate outside, and shall stand by the post of the gate; and the priests shall prepare his burnt offering and his peace offerings, and he shall worship at the threshold of the gate. Then he shall go out, but the gate shall not be shut until the evening. +\v 3 The people of the land shall worship at the door of that gate before Yahweh on the Sabbaths and on the new moons. +\v 4 The burnt offering that the prince shall offer to Yahweh shall be on the Sabbath day, six lambs without defect and a ram without defect; +\v 5 and the meal offering shall be an ephah for the ram, and the meal offering for the lambs as he is able to give, and a hin\f + \fr 46:5 \ft A hin is about 6.5 liters or 1.7 gallons.\f* of oil to an ephah.\f + \fr 46:5 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* +\v 6 On the day of the new moon it shall be a young bull without defect, six lambs, and a ram. They shall be without defect. +\v 7 He shall prepare a meal offering: an ephah for the bull, and an ephah for the ram, and for the lambs according as he is able, and a hin of oil to an ephah. +\v 8 When the prince enters, he shall go in by the way of the porch of the gate, and he shall go out by its way. +\p +\v 9 “‘“But when the people of the land come before Yahweh in the appointed feasts, he who enters by the way of the north gate to worship shall go out by the way of the south gate; and he who enters by the way of the south gate shall go out by the way of the north gate. He shall not return by the way of the gate by which he came in, but shall go out straight before him. +\v 10 The prince shall go in with them when they go in. When they go out, he shall go out. +\p +\v 11 “‘“In the feasts and in the appointed holidays, the meal offering shall be an ephah\f + \fr 46:11 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* for a bull, and an ephah for a ram, and for the lambs as he is able to give, and a hin of oil to an ephah. +\v 12 When the prince prepares a free will offering, a burnt offering or peace offerings as a free will offering to Yahweh, one shall open for him the gate that looks toward the east; and he shall prepare his burnt offering and his peace offerings, as he does on the Sabbath day. Then he shall go out; and after his going out one shall shut the gate. +\p +\v 13 “‘“You shall prepare a lamb a year old without defect for a burnt offering to Yahweh daily. Morning by morning you shall prepare it. +\v 14 You shall prepare a meal offering with it morning by morning, the sixth part of an ephah,\f + \fr 46:14 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* and the third part of a hin of oil to moisten the fine flour; a meal offering to Yahweh continually by a perpetual ordinance. +\v 15 Thus they shall prepare the lamb, the meal offering, and the oil, morning by morning, for a continual burnt offering.” +\p +\v 16 “‘The Lord Yahweh says: “If the prince gives a gift to any of his sons, it is his inheritance. It shall belong to his sons. It is their possession by inheritance. +\v 17 But if he gives of his inheritance a gift to one of his servants, it shall be his to the year of liberty; then it shall return to the prince; but as for his inheritance, it shall be for his sons. +\v 18 Moreover the prince shall not take of the people’s inheritance, to thrust them out of their possession. He shall give inheritance to his sons out of his own possession, that my people not each be scattered from his possession.”’” +\p +\v 19 Then he brought me through the entry, which was at the side of the gate, into the holy rooms for the priests, which looked toward the north. Behold, there was a place on the back part westward. +\v 20 He said to me, “This is the place where the priests shall boil the trespass offering and the sin offering, and where they shall bake the meal offering, that they not bring them out into the outer court, to sanctify the people.” +\p +\v 21 Then he brought me out into the outer court and caused me to pass by the four corners of the court; and behold, in every corner of the court there was a court. +\v 22 In the four corners of the court there were courts enclosed, forty cubits\f + \fr 46:22 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* long and thirty wide. These four in the corners were the same size. +\v 23 There was a wall around in them, around the four, and boiling places were made under the walls all around. +\v 24 Then he said to me, “These are the boiling houses, where the ministers of the house shall boil the sacrifice of the people.” +\c 47 +\p +\v 1 He brought me back to the door of the temple; and behold, waters flowed out from under the threshold of the temple eastward, for the front of the temple faced toward the east. The waters came down from underneath, from the right side of the temple, on the south of the altar. +\v 2 Then he brought me out by the way of the gate northward, and led me around by the way outside to the outer gate, by the way of the gate that looks toward the east. Behold, waters ran out on the right side. +\p +\v 3 When the man went out eastward with the line in his hand, he measured one thousand cubits,\f + \fr 47:3 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and he caused me to pass through the waters, waters that were to the ankles. +\v 4 Again he measured one thousand, and caused me to pass through the waters, waters that were to the knees. Again he measured one thousand, and caused me to pass through waters that were to the waist. +\v 5 Afterward he measured one thousand; and it was a river that I could not pass through, for the waters had risen, waters to swim in, a river that could not be walked through. +\p +\v 6 He said to me, “Son of man, have you seen this?” +\p Then he brought me and caused me to return to the bank of the river. +\v 7 Now when I had returned, behold, on the bank of the river were very many trees on the one side and on the other. +\v 8 Then he said to me, “These waters flow out toward the eastern region and will go down into the Arabah. Then they will go toward the sea and flow into the sea which will be made to flow out; and the waters will be healed. +\v 9 It will happen that every living creature which swarms, in every place where the rivers come, will live. Then there will be a very great multitude of fish; for these waters have come there, and the waters of the sea will be healed, and everything will live wherever the river comes. +\v 10 It will happen that fishermen will stand by it. From En Gedi even to En Eglaim will be a place for the spreading of nets. Their fish will be after their kinds, as the fish of the great sea, exceedingly many. +\v 11 But its swamps marshes will not be healed. They will be given up to salt. +\v 12 By the river banks, on both sides, will grow every tree for food, whose leaf won’t wither, neither will its fruit fail. It will produce new fruit every month, because its waters issue out of the sanctuary. Its fruit will be for food, and its leaf for healing.” +\p +\v 13 The Lord Yahweh says: “This shall be the border by which you shall divide the land for inheritance according to the twelve tribes of Israel. Joseph shall have two portions. +\v 14 You shall inherit it, one as well as another; for I swore to give it to your fathers. This land will fall to you for inheritance. +\p +\v 15 “This shall be the border of the land: +\p “On the north side, from the great sea, by the way of Hethlon, to the entrance of Zedad; +\v 16 Hamath, Berothah, Sibraim (which is between the border of Damascus and the border of Hamath), to Hazer Hatticon, which is by the border of Hauran. +\v 17 The border from the sea shall be Hazar Enon at the border of Damascus; and on the north northward is the border of Hamath. This is the north side. +\p +\v 18 “The east side, between Hauran, Damascus, Gilead, and the land of Israel, shall be the Jordan; from the north border to the east sea you shall measure. This is the east side. +\p +\v 19 “The south side southward shall be from Tamar as far as the waters of Meriboth Kadesh, to the brook, to the great sea. This is the south side southward. +\p +\v 20 “The west side shall be the great sea, from the south border as far as opposite the entrance of Hamath. This is the west side. +\p +\v 21 “So you shall divide this land to yourselves according to the tribes of Israel. +\v 22 You shall divide it by lot for an inheritance to you and to the aliens who live among you, who will father children among you. Then they shall be to you as the native-born among the children of Israel. They shall have inheritance with you among the tribes of Israel. +\v 23 In whatever tribe the stranger lives, there you shall give him his inheritance,” says the Lord Yahweh. +\c 48 +\p +\v 1 “Now these are the names of the tribes: From the north end, beside the way of Hethlon to the entrance of Hamath, Hazar Enan at the border of Damascus, northward beside Hamath (and they shall have their sides east and west), Dan, one portion. +\p +\v 2 “By the border of Dan, from the east side to the west side, Asher, one portion. +\p +\v 3 “By the border of Asher, from the east side even to the west side, Naphtali, one portion. +\p +\v 4 “By the border of Naphtali, from the east side to the west side, Manasseh, one portion. +\p +\v 5 “By the border of Manasseh, from the east side to the west side, Ephraim, one portion. +\p +\v 6 “By the border of Ephraim, from the east side even to the west side, Reuben, one portion. +\p +\v 7 “By the border of Reuben, from the east side to the west side, Judah, one portion. +\p +\v 8 “By the border of Judah, from the east side to the west side, shall be the offering which you shall offer, twenty-five thousand reeds in width, and in length as one of the portions, from the east side to the west side; and the sanctuary shall be in the middle of it. +\p +\v 9 “The offering that you shall offer to Yahweh shall be twenty-five thousand reeds in length, and ten thousand in width. +\v 10 For these, even for the priests, shall be the holy offering: toward the north twenty-five thousand in length, and toward the west ten thousand in width, and toward the east ten thousand in width, and toward the south twenty-five thousand in length; and the sanctuary of Yahweh shall be in the middle of it. +\v 11 It shall be for the priests who are sanctified of the sons of Zadok, who have kept my instruction, who didn’t go astray when the children of Israel went astray, as the Levites went astray. +\v 12 It shall be to them an offering from the offering of the land, a most holy thing, by the border of the Levites. +\p +\v 13 “Alongside the border of the priests, the Levites shall have twenty-five thousand cubits in length and ten thousand in width. All the length shall be twenty-five thousand, and the width ten thousand. +\v 14 They shall sell none of it, nor exchange it, nor shall the first fruits of the land be alienated, for it is holy to Yahweh. +\p +\v 15 “The five thousand cubits that are left in the width, in front of the twenty-five thousand, shall be for common use, for the city, for dwelling and for pasture lands; and the city shall be in the middle of it. +\v 16 These shall be its measurements: the north side four thousand and five hundred, and the south side four thousand and five hundred, and on the east side four thousand and five hundred, and the west side four thousand and five hundred. +\v 17 The city shall have pasture lands: toward the north two hundred fifty, and toward the south two hundred fifty, and toward the east two hundred fifty, and toward the west two hundred fifty. +\v 18 The remainder of the length, alongside the holy offering, shall be ten thousand eastward and ten thousand westward; and it shall be alongside the holy offering. Its increase shall be for food to those who labor in the city. +\v 19 Those who labor in the city, out of all the tribes of Israel, shall cultivate it. +\v 20 All the offering shall be a square of twenty-five thousand by twenty-five thousand. You shall offer it as a holy offering, with the possession of the city. +\p +\v 21 “The remainder shall be for the prince, on the one side and on the other of the holy offering and of the possession of the city; in front of the twenty-five thousand of the offering toward the east border, and westward in front of the twenty-five thousand toward the west border, alongside the portions, it shall be for the prince. The holy offering and the sanctuary of the house shall be in the middle of it. +\v 22 Moreover, from the possession of the Levites, and from the possession of the city, being in the middle of that which is the prince’s, between the border of Judah and the border of Benjamin, shall be for the prince. +\p +\v 23 “As for the rest of the tribes: from the east side to the west side, Benjamin, one portion. +\p +\v 24 “By the border of Benjamin, from the east side to the west side, Simeon, one portion. +\p +\v 25 “By the border of Simeon, from the east side to the west side, Issachar, one portion. +\p +\v 26 “By the border of Issachar, from the east side to the west side, Zebulun, one portion. +\p +\v 27 “By the border of Zebulun, from the east side to the west side, Gad, one portion. +\p +\v 28 “By the border of Gad, at the south side southward, the border shall be even from Tamar to the waters of Meribath Kadesh, to the brook, to the great sea. +\p +\v 29 “This is the land which you shall divide by lot to the tribes of Israel for inheritance, and these are their several portions, says the Lord Yahweh. +\p +\v 30 “These are the exits of the city: On the north side four thousand five hundred reeds by measure; +\v 31 and the gates of the city shall be named after the tribes of Israel, three gates northward: the gate of Reuben, one; the gate of Judah, one; the gate of Levi, one. +\p +\v 32 “At the east side four thousand five hundred reeds, and three gates: even the gate of Joseph, one; the gate of Benjamin, one; the gate of Dan, one. +\p +\v 33 “At the south side four thousand five hundred reeds by measure, and three gates: the gate of Simeon, one; the gate of Issachar, one; the gate of Zebulun, one. +\p +\v 34 “At the west side four thousand five hundred reeds, with their three gates: the gate of Gad, one; the gate of Asher, one; the gate of Naphtali, one. +\p +\v 35 “It shall be eighteen thousand reeds in circumference; and the name of the city from that day shall be, ‘Yahweh is there.’ diff --git a/c-sharp/assets/WEB/27DANengWEBUS.SFM b/c-sharp/assets/WEB/27DANengWEBUS.SFM new file mode 100644 index 0000000000..6c1ffbb1d9 --- /dev/null +++ b/c-sharp/assets/WEB/27DANengWEBUS.SFM @@ -0,0 +1,583 @@ +\id DAN 27-DAN-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Daniel +\toc1 The Book of Daniel +\toc2 Daniel +\toc3 Daniel +\mt2 The Book of +\mt1 Daniel +\c 1 +\p +\v 1 In the third year of the reign of Jehoiakim king of Judah, Nebuchadnezzar king of Babylon came to Jerusalem and besieged it. +\v 2 The Lord\f + \fr 1:2 \ft The word translated “Lord” is “Adonai.”\f* gave Jehoiakim king of Judah into his hand, with some of the vessels of the house of God;\f + \fr 1:2 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* and he carried them into the land of Shinar to the house of his god. He brought the vessels into the treasure house of his god. +\p +\v 3 The king spoke to Ashpenaz, the master of his eunuchs, that he should bring in some of the children of Israel, even of the royal offspring\f + \fr 1:3 \ft or, seed\f* and of the nobles: +\v 4 youths in whom was no defect, but well-favored, skillful in all wisdom, endowed with knowledge, understanding science, and who had the ability to stand in the king’s palace; and that he should teach them the learning and the language of the Chaldeans. +\v 5 The king appointed for them a daily portion of the king’s delicacies and of the wine which he drank, and that they should be nourished three years, that at its end they should stand before the king. +\p +\v 6 Now among these of the children of Judah were Daniel, Hananiah, Mishael, and Azariah. +\v 7 The prince of the eunuchs gave names to them: to Daniel he gave the name Belteshazzar; to Hananiah, Shadrach; to Mishael, Meshach; and to Azariah, Abednego. +\p +\v 8 But Daniel purposed in his heart that he would not defile himself with the king’s delicacies, nor with the wine which he drank. Therefore he requested of the prince of the eunuchs that he might not defile himself. +\v 9 Now God made Daniel find kindness and compassion in the sight of the prince of the eunuchs. +\v 10 The prince of the eunuchs said to Daniel, “I fear my lord the king, who has appointed your food and your drink. For why should he see your faces worse looking than the youths who are of your own age? Then you would endanger my head with the king.” +\p +\v 11 Then Daniel said to the steward whom the prince of the eunuchs had appointed over Daniel, Hananiah, Mishael, and Azariah: +\v 12 “Test your servants, I beg you, ten days; and let them give us vegetables to eat and water to drink. +\v 13 Then let our faces be examined before you, and the face of the youths who eat of the king’s delicacies; and as you see, deal with your servants.” +\v 14 So he listened to them in this matter, and tested them for ten days. +\p +\v 15 At the end of ten days, their faces appeared fairer and they were fatter in flesh than all the youths who ate of the king’s delicacies. +\v 16 So the steward took away their delicacies and the wine that they were given to drink, and gave them vegetables. +\p +\v 17 Now as for these four youths, God gave them knowledge and skill in all learning and wisdom; and Daniel had understanding in all visions and dreams. +\p +\v 18 At the end of the days which the king had appointed for bringing them in, the prince of the eunuchs brought them in before Nebuchadnezzar. +\v 19 The king talked with them; and among them all was found no one like Daniel, Hananiah, Mishael, and Azariah. Therefore stood they before the king. +\v 20 In every matter of wisdom and understanding concerning which the king inquired of them, he found them ten times better than all the magicians and enchanters who were in all his realm. +\p +\v 21 Daniel continued even to the first year of King Cyrus. +\c 2 +\p +\v 1 In the second year of the reign of Nebuchadnezzar, Nebuchadnezzar dreamed dreams; and his spirit was troubled, and his sleep went from him. +\v 2 Then the king commanded that the magicians, the enchanters, the sorcerers, and the Chaldeans be called to tell the king his dreams. So they came in and stood before the king. +\v 3 The king said to them, “I have dreamed a dream, and my spirit is troubled to know the dream.” +\p +\v 4 Then the Chaldeans spoke to the king in the Syrian language, “O king, live forever! Tell your servants the dream, and we will show the interpretation.” +\p +\v 5 The king answered the Chaldeans, “The thing has gone from me. If you don’t make known to me the dream and its interpretation, you will be cut in pieces, and your houses will be made a dunghill. +\v 6 But if you show the dream and its interpretation, you will receive from me gifts, rewards, and great honor. Therefore show me the dream and its interpretation.” +\p +\v 7 They answered the second time and said, “Let the king tell his servants the dream, and we will show the interpretation.” +\p +\v 8 The king answered, “I know of a certainty that you are trying to gain time, because you see the thing has gone from me. +\v 9 But if you don’t make known to me the dream, there is but one law for you; for you have prepared lying and corrupt words to speak before me, until the situation changes. Therefore tell me the dream, and I will know that you can show me its interpretation.” +\p +\v 10 The Chaldeans answered the king and said, “There is not a man on the earth who can show the king’s matter, because no king, lord, or ruler has asked such a thing of any magician, enchanter, or Chaldean. +\v 11 It is a rare thing that the king requires, and there is no other who can show it before the king except the gods, whose dwelling is not with flesh.” +\p +\v 12 Because of this, the king was angry and very furious, and commanded that all the wise men of Babylon be destroyed. +\v 13 So the decree went out, and the wise men were to be slain. They sought Daniel and his companions to be slain. +\p +\v 14 Then Daniel returned answer with counsel and prudence to Arioch the captain of the king’s guard, who had gone out to kill the wise men of Babylon. +\v 15 He answered Arioch the king’s captain, “Why is the decree so urgent from the king?” Then Arioch made the thing known to Daniel. +\v 16 Daniel went in, and desired of the king that he would appoint him a time, and he would show the king the interpretation. +\p +\v 17 Then Daniel went to his house and made the thing known to Hananiah, Mishael, and Azariah, his companions: +\v 18 that they would desire mercies of the God of heaven concerning this secret, that Daniel and his companions would not perish with the rest of the wise men of Babylon. +\v 19 Then the secret was revealed to Daniel in a vision of the night. Then Daniel blessed the God of heaven. +\v 20 Daniel answered, +\q1 “Blessed be the name of God forever and ever; +\q2 for wisdom and might are his. +\q1 +\v 21 He changes the times and the seasons. +\q2 He removes kings and sets up kings. +\q1 He gives wisdom to the wise, +\q2 and knowledge to those who have understanding. +\q1 +\v 22 He reveals the deep and secret things. +\q2 He knows what is in the darkness, +\q2 and the light dwells with him. +\q1 +\v 23 I thank you and praise you, +\q2 O God of my fathers, +\q1 who have given me wisdom and might, +\q2 and have now made known to me what we desired of you; +\q2 for you have made known to us the king’s matter.” +\p +\v 24 Therefore Daniel went in to Arioch, whom the king had appointed to destroy the wise men of Babylon. He went and said this to him: “Don’t destroy the wise men of Babylon. Bring me in before the king, and I will show to the king the interpretation.” +\p +\v 25 Then Arioch brought in Daniel before the king in haste, and said this to him: “I have found a man of the children of the captivity of Judah who will make known to the king the interpretation.” +\p +\v 26 The king answered Daniel, whose name was Belteshazzar, “Are you able to make known to me the dream which I have seen, and its interpretation?” +\p +\v 27 Daniel answered before the king, and said, “The secret which the king has demanded can’t be shown to the king by wise men, enchanters, magicians, or soothsayers; +\v 28 but there is a God in heaven who reveals secrets, and he has made known to King Nebuchadnezzar what will be in the latter days. Your dream and the visions of your head on your bed are these: +\p +\v 29 “As for you, O king, your thoughts came on your bed, what should happen hereafter; and he who reveals secrets has made known to you what will happen. +\v 30 But as for me, this secret is not revealed to me for any wisdom that I have more than any living, but to the intent that the interpretation may be made known to the king, and that you may know the thoughts of your heart. +\p +\v 31 “You, O king, saw, and behold,\f + \fr 2:31 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* a great image. This image, which was mighty, and whose brightness was excellent, stood before you; and its appearance was terrifying. +\v 32 As for this image, its head was of fine gold, its breast and its arms of silver, its belly and its thighs of bronze, +\v 33 its legs of iron, its feet part of iron and part of clay. +\v 34 You saw until a stone was cut out without hands, which struck the image on its feet that were of iron and clay, and broke them in pieces. +\v 35 Then the iron, the clay, the bronze, the silver, and the gold were broken in pieces together, and became like the chaff of the summer threshing floors. The wind carried them away, so that no place was found for them. The stone that struck the image became a great mountain and filled the whole earth. +\p +\v 36 “This is the dream; and we will tell its interpretation before the king. +\v 37 You, O king, are king of kings, to whom the God of heaven has given the kingdom, the power, the strength, and the glory. +\v 38 Wherever the children of men dwell, he has given the animals of the field and the birds of the sky into your hand, and has made you rule over them all. You are the head of gold. +\p +\v 39 “After you, another kingdom will arise that is inferior to you; and another third kingdom of bronze, which will rule over all the earth. +\v 40 The fourth kingdom will be strong as iron, because iron breaks in pieces and subdues all things; and as iron that crushes all these, it will break in pieces and crush. +\v 41 Whereas you saw the feet and toes, part of potters’ clay and part of iron, it will be a divided kingdom; but there will be in it of the strength of the iron, because you saw the iron mixed with miry clay. +\v 42 As the toes of the feet were part of iron, and part of clay, so the kingdom will be partly strong and partly brittle. +\v 43 Whereas you saw the iron mixed with miry clay, they will mingle themselves with the seed of men; but they won’t cling to one another, even as iron does not mix with clay. +\p +\v 44 “In the days of those kings the God of heaven will set up a kingdom which will never be destroyed, nor will its sovereignty be left to another people; but it will break in pieces and consume all these kingdoms, and it will stand forever. +\v 45 Because you saw that a stone was cut out of the mountain without hands, and that it broke in pieces the iron, the bronze, the clay, the silver, and the gold, the great God has made known to the king what will happen hereafter. The dream is certain, and its interpretation sure.” +\p +\v 46 Then King Nebuchadnezzar fell on his face, worshiped Daniel, and commanded that they should offer an offering and sweet odors to him. +\v 47 The king answered to Daniel, and said, “Of a truth your God is the God of gods, and the Lord of kings, and a revealer of secrets, since you have been able to reveal this secret.” +\p +\v 48 Then the king made Daniel great and gave him many great gifts, and made him rule over the whole province of Babylon and to be chief governor over all the wise men of Babylon. +\v 49 Daniel requested of the king, and he appointed Shadrach, Meshach, and Abednego over the affairs of the province of Babylon, but Daniel was in the king’s gate. +\c 3 +\p +\v 1 Nebuchadnezzar the king made an image of gold, whose height was sixty cubits\f + \fr 3:1 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width six cubits. He set it up in the plain of Dura, in the province of Babylon. +\v 2 Then Nebuchadnezzar the king sent to gather together the local governors, the deputies, and the governors, the judges, the treasurers, the counselors, the sheriffs, and all the rulers of the provinces, to come to the dedication of the image which Nebuchadnezzar the king had set up. +\v 3 Then the local governors, the deputies, and the governors, the judges, the treasurers, the counselors, the sheriffs, and all the rulers of the provinces were gathered together to the dedication of the image that Nebuchadnezzar the king had set up; and they stood before the image that Nebuchadnezzar had set up. +\p +\v 4 Then the herald cried aloud, “To you it is commanded, peoples, nations, and languages, +\v 5 that whenever you hear the sound of the horn, flute, zither, lyre, harp, pipe, and all kinds of music, you fall down and worship the golden image that Nebuchadnezzar the king has set up. +\v 6 Whoever doesn’t fall down and worship shall be cast into the middle of a burning fiery furnace the same hour.” +\p +\v 7 Therefore at that time, when all the peoples heard the sound of the horn, flute, zither, lyre, harp, pipe, and all kinds of music, all the peoples, the nations, and the languages fell down and worshiped the golden image that Nebuchadnezzar the king had set up. +\p +\v 8 Therefore at that time certain Chaldeans came near and brought accusation against the Jews. +\v 9 They answered Nebuchadnezzar the king, “O king, live for ever! +\v 10 You, O king, have made a decree that every man who hears the sound of the horn, flute, zither, lyre, harp, pipe, and all kinds of music shall fall down and worship the golden image; +\v 11 and whoever doesn’t fall down and worship shall be cast into the middle of a burning fiery furnace. +\v 12 There are certain Jews whom you have appointed over the affairs of the province of Babylon: Shadrach, Meshach, and Abednego. These men, O king, have not respected you. They don’t serve your gods, and don’t worship the golden image which you have set up.” +\p +\v 13 Then Nebuchadnezzar in rage and fury commanded that Shadrach, Meshach, and Abednego be brought. Then these men were brought before the king. +\v 14 Nebuchadnezzar answered them, “Is it true, Shadrach, Meshach, and Abednego, that you don’t serve my gods and you don’t worship the golden image which I have set up? +\v 15 Now if you are ready whenever you hear the sound of the horn, flute, zither, lyre, harp, pipe, and all kinds of music to fall down and worship the image which I have made, good; but if you don’t worship, you shall be cast the same hour into the middle of a burning fiery furnace. Who is that god who will deliver you out of my hands?” +\p +\v 16 Shadrach, Meshach, and Abednego answered the king, “Nebuchadnezzar, we have no need to answer you in this matter. +\v 17 If it happens, our God whom we serve is able to deliver us from the burning fiery furnace; and he will deliver us out of your hand, O king. +\v 18 But if not, let it be known to you, O king, that we will not serve your gods or worship the golden image which you have set up.” +\p +\v 19 Then Nebuchadnezzar was full of fury, and the form of his appearance was changed against Shadrach, Meshach, and Abednego. He spoke, and commanded that they should heat the furnace seven times more than it was usually heated. +\v 20 He commanded certain mighty men who were in his army to bind Shadrach, Meshach, and Abednego, and to cast them into the burning fiery furnace. +\v 21 Then these men were bound in their pants, their tunics, and their mantles, and their other clothes, and were cast into the middle of the burning fiery furnace. +\v 22 Therefore because the king’s commandment was urgent and the furnace exceedingly hot, the flame of the fire killed those men who took up Shadrach, Meshach, and Abednego. +\v 23 These three men, Shadrach, Meshach, and Abednego, fell down bound into the middle of the burning fiery furnace. +\p +\v 24 Then Nebuchadnezzar the king was astonished and rose up in haste. He spoke and said to his counselors, “Didn’t we cast three men bound into the middle of the fire?” +\p They answered the king, “True, O king.” +\p +\v 25 He answered, “Look, I see four men loose, walking in the middle of the fire, and they are unharmed. The appearance of the fourth is like a son of the gods.\f + \fr 3:25 \ft Or, the Son of God.\f*” +\p +\v 26 Then Nebuchadnezzar came near to the mouth of the burning fiery furnace. He spoke and said, “Shadrach, Meshach, and Abednego, you servants of the Most High God, come out, and come here!” +\p Then Shadrach, Meshach, and Abednego came out of the middle of the fire. +\v 27 The local governors, the deputies, and the governors, and the king’s counselors, being gathered together, saw these men, that the fire had no power on their bodies. The hair of their head wasn’t singed. Their pants weren’t changed. The smell of fire wasn’t even on them. +\p +\v 28 Nebuchadnezzar spoke and said, “Blessed be the God of Shadrach, Meshach, and Abednego, who has sent his angel and delivered his servants who trusted in him, and have changed the king’s word, and have yielded their bodies, that they might not serve nor worship any god except their own God. +\v 29 Therefore I make a decree that every people, nation, and language which speak anything evil against the God of Shadrach, Meshach, and Abednego shall be cut in pieces, and their houses shall be made a dunghill, because there is no other god who is able to deliver like this.” +\p +\v 30 Then the king promoted Shadrach, Meshach, and Abednego in the province of Babylon. +\c 4 +\pi1 +\v 1 Nebuchadnezzar the king, +\pi1 to all the peoples, nations, and languages, who dwell in all the earth: +\pi1 Peace be multiplied to you. +\pi1 +\v 2 It has seemed good to me to show the signs and wonders that the Most High God has worked toward me. +\q1 +\v 3 How great are his signs! +\q2 How mighty are his wonders! +\q1 His kingdom is an everlasting kingdom. +\q2 His dominion is from generation to generation. +\pi1 +\v 4 I, Nebuchadnezzar, was at rest in my house, and flourishing in my palace. +\v 5 I saw a dream which made me afraid; and the thoughts on my bed and the visions of my head troubled me. +\v 6 Therefore I made a decree to bring in all the wise men of Babylon before me, that they might make known to me the interpretation of the dream. +\v 7 Then the magicians, the enchanters, the Chaldeans, and the soothsayers came in; and I told them the dream, but they didn’t make known to me its interpretation. +\v 8 But at last, Daniel came in before me, whose name was Belteshazzar according to the name of my god, and in whom is the spirit of the holy gods. I told the dream before him, saying, +\pi1 +\v 9 “Belteshazzar, master of the magicians, because I know that the spirit of the holy gods is in you and no secret troubles you, tell me the visions of my dream that I have seen, and its interpretation. +\v 10 These were the visions of my head on my bed: I saw, and behold, a tree in the middle of the earth; and its height was great. +\v 11 The tree grew and was strong. Its height reached to the sky and its sight to the end of all the earth. +\v 12 Its leaves were beautiful, and it had much fruit, and in it was food for all. The animals of the field had shade under it, and the birds of the sky lived in its branches, and all flesh was fed from it. +\pi1 +\v 13 “I saw in the visions of my head on my bed, and behold, a holy watcher came down from the sky. +\v 14 He cried aloud and said this: ‘Cut down the tree, and cut off its branches! Shake off its leaves and scatter its fruit! Let the animals get away from under it and the birds from its branches. +\v 15 Nevertheless leave the stump of its roots in the earth, even with a band of iron and bronze, in the tender grass of the field; and let it be wet with the dew of the sky. Let his portion be with the animals in the grass of the earth. +\v 16 Let his heart be changed from man’s, and let an animal’s heart be given to him. Then let seven times pass over him. +\pi1 +\v 17 “‘The sentence is by the decree of the watchers and the demand by the word of the holy ones, to the intent that the living may know that the Most High rules in the kingdom of men, and gives it to whomever he will, and sets up over it the lowest of men.’ +\pi1 +\v 18 “This dream I, King Nebuchadnezzar, have seen; and you, Belteshazzar, declare the interpretation, because all the wise men of my kingdom are not able to make known to me the interpretation; but you are able, for the spirit of the holy gods is in you.” +\pi1 +\v 19 Then Daniel, whose name was Belteshazzar, was stricken mute for a while, and his thoughts troubled him. The king answered, “Belteshazzar, don’t let the dream or the interpretation, trouble you.” +\pi1 Belteshazzar answered, “My lord, may the dream be for those who hate you, and its interpretation to your adversaries. +\v 20 The tree that you saw, which grew and was strong, whose height reached to the sky and its sight to all the earth; +\v 21 whose leaves were beautiful and its fruit plentiful, and in it was food for all; under which the animals of the field lived, and on whose branches the birds of the sky had their habitation— +\v 22 it is you, O king, that have grown and become strong; for your greatness has grown, and reaches to the sky, and your dominion to the end of the earth. +\pi1 +\v 23 “Whereas the king saw a holy watcher coming down from the sky and saying, ‘Cut down the tree, and destroy it; nevertheless leave the stump of its roots in the earth, even with a band of iron and bronze, in the tender grass of the field, and let it be wet with the dew of the sky. Let his portion be with the animals of the field, until seven times pass over him.’ +\pi1 +\v 24 “This is the interpretation, O king, and it is the decree of the Most High, which has come on my lord the king: +\v 25 You will be driven from men and your dwelling shall be with the animals of the field. You will be made to eat grass as oxen, and will be wet with the dew of the sky, and seven times shall pass over you, until you know that the Most High rules in the kingdom of men, and gives it to whomever he will. +\v 26 Whereas it was commanded to leave the stump of the roots of the tree, your kingdom shall be sure to you after you know that Heavens rules. +\v 27 Therefore, O king, let my counsel be acceptable to you, and break off your sins by righteousness, and your iniquities by showing mercy to the poor. Perhaps there may be a lengthening of your tranquility.” +\pi1 +\v 28 All this came on the King Nebuchadnezzar. +\v 29 At the end of twelve months he was walking in the royal palace of Babylon. +\v 30 The king spoke and said, “Is not this great Babylon, which I have built for the royal dwelling place by the might of my power and for the glory of my majesty?” +\pi1 +\v 31 While the word was in the king’s mouth, a voice came from the sky, saying, “O King Nebuchadnezzar, to you it is spoken: ‘The kingdom has departed from you. +\v 32 You shall be driven from men, and your dwelling shall be with the animals of the field. You shall be made to eat grass like oxen. Seven times shall pass over you, until you know that the Most High rules in the kingdom of men, and gives it to whomever he will.’” +\pi1 +\v 33 This was fulfilled the same hour on Nebuchadnezzar. He was driven from men and ate grass like oxen; and his body was wet with the dew of the sky until his hair had grown like eagles’ feathers, and his nails like birds’ claws. +\pi1 +\v 34 At the end of the days I, Nebuchadnezzar, lifted up my eyes to heaven, and my understanding returned to me; and I blessed the Most High, and I praised and honored him who lives forever, +\q1 for his dominion is an everlasting dominion, +\q2 and his kingdom from generation to generation. +\q1 +\v 35 All the inhabitants of the earth are reputed as nothing; +\q2 and he does according to his will in the army of heaven, +\q2 and among the inhabitants of the earth; +\q1 and no one can stop his hand, +\q2 or ask him, “What are you doing?” +\pi1 +\v 36 At the same time my understanding returned to me; and for the glory of my kingdom, my majesty and brightness returned to me. My counselors and my lords sought me; and I was established in my kingdom, and excellent greatness was added to me. +\v 37 Now I, Nebuchadnezzar, praise and extol and honor the King of heaven; for all his works are truth, and his ways justice; and those who walk in pride he is able to abase. +\c 5 +\p +\v 1 Belshazzar the king made a great feast to a thousand of his lords, and drank wine before the thousand. +\v 2 Belshazzar, while he tasted the wine, commanded that the golden and silver vessels which Nebuchadnezzar his father had taken out of the temple which was in Jerusalem be brought to him, that the king and his lords, his wives and his concubines, might drink from them. +\v 3 Then they brought the golden vessels that were taken out of the temple of God’s house which was at Jerusalem; and the king and his lords, his wives and his concubines, drank from them. +\v 4 They drank wine, and praised the gods of gold, and of silver, of bronze, of iron, of wood, and of stone. +\p +\v 5 In the same hour, the fingers of a man’s hand came out and wrote near the lamp stand on the plaster of the wall of the king’s palace. The king saw the part of the hand that wrote. +\v 6 Then the king’s face was changed in him, and his thoughts troubled him; and the joints of his thighs were loosened, and his knees struck one against another. +\p +\v 7 The king cried aloud to bring in the enchanters, the Chaldeans, and the soothsayers. The king spoke and said to the wise men of Babylon, “Whoever reads this writing and shows me its interpretation shall be clothed with purple, and have a chain of gold about his neck, and shall be the third ruler in the kingdom.” +\p +\v 8 Then all the king’s wise men came in; but they could not read the writing, and couldn’t make known to the king the interpretation. +\v 9 Then King Belshazzar was greatly troubled, and his face was changed in him, and his lords were perplexed. +\p +\v 10 The queen by reason of the words of the king and his lords came into the banquet house. The queen spoke and said, “O king, live forever; don’t let your thoughts trouble you, nor let your face be changed. +\v 11 There is a man in your kingdom in whom is the spirit of the holy gods; and in the days of your father, light and understanding and wisdom, like the wisdom of the gods, were found in him. The king, Nebuchadnezzar, your father—yes, the king, your father—made him master of the magicians, enchanters, Chaldeans, and soothsayers, +\v 12 because an excellent spirit, knowledge, understanding, interpreting of dreams, showing of dark sentences, and dissolving of doubts were found in the same Daniel, whom the king named Belteshazzar. Now let Daniel be called, and he will show the interpretation.” +\p +\v 13 Then Daniel was brought in before the king. The king spoke and said to Daniel, “Are you that Daniel of the children of the captivity of Judah, whom the king my father brought out of Judah? +\v 14 I have heard of you, that the spirit of the gods is in you and that light, understanding, and excellent wisdom are found in you. +\v 15 Now the wise men, the enchanters, have been brought in before me, that they should read this writing, and make known to me its interpretation; but they could not show the interpretation of the thing. +\v 16 But I have heard of you, that you can give interpretations and dissolve doubts. Now if you can read the writing and make known to me its interpretation, you shall be clothed with purple, and have a chain of gold around your neck, and shall be the third ruler in the kingdom.” +\p +\v 17 Then Daniel answered before the king, “Let your gifts be to yourself, and give your rewards to another. Nevertheless, I will read the writing to the king, and make known to him the interpretation. +\p +\v 18 “To you, king, the Most High God gave Nebuchadnezzar your father the kingdom, and greatness, and glory, and majesty. +\v 19 Because of the greatness that he gave him, all the peoples, nations, and languages trembled and feared before him. He killed whom he wanted to, and he kept alive whom he wanted to. He raised up whom he wanted to, and he put down whom he wanted to. +\v 20 But when his heart was lifted up, and his spirit was hardened so that he dealt proudly, he was deposed from his kingly throne, and they took his glory from him. +\v 21 He was driven from the sons of men, and his heart was made like the animals’, and his dwelling was with the wild donkeys. He was fed with grass like oxen, and his body was wet with the dew of the sky, until he knew that the Most High God rules in the kingdom of men, and that he sets up over it whomever he will. +\p +\v 22 “You, his son, Belshazzar, have not humbled your heart, though you knew all this, +\v 23 but have lifted up yourself against the Lord of heaven; and they have brought the vessels of his house before you, and you and your lords, your wives, and your concubines, have drunk wine from them. You have praised the gods of silver and gold, of bronze, iron, wood, and stone, which don’t see, or hear, or know; and you have not glorified the God in whose hand your breath is, and whose are all your ways. +\v 24 Then the part of the hand was sent from before him, and this writing was inscribed. +\p +\v 25 “This is the writing that was inscribed: ‘MENE, MENE, TEKEL, UPHARSIN.’ +\p +\v 26 “This is the interpretation of the thing: +\m MENE: God has counted your kingdom, and brought it to an end. +\m +\v 27 TEKEL: you are weighed in the balances, and are found wanting. +\m +\v 28 PERES: your kingdom is divided, and given to the Medes and Persians.” +\p +\v 29 Then Belshazzar commanded, and they clothed Daniel with purple, and put a chain of gold about his neck, and made proclamation concerning him, that he should be the third ruler in the kingdom. +\p +\v 30 In that night Belshazzar the Chaldean King was slain. +\v 31 Darius the Mede received the kingdom, being about sixty-two years old. +\c 6 +\p +\v 1 It pleased Darius to set over the kingdom one hundred twenty local governors, who should be throughout the whole kingdom; +\v 2 and over them three presidents, of whom Daniel was one, that these local governors might give account to them, and that the king should suffer no loss. +\v 3 Then this Daniel was distinguished above the presidents and the local governors, because an excellent spirit was in him; and the king thought to set him over the whole realm. +\p +\v 4 Then the presidents and the local governors sought to find occasion against Daniel as touching the kingdom; but they could find no occasion or fault, because he was faithful. There wasn’t any error or fault found in him. +\v 5 Then these men said, “We won’t find any occasion against this Daniel, unless we find it against him concerning the law of his God.” +\p +\v 6 Then these presidents and local governors assembled together to the king, and said this to him, “King Darius, live forever! +\v 7 All the presidents of the kingdom, the deputies and the local governors, the counselors and the governors, have consulted together to establish a royal statute and to make a strong decree, that whoever asks a petition of any god or man for thirty days, except of you, O king, he shall be cast into the den of lions. +\v 8 Now, O king, establish the decree and sign the writing, that it not be changed, according to the law of the Medes and Persians, which doesn’t alter.” +\v 9 Therefore King Darius signed the writing and the decree. +\p +\v 10 When Daniel knew that the writing was signed, he went into his house (now his windows were open in his room toward Jerusalem) and he kneeled on his knees three times a day, and prayed, and gave thanks before his God, as he did before. +\v 11 Then these men assembled together, and found Daniel making petition and supplication before his God. +\v 12 Then they came near, and spoke before the king concerning the king’s decree: “Haven’t you signed a decree that every man who makes a petition to any god or man within thirty days, except to you, O king, shall be cast into the den of lions?” +\p The king answered, “This thing is true, according to the law of the Medes and Persians, which doesn’t alter.” +\p +\v 13 Then they answered and said before the king, “That Daniel, who is of the children of the captivity of Judah, doesn’t respect you, O king, nor the decree that you have signed, but makes his petition three times a day.” +\v 14 Then the king, when he heard these words, was very displeased, and set his heart on Daniel to deliver him; and he labored until the going down of the sun to rescue him. +\p +\v 15 Then these men assembled together to the king, and said to the king, “Know, O king, that it is a law of the Medes and Persians, that no decree nor statute which the king establishes may be changed.” +\p +\v 16 Then the king commanded, and they brought Daniel and cast him into the den of lions. The king spoke and said to Daniel, “Your God whom you serve continually, he will deliver you.” +\p +\v 17 A stone was brought, and laid on the mouth of the den; and the king sealed it with his own signet, and with the signet of his lords; that nothing might be changed concerning Daniel. +\v 18 Then the king went to his palace, and passed the night fasting. No musical instruments were brought before him; and his sleep fled from him. +\p +\v 19 Then the king arose very early in the morning, and went in haste to the den of lions. +\v 20 When he came near to the den to Daniel, he cried with a troubled voice. The king spoke and said to Daniel, “Daniel, servant of the living God, is your God, whom you serve continually, able to deliver you from the lions?” +\p +\v 21 Then Daniel said to the king, “O king, live forever! +\v 22 My God has sent his angel, and has shut the lions’ mouths, and they have not hurt me, because innocence was found in me before him; and also before you, O king, I have done no harm.” +\p +\v 23 Then the king was exceedingly glad, and commanded that they should take Daniel up out of the den. So Daniel was taken up out of the den, and no kind of harm was found on him, because he had trusted in his God. +\p +\v 24 The king commanded, and they brought those men who had accused Daniel, and they cast them into the den of lions—them, their children, and their wives; and the lions mauled them, and broke all their bones in pieces before they came to the bottom of the den. +\p +\v 25 Then King Darius wrote to all the peoples, nations, and languages who dwell in all the earth: +\pi1 “Peace be multiplied to you. +\pi1 +\v 26 “I make a decree that in all the dominion of my kingdom men tremble and fear before the God of Daniel. +\q1 “For he is the living God, +\q2 and steadfast forever. +\q1 His kingdom is that which will not be destroyed. +\q2 His dominion will be even to the end. +\q1 +\v 27 He delivers and rescues. +\q2 He works signs and wonders in heaven and in earth, +\q2 who has delivered Daniel from the power of the lions.” +\p +\v 28 So this Daniel prospered in the reign of Darius and in the reign of Cyrus the Persian. +\c 7 +\p +\v 1 In the first year of Belshazzar king of Babylon, Daniel had a dream and visions of his head while on his bed. Then he wrote the dream and told the sum of the matters. +\p +\v 2 Daniel spoke and said, “I saw in my vision by night, and, behold, the four winds of the sky broke out on the great sea. +\v 3 Four great animals came up from the sea, different from one another. +\p +\v 4 “The first was like a lion, and had eagle’s wings. I watched until its wings were plucked, and it was lifted up from the earth and made to stand on two feet as a man. A man’s heart was given to it. +\p +\v 5 “Behold, there was another animal, a second, like a bear. It was raised up on one side, and three ribs were in its mouth between its teeth. They said this to it: ‘Arise! Devour much flesh!’ +\p +\v 6 “After this I saw, and behold, another, like a leopard, which had on its back four wings of a bird. The animal also had four heads; and dominion was given to it. +\p +\v 7 “After this I saw in the night visions, and, behold, there was a fourth animal, awesome, powerful, and exceedingly strong. It had great iron teeth. It devoured and broke in pieces, and stamped the residue with its feet. It was different from all the animals that were before it. It had ten horns. +\p +\v 8 “I considered the horns, and behold, there came up among them another horn, a little one, before which three of the first horns were plucked up by the roots; and behold, in this horn were eyes like the eyes of a man, and a mouth speaking arrogantly. +\q1 +\v 9 “I watched until thrones were placed, +\q2 and one who was ancient of days sat. +\q1 His clothing was white as snow, +\q2 and the hair of his head like pure wool. +\q1 His throne was fiery flames, +\q2 and its wheels burning fire. +\q1 +\v 10 A fiery stream issued and came out from before him. +\q2 Thousands of thousands ministered to him. +\q2 Ten thousand times ten thousand stood before him. +\q1 The judgment was set. +\q2 The books were opened. +\p +\v 11 “I watched at that time because of the voice of the arrogant words which the horn spoke. I watched even until the animal was slain, and its body destroyed, and it was given to be burned with fire. +\v 12 As for the rest of the animals, their dominion was taken away; yet their lives were prolonged for a season and a time. +\p +\v 13 “I saw in the night visions, and behold, there came with the clouds of the sky one like a son of man, and he came even to the Ancient of Days, and they brought him near before him. +\v 14 Dominion was given him, and glory, and a kingdom, that all the peoples, nations, and languages should serve him. His dominion is an everlasting dominion, which will not pass away, and his kingdom one that will not be destroyed. +\p +\v 15 “As for me, Daniel, my spirit was grieved within my body, and the visions of my head troubled me. +\v 16 I came near to one of those who stood by, and asked him the truth concerning all this. +\p “So he told me, and made me know the interpretation of the things. +\v 17 ‘These great animals, which are four, are four kings, who will arise out of the earth. +\v 18 But the saints of the Most High will receive the kingdom, and possess the kingdom forever, even forever and ever.’ +\p +\v 19 “Then I desired to know the truth concerning the fourth animal, which was different from all of them, exceedingly terrible, whose teeth were of iron, and its nails of bronze; which devoured, broke in pieces, and stamped the residue with its feet; +\v 20 and concerning the ten horns that were on its head and the other horn which came up, and before which three fell, even that horn that had eyes and a mouth that spoke arrogantly, whose look was more stout than its fellows. +\v 21 I saw, and the same horn made war with the saints, and prevailed against them, +\v 22 until the ancient of days came, and judgment was given to the saints of the Most High, and the time came that the saints possessed the kingdom. +\p +\v 23 “So he said, ‘The fourth animal will be a fourth kingdom on earth, which will be different from all the kingdoms, and will devour the whole earth, and will tread it down and break it in pieces. +\v 24 As for the ten horns, ten kings will arise out of this kingdom. Another will arise after them; and he will be different from the former, and he will put down three kings. +\v 25 He will speak words against the Most High, and will wear out the saints of the Most High. He will plan to change the times and the law; and they will be given into his hand until a time and times and half a time. +\p +\v 26 “‘But the judgment will be set, and they will take away his dominion, to consume and to destroy it to the end. +\v 27 The kingdom and the dominion, and the greatness of the kingdoms under the whole sky, will be given to the people of the saints of the Most High. His kingdom is an everlasting kingdom, and all dominions will serve and obey him.’ +\p +\v 28 “Here is the end of the matter. As for me, Daniel, my thoughts troubled me greatly, and my face was changed in me; but I kept the matter in my heart.” +\c 8 +\p +\v 1 In the third year of the reign of King Belshazzar, a vision appeared to me, even to me, Daniel, after that which appeared to me at the first. +\v 2 I saw the vision. Now it was so, that when I saw, I was in the citadel of Susa, which is in the province of Elam. I saw in the vision, and I was by the river Ulai. +\v 3 Then I lifted up my eyes and saw, and behold, a ram which had two horns stood before the river. The two horns were high, but one was higher than the other, and the higher came up last. +\v 4 I saw the ram pushing westward, northward, and southward. No animals could stand before him. There wasn’t any who could deliver out of his hand, but he did according to his will, and magnified himself. +\p +\v 5 As I was considering, behold, a male goat came from the west over the surface of the whole earth, and didn’t touch the ground. The goat had a notable horn between his eyes. +\v 6 He came to the ram that had the two horns, which I saw standing before the river, and ran on him in the fury of his power. +\v 7 I saw him come close to the ram, and he was moved with anger against him, and struck the ram, and broke his two horns. There was no power in the ram to stand before him; but he cast him down to the ground and trampled on him. There was no one who could deliver the ram out of his hand. +\v 8 The male goat magnified himself exceedingly. When he was strong, the great horn was broken; and instead of it there came up four notable horns toward the four winds of the sky. +\p +\v 9 Out of one of them came out a little horn which grew exceedingly great—toward the south, and toward the east, and toward the glorious land. +\v 10 It grew great, even to the army of the sky; and it cast down some of the army and of the stars to the ground and trampled on them. +\v 11 Yes, it magnified itself, even to the prince of the army; and it took away from him the continual burnt offering, and the place of his sanctuary was cast down. +\v 12 The army was given over to it together with the continual burnt offering through disobedience. It cast down truth to the ground, and it did its pleasure and prospered. +\p +\v 13 Then I heard a holy one speaking; and another holy one said to that certain one who spoke, “How long will the vision about the continual burnt offering, and the disobedience that makes desolate, to give both the sanctuary and the army to be trodden under foot be?” +\p +\v 14 He said to me, “To two thousand and three hundred evenings and mornings. Then the sanctuary will be cleansed.” +\p +\v 15 When I, even I Daniel, had seen the vision, I sought to understand it. Then behold, there stood before me someone with the appearance of a man. +\v 16 I heard a man’s voice between the banks of the Ulai, which called and said, “Gabriel, make this man understand the vision.” +\p +\v 17 So he came near where I stood; and when he came, I was frightened, and fell on my face; but he said to me, “Understand, son of man, for the vision belongs to the time of the end.” +\p +\v 18 Now as he was speaking with me, I fell into a deep sleep with my face toward the ground; but he touched me and set me upright. +\p +\v 19 He said, “Behold, I will make you know what will be in the latter time of the indignation, for it belongs to the appointed time of the end. +\v 20 The ram which you saw, that had the two horns, they are the kings of Media and Persia. +\v 21 The rough male goat is the king of Greece. The great horn that is between his eyes is the first king. +\v 22 As for that which was broken, in the place where four stood up, four kingdoms will stand up out of the nation, but not with his power. +\p +\v 23 “In the latter time of their kingdom, when the transgressors have come to the full, a king of fierce face, and understanding riddles, will stand up. +\v 24 His power will be mighty, but not by his own power. He will destroy awesomely, and will prosper in what he does. He will destroy the mighty ones and the holy people. +\v 25 Through his policy he will cause deceit to prosper in his hand. He will magnify himself in his heart, and he will destroy many in their security. He will also stand up against the prince of princes, but he will be broken without human hands. +\p +\v 26 “The vision of the evenings and mornings which has been told is true; but seal up the vision, for it belongs to many days to come.” +\p +\v 27 I, Daniel, fainted, and was sick for some days. Then I rose up and did the king’s business. I wondered at the vision, but no one understood it. +\c 9 +\p +\v 1 In the first year of Darius the son of Ahasuerus, of the offspring of the Medes, who was made king over the realm of the Chaldeans— +\v 2 in the first year of his reign I, Daniel, understood by the books the number of the years about which Yahweh’s\f + \fr 9:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations. \f* word came to Jeremiah the prophet for the accomplishing of the desolations of Jerusalem, even seventy years. +\v 3 I set my face to the Lord God, to seek by prayer and petitions, with fasting and sackcloth and ashes. +\p +\v 4 I prayed to Yahweh my God, and made confession, and said, +\pi1 “Oh, Lord, the great and dreadful God, who keeps covenant and loving kindness with those who love him and keep his commandments, +\v 5 we have sinned, and have dealt perversely, and have done wickedly, and have rebelled, even turning aside from your precepts and from your ordinances. +\v 6 We haven’t listened to your servants the prophets, who spoke in your name to our kings, our princes, and our fathers, and to all the people of the land. +\pi1 +\v 7 “Lord, righteousness belongs to you, but to us confusion of face, as it is today; to the men of Judah, and to the inhabitants of Jerusalem, and to all Israel, who are near and who are far off, through all the countries where you have driven them, because of their trespass that they have trespassed against you. +\v 8 Lord, to us belongs confusion of face, to our kings, to our princes, and to our fathers, because we have sinned against you. +\v 9 To the Lord our God belong mercies and forgiveness, for we have rebelled against him. +\v 10 We haven’t obeyed Yahweh our God’s voice, to walk in his laws, which he set before us by his servants the prophets. +\v 11 Yes, all Israel have transgressed your law, turning aside, that they should not obey your voice. +\pi1 “Therefore the curse and the oath written in the law of Moses the servant of God has been poured out on us, for we have sinned against him. +\v 12 He has confirmed his words, which he spoke against us and against our judges who judged us, by bringing on us a great evil; for under the whole sky, such has not been done as has been done to Jerusalem. +\v 13 As it is written in the law of Moses, all this evil has come on us. Yet we have not entreated the favor of Yahweh our God, that we should turn from our iniquities and have discernment in your truth. +\v 14 Therefore Yahweh has watched over the evil, and brought it on us; for Yahweh our God is righteous in all his works which he does, and we have not obeyed his voice. +\pi1 +\v 15 “Now, Lord our God, who has brought your people out of the land of Egypt with a mighty hand, and have gotten yourself renown, as it is today, we have sinned. We have done wickedly. +\v 16 Lord, according to all your righteousness, please let your anger and your wrath be turned away from your city Jerusalem, your holy mountain; because for our sins and for the iniquities of our fathers, Jerusalem and your people have become a reproach to all who are around us. +\pi1 +\v 17 “Now therefore, our God, listen to the prayer of your servant and to his petitions, and cause your face to shine on your sanctuary that is desolate, for the Lord’s sake. +\v 18 My God, turn your ear and hear. Open your eyes and see our desolations, and the city which is called by your name; for we do not present our petitions before you for our righteousness, but for your great mercies’ sake. +\v 19 Lord, hear. Lord, forgive. Lord, listen and do. Don’t defer, for your own sake, my God, because your city and your people are called by your name.” +\b +\p +\v 20 While I was speaking, praying, and confessing my sin and the sin of my people Israel, and presenting my supplication before Yahweh my God for the holy mountain of my God— +\v 21 yes, while I was speaking in prayer—the man Gabriel, whom I had seen in the vision at the beginning, being caused to fly swiftly, touched me about the time of the evening offering. +\v 22 He instructed me and talked with me, and said, “Daniel, I have now come to give you wisdom and understanding. +\v 23 At the beginning of your petitions the commandment went out, and I have come to tell you, for you are greatly beloved. Therefore consider the matter and understand the vision. +\p +\v 24 “Seventy weeks are decreed on your people and on your holy city, to finish disobedience, to make an end of sins, to make reconciliation for iniquity, to bring in everlasting righteousness, to seal up vision and prophecy, and to anoint the most holy. +\p +\v 25 “Know therefore and discern that from the going out of the commandment to restore and build Jerusalem to the Anointed One,\f + \fr 9:25 \ft “Anointed One” can also be translated “Messiah” (same as “Christ”).\f* the prince, will be seven weeks and sixty-two weeks. It will be built again, with street and moat, even in troubled times. +\v 26 After the sixty-two weeks the Anointed One\f + \fr 9:26 \ft “Anointed One” can also be translated “Messiah” (same as “Christ”).\f* will be cut off, and will have nothing. The people of the prince who come will destroy the city and the sanctuary. Its end will be with a flood, and war will be even to the end. Desolations are determined. +\v 27 He will make a firm covenant with many for one week. In the middle of the week he will cause the sacrifice and the offering to cease. On the wing of abominations will come one who makes desolate; and even to the decreed full end, wrath will be poured out on the desolate.” +\c 10 +\p +\v 1 In the third year of Cyrus king of Persia a message was revealed to Daniel, whose name was called Belteshazzar; and the message was true, even a great warfare. He understood the message, and had understanding of the vision. +\p +\v 2 In those days I, Daniel, was mourning three whole weeks. +\v 3 I ate no pleasant food. No meat or wine came into my mouth. I didn’t anoint myself at all, until three whole weeks were fulfilled. +\p +\v 4 In the twenty-fourth day of the first month, as I was by the side of the great river, which is Hiddekel,\f + \fr 10:4 \ft or, Tigris River\f* +\v 5 I lifted up my eyes and looked, and behold, there was a man clothed in linen, whose waist was adorned with pure gold of Uphaz. +\v 6 His body also was like beryl, and his face as the appearance of lightning, and his eyes as flaming torches. His arms and his feet were like burnished bronze. The voice of his words was like the voice of a multitude. +\p +\v 7 I, Daniel, alone saw the vision, for the men who were with me didn’t see the vision, but a great quaking fell on them, and they fled to hide themselves. +\v 8 So I was left alone and saw this great vision. No strength remained in me; for my face grew deathly pale, and I retained no strength. +\v 9 Yet I heard the voice of his words. When I heard the voice of his words, then I fell into a deep sleep on my face, with my face toward the ground. +\p +\v 10 Behold, a hand touched me, which set me on my knees and on the palms of my hands. +\v 11 He said to me, “Daniel, you greatly beloved man, understand the words that I speak to you, and stand upright, for I have been sent to you, now.” When he had spoken this word to me, I stood trembling. +\p +\v 12 Then he said to me, “Don’t be afraid, Daniel; for from the first day that you set your heart to understand, and to humble yourself before your God, your words were heard. I have come for your words’ sake. +\v 13 But the prince of the kingdom of Persia withstood me twenty-one days; but, behold, Michael, one of the chief princes, came to help me because I remained there with the kings of Persia. +\v 14 Now I have come to make you understand what will happen to your people in the latter days, for the vision is yet for many days.” +\p +\v 15 When he had spoken these words to me, I set my face toward the ground and was mute. +\v 16 Behold, one in the likeness of the sons of men touched my lips. Then I opened my mouth, and spoke and said to him who stood before me, “My lord, by reason of the vision my sorrows have overtaken me, and I retain no strength. +\v 17 For how can the servant of this my lord talk with this my lord? For as for me, immediately there remained no strength in me. There was no breath left in me.” +\p +\v 18 Then one like the appearance of a man touched me again, and he strengthened me. +\v 19 He said, “Greatly beloved man, don’t be afraid. Peace be to you. Be strong. Yes, be strong.” +\p When he spoke to me, I was strengthened, and said, “Let my lord speak, for you have strengthened me.” +\p +\v 20 Then he said, “Do you know why I have come to you? Now I will return to fight with the prince of Persia. When I go out, behold, the prince of Greece will come. +\v 21 But I will tell you that which is inscribed in the writing of truth. There is no one who holds with me against these but Michael your prince. +\c 11 +\p +\v 1 “As for me, in the first year of Darius the Mede, I stood up to confirm and strengthen him. +\p +\v 2 “Now I will show you the truth. Behold, three more kings will stand up in Persia. The fourth will be far richer than all of them. When he has grown strong through his riches, he will stir up all against the realm of Greece. +\v 3 A mighty king will stand up, who will rule with great dominion, and do according to his will. +\v 4 When he stands up, his kingdom will be broken and will be divided toward the four winds of the sky, but not to his posterity, nor according to his dominion with which he ruled; for his kingdom will be plucked up, even for others besides these. +\p +\v 5 “The king of the south will be strong. One of his princes will become stronger than him, and have dominion. His dominion will be a great dominion. +\v 6 At the end of years they will join themselves together; and the daughter of the king of the south will come to the king of the north to make an agreement, but she will not retain the strength of her arm. He will also not stand, nor will his arm; but she will be given up, with those who brought her, and he who became the father of her, and he who strengthened her in those times. +\p +\v 7 “But out of a shoot from her roots one will stand up in his place, who will come to the army and will enter into the fortress of the king of the north, and will deal against them and will prevail. +\v 8 He will also carry their gods with their molten images, and with their goodly vessels of silver and of gold, captive into Egypt. He will refrain some years from the king of the north. +\v 9 He will come into the realm of the king of the south, but he will return into his own land. +\v 10 His sons will wage war, and will assemble a multitude of great forces which will come on, and overflow, and pass through. They will return and wage war, even to his fortress. +\p +\v 11 “The king of the south will be moved with anger and will come out and fight with him, even with the king of the north. He will send out a great multitude, and the multitude will be given into his hand. +\v 12 The multitude will be carried off, and his heart will be exalted. He will cast down tens of thousands, but he won’t prevail. +\v 13 The king of the north will return, and will send out a multitude greater than the former. He will come on at the end of the times, even of years, with a great army and with abundant supplies. +\p +\v 14 “In those times many will stand up against the king of the south. Also the children of the violent among your people will lift themselves up to establish the vision, but they will fall. +\v 15 So the king of the north will come and cast up a mound, and take a well-fortified city. The forces of the south won’t stand, neither will his select troops, neither will there be any strength to stand. +\v 16 But he who comes against him will do according to his own will, and no one will stand before him. He will stand in the glorious land, and destruction will be in his hand. +\v 17 He will set his face to come with the strength of his whole kingdom, and with him equitable conditions. He will perform them. He will give him the daughter of women, to destroy the kingdom, but she will not stand, and won’t be for him. +\v 18 After this he will turn his face to the islands, and will take many, but a prince will cause the reproach offered by him to cease. Yes, moreover, he will cause his reproach to turn on him. +\v 19 Then he will turn his face toward the fortresses of his own land; but he will stumble and fall, and won’t be found. +\p +\v 20 “Then one who will cause a tax collector to pass through the kingdom to maintain its glory will stand up in his place; but within few days he shall be destroyed, not in anger, and not in battle. +\p +\v 21 “In his place a contemptible person will stand up, to whom they had not given the honor of the kingdom; but he will come in time of security, and will obtain the kingdom by flatteries. +\v 22 The overwhelming forces will be overwhelmed from before him, and will be broken. Yes, also the prince of the covenant. +\v 23 After the treaty made with him he will work deceitfully; for he will come up and will become strong with few people. +\v 24 In time of security he will come even on the fattest places of the province. He will do that which his fathers have not done, nor his fathers’ fathers. He will scatter among them prey, plunder, and wealth. Yes, he will devise his plans against the strongholds, but only for a time. +\p +\v 25 “He will stir up his power and his courage against the king of the south with a great army; and the king of the south will wage war in battle with an exceedingly great and mighty army, but he won’t stand; for they will devise plans against him. +\v 26 Yes, those who eat of his delicacies will destroy him, and his army will be swept away. Many will fall down slain. +\v 27 As for both these kings, their hearts will be to do evil, and they will speak lies at one table; but it won’t prosper, for the end will still be at the appointed time. +\v 28 Then he will return into his land with great wealth. His heart will be against the holy covenant. He will take action, and return to his own land. +\p +\v 29 “He will return at the appointed time and come into the south; but it won’t be in the latter time as it was in the former. +\v 30 For ships of Kittim will come against him. Therefore he will be grieved, and will return, and have indignation against the holy covenant, and will take action. He will even return, and have regard to those who forsake the holy covenant. +\p +\v 31 “Forces from him will profane the sanctuary, even the fortress, and will take away the continual burnt offering. Then they will set up the abomination that makes desolate. +\v 32 He will corrupt those who do wickedly against the covenant by flatteries; but the people who know their God will be strong and take action. +\p +\v 33 “Those who are wise among the people will instruct many; yet they will fall by the sword and by flame, by captivity and by plunder, many days. +\v 34 Now when they fall, they will be helped with a little help; but many will join themselves to them with flatteries. +\v 35 Some of those who are wise will fall—to refine them, and to purify, and to make them white, even to the time of the end, because it is yet for the time appointed. +\p +\v 36 “The king will do according to his will. He will exalt himself and magnify himself above every god, and will speak marvelous things against the God of gods. He will prosper until the indignation is accomplished, for that which is determined will be done. +\v 37 He won’t regard the gods of his fathers, or the desire of women, or regard any god; for he will magnify himself above all. +\v 38 But in their place, he will honor the god of fortresses. He will honor a god whom his fathers didn’t know with gold, silver, and with precious stones and pleasant things. +\v 39 He will deal with the strongest fortresses by the help of a foreign god. He will increase with glory whoever acknowledges him. He will cause them to rule over many, and will divide the land for a price. +\p +\v 40 “At the time of the end the king of the south will contend with him; and the king of the north will come against him like a whirlwind, with chariots, with horsemen, and with many ships. He will enter into the countries, and will overflow and pass through. +\v 41 He will enter also into the glorious land, and many countries will be overthrown; but these will be delivered out of his hand: Edom, Moab, and the chief of the children of Ammon. +\v 42 He will also stretch out his hand on the countries. The land of Egypt won’t escape. +\v 43 But he will have power over the treasures of gold and of silver, and over all the precious things of Egypt. The Libyans and the Ethiopians will follow his steps. +\v 44 But news out of the east and out of the north will trouble him; and he will go out with great fury to destroy and utterly to sweep away many. +\v 45 He will plant the tents of his palace between the sea and the glorious holy mountain; yet he will come to his end, and no one will help him. +\c 12 +\p +\v 1 “At that time Michael will stand up, the great prince who stands for the children of your people; and there will be a time of trouble, such as never was since there was a nation even to that same time. At that time your people will be delivered, everyone who is found written in the book. +\v 2 Many of those who sleep in the dust of the earth will awake, some to everlasting life, and some to shame and everlasting contempt. +\v 3 Those who are wise will shine as the brightness of the expanse. Those who turn many to righteousness will shine as the stars forever and ever. +\v 4 But you, Daniel, shut up the words and seal the book, even to the time of the end. Many will run back and forth, and knowledge will be increased.” +\p +\v 5 Then I, Daniel, looked, and behold, two others stood, one on the river bank on this side, and the other on the river bank on that side. +\v 6 One said to the man clothed in linen, who was above the waters of the river, “How long will it be to the end of these wonders?” +\p +\v 7 I heard the man clothed in linen, who was above the waters of the river, when he held up his right hand and his left hand to heaven, and swore by him who lives forever that it will be for a time, times, and a half; and when they have finished breaking in pieces the power of the holy people, all these things will be finished. +\p +\v 8 I heard, but I didn’t understand. Then I said, “My lord, what will be the outcome of these things?” +\p +\v 9 He said, “Go your way, Daniel; for the words are shut up and sealed until the time of the end. +\v 10 Many will purify themselves, and make themselves white, and be refined, but the wicked will do wickedly; and none of the wicked will understand, but those who are wise will understand. +\p +\v 11 “From the time that the continual burnt offering is taken away and the abomination that makes desolate set up, there will be one thousand two hundred ninety days. +\v 12 Blessed is he who waits, and comes to the one thousand three hundred thirty-five days. +\p +\v 13 “But go your way until the end; for you will rest, and will stand in your inheritance at the end of the days.” diff --git a/c-sharp/assets/WEB/28HOSengWEBUS.SFM b/c-sharp/assets/WEB/28HOSengWEBUS.SFM new file mode 100644 index 0000000000..9972f9c2c7 --- /dev/null +++ b/c-sharp/assets/WEB/28HOSengWEBUS.SFM @@ -0,0 +1,849 @@ +\id HOS 28-HOS-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Hosea +\toc1 The Book of Hosea +\toc2 Hosea +\toc3 Hosea +\mt2 The Book of +\mt1 Hosea +\c 1 +\p +\v 1 Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word that came to Hosea the son of Beeri, in the days of Uzziah, Jotham, Ahaz, and Hezekiah, kings of Judah, and in the days of Jeroboam the son of Joash, king of Israel. +\p +\v 2 When Yahweh spoke at first by Hosea, Yahweh said to Hosea, “Go, take for yourself a wife of prostitution and children of unfaithfulness; for the land commits great adultery, forsaking Yahweh.” +\p +\v 3 So he went and took Gomer the daughter of Diblaim; and she conceived, and bore him a son. +\p +\v 4 Yahweh said to him, “Call his name Jezreel, for yet a little while, and I will avenge the blood of Jezreel on the house of Jehu, and will cause the kingdom of the house of Israel to cease. +\v 5 It will happen in that day that I will break the bow of Israel in the valley of Jezreel.” +\p +\v 6 She conceived again, and bore a daughter. +\p Then he said to him, “Call her name Lo-Ruhamah,\f + \fr 1:6 \ft Lo-Ruhamah means “not loved”.\f* for I will no longer have mercy on the house of Israel, that I should in any way pardon them. +\v 7 But I will have mercy on the house of Judah, and will save them by Yahweh their God,\f + \fr 1:7 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* and will not save them by bow, sword, battle, horses, or horsemen.” +\p +\v 8 Now when she had weaned Lo-Ruhamah, she conceived, and bore a son. +\p +\v 9 He said, “Call his name Lo-Ammi,\f + \fr 1:9 \ft Lo-Ammi means “not my people”.\f* for you are not my people, and I will not be yours. +\v 10 Yet the number of the children of Israel will be as the sand of the sea, which can’t be measured or counted; and it will come to pass that, in the place where it was said to them, ‘You are not my people,’ they will be called ‘sons of the living God.’ +\v 11 The children of Judah and the children of Israel will be gathered together, and they will appoint themselves one head, and will go up from the land; for great will be the day of Jezreel. +\c 2 +\p +\v 1 “Say to your brothers, ‘My people!’\f + \fr 2:1 \ft ‘Ammi’ in Hebrew\f* +\q2 and to your sisters, ‘My loved one!’\f + \fr 2:1 \ft ‘Ruhamah’ in Hebrew\f* +\q1 +\v 2 Contend with your mother! +\q2 Contend, for she is not my wife, +\q2 neither am I her husband; +\q1 and let her put away her prostitution from her face, +\q2 and her adulteries from between her breasts; +\q1 +\v 3 lest I strip her naked, +\q2 and make her bare as in the day that she was born, +\q1 and make her like a wilderness, +\q2 and set her like a dry land, +\q2 and kill her with thirst. +\q1 +\v 4 Indeed, on her children I will have no mercy, +\q2 for they are children of unfaithfulness. +\q1 +\v 5 For their mother has played the prostitute. +\q2 She who conceived them has done shamefully; +\q1 for she said, ‘I will go after my lovers, +\q2 who give me my bread and my water, +\q2 my wool and my flax, +\q2 my oil and my drink.’ +\q1 +\v 6 Therefore behold,\f + \fr 2:6 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I will hedge up your way with thorns, +\q2 and I will build a wall against her, +\q2 that she can’t find her way. +\q1 +\v 7 She will follow after her lovers, +\q2 but she won’t overtake them; +\q1 and she will seek them, +\q2 but won’t find them. +\q1 Then she will say, ‘I will go and return to my first husband, +\q2 for then it was better with me than now.’ +\q1 +\v 8 For she didn’t know that I gave her the grain, the new wine, and the oil, +\q2 and multiplied to her silver and gold, which they used for Baal. +\q1 +\v 9 Therefore I will take back my grain in its time, +\q2 and my new wine in its season, +\q2 and will pluck away my wool and my flax which should have covered her nakedness. +\q1 +\v 10 Now I will uncover her lewdness in the sight of her lovers, +\q2 and no one will deliver her out of my hand. +\q1 +\v 11 I will also cause all her celebrations to cease: +\q2 her feasts, her new moons, her Sabbaths, and all her solemn assemblies. +\q1 +\v 12 I will lay waste her vines and her fig trees, +\q2 about which she has said, ‘These are my wages that my lovers have given me,’ +\q2 and I will make them a forest, +\q2 and the animals of the field shall eat them. +\q1 +\v 13 I will visit on her the days of the Baals, +\q2 to which she burned incense +\q1 when she decked herself with her earrings and her jewels, +\q2 and went after her lovers +\q2 and forgot me,” says Yahweh. +\q1 +\v 14 “Therefore behold, I will allure her, +\q2 and bring her into the wilderness, +\q2 and speak tenderly to her. +\q1 +\v 15 I will give her vineyards from there, +\q2 and the valley of Achor for a door of hope; +\q1 and she will respond there +\q2 as in the days of her youth, +\q2 and as in the day when she came up out of the land of Egypt. +\q1 +\v 16 It will be in that day,” says Yahweh, +\q2 “that you will call me ‘my husband,’ +\q2 and no longer call me ‘my master.’ +\q1 +\v 17 For I will take away the names of the Baals out of her mouth, +\q2 and they will no longer be mentioned by name. +\q1 +\v 18 In that day I will make a covenant for them with the animals of the field, +\q2 and with the birds of the sky, +\q2 and with the creeping things of the ground. +\q1 I will break the bow, the sword, and the battle out of the land, +\q2 and will make them lie down safely. +\q1 +\v 19 I will betroth you to me forever. +\q2 Yes, I will betroth you to me in righteousness, in justice, in loving kindness, and in compassion. +\q1 +\v 20 I will even betroth you to me in faithfulness; +\q2 and you shall know Yahweh. +\q1 +\v 21 It will happen in that day, that I will respond,” says Yahweh. +\q2 “I will respond to the heavens, +\q2 and they will respond to the earth; +\q2 +\v 22 and the earth will respond to the grain, and the new wine, and the oil; +\q2 and they will respond to Jezreel. +\q1 +\v 23 I will sow her to me in the earth; +\q2 and I will have mercy on her who had not obtained mercy; +\q2 and I will tell those who were not my people, ‘You are my people;’ +\q2 and they will say, ‘You are My God!’” +\c 3 +\p +\v 1 Yahweh said to me, “Go again, love a woman loved by another, and an adulteress, even as Yahweh loves the children of Israel, though they turn to other gods, and love cakes of raisins.” +\p +\v 2 So I bought her for myself for fifteen pieces of silver and a homer\f + \fr 3:2 \ft 1 homer is about 220 liters or 6 bushels\f* and a half of barley. +\v 3 I said to her, “You shall stay with me many days. You shall not play the prostitute, and you shall not be with any other man. I will also be so toward you.” +\p +\v 4 For the children of Israel shall live many days without king, without prince, without sacrifice, without sacred stone, and without ephod or idols. +\v 5 Afterward the children of Israel shall return and seek Yahweh their God, and David their king, and shall come with trembling to Yahweh and to his blessings in the last days. +\c 4 +\p +\v 1 Hear Yahweh’s word, you children of Israel, +\q2 for Yahweh has a charge against the inhabitants of the land: +\q1 “Indeed there is no truth, nor goodness, +\q2 nor knowledge of God in the land. +\q1 +\v 2 There is cursing, lying, murder, stealing, and committing adultery; +\q2 they break boundaries, and bloodshed causes bloodshed. +\q1 +\v 3 Therefore the land will mourn, +\q2 and everyone who dwells in it will waste away, +\q1 with all living things in her, +\q2 even the animals of the field and the birds of the sky; +\q2 yes, the fish of the sea also die. +\b +\q1 +\v 4 “Yet let no man bring a charge, neither let any man accuse; +\q2 for your people are like those who bring charges against a priest. +\q1 +\v 5 You will stumble in the day, +\q2 and the prophet will also stumble with you in the night; +\q2 and I will destroy your mother. +\q1 +\v 6 My people are destroyed for lack of knowledge. +\q2 Because you have rejected knowledge, I will also reject you, +\q2 that you may be no priest to me. +\q1 Because you have forgotten your God’s law, +\q2 I will also forget your children. +\q1 +\v 7 As they were multiplied, so they sinned against me. +\q2 I will change their glory into shame. +\q1 +\v 8 They feed on the sin of my people, +\q2 and set their heart on their iniquity. +\q1 +\v 9 It will be like people, like priest; +\q2 and I will punish them for their ways, +\q2 and will repay them for their deeds. +\q1 +\v 10 They will eat, and not have enough. +\q2 They will play the prostitute, and will not increase; +\q2 because they have abandoned listening to Yahweh. +\q1 +\v 11 Prostitution, wine, and new wine take away understanding. +\q2 +\v 12 My people consult with their wooden idol, +\q2 and answer to a stick of wood. +\q1 Indeed the spirit of prostitution has led them astray, +\q2 and they have been unfaithful to their God. +\q1 +\v 13 They sacrifice on the tops of the mountains, +\q2 and burn incense on the hills, under oaks, poplars, and terebinths, +\q2 because its shade is good. +\q1 Therefore your daughters play the prostitute, +\q2 and your brides commit adultery. +\q1 +\v 14 I will not punish your daughters when they play the prostitute, +\q2 nor your brides when they commit adultery; +\q1 because the men consort with prostitutes, +\q2 and they sacrifice with the shrine prostitutes; +\q2 so the people without understanding will come to ruin. +\b +\q1 +\v 15 “Though you, Israel, play the prostitute, +\q2 yet don’t let Judah offend; +\q2 and don’t come to Gilgal, +\q2 neither go up to Beth Aven, +\q2 nor swear, ‘As Yahweh lives.’ +\q1 +\v 16 For Israel has behaved extremely stubbornly, like a stubborn heifer. +\q2 Then how will Yahweh feed them like a lamb in a meadow? +\q1 +\v 17 Ephraim is joined to idols. +\q2 Leave him alone! +\q1 +\v 18 Their drink has become sour. +\q2 They play the prostitute continually. +\q2 Her rulers dearly love their shameful way. +\q1 +\v 19 The wind has wrapped her up in its wings; +\q2 and they shall be disappointed because of their sacrifices. +\b +\c 5 +\p +\v 1 “Listen to this, you priests! +\q2 Listen, house of Israel, +\q2 and give ear, house of the king! +\q1 For the judgment is against you; +\q2 for you have been a snare at Mizpah, +\q2 and a net spread on Tabor. +\q1 +\v 2 The rebels are deep in slaughter, +\q2 but I discipline all of them. +\q1 +\v 3 I know Ephraim, +\q2 and Israel is not hidden from me; +\q1 for now, Ephraim, you have played the prostitute. +\q2 Israel is defiled. +\q1 +\v 4 Their deeds won’t allow them to turn to their God, +\q2 for the spirit of prostitution is within them, +\q2 and they don’t know Yahweh. +\q1 +\v 5 The pride of Israel testifies to his face. +\q2 Therefore Israel and Ephraim will stumble in their iniquity. +\q2 Judah also will stumble with them. +\q1 +\v 6 They will go with their flocks and with their herds to seek Yahweh, +\q2 but they won’t find him. +\q2 He has withdrawn himself from them. +\q1 +\v 7 They are unfaithful to Yahweh; +\q2 for they have borne illegitimate children. +\q2 Now the new moon will devour them with their fields. +\b +\q1 +\v 8 “Blow the cornet in Gibeah, +\q2 and the trumpet in Ramah! +\q2 Sound a battle cry at Beth Aven, behind you, Benjamin! +\q1 +\v 9 Ephraim will become a desolation in the day of rebuke. +\q2 Among the tribes of Israel, I have made known that which will surely be. +\q1 +\v 10 The princes of Judah are like those who remove a landmark. +\q2 I will pour out my wrath on them like water. +\q1 +\v 11 Ephraim is oppressed, +\q2 he is crushed in judgment, +\q2 because he is intent in his pursuit of idols. +\q1 +\v 12 Therefore I am to Ephraim like a moth, +\q2 and to the house of Judah like rottenness. +\b +\q1 +\v 13 “When Ephraim saw his sickness, +\q2 and Judah his wound, +\q2 then Ephraim went to Assyria, +\q2 and sent to King Jareb: +\q1 but he is not able to heal you, +\q2 neither will he cure you of your wound. +\q1 +\v 14 For I will be to Ephraim like a lion, +\q2 and like a young lion to the house of Judah. +\q1 I myself will tear in pieces and go away. +\q2 I will carry off, and there will be no one to deliver. +\q1 +\v 15 I will go and return to my place, +\q2 until they acknowledge their offense, +\q2 and seek my face. +\q2 In their affliction they will seek me earnestly.” +\b +\c 6 +\p +\v 1 “Come! Let’s return to Yahweh; +\q2 for he has torn us to pieces, +\q2 and he will heal us; +\q1 he has injured us, +\q2 and he will bind up our wounds. +\q1 +\v 2 After two days he will revive us. +\q2 On the third day he will raise us up, +\q2 and we will live before him. +\q1 +\v 3 Let’s acknowledge Yahweh. +\q2 Let’s press on to know Yahweh. +\q1 As surely as the sun rises, +\q2 Yahweh will appear. +\q1 He will come to us like the rain, +\q2 like the spring rain that waters the earth.” +\b +\q1 +\v 4 “Ephraim, what shall I do to you? +\q2 Judah, what shall I do to you? +\q2 For your love is like a morning cloud, +\q2 and like the dew that disappears early. +\q1 +\v 5 Therefore I have cut them to pieces with the prophets; +\q2 I killed them with the words of my mouth. +\q2 Your judgments are like a flash of lightning. +\q1 +\v 6 For I desire mercy, and not sacrifice; +\q2 and the knowledge of God more than burnt offerings. +\q1 +\v 7 But they, like Adam, have broken the covenant. +\q2 They were unfaithful to me there. +\q1 +\v 8 Gilead is a city of those who work iniquity; +\q2 it is stained with blood. +\q1 +\v 9 As gangs of robbers wait to ambush a man, +\q2 so the company of priests murder on the path toward Shechem, +\q2 committing shameful crimes. +\q1 +\v 10 In the house of Israel I have seen a horrible thing. +\q2 There is prostitution in Ephraim. +\q2 Israel is defiled. +\b +\q1 +\v 11 “Also, Judah, there is a harvest appointed for you, +\q2 when I restore the fortunes of my people. +\c 7 +\p +\v 1 When I would heal Israel, +\q2 then the iniquity of Ephraim is uncovered, +\q2 also the wickedness of Samaria; +\q2 for they commit falsehood, +\q2 and the thief enters in, +\q2 and the gang of robbers ravages outside. +\q1 +\v 2 They don’t consider in their hearts that I remember all their wickedness. +\q2 Now their own deeds have engulfed them. +\q2 They are before my face. +\q1 +\v 3 They make the king glad with their wickedness, +\q2 and the princes with their lies. +\q1 +\v 4 They are all adulterers. +\q2 They are burning like an oven that the baker stops stirring, +\q2 from the kneading of the dough, until it is leavened. +\q1 +\v 5 On the day of our king, the princes made themselves sick with the heat of wine. +\q2 He joined his hand with mockers. +\q1 +\v 6 For they have prepared their heart like an oven, +\q2 while they lie in wait. +\q2 Their anger smolders all night. +\q2 In the morning it burns as a flaming fire. +\q1 +\v 7 They are all hot as an oven, +\q2 and devour their judges. +\q1 All their kings have fallen. +\q2 There is no one among them who calls to me. +\q1 +\v 8 Ephraim mixes himself among the nations. +\q2 Ephraim is a pancake not turned over. +\q1 +\v 9 Strangers have devoured his strength, +\q2 and he doesn’t realize it. +\q1 Indeed, gray hairs are here and there on him, +\q2 and he doesn’t realize it. +\q1 +\v 10 The pride of Israel testifies to his face; +\q2 yet they haven’t returned to Yahweh their God, +\q2 nor sought him, for all this. +\b +\q1 +\v 11 “Ephraim is like an easily deceived dove, without understanding. +\q2 They call to Egypt. +\q2 They go to Assyria. +\q1 +\v 12 When they go, I will spread my net on them. +\q2 I will bring them down like the birds of the sky. +\q2 I will chastise them, as their congregation has heard. +\q1 +\v 13 Woe to them! +\q2 For they have wandered from me. +\q1 Destruction to them! +\q2 For they have trespassed against me. +\q1 Though I would redeem them, +\q2 yet they have spoken lies against me. +\q1 +\v 14 They haven’t cried to me with their heart, +\q2 but they howl on their beds. +\q1 They assemble themselves for grain and new wine. +\q2 They turn away from me. +\q1 +\v 15 Though I have taught and strengthened their arms, +\q2 yet they plot evil against me. +\q1 +\v 16 They return, but not to the Most High. +\q2 They are like a faulty bow. +\q2 Their princes will fall by the sword for the rage of their tongue. +\q2 This will be their derision in the land of Egypt. +\b +\c 8 +\p +\v 1 “Put the trumpet to your lips! +\q2 Something like an eagle is over Yahweh’s house, +\q2 because they have broken my covenant +\q2 and rebelled against my law. +\q1 +\v 2 They cry to me, ‘My God, we, Israel, acknowledge you!’ +\q2 +\v 3 Israel has cast off that which is good. +\q2 The enemy will pursue him. +\q1 +\v 4 They have set up kings, but not by me. +\q2 They have made princes, and I didn’t approve. +\q2 Of their silver and their gold they have made themselves idols, +\q2 that they may be cut off. +\q1 +\v 5 Let Samaria throw out his calf idol! +\q2 My anger burns against them! +\q2 How long will it be until they are capable of purity? +\q1 +\v 6 For this is even from Israel! +\q2 The workman made it, and it is no God; +\q2 indeed, the calf of Samaria shall be broken in pieces. +\q1 +\v 7 For they sow the wind, +\q2 and they will reap the whirlwind. +\q1 He has no standing grain. +\q2 The stalk will yield no head. +\q2 If it does yield, strangers will swallow it up. +\q1 +\v 8 Israel is swallowed up. +\q2 Now they are among the nations like a worthless thing. +\q1 +\v 9 For they have gone up to Assyria, +\q2 like a wild donkey wandering alone. +\q2 Ephraim has hired lovers for himself. +\q1 +\v 10 But although they sold themselves among the nations, +\q2 I will now gather them; +\q2 and they begin to waste away because of the oppression of the king of mighty ones. +\q1 +\v 11 Because Ephraim has multiplied altars for sinning, +\q2 they became for him altars for sinning. +\q1 +\v 12 I wrote for him the many things of my law, +\q2 but they were regarded as a strange thing. +\q1 +\v 13 As for the sacrifices of my offerings, +\q2 they sacrifice meat and eat it, +\q2 but Yahweh doesn’t accept them. +\q1 Now he will remember their iniquity, +\q2 and punish their sins. +\q2 They will return to Egypt. +\q1 +\v 14 For Israel has forgotten his Maker and built palaces; +\q2 and Judah has multiplied fortified cities; +\q2 but I will send a fire on his cities, +\q2 and it will devour its fortresses.” +\b +\c 9 +\p +\v 1 Don’t rejoice, Israel, to jubilation like the nations; +\q2 for you were unfaithful to your God. +\q2 You love the wages of a prostitute at every grain threshing floor. +\q1 +\v 2 The threshing floor and the wine press won’t feed them, +\q2 and the new wine will fail her. +\q1 +\v 3 They won’t dwell in Yahweh’s land; +\q2 but Ephraim will return to Egypt, +\q2 and they will eat unclean food in Assyria. +\q1 +\v 4 They won’t pour out wine offerings to Yahweh, +\q2 neither will they be pleasing to him. +\q2 Their sacrifices will be to them like the bread of mourners; +\q2 all who eat of it will be polluted; +\q2 for their bread will be for their appetite. +\q2 It will not come into Yahweh’s house. +\q1 +\v 5 What will you do in the day of solemn assembly, +\q2 and in the day of the feast of Yahweh? +\q1 +\v 6 For, behold, when they flee destruction, +\q2 Egypt will gather them up. +\q2 Memphis will bury them. +\q2 Nettles will possess their pleasant things of silver. +\q2 Thorns will be in their tents. +\q1 +\v 7 The days of visitation have come. +\q2 The days of reckoning have come. +\q1 Israel will consider the prophet to be a fool, +\q2 and the man who is inspired to be insane, +\q2 because of the abundance of your sins, +\q2 and because your hostility is great. +\q1 +\v 8 A prophet watches over Ephraim with my God. +\q2 A fowler’s snare is on all of his paths, +\q2 and hostility in the house of his God. +\q1 +\v 9 They have deeply corrupted themselves, +\q2 as in the days of Gibeah. +\q2 He will remember their iniquity. +\q2 He will punish them for their sins. +\q1 +\v 10 I found Israel like grapes in the wilderness. +\q2 I saw your fathers as the first ripe in the fig tree at its first season; +\q2 but they came to Baal Peor, and consecrated themselves to the shameful thing, +\q2 and became abominable like that which they loved. +\q1 +\v 11 As for Ephraim, their glory will fly away like a bird. +\q2 There will be no birth, no one with child, and no conception. +\q1 +\v 12 Though they bring up their children, +\q2 yet I will bereave them, so that not a man shall be left. +\q2 Indeed, woe also to them when I depart from them! +\q1 +\v 13 I have seen Ephraim, like Tyre, planted in a pleasant place; +\q2 but Ephraim will bring out his children to the murderer. +\q1 +\v 14 Give them—Yahweh what will you give? +\q2 Give them a miscarrying womb and dry breasts. +\b +\q1 +\v 15 “All their wickedness is in Gilgal; +\q2 for there I hated them. +\q2 Because of the wickedness of their deeds, I will drive them out of my house! +\q2 I will love them no more. +\q2 All their princes are rebels. +\q1 +\v 16 Ephraim is struck. +\q2 Their root has dried up. +\q2 They will bear no fruit. +\q2 Even though they give birth, yet I will kill the beloved ones of their womb.” +\b +\q1 +\v 17 My God will cast them away, because they didn’t listen to him; +\q2 and they will be wanderers among the nations. +\c 10 +\p +\v 1 Israel is a luxuriant vine that produces his fruit. +\q2 According to the abundance of his fruit he has multiplied his altars. +\q2 As their land has prospered, they have adorned their sacred stones. +\q1 +\v 2 Their heart is divided. +\q2 Now they will be found guilty. +\q2 He will demolish their altars. +\q2 He will destroy their sacred stones. +\q1 +\v 3 Surely now they will say, “We have no king; for we don’t fear Yahweh; +\q2 and the king, what can he do for us?” +\q1 +\v 4 They make promises, swearing falsely in making covenants. +\q2 Therefore judgment springs up like poisonous weeds in the furrows of the field. +\q1 +\v 5 The inhabitants of Samaria will be in terror for the calves of Beth Aven, +\q2 for its people will mourn over it, +\q2 along with its priests who rejoiced over it, +\q2 for its glory, because it has departed from it. +\q1 +\v 6 It also will be carried to Assyria for a present to a great king. +\q2 Ephraim will receive shame, +\q2 and Israel will be ashamed of his own counsel. +\q1 +\v 7 Samaria and her king float away +\q2 like a twig on the water. +\q1 +\v 8 The high places also of Aven, the sin of Israel, will be destroyed. +\q2 The thorn and the thistle will come up on their altars. +\q2 They will tell the mountains, “Cover us!” and the hills, “Fall on us!” +\b +\q1 +\v 9 “Israel, you have sinned from the days of Gibeah. +\q2 There they remained. +\q2 The battle against the children of iniquity doesn’t overtake them in Gibeah. +\q1 +\v 10 When it is my desire, I will chastise them; +\q2 and the nations will be gathered against them +\q2 when they are bound to their two transgressions. +\q1 +\v 11 Ephraim is a trained heifer that loves to thresh, +\q2 so I will put a yoke on her beautiful neck. +\q2 I will set a rider on Ephraim. +\q2 Judah will plow. +\q2 Jacob will break his clods. +\q1 +\v 12 Sow to yourselves in righteousness, +\q2 reap according to kindness. +\q1 Break up your fallow ground, +\q2 for it is time to seek Yahweh, +\q2 until he comes and rains righteousness on you. +\q1 +\v 13 You have plowed wickedness. +\q2 You have reaped iniquity. +\q2 You have eaten the fruit of lies, +\q2 for you trusted in your way, in the multitude of your mighty men. +\q1 +\v 14 Therefore a battle roar will arise among your people, +\q2 and all your fortresses will be destroyed, +\q2 as Shalman destroyed Beth Arbel in the day of battle. +\q2 The mother was dashed in pieces with her children. +\q1 +\v 15 So Bethel will do to you because of your great wickedness. +\q2 At daybreak the king of Israel will be destroyed. +\b +\c 11 +\p +\v 1 “When Israel was a child, then I loved him, +\q2 and called my son out of Egypt. +\q1 +\v 2 They called to them, so they went from them. +\q2 They sacrificed to the Baals, +\q2 and burned incense to engraved images. +\q1 +\v 3 Yet I taught Ephraim to walk. +\q2 I took them by their arms, +\q2 but they didn’t know that I healed them. +\q1 +\v 4 I drew them with cords of a man, with ties of love; +\q2 and I was to them like those who lift up the yoke on their necks; +\q2 and I bent down to him and I fed him. +\b +\q1 +\v 5 “They won’t return into the land of Egypt; +\q2 but the Assyrian will be their king, +\q2 because they refused to repent. +\q1 +\v 6 The sword will fall on their cities, +\q2 and will destroy the bars of their gates, +\q2 and will put an end to their plans. +\q1 +\v 7 My people are determined to turn from me. +\q2 Though they call to the Most High, +\q2 he certainly won’t exalt them. +\b +\q1 +\v 8 “How can I give you up, Ephraim? +\q2 How can I hand you over, Israel? +\q2 How can I make you like Admah? +\q2 How can I make you like Zeboiim? +\q1 My heart is turned within me, +\q2 my compassion is aroused. +\q1 +\v 9 I will not execute the fierceness of my anger. +\q2 I will not return to destroy Ephraim, +\q2 for I am God, and not man—the Holy One among you. +\q2 I will not come in wrath. +\q1 +\v 10 They will walk after Yahweh, +\q2 who will roar like a lion; +\q2 for he will roar, and the children will come trembling from the west. +\q1 +\v 11 They will come trembling like a bird out of Egypt, +\q2 and like a dove out of the land of Assyria; +\q1 and I will settle them in their houses,” says Yahweh. +\b +\q1 +\v 12 Ephraim surrounds me with falsehood, +\q2 and the house of Israel with deceit. +\q2 Judah still strays from God, +\q2 and is unfaithful to the Holy One. +\c 12 +\p +\v 1 Ephraim feeds on wind, +\q2 and chases the east wind. +\q2 He continually multiplies lies and desolation. +\q2 They make a covenant with Assyria, +\q2 and oil is carried into Egypt. +\q1 +\v 2 Yahweh also has a controversy with Judah, +\q2 and will punish Jacob according to his ways; +\q2 according to his deeds he will repay him. +\q1 +\v 3 In the womb he took his brother by the heel, +\q2 and in his manhood he contended with God. +\q1 +\v 4 Indeed, he struggled with the angel, and prevailed; +\q2 he wept, and made supplication to him. +\q2 He found him at Bethel, and there he spoke with us— +\q2 +\v 5 even Yahweh, the God of Armies. +\q2 Yahweh is his name of renown! +\q1 +\v 6 Therefore turn to your God. +\q2 Keep kindness and justice, +\q2 and wait continually for your God. +\b +\q1 +\v 7 A merchant has dishonest scales in his hand. +\q2 He loves to defraud. +\q1 +\v 8 Ephraim said, “Surely I have become rich. +\q2 I have found myself wealth. +\q2 In all my wealth they won’t find in me any iniquity that is sin.” +\b +\q1 +\v 9 “But I am Yahweh your God from the land of Egypt. +\q2 I will yet again make you dwell in tents, +\q2 as in the days of the solemn feast. +\q1 +\v 10 I have also spoken to the prophets, +\q2 and I have multiplied visions; +\q2 and by the ministry of the prophets I have used parables. +\q1 +\v 11 If Gilead is wicked, +\q2 surely they are worthless. +\q1 In Gilgal they sacrifice bulls. +\q2 Indeed, their altars are like heaps in the furrows of the field. +\q1 +\v 12 Jacob fled into the country of Aram. +\q2 Israel served to get a wife. +\q2 For a wife he tended flocks and herds. +\q1 +\v 13 By a prophet Yahweh brought Israel up out of Egypt, +\q2 and by a prophet he was preserved. +\q1 +\v 14 Ephraim has bitterly provoked anger. +\q2 Therefore his blood will be left on him, +\q2 and his Lord\f + \fr 12:14 \ft The word translated “Lord” is “Adonai.”\f* will repay his contempt. +\c 13 +\p +\v 1 When Ephraim spoke, there was trembling. +\q2 He exalted himself in Israel, +\q2 but when he became guilty through Baal, he died. +\q1 +\v 2 Now they sin more and more, +\q2 and have made themselves molten images of their silver, +\q2 even idols according to their own understanding, +\q2 all of them the work of the craftsmen. +\q2 They say of them, ‘They offer human sacrifice and kiss the calves.’ +\q1 +\v 3 Therefore they will be like the morning mist, +\q2 like the dew that passes away early, +\q2 like the chaff that is driven with the whirlwind out of the threshing floor, +\q2 and like the smoke out of the chimney. +\b +\q1 +\v 4 “Yet I am Yahweh your God from the land of Egypt; +\q2 and you shall acknowledge no god but me, +\q2 and besides me there is no savior. +\q1 +\v 5 I knew you in the wilderness, +\q2 in the land of great drought. +\q1 +\v 6 According to their pasture, so were they filled; +\q2 they were filled, and their heart was exalted. +\q2 Therefore they have forgotten me. +\q1 +\v 7 Therefore I am like a lion to them. +\q2 Like a leopard, I will lurk by the path. +\q1 +\v 8 I will meet them like a bear that is bereaved of her cubs, +\q2 and will tear the covering of their heart. +\q2 There I will devour them like a lioness. +\q2 The wild animal will tear them. +\q1 +\v 9 You are destroyed, Israel, because you are against me, +\q2 against your helper. +\q1 +\v 10 Where is your king now, that he may save you in all your cities? +\q2 And your judges, of whom you said, ‘Give me a king and princes’? +\q1 +\v 11 I have given you a king in my anger, +\q2 and have taken him away in my wrath. +\q1 +\v 12 The guilt of Ephraim is stored up. +\q2 His sin is stored up. +\q1 +\v 13 The sorrows of a travailing woman will come on him. +\q2 He is an unwise son, +\q2 for when it is time, he doesn’t come to the opening of the womb. +\q1 +\v 14 I will ransom them from the power of Sheol.\f + \fr 13:14 \ft Sheol is the place of the dead.\f* +\q2 I will redeem them from death! +\q2 Death, where are your plagues? +\q2 Sheol, where is your destruction? +\b +\q1 “Compassion will be hidden from my eyes. +\q2 +\v 15 Though he is fruitful among his brothers, an east wind will come, +\q2 the breath of Yahweh coming up from the wilderness; +\q2 and his spring will become dry, +\q2 and his fountain will be dried up. +\q2 He will plunder the storehouse of treasure. +\q1 +\v 16 Samaria will bear her guilt, +\q2 for she has rebelled against her God. +\q2 They will fall by the sword. +\q2 Their infants will be dashed in pieces, +\q2 and their pregnant women will be ripped open.” +\b +\c 14 +\q1 +\v 1 Israel, return to Yahweh your God; +\q2 for you have fallen because of your sin. +\q1 +\v 2 Take words with you, and return to Yahweh. +\q2 Tell him, “Forgive all our sins, +\q2 and accept that which is good; +\q2 so we offer bulls as we vowed of our lips. +\q1 +\v 3 Assyria can’t save us. +\q2 We won’t ride on horses; +\q2 neither will we say any more to the work of our hands, ‘Our gods!’ +\q2 for in you the fatherless finds mercy.” +\b +\q1 +\v 4 “I will heal their waywardness. +\q2 I will love them freely; +\q2 for my anger is turned away from them. +\q1 +\v 5 I will be like the dew to Israel. +\q2 He will blossom like the lily, +\q2 and send down his roots like Lebanon. +\q1 +\v 6 His branches will spread, +\q2 and his beauty will be like the olive tree, +\q2 and his fragrance like Lebanon. +\q1 +\v 7 Men will dwell in his shade. +\q2 They will revive like the grain, +\q2 and blossom like the vine. +\q2 Their fragrance will be like the wine of Lebanon. +\q1 +\v 8 Ephraim, what have I to do any more with idols? +\q2 I answer, and will take care of him. +\q2 I am like a green cypress tree; +\q2 from me your fruit is found.” +\b +\q1 +\v 9 Who is wise, that he may understand these things? +\q2 Who is prudent, that he may know them? +\q2 For the ways of Yahweh are right, +\q2 and the righteous walk in them, +\q2 but the rebellious stumble in them. diff --git a/c-sharp/assets/WEB/29JOLengWEBUS.SFM b/c-sharp/assets/WEB/29JOLengWEBUS.SFM new file mode 100644 index 0000000000..7798eeebd1 --- /dev/null +++ b/c-sharp/assets/WEB/29JOLengWEBUS.SFM @@ -0,0 +1,343 @@ +\id JOL 29-JOL-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Joel +\toc1 The Book of Joel +\toc2 Joel +\toc3 Joel +\mt2 The Book of +\mt1 Joel +\c 1 +\p +\v 1 Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word that came to Joel, the son of Pethuel. +\q1 +\v 2 Hear this, you elders, +\q2 and listen, all you inhabitants of the land! +\q1 Has this ever happened in your days, +\q2 or in the days of your fathers? +\q1 +\v 3 Tell your children about it, +\q2 and have your children tell their children, +\q2 and their children, another generation. +\q1 +\v 4 What the swarming locust has left, the great locust has eaten. +\q2 What the great locust has left, the grasshopper has eaten. +\q2 What the grasshopper has left, the caterpillar has eaten. +\q1 +\v 5 Wake up, you drunkards, and weep! +\q2 Wail, all you drinkers of wine, because of the sweet wine, +\q2 for it is cut off from your mouth. +\q1 +\v 6 For a nation has come up on my land, strong, and without number. +\q2 His teeth are the teeth of a lion, +\q2 and he has the fangs of a lioness. +\q1 +\v 7 He has laid my vine waste, +\q2 and stripped my fig tree. +\q2 He has stripped its bark, and thrown it away. +\q2 Its branches are made white. +\q1 +\v 8 Mourn like a virgin dressed in sackcloth +\q2 for the husband of her youth! +\q1 +\v 9 The meal offering and the drink offering are cut off from Yahweh’s house. +\q2 The priests, Yahweh’s ministers, mourn. +\q1 +\v 10 The field is laid waste. +\q2 The land mourns, for the grain is destroyed, +\q2 The new wine has dried up, +\q2 and the oil languishes. +\q1 +\v 11 Be confounded, you farmers! +\q2 Wail, you vineyard keepers, +\q2 for the wheat and for the barley; +\q2 for the harvest of the field has perished. +\q1 +\v 12 The vine has dried up, and the fig tree withered— +\q2 the pomegranate tree, the palm tree also, and the apple tree, +\q2 even all of the trees of the field are withered; +\q2 for joy has withered away from the sons of men. +\q1 +\v 13 Put on sackcloth and mourn, you priests! +\q2 Wail, you ministers of the altar. +\q1 Come, lie all night in sackcloth, you ministers of my God,\f + \fr 1:13 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q2 for the meal offering and the drink offering are withheld from your God’s house. +\q1 +\v 14 Sanctify a fast. +\q2 Call a solemn assembly. +\q2 Gather the elders and all the inhabitants of the land to the house of Yahweh, your God, +\q2 and cry to Yahweh. +\q1 +\v 15 Alas for the day! +\q2 For the day of Yahweh is at hand, +\q2 and it will come as destruction from the Almighty. +\q1 +\v 16 Isn’t the food cut off before our eyes, +\q2 joy and gladness from the house of our God? +\q1 +\v 17 The seeds rot under their clods. +\q2 The granaries are laid desolate. +\q2 The barns are broken down, for the grain has withered. +\q1 +\v 18 How the animals groan! +\q2 The herds of livestock are perplexed, because they have no pasture. +\q2 Yes, the flocks of sheep are made desolate. +\q1 +\v 19 Yahweh, I cry to you, +\q2 for the fire has devoured the pastures of the wilderness, +\q2 and the flame has burned all the trees of the field. +\q1 +\v 20 Yes, the animals of the field pant to you, +\q2 for the water brooks have dried up, +\q2 and the fire has devoured the pastures of the wilderness. +\b +\c 2 +\q1 +\v 1 Blow the trumpet in Zion, +\q2 and sound an alarm in my holy mountain! +\q1 Let all the inhabitants of the land tremble, +\q2 for the day of Yahweh comes, +\q2 for it is close at hand: +\q1 +\v 2 A day of darkness and gloominess, +\q2 a day of clouds and thick darkness. +\q1 As the dawn spreading on the mountains, +\q2 a great and strong people; +\q2 there has never been the like, +\q2 neither will there be any more after them, +\q2 even to the years of many generations. +\q1 +\v 3 A fire devours before them, +\q2 and behind them, a flame burns. +\q1 The land is as the garden of Eden before them, +\q2 and behind them, a desolate wilderness. +\q1 Yes, and no one has escaped them. +\q1 +\v 4 Their appearance is as the appearance of horses, +\q2 and they run as horsemen. +\q1 +\v 5 Like the noise of chariots on the tops of the mountains, they leap, +\q2 like the noise of a flame of fire that devours the stubble, +\q2 like a strong people set in battle array. +\q1 +\v 6 At their presence the peoples are in anguish. +\q2 All faces have grown pale. +\q1 +\v 7 They run like mighty men. +\q2 They climb the wall like warriors. +\q2 They each march in his line, and they don’t swerve off course. +\q1 +\v 8 One doesn’t jostle another. +\q2 They each march in their own path. +\q2 They burst through the defenses +\q2 and don’t break ranks. +\q1 +\v 9 They rush on the city. +\q2 They run on the wall. +\q2 They climb up into the houses. +\q2 They enter in at the windows like thieves. +\q1 +\v 10 The earth quakes before them. +\q2 The heavens tremble. +\q2 The sun and the moon are darkened, +\q2 and the stars withdraw their shining. +\q1 +\v 11 Yahweh thunders his voice before his army, +\q2 for his forces are very great; +\q2 for he is strong who obeys his command; +\q2 for the day of Yahweh is great and very awesome, +\q2 and who can endure it? +\q1 +\v 12 “Yet even now,” says Yahweh, “turn to me with all your heart, +\q2 and with fasting, and with weeping, and with mourning.” +\q1 +\v 13 Tear your heart and not your garments, +\q2 and turn to Yahweh, your God; +\q2 for he is gracious and merciful, +\q2 slow to anger, and abundant in loving kindness, +\q2 and relents from sending calamity. +\q1 +\v 14 Who knows? He may turn and relent, +\q2 and leave a blessing behind him, +\q2 even a meal offering and a drink offering to Yahweh, your God. +\q1 +\v 15 Blow the trumpet in Zion! +\q2 Sanctify a fast. +\q2 Call a solemn assembly. +\q1 +\v 16 Gather the people. +\q2 Sanctify the assembly. +\q2 Assemble the elders. +\q2 Gather the children, and those who nurse from breasts. +\q1 Let the bridegroom go out of his room, +\q2 and the bride out of her chamber. +\q1 +\v 17 Let the priests, the ministers of Yahweh, weep between the porch and the altar, +\q2 and let them say, “Spare your people, Yahweh, +\q2 and don’t give your heritage to reproach, +\q2 that the nations should rule over them. +\q1 Why should they say among the peoples, +\q2 ‘Where is their God?’” +\q1 +\v 18 Then Yahweh was jealous for his land, +\q2 and had pity on his people. +\q1 +\v 19 Yahweh answered his people, +\q2 “Behold,\f + \fr 2:19 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I will send you grain, new wine, and oil, +\q2 and you will be satisfied with them; +\q2 and I will no more make you a reproach among the nations. +\q1 +\v 20 But I will remove the northern army far away from you, +\q2 and will drive it into a barren and desolate land, +\q2 its front into the eastern sea, +\q2 and its back into the western sea; +\q2 and its stench will come up, +\q2 and its bad smell will rise.” +\q1 Surely he has done great things. +\q1 +\v 21 Land, don’t be afraid. +\q2 Be glad and rejoice, for Yahweh has done great things. +\q1 +\v 22 Don’t be afraid, you animals of the field; +\q2 for the pastures of the wilderness spring up, +\q2 for the tree bears its fruit. +\q2 The fig tree and the vine yield their strength. +\b +\q1 +\v 23 “Be glad then, you children of Zion, +\q2 and rejoice in Yahweh, your God; +\q2 for he gives you the early rain in just measure, +\q2 and he causes the rain to come down for you, +\q2 the early rain and the latter rain, as before. +\q1 +\v 24 The threshing floors will be full of wheat, +\q2 and the vats will overflow with new wine and oil. +\q1 +\v 25 I will restore to you the years that the swarming locust has eaten, +\q2 the great locust, the grasshopper, and the caterpillar, +\q2 my great army, which I sent among you. +\q1 +\v 26 You will have plenty to eat and be satisfied, +\q2 and will praise the name of Yahweh, your God, +\q2 who has dealt wondrously with you; +\q2 and my people will never again be disappointed. +\q1 +\v 27 You will know that I am among Israel, +\q2 and that I am Yahweh, your God, and there is no one else; +\q2 and my people will never again be disappointed. +\b +\q1 +\v 28 “It will happen afterward, that I will pour out my Spirit on all flesh; +\q2 and your sons and your daughters will prophesy. +\q2 Your old men will dream dreams. +\q2 Your young men will see visions. +\q1 +\v 29 And also on the servants and on the handmaids in those days, +\q2 I will pour out my Spirit. +\q1 +\v 30 I will show wonders in the heavens and in the earth: +\q2 blood, fire, and pillars of smoke. +\q1 +\v 31 The sun will be turned into darkness, +\q2 and the moon into blood, +\q2 before the great and terrible day of Yahweh comes. +\q1 +\v 32 It will happen that whoever will call on Yahweh’s name shall be saved; +\q2 for in Mount Zion and in Jerusalem there will be those who escape, +\q2 as Yahweh has said, +\q2 and among the remnant, those whom Yahweh calls. +\b +\c 3 +\q1 +\v 1 “For, behold, in those days, +\q2 and in that time, +\q2 when I restore the fortunes of Judah and Jerusalem, +\q1 +\v 2 I will gather all nations, +\q2 and will bring them down into the valley of Jehoshaphat; +\q2 and I will execute judgment on them there for my people, +\q2 and for my heritage, Israel, whom they have scattered among the nations. +\q2 They have divided my land, +\q2 +\v 3 and have cast lots for my people, +\q2 and have given a boy for a prostitute, +\q2 and sold a girl for wine, that they may drink. +\b +\q1 +\v 4 “Yes, and what are you to me, Tyre and Sidon, +\q2 and all the regions of Philistia? +\q1 Will you repay me? +\q2 And if you repay me, +\q2 I will swiftly and speedily return your repayment on your own head. +\q1 +\v 5 Because you have taken my silver and my gold, +\q2 and have carried my finest treasures into your temples, +\q2 +\v 6 and have sold the children of Judah and the children of Jerusalem to the sons of the Greeks, +\q2 that you may remove them far from their border. +\q1 +\v 7 Behold, I will stir them up out of the place where you have sold them, +\q2 and will return your repayment on your own head; +\q1 +\v 8 and I will sell your sons and your daughters into the hands of the children of Judah, +\q2 and they will sell them to the men of Sheba, +\q2 to a faraway nation, +\q2 for Yahweh has spoken it.” +\b +\q1 +\v 9 Proclaim this among the nations: +\q2 “Prepare for war! +\q2 Stir up the mighty men. +\q1 Let all the warriors draw near. +\q2 Let them come up. +\v 10 Beat your plowshares into swords, +\q2 and your pruning hooks into spears. +\q2 Let the weak say, ‘I am strong.’ +\q1 +\v 11 Hurry and come, all you surrounding nations, +\q2 and gather yourselves together.” +\q1 Cause your mighty ones to come down there, Yahweh. +\q1 +\v 12 “Let the nations arouse themselves, +\q2 and come up to the valley of Jehoshaphat; +\q2 for there I will sit to judge all the surrounding nations. +\q1 +\v 13 Put in the sickle; +\q2 for the harvest is ripe. +\q2 Come, tread, for the wine press is full, +\q2 the vats overflow, for their wickedness is great.” +\q1 +\v 14 Multitudes, multitudes in the valley of decision! +\q2 For the day of Yahweh is near in the valley of decision. +\q1 +\v 15 The sun and the moon are darkened, +\q2 and the stars withdraw their shining. +\q1 +\v 16 Yahweh will roar from Zion, +\q2 and thunder from Jerusalem; +\q2 and the heavens and the earth will shake; +\q2 but Yahweh will be a refuge to his people, +\q2 and a stronghold to the children of Israel. +\q1 +\v 17 “So you will know that I am Yahweh, your God, +\q2 dwelling in Zion, my holy mountain. +\q1 Then Jerusalem will be holy, +\q2 and no strangers will pass through her any more. +\q1 +\v 18 It will happen in that day, +\q2 that the mountains will drop down sweet wine, +\q2 the hills will flow with milk, +\q2 all the brooks of Judah will flow with waters; +\q2 and a fountain will flow out from Yahweh’s house, +\q2 and will water the valley of Shittim. +\q1 +\v 19 Egypt will be a desolation +\q2 and Edom will be a desolate wilderness, +\q2 for the violence done to the children of Judah, +\q2 because they have shed innocent blood in their land. +\q1 +\v 20 But Judah will be inhabited forever, +\q2 and Jerusalem from generation to generation. +\q1 +\v 21 I will cleanse their blood +\q2 that I have not cleansed, +\q2 for Yahweh dwells in Zion.” diff --git a/c-sharp/assets/WEB/30AMOengWEBUS.SFM b/c-sharp/assets/WEB/30AMOengWEBUS.SFM new file mode 100644 index 0000000000..93c2d91677 --- /dev/null +++ b/c-sharp/assets/WEB/30AMOengWEBUS.SFM @@ -0,0 +1,551 @@ +\id AMO 30-AMO-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Amos +\toc1 The Book of Amos +\toc2 Amos +\toc3 Amos +\mt2 The Book of +\mt1 Amos +\c 1 +\p +\v 1 The words of Amos, who was among the herdsmen of Tekoa, which he saw concerning Israel in the days of Uzziah king of Judah and in the days of Jeroboam the son of Joash, king of Israel, two years before the earthquake. +\v 2 He said: +\q1 “Yahweh\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* will roar from Zion, +\q2 and utter his voice from Jerusalem; +\q1 and the pastures of the shepherds will mourn, +\q2 and the top of Carmel will wither.” +\p +\v 3 Yahweh says: +\q1 “For three transgressions of Damascus, yes, for four, +\q2 I will not turn away its punishment, +\q2 because they have threshed Gilead with threshing instruments of iron; +\q1 +\v 4 but I will send a fire into the house of Hazael, +\q2 and it will devour the palaces of Ben Hadad. +\q1 +\v 5 I will break the bar of Damascus, +\q2 and cut off the inhabitant from the valley of Aven, +\q2 and him who holds the scepter from the house of Eden; +\q2 and the people of Syria shall go into captivity to Kir,” +\p says Yahweh. +\p +\v 6 Yahweh says: +\q1 “For three transgressions of Gaza, yes, for four, +\q2 I will not turn away its punishment, +\q2 because they carried away captive the whole community, +\q2 to deliver them up to Edom; +\q1 +\v 7 but I will send a fire on the wall of Gaza, +\q2 and it will devour its palaces. +\q1 +\v 8 I will cut off the inhabitant from Ashdod, +\q2 and him who holds the scepter from Ashkelon; +\q1 and I will turn my hand against Ekron; +\q2 and the remnant of the Philistines will perish,” +\p says the Lord\f + \fr 1:8 \ft The word translated “Lord” is “Adonai.”\f* Yahweh. +\p +\v 9 Yahweh says: +\q1 “For three transgressions of Tyre, yes, for four, +\q2 I will not turn away its punishment; +\q2 because they delivered up the whole community to Edom, +\q2 and didn’t remember the brotherly covenant; +\q1 +\v 10 but I will send a fire on the wall of Tyre, +\q2 and it will devour its palaces.” +\p +\v 11 Yahweh says: +\q1 “For three transgressions of Edom, yes, for four, +\q2 I will not turn away its punishment, +\q2 because he pursued his brother with the sword +\q2 and cast off all pity, +\q2 and his anger raged continually, +\q2 and he kept his wrath forever; +\q1 +\v 12 but I will send a fire on Teman, +\q2 and it will devour the palaces of Bozrah.” +\p +\v 13 Yahweh says: +\q1 “For three transgressions of the children of Ammon, yes, for four, +\q2 I will not turn away its punishment, +\q2 because they have ripped open the pregnant women of Gilead, +\q2 that they may enlarge their border. +\q1 +\v 14 But I will kindle a fire in the wall of Rabbah, +\q2 and it will devour its palaces, +\q2 with shouting in the day of battle, +\q2 with a storm in the day of the whirlwind; +\q1 +\v 15 and their king will go into captivity, +\q2 he and his princes together,” +\p says Yahweh. +\c 2 +\p +\v 1 Yahweh says: +\q1 “For three transgressions of Moab, yes, for four, +\q2 I will not turn away its punishment, +\q2 because he burned the bones of the king of Edom into lime; +\q1 +\v 2 but I will send a fire on Moab, +\q2 and it will devour the palaces of Kerioth; +\q2 and Moab will die with tumult, with shouting, and with the sound of the trumpet; +\q1 +\v 3 and I will cut off the judge from among them, +\q2 and will kill all its princes with him,” +\p says Yahweh. +\p +\v 4 Yahweh says: +\q1 “For three transgressions of Judah, yes, for four, +\q2 I will not turn away its punishment, +\q2 because they have rejected Yahweh’s law, +\q2 and have not kept his statutes, +\q2 and their lies have led them astray, +\q2 after which their fathers walked; +\q1 +\v 5 but I will send a fire on Judah, +\q2 and it will devour the palaces of Jerusalem.” +\p +\v 6 Yahweh says: +\q1 “For three transgressions of Israel, yes, for four, +\q2 I will not turn away its punishment, +\q2 because they have sold the righteous for silver, +\q2 and the needy for a pair of sandals; +\q2 +\v 7 They trample the heads of the poor into the dust of the earth +\q2 and deny justice to the oppressed. +\q1 A man and his father use the same maiden, to profane my holy name. +\q2 +\v 8 They lay themselves down beside every altar on clothes taken in pledge. +\q2 In the house of their God\f + \fr 2:8 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* they drink the wine of those who have been fined. +\q1 +\v 9 Yet I destroyed the Amorite before them, +\q2 whose height was like the height of the cedars, +\q2 and he was strong as the oaks; +\q2 yet I destroyed his fruit from above, +\q2 and his roots from beneath. +\q1 +\v 10 Also I brought you up out of the land of Egypt +\q2 and led you forty years in the wilderness, +\q2 to possess the land of the Amorite. +\q1 +\v 11 I raised up some of your sons for prophets, +\q2 and some of your young men for Nazirites. +\q1 Isn’t this true, +\q2 you children of Israel?” says Yahweh. +\q1 +\v 12 “But you gave the Nazirites wine to drink, +\q2 and commanded the prophets, saying, ‘Don’t prophesy!’ +\q1 +\v 13 Behold,\f + \fr 2:13 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I will crush you in your place, +\q2 as a cart crushes that is full of grain. +\q1 +\v 14 Flight will perish from the swift. +\q2 The strong won’t strengthen his force. +\q2 The mighty won’t deliver himself. +\q1 +\v 15 He who handles the bow won’t stand. +\q2 He who is swift of foot won’t escape. +\q2 He who rides the horse won’t deliver himself. +\q1 +\v 16 He who is courageous among the mighty +\q2 will flee away naked on that day,” +\p says Yahweh. +\c 3 +\p +\v 1 Hear this word that Yahweh has spoken against you, children of Israel, against the whole family which I brought up out of the land of Egypt, saying: +\q1 +\v 2 “I have only chosen you of all the families of the earth. +\q2 Therefore I will punish you for all of your sins.” +\q1 +\v 3 Do two walk together, +\q2 unless they have agreed? +\q1 +\v 4 Will a lion roar in the thicket, +\q2 when he has no prey? +\q1 Does a young lion cry out of his den, +\q2 if he has caught nothing? +\q1 +\v 5 Can a bird fall in a trap on the earth, +\q2 where no snare is set for him? +\q1 Does a snare spring up from the ground, +\q2 when there is nothing to catch? +\q1 +\v 6 Does the trumpet alarm sound in a city, +\q2 without the people being afraid? +\q1 Does evil happen to a city, +\q2 and Yahweh hasn’t done it? +\q1 +\v 7 Surely the Lord Yahweh will do nothing, +\q2 unless he reveals his secret to his servants the prophets. +\q1 +\v 8 The lion has roared. +\q2 Who will not fear? +\q1 The Lord Yahweh has spoken. +\q2 Who can but prophesy? +\q1 +\v 9 Proclaim in the palaces at Ashdod, +\q2 and in the palaces in the land of Egypt, +\q1 and say, “Assemble yourselves on the mountains of Samaria, +\q2 and see what unrest is in her, +\q2 and what oppression is among them.” +\q1 +\v 10 “Indeed they don’t know to do right,” says Yahweh, +\q2 “Who hoard plunder and loot in their palaces.” +\p +\v 11 Therefore the Lord Yahweh says: +\q1 “An adversary will overrun the land; +\q2 and he will pull down your strongholds, +\q2 and your fortresses will be plundered.” +\p +\v 12 Yahweh says: +\q1 “As the shepherd rescues out of the mouth of the lion two legs, +\q2 or a piece of an ear, +\q2 so shall the children of Israel be rescued who sit in Samaria on the corner of a couch, +\q2 and on the silken cushions of a bed.” +\p +\v 13 “Listen, and testify against the house of Jacob,” says the Lord Yahweh, the God of Armies. +\q1 +\v 14 “For in the day that I visit the transgressions of Israel on him, +\q2 I will also visit the altars of Bethel; +\q2 and the horns of the altar will be cut off, +\q2 and fall to the ground. +\q1 +\v 15 I will strike the winter house with the summer house; +\q2 and the houses of ivory will perish, +\q2 and the great houses will have an end,” +\p says Yahweh. +\c 4 +\p +\v 1 Listen to this word, you cows of Bashan, who are on the mountain of Samaria, who oppress the poor, who crush the needy, who tell their husbands, “Bring us drinks!” +\q1 +\v 2 The Lord Yahweh has sworn by his holiness, +\q2 “Behold, the days shall come on you that they will take you away with hooks, +\q2 and the last of you with fish hooks. +\q1 +\v 3 You will go out at the breaks in the wall, +\q2 everyone straight before her; +\q2 and you will cast yourselves into Harmon,” says Yahweh. +\q1 +\v 4 “Go to Bethel, and sin; +\q2 to Gilgal, and sin more. +\q1 Bring your sacrifices every morning, +\q2 your tithes every three days, +\q2 +\v 5 offer a sacrifice of thanksgiving of that which is leavened, +\q2 and proclaim free will offerings and brag about them; +\q2 for this pleases you, you children of Israel,” says the Lord Yahweh. +\q1 +\v 6 “I also have given you cleanness of teeth in all your cities, +\q2 and lack of bread in every town; +\q2 yet you haven’t returned to me,” says Yahweh. +\q1 +\v 7 “I also have withheld the rain from you, +\q2 when there were yet three months to the harvest; +\q2 and I caused it to rain on one city, +\q2 and caused it not to rain on another city. +\q1 One field was rained on, +\q2 and the field where it didn’t rain withered. +\q1 +\v 8 So two or three cities staggered to one city to drink water, +\q2 and were not satisfied; +\q2 yet you haven’t returned to me,” says Yahweh. +\q1 +\v 9 “I struck you with blight and mildew many times in your gardens and your vineyards, +\q2 and the swarming locusts have devoured your fig trees and your olive trees; +\q2 yet you haven’t returned to me,” says Yahweh. +\q1 +\v 10 “I sent plagues among you like I did Egypt. +\q2 I have slain your young men with the sword, +\q2 and have carried away your horses. +\q1 I filled your nostrils with the stench of your camp, +\q2 yet you haven’t returned to me,” says Yahweh. +\q1 +\v 11 “I have overthrown some of you, +\q2 as when God overthrew Sodom and Gomorrah, +\q2 and you were like a burning stick plucked out of the fire; +\q2 yet you haven’t returned to me,” says Yahweh. +\q1 +\v 12 “Therefore I will do this to you, Israel; +\q2 because I will do this to you, +\q2 prepare to meet your God, Israel. +\q1 +\v 13 For, behold, he who forms the mountains, creates the wind, declares to man what is his thought, +\q2 who makes the morning darkness, and treads on the high places of the earth: +\q2 Yahweh, the God of Armies, is his name.” +\c 5 +\p +\v 1 Listen to this word which I take up for a lamentation over you, O house of Israel: +\q1 +\v 2 “The virgin of Israel has fallen; +\q2 She shall rise no more. +\q1 She is cast down on her land; +\q2 there is no one to raise her up.” +\p +\v 3 For the Lord Yahweh says: +\q1 “The city that went out a thousand shall have a hundred left, +\q2 and that which went out one hundred shall have ten left to the house of Israel.” +\p +\v 4 For Yahweh says to the house of Israel: +\q1 “Seek me, and you will live; +\q1 +\v 5 but don’t seek Bethel, +\q2 nor enter into Gilgal, +\q2 and don’t pass to Beersheba; +\q1 for Gilgal shall surely go into captivity, +\q2 and Bethel shall come to nothing. +\q1 +\v 6 Seek Yahweh, and you will live, +\q2 lest he break out like fire in the house of Joseph, +\q2 and it devour, and there be no one to quench it in Bethel. +\q1 +\v 7 You who turn justice to wormwood, +\q2 and cast down righteousness to the earth! +\q1 +\v 8 Seek him who made the Pleiades and Orion, +\q2 and turns the shadow of death into the morning, +\q2 and makes the day dark with night; +\q2 who calls for the waters of the sea, +\q2 and pours them out on the surface of the earth, Yahweh is his name, +\q1 +\v 9 who brings sudden destruction on the strong, +\q2 so that destruction comes on the fortress. +\q1 +\v 10 They hate him who reproves in the gate, +\q2 and they abhor him who speaks blamelessly. +\q1 +\v 11 Therefore, because you trample on the poor and take taxes from him of wheat, +\q2 you have built houses of cut stone, but you will not dwell in them. +\q1 You have planted pleasant vineyards, +\q2 but you shall not drink their wine. +\q1 +\v 12 For I know how many are your offenses, +\q2 and how great are your sins— +\q2 you who afflict the just, +\q2 who take a bribe, +\q2 and who turn away the needy in the courts. +\q1 +\v 13 Therefore a prudent person keeps silent in such a time, +\q2 for it is an evil time. +\q1 +\v 14 Seek good, and not evil, +\q2 that you may live; +\q2 and so Yahweh, the God of Armies, will be with you, +\q2 as you say. +\q1 +\v 15 Hate evil, love good, +\q2 and establish justice in the courts. +\q2 It may be that Yahweh, the God of Armies, will be gracious to the remnant of Joseph.” +\p +\v 16 Therefore Yahweh, the God of Armies, the Lord, says: +\q1 “Wailing will be in all the wide ways. +\q2 They will say in all the streets, ‘Alas! Alas!’ +\q2 They will call the farmer to mourning, +\q2 and those who are skillful in lamentation to wailing. +\q1 +\v 17 In all vineyards there will be wailing, +\q2 for I will pass through the middle of you,” says Yahweh. +\q1 +\v 18 “Woe to you who desire the day of Yahweh! +\q2 Why do you long for the day of Yahweh? +\q1 It is darkness, +\q2 and not light. +\q1 +\v 19 As if a man fled from a lion, +\q2 and a bear met him; +\q1 or he went into the house and leaned his hand on the wall, +\q2 and a snake bit him. +\q1 +\v 20 Won’t the day of Yahweh be darkness, and not light? +\q2 Even very dark, and no brightness in it? +\q1 +\v 21 I hate, I despise your feasts, +\q2 and I can’t stand your solemn assemblies. +\q1 +\v 22 Yes, though you offer me your burnt offerings and meal offerings, +\q2 I will not accept them; +\q2 neither will I regard the peace offerings of your fat animals. +\q1 +\v 23 Take away from me the noise of your songs! +\q2 I will not listen to the music of your harps. +\q1 +\v 24 But let justice roll on like rivers, +\q2 and righteousness like a mighty stream. +\p +\v 25 “Did you bring to me sacrifices and offerings in the wilderness forty years, house of Israel? +\v 26 You also carried the tent of your king and the shrine of your images, the star of your god, which you made for yourselves. +\v 27 Therefore I will cause you to go into captivity beyond Damascus,” says Yahweh, whose name is the God of Armies. +\c 6 +\p +\v 1 Woe to those who are at ease in Zion, +\q2 and to those who are secure on the mountain of Samaria, +\q2 the notable men of the chief of the nations, +\q2 to whom the house of Israel come! +\q1 +\v 2 Go to Calneh, and see. +\q2 From there go to Hamath the great. +\q2 Then go down to Gath of the Philistines. +\q1 Are they better than these kingdoms? +\q2 Is their border greater than your border? +\q1 +\v 3 Alas for you who put far away the evil day, +\q2 and cause the seat of violence to come near, +\q2 +\v 4 who lie on beds of ivory, +\q2 and stretch themselves on their couches, +\q2 and eat the lambs out of the flock, +\q2 and the calves out of the middle of the stall, +\q2 +\v 5 who strum on the strings of a harp, +\q2 who invent for themselves instruments of music, like David; +\q2 +\v 6 who drink wine in bowls, +\q2 and anoint themselves with the best oils, +\q2 but they are not grieved for the affliction of Joseph. +\q1 +\v 7 Therefore they will now go captive with the first who go captive. +\q2 The feasting and lounging will end. +\q1 +\v 8 “The Lord Yahweh has sworn by himself,” says Yahweh, the God of Armies: +\q2 “I abhor the pride of Jacob, +\q2 and detest his fortresses. +\q2 Therefore I will deliver up the city with all that is in it. +\q1 +\v 9 It will happen that if ten men remain in one house, +\q2 they will die. +\p +\v 10 “When a man’s relative carries him, even he who burns him, to bring bodies out of the house, and asks him who is in the innermost parts of the house, ‘Is there yet any with you?’ And he says, ‘No;’ then he will say, ‘Hush! Indeed we must not mention Yahweh’s name.’ +\b +\q1 +\v 11 “For, behold, Yahweh commands, and the great house will be smashed to pieces, +\q2 and the little house into bits. +\q1 +\v 12 Do horses run on the rocky crags? +\q2 Does one plow there with oxen? +\q1 But you have turned justice into poison, +\q2 and the fruit of righteousness into bitterness, +\q1 +\v 13 you who rejoice in a thing of nothing, who say, +\q2 ‘Haven’t we taken for ourselves horns by our own strength?’ +\q1 +\v 14 For, behold, I will raise up against you a nation, house of Israel,” +\q2 says Yahweh, the God of Armies; +\q2 “and they will afflict you from the entrance of Hamath to the brook of the Arabah.” +\c 7 +\p +\v 1 Thus the Lord Yahweh showed me: behold, he formed locusts in the beginning of the shooting up of the latter growth; and behold, it was the latter growth after the king’s harvest. +\v 2 When they finished eating the grass of the land, then I said, “Lord Yahweh, forgive, I beg you! How could Jacob stand? For he is small.” +\p +\v 3 Yahweh relented concerning this. “It shall not be,” says Yahweh. +\p +\v 4 Thus the Lord Yahweh showed me: behold, the Lord Yahweh called for judgment by fire; and it dried up the great deep, and would have devoured the land. +\v 5 Then I said, “Lord Yahweh, stop, I beg you! How could Jacob stand? For he is small.” +\p +\v 6 Yahweh relented concerning this. “This also shall not be,” says the Lord Yahweh. +\p +\v 7 Thus he showed me: behold, the Lord stood beside a wall made by a plumb line, with a plumb line in his hand. +\v 8 Yahweh said to me, “Amos, what do you see?” +\p I said, “A plumb line.” +\p Then the Lord said, “Behold, I will set a plumb line in the middle of my people Israel. I will not again pass by them any more. +\v 9 The high places of Isaac will be desolate, the sanctuaries of Israel will be laid waste; and I will rise against the house of Jeroboam with the sword.” +\p +\v 10 Then Amaziah the priest of Bethel sent to Jeroboam king of Israel, saying, “Amos has conspired against you in the middle of the house of Israel. The land is not able to bear all his words. +\v 11 For Amos says, ‘Jeroboam will die by the sword, and Israel shall surely be led away captive out of his land.’” +\p +\v 12 Amaziah also said to Amos, “You seer, go, flee away into the land of Judah, and there eat bread, and prophesy there, +\v 13 but don’t prophesy again any more at Bethel; for it is the king’s sanctuary, and it is a royal house!” +\p +\v 14 Then Amos answered Amaziah, “I was no prophet, neither was I a prophet’s son, but I was a herdsman, and a farmer of sycamore figs; +\v 15 and Yahweh took me from following the flock, and Yahweh said to me, ‘Go, prophesy to my people Israel.’ +\v 16 Now therefore listen to Yahweh’s word: ‘You say, Don’t prophesy against Israel, and don’t preach against the house of Isaac.’ +\v 17 Therefore Yahweh says: ‘Your wife shall be a prostitute in the city, and your sons and your daughters shall fall by the sword, and your land shall be divided by line; and you yourself shall die in a land that is unclean, and Israel shall surely be led away captive out of his land.’” +\c 8 +\p +\v 1 Thus the Lord Yahweh showed me: behold, a basket of summer fruit. +\p +\v 2 He said, “Amos, what do you see?” +\p I said, “A basket of summer fruit.” +\p Then Yahweh said to me, +\q1 “The end has come on my people Israel. +\q2 I will not again pass by them any more. +\q1 +\v 3 The songs of the temple will be wailing in that day,” says the Lord Yahweh. +\q2 “The dead bodies will be many. In every place they will throw them out with silence. +\q1 +\v 4 Hear this, you who desire to swallow up the needy, +\q2 and cause the poor of the land to fail, +\q2 +\v 5 saying, ‘When will the new moon be gone, that we may sell grain? +\q2 And the Sabbath, that we may market wheat, +\q2 making the ephah\f + \fr 8:5 \ft 1 ephah is about 22 liters or about 2/3 of a bushel \f* small, and the shekel\f + \fr 8:5 \ft a normal shekel is about 10 grams or about 0.35 ounces.\f* large, +\q2 and dealing falsely with balances of deceit; +\q1 +\v 6 that we may buy the poor for silver, +\q2 and the needy for a pair of sandals, +\q2 and sell the sweepings with the wheat?’” +\q1 +\v 7 Yahweh has sworn by the pride of Jacob, +\q2 “Surely I will never forget any of their works. +\q1 +\v 8 Won’t the land tremble for this, +\q2 and everyone mourn who dwells in it? +\q1 Yes, it will rise up wholly like the River; +\q2 and it will be stirred up and sink again, like the River of Egypt. +\q1 +\v 9 It will happen in that day,” says the Lord Yahweh, +\q2 “that I will cause the sun to go down at noon, +\q2 and I will darken the earth in the clear day. +\q1 +\v 10 I will turn your feasts into mourning, +\q2 and all your songs into lamentation; +\q1 and I will make you wear sackcloth on all your bodies, +\q2 and baldness on every head. +\q1 I will make it like the mourning for an only son, +\q2 and its end like a bitter day. +\q1 +\v 11 Behold, the days come,” says the Lord Yahweh, +\q2 “that I will send a famine in the land, +\q2 not a famine of bread, +\q2 nor a thirst for water, +\q2 but of hearing Yahweh’s words. +\q1 +\v 12 They will wander from sea to sea, +\q2 and from the north even to the east; +\q2 they will run back and forth to seek Yahweh’s word, +\q2 and will not find it. +\q1 +\v 13 In that day the beautiful virgins +\q2 and the young men will faint for thirst. +\q1 +\v 14 Those who swear by the sin of Samaria, +\q2 and say, ‘As your god, Dan, lives,’ +\q2 and, ‘As the way of Beersheba lives,’ +\q2 they will fall, and never rise up again.” +\c 9 +\p +\v 1 I saw the Lord standing beside the altar, and he said, “Strike the tops of the pillars, that the thresholds may shake. Break them in pieces on the head of all of them. I will kill the last of them with the sword. Not one of them will flee away. Not one of them will escape. +\v 2 Though they dig into Sheol,\f + \fr 9:2 \ft Sheol is the place of the dead.\f* there my hand will take them; and though they climb up to heaven, there I will bring them down. +\v 3 Though they hide themselves in the top of Carmel, I will search and take them out from there; and though they be hidden from my sight in the bottom of the sea, there I will command the serpent, and it will bite them. +\v 4 Though they go into captivity before their enemies, there I will command the sword, and it will kill them. I will set my eyes on them for evil, and not for good. +\v 5 For the Lord, Yahweh of Armies, is he who touches the land and it melts, and all who dwell in it will mourn; and it will rise up wholly like the River, and will sink again, like the River of Egypt. +\v 6 It is he who builds his rooms in the heavens, and has founded his vault on the earth; he who calls for the waters of the sea, and pours them out on the surface of the earth—Yahweh is his name. +\v 7 Are you not like the children of the Ethiopians to me, children of Israel?” says Yahweh. “Haven’t I brought up Israel out of the land of Egypt, and the Philistines from Caphtor, and the Syrians from Kir? +\v 8 Behold, the eyes of the Lord Yahweh are on the sinful kingdom, and I will destroy it from off the surface of the earth, except that I will not utterly destroy the house of Jacob,” says Yahweh. +\v 9 “For behold, I will command, and I will sift the house of Israel among all the nations as grain is sifted in a sieve, yet not the least kernel will fall on the earth. +\v 10 All the sinners of my people will die by the sword, who say, ‘Evil won’t overtake nor meet us.’ +\v 11 In that day I will raise up the tent of David who is fallen and close up its breaches, and I will raise up its ruins, and I will build it as in the days of old, +\v 12 that they may possess the remnant of Edom and all the nations who are called by my name,” says Yahweh who does this. +\q1 +\v 13 “Behold, the days come,” says Yahweh, +\q2 “that the plowman shall overtake the reaper, +\q2 and the one treading grapes him who sows seed; +\q2 and sweet wine will drip from the mountains, +\q2 and flow from the hills. +\q1 +\v 14 I will bring my people Israel back from captivity, +\q2 and they will rebuild the ruined cities, and inhabit them; +\q2 and they will plant vineyards, and drink wine from them. +\q1 They shall also make gardens, +\q2 and eat their fruit. +\q1 +\v 15 I will plant them on their land, +\q2 and they will no more be plucked up out of their land which I have given them,” +\q2 says Yahweh your God. diff --git a/c-sharp/assets/WEB/31OBAengWEBUS.SFM b/c-sharp/assets/WEB/31OBAengWEBUS.SFM new file mode 100644 index 0000000000..77d65ace18 --- /dev/null +++ b/c-sharp/assets/WEB/31OBAengWEBUS.SFM @@ -0,0 +1,33 @@ +\id OBA 31-OBA-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Obadiah +\toc1 The Book of Obadiah +\toc2 Obadiah +\toc3 Obadiah +\mt2 The Book of +\mt1 Obadiah +\c 1 +\p +\v 1 The vision of Obadiah. This is what the Lord\f + \fr 1:1 \ft The word translated “Lord” is “Adonai.”\f* Yahweh\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* says about Edom. We have heard news from Yahweh, and an ambassador is sent among the nations, saying, “Arise, and let’s rise up against her in battle. +\v 2 Behold,\f + \fr 1:2 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I have made you small among the nations. You are greatly despised. +\v 3 The pride of your heart has deceived you, you who dwell in the clefts of the rock, whose habitation is high, who says in his heart, ‘Who will bring me down to the ground?’ +\v 4 Though you mount on high as the eagle, and though your nest is set among the stars, I will bring you down from there,” says Yahweh. +\v 5 “If thieves came to you, if robbers by night—oh, what disaster awaits you—wouldn’t they only steal until they had enough? If grape pickers came to you, wouldn’t they leave some gleaning grapes? +\v 6 How Esau will be ransacked! How his hidden treasures are sought out! +\v 7 All the men of your alliance have brought you on your way, even to the border. The men who were at peace with you have deceived you, and prevailed against you. Friends who eat your bread lay a snare under you. There is no understanding in him.” +\p +\v 8 “Won’t I in that day”, says Yahweh, “destroy the wise men out of Edom, and understanding out of the mountain of Esau? +\v 9 Your mighty men, Teman, will be dismayed, to the end that everyone may be cut off from the mountain of Esau by slaughter. +\v 10 For the violence done to your brother Jacob, shame will cover you, and you will be cut off forever. +\v 11 In the day that you stood on the other side, in the day that strangers carried away his substance and foreigners entered into his gates and cast lots for Jerusalem, even you were like one of them. +\v 12 But don’t look down on your brother in the day of his disaster, and don’t rejoice over the children of Judah in the day of their destruction. Don’t speak proudly in the day of distress. +\v 13 Don’t enter into the gate of my people in the day of their calamity. Don’t look down on their affliction in the day of their calamity, neither seize their wealth on the day of their calamity. +\v 14 Don’t stand in the crossroads to cut off those of his who escape. Don’t deliver up those of his who remain in the day of distress. +\v 15 For the day of Yahweh is near all the nations! As you have done, it will be done to you. Your deeds will return upon your own head. +\v 16 For as you have drunk on my holy mountain, so all the nations will drink continually. Yes, they will drink, swallow down, and will be as though they had not been. +\v 17 But in Mount Zion, there will be those who escape, and it will be holy. The house of Jacob will possess their possessions. +\v 18 The house of Jacob will be a fire, the house of Joseph a flame, and the house of Esau for stubble. They will burn among them and devour them. There will not be any remaining to the house of Esau.” Indeed, Yahweh has spoken. +\p +\v 19 Those of the South will possess the mountain of Esau, and those of the lowland, the Philistines. They will possess the field of Ephraim, and the field of Samaria. Benjamin will possess Gilead. +\v 20 The captives of this army of the children of Israel, who are among the Canaanites, will possess even to Zarephath; and the captives of Jerusalem, who are in Sepharad, will possess the cities of the Negev. +\v 21 Saviors will go up on Mount Zion to judge the mountains of Esau, and the kingdom will be Yahweh’s. diff --git a/c-sharp/assets/WEB/32JONengWEBUS.SFM b/c-sharp/assets/WEB/32JONengWEBUS.SFM new file mode 100644 index 0000000000..b4df2f72a2 --- /dev/null +++ b/c-sharp/assets/WEB/32JONengWEBUS.SFM @@ -0,0 +1,105 @@ +\id JON 2-JON-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Jonah +\toc1 The Book of Jonah +\toc2 Jonah +\toc3 Jonah +\mt2 The Book of +\mt1 Jonah +\c 1 +\p +\v 1 Now Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word came to Jonah the son of Amittai, saying, +\v 2 “Arise, go to Nineveh, that great city, and preach against it, for their wickedness has come up before me.” +\p +\v 3 But Jonah rose up to flee to Tarshish from the presence of Yahweh. He went down to Joppa, and found a ship going to Tarshish; so he paid its fare, and went down into it, to go with them to Tarshish from the presence of Yahweh. +\p +\v 4 But Yahweh sent out a great wind on the sea, and there was a mighty storm on the sea, so that the ship was likely to break up. +\v 5 Then the mariners were afraid, and every man cried to his god. They threw the cargo that was in the ship into the sea to lighten the ship. But Jonah had gone down into the innermost parts of the ship and he was laying down, and was fast asleep. +\v 6 So the ship master came to him, and said to him, “What do you mean, sleeper? Arise, call on your God!\f + \fr 1:6 \ft or, gods\f* Maybe your God\f + \fr 1:6 \ft or, gods \f* will notice us, so that we won’t perish.” +\p +\v 7 They all said to each other, “Come! Let’s cast lots, that we may know who is responsible for this evil that is on us.” So they cast lots, and the lot fell on Jonah. +\v 8 Then they asked him, “Tell us, please, for whose cause this evil is on us. What is your occupation? Where do you come from? What is your country? Of what people are you?” +\p +\v 9 He said to them, “I am a Hebrew, and I fear Yahweh, the God\f + \fr 1:9 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* of heaven, who has made the sea and the dry land.” +\p +\v 10 Then the men were exceedingly afraid, and said to him, “What have you done?” For the men knew that he was fleeing from the presence of Yahweh, because he had told them. +\v 11 Then they said to him, “What shall we do to you, that the sea may be calm to us?” For the sea grew more and more stormy. +\p +\v 12 He said to them, “Take me up, and throw me into the sea. Then the sea will be calm for you; for I know that because of me this great storm is on you.” +\p +\v 13 Nevertheless the men rowed hard to get them back to the land; but they could not, for the sea grew more and more stormy against them. +\v 14 Therefore they cried to Yahweh, and said, “We beg you, Yahweh, we beg you, don’t let us die for this man’s life, and don’t lay on us innocent blood; for you, Yahweh, have done as it pleased you.” +\v 15 So they took up Jonah and threw him into the sea; and the sea ceased its raging. +\v 16 Then the men feared Yahweh exceedingly; and they offered a sacrifice to Yahweh and made vows. +\p +\v 17 Yahweh prepared a huge fish to swallow up Jonah, and Jonah was in the belly of the fish three days and three nights. +\c 2 +\p +\v 1 Then Jonah prayed to Yahweh, his God, out of the fish’s belly. +\v 2 He said, +\q1 “I called because of my affliction to Yahweh. +\q2 He answered me. +\q1 Out of the belly of Sheol\f + \fr 2:2 \ft Sheol is the place of the dead.\f* I cried. +\q2 You heard my voice. +\q1 +\v 3 For you threw me into the depths, +\q2 in the heart of the seas. +\q1 The flood was all around me. +\q2 All your waves and your billows passed over me. +\q1 +\v 4 I said, ‘I have been banished from your sight; +\q2 yet I will look again toward your holy temple.’ +\q1 +\v 5 The waters surrounded me, +\q2 even to the soul. +\q1 The deep was around me. +\q2 The weeds were wrapped around my head. +\q1 +\v 6 I went down to the bottoms of the mountains. +\q2 The earth barred me in forever; +\q2 yet you have brought my life up from the pit, Yahweh my God. +\b +\q1 +\v 7 “When my soul fainted within me, I remembered Yahweh. +\q2 My prayer came in to you, into your holy temple. +\q1 +\v 8 Those who regard vain idols forsake their own mercy. +\q2 +\v 9 But I will sacrifice to you with the voice of thanksgiving. +\q2 I will pay that which I have vowed. +\q1 Salvation belongs to Yahweh.” +\p +\v 10 Then Yahweh spoke to the fish, and it vomited out Jonah on the dry land. +\c 3 +\p +\v 1 Yahweh’s word came to Jonah the second time, saying, +\v 2 “Arise, go to Nineveh, that great city, and preach to it the message that I give you.” +\p +\v 3 So Jonah arose, and went to Nineveh, according to Yahweh’s word. Now Nineveh was an exceedingly great city, three days’ journey across. +\v 4 Jonah began to enter into the city a day’s journey, and he cried out, and said, “In forty days, Nineveh will be overthrown!” +\p +\v 5 The people of Nineveh believed God; and they proclaimed a fast and put on sackcloth, from their greatest even to their least. +\v 6 The news reached the king of Nineveh, and he arose from his throne, took off his royal robe, covered himself with sackcloth, and sat in ashes. +\v 7 He made a proclamation and published through Nineveh by the decree of the king and his nobles, saying, “Let neither man nor animal, herd nor flock, taste anything; let them not feed, nor drink water; +\v 8 but let them be covered with sackcloth, both man and animal, and let them cry mightily to God. Yes, let them turn everyone from his evil way and from the violence that is in his hands. +\v 9 Who knows whether God will not turn and relent, and turn away from his fierce anger, so that we might not perish?” +\p +\v 10 God saw their works, that they turned from their evil way. God relented of the disaster which he said he would do to them, and he didn’t do it. +\c 4 +\p +\v 1 But it displeased Jonah exceedingly, and he was angry. +\v 2 He prayed to Yahweh, and said, “Please, Yahweh, wasn’t this what I said when I was still in my own country? Therefore I hurried to flee to Tarshish, for I knew that you are a gracious God and merciful, slow to anger, and abundant in loving kindness, and you relent of doing harm. +\v 3 Therefore now, Yahweh, take, I beg you, my life from me, for it is better for me to die than to live.” +\p +\v 4 Yahweh said, “Is it right for you to be angry?” +\p +\v 5 Then Jonah went out of the city and sat on the east side of the city, and there made himself a booth and sat under it in the shade, until he might see what would become of the city. +\v 6 Yahweh God prepared a vine and made it to come up over Jonah, that it might be a shade over his head to deliver him from his discomfort. So Jonah was exceedingly glad because of the vine. +\v 7 But God prepared a worm at dawn the next day, and it chewed on the vine so that it withered. +\v 8 When the sun arose, God prepared a sultry east wind; and the sun beat on Jonah’s head, so that he was faint and requested for himself that he might die. He said, “It is better for me to die than to live.” +\p +\v 9 God said to Jonah, “Is it right for you to be angry about the vine?” +\p He said, “I am right to be angry, even to death.” +\p +\v 10 Yahweh said, “You have been concerned for the vine, for which you have not labored, neither made it grow; which came up in a night and perished in a night. +\v 11 Shouldn’t I be concerned for Nineveh, that great city, in which are more than one hundred twenty thousand persons who can’t discern between their right hand and their left hand, and also many animals?” diff --git a/c-sharp/assets/WEB/33MICengWEBUS.SFM b/c-sharp/assets/WEB/33MICengWEBUS.SFM new file mode 100644 index 0000000000..218c74450a --- /dev/null +++ b/c-sharp/assets/WEB/33MICengWEBUS.SFM @@ -0,0 +1,502 @@ +\id MIC 33-MIC-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Micah +\toc1 The Book of Micah +\toc2 Micah +\toc3 Micah +\mt2 The Book of +\mt1 Micah +\c 1 +\p +\v 1 Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word that came to Micah of Morasheth in the days of Jotham, Ahaz, and Hezekiah, kings of Judah, which he saw concerning Samaria and Jerusalem. +\q1 +\v 2 Hear, you peoples, all of you! +\q2 Listen, O earth, and all that is therein. +\q1 Let the Lord\f + \fr 1:2 \ft The word translated “Lord” is “Adonai.”\f* Yahweh be witness against you, +\q2 the Lord from his holy temple. +\q1 +\v 3 For behold,\f + \fr 1:3 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* Yahweh comes out of his place, +\q2 and will come down and tread on the high places of the earth. +\q1 +\v 4 The mountains melt under him, +\q2 and the valleys split apart like wax before the fire, +\q2 like waters that are poured down a steep place. +\b +\q1 +\v 5 “All this is for the disobedience of Jacob, +\q2 and for the sins of the house of Israel. +\q1 What is the disobedience of Jacob? +\q2 Isn’t it Samaria? +\q1 And what are the high places of Judah? +\q2 Aren’t they Jerusalem? +\q1 +\v 6 Therefore I will make Samaria like a rubble heap of the field, +\q2 like places for planting vineyards; +\q1 and I will pour down its stones into the valley, +\q2 and I will uncover its foundations. +\q1 +\v 7 All her idols will be beaten to pieces, +\q2 all her temple gifts will be burned with fire, +\q2 and I will destroy all her images; +\q1 for of the hire of a prostitute has she gathered them, +\q2 and to the hire of a prostitute shall they return.” +\b +\q1 +\v 8 For this I will lament and wail. +\q2 I will go stripped and naked. +\q2 I will howl like the jackals +\q2 and mourn like the ostriches. +\q1 +\v 9 For her wounds are incurable; +\q2 for it has come even to Judah. +\q1 It reaches to the gate of my people, +\q2 even to Jerusalem. +\q1 +\v 10 Don’t tell it in Gath. +\q2 Don’t weep at all. +\q2 At Beth Ophrah\f + \fr 1:10 \ft Beth Ophrah means literally “House of Dust.”\f* I have rolled myself in the dust. +\q1 +\v 11 Pass on, inhabitant of Shaphir, in nakedness and shame. +\q2 The inhabitant of Zaanan won’t come out. +\q2 The wailing of Beth Ezel will take from you his protection. +\q1 +\v 12 For the inhabitant of Maroth waits anxiously for good, +\q2 because evil has come down from Yahweh to the gate of Jerusalem. +\q1 +\v 13 Harness the chariot to the swift steed, inhabitant of Lachish. +\q2 She was the beginning of sin to the daughter of Zion; +\q2 for the transgressions of Israel were found in you. +\q1 +\v 14 Therefore you will give a parting gift to Moresheth Gath. +\q2 The houses of Achzib will be a deceitful thing to the kings of Israel. +\q1 +\v 15 I will yet bring a conqueror to you, inhabitants of Mareshah. +\q2 The glory of Israel will come to Adullam. +\q1 +\v 16 Shave your heads, +\q2 and cut off your hair for the children of your delight. +\q1 Enlarge your baldness like the vulture, +\q2 for they have gone into captivity from you! +\b +\c 2 +\q1 +\v 1 Woe to those who devise iniquity +\q2 and work evil on their beds! +\q1 When the morning is light, they practice it, +\q2 because it is in the power of their hand. +\q1 +\v 2 They covet fields and seize them, +\q2 and houses, then take them away. +\q1 They oppress a man and his house, +\q2 even a man and his heritage. +\q1 +\v 3 Therefore Yahweh says: +\q1 “Behold, I am planning against these people a disaster, +\q2 from which you will not remove your necks, +\q2 neither will you walk haughtily, +\q2 for it is an evil time. +\q1 +\v 4 In that day they will take up a parable against you, +\q2 and lament with a doleful lamentation, saying, +\q2 ‘We are utterly ruined! +\q2 My people’s possession is divided up. +\q2 Indeed he takes it from me and assigns our fields to traitors!’” +\q1 +\v 5 Therefore you will have no one who divides the land by lot in Yahweh’s assembly. +\q1 +\v 6 “Don’t prophesy!”—they prophesy— +\q2 “Don’t prophesy about these things. +\q2 Disgrace won’t overtake us.” +\q1 +\v 7 Shall it be said, O house of Jacob, +\q2 “Is Yahweh’s Spirit angry? +\q2 Are these his doings? +\q2 Don’t my words do good to him who walks blamelessly?” +\q1 +\v 8 But lately my people have risen up as an enemy. +\q2 You strip the robe and clothing from those who pass by without a care, returning from battle. +\q1 +\v 9 You drive the women of my people out from their pleasant houses; +\q2 from their young children you take away my blessing forever. +\q1 +\v 10 Arise, and depart! +\q2 For this is not your resting place, +\q2 because of uncleanness that destroys, +\q2 even with a grievous destruction. +\q1 +\v 11 If a man walking in a spirit of falsehood lies, saying, +\q2 “I will prophesy to you of wine and of strong drink,” +\q2 he would be the prophet of this people. +\q1 +\v 12 I will surely assemble all of you, Jacob. +\q2 I will surely gather the remnant of Israel. +\q1 I will put them together as the sheep of Bozrah, +\q2 as a flock in the middle of their pasture. +\q2 They will swarm with people. +\q1 +\v 13 He who breaks open the way goes up before them. +\q2 They break through the gate, and go out. +\q2 Their king passes on before them, +\q2 with Yahweh at their head. +\c 3 +\p +\v 1 I said, +\q1 “Please listen, you heads of Jacob, +\q2 and rulers of the house of Israel: +\q2 Isn’t it for you to know justice? +\q1 +\v 2 You who hate the good, +\q2 and love the evil; +\q2 who tear off their skin, +\q2 and their flesh from off their bones; +\q2 +\v 3 who also eat the flesh of my people, +\q2 and peel their skin from off them, +\q2 and break their bones, +\q2 and chop them in pieces, as for the pot, +\q2 and as meat within the cauldron. +\q1 +\v 4 Then they will cry to Yahweh, +\q2 but he will not answer them. +\q1 Yes, he will hide his face from them at that time, +\q2 because they made their deeds evil.” +\p +\v 5 Yahweh says concerning the prophets who lead my people astray—for those who feed their teeth, they proclaim, “Peace!” and whoever doesn’t provide for their mouths, they prepare war against him: +\q1 +\v 6 “Therefore night is over you, with no vision, +\q2 and it is dark to you, that you may not divine; +\q2 and the sun will go down on the prophets, +\q2 and the day will be black over them. +\q1 +\v 7 The seers shall be disappointed, +\q2 and the diviners confounded. +\q1 Yes, they shall all cover their lips, +\q2 for there is no answer from God.”\f + \fr 3:7 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\q1 +\v 8 But as for me, I am full of power by Yahweh’s Spirit, +\q2 and of judgment, and of might, +\q2 to declare to Jacob his disobedience, +\q2 and to Israel his sin. +\q1 +\v 9 Please listen to this, you heads of the house of Jacob, +\q2 and rulers of the house of Israel, +\q2 who abhor justice, +\q2 and pervert all equity, +\q2 +\v 10 who build up Zion with blood, +\q2 and Jerusalem with iniquity. +\q1 +\v 11 Her leaders judge for bribes, +\q2 and her priests teach for a price, +\q2 and her prophets of it tell fortunes for money; +\q1 yet they lean on Yahweh, and say, +\q2 “Isn’t Yahweh among us? +\q2 No disaster will come on us.” +\q1 +\v 12 Therefore Zion for your sake will be plowed like a field, +\q2 and Jerusalem will become heaps of rubble, +\q2 and the mountain of the temple like the high places of a forest. +\b +\c 4 +\q1 +\v 1 But in the latter days, +\q2 it will happen that the mountain of Yahweh’s temple will be established on the top of the mountains, +\q2 and it will be exalted above the hills; +\q2 and peoples will stream to it. +\q1 +\v 2 Many nations will go and say, +\q2 “Come! Let’s go up to the mountain of Yahweh, +\q2 and to the house of the God of Jacob; +\q2 and he will teach us of his ways, +\q2 and we will walk in his paths.” +\q1 For the law will go out of Zion, +\q2 and Yahweh’s word from Jerusalem; +\q1 +\v 3 and he will judge between many peoples, +\q2 and will decide concerning strong nations afar off. +\q2 They will beat their swords into plowshares, +\q2 and their spears into pruning hooks. +\q1 Nation will not lift up sword against nation, +\q2 neither will they learn war any more. +\q1 +\v 4 But every man will sit under his vine and under his fig tree. +\q2 No one will make them afraid, +\q2 for the mouth of Yahweh of Armies has spoken. +\v 5 Indeed all the nations may walk in the name of their gods, +\q2 but we will walk in the name of Yahweh our God forever and ever. +\q1 +\v 6 “In that day,” says Yahweh, +\q2 “I will assemble that which is lame, +\q2 and I will gather that which is driven away, +\q2 and that which I have afflicted; +\q2 +\v 7 and I will make that which was lame a remnant, +\q2 and that which was cast far off a strong nation: +\q2 and Yahweh will reign over them on Mount Zion from then on, even forever.” +\q1 +\v 8 You, tower of the flock, the hill of the daughter of Zion, +\q2 to you it will come. +\q1 Yes, the former dominion will come, +\q2 the kingdom of the daughter of Jerusalem. +\b +\q1 +\v 9 Now why do you cry out aloud? +\q2 Is there no king in you? +\q2 Has your counselor perished, +\q2 that pains have taken hold of you as of a woman in travail? +\q1 +\v 10 Be in pain, and labor to give birth, daughter of Zion, +\q2 like a woman in travail; +\q2 for now you will go out of the city, +\q2 and will dwell in the field, +\q2 and will come even to Babylon. +\q1 There you will be rescued. +\q2 There Yahweh will redeem you from the hand of your enemies. +\b +\q1 +\v 11 Now many nations have assembled against you, that say, +\q2 “Let her be defiled, +\q2 and let our eye gloat over Zion.” +\q1 +\v 12 But they don’t know the thoughts of Yahweh, +\q2 neither do they understand his counsel; +\q2 for he has gathered them like the sheaves to the threshing floor. +\q1 +\v 13 Arise and thresh, daughter of Zion, +\q2 for I will make your horn iron, +\q2 and I will make your hoofs bronze. +\q1 You will beat in pieces many peoples. +\q1 I will devote their gain to Yahweh, +\q2 and their substance to the Lord of the whole earth. +\b +\c 5 +\q1 +\v 1 Now you shall gather yourself in troops, +\q2 daughter of troops. +\q1 He has laid siege against us. +\q2 They will strike the judge of Israel with a rod on the cheek. +\q1 +\v 2 But you, Bethlehem Ephrathah, +\q2 being small among the clans of Judah, +\q2 out of you one will come out to me who is to be ruler in Israel; +\q2 whose goings out are from of old, from ancient times. +\q1 +\v 3 Therefore he will abandon them until the time that she who is in labor gives birth. +\q2 Then the rest of his brothers will return to the children of Israel. +\q1 +\v 4 He shall stand, and shall shepherd in the strength of Yahweh, +\q2 in the majesty of the name of Yahweh his God. +\q2 They will live, for then he will be great to the ends of the earth. +\q1 +\v 5 He will be our peace when Assyria invades our land +\q2 and when he marches through our fortresses, +\q2 then we will raise against him seven shepherds, +\q2 and eight leaders of men. +\q1 +\v 6 They will rule the land of Assyria with the sword, +\q2 and the land of Nimrod in its gates. +\q1 He will deliver us from the Assyrian, +\q2 when he invades our land, +\q2 and when he marches within our border. +\q1 +\v 7 The remnant of Jacob will be among many peoples +\q2 like dew from Yahweh, +\q2 like showers on the grass, +\q2 that don’t wait for man +\q2 nor wait for the sons of men. +\q1 +\v 8 The remnant of Jacob will be among the nations, +\q2 among many peoples, +\q2 like a lion among the animals of the forest, +\q2 like a young lion among the flocks of sheep; +\q2 who, if he goes through, treads down and tears in pieces, +\q2 and there is no one to deliver. +\q1 +\v 9 Let your hand be lifted up above your adversaries, +\q2 and let all of your enemies be cut off. +\q1 +\v 10 “It will happen in that day”, says Yahweh, +\q2 “that I will cut off your horses from among you +\q2 and will destroy your chariots. +\q1 +\v 11 I will cut off the cities of your land +\q2 and will tear down all your strongholds. +\q1 +\v 12 I will destroy witchcraft from your hand. +\q2 You shall have no soothsayers. +\q1 +\v 13 I will cut off your engraved images and your pillars from among you; +\q2 and you shall no more worship the work of your hands. +\q1 +\v 14 I will uproot your Asherah poles from among you; +\q2 and I will destroy your cities. +\q1 +\v 15 I will execute vengeance in anger +\q2 and wrath on the nations that didn’t listen.” +\c 6 +\p +\v 1 Listen now to what Yahweh says: +\q1 “Arise, plead your case before the mountains, +\q2 and let the hills hear what you have to say. +\q1 +\v 2 Hear, you mountains, Yahweh’s indictment, +\q2 and you enduring foundations of the earth; +\q2 for Yahweh has a case against his people, +\q2 and he will contend with Israel. +\q1 +\v 3 My people, what have I done to you? +\q2 How have I burdened you? +\q2 Answer me! +\q1 +\v 4 For I brought you up out of the land of Egypt, +\q2 and redeemed you out of the house of bondage. +\q2 I sent before you Moses, Aaron, and Miriam. +\q1 +\v 5 My people, remember now what Balak king of Moab devised, +\q2 and what Balaam the son of Beor answered him from Shittim to Gilgal, +\q2 that you may know the righteous acts of Yahweh.” +\b +\q1 +\v 6 How shall I come before Yahweh, +\q2 and bow myself before the exalted God? +\q1 Shall I come before him with burnt offerings, +\q2 with calves a year old? +\q1 +\v 7 Will Yahweh be pleased with thousands of rams? +\q2 With tens of thousands of rivers of oil? +\q1 Shall I give my firstborn for my disobedience? +\q2 The fruit of my body for the sin of my soul? +\q1 +\v 8 He has shown you, O man, what is good. +\q2 What does Yahweh require of you, but to act justly, +\q2 to love mercy, and to walk humbly with your God? +\b +\q1 +\v 9 Yahweh’s voice calls to the city— +\q2 and wisdom fears your name— +\q1 “Listen to the rod, +\q2 and he who appointed it. +\q1 +\v 10 Are there yet treasures of wickedness in the house of the wicked, +\q2 and a short ephah\f + \fr 6:10 \ft An ephah is a measure of volume (about 22 liters or about 2/3 of a bushel), and a short ephah is made smaller than a full ephah for the purpose of cheating customers.\f* that is accursed? +\q1 +\v 11 Shall I tolerate dishonest scales, +\q2 and a bag of deceitful weights? +\q1 +\v 12 Her rich men are full of violence, +\q2 her inhabitants speak lies, +\q2 and their tongue is deceitful in their speech. +\q1 +\v 13 Therefore I also have struck you with a grievous wound. +\q2 I have made you desolate because of your sins. +\q1 +\v 14 You shall eat, but not be satisfied. +\q2 Your hunger will be within you. +\q2 You will store up, but not save, +\q2 and that which you save I will give up to the sword. +\q1 +\v 15 You will sow, but won’t reap. +\q2 You will tread the olives, but won’t anoint yourself with oil; +\q2 and crush grapes, but won’t drink the wine. +\q1 +\v 16 For the statutes of Omri are kept, +\q2 and all the works of Ahab’s house. +\q2 You walk in their counsels, +\q2 that I may make you a ruin, +\q2 and your inhabitants a hissing. +\q2 You will bear the reproach of my people.” +\b +\c 7 +\q1 +\v 1 Misery is mine! +\q2 Indeed, I am like one who gathers the summer fruits, as gleanings of the vineyard. +\q2 There is no cluster of grapes to eat. +\q2 My soul desires to eat the early fig. +\q1 +\v 2 The godly man has perished out of the earth, +\q2 and there is no one upright among men. +\q2 They all lie in wait for blood; +\q2 every man hunts his brother with a net. +\q1 +\v 3 Their hands are on that which is evil to do it diligently. +\q2 The ruler and judge ask for a bribe. +\q1 The powerful man dictates the evil desire of his soul. +\q2 Thus they conspire together. +\q1 +\v 4 The best of them is like a brier. +\q2 The most upright is worse than a thorn hedge. +\q1 The day of your watchmen, +\q2 even your visitation, has come; +\q2 now is the time of their confusion. +\q1 +\v 5 Don’t trust in a neighbor. +\q2 Don’t put confidence in a friend. +\q2 With the woman lying in your embrace, +\q2 be careful of the words of your mouth! +\q1 +\v 6 For the son dishonors the father, +\q2 the daughter rises up against her mother, +\q2 the daughter-in-law against her mother-in-law; +\q2 a man’s enemies are the men of his own house. +\q1 +\v 7 But as for me, I will look to Yahweh. +\q2 I will wait for the God of my salvation. +\q2 My God will hear me. +\q1 +\v 8 Don’t rejoice against me, my enemy. +\q2 When I fall, I will arise. +\q2 When I sit in darkness, Yahweh will be a light to me. +\q1 +\v 9 I will bear the indignation of Yahweh, +\q2 because I have sinned against him, +\q2 until he pleads my case and executes judgment for me. +\q2 He will bring me out to the light. +\q2 I will see his righteousness. +\q1 +\v 10 Then my enemy will see it, +\q2 and shame will cover her who said to me, +\q2 “Where is Yahweh your God?” +\q1 My eyes will see her. +\q2 Now she will be trodden down like the mire of the streets. +\q1 +\v 11 A day to build your walls! +\q2 In that day, he will extend your boundary. +\q1 +\v 12 In that day they will come to you from Assyria and the cities of Egypt, +\q2 and from Egypt even to the River, +\q2 and from sea to sea, +\q2 and mountain to mountain. +\q1 +\v 13 Yet the land will be desolate because of those who dwell therein, +\q2 for the fruit of their doings. +\q1 +\v 14 Shepherd your people with your staff, +\q2 the flock of your heritage, +\q2 who dwell by themselves in a forest. +\q1 Let them feed in the middle of fertile pasture land, +\q2 in Bashan and Gilead, as in the days of old. +\q1 +\v 15 “As in the days of your coming out of the land of Egypt, +\q2 I will show them marvelous things.” +\q1 +\v 16 The nations will see and be ashamed of all their might. +\q2 They will lay their hand on their mouth. +\q2 Their ears will be deaf. +\q1 +\v 17 They will lick the dust like a serpent. +\q2 Like crawling things of the earth, they will come trembling out of their dens. +\q2 They will come with fear to Yahweh our God, +\q2 and will be afraid because of you. +\q1 +\v 18 Who is a God like you, who pardons iniquity, +\q2 and passes over the disobedience of the remnant of his heritage? +\q1 He doesn’t retain his anger forever, +\q2 because he delights in loving kindness. +\q1 +\v 19 He will again have compassion on us. +\q2 He will tread our iniquities under foot. +\q2 You will cast all their sins into the depths of the sea. +\q1 +\v 20 You will give truth to Jacob, +\q2 and mercy to Abraham, +\q2 as you have sworn to our fathers from the days of old. diff --git a/c-sharp/assets/WEB/34NAMengWEBUS.SFM b/c-sharp/assets/WEB/34NAMengWEBUS.SFM new file mode 100644 index 0000000000..4161264b83 --- /dev/null +++ b/c-sharp/assets/WEB/34NAMengWEBUS.SFM @@ -0,0 +1,69 @@ +\id NAM 34-NAM-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Nahum +\toc1 The Book of Nahum +\toc2 Nahum +\toc3 Nahum +\mt2 The Book of +\mt1 Nahum +\c 1 +\p +\v 1 A revelation about Nineveh. The book of the vision of Nahum the Elkoshite. +\v 2 Yahweh\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* is a jealous God\f + \fr 1:2 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* and avenges. Yahweh avenges and is full of wrath. Yahweh takes vengeance on his adversaries, and he maintains wrath against his enemies. +\v 3 Yahweh is slow to anger, and great in power, and will by no means leave the guilty unpunished. Yahweh has his way in the whirlwind and in the storm, and the clouds are the dust of his feet. +\v 4 He rebukes the sea and makes it dry, and dries up all the rivers. Bashan and Carmel languish. The flower of Lebanon languishes. +\v 5 The mountains quake before him, and the hills melt away. The earth trembles at his presence, yes, the world, and all who dwell in it. +\v 6 Who can stand before his indignation? Who can endure the fierceness of his anger? His wrath is poured out like fire, and the rocks are broken apart by him. +\v 7 Yahweh is good, a stronghold in the day of trouble; and he knows those who take refuge in him. +\v 8 But with an overflowing flood, he will make a full end of her place, and will pursue his enemies into darkness. +\v 9 What do you plot against Yahweh? He will make a full end. Affliction won’t rise up the second time. +\v 10 For entangled like thorns, and drunken as with their drink, they are consumed utterly like dry stubble. +\v 11 One has gone out of you who devises evil against Yahweh, who counsels wickedness. +\p +\v 12 Yahweh says: “Though they are in full strength and likewise many, even so they will be cut down and pass away. Though I have afflicted you, I will afflict you no more. +\v 13 Now I will break his yoke from off you, and will burst your bonds apart.” +\p +\v 14 Yahweh has commanded concerning you: “No more descendants will bear your name. Out of the house of your gods, I will cut off the engraved image and the molten image. I will make your grave, for you are vile.” +\p +\v 15 Behold,\f + \fr 1:15 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* on the mountains the feet of him who brings good news, who publishes peace! Keep your feasts, Judah! Perform your vows, for the wicked one will no more pass through you. He is utterly cut off. +\c 2 +\p +\v 1 He who dashes in pieces has come up against you. Keep the fortress! Watch the way! Strengthen your waist! Fortify your power mightily! +\p +\v 2 For Yahweh restores the excellency of Jacob as the excellency of Israel, for the destroyers have destroyed them and ruined their vine branches. +\p +\v 3 The shield of his mighty men is made red. The valiant men are in scarlet. The chariots flash with steel in the day of his preparation, and the pine spears are brandished. +\v 4 The chariots rage in the streets. They rush back and forth in the wide ways. Their appearance is like torches. They run like the lightnings. +\v 5 He summons his picked troops. They stumble on their way. They dash to its wall, and the protective shield is put in place. +\v 6 The gates of the rivers are opened, and the palace is dissolved. +\v 7 It is decreed: she is uncovered, she is carried away; and her servants moan as with the voice of doves, beating on their breasts. +\v 8 But Nineveh has been from of old like a pool of water, yet they flee away. “Stop! Stop!” they cry, but no one looks back. +\v 9 Take the plunder of silver. Take the plunder of gold, for there is no end of treasure, an abundance of every precious thing. +\v 10 She is empty, void, and waste. The heart melts, the knees knock together, their bodies and faces have grown pale. +\v 11 Where is the den of the lions, and the feeding place of the young lions, where the lion and the lioness walked with the lion’s cubs, and no one made them afraid? +\v 12 The lion tore in pieces enough for his cubs, and strangled prey for his lionesses, and filled his caves with the kill and his dens with prey. +\v 13 “Behold, I am against you,” says Yahweh of Armies, “and I will burn her chariots in the smoke, and the sword will devour your young lions; and I will cut off your prey from the earth, and the voice of your messengers will no longer be heard.” +\c 3 +\p +\v 1 Woe to the bloody city! It is all full of lies and robbery—no end to the prey. +\v 2 The noise of the whip, the noise of the rattling of wheels, prancing horses, and bounding chariots, +\v 3 the horseman charging, and the flashing sword, the glittering spear, and a multitude of slain, and a great heap of corpses, and there is no end of the bodies. They stumble on their bodies +\v 4 because of the multitude of the prostitution of the alluring prostitute, the mistress of witchcraft, who sells nations through her prostitution, and families through her witchcraft. +\v 5 “Behold, I am against you,” says Yahweh of Armies, “and I will lift your skirts over your face. I will show the nations your nakedness, and the kingdoms your shame. +\v 6 I will throw abominable filth on you and make you vile, and will make you a spectacle. +\v 7 It will happen that all those who look at you will flee from you, and say, ‘Nineveh is laid waste! Who will mourn for her?’ Where will I seek comforters for you?” +\p +\v 8 Are you better than No-Amon,\f + \fr 3:8 \ft or, Thebes\f* who was situated among the rivers,\f + \fr 3:8 \ft or, Nile\f* who had the waters around her, whose rampart was the sea, and her wall was of the sea? +\v 9 Cush and Egypt were her boundless strength. Put and Libya were her helpers. +\v 10 Yet was she carried away. She went into captivity. Her young children also were dashed in pieces at the head of all the streets, and they cast lots for her honorable men, and all her great men were bound in chains. +\v 11 You also will be drunken. You will be hidden. You also will seek a stronghold because of the enemy. +\v 12 All your fortresses will be like fig trees with the first-ripe figs. If they are shaken, they fall into the mouth of the eater. +\v 13 Behold, your troops among you are women. The gates of your land are set wide open to your enemies. The fire has devoured your bars. +\p +\v 14 Draw water for the siege. Strengthen your fortresses. Go into the clay, and tread the mortar. Make the brick kiln strong. +\v 15 There the fire will devour you. The sword will cut you off. It will devour you like the grasshopper. Multiply like grasshoppers. Multiply like the locust. +\v 16 You have increased your merchants more than the stars of the skies. The grasshopper strips and flees away. +\v 17 Your guards are like the locusts, and your officials like the swarms of locusts, which settle on the walls on a cold day, but when the sun appears, they flee away, and their place is not known where they are. +\p +\v 18 Your shepherds slumber, king of Assyria. Your nobles lie down. Your people are scattered on the mountains, and there is no one to gather them. +\v 19 There is no healing your wound, for your injury is fatal. All who hear the report of you clap their hands over you, for who hasn’t felt your endless cruelty? diff --git a/c-sharp/assets/WEB/35HABengWEBUS.SFM b/c-sharp/assets/WEB/35HABengWEBUS.SFM new file mode 100644 index 0000000000..14356b35f4 --- /dev/null +++ b/c-sharp/assets/WEB/35HABengWEBUS.SFM @@ -0,0 +1,142 @@ +\id HAB 35-HAB-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Habakkuk +\toc1 The Book of Habakkuk +\toc2 Habakkuk +\toc3 Habakkuk +\mt2 The Book of +\mt1 Habakkuk +\c 1 +\p +\v 1 The revelation which Habakkuk the prophet saw. +\v 2 Yahweh,\f + \fr 1:2 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* how long will I cry, and you will not hear? I cry out to you “Violence!” and will you not save? +\v 3 Why do you show me iniquity, and look at perversity? For destruction and violence are before me. There is strife, and contention rises up. +\v 4 Therefore the law is paralyzed, and justice never prevails; for the wicked surround the righteous; therefore justice comes out perverted. +\p +\v 5 “Look among the nations, watch, and wonder marvelously; for I am working a work in your days which you will not believe though it is told you. +\v 6 For, behold,\f + \fr 1:6 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I am raising up the Chaldeans, that bitter and hasty nation who march through the width of the earth, to possess dwelling places that are not theirs. +\v 7 They are feared and dreaded. Their judgment and their dignity proceed from themselves. +\v 8 Their horses also are swifter than leopards, and are more fierce than the evening wolves. Their horsemen press proudly on. Yes, their horsemen come from afar. They fly as an eagle that hurries to devour. +\v 9 All of them come for violence. Their hordes face forward. They gather prisoners like sand. +\v 10 Yes, they scoff at kings, and princes are a derision to them. They laugh at every stronghold, for they build up an earthen ramp and take it. +\v 11 Then they sweep by like the wind and go on. They are indeed guilty, whose strength is their god.” +\p +\v 12 Aren’t you from everlasting, Yahweh my God,\f + \fr 1:12 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* my Holy One? We will not die. Yahweh, you have appointed them for judgment. You, Rock, have established him to punish. +\v 13 You who have purer eyes than to see evil, and who cannot look on perversity, why do you tolerate those who deal treacherously and keep silent when the wicked swallows up the man who is more righteous than he, +\v 14 and make men like the fish of the sea, like the creeping things that have no ruler over them? +\v 15 He takes up all of them with the hook. He catches them in his net and gathers them in his dragnet. Therefore he rejoices and is glad. +\v 16 Therefore he sacrifices to his net and burns incense to his dragnet, because by them his life is luxurious and his food is good. +\v 17 Will he therefore continually empty his net, and kill the nations without mercy? +\c 2 +\p +\v 1 I will stand at my watch and set myself on the ramparts, and will look out to see what he will say to me, and what I will answer concerning my complaint. +\p +\v 2 Yahweh answered me, “Write the vision, and make it plain on tablets, that he who runs may read it. +\v 3 For the vision is yet for the appointed time, and it hurries toward the end, and won’t prove false. Though it takes time, wait for it, because it will surely come. It won’t delay. +\v 4 Behold, his soul is puffed up. It is not upright in him, but the righteous will live by his faith. +\v 5 Yes, moreover, wine is treacherous: an arrogant man who doesn’t stay at home, who enlarges his desire as Sheol;\f + \fr 2:5 \ft Sheol is the place of the dead. \f* he is like death and can’t be satisfied, but gathers to himself all nations and heaps to himself all peoples. +\p +\v 6 Won’t all these take up a parable against him, and a taunting proverb against him, and say, ‘Woe to him who increases that which is not his, and who enriches himself by extortion! How long?’ +\v 7 Won’t your debtors rise up suddenly, and wake up those who make you tremble, and you will be their victim? +\v 8 Because you have plundered many nations, all the remnant of the peoples will plunder you because of men’s blood, and for the violence done to the land, to the city and to all who dwell in it. +\p +\v 9 Woe to him who gets an evil gain for his house, that he may set his nest on high, that he may be delivered from the hand of evil! +\v 10 You have devised shame to your house by cutting off many peoples, and have sinned against your soul. +\v 11 For the stone will cry out of the wall, and the beam out of the woodwork will answer it. +\p +\v 12 Woe to him who builds a town with blood, and establishes a city by iniquity! +\v 13 Behold, isn’t it from Yahweh of Armies that the peoples labor for the fire, and the nations weary themselves for vanity? +\v 14 For the earth will be filled with the knowledge of Yahweh’s glory, as the waters cover the sea. +\p +\v 15 “Woe to him who gives his neighbor drink, pouring your inflaming wine until they are drunk, so that you may gaze at their naked bodies! +\v 16 You are filled with shame, and not glory. You will also drink and be exposed! The cup of Yahweh’s right hand will come around to you, and disgrace will cover your glory. +\v 17 For the violence done to Lebanon will overwhelm you, and the destruction of the animals will terrify you, because of men’s blood and for the violence done to the land, to every city and to those who dwell in them. +\p +\v 18 “What value does the engraved image have, that its maker has engraved it; the molten image, even the teacher of lies, that he who fashions its form trusts in it, to make mute idols? +\v 19 Woe to him who says to the wood, ‘Awake!’ or to the mute stone, ‘Arise!’ Shall this teach? Behold, it is overlaid with gold and silver, and there is no breath at all within it. +\v 20 But Yahweh is in his holy temple. Let all the earth be silent before him!” +\c 3 +\p +\v 1 A prayer of Habakkuk, the prophet, set to victorious music. +\q1 +\v 2 Yahweh, I have heard of your fame. +\q2 I stand in awe of your deeds, Yahweh. +\q1 Renew your work in the middle of the years. +\q2 In the middle of the years make it known. +\q2 In wrath, you remember mercy. +\q1 +\v 3 God came from Teman, +\q2 the Holy One from Mount Paran. \qs Selah.\qs* +\b +\q1 His glory covered the heavens, +\q2 and his praise filled the earth. +\q1 +\v 4 His splendor is like the sunrise. +\q2 Rays shine from his hand, where his power is hidden. +\q1 +\v 5 Plague went before him, +\q2 and pestilence followed his feet. +\q1 +\v 6 He stood, and shook the earth. +\q2 He looked, and made the nations tremble. +\q2 The ancient mountains were crumbled. +\q2 The age-old hills collapsed. +\q2 His ways are eternal. +\q1 +\v 7 I saw the tents of Cushan in affliction. +\q2 The dwellings of the land of Midian trembled. +\q1 +\v 8 Was Yahweh displeased with the rivers? +\q2 Was your anger against the rivers, +\q2 or your wrath against the sea, +\q2 that you rode on your horses, +\q2 on your chariots of salvation? +\q1 +\v 9 You uncovered your bow. +\q2 You called for your sworn arrows. \qs Selah.\qs* +\q1 You split the earth with rivers. +\q1 +\v 10 The mountains saw you, and were afraid. +\q2 The storm of waters passed by. +\q2 The deep roared and lifted up its hands on high. +\q1 +\v 11 The sun and moon stood still in the sky +\q2 at the light of your arrows as they went, +\q2 at the shining of your glittering spear. +\q1 +\v 12 You marched through the land in wrath. +\q2 You threshed the nations in anger. +\q1 +\v 13 You went out for the salvation of your people, +\q2 for the salvation of your anointed. +\q1 You crushed the head of the land of wickedness. +\q2 You stripped them head to foot. \qs Selah.\qs* +\b +\q1 +\v 14 You pierced the heads of his warriors with their own spears. +\q2 They came as a whirlwind to scatter me, +\q2 gloating as if to devour the wretched in secret. +\q1 +\v 15 You trampled the sea with your horses, +\q2 churning mighty waters. +\q1 +\v 16 I heard, and my body trembled. +\q2 My lips quivered at the voice. +\q1 Rottenness enters into my bones, and I tremble in my place +\q2 because I must wait quietly for the day of trouble, +\q2 for the coming up of the people who invade us. +\q1 +\v 17 For even though the fig tree doesn’t flourish, +\q2 nor fruit be in the vines, +\q2 the labor of the olive fails, +\q2 the fields yield no food, +\q2 the flocks are cut off from the fold, +\q2 and there is no herd in the stalls, +\q1 +\v 18 yet I will rejoice in Yahweh. +\q2 I will be joyful in the God of my salvation! +\q1 +\v 19 Yahweh, the Lord,\f + \fr 3:19 \ft The word translated “Lord” is “Adonai.”\f* is my strength. +\q2 He makes my feet like deer’s feet, +\q2 and enables me to go in high places. +\p For the music director, on my stringed instruments. diff --git a/c-sharp/assets/WEB/36ZEPengWEBUS.SFM b/c-sharp/assets/WEB/36ZEPengWEBUS.SFM new file mode 100644 index 0000000000..22d1f80fd2 --- /dev/null +++ b/c-sharp/assets/WEB/36ZEPengWEBUS.SFM @@ -0,0 +1,78 @@ +\id ZEP 36-ZEP-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Zephaniah +\toc1 The Book of Zephaniah +\toc2 Zephaniah +\toc3 Zephaniah +\mt2 The Book of +\mt1 Zephaniah +\c 1 +\p +\v 1 Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word which came to Zephaniah, the son of Cushi, the son of Gedaliah, the son of Amariah, the son of Hezekiah, in the days of Josiah, the son of Amon, king of Judah. +\p +\v 2 I will utterly sweep away everything from the surface of the earth, says Yahweh. +\v 3 I will sweep away man and animal. I will sweep away the birds of the sky, the fish of the sea, and the heaps of rubble with the wicked. I will cut off man from the surface of the earth, says Yahweh. +\v 4 I will stretch out my hand against Judah and against all the inhabitants of Jerusalem. I will cut off the remnant of Baal from this place—the name of the idolatrous and pagan priests, +\v 5 those who worship the army of the sky on the housetops, those who worship and swear by Yahweh and also swear by Malcam, +\v 6 those who have turned back from following Yahweh, and those who haven’t sought Yahweh nor inquired after him. +\p +\v 7 Be silent at the presence of the Lord\f + \fr 1:7 \ft The word translated “Lord” is “Adonai.”\f* Yahweh, for the day of Yahweh is at hand. For Yahweh has prepared a sacrifice. He has consecrated his guests. +\v 8 It will happen in the day of Yahweh’s sacrifice that I will punish the princes, the king’s sons, and all those who are clothed with foreign clothing. +\v 9 In that day, I will punish all those who leap over the threshold, who fill their master’s house with violence and deceit. +\p +\v 10 In that day, says Yahweh, there will be the noise of a cry from the fish gate, a wailing from the second quarter, and a great crashing from the hills. +\v 11 Wail, you inhabitants of Maktesh, for all the people of Canaan are undone! All those who were loaded with silver are cut off. +\v 12 It will happen at that time, that I will search Jerusalem with lamps, and I will punish the men who are settled on their dregs, who say in their heart, “Yahweh will not do good, neither will he do evil.” +\v 13 Their wealth will become a plunder, and their houses a desolation. Yes, they will build houses, but won’t inhabit them. They will plant vineyards, but won’t drink their wine. +\p +\v 14 The great day of Yahweh is near. It is near and hurries greatly, the voice of the day of Yahweh. The mighty man cries there bitterly. +\v 15 That day is a day of wrath, a day of distress and anguish, a day of trouble and ruin, a day of darkness and gloom, a day of clouds and blackness, +\v 16 a day of the trumpet and alarm against the fortified cities and against the high battlements. +\v 17 I will bring such distress on men that they will walk like blind men because they have sinned against Yahweh. Their blood will be poured out like dust and their flesh like dung. +\v 18 Neither their silver nor their gold will be able to deliver them in the day of Yahweh’s wrath, but the whole land will be devoured by the fire of his jealousy; for he will make an end, yes, a terrible end, of all those who dwell in the land. +\c 2 +\p +\v 1 Gather yourselves together, yes, gather together, you nation that has no shame, +\v 2 before the appointed time when the day passes as the chaff, before the fierce anger of Yahweh comes on you, before the day of Yahweh’s anger comes on you. +\v 3 Seek Yahweh, all you humble of the land, who have kept his ordinances. Seek righteousness. Seek humility. It may be that you will be hidden in the day of Yahweh’s anger. +\v 4 For Gaza will be forsaken, and Ashkelon a desolation. They will drive out Ashdod at noonday, and Ekron will be rooted up. +\v 5 Woe to the inhabitants of the sea coast, the nation of the Cherethites! Yahweh’s word is against you, Canaan, the land of the Philistines. I will destroy you until there is no inhabitant. +\v 6 The sea coast will be pastures, with cottages for shepherds and folds for flocks. +\v 7 The coast will be for the remnant of the house of Judah. They will find pasture. In the houses of Ashkelon, they will lie down in the evening, for Yahweh, their God,\f + \fr 2:7 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* will visit them and restore them. +\v 8 I have heard the reproach of Moab and the insults of the children of Ammon, with which they have reproached my people and magnified themselves against their border. +\v 9 Therefore, as I live, says Yahweh of Armies, the God of Israel, surely Moab will be as Sodom, and the children of Ammon as Gomorrah, a possession of nettles and salt pits, and a perpetual desolation. The remnant of my people will plunder them, and the survivors of my nation will inherit them. +\v 10 This they will have for their pride, because they have reproached and magnified themselves against the people of Yahweh of Armies. +\v 11 Yahweh will be awesome to them, for he will famish all the gods of the land. Men will worship him, everyone from his place, even all the shores of the nations. +\p +\v 12 You Cushites also, you will be killed by my sword. +\p +\v 13 He will stretch out his hand against the north, destroy Assyria, and will make Nineveh a desolation, as dry as the wilderness. +\v 14 Herds will lie down in the middle of her, all kinds of animals. Both the pelican and the porcupine will lodge in its capitals. Their calls will echo through the windows. Desolation will be in the thresholds, for he has laid bare the cedar beams. +\v 15 This is the joyous city that lived carelessly, that said in her heart, “I am, and there is no one besides me.” How she has become a desolation, a place for animals to lie down in! Everyone who passes by her will hiss and shake their fists. +\c 3 +\p +\v 1 Woe to her who is rebellious and polluted, the oppressing city! +\v 2 She didn’t obey the voice. She didn’t receive correction. She didn’t trust in Yahweh. She didn’t draw near to her God. +\p +\v 3 Her princes within her are roaring lions. Her judges are evening wolves. They leave nothing until the next day. +\v 4 Her prophets are arrogant and treacherous people. Her priests have profaned the sanctuary. They have done violence to the law. +\v 5 Yahweh, within her, is righteous. He will do no wrong. Every morning he brings his justice to light. He doesn’t fail, but the unjust know no shame. +\p +\v 6 I have cut off nations. Their battlements are desolate. I have made their streets waste, so that no one passes by. Their cities are destroyed, so that there is no man, so that there is no inhabitant. +\v 7 I said, “Just fear me. Receive correction,” so that her dwelling won’t be cut off, according to all that I have appointed concerning her. But they rose early and corrupted all their doings. +\p +\v 8 “Therefore wait for me”, says Yahweh, “until the day that I rise up to the prey, for my determination is to gather the nations, that I may assemble the kingdoms to pour on them my indignation, even all my fierce anger, for all the earth will be devoured with the fire of my jealousy. +\p +\v 9 For then I will purify the lips of the peoples, that they may all call on Yahweh’s name, to serve him shoulder to shoulder. +\v 10 From beyond the rivers of Cush, my worshipers, even the daughter of my dispersed people, will bring my offering. +\v 11 In that day you will not be disappointed for all your doings in which you have transgressed against me; for then I will take away out from among you your proudly exulting ones, and you will no more be arrogant in my holy mountain. +\v 12 But I will leave among you an afflicted and poor people, and they will take refuge in Yahweh’s name. +\v 13 The remnant of Israel will not do iniquity nor speak lies, neither will a deceitful tongue be found in their mouth, for they will feed and lie down, and no one will make them afraid.” +\p +\v 14 Sing, daughter of Zion! Shout, Israel! Be glad and rejoice with all your heart, daughter of Jerusalem. +\v 15 Yahweh has taken away your judgments. He has thrown out your enemy. The King of Israel, Yahweh, is among you. You will not be afraid of evil any more. +\v 16 In that day, it will be said to Jerusalem, “Don’t be afraid, Zion. Don’t let your hands be weak.” +\v 17 Yahweh, your God, is among you, a mighty one who will save. He will rejoice over you with joy. He will calm you in his love. He will rejoice over you with singing. +\v 18 I will remove those who grieve about the appointed feasts from you. They are a burden and a reproach to you. +\v 19 Behold,\f + \fr 3:19 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* at that time I will deal with all those who afflict you; and I will save those who are lame and gather those who were driven away. I will give them praise and honor, whose shame has been in all the earth. +\v 20 At that time I will bring you in, and at that time I will gather you; for I will give you honor and praise among all the peoples of the earth when I restore your fortunes before your eyes, says Yahweh. diff --git a/c-sharp/assets/WEB/37HAGengWEBUS.SFM b/c-sharp/assets/WEB/37HAGengWEBUS.SFM new file mode 100644 index 0000000000..534f4b1374 --- /dev/null +++ b/c-sharp/assets/WEB/37HAGengWEBUS.SFM @@ -0,0 +1,61 @@ +\id HAG 7-HAG-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Haggai +\toc1 The Book of Haggai +\toc2 Haggai +\toc3 Haggai +\mt2 The Book of +\mt1 Haggai +\c 1 +\p +\v 1 In the second year of Darius the king, in the sixth month, in the first day of the month, Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word came by Haggai the prophet, to Zerubbabel the son of Shealtiel, governor of Judah, and to Joshua the son of Jehozadak, the high priest, saying, +\v 2 “This is what Yahweh of Armies says: These people say, ‘The time hasn’t yet come, the time for Yahweh’s house to be built.’” +\p +\v 3 Then Yahweh’s word came by Haggai the prophet, saying, +\v 4 “Is it a time for you yourselves to dwell in your paneled houses, while this house lies waste? +\v 5 Now therefore this is what Yahweh of Armies says: ‘Consider your ways. +\v 6 You have sown much, and bring in little. You eat, but you don’t have enough. You drink, but you aren’t filled with drink. You clothe yourselves, but no one is warm; and he who earns wages earns wages to put them into a bag with holes in it.’ +\p +\v 7 “This is what Yahweh of Armies says: ‘Consider your ways. +\v 8 Go up to the mountain, bring wood, and build the house. I will take pleasure in it, and I will be glorified,” says Yahweh. +\v 9 “You looked for much, and, behold,\f + \fr 1:9 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* it came to little; and when you brought it home, I blew it away. Why?” says Yahweh of Armies, “Because of my house that lies waste, while each of you is busy with his own house. +\v 10 Therefore for your sake the heavens withhold the dew, and the earth withholds its fruit. +\v 11 I called for a drought on the land, on the mountains, on the grain, on the new wine, on the oil, on that which the ground produces, on men, on livestock, and on all the labor of the hands.” +\p +\v 12 Then Zerubbabel the son of Shealtiel and Joshua the son of Jehozadak, the high priest, with all the remnant of the people, obeyed Yahweh their God’s\f + \fr 1:12 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* voice, and the words of Haggai the prophet, as Yahweh their God had sent him; and the people feared Yahweh. +\p +\v 13 Then Haggai, Yahweh’s messenger, spoke Yahweh’s message to the people, saying, “I am with you,” says Yahweh. +\p +\v 14 Yahweh stirred up the spirit of Zerubbabel the son of Shealtiel, governor of Judah, and the spirit of Joshua the son of Jehozadak, the high priest, and the spirit of all the remnant of the people; and they came and worked on the house of Yahweh of Armies, their God, +\v 15 in the twenty-fourth day of the month, in the sixth month, in the second year of Darius the king. +\c 2 +\p +\v 1 In the seventh month, in the twenty-first day of the month, Yahweh’s word came by Haggai the prophet, saying, +\v 2 “Speak now to Zerubbabel the son of Shealtiel, governor of Judah, and to Joshua the son of Jehozadak, the high priest, and to the remnant of the people, saying, +\v 3 ‘Who is left among you who saw this house in its former glory? How do you see it now? Isn’t it in your eyes as nothing? +\v 4 Yet now be strong, Zerubbabel,’ says Yahweh. ‘Be strong, Joshua son of Jehozadak, the high priest. Be strong, all you people of the land,’ says Yahweh, ‘and work, for I am with you,’ says Yahweh of Armies. +\v 5 This is the word that I covenanted with you when you came out of Egypt, and my Spirit lived among you. ‘Don’t be afraid.’ +\v 6 For this is what Yahweh of Armies says: ‘Yet once more, it is a little while, and I will shake the heavens, the earth, the sea, and the dry land; +\v 7 and I will shake all nations. The treasure of all nations will come, and I will fill this house with glory, says Yahweh of Armies. +\v 8 The silver is mine, and the gold is mine,’ says Yahweh of Armies. +\v 9 ‘The latter glory of this house will be greater than the former,’ says Yahweh of Armies; ‘and in this place I will give peace,’ says Yahweh of Armies.” +\p +\v 10 In the twenty-fourth day of the ninth month, in the second year of Darius, Yahweh’s word came by Haggai the prophet, saying, +\v 11 “Yahweh of Armies says: Ask now the priests concerning the law, saying, +\v 12 ‘If someone carries holy meat in the fold of his garment, and with his fold touches bread, stew, wine, oil, or any food, will it become holy?’” +\p The priests answered, “No.” +\p +\v 13 Then Haggai said, “If one who is unclean by reason of a dead body touch any of these, will it be unclean?” +\p The priests answered, “It will be unclean.” +\p +\v 14 Then Haggai answered, “‘So is this people, and so is this nation before me,’ says Yahweh; ‘and so is every work of their hands. That which they offer there is unclean. +\v 15 Now, please consider from this day and backward, before a stone was laid on a stone in Yahweh’s temple. +\v 16 Through all that time, when one came to a heap of twenty measures, there were only ten. When one came to the wine vat to draw out fifty, there were only twenty. +\v 17 I struck you with blight, mildew, and hail in all the work of your hands; yet you didn’t turn to me,’ says Yahweh. +\v 18 ‘Consider, please, from this day and backward, from the twenty-fourth day of the ninth month, since the day that the foundation of Yahweh’s temple was laid, consider it. +\v 19 Is the seed yet in the barn? Yes, the vine, the fig tree, the pomegranate, and the olive tree haven’t produced. From today I will bless you.’” +\p +\v 20 Yahweh’s word came the second time to Haggai in the twenty-fourth day of the month, saying, +\v 21 “Speak to Zerubbabel, governor of Judah, saying, ‘I will shake the heavens and the earth. +\v 22 I will overthrow the throne of kingdoms. I will destroy the strength of the kingdoms of the nations. I will overthrow the chariots and those who ride in them. The horses and their riders will come down, everyone by the sword of his brother. +\v 23 In that day, says Yahweh of Armies, I will take you, Zerubbabel my servant, the son of Shealtiel,’ says Yahweh, ‘and will make you like a signet ring, for I have chosen you,’ says Yahweh of Armies.” diff --git a/c-sharp/assets/WEB/38ZECengWEBUS.SFM b/c-sharp/assets/WEB/38ZECengWEBUS.SFM new file mode 100644 index 0000000000..29a2e6ab95 --- /dev/null +++ b/c-sharp/assets/WEB/38ZECengWEBUS.SFM @@ -0,0 +1,455 @@ +\id ZEC 38-ZEC-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Zechariah +\toc1 The Book of Zechariah +\toc2 Zechariah +\toc3 Zechariah +\mt2 The Book of +\mt1 Zechariah +\c 1 +\p +\v 1 In the eighth month, in the second year of Darius, Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word came to the prophet Zechariah the son of Berechiah, the son of Iddo, saying, +\v 2 “Yahweh was very displeased with your fathers. +\v 3 Therefore tell them, Yahweh of Armies says: ‘Return to me,’ says Yahweh of Armies, ‘and I will return to you,’ says Yahweh of Armies. +\v 4 Don’t you be like your fathers, to whom the former prophets proclaimed, saying: Yahweh of Armies says, ‘Return now from your evil ways and from your evil doings;’ but they didn’t hear nor listen to me, says Yahweh. +\v 5 Your fathers, where are they? And the prophets, do they live forever? +\v 6 But my words and my decrees, which I commanded my servants the prophets, didn’t they overtake your fathers? +\p “Then they repented and said, ‘Just as Yahweh of Armies determined to do to us, according to our ways and according to our practices, so he has dealt with us.’” +\p +\v 7 On the twenty-fourth day of the eleventh month, which is the month Shebat, in the second year of Darius, Yahweh’s word came to the prophet Zechariah the son of Berechiah, the son of Iddo, saying, +\v 8 “I had a vision in the night, and behold,\f + \fr 1:8 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* a man riding on a red horse, and he stood among the myrtle trees that were in a ravine; and behind him there were red, brown, and white horses. +\v 9 Then I asked, ‘My lord, what are these?’” +\p The angel who talked with me said to me, “I will show you what these are.” +\p +\v 10 The man who stood among the myrtle trees answered, “They are the ones Yahweh has sent to go back and forth through the earth.” +\p +\v 11 They reported to Yahweh’s angel who stood among the myrtle trees, and said, “We have walked back and forth through the earth, and behold, all the earth is at rest and in peace.” +\p +\v 12 Then Yahweh’s angel replied, “O Yahweh of Armies, how long will you not have mercy on Jerusalem and on the cities of Judah, against which you have had indignation these seventy years?” +\p +\v 13 Yahweh answered the angel who talked with me with kind and comforting words. +\v 14 So the angel who talked with me said to me, “Proclaim, saying, ‘Yahweh of Armies says: “I am jealous for Jerusalem and for Zion with a great jealousy. +\v 15 I am very angry with the nations that are at ease; for I was but a little displeased, but they added to the calamity.” +\v 16 Therefore Yahweh says: “I have returned to Jerusalem with mercy. My house shall be built in it,” says Yahweh of Armies, “and a line shall be stretched out over Jerusalem.”’ +\p +\v 17 “Proclaim further, saying, ‘Yahweh of Armies says: “My cities will again overflow with prosperity, and Yahweh will again comfort Zion, and will again choose Jerusalem.”’” +\p +\v 18 I lifted up my eyes and saw, and behold, four horns. +\v 19 I asked the angel who talked with me, “What are these?” +\p He answered me, “These are the horns which have scattered Judah, Israel, and Jerusalem.” +\p +\v 20 Yahweh showed me four craftsmen. +\v 21 Then I asked, “What are these coming to do?” +\p He said, “These are the horns which scattered Judah, so that no man lifted up his head; but these have come to terrify them, to cast down the horns of the nations that lifted up their horn against the land of Judah to scatter it.” +\c 2 +\p +\v 1 I lifted up my eyes, and saw, and behold, a man with a measuring line in his hand. +\v 2 Then I asked, “Where are you going?” +\p He said to me, “To measure Jerusalem, to see what is its width and what is its length.” +\p +\v 3 Behold, the angel who talked with me went out, and another angel went out to meet him, +\v 4 and said to him, “Run, speak to this young man, saying, ‘Jerusalem will be inhabited as villages without walls, because of the multitude of men and livestock in it. +\v 5 For I,’ says Yahweh, ‘will be to her a wall of fire around it, and I will be the glory in the middle of her. +\p +\v 6 Come! Come! Flee from the land of the north,’ says Yahweh; ‘for I have spread you abroad as the four winds of the sky,’ says Yahweh. +\v 7 ‘Come, Zion! Escape, you who dwell with the daughter of Babylon.’ +\v 8 For Yahweh of Armies says: ‘For honor he has sent me to the nations which plundered you; for he who touches you touches the apple of his eye. +\v 9 For, behold, I will shake my hand over them, and they will be a plunder to those who served them; and you will know that Yahweh of Armies has sent me. +\v 10 Sing and rejoice, daughter of Zion! For behold, I come and I will dwell within you,’ says Yahweh. +\v 11 Many nations shall join themselves to Yahweh in that day, and shall be my people; and I will dwell among you, and you shall know that Yahweh of Armies has sent me to you. +\v 12 Yahweh will inherit Judah as his portion in the holy land, and will again choose Jerusalem. +\v 13 Be silent, all flesh, before Yahweh; for he has roused himself from his holy habitation!” +\c 3 +\p +\v 1 He showed me Joshua the high priest standing before Yahweh’s angel, and Satan standing at his right hand to be his adversary. +\v 2 Yahweh said to Satan, “Yahweh rebuke you, Satan! Yes, Yahweh who has chosen Jerusalem rebuke you! Isn’t this a burning stick plucked out of the fire?” +\p +\v 3 Now Joshua was clothed with filthy garments, and was standing before the angel. +\v 4 He answered and spoke to those who stood before him, saying, “Take the filthy garments off him.” To him he said, “Behold, I have caused your iniquity to pass from you, and I will clothe you with rich clothing.” +\p +\v 5 I said, “Let them set a clean turban on his head.” +\p So they set a clean turban on his head, and clothed him; and Yahweh’s angel was standing by. +\p +\v 6 Yahweh’s angel solemnly assured Joshua, saying, +\v 7 “Yahweh of Armies says: ‘If you will walk in my ways, and if you will follow my instructions, then you also shall judge my house, and shall also keep my courts, and I will give you a place of access among these who stand by. +\v 8 Hear now, Joshua the high priest, you and your fellows who sit before you, for they are men who are a sign; for, behold, I will bring out my servant, the Branch. +\v 9 For, behold, the stone that I have set before Joshua: on one stone are seven eyes; behold, I will engrave its inscription,’ says Yahweh of Armies, ‘and I will remove the iniquity of that land in one day. +\v 10 In that day,’ says Yahweh of Armies, ‘you will invite every man his neighbor under the vine and under the fig tree.’” +\c 4 +\p +\v 1 The angel who talked with me came again and wakened me, as a man who is wakened out of his sleep. +\v 2 He said to me, “What do you see?” +\p I said, “I have seen, and behold, a lamp stand all of gold, with its bowl on the top of it, and its seven lamps on it; there are seven pipes to each of the lamps which are on the top of it; +\v 3 and two olive trees by it, one on the right side of the bowl, and the other on the left side of it.” +\p +\v 4 I answered and spoke to the angel who talked with me, saying, “What are these, my lord?” +\p +\v 5 Then the angel who talked with me answered me, “Don’t you know what these are?” +\p I said, “No, my lord.” +\p +\v 6 Then he answered and spoke to me, saying, “This is Yahweh’s word to Zerubbabel, saying, ‘Not by might, nor by power, but by my Spirit,’ says Yahweh of Armies. +\v 7 Who are you, great mountain? Before Zerubbabel you are a plain; and he will bring out the capstone with shouts of ‘Grace, grace, to it!’” +\p +\v 8 Moreover Yahweh’s word came to me, saying, +\v 9 “The hands of Zerubbabel have laid the foundation of this house. His hands shall also finish it; and you will know that Yahweh of Armies has sent me to you. +\v 10 Indeed, who despises the day of small things? For these seven shall rejoice, and shall see the plumb line in the hand of Zerubbabel. These are Yahweh’s eyes, which run back and forth through the whole earth.” +\p +\v 11 Then I asked him, “What are these two olive trees on the right side of the lamp stand and on the left side of it?” +\p +\v 12 I asked him the second time, “What are these two olive branches, which are beside the two golden spouts that pour the golden oil out of themselves?” +\p +\v 13 He answered me, “Don’t you know what these are?” +\p I said, “No, my lord.” +\p +\v 14 Then he said, “These are the two anointed ones who stand by the Lord\f + \fr 4:14 \ft The word translated “Lord” is “Adonai.”\f* of the whole earth.” +\c 5 +\p +\v 1 Then again I lifted up my eyes and saw, and behold, a flying scroll. +\v 2 He said to me, “What do you see?” +\p I answered, “I see a flying scroll; its length is twenty cubits,\f + \fr 5:2 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* and its width ten cubits.” +\p +\v 3 Then he said to me, “This is the curse that goes out over the surface of the whole land, for everyone who steals shall be cut off according to it on the one side; and everyone who swears falsely shall be cut off according to it on the other side. +\v 4 I will cause it to go out,” says Yahweh of Armies, “and it will enter into the house of the thief, and into the house of him who swears falsely by my name; and it will remain in the middle of his house, and will destroy it with its timber and its stones.” +\p +\v 5 Then the angel who talked with me came forward and said to me, “Lift up now your eyes and see what this is that is appearing.” +\p +\v 6 I said, “What is it?” +\p He said, “This is the ephah\f + \fr 5:6 \ft An ephah is a measure of volume of about 22 liters, 5.8 U. S. gallons, or about 2/3 of a bushel. \f* basket that is appearing.” He said moreover, “This is their appearance in all the land— +\v 7 and behold, a lead cover weighing one talent\f + \fr 5:7 \ft A talent is about 30 kilograms or 66 pounds.\f* was lifted up—and there was a woman sitting in the middle of the ephah\f + \fr 5:7 \ft 1 ephah is about 22 liters or about 2/3 of a bushel\f* basket.” +\v 8 He said, “This is Wickedness;” and he threw her down into the middle of the ephah basket; and he threw the lead weight on its mouth. +\p +\v 9 Then I lifted up my eyes and saw, and behold, there were two women; and the wind was in their wings. Now they had wings like the wings of a stork, and they lifted up the ephah basket between earth and the sky. +\v 10 Then I said to the angel who talked with me, “Where are these carrying the ephah basket?” +\p +\v 11 He said to me, “To build her a house in the land of Shinar. When it is prepared, she will be set there in her own place.” +\c 6 +\p +\v 1 Again I lifted up my eyes, and saw, and behold, four chariots came out from between two mountains; and the mountains were mountains of bronze. +\v 2 In the first chariot were red horses. In the second chariot were black horses. +\v 3 In the third chariot were white horses. In the fourth chariot were dappled horses, all of them powerful. +\v 4 Then I asked the angel who talked with me, “What are these, my lord?” +\p +\v 5 The angel answered me, “These are the four winds of the sky, which go out from standing before the Lord of all the earth. +\v 6 The one with the black horses goes out toward the north country; and the white went out after them; and the dappled went out toward the south country.” +\v 7 The strong went out, and sought to go that they might walk back and forth through the earth. He said, “Go around and through the earth!” So they walked back and forth through the earth. +\p +\v 8 Then he called to me, and spoke to me, saying, “Behold, those who go toward the north country have quieted my spirit in the north country.” +\p +\v 9 Yahweh’s word came to me, saying, +\v 10 “Take of them of the captivity, even of Heldai, of Tobijah, and of Jedaiah; and come the same day, and go into the house of Josiah the son of Zephaniah, where they have come from Babylon. +\v 11 Yes, take silver and gold, and make crowns, and set them on the head of Joshua the son of Jehozadak, the high priest; +\v 12 and speak to him, saying, ‘Yahweh of Armies says, “Behold, the man whose name is the Branch! He will grow up out of his place; and he will build Yahweh’s temple. +\v 13 He will build Yahweh’s temple. He will bear the glory, and will sit and rule on his throne. He will be a priest on his throne. The counsel of peace will be between them both. +\v 14 The crowns shall be to Helem, to Tobijah, to Jedaiah, and to Hen the son of Zephaniah, for a memorial in Yahweh’s temple. +\p +\v 15 Those who are far off shall come and build in Yahweh’s temple; and you shall know that Yahweh of Armies has sent me to you. This will happen, if you will diligently obey Yahweh your God’s voice.”’”\f + \fr 6:15 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* +\c 7 +\p +\v 1 In the fourth year of King Darius, Yahweh’s word came to Zechariah in the fourth day of the ninth month, the month of Chislev. +\v 2 The people of Bethel sent Sharezer and Regem Melech and their men to entreat Yahweh’s favor, +\v 3 and to speak to the priests of the house of Yahweh of Armies and to the prophets, saying, “Should I weep in the fifth month, separating myself, as I have done these so many years?” +\p +\v 4 Then the word of Yahweh of Armies came to me, saying, +\v 5 “Speak to all the people of the land and to the priests, saying, ‘When you fasted and mourned in the fifth and in the seventh month for these seventy years, did you at all fast to me, really to me? +\v 6 When you eat and when you drink, don’t you eat for yourselves and drink for yourselves? +\v 7 Aren’t these the words which Yahweh proclaimed by the former prophets when Jerusalem was inhabited and in prosperity, and its cities around her, and the South and the lowland were inhabited?’” +\p +\v 8 Yahweh’s word came to Zechariah, saying, +\v 9 “Thus has Yahweh of Armies spoken, saying, ‘Execute true judgment, and show kindness and compassion every man to his brother. +\v 10 Don’t oppress the widow, the fatherless, the foreigner, nor the poor; and let none of you devise evil against his brother in your heart.’ +\v 11 But they refused to listen, and turned their backs, and stopped their ears, that they might not hear. +\v 12 Yes, they made their hearts as hard as flint, lest they might hear the law and the words which Yahweh of Armies had sent by his Spirit by the former prophets. Therefore great wrath came from Yahweh of Armies. +\v 13 It has come to pass that, as he called and they refused to listen, so they will call and I will not listen,” said Yahweh of Armies; +\v 14 “but I will scatter them with a whirlwind among all the nations which they have not known. Thus the land was desolate after them, so that no man passed through nor returned; for they made the pleasant land desolate.” +\c 8 +\p +\v 1 The word of Yahweh of Armies came to me. +\v 2 Yahweh of Armies says: “I am jealous for Zion with great jealousy, and I am jealous for her with great wrath.” +\p +\v 3 Yahweh says: “I have returned to Zion, and will dwell in the middle of Jerusalem. Jerusalem shall be called ‘The City of Truth;’ and the mountain of Yahweh of Armies, ‘The Holy Mountain.’” +\p +\v 4 Yahweh of Armies says: “Old men and old women will again dwell in the streets of Jerusalem, every man with his staff in his hand because of their old age. +\v 5 The streets of the city will be full of boys and girls playing in its streets.” +\p +\v 6 Yahweh of Armies says: “If it is marvelous in the eyes of the remnant of this people in those days, should it also be marvelous in my eyes?” says Yahweh of Armies. +\p +\v 7 Yahweh of Armies says: “Behold, I will save my people from the east country and from the west country. +\v 8 I will bring them, and they will dwell within Jerusalem. They will be my people, and I will be their God, in truth and in righteousness.” +\p +\v 9 Yahweh of Armies says: “Let your hands be strong, you who hear in these days these words from the mouth of the prophets who were in the day that the foundation of the house of Yahweh of Armies was laid, even the temple, that it might be built. +\v 10 For before those days there was no wages for man nor any wages for an animal, neither was there any peace to him who went out or came in, because of the adversary. For I set all men everyone against his neighbor. +\v 11 But now I will not be to the remnant of this people as in the former days,” says Yahweh of Armies. +\v 12 “For the seed of peace and the vine will yield its fruit, and the ground will give its increase, and the heavens will give their dew. I will cause the remnant of this people to inherit all these things. +\v 13 It shall come to pass that, as you were a curse among the nations, house of Judah and house of Israel, so I will save you, and you shall be a blessing. Don’t be afraid. Let your hands be strong.” +\p +\v 14 For Yahweh of Armies says: “As I thought to do evil to you when your fathers provoked me to wrath,” says Yahweh of Armies, “and I didn’t repent, +\v 15 so again I have thought in these days to do good to Jerusalem and to the house of Judah. Don’t be afraid. +\v 16 These are the things that you shall do: speak every man the truth with his neighbor. Execute the judgment of truth and peace in your gates, +\v 17 and let none of you devise evil in your hearts against his neighbor, and love no false oath; for all these are things that I hate,” says Yahweh. +\p +\v 18 The word of Yahweh of Armies came to me. +\v 19 Yahweh of Armies says: “The fasts of the fourth, fifth, seventh, and tenth months shall be for the house of Judah joy, gladness, and cheerful feasts. Therefore love truth and peace.” +\p +\v 20 Yahweh of Armies says: “Many peoples and the inhabitants of many cities will yet come. +\v 21 The inhabitants of one will go to another, saying, ‘Let’s go speedily to entreat the favor of Yahweh, and to seek Yahweh of Armies. I will go also.’ +\v 22 Yes, many peoples and strong nations will come to seek Yahweh of Armies in Jerusalem and to entreat the favor of Yahweh.” +\v 23 Yahweh of Armies says: “In those days, ten men out of all the languages of the nations will take hold of the skirt of him who is a Jew, saying, ‘We will go with you, for we have heard that God is with you.’” +\c 9 +\p +\v 1 A revelation. +\q1 Yahweh’s word is against the land of Hadrach, +\q2 and will rest upon Damascus— +\q1 for the eye of man +\q2 and of all the tribes of Israel is toward Yahweh— +\q1 +\v 2 and Hamath, also, which borders on it, +\q2 Tyre and Sidon, because they are very wise. +\q1 +\v 3 Tyre built herself a stronghold, +\q2 and heaped up silver like the dust, +\q2 and fine gold like the mire of the streets. +\q1 +\v 4 Behold, the Lord will dispossess her, +\q2 and he will strike her power in the sea; +\q2 and she will be devoured with fire. +\b +\q1 +\v 5 Ashkelon will see it, and fear; +\q2 Gaza also, and will writhe in agony; +\q2 as will Ekron, for her expectation will be disappointed; +\q2 and the king will perish from Gaza, +\q2 and Ashkelon will not be inhabited. +\q1 +\v 6 Foreigners will dwell in Ashdod, +\q2 and I will cut off the pride of the Philistines. +\q1 +\v 7 I will take away his blood out of his mouth, +\q2 and his abominations from between his teeth; +\q1 and he also will be a remnant for our God; +\q2 and he will be as a chieftain in Judah, +\q2 and Ekron as a Jebusite. +\q1 +\v 8 I will encamp around my house against the army, +\q2 that no one pass through or return; +\q2 and no oppressor will pass through them any more: +\q2 for now I have seen with my eyes. +\b +\q1 +\v 9 Rejoice greatly, daughter of Zion! +\q2 Shout, daughter of Jerusalem! +\q1 Behold, your King comes to you! +\q2 He is righteous, and having salvation; +\q2 lowly, and riding on a donkey, +\q2 even on a colt, the foal of a donkey. +\q1 +\v 10 I will cut off the chariot from Ephraim +\q2 and the horse from Jerusalem. +\q1 The battle bow will be cut off; +\q2 and he will speak peace to the nations. +\q1 His dominion will be from sea to sea, +\q2 and from the River to the ends of the earth. +\b +\q1 +\v 11 As for you also, +\q2 because of the blood of your covenant, +\q2 I have set free your prisoners from the pit in which is no water. +\q1 +\v 12 Turn to the stronghold, you prisoners of hope! +\q2 Even today I declare that I will restore double to you. +\q1 +\v 13 For indeed I bend Judah as a bow for me. +\q2 I have loaded the bow with Ephraim. +\q1 I will stir up your sons, Zion, +\q2 against your sons, Greece, +\q2 and will make you like the sword of a mighty man. +\b +\q1 +\v 14 Yahweh will be seen over them. +\q2 His arrow will flash like lightning. +\q1 The Lord Yahweh will blow the trumpet, +\q2 and will go with whirlwinds of the south. +\q1 +\v 15 Yahweh of Armies will defend them. +\q2 They will destroy and overcome with sling stones. +\q1 They will drink, and roar as through wine. +\q2 They will be filled like bowls, +\q2 like the corners of the altar. +\b +\q1 +\v 16 Yahweh their God will save them in that day as the flock of his people; +\q2 for they are like the jewels of a crown, +\q2 lifted on high over his land. +\q1 +\v 17 For how great is his goodness, +\q2 and how great is his beauty! +\q1 Grain will make the young men flourish, +\q2 and new wine the virgins. +\c 10 +\q1 +\v 1 Ask of Yahweh rain in the spring time, +\q2 Yahweh who makes storm clouds, +\q2 and he gives rain showers to everyone for the plants in the field. +\q1 +\v 2 For the teraphim\f + \fr 10:2 \ft teraphim were household idols that may have been associated with inheritance rights to the household property.\f* have spoken vanity, +\q2 and the diviners have seen a lie; +\q2 and they have told false dreams. +\q1 They comfort in vain. +\q2 Therefore they go their way like sheep. +\q2 They are oppressed, because there is no shepherd. +\b +\q1 +\v 3 My anger is kindled against the shepherds, +\q2 and I will punish the male goats, +\q2 for Yahweh of Armies has visited his flock, the house of Judah, +\q2 and will make them as his majestic horse in the battle. +\q1 +\v 4 From him will come the cornerstone, +\q2 from him the tent peg, +\q2 from him the battle bow, +\q2 from him every ruler together. +\q2 +\v 5 They will be as mighty men, +\q2 treading down muddy streets in the battle. +\q1 They will fight, because Yahweh is with them. +\q2 The riders on horses will be confounded. +\b +\q1 +\v 6 “I will strengthen the house of Judah, +\q2 and I will save the house of Joseph. +\q1 I will bring them back, +\q2 for I have mercy on them. +\q1 They will be as though I had not cast them off, +\q2 for I am Yahweh their God, and I will hear them. +\q1 +\v 7 Ephraim will be like a mighty man, +\q2 and their heart will rejoice as through wine. +\q1 Yes, their children will see it and rejoice. +\q2 Their heart will be glad in Yahweh. +\q1 +\v 8 I will signal for them and gather them, +\q2 for I have redeemed them. +\q2 They will increase as they were before. +\q1 +\v 9 I will sow them among the peoples. +\q2 They will remember me in far countries. +\q2 They will live with their children and will return. +\q1 +\v 10 I will bring them again also out of the land of Egypt, +\q2 and gather them out of Assyria. +\q1 I will bring them into the land of Gilead and Lebanon; +\q2 and there won’t be room enough for them. +\q1 +\v 11 He will pass through the sea of affliction, +\q2 and will strike the waves in the sea, +\q2 and all the depths of the Nile will dry up; +\q2 and the pride of Assyria will be brought down, +\q2 and the scepter of Egypt will depart. +\q1 +\v 12 I will strengthen them in Yahweh. +\q2 They will walk up and down in his name,” says Yahweh. +\c 11 +\q1 +\v 1 Open your doors, Lebanon, +\q2 that the fire may devour your cedars. +\q1 +\v 2 Wail, cypress tree, for the cedar has fallen, +\q2 because the stately ones are destroyed. +\q1 Wail, you oaks of Bashan, +\q2 for the strong forest has come down. +\q1 +\v 3 A voice of the wailing of the shepherds! +\q2 For their glory is destroyed—a voice of the roaring of young lions! +\q2 For the pride of the Jordan is ruined. +\p +\v 4 Yahweh my God says: “Feed the flock of slaughter. +\v 5 Their buyers slaughter them and go unpunished. Those who sell them say, ‘Blessed be Yahweh, for I am rich;’ and their own shepherds don’t pity them. +\v 6 For I will no more pity the inhabitants of the land,” says Yahweh; “but, behold, I will deliver every one of the men into his neighbor’s hand and into the hand of his king. They will strike the land, and out of their hand I will not deliver them.” +\p +\v 7 So I fed the flock to be slaughtered, especially the oppressed of the flock. I took for myself two staffs. The one I called “Favor” and the other I called “Union”, and I fed the flock. +\v 8 I cut off the three shepherds in one month; for my soul was weary of them, and their soul also loathed me. +\v 9 Then I said, “I will not feed you. That which dies, let it die; and that which is to be cut off, let it be cut off; and let those who are left eat each other’s flesh.” +\v 10 I took my staff Favor and cut it apart, that I might break my covenant that I had made with all the peoples. +\v 11 It was broken in that day; and thus the poor of the flock that listened to me knew that it was Yahweh’s word. +\v 12 I said to them, “If you think it best, give me my wages; and if not, keep them.” So they weighed for my wages thirty pieces of silver. +\v 13 Yahweh said to me, “Throw it to the potter—the handsome price that I was valued at by them!” I took the thirty pieces of silver and threw them to the potter in Yahweh’s house. +\v 14 Then I cut apart my other staff, Union, that I might break the brotherhood between Judah and Israel. +\p +\v 15 Yahweh said to me, “Take for yourself yet again the equipment of a foolish shepherd. +\v 16 For, behold, I will raise up a shepherd in the land who will not visit those who are cut off, neither will seek those who are scattered, nor heal that which is broken, nor feed that which is sound; but he will eat the meat of the fat sheep, and will tear their hoofs in pieces. +\v 17 Woe to the worthless shepherd who leaves the flock! The sword will strike his arm and his right eye. His arm will be completely withered, and his right eye will be totally blinded!” +\c 12 +\p +\v 1 A revelation of Yahweh’s word concerning Israel: Yahweh, who stretches out the heavens and lays the foundation of the earth, and forms the spirit of man within him says: +\v 2 “Behold, I will make Jerusalem a cup of reeling to all the surrounding peoples, and it will also be on Judah in the siege against Jerusalem. +\v 3 It will happen in that day that I will make Jerusalem a burdensome stone for all the peoples. All who burden themselves with it will be severely wounded, and all the nations of the earth will be gathered together against it. +\v 4 In that day,” says Yahweh, “I will strike every horse with terror and his rider with madness. I will open my eyes on the house of Judah, and will strike every horse of the peoples with blindness. +\v 5 The chieftains of Judah will say in their heart, ‘The inhabitants of Jerusalem are my strength in Yahweh of Armies their God.’ +\p +\v 6 In that day I will make the chieftains of Judah like a pan of fire among wood, and like a flaming torch among sheaves. They will devour all the surrounding peoples on the right hand and on the left; and Jerusalem will yet again dwell in their own place, even in Jerusalem. +\p +\v 7 Yahweh also will save the tents of Judah first, that the glory of David’s house and the glory of the inhabitants of Jerusalem not be magnified above Judah. +\v 8 In that day Yahweh will defend the inhabitants of Jerusalem. He who is feeble among them at that day will be like David, and David’s house will be like God, like Yahweh’s angel before them. +\v 9 It will happen in that day, that I will seek to destroy all the nations that come against Jerusalem. +\p +\v 10 I will pour on David’s house and on the inhabitants of Jerusalem the spirit of grace and of supplication. They will look to me\f + \fr 12:10 \ft After “me”, the Hebrew has the two letters “Aleph Tav” (the first and last letters of the Hebrew alphabet), not as a word, but as a grammatical marker.\f* whom they have pierced; and they shall mourn for him as one mourns for his only son, and will grieve bitterly for him as one grieves for his firstborn. +\v 11 In that day there will be a great mourning in Jerusalem, like the mourning of Hadadrimmon in the valley of Megiddo. +\v 12 The land will mourn, every family apart; the family of David’s house apart, and their wives apart; the family of the house of Nathan apart, and their wives apart; +\v 13 the family of the house of Levi apart, and their wives apart; the family of the Shimeites apart, and their wives apart; +\v 14 all the families who remain, every family apart, and their wives apart. +\c 13 +\p +\v 1 “In that day there will be a fountain opened to David’s house and to the inhabitants of Jerusalem, for sin and for uncleanness. +\p +\v 2 It will come to pass in that day, says Yahweh of Armies, that I will cut off the names of the idols out of the land, and they will be remembered no more. I will also cause the prophets and the spirit of impurity to pass out of the land. +\v 3 It will happen that when anyone still prophesies, then his father and his mother who bore him will tell him, ‘You must die, because you speak lies in Yahweh’s name;’ and his father and his mother who bore him will stab him when he prophesies. +\v 4 It will happen in that day that the prophets will each be ashamed of his vision when he prophesies; they won’t wear a hairy mantle to deceive, +\v 5 but he will say, ‘I am no prophet, I am a tiller of the ground; for I have been made a bondservant from my youth.’ +\v 6 One will say to him, ‘What are these wounds between your arms?’ Then he will answer, ‘Those with which I was wounded in the house of my friends.’ +\b +\q1 +\v 7 “Awake, sword, against my shepherd, +\q2 and against the man who is close to me,” says Yahweh of Armies. +\q1 “Strike the shepherd, and the sheep will be scattered; +\q2 and I will turn my hand against the little ones. +\q1 +\v 8 It shall happen that in all the land,” says Yahweh, +\q2 “two parts in it will be cut off and die; +\q2 but the third will be left in it. +\q1 +\v 9 I will bring the third part into the fire, +\q2 and will refine them as silver is refined, +\q2 and will test them like gold is tested. +\q1 They will call on my name, and I will hear them. +\q2 I will say, ‘It is my people;’ +\q2 and they will say, ‘Yahweh is my God.’” +\c 14 +\p +\v 1 Behold, a day of Yahweh comes, when your plunder will be divided within you. +\v 2 For I will gather all nations against Jerusalem to battle; and the city will be taken, the houses rifled, and the women ravished. Half of the city will go out into captivity, and the rest of the people will not be cut off from the city. +\v 3 Then Yahweh will go out and fight against those nations, as when he fought in the day of battle. +\v 4 His feet will stand in that day on the Mount of Olives, which is before Jerusalem on the east; and the Mount of Olives will be split in two from east to west, making a very great valley. Half of the mountain will move toward the north, and half of it toward the south. +\v 5 You shall flee by the valley of my mountains, for the valley of the mountains shall reach to Azel. Yes, you shall flee, just like you fled from before the earthquake in the days of Uzziah king of Judah. Yahweh my God will come, and all the holy ones with you.\f + \fr 14:5 \ft Septuagint reads “him” instead of “you”.\f* +\p +\v 6 It will happen in that day that there will not be light, cold, or frost. +\v 7 It will be a unique day which is known to Yahweh—not day, and not night; but it will come to pass that at evening time there will be light. +\p +\v 8 It will happen in that day that living waters will go out from Jerusalem, half of them toward the eastern sea, and half of them toward the western sea. It will be so in summer and in winter. +\p +\v 9 Yahweh will be King over all the earth. In that day Yahweh will be one, and his name one. +\p +\v 10 All the land will be made like the Arabah, from Geba to Rimmon south of Jerusalem; and she will be lifted up and will dwell in her place, from Benjamin’s gate to the place of the first gate, to the corner gate, and from the tower of Hananel to the king’s wine presses. +\v 11 Men will dwell therein, and there will be no more curse; but Jerusalem will dwell safely. +\p +\v 12 This will be the plague with which Yahweh will strike all the peoples who have fought against Jerusalem: their flesh will consume away while they stand on their feet, and their eyes will consume away in their sockets, and their tongue will consume away in their mouth. +\v 13 It will happen in that day that a great panic from Yahweh will be among them; and they will each seize the hand of his neighbor, and his hand will rise up against the hand of his neighbor. +\v 14 Judah also will fight at Jerusalem; and the wealth of all the surrounding nations will be gathered together: gold, silver, and clothing, in great abundance. +\p +\v 15 A plague like this will fall on the horse, on the mule, on the camel, on the donkey, and on all the animals that will be in those camps. +\p +\v 16 It will happen that everyone who is left of all the nations that came against Jerusalem will go up from year to year to worship the King, Yahweh of Armies, and to keep the feast of booths. +\v 17 It will be that whoever of all the families of the earth doesn’t go up to Jerusalem to worship the King, Yahweh of Armies, on them there will be no rain. +\v 18 If the family of Egypt doesn’t go up and doesn’t come, neither will it rain on them. This will be the plague with which Yahweh will strike the nations that don’t go up to keep the feast of booths. +\v 19 This will be the punishment of Egypt and the punishment of all the nations that don’t go up to keep the feast of booths. +\p +\v 20 In that day there will be inscribed on the bells of the horses, “HOLY TO YAHWEH”; and the pots in Yahweh’s house will be like the bowls before the altar. +\v 21 Yes, every pot in Jerusalem and in Judah will be holy to Yahweh of Armies; and all those who sacrifice will come and take of them, and cook in them. In that day there will no longer be a Canaanite\f + \fr 14:21 \ft or, merchant\f* in the house of Yahweh of Armies. diff --git a/c-sharp/assets/WEB/39MALengWEBUS.SFM b/c-sharp/assets/WEB/39MALengWEBUS.SFM new file mode 100644 index 0000000000..88f1379917 --- /dev/null +++ b/c-sharp/assets/WEB/39MALengWEBUS.SFM @@ -0,0 +1,88 @@ +\id MAL 39-MAL-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Malachi +\toc1 The Book of Malachi +\toc2 Malachi +\toc3 Malachi +\mt2 The Book of +\mt1 Malachi +\c 1 +\p +\v 1 A revelation, Yahweh’s\f + \fr 1:1 \ft “Yahweh” is God’s proper Name, sometimes rendered “LORD” (all caps) in other translations.\f* word to Israel by Malachi. +\p +\v 2 “I have loved you,” says Yahweh. +\p Yet you say, “How have you loved us?” +\p “Wasn’t Esau Jacob’s brother?” says Yahweh, “Yet I loved Jacob; +\v 3 but Esau I hated, and made his mountains a desolation, and gave his heritage to the jackals of the wilderness.” +\v 4 Whereas Edom says, “We are beaten down, but we will return and build the waste places,” Yahweh of Armies says, “They shall build, but I will throw down; and men will call them ‘The Wicked Land,’ even the people against whom Yahweh shows wrath forever.” +\p +\v 5 Your eyes will see, and you will say, “Yahweh is great—even beyond the border of Israel!” +\p +\v 6 “A son honors his father, and a servant his master. If I am a father, then where is my honor? And if I am a master, where is the respect due me?” says Yahweh of Armies to you priests who despise my name. “You say, ‘How have we despised your name?’ +\v 7 You offer polluted bread on my altar. You say, ‘How have we polluted you?’ In that you say, ‘Yahweh’s table is contemptible.’ +\v 8 When you offer the blind for sacrifice, isn’t that evil? And when you offer the lame and sick, isn’t that evil? Present it now to your governor! Will he be pleased with you? Or will he accept your person?” says Yahweh of Armies. +\p +\v 9 “Now, please entreat the favor of God,\f + \fr 1:9 \ft The Hebrew word rendered “God” is “אֱלֹהִ֑ים” (Elohim).\f* that he may be gracious to us. With this, will he accept any of you?” says Yahweh of Armies. +\p +\v 10 “Oh that there were one among you who would shut the doors, that you might not kindle fire on my altar in vain! I have no pleasure in you,” says Yahweh of Armies, “neither will I accept an offering at your hand. +\v 11 For from the rising of the sun even to its going down, my name is great among the nations, and in every place incense will be offered to my name, and a pure offering; for my name is great among the nations,” says Yahweh of Armies. +\v 12 “But you profane it when you say, ‘Yahweh’s table is polluted, and its fruit, even its food, is contemptible.’ +\v 13 You say also, ‘Behold,\f + \fr 1:13 \ft “Behold”, from “הִנֵּה”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* what a weariness it is!’ And you have sniffed at it”, says Yahweh of Armies; “and you have brought that which was taken by violence, the lame, and the sick; thus you bring the offering. Should I accept this at your hand?” says Yahweh. +\p +\v 14 “But the deceiver is cursed who has in his flock a male, and vows and sacrifices to the Lord\f + \fr 1:14 \ft The word translated “Lord” is “Adonai.”\f* a defective thing; for I am a great King,” says Yahweh of Armies, “and my name is awesome among the nations.” +\c 2 +\p +\v 1 “Now, you priests, this commandment is for you. +\v 2 If you will not listen, and if you will not take it to heart, to give glory to my name,” says Yahweh of Armies, “then I will send the curse on you, and I will curse your blessings. Indeed, I have cursed them already, because you do not take it to heart. +\v 3 Behold, I will rebuke your offspring,\f + \fr 2:3 \ft or, seed\f* and will spread dung on your faces, even the dung of your feasts; and you will be taken away with it. +\v 4 You will know that I have sent this commandment to you, that my covenant may be with Levi,” says Yahweh of Armies. +\v 5 “My covenant was with him of life and peace; and I gave them to him that he might be reverent toward me; and he was reverent toward me, and stood in awe of my name. +\v 6 The law of truth was in his mouth, and unrighteousness was not found in his lips. He walked with me in peace and uprightness, and turned many away from iniquity. +\v 7 For the priest’s lips should keep knowledge, and they should seek the law at his mouth; for he is the messenger of Yahweh of Armies. +\v 8 But you have turned away from the path. You have caused many to stumble in the law. You have corrupted the covenant of Levi,” says Yahweh of Armies. +\v 9 “Therefore I have also made you contemptible and wicked before all the people, according to the way you have not kept my ways, but have had respect for persons in the law. +\v 10 Don’t we all have one father? Hasn’t one God created us? Why do we deal treacherously every man against his brother, profaning the covenant of our fathers? +\v 11 Judah has dealt treacherously, and an abomination is committed in Israel and in Jerusalem; for Judah has profaned the holiness of Yahweh which he loves, and has married the daughter of a foreign god. +\v 12 Yahweh will cut off the man who does this, him who wakes and him who answers, out of the tents of Jacob and him who offers an offering to Yahweh of Armies. +\p +\v 13 “This again you do: you cover Yahweh’s altar with tears, with weeping, and with sighing, because he doesn’t regard the offering any more, neither receives it with good will at your hand. +\v 14 Yet you say, ‘Why?’ Because Yahweh has been witness between you and the wife of your youth, against whom you have dealt treacherously, though she is your companion and the wife of your covenant. +\v 15 Did he not make you one, although he had the residue of the Spirit? Why one? He sought godly offspring. Therefore take heed to your spirit, and let no one deal treacherously against the wife of his youth. +\v 16 One who hates and divorces”, says Yahweh, the God of Israel, “covers his garment with violence!” says Yahweh of Armies. “Therefore pay attention to your spirit, that you don’t be unfaithful. +\p +\v 17 You have wearied Yahweh with your words. Yet you say, ‘How have we wearied him?’ In that you say, ‘Everyone who does evil is good in Yahweh’s sight, and he delights in them;’ or ‘Where is the God of justice?’ +\c 3 +\p +\v 1 “Behold, I send my messenger, and he will prepare the way before me! The Lord, whom you seek, will suddenly come to his temple. Behold, the messenger of the covenant, whom you desire, is coming!” says Yahweh of Armies. +\v 2 “But who can endure the day of his coming? And who will stand when he appears? For he is like a refiner’s fire, and like launderers’ soap; +\v 3 and he will sit as a refiner and purifier of silver, and he will purify the sons of Levi, and refine them as gold and silver; and they shall offer to Yahweh offerings in righteousness. +\v 4 Then the offering of Judah and Jerusalem will be pleasant to Yahweh as in the days of old and as in ancient years. +\p +\v 5 I will come near to you to judgment. I will be a swift witness against the sorcerers, against the adulterers, against the perjurers, and against those who oppress the hireling in his wages, the widow, and the fatherless, and who deprive the foreigner of justice, and don’t fear me,” says Yahweh of Armies. +\p +\v 6 “For I, Yahweh, don’t change; therefore you, sons of Jacob, are not consumed. +\v 7 From the days of your fathers you have turned away from my ordinances and have not kept them. Return to me, and I will return to you,” says Yahweh of Armies. “But you say, ‘How shall we return?’ +\p +\v 8 Will a man rob God? Yet you rob me! But you say, ‘How have we robbed you?’ In tithes and offerings. +\v 9 You are cursed with the curse; for you rob me, even this whole nation. +\v 10 Bring the whole tithe into the storehouse, that there may be food in my house, and test me now in this,” says Yahweh of Armies, “if I will not open you the windows of heaven, and pour you out a blessing, that there will not be enough room for. +\v 11 I will rebuke the devourer for your sakes, and he shall not destroy the fruits of your ground; neither shall your vine cast its fruit before its time in the field,” says Yahweh of Armies. +\v 12 “All nations shall call you blessed, for you will be a delightful land,” says Yahweh of Armies. +\p +\v 13 “Your words have been harsh against me,” says Yahweh. “Yet you say, ‘What have we spoken against you?’ +\v 14 You have said, ‘It is vain to serve God,’ and ‘What profit is it that we have followed his instructions and that we have walked mournfully before Yahweh of Armies? +\v 15 Now we call the proud happy; yes, those who work wickedness are built up; yes, they tempt God, and escape.’ +\p +\v 16 Then those who feared Yahweh spoke one with another; and Yahweh listened and heard, and a book of memory was written before him for those who feared Yahweh and who honored his name. +\v 17 They shall be mine,” says Yahweh of Armies, “my own possession in the day that I make. I will spare them, as a man spares his own son who serves him. +\v 18 Then you shall return and discern between the righteous and the wicked, between him who serves God and him who doesn’t serve him. +\c 4 +\p +\v 1 “For behold, the day comes, burning like a furnace, when all the proud and all who work wickedness will be stubble. The day that comes will burn them up,” says Yahweh of Armies, “so that it will leave them neither root nor branch. +\v 2 But to you who fear my name shall the sun of righteousness arise with healing in its wings. You will go out and leap like calves of the stall. +\v 3 You shall tread down the wicked; for they will be ashes under the soles of your feet in the day that I make,” says Yahweh of Armies. +\p +\v 4 “Remember the law of Moses my servant, which I commanded to him in Horeb for all Israel, even statutes and ordinances. +\p +\v 5 Behold, I will send you Elijah the prophet before the great and terrible day of Yahweh comes. +\v 6 He will turn the hearts of the fathers to the children and the hearts of the children to their fathers, lest I come and strike the earth with a curse.” diff --git a/c-sharp/assets/WEB/41MATengWEBUS.SFM b/c-sharp/assets/WEB/41MATengWEBUS.SFM new file mode 100644 index 0000000000..8dcd79499a --- /dev/null +++ b/c-sharp/assets/WEB/41MATengWEBUS.SFM @@ -0,0 +1,1625 @@ +\id MAT 40-MAT-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Matthew +\toc1 The Good News According to Matthew +\toc2 Matthew +\toc3 Matthew +\mt2 The Good News According to +\mt1 Matthew +\c 1 +\p +\v 1 The book of the genealogy of Jesus Christ,\f + \fr 1:1 \ft Messiah (Hebrew) and Christ (Greek) both mean “Anointed One”\f* the son of David, the son of Abraham. +\p +\v 2 Abraham became the father of Isaac. Isaac became the father of Jacob. Jacob became the father of Judah and his brothers. +\v 3 Judah became the father of Perez and Zerah by Tamar. Perez became the father of Hezron. Hezron became the father of Ram. +\v 4 Ram became the father of Amminadab. Amminadab became the father of Nahshon. Nahshon became the father of Salmon. +\v 5 Salmon became the father of Boaz by Rahab. Boaz became the father of Obed by Ruth. Obed became the father of Jesse. +\v 6 Jesse became the father of King David. David the king\f + \fr 1:6 \ft NU omits “the king”.\f* became the father of Solomon by her who had been Uriah’s wife. +\v 7 Solomon became the father of Rehoboam. Rehoboam became the father of Abijah. Abijah became the father of Asa. +\v 8 Asa became the father of Jehoshaphat. Jehoshaphat became the father of Joram. Joram became the father of Uzziah. +\v 9 Uzziah became the father of Jotham. Jotham became the father of Ahaz. Ahaz became the father of Hezekiah. +\v 10 Hezekiah became the father of Manasseh. Manasseh became the father of Amon. Amon became the father of Josiah. +\v 11 Josiah became the father of Jechoniah and his brothers at the time of the exile to Babylon. +\p +\v 12 After the exile to Babylon, Jechoniah became the father of Shealtiel. Shealtiel became the father of Zerubbabel. +\v 13 Zerubbabel became the father of Abiud. Abiud became the father of Eliakim. Eliakim became the father of Azor. +\v 14 Azor became the father of Zadok. Zadok became the father of Achim. Achim became the father of Eliud. +\v 15 Eliud became the father of Eleazar. Eleazar became the father of Matthan. Matthan became the father of Jacob. +\v 16 Jacob became the father of Joseph, the husband of Mary, from whom was born Jesus,\f + \fr 1:16 \ft “Jesus” means “Salvation”.\f* who is called Christ. +\p +\v 17 So all the generations from Abraham to David are fourteen generations; from David to the exile to Babylon fourteen generations; and from the carrying away to Babylon to the Christ, fourteen generations. +\p +\v 18 Now the birth of Jesus Christ was like this: After his mother, Mary, was engaged to Joseph, before they came together, she was found pregnant by the Holy Spirit. +\v 19 Joseph, her husband, being a righteous man, and not willing to make her a public example, intended to put her away secretly. +\v 20 But when he thought about these things, behold,\f + \fr 1:20 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* an angel of the Lord appeared to him in a dream, saying, “Joseph, son of David, don’t be afraid to take to yourself Mary as your wife, for that which is conceived in her is of the Holy Spirit. +\v 21 She shall give birth to a son. You shall name him Jesus,\f + \fr 1:21 \ft “Jesus” means “Salvation”.\f* for it is he who shall save his people from their sins.” +\p +\v 22 Now all this has happened that it might be fulfilled which was spoken by the Lord through the prophet, saying, +\q1 +\v 23 “Behold, the virgin shall be with child, +\q2 and shall give birth to a son. +\q1 They shall call his name Immanuel,” +\q2 which is, being interpreted, “God with us.”\x + \xo 1:23 \xt Isaiah 7:14\x* +\p +\v 24 Joseph arose from his sleep, and did as the angel of the Lord commanded him, and took his wife to himself; +\v 25 and didn’t know her sexually until she had given birth to her firstborn son. He named him Jesus. +\c 2 +\p +\v 1 Now when Jesus was born in Bethlehem of Judea in the days of King Herod, behold, wise men\f + \fr 2:1 \ft The word for “wise men” (magoi) can also mean teachers, scientists, physicians, astrologers, seers, interpreters of dreams, or sorcerers.\f* from the east came to Jerusalem, saying, +\v 2 “Where is he who is born King of the Jews? For we saw his star in the east, and have come to worship him.” +\v 3 When King Herod heard it, he was troubled, and all Jerusalem with him. +\v 4 Gathering together all the chief priests and scribes of the people, he asked them where the Christ would be born. +\v 5 They said to him, “In Bethlehem of Judea, for this is written through the prophet, +\q1 +\v 6 ‘You Bethlehem, land of Judah, +\q2 are in no way least among the princes of Judah; +\q1 for out of you shall come a governor +\q2 who shall shepherd my people, Israel.’”\x + \xo 2:6 \xt Micah 5:2\x* +\p +\v 7 Then Herod secretly called the wise men, and learned from them exactly what time the star appeared. +\v 8 He sent them to Bethlehem, and said, “Go and search diligently for the young child. When you have found him, bring me word, so that I also may come and worship him.” +\p +\v 9 They, having heard the king, went their way; and behold, the star, which they saw in the east, went before them until it came and stood over where the young child was. +\v 10 When they saw the star, they rejoiced with exceedingly great joy. +\v 11 They came into the house and saw the young child with Mary, his mother, and they fell down and worshiped him. Opening their treasures, they offered to him gifts: gold, frankincense, and myrrh. +\v 12 Being warned in a dream not to return to Herod, they went back to their own country another way. +\p +\v 13 Now when they had departed, behold, an angel of the Lord appeared to Joseph in a dream, saying, “Arise and take the young child and his mother, and flee into Egypt, and stay there until I tell you, for Herod will seek the young child to destroy him.” +\p +\v 14 He arose and took the young child and his mother by night and departed into Egypt, +\v 15 and was there until the death of Herod, that it might be fulfilled which was spoken by the Lord through the prophet, saying, “Out of Egypt I called my son.”\x + \xo 2:15 \xt Hosea 11:1\x* +\p +\v 16 Then Herod, when he saw that he was mocked by the wise men, was exceedingly angry, and sent out and killed all the male children who were in Bethlehem and in all the surrounding countryside, from two years old and under, according to the exact time which he had learned from the wise men. +\v 17 Then that which was spoken by Jeremiah the prophet was fulfilled, saying, +\q1 +\v 18 “A voice was heard in Ramah, +\q2 lamentation, weeping and great mourning, +\q1 Rachel weeping for her children; +\q2 she wouldn’t be comforted, +\q2 because they are no more.”\x + \xo 2:18 \xt Jeremiah 31:15\x* +\p +\v 19 But when Herod was dead, behold, an angel of the Lord appeared in a dream to Joseph in Egypt, saying, +\v 20 “Arise and take the young child and his mother, and go into the land of Israel, for those who sought the young child’s life are dead.” +\p +\v 21 He arose and took the young child and his mother, and came into the land of Israel. +\v 22 But when he heard that Archelaus was reigning over Judea in the place of his father, Herod, he was afraid to go there. Being warned in a dream, he withdrew into the region of Galilee, +\v 23 and came and lived in a city called Nazareth; that it might be fulfilled which was spoken through the prophets that he will be called a Nazarene. +\c 3 +\p +\v 1 In those days, John the Baptizer came, preaching in the wilderness of Judea, saying, +\v 2 “Repent, for the Kingdom of Heaven is at hand!” +\v 3 For this is he who was spoken of by Isaiah the prophet, saying, +\q1 “The voice of one crying in the wilderness, +\q2 make the way of the Lord ready! +\q2 Make his paths straight!”\x + \xo 3:3 \xt Isaiah 40:3\x* +\p +\v 4 Now John himself wore clothing made of camel’s hair with a leather belt around his waist. His food was locusts and wild honey. +\v 5 Then people from Jerusalem, all of Judea, and all the region around the Jordan went out to him. +\v 6 They were baptized by him in the Jordan, confessing their sins. +\p +\v 7 But when he saw many of the Pharisees and Sadducees coming for his baptism, he said to them, “You offspring of vipers, who warned you to flee from the wrath to come? +\v 8 Therefore produce fruit worthy of repentance! +\v 9 Don’t think to yourselves, ‘We have Abraham for our father,’ for I tell you that God is able to raise up children to Abraham from these stones. +\v 10 Even now the ax lies at the root of the trees. Therefore every tree that doesn’t produce good fruit is cut down, and cast into the fire. +\p +\v 11 “I indeed baptize you in water for repentance, but he who comes after me is mightier than I, whose sandals I am not worthy to carry. He will baptize you in the Holy Spirit.\f + \fr 3:11 \ft TR and NU add “and with fire” \f* +\v 12 His winnowing fork is in his hand, and he will thoroughly cleanse his threshing floor. He will gather his wheat into the barn, but the chaff he will burn up with unquenchable fire.” +\p +\v 13 Then Jesus came from Galilee to the Jordan\f + \fr 3:13 \ft i.e., the Jordan River\f* to John, to be baptized by him. +\v 14 But John would have hindered him, saying, “I need to be baptized by you, and you come to me?” +\p +\v 15 But Jesus, answering, said to him, \wj “Allow it now, for this is the fitting way for us to fulfill all righteousness.”\wj* Then he allowed him. +\p +\v 16 Jesus, when he was baptized, went up directly from the water: and behold, the heavens were opened to him. He saw the Spirit of God descending as a dove, and coming on him. +\v 17 Behold, a voice out of the heavens said, “This is my beloved Son, with whom I am well pleased.” +\c 4 +\p +\v 1 Then Jesus was led up by the Spirit into the wilderness to be tempted by the devil. +\v 2 When he had fasted forty days and forty nights, he was hungry afterward. +\v 3 The tempter came and said to him, “If you are the Son of God, command that these stones become bread.” +\p +\v 4 But he answered, \wj “It is written, ‘Man shall not live by bread alone, but by every word that proceeds out of God’s mouth.’”\wj*\x + \xo 4:4 \xt Deuteronomy 8:3\x* +\p +\v 5 Then the devil took him into the holy city. He set him on the pinnacle of the temple, +\v 6 and said to him, “If you are the Son of God, throw yourself down, for it is written, +\q1 ‘He will command his angels concerning you,’ and, +\q1 ‘On their hands they will bear you up, +\q2 so that you don’t dash your foot against a stone.’”\x + \xo 4:6 \xt Psalm 91:11-12 \x* +\p +\v 7 Jesus said to him, \wj “Again, it is written, ‘You shall not test the Lord, your God.’”\wj*\x + \xo 4:7 \xt Deuteronomy 6:16\x* +\p +\v 8 Again, the devil took him to an exceedingly high mountain, and showed him all the kingdoms of the world and their glory. +\v 9 He said to him, “I will give you all of these things, if you will fall down and worship me.” +\p +\v 10 Then Jesus said to him, \wj “Get behind me,\wj*\f + \fr 4:10 \ft TR and NU read “Go away” instead of “Get behind me”\f* \wj Satan! For it is written, ‘You shall worship the Lord your God, and you shall serve him only.’”\wj* \x + \xo 4:10 \xt Deuteronomy 6:13\x* +\p +\v 11 Then the devil left him, and behold, angels came and served him. +\p +\v 12 Now when Jesus heard that John was delivered up, he withdrew into Galilee. +\v 13 Leaving Nazareth, he came and lived in Capernaum, which is by the sea, in the region of Zebulun and Naphtali, +\v 14 that it might be fulfilled which was spoken through Isaiah the prophet, saying, +\q1 +\v 15 “The land of Zebulun and the land of Naphtali, +\q2 toward the sea, beyond the Jordan, +\q2 Galilee of the Gentiles, +\q1 +\v 16 the people who sat in darkness saw a great light; +\q2 to those who sat in the region and shadow of death, +\q2 to them light has dawned.”\x + \xo 4:16 \xt Isaiah 9:1-2\x* +\p +\v 17 From that time, Jesus began to preach, and to say, \wj “Repent! For the Kingdom of Heaven is at hand.”\wj* +\p +\v 18 Walking by the sea of Galilee, he\f + \fr 4:18 \ft TR reads “Jesus” instead of “he” \f* saw two brothers: Simon, who is called Peter, and Andrew, his brother, casting a net into the sea; for they were fishermen. +\v 19 He said to them, \wj “Come after me, and I will make you fishers for men.”\wj* +\p +\v 20 They immediately left their nets and followed him. +\v 21 Going on from there, he saw two other brothers, James the son of Zebedee, and John his brother, in the boat with Zebedee their father, mending their nets. He called them. +\v 22 They immediately left the boat and their father, and followed him. +\p +\v 23 Jesus went about in all Galilee, teaching in their synagogues, preaching the Good News of the Kingdom, and healing every disease and every sickness among the people. +\v 24 The report about him went out into all Syria. They brought to him all who were sick, afflicted with various diseases and torments, possessed with demons, epileptics, and paralytics; and he healed them. +\v 25 Great multitudes from Galilee, Decapolis, Jerusalem, Judea, and from beyond the Jordan followed him. +\c 5 +\p +\v 1 Seeing the multitudes, he went up onto the mountain. When he had sat down, his disciples came to him. +\v 2 He opened his mouth and taught them, saying, +\q1 +\v 3 \wj “Blessed are the poor in spirit,\wj* +\q2 \wj for theirs is the Kingdom of Heaven.\wj*\x + \xo 5:3 \xt Isaiah 57:15; 66:2\x* +\q1 +\v 4 \wj Blessed are those who mourn,\wj* +\q2 \wj for they shall be comforted.\wj*\x + \xo 5:4 \xt Isaiah 61:2; 66:10,13\x* +\q1 +\v 5 \wj Blessed are the gentle,\wj* +\q2 \wj for they shall inherit the earth.\wj*\f + \fr 5:5 \ft or, land.\f*\x + \xo 5:5 \xt Psalm 37:11\x* +\q1 +\v 6 \wj Blessed are those who hunger and thirst for righteousness, \wj* +\q2 \wj for they shall be filled.\wj* +\q1 +\v 7 \wj Blessed are the merciful,\wj* +\q2 \wj for they shall obtain mercy.\wj* +\q1 +\v 8 \wj Blessed are the pure in heart,\wj* +\q2 \wj for they shall see God.\wj* +\q1 +\v 9 \wj Blessed are the peacemakers,\wj* +\q2 \wj for they shall be called children of God.\wj* +\q1 +\v 10 \wj Blessed are those who have been persecuted for righteousness’ sake, \wj* +\q2 \wj for theirs is the Kingdom of Heaven.\wj* +\p +\v 11 \wj “Blessed are you when people reproach you, persecute you, and say all kinds of evil against you falsely, for my sake. \wj* +\v 12 \wj Rejoice, and be exceedingly glad, for great is your reward in heaven. For that is how they persecuted the prophets who were before you. \wj* +\p +\v 13 \wj “You are the salt of the earth, but if the salt has lost its flavor, with what will it be salted? It is then good for nothing, but to be cast out and trodden under the feet of men. \wj* +\p +\v 14 \wj You are the light of the world. A city located on a hill can’t be hidden. \wj* +\v 15 \wj Neither do you light a lamp and put it under a measuring basket, but on a stand; and it shines to all who are in the house. \wj* +\v 16 \wj Even so, let your light shine before men, that they may see your good works and glorify your Father who is in heaven.\wj* +\p +\v 17 \wj “Don’t think that I came to destroy the law or the prophets. I didn’t come to destroy, but to fulfill. \wj* +\v 18 \wj For most certainly, I tell you, until heaven and earth pass away, not even one smallest letter\wj*\f + \fr 5:18 \ft literally, iota\f* \wj or one tiny pen stroke\wj*\f + \fr 5:18 \ft or, serif\f* \wj shall in any way pass away from the law, until all things are accomplished. \wj* +\v 19 \wj Therefore, whoever shall break one of these least commandments and teach others to do so, shall be called least in the Kingdom of Heaven; but whoever shall do and teach them shall be called great in the Kingdom of Heaven. \wj* +\v 20 \wj For I tell you that unless your righteousness exceeds that of the scribes and Pharisees, there is no way you will enter into the Kingdom of Heaven.\wj* +\p +\v 21 \wj “You have heard that it was said to the ancient ones, ‘You shall not murder;’\wj*\x + \xo 5:21 \xt Exodus 20:13\x* \wj and ‘Whoever murders will be in danger of the judgment.’ \wj* +\v 22 \wj But I tell you that everyone who is angry with his brother without a cause \wj*\f + \fr 5:22 \ft NU omits “without a cause”.\f* \wj will be in danger of the judgment. Whoever says to his brother, ‘Raca!’ \wj*\f + \fr 5:22 \ft “Raca” is an Aramaic insult, related to the word for “empty” and conveying the idea of empty-headedness.\f* \wj will be in danger of the council. Whoever says, ‘You fool!’ will be in danger of the fire of Gehenna.\wj*\f + \fr 5:22 \ft or, Hell\f* +\p +\v 23 \wj “If therefore you are offering your gift at the altar, and there remember that your brother has anything against you, \wj* +\v 24 \wj leave your gift there before the altar, and go your way. First be reconciled to your brother, and then come and offer your gift. \wj* +\v 25 \wj Agree with your adversary quickly while you are with him on the way; lest perhaps the prosecutor deliver you to the judge, and the judge deliver you to the officer, and you be cast into prison. \wj* +\v 26 \wj Most certainly I tell you, you shall by no means get out of there until you have paid the last penny.\wj*\f + \fr 5:26 \ft literally, kodrantes. A kodrantes was a small copper coin worth about 2 lepta (widow’s mites)—not enough to buy very much of anything.\f* +\p +\v 27 \wj “You have heard that it was said, \wj*\f + \fr 5:27 \ft TR adds “to the ancients”.\f* \wj ‘You shall not commit adultery;’\wj*\x + \xo 5:27 \xt Exodus 20:14\x* +\v 28 \wj but I tell you that everyone who gazes at a woman to lust after her has committed adultery with her already in his heart. \wj* +\v 29 \wj If your right eye causes you to stumble, pluck it out and throw it away from you. For it is more profitable for you that one of your members should perish than for your whole body to be cast into Gehenna.\wj*\f + \fr 5:29 \ft or, Hell\f* +\v 30 \wj If your right hand causes you to stumble, cut it off, and throw it away from you. For it is more profitable for you that one of your members should perish, than for your whole body to be cast into Gehenna.\wj*\f + \fr 5:30 \ft or, Hell\f* +\p +\v 31 \wj “It was also said, ‘Whoever shall put away his wife, let him give her a writing of divorce,’\wj*\x + \xo 5:31 \xt Deuteronomy 24:1\x* +\v 32 \wj but I tell you that whoever puts away his wife, except for the cause of sexual immorality, makes her an adulteress; and whoever marries her when she is put away commits adultery.\wj* +\p +\v 33 \wj “Again you have heard that it was said to the ancient ones, ‘You shall not make false vows, but shall perform to the Lord your vows,’\wj*\x + \xo 5:33 \xt Numbers 30:2; Deuteronomy 23:21; Ecclesiastes 5:4\x* +\v 34 \wj but I tell you, don’t swear at all: neither by heaven, for it is the throne of God; \wj* +\v 35 \wj nor by the earth, for it is the footstool of his feet; nor by Jerusalem, for it is the city of the great King. \wj* +\v 36 \wj Neither shall you swear by your head, for you can’t make one hair white or black. \wj* +\v 37 \wj But let your ‘Yes’ be ‘Yes’ and your ‘No’ be ‘No.’ Whatever is more than these is of the evil one.\wj* +\p +\v 38 \wj “You have heard that it was said, ‘An eye for an eye, and a tooth for a tooth.’\wj*\x + \xo 5:38 \xt Exodus 21:24; Leviticus 24:20; Deuteronomy 19:21\x* +\v 39 \wj But I tell you, don’t resist him who is evil; but whoever strikes you on your right cheek, turn to him the other also. \wj* +\v 40 \wj If anyone sues you to take away your coat, let him have your cloak also. \wj* +\v 41 \wj Whoever compels you to go one mile, go with him two. \wj* +\v 42 \wj Give to him who asks you, and don’t turn away him who desires to borrow from you.\wj* +\p +\v 43 \wj “You have heard that it was said, ‘You shall love your neighbor \wj*\x + \xo 5:43 \xt Leviticus 19:18\x* \wj and hate your enemy.’\wj*\f + \fr 5:43 \ft not in the Bible, but see Qumran Manual of Discipline Ix, 21-26\f* +\v 44 \wj But I tell you, love your enemies, bless those who curse you, do good to those who hate you, and pray for those who mistreat you and persecute you, \wj* +\v 45 \wj that you may be children of your Father who is in heaven. For he makes his sun to rise on the evil and the good, and sends rain on the just and the unjust. \wj* +\v 46 \wj For if you love those who love you, what reward do you have? Don’t even the tax collectors do the same? \wj* +\v 47 \wj If you only greet your friends, what more do you do than others? Don’t even the tax collectors\wj*\f + \fr 5:47 \ft NU reads “Gentiles” instead of “tax collectors”.\f* \wj do the same? \wj* +\v 48 \wj Therefore you shall be perfect, just as your Father in heaven is perfect.\wj* +\c 6 +\p +\v 1 \wj “Be careful that you don’t do your charitable giving\wj*\f + \fr 6:1 \ft NU reads “acts of righteousness” instead of “charitable giving”\f* \wj before men, to be seen by them, or else you have no reward from your Father who is in heaven. \wj* +\v 2 \wj Therefore, when you do merciful deeds, don’t sound a trumpet before yourself, as the hypocrites do in the synagogues and in the streets, that they may get glory from men. Most certainly I tell you, they have received their reward. \wj* +\v 3 \wj But when you do merciful deeds, don’t let your left hand know what your right hand does, \wj* +\v 4 \wj so that your merciful deeds may be in secret, then your Father who sees in secret will reward you openly.\wj* +\p +\v 5 \wj “When you pray, you shall not be as the hypocrites, for they love to stand and pray in the synagogues and in the corners of the streets, that they may be seen by men. Most certainly, I tell you, they have received their reward. \wj* +\v 6 \wj But you, when you pray, enter into your inner room, and having shut your door, pray to your Father who is in secret; and your Father who sees in secret will reward you openly. \wj* +\v 7 \wj In praying, don’t use vain repetitions as the Gentiles do; for they think that they will be heard for their much speaking. \wj* +\v 8 \wj Therefore don’t be like them, for your Father knows what things you need before you ask him. \wj* +\v 9 \wj Pray like this: \wj* +\q1 \wj “‘Our Father in heaven, may your name be kept holy. \wj* +\q1 +\v 10 \wj Let your Kingdom come. \wj* +\q2 \wj Let your will be done on earth as it is in heaven. \wj* +\q1 +\v 11 \wj Give us today our daily bread. \wj* +\q1 +\v 12 \wj Forgive us our debts,\wj* +\q2 \wj as we also forgive our debtors. \wj* +\q1 +\v 13 \wj Bring us not into temptation,\wj* +\q2 \wj but deliver us from the evil one.\wj* +\q1 \wj For yours is the Kingdom, the power, and the glory forever. Amen.’\wj*\f + \fr 6:13 \ft NU omits “For yours is the Kingdom, the power, and the glory forever. Amen.”\f* +\p +\v 14 \wj “For if you forgive men their trespasses, your heavenly Father will also forgive you. \wj* +\v 15 \wj But if you don’t forgive men their trespasses, neither will your Father forgive your trespasses.\wj* +\p +\v 16 \wj “Moreover when you fast, don’t be like the hypocrites, with sad faces. For they disfigure their faces that they may be seen by men to be fasting. Most certainly I tell you, they have received their reward. \wj* +\v 17 \wj But you, when you fast, anoint your head and wash your face, \wj* +\v 18 \wj so that you are not seen by men to be fasting, but by your Father who is in secret; and your Father, who sees in secret, will reward you. \wj* +\p +\v 19 \wj “Don’t lay up treasures for yourselves on the earth, where moth and rust consume, and where thieves break through and steal; \wj* +\v 20 \wj but lay up for yourselves treasures in heaven, where neither moth nor rust consume, and where thieves don’t break through and steal; \wj* +\v 21 \wj for where your treasure is, there your heart will be also. \wj* +\p +\v 22 \wj “The lamp of the body is the eye. If therefore your eye is sound, your whole body will be full of light. \wj* +\v 23 \wj But if your eye is evil, your whole body will be full of darkness. If therefore the light that is in you is darkness, how great is the darkness! \wj* +\p +\v 24 \wj “No one can serve two masters, for either he will hate the one and love the other, or else he will be devoted to one and despise the other. You can’t serve both God and Mammon. \wj* +\v 25 \wj Therefore I tell you, don’t be anxious for your life: what you will eat, or what you will drink; nor yet for your body, what you will wear. Isn’t life more than food, and the body more than clothing? \wj* +\v 26 \wj See the birds of the sky, that they don’t sow, neither do they reap, nor gather into barns. Your heavenly Father feeds them. Aren’t you of much more value than they?\wj* +\p +\v 27 \wj “Which of you by being anxious, can add one moment\wj*\f + \fr 6:27 \ft literally, cubit\f* \wj to his lifespan? \wj* +\v 28 \wj Why are you anxious about clothing? Consider the lilies of the field, how they grow. They don’t toil, neither do they spin, \wj* +\v 29 \wj yet I tell you that even Solomon in all his glory was not dressed like one of these. \wj* +\v 30 \wj But if God so clothes the grass of the field, which today exists and tomorrow is thrown into the oven, won’t he much more clothe you, you of little faith?\wj* +\p +\v 31 \wj “Therefore don’t be anxious, saying, ‘What will we eat?’, ‘What will we drink?’ or, ‘With what will we be clothed?’ \wj* +\v 32 \wj For the Gentiles seek after all these things; for your heavenly Father knows that you need all these things. \wj* +\v 33 \wj But seek first God’s Kingdom and his righteousness; and all these things will be given to you as well. \wj* +\v 34 \wj Therefore don’t be anxious for tomorrow, for tomorrow will be anxious for itself. Each day’s own evil is sufficient.\wj* +\c 7 +\p +\v 1 \wj “Don’t judge, so that you won’t be judged. \wj* +\v 2 \wj For with whatever judgment you judge, you will be judged; and with whatever measure you measure, it will be measured to you. \wj* +\v 3 \wj Why do you see the speck that is in your brother’s eye, but don’t consider the beam that is in your own eye? \wj* +\v 4 \wj Or how will you tell your brother, ‘Let me remove the speck from your eye,’ and behold, the beam is in your own eye? \wj* +\v 5 \wj You hypocrite! First remove the beam out of your own eye, and then you can see clearly to remove the speck out of your brother’s eye.\wj* +\p +\v 6 \wj “Don’t give that which is holy to the dogs, neither throw your pearls before the pigs, lest perhaps they trample them under their feet, and turn and tear you to pieces.\wj* +\p +\v 7 \wj “Ask, and it will be given you. Seek, and you will find. Knock, and it will be opened for you. \wj* +\v 8 \wj For everyone who asks receives. He who seeks finds. To him who knocks it will be opened. \wj* +\v 9 \wj Or who is there among you who, if his son asks him for bread, will give him a stone? \wj* +\v 10 \wj Or if he asks for a fish, who will give him a serpent? \wj* +\v 11 \wj If you then, being evil, know how to give good gifts to your children, how much more will your Father who is in heaven give good things to those who ask him! \wj* +\v 12 \wj Therefore, whatever you desire for men to do to you, you shall also do to them; for this is the law and the prophets.\wj* +\p +\v 13 \wj “Enter in by the narrow gate; for the gate is wide and the way is broad that leads to destruction, and there are many who enter in by it. \wj* +\v 14 \wj How\wj*\f + \fr 7:14 \ft TR reads “Because” instead of “How”\f* \wj narrow is the gate and the way is restricted that leads to life! There are few who find it.\wj* +\p +\v 15 \wj “Beware of false prophets, who come to you in sheep’s clothing, but inwardly are ravening wolves. \wj* +\v 16 \wj By their fruits you will know them. Do you gather grapes from thorns or figs from thistles? \wj* +\v 17 \wj Even so, every good tree produces good fruit, but the corrupt tree produces evil fruit. \wj* +\v 18 \wj A good tree can’t produce evil fruit, neither can a corrupt tree produce good fruit. \wj* +\v 19 \wj Every tree that doesn’t grow good fruit is cut down and thrown into the fire. \wj* +\v 20 \wj Therefore by their fruits you will know them. \wj* +\p +\v 21 \wj “Not everyone who says to me, ‘Lord, Lord,’ will enter into the Kingdom of Heaven, but he who does the will of my Father who is in heaven. \wj* +\v 22 \wj Many will tell me in that day, ‘Lord, Lord, didn’t we prophesy in your name, in your name cast out demons, and in your name do many mighty works?’ \wj* +\v 23 \wj Then I will tell them, ‘I never knew you. Depart from me, you who work iniquity.’\wj* +\p +\v 24 \wj “Everyone therefore who hears these words of mine and does them, I will liken him to a wise man who built his house on a rock. \wj* +\v 25 \wj The rain came down, the floods came, and the winds blew and beat on that house; and it didn’t fall, for it was founded on the rock. \wj* +\v 26 \wj Everyone who hears these words of mine and doesn’t do them will be like a foolish man who built his house on the sand. \wj* +\v 27 \wj The rain came down, the floods came, and the winds blew and beat on that house; and it fell—and its fall was great.”\wj* +\p +\v 28 When Jesus had finished saying these things, the multitudes were astonished at his teaching, +\v 29 for he taught them with authority, and not like the scribes. +\c 8 +\p +\v 1 When he came down from the mountain, great multitudes followed him. +\v 2 Behold, a leper came to him and worshiped him, saying, “Lord, if you want to, you can make me clean.” +\p +\v 3 Jesus stretched out his hand and touched him, saying, \wj “I want to. Be made clean.”\wj* Immediately his leprosy was cleansed. +\v 4 Jesus said to him, \wj “See that you tell nobody; but go, show yourself to the priest, and offer the gift that Moses commanded, as a testimony to them.”\wj* +\p +\v 5 When he came into Capernaum, a centurion came to him, asking him for help, +\v 6 saying, “Lord, my servant lies in the house paralyzed, grievously tormented.” +\p +\v 7 Jesus said to him, \wj “I will come and heal him.”\wj* +\p +\v 8 The centurion answered, “Lord, I’m not worthy for you to come under my roof. Just say the word, and my servant will be healed. +\v 9 For I am also a man under authority, having under myself soldiers. I tell this one, ‘Go,’ and he goes; and tell another, ‘Come,’ and he comes; and tell my servant, ‘Do this,’ and he does it.” +\p +\v 10 When Jesus heard it, he marveled and said to those who followed, \wj “Most certainly I tell you, I haven’t found so great a faith, not even in Israel. \wj* +\v 11 \wj I tell you that many will come from the east and the west, and will sit down with Abraham, Isaac, and Jacob in the Kingdom of Heaven, \wj* +\v 12 \wj but the children of the Kingdom will be thrown out into the outer darkness. There will be weeping and gnashing of teeth.”\wj* +\v 13 Jesus said to the centurion, \wj “Go your way. Let it be done for you as you have believed.”\wj* His servant was healed in that hour. +\p +\v 14 When Jesus came into Peter’s house, he saw his wife’s mother lying sick with a fever. +\v 15 He touched her hand, and the fever left her. So she got up and served him.\f + \fr 8:15 \ft TR reads “them” instead of “him”\f* +\v 16 When evening came, they brought to him many possessed with demons. He cast out the spirits with a word, and healed all who were sick, +\v 17 that it might be fulfilled which was spoken through Isaiah the prophet, saying, “He took our infirmities and bore our diseases.”\x + \xo 8:17 \xt Isaiah 53:4 \x* +\p +\v 18 Now when Jesus saw great multitudes around him, he gave the order to depart to the other side. +\p +\v 19 A scribe came and said to him, “Teacher, I will follow you wherever you go.” +\p +\v 20 Jesus said to him, \wj “The foxes have holes and the birds of the sky have nests, but the Son of Man has nowhere to lay his head.”\wj* +\p +\v 21 Another of his disciples said to him, “Lord, allow me first to go and bury my father.” +\p +\v 22 But Jesus said to him, \wj “Follow me, and leave the dead to bury their own dead.”\wj* +\p +\v 23 When he got into a boat, his disciples followed him. +\v 24 Behold, a violent storm came up on the sea, so much that the boat was covered with the waves; but he was asleep. +\v 25 The disciples came to him and woke him up, saying, “Save us, Lord! We are dying!” +\p +\v 26 He said to them, \wj “Why are you fearful, O you of little faith?” \wj* Then he got up, rebuked the wind and the sea, and there was a great calm. +\p +\v 27 The men marveled, saying, “What kind of man is this, that even the wind and the sea obey him?” +\p +\v 28 When he came to the other side, into the country of the Gergesenes,\f + \fr 8:28 \ft NU reads “Gadarenes”\f* two people possessed by demons met him there, coming out of the tombs, exceedingly fierce, so that nobody could pass that way. +\v 29 Behold, they cried out, saying, “What do we have to do with you, Jesus, Son of God? Have you come here to torment us before the time?” +\v 30 Now there was a herd of many pigs feeding far away from them. +\v 31 The demons begged him, saying, “If you cast us out, permit us to go away into the herd of pigs.” +\p +\v 32 He said to them, \wj “Go!”\wj* +\p They came out and went into the herd of pigs; and behold, the whole herd of pigs rushed down the cliff into the sea and died in the water. +\v 33 Those who fed them fled and went away into the city and told everything, including what happened to those who were possessed with demons. +\v 34 Behold, all the city came out to meet Jesus. When they saw him, they begged that he would depart from their borders. +\c 9 +\p +\v 1 He entered into a boat and crossed over, and came into his own city. +\v 2 Behold, they brought to him a man who was paralyzed, lying on a bed. Jesus, seeing their faith, said to the paralytic, \wj “Son, cheer up! Your sins are forgiven you.”\wj* +\p +\v 3 Behold, some of the scribes said to themselves, “This man blasphemes.” +\p +\v 4 Jesus, knowing their thoughts, said, \wj “Why do you think evil in your hearts? \wj* +\v 5 \wj For which is easier, to say, ‘Your sins are forgiven;’ or to say, ‘Get up, and walk?’ \wj* +\v 6 \wj But that you may know that the Son of Man has authority on earth to forgive sins—”\wj* (then he said to the paralytic), \wj “Get up, and take up your mat, and go to your house.”\wj* +\p +\v 7 He arose and departed to his house. +\v 8 But when the multitudes saw it, they marveled and glorified God, who had given such authority to men. +\p +\v 9 As Jesus passed by from there, he saw a man called Matthew sitting at the tax collection office. He said to him, \wj “Follow me.”\wj* He got up and followed him. +\v 10 As he sat in the house, behold, many tax collectors and sinners came and sat down with Jesus and his disciples. +\v 11 When the Pharisees saw it, they said to his disciples, “Why does your teacher eat with tax collectors and sinners?” +\p +\v 12 When Jesus heard it, he said to them, \wj “Those who are healthy have no need for a physician, but those who are sick do. \wj* +\v 13 \wj But you go and learn what this means: ‘I desire mercy, and not sacrifice,’\wj*\x + \xo 9:13 \xt Hosea 6:6\x* \wj for I came not to call the righteous, but sinners to repentance.”\wj*\f + \fr 9:13 \ft NU omits “to repentance”.\f* +\p +\v 14 Then John’s disciples came to him, saying, “Why do we and the Pharisees fast often, but your disciples don’t fast?” +\p +\v 15 Jesus said to them, \wj “Can the friends of the bridegroom mourn as long as the bridegroom is with them? But the days will come when the bridegroom will be taken away from them, and then they will fast. \wj* +\v 16 \wj No one puts a piece of unshrunk cloth on an old garment; for the patch would tear away from the garment, and a worse hole is made. \wj* +\v 17 \wj Neither do people put new wine into old wine skins, or else the skins would burst, and the wine be spilled, and the skins ruined. No, they put new wine into fresh wine skins, and both are preserved.”\wj* +\p +\v 18 While he told these things to them, behold, a ruler came and worshiped him, saying, “My daughter has just died, but come and lay your hand on her, and she will live.” +\p +\v 19 Jesus got up and followed him, as did his disciples. +\v 20 Behold, a woman who had a discharge of blood for twelve years came behind him, and touched the fringe\f + \fr 9:20 \ft or, tassel\f* of his garment; +\v 21 for she said within herself, “If I just touch his garment, I will be made well.” +\p +\v 22 But Jesus, turning around and seeing her, said, \wj “Daughter, cheer up! Your faith has made you well.”\wj* And the woman was made well from that hour. +\p +\v 23 When Jesus came into the ruler’s house and saw the flute players and the crowd in noisy disorder, +\v 24 he said to them, \wj “Make room, because the girl isn’t dead, but sleeping.”\wj* +\p They were ridiculing him. +\v 25 But when the crowd was sent out, he entered in, took her by the hand, and the girl arose. +\v 26 The report of this went out into all that land. +\p +\v 27 As Jesus passed by from there, two blind men followed him, calling out and saying, “Have mercy on us, son of David!” +\v 28 When he had come into the house, the blind men came to him. Jesus said to them, \wj “Do you believe that I am able to do this?”\wj* +\p They told him, “Yes, Lord.” +\p +\v 29 Then he touched their eyes, saying, \wj “According to your faith be it done to you.”\wj* +\v 30 Then their eyes were opened. Jesus strictly commanded them, saying, \wj “See that no one knows about this.”\wj* +\v 31 But they went out and spread abroad his fame in all that land. +\p +\v 32 As they went out, behold, a mute man who was demon possessed was brought to him. +\v 33 When the demon was cast out, the mute man spoke. The multitudes marveled, saying, “Nothing like this has ever been seen in Israel!” +\p +\v 34 But the Pharisees said, “By the prince of the demons, he casts out demons.” +\p +\v 35 Jesus went about all the cities and the villages, teaching in their synagogues and preaching the Good News of the Kingdom, and healing every disease and every sickness among the people. +\v 36 But when he saw the multitudes, he was moved with compassion for them because they were harassed\f + \fr 9:36 \ft TR reads “weary” instead of “harassed” \f* and scattered, like sheep without a shepherd. +\v 37 Then he said to his disciples, \wj “The harvest indeed is plentiful, but the laborers are few. \wj* +\v 38 \wj Pray therefore that the Lord of the harvest will send out laborers into his harvest.”\wj* +\c 10 +\p +\v 1 He called to himself his twelve disciples, and gave them authority over unclean spirits, to cast them out, and to heal every disease and every sickness. +\v 2 Now the names of the twelve apostles are these. The first, Simon, who is called Peter; Andrew, his brother; James the son of Zebedee; John, his brother; +\v 3 Philip; Bartholomew; Thomas; Matthew the tax collector; James the son of Alphaeus; Lebbaeus, who was also called\f + \fr 10:3 \ft NU omits “Lebbaeus, who was also called”\f* Thaddaeus; +\v 4 Simon the Zealot; and Judas Iscariot, who also betrayed him. +\p +\v 5 Jesus sent these twelve out and commanded them, saying, \wj “Don’t go among the Gentiles, and don’t enter into any city of the Samaritans. \wj* +\v 6 \wj Rather, go to the lost sheep of the house of Israel. \wj* +\v 7 \wj As you go, preach, saying, ‘The Kingdom of Heaven is at hand!’ \wj* +\v 8 \wj Heal the sick, cleanse the lepers,\wj*\f + \fr 10:8 \ft TR adds “raise the dead,”\f* \wj and cast out demons. Freely you received, so freely give. \wj* +\v 9 \wj Don’t take any gold, silver, or brass in your money belts. \wj* +\v 10 \wj Take no bag for your journey, neither two coats, nor sandals, nor staff: for the laborer is worthy of his food. \wj* +\v 11 \wj Into whatever city or village you enter, find out who in it is worthy, and stay there until you go on. \wj* +\v 12 \wj As you enter into the household, greet it. \wj* +\v 13 \wj If the household is worthy, let your peace come on it, but if it isn’t worthy, let your peace return to you. \wj* +\v 14 \wj Whoever doesn’t receive you or hear your words, as you go out of that house or that city, shake the dust off your feet. \wj* +\v 15 \wj Most certainly I tell you, it will be more tolerable for the land of Sodom and Gomorrah in the day of judgment than for that city.\wj* +\p +\v 16 \wj “Behold, I send you out as sheep among wolves. Therefore be wise as serpents and harmless as doves. \wj* +\v 17 \wj But beware of men, for they will deliver you up to councils, and in their synagogues they will scourge you. \wj* +\v 18 \wj Yes, and you will be brought before governors and kings for my sake, for a testimony to them and to the nations. \wj* +\v 19 \wj But when they deliver you up, don’t be anxious how or what you will say, for it will be given you in that hour what you will say. \wj* +\v 20 \wj For it is not you who speak, but the Spirit of your Father who speaks in you.\wj* +\p +\v 21 \wj “Brother will deliver up brother to death, and the father his child. Children will rise up against parents and cause them to be put to death. \wj* +\v 22 \wj You will be hated by all men for my name’s sake, but he who endures to the end will be saved. \wj* +\v 23 \wj But when they persecute you in this city, flee into the next, for most certainly I tell you, you will not have gone through the cities of Israel until the Son of Man has come.\wj* +\p +\v 24 \wj “A disciple is not above his teacher, nor a servant above his lord. \wj* +\v 25 \wj It is enough for the disciple that he be like his teacher, and the servant like his lord. If they have called the master of the house Beelzebul,\wj*\f + \fr 10:25 \ft Literally, Lord of the Flies, or the devil\f* \wj how much more those of his household! \wj* +\v 26 \wj Therefore don’t be afraid of them, for there is nothing covered that will not be revealed, or hidden that will not be known. \wj* +\v 27 \wj What I tell you in the darkness, speak in the light; and what you hear whispered in the ear, proclaim on the housetops. \wj* +\v 28 \wj Don’t be afraid of those who kill the body, but are not able to kill the soul. Rather, fear him who is able to destroy both soul and body in Gehenna.\wj*\f + \fr 10:28 \ft or, Hell.\f* +\p +\v 29 \wj “Aren’t two sparrows sold for an assarion coin?\wj*\f + \fr 10:29 \ft An assarion is a small coin worth one tenth of a drachma or a sixteenth of a denarius. An assarion is approximately the wages of one half hour of agricultural labor.\f* \wj Not one of them falls to the ground apart from your Father’s will. \wj* +\v 30 \wj But the very hairs of your head are all numbered. \wj* +\v 31 \wj Therefore don’t be afraid. You are of more value than many sparrows. \wj* +\v 32 \wj Everyone therefore who confesses me before men, I will also confess him before my Father who is in heaven. \wj* +\v 33 \wj But whoever denies me before men, I will also deny him before my Father who is in heaven.\wj* +\p +\v 34 \wj “Don’t think that I came to send peace on the earth. I didn’t come to send peace, but a sword. \wj* +\v 35 \wj For I came to set a man at odds against his father, and a daughter against her mother, and a daughter-in-law against her mother-in-law. \wj* +\v 36 \wj A man’s foes will be those of his own household.\wj*\x + \xo 10:36 \xt Micah 7:6\x* +\v 37 \wj He who loves father or mother more than me is not worthy of me; and he who loves son or daughter more than me isn’t worthy of me. \wj* +\v 38 \wj He who doesn’t take his cross and follow after me isn’t worthy of me. \wj* +\v 39 \wj He who seeks his life will lose it; and he who loses his life for my sake will find it. \wj* +\p +\v 40 \wj “He who receives you receives me, and he who receives me receives him who sent me. \wj* +\v 41 \wj He who receives a prophet in the name of a prophet will receive a prophet’s reward. He who receives a righteous man in the name of a righteous man will receive a righteous man’s reward. \wj* +\v 42 \wj Whoever gives one of these little ones just a cup of cold water to drink in the name of a disciple, most certainly I tell you, he will in no way lose his reward.”\wj* +\c 11 +\p +\v 1 When Jesus had finished directing his twelve disciples, he departed from there to teach and preach in their cities. +\p +\v 2 Now when John heard in the prison the works of Christ, he sent two of his disciples +\v 3 and said to him, “Are you he who comes, or should we look for another?” +\p +\v 4 Jesus answered them, \wj “Go and tell John the things which you hear and see: \wj* +\v 5 \wj the blind receive their sight, the lame walk, the lepers are cleansed, the deaf hear,\wj*\x + \xo 11:5 \xt Isaiah 35:5\x* \wj the dead are raised up, and the poor have good news preached to them.\wj*\x + \xo 11:5 \xt Isaiah 61:1-4\x* +\v 6 \wj Blessed is he who finds no occasion for stumbling in me.”\wj* +\p +\v 7 As these went their way, Jesus began to say to the multitudes concerning John, \wj “What did you go out into the wilderness to see? A reed shaken by the wind? \wj* +\v 8 \wj But what did you go out to see? A man in soft clothing? Behold, those who wear soft clothing are in kings’ houses. \wj* +\v 9 \wj But why did you go out? To see a prophet? Yes, I tell you, and much more than a prophet. \wj* +\v 10 \wj For this is he, of whom it is written, ‘Behold, I send my messenger before your face, who will prepare your way before you.’\wj*\x + \xo 11:10 \xt Malachi 3:1 \x* +\v 11 \wj Most certainly I tell you, among those who are born of women there has not arisen anyone greater than John the Baptizer; yet he who is least in the Kingdom of Heaven is greater than he. \wj* +\v 12 \wj From the days of John the Baptizer until now, the Kingdom of Heaven suffers violence, and the violent take it by force.\wj*\f + \fr 11:12 \ft or, plunder it. \f* +\v 13 \wj For all the prophets and the law prophesied until John. \wj* +\v 14 \wj If you are willing to receive it, this is Elijah, who is to come. \wj* +\v 15 \wj He who has ears to hear, let him hear.\wj* +\p +\v 16 \wj “But to what shall I compare this generation? It is like children sitting in the marketplaces, who call to their companions \wj* +\v 17 \wj and say, ‘We played the flute for you, and you didn’t dance. We mourned for you, and you didn’t lament.’ \wj* +\v 18 \wj For John came neither eating nor drinking, and they say, ‘He has a demon.’ \wj* +\v 19 \wj The Son of Man came eating and drinking, and they say, ‘Behold, a gluttonous man and a drunkard, a friend of tax collectors and sinners!’ But wisdom is justified by her children.”\wj*\f + \fr 11:19 \ft NU reads “actions” instead of “children”\f* +\p +\v 20 Then he began to denounce the cities in which most of his mighty works had been done, because they didn’t repent. +\v 21 \wj “Woe to you, Chorazin! Woe to you, Bethsaida! For if the mighty works had been done in Tyre and Sidon which were done in you, they would have repented long ago in sackcloth and ashes. \wj* +\v 22 \wj But I tell you, it will be more tolerable for Tyre and Sidon on the day of judgment than for you. \wj* +\v 23 \wj You, Capernaum, who are exalted to heaven, you will go down to Hades. \wj*\f + \fr 11:23 \ft or, Hell\f* \wj For if the mighty works had been done in Sodom which were done in you, it would have remained until today. \wj* +\v 24 \wj But I tell you that it will be more tolerable for the land of Sodom on the day of judgment, than for you.”\wj* +\p +\v 25 At that time, Jesus answered, \wj “I thank you, Father, Lord of heaven and earth, that you hid these things from the wise and understanding, and revealed them to infants. \wj* +\v 26 \wj Yes, Father, for so it was well-pleasing in your sight. \wj* +\v 27 \wj All things have been delivered to me by my Father. No one knows the Son, except the Father; neither does anyone know the Father, except the Son and he to whom the Son desires to reveal him.\wj* +\p +\v 28 \wj “Come to me, all you who labor and are heavily burdened, and I will give you rest. \wj* +\v 29 \wj Take my yoke upon you and learn from me, for I am gentle and humble in heart; and you will find rest for your souls. \wj* +\v 30 \wj For my yoke is easy, and my burden is light.”\wj* +\c 12 +\p +\v 1 At that time, Jesus went on the Sabbath day through the grain fields. His disciples were hungry and began to pluck heads of grain and to eat. +\v 2 But the Pharisees, when they saw it, said to him, “Behold, your disciples do what is not lawful to do on the Sabbath.” +\p +\v 3 But he said to them, \wj “Haven’t you read what David did when he was hungry, and those who were with him: \wj* +\v 4 \wj how he entered into God’s house and ate the show bread, which was not lawful for him to eat, nor for those who were with him, but only for the priests?\wj*\x + \xo 12:4 \xt 1 Samuel 21:3-6\x* +\v 5 \wj Or have you not read in the law that on the Sabbath day the priests in the temple profane the Sabbath and are guiltless? \wj* +\v 6 \wj But I tell you that one greater than the temple is here. \wj* +\v 7 \wj But if you had known what this means, ‘I desire mercy, and not sacrifice,’\wj*\x + \xo 12:7 \xt Hosea 6:6\x* \wj you wouldn’t have condemned the guiltless. \wj* +\v 8 \wj For the Son of Man is Lord of the Sabbath.”\wj* +\p +\v 9 He departed from there and went into their synagogue. +\v 10 And behold, there was a man with a withered hand. They asked him, “Is it lawful to heal on the Sabbath day?” so that they might accuse him. +\p +\v 11 He said to them, \wj “What man is there among you who has one sheep, and if this one falls into a pit on the Sabbath day, won’t he grab on to it and lift it out? \wj* +\v 12 \wj Of how much more value then is a man than a sheep! Therefore it is lawful to do good on the Sabbath day.”\wj* +\v 13 Then he told the man, \wj “Stretch out your hand.”\wj* He stretched it out; and it was restored whole, just like the other. +\v 14 But the Pharisees went out and conspired against him, how they might destroy him. +\p +\v 15 Jesus, perceiving that, withdrew from there. Great multitudes followed him; and he healed them all, +\v 16 and commanded them that they should not make him known, +\v 17 that it might be fulfilled which was spoken through Isaiah the prophet, saying, +\q1 +\v 18 “Behold, my servant whom I have chosen, +\q2 my beloved in whom my soul is well pleased. +\q1 I will put my Spirit on him. +\q2 He will proclaim justice to the nations. +\q1 +\v 19 He will not strive, nor shout, +\q2 neither will anyone hear his voice in the streets. +\q1 +\v 20 He won’t break a bruised reed. +\q2 He won’t quench a smoking flax, +\q1 until he leads justice to victory. +\q2 +\v 21 In his name, the nations will hope.”\x + \xo 12:21 \xt Isaiah 42:1-4\x* +\p +\v 22 Then one possessed by a demon, blind and mute, was brought to him; and he healed him, so that the blind and mute man both spoke and saw. +\v 23 All the multitudes were amazed, and said, “Can this be the son of David?” +\v 24 But when the Pharisees heard it, they said, “This man does not cast out demons except by Beelzebul, the prince of the demons.” +\p +\v 25 Knowing their thoughts, Jesus said to them, \wj “Every kingdom divided against itself is brought to desolation, and every city or house divided against itself will not stand. \wj* +\v 26 \wj If Satan casts out Satan, he is divided against himself. How then will his kingdom stand? \wj* +\v 27 \wj If I by Beelzebul cast out demons, by whom do your children cast them out? Therefore they will be your judges. \wj* +\v 28 \wj But if I by the Spirit of God cast out demons, then God’s Kingdom has come upon you. \wj* +\v 29 \wj Or how can one enter into the house of the strong man and plunder his goods, unless he first bind the strong man? Then he will plunder his house.\wj* +\p +\v 30 \wj “He who is not with me is against me, and he who doesn’t gather with me, scatters. \wj* +\v 31 \wj Therefore I tell you, every sin and blasphemy will be forgiven men, but the blasphemy against the Spirit will not be forgiven men. \wj* +\v 32 \wj Whoever speaks a word against the Son of Man, it will be forgiven him; but whoever speaks against the Holy Spirit, it will not be forgiven him, either in this age, or in that which is to come.\wj* +\p +\v 33 \wj “Either make the tree good and its fruit good, or make the tree corrupt and its fruit corrupt; for the tree is known by its fruit. \wj* +\v 34 \wj You offspring of vipers, how can you, being evil, speak good things? For out of the abundance of the heart, the mouth speaks. \wj* +\v 35 \wj The good man out of his good treasure\wj*\f + \fr 12:35 \ft TR adds “of the heart”\f* \wj brings out good things, and the evil man out of his evil treasure brings out evil things. \wj* +\v 36 \wj I tell you that every idle word that men speak, they will give account of it in the day of judgment. \wj* +\v 37 \wj For by your words you will be justified, and by your words you will be condemned.”\wj* +\p +\v 38 Then certain of the scribes and Pharisees answered, “Teacher, we want to see a sign from you.” +\p +\v 39 But he answered them, \wj “An evil and adulterous generation seeks after a sign, but no sign will be given to it but the sign of Jonah the prophet. \wj* +\v 40 \wj For as Jonah was three days and three nights in the belly of the huge fish, so will the Son of Man be three days and three nights in the heart of the earth. \wj* +\v 41 \wj The men of Nineveh will stand up in the judgment with this generation and will condemn it, for they repented at the preaching of Jonah; and behold, someone greater than Jonah is here. \wj* +\v 42 \wj The Queen of the South will rise up in the judgment with this generation and will condemn it, for she came from the ends of the earth to hear the wisdom of Solomon; and behold, someone greater than Solomon is here. \wj* +\p +\v 43 \wj “When an unclean spirit has gone out of a man, he passes through waterless places seeking rest, and doesn’t find it. \wj* +\v 44 \wj Then he says, ‘I will return into my house from which I came;’ and when he has come back, he finds it empty, swept, and put in order. \wj* +\v 45 \wj Then he goes and takes with himself seven other spirits more evil than he is, and they enter in and dwell there. The last state of that man becomes worse than the first. Even so will it be also to this evil generation.”\wj* +\p +\v 46 While he was yet speaking to the multitudes, behold, his mother and his brothers stood outside, seeking to speak to him. +\v 47 One said to him, “Behold, your mother and your brothers stand outside, seeking to speak to you.” +\p +\v 48 But he answered him who spoke to him, \wj “Who is my mother? Who are my brothers?”\wj* +\v 49 He stretched out his hand toward his disciples, and said, \wj “Behold, my mother and my brothers! \wj* +\v 50 \wj For whoever does the will of my Father who is in heaven, he is my brother, and sister, and mother.”\wj* +\c 13 +\p +\v 1 On that day Jesus went out of the house and sat by the seaside. +\v 2 Great multitudes gathered to him, so that he entered into a boat and sat; and all the multitude stood on the beach. +\v 3 He spoke to them many things in parables, saying, \wj “Behold, a farmer went out to sow. \wj* +\v 4 \wj As he sowed, some seeds fell by the roadside, and the birds came and devoured them. \wj* +\v 5 \wj Others fell on rocky ground, where they didn’t have much soil, and immediately they sprang up, because they had no depth of earth. \wj* +\v 6 \wj When the sun had risen, they were scorched. Because they had no root, they withered away. \wj* +\v 7 \wj Others fell among thorns. The thorns grew up and choked them. \wj* +\v 8 \wj Others fell on good soil and yielded fruit: some one hundred times as much, some sixty, and some thirty. \wj* +\v 9 \wj He who has ears to hear, let him hear.”\wj* +\p +\v 10 The disciples came, and said to him, “Why do you speak to them in parables?” +\p +\v 11 He answered them, \wj “To you it is given to know the mysteries of the Kingdom of Heaven, but it is not given to them. \wj* +\v 12 \wj For whoever has, to him will be given, and he will have abundance; but whoever doesn’t have, from him will be taken away even that which he has. \wj* +\v 13 \wj Therefore I speak to them in parables, because seeing they don’t see, and hearing, they don’t hear, neither do they understand. \wj* +\v 14 \wj In them the prophecy of Isaiah is fulfilled, which says, \wj* +\q1 \wj ‘By hearing you will hear,\wj* +\q2 \wj and will in no way understand;\wj* +\q1 \wj Seeing you will see,\wj* +\q2 \wj and will in no way perceive;\wj* +\q1 +\v 15 \wj for this people’s heart has grown callous,\wj* +\q2 \wj their ears are dull of hearing,\wj* +\q2 \wj and they have closed their eyes;\wj* +\q1 \wj or else perhaps they might perceive with their eyes,\wj* +\q2 \wj hear with their ears,\wj* +\q2 \wj understand with their heart,\wj* +\q1 \wj and would turn again,\wj* +\q2 \wj and I would heal them.’\wj*\x + \xo 13:15 \xt Isaiah 6:9-10\x* +\p +\v 16 \wj “But blessed are your eyes, for they see; and your ears, for they hear. \wj* +\v 17 \wj For most certainly I tell you that many prophets and righteous men desired to see the things which you see, and didn’t see them; and to hear the things which you hear, and didn’t hear them.\wj* +\p +\v 18 \wj “Hear, then, the parable of the farmer. \wj* +\v 19 \wj When anyone hears the word of the Kingdom and doesn’t understand it, the evil one comes and snatches away that which has been sown in his heart. This is what was sown by the roadside. \wj* +\v 20 \wj What was sown on the rocky places, this is he who hears the word and immediately with joy receives it; \wj* +\v 21 \wj yet he has no root in himself, but endures for a while. When oppression or persecution arises because of the word, immediately he stumbles. \wj* +\v 22 \wj What was sown among the thorns, this is he who hears the word, but the cares of this age and the deceitfulness of riches choke the word, and he becomes unfruitful. \wj* +\v 23 \wj What was sown on the good ground, this is he who hears the word and understands it, who most certainly bears fruit and produces, some one hundred times as much, some sixty, and some thirty.”\wj* +\p +\v 24 He set another parable before them, saying, \wj “The Kingdom of Heaven is like a man who sowed good seed in his field, \wj* +\v 25 \wj but while people slept, his enemy came and sowed darnel weeds\wj*\f + \fr 13:25 \ft darnel is a weed grass (probably bearded darnel or lolium temulentum) that looks very much like wheat until it is mature, when the difference becomes very apparent.\f* \wj also among the wheat, and went away. \wj* +\v 26 \wj But when the blade sprang up and produced grain, then the darnel weeds appeared also. \wj* +\v 27 \wj The servants of the householder came and said to him, ‘Sir, didn’t you sow good seed in your field? Where did these darnel weeds come from?’\wj* +\p +\v 28 \wj “He said to them, ‘An enemy has done this.’\wj* +\p \wj “The servants asked him, ‘Do you want us to go and gather them up?’ \wj* +\p +\v 29 \wj “But he said, ‘No, lest perhaps while you gather up the darnel weeds, you root up the wheat with them. \wj* +\v 30 \wj Let both grow together until the harvest, and in the harvest time I will tell the reapers, “First, gather up the darnel weeds, and bind them in bundles to burn them; but gather the wheat into my barn.”’”\wj* +\p +\v 31 He set another parable before them, saying, \wj “The Kingdom of Heaven is like a grain of mustard seed which a man took, and sowed in his field, \wj* +\v 32 \wj which indeed is smaller than all seeds. But when it is grown, it is greater than the herbs and becomes a tree, so that the birds of the air come and lodge in its branches.”\wj* +\p +\v 33 He spoke another parable to them. \wj “The Kingdom of Heaven is like yeast which a woman took and hid in three measures\wj*\f + \fr 13:33 \ft literally, three sata. Three sata is about 39 liters or a bit more than a bushel\f* \wj of meal, until it was all leavened.”\wj* +\p +\v 34 Jesus spoke all these things in parables to the multitudes; and without a parable, he didn’t speak to them, +\v 35 that it might be fulfilled which was spoken through the prophet, saying, +\q1 “I will open my mouth in parables; +\q2 I will utter things hidden from the foundation of the world.”\x + \xo 13:35 \xt Psalm 78:2\x* +\p +\v 36 Then Jesus sent the multitudes away, and went into the house. His disciples came to him, saying, “Explain to us the parable of the darnel weeds of the field.” +\p +\v 37 He answered them, \wj “He who sows the good seed is the Son of Man, \wj* +\v 38 \wj the field is the world, the good seeds are the children of the Kingdom, and the darnel weeds are the children of the evil one. \wj* +\v 39 \wj The enemy who sowed them is the devil. The harvest is the end of the age, and the reapers are angels. \wj* +\v 40 \wj As therefore the darnel weeds are gathered up and burned with fire; so will it be at the end of this age. \wj* +\v 41 \wj The Son of Man will send out his angels, and they will gather out of his Kingdom all things that cause stumbling and those who do iniquity, \wj* +\v 42 \wj and will cast them into the furnace of fire. There will be weeping and gnashing of teeth. \wj* +\v 43 \wj Then the righteous will shine like the sun in the Kingdom of their Father. He who has ears to hear, let him hear.\wj* +\p +\v 44 \wj “Again, the Kingdom of Heaven is like treasure hidden in the field, which a man found and hid. In his joy, he goes and sells all that he has and buys that field.\wj* +\p +\v 45 \wj “Again, the Kingdom of Heaven is like a man who is a merchant seeking fine pearls, \wj* +\v 46 \wj who having found one pearl of great price, he went and sold all that he had and bought it.\wj* +\p +\v 47 \wj “Again, the Kingdom of Heaven is like a dragnet that was cast into the sea and gathered some fish of every kind, \wj* +\v 48 \wj which, when it was filled, fishermen drew up on the beach. They sat down and gathered the good into containers, but the bad they threw away. \wj* +\v 49 \wj So it will be in the end of the world.\wj*\f + \fr 13:49 \ft or, end of the age.\f* \wj The angels will come and separate the wicked from among the righteous, \wj* +\v 50 \wj and will cast them into the furnace of fire. There will be weeping and gnashing of teeth.”\wj* +\v 51 Jesus said to them, \wj “Have you understood all these things?” \wj* +\p They answered him, “Yes, Lord.” +\p +\v 52 He said to them, \wj “Therefore every scribe who has been made a disciple in the Kingdom of Heaven is like a man who is a householder, who brings out of his treasure new and old things.”\wj* +\p +\v 53 When Jesus had finished these parables, he departed from there. +\v 54 Coming into his own country, he taught them in their synagogue, so that they were astonished and said, “Where did this man get this wisdom and these mighty works? +\v 55 Isn’t this the carpenter’s son? Isn’t his mother called Mary, and his brothers James, Joses, Simon, and Judas?\f + \fr 13:55 \ft or, Judah\f* +\v 56 Aren’t all of his sisters with us? Where then did this man get all of these things?” +\v 57 They were offended by him. +\p But Jesus said to them, \wj “A prophet is not without honor, except in his own country and in his own house.”\wj* +\v 58 He didn’t do many mighty works there because of their unbelief. +\c 14 +\p +\v 1 At that time, Herod the tetrarch heard the report concerning Jesus, +\v 2 and said to his servants, “This is John the Baptizer. He is risen from the dead. That is why these powers work in him.” +\v 3 For Herod had arrested John, bound him, and put him in prison for the sake of Herodias, his brother Philip’s wife. +\v 4 For John said to him, “It is not lawful for you to have her.” +\v 5 When he would have put him to death, he feared the multitude, because they counted him as a prophet. +\v 6 But when Herod’s birthday came, the daughter of Herodias danced among them and pleased Herod. +\v 7 Therefore he promised with an oath to give her whatever she should ask. +\v 8 She, being prompted by her mother, said, “Give me here on a platter the head of John the Baptizer.” +\p +\v 9 The king was grieved, but for the sake of his oaths and of those who sat at the table with him, he commanded it to be given, +\v 10 and he sent and beheaded John in the prison. +\v 11 His head was brought on a platter and given to the young lady; and she brought it to her mother. +\v 12 His disciples came, took the body, and buried it. Then they went and told Jesus. +\v 13 Now when Jesus heard this, he withdrew from there in a boat to a deserted place apart. When the multitudes heard it, they followed him on foot from the cities. +\p +\v 14 Jesus went out, and he saw a great multitude. He had compassion on them and healed their sick. +\v 15 When evening had come, his disciples came to him, saying, “This place is deserted, and the hour is already late. Send the multitudes away, that they may go into the villages, and buy themselves food.” +\p +\v 16 But Jesus said to them, \wj “They don’t need to go away. You give them something to eat.”\wj* +\p +\v 17 They told him, “We only have here five loaves and two fish.” +\p +\v 18 He said, \wj “Bring them here to me.”\wj* +\v 19 He commanded the multitudes to sit down on the grass; and he took the five loaves and the two fish, and looking up to heaven, he blessed, broke and gave the loaves to the disciples; and the disciples gave to the multitudes. +\v 20 They all ate and were filled. They took up twelve baskets full of that which remained left over from the broken pieces. +\v 21 Those who ate were about five thousand men, in addition to women and children. +\p +\v 22 Immediately Jesus made the disciples get into the boat and go ahead of him to the other side, while he sent the multitudes away. +\v 23 After he had sent the multitudes away, he went up into the mountain by himself to pray. When evening had come, he was there alone. +\v 24 But the boat was now in the middle of the sea, distressed by the waves, for the wind was contrary. +\v 25 In the fourth watch of the night,\f + \fr 14:25 \ft The night was equally divided into four watches, so the fourth watch is approximately 3:00 a.m. to sunrise. \f* Jesus came to them, walking on the sea.\x + \xo 14:25 \xt See Job 9:8\x* +\v 26 When the disciples saw him walking on the sea, they were troubled, saying, “It’s a ghost!” and they cried out for fear. +\v 27 But immediately Jesus spoke to them, saying, \wj “Cheer up! It is I! \wj*\f + \fr 14:27 \ft or, I AM!\f* \wj Don’t be afraid.”\wj* +\p +\v 28 Peter answered him and said, “Lord, if it is you, command me to come to you on the waters.” +\p +\v 29 He said, \wj “Come!”\wj* +\p Peter stepped down from the boat and walked on the waters to come to Jesus. +\v 30 But when he saw that the wind was strong, he was afraid, and beginning to sink, he cried out, saying, “Lord, save me!” +\p +\v 31 Immediately Jesus stretched out his hand, took hold of him, and said to him, \wj “You of little faith, why did you doubt?”\wj* +\v 32 When they got up into the boat, the wind ceased. +\v 33 Those who were in the boat came and worshiped him, saying, “You are truly the Son of God!” +\p +\v 34 When they had crossed over, they came to the land of Gennesaret. +\v 35 When the people of that place recognized him, they sent into all that surrounding region and brought to him all who were sick; +\v 36 and they begged him that they might just touch the fringe\f + \fr 14:36 \ft or, tassel\f* of his garment. As many as touched it were made whole. +\c 15 +\p +\v 1 Then Pharisees and scribes came to Jesus from Jerusalem, saying, +\v 2 “Why do your disciples disobey the tradition of the elders? For they don’t wash their hands when they eat bread.” +\p +\v 3 He answered them, \wj “Why do you also disobey the commandment of God because of your tradition? \wj* +\v 4 \wj For God commanded, ‘Honor your father and your mother,’\wj*\x + \xo 15:4 \xt Exodus 20:12; Deuteronomy 5:16\x* \wj and, ‘He who speaks evil of father or mother, let him be put to death.’\wj*\x + \xo 15:4 \xt Exodus 21:17; Leviticus 20:9\x* +\v 5 \wj But you say, ‘Whoever may tell his father or his mother, “Whatever help you might otherwise have gotten from me is a gift devoted to God,” \wj* +\v 6 \wj he shall not honor his father or mother.’ You have made the commandment of God void because of your tradition. \wj* +\v 7 \wj You hypocrites! Well did Isaiah prophesy of you, saying,\wj* +\q1 +\v 8 \wj ‘These people draw near to me with their mouth,\wj* +\q2 \wj and honor me with their lips;\wj* +\q2 \wj but their heart is far from me.\wj* +\q1 +\v 9 \wj And they worship me in vain,\wj* +\q2 \wj teaching as doctrine rules made by men.’”\wj*\x + \xo 15:9 \xt Isaiah 29:13 \x* +\p +\v 10 He summoned the multitude, and said to them, \wj “Hear, and understand. \wj* +\v 11 \wj That which enters into the mouth doesn’t defile the man; but that which proceeds out of the mouth, this defiles the man.”\wj* +\p +\v 12 Then the disciples came and said to him, “Do you know that the Pharisees were offended when they heard this saying?” +\p +\v 13 But he answered, \wj “Every plant which my heavenly Father didn’t plant will be uprooted. \wj* +\v 14 \wj Leave them alone. They are blind guides of the blind. If the blind guide the blind, both will fall into a pit.”\wj* +\p +\v 15 Peter answered him, “Explain the parable to us.” +\p +\v 16 So Jesus said, \wj “Do you also still not understand? \wj* +\v 17 \wj Don’t you understand that whatever goes into the mouth passes into the belly and then out of the body? \wj* +\v 18 \wj But the things which proceed out of the mouth come out of the heart, and they defile the man. \wj* +\v 19 \wj For out of the heart come evil thoughts, murders, adulteries, sexual sins, thefts, false testimony, and blasphemies. \wj* +\v 20 \wj These are the things which defile the man; but to eat with unwashed hands doesn’t defile the man.”\wj* +\p +\v 21 Jesus went out from there and withdrew into the region of Tyre and Sidon. +\v 22 Behold, a Canaanite woman came out from those borders and cried, saying, “Have mercy on me, Lord, you son of David! My daughter is severely possessed by a demon!” +\p +\v 23 But he answered her not a word. +\p His disciples came and begged him, saying, “Send her away; for she cries after us.” +\p +\v 24 But he answered, \wj “I wasn’t sent to anyone but the lost sheep of the house of Israel.”\wj* +\p +\v 25 But she came and worshiped him, saying, “Lord, help me.” +\p +\v 26 But he answered, \wj “It is not appropriate to take the children’s bread and throw it to the dogs.”\wj* +\p +\v 27 But she said, “Yes, Lord, but even the dogs eat the crumbs which fall from their masters’ table.” +\p +\v 28 Then Jesus answered her, \wj “Woman, great is your faith! Be it done to you even as you desire.”\wj* And her daughter was healed from that hour. +\p +\v 29 Jesus departed from there and came near to the sea of Galilee; and he went up on the mountain and sat there. +\v 30 Great multitudes came to him, having with them the lame, blind, mute, maimed, and many others, and they put them down at his feet. He healed them, +\v 31 so that the multitude wondered when they saw the mute speaking, the injured healed, the lame walking, and the blind seeing—and they glorified the God of Israel. +\p +\v 32 Jesus summoned his disciples and said, \wj “I have compassion on the multitude, because they have continued with me now three days and have nothing to eat. I don’t want to send them away fasting, or they might faint on the way.” \wj* +\p +\v 33 The disciples said to him, “Where could we get so many loaves in a deserted place as to satisfy so great a multitude?” +\p +\v 34 Jesus said to them, \wj “How many loaves do you have?”\wj* +\p They said, “Seven, and a few small fish.” +\p +\v 35 He commanded the multitude to sit down on the ground; +\v 36 and he took the seven loaves and the fish. He gave thanks and broke them, and gave to the disciples, and the disciples to the multitudes. +\v 37 They all ate and were filled. They took up seven baskets full of the broken pieces that were left over. +\v 38 Those who ate were four thousand men, in addition to women and children. +\v 39 Then he sent away the multitudes, got into the boat, and came into the borders of Magdala. +\c 16 +\p +\v 1 The Pharisees and Sadducees came, and testing him, asked him to show them a sign from heaven. +\v 2 But he answered them, \wj “When it is evening, you say, ‘It will be fair weather, for the sky is red.’ \wj* +\v 3 \wj In the morning, ‘It will be foul weather today, for the sky is red and threatening.’ Hypocrites! You know how to discern the appearance of the sky, but you can’t discern the signs of the times! \wj* +\v 4 \wj An evil and adulterous generation seeks after a sign, and there will be no sign given to it, except the sign of the prophet Jonah.”\wj* +\p He left them and departed. +\v 5 The disciples came to the other side and had forgotten to take bread. +\v 6 Jesus said to them, \wj “Take heed and beware of the yeast of the Pharisees and Sadducees.”\wj* +\p +\v 7 They reasoned among themselves, saying, “We brought no bread.” +\p +\v 8 Jesus, perceiving it, said, \wj “Why do you reason among yourselves, you of little faith, because you have brought no bread? \wj* +\v 9 \wj Don’t you yet perceive or remember the five loaves for the five thousand, and how many baskets you took up, \wj* +\v 10 \wj or the seven loaves for the four thousand, and how many baskets you took up? \wj* +\v 11 \wj How is it that you don’t perceive that I didn’t speak to you concerning bread? But beware of the yeast of the Pharisees and Sadducees.” \wj* +\p +\v 12 Then they understood that he didn’t tell them to beware of the yeast of bread, but of the teaching of the Pharisees and Sadducees. +\p +\v 13 Now when Jesus came into the parts of Caesarea Philippi, he asked his disciples, saying, \wj “Who do men say that I, the Son of Man, am?”\wj* +\p +\v 14 They said, “Some say John the Baptizer, some, Elijah, and others, Jeremiah or one of the prophets.” +\p +\v 15 He said to them, \wj “But who do you say that I am?”\wj* +\p +\v 16 Simon Peter answered, “You are the Christ, the Son of the living God.” +\p +\v 17 Jesus answered him, \wj “Blessed are you, Simon Bar Jonah, for flesh and blood has not revealed this to you, but my Father who is in heaven. \wj* +\v 18 \wj I also tell you that you are Peter,\wj*\f + \fr 16:18 \ft Peter’s name, Petros in Greek, is the word for a specific rock or stone.\f* \wj and on this rock \wj*\f + \fr 16:18 \ft Greek, petra, a rock mass or bedrock.\f* \wj I will build my assembly, and the gates of Hades\wj*\f + \fr 16:18 \ft or, Hell\f* \wj will not prevail against it. \wj* +\v 19 \wj I will give to you the keys of the Kingdom of Heaven, and whatever you bind on earth will have been bound in heaven; and whatever you release on earth will have been released in heaven.”\wj* +\v 20 Then he commanded the disciples that they should tell no one that he was Jesus the Christ. +\p +\v 21 From that time, Jesus began to show his disciples that he must go to Jerusalem and suffer many things from the elders, chief priests, and scribes, and be killed, and the third day be raised up. +\p +\v 22 Peter took him aside and began to rebuke him, saying, “Far be it from you, Lord! This will never be done to you.” +\p +\v 23 But he turned and said to Peter, \wj “Get behind me, Satan! You are a stumbling block to me, for you are not setting your mind on the things of God, but on the things of men.”\wj* +\p +\v 24 Then Jesus said to his disciples, \wj “If anyone desires to come after me, let him deny himself, take up his cross, and follow me. \wj* +\v 25 \wj For whoever desires to save his life will lose it, and whoever will lose his life for my sake will find it. \wj* +\v 26 \wj For what will it profit a man if he gains the whole world and forfeits his life? Or what will a man give in exchange for his life? \wj* +\v 27 \wj For the Son of Man will come in the glory of his Father with his angels, and then he will render to everyone according to his deeds. \wj* +\v 28 \wj Most certainly I tell you, there are some standing here who will in no way taste of death until they see the Son of Man coming in his Kingdom.” \wj* +\c 17 +\p +\v 1 After six days, Jesus took with him Peter, James, and John his brother, and brought them up into a high mountain by themselves. +\v 2 He was changed\f + \fr 17:2 \ft or, transfigured\f* before them. His face shone like the sun, and his garments became as white as the light. +\v 3 Behold, Moses and Elijah appeared to them talking with him. +\p +\v 4 Peter answered and said to Jesus, “Lord, it is good for us to be here. If you want, let’s make three tents here: one for you, one for Moses, and one for Elijah.” +\p +\v 5 While he was still speaking, behold, a bright cloud overshadowed them. Behold, a voice came out of the cloud, saying, “This is my beloved Son, in whom I am well pleased. Listen to him.” +\p +\v 6 When the disciples heard it, they fell on their faces, and were very afraid. +\v 7 Jesus came and touched them and said, \wj “Get up, and don’t be afraid.” \wj* +\v 8 Lifting up their eyes, they saw no one, except Jesus alone. +\p +\v 9 As they were coming down from the mountain, Jesus commanded them, saying, \wj “Don’t tell anyone what you saw, until the Son of Man has risen from the dead.”\wj* +\p +\v 10 His disciples asked him, saying, “Then why do the scribes say that Elijah must come first?” +\p +\v 11 Jesus answered them, \wj “Elijah indeed comes first, and will restore all things; \wj* +\v 12 \wj but I tell you that Elijah has come already, and they didn’t recognize him, but did to him whatever they wanted to. Even so the Son of Man will also suffer by them.”\wj* +\v 13 Then the disciples understood that he spoke to them of John the Baptizer. +\p +\v 14 When they came to the multitude, a man came to him, kneeling down to him and saying, +\v 15 “Lord, have mercy on my son, for he is epileptic and suffers grievously; for he often falls into the fire, and often into the water. +\v 16 So I brought him to your disciples, and they could not cure him.” +\p +\v 17 Jesus answered, \wj “Faithless and perverse generation! How long will I be with you? How long will I bear with you? Bring him here to me.”\wj* +\v 18 Jesus rebuked the demon, and it went out of him, and the boy was cured from that hour. +\p +\v 19 Then the disciples came to Jesus privately, and said, “Why weren’t we able to cast it out?” +\p +\v 20 He said to them, \wj “Because of your unbelief. For most certainly I tell you, if you have faith as a grain of mustard seed, you will tell this mountain, ‘Move from here to there,’ and it will move; and nothing will be impossible for you. \wj* +\v 21 \wj But this kind doesn’t go out except by prayer and fasting.” \wj*\f + \fr 17:21 \ft NU omits verse 21.\f* +\p +\v 22 While they were staying in Galilee, Jesus said to them, \wj “The Son of Man is about to be delivered up into the hands of men, \wj* +\v 23 \wj and they will kill him, and the third day he will be raised up.” \wj* +\p They were exceedingly sorry. +\p +\v 24 When they had come to Capernaum, those who collected the didrachma coins\f + \fr 17:24 \ft A didrachma is a Greek silver coin worth 2 drachmas, about as much as 2 Roman denarii, or about 2 days’ wages. It was commonly used to pay the half-shekel temple tax, because 2 drachmas were worth one half shekel of silver. A shekel is about 10 grams or about 0.35 ounces.\f* came to Peter, and said, “Doesn’t your teacher pay the didrachma?” +\v 25 He said, “Yes.” +\p When he came into the house, Jesus anticipated him, saying, \wj “What do you think, Simon? From whom do the kings of the earth receive toll or tribute? From their children, or from strangers?”\wj* +\p +\v 26 Peter said to him, “From strangers.” +\p Jesus said to him, \wj “Therefore the children are exempt. \wj* +\v 27 \wj But, lest we cause them to stumble, go to the sea, cast a hook, and take up the first fish that comes up. When you have opened its mouth, you will find a stater coin.\wj*\f + \fr 17:27 \ft A stater is a silver coin equivalent to four Attic or two Alexandrian drachmas, or a Jewish shekel: just exactly enough to cover the half-shekel temple tax for two people. A shekel is about 10 grams or about 0.35 ounces, usually in the form of a silver coin.\f* \wj Take that, and give it to them for me and you.”\wj* +\c 18 +\p +\v 1 In that hour the disciples came to Jesus, saying, “Who then is greatest in the Kingdom of Heaven?” +\p +\v 2 Jesus called a little child to himself, and set him in the middle of them +\v 3 and said, \wj “Most certainly I tell you, unless you turn and become as little children, you will in no way enter into the Kingdom of Heaven. \wj* +\v 4 \wj Whoever therefore humbles himself as this little child is the greatest in the Kingdom of Heaven. \wj* +\v 5 \wj Whoever receives one such little child in my name receives me, \wj* +\v 6 \wj but whoever causes one of these little ones who believe in me to stumble, it would be better for him if a huge millstone were hung around his neck and that he were sunk in the depths of the sea. \wj* +\p +\v 7 \wj “Woe to the world because of occasions of stumbling! For it must be that the occasions come, but woe to that person through whom the occasion comes! \wj* +\v 8 \wj If your hand or your foot causes you to stumble, cut it off and cast it from you. It is better for you to enter into life maimed or crippled, rather than having two hands or two feet to be cast into the eternal fire. \wj* +\v 9 \wj If your eye causes you to stumble, pluck it out and cast it from you. It is better for you to enter into life with one eye, rather than having two eyes to be cast into the Gehenna\wj*\f + \fr 18:9 \ft or, Hell\f* \wj of fire. \wj* +\v 10 \wj See that you don’t despise one of these little ones, for I tell you that in heaven their angels always see the face of my Father who is in heaven. \wj* +\v 11 \wj For the Son of Man came to save that which was lost.\wj*\f + \fr 18:11 \ft NU omits verse 11.\f* +\p +\v 12 \wj “What do you think? If a man has one hundred sheep, and one of them goes astray, doesn’t he leave the ninety-nine, go to the mountains, and seek that which has gone astray? \wj* +\v 13 \wj If he finds it, most certainly I tell you, he rejoices over it more than over the ninety-nine which have not gone astray. \wj* +\v 14 \wj Even so it is not the will of your Father who is in heaven that one of these little ones should perish.\wj* +\p +\v 15 \wj “If your brother sins against you, go, show him his fault between you and him alone. If he listens to you, you have gained back your brother. \wj* +\v 16 \wj But if he doesn’t listen, take one or two more with you, that at the mouth of two or three witnesses every word may be established.\wj*\x + \xo 18:16 \xt Deuteronomy 19:15\x* +\v 17 \wj If he refuses to listen to them, tell it to the assembly. If he refuses to hear the assembly also, let him be to you as a Gentile or a tax collector. \wj* +\v 18 \wj Most certainly I tell you, whatever things you bind on earth will have been bound in heaven, and whatever things you release on earth will have been released in heaven. \wj* +\v 19 \wj Again, assuredly I tell you, that if two of you will agree on earth concerning anything that they will ask, it will be done for them by my Father who is in heaven. \wj* +\v 20 \wj For where two or three are gathered together in my name, there I am in the middle of them.”\wj* +\p +\v 21 Then Peter came and said to him, “Lord, how often shall my brother sin against me, and I forgive him? Until seven times?” +\p +\v 22 Jesus said to him, \wj “I don’t tell you until seven times, but, until seventy times seven. \wj* +\v 23 \wj Therefore the Kingdom of Heaven is like a certain king who wanted to settle accounts with his servants. \wj* +\v 24 \wj When he had begun to settle, one was brought to him who owed him ten thousand talents.\wj*\f + \fr 18:24 \ft Ten thousand talents (about 300 metric tons of silver) represents an extremely large sum of money, equivalent to about 60,000,000 denarii, where one denarius was typical of one day’s wages for agricultural labor.\f* +\v 25 \wj But because he couldn’t pay, his lord commanded him to be sold, with his wife, his children, and all that he had, and payment to be made. \wj* +\v 26 \wj The servant therefore fell down and knelt before him, saying, ‘Lord, have patience with me, and I will repay you all!’ \wj* +\v 27 \wj The lord of that servant, being moved with compassion, released him and forgave him the debt.\wj* +\p +\v 28 \wj “But that servant went out and found one of his fellow servants who owed him one hundred denarii,\wj*\f + \fr 18:28 \ft 100 denarii was about one sixtieth of a talent, or about 500 grams (1.1 pounds) of silver.\f* \wj and he grabbed him and took him by the throat, saying, ‘Pay me what you owe!’\wj* +\p +\v 29 \wj “So his fellow servant fell down at his feet and begged him, saying, ‘Have patience with me, and I will repay you!’ \wj* +\v 30 \wj He would not, but went and cast him into prison until he should pay back that which was due. \wj* +\v 31 \wj So when his fellow servants saw what was done, they were exceedingly sorry, and came and told their lord all that was done. \wj* +\v 32 \wj Then his lord called him in and said to him, ‘You wicked servant! I forgave you all that debt because you begged me. \wj* +\v 33 \wj Shouldn’t you also have had mercy on your fellow servant, even as I had mercy on you?’ \wj* +\v 34 \wj His lord was angry, and delivered him to the tormentors until he should pay all that was due to him. \wj* +\v 35 \wj So my heavenly Father will also do to you, if you don’t each forgive your brother from your hearts for his misdeeds.”\wj* +\c 19 +\p +\v 1 When Jesus had finished these words, he departed from Galilee and came into the borders of Judea beyond the Jordan. +\v 2 Great multitudes followed him, and he healed them there. +\p +\v 3 Pharisees came to him, testing him and saying, “Is it lawful for a man to divorce his wife for any reason?” +\p +\v 4 He answered, \wj “Haven’t you read that he who made them from the beginning made them male and female,\wj*\x + \xo 19:4 \xt Genesis 1:27\x* +\v 5 \wj and said, ‘For this cause a man shall leave his father and mother, and shall be joined to his wife; and the two shall become one flesh?’\wj*\x + \xo 19:5 \xt Genesis 2:24\x* +\v 6 \wj So that they are no more two, but one flesh. What therefore God has joined together, don’t let man tear apart.”\wj* +\p +\v 7 They asked him, “Why then did Moses command us to give her a certificate of divorce and divorce her?” +\p +\v 8 He said to them, \wj “Moses, because of the hardness of your hearts, allowed you to divorce your wives, but from the beginning it has not been so. \wj* +\v 9 \wj I tell you that whoever divorces his wife, except for sexual immorality, and marries another, commits adultery; and he who marries her when she is divorced commits adultery.”\wj* +\p +\v 10 His disciples said to him, “If this is the case of the man with his wife, it is not expedient to marry.” +\p +\v 11 But he said to them, \wj “Not all men can receive this saying, but those to whom it is given. \wj* +\v 12 \wj For there are eunuchs who were born that way from their mother’s womb, and there are eunuchs who were made eunuchs by men; and there are eunuchs who made themselves eunuchs for the Kingdom of Heaven’s sake. He who is able to receive it, let him receive it.”\wj* +\p +\v 13 Then little children were brought to him that he should lay his hands on them and pray; and the disciples rebuked them. +\v 14 But Jesus said, \wj “Allow the little children, and don’t forbid them to come to me; for the Kingdom of Heaven belongs to ones like these.”\wj* +\v 15 He laid his hands on them, and departed from there. +\p +\v 16 Behold, one came to him and said, “Good teacher, what good thing shall I do, that I may have eternal life?” +\p +\v 17 He said to him, \wj “Why do you call me good?\wj*\f + \fr 19:17 \ft So MT and TR. NU reads “Why do you ask me about what is good?”\f* \wj No one is good but one, that is, God. But if you want to enter into life, keep the commandments.” \wj* +\p +\v 18 He said to him, “Which ones?” +\p Jesus said, \wj “‘You shall not murder.’ ‘You shall not commit adultery.’ ‘You shall not steal.’ ‘You shall not offer false testimony.’ \wj* +\v 19 \wj ‘Honor your father and your mother.’\wj*\x + \xo 19:19 \xt Exodus 20:12-16; Deuteronomy 5:16-20\x* \wj And, ‘You shall love your neighbor as yourself.’”\wj*\x + \xo 19:19 \xt Leviticus 19:18\x* +\p +\v 20 The young man said to him, “All these things I have observed from my youth. What do I still lack?” +\p +\v 21 Jesus said to him, \wj “If you want to be perfect, go, sell what you have, and give to the poor, and you will have treasure in heaven; and come, follow me.”\wj* +\v 22 But when the young man heard this, he went away sad, for he was one who had great possessions. +\p +\v 23 Jesus said to his disciples, \wj “Most certainly I say to you, a rich man will enter into the Kingdom of Heaven with difficulty. \wj* +\v 24 \wj Again I tell you, it is easier for a camel to go through a needle’s eye than for a rich man to enter into God’s Kingdom.”\wj* +\p +\v 25 When the disciples heard it, they were exceedingly astonished, saying, “Who then can be saved?” +\p +\v 26 Looking at them, Jesus said, \wj “With men this is impossible, but with God all things are possible.”\wj* +\p +\v 27 Then Peter answered, “Behold, we have left everything and followed you. What then will we have?” +\p +\v 28 Jesus said to them, \wj “Most certainly I tell you that you who have followed me, in the regeneration when the Son of Man will sit on the throne of his glory, you also will sit on twelve thrones, judging the twelve tribes of Israel. \wj* +\v 29 \wj Everyone who has left houses, or brothers, or sisters, or father, or mother, or wife, or children, or lands, for my name’s sake, will receive one hundred times, and will inherit eternal life. \wj* +\v 30 \wj But many will be last who are first, and first who are last. \wj* +\c 20 +\p +\v 1 \wj “For the Kingdom of Heaven is like a man who was the master of a household, who went out early in the morning to hire laborers for his vineyard. \wj* +\v 2 \wj When he had agreed with the laborers for a denarius\wj*\f + \fr 20:2 \ft A denarius is a silver Roman coin worth 1/25th of a Roman aureus. This was a common wage for a day of farm labor.\f* \wj a day, he sent them into his vineyard. \wj* +\v 3 \wj He went out about the third hour,\wj*\f + \fr 20:3 \ft Time was measured from sunrise to sunset, so the third hour would be about 9:00 a.m.\f* \wj and saw others standing idle in the marketplace. \wj* +\v 4 \wj He said to them, ‘You also go into the vineyard, and whatever is right I will give you.’ So they went their way. \wj* +\v 5 \wj Again he went out about the sixth and the ninth hour,\wj*\f + \fr 20:5 \ft noon and 3:00 p.m.\f* \wj and did likewise. \wj* +\v 6 \wj About the eleventh hour\wj*\f + \fr 20:6 \ft 5:00 p.m.\f* \wj he went out and found others standing idle. He said to them, ‘Why do you stand here all day idle?’ \wj* +\p +\v 7 \wj “They said to him, ‘Because no one has hired us.’\wj* +\p \wj “He said to them, ‘You also go into the vineyard, and you will receive whatever is right.’ \wj* +\p +\v 8 \wj “When evening had come, the lord of the vineyard said to his manager, ‘Call the laborers and pay them their wages, beginning from the last to the first.’\wj* +\v 9 \wj “When those who were hired at about the eleventh hour came, they each received a denarius. \wj* +\v 10 \wj When the first came, they supposed that they would receive more; and they likewise each received a denarius. \wj* +\v 11 \wj When they received it, they murmured against the master of the household, \wj* +\v 12 \wj saying, ‘These last have spent one hour, and you have made them equal to us who have borne the burden of the day and the scorching heat!’ \wj* +\p +\v 13 \wj “But he answered one of them, ‘Friend, I am doing you no wrong. Didn’t you agree with me for a denarius? \wj* +\v 14 \wj Take that which is yours, and go your way. It is my desire to give to this last just as much as to you. \wj* +\v 15 \wj Isn’t it lawful for me to do what I want to with what I own? Or is your eye evil, because I am good?’ \wj* +\v 16 \wj So the last will be first, and the first last. For many are called, but few are chosen.”\wj* +\p +\v 17 As Jesus was going up to Jerusalem, he took the twelve disciples aside, and on the way he said to them, +\v 18 \wj “Behold, we are going up to Jerusalem, and the Son of Man will be delivered to the chief priests and scribes, and they will condemn him to death, \wj* +\v 19 \wj and will hand him over to the Gentiles to mock, to scourge, and to crucify; and the third day he will be raised up.”\wj* +\p +\v 20 Then the mother of the sons of Zebedee came to him with her sons, kneeling and asking a certain thing of him. +\v 21 He said to her, \wj “What do you want?”\wj* +\p She said to him, “Command that these, my two sons, may sit, one on your right hand and one on your left hand, in your Kingdom.” +\p +\v 22 But Jesus answered, \wj “You don’t know what you are asking. Are you able to drink the cup that I am about to drink, and be baptized with the baptism that I am baptized with?”\wj* +\p They said to him, “We are able.” +\p +\v 23 He said to them, \wj “You will indeed drink my cup, and be baptized with the baptism that I am baptized with; but to sit on my right hand and on my left hand is not mine to give, but it is for whom it has been prepared by my Father.”\wj* +\p +\v 24 When the ten heard it, they were indignant with the two brothers. +\p +\v 25 But Jesus summoned them, and said, \wj “You know that the rulers of the nations lord it over them, and their great ones exercise authority over them. \wj* +\v 26 \wj It shall not be so among you; but whoever desires to become great among you shall be\wj*\f + \fr 20:26 \ft TR reads “let him be” instead of “shall be” \f* \wj your servant. \wj* +\v 27 \wj Whoever desires to be first among you shall be your bondservant, \wj* +\v 28 \wj even as the Son of Man came not to be served, but to serve, and to give his life as a ransom for many.”\wj* +\p +\v 29 As they went out from Jericho, a great multitude followed him. +\v 30 Behold, two blind men sitting by the road, when they heard that Jesus was passing by, cried out, “Lord, have mercy on us, you son of David!” +\v 31 The multitude rebuked them, telling them that they should be quiet, but they cried out even more, “Lord, have mercy on us, you son of David!” +\p +\v 32 Jesus stood still and called them, and asked, \wj “What do you want me to do for you?”\wj* +\p +\v 33 They told him, “Lord, that our eyes may be opened.” +\p +\v 34 Jesus, being moved with compassion, touched their eyes; and immediately their eyes received their sight, and they followed him. +\c 21 +\p +\v 1 When they came near to Jerusalem and came to Bethsphage,\f + \fr 21:1 \ft TR & NU read “Bethphage” instead of “Bethsphage”\f* to the Mount of Olives, then Jesus sent two disciples, +\v 2 saying to them, \wj “Go into the village that is opposite you, and immediately you will find a donkey tied, and a colt with her. Untie them and bring them to me. \wj* +\v 3 \wj If anyone says anything to you, you shall say, ‘The Lord needs them,’ and immediately he will send them.”\wj* +\p +\v 4 All this was done that it might be fulfilled which was spoken through the prophet, saying, +\q1 +\v 5 “Tell the daughter of Zion, +\q2 behold, your King comes to you, +\q2 humble, and riding on a donkey, +\q2 on a colt, the foal of a donkey.”\x + \xo 21:5 \xt Zechariah 9:9\x* +\p +\v 6 The disciples went and did just as Jesus commanded them, +\v 7 and brought the donkey and the colt and laid their clothes on them; and he sat on them. +\v 8 A very great multitude spread their clothes on the road. Others cut branches from the trees and spread them on the road. +\v 9 The multitudes who went in front of him, and those who followed, kept shouting, “Hosanna\f + \fr 21:9 \ft “Hosanna” means “save us” or “help us, we pray”.\f* to the son of David! Blessed is he who comes in the name of the Lord! Hosanna in the highest!” \x + \xo 21:9 \xt Psalm 118:26\x* +\p +\v 10 When he had come into Jerusalem, all the city was stirred up, saying, “Who is this?” +\p +\v 11 The multitudes said, “This is the prophet, Jesus, from Nazareth of Galilee.” +\p +\v 12 Jesus entered into the temple of God and drove out all of those who sold and bought in the temple, and overthrew the money changers’ tables and the seats of those who sold the doves. +\v 13 He said to them, \wj “It is written, ‘My house shall be called a house of prayer,’\wj*\x + \xo 21:13 \xt Isaiah 56:7\x* \wj but you have made it a den of robbers!”\wj*\x + \xo 21:13 \xt Jeremiah 7:11\x* +\p +\v 14 The lame and the blind came to him in the temple, and he healed them. +\v 15 But when the chief priests and the scribes saw the wonderful things that he did, and the children who were crying in the temple and saying, “Hosanna to the son of David!” they were indignant, +\v 16 and said to him, “Do you hear what these are saying?” +\p Jesus said to them, \wj “Yes. Did you never read, ‘Out of the mouth of children and nursing babies, you have perfected praise?’”\wj*\x + \xo 21:16 \xt Psalm 8:2\x* +\p +\v 17 He left them and went out of the city to Bethany, and camped there. +\p +\v 18 Now in the morning, as he returned to the city, he was hungry. +\v 19 Seeing a fig tree by the road, he came to it and found nothing on it but leaves. He said to it, \wj “Let there be no fruit from you forever!” \wj* +\p Immediately the fig tree withered away. +\p +\v 20 When the disciples saw it, they marveled, saying, “How did the fig tree immediately wither away?” +\p +\v 21 Jesus answered them, \wj “Most certainly I tell you, if you have faith and don’t doubt, you will not only do what was done to the fig tree, but even if you told this mountain, ‘Be taken up and cast into the sea,’ it would be done. \wj* +\v 22 \wj All things, whatever you ask in prayer, believing, you will receive.”\wj* +\p +\v 23 When he had come into the temple, the chief priests and the elders of the people came to him as he was teaching, and said, “By what authority do you do these things? Who gave you this authority?” +\p +\v 24 Jesus answered them, \wj “I also will ask you one question, which if you tell me, I likewise will tell you by what authority I do these things. \wj* +\v 25 \wj The baptism of John, where was it from? From heaven or from men?” \wj* +\p They reasoned with themselves, saying, “If we say, ‘From heaven,’ he will ask us, ‘Why then did you not believe him?’ +\v 26 But if we say, ‘From men,’ we fear the multitude, for all hold John as a prophet.” +\v 27 They answered Jesus, and said, “We don’t know.” +\p He also said to them, \wj “Neither will I tell you by what authority I do these things. \wj* +\v 28 \wj But what do you think? A man had two sons, and he came to the first, and said, ‘Son, go work today in my vineyard.’ \wj* +\v 29 \wj He answered, ‘I will not,’ but afterward he changed his mind, and went. \wj* +\v 30 \wj He came to the second, and said the same thing. He answered, ‘I’m going, sir,’ but he didn’t go. \wj* +\v 31 \wj Which of the two did the will of his father?”\wj* +\p They said to him, “The first.” +\p Jesus said to them, \wj “Most certainly I tell you that the tax collectors and the prostitutes are entering into God’s Kingdom before you. \wj* +\v 32 \wj For John came to you in the way of righteousness, and you didn’t believe him; but the tax collectors and the prostitutes believed him. When you saw it, you didn’t even repent afterward, that you might believe him. \wj* +\p +\v 33 \wj “Hear another parable. There was a man who was a master of a household who planted a vineyard, set a hedge about it, dug a wine press in it, built a tower, leased it out to farmers, and went into another country. \wj* +\v 34 \wj When the season for the fruit came near, he sent his servants to the farmers to receive his fruit. \wj* +\v 35 \wj The farmers took his servants, beat one, killed another, and stoned another. \wj* +\v 36 \wj Again, he sent other servants more than the first; and they treated them the same way. \wj* +\v 37 \wj But afterward he sent to them his son, saying, ‘They will respect my son.’ \wj* +\v 38 \wj But the farmers, when they saw the son, said among themselves, ‘This is the heir. Come, let’s kill him and seize his inheritance.’ \wj* +\v 39 \wj So they took him and threw him out of the vineyard, then killed him. \wj* +\v 40 \wj When therefore the lord of the vineyard comes, what will he do to those farmers?”\wj* +\p +\v 41 They told him, “He will miserably destroy those miserable men, and will lease out the vineyard to other farmers who will give him the fruit in its season.” +\p +\v 42 Jesus said to them, \wj “Did you never read in the Scriptures, \wj* +\q1 \wj ‘The stone which the builders rejected\wj* +\q2 \wj was made the head of the corner.\wj* +\q1 \wj This was from the Lord.\wj* +\q2 \wj It is marvelous in our eyes’?\wj*\x + \xo 21:42 \xt Psalm 118:22-23\x* +\p +\v 43 \wj “Therefore I tell you, God’s Kingdom will be taken away from you and will be given to a nation producing its fruit. \wj* +\v 44 \wj He who falls on this stone will be broken to pieces, but on whomever it will fall, it will scatter him as dust.”\wj* +\p +\v 45 When the chief priests and the Pharisees heard his parables, they perceived that he spoke about them. +\v 46 When they sought to seize him, they feared the multitudes, because they considered him to be a prophet. +\c 22 +\p +\v 1 Jesus answered and spoke to them again in parables, saying, +\v 2 \wj “The Kingdom of Heaven is like a certain king, who made a wedding feast for his son, \wj* +\v 3 \wj and sent out his servants to call those who were invited to the wedding feast, but they would not come. \wj* +\v 4 \wj Again he sent out other servants, saying, ‘Tell those who are invited, “Behold, I have prepared my dinner. My cattle and my fatlings are killed, and all things are ready. Come to the wedding feast!”’ \wj* +\v 5 \wj But they made light of it, and went their ways, one to his own farm, another to his merchandise; \wj* +\v 6 \wj and the rest grabbed his servants, treated them shamefully, and killed them. \wj* +\v 7 \wj When the king heard that, he was angry, and sent his armies, destroyed those murderers, and burned their city.\wj* +\p +\v 8 \wj “Then he said to his servants, ‘The wedding is ready, but those who were invited weren’t worthy. \wj* +\v 9 \wj Go therefore to the intersections of the highways, and as many as you may find, invite to the wedding feast.’ \wj* +\v 10 \wj Those servants went out into the highways and gathered together as many as they found, both bad and good. The wedding was filled with guests. \wj* +\p +\v 11 \wj “But when the king came in to see the guests, he saw there a man who didn’t have on wedding clothing, \wj* +\v 12 \wj and he said to him, ‘Friend, how did you come in here not wearing wedding clothing?’ He was speechless. \wj* +\v 13 \wj Then the king said to the servants, ‘Bind him hand and foot, take him away, and throw him into the outer darkness. That is where the weeping and grinding of teeth will be.’ \wj* +\v 14 \wj For many are called, but few chosen.”\wj* +\p +\v 15 Then the Pharisees went and took counsel how they might entrap him in his talk. +\v 16 They sent their disciples to him, along with the Herodians, saying, “Teacher, we know that you are honest, and teach the way of God in truth, no matter whom you teach; for you aren’t partial to anyone. +\v 17 Tell us therefore, what do you think? Is it lawful to pay taxes to Caesar, or not?” +\p +\v 18 But Jesus perceived their wickedness, and said, \wj “Why do you test me, you hypocrites? \wj* +\v 19 \wj Show me the tax money.”\wj* +\p They brought to him a denarius. +\p +\v 20 He asked them, \wj “Whose is this image and inscription?”\wj* +\p +\v 21 They said to him, “Caesar’s.” +\p Then he said to them, \wj “Give therefore to Caesar the things that are Caesar’s, and to God the things that are God’s.”\wj* +\p +\v 22 When they heard it, they marveled, and left him and went away. +\p +\v 23 On that day Sadducees (those who say that there is no resurrection) came to him. They asked him, +\v 24 saying, “Teacher, Moses said, ‘If a man dies, having no children, his brother shall marry his wife and raise up offspring\f + \fr 22:24 \ft or, seed\f* for his brother.’ +\v 25 Now there were with us seven brothers. The first married and died, and having no offspring left his wife to his brother. +\v 26 In the same way, the second also, and the third, to the seventh. +\v 27 After them all, the woman died. +\v 28 In the resurrection therefore, whose wife will she be of the seven? For they all had her.” +\p +\v 29 But Jesus answered them, \wj “You are mistaken, not knowing the Scriptures, nor the power of God. \wj* +\v 30 \wj For in the resurrection they neither marry nor are given in marriage, but are like God’s angels in heaven. \wj* +\v 31 \wj But concerning the resurrection of the dead, haven’t you read that which was spoken to you by God, saying, \wj* +\v 32 \wj ‘I am the God of Abraham, and the God of Isaac, and the God of Jacob?’\wj*\x + \xo 22:32 \xt Exodus 3:6\x* \wj God is not the God of the dead, but of the living.”\wj* +\p +\v 33 When the multitudes heard it, they were astonished at his teaching. +\p +\v 34 But the Pharisees, when they heard that he had silenced the Sadducees, gathered themselves together. +\v 35 One of them, a lawyer, asked him a question, testing him. +\v 36 “Teacher, which is the greatest commandment in the law?” +\p +\v 37 Jesus said to him, \wj “‘You shall love the Lord your God with all your heart, with all your soul, and with all your mind.’\wj*\x + \xo 22:37 \xt Deuteronomy 6:5 \x* +\v 38 \wj This is the first and great commandment. \wj* +\v 39 \wj A second likewise is this, ‘You shall love your neighbor as yourself.’\wj*\x + \xo 22:39 \xt Leviticus 19:18\x* +\v 40 \wj The whole law and the prophets depend on these two commandments.” \wj* +\p +\v 41 Now while the Pharisees were gathered together, Jesus asked them a question, +\v 42 saying, \wj “What do you think of the Christ? Whose son is he?” \wj* +\p They said to him, “Of David.” +\p +\v 43 He said to them, \wj “How then does David in the Spirit call him Lord, saying,\wj* +\q1 +\v 44 \wj ‘The Lord said to my Lord,\wj* +\q2 \wj sit on my right hand,\wj* +\q2 \wj until I make your enemies a footstool for your feet’?\wj*\x + \xo 22:44 \xt Psalm 110:1\x* +\p +\v 45 \wj “If then David calls him Lord, how is he his son?”\wj* +\p +\v 46 No one was able to answer him a word, neither did any man dare ask him any more questions from that day forward. +\c 23 + +\p +\v 1 Then Jesus spoke to the multitudes and to his disciples, +\v 2 saying, \wj “The scribes and the Pharisees sit on Moses’ seat. \wj* +\v 3 \wj All things therefore whatever they tell you to observe, observe and do, but don’t do their works; for they say, and don’t do. \wj* +\v 4 \wj For they bind heavy burdens that are grievous to be borne, and lay them on men’s shoulders; but they themselves will not lift a finger to help them. \wj* +\v 5 \wj But they do all their works to be seen by men. They make their phylacteries\wj*\f + \fr 23:5 \ft phylacteries (tefillin in Hebrew) are small leather pouches that some Jewish men wear on their forehead and arm in prayer. They are used to carry a small scroll with some Scripture in it. See Deuteronomy 6:8.\f* \wj broad and enlarge the fringes\wj*\f + \fr 23:5 \ft or, tassels\f* \wj of their garments, \wj* +\v 6 \wj and love the place of honor at feasts, the best seats in the synagogues, \wj* +\v 7 \wj the salutations in the marketplaces, and to be called ‘Rabbi, Rabbi’\wj*\f + \fr 23:7 \ft NU omits the second “Rabbi”. \f* \wj by men. \wj* +\v 8 \wj But you are not to be called ‘Rabbi’, for one is your teacher, the Christ, and all of you are brothers. \wj* +\v 9 \wj Call no man on the earth your father, for one is your Father, he who is in heaven. \wj* +\v 10 \wj Neither be called masters, for one is your master, the Christ. \wj* +\v 11 \wj But he who is greatest among you will be your servant. \wj* +\v 12 \wj Whoever exalts himself will be humbled, and whoever humbles himself will be exalted.\wj* +\p +\v 13 \wj “Woe to you, scribes and Pharisees, hypocrites! For you devour widows’ houses, and as a pretense you make long prayers. Therefore you will receive greater condemnation.\wj* +\p +\v 14 \wj “But woe to you, scribes and Pharisees, hypocrites! Because you shut up the Kingdom of Heaven against men; for you don’t enter in yourselves, neither do you allow those who are entering in to enter.\wj*\f + \fr 23:14 \ft Some Greek texts reverse the order of verses 13 and 14, and some omit verse 13, numbering verse 14 as 13. NU omits verse 14.\f* +\v 15 \wj Woe to you, scribes and Pharisees, hypocrites! For you travel around by sea and land to make one proselyte; and when he becomes one, you make him twice as much a son of Gehenna\wj*\f + \fr 23:15 \ft or, Hell\f* \wj as yourselves. \wj* +\p +\v 16 \wj “Woe to you, you blind guides, who say, ‘Whoever swears by the temple, it is nothing; but whoever swears by the gold of the temple, he is obligated.’ \wj* +\v 17 \wj You blind fools! For which is greater, the gold or the temple that sanctifies the gold? \wj* +\v 18 \wj And, ‘Whoever swears by the altar, it is nothing; but whoever swears by the gift that is on it, he is obligated?’ \wj* +\v 19 \wj You blind fools! For which is greater, the gift, or the altar that sanctifies the gift? \wj* +\v 20 \wj He therefore who swears by the altar, swears by it and by everything on it. \wj* +\v 21 \wj He who swears by the temple, swears by it and by him who has been living\wj*\f + \fr 23:21 \ft NU reads “lives”\f* \wj in it. \wj* +\v 22 \wj He who swears by heaven, swears by the throne of God and by him who sits on it.\wj* +\p +\v 23 \wj “Woe to you, scribes and Pharisees, hypocrites! For you tithe mint, dill, and cumin,\wj*\f + \fr 23:23 \ft cumin is an aromatic seed from Cuminum cyminum, resembling caraway in flavor and appearance. It is used as a spice.\f* \wj and have left undone the weightier matters of the law: justice, mercy, and faith. But you ought to have done these, and not to have left the other undone. \wj* +\v 24 \wj You blind guides, who strain out a gnat, and swallow a camel! \wj* +\p +\v 25 \wj “Woe to you, scribes and Pharisees, hypocrites! For you clean the outside of the cup and of the platter, but within they are full of extortion and unrighteousness.\wj*\f + \fr 23:25 \ft TR reads “self-indulgence” instead of “unrighteousness”\f* +\v 26 \wj You blind Pharisee, first clean the inside of the cup and of the platter, that its outside may become clean also.\wj* +\p +\v 27 \wj “Woe to you, scribes and Pharisees, hypocrites! For you are like whitened tombs, which outwardly appear beautiful, but inwardly are full of dead men’s bones and of all uncleanness. \wj* +\v 28 \wj Even so you also outwardly appear righteous to men, but inwardly you are full of hypocrisy and iniquity.\wj* +\p +\v 29 \wj “Woe to you, scribes and Pharisees, hypocrites! For you build the tombs of the prophets and decorate the tombs of the righteous, \wj* +\v 30 \wj and say, ‘If we had lived in the days of our fathers, we wouldn’t have been partakers with them in the blood of the prophets.’ \wj* +\v 31 \wj Therefore you testify to yourselves that you are children of those who killed the prophets. \wj* +\v 32 \wj Fill up, then, the measure of your fathers. \wj* +\v 33 \wj You serpents, you offspring of vipers, how will you escape the judgment of Gehenna?\wj*\f + \fr 23:33 \ft or, Hell\f* +\v 34 \wj Therefore, behold, I send to you prophets, wise men, and scribes. Some of them you will kill and crucify; and some of them you will scourge in your synagogues and persecute from city to city, \wj* +\v 35 \wj that on you may come all the righteous blood shed on the earth, from the blood of righteous Abel to the blood of Zachariah son of Barachiah, whom you killed between the sanctuary and the altar. \wj* +\v 36 \wj Most certainly I tell you, all these things will come upon this generation.\wj* +\p +\v 37 \wj “Jerusalem, Jerusalem, who kills the prophets and stones those who are sent to her! How often I would have gathered your children together, even as a hen gathers her chicks under her wings, and you would not! \wj* +\v 38 \wj Behold, your house is left to you desolate. \wj* +\v 39 \wj For I tell you, you will not see me from now on, until you say, ‘Blessed is he who comes in the name of the Lord!’”\wj*\x + \xo 23:39 \xt Psalm 118:26 \x* +\c 24 +\p +\v 1 Jesus went out from the temple, and was going on his way. His disciples came to him to show him the buildings of the temple. +\v 2 But he answered them, \wj “You see all of these things, don’t you? Most certainly I tell you, there will not be left here one stone on another, that will not be thrown down.”\wj* +\p +\v 3 As he sat on the Mount of Olives, the disciples came to him privately, saying, “Tell us, when will these things be? What is the sign of your coming, and of the end of the age?” +\p +\v 4 Jesus answered them, \wj “Be careful that no one leads you astray. \wj* +\v 5 \wj For many will come in my name, saying, ‘I am the Christ,’ and will lead many astray. \wj* +\v 6 \wj You will hear of wars and rumors of wars. See that you aren’t troubled, for all this must happen, but the end is not yet. \wj* +\v 7 \wj For nation will rise against nation, and kingdom against kingdom; and there will be famines, plagues, and earthquakes in various places. \wj* +\v 8 \wj But all these things are the beginning of birth pains. \wj* +\p +\v 9 \wj “Then they will deliver you up to oppression and will kill you. You will be hated by all of the nations for my name’s sake. \wj* +\v 10 \wj Then many will stumble, and will deliver up one another, and will hate one another. \wj* +\v 11 \wj Many false prophets will arise and will lead many astray. \wj* +\v 12 \wj Because iniquity will be multiplied, the love of many will grow cold. \wj* +\v 13 \wj But he who endures to the end will be saved. \wj* +\v 14 \wj This Good News of the Kingdom will be preached in the whole world for a testimony to all the nations, and then the end will come.\wj* +\p +\v 15 \wj “When, therefore, you see the abomination of desolation,\wj*\x + \xo 24:15 \xt Daniel 9:27; 11:31; 12:11\x* \wj which was spoken of through Daniel the prophet, standing in the holy place (let the reader understand), \wj* +\v 16 \wj then let those who are in Judea flee to the mountains. \wj* +\v 17 \wj Let him who is on the housetop not go down to take out the things that are in his house. \wj* +\v 18 \wj Let him who is in the field not return back to get his clothes. \wj* +\v 19 \wj But woe to those who are with child and to nursing mothers in those days! \wj* +\v 20 \wj Pray that your flight will not be in the winter nor on a Sabbath, \wj* +\v 21 \wj for then there will be great suffering,\wj*\f + \fr 24:21 \ft or, oppression\f* \wj such as has not been from the beginning of the world until now, no, nor ever will be. \wj* +\v 22 \wj Unless those days had been shortened, no flesh would have been saved. But for the sake of the chosen ones, those days will be shortened. \wj* +\p +\v 23 \wj “Then if any man tells you, ‘Behold, here is the Christ!’ or, ‘There!’ don’t believe it. \wj* +\v 24 \wj For false christs and false prophets will arise, and they will show great signs and wonders, so as to lead astray, if possible, even the chosen ones.\wj* +\p +\v 25 \wj “Behold, I have told you beforehand. \wj* +\p +\v 26 \wj “If therefore they tell you, ‘Behold, he is in the wilderness,’ don’t go out; or ‘Behold, he is in the inner rooms,’ don’t believe it. \wj* +\v 27 \wj For as the lightning flashes from the east, and is seen even to the west, so will the coming of the Son of Man be. \wj* +\v 28 \wj For wherever the carcass is, that is where the vultures\wj*\f + \fr 24:28 \ft or, eagles\f* \wj gather together. \wj* +\p +\v 29 \wj “But immediately after the suffering\wj*\f + \fr 24:29 \ft or, oppression\f* \wj of those days, the sun will be darkened, the moon will not give its light, the stars will fall from the sky, and the powers of the heavens will be shaken;\wj*\x + \xo 24:29 \xt Isaiah 13:10; 34:4 \x* +\v 30 \wj and then the sign of the Son of Man will appear in the sky. Then all the tribes of the earth will mourn, and they will see the Son of Man coming on the clouds of the sky with power and great glory. \wj* +\v 31 \wj He will send out his angels with a great sound of a trumpet, and they will gather together his chosen ones from the four winds, from one end of the sky to the other.\wj* +\p +\v 32 \wj “Now from the fig tree learn this parable: When its branch has now become tender and produces its leaves, you know that the summer is near. \wj* +\v 33 \wj Even so you also, when you see all these things, know that he is near, even at the doors. \wj* +\v 34 \wj Most certainly I tell you, this generation\wj*\f + \fr 24:34 \ft The word for “generation” (genea) can also be translated as “race.”\f* \wj will not pass away until all these things are accomplished. \wj* +\v 35 \wj Heaven and earth will pass away, but my words will not pass away. \wj* +\p +\v 36 \wj “But no one knows of that day and hour, not even the angels of heaven,\wj*\f + \fr 24:36 \ft NU adds “nor the son”\f* \wj but my Father only.\wj* +\v 37 \wj As the days of Noah were, so will the coming of the Son of Man be. \wj* +\v 38 \wj For as in those days which were before the flood they were eating and drinking, marrying and giving in marriage, until the day that Noah entered into the ship, \wj* +\v 39 \wj and they didn’t know until the flood came and took them all away, so will the coming of the Son of Man be. \wj* +\v 40 \wj Then two men will be in the field: one will be taken and one will be left. \wj* +\v 41 \wj Two women will be grinding at the mill: one will be taken and one will be left. \wj* +\v 42 \wj Watch therefore, for you don’t know in what hour your Lord comes. \wj* +\v 43 \wj But know this, that if the master of the house had known in what watch of the night the thief was coming, he would have watched, and would not have allowed his house to be broken into. \wj* +\v 44 \wj Therefore also be ready, for in an hour that you don’t expect, the Son of Man will come.\wj* +\p +\v 45 \wj “Who then is the faithful and wise servant, whom his lord has set over his household, to give them their food in due season? \wj* +\v 46 \wj Blessed is that servant whom his lord finds doing so when he comes. \wj* +\v 47 \wj Most certainly I tell you that he will set him over all that he has. \wj* +\v 48 \wj But if that evil servant should say in his heart, ‘My lord is delaying his coming,’ \wj* +\v 49 \wj and begins to beat his fellow servants, and eat and drink with the drunkards, \wj* +\v 50 \wj the lord of that servant will come in a day when he doesn’t expect it and in an hour when he doesn’t know it, \wj* +\v 51 \wj and will cut him in pieces and appoint his portion with the hypocrites. That is where the weeping and grinding of teeth will be. \wj* +\c 25 +\p +\v 1 \wj “Then the Kingdom of Heaven will be like ten virgins who took their lamps and went out to meet the bridegroom. \wj* +\v 2 \wj Five of them were foolish, and five were wise. \wj* +\v 3 \wj Those who were foolish, when they took their lamps, took no oil with them, \wj* +\v 4 \wj but the wise took oil in their vessels with their lamps. \wj* +\v 5 \wj Now while the bridegroom delayed, they all slumbered and slept. \wj* +\v 6 \wj But at midnight there was a cry, ‘Behold! The bridegroom is coming! Come out to meet him!’ \wj* +\v 7 \wj Then all those virgins arose, and trimmed their lamps.\wj*\f + \fr 25:7 \ft The end of the wick of an oil lamp needs to be cut off periodically to avoid having it become clogged with carbon deposits. The wick height is also adjusted so that the flame burns evenly and gives good light without producing a lot of smoke.\f* +\v 8 \wj The foolish said to the wise, ‘Give us some of your oil, for our lamps are going out.’ \wj* +\v 9 \wj But the wise answered, saying, ‘What if there isn’t enough for us and you? You go rather to those who sell, and buy for yourselves.’ \wj* +\v 10 \wj While they went away to buy, the bridegroom came, and those who were ready went in with him to the wedding feast, and the door was shut. \wj* +\v 11 \wj Afterward the other virgins also came, saying, ‘Lord, Lord, open to us.’ \wj* +\v 12 \wj But he answered, ‘Most certainly I tell you, I don’t know you.’ \wj* +\v 13 \wj Watch therefore, for you don’t know the day nor the hour in which the Son of Man is coming.\wj* +\p +\v 14 \wj “For it is like a man going into another country, who called his own servants and entrusted his goods to them. \wj* +\v 15 \wj To one he gave five talents,\wj*\f + \fr 25:15 \ft A talent is about 30 kilograms or 66 pounds (usually used to weigh silver unless otherwise specified)\f* \wj to another two, to another one, to each according to his own ability. Then he went on his journey. \wj* +\v 16 \wj Immediately he who received the five talents went and traded with them, and made another five talents. \wj* +\v 17 \wj In the same way, he also who got the two gained another two. \wj* +\v 18 \wj But he who received the one talent went away and dug in the earth and hid his lord’s money.\wj* +\p +\v 19 \wj “Now after a long time the lord of those servants came, and settled accounts with them. \wj* +\v 20 \wj He who received the five talents came and brought another five talents, saying, ‘Lord, you delivered to me five talents. Behold, I have gained another five talents in addition to them.’\wj* +\p +\v 21 \wj “His lord said to him, ‘Well done, good and faithful servant. You have been faithful over a few things, I will set you over many things. Enter into the joy of your lord.’\wj* +\p +\v 22 \wj “He also who got the two talents came and said, ‘Lord, you delivered to me two talents. Behold, I have gained another two talents in addition to them.’ \wj* +\p +\v 23 \wj “His lord said to him, ‘Well done, good and faithful servant. You have been faithful over a few things. I will set you over many things. Enter into the joy of your lord.’\wj* +\p +\v 24 \wj “He also who had received the one talent came and said, ‘Lord, I knew you that you are a hard man, reaping where you didn’t sow, and gathering where you didn’t scatter. \wj* +\v 25 \wj I was afraid, and went away and hid your talent in the earth. Behold, you have what is yours.’\wj* +\p +\v 26 \wj “But his lord answered him, ‘You wicked and slothful servant. You knew that I reap where I didn’t sow, and gather where I didn’t scatter. \wj* +\v 27 \wj You ought therefore to have deposited my money with the bankers, and at my coming I should have received back my own with interest. \wj* +\v 28 \wj Take away therefore the talent from him and give it to him who has the ten talents. \wj* +\v 29 \wj For to everyone who has will be given, and he will have abundance, but from him who doesn’t have, even that which he has will be taken away. \wj* +\v 30 \wj Throw out the unprofitable servant into the outer darkness, where there will be weeping and gnashing of teeth.’\wj* +\p +\v 31 \wj “But when the Son of Man comes in his glory, and all the holy angels with him, then he will sit on the throne of his glory. \wj* +\v 32 \wj Before him all the nations will be gathered, and he will separate them one from another, as a shepherd separates the sheep from the goats. \wj* +\v 33 \wj He will set the sheep on his right hand, but the goats on the left. \wj* +\v 34 \wj Then the King will tell those on his right hand, ‘Come, blessed of my Father, inherit the Kingdom prepared for you from the foundation of the world; \wj* +\v 35 \wj for I was hungry and you gave me food to eat. I was thirsty and you gave me drink. I was a stranger and you took me in. \wj* +\v 36 \wj I was naked and you clothed me. I was sick and you visited me. I was in prison and you came to me.’\wj* +\p +\v 37 \wj “Then the righteous will answer him, saying, ‘Lord, when did we see you hungry and feed you, or thirsty and give you a drink? \wj* +\v 38 \wj When did we see you as a stranger and take you in, or naked and clothe you? \wj* +\v 39 \wj When did we see you sick or in prison and come to you?’\wj* +\p +\v 40 \wj “The King will answer them, ‘Most certainly I tell you, because you did it to one of the least of these my brothers,\wj*\f + \fr 25:40 \ft The word for “brothers” here may be also correctly translated “brothers and sisters” or “siblings.”\f* \wj you did it to me.’ \wj* +\v 41 \wj Then he will say also to those on the left hand, ‘Depart from me, you cursed, into the eternal fire which is prepared for the devil and his angels; \wj* +\v 42 \wj for I was hungry, and you didn’t give me food to eat; I was thirsty, and you gave me no drink; \wj* +\v 43 \wj I was a stranger, and you didn’t take me in; naked, and you didn’t clothe me; sick, and in prison, and you didn’t visit me.’\wj* +\p +\v 44 \wj “Then they will also answer, saying, ‘Lord, when did we see you hungry, or thirsty, or a stranger, or naked, or sick, or in prison, and didn’t help you?’\wj* +\p +\v 45 \wj “Then he will answer them, saying, ‘Most certainly I tell you, because you didn’t do it to one of the least of these, you didn’t do it to me.’ \wj* +\v 46 \wj These will go away into eternal punishment, but the righteous into eternal life.”\wj* +\c 26 +\p +\v 1 When Jesus had finished all these words, he said to his disciples, +\v 2 \wj “You know that after two days the Passover is coming, and the Son of Man will be delivered up to be crucified.”\wj* +\p +\v 3 Then the chief priests, the scribes, and the elders of the people were gathered together in the court of the high priest, who was called Caiaphas. +\v 4 They took counsel together that they might take Jesus by deceit and kill him. +\v 5 But they said, “Not during the feast, lest a riot occur among the people.” +\p +\v 6 Now when Jesus was in Bethany, in the house of Simon the leper, +\v 7 a woman came to him having an alabaster jar of very expensive ointment, and she poured it on his head as he sat at the table. +\v 8 But when his disciples saw this, they were indignant, saying, “Why this waste? +\v 9 For this ointment might have been sold for much and given to the poor.” +\p +\v 10 However, knowing this, Jesus said to them, \wj “Why do you trouble the woman? She has done a good work for me. \wj* +\v 11 \wj For you always have the poor with you, but you don’t always have me. \wj* +\v 12 \wj For in pouring this ointment on my body, she did it to prepare me for burial. \wj* +\v 13 \wj Most certainly I tell you, wherever this Good News is preached in the whole world, what this woman has done will also be spoken of as a memorial of her.”\wj* +\p +\v 14 Then one of the twelve, who was called Judas Iscariot, went to the chief priests +\v 15 and said, “What are you willing to give me if I deliver him to you?” So they weighed out for him thirty pieces of silver. +\v 16 From that time he sought opportunity to betray him. +\p +\v 17 Now on the first day of unleavened bread, the disciples came to Jesus, saying to him, “Where do you want us to prepare for you to eat the Passover?” +\p +\v 18 He said, \wj “Go into the city to a certain person, and tell him, ‘The Teacher says, “My time is at hand. I will keep the Passover at your house with my disciples.”’”\wj* +\p +\v 19 The disciples did as Jesus commanded them, and they prepared the Passover. +\p +\v 20 Now when evening had come, he was reclining at the table with the twelve disciples. +\v 21 As they were eating, he said, \wj “Most certainly I tell you that one of you will betray me.”\wj* +\p +\v 22 They were exceedingly sorrowful, and each began to ask him, “It isn’t me, is it, Lord?” +\p +\v 23 He answered, \wj “He who dipped his hand with me in the dish will betray me. \wj* +\v 24 \wj The Son of Man goes even as it is written of him, but woe to that man through whom the Son of Man is betrayed! It would be better for that man if he had not been born.”\wj* +\p +\v 25 Judas, who betrayed him, answered, “It isn’t me, is it, Rabbi?” +\p He said to him, \wj “You said it.”\wj* +\p +\v 26 As they were eating, Jesus took bread, gave thanks for\f + \fr 26:26 \ft TR reads “blessed” instead of “gave thanks for”\f* it, and broke it. He gave to the disciples and said, \wj “Take, eat; this is my body.”\wj* +\v 27 He took the cup, gave thanks, and gave to them, saying, \wj “All of you drink it, \wj* +\v 28 \wj for this is my blood of the new covenant, which is poured out for many for the remission of sins. \wj* +\v 29 \wj But I tell you that I will not drink of this fruit of the vine from now on, until that day when I drink it anew with you in my Father’s Kingdom.” \wj* +\p +\v 30 When they had sung a hymn, they went out to the Mount of Olives. +\p +\v 31 Then Jesus said to them, \wj “All of you will be made to stumble because of me tonight, for it is written, ‘I will strike the shepherd, and the sheep of the flock will be scattered.’\wj*\x + \xo 26:31 \xt Zechariah 13:7\x* +\v 32 \wj But after I am raised up, I will go before you into Galilee.” \wj* +\p +\v 33 But Peter answered him, “Even if all will be made to stumble because of you, I will never be made to stumble.” +\p +\v 34 Jesus said to him, \wj “Most certainly I tell you that tonight, before the rooster crows, you will deny me three times.”\wj* +\p +\v 35 Peter said to him, “Even if I must die with you, I will not deny you.” All of the disciples also said likewise. +\p +\v 36 Then Jesus came with them to a place called Gethsemane, and said to his disciples, \wj “Sit here, while I go there and pray.”\wj* +\v 37 He took with him Peter and the two sons of Zebedee, and began to be sorrowful and severely troubled. +\v 38 Then he said to them, \wj “My soul is exceedingly sorrowful, even to death. Stay here and watch with me.”\wj* +\p +\v 39 He went forward a little, fell on his face, and prayed, saying, \wj “My Father, if it is possible, let this cup pass away from me; nevertheless, not what I desire, but what you desire.”\wj* +\p +\v 40 He came to the disciples and found them sleeping, and said to Peter, \wj “What, couldn’t you watch with me for one hour? \wj* +\v 41 \wj Watch and pray, that you don’t enter into temptation. The spirit indeed is willing, but the flesh is weak.”\wj* +\p +\v 42 Again, a second time he went away and prayed, saying, \wj “My Father, if this cup can’t pass away from me unless I drink it, your desire be done.” \wj* +\p +\v 43 He came again and found them sleeping, for their eyes were heavy. +\v 44 He left them again, went away, and prayed a third time, saying the same words. +\v 45 Then he came to his disciples and said to them, \wj “Are you still sleeping and resting? Behold, the hour is at hand, and the Son of Man is betrayed into the hands of sinners. \wj* +\v 46 \wj Arise, let’s be going. Behold, he who betrays me is at hand.” \wj* +\p +\v 47 While he was still speaking, behold, Judas, one of the twelve, came, and with him a great multitude with swords and clubs, from the chief priests and elders of the people. +\v 48 Now he who betrayed him had given them a sign, saying, “Whoever I kiss, he is the one. Seize him.” +\v 49 Immediately he came to Jesus, and said, “Greetings, Rabbi!” and kissed him. +\p +\v 50 Jesus said to him, \wj “Friend, why are you here?”\wj* +\p Then they came and laid hands on Jesus, and took him. +\v 51 Behold, one of those who were with Jesus stretched out his hand and drew his sword, and struck the servant of the high priest, and cut off his ear. +\p +\v 52 Then Jesus said to him, \wj “Put your sword back into its place, for all those who take the sword will die by the sword. \wj* +\v 53 \wj Or do you think that I couldn’t ask my Father, and he would even now send me more than twelve legions of angels? \wj* +\v 54 \wj How then would the Scriptures be fulfilled that it must be so?” \wj* +\p +\v 55 In that hour Jesus said to the multitudes, \wj “Have you come out as against a robber with swords and clubs to seize me? I sat daily in the temple teaching, and you didn’t arrest me. \wj* +\v 56 \wj But all this has happened that the Scriptures of the prophets might be fulfilled.”\wj* +\p Then all the disciples left him and fled. +\p +\v 57 Those who had taken Jesus led him away to Caiaphas the high priest, where the scribes and the elders were gathered together. +\v 58 But Peter followed him from a distance to the court of the high priest, and entered in and sat with the officers, to see the end. +\p +\v 59 Now the chief priests, the elders, and the whole council sought false testimony against Jesus, that they might put him to death, +\v 60 and they found none. Even though many false witnesses came forward, they found none. But at last two false witnesses came forward +\v 61 and said, “This man said, ‘I am able to destroy the temple of God, and to build it in three days.’” +\p +\v 62 The high priest stood up and said to him, “Have you no answer? What is this that these testify against you?” +\v 63 But Jesus stayed silent. The high priest answered him, “I adjure you by the living God that you tell us whether you are the Christ, the Son of God.” +\p +\v 64 Jesus said to him, \wj “You have said so. Nevertheless, I tell you, after this you will see the Son of Man sitting at the right hand of Power, and coming on the clouds of the sky.”\wj* +\p +\v 65 Then the high priest tore his clothing, saying, “He has spoken blasphemy! Why do we need any more witnesses? Behold, now you have heard his blasphemy. +\v 66 What do you think?” +\p They answered, “He is worthy of death!” +\v 67 Then they spat in his face and beat him with their fists, and some slapped him, +\v 68 saying, “Prophesy to us, you Christ! Who hit you?” +\p +\v 69 Now Peter was sitting outside in the court, and a maid came to him, saying, “You were also with Jesus, the Galilean!” +\p +\v 70 But he denied it before them all, saying, “I don’t know what you are talking about.” +\p +\v 71 When he had gone out onto the porch, someone else saw him and said to those who were there, “This man also was with Jesus of Nazareth.” +\p +\v 72 Again he denied it with an oath, “I don’t know the man.” +\p +\v 73 After a little while those who stood by came and said to Peter, “Surely you are also one of them, for your speech makes you known.” +\p +\v 74 Then he began to curse and to swear, “I don’t know the man!” +\p Immediately the rooster crowed. +\v 75 Peter remembered the word which Jesus had said to him, \wj “Before the rooster crows, you will deny me three times.”\wj* Then he went out and wept bitterly. +\c 27 +\p +\v 1 Now when morning had come, all the chief priests and the elders of the people took counsel against Jesus to put him to death. +\v 2 They bound him, led him away, and delivered him up to Pontius Pilate, the governor. +\p +\v 3 Then Judas, who betrayed him, when he saw that Jesus was condemned, felt remorse, and brought back the thirty pieces of silver to the chief priests and elders, +\v 4 saying, “I have sinned in that I betrayed innocent blood.” +\p But they said, “What is that to us? You see to it.” +\p +\v 5 He threw down the pieces of silver in the sanctuary and departed. Then he went away and hanged himself. +\p +\v 6 The chief priests took the pieces of silver and said, “It’s not lawful to put them into the treasury, since it is the price of blood.” +\v 7 They took counsel, and bought the potter’s field with them to bury strangers in. +\v 8 Therefore that field has been called “The Field of Blood” to this day. +\v 9 Then that which was spoken through Jeremiah\f + \fr 27:9 \ft some manuscripts omit “Jeremiah”\f* the prophet was fulfilled, saying, +\q1 “They took the thirty pieces of silver, +\q2 the price of him upon whom a price had been set, +\q2 whom some of the children of Israel priced, +\q1 +\v 10 and they gave them for the potter’s field, +\q2 as the Lord commanded me.”\x + \xo 27:10 \xt Zechariah 11:12-13; Jeremiah 19:1-13; 32:6-9\x* +\p +\v 11 Now Jesus stood before the governor; and the governor asked him, saying, “Are you the King of the Jews?” +\p Jesus said to him, \wj “So you say.”\wj* +\p +\v 12 When he was accused by the chief priests and elders, he answered nothing. +\v 13 Then Pilate said to him, “Don’t you hear how many things they testify against you?” +\p +\v 14 He gave him no answer, not even one word, so that the governor marveled greatly. +\p +\v 15 Now at the feast the governor was accustomed to release to the multitude one prisoner whom they desired. +\v 16 They had then a notable prisoner called Barabbas. +\v 17 When therefore they were gathered together, Pilate said to them, “Whom do you want me to release to you? Barabbas, or Jesus who is called Christ?” +\v 18 For he knew that because of envy they had delivered him up. +\p +\v 19 While he was sitting on the judgment seat, his wife sent to him, saying, “Have nothing to do with that righteous man, for I have suffered many things today in a dream because of him.” +\p +\v 20 Now the chief priests and the elders persuaded the multitudes to ask for Barabbas and destroy Jesus. +\v 21 But the governor answered them, “Which of the two do you want me to release to you?” +\p They said, “Barabbas!” +\p +\v 22 Pilate said to them, “What then shall I do to Jesus who is called Christ?” +\p They all said to him, “Let him be crucified!” +\p +\v 23 But the governor said, “Why? What evil has he done?” +\p But they cried out exceedingly, saying, “Let him be crucified!” +\p +\v 24 So when Pilate saw that nothing was being gained, but rather that a disturbance was starting, he took water and washed his hands before the multitude, saying, “I am innocent of the blood of this righteous person. You see to it.” +\p +\v 25 All the people answered, “May his blood be on us and on our children!” +\p +\v 26 Then he released Barabbas to them, but Jesus he flogged and delivered to be crucified. +\p +\v 27 Then the governor’s soldiers took Jesus into the Praetorium, and gathered the whole garrison together against him. +\v 28 They stripped him and put a scarlet robe on him. +\v 29 They braided a crown of thorns and put it on his head, and a reed in his right hand; and they kneeled down before him and mocked him, saying, “Hail, King of the Jews!” +\v 30 They spat on him, and took the reed and struck him on the head. +\v 31 When they had mocked him, they took the robe off him, and put his clothes on him, and led him away to crucify him. +\p +\v 32 As they came out, they found a man of Cyrene, Simon by name, and they compelled him to go with them, that he might carry his cross. +\v 33 When they came to a place called “Golgotha”, that is to say, “The place of a skull,” +\v 34 they gave him sour wine\f + \fr 27:34 \ft or, vinegar\f* to drink mixed with gall.\f + \fr 27:34 \ft Gall is a bitter-tasting, dark green oil from a wormwood plant that is alcoholic in its effect.\f* When he had tasted it, he would not drink. +\v 35 When they had crucified him, they divided his clothing among them, casting lots,\f + \fr 27:35 \ft TR adds “that it might be fulfilled which was spoken by the prophet: ‘They divided my garments among them, and for my clothing they cast lots;’” [see Psalm 22:18 and John 19:24]\f* +\v 36 and they sat and watched him there. +\v 37 They set up over his head the accusation against him written, “THIS IS JESUS, THE KING OF THE JEWS.” +\p +\v 38 Then there were two robbers crucified with him, one on his right hand and one on the left. +\p +\v 39 Those who passed by blasphemed him, wagging their heads +\v 40 and saying, “You who destroy the temple and build it in three days, save yourself! If you are the Son of God, come down from the cross!” +\p +\v 41 Likewise the chief priests also mocking with the scribes, the Pharisees,\f + \fr 27:41 \ft TR omits “the Pharisees”\f* and the elders, said, +\v 42 “He saved others, but he can’t save himself. If he is the King of Israel, let him come down from the cross now, and we will believe in him. +\v 43 He trusts in God. Let God deliver him now, if he wants him; for he said, ‘I am the Son of God.’” +\v 44 The robbers also who were crucified with him cast on him the same reproach. +\p +\v 45 Now from the sixth hour\f + \fr 27:45 \ft noon\f* there was darkness over all the land until the ninth hour.\f + \fr 27:45 \ft 3:00 p.m.\f* +\v 46 About the ninth hour Jesus cried with a loud voice, saying, \wj “Eli, Eli, lima\wj*\f + \fr 27:46 \ft TR reads “lama” instead of “lima”\f* \wj sabachthani?” \wj* That is, \wj “My God, my God, why have you forsaken me?”\wj*\x + \xo 27:46 \xt Psalm 22:1\x* +\p +\v 47 Some of them who stood there, when they heard it, said, “This man is calling Elijah.” +\p +\v 48 Immediately one of them ran and took a sponge, filled it with vinegar, put it on a reed, and gave him a drink. +\v 49 The rest said, “Let him be. Let’s see whether Elijah comes to save him.” +\p +\v 50 Jesus cried again with a loud voice, and yielded up his spirit. +\p +\v 51 Behold, the veil of the temple was torn in two from the top to the bottom. The earth quaked and the rocks were split. +\v 52 The tombs were opened, and many bodies of the saints who had fallen asleep were raised; +\v 53 and coming out of the tombs after his resurrection, they entered into the holy city and appeared to many. +\p +\v 54 Now the centurion and those who were with him watching Jesus, when they saw the earthquake and the things that were done, were terrified, saying, “Truly this was the Son of God!” +\p +\v 55 Many women were there watching from afar, who had followed Jesus from Galilee, serving him. +\v 56 Among them were Mary Magdalene, Mary the mother of James and Joses, and the mother of the sons of Zebedee. +\p +\v 57 When evening had come, a rich man from Arimathaea named Joseph, who himself was also Jesus’ disciple, came. +\v 58 This man went to Pilate and asked for Jesus’ body. Then Pilate commanded the body to be given up. +\v 59 Joseph took the body and wrapped it in a clean linen cloth +\v 60 and laid it in his own new tomb, which he had cut out in the rock. Then he rolled a large stone against the door of the tomb, and departed. +\v 61 Mary Magdalene was there, and the other Mary, sitting opposite the tomb. +\p +\v 62 Now on the next day, which was the day after the Preparation Day, the chief priests and the Pharisees were gathered together to Pilate, +\v 63 saying, “Sir, we remember what that deceiver said while he was still alive: ‘After three days I will rise again.’ +\v 64 Command therefore that the tomb be made secure until the third day, lest perhaps his disciples come at night and steal him away, and tell the people, ‘He is risen from the dead;’ and the last deception will be worse than the first.” +\p +\v 65 Pilate said to them, “You have a guard. Go, make it as secure as you can.” +\v 66 So they went with the guard and made the tomb secure, sealing the stone. +\c 28 +\p +\v 1 Now after the Sabbath, as it began to dawn on the first day of the week, Mary Magdalene and the other Mary came to see the tomb. +\v 2 Behold, there was a great earthquake, for an angel of the Lord descended from the sky and came and rolled away the stone from the door and sat on it. +\v 3 His appearance was like lightning, and his clothing white as snow. +\v 4 For fear of him, the guards shook, and became like dead men. +\v 5 The angel answered the women, “Don’t be afraid, for I know that you seek Jesus, who has been crucified. +\v 6 He is not here, for he has risen, just like he said. Come, see the place where the Lord was lying. +\v 7 Go quickly and tell his disciples, ‘He has risen from the dead, and behold, he goes before you into Galilee; there you will see him.’ Behold, I have told you.” +\p +\v 8 They departed quickly from the tomb with fear and great joy, and ran to bring his disciples word. +\v 9 As they went to tell his disciples, behold, Jesus met them, saying, \wj “Rejoice!”\wj* +\p They came and took hold of his feet, and worshiped him. +\p +\v 10 Then Jesus said to them, \wj “Don’t be afraid. Go tell my brothers \wj*\f + \fr 28:10 \ft The word for “brothers” here may be also correctly translated “brothers and sisters” or “siblings.”\f* \wj that they should go into Galilee, and there they will see me.”\wj* +\p +\v 11 Now while they were going, behold, some of the guards came into the city and told the chief priests all the things that had happened. +\v 12 When they were assembled with the elders and had taken counsel, they gave a large amount of silver to the soldiers, +\v 13 saying, “Say that his disciples came by night and stole him away while we slept. +\v 14 If this comes to the governor’s ears, we will persuade him and make you free of worry.” +\v 15 So they took the money and did as they were told. This saying was spread abroad among the Jews, and continues until today. +\p +\v 16 But the eleven disciples went into Galilee, to the mountain where Jesus had sent them. +\v 17 When they saw him, they bowed down to him; but some doubted. +\v 18 Jesus came to them and spoke to them, saying, \wj “All authority has been given to me in heaven and on earth. \wj* +\v 19 \wj Go\wj*\f + \fr 28:19 \ft TR and NU add “therefore”\f* \wj and make disciples of all nations, baptizing them in the name of the Father and of the Son and of the Holy Spirit, \wj* +\v 20 \wj teaching them to observe all things that I commanded you. Behold, I am with you always, even to the end of the age.”\wj* Amen. diff --git a/c-sharp/assets/WEB/42MRKengWEBUS.SFM b/c-sharp/assets/WEB/42MRKengWEBUS.SFM new file mode 100644 index 0000000000..277940e713 --- /dev/null +++ b/c-sharp/assets/WEB/42MRKengWEBUS.SFM @@ -0,0 +1,999 @@ +\id MRK 41-MRK-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Mark +\toc1 The Good News According to Mark +\toc2 Mark +\toc3 Mark +\mt2 The Good News According to +\mt1 Mark +\c 1 + +\p +\v 1 The beginning of the Good News of Jesus Christ, the Son of God. +\p +\v 2 As it is written in the prophets, +\q1 “Behold,\f + \fr 1:2 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I send my messenger before your face, +\q2 who will prepare your way before you:\x + \xo 1:2 \xt Malachi 3:1\x* +\q1 +\v 3 the voice of one crying in the wilderness, +\q2 ‘Make ready the way of the Lord! +\q2 Make his paths straight!’”\x + \xo 1:3 \xt Isaiah 40:3\x* +\p +\v 4 John came baptizing\f + \fr 1:4 \ft or, immersing\f* in the wilderness and preaching the baptism of repentance for forgiveness of sins. +\v 5 All the country of Judea and all those of Jerusalem went out to him. They were baptized by him in the Jordan river, confessing their sins. +\v 6 John was clothed with camel’s hair and a leather belt around his waist. He ate locusts and wild honey. +\v 7 He preached, saying, “After me comes he who is mightier than I, the thong of whose sandals I am not worthy to stoop down and loosen. +\v 8 I baptized you in\f + \fr 1:8 \ft The Greek word (en) translated here as “in” could also be translated as “with” in some contexts.\f* water, but he will baptize you in the Holy Spirit.” +\p +\v 9 In those days, Jesus came from Nazareth of Galilee, and was baptized by John in the Jordan. +\v 10 Immediately coming up from the water, he saw the heavens parting and the Spirit descending on him like a dove. +\v 11 A voice came out of the sky, “You are my beloved Son, in whom I am well pleased.” +\p +\v 12 Immediately the Spirit drove him out into the wilderness. +\v 13 He was there in the wilderness forty days, tempted by Satan. He was with the wild animals; and the angels were serving him. +\p +\v 14 Now after John was taken into custody, Jesus came into Galilee, preaching the Good News of God’s Kingdom, +\v 15 and saying, \wj “The time is fulfilled, and God’s Kingdom is at hand! Repent, and believe in the Good News.”\wj* +\p +\v 16 Passing along by the sea of Galilee, he saw Simon and Andrew, the brother of Simon, casting a net into the sea, for they were fishermen. +\v 17 Jesus said to them, \wj “Come after me, and I will make you into fishers for men.”\wj* +\p +\v 18 Immediately they left their nets, and followed him. +\p +\v 19 Going on a little further from there, he saw James the son of Zebedee, and John his brother, who were also in the boat mending the nets. +\v 20 Immediately he called them, and they left their father, Zebedee, in the boat with the hired servants, and went after him. +\p +\v 21 They went into Capernaum, and immediately on the Sabbath day he entered into the synagogue and taught. +\v 22 They were astonished at his teaching, for he taught them as having authority, and not as the scribes. +\v 23 Immediately there was in their synagogue a man with an unclean spirit, and he cried out, +\v 24 saying, “Ha! What do we have to do with you, Jesus, you Nazarene? Have you come to destroy us? I know who you are: the Holy One of God!” +\p +\v 25 Jesus rebuked him, saying, \wj “Be quiet, and come out of him!” \wj* +\p +\v 26 The unclean spirit, convulsing him and crying with a loud voice, came out of him. +\v 27 They were all amazed, so that they questioned among themselves, saying, “What is this? A new teaching? For with authority he commands even the unclean spirits, and they obey him!” +\v 28 The report of him went out immediately everywhere into all the region of Galilee and its surrounding area. +\p +\v 29 Immediately, when they had come out of the synagogue, they came into the house of Simon and Andrew, with James and John. +\v 30 Now Simon’s wife’s mother lay sick with a fever, and immediately they told him about her. +\v 31 He came and took her by the hand and raised her up. The fever left her immediately,\f + \fr 1:31 \ft NU omits “immediately”.\f* and she served them. +\p +\v 32 At evening, when the sun had set, they brought to him all who were sick and those who were possessed by demons. +\v 33 All the city was gathered together at the door. +\v 34 He healed many who were sick with various diseases and cast out many demons. He didn’t allow the demons to speak, because they knew him. +\p +\v 35 Early in the morning, while it was still dark, he rose up and went out, and departed into a deserted place, and prayed there. +\v 36 Simon and those who were with him searched for him. +\v 37 They found him and told him, “Everyone is looking for you.” +\p +\v 38 He said to them, \wj “Let’s go elsewhere into the next towns, that I may preach there also, because I came out for this reason.”\wj* +\v 39 He went into their synagogues throughout all Galilee, preaching and casting out demons. +\p +\v 40 A leper came to him, begging him, kneeling down to him, and saying to him, “If you want to, you can make me clean.” +\p +\v 41 Being moved with compassion, he stretched out his hand, and touched him, and said to him, \wj “I want to. Be made clean.”\wj* +\v 42 When he had said this, immediately the leprosy departed from him and he was made clean. +\v 43 He strictly warned him and immediately sent him out, +\v 44 and said to him, \wj “See that you say nothing to anybody, but go show yourself to the priest and offer for your cleansing the things which Moses commanded, for a testimony to them.”\wj* +\p +\v 45 But he went out, and began to proclaim it much, and to spread about the matter, so that Jesus could no more openly enter into a city, but was outside in desert places. People came to him from everywhere. +\c 2 +\p +\v 1 When he entered again into Capernaum after some days, it was heard that he was at home. +\v 2 Immediately many were gathered together, so that there was no more room, not even around the door; and he spoke the word to them. +\v 3 Four people came, carrying a paralytic to him. +\v 4 When they could not come near to him for the crowd, they removed the roof where he was. When they had broken it up, they let down the mat that the paralytic was lying on. +\v 5 Jesus, seeing their faith, said to the paralytic, \wj “Son, your sins are forgiven you.”\wj* +\p +\v 6 But there were some of the scribes sitting there and reasoning in their hearts, +\v 7 “Why does this man speak blasphemies like that? Who can forgive sins but God alone?” +\p +\v 8 Immediately Jesus, perceiving in his spirit that they so reasoned within themselves, said to them, \wj “Why do you reason these things in your hearts? \wj* +\v 9 \wj Which is easier, to tell the paralytic, ‘Your sins are forgiven;’ or to say, ‘Arise, and take up your bed, and walk?’ \wj* +\v 10 \wj But that you may know that the Son of Man has authority on earth to forgive sins”\wj*—he said to the paralytic— +\v 11 \wj “I tell you, arise, take up your mat, and go to your house.” \wj* +\p +\v 12 He arose, and immediately took up the mat and went out in front of them all, so that they were all amazed and glorified God, saying, “We never saw anything like this!” +\p +\v 13 He went out again by the seaside. All the multitude came to him, and he taught them. +\v 14 As he passed by, he saw Levi the son of Alphaeus sitting at the tax office. He said to him, \wj “Follow me.”\wj* And he arose and followed him. +\p +\v 15 He was reclining at the table in his house, and many tax collectors and sinners sat down with Jesus and his disciples, for there were many, and they followed him. +\v 16 The scribes and the Pharisees, when they saw that he was eating with the sinners and tax collectors, said to his disciples, “Why is it that he eats and drinks with tax collectors and sinners?” +\p +\v 17 When Jesus heard it, he said to them, \wj “Those who are healthy have no need for a physician, but those who are sick. I came not to call the righteous, but sinners to repentance.”\wj* +\p +\v 18 John’s disciples and the Pharisees were fasting, and they came and asked him, “Why do John’s disciples and the disciples of the Pharisees fast, but your disciples don’t fast?” +\p +\v 19 Jesus said to them, \wj “Can the groomsmen fast while the bridegroom is with them? As long as they have the bridegroom with them, they can’t fast. \wj* +\v 20 \wj But the days will come when the bridegroom will be taken away from them, and then they will fast in that day. \wj* +\v 21 \wj No one sews a piece of unshrunk cloth on an old garment, or else the patch shrinks and the new tears away from the old, and a worse hole is made. \wj* +\v 22 \wj No one puts new wine into old wineskins; or else the new wine will burst the skins, and the wine pours out, and the skins will be destroyed; but they put new wine into fresh wineskins.”\wj* +\p +\v 23 He was going on the Sabbath day through the grain fields; and his disciples began, as they went, to pluck the ears of grain. +\v 24 The Pharisees said to him, “Behold, why do they do that which is not lawful on the Sabbath day?” +\p +\v 25 He said to them, \wj “Did you never read what David did when he had need and was hungry—he, and those who were with him? \wj* +\v 26 \wj How he entered into God’s house at the time of Abiathar the high priest, and ate the show bread, which is not lawful to eat except for the priests, and gave also to those who were with him?”\wj* +\p +\v 27 He said to them, \wj “The Sabbath was made for man, not man for the Sabbath. \wj* +\v 28 \wj Therefore the Son of Man is lord even of the Sabbath.”\wj* +\c 3 +\p +\v 1 He entered again into the synagogue, and there was a man there whose hand was withered. +\v 2 They watched him, whether he would heal him on the Sabbath day, that they might accuse him. +\v 3 He said to the man whose hand was withered, \wj “Stand up.”\wj* +\v 4 He said to them, \wj “Is it lawful on the Sabbath day to do good or to do harm? To save a life or to kill?”\wj* But they were silent. +\v 5 When he had looked around at them with anger, being grieved at the hardening of their hearts, he said to the man, \wj “Stretch out your hand.” \wj* He stretched it out, and his hand was restored as healthy as the other. +\v 6 The Pharisees went out, and immediately conspired with the Herodians against him, how they might destroy him. +\p +\v 7 Jesus withdrew to the sea with his disciples; and a great multitude followed him from Galilee, from Judea, +\v 8 from Jerusalem, from Idumaea, beyond the Jordan, and those from around Tyre and Sidon. A great multitude, hearing what great things he did, came to him. +\v 9 He spoke to his disciples that a little boat should stay near him because of the crowd, so that they wouldn’t press on him. +\v 10 For he had healed many, so that as many as had diseases pressed on him that they might touch him. +\v 11 The unclean spirits, whenever they saw him, fell down before him and cried, “You are the Son of God!” +\v 12 He sternly warned them that they should not make him known. +\p +\v 13 He went up into the mountain and called to himself those whom he wanted, and they went to him. +\v 14 He appointed twelve, that they might be with him, and that he might send them out to preach +\v 15 and to have authority to heal sicknesses and to cast out demons: +\v 16 Simon (to whom he gave the name Peter); +\v 17 James the son of Zebedee; and John, the brother of James, (whom he called Boanerges, which means, Sons of Thunder); +\v 18 Andrew; Philip; Bartholomew; Matthew; Thomas; James, the son of Alphaeus; Thaddaeus; Simon the Zealot; +\v 19 and Judas Iscariot, who also betrayed him. +\p Then he came into a house. +\v 20 The multitude came together again, so that they could not so much as eat bread. +\v 21 When his friends heard it, they went out to seize him; for they said, “He is insane.” +\v 22 The scribes who came down from Jerusalem said, “He has Beelzebul,” and, “By the prince of the demons he casts out the demons.” +\p +\v 23 He summoned them and said to them in parables, \wj “How can Satan cast out Satan? \wj* +\v 24 \wj If a kingdom is divided against itself, that kingdom cannot stand. \wj* +\v 25 \wj If a house is divided against itself, that house cannot stand. \wj* +\v 26 \wj If Satan has risen up against himself, and is divided, he can’t stand, but has an end. \wj* +\v 27 \wj But no one can enter into the house of the strong man to plunder unless he first binds the strong man; then he will plunder his house. \wj* +\p +\v 28 \wj “Most certainly I tell you, all sins of the descendants of man will be forgiven, including their blasphemies with which they may blaspheme; \wj* +\v 29 \wj but whoever may blaspheme against the Holy Spirit never has forgiveness, but is subject to eternal condemnation.”\wj*\f + \fr 3:29 \ft NU reads, guilty of an eternal sin.\f* +\v 30 —because they said, “He has an unclean spirit.” +\p +\v 31 His mother and his brothers came, and standing outside, they sent to him, calling him. +\v 32 A multitude was sitting around him, and they told him, “Behold, your mother, your brothers, and your sisters\f + \fr 3:32 \ft TR omits “your sisters”\f* are outside looking for you.” +\p +\v 33 He answered them, \wj “Who are my mother and my brothers?”\wj* +\v 34 Looking around at those who sat around him, he said, \wj “Behold, my mother and my brothers! \wj* +\v 35 \wj For whoever does the will of God is my brother, my sister, and mother.”\wj* +\c 4 +\p +\v 1 Again he began to teach by the seaside. A great multitude was gathered to him, so that he entered into a boat in the sea and sat down. All the multitude were on the land by the sea. +\v 2 He taught them many things in parables, and told them in his teaching, +\v 3 \wj “Listen! Behold, the farmer went out to sow. \wj* +\v 4 \wj As he sowed, some seed fell by the road, and the birds\wj*\f + \fr 4:4 \ft TR adds “of the air”\f* \wj came and devoured it. \wj* +\v 5 \wj Others fell on the rocky ground, where it had little soil, and immediately it sprang up, because it had no depth of soil. \wj* +\v 6 \wj When the sun had risen, it was scorched; and because it had no root, it withered away. \wj* +\v 7 \wj Others fell among the thorns, and the thorns grew up and choked it, and it yielded no fruit. \wj* +\v 8 \wj Others fell into the good ground and yielded fruit, growing up and increasing. Some produced thirty times, some sixty times, and some one hundred times as much.”\wj* +\v 9 He said, \wj “Whoever has ears to hear, let him hear.”\wj* +\p +\v 10 When he was alone, those who were around him with the twelve asked him about the parables. +\v 11 He said to them, \wj “To you is given the mystery of God’s Kingdom, but to those who are outside, all things are done in parables, \wj* +\v 12 \wj that ‘seeing they may see and not perceive, and hearing they may hear and not understand, lest perhaps they should turn again, and their sins should be forgiven them.’”\wj*\x + \xo 4:12 \xt Isaiah 6:9-10\x* +\p +\v 13 He said to them, \wj “Don’t you understand this parable? How will you understand all of the parables? \wj* +\v 14 \wj The farmer sows the word. \wj* +\v 15 \wj The ones by the road are the ones where the word is sown; and when they have heard, immediately Satan comes and takes away the word which has been sown in them. \wj* +\v 16 \wj These in the same way are those who are sown on the rocky places, who, when they have heard the word, immediately receive it with joy. \wj* +\v 17 \wj They have no root in themselves, but are short-lived. When oppression or persecution arises because of the word, immediately they stumble. \wj* +\v 18 \wj Others are those who are sown among the thorns. These are those who have heard the word, \wj* +\v 19 \wj and the cares of this age, and the deceitfulness of riches, and the lusts of other things entering in choke the word, and it becomes unfruitful. \wj* +\v 20 \wj Those which were sown on the good ground are those who hear the word, accept it, and bear fruit, some thirty times, some sixty times, and some one hundred times.”\wj* +\p +\v 21 He said to them, \wj “Is a lamp brought to be put under a basket \wj*\f + \fr 4:21 \ft literally, a modion, a dry measuring basket containing about a peck (about 9 liters)\f* \wj or under a bed? Isn’t it put on a stand? \wj* +\v 22 \wj For there is nothing hidden except that it should be made known, neither was anything made secret but that it should come to light. \wj* +\v 23 \wj If any man has ears to hear, let him hear.”\wj* +\p +\v 24 He said to them, \wj “Take heed what you hear. With whatever measure you measure, it will be measured to you; and more will be given to you who hear. \wj* +\v 25 \wj For whoever has, to him more will be given; and he who doesn’t have, even that which he has will be taken away from him.”\wj* +\p +\v 26 He said, \wj “God’s Kingdom is as if a man should cast seed on the earth, \wj* +\v 27 \wj and should sleep and rise night and day, and the seed should spring up and grow, though he doesn’t know how. \wj* +\v 28 \wj For the earth bears fruit by itself: first the blade, then the ear, then the full grain in the ear. \wj* +\v 29 \wj But when the fruit is ripe, immediately he puts in the sickle, because the harvest has come.”\wj* +\p +\v 30 He said, \wj “How will we liken God’s Kingdom? Or with what parable will we illustrate it? \wj* +\v 31 \wj It’s like a grain of mustard seed, which, when it is sown in the earth, though it is less than all the seeds that are on the earth, \wj* +\v 32 \wj yet when it is sown, grows up and becomes greater than all the herbs, and puts out great branches, so that the birds of the sky can lodge under its shadow.”\wj* +\p +\v 33 With many such parables he spoke the word to them, as they were able to hear it. +\v 34 Without a parable he didn’t speak to them; but privately to his own disciples he explained everything. +\p +\v 35 On that day, when evening had come, he said to them, \wj “Let’s go over to the other side.”\wj* +\v 36 Leaving the multitude, they took him with them, even as he was, in the boat. Other small boats were also with him. +\v 37 A big wind storm arose, and the waves beat into the boat, so much that the boat was already filled. +\v 38 He himself was in the stern, asleep on the cushion; and they woke him up and asked him, “Teacher, don’t you care that we are dying?” +\p +\v 39 He awoke and rebuked the wind, and said to the sea, \wj “Peace! Be still!”\wj* The wind ceased and there was a great calm. +\v 40 He said to them, \wj “Why are you so afraid? How is it that you have no faith?”\wj* +\p +\v 41 They were greatly afraid and said to one another, “Who then is this, that even the wind and the sea obey him?” +\c 5 +\p +\v 1 They came to the other side of the sea, into the country of the Gadarenes. +\v 2 When he had come out of the boat, immediately a man with an unclean spirit met him out of the tombs. +\v 3 He lived in the tombs. Nobody could bind him any more, not even with chains, +\v 4 because he had been often bound with fetters and chains, and the chains had been torn apart by him, and the fetters broken in pieces. Nobody had the strength to tame him. +\v 5 Always, night and day, in the tombs and in the mountains, he was crying out, and cutting himself with stones. +\v 6 When he saw Jesus from afar, he ran and bowed down to him, +\v 7 and crying out with a loud voice, he said, “What have I to do with you, Jesus, you Son of the Most High God? I adjure you by God, don’t torment me.” +\v 8 For he said to him, \wj “Come out of the man, you unclean spirit!” \wj* +\p +\v 9 He asked him, \wj “What is your name?”\wj* +\p He said to him, “My name is Legion, for we are many.” +\v 10 He begged him much that he would not send them away out of the country. +\v 11 Now on the mountainside there was a great herd of pigs feeding. +\v 12 All the demons begged him, saying, “Send us into the pigs, that we may enter into them.” +\p +\v 13 At once Jesus gave them permission. The unclean spirits came out and entered into the pigs. The herd of about two thousand rushed down the steep bank into the sea, and they were drowned in the sea. +\v 14 Those who fed the pigs fled, and told it in the city and in the country. +\p The people came to see what it was that had happened. +\v 15 They came to Jesus, and saw him who had been possessed by demons sitting, clothed, and in his right mind, even him who had the legion; and they were afraid. +\v 16 Those who saw it declared to them what happened to him who was possessed by demons, and about the pigs. +\v 17 They began to beg him to depart from their region. +\p +\v 18 As he was entering into the boat, he who had been possessed by demons begged him that he might be with him. +\v 19 He didn’t allow him, but said to him, \wj “Go to your house, to your friends, and tell them what great things the Lord has done for you and how he had mercy on you.”\wj* +\p +\v 20 He went his way, and began to proclaim in Decapolis how Jesus had done great things for him, and everyone marveled. +\p +\v 21 When Jesus had crossed back over in the boat to the other side, a great multitude was gathered to him; and he was by the sea. +\v 22 Behold, one of the rulers of the synagogue, Jairus by name, came; and seeing him, he fell at his feet +\v 23 and begged him much, saying, “My little daughter is at the point of death. Please come and lay your hands on her, that she may be made healthy, and live.” +\p +\v 24 He went with him, and a great multitude followed him, and they pressed upon him on all sides. +\v 25 A certain woman who had a discharge of blood for twelve years, +\v 26 and had suffered many things by many physicians, and had spent all that she had, and was no better, but rather grew worse, +\v 27 having heard the things concerning Jesus, came up behind him in the crowd and touched his clothes. +\v 28 For she said, “If I just touch his clothes, I will be made well.” +\v 29 Immediately the flow of her blood was dried up, and she felt in her body that she was healed of her affliction. +\p +\v 30 Immediately Jesus, perceiving in himself that the power had gone out from him, turned around in the crowd and asked, \wj “Who touched my clothes?”\wj* +\p +\v 31 His disciples said to him, “You see the multitude pressing against you, and you say, ‘Who touched me?’” +\p +\v 32 He looked around to see her who had done this thing. +\v 33 But the woman, fearing and trembling, knowing what had been done to her, came and fell down before him, and told him all the truth. +\p +\v 34 He said to her, \wj “Daughter, your faith has made you well. Go in peace, and be cured of your disease.”\wj* +\p +\v 35 While he was still speaking, people came from the synagogue ruler’s house, saying, “Your daughter is dead. Why bother the Teacher any more?” +\p +\v 36 But Jesus, when he heard the message spoken, immediately said to the ruler of the synagogue, \wj “Don’t be afraid, only believe.”\wj* +\v 37 He allowed no one to follow him except Peter, James, and John the brother of James. +\v 38 He came to the synagogue ruler’s house, and he saw an uproar, weeping, and great wailing. +\v 39 When he had entered in, he said to them, \wj “Why do you make an uproar and weep? The child is not dead, but is asleep.”\wj* +\p +\v 40 They ridiculed him. But he, having put them all out, took the father of the child, her mother, and those who were with him, and went in where the child was lying. +\v 41 Taking the child by the hand, he said to her, \wj “Talitha cumi!” \wj* which means, being interpreted, \wj “Girl, I tell you, get up!” \wj* +\v 42 Immediately the girl rose up and walked, for she was twelve years old. They were amazed with great amazement. +\v 43 He strictly ordered them that no one should know this, and commanded that something should be given to her to eat. +\c 6 +\p +\v 1 He went out from there. He came into his own country, and his disciples followed him. +\v 2 When the Sabbath had come, he began to teach in the synagogue, and many hearing him were astonished, saying, “Where did this man get these things?” and, “What is the wisdom that is given to this man, that such mighty works come about by his hands? +\v 3 Isn’t this the carpenter, the son of Mary and brother of James, Joses, Judah, and Simon? Aren’t his sisters here with us?” So they were offended at him. +\p +\v 4 Jesus said to them, \wj “A prophet is not without honor, except in his own country, and among his own relatives, and in his own house.”\wj* +\v 5 He could do no mighty work there, except that he laid his hands on a few sick people and healed them. +\v 6 He marveled because of their unbelief. +\p He went around the villages teaching. +\v 7 He called to himself the twelve, and began to send them out two by two; and he gave them authority over the unclean spirits. +\v 8 He commanded them that they should take nothing for their journey, except a staff only: no bread, no wallet, no money in their purse, +\v 9 but to wear sandals, and not put on two tunics. +\v 10 He said to them, \wj “Wherever you enter into a house, stay there until you depart from there. \wj* +\v 11 \wj Whoever will not receive you nor hear you, as you depart from there, shake off the dust that is under your feet for a testimony against them. Assuredly, I tell you, it will be more tolerable for Sodom and Gomorrah in the day of judgment than for that city!”\wj* +\p +\v 12 They went out and preached that people should repent. +\v 13 They cast out many demons, and anointed many with oil who were sick and healed them. +\v 14 King Herod heard this, for his name had become known, and he said, “John the Baptizer has risen from the dead, and therefore these powers are at work in him.” +\v 15 But others said, “He is Elijah.” Others said, “He is a prophet, or like one of the prophets.” +\v 16 But Herod, when he heard this, said, “This is John, whom I beheaded. He has risen from the dead.” +\v 17 For Herod himself had sent out and arrested John and bound him in prison for the sake of Herodias, his brother Philip’s wife, for he had married her. +\v 18 For John had said to Herod, “It is not lawful for you to have your brother’s wife.” +\v 19 Herodias set herself against him and desired to kill him, but she couldn’t, +\v 20 for Herod feared John, knowing that he was a righteous and holy man, and kept him safe. When he heard him, he did many things, and he heard him gladly. +\p +\v 21 Then a convenient day came when Herod on his birthday made a supper for his nobles, the high officers, and the chief men of Galilee. +\v 22 When the daughter of Herodias herself came in and danced, she pleased Herod and those sitting with him. The king said to the young lady, “Ask me whatever you want, and I will give it to you.” +\v 23 He swore to her, “Whatever you ask of me, I will give you, up to half of my kingdom.” +\p +\v 24 She went out and said to her mother, “What shall I ask?” +\p She said, “The head of John the Baptizer.” +\p +\v 25 She came in immediately with haste to the king and requested, “I want you to give me right now the head of John the Baptizer on a platter.” +\p +\v 26 The king was exceedingly sorry, but for the sake of his oaths and of his dinner guests, he didn’t wish to refuse her. +\v 27 Immediately the king sent out a soldier of his guard and commanded to bring John’s head; and he went and beheaded him in the prison, +\v 28 and brought his head on a platter, and gave it to the young lady; and the young lady gave it to her mother. +\p +\v 29 When his disciples heard this, they came and took up his corpse and laid it in a tomb. +\p +\v 30 The apostles gathered themselves together to Jesus, and they told him all things, whatever they had done, and whatever they had taught. +\v 31 He said to them, \wj “Come away into a deserted place, and rest awhile.”\wj* For there were many coming and going, and they had no leisure so much as to eat. +\v 32 They went away in the boat to a deserted place by themselves. +\v 33 They\f + \fr 6:33 \ft TR reads “The multitudes” instead of “They”\f* saw them going, and many recognized him and ran there on foot from all the cities. They arrived before them and came together to him. +\v 34 Jesus came out, saw a great multitude, and he had compassion on them because they were like sheep without a shepherd; and he began to teach them many things. +\v 35 When it was late in the day, his disciples came to him and said, “This place is deserted, and it is late in the day. +\v 36 Send them away, that they may go into the surrounding country and villages and buy themselves bread, for they have nothing to eat.” +\p +\v 37 But he answered them, \wj “You give them something to eat.”\wj* +\p They asked him, “Shall we go and buy two hundred denarii\f + \fr 6:37 \ft 200 denarii was about 7 or 8 months wages for an agricultural laborer.\f* worth of bread and give them something to eat?” +\p +\v 38 He said to them, \wj “How many loaves do you have? Go see.”\wj* +\p When they knew, they said, “Five, and two fish.” +\p +\v 39 He commanded them that everyone should sit down in groups on the green grass. +\v 40 They sat down in ranks, by hundreds and by fifties. +\v 41 He took the five loaves and the two fish; and looking up to heaven, he blessed and broke the loaves, and he gave to his disciples to set before them, and he divided the two fish among them all. +\v 42 They all ate and were filled. +\v 43 They took up twelve baskets full of broken pieces and also of the fish. +\v 44 Those who ate the loaves were\f + \fr 6:44 \ft TR adds “about”\f* five thousand men. +\p +\v 45 Immediately he made his disciples get into the boat and go ahead to the other side, to Bethsaida, while he himself sent the multitude away. +\v 46 After he had taken leave of them, he went up the mountain to pray. +\p +\v 47 When evening had come, the boat was in the middle of the sea, and he was alone on the land. +\v 48 Seeing them distressed in rowing, for the wind was contrary to them, about the fourth watch of the night he came to them, walking on the sea; \x + \xo 6:48 \xt See Job 9:8\x* and he would have passed by them, +\v 49 but they, when they saw him walking on the sea, supposed that it was a ghost, and cried out; +\v 50 for they all saw him and were troubled. But he immediately spoke with them and said to them, \wj “Cheer up! It is I!\wj*\f + \fr 6:50 \ft or, “I AM!”\f* \wj Don’t be afraid.”\wj* +\v 51 He got into the boat with them; and the wind ceased, and they were very amazed among themselves, and marveled; +\v 52 for they hadn’t understood about the loaves, but their hearts were hardened. +\p +\v 53 When they had crossed over, they came to land at Gennesaret and moored to the shore. +\v 54 When they had come out of the boat, immediately the people recognized him, +\v 55 and ran around that whole region, and began to bring those who were sick on their mats to where they heard he was. +\v 56 Wherever he entered—into villages, or into cities, or into the country—they laid the sick in the marketplaces and begged him that they might just touch the fringe\f + \fr 6:56 \ft or, tassel\f* of his garment; and as many as touched him were made well. +\c 7 +\p +\v 1 Then the Pharisees and some of the scribes gathered together to him, having come from Jerusalem. +\v 2 Now when they saw some of his disciples eating bread with defiled, that is unwashed, hands, they found fault. +\v 3 (For the Pharisees and all the Jews don’t eat unless they wash their hands and forearms, holding to the tradition of the elders. +\v 4 They don’t eat when they come from the marketplace unless they bathe themselves, and there are many other things which they have received to hold to: washings of cups, pitchers, bronze vessels, and couches.) +\v 5 The Pharisees and the scribes asked him, “Why don’t your disciples walk according to the tradition of the elders, but eat their bread with unwashed hands?” +\p +\v 6 He answered them, \wj “Well did Isaiah prophesy of you hypocrites, as it is written,\wj* +\q1 \wj ‘This people honors me with their lips,\wj* +\q2 \wj but their heart is far from me.\wj* +\q1 +\v 7 \wj They worship me in vain,\wj* +\q2 \wj teaching as doctrines the commandments of men.’\wj*\x + \xo 7:7 \xt Isaiah 29:13 \x* +\p +\v 8 \wj “For you set aside the commandment of God, and hold tightly to the tradition of men—the washing of pitchers and cups, and you do many other such things.”\wj* +\v 9 He said to them, \wj “Full well do you reject the commandment of God, that you may keep your tradition. \wj* +\v 10 \wj For Moses said, ‘Honor your father and your mother;’\wj*\x + \xo 7:10 \xt Exodus 20:12; Deuteronomy 5:16\x* \wj and, ‘He who speaks evil of father or mother, let him be put to death.’\wj*\x + \xo 7:10 \xt Exodus 21:17; Leviticus 20:9\x* +\v 11 \wj But you say, ‘If a man tells his father or his mother, “Whatever profit you might have received from me is Corban,”’”\wj*\f + \fr 7:11 \ft Corban is a Hebrew word for an offering devoted to God.\f* that is to say, given to God, +\v 12 \wj “then you no longer allow him to do anything for his father or his mother, \wj* +\v 13 \wj making void the word of God by your tradition which you have handed down. You do many things like this.”\wj* +\p +\v 14 He called all the multitude to himself and said to them, \wj “Hear me, all of you, and understand. \wj* +\v 15 \wj There is nothing from outside of the man that going into him can defile him; but the things which proceed out of the man are those that defile the man. \wj* +\v 16 \wj If anyone has ears to hear, let him hear!”\wj*\f + \fr 7:16 \ft NU omits verse 16.\f* +\p +\v 17 When he had entered into a house away from the multitude, his disciples asked him about the parable. +\v 18 He said to them, \wj “Are you also without understanding? Don’t you perceive that whatever goes into the man from outside can’t defile him, \wj* +\v 19 \wj because it doesn’t go into his heart, but into his stomach, then into the latrine, making all foods clean?”\wj*\f + \fr 7:19 \ft NU ends Jesus’ direct quote and question after “latrine”, ending the verse with “Thus he declared all foods clean. \f* +\v 20 He said, \wj “That which proceeds out of the man, that defiles the man. \wj* +\v 21 \wj For from within, out of the hearts of men, proceed evil thoughts, adulteries, sexual sins, murders, thefts, \wj* +\v 22 \wj covetings, wickedness, deceit, lustful desires, an evil eye, blasphemy, pride, and foolishness. \wj* +\v 23 \wj All these evil things come from within and defile the man.” \wj* +\p +\v 24 From there he arose and went away into the borders of Tyre and Sidon. He entered into a house and didn’t want anyone to know it, but he couldn’t escape notice. +\v 25 For a woman whose little daughter had an unclean spirit, having heard of him, came and fell down at his feet. +\v 26 Now the woman was a Greek, a Syrophoenician by race. She begged him that he would cast the demon out of her daughter. +\v 27 But Jesus said to her, \wj “Let the children be filled first, for it is not appropriate to take the children’s bread and throw it to the dogs.” \wj* +\p +\v 28 But she answered him, “Yes, Lord. Yet even the dogs under the table eat the children’s crumbs.” +\p +\v 29 He said to her, \wj “For this saying, go your way. The demon has gone out of your daughter.”\wj* +\p +\v 30 She went away to her house, and found the child having been laid on the bed, with the demon gone out. +\p +\v 31 Again he departed from the borders of Tyre and Sidon, and came to the sea of Galilee through the middle of the region of Decapolis. +\v 32 They brought to him one who was deaf and had an impediment in his speech. They begged him to lay his hand on him. +\v 33 He took him aside from the multitude privately and put his fingers into his ears; and he spat and touched his tongue. +\v 34 Looking up to heaven, he sighed, and said to him, \wj “Ephphatha!” \wj* that is, \wj “Be opened!”\wj* +\v 35 Immediately his ears were opened, and the impediment of his tongue was released, and he spoke clearly. +\v 36 He commanded them that they should tell no one, but the more he commanded them, so much the more widely they proclaimed it. +\v 37 They were astonished beyond measure, saying, “He has done all things well. He makes even the deaf hear and the mute speak!” +\c 8 +\p +\v 1 In those days, when there was a very great multitude, and they had nothing to eat, Jesus called his disciples to himself and said to them, +\v 2 \wj “I have compassion on the multitude, because they have stayed with me now three days and have nothing to eat. \wj* +\v 3 \wj If I send them away fasting to their home, they will faint on the way, for some of them have come a long way.”\wj* +\p +\v 4 His disciples answered him, “From where could one satisfy these people with bread here in a deserted place?” +\p +\v 5 He asked them, \wj “How many loaves do you have?”\wj* +\p They said, “Seven.” +\p +\v 6 He commanded the multitude to sit down on the ground, and he took the seven loaves. Having given thanks, he broke them and gave them to his disciples to serve, and they served the multitude. +\v 7 They also had a few small fish. Having blessed them, he said to serve these also. +\v 8 They ate and were filled. They took up seven baskets of broken pieces that were left over. +\v 9 Those who had eaten were about four thousand. Then he sent them away. +\p +\v 10 Immediately he entered into the boat with his disciples and came into the region of Dalmanutha. +\v 11 The Pharisees came out and began to question him, seeking from him a sign from heaven and testing him. +\v 12 He sighed deeply in his spirit and said, \wj “Why does this generation\wj*\f + \fr 8:12 \ft The word translated “generation” here (genea) could also be translated “people”, “race”, or “family”.\f* \wj seek a sign? Most certainly I tell you, no sign will be given to this generation.”\wj* +\p +\v 13 He left them, and again entering into the boat, departed to the other side. +\v 14 They forgot to take bread; and they didn’t have more than one loaf in the boat with them. +\v 15 He warned them, saying, \wj “Take heed: beware of the yeast of the Pharisees and the yeast of Herod.”\wj* +\p +\v 16 They reasoned with one another, saying, “It’s because we have no bread.” +\p +\v 17 Jesus, perceiving it, said to them, \wj “Why do you reason that it’s because you have no bread? Don’t you perceive yet or understand? Is your heart still hardened? \wj* +\v 18 \wj Having eyes, don’t you see? Having ears, don’t you hear? Don’t you remember? \wj* +\v 19 \wj When I broke the five loaves among the five thousand, how many baskets full of broken pieces did you take up?”\wj* +\p They told him, “Twelve.” +\p +\v 20 \wj “When the seven loaves fed the four thousand, how many baskets full of broken pieces did you take up?”\wj* +\p They told him, “Seven.” +\p +\v 21 He asked them, \wj “Don’t you understand yet?”\wj* +\p +\v 22 He came to Bethsaida. They brought a blind man to him and begged him to touch him. +\v 23 He took hold of the blind man by the hand, and brought him out of the village. When he had spat on his eyes, and laid his hands on him, he asked him if he saw anything. +\p +\v 24 He looked up, and said, “I see men, but I see them like walking trees.” +\p +\v 25 Then again he laid his hands on his eyes. He looked intently, and was restored, and saw everyone clearly. +\v 26 He sent him away to his house, saying, \wj “Don’t enter into the village, nor tell anyone in the village.”\wj* +\p +\v 27 Jesus went out, with his disciples, into the villages of Caesarea Philippi. On the way he asked his disciples, \wj “Who do men say that I am?” \wj* +\p +\v 28 They told him, “John the Baptizer, and others say Elijah, but others, one of the prophets.” +\p +\v 29 He said to them, \wj “But who do you say that I am?”\wj* +\p Peter answered, “You are the Christ.” +\p +\v 30 He commanded them that they should tell no one about him. +\v 31 He began to teach them that the Son of Man must suffer many things, and be rejected by the elders, the chief priests, and the scribes, and be killed, and after three days rise again. +\v 32 He spoke to them openly. Peter took him and began to rebuke him. +\v 33 But he, turning around and seeing his disciples, rebuked Peter, and said, \wj “Get behind me, Satan! For you have in mind not the things of God, but the things of men.”\wj* +\p +\v 34 He called the multitude to himself with his disciples and said to them, \wj “Whoever wants to come after me, let him deny himself, and take up his cross, and follow me. \wj* +\v 35 \wj For whoever wants to save his life will lose it; and whoever will lose his life for my sake and the sake of the Good News will save it. \wj* +\v 36 \wj For what does it profit a man to gain the whole world and forfeit his life? \wj* +\v 37 \wj For what will a man give in exchange for his life? \wj* +\v 38 \wj For whoever will be ashamed of me and of my words in this adulterous and sinful generation, the Son of Man also will be ashamed of him when he comes in his Father’s glory with the holy angels.”\wj* +\c 9 +\p +\v 1 He said to them, \wj “Most certainly I tell you, there are some standing here who will in no way taste death until they see God’s Kingdom come with power.”\wj* +\p +\v 2 After six days Jesus took with him Peter, James, and John, and brought them up onto a high mountain privately by themselves, and he was changed into another form in front of them. +\v 3 His clothing became glistening, exceedingly white, like snow, such as no launderer on earth can whiten them. +\v 4 Elijah and Moses appeared to them, and they were talking with Jesus. +\p +\v 5 Peter answered Jesus, “Rabbi, it is good for us to be here. Let’s make three tents: one for you, one for Moses, and one for Elijah.” +\v 6 For he didn’t know what to say, for they were very afraid. +\p +\v 7 A cloud came, overshadowing them, and a voice came out of the cloud, “This is my beloved Son. Listen to him.” +\p +\v 8 Suddenly looking around, they saw no one with them any more, except Jesus only. +\p +\v 9 As they were coming down from the mountain, he commanded them that they should tell no one what things they had seen, until after the Son of Man had risen from the dead. +\v 10 They kept this saying to themselves, questioning what the “rising from the dead” meant. +\p +\v 11 They asked him, saying, “Why do the scribes say that Elijah must come first?” +\p +\v 12 He said to them, \wj “Elijah indeed comes first, and restores all things. How is it written about the Son of Man, that he should suffer many things and be despised? \wj* +\v 13 \wj But I tell you that Elijah has come, and they have also done to him whatever they wanted to, even as it is written about him.”\wj* +\p +\v 14 Coming to the disciples, he saw a great multitude around them, and scribes questioning them. +\v 15 Immediately all the multitude, when they saw him, were greatly amazed, and running to him, greeted him. +\v 16 He asked the scribes, \wj “What are you asking them?”\wj* +\p +\v 17 One of the multitude answered, “Teacher, I brought to you my son, who has a mute spirit; +\v 18 and wherever it seizes him, it throws him down; and he foams at the mouth, grinds his teeth, and becomes rigid. I asked your disciples to cast it out, and they weren’t able.” +\p +\v 19 He answered him, \wj “Unbelieving generation, how long shall I be with you? How long shall I bear with you? Bring him to me.”\wj* +\p +\v 20 They brought him to him, and when he saw him, immediately the spirit convulsed him and he fell on the ground, wallowing and foaming at the mouth. +\p +\v 21 He asked his father, \wj “How long has it been since this has been happening to him?”\wj* +\p He said, “From childhood. +\v 22 Often it has cast him both into the fire and into the water to destroy him. But if you can do anything, have compassion on us and help us.” +\p +\v 23 Jesus said to him, \wj “If you can believe, all things are possible to him who believes.”\wj* +\p +\v 24 Immediately the father of the child cried out with tears, “I believe. Help my unbelief!” +\p +\v 25 When Jesus saw that a multitude came running together, he rebuked the unclean spirit, saying to him, \wj “You mute and deaf spirit, I command you, come out of him, and never enter him again!”\wj* +\p +\v 26 After crying out and convulsing him greatly, it came out of him. The boy became like one dead, so much that most of them said, “He is dead.” +\v 27 But Jesus took him by the hand and raised him up; and he arose. +\p +\v 28 When he had come into the house, his disciples asked him privately, “Why couldn’t we cast it out?” +\p +\v 29 He said to them, \wj “This kind can come out by nothing but by prayer and fasting.”\wj* +\p +\v 30 They went out from there and passed through Galilee. He didn’t want anyone to know it, +\v 31 for he was teaching his disciples, and said to them, \wj “The Son of Man is being handed over to the hands of men, and they will kill him; and when he is killed, on the third day he will rise again.”\wj* +\p +\v 32 But they didn’t understand the saying, and were afraid to ask him. +\p +\v 33 He came to Capernaum, and when he was in the house he asked them, \wj “What were you arguing among yourselves on the way?”\wj* +\p +\v 34 But they were silent, for they had disputed with one another on the way about who was the greatest. +\p +\v 35 He sat down and called the twelve; and he said to them, \wj “If any man wants to be first, he shall be last of all, and servant of all.”\wj* +\v 36 He took a little child and set him in the middle of them. Taking him in his arms, he said to them, +\v 37 \wj “Whoever receives one such little child in my name receives me; and whoever receives me, doesn’t receive me, but him who sent me.”\wj* +\p +\v 38 John said to him, “Teacher, we saw someone who doesn’t follow us casting out demons in your name; and we forbade him, because he doesn’t follow us.” +\p +\v 39 But Jesus said, \wj “Don’t forbid him, for there is no one who will do a mighty work in my name and be able quickly to speak evil of me. \wj* +\v 40 \wj For whoever is not against us is on our side. \wj* +\v 41 \wj For whoever will give you a cup of water to drink in my name because you are Christ’s, most certainly I tell you, he will in no way lose his reward. \wj* +\p +\v 42 \wj “Whoever will cause one of these little ones who believe in me to stumble, it would be better for him if he were thrown into the sea with a millstone hung around his neck. \wj* +\v 43 \wj If your hand causes you to stumble, cut it off. It is better for you to enter into life maimed, rather than having your two hands to go into Gehenna, \wj*\f + \fr 9:43 \ft or, Hell\f* \wj into the unquenchable fire, \wj* +\v 44 \wj ‘where their worm doesn’t die, and the fire is not quenched.’ \wj*\x + \xo 9:44 \xt Isaiah 66:24\x*\f + \fr 9:44 \ft NU omits verse 44.\f* +\v 45 \wj If your foot causes you to stumble, cut it off. It is better for you to enter into life lame, rather than having your two feet to be cast into Gehenna, \wj*\f + \fr 9:45 \ft or, Hell\f* \wj into the fire that will never be quenched—\wj* +\v 46 \wj ‘where their worm doesn’t die, and the fire is not quenched.’ \wj*\f + \fr 9:46 \ft NU omits verse 46.\f* +\v 47 \wj If your eye causes you to stumble, throw it out. It is better for you to enter into God’s Kingdom with one eye, rather than having two eyes to be cast into the Gehenna\wj*\f + \fr 9:47 \ft or, Hell\f* \wj of fire, \wj* +\v 48 \wj ‘where their worm doesn’t die, and the fire is not quenched.’ \wj*\x + \xo 9:48 \xt Isaiah 66:24\x* +\v 49 \wj For everyone will be salted with fire, and every sacrifice will be seasoned with salt. \wj* +\v 50 \wj Salt is good, but if the salt has lost its saltiness, with what will you season it? Have salt in yourselves, and be at peace with one another.” \wj* +\c 10 +\p +\v 1 He arose from there and came into the borders of Judea and beyond the Jordan. Multitudes came together to him again. As he usually did, he was again teaching them. +\p +\v 2 Pharisees came to him testing him, and asked him, “Is it lawful for a man to divorce his wife?” +\p +\v 3 He answered, \wj “What did Moses command you?”\wj* +\p +\v 4 They said, “Moses allowed a certificate of divorce to be written, and to divorce her.” +\p +\v 5 But Jesus said to them, \wj “For your hardness of heart, he wrote you this commandment. \wj* +\v 6 \wj But from the beginning of the creation, God made them male and female.\wj*\x + \xo 10:6 \xt Genesis 1:27\x* +\v 7 \wj For this cause a man will leave his father and mother, and will join to his wife, \wj* +\v 8 \wj and the two will become one flesh,\wj*\x + \xo 10:8 \xt Genesis 2:24\x* \wj so that they are no longer two, but one flesh. \wj* +\v 9 \wj What therefore God has joined together, let no man separate.” \wj* +\p +\v 10 In the house, his disciples asked him again about the same matter. +\v 11 He said to them, \wj “Whoever divorces his wife and marries another commits adultery against her. \wj* +\v 12 \wj If a woman herself divorces her husband and marries another, she commits adultery.”\wj* +\p +\v 13 They were bringing to him little children, that he should touch them, but the disciples rebuked those who were bringing them. +\v 14 But when Jesus saw it, he was moved with indignation and said to them, \wj “Allow the little children to come to me! Don’t forbid them, for God’s Kingdom belongs to such as these. \wj* +\v 15 \wj Most certainly I tell you, whoever will not receive God’s Kingdom like a little child, he will in no way enter into it.”\wj* +\v 16 He took them in his arms and blessed them, laying his hands on them. +\p +\v 17 As he was going out into the way, one ran to him, knelt before him, and asked him, “Good Teacher, what shall I do that I may inherit eternal life?” +\p +\v 18 Jesus said to him, \wj “Why do you call me good? No one is good except one—God. \wj* +\v 19 \wj You know the commandments: ‘Do not murder,’ ‘Do not commit adultery,’ ‘Do not steal,’ ‘Do not give false testimony,’ ‘Do not defraud,’ ‘Honor your father and mother.’”\wj*\x + \xo 10:19 \xt Exodus 20:12-16; Deuteronomy 5:16-20 \x* +\p +\v 20 He said to him, “Teacher, I have observed all these things from my youth.” +\p +\v 21 Jesus looking at him loved him, and said to him, \wj “One thing you lack. Go, sell whatever you have and give to the poor, and you will have treasure in heaven; and come, follow me, taking up the cross.”\wj* +\p +\v 22 But his face fell at that saying, and he went away sorrowful, for he was one who had great possessions. +\p +\v 23 Jesus looked around and said to his disciples, \wj “How difficult it is for those who have riches to enter into God’s Kingdom!”\wj* +\p +\v 24 The disciples were amazed at his words. But Jesus answered again, \wj “Children, how hard it is for those who trust in riches to enter into God’s Kingdom! \wj* +\v 25 \wj It is easier for a camel to go through a needle’s eye than for a rich man to enter into God’s Kingdom.”\wj* +\p +\v 26 They were exceedingly astonished, saying to him, “Then who can be saved?” +\p +\v 27 Jesus, looking at them, said, \wj “With men it is impossible, but not with God, for all things are possible with God.”\wj* +\p +\v 28 Peter began to tell him, “Behold, we have left all and have followed you.” +\p +\v 29 Jesus said, \wj “Most certainly I tell you, there is no one who has left house, or brothers, or sisters, or father, or mother, or wife, or children, or land, for my sake, and for the sake of the Good News, \wj* +\v 30 \wj but he will receive one hundred times more now in this time: houses, brothers, sisters, mothers, children, and land, with persecutions; and in the age to come eternal life. \wj* +\v 31 \wj But many who are first will be last, and the last first.”\wj* +\p +\v 32 They were on the way, going up to Jerusalem; and Jesus was going in front of them, and they were amazed; and those who followed were afraid. He again took the twelve, and began to tell them the things that were going to happen to him. +\v 33 \wj “Behold, we are going up to Jerusalem. The Son of Man will be delivered to the chief priests and the scribes. They will condemn him to death, and will deliver him to the Gentiles. \wj* +\v 34 \wj They will mock him, spit on him, scourge him, and kill him. On the third day he will rise again.”\wj* +\p +\v 35 James and John, the sons of Zebedee, came near to him, saying, “Teacher, we want you to do for us whatever we will ask.” +\p +\v 36 He said to them, \wj “What do you want me to do for you?”\wj* +\p +\v 37 They said to him, “Grant to us that we may sit, one at your right hand and one at your left hand, in your glory.” +\p +\v 38 But Jesus said to them, \wj “You don’t know what you are asking. Are you able to drink the cup that I drink, and to be baptized with the baptism that I am baptized with?”\wj* +\p +\v 39 They said to him, “We are able.” +\p Jesus said to them, \wj “You shall indeed drink the cup that I drink, and you shall be baptized with the baptism that I am baptized with; \wj* +\v 40 \wj but to sit at my right hand and at my left hand is not mine to give, but for whom it has been prepared.”\wj* +\p +\v 41 When the ten heard it, they began to be indignant toward James and John. +\p +\v 42 Jesus summoned them and said to them, \wj “You know that they who are recognized as rulers over the nations lord it over them, and their great ones exercise authority over them. \wj* +\v 43 \wj But it shall not be so among you, but whoever wants to become great among you shall be your servant. \wj* +\v 44 \wj Whoever of you wants to become first among you shall be bondservant of all. \wj* +\v 45 \wj For the Son of Man also came not to be served but to serve, and to give his life as a ransom for many.”\wj* +\p +\v 46 They came to Jericho. As he went out from Jericho with his disciples and a great multitude, the son of Timaeus, Bartimaeus, a blind beggar, was sitting by the road. +\v 47 When he heard that it was Jesus the Nazarene, he began to cry out and say, “Jesus, you son of David, have mercy on me!” +\v 48 Many rebuked him, that he should be quiet, but he cried out much more, “You son of David, have mercy on me!” +\p +\v 49 Jesus stood still and said, \wj “Call him.”\wj* +\p They called the blind man, saying to him, “Cheer up! Get up. He is calling you!” +\p +\v 50 He, casting away his cloak, sprang up, and came to Jesus. +\p +\v 51 Jesus asked him, \wj “What do you want me to do for you?”\wj* +\p The blind man said to him, “Rabboni,\f + \fr 10:51 \ft Rabboni is a transliteration of the Hebrew word for “great teacher.”\f* that I may see again.” +\p +\v 52 Jesus said to him, \wj “Go your way. Your faith has made you well.” \wj* Immediately he received his sight and followed Jesus on the way. +\c 11 +\p +\v 1 When they came near to Jerusalem, to Bethsphage\f + \fr 11:1 \ft TR & NU read “Bethphage” instead of “Bethsphage”\f* and Bethany, at the Mount of Olives, he sent two of his disciples +\v 2 and said to them, \wj “Go your way into the village that is opposite you. Immediately as you enter into it, you will find a young donkey tied, on which no one has sat. Untie him and bring him. \wj* +\v 3 \wj If anyone asks you, ‘Why are you doing this?’ say, ‘The Lord needs him;’ and immediately he will send him back here.”\wj* +\p +\v 4 They went away, and found a young donkey tied at the door outside in the open street, and they untied him. +\v 5 Some of those who stood there asked them, “What are you doing, untying the young donkey?” +\v 6 They said to them just as Jesus had said, and they let them go. +\p +\v 7 They brought the young donkey to Jesus and threw their garments on it, and Jesus sat on it. +\v 8 Many spread their garments on the way, and others were cutting down branches from the trees and spreading them on the road. +\v 9 Those who went in front and those who followed cried out, “Hosanna!\f + \fr 11:9 \ft “Hosanna” means “save us” or “help us, we pray”.\f* Blessed is he who comes in the name of the Lord!\x + \xo 11:9 \xt Psalm 118:25-26\x* +\v 10 Blessed is the kingdom of our father David that is coming in the name of the Lord! Hosanna in the highest!” +\p +\v 11 Jesus entered into the temple in Jerusalem. When he had looked around at everything, it being now evening, he went out to Bethany with the twelve. +\p +\v 12 The next day, when they had come out from Bethany, he was hungry. +\v 13 Seeing a fig tree afar off having leaves, he came to see if perhaps he might find anything on it. When he came to it, he found nothing but leaves, for it was not the season for figs. +\v 14 Jesus told it, \wj “May no one ever eat fruit from you again!” \wj* and his disciples heard it. +\p +\v 15 They came to Jerusalem, and Jesus entered into the temple and began to throw out those who sold and those who bought in the temple, and overthrew the money changers’ tables and the seats of those who sold the doves. +\v 16 He would not allow anyone to carry a container through the temple. +\v 17 He taught, saying to them, \wj “Isn’t it written, ‘My house will be called a house of prayer for all the nations?’\wj*\x + \xo 11:17 \xt Isaiah 56:7\x* \wj But you have made it a den of robbers!”\wj*\x + \xo 11:17 \xt Jeremiah 7:11\x* +\p +\v 18 The chief priests and the scribes heard it, and sought how they might destroy him. For they feared him, because all the multitude was astonished at his teaching. +\p +\v 19 When evening came, he went out of the city. +\v 20 As they passed by in the morning, they saw the fig tree withered away from the roots. +\v 21 Peter, remembering, said to him, “Rabbi, look! The fig tree which you cursed has withered away.” +\p +\v 22 Jesus answered them, \wj “Have faith in God. \wj* +\v 23 \wj For most certainly I tell you, whoever may tell this mountain, ‘Be taken up and cast into the sea,’ and doesn’t doubt in his heart, but believes that what he says is happening, he shall have whatever he says. \wj* +\v 24 \wj Therefore I tell you, all things whatever you pray and ask for, believe that you have received them, and you shall have them. \wj* +\v 25 \wj Whenever you stand praying, forgive, if you have anything against anyone; so that your Father, who is in heaven, may also forgive you your transgressions. \wj* +\v 26 \wj But if you do not forgive, neither will your Father in heaven forgive your transgressions.”\wj*\f + \fr 11:26 \ft NU omits verse 26.\f* +\p +\v 27 They came again to Jerusalem, and as he was walking in the temple, the chief priests, the scribes, and the elders came to him, +\v 28 and they began saying to him, “By what authority do you do these things? Or who gave you this authority to do these things?” +\p +\v 29 Jesus said to them, \wj “I will ask you one question. Answer me, and I will tell you by what authority I do these things. \wj* +\v 30 \wj The baptism of John—was it from heaven, or from men? Answer me.” \wj* +\p +\v 31 They reasoned with themselves, saying, “If we should say, ‘From heaven;’ he will say, ‘Why then did you not believe him?’ +\v 32 If we should say, ‘From men’”—they feared the people, for all held John to really be a prophet. +\v 33 They answered Jesus, “We don’t know.” +\p Jesus said to them, \wj “Neither will I tell you by what authority I do these things.”\wj* +\c 12 +\p +\v 1 He began to speak to them in parables. \wj “A man planted a vineyard, put a hedge around it, dug a pit for the wine press, built a tower, rented it out to a farmer, and went into another country. \wj* +\v 2 \wj When it was time, he sent a servant to the farmer to get from the farmer his share of the fruit of the vineyard. \wj* +\v 3 \wj They took him, beat him, and sent him away empty. \wj* +\v 4 \wj Again, he sent another servant to them; and they threw stones at him, wounded him in the head, and sent him away shamefully treated. \wj* +\v 5 \wj Again he sent another, and they killed him, and many others, beating some, and killing some. \wj* +\v 6 \wj Therefore still having one, his beloved son, he sent him last to them, saying, ‘They will respect my son.’ \wj* +\v 7 \wj But those farmers said among themselves, ‘This is the heir. Come, let’s kill him, and the inheritance will be ours.’ \wj* +\v 8 \wj They took him, killed him, and cast him out of the vineyard. \wj* +\v 9 \wj What therefore will the lord of the vineyard do? He will come and destroy the farmers, and will give the vineyard to others. \wj* +\v 10 \wj Haven’t you even read this Scripture:\wj* +\q1 \wj ‘The stone which the builders rejected\wj* +\q2 \wj was made the head of the corner.\wj* +\q1 +\v 11 \wj This was from the Lord.\wj* +\q2 \wj It is marvelous in our eyes’?”\wj*\x + \xo 12:11 \xt Psalm 118:22-23\x* +\p +\v 12 They tried to seize him, but they feared the multitude; for they perceived that he spoke the parable against them. They left him and went away. +\v 13 They sent some of the Pharisees and the Herodians to him, that they might trap him with words. +\v 14 When they had come, they asked him, “Teacher, we know that you are honest, and don’t defer to anyone; for you aren’t partial to anyone, but truly teach the way of God. Is it lawful to pay taxes to Caesar, or not? +\v 15 Shall we give, or shall we not give?” +\p But he, knowing their hypocrisy, said to them, \wj “Why do you test me? Bring me a denarius, that I may see it.”\wj* +\p +\v 16 They brought it. +\p He said to them, \wj “Whose is this image and inscription?”\wj* +\p They said to him, “Caesar’s.” +\p +\v 17 Jesus answered them, \wj “Render to Caesar the things that are Caesar’s, and to God the things that are God’s.”\wj* +\p They marveled greatly at him. +\p +\v 18 Some Sadducees, who say that there is no resurrection, came to him. They asked him, saying, +\v 19 “Teacher, Moses wrote to us, ‘If a man’s brother dies and leaves a wife behind him, and leaves no children, that his brother should take his wife and raise up offspring for his brother.’ +\v 20 There were seven brothers. The first took a wife, and dying left no offspring. +\v 21 The second took her, and died, leaving no children behind him. The third likewise; +\v 22 and the seven took her and left no children. Last of all the woman also died. +\v 23 In the resurrection, when they rise, whose wife will she be of them? For the seven had her as a wife.” +\p +\v 24 Jesus answered them, \wj “Isn’t this because you are mistaken, not knowing the Scriptures nor the power of God? \wj* +\v 25 \wj For when they will rise from the dead, they neither marry nor are given in marriage, but are like angels in heaven. \wj* +\v 26 \wj But about the dead, that they are raised, haven’t you read in the book of Moses about the Bush, how God spoke to him, saying, ‘I am the God of Abraham, the God of Isaac, and the God of Jacob’?\wj*\x + \xo 12:26 \xt Exodus 3:6\x* +\v 27 \wj He is not the God of the dead, but of the living. You are therefore badly mistaken.”\wj* +\p +\v 28 One of the scribes came and heard them questioning together, and knowing that he had answered them well, asked him, “Which commandment is the greatest of all?” +\p +\v 29 Jesus answered, \wj “The greatest is: ‘Hear, Israel, the Lord our God, the Lord is one. \wj* +\v 30 \wj You shall love the Lord your God with all your heart, with all your soul, with all your mind, and with all your strength.’\wj*\x + \xo 12:30 \xt Deuteronomy 6:4-5\x* \wj This is the first commandment. \wj* +\v 31 \wj The second is like this: ‘You shall love your neighbor as yourself.’\wj*\x + \xo 12:31 \xt Leviticus 19:18\x* \wj There is no other commandment greater than these.”\wj* +\p +\v 32 The scribe said to him, “Truly, teacher, you have said well that he is one, and there is none other but he; +\v 33 and to love him with all the heart, with all the understanding, all the soul, and with all the strength, and to love his neighbor as himself, is more important than all whole burnt offerings and sacrifices.” +\p +\v 34 When Jesus saw that he answered wisely, he said to him, \wj “You are not far from God’s Kingdom.”\wj* +\p No one dared ask him any question after that. +\v 35 Jesus responded, as he taught in the temple, \wj “How is it that the scribes say that the Christ is the son of David? \wj* +\v 36 \wj For David himself said in the Holy Spirit,\wj* +\q1 \wj ‘The Lord said to my Lord,\wj* +\q2 \wj “Sit at my right hand,\wj* +\q2 \wj until I make your enemies the footstool of your feet.”’\wj*\x + \xo 12:36 \xt Psalm 110:1\x* +\p +\v 37 \wj Therefore David himself calls him Lord, so how can he be his son?” \wj* +\p The common people heard him gladly. +\v 38 In his teaching he said to them, \wj “Beware of the scribes, who like to walk in long robes, and to get greetings in the marketplaces, \wj* +\v 39 \wj and to get the best seats in the synagogues and the best places at feasts, \wj* +\v 40 \wj those who devour widows’ houses, and for a pretense make long prayers. These will receive greater condemnation.”\wj* +\p +\v 41 Jesus sat down opposite the treasury and saw how the multitude cast money into the treasury. Many who were rich cast in much. +\v 42 A poor widow came and she cast in two small brass coins,\f + \fr 12:42 \ft literally, lepta (or widow’s mites). Lepta are very small brass coins worth half a quadrans each, which is a quarter of the copper assarion. Lepta are worth less than 1% of an agricultural worker’s daily wages.\f* which equal a quadrans coin.\f + \fr 12:42 \ft A quadrans is a coin worth about 1/64 of a denarius. A denarius is about one day’s wages for an agricultural laborer.\f* +\v 43 He called his disciples to himself and said to them, \wj “Most certainly I tell you, this poor widow gave more than all those who are giving into the treasury, \wj* +\v 44 \wj for they all gave out of their abundance, but she, out of her poverty, gave all that she had to live on.”\wj* +\c 13 +\p +\v 1 As he went out of the temple, one of his disciples said to him, “Teacher, see what kind of stones and what kind of buildings!” +\p +\v 2 Jesus said to him, \wj “Do you see these great buildings? There will not be left here one stone on another, which will not be thrown down.”\wj* +\p +\v 3 As he sat on the Mount of Olives opposite the temple, Peter, James, John, and Andrew asked him privately, +\v 4 “Tell us, when will these things be? What is the sign that these things are all about to be fulfilled?” +\p +\v 5 Jesus, answering, began to tell them, \wj “Be careful that no one leads you astray. \wj* +\v 6 \wj For many will come in my name, saying, ‘I am he!’\wj*\f + \fr 13:6 \ft or, “I AM!”\f* \wj and will lead many astray.\wj* +\p +\v 7 \wj “When you hear of wars and rumors of wars, don’t be troubled. For those must happen, but the end is not yet. \wj* +\v 8 \wj For nation will rise against nation, and kingdom against kingdom. There will be earthquakes in various places. There will be famines and troubles. These things are the beginning of birth pains. \wj* +\p +\v 9 \wj “But watch yourselves, for they will deliver you up to councils. You will be beaten in synagogues. You will stand before rulers and kings for my sake, for a testimony to them. \wj* +\v 10 \wj The Good News must first be preached to all the nations. \wj* +\v 11 \wj When they lead you away and deliver you up, don’t be anxious beforehand or premeditate what you will say, but say whatever will be given you in that hour. For it is not you who speak, but the Holy Spirit.\wj* +\p +\v 12 \wj “Brother will deliver up brother to death, and the father his child. Children will rise up against parents and cause them to be put to death. \wj* +\v 13 \wj You will be hated by all men for my name’s sake, but he who endures to the end will be saved. \wj* +\p +\v 14 \wj “But when you see the abomination of desolation,\wj*\x + \xo 13:14 \xt Daniel 9:17; 11:31; 12:11\x* \wj spoken of by Daniel the prophet, standing where it ought not”\wj* (let the reader understand), \wj “then let those who are in Judea flee to the mountains, \wj* +\v 15 \wj and let him who is on the housetop not go down, nor enter in, to take anything out of his house. \wj* +\v 16 \wj Let him who is in the field not return back to take his cloak. \wj* +\v 17 \wj But woe to those who are with child and to those who nurse babies in those days! \wj* +\v 18 \wj Pray that your flight won’t be in the winter. \wj* +\v 19 \wj For in those days there will be oppression, such as there has not been the like from the beginning of the creation which God created until now, and never will be. \wj* +\v 20 \wj Unless the Lord had shortened the days, no flesh would have been saved; but for the sake of the chosen ones, whom he picked out, he shortened the days. \wj* +\v 21 \wj Then if anyone tells you, ‘Look, here is the Christ!’ or, ‘Look, there!’ don’t believe it. \wj* +\v 22 \wj For false christs and false prophets will arise and will show signs and wonders, that they may lead astray, if possible, even the chosen ones. \wj* +\v 23 \wj But you watch.\wj* +\p \wj “Behold, I have told you all things beforehand. \wj* +\v 24 \wj But in those days, after that oppression, the sun will be darkened, the moon will not give its light, \wj* +\v 25 \wj the stars will be falling from the sky, and the powers that are in the heavens will be shaken.\wj*\x + \xo 13:25 \xt Isaiah 13:10; 34:4\x* +\v 26 \wj Then they will see the Son of Man coming in clouds with great power and glory. \wj* +\v 27 \wj Then he will send out his angels, and will gather together his chosen ones from the four winds, from the ends of the earth to the ends of the sky.\wj* +\p +\v 28 \wj “Now from the fig tree, learn this parable. When the branch has now become tender and produces its leaves, you know that the summer is near; \wj* +\v 29 \wj even so you also, when you see these things coming to pass, know that it is near, at the doors. \wj* +\v 30 \wj Most certainly I say to you, this generation\wj*\f + \fr 13:30 \ft The word translated “generation” (genea) could also be translated “race”, “family”, or “people”.\f* \wj will not pass away until all these things happen. \wj* +\v 31 \wj Heaven and earth will pass away, but my words will not pass away. \wj* +\p +\v 32 \wj “But of that day or that hour no one knows—not even the angels in heaven, nor the Son, but only the Father. \wj* +\v 33 \wj Watch, keep alert, and pray; for you don’t know when the time is. \wj* +\p +\v 34 \wj “It is like a man traveling to another country, having left his house and given authority to his servants, and to each one his work, and also commanded the doorkeeper to keep watch. \wj* +\v 35 \wj Watch therefore, for you don’t know when the lord of the house is coming—whether at evening, or at midnight, or when the rooster crows, or in the morning; \wj* +\v 36 \wj lest, coming suddenly, he might find you sleeping. \wj* +\v 37 \wj What I tell you, I tell all: Watch!”\wj* +\c 14 +\p +\v 1 It was now two days before the Passover and the Feast of Unleavened Bread, and the chief priests and the scribes sought how they might seize him by deception and kill him. +\v 2 For they said, “Not during the feast, because there might be a riot among the people.” +\p +\v 3 While he was at Bethany, in the house of Simon the leper, as he sat at the table, a woman came having an alabaster jar of ointment of pure nard—very costly. She broke the jar and poured it over his head. +\v 4 But there were some who were indignant among themselves, saying, “Why has this ointment been wasted? +\v 5 For this might have been sold for more than three hundred denarii\f + \fr 14:5 \ft 300 denarii was about a year’s wages for an agricultural laborer. \f* and given to the poor.” So they grumbled against her. +\p +\v 6 But Jesus said, \wj “Leave her alone. Why do you trouble her? She has done a good work for me. \wj* +\v 7 \wj For you always have the poor with you, and whenever you want to, you can do them good; but you will not always have me. \wj* +\v 8 \wj She has done what she could. She has anointed my body beforehand for the burying. \wj* +\v 9 \wj Most certainly I tell you, wherever this Good News may be preached throughout the whole world, that which this woman has done will also be spoken of for a memorial of her.”\wj* +\p +\v 10 Judas Iscariot, who was one of the twelve, went away to the chief priests, that he might deliver him to them. +\v 11 They, when they heard it, were glad, and promised to give him money. He sought how he might conveniently deliver him. +\p +\v 12 On the first day of unleavened bread, when they sacrificed the Passover, his disciples asked him, “Where do you want us to go and prepare that you may eat the Passover?” +\p +\v 13 He sent two of his disciples and said to them, \wj “Go into the city, and there a man carrying a pitcher of water will meet you. Follow him, \wj* +\v 14 \wj and wherever he enters in, tell the master of the house, ‘The Teacher says, “Where is the guest room, where I may eat the Passover with my disciples?”’ \wj* +\v 15 \wj He will himself show you a large upper room furnished and ready. Get ready for us there.”\wj* +\p +\v 16 His disciples went out, and came into the city, and found things as he had said to them, and they prepared the Passover. +\p +\v 17 When it was evening he came with the twelve. +\v 18 As they sat and were eating, Jesus said, \wj “Most certainly I tell you, one of you will betray me—he who eats with me.”\wj* +\p +\v 19 They began to be sorrowful, and to ask him one by one, “Surely not I?” And another said, “Surely not I?” +\p +\v 20 He answered them, \wj “It is one of the twelve, he who dips with me in the dish. \wj* +\v 21 \wj For the Son of Man goes as it is written about him, but woe to that man by whom the Son of Man is betrayed! It would be better for that man if he had not been born.”\wj* +\p +\v 22 As they were eating, Jesus took bread, and when he had blessed it, he broke it and gave to them, and said, \wj “Take, eat. This is my body.”\wj* +\p +\v 23 He took the cup, and when he had given thanks, he gave to them. They all drank of it. +\v 24 He said to them, \wj “This is my blood of the new covenant, which is poured out for many. \wj* +\v 25 \wj Most certainly I tell you, I will no more drink of the fruit of the vine until that day when I drink it anew in God’s Kingdom.”\wj* +\v 26 When they had sung a hymn, they went out to the Mount of Olives. +\p +\v 27 Jesus said to them, \wj “All of you will be made to stumble because of me tonight, for it is written, ‘I will strike the shepherd, and the sheep will be scattered.’\wj*\x + \xo 14:27 \xt Zechariah 13:7\x* +\v 28 \wj However, after I am raised up, I will go before you into Galilee.” \wj* +\p +\v 29 But Peter said to him, “Although all will be offended, yet I will not.” +\p +\v 30 Jesus said to him, \wj “Most certainly I tell you that you today, even this night, before the rooster crows twice, you will deny me three times.” \wj* +\p +\v 31 But he spoke all the more, “If I must die with you, I will not deny you.” They all said the same thing. +\p +\v 32 They came to a place which was named Gethsemane. He said to his disciples, \wj “Sit here while I pray.”\wj* +\v 33 He took with him Peter, James, and John, and began to be greatly troubled and distressed. +\v 34 He said to them, \wj “My soul is exceedingly sorrowful, even to death. Stay here and watch.”\wj* +\p +\v 35 He went forward a little, and fell on the ground, and prayed that if it were possible, the hour might pass away from him. +\v 36 He said, \wj “Abba,\wj*\f + \fr 14:36 \ft Abba is a Greek spelling for the Aramaic word for “Father” or “Daddy” used in a familiar, respectful, and loving way. \f* \wj Father, all things are possible to you. Please remove this cup from me. However, not what I desire, but what you desire.” \wj* +\p +\v 37 He came and found them sleeping, and said to Peter, \wj “Simon, are you sleeping? Couldn’t you watch one hour? \wj* +\v 38 \wj Watch and pray, that you may not enter into temptation. The spirit indeed is willing, but the flesh is weak.”\wj* +\p +\v 39 Again he went away and prayed, saying the same words. +\v 40 Again he returned and found them sleeping, for their eyes were very heavy; and they didn’t know what to answer him. +\v 41 He came the third time and said to them, \wj “Sleep on now, and take your rest. It is enough. The hour has come. Behold, the Son of Man is betrayed into the hands of sinners. \wj* +\v 42 \wj Arise! Let’s get going. Behold, he who betrays me is at hand.” \wj* +\p +\v 43 Immediately, while he was still speaking, Judas, one of the twelve, came—and with him a multitude with swords and clubs, from the chief priests, the scribes, and the elders. +\v 44 Now he who betrayed him had given them a sign, saying, “Whomever I will kiss, that is he. Seize him, and lead him away safely.” +\v 45 When he had come, immediately he came to him and said, “Rabbi! Rabbi!” and kissed him. +\v 46 They laid their hands on him and seized him. +\v 47 But a certain one of those who stood by drew his sword and struck the servant of the high priest, and cut off his ear. +\p +\v 48 Jesus answered them, \wj “Have you come out, as against a robber, with swords and clubs to seize me? \wj* +\v 49 \wj I was daily with you in the temple teaching, and you didn’t arrest me. But this is so that the Scriptures might be fulfilled.”\wj* +\p +\v 50 They all left him, and fled. +\v 51 A certain young man followed him, having a linen cloth thrown around himself over his naked body. The young men grabbed him, +\v 52 but he left the linen cloth and fled from them naked. +\v 53 They led Jesus away to the high priest. All the chief priests, the elders, and the scribes came together with him. +\p +\v 54 Peter had followed him from a distance, until he came into the court of the high priest. He was sitting with the officers, and warming himself in the light of the fire. +\v 55 Now the chief priests and the whole council sought witnesses against Jesus to put him to death, and found none. +\v 56 For many gave false testimony against him, and their testimony didn’t agree with each other. +\v 57 Some stood up and gave false testimony against him, saying, +\v 58 “We heard him say, ‘I will destroy this temple that is made with hands, and in three days I will build another made without hands.’” +\v 59 Even so, their testimony didn’t agree. +\p +\v 60 The high priest stood up in the middle, and asked Jesus, “Have you no answer? What is it which these testify against you?” +\v 61 But he stayed quiet, and answered nothing. Again the high priest asked him, “Are you the Christ, the Son of the Blessed?” +\p +\v 62 Jesus said, \wj “I am. You will see the Son of Man sitting at the right hand of Power, and coming with the clouds of the sky.”\wj* +\p +\v 63 The high priest tore his clothes and said, “What further need have we of witnesses? +\v 64 You have heard the blasphemy! What do you think?” They all condemned him to be worthy of death. +\v 65 Some began to spit on him, and to cover his face, and to beat him with fists, and to tell him, “Prophesy!” The officers struck him with the palms of their hands. +\p +\v 66 As Peter was in the courtyard below, one of the maids of the high priest came, +\v 67 and seeing Peter warming himself, she looked at him and said, “You were also with the Nazarene, Jesus!” +\p +\v 68 But he denied it, saying, “I neither know nor understand what you are saying.” He went out on the porch, and the rooster crowed. +\p +\v 69 The maid saw him and began again to tell those who stood by, “This is one of them.” +\v 70 But he again denied it. After a little while again those who stood by said to Peter, “You truly are one of them, for you are a Galilean, and your speech shows it.” +\v 71 But he began to curse and to swear, “I don’t know this man of whom you speak!” +\p +\v 72 The rooster crowed the second time. Peter remembered the words that Jesus said to him, \wj “Before the rooster crows twice, you will deny me three times.”\wj* When he thought about that, he wept. +\c 15 +\p +\v 1 Immediately in the morning the chief priests, with the elders, scribes, and the whole council, held a consultation, bound Jesus, carried him away, and delivered him up to Pilate. +\v 2 Pilate asked him, “Are you the King of the Jews?” +\p He answered, \wj “So you say.”\wj* +\p +\v 3 The chief priests accused him of many things. +\v 4 Pilate again asked him, “Have you no answer? See how many things they testify against you!” +\p +\v 5 But Jesus made no further answer, so that Pilate marveled. +\p +\v 6 Now at the feast he used to release to them one prisoner, whomever they asked of him. +\v 7 There was one called Barabbas, bound with his fellow insurgents, men who in the insurrection had committed murder. +\v 8 The multitude, crying aloud, began to ask him to do as he always did for them. +\v 9 Pilate answered them, saying, “Do you want me to release to you the King of the Jews?” +\v 10 For he perceived that for envy the chief priests had delivered him up. +\v 11 But the chief priests stirred up the multitude, that he should release Barabbas to them instead. +\v 12 Pilate again asked them, “What then should I do to him whom you call the King of the Jews?” +\p +\v 13 They cried out again, “Crucify him!” +\p +\v 14 Pilate said to them, “Why, what evil has he done?” +\p But they cried out exceedingly, “Crucify him!” +\p +\v 15 Pilate, wishing to please the multitude, released Barabbas to them, and handed over Jesus, when he had flogged him, to be crucified. +\p +\v 16 The soldiers led him away within the court, which is the Praetorium; and they called together the whole cohort. +\v 17 They clothed him with purple; and weaving a crown of thorns, they put it on him. +\v 18 They began to salute him, “Hail, King of the Jews!” +\v 19 They struck his head with a reed and spat on him, and bowing their knees, did homage to him. +\v 20 When they had mocked him, they took the purple cloak off him, and put his own garments on him. They led him out to crucify him. +\p +\v 21 They compelled one passing by, coming from the country, Simon of Cyrene, the father of Alexander and Rufus, to go with them that he might bear his cross. +\v 22 They brought him to the place called Golgotha, which is, being interpreted, “The place of a skull.” +\v 23 They offered him wine mixed with myrrh to drink, but he didn’t take it. +\p +\v 24 Crucifying him, they parted his garments among them, casting lots on them, what each should take. +\v 25 It was the third hour\f + \fr 15:25 \ft 9:00 a.m.\f* when they crucified him. +\v 26 The superscription of his accusation was written over him: “THE KING OF THE JEWS.” +\v 27 With him they crucified two robbers, one on his right hand, and one on his left. +\v 28 The Scripture was fulfilled which says, “He was counted with transgressors.”\f + \fr 15:28 \ft NU omits verse 28.\f* +\p +\v 29 Those who passed by blasphemed him, wagging their heads and saying, “Ha! You who destroy the temple and build it in three days, +\v 30 save yourself, and come down from the cross!” +\p +\v 31 Likewise, also the chief priests mocking among themselves with the scribes said, “He saved others. He can’t save himself. +\v 32 Let the Christ, the King of Israel, now come down from the cross, that we may see and believe him.”\f + \fr 15:32 \ft TR omits “him”\f* Those who were crucified with him also insulted him. +\p +\v 33 When the sixth hour\f + \fr 15:33 \ft or, noon\f* had come, there was darkness over the whole land until the ninth hour.\f + \fr 15:33 \ft 3:00 p.m.\f* +\v 34 At the ninth hour Jesus cried with a loud voice, saying, \wj “Eloi, Eloi, lama sabachthani?”\wj* which is, being interpreted, \wj “My God, my God, why have you forsaken me?”\wj* \x + \xo 15:34 \xt Psalm 22:1\x* +\p +\v 35 Some of those who stood by, when they heard it, said, “Behold, he is calling Elijah.” +\p +\v 36 One ran, and filling a sponge full of vinegar, put it on a reed and gave it to him to drink, saying, “Let him be. Let’s see whether Elijah comes to take him down.” +\p +\v 37 Jesus cried out with a loud voice, and gave up the spirit. +\v 38 The veil of the temple was torn in two from the top to the bottom. +\v 39 When the centurion, who stood by opposite him, saw that he cried out like this and breathed his last, he said, “Truly this man was the Son of God!” +\p +\v 40 There were also women watching from afar, among whom were both Mary Magdalene and Mary the mother of James the less and of Joses, and Salome; +\v 41 who, when he was in Galilee, followed him and served him; and many other women who came up with him to Jerusalem. +\p +\v 42 When evening had now come, because it was the Preparation Day, that is, the day before the Sabbath, +\v 43 Joseph of Arimathaea, a prominent council member who also himself was looking for God’s Kingdom, came. He boldly went in to Pilate, and asked for Jesus’ body. +\v 44 Pilate was surprised to hear that he was already dead; and summoning the centurion, he asked him whether he had been dead long. +\v 45 When he found out from the centurion, he granted the body to Joseph. +\v 46 He bought a linen cloth, and taking him down, wound him in the linen cloth and laid him in a tomb which had been cut out of a rock. He rolled a stone against the door of the tomb. +\v 47 Mary Magdalene and Mary the mother of Joses, saw where he was laid. +\c 16 +\p +\v 1 When the Sabbath was past, Mary Magdalene, and Mary the mother of James, and Salome bought spices, that they might come and anoint him. +\v 2 Very early on the first day of the week, they came to the tomb when the sun had risen. +\v 3 They were saying among themselves, “Who will roll away the stone from the door of the tomb for us?” +\v 4 for it was very big. Looking up, they saw that the stone was rolled back. +\p +\v 5 Entering into the tomb, they saw a young man sitting on the right side, dressed in a white robe; and they were amazed. +\v 6 He said to them, “Don’t be amazed. You seek Jesus, the Nazarene, who has been crucified. He has risen! He is not here. See the place where they laid him! +\v 7 But go, tell his disciples and Peter, ‘He goes before you into Galilee. There you will see him, as he said to you.’” +\p +\v 8 They went out,\f + \fr 16:8 \ft TR adds “quickly”\f* and fled from the tomb, for trembling and astonishment had come on them. They said nothing to anyone; for they were afraid.\f + \fr 16:8 \ft One isolated manuscript omits verses 9-20 but adds this “short ending of Mark” to the end of verse 8: \fqa They told all that had been commanded them briefly to those around Peter. After that, Jesus himself sent them out, from east to west, with the sacred and imperishable proclamation of eternal salvation.\f* +\p +\v 9 \f + \fr 16:9 \ft NU includes the text of verses 9-20, but mentions in a footnote that a few manuscripts omitted it. The translators of the World English Bible regard Mark 16:9-20 as reliable based on an overwhelming majority of textual evidence, including not only the authoritative Greek Majority Text New Testament, but also the TR and many of the manuscripts cited in the NU text.\f*Now when he had risen early on the first day of the week, he appeared first to Mary Magdalene, from whom he had cast out seven demons. +\v 10 She went and told those who had been with him, as they mourned and wept. +\v 11 When they heard that he was alive and had been seen by her, they disbelieved. +\p +\v 12 After these things he was revealed in another form to two of them as they walked, on their way into the country. +\v 13 They went away and told it to the rest. They didn’t believe them, either. +\p +\v 14 Afterward he was revealed to the eleven themselves as they sat at the table; and he rebuked them for their unbelief and hardness of heart, because they didn’t believe those who had seen him after he had risen. +\v 15 He said to them, \wj “Go into all the world and preach the Good News to the whole creation. \wj* +\v 16 \wj He who believes and is baptized will be saved; but he who disbelieves will be condemned. \wj* +\v 17 \wj These signs will accompany those who believe: in my name they will cast out demons; they will speak with new languages; \wj* +\v 18 \wj they will take up serpents; and if they drink any deadly thing, it will in no way hurt them; they will lay hands on the sick, and they will recover.”\wj* +\p +\v 19 So then the Lord,\f + \fr 16:19 \ft NU adds “Jesus”\f* after he had spoken to them, was received up into heaven and sat down at the right hand of God. +\v 20 They went out and preached everywhere, the Lord working with them and confirming the word by the signs that followed. Amen. diff --git a/c-sharp/assets/WEB/43LUKengWEBUS.SFM b/c-sharp/assets/WEB/43LUKengWEBUS.SFM new file mode 100644 index 0000000000..6276e86a33 --- /dev/null +++ b/c-sharp/assets/WEB/43LUKengWEBUS.SFM @@ -0,0 +1,1714 @@ +\id LUK 42-LUK-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Luke +\toc1 The Good News According to Luke +\toc2 Luke +\toc3 Luke +\mt2 The Good News According to +\mt1 Luke +\c 1 +\p +\v 1 Since many have undertaken to set in order a narrative concerning those matters which have been fulfilled among us, +\v 2 even as those who from the beginning were eyewitnesses and servants of the word delivered them to us, +\v 3 it seemed good to me also, having traced the course of all things accurately from the first, to write to you in order, most excellent Theophilus; +\v 4 that you might know the certainty concerning the things in which you were instructed. +\p +\v 5 There was in the days of Herod, the king of Judea, a certain priest named Zacharias, of the priestly division of Abijah. He had a wife of the daughters of Aaron, and her name was Elizabeth. +\v 6 They were both righteous before God, walking blamelessly in all the commandments and ordinances of the Lord. +\v 7 But they had no child, because Elizabeth was barren, and they both were well advanced in years. +\p +\v 8 Now while he executed the priest’s office before God in the order of his division +\v 9 according to the custom of the priest’s office, his lot was to enter into the temple of the Lord and burn incense. +\v 10 The whole multitude of the people were praying outside at the hour of incense. +\p +\v 11 An angel of the Lord appeared to him, standing on the right side of the altar of incense. +\v 12 Zacharias was troubled when he saw him, and fear fell upon him. +\v 13 But the angel said to him, “Don’t be afraid, Zacharias, because your request has been heard. Your wife, Elizabeth, will bear you a son, and you shall call his name John. +\v 14 You will have joy and gladness, and many will rejoice at his birth. +\v 15 For he will be great in the sight of the Lord, and he will drink no wine nor strong drink. He will be filled with the Holy Spirit, even from his mother’s womb. +\v 16 He will turn many of the children of Israel to the Lord their God. +\v 17 He will go before him in the spirit and power of Elijah, ‘to turn the hearts of the fathers to the children,’\x + \xo 1:17 \xt Malachi 4:6\x* and the disobedient to the wisdom of the just; to prepare a people prepared for the Lord.” +\p +\v 18 Zacharias said to the angel, “How can I be sure of this? For I am an old man, and my wife is well advanced in years.” +\p +\v 19 The angel answered him, “I am Gabriel, who stands in the presence of God. I was sent to speak to you and to bring you this good news. +\v 20 Behold,\f + \fr 1:20 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* you will be silent and not able to speak until the day that these things will happen, because you didn’t believe my words, which will be fulfilled in their proper time.” +\p +\v 21 The people were waiting for Zacharias, and they marveled that he delayed in the temple. +\v 22 When he came out, he could not speak to them. They perceived that he had seen a vision in the temple. He continued making signs to them, and remained mute. +\v 23 When the days of his service were fulfilled, he departed to his house. +\v 24 After these days Elizabeth his wife conceived, and she hid herself five months, saying, +\v 25 “Thus has the Lord done to me in the days in which he looked at me, to take away my reproach among men.” +\p +\v 26 Now in the sixth month, the angel Gabriel was sent from God to a city of Galilee named Nazareth, +\v 27 to a virgin pledged to be married to a man whose name was Joseph, of David’s house. The virgin’s name was Mary. +\v 28 Having come in, the angel said to her, “Rejoice, you highly favored one! The Lord is with you. Blessed are you among women!” +\p +\v 29 But when she saw him, she was greatly troubled at the saying, and considered what kind of salutation this might be. +\v 30 The angel said to her, “Don’t be afraid, Mary, for you have found favor with God. +\v 31 Behold, you will conceive in your womb and give birth to a son, and shall name him ‘Jesus.’ +\v 32 He will be great and will be called the Son of the Most High. The Lord God will give him the throne of his father David, +\v 33 and he will reign over the house of Jacob forever. There will be no end to his Kingdom.” +\p +\v 34 Mary said to the angel, “How can this be, seeing I am a virgin?” +\p +\v 35 The angel answered her, “The Holy Spirit will come on you, and the power of the Most High will overshadow you. Therefore also the holy one who is born from you will be called the Son of God. +\v 36 Behold, Elizabeth your relative also has conceived a son in her old age; and this is the sixth month with her who was called barren. +\v 37 For nothing spoken by God is impossible.”\f + \fr 1:37 \ft or, “For everything spoken by God is possible.”\f* +\p +\v 38 Mary said, “Behold, the servant of the Lord; let it be done to me according to your word.” +\p Then the angel departed from her. +\p +\v 39 Mary arose in those days and went into the hill country with haste, into a city of Judah, +\v 40 and entered into the house of Zacharias and greeted Elizabeth. +\v 41 When Elizabeth heard Mary’s greeting, the baby leaped in her womb; and Elizabeth was filled with the Holy Spirit. +\v 42 She called out with a loud voice and said, “Blessed are you among women, and blessed is the fruit of your womb! +\v 43 Why am I so favored, that the mother of my Lord should come to me? +\v 44 For behold, when the voice of your greeting came into my ears, the baby leaped in my womb for joy! +\v 45 Blessed is she who believed, for there will be a fulfillment of the things which have been spoken to her from the Lord!” +\p +\v 46 Mary said, +\q1 “My soul magnifies the Lord. +\q2 +\v 47 My spirit has rejoiced in God my Savior, +\q2 +\v 48 for he has looked at the humble state of his servant. +\q1 For behold, from now on, all generations will call me blessed. +\q2 +\v 49 For he who is mighty has done great things for me. +\q2 Holy is his name. +\q2 +\v 50 His mercy is for generations and generations on those who fear him. +\q1 +\v 51 He has shown strength with his arm. +\q2 He has scattered the proud in the imagination of their hearts. +\q1 +\v 52 He has put down princes from their thrones, +\q2 and has exalted the lowly. +\q1 +\v 53 He has filled the hungry with good things. +\q2 He has sent the rich away empty. +\q1 +\v 54 He has given help to Israel, his servant, that he might remember mercy, +\q2 +\v 55 as he spoke to our fathers, +\q2 to Abraham and his offspring\f + \fr 1:55 \ft or, seed\f* forever.” +\p +\v 56 Mary stayed with her about three months, and then returned to her house. +\p +\v 57 Now the time that Elizabeth should give birth was fulfilled, and she gave birth to a son. +\v 58 Her neighbors and her relatives heard that the Lord had magnified his mercy toward her, and they rejoiced with her. +\v 59 On the eighth day, they came to circumcise the child; and they would have called him Zacharias, after the name of his father. +\v 60 His mother answered, “Not so; but he will be called John.” +\p +\v 61 They said to her, “There is no one among your relatives who is called by this name.” +\v 62 They made signs to his father, what he would have him called. +\p +\v 63 He asked for a writing tablet, and wrote, “His name is John.” +\p They all marveled. +\v 64 His mouth was opened immediately and his tongue freed, and he spoke, blessing God. +\v 65 Fear came on all who lived around them, and all these sayings were talked about throughout all the hill country of Judea. +\v 66 All who heard them laid them up in their heart, saying, “What then will this child be?” The hand of the Lord was with him. +\p +\v 67 His father Zacharias was filled with the Holy Spirit, and prophesied, saying, +\q1 +\v 68 “Blessed be the Lord, the God of Israel, +\q2 for he has visited and redeemed his people; +\q1 +\v 69 and has raised up a horn of salvation for us in the house of his servant David +\q2 +\v 70 (as he spoke by the mouth of his holy prophets who have been from of old), +\q2 +\v 71 salvation from our enemies and from the hand of all who hate us; +\q1 +\v 72 to show mercy toward our fathers, +\q2 to remember his holy covenant, +\q1 +\v 73 the oath which he swore to Abraham our father, +\q2 +\v 74 to grant to us that we, being delivered out of the hand of our enemies, +\q2 should serve him without fear, +\q2 +\v 75 in holiness and righteousness before him all the days of our life. +\q1 +\v 76 And you, child, will be called a prophet of the Most High; +\q2 for you will go before the face of the Lord to prepare his ways, +\q2 +\v 77 to give knowledge of salvation to his people by the remission of their sins, +\q1 +\v 78 because of the tender mercy of our God, +\q2 by which the dawn from on high will visit us, +\q2 +\v 79 to shine on those who sit in darkness and the shadow of death; +\q2 to guide our feet into the way of peace.” +\p +\v 80 The child was growing and becoming strong in spirit, and was in the desert until the day of his public appearance to Israel. +\c 2 +\p +\v 1 Now in those days, a decree went out from Caesar Augustus that all the world should be enrolled. +\v 2 This was the first enrollment made when Quirinius was governor of Syria. +\v 3 All went to enroll themselves, everyone to his own city. +\v 4 Joseph also went up from Galilee, out of the city of Nazareth, into Judea, to David’s city, which is called Bethlehem, because he was of the house and family of David, +\v 5 to enroll himself with Mary, who was pledged to be married to him as wife, being pregnant. +\p +\v 6 While they were there, the day had come for her to give birth. +\v 7 She gave birth to her firstborn son. She wrapped him in bands of cloth and laid him in a feeding trough, because there was no room for them in the inn. +\p +\v 8 There were shepherds in the same country staying in the field, and keeping watch by night over their flock. +\v 9 Behold, an angel of the Lord stood by them, and the glory of the Lord shone around them, and they were terrified. +\v 10 The angel said to them, “Don’t be afraid, for behold, I bring you good news of great joy which will be to all the people. +\v 11 For there is born to you today, in David’s city, a Savior, who is Christ\f + \fr 2:11 \ft “Christ” means “Anointed One”.\f* the Lord. +\v 12 This is the sign to you: you will find a baby wrapped in strips of cloth, lying in a feeding trough.” +\v 13 Suddenly, there was with the angel a multitude of the heavenly army praising God and saying, +\q1 +\v 14 “Glory to God in the highest, +\q2 on earth peace, good will toward men.” +\p +\v 15 When the angels went away from them into the sky, the shepherds said to one another, “Let’s go to Bethlehem, now, and see this thing that has happened, which the Lord has made known to us.” +\v 16 They came with haste and found both Mary and Joseph, and the baby was lying in the feeding trough. +\v 17 When they saw it, they publicized widely the saying which was spoken to them about this child. +\v 18 All who heard it wondered at the things which were spoken to them by the shepherds. +\v 19 But Mary kept all these sayings, pondering them in her heart. +\v 20 The shepherds returned, glorifying and praising God for all the things that they had heard and seen, just as it was told them. +\p +\v 21 When eight days were fulfilled for the circumcision of the child, his name was called Jesus, which was given by the angel before he was conceived in the womb. +\p +\v 22 When the days of their purification according to the law of Moses were fulfilled, they brought him up to Jerusalem to present him to the Lord +\v 23 (as it is written in the law of the Lord, “Every male who opens the womb shall be called holy to the Lord”),\x + \xo 2:23 \xt Exodus 13:2,12\x* +\v 24 and to offer a sacrifice according to that which is said in the law of the Lord, “A pair of turtledoves, or two young pigeons.”\x + \xo 2:24 \xt Leviticus 12:8\x* +\p +\v 25 Behold, there was a man in Jerusalem whose name was Simeon. This man was righteous and devout, looking for the consolation of Israel, and the Holy Spirit was on him. +\v 26 It had been revealed to him by the Holy Spirit that he should not see death before he had seen the Lord’s Christ.\f + \fr 2:26 \ft “Christ” (Greek) and “Messiah” (Hebrew) both mean “Anointed One”\f* +\v 27 He came in the Spirit into the temple. When the parents brought in the child, Jesus, that they might do concerning him according to the custom of the law, +\v 28 then he received him into his arms and blessed God, and said, +\q1 +\v 29 “Now you are releasing your servant, Master, +\q2 according to your word, in peace; +\q1 +\v 30 for my eyes have seen your salvation, +\q2 +\v 31 which you have prepared before the face of all peoples; +\q1 +\v 32 a light for revelation to the nations, +\q2 and the glory of your people Israel.” +\p +\v 33 Joseph and his mother were marveling at the things which were spoken concerning him. +\v 34 Simeon blessed them, and said to Mary, his mother, “Behold, this child is appointed for the falling and the rising of many in Israel, and for a sign which is spoken against. +\v 35 Yes, a sword will pierce through your own soul, that the thoughts of many hearts may be revealed.” +\p +\v 36 There was one Anna, a prophetess, the daughter of Phanuel, of the tribe of Asher (she was of a great age, having lived with a husband seven years from her virginity, +\v 37 and she had been a widow for about eighty-four years), who didn’t depart from the temple, worshiping with fastings and petitions night and day. +\v 38 Coming up at that very hour, she gave thanks to the Lord, and spoke of him to all those who were looking for redemption in Jerusalem. +\p +\v 39 When they had accomplished all things that were according to the law of the Lord, they returned into Galilee, to their own city, Nazareth. +\v 40 The child was growing, and was becoming strong in spirit, being filled with wisdom, and the grace of God was upon him. +\p +\v 41 His parents went every year to Jerusalem at the feast of the Passover. +\v 42 When he was twelve years old, they went up to Jerusalem according to the custom of the feast; +\v 43 and when they had fulfilled the days, as they were returning, the boy Jesus stayed behind in Jerusalem. Joseph and his mother didn’t know it, +\v 44 but supposing him to be in the company, they went a day’s journey; and they looked for him among their relatives and acquaintances. +\v 45 When they didn’t find him, they returned to Jerusalem, looking for him. +\v 46 After three days they found him in the temple, sitting in the middle of the teachers, both listening to them and asking them questions. +\v 47 All who heard him were amazed at his understanding and his answers. +\v 48 When they saw him, they were astonished; and his mother said to him, “Son, why have you treated us this way? Behold, your father and I were anxiously looking for you.” +\p +\v 49 He said to them, \wj “Why were you looking for me? Didn’t you know that I must be in my Father’s house?”\wj* +\v 50 They didn’t understand the saying which he spoke to them. +\v 51 And he went down with them and came to Nazareth. He was subject to them, and his mother kept all these sayings in her heart. +\v 52 And Jesus increased in wisdom and stature, and in favor with God and men. +\c 3 +\p +\v 1 Now in the fifteenth year of the reign of Tiberius Caesar, Pontius Pilate being governor of Judea, and Herod being tetrarch of Galilee, and his brother Philip tetrarch of the region of Ituraea and Trachonitis, and Lysanias tetrarch of Abilene, +\v 2 during the high priesthood of Annas and Caiaphas, the word of God came to John, the son of Zacharias, in the wilderness. +\v 3 He came into all the region around the Jordan, preaching the baptism of repentance for remission of sins. +\v 4 As it is written in the book of the words of Isaiah the prophet, +\q1 “The voice of one crying in the wilderness, +\q2 ‘Make ready the way of the Lord. +\q1 Make his paths straight. +\q2 +\v 5 Every valley will be filled. +\q1 Every mountain and hill will be brought low. +\q2 The crooked will become straight, +\q2 and the rough ways smooth. +\q1 +\v 6 All flesh will see God’s salvation.’”\x + \xo 3:6 \xt Isaiah 40:3-5\x* +\p +\v 7 He said therefore to the multitudes who went out to be baptized by him, “You offspring of vipers, who warned you to flee from the wrath to come? +\v 8 Therefore produce fruits worthy of repentance, and don’t begin to say among yourselves, ‘We have Abraham for our father;’ for I tell you that God is able to raise up children to Abraham from these stones! +\v 9 Even now the ax also lies at the root of the trees. Every tree therefore that doesn’t produce good fruit is cut down and thrown into the fire.” +\p +\v 10 The multitudes asked him, “What then must we do?” +\p +\v 11 He answered them, “He who has two coats, let him give to him who has none. He who has food, let him do likewise.” +\p +\v 12 Tax collectors also came to be baptized, and they said to him, “Teacher, what must we do?” +\p +\v 13 He said to them, “Collect no more than that which is appointed to you.” +\p +\v 14 Soldiers also asked him, saying, “What about us? What must we do?” +\p He said to them, “Extort from no one by violence, neither accuse anyone wrongfully. Be content with your wages.” +\p +\v 15 As the people were in expectation, and all men reasoned in their hearts concerning John, whether perhaps he was the Christ, +\v 16 John answered them all, “I indeed baptize you with water, but he comes who is mightier than I, the strap of whose sandals I am not worthy to loosen. He will baptize you in the Holy Spirit and fire. +\v 17 His winnowing fan is in his hand, and he will thoroughly cleanse his threshing floor, and will gather the wheat into his barn; but he will burn up the chaff with unquenchable fire.” +\p +\v 18 Then with many other exhortations he preached good news to the people, +\v 19 but Herod the tetrarch,\f + \fr 3:19 \ft a tetrarch is one of four governors of a province\f* being reproved by him for Herodias, his brother’s\f + \fr 3:19 \ft TR reads “brother Philip’s” instead of “brother’s”\f* wife, and for all the evil things which Herod had done, +\v 20 added this also to them all, that he shut up John in prison. +\p +\v 21 Now when all the people were baptized, Jesus also had been baptized and was praying. The sky was opened, +\v 22 and the Holy Spirit descended in a bodily form like a dove on him; and a voice came out of the sky, saying “You are my beloved Son. In you I am well pleased.” +\p +\v 23 Jesus himself, when he began to teach, was about thirty years old, being the son (as was supposed) of Joseph, the son of Heli, +\v 24 the son of Matthat, the son of Levi, the son of Melchi, the son of Jannai, the son of Joseph, +\v 25 the son of Mattathias, the son of Amos, the son of Nahum, the son of Esli, the son of Naggai, +\v 26 the son of Maath, the son of Mattathias, the son of Semein, the son of Joseph, the son of Judah, +\v 27 the son of Joanan, the son of Rhesa, the son of Zerubbabel, the son of Shealtiel, the son of Neri, +\v 28 the son of Melchi, the son of Addi, the son of Cosam, the son of Elmodam, the son of Er, +\v 29 the son of Jose, the son of Eliezer, the son of Jorim, the son of Matthat, the son of Levi, +\v 30 the son of Simeon, the son of Judah, the son of Joseph, the son of Jonan, the son of Eliakim, +\v 31 the son of Melea, the son of Menan, the son of Mattatha, the son of Nathan, the son of David, +\v 32 the son of Jesse, the son of Obed, the son of Boaz, the son of Salmon, the son of Nahshon, +\v 33 the son of Amminadab, the son of Aram,\f + \fr 3:33 \ft NU reads “Admin, the son of Arni” instead of “Aram”\f* the son of Hezron, the son of Perez, the son of Judah, +\v 34 the son of Jacob, the son of Isaac, the son of Abraham, the son of Terah, the son of Nahor, +\v 35 the son of Serug, the son of Reu, the son of Peleg, the son of Eber, the son of Shelah, +\v 36 the son of Cainan, the son of Arphaxad, the son of Shem, the son of Noah, the son of Lamech, +\v 37 the son of Methuselah, the son of Enoch, the son of Jared, the son of Mahalaleel, the son of Cainan, +\v 38 the son of Enos, the son of Seth, the son of Adam, the son of God. +\c 4 +\p +\v 1 Jesus, full of the Holy Spirit, returned from the Jordan and was led by the Spirit into the wilderness +\v 2 for forty days, being tempted by the devil. He ate nothing in those days. Afterward, when they were completed, he was hungry. +\p +\v 3 The devil said to him, “If you are the Son of God, command this stone to become bread.” +\p +\v 4 Jesus answered him, saying, \wj “It is written, ‘Man shall not live by bread alone, but by every word of God.’”\wj*\x + \xo 4:4 \xt Deuteronomy 8:3\x* +\p +\v 5 The devil, leading him up on a high mountain, showed him all the kingdoms of the world in a moment of time. +\v 6 The devil said to him, “I will give you all this authority and their glory, for it has been delivered to me, and I give it to whomever I want. +\v 7 If you therefore will worship before me, it will all be yours.” +\p +\v 8 Jesus answered him, \wj “Get behind me, Satan! For it is written, ‘You shall worship the Lord your God, and you shall serve him only.’”\wj*\x + \xo 4:8 \xt Deuteronomy 6:13\x* +\p +\v 9 He led him to Jerusalem and set him on the pinnacle of the temple, and said to him, “If you are the Son of God, cast yourself down from here, +\v 10 for it is written, +\q1 ‘He will put his angels in charge of you, to guard you;’ +\p +\v 11 and, +\q1 ‘On their hands they will bear you up, +\q2 lest perhaps you dash your foot against a stone.’”\x + \xo 4:11 \xt Psalm 91:11-12 \x* +\p +\v 12 Jesus answering, said to him, \wj “It has been said, ‘You shall not tempt the Lord your God.’”\wj*\x + \xo 4:12 \xt Deuteronomy 6:16\x* +\p +\v 13 When the devil had completed every temptation, he departed from him until another time. +\p +\v 14 Jesus returned in the power of the Spirit into Galilee, and news about him spread through all the surrounding area. +\v 15 He taught in their synagogues, being glorified by all. +\p +\v 16 He came to Nazareth, where he had been brought up. He entered, as was his custom, into the synagogue on the Sabbath day, and stood up to read. +\v 17 The book of the prophet Isaiah was handed to him. He opened the book, and found the place where it was written, +\q1 +\v 18 \wj “The Spirit of the Lord is on me,\wj* +\q2 \wj because he has anointed me to preach good news to the poor.\wj* +\q1 \wj He has sent me to heal the broken hearted,\wj*\f + \fr 4:18 \ft NU omits “to heal the broken hearted”\f* +\q2 \wj to proclaim release to the captives,\wj* +\q2 \wj recovering of sight to the blind,\wj* +\q2 \wj to deliver those who are crushed,\wj* +\q2 +\v 19 \wj and to proclaim the acceptable year of the Lord.”\wj*\x + \xo 4:19 \xt Isaiah 61:1-2\x* +\p +\v 20 He closed the book, gave it back to the attendant, and sat down. The eyes of all in the synagogue were fastened on him. +\v 21 He began to tell them, \wj “Today, this Scripture has been fulfilled in your hearing.”\wj* +\p +\v 22 All testified about him and wondered at the gracious words which proceeded out of his mouth; and they said, “Isn’t this Joseph’s son?” +\p +\v 23 He said to them, \wj “Doubtless you will tell me this proverb, ‘Physician, heal yourself! Whatever we have heard done at Capernaum, do also here in your hometown.’”\wj* +\v 24 He said, \wj “Most certainly I tell you, no prophet is acceptable in his hometown. \wj* +\v 25 \wj But truly I tell you, there were many widows in Israel in the days of Elijah, when the sky was shut up three years and six months, when a great famine came over all the land. \wj* +\v 26 \wj Elijah was sent to none of them, except to Zarephath, in the land of Sidon, to a woman who was a widow. \wj* +\v 27 \wj There were many lepers in Israel in the time of Elisha the prophet, yet not one of them was cleansed, except Naaman, the Syrian.”\wj* +\p +\v 28 They were all filled with wrath in the synagogue as they heard these things. +\v 29 They rose up, threw him out of the city, and led him to the brow of the hill that their city was built on, that they might throw him off the cliff. +\v 30 But he, passing through the middle of them, went his way. +\p +\v 31 He came down to Capernaum, a city of Galilee. He was teaching them on the Sabbath day, +\v 32 and they were astonished at his teaching, for his word was with authority. +\v 33 In the synagogue there was a man who had a spirit of an unclean demon; and he cried out with a loud voice, +\v 34 saying, “Ah! what have we to do with you, Jesus of Nazareth? Have you come to destroy us? I know who you are: the Holy One of God!” +\p +\v 35 Jesus rebuked him, saying, \wj “Be silent and come out of him!” \wj* When the demon had thrown him down in the middle of them, he came out of him, having done him no harm. +\p +\v 36 Amazement came on all and they spoke together, one with another, saying, “What is this word? For with authority and power he commands the unclean spirits, and they come out!” +\v 37 News about him went out into every place of the surrounding region. +\p +\v 38 He rose up from the synagogue and entered into Simon’s house. Simon’s mother-in-law was afflicted with a great fever, and they begged him to help her. +\v 39 He stood over her and rebuked the fever, and it left her. Immediately she rose up and served them. +\v 40 When the sun was setting, all those who had any sick with various diseases brought them to him; and he laid his hands on every one of them, and healed them. +\v 41 Demons also came out of many, crying out and saying, “You are the Christ, the Son of God!” Rebuking them, he didn’t allow them to speak, because they knew that he was the Christ. +\p +\v 42 When it was day, he departed and went into an uninhabited place and the multitudes looked for him, and came to him, and held on to him, so that he wouldn’t go away from them. +\v 43 But he said to them, \wj “I must preach the good news of God’s Kingdom to the other cities also. For this reason I have been sent.”\wj* +\v 44 He was preaching in the synagogues of Galilee. +\c 5 +\p +\v 1 Now while the multitude pressed on him and heard the word of God, he was standing by the lake of Gennesaret. +\v 2 He saw two boats standing by the lake, but the fishermen had gone out of them and were washing their nets. +\v 3 He entered into one of the boats, which was Simon’s, and asked him to put out a little from the land. He sat down and taught the multitudes from the boat. +\p +\v 4 When he had finished speaking, he said to Simon, \wj “Put out into the deep and let down your nets for a catch.”\wj* +\p +\v 5 Simon answered him, “Master, we worked all night and caught nothing; but at your word I will let down the net.” +\v 6 When they had done this, they caught a great multitude of fish, and their net was breaking. +\v 7 They beckoned to their partners in the other boat, that they should come and help them. They came and filled both boats, so that they began to sink. +\v 8 But Simon Peter, when he saw it, fell down at Jesus’ knees, saying, “Depart from me, for I am a sinful man, Lord.” +\v 9 For he was amazed, and all who were with him, at the catch of fish which they had caught; +\v 10 and so also were James and John, sons of Zebedee, who were partners with Simon. +\p Jesus said to Simon, \wj “Don’t be afraid. From now on you will be catching people alive.”\wj* +\p +\v 11 When they had brought their boats to land, they left everything, and followed him. +\p +\v 12 While he was in one of the cities, behold, there was a man full of leprosy. When he saw Jesus, he fell on his face and begged him, saying, “Lord, if you want to, you can make me clean.” +\p +\v 13 He stretched out his hand and touched him, saying, \wj “I want to. Be made clean.”\wj* +\p Immediately the leprosy left him. +\v 14 He commanded him to tell no one, \wj “But go your way and show yourself to the priest, and offer for your cleansing according to what Moses commanded, for a testimony to them.”\wj* +\p +\v 15 But the report concerning him spread much more, and great multitudes came together to hear and to be healed by him of their infirmities. +\v 16 But he withdrew himself into the desert and prayed. +\p +\v 17 On one of those days, he was teaching; and there were Pharisees and teachers of the law sitting by who had come out of every village of Galilee, Judea, and Jerusalem. The power of the Lord was with him to heal them. +\v 18 Behold, men brought a paralyzed man on a cot, and they sought to bring him in to lay before Jesus. +\v 19 Not finding a way to bring him in because of the multitude, they went up to the housetop and let him down through the tiles with his cot into the middle before Jesus. +\v 20 Seeing their faith, he said to him, \wj “Man, your sins are forgiven you.”\wj* +\p +\v 21 The scribes and the Pharisees began to reason, saying, “Who is this who speaks blasphemies? Who can forgive sins, but God alone?” +\p +\v 22 But Jesus, perceiving their thoughts, answered them, \wj “Why are you reasoning so in your hearts? \wj* +\v 23 \wj Which is easier to say, ‘Your sins are forgiven you,’ or to say, ‘Arise and walk?’ \wj* +\v 24 \wj But that you may know that the Son of Man has authority on earth to forgive sins,”\wj* he said to the paralyzed man, \wj “I tell you, arise, take up your cot, and go to your house.”\wj* +\p +\v 25 Immediately he rose up before them, and took up that which he was laying on, and departed to his house, glorifying God. +\v 26 Amazement took hold on all, and they glorified God. They were filled with fear, saying, “We have seen strange things today.” +\p +\v 27 After these things he went out and saw a tax collector named Levi sitting at the tax office, and said to him, \wj “Follow me!”\wj* +\p +\v 28 He left everything, and rose up and followed him. +\v 29 Levi made a great feast for him in his house. There was a great crowd of tax collectors and others who were reclining with them. +\v 30 Their scribes and the Pharisees murmured against his disciples, saying, “Why do you eat and drink with the tax collectors and sinners?” +\p +\v 31 Jesus answered them, \wj “Those who are healthy have no need for a physician, but those who are sick do. \wj* +\v 32 \wj I have not come to call the righteous, but sinners, to repentance.” \wj* +\p +\v 33 They said to him, “Why do John’s disciples often fast and pray, likewise also the disciples of the Pharisees, but yours eat and drink?” +\p +\v 34 He said to them, \wj “Can you make the friends of the bridegroom fast while the bridegroom is with them? \wj* +\v 35 \wj But the days will come when the bridegroom will be taken away from them. Then they will fast in those days.”\wj* +\p +\v 36 He also told a parable to them. \wj “No one puts a piece from a new garment on an old garment, or else he will tear the new, and also the piece from the new will not match the old. \wj* +\v 37 \wj No one puts new wine into old wine skins, or else the new wine will burst the skins, and it will be spilled and the skins will be destroyed. \wj* +\v 38 \wj But new wine must be put into fresh wine skins, and both are preserved. \wj* +\v 39 \wj No man having drunk old wine immediately desires new, for he says, ‘The old is better.’”\wj* +\c 6 +\p +\v 1 Now on the second Sabbath after the first, he was going through the grain fields. His disciples plucked the heads of grain and ate, rubbing them in their hands. +\v 2 But some of the Pharisees said to them, “Why do you do that which is not lawful to do on the Sabbath day?” +\p +\v 3 Jesus, answering them, said, \wj “Haven’t you read what David did when he was hungry, he and those who were with him, \wj* +\v 4 \wj how he entered into God’s house, and took and ate the show bread, and gave also to those who were with him, which is not lawful to eat except for the priests alone?”\wj* +\v 5 He said to them, \wj “The Son of Man is lord of the Sabbath.”\wj* +\p +\v 6 It also happened on another Sabbath that he entered into the synagogue and taught. There was a man there, and his right hand was withered. +\v 7 The scribes and the Pharisees watched him, to see whether he would heal on the Sabbath, that they might find an accusation against him. +\v 8 But he knew their thoughts; and he said to the man who had the withered hand, \wj “Rise up and stand in the middle.”\wj* He arose and stood. +\v 9 Then Jesus said to them, \wj “I will ask you something: Is it lawful on the Sabbath to do good, or to do harm? To save a life, or to kill?”\wj* +\v 10 He looked around at them all, and said to the man, \wj “Stretch out your hand.”\wj* He did, and his hand was restored as sound as the other. +\v 11 But they were filled with rage, and talked with one another about what they might do to Jesus. +\p +\v 12 In these days, he went out to the mountain to pray, and he continued all night in prayer to God. +\v 13 When it was day, he called his disciples, and from them he chose twelve, whom he also named apostles: +\v 14 Simon, whom he also named Peter; Andrew, his brother; James; John; Philip; Bartholomew; +\v 15 Matthew; Thomas; James the son of Alphaeus; Simon who was called the Zealot; +\v 16 Judas the son of James; and Judas Iscariot, who also became a traitor. +\p +\v 17 He came down with them and stood on a level place, with a crowd of his disciples and a great number of the people from all Judea and Jerusalem and the sea coast of Tyre and Sidon, who came to hear him and to be healed of their diseases, +\v 18 as well as those who were troubled by unclean spirits; and they were being healed. +\v 19 All the multitude sought to touch him, for power came out of him and healed them all. +\p +\v 20 He lifted up his eyes to his disciples, and said: +\q1 \wj “Blessed are you who are poor,\wj* +\q2 \wj for God’s Kingdom is yours.\wj* +\q1 +\v 21 \wj Blessed are you who hunger now,\wj* +\q2 \wj for you will be filled.\wj* +\q1 \wj Blessed are you who weep now,\wj* +\q2 \wj for you will laugh.\wj* +\q1 +\v 22 \wj Blessed are you when men hate you, and when they exclude and mock you, and throw out your name as evil, for the Son of Man’s sake. \wj* +\q2 +\v 23 \wj Rejoice in that day and leap for joy, for behold, your reward is great in heaven, for their fathers did the same thing to the prophets.\wj* +\b +\q1 +\v 24 \wj “But woe to you who are rich!\wj* +\q2 \wj For you have received your consolation.\wj* +\q1 +\v 25 \wj Woe to you, you who are full now,\wj* +\q2 \wj for you will be hungry.\wj* +\q1 \wj Woe to you who laugh now,\wj* +\q2 \wj for you will mourn and weep.\wj* +\q1 +\v 26 \wj Woe,\wj*\f + \fr 6:26 \ft TR adds “to you”\f* \wj when\wj*\f + \fr 6:26 \ft TR adds “all” \f* \wj men speak well of you,\wj* +\q2 \wj for their fathers did the same thing to the false prophets.\wj* +\p +\v 27 \wj “But I tell you who hear: love your enemies, do good to those who hate you, \wj* +\v 28 \wj bless those who curse you, and pray for those who mistreat you. \wj* +\v 29 \wj To him who strikes you on the cheek, offer also the other; and from him who takes away your cloak, don’t withhold your coat also. \wj* +\v 30 \wj Give to everyone who asks you, and don’t ask him who takes away your goods to give them back again.\wj* +\p +\v 31 \wj “As you would like people to do to you, do exactly so to them. \wj* +\p +\v 32 \wj “If you love those who love you, what credit is that to you? For even sinners love those who love them. \wj* +\v 33 \wj If you do good to those who do good to you, what credit is that to you? For even sinners do the same. \wj* +\v 34 \wj If you lend to those from whom you hope to receive, what credit is that to you? Even sinners lend to sinners, to receive back as much. \wj* +\v 35 \wj But love your enemies, and do good, and lend, expecting nothing back; and your reward will be great, and you will be children of the Most High; for he is kind toward the unthankful and evil.\wj* +\q1 +\v 36 \wj “Therefore be merciful,\wj* +\q2 \wj even as your Father is also merciful.\wj* +\q1 +\v 37 \wj Don’t judge,\wj* +\q2 \wj and you won’t be judged.\wj* +\q1 \wj Don’t condemn,\wj* +\q2 \wj and you won’t be condemned.\wj* +\q1 \wj Set free,\wj* +\q2 \wj and you will be set free.\wj* +\p +\v 38 \wj “Give, and it will be given to you: good measure, pressed down, shaken together, and running over, will be given to you.\wj*\f + \fr 6:38 \ft literally, into your bosom.\f* \wj For with the same measure you measure it will be measured back to you.”\wj* +\p +\v 39 He spoke a parable to them. \wj “Can the blind guide the blind? Won’t they both fall into a pit? \wj* +\v 40 \wj A disciple is not above his teacher, but everyone when he is fully trained will be like his teacher. \wj* +\v 41 \wj Why do you see the speck of chaff that is in your brother’s eye, but don’t consider the beam that is in your own eye? \wj* +\v 42 \wj Or how can you tell your brother, ‘Brother, let me remove the speck of chaff that is in your eye,’ when you yourself don’t see the beam that is in your own eye? You hypocrite! First remove the beam from your own eye, and then you can see clearly to remove the speck of chaff that is in your brother’s eye. \wj* +\p +\v 43 \wj “For there is no good tree that produces rotten fruit, nor again a rotten tree that produces good fruit. \wj* +\v 44 \wj For each tree is known by its own fruit. For people don’t gather figs from thorns, nor do they gather grapes from a bramble bush. \wj* +\v 45 \wj The good man out of the good treasure of his heart brings out that which is good, and the evil man out of the evil treasure of his heart brings out that which is evil, for out of the abundance of the heart, his mouth speaks.\wj* +\p +\v 46 \wj “Why do you call me, ‘Lord, Lord,’ and don’t do the things which I say? \wj* +\v 47 \wj Everyone who comes to me, and hears my words and does them, I will show you who he is like. \wj* +\v 48 \wj He is like a man building a house, who dug and went deep and laid a foundation on the rock. When a flood arose, the stream broke against that house, and could not shake it, because it was founded on the rock. \wj* +\v 49 \wj But he who hears and doesn’t do, is like a man who built a house on the earth without a foundation, against which the stream broke, and immediately it fell; and the ruin of that house was great.”\wj* +\c 7 +\p +\v 1 After he had finished speaking in the hearing of the people, he entered into Capernaum. +\v 2 A certain centurion’s servant, who was dear to him, was sick and at the point of death. +\v 3 When he heard about Jesus, he sent to him elders of the Jews, asking him to come and save his servant. +\v 4 When they came to Jesus, they begged him earnestly, saying, “He is worthy for you to do this for him, +\v 5 for he loves our nation, and he built our synagogue for us.” +\v 6 Jesus went with them. When he was now not far from the house, the centurion sent friends to him, saying to him, “Lord, don’t trouble yourself, for I am not worthy for you to come under my roof. +\v 7 Therefore I didn’t even think myself worthy to come to you; but say the word, and my servant will be healed. +\v 8 For I also am a man placed under authority, having under myself soldiers. I tell this one, ‘Go!’ and he goes; and to another, ‘Come!’ and he comes; and to my servant, ‘Do this,’ and he does it.” +\p +\v 9 When Jesus heard these things, he marveled at him, and turned and said to the multitude who followed him, \wj “I tell you, I have not found such great faith, no, not in Israel.”\wj* +\v 10 Those who were sent, returning to the house, found that the servant who had been sick was well. +\p +\v 11 Soon afterwards, he went to a city called Nain. Many of his disciples, along with a great multitude, went with him. +\v 12 Now when he came near to the gate of the city, behold, one who was dead was carried out, the only born\f + \fr 7:12 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”. \f* son of his mother, and she was a widow. Many people of the city were with her. +\v 13 When the Lord saw her, he had compassion on her and said to her, \wj “Don’t cry.”\wj* +\v 14 He came near and touched the coffin, and the bearers stood still. He said, \wj “Young man, I tell you, arise!”\wj* +\v 15 He who was dead sat up and began to speak. Then he gave him to his mother. +\p +\v 16 Fear took hold of all, and they glorified God, saying, “A great prophet has arisen among us!” and, “God has visited his people!” +\v 17 This report went out concerning him in the whole of Judea and in all the surrounding region. +\p +\v 18 The disciples of John told him about all these things. +\v 19 John, calling to himself two of his disciples, sent them to Jesus, saying, “Are you the one who is coming, or should we look for another?” +\v 20 When the men had come to him, they said, “John the Baptizer has sent us to you, saying, ‘Are you he who comes, or should we look for another?’” +\p +\v 21 In that hour he cured many of diseases and plagues and evil spirits; and to many who were blind he gave sight. +\v 22 Jesus answered them, \wj “Go and tell John the things which you have seen and heard: that the blind receive their sight, the lame walk, the lepers are cleansed, the deaf hear, the dead are raised up, and the poor have good news preached to them. \wj* +\v 23 \wj Blessed is he who finds no occasion for stumbling in me.”\wj* +\p +\v 24 When John’s messengers had departed, he began to tell the multitudes about John, \wj “What did you go out into the wilderness to see? A reed shaken by the wind? \wj* +\v 25 \wj But what did you go out to see? A man clothed in soft clothing? Behold, those who are gorgeously dressed and live delicately are in kings’ courts. \wj* +\v 26 \wj But what did you go out to see? A prophet? Yes, I tell you, and much more than a prophet. \wj* +\v 27 \wj This is he of whom it is written,\wj* +\q1 \wj ‘Behold, I send my messenger before your face,\wj* +\q2 \wj who will prepare your way before you.’\wj*\x + \xo 7:27 \xt Malachi 3:1\x* +\p +\v 28 \wj “For I tell you, among those who are born of women there is not a greater prophet than John the Baptizer; yet he who is least in God’s Kingdom is greater than he.”\wj* +\p +\v 29 When all the people and the tax collectors heard this, they declared God to be just, having been baptized with John’s baptism. +\v 30 But the Pharisees and the lawyers rejected the counsel of God, not being baptized by him themselves. +\p +\v 31 \f + \fr 7:31 \ft TR adds “But the Lord said,”\f* \wj “To what then should I compare the people of this generation? What are they like? \wj* +\v 32 \wj They are like children who sit in the marketplace and call to one another, saying, ‘We piped to you, and you didn’t dance. We mourned, and you didn’t weep.’ \wj* +\v 33 \wj For John the Baptizer came neither eating bread nor drinking wine, and you say, ‘He has a demon.’ \wj* +\v 34 \wj The Son of Man has come eating and drinking, and you say, ‘Behold, a glutton and a drunkard, a friend of tax collectors and sinners!’ \wj* +\v 35 \wj Wisdom is justified by all her children.”\wj* +\p +\v 36 One of the Pharisees invited him to eat with him. He entered into the Pharisee’s house and sat at the table. +\v 37 Behold, a woman in the city who was a sinner, when she knew that he was reclining in the Pharisee’s house, brought an alabaster jar of ointment. +\v 38 Standing behind at his feet weeping, she began to wet his feet with her tears, and she wiped them with the hair of her head, kissed his feet, and anointed them with the ointment. +\v 39 Now when the Pharisee who had invited him saw it, he said to himself, “This man, if he were a prophet, would have perceived who and what kind of woman this is who touches him, that she is a sinner.” +\p +\v 40 Jesus answered him, \wj “Simon, I have something to tell you.” \wj* +\p He said, “Teacher, say on.” +\p +\v 41 \wj “A certain lender had two debtors. The one owed five hundred denarii, and the other fifty. \wj* +\v 42 \wj When they couldn’t pay, he forgave them both. Which of them therefore will love him most?”\wj* +\p +\v 43 Simon answered, “He, I suppose, to whom he forgave the most.” +\p He said to him, \wj “You have judged correctly.”\wj* +\v 44 Turning to the woman, he said to Simon, \wj “Do you see this woman? I entered into your house, and you gave me no water for my feet, but she has wet my feet with her tears, and wiped them with the hair of her head. \wj* +\v 45 \wj You gave me no kiss, but she, since the time I came in, has not ceased to kiss my feet. \wj* +\v 46 \wj You didn’t anoint my head with oil, but she has anointed my feet with ointment. \wj* +\v 47 \wj Therefore I tell you, her sins, which are many, are forgiven, for she loved much. But one to whom little is forgiven, loves little.” \wj* +\v 48 He said to her, \wj “Your sins are forgiven.”\wj* +\p +\v 49 Those who sat at the table with him began to say to themselves, “Who is this who even forgives sins?” +\p +\v 50 He said to the woman, \wj “Your faith has saved you. Go in peace.” \wj* +\c 8 +\p +\v 1 Soon afterwards, he went about through cities and villages, preaching and bringing the good news of God’s Kingdom. With him were the twelve, +\v 2 and certain women who had been healed of evil spirits and infirmities: Mary who was called Magdalene, from whom seven demons had gone out; +\v 3 and Joanna, the wife of Chuzas, Herod’s steward; Susanna; and many others who served them\f + \fr 8:3 \ft TR reads “him” instead of “them”\f* from their possessions. +\v 4 When a great multitude came together and people from every city were coming to him, he spoke by a parable: +\v 5 \wj “The farmer went out to sow his seed. As he sowed, some fell along the road, and it was trampled under foot, and the birds of the sky devoured it. \wj* +\v 6 \wj Other seed fell on the rock, and as soon as it grew, it withered away, because it had no moisture. \wj* +\v 7 \wj Other fell amid the thorns, and the thorns grew with it and choked it. \wj* +\v 8 \wj Other fell into the good ground and grew and produced one hundred times as much fruit.”\wj* As he said these things, he called out, \wj “He who has ears to hear, let him hear!”\wj* +\p +\v 9 Then his disciples asked him, “What does this parable mean?” +\p +\v 10 He said, \wj “To you it is given to know the mysteries of God’s Kingdom, but to the rest it is given in parables, that ‘seeing they may not see, and hearing they may not understand.’\wj*\x + \xo 8:10 \xt Isaiah 6:9\x* +\p +\v 11 \wj “Now the parable is this: The seed is the word of God. \wj* +\v 12 \wj Those along the road are those who hear; then the devil comes and takes away the word from their heart, that they may not believe and be saved. \wj* +\v 13 \wj Those on the rock are they who, when they hear, receive the word with joy; but these have no root. They believe for a while, then fall away in time of temptation. \wj* +\v 14 \wj What fell among the thorns, these are those who have heard, and as they go on their way they are choked with cares, riches, and pleasures of life; and they bring no fruit to maturity. \wj* +\v 15 \wj Those in the good ground, these are those who with an honest and good heart, having heard the word, hold it tightly, and produce fruit with perseverance.\wj* +\p +\v 16 \wj “No one, when he has lit a lamp, covers it with a container or puts it under a bed; but puts it on a stand, that those who enter in may see the light. \wj* +\v 17 \wj For nothing is hidden that will not be revealed, nor anything secret that will not be known and come to light. \wj* +\v 18 \wj Be careful therefore how you hear. For whoever has, to him will be given; and whoever doesn’t have, from him will be taken away even that which he thinks he has.”\wj* +\p +\v 19 His mother and brothers came to him, and they could not come near him for the crowd. +\v 20 Some people told him, “Your mother and your brothers stand outside, desiring to see you.” +\p +\v 21 But he answered them, \wj “My mother and my brothers are these who hear the word of God and do it.”\wj* +\p +\v 22 Now on one of those days, he entered into a boat, himself and his disciples, and he said to them, \wj “Let’s go over to the other side of the lake.”\wj* So they launched out. +\v 23 But as they sailed, he fell asleep. A wind storm came down on the lake, and they were taking on dangerous amounts of water. +\v 24 They came to him and awoke him, saying, “Master, Master, we are dying!” He awoke and rebuked the wind and the raging of the water; then they ceased, and it was calm.\x + \xo 8:24 \xt See Psalm 107:29\x* +\v 25 He said to them, \wj “Where is your faith?”\wj* Being afraid, they marveled, saying to one another, “Who is this then, that he commands even the winds and the water, and they obey him?” +\p +\v 26 Then they arrived at the country of the Gadarenes, which is opposite Galilee. +\v 27 When Jesus stepped ashore, a certain man out of the city who had demons for a long time met him. He wore no clothes, and didn’t live in a house, but in the tombs. +\v 28 When he saw Jesus, he cried out and fell down before him, and with a loud voice said, “What do I have to do with you, Jesus, you Son of the Most High God? I beg you, don’t torment me!” +\v 29 For Jesus was commanding the unclean spirit to come out of the man. For the unclean spirit had often seized the man. He was kept under guard and bound with chains and fetters. Breaking the bonds apart, he was driven by the demon into the desert. +\p +\v 30 Jesus asked him, \wj “What is your name?”\wj* +\p He said, “Legion,” for many demons had entered into him. +\v 31 They begged him that he would not command them to go into the abyss. +\p +\v 32 Now there was there a herd of many pigs feeding on the mountain, and they begged him that he would allow them to enter into those. Then he allowed them. +\v 33 The demons came out of the man and entered into the pigs, and the herd rushed down the steep bank into the lake and were drowned. +\p +\v 34 When those who fed them saw what had happened, they fled and told it in the city and in the country. +\p +\v 35 People went out to see what had happened. They came to Jesus and found the man from whom the demons had gone out, sitting at Jesus’ feet, clothed and in his right mind; and they were afraid. +\v 36 Those who saw it told them how he who had been possessed by demons was healed. +\v 37 All the people of the surrounding country of the Gadarenes asked him to depart from them, for they were very much afraid. Then he entered into the boat and returned. +\v 38 But the man from whom the demons had gone out begged him that he might go with him, but Jesus sent him away, saying, +\v 39 \wj “Return to your house, and declare what great things God has done for you.”\wj* He went his way, proclaiming throughout the whole city what great things Jesus had done for him. +\p +\v 40 When Jesus returned, the multitude welcomed him, for they were all waiting for him. +\v 41 Behold, a man named Jairus came. He was a ruler of the synagogue. He fell down at Jesus’ feet and begged him to come into his house, +\v 42 for he had an only born\f + \fr 8:42 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* daughter, about twelve years of age, and she was dying. But as he went, the multitudes pressed against him. +\v 43 A woman who had a flow of blood for twelve years, who had spent all her living on physicians and could not be healed by any, +\v 44 came behind him and touched the fringe\f + \fr 8:44 \ft or, tassel\f* of his cloak. Immediately the flow of her blood stopped. +\p +\v 45 Jesus said, \wj “Who touched me?”\wj* +\p When all denied it, Peter and those with him said, “Master, the multitudes press and jostle you, and you say, \wj ‘Who touched me?’\wj*” +\p +\v 46 But Jesus said, \wj “Someone did touch me, for I perceived that power has gone out of me.”\wj* +\v 47 When the woman saw that she was not hidden, she came trembling; and falling down before him declared to him in the presence of all the people the reason why she had touched him, and how she was healed immediately. +\v 48 He said to her, \wj “Daughter, cheer up. Your faith has made you well. Go in peace.”\wj* +\p +\v 49 While he still spoke, one from the ruler of the synagogue’s house came, saying to him, “Your daughter is dead. Don’t trouble the Teacher.” +\p +\v 50 But Jesus hearing it, answered him, \wj “Don’t be afraid. Only believe, and she will be healed.”\wj* +\p +\v 51 When he came to the house, he didn’t allow anyone to enter in, except Peter, John, James, the father of the child, and her mother. +\v 52 All were weeping and mourning her, but he said, \wj “Don’t weep. She isn’t dead, but sleeping.”\wj* +\p +\v 53 They were ridiculing him, knowing that she was dead. +\v 54 But he put them all outside, and taking her by the hand, he called, saying, \wj “Child, arise!”\wj* +\v 55 Her spirit returned, and she rose up immediately. He commanded that something be given to her to eat. +\v 56 Her parents were amazed, but he commanded them to tell no one what had been done. +\c 9 +\p +\v 1 He called the twelve\f + \fr 9:1 \ft TR reads “his twelve disciples” instead of “the twelve”\f* together and gave them power and authority over all demons, and to cure diseases. +\v 2 He sent them out to preach God’s Kingdom and to heal the sick. +\v 3 He said to them, \wj “Take nothing for your journey—no staffs, nor wallet, nor bread, nor money. Don’t have two tunics each. \wj* +\v 4 \wj Into whatever house you enter, stay there, and depart from there. \wj* +\v 5 \wj As many as don’t receive you, when you depart from that city, shake off even the dust from your feet for a testimony against them.”\wj* +\p +\v 6 They departed and went throughout the villages, preaching the Good News and healing everywhere. +\p +\v 7 Now Herod the tetrarch heard of all that was done by him; and he was very perplexed, because it was said by some that John had risen from the dead, +\v 8 and by some that Elijah had appeared, and by others that one of the old prophets had risen again. +\v 9 Herod said, “I beheaded John, but who is this about whom I hear such things?” He sought to see him. +\p +\v 10 The apostles, when they had returned, told him what things they had done. +\p He took them and withdrew apart to a desert region of\f + \fr 9:10 \ft NU omits “a desert region of”.\f* a city called Bethsaida. +\v 11 But the multitudes, perceiving it, followed him. He welcomed them, spoke to them of God’s Kingdom, and he cured those who needed healing. +\v 12 The day began to wear away; and the twelve came and said to him, “Send the multitude away, that they may go into the surrounding villages and farms and lodge and get food, for we are here in a deserted place.” +\p +\v 13 But he said to them, \wj “You give them something to eat.”\wj* +\p They said, “We have no more than five loaves and two fish, unless we should go and buy food for all these people.” +\v 14 For they were about five thousand men. +\p He said to his disciples, \wj “Make them sit down in groups of about fifty each.”\wj* +\v 15 They did so, and made them all sit down. +\v 16 He took the five loaves and the two fish, and looking up to the sky, he blessed them, broke them, and gave them to the disciples to set before the multitude. +\v 17 They ate and were all filled. They gathered up twelve baskets of broken pieces that were left over. +\p +\v 18 As he was praying alone, the disciples were near him, and he asked them, \wj “Who do the multitudes say that I am?”\wj* +\p +\v 19 They answered, “‘John the Baptizer,’ but others say, ‘Elijah,’ and others, that one of the old prophets has risen again.” +\p +\v 20 He said to them, \wj “But who do you say that I am?”\wj* +\p Peter answered, “The Christ of God.” +\p +\v 21 But he warned them and commanded them to tell this to no one, +\v 22 saying, \wj “The Son of Man must suffer many things, and be rejected by the elders, chief priests, and scribes, and be killed, and the third day be raised up.”\wj* +\p +\v 23 He said to all, \wj “If anyone desires to come after me, let him deny himself, take up his cross,\wj*\f + \fr 9:23 \ft TR, NU add “daily”\f* \wj and follow me. \wj* +\v 24 \wj For whoever desires to save his life will lose it, but whoever will lose his life for my sake will save it. \wj* +\v 25 \wj For what does it profit a man if he gains the whole world, and loses or forfeits his own self? \wj* +\v 26 \wj For whoever will be ashamed of me and of my words, of him will the Son of Man be ashamed when he comes in his glory, and the glory of the Father, and of the holy angels. \wj* +\v 27 \wj But I tell you the truth: There are some of those who stand here who will in no way taste of death until they see God’s Kingdom.” \wj* +\p +\v 28 About eight days after these sayings, he took with him Peter, John, and James, and went up onto the mountain to pray. +\v 29 As he was praying, the appearance of his face was altered, and his clothing became white and dazzling. +\v 30 Behold, two men were talking with him, who were Moses and Elijah, +\v 31 who appeared in glory and spoke of his departure,\f + \fr 9:31 \ft literally, “exodus”\f* which he was about to accomplish at Jerusalem. +\p +\v 32 Now Peter and those who were with him were heavy with sleep, but when they were fully awake, they saw his glory, and the two men who stood with him. +\v 33 As they were parting from him, Peter said to Jesus, “Master, it is good for us to be here. Let’s make three tents: one for you, one for Moses, and one for Elijah,” not knowing what he said. +\p +\v 34 While he said these things, a cloud came and overshadowed them, and they were afraid as they entered into the cloud. +\v 35 A voice came out of the cloud, saying, “This is my beloved Son. Listen to him!” +\v 36 When the voice came, Jesus was found alone. They were silent, and told no one in those days any of the things which they had seen. +\p +\v 37 On the next day, when they had come down from the mountain, a great multitude met him. +\v 38 Behold, a man from the crowd called out, saying, “Teacher, I beg you to look at my son, for he is my only born\f + \fr 9:38 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* child. +\v 39 Behold, a spirit takes him, he suddenly cries out, and it convulses him so that he foams; and it hardly departs from him, bruising him severely. +\v 40 I begged your disciples to cast it out, and they couldn’t.” +\p +\v 41 Jesus answered, \wj “Faithless and perverse generation, how long shall I be with you and bear with you? Bring your son here.”\wj* +\p +\v 42 While he was still coming, the demon threw him down and convulsed him violently. But Jesus rebuked the unclean spirit, healed the boy, and gave him back to his father. +\v 43 They were all astonished at the majesty of God. +\p But while all were marveling at all the things which Jesus did, he said to his disciples, +\v 44 \wj “Let these words sink into your ears, for the Son of Man will be delivered up into the hands of men.”\wj* +\v 45 But they didn’t understand this saying. It was concealed from them, that they should not perceive it, and they were afraid to ask him about this saying. +\p +\v 46 An argument arose among them about which of them was the greatest. +\v 47 Jesus, perceiving the reasoning of their hearts, took a little child, and set him by his side, +\v 48 and said to them, \wj “Whoever receives this little child in my name receives me. Whoever receives me receives him who sent me. For whoever is least among you all, this one will be great.”\wj* +\p +\v 49 John answered, “Master, we saw someone casting out demons in your name, and we forbade him, because he doesn’t follow with us.” +\p +\v 50 Jesus said to him, \wj “Don’t forbid him, for he who is not against us is for us.”\wj* +\p +\v 51 It came to pass, when the days were near that he should be taken up, he intently set his face to go to Jerusalem +\v 52 and sent messengers before his face. They went and entered into a village of the Samaritans, so as to prepare for him. +\v 53 They didn’t receive him, because he was traveling with his face set toward Jerusalem. +\v 54 When his disciples, James and John, saw this, they said, “Lord, do you want us to command fire to come down from the sky and destroy them, just as Elijah did?” +\p +\v 55 But he turned and rebuked them, \wj “You don’t know of what kind of spirit you are. \wj* +\v 56 \wj For the Son of Man didn’t come to destroy men’s lives, but to save them.”\wj* +\p They went to another village. +\v 57 As they went on the way, a certain man said to him, “I want to follow you wherever you go, Lord.” +\p +\v 58 Jesus said to him, \wj “The foxes have holes and the birds of the sky have nests, but the Son of Man has no place to lay his head.”\wj* +\p +\v 59 He said to another, \wj “Follow me!”\wj* +\p But he said, “Lord, allow me first to go and bury my father.” +\p +\v 60 But Jesus said to him, \wj “Leave the dead to bury their own dead, but you go and announce God’s Kingdom.”\wj* +\p +\v 61 Another also said, “I want to follow you, Lord, but first allow me to say good-bye to those who are at my house.” +\p +\v 62 But Jesus said to him, \wj “No one, having put his hand to the plow and looking back, is fit for God’s Kingdom.”\wj* +\c 10 +\p +\v 1 Now after these things, the Lord also appointed seventy others, and sent them two by two ahead of him\f + \fr 10:1 \ft literally, “before his face”\f* into every city and place where he was about to come. +\v 2 Then he said to them, \wj “The harvest is indeed plentiful, but the laborers are few. Pray therefore to the Lord of the harvest, that he may send out laborers into his harvest. \wj* +\v 3 \wj Go your ways. Behold, I send you out as lambs among wolves. \wj* +\v 4 \wj Carry no purse, nor wallet, nor sandals. Greet no one on the way. \wj* +\v 5 \wj Into whatever house you enter, first say, ‘Peace be to this house.’ \wj* +\v 6 \wj If a son of peace is there, your peace will rest on him; but if not, it will return to you. \wj* +\v 7 \wj Remain in that same house, eating and drinking the things they give, for the laborer is worthy of his wages. Don’t go from house to house. \wj* +\v 8 \wj Into whatever city you enter and they receive you, eat the things that are set before you. \wj* +\v 9 \wj Heal the sick who are there and tell them, ‘God’s Kingdom has come near to you.’ \wj* +\v 10 \wj But into whatever city you enter and they don’t receive you, go out into its streets and say, \wj* +\v 11 \wj ‘Even the dust from your city that clings to us, we wipe off against you. Nevertheless know this, that God’s Kingdom has come near to you.’ \wj* +\v 12 \wj I tell you, it will be more tolerable in that day for Sodom than for that city.\wj* +\p +\v 13 \wj “Woe to you, Chorazin! Woe to you, Bethsaida! For if the mighty works had been done in Tyre and Sidon which were done in you, they would have repented long ago, sitting in sackcloth and ashes. \wj* +\v 14 \wj But it will be more tolerable for Tyre and Sidon in the judgment than for you. \wj* +\v 15 \wj You, Capernaum, who are exalted to heaven, will be brought down to Hades. \wj*\f + \fr 10:15 \ft Hades is the lower realm of the dead, or Hell.\f* +\v 16 \wj Whoever listens to you listens to me, and whoever rejects you rejects me. Whoever rejects me rejects him who sent me.”\wj* +\p +\v 17 The seventy returned with joy, saying, “Lord, even the demons are subject to us in your name!” +\p +\v 18 He said to them, \wj “I saw Satan having fallen like lightning from heaven. \wj* +\v 19 \wj Behold, I give you authority to tread on serpents and scorpions, and over all the power of the enemy. Nothing will in any way hurt you. \wj* +\v 20 \wj Nevertheless, don’t rejoice in this, that the spirits are subject to you, but rejoice that your names are written in heaven.”\wj* +\p +\v 21 In that same hour, Jesus rejoiced in the Holy Spirit, and said, \wj “I thank you, O Father, Lord of heaven and earth, that you have hidden these things from the wise and understanding, and revealed them to little children. Yes, Father, for so it was well-pleasing in your sight.”\wj* +\p +\v 22 Turning to the disciples, he said, \wj “All things have been delivered to me by my Father. No one knows who the Son is, except the Father, and who the Father is, except the Son, and he to whomever the Son desires to reveal him.”\wj* +\p +\v 23 Turning to the disciples, he said privately, \wj “Blessed are the eyes which see the things that you see, \wj* +\v 24 \wj for I tell you that many prophets and kings desired to see the things which you see, and didn’t see them, and to hear the things which you hear, and didn’t hear them.”\wj* +\p +\v 25 Behold, a certain lawyer stood up and tested him, saying, “Teacher, what shall I do to inherit eternal life?” +\p +\v 26 He said to him, \wj “What is written in the law? How do you read it?” \wj* +\p +\v 27 He answered, “You shall love the Lord your God with all your heart, with all your soul, with all your strength, and with all your mind;\x + \xo 10:27 \xt Deuteronomy 6:5\x* and your neighbor as yourself.”\x + \xo 10:27 \xt Leviticus 19:18\x* +\p +\v 28 He said to him, \wj “You have answered correctly. Do this, and you will live.”\wj* +\p +\v 29 But he, desiring to justify himself, asked Jesus, “Who is my neighbor?” +\p +\v 30 Jesus answered, \wj “A certain man was going down from Jerusalem to Jericho, and he fell among robbers, who both stripped him and beat him, and departed, leaving him half dead. \wj* +\v 31 \wj By chance a certain priest was going down that way. When he saw him, he passed by on the other side. \wj* +\v 32 \wj In the same way a Levite also, when he came to the place and saw him, passed by on the other side. \wj* +\v 33 \wj But a certain Samaritan, as he traveled, came where he was. When he saw him, he was moved with compassion, \wj* +\v 34 \wj came to him, and bound up his wounds, pouring on oil and wine. He set him on his own animal, brought him to an inn, and took care of him. \wj* +\v 35 \wj On the next day, when he departed, he took out two denarii, gave them to the host, and said to him, ‘Take care of him. Whatever you spend beyond that, I will repay you when I return.’ \wj* +\v 36 \wj Now which of these three do you think seemed to be a neighbor to him who fell among the robbers?”\wj* +\p +\v 37 He said, “He who showed mercy on him.” +\p Then Jesus said to him, \wj “Go and do likewise.”\wj* +\p +\v 38 As they went on their way, he entered into a certain village, and a certain woman named Martha received him into her house. +\v 39 She had a sister called Mary, who also sat at Jesus’ feet and heard his word. +\v 40 But Martha was distracted with much serving, and she came up to him, and said, “Lord, don’t you care that my sister left me to serve alone? Ask her therefore to help me.” +\p +\v 41 Jesus answered her, \wj “Martha, Martha, you are anxious and troubled about many things, \wj* +\v 42 \wj but one thing is needed. Mary has chosen the good part, which will not be taken away from her.”\wj* +\c 11 +\p +\v 1 When he finished praying in a certain place, one of his disciples said to him, “Lord, teach us to pray, just as John also taught his disciples.” +\p +\v 2 He said to them, \wj “When you pray, say,\wj* +\q1 \wj ‘Our Father in heaven,\wj* +\q2 \wj may your name be kept holy.\wj* +\q1 \wj May your Kingdom come.\wj* +\q2 \wj May your will be done on earth, as it is in heaven.\wj* +\q1 +\v 3 \wj Give us day by day our daily bread.\wj* +\q1 +\v 4 \wj Forgive us our sins,\wj* +\q2 \wj for we ourselves also forgive everyone who is indebted to us. \wj* +\q1 \wj Bring us not into temptation,\wj* +\q2 \wj but deliver us from the evil one.’”\wj* +\p +\v 5 He said to them, \wj “Which of you, if you go to a friend at midnight and tell him, ‘Friend, lend me three loaves of bread, \wj* +\v 6 \wj for a friend of mine has come to me from a journey, and I have nothing to set before him,’ \wj* +\v 7 \wj and he from within will answer and say, ‘Don’t bother me. The door is now shut, and my children are with me in bed. I can’t get up and give it to you’? \wj* +\v 8 \wj I tell you, although he will not rise and give it to him because he is his friend, yet because of his persistence, he will get up and give him as many as he needs.\wj* +\p +\v 9 \wj “I tell you, keep asking, and it will be given you. Keep seeking, and you will find. Keep knocking, and it will be opened to you. \wj* +\v 10 \wj For everyone who asks receives. He who seeks finds. To him who knocks it will be opened.\wj* +\p +\v 11 \wj “Which of you fathers, if your son asks for bread, will give him a stone? Or if he asks for a fish, he won’t give him a snake instead of a fish, will he? \wj* +\v 12 \wj Or if he asks for an egg, he won’t give him a scorpion, will he? \wj* +\v 13 \wj If you then, being evil, know how to give good gifts to your children, how much more will your heavenly Father give the Holy Spirit to those who ask him?”\wj* +\p +\v 14 He was casting out a demon, and it was mute. When the demon had gone out, the mute man spoke; and the multitudes marveled. +\v 15 But some of them said, “He casts out demons by Beelzebul, the prince of the demons.” +\v 16 Others, testing him, sought from him a sign from heaven. +\v 17 But he, knowing their thoughts, said to them, \wj “Every kingdom divided against itself is brought to desolation. A house divided against itself falls. \wj* +\v 18 \wj If Satan also is divided against himself, how will his kingdom stand? For you say that I cast out demons by Beelzebul. \wj* +\v 19 \wj But if I cast out demons by Beelzebul, by whom do your children cast them out? Therefore they will be your judges. \wj* +\v 20 \wj But if I by God’s finger cast out demons, then God’s Kingdom has come to you.\wj* +\p +\v 21 \wj “When the strong man, fully armed, guards his own dwelling, his goods are safe. \wj* +\v 22 \wj But when someone stronger attacks him and overcomes him, he takes from him his whole armor in which he trusted, and divides his plunder. \wj* +\p +\v 23 \wj “He who is not with me is against me. He who doesn’t gather with me scatters.\wj* +\p +\v 24 \wj The unclean spirit, when he has gone out of the man, passes through dry places, seeking rest; and finding none, he says, ‘I will turn back to my house from which I came out.’ \wj* +\v 25 \wj When he returns, he finds it swept and put in order. \wj* +\v 26 \wj Then he goes and takes seven other spirits more evil than himself, and they enter in and dwell there. The last state of that man becomes worse than the first.”\wj* +\p +\v 27 It came to pass, as he said these things, a certain woman out of the multitude lifted up her voice and said to him, “Blessed is the womb that bore you, and the breasts which nursed you!” +\p +\v 28 But he said, \wj “On the contrary, blessed are those who hear the word of God, and keep it.”\wj* +\p +\v 29 When the multitudes were gathering together to him, he began to say, \wj “This is an evil generation. It seeks after a sign. No sign will be given to it but the sign of Jonah the prophet. \wj* +\v 30 \wj For even as Jonah became a sign to the Ninevites, so the Son of Man will also be to this generation. \wj* +\v 31 \wj The Queen of the South will rise up in the judgment with the men of this generation and will condemn them, for she came from the ends of the earth to hear the wisdom of Solomon; and behold, one greater than Solomon is here. \wj* +\v 32 \wj The men of Nineveh will stand up in the judgment with this generation, and will condemn it, for they repented at the preaching of Jonah; and behold, one greater than Jonah is here.\wj* +\p +\v 33 \wj “No one, when he has lit a lamp, puts it in a cellar or under a basket, but on a stand, that those who come in may see the light. \wj* +\v 34 \wj The lamp of the body is the eye. Therefore when your eye is good, your whole body is also full of light; but when it is evil, your body also is full of darkness. \wj* +\v 35 \wj Therefore see whether the light that is in you isn’t darkness. \wj* +\v 36 \wj If therefore your whole body is full of light, having no part dark, it will be wholly full of light, as when the lamp with its bright shining gives you light.”\wj* +\p +\v 37 Now as he spoke, a certain Pharisee asked him to dine with him. He went in and sat at the table. +\v 38 When the Pharisee saw it, he marveled that he had not first washed himself before dinner. +\v 39 The Lord said to him, \wj “Now you Pharisees cleanse the outside of the cup and of the platter, but your inward part is full of extortion and wickedness. \wj* +\v 40 \wj You foolish ones, didn’t he who made the outside make the inside also? \wj* +\v 41 \wj But give for gifts to the needy those things which are within, and behold, all things will be clean to you. \wj* +\v 42 \wj But woe to you Pharisees! For you tithe mint and rue and every herb, but you bypass justice and God’s love. You ought to have done these, and not to have left the other undone. \wj* +\v 43 \wj Woe to you Pharisees! For you love the best seats in the synagogues and the greetings in the marketplaces. \wj* +\v 44 \wj Woe to you, scribes and Pharisees, hypocrites! For you are like hidden graves, and the men who walk over them don’t know it.”\wj* +\p +\v 45 One of the lawyers answered him, “Teacher, in saying this you insult us also.” +\p +\v 46 He said, \wj “Woe to you lawyers also! For you load men with burdens that are difficult to carry, and you yourselves won’t even lift one finger to help carry those burdens. \wj* +\v 47 \wj Woe to you! For you build the tombs of the prophets, and your fathers killed them. \wj* +\v 48 \wj So you testify and consent to the works of your fathers. For they killed them, and you build their tombs. \wj* +\v 49 \wj Therefore also the wisdom of God said, ‘I will send to them prophets and apostles; and some of them they will kill and persecute, \wj* +\v 50 \wj that the blood of all the prophets, which was shed from the foundation of the world, may be required of this generation, \wj* +\v 51 \wj from the blood of Abel to the blood of Zachariah, who perished between the altar and the sanctuary.’ Yes, I tell you, it will be required of this generation. \wj* +\v 52 \wj Woe to you lawyers! For you took away the key of knowledge. You didn’t enter in yourselves, and those who were entering in, you hindered.” \wj* +\p +\v 53 As he said these things to them, the scribes and the Pharisees began to be terribly angry, and to draw many things out of him, +\v 54 lying in wait for him, and seeking to catch him in something he might say, that they might accuse him. +\c 12 +\p +\v 1 Meanwhile, when a multitude of many thousands had gathered together, so much so that they trampled on each other, he began to tell his disciples first of all, \wj “Beware of the yeast of the Pharisees, which is hypocrisy. \wj* +\v 2 \wj But there is nothing covered up that will not be revealed, nor hidden that will not be known. \wj* +\v 3 \wj Therefore whatever you have said in the darkness will be heard in the light. What you have spoken in the ear in the inner rooms will be proclaimed on the housetops.\wj* +\p +\v 4 \wj “I tell you, my friends, don’t be afraid of those who kill the body, and after that have no more that they can do. \wj* +\v 5 \wj But I will warn you whom you should fear. Fear him who after he has killed, has power to cast into Gehenna.\wj*\f + \fr 12:5 \ft or, Hell\f* \wj Yes, I tell you, fear him.\wj* +\p +\v 6 \wj “Aren’t five sparrows sold for two assaria coins\wj*\f + \fr 12:6 \ft An assarion was a small copper coin worth about an hour’s wages for an agricultural laborer.\f*\wj ? Not one of them is forgotten by God. \wj* +\v 7 \wj But the very hairs of your head are all counted. Therefore don’t be afraid. You are of more value than many sparrows.\wj* +\p +\v 8 \wj “I tell you, everyone who confesses me before men, the Son of Man will also confess before the angels of God; \wj* +\v 9 \wj but he who denies me in the presence of men will be denied in the presence of God’s angels. \wj* +\v 10 \wj Everyone who speaks a word against the Son of Man will be forgiven, but those who blaspheme against the Holy Spirit will not be forgiven. \wj* +\v 11 \wj When they bring you before the synagogues, the rulers, and the authorities, don’t be anxious how or what you will answer or what you will say; \wj* +\v 12 \wj for the Holy Spirit will teach you in that same hour what you must say.”\wj* +\p +\v 13 One of the multitude said to him, “Teacher, tell my brother to divide the inheritance with me.” +\p +\v 14 But he said to him, \wj “Man, who made me a judge or an arbitrator over you?”\wj* +\v 15 He said to them, \wj “Beware! Keep yourselves from covetousness, for a man’s life doesn’t consist of the abundance of the things which he possesses.”\wj* +\p +\v 16 He spoke a parable to them, saying, \wj “The ground of a certain rich man produced abundantly. \wj* +\v 17 \wj He reasoned within himself, saying, ‘What will I do, because I don’t have room to store my crops?’ \wj* +\v 18 \wj He said, ‘This is what I will do. I will pull down my barns, build bigger ones, and there I will store all my grain and my goods. \wj* +\v 19 \wj I will tell my soul, “Soul, you have many goods laid up for many years. Take your ease, eat, drink, and be merry.”’\wj* +\p +\v 20 \wj “But God said to him, ‘You foolish one, tonight your soul is required of you. The things which you have prepared—whose will they be?’ \wj* +\v 21 \wj So is he who lays up treasure for himself, and is not rich toward God.”\wj* +\p +\v 22 He said to his disciples, \wj “Therefore I tell you, don’t be anxious for your life, what you will eat, nor yet for your body, what you will wear. \wj* +\v 23 \wj Life is more than food, and the body is more than clothing. \wj* +\v 24 \wj Consider the ravens: they don’t sow, they don’t reap, they have no warehouse or barn, and God feeds them. How much more valuable are you than birds! \wj* +\v 25 \wj Which of you by being anxious can add a cubit\wj*\f + \fr 12:25 \ft A cubit is the length from the tip of the middle finger to the elbow on a man’s arm, or about 18 inches or 46 centimeters.\f* \wj to his height? \wj* +\v 26 \wj If then you aren’t able to do even the least things, why are you anxious about the rest? \wj* +\v 27 \wj Consider the lilies, how they grow. They don’t toil, neither do they spin; yet I tell you, even Solomon in all his glory was not arrayed like one of these. \wj* +\v 28 \wj But if this is how God clothes the grass in the field, which today exists and tomorrow is cast into the oven, how much more will he clothe you, O you of little faith? \wj* +\p +\v 29 \wj “Don’t seek what you will eat or what you will drink; neither be anxious. \wj* +\v 30 \wj For the nations of the world seek after all of these things, but your Father knows that you need these things. \wj* +\v 31 \wj But seek God’s Kingdom, and all these things will be added to you.\wj* +\p +\v 32 \wj “Don’t be afraid, little flock, for it is your Father’s good pleasure to give you the Kingdom. \wj* +\v 33 \wj Sell what you have and give gifts to the needy. Make for yourselves purses which don’t grow old, a treasure in the heavens that doesn’t fail, where no thief approaches and no moth destroys. \wj* +\v 34 \wj For where your treasure is, there will your heart be also. \wj* +\p +\v 35 \wj “Let your waist be dressed and your lamps burning. \wj* +\v 36 \wj Be like men watching for their lord when he returns from the wedding feast, that when he comes and knocks, they may immediately open to him. \wj* +\v 37 \wj Blessed are those servants whom the lord will find watching when he comes. Most certainly I tell you that he will dress himself, make them recline, and will come and serve them. \wj* +\v 38 \wj They will be blessed if he comes in the second or third watch and finds them so. \wj* +\v 39 \wj But know this, that if the master of the house had known in what hour the thief was coming, he would have watched and not allowed his house to be broken into. \wj* +\v 40 \wj Therefore be ready also, for the Son of Man is coming in an hour that you don’t expect him.”\wj* +\p +\v 41 Peter said to him, “Lord, are you telling this parable to us, or to everybody?” +\p +\v 42 The Lord said, \wj “Who then is the faithful and wise steward, whom his lord will set over his household, to give them their portion of food at the right times? \wj* +\v 43 \wj Blessed is that servant whom his lord will find doing so when he comes. \wj* +\v 44 \wj Truly I tell you that he will set him over all that he has. \wj* +\v 45 \wj But if that servant says in his heart, ‘My lord delays his coming,’ and begins to beat the menservants and the maidservants, and to eat and drink and to be drunken, \wj* +\v 46 \wj then the lord of that servant will come in a day when he isn’t expecting him and in an hour that he doesn’t know, and will cut him in two, and place his portion with the unfaithful. \wj* +\v 47 \wj That servant who knew his lord’s will, and didn’t prepare nor do what he wanted, will be beaten with many stripes, \wj* +\v 48 \wj but he who didn’t know, and did things worthy of stripes, will be beaten with few stripes. To whomever much is given, of him will much be required; and to whom much was entrusted, of him more will be asked. \wj* +\p +\v 49 \wj “I came to throw fire on the earth. I wish it were already kindled. \wj* +\v 50 \wj But I have a baptism to be baptized with, and how distressed I am until it is accomplished! \wj* +\v 51 \wj Do you think that I have come to give peace in the earth? I tell you, no, but rather division. \wj* +\v 52 \wj For from now on, there will be five in one house divided, three against two, and two against three. \wj* +\v 53 \wj They will be divided, father against son, and son against father; mother against daughter, and daughter against her mother; mother-in-law against her daughter-in-law, and daughter-in-law against her mother-in-law.” \wj*\x + \xo 12:53 \xt Micah 7:6\x* +\p +\v 54 He said to the multitudes also, \wj “When you see a cloud rising from the west, immediately you say, ‘A shower is coming,’ and so it happens. \wj* +\v 55 \wj When a south wind blows, you say, ‘There will be a scorching heat,’ and it happens. \wj* +\v 56 \wj You hypocrites! You know how to interpret the appearance of the earth and the sky, but how is it that you don’t interpret this time? \wj* +\p +\v 57 \wj “Why don’t you judge for yourselves what is right? \wj* +\v 58 \wj For when you are going with your adversary before the magistrate, try diligently on the way to be released from him, lest perhaps he drag you to the judge, and the judge deliver you to the officer, and the officer throw you into prison. \wj* +\v 59 \wj I tell you, you will by no means get out of there until you have paid the very last penny.\wj*\f + \fr 12:59 \ft literally, lepton. A lepton is a very small brass Jewish coin worth half a Roman quadrans each, which is worth a quarter of the copper assarion. Lepta are worth less than 1% of an agricultural worker’s daily wages.\f*\wj ”\wj* +\c 13 +\p +\v 1 Now there were some present at the same time who told him about the Galileans whose blood Pilate had mixed with their sacrifices. +\v 2 Jesus answered them, \wj “Do you think that these Galileans were worse sinners than all the other Galileans, because they suffered such things? \wj* +\v 3 \wj I tell you, no, but unless you repent, you will all perish in the same way. \wj* +\v 4 \wj Or those eighteen on whom the tower in Siloam fell and killed them—do you think that they were worse offenders than all the men who dwell in Jerusalem? \wj* +\v 5 \wj I tell you, no, but, unless you repent, you will all perish in the same way.”\wj* +\p +\v 6 He spoke this parable. \wj “A certain man had a fig tree planted in his vineyard, and he came seeking fruit on it and found none. \wj* +\v 7 \wj He said to the vine dresser, ‘Behold, these three years I have come looking for fruit on this fig tree, and found none. Cut it down! Why does it waste the soil?’ \wj* +\v 8 \wj He answered, ‘Lord, leave it alone this year also, until I dig around it and fertilize it. \wj* +\v 9 \wj If it bears fruit, fine; but if not, after that, you can cut it down.’”\wj* +\p +\v 10 He was teaching in one of the synagogues on the Sabbath day. +\v 11 Behold, there was a woman who had a spirit of infirmity eighteen years. She was bent over and could in no way straighten herself up. +\v 12 When Jesus saw her, he called her and said to her, \wj “Woman, you are freed from your infirmity.”\wj* +\v 13 He laid his hands on her, and immediately she stood up straight and glorified God. +\p +\v 14 The ruler of the synagogue, being indignant because Jesus had healed on the Sabbath, said to the multitude, “There are six days in which men ought to work. Therefore come on those days and be healed, and not on the Sabbath day!” +\p +\v 15 Therefore the Lord answered him, \wj “You hypocrites! Doesn’t each one of you free his ox or his donkey from the stall on the Sabbath and lead him away to water? \wj* +\v 16 \wj Ought not this woman, being a daughter of Abraham whom Satan had bound eighteen long years, be freed from this bondage on the Sabbath day?” \wj* +\p +\v 17 As he said these things, all his adversaries were disappointed; and all the multitude rejoiced for all the glorious things that were done by him. +\p +\v 18 He said, \wj “What is God’s Kingdom like? To what shall I compare it? \wj* +\v 19 \wj It is like a grain of mustard seed which a man took and put in his own garden. It grew and became a large tree, and the birds of the sky live in its branches.”\wj* +\p +\v 20 Again he said, \wj “To what shall I compare God’s Kingdom? \wj* +\v 21 \wj It is like yeast, which a woman took and hid in three measures \wj*\f + \fr 13:21 \ft literally, three sata. 3 sata is about 39 liters or a bit more than a bushel.\f* \wj of flour, until it was all leavened.”\wj* +\p +\v 22 He went on his way through cities and villages, teaching, and traveling on to Jerusalem. +\v 23 One said to him, “Lord, are they few who are saved?” +\p He said to them, +\v 24 \wj “Strive to enter in by the narrow door, for many, I tell you, will seek to enter in and will not be able. \wj* +\v 25 \wj When once the master of the house has risen up and has shut the door, and you begin to stand outside and to knock at the door, saying, ‘Lord, Lord, open to us!’ then he will answer and tell you, ‘I don’t know you or where you come from.’ \wj* +\v 26 \wj Then you will begin to say, ‘We ate and drank in your presence, and you taught in our streets.’ \wj* +\v 27 \wj He will say, ‘I tell you, I don’t know where you come from. Depart from me, all you workers of iniquity.’ \wj* +\v 28 \wj There will be weeping and gnashing of teeth when you see Abraham, Isaac, Jacob, and all the prophets in God’s Kingdom, and yourselves being thrown outside. \wj* +\v 29 \wj They will come from the east, west, north, and south, and will sit down in God’s Kingdom. \wj* +\v 30 \wj Behold, there are some who are last who will be first, and there are some who are first who will be last.”\wj* +\p +\v 31 On that same day, some Pharisees came, saying to him, “Get out of here and go away, for Herod wants to kill you.” +\p +\v 32 He said to them, \wj “Go and tell that fox, ‘Behold, I cast out demons and perform cures today and tomorrow, and the third day I complete my mission. \wj* +\v 33 \wj Nevertheless I must go on my way today and tomorrow and the next day, for it can’t be that a prophet would perish outside of Jerusalem.’\wj* +\p +\v 34 \wj “Jerusalem, Jerusalem, you who kills the prophets and stones those who are sent to her! How often I wanted to gather your children together, like a hen gathers her own brood under her wings, and you refused! \wj* +\v 35 \wj Behold, your house is left to you desolate. I tell you, you will not see me until you say, ‘Blessed is he who comes in the name of the Lord!’” \wj*\x + \xo 13:35 \xt Psalm 118:26\x* +\c 14 +\p +\v 1 When he went into the house of one of the rulers of the Pharisees on a Sabbath to eat bread, they were watching him. +\v 2 Behold, a certain man who had dropsy was in front of him. +\v 3 Jesus, answering, spoke to the lawyers and Pharisees, saying, \wj “Is it lawful to heal on the Sabbath?”\wj* +\p +\v 4 But they were silent. +\p He took him, and healed him, and let him go. +\v 5 He answered them, \wj “Which of you, if your son\wj*\f + \fr 14:5 \ft TR reads “donkey” instead of “son”\f* \wj or an ox fell into a well, wouldn’t immediately pull him out on a Sabbath day?”\wj* +\p +\v 6 They couldn’t answer him regarding these things. +\p +\v 7 He spoke a parable to those who were invited, when he noticed how they chose the best seats, and said to them, +\v 8 \wj “When you are invited by anyone to a wedding feast, don’t sit in the best seat, since perhaps someone more honorable than you might be invited by him, \wj* +\v 9 \wj and he who invited both of you would come and tell you, ‘Make room for this person.’ Then you would begin, with shame, to take the lowest place. \wj* +\v 10 \wj But when you are invited, go and sit in the lowest place, so that when he who invited you comes, he may tell you, ‘Friend, move up higher.’ Then you will be honored in the presence of all who sit at the table with you. \wj* +\v 11 \wj For everyone who exalts himself will be humbled, and whoever humbles himself will be exalted.”\wj* +\p +\v 12 He also said to the one who had invited him, \wj “When you make a dinner or a supper, don’t call your friends, nor your brothers, nor your kinsmen, nor rich neighbors, or perhaps they might also return the favor, and pay you back. \wj* +\v 13 \wj But when you make a feast, ask the poor, the maimed, the lame, or the blind; \wj* +\v 14 \wj and you will be blessed, because they don’t have the resources to repay you. For you will be repaid in the resurrection of the righteous.” \wj* +\p +\v 15 When one of those who sat at the table with him heard these things, he said to him, “Blessed is he who will feast in God’s Kingdom!” +\p +\v 16 But he said to him, \wj “A certain man made a great supper, and he invited many people. \wj* +\v 17 \wj He sent out his servant at supper time to tell those who were invited, ‘Come, for everything is ready now.’ \wj* +\v 18 \wj They all as one began to make excuses.\wj* +\p \wj “The first said to him, ‘I have bought a field, and I must go and see it. Please have me excused.’\wj* +\p +\v 19 \wj “Another said, ‘I have bought five yoke of oxen, and I must go try them out. Please have me excused.’\wj* +\p +\v 20 \wj “Another said, ‘I have married a wife, and therefore I can’t come.’ \wj* +\p +\v 21 \wj “That servant came, and told his lord these things. Then the master of the house, being angry, said to his servant, ‘Go out quickly into the streets and lanes of the city, and bring in the poor, maimed, blind, and lame.’\wj* +\p +\v 22 \wj “The servant said, ‘Lord, it is done as you commanded, and there is still room.’\wj* +\p +\v 23 \wj “The lord said to the servant, ‘Go out into the highways and hedges, and compel them to come in, that my house may be filled. \wj* +\v 24 \wj For I tell you that none of those men who were invited will taste of my supper.’”\wj* +\p +\v 25 Now great multitudes were going with him. He turned and said to them, +\v 26 \wj “If anyone comes to me, and doesn’t disregard\wj*\f + \fr 14:26 \ft or, hate \f* \wj his own father, mother, wife, children, brothers, and sisters, yes, and his own life also, he can’t be my disciple. \wj* +\v 27 \wj Whoever doesn’t bear his own cross and come after me, can’t be my disciple. \wj* +\v 28 \wj For which of you, desiring to build a tower, doesn’t first sit down and count the cost, to see if he has enough to complete it? \wj* +\v 29 \wj Or perhaps, when he has laid a foundation and isn’t able to finish, everyone who sees begins to mock him, \wj* +\v 30 \wj saying, ‘This man began to build and wasn’t able to finish.’ \wj* +\v 31 \wj Or what king, as he goes to encounter another king in war, will not sit down first and consider whether he is able with ten thousand to meet him who comes against him with twenty thousand? \wj* +\v 32 \wj Or else, while the other is yet a great way off, he sends an envoy and asks for conditions of peace. \wj* +\v 33 \wj So therefore, whoever of you who doesn’t renounce all that he has, he can’t be my disciple.\wj* +\p +\v 34 \wj “Salt is good, but if the salt becomes flat and tasteless, with what do you season it? \wj* +\v 35 \wj It is fit neither for the soil nor for the manure pile. It is thrown out. He who has ears to hear, let him hear.”\wj* +\c 15 +\p +\v 1 Now all the tax collectors and sinners were coming close to him to hear him. +\v 2 The Pharisees and the scribes murmured, saying, “This man welcomes sinners, and eats with them.” +\p +\v 3 He told them this parable: +\v 4 \wj “Which of you men, if you had one hundred sheep and lost one of them, wouldn’t leave the ninety-nine in the wilderness and go after the one that was lost, until he found it? \wj* +\v 5 \wj When he has found it, he carries it on his shoulders, rejoicing. \wj* +\v 6 \wj When he comes home, he calls together his friends and his neighbors, saying to them, ‘Rejoice with me, for I have found my sheep which was lost!’ \wj* +\v 7 \wj I tell you that even so there will be more joy in heaven over one sinner who repents, than over ninety-nine righteous people who need no repentance. \wj* +\p +\v 8 \wj “Or what woman, if she had ten drachma\wj*\f + \fr 15:8 \ft A drachma coin was worth about 2 days wages for an agricultural laborer.\f* \wj coins, if she lost one drachma coin, wouldn’t light a lamp, sweep the house, and seek diligently until she found it? \wj* +\v 9 \wj When she has found it, she calls together her friends and neighbors, saying, ‘Rejoice with me, for I have found the drachma which I had lost!’ \wj* +\v 10 \wj Even so, I tell you, there is joy in the presence of the angels of God over one sinner repenting.”\wj* +\p +\v 11 He said, \wj “A certain man had two sons. \wj* +\v 12 \wj The younger of them said to his father, ‘Father, give me my share of your property.’ So he divided his livelihood between them. \wj* +\v 13 \wj Not many days after, the younger son gathered all of this together and traveled into a far country. There he wasted his property with riotous living. \wj* +\v 14 \wj When he had spent all of it, there arose a severe famine in that country, and he began to be in need. \wj* +\v 15 \wj He went and joined himself to one of the citizens of that country, and he sent him into his fields to feed pigs. \wj* +\v 16 \wj He wanted to fill his belly with the pods that the pigs ate, but no one gave him any. \wj* +\v 17 \wj But when he came to himself, he said, ‘How many hired servants of my father’s have bread enough to spare, and I’m dying with hunger! \wj* +\v 18 \wj I will get up and go to my father, and will tell him, “Father, I have sinned against heaven and in your sight. \wj* +\v 19 \wj I am no more worthy to be called your son. Make me as one of your hired servants.”’\wj* +\p +\v 20 \wj “He arose and came to his father. But while he was still far off, his father saw him and was moved with compassion, and ran, fell on his neck, and kissed him. \wj* +\v 21 \wj The son said to him, ‘Father, I have sinned against heaven and in your sight. I am no longer worthy to be called your son.’\wj* +\p +\v 22 \wj “But the father said to his servants, ‘Bring out the best robe and put it on him. Put a ring on his hand and sandals on his feet. \wj* +\v 23 \wj Bring the fattened calf, kill it, and let’s eat and celebrate; \wj* +\v 24 \wj for this, my son, was dead and is alive again. He was lost and is found.’ Then they began to celebrate.\wj* +\p +\v 25 \wj “Now his elder son was in the field. As he came near to the house, he heard music and dancing. \wj* +\v 26 \wj He called one of the servants to him and asked what was going on. \wj* +\v 27 \wj He said to him, ‘Your brother has come, and your father has killed the fattened calf, because he has received him back safe and healthy.’ \wj* +\v 28 \wj But he was angry and would not go in. Therefore his father came out and begged him. \wj* +\v 29 \wj But he answered his father, ‘Behold, these many years I have served you, and I never disobeyed a commandment of yours, but you never gave me a goat, that I might celebrate with my friends. \wj* +\v 30 \wj But when this your son came, who has devoured your living with prostitutes, you killed the fattened calf for him.’\wj* +\p +\v 31 \wj “He said to him, ‘Son, you are always with me, and all that is mine is yours. \wj* +\v 32 \wj But it was appropriate to celebrate and be glad, for this, your brother, was dead, and is alive again. He was lost, and is found.’”\wj* +\c 16 +\p +\v 1 He also said to his disciples, \wj “There was a certain rich man who had a manager. An accusation was made to him that this man was wasting his possessions. \wj* +\v 2 \wj He called him, and said to him, ‘What is this that I hear about you? Give an accounting of your management, for you can no longer be manager.’ \wj* +\p +\v 3 \wj “The manager said within himself, ‘What will I do, seeing that my lord is taking away the management position from me? I don’t have strength to dig. I am ashamed to beg. \wj* +\v 4 \wj I know what I will do, so that when I am removed from management, they may receive me into their houses.’ \wj* +\v 5 \wj Calling each one of his lord’s debtors to him, he said to the first, ‘How much do you owe to my lord?’ \wj* +\v 6 \wj He said, ‘A hundred batos\wj*\f + \fr 16:6 \ft 100 batos is about 395 liters or 104 U. S. gallons.\f* \wj of oil.’ He said to him, ‘Take your bill, and sit down quickly and write fifty.’ \wj* +\v 7 \wj Then he said to another, ‘How much do you owe?’ He said, ‘A hundred cors\wj*\f + \fr 16:7 \ft 100 cors = about 2,110 liters or 600 bushels.\f* \wj of wheat.’ He said to him, ‘Take your bill, and write eighty.’\wj* +\p +\v 8 \wj “His lord commended the dishonest manager because he had done wisely, for the children of this world are, in their own generation, wiser than the children of the light. \wj* +\v 9 \wj I tell you, make for yourselves friends by means of unrighteous mammon, so that when you fail, they may receive you into the eternal tents. \wj* +\v 10 \wj He who is faithful in a very little is faithful also in much. He who is dishonest in a very little is also dishonest in much. \wj* +\v 11 \wj If therefore you have not been faithful in the unrighteous mammon, who will commit to your trust the true riches? \wj* +\v 12 \wj If you have not been faithful in that which is another’s, who will give you that which is your own? \wj* +\v 13 \wj No servant can serve two masters, for either he will hate the one and love the other; or else he will hold to one and despise the other. You aren’t able to serve God and Mammon.”\wj*\f + \fr 16:13 \ft “Mammon” refers to riches or a false god of wealth.\f* +\p +\v 14 The Pharisees, who were lovers of money, also heard all these things, and they scoffed at him. +\v 15 He said to them, \wj “You are those who justify yourselves in the sight of men, but God knows your hearts. For that which is exalted among men is an abomination in the sight of God. \wj* +\p +\v 16 \wj “The law and the prophets were until John. From that time the Good News of God’s Kingdom is preached, and everyone is forcing his way into it. \wj* +\v 17 \wj But it is easier for heaven and earth to pass away than for one tiny stroke of a pen in the law to fall. \wj* +\p +\v 18 \wj “Everyone who divorces his wife and marries another commits adultery. He who marries one who is divorced from a husband commits adultery. \wj* +\p +\v 19 \wj “Now there was a certain rich man, and he was clothed in purple and fine linen, living in luxury every day. \wj* +\v 20 \wj A certain beggar, named Lazarus, was taken to his gate, full of sores, \wj* +\v 21 \wj and desiring to be fed with the crumbs that fell from the rich man’s table. Yes, even the dogs came and licked his sores. \wj* +\v 22 \wj The beggar died, and he was carried away by the angels to Abraham’s bosom. The rich man also died and was buried. \wj* +\v 23 \wj In Hades,\wj*\f + \fr 16:23 \ft or, Hell\f* \wj he lifted up his eyes, being in torment, and saw Abraham far off, and Lazarus at his bosom. \wj* +\v 24 \wj He cried and said, ‘Father Abraham, have mercy on me, and send Lazarus, that he may dip the tip of his finger in water and cool my tongue! For I am in anguish in this flame.’\wj* +\p +\v 25 \wj “But Abraham said, ‘Son, remember that you, in your lifetime, received your good things, and Lazarus, in the same way, bad things. But here he is now comforted and you are in anguish. \wj* +\v 26 \wj Besides all this, between us and you there is a great gulf fixed, that those who want to pass from here to you are not able, and that no one may cross over from there to us.’\wj* +\p +\v 27 \wj “He said, ‘I ask you therefore, father, that you would send him to my father’s house— \wj* +\v 28 \wj for I have five brothers—that he may testify to them, so they won’t also come into this place of torment.’\wj* +\p +\v 29 \wj “But Abraham said to him, ‘They have Moses and the prophets. Let them listen to them.’\wj* +\p +\v 30 \wj “He said, ‘No, father Abraham, but if one goes to them from the dead, they will repent.’\wj* +\p +\v 31 \wj “He said to him, ‘If they don’t listen to Moses and the prophets, neither will they be persuaded if one rises from the dead.’”\wj* +\c 17 +\p +\v 1 He said to the disciples, \wj “It is impossible that no occasions of stumbling should come, but woe to him through whom they come! \wj* +\v 2 \wj It would be better for him if a millstone were hung around his neck, and he were thrown into the sea, rather than that he should cause one of these little ones to stumble. \wj* +\v 3 \wj Be careful. If your brother sins against you, rebuke him. If he repents, forgive him. \wj* +\v 4 \wj If he sins against you seven times in the day, and seven times returns, saying, ‘I repent,’ you shall forgive him.”\wj* +\p +\v 5 The apostles said to the Lord, “Increase our faith.” +\p +\v 6 The Lord said, \wj “If you had faith like a grain of mustard seed, you would tell this sycamore tree, ‘Be uprooted and be planted in the sea,’ and it would obey you. \wj* +\v 7 \wj But who is there among you, having a servant plowing or keeping sheep, that will say when he comes in from the field, ‘Come immediately and sit down at the table’? \wj* +\v 8 \wj Wouldn’t he rather tell him, ‘Prepare my supper, clothe yourself properly, and serve me while I eat and drink. Afterward you shall eat and drink’? \wj* +\v 9 \wj Does he thank that servant because he did the things that were commanded? I think not. \wj* +\v 10 \wj Even so you also, when you have done all the things that are commanded you, say, ‘We are unworthy servants. We have done our duty.’” \wj* +\p +\v 11 As he was on his way to Jerusalem, he was passing along the borders of Samaria and Galilee. +\v 12 As he entered into a certain village, ten men who were lepers met him, who stood at a distance. +\v 13 They lifted up their voices, saying, “Jesus, Master, have mercy on us!” +\p +\v 14 When he saw them, he said to them, \wj “Go and show yourselves to the priests.”\wj* As they went, they were cleansed. +\v 15 One of them, when he saw that he was healed, turned back, glorifying God with a loud voice. +\v 16 He fell on his face at Jesus’ feet, giving him thanks; and he was a Samaritan. +\p +\v 17 Jesus answered, \wj “Weren’t the ten cleansed? But where are the nine? \wj* +\v 18 \wj Were there none found who returned to give glory to God, except this foreigner?”\wj* +\v 19 Then he said to him, \wj “Get up, and go your way. Your faith has healed you.”\wj* +\p +\v 20 Being asked by the Pharisees when God’s Kingdom would come, he answered them, \wj “God’s Kingdom doesn’t come with observation; \wj* +\v 21 \wj neither will they say, ‘Look, here!’ or, ‘Look, there!’ for behold, God’s Kingdom is within you.”\wj* +\p +\v 22 He said to the disciples, \wj “The days will come when you will desire to see one of the days of the Son of Man, and you will not see it. \wj* +\v 23 \wj They will tell you, ‘Look, here!’ or ‘Look, there!’ Don’t go away or follow after them, \wj* +\v 24 \wj for as the lightning, when it flashes out of one part under the sky, shines to another part under the sky, so will the Son of Man be in his day. \wj* +\v 25 \wj But first, he must suffer many things and be rejected by this generation. \wj* +\v 26 \wj As it was in the days of Noah, even so it will also be in the days of the Son of Man. \wj* +\v 27 \wj They ate, they drank, they married, and they were given in marriage until the day that Noah entered into the ship, and the flood came and destroyed them all. \wj* +\v 28 \wj Likewise, even as it was in the days of Lot: they ate, they drank, they bought, they sold, they planted, they built; \wj* +\v 29 \wj but in the day that Lot went out from Sodom, it rained fire and sulfur from the sky and destroyed them all. \wj* +\v 30 \wj It will be the same way in the day that the Son of Man is revealed. \wj* +\v 31 \wj In that day, he who will be on the housetop and his goods in the house, let him not go down to take them away. Let him who is in the field likewise not turn back. \wj* +\v 32 \wj Remember Lot’s wife! \wj* +\v 33 \wj Whoever seeks to save his life loses it, but whoever loses his life preserves it. \wj* +\v 34 \wj I tell you, in that night there will be two people in one bed. One will be taken and the other will be left. \wj* +\v 35 \wj There will be two grinding grain together. One will be taken and the other will be left.”\wj* +\v 36 \f + \fr 17:36 \ft Some Greek manuscripts add: “Two will be in the field: the one taken, and the other left.”\f* +\p +\v 37 They, answering, asked him, “Where, Lord?” +\p He said to them, \wj “Where the body is, there the vultures will also be gathered together.”\wj* +\c 18 +\p +\v 1 He also spoke a parable to them that they must always pray and not give up, +\v 2 saying, \wj “There was a judge in a certain city who didn’t fear God and didn’t respect man. \wj* +\v 3 \wj A widow was in that city, and she often came to him, saying, ‘Defend me from my adversary!’ \wj* +\v 4 \wj He wouldn’t for a while; but afterward he said to himself, ‘Though I neither fear God nor respect man, \wj* +\v 5 \wj yet because this widow bothers me, I will defend her, or else she will wear me out by her continual coming.’”\wj* +\p +\v 6 The Lord said, \wj “Listen to what the unrighteous judge says. \wj* +\v 7 \wj Won’t God avenge his chosen ones who are crying out to him day and night, and yet he exercises patience with them? \wj* +\v 8 \wj I tell you that he will avenge them quickly. Nevertheless, when the Son of Man comes, will he find faith on the earth?”\wj* +\p +\v 9 He also spoke this parable to certain people who were convinced of their own righteousness, and who despised all others: +\v 10 \wj “Two men went up into the temple to pray; one was a Pharisee, and the other was a tax collector. \wj* +\v 11 \wj The Pharisee stood and prayed by himself like this: ‘God, I thank you that I am not like the rest of men: extortionists, unrighteous, adulterers, or even like this tax collector. \wj* +\v 12 \wj I fast twice a week. I give tithes of all that I get.’ \wj* +\v 13 \wj But the tax collector, standing far away, wouldn’t even lift up his eyes to heaven, but beat his breast, saying, ‘God, be merciful to me, a sinner!’ \wj* +\v 14 \wj I tell you, this man went down to his house justified rather than the other; for everyone who exalts himself will be humbled, but he who humbles himself will be exalted.”\wj* +\p +\v 15 They were also bringing their babies to him, that he might touch them. But when the disciples saw it, they rebuked them. +\v 16 Jesus summoned them, saying, \wj “Allow the little children to come to me, and don’t hinder them, for God’s Kingdom belongs to such as these. \wj* +\v 17 \wj Most certainly, I tell you, whoever doesn’t receive God’s Kingdom like a little child, he will in no way enter into it.”\wj* +\p +\v 18 A certain ruler asked him, saying, “Good Teacher, what shall I do to inherit eternal life?” +\p +\v 19 Jesus asked him, \wj “Why do you call me good? No one is good, except one: God. \wj* +\v 20 \wj You know the commandments: ‘Don’t commit adultery,’ ‘Don’t murder,’ ‘Don’t steal,’ ‘Don’t give false testimony,’ ‘Honor your father and your mother.’”\wj*\x + \xo 18:20 \xt Exodus 20:12-16; Deuteronomy 5:16-20\x* +\p +\v 21 He said, “I have observed all these things from my youth up.” +\p +\v 22 When Jesus heard these things, he said to him, \wj “You still lack one thing. Sell all that you have and distribute it to the poor. Then you will have treasure in heaven; then come, follow me.”\wj* +\p +\v 23 But when he heard these things, he became very sad, for he was very rich. +\p +\v 24 Jesus, seeing that he became very sad, said, \wj “How hard it is for those who have riches to enter into God’s Kingdom! \wj* +\v 25 \wj For it is easier for a camel to enter in through a needle’s eye than for a rich man to enter into God’s Kingdom.”\wj* +\p +\v 26 Those who heard it said, “Then who can be saved?” +\p +\v 27 But he said, \wj “The things which are impossible with men are possible with God.”\wj* +\p +\v 28 Peter said, “Look, we have left everything and followed you.” +\p +\v 29 He said to them, \wj “Most certainly I tell you, there is no one who has left house, or wife, or brothers, or parents, or children, for God’s Kingdom’s sake, \wj* +\v 30 \wj who will not receive many times more in this time, and in the world to come, eternal life.”\wj* +\p +\v 31 He took the twelve aside and said to them, \wj “Behold, we are going up to Jerusalem, and all the things that are written through the prophets concerning the Son of Man will be completed. \wj* +\v 32 \wj For he will be delivered up to the Gentiles, will be mocked, treated shamefully, and spit on. \wj* +\v 33 \wj They will scourge and kill him. On the third day, he will rise again.”\wj* +\p +\v 34 They understood none of these things. This saying was hidden from them, and they didn’t understand the things that were said. +\p +\v 35 As he came near Jericho, a certain blind man sat by the road, begging. +\v 36 Hearing a multitude going by, he asked what this meant. +\v 37 They told him that Jesus of Nazareth was passing by. +\v 38 He cried out, “Jesus, you son of David, have mercy on me!” +\v 39 Those who led the way rebuked him, that he should be quiet; but he cried out all the more, “You son of David, have mercy on me!” +\p +\v 40 Standing still, Jesus commanded him to be brought to him. When he had come near, he asked him, +\v 41 \wj “What do you want me to do?”\wj* +\p He said, “Lord, that I may see again.” +\p +\v 42 Jesus said to him, \wj “Receive your sight. Your faith has healed you.” \wj* +\p +\v 43 Immediately he received his sight and followed him, glorifying God. All the people, when they saw it, praised God. +\c 19 +\p +\v 1 He entered and was passing through Jericho. +\v 2 There was a man named Zacchaeus. He was a chief tax collector, and he was rich. +\v 3 He was trying to see who Jesus was, and couldn’t because of the crowd, because he was short. +\v 4 He ran on ahead and climbed up into a sycamore tree to see him, for he was going to pass that way. +\v 5 When Jesus came to the place, he looked up and saw him, and said to him, \wj “Zacchaeus, hurry and come down, for today I must stay at your house.” \wj* +\v 6 He hurried, came down, and received him joyfully. +\v 7 When they saw it, they all murmured, saying, “He has gone in to lodge with a man who is a sinner.” +\p +\v 8 Zacchaeus stood and said to the Lord, “Behold, Lord, half of my goods I give to the poor. If I have wrongfully exacted anything of anyone, I restore four times as much.” +\p +\v 9 Jesus said to him, \wj “Today, salvation has come to this house, because he also is a son of Abraham. \wj* +\v 10 \wj For the Son of Man came to seek and to save that which was lost.” \wj* +\p +\v 11 As they heard these things, he went on and told a parable, because he was near Jerusalem, and they supposed that God’s Kingdom would be revealed immediately. +\v 12 He said therefore, \wj “A certain nobleman went into a far country to receive for himself a kingdom and to return. \wj* +\v 13 \wj He called ten servants of his and gave them ten mina coins, \wj*\f + \fr 19:13 \ft 10 minas was more than 3 years’ wages for an agricultural laborer. \f* \wj and told them, ‘Conduct business until I come.’ \wj* +\v 14 \wj But his citizens hated him, and sent an envoy after him, saying, ‘We don’t want this man to reign over us.’\wj* +\p +\v 15 \wj “When he had come back again, having received the kingdom, he commanded these servants, to whom he had given the money, to be called to him, that he might know what they had gained by conducting business. \wj* +\v 16 \wj The first came before him, saying, ‘Lord, your mina has made ten more minas.’\wj* +\p +\v 17 \wj “He said to him, ‘Well done, you good servant! Because you were found faithful with very little, you shall have authority over ten cities.’ \wj* +\p +\v 18 \wj “The second came, saying, ‘Your mina, Lord, has made five minas.’ \wj* +\p +\v 19 \wj “So he said to him, ‘And you are to be over five cities.’ \wj* +\p +\v 20 \wj Another came, saying, ‘Lord, behold, your mina, which I kept laid away in a handkerchief, \wj* +\v 21 \wj for I feared you, because you are an exacting man. You take up that which you didn’t lay down, and reap that which you didn’t sow.’\wj* +\p +\v 22 \wj “He said to him, ‘Out of your own mouth I will judge you, you wicked servant! You knew that I am an exacting man, taking up that which I didn’t lay down and reaping that which I didn’t sow. \wj* +\v 23 \wj Then why didn’t you deposit my money in the bank, and at my coming, I might have earned interest on it?’ \wj* +\v 24 \wj He said to those who stood by, ‘Take the mina away from him and give it to him who has the ten minas.’\wj* +\p +\v 25 \wj “They said to him, ‘Lord, he has ten minas!’ \wj* +\v 26 \wj ‘For I tell you that to everyone who has, will more be given; but from him who doesn’t have, even that which he has will be taken away from him. \wj* +\v 27 \wj But bring those enemies of mine who didn’t want me to reign over them here, and kill them before me.’”\wj* +\v 28 Having said these things, he went on ahead, going up to Jerusalem. +\p +\v 29 When he came near to Bethsphage\f + \fr 19:29 \ft TR, NU read “Bethpage” instead of “Bethsphage”\f* and Bethany, at the mountain that is called Olivet, he sent two of his disciples, +\v 30 saying, \wj “Go your way into the village on the other side, in which, as you enter, you will find a colt tied, which no man has ever sat upon. Untie it and bring it. \wj* +\v 31 \wj If anyone asks you, ‘Why are you untying it?’ say to him: ‘The Lord needs it.’”\wj* +\p +\v 32 Those who were sent went away and found things just as he had told them. +\v 33 As they were untying the colt, its owners said to them, “Why are you untying the colt?” +\v 34 They said, “The Lord needs it.” +\v 35 Then they brought it to Jesus. They threw their cloaks on the colt and sat Jesus on them. +\v 36 As he went, they spread their cloaks on the road. +\p +\v 37 As he was now getting near, at the descent of the Mount of Olives, the whole multitude of the disciples began to rejoice and praise God with a loud voice for all the mighty works which they had seen, +\v 38 saying, “Blessed is the King who comes in the name of the Lord! \x + \xo 19:38 \xt Psalm 118:26\x* Peace in heaven, and glory in the highest!” +\p +\v 39 Some of the Pharisees from the multitude said to him, “Teacher, rebuke your disciples!” +\p +\v 40 He answered them, \wj “I tell you that if these were silent, the stones would cry out.”\wj* +\p +\v 41 When he came near, he saw the city and wept over it, +\v 42 saying, \wj “If you, even you, had known today the things which belong to your peace! But now, they are hidden from your eyes. \wj* +\v 43 \wj For the days will come on you when your enemies will throw up a barricade against you, surround you, hem you in on every side, \wj* +\v 44 \wj and will dash you and your children within you to the ground. They will not leave in you one stone on another, because you didn’t know the time of your visitation.”\wj* +\p +\v 45 He entered into the temple and began to drive out those who bought and sold in it, +\v 46 saying to them, \wj “It is written, ‘My house is a house of prayer,’ \wj*\x + \xo 19:46 \xt Isaiah 56:7\x* \wj but you have made it a ‘den of robbers’!” \wj*\x + \xo 19:46 \xt Jeremiah 7:11\x* +\p +\v 47 He was teaching daily in the temple, but the chief priests, the scribes, and the leading men among the people sought to destroy him. +\v 48 They couldn’t find what they might do, for all the people hung on to every word that he said. +\c 20 +\p +\v 1 On one of those days, as he was teaching the people in the temple and preaching the Good News, the\f + \fr 20:1 \ft TR adds “chief”\f* priests and scribes came to him with the elders. +\v 2 They asked him, “Tell us: by what authority do you do these things? Or who is giving you this authority?” +\p +\v 3 He answered them, \wj “I also will ask you one question. Tell me: \wj* +\v 4 \wj the baptism of John, was it from heaven, or from men?”\wj* +\p +\v 5 They reasoned with themselves, saying, “If we say, ‘From heaven,’ he will say, ‘Why didn’t you believe him?’ +\v 6 But if we say, ‘From men,’ all the people will stone us, for they are persuaded that John was a prophet.” +\v 7 They answered that they didn’t know where it was from. +\p +\v 8 Jesus said to them, \wj “Neither will I tell you by what authority I do these things.”\wj* +\p +\v 9 He began to tell the people this parable: \wj “A \wj*\f + \fr 20:9 \ft NU (in brackets) and TR add “certain”\f* \wj man planted a vineyard and rented it out to some farmers, and went into another country for a long time. \wj* +\v 10 \wj At the proper season, he sent a servant to the farmers to collect his share of the fruit of the vineyard. But the farmers beat him and sent him away empty. \wj* +\v 11 \wj He sent yet another servant, and they also beat him and treated him shamefully, and sent him away empty. \wj* +\v 12 \wj He sent yet a third, and they also wounded him and threw him out. \wj* +\v 13 \wj The lord of the vineyard said, ‘What shall I do? I will send my beloved son. It may be that seeing him, they will respect him.’\wj* +\p +\v 14 \wj “But when the farmers saw him, they reasoned among themselves, saying, ‘This is the heir. Come, let’s kill him, that the inheritance may be ours.’ \wj* +\v 15 \wj Then they threw him out of the vineyard and killed him. What therefore will the lord of the vineyard do to them? \wj* +\v 16 \wj He will come and destroy these farmers, and will give the vineyard to others.”\wj* +\p When they heard that, they said, “May that never be!” +\p +\v 17 But he looked at them and said, \wj “Then what is this that is written,\wj* +\q1 \wj ‘The stone which the builders rejected\wj* +\q2 \wj was made the chief cornerstone?’\wj*\x + \xo 20:17 \xt Psalm 118:22 \x* +\q1 +\v 18 \wj Everyone who falls on that stone will be broken to pieces, \wj* +\q2 \wj but it will crush whomever it falls on to dust.”\wj* +\p +\v 19 The chief priests and the scribes sought to lay hands on him that very hour, but they feared the people—for they knew he had spoken this parable against them. +\v 20 They watched him and sent out spies, who pretended to be righteous, that they might trap him in something he said, so as to deliver him up to the power and authority of the governor. +\v 21 They asked him, “Teacher, we know that you say and teach what is right, and aren’t partial to anyone, but truly teach the way of God. +\v 22 Is it lawful for us to pay taxes to Caesar, or not?” +\p +\v 23 But he perceived their craftiness, and said to them, \wj “Why do you test me? \wj* +\v 24 \wj Show me a denarius. Whose image and inscription are on it?” \wj* +\p They answered, “Caesar’s.” +\p +\v 25 He said to them, \wj “Then give to Caesar the things that are Caesar’s, and to God the things that are God’s.”\wj* +\p +\v 26 They weren’t able to trap him in his words before the people. They marveled at his answer and were silent. +\v 27 Some of the Sadducees came to him, those who deny that there is a resurrection. +\v 28 They asked him, “Teacher, Moses wrote to us that if a man’s brother dies having a wife, and he is childless, his brother should take the wife and raise up children for his brother. +\v 29 There were therefore seven brothers. The first took a wife, and died childless. +\v 30 The second took her as wife, and he died childless. +\v 31 The third took her, and likewise the seven all left no children, and died. +\v 32 Afterward the woman also died. +\v 33 Therefore in the resurrection whose wife of them will she be? For the seven had her as a wife.” +\p +\v 34 Jesus said to them, \wj “The children of this age marry and are given in marriage. \wj* +\v 35 \wj But those who are considered worthy to attain to that age and the resurrection from the dead neither marry nor are given in marriage. \wj* +\v 36 \wj For they can’t die any more, for they are like the angels and are children of God, being children of the resurrection. \wj* +\v 37 \wj But that the dead are raised, even Moses showed at the bush, when he called the Lord ‘The God of Abraham, the God of Isaac, and the God of Jacob.’ \wj*\x + \xo 20:37 \xt Exodus 3:6\x* +\v 38 \wj Now he is not the God of the dead, but of the living, for all are alive to him.”\wj* +\p +\v 39 Some of the scribes answered, “Teacher, you speak well.” +\v 40 They didn’t dare to ask him any more questions. +\p +\v 41 He said to them, \wj “Why do they say that the Christ is David’s son? \wj* +\v 42 \wj David himself says in the book of Psalms,\wj* +\q1 \wj ‘The Lord said to my Lord,\wj* +\q2 \wj “Sit at my right hand,\wj* +\q2 +\v 43 \wj until I make your enemies the footstool of your feet.”’\wj* \x + \xo 20:43 \xt Psalm 110:1\x* +\p +\v 44 \wj “David therefore calls him Lord, so how is he his son?”\wj* +\p +\v 45 In the hearing of all the people, he said to his disciples, +\v 46 \wj “Beware of those scribes who like to walk in long robes, and love greetings in the marketplaces, the best seats in the synagogues, and the best places at feasts; \wj* +\v 47 \wj who devour widows’ houses, and for a pretense make long prayers. These will receive greater condemnation.”\wj* +\c 21 +\p +\v 1 He looked up and saw the rich people who were putting their gifts into the treasury. +\v 2 He saw a certain poor widow casting in two small brass coins.\f + \fr 21:2 \ft literally, “two lepta.” 2 lepta was about 1% of a day’s wages for an agricultural laborer.\f* +\v 3 He said, \wj “Truly I tell you, this poor widow put in more than all of them, \wj* +\v 4 \wj for all these put in gifts for God from their abundance, but she, out of her poverty, put in all that she had to live on.”\wj* +\p +\v 5 As some were talking about the temple and how it was decorated with beautiful stones and gifts, he said, +\v 6 \wj “As for these things which you see, the days will come in which there will not be left here one stone on another that will not be thrown down.”\wj* +\p +\v 7 They asked him, “Teacher, so when will these things be? What is the sign that these things are about to happen?” +\p +\v 8 He said, \wj “Watch out that you don’t get led astray, for many will come in my name, saying, ‘I am he\wj*\f + \fr 21:8 \ft or, I AM\f*\wj ,’ and, ‘The time is at hand.’ Therefore don’t follow them. \wj* +\v 9 \wj When you hear of wars and disturbances, don’t be terrified, for these things must happen first, but the end won’t come immediately.”\wj* +\p +\v 10 Then he said to them, \wj “Nation will rise against nation, and kingdom against kingdom. \wj* +\v 11 \wj There will be great earthquakes, famines, and plagues in various places. There will be terrors and great signs from heaven. \wj* +\v 12 \wj But before all these things, they will lay their hands on you and will persecute you, delivering you up to synagogues and prisons, bringing you before kings and governors for my name’s sake. \wj* +\v 13 \wj It will turn out as a testimony for you. \wj* +\v 14 \wj Settle it therefore in your hearts not to meditate beforehand how to answer, \wj* +\v 15 \wj for I will give you a mouth and wisdom which all your adversaries will not be able to withstand or to contradict. \wj* +\v 16 \wj You will be handed over even by parents, brothers, relatives, and friends. They will cause some of you to be put to death. \wj* +\v 17 \wj You will be hated by all men for my name’s sake. \wj* +\v 18 \wj And not a hair of your head will perish.\wj* +\p +\v 19 \wj “By your endurance you will win your lives.\wj* +\p +\v 20 \wj “But when you see Jerusalem surrounded by armies, then know that its desolation is at hand. \wj* +\v 21 \wj Then let those who are in Judea flee to the mountains. Let those who are in the middle of her depart. Let those who are in the country not enter therein. \wj* +\v 22 \wj For these are days of vengeance, that all things which are written may be fulfilled. \wj* +\v 23 \wj Woe to those who are pregnant and to those who nurse infants in those days! For there will be great distress in the land and wrath to this people. \wj* +\v 24 \wj They will fall by the edge of the sword, and will be led captive into all the nations. Jerusalem will be trampled down by the Gentiles until the times of the Gentiles are fulfilled. \wj* +\p +\v 25 \wj “There will be signs in the sun, moon, and stars; and on the earth anxiety of nations, in perplexity for the roaring of the sea and the waves; \wj* +\v 26 \wj men fainting for fear and for expectation of the things which are coming on the world, for the powers of the heavens will be shaken. \wj* +\v 27 \wj Then they will see the Son of Man coming in a cloud with power and great glory. \wj* +\v 28 \wj But when these things begin to happen, look up and lift up your heads, because your redemption is near.”\wj* +\p +\v 29 He told them a parable. \wj “See the fig tree and all the trees. \wj* +\v 30 \wj When they are already budding, you see it and know by your own selves that the summer is already near. \wj* +\v 31 \wj Even so you also, when you see these things happening, know that God’s Kingdom is near. \wj* +\v 32 \wj Most certainly I tell you, this generation will not pass away until all things are accomplished. \wj* +\v 33 \wj Heaven and earth will pass away, but my words will by no means pass away.\wj* +\p +\v 34 \wj “So be careful, or your hearts will be loaded down with carousing, drunkenness, and cares of this life, and that day will come on you suddenly. \wj* +\v 35 \wj For it will come like a snare on all those who dwell on the surface of all the earth. \wj* +\v 36 \wj Therefore be watchful all the time, praying that you may be counted worthy to escape all these things that will happen, and to stand before the Son of Man.”\wj* +\p +\v 37 Every day Jesus was teaching in the temple, and every night he would go out and spend the night on the mountain that is called Olivet. +\v 38 All the people came early in the morning to him in the temple to hear him. +\c 22 +\p +\v 1 Now the feast of unleavened bread, which is called the Passover, was approaching. +\v 2 The chief priests and the scribes sought how they might put him to death, for they feared the people. +\p +\v 3 Satan entered into Judas, who was also called Iscariot, who was counted with the twelve. +\v 4 He went away and talked with the chief priests and captains about how he might deliver him to them. +\v 5 They were glad, and agreed to give him money. +\v 6 He consented and sought an opportunity to deliver him to them in the absence of the multitude. +\p +\v 7 The day of unleavened bread came, on which the Passover must be sacrificed. +\v 8 Jesus sent Peter and John, saying, \wj “Go and prepare the Passover for us, that we may eat.”\wj* +\p +\v 9 They said to him, “Where do you want us to prepare?” +\p +\v 10 He said to them, \wj “Behold, when you have entered into the city, a man carrying a pitcher of water will meet you. Follow him into the house which he enters. \wj* +\v 11 \wj Tell the master of the house, ‘The Teacher says to you, “Where is the guest room, where I may eat the Passover with my disciples?”’ \wj* +\v 12 \wj He will show you a large, furnished upper room. Make preparations there.”\wj* +\p +\v 13 They went, found things as Jesus had told them, and they prepared the Passover. +\p +\v 14 When the hour had come, he sat down with the twelve apostles. +\v 15 He said to them, \wj “I have earnestly desired to eat this Passover with you before I suffer, \wj* +\v 16 \wj for I tell you, I will no longer by any means eat of it until it is fulfilled in God’s Kingdom.”\wj* +\v 17 He received a cup, and when he had given thanks, he said, \wj “Take this and share it among yourselves, \wj* +\v 18 \wj for I tell you, I will not drink at all again from the fruit of the vine, until God’s Kingdom comes.”\wj* +\p +\v 19 He took bread, and when he had given thanks, he broke and gave it to them, saying, \wj “This is my body which is given for you. Do this in memory of me.”\wj* +\v 20 Likewise, he took the cup after supper, saying, \wj “This cup is the new covenant in my blood, which is poured out for you. \wj* +\v 21 \wj But behold, the hand of him who betrays me is with me on the table. \wj* +\v 22 \wj The Son of Man indeed goes as it has been determined, but woe to that man through whom he is betrayed!”\wj* +\p +\v 23 They began to question among themselves which of them it was who would do this thing. +\p +\v 24 A dispute also arose among them, which of them was considered to be greatest. +\v 25 He said to them, \wj “The kings of the nations lord it over them, and those who have authority over them are called ‘benefactors.’ \wj* +\v 26 \wj But not so with you. Rather, the one who is greater among you, let him become as the younger, and one who is governing, as one who serves. \wj* +\v 27 \wj For who is greater, one who sits at the table, or one who serves? Isn’t it he who sits at the table? But I am among you as one who serves. \wj* +\p +\v 28 \wj “But you are those who have continued with me in my trials. \wj* +\v 29 \wj I confer on you a kingdom, even as my Father conferred on me, \wj* +\v 30 \wj that you may eat and drink at my table in my Kingdom. You will sit on thrones, judging the twelve tribes of Israel.”\wj* +\p +\v 31 The Lord said, \wj “Simon, Simon, behold, Satan asked to have all of you, that he might sift you as wheat, \wj* +\v 32 \wj but I prayed for you, that your faith wouldn’t fail. You, when once you have turned again, establish your brothers.”\wj*\f + \fr 22:32 \ft The word for “brothers” here may be also correctly translated “brothers and sisters” or “siblings.”\f* +\p +\v 33 He said to him, “Lord, I am ready to go with you both to prison and to death!” +\p +\v 34 He said, \wj “I tell you, Peter, the rooster will by no means crow today until you deny that you know me three times.”\wj* +\p +\v 35 He said to them, \wj “When I sent you out without purse, bag, and sandals, did you lack anything?”\wj* +\p They said, “Nothing.” +\p +\v 36 Then he said to them, \wj “But now, whoever has a purse, let him take it, and likewise a bag. Whoever has none, let him sell his cloak, and buy a sword. \wj* +\v 37 \wj For I tell you that this which is written must still be fulfilled in me: ‘He was counted with transgressors.’\wj*\x + \xo 22:37 \xt Isaiah 53:12\x* \wj For that which concerns me is being fulfilled.”\wj* +\p +\v 38 They said, “Lord, behold, here are two swords.” +\p He said to them, \wj “That is enough.”\wj* +\p +\v 39 He came out and went, as his custom was, to the Mount of Olives. His disciples also followed him. +\v 40 When he was at the place, he said to them, \wj “Pray that you don’t enter into temptation.”\wj* +\p +\v 41 He was withdrawn from them about a stone’s throw, and he knelt down and prayed, +\v 42 saying, \wj “Father, if you are willing, remove this cup from me. Nevertheless, not my will, but yours, be done.”\wj* +\p +\v 43 An angel from heaven appeared to him, strengthening him. +\v 44 Being in agony, he prayed more earnestly. His sweat became like great drops of blood falling down on the ground. +\p +\v 45 When he rose up from his prayer, he came to the disciples and found them sleeping because of grief, +\v 46 and said to them, \wj “Why do you sleep? Rise and pray that you may not enter into temptation.”\wj* +\p +\v 47 While he was still speaking, a crowd appeared. He who was called Judas, one of the twelve, was leading them. He came near to Jesus to kiss him. +\v 48 But Jesus said to him, \wj “Judas, do you betray the Son of Man with a kiss?”\wj* +\p +\v 49 When those who were around him saw what was about to happen, they said to him, “Lord, shall we strike with the sword?” +\v 50 A certain one of them struck the servant of the high priest, and cut off his right ear. +\p +\v 51 But Jesus answered, \wj “Let me at least do this”\wj*—and he touched his ear and healed him. +\v 52 Jesus said to the chief priests, captains of the temple, and elders, who had come against him, \wj “Have you come out as against a robber, with swords and clubs? \wj* +\v 53 \wj When I was with you in the temple daily, you didn’t stretch out your hands against me. But this is your hour, and the power of darkness.” \wj* +\p +\v 54 They seized him and led him away, and brought him into the high priest’s house. But Peter followed from a distance. +\v 55 When they had kindled a fire in the middle of the courtyard and had sat down together, Peter sat among them. +\v 56 A certain servant girl saw him as he sat in the light, and looking intently at him, said, “This man also was with him.” +\p +\v 57 He denied Jesus, saying, “Woman, I don’t know him.” +\p +\v 58 After a little while someone else saw him and said, “You also are one of them!” +\p But Peter answered, “Man, I am not!” +\p +\v 59 After about one hour passed, another confidently affirmed, saying, “Truly this man also was with him, for he is a Galilean!” +\p +\v 60 But Peter said, “Man, I don’t know what you are talking about!” Immediately, while he was still speaking, a rooster crowed. +\v 61 The Lord turned and looked at Peter. Then Peter remembered the Lord’s word, how he said to him, \wj “Before the rooster crows you will deny me three times.”\wj* +\v 62 He went out, and wept bitterly. +\p +\v 63 The men who held Jesus mocked him and beat him. +\v 64 Having blindfolded him, they struck him on the face and asked him, “Prophesy! Who is the one who struck you?” +\v 65 They spoke many other things against him, insulting him. +\p +\v 66 As soon as it was day, the assembly of the elders of the people were gathered together, both chief priests and scribes, and they led him away into their council, saying, +\v 67 “If you are the Christ, tell us.” +\p But he said to them, \wj “If I tell you, you won’t believe, \wj* +\v 68 \wj and if I ask, you will in no way answer me or let me go. \wj* +\v 69 \wj From now on, the Son of Man will be seated at the right hand of the power of God.”\wj* +\p +\v 70 They all said, “Are you then the Son of God?” +\p He said to them, \wj “You say it, because I am.”\wj* +\p +\v 71 They said, “Why do we need any more witness? For we ourselves have heard from his own mouth!” +\c 23 +\p +\v 1 The whole company of them rose up and brought him before Pilate. +\v 2 They began to accuse him, saying, “We found this man perverting the nation, forbidding paying taxes to Caesar, and saying that he himself is Christ, a king.” +\p +\v 3 Pilate asked him, “Are you the King of the Jews?” +\p He answered him, \wj “So you say.”\wj* +\p +\v 4 Pilate said to the chief priests and the multitudes, “I find no basis for a charge against this man.” +\p +\v 5 But they insisted, saying, “He stirs up the people, teaching throughout all Judea, beginning from Galilee even to this place.” +\p +\v 6 But when Pilate heard Galilee mentioned, he asked if the man was a Galilean. +\v 7 When he found out that he was in Herod’s jurisdiction, he sent him to Herod, who was also in Jerusalem during those days. +\p +\v 8 Now when Herod saw Jesus, he was exceedingly glad, for he had wanted to see him for a long time, because he had heard many things about him. He hoped to see some miracle done by him. +\v 9 He questioned him with many words, but he gave no answers. +\v 10 The chief priests and the scribes stood, vehemently accusing him. +\v 11 Herod with his soldiers humiliated him and mocked him. Dressing him in luxurious clothing, they sent him back to Pilate. +\v 12 Herod and Pilate became friends with each other that very day, for before that they were enemies with each other. +\p +\v 13 Pilate called together the chief priests, the rulers, and the people, +\v 14 and said to them, “You brought this man to me as one that perverts the people, and behold, having examined him before you, I found no basis for a charge against this man concerning those things of which you accuse him. +\v 15 Neither has Herod, for I sent you to him, and see, nothing worthy of death has been done by him. +\v 16 I will therefore chastise him and release him.” +\p +\v 17 Now he had to release one prisoner to them at the feast.\f + \fr 23:17 \ft NU omits verse 17.\f* +\v 18 But they all cried out together, saying, “Away with this man! Release to us Barabbas!”— +\v 19 one who was thrown into prison for a certain revolt in the city, and for murder. +\p +\v 20 Then Pilate spoke to them again, wanting to release Jesus, +\v 21 but they shouted, saying, “Crucify! Crucify him!” +\p +\v 22 He said to them the third time, “Why? What evil has this man done? I have found no capital crime in him. I will therefore chastise him and release him.” +\v 23 But they were urgent with loud voices, asking that he might be crucified. Their voices and the voices of the chief priests prevailed. +\v 24 Pilate decreed that what they asked for should be done. +\v 25 He released him who had been thrown into prison for insurrection and murder, for whom they asked, but he delivered Jesus up to their will. +\p +\v 26 When they led him away, they grabbed one Simon of Cyrene, coming from the country, and laid the cross on him to carry it after Jesus. +\v 27 A great multitude of the people followed him, including women who also mourned and lamented him. +\v 28 But Jesus, turning to them, said, \wj “Daughters of Jerusalem, don’t weep for me, but weep for yourselves and for your children. \wj* +\v 29 \wj For behold, the days are coming in which they will say, ‘Blessed are the barren, the wombs that never bore, and the breasts that never nursed.’ \wj* +\v 30 \wj Then they will begin to tell the mountains, ‘Fall on us!’ and tell the hills, ‘Cover us.’\wj*\x + \xo 23:30 \xt Hosea 10:8\x* +\v 31 \wj For if they do these things in the green tree, what will be done in the dry?”\wj* +\p +\v 32 There were also others, two criminals, led with him to be put to death. +\v 33 When they came to the place that is called “The Skull”, they crucified him there with the criminals, one on the right and the other on the left. +\p +\v 34 Jesus said, \wj “Father, forgive them, for they don’t know what they are doing.”\wj* +\p Dividing his garments among them, they cast lots. +\v 35 The people stood watching. The rulers with them also scoffed at him, saying, “He saved others. Let him save himself, if this is the Christ of God, his chosen one!” +\p +\v 36 The soldiers also mocked him, coming to him and offering him vinegar, +\v 37 and saying, “If you are the King of the Jews, save yourself!” +\p +\v 38 An inscription was also written over him in letters of Greek, Latin, and Hebrew: “THIS IS THE KING OF THE JEWS.” +\p +\v 39 One of the criminals who was hanged insulted him, saying, “If you are the Christ, save yourself and us!” +\p +\v 40 But the other answered, and rebuking him said, “Don’t you even fear God, seeing you are under the same condemnation? +\v 41 And we indeed justly, for we receive the due reward for our deeds, but this man has done nothing wrong.” +\v 42 He said to Jesus, “Lord, remember me when you come into your Kingdom.” +\p +\v 43 Jesus said to him, \wj “Assuredly I tell you, today you will be with me in Paradise.”\wj* +\p +\v 44 It was now about the sixth hour,\f + \fr 23:44 \ft Time was counted from sunrise, so the sixth hour was about noon.\f* and darkness came over the whole land until the ninth hour.\f + \fr 23:44 \ft 3:00 p.m.\f* +\v 45 The sun was darkened, and the veil of the temple was torn in two. +\v 46 Jesus, crying with a loud voice, said, \wj “Father, into your hands I commit my spirit!”\wj* Having said this, he breathed his last. +\p +\v 47 When the centurion saw what was done, he glorified God, saying, “Certainly this was a righteous man.” +\v 48 All the multitudes that came together to see this, when they saw the things that were done, returned home beating their breasts. +\v 49 All his acquaintances and the women who followed with him from Galilee stood at a distance, watching these things. +\p +\v 50 Behold, there was a man named Joseph, who was a member of the council, a good and righteous man +\v 51 (he had not consented to their counsel and deed), from Arimathaea, a city of the Jews, who was also waiting for God’s Kingdom. +\v 52 This man went to Pilate, and asked for Jesus’ body. +\v 53 He took it down and wrapped it in a linen cloth, and laid him in a tomb that was cut in stone, where no one had ever been laid. +\v 54 It was the day of the Preparation, and the Sabbath was drawing near. +\v 55 The women who had come with him out of Galilee followed after, and saw the tomb and how his body was laid. +\v 56 They returned and prepared spices and ointments. On the Sabbath they rested according to the commandment. +\c 24 +\p +\v 1 But on the first day of the week, at early dawn, they and some others came to the tomb, bringing the spices which they had prepared. +\v 2 They found the stone rolled away from the tomb. +\v 3 They entered in, and didn’t find the Lord Jesus’ body. +\v 4 While they were greatly perplexed about this, behold, two men stood by them in dazzling clothing. +\v 5 Becoming terrified, they bowed their faces down to the earth. +\p The men said to them, “Why do you seek the living among the dead? +\v 6 He isn’t here, but is risen. Remember what he told you when he was still in Galilee, +\v 7 saying that the Son of Man must be delivered up into the hands of sinful men and be crucified, and the third day rise again?” +\p +\v 8 They remembered his words, +\v 9 returned from the tomb, and told all these things to the eleven and to all the rest. +\v 10 Now they were Mary Magdalene, Joanna, and Mary the mother of James. The other women with them told these things to the apostles. +\v 11 These words seemed to them to be nonsense, and they didn’t believe them. +\v 12 But Peter got up and ran to the tomb. Stooping and looking in, he saw the strips of linen lying by themselves, and he departed to his home, wondering what had happened. +\p +\v 13 Behold, two of them were going that very day to a village named Emmaus, which was sixty stadia\f + \fr 24:13 \ft 60 stadia = about 11 kilometers or about 7 miles. \f* from Jerusalem. +\v 14 They talked with each other about all of these things which had happened. +\v 15 While they talked and questioned together, Jesus himself came near, and went with them. +\v 16 But their eyes were kept from recognizing him. +\v 17 He said to them, \wj “What are you talking about as you walk, and are sad?”\wj* +\p +\v 18 One of them, named Cleopas, answered him, “Are you the only stranger in Jerusalem who doesn’t know the things which have happened there in these days?” +\p +\v 19 He said to them, \wj “What things?”\wj* +\p They said to him, “The things concerning Jesus the Nazarene, who was a prophet mighty in deed and word before God and all the people; +\v 20 and how the chief priests and our rulers delivered him up to be condemned to death, and crucified him. +\v 21 But we were hoping that it was he who would redeem Israel. Yes, and besides all this, it is now the third day since these things happened. +\v 22 Also, certain women of our company amazed us, having arrived early at the tomb; +\v 23 and when they didn’t find his body, they came saying that they had also seen a vision of angels, who said that he was alive. +\v 24 Some of us went to the tomb and found it just like the women had said, but they didn’t see him.” +\p +\v 25 He said to them, \wj “Foolish people, and slow of heart to believe in all that the prophets have spoken! \wj* +\v 26 \wj Didn’t the Christ have to suffer these things and to enter into his glory?”\wj* +\v 27 Beginning from Moses and from all the prophets, he explained to them in all the Scriptures the things concerning himself. +\p +\v 28 They came near to the village where they were going, and he acted like he would go further. +\p +\v 29 They urged him, saying, “Stay with us, for it is almost evening, and the day is almost over.” +\p He went in to stay with them. +\v 30 When he had sat down at the table with them, he took the bread and gave thanks. Breaking it, he gave it to them. +\v 31 Their eyes were opened and they recognized him; then he vanished out of their sight. +\v 32 They said to one another, “Weren’t our hearts burning within us while he spoke to us along the way, and while he opened the Scriptures to us?” +\v 33 They rose up that very hour, returned to Jerusalem, and found the eleven gathered together, and those who were with them, +\v 34 saying, “The Lord is risen indeed, and has appeared to Simon!” +\v 35 They related the things that happened along the way, and how he was recognized by them in the breaking of the bread. +\p +\v 36 As they said these things, Jesus himself stood among them, and said to them, \wj “Peace be to you.”\wj* +\p +\v 37 But they were terrified and filled with fear, and supposed that they had seen a spirit. +\p +\v 38 He said to them, \wj “Why are you troubled? Why do doubts arise in your hearts? \wj* +\v 39 \wj See my hands and my feet, that it is truly me. Touch me and see, for a spirit doesn’t have flesh and bones, as you see that I have.”\wj* +\v 40 When he had said this, he showed them his hands and his feet. +\v 41 While they still didn’t believe for joy, and wondered, he said to them, \wj “Do you have anything here to eat?”\wj* +\p +\v 42 They gave him a piece of a broiled fish and some honeycomb. +\v 43 He took them, and ate in front of them. +\v 44 He said to them, \wj “This is what I told you while I was still with you, that all things which are written in the law of Moses, the prophets, and the psalms concerning me must be fulfilled.”\wj* +\p +\v 45 Then he opened their minds, that they might understand the Scriptures. +\v 46 He said to them, \wj “Thus it is written, and thus it was necessary for the Christ to suffer and to rise from the dead the third day, \wj* +\v 47 \wj and that repentance and remission of sins should be preached in his name to all the nations, beginning at Jerusalem. \wj* +\v 48 \wj You are witnesses of these things. \wj* +\v 49 \wj Behold, I send out the promise of my Father on you. But wait in the city of Jerusalem until you are clothed with power from on high.” \wj* +\p +\v 50 He led them out as far as Bethany, and he lifted up his hands and blessed them. +\v 51 While he blessed them, he withdrew from them and was carried up into heaven. +\v 52 They worshiped him and returned to Jerusalem with great joy, +\v 53 and were continually in the temple, praising and blessing God. Amen. diff --git a/c-sharp/assets/WEB/44JHNengWEBUS.SFM b/c-sharp/assets/WEB/44JHNengWEBUS.SFM new file mode 100644 index 0000000000..04ae0c7f64 --- /dev/null +++ b/c-sharp/assets/WEB/44JHNengWEBUS.SFM @@ -0,0 +1,1290 @@ +\id JHN 43-JHN-web.sfm World English Bible (WEB) +\ide UTF-8 +\h John +\toc1 The Good News According to John +\toc2 John +\toc3 John +\mt2 The Good News According to +\mt1 John +\c 1 +\p +\v 1 In the beginning was the Word, and the Word was with God, and the Word was God. +\v 2 The same was in the beginning with God. +\v 3 All things were made through him. Without him, nothing was made that has been made. +\v 4 In him was life, and the life was the light of men. +\v 5 The light shines in the darkness, and the darkness hasn’t overcome\f + \fr 1:5 \ft The word translated “overcome” (κατέλαβεν) can also be translated “comprehended.” It refers to getting a grip on an enemy to defeat him. \f* it. +\p +\v 6 There came a man sent from God, whose name was John. +\v 7 The same came as a witness, that he might testify about the light, that all might believe through him. +\v 8 He was not the light, but was sent that he might testify about the light. +\v 9 The true light that enlightens everyone was coming into the world. +\p +\v 10 He was in the world, and the world was made through him, and the world didn’t recognize him. +\v 11 He came to his own, and those who were his own didn’t receive him. +\v 12 But as many as received him, to them he gave the right to become God’s children, to those who believe in his name: +\v 13 who were born, not of blood, nor of the will of the flesh, nor of the will of man, but of God. +\p +\v 14 The Word became flesh and lived among us. We saw his glory, such glory as of the only born\f + \fr 1:14 \ft The phrase “only born” is from the Greek word “μονογενους”, which is sometimes translated “only begotten” or “one and only”.\f* Son of the Father, full of grace and truth. +\v 15 John testified about him. He cried out, saying, “This was he of whom I said, ‘He who comes after me has surpassed me, for he was before me.’” +\v 16 From his fullness we all received grace upon grace. +\v 17 For the law was given through Moses. Grace and truth were realized through Jesus Christ.\f + \fr 1:17 \ft “Christ” means “Anointed One”.\f* +\v 18 No one has seen God at any time. The only born\f + \fr 1:18 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* Son,\f + \fr 1:18 \ft NU reads “God”\f* who is in the bosom of the Father, has declared him. +\p +\v 19 This is John’s testimony, when the Jews sent priests and Levites from Jerusalem to ask him, “Who are you?” +\p +\v 20 He declared, and didn’t deny, but he declared, “I am not the Christ.” +\p +\v 21 They asked him, “What then? Are you Elijah?” +\p He said, “I am not.” +\p “Are you the prophet?” +\p He answered, “No.” +\p +\v 22 They said therefore to him, “Who are you? Give us an answer to take back to those who sent us. What do you say about yourself?” +\p +\v 23 He said, “I am the voice of one crying in the wilderness, ‘Make straight the way of the Lord,’\x + \xo 1:23 \xt Isaiah 40:3\x* as Isaiah the prophet said.” +\p +\v 24 The ones who had been sent were from the Pharisees. +\v 25 They asked him, “Why then do you baptize if you are not the Christ, nor Elijah, nor the prophet?” +\p +\v 26 John answered them, “I baptize in water, but among you stands one whom you don’t know. +\v 27 He is the one who comes after me, who is preferred before me, whose sandal strap I’m not worthy to loosen.” +\v 28 These things were done in Bethany beyond the Jordan, where John was baptizing. +\p +\v 29 The next day, he saw Jesus coming to him, and said, “Behold,\f + \fr 1:29 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the Lamb of God, who takes away the sin of the world! +\v 30 This is he of whom I said, ‘After me comes a man who is preferred before me, for he was before me.’ +\v 31 I didn’t know him, but for this reason I came baptizing in water, that he would be revealed to Israel.” +\v 32 John testified, saying, “I have seen the Spirit descending like a dove out of heaven, and it remained on him. +\v 33 I didn’t recognize him, but he who sent me to baptize in water said to me, ‘On whomever you will see the Spirit descending and remaining on him is he who baptizes in the Holy Spirit.’ +\v 34 I have seen and have testified that this is the Son of God.” +\p +\v 35 Again, the next day, John was standing with two of his disciples, +\v 36 and he looked at Jesus as he walked, and said, “Behold, the Lamb of God!” +\v 37 The two disciples heard him speak, and they followed Jesus. +\v 38 Jesus turned and saw them following, and said to them, \wj “What are you looking for?”\wj* +\p They said to him, “Rabbi” (which is to say, being interpreted, Teacher), “where are you staying?” +\p +\v 39 He said to them, \wj “Come and see.”\wj* +\p They came and saw where he was staying, and they stayed with him that day. It was about the tenth hour.\f + \fr 1:39 \ft 4:00 p.m.\f* +\v 40 One of the two who heard John and followed him was Andrew, Simon Peter’s brother. +\v 41 He first found his own brother, Simon, and said to him, “We have found the Messiah!” (which is, being interpreted, Christ\f + \fr 1:41 \ft “Messiah” (Hebrew) and “Christ” (Greek) both mean “Anointed One”.\f*). +\v 42 He brought him to Jesus. Jesus looked at him and said, \wj “You are Simon the son of Jonah. You shall be called Cephas”\wj* (which is by interpretation, Peter).\f + \fr 1:42 \ft “Cephas” (Aramaic) and “Peter” (Greek) both mean “Rock”.\f* +\p +\v 43 On the next day, he was determined to go out into Galilee, and he found Philip. Jesus said to him, \wj “Follow me.”\wj* +\v 44 Now Philip was from Bethsaida, the city of Andrew and Peter. +\v 45 Philip found Nathanael, and said to him, “We have found him of whom Moses in the law and also the prophets, wrote: Jesus of Nazareth, the son of Joseph.” +\p +\v 46 Nathanael said to him, “Can any good thing come out of Nazareth?” +\p Philip said to him, “Come and see.” +\p +\v 47 Jesus saw Nathanael coming to him, and said about him, \wj “Behold, an Israelite indeed, in whom is no deceit!”\wj* +\p +\v 48 Nathanael said to him, “How do you know me?” +\p Jesus answered him, \wj “Before Philip called you, when you were under the fig tree, I saw you.”\wj* +\p +\v 49 Nathanael answered him, “Rabbi, you are the Son of God! You are King of Israel!” +\p +\v 50 Jesus answered him, \wj “Because I told you, ‘I saw you underneath the fig tree,’ do you believe? You will see greater things than these!”\wj* +\v 51 He said to him, \wj “Most certainly, I tell you all, hereafter you will see heaven opened, and the angels of God ascending and descending on the Son of Man.”\wj* +\c 2 +\p +\v 1 The third day, there was a wedding in Cana of Galilee. Jesus’ mother was there. +\v 2 Jesus also was invited, with his disciples, to the wedding. +\v 3 When the wine ran out, Jesus’ mother said to him, “They have no wine.” +\p +\v 4 Jesus said to her, \wj “Woman, what does that have to do with you and me? My hour has not yet come.”\wj* +\p +\v 5 His mother said to the servants, “Whatever he says to you, do it.” +\p +\v 6 Now there were six water pots of stone set there after the Jews’ way of purifying, containing two or three metretes\f + \fr 2:6 \ft 2 to 3 metretes is about 20 to 30 U. S. Gallons, or 75 to 115 liters.\f* apiece. +\v 7 Jesus said to them, \wj “Fill the water pots with water.”\wj* So they filled them up to the brim. +\v 8 He said to them, \wj “Now draw some out, and take it to the ruler of the feast.”\wj* So they took it. +\v 9 When the ruler of the feast tasted the water now become wine, and didn’t know where it came from (but the servants who had drawn the water knew), the ruler of the feast called the bridegroom +\v 10 and said to him, “Everyone serves the good wine first, and when the guests have drunk freely, then that which is worse. You have kept the good wine until now!” +\v 11 This beginning of his signs Jesus did in Cana of Galilee, and revealed his glory; and his disciples believed in him. +\p +\v 12 After this, he went down to Capernaum, he, and his mother, his brothers, and his disciples; and they stayed there a few days. +\p +\v 13 The Passover of the Jews was at hand, and Jesus went up to Jerusalem. +\v 14 He found in the temple those who sold oxen, sheep, and doves, and the changers of money sitting. +\v 15 He made a whip of cords and drove all out of the temple, both the sheep and the oxen; and he poured out the changers’ money and overthrew their tables. +\v 16 To those who sold the doves, he said, \wj “Take these things out of here! Don’t make my Father’s house a marketplace!”\wj* +\v 17 His disciples remembered that it was written, “Zeal for your house will eat me up.”\x + \xo 2:17 \xt Psalm 69:9\x* +\p +\v 18 The Jews therefore answered him, “What sign do you show us, seeing that you do these things?” +\p +\v 19 Jesus answered them, \wj “Destroy this temple, and in three days I will raise it up.”\wj* +\p +\v 20 The Jews therefore said, “It took forty-six years to build this temple! Will you raise it up in three days?” +\v 21 But he spoke of the temple of his body. +\v 22 When therefore he was raised from the dead, his disciples remembered that he said this, and they believed the Scripture and the word which Jesus had said. +\p +\v 23 Now when he was in Jerusalem at the Passover, during the feast, many believed in his name, observing his signs which he did. +\v 24 But Jesus didn’t entrust himself to them, because he knew everyone, +\v 25 and because he didn’t need for anyone to testify concerning man; for he himself knew what was in man. +\c 3 +\p +\v 1 Now there was a man of the Pharisees named Nicodemus, a ruler of the Jews. +\v 2 He came to Jesus by night and said to him, “Rabbi, we know that you are a teacher come from God, for no one can do these signs that you do, unless God is with him.” +\p +\v 3 Jesus answered him, \wj “Most certainly I tell you, unless one is born anew, \wj*\f + \fr 3:3 \ft The word translated “anew” here and in John 3:7 (ἄνωθεν) also means “again” and “from above”.\f* \wj he can’t see God’s Kingdom.”\wj* +\p +\v 4 Nicodemus said to him, “How can a man be born when he is old? Can he enter a second time into his mother’s womb and be born?” +\p +\v 5 Jesus answered, \wj “Most certainly I tell you, unless one is born of water and Spirit, he can’t enter into God’s Kingdom.\wj* +\v 6 \wj That which is born of the flesh is flesh. That which is born of the Spirit is spirit. \wj* +\v 7 \wj Don’t marvel that I said to you, ‘You must be born anew.’ \wj* +\v 8 \wj The wind\wj*\f + \fr 3:8 \ft The same Greek word (πνεῦμα) means wind, breath, and spirit.\f* \wj blows where it wants to, and you hear its sound, but don’t know where it comes from and where it is going. So is everyone who is born of the Spirit.”\wj* +\p +\v 9 Nicodemus answered him, “How can these things be?” +\p +\v 10 Jesus answered him, \wj “Are you the teacher of Israel, and don’t understand these things? \wj* +\v 11 \wj Most certainly I tell you, we speak that which we know and testify of that which we have seen, and you don’t receive our witness. \wj* +\v 12 \wj If I told you earthly things and you don’t believe, how will you believe if I tell you heavenly things? \wj* +\v 13 \wj No one has ascended into heaven but he who descended out of heaven, the Son of Man, who is in heaven. \wj* +\v 14 \wj As Moses lifted up the serpent in the wilderness, even so must the Son of Man be lifted up, \wj* +\v 15 \wj that whoever believes in him should not perish, but have eternal life. \wj* +\v 16 \wj For God so loved the world, that he gave his only born\wj*\f + \fr 3:16 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* \wj Son, that whoever believes in him should not perish, but have eternal life. \wj* +\v 17 \wj For God didn’t send his Son into the world to judge the world, but that the world should be saved through him. \wj* +\v 18 \wj He who believes in him is not judged. He who doesn’t believe has been judged already, because he has not believed in the name of the only born Son of God. \wj* +\v 19 \wj This is the judgment, that the light has come into the world, and men loved the darkness rather than the light, for their works were evil. \wj* +\v 20 \wj For everyone who does evil hates the light and doesn’t come to the light, lest his works would be exposed. \wj* +\v 21 \wj But he who does the truth comes to the light, that his works may be revealed, that they have been done in God.”\wj* +\p +\v 22 After these things, Jesus came with his disciples into the land of Judea. He stayed there with them and baptized. +\v 23 John also was baptizing in Enon near Salim, because there was much water there. They came and were baptized; +\v 24 for John was not yet thrown into prison. +\v 25 Therefore a dispute arose on the part of John’s disciples with some Jews about purification. +\v 26 They came to John and said to him, “Rabbi, he who was with you beyond the Jordan, to whom you have testified, behold, he baptizes, and everyone is coming to him.” +\p +\v 27 John answered, “A man can receive nothing unless it has been given him from heaven. +\v 28 You yourselves testify that I said, ‘I am not the Christ,’ but, ‘I have been sent before him.’ +\v 29 He who has the bride is the bridegroom; but the friend of the bridegroom, who stands and hears him, rejoices greatly because of the bridegroom’s voice. Therefore my joy is made full. +\v 30 He must increase, but I must decrease. +\p +\v 31 “He who comes from above is above all. He who is from the earth belongs to the earth and speaks of the earth. He who comes from heaven is above all. +\v 32 What he has seen and heard, of that he testifies; and no one receives his witness. +\v 33 He who has received his witness has set his seal to this, that God is true. +\v 34 For he whom God has sent speaks the words of God; for God gives the Spirit without measure. +\v 35 The Father loves the Son, and has given all things into his hand. +\v 36 One who believes in the Son has eternal life, but one who disobeys\f + \fr 3:36 \ft The same word can be translated “disobeys” or “disbelieves” in this context.\f* the Son won’t see life, but the wrath of God remains on him.” +\c 4 +\p +\v 1 Therefore when the Lord knew that the Pharisees had heard that Jesus was making and baptizing more disciples than John +\v 2 (although Jesus himself didn’t baptize, but his disciples), +\v 3 he left Judea and departed into Galilee. +\v 4 He needed to pass through Samaria. +\v 5 So he came to a city of Samaria called Sychar, near the parcel of ground that Jacob gave to his son Joseph. +\v 6 Jacob’s well was there. Jesus therefore, being tired from his journey, sat down by the well. It was about the sixth hour.\f + \fr 4:6 \ft noon\f* +\p +\v 7 A woman of Samaria came to draw water. Jesus said to her, \wj “Give me a drink.”\wj* +\v 8 For his disciples had gone away into the city to buy food. +\p +\v 9 The Samaritan woman therefore said to him, “How is it that you, being a Jew, ask for a drink from me, a Samaritan woman?” (For Jews have no dealings with Samaritans.) +\p +\v 10 Jesus answered her, \wj “If you knew the gift of God, and who it is who says to you, ‘Give me a drink,’ you would have asked him, and he would have given you living water.”\wj* +\p +\v 11 The woman said to him, “Sir, you have nothing to draw with, and the well is deep. So where do you get that living water? +\v 12 Are you greater than our father Jacob, who gave us the well and drank from it himself, as did his children and his livestock?” +\p +\v 13 Jesus answered her, \wj “Everyone who drinks of this water will thirst again, \wj* +\v 14 \wj but whoever drinks of the water that I will give him will never thirst again; but the water that I will give him will become in him a well of water springing up to eternal life.”\wj* +\p +\v 15 The woman said to him, “Sir, give me this water, so that I don’t get thirsty, neither come all the way here to draw.” +\p +\v 16 Jesus said to her, \wj “Go, call your husband, and come here.” \wj* +\p +\v 17 The woman answered, “I have no husband.” +\p Jesus said to her, \wj “You said well, ‘I have no husband,’ \wj* +\v 18 \wj for you have had five husbands; and he whom you now have is not your husband. This you have said truly.”\wj* +\p +\v 19 The woman said to him, “Sir, I perceive that you are a prophet. +\v 20 Our fathers worshiped in this mountain, and you Jews say that in Jerusalem is the place where people ought to worship.” +\p +\v 21 Jesus said to her, \wj “Woman, believe me, the hour is coming when neither in this mountain nor in Jerusalem will you worship the Father. \wj* +\v 22 \wj You worship that which you don’t know. We worship that which we know; for salvation is from the Jews. \wj* +\v 23 \wj But the hour comes, and now is, when the true worshipers will worship the Father in spirit and truth, for the Father seeks such to be his worshipers. \wj* +\v 24 \wj God is spirit, and those who worship him must worship in spirit and truth.”\wj* +\p +\v 25 The woman said to him, “I know that Messiah is coming, he who is called Christ.\f + \fr 4:25 \ft “Messiah” (Hebrew) and “Christ” (Greek) both mean “Anointed One”.\f* When he has come, he will declare to us all things.” +\p +\v 26 Jesus said to her, \wj “I am he, the one who speaks to you.”\wj* +\p +\v 27 Just then, his disciples came. They marveled that he was speaking with a woman; yet no one said, “What are you looking for?” or, “Why do you speak with her?” +\v 28 So the woman left her water pot, went away into the city, and said to the people, +\v 29 “Come, see a man who told me everything that I have done. Can this be the Christ?” +\v 30 They went out of the city, and were coming to him. +\p +\v 31 In the meanwhile, the disciples urged him, saying, “Rabbi, eat.” +\p +\v 32 But he said to them, \wj “I have food to eat that you don’t know about.”\wj* +\p +\v 33 The disciples therefore said to one another, “Has anyone brought him something to eat?” +\p +\v 34 Jesus said to them, \wj “My food is to do the will of him who sent me and to accomplish his work. \wj* +\v 35 \wj Don’t you say, ‘There are yet four months until the harvest?’ Behold, I tell you, lift up your eyes and look at the fields, that they are white for harvest already. \wj* +\v 36 \wj He who reaps receives wages and gathers fruit to eternal life, that both he who sows and he who reaps may rejoice together. \wj* +\v 37 \wj For in this the saying is true, ‘One sows, and another reaps.’ \wj* +\v 38 \wj I sent you to reap that for which you haven’t labored. Others have labored, and you have entered into their labor.”\wj* +\p +\v 39 From that city many of the Samaritans believed in him because of the word of the woman, who testified, “He told me everything that I have done.” +\v 40 So when the Samaritans came to him, they begged him to stay with them. He stayed there two days. +\v 41 Many more believed because of his word. +\v 42 They said to the woman, “Now we believe, not because of your speaking; for we have heard for ourselves, and know that this is indeed the Christ, the Savior of the world.” +\p +\v 43 After the two days he went out from there and went into Galilee. +\v 44 For Jesus himself testified that a prophet has no honor in his own country. +\v 45 So when he came into Galilee, the Galileans received him, having seen all the things that he did in Jerusalem at the feast, for they also went to the feast. +\v 46 Jesus came therefore again to Cana of Galilee, where he made the water into wine. There was a certain nobleman whose son was sick at Capernaum. +\v 47 When he heard that Jesus had come out of Judea into Galilee, he went to him and begged him that he would come down and heal his son, for he was at the point of death. +\v 48 Jesus therefore said to him, \wj “Unless you see signs and wonders, you will in no way believe.”\wj* +\p +\v 49 The nobleman said to him, “Sir, come down before my child dies.” +\p +\v 50 Jesus said to him, \wj “Go your way. Your son lives.”\wj* The man believed the word that Jesus spoke to him, and he went his way. +\v 51 As he was going down, his servants met him and reported, saying “Your child lives!” +\v 52 So he inquired of them the hour when he began to get better. They said therefore to him, “Yesterday at the seventh hour,\f + \fr 4:52 \ft 1:00 p.m.\f* the fever left him.” +\v 53 So the father knew that it was at that hour in which Jesus said to him, \wj “Your son lives.”\wj* He believed, as did his whole house. +\v 54 This is again the second sign that Jesus did, having come out of Judea into Galilee. +\c 5 +\p +\v 1 After these things, there was a feast of the Jews, and Jesus went up to Jerusalem. +\v 2 Now in Jerusalem by the sheep gate, there is a pool, which is called in Hebrew, “Bethesda”, having five porches. +\v 3 In these lay a great multitude of those who were sick, blind, lame, or paralyzed, waiting for the moving of the water; +\v 4 for an angel went down at certain times into the pool and stirred up the water. Whoever stepped in first after the stirring of the water was healed of whatever disease he had.\f + \fr 5:4 \ft NU omits from “waiting” in verse 3 to the end of verse 4.\f* +\v 5 A certain man was there who had been sick for thirty-eight years. +\v 6 When Jesus saw him lying there, and knew that he had been sick for a long time, he asked him, \wj “Do you want to be made well?”\wj* +\p +\v 7 The sick man answered him, “Sir, I have no one to put me into the pool when the water is stirred up, but while I’m coming, another steps down before me.” +\p +\v 8 Jesus said to him, \wj “Arise, take up your mat, and walk.”\wj* +\p +\v 9 Immediately, the man was made well, and took up his mat and walked. +\p Now that day was a Sabbath. +\v 10 So the Jews said to him who was cured, “It is the Sabbath. It is not lawful for you to carry the mat.” +\p +\v 11 He answered them, “He who made me well said to me, \wj ‘Take up your mat and walk.’\wj*” +\p +\v 12 Then they asked him, “Who is the man who said to you, \wj ‘Take up your mat and walk’\wj*?” +\p +\v 13 But he who was healed didn’t know who it was, for Jesus had withdrawn, a crowd being in the place. +\p +\v 14 Afterward Jesus found him in the temple and said to him, \wj “Behold, you are made well. Sin no more, so that nothing worse happens to you.” \wj* +\p +\v 15 The man went away, and told the Jews that it was Jesus who had made him well. +\v 16 For this cause the Jews persecuted Jesus and sought to kill him, because he did these things on the Sabbath. +\v 17 But Jesus answered them, \wj “My Father is still working, so I am working, too.”\wj* +\p +\v 18 For this cause therefore the Jews sought all the more to kill him, because he not only broke the Sabbath, but also called God his own Father, making himself equal with God. +\v 19 Jesus therefore answered them, \wj “Most certainly, I tell you, the Son can do nothing of himself, but what he sees the Father doing. For whatever things he does, these the Son also does likewise. \wj* +\v 20 \wj For the Father has affection for the Son, and shows him all things that he himself does. He will show him greater works than these, that you may marvel. \wj* +\v 21 \wj For as the Father raises the dead and gives them life, even so the Son also gives life to whom he desires. \wj* +\v 22 \wj For the Father judges no one, but he has given all judgment to the Son, \wj* +\v 23 \wj that all may honor the Son, even as they honor the Father. He who doesn’t honor the Son doesn’t honor the Father who sent him.\wj* +\p +\v 24 \wj “Most certainly I tell you, he who hears my word and believes him who sent me has eternal life, and doesn’t come into judgment, but has passed out of death into life. \wj* +\v 25 \wj Most certainly I tell you, the hour comes, and now is, when the dead will hear the Son of God’s voice; and those who hear will live. \wj* +\v 26 \wj For as the Father has life in himself, even so he gave to the Son also to have life in himself. \wj* +\v 27 \wj He also gave him authority to execute judgment, because he is a son of man. \wj* +\v 28 \wj Don’t marvel at this, for the hour comes in which all who are in the tombs will hear his voice \wj* +\v 29 \wj and will come out; those who have done good, to the resurrection of life; and those who have done evil, to the resurrection of judgment. \wj* +\v 30 \wj I can of myself do nothing. As I hear, I judge; and my judgment is righteous, because I don’t seek my own will, but the will of my Father who sent me.\wj* +\p +\v 31 \wj “If I testify about myself, my witness is not valid. \wj* +\v 32 \wj It is another who testifies about me. I know that the testimony which he testifies about me is true. \wj* +\v 33 \wj You have sent to John, and he has testified to the truth. \wj* +\v 34 \wj But the testimony which I receive is not from man. However, I say these things that you may be saved. \wj* +\v 35 \wj He was the burning and shining lamp, and you were willing to rejoice for a while in his light. \wj* +\v 36 \wj But the testimony which I have is greater than that of John; for the works which the Father gave me to accomplish, the very works that I do, testify about me, that the Father has sent me. \wj* +\v 37 \wj The Father himself, who sent me, has testified about me. You have neither heard his voice at any time, nor seen his form. \wj* +\v 38 \wj You don’t have his word living in you, because you don’t believe him whom he sent.\wj* +\p +\v 39 \wj “You search the Scriptures, because you think that in them you have eternal life; and these are they which testify about me. \wj* +\v 40 \wj Yet you will not come to me, that you may have life. \wj* +\v 41 \wj I don’t receive glory from men. \wj* +\v 42 \wj But I know you, that you don’t have God’s love in yourselves. \wj* +\v 43 \wj I have come in my Father’s name, and you don’t receive me. If another comes in his own name, you will receive him. \wj* +\v 44 \wj How can you believe, who receive glory from one another, and you don’t seek the glory that comes from the only God?\wj* +\p +\v 45 \wj “Don’t think that I will accuse you to the Father. There is one who accuses you, even Moses, on whom you have set your hope. \wj* +\v 46 \wj For if you believed Moses, you would believe me; for he wrote about me. \wj* +\v 47 \wj But if you don’t believe his writings, how will you believe my words?”\wj* +\c 6 +\p +\v 1 After these things, Jesus went away to the other side of the sea of Galilee, which is also called the Sea of Tiberias. +\v 2 A great multitude followed him, because they saw his signs which he did on those who were sick. +\v 3 Jesus went up into the mountain, and he sat there with his disciples. +\v 4 Now the Passover, the feast of the Jews, was at hand. +\v 5 Jesus therefore, lifting up his eyes and seeing that a great multitude was coming to him, said to Philip, \wj “Where are we to buy bread, that these may eat?”\wj* +\v 6 He said this to test him, for he himself knew what he would do. +\p +\v 7 Philip answered him, “Two hundred denarii\f + \fr 6:7 \ft A denarius was a silver coin worth about a day’s wages for an agricultural laborer, so 200 denarii would be between 6 and 7 month’s pay.\f* worth of bread is not sufficient for them, that every one of them may receive a little.” +\p +\v 8 One of his disciples, Andrew, Simon Peter’s brother, said to him, +\v 9 “There is a boy here who has five barley loaves and two fish, but what are these among so many?” +\p +\v 10 Jesus said, \wj “Have the people sit down.”\wj* Now there was much grass in that place. So the men sat down, in number about five thousand. +\v 11 Jesus took the loaves, and having given thanks, he distributed to the disciples, and the disciples to those who were sitting down, likewise also of the fish as much as they desired. +\v 12 When they were filled, he said to his disciples, \wj “Gather up the broken pieces which are left over, that nothing be lost.”\wj* +\v 13 So they gathered them up, and filled twelve baskets with broken pieces from the five barley loaves, which were left over by those who had eaten. +\v 14 When therefore the people saw the sign which Jesus did, they said, “This is truly the prophet who comes into the world.” +\v 15 Jesus therefore, perceiving that they were about to come and take him by force to make him king, withdrew again to the mountain by himself. +\p +\v 16 When evening came, his disciples went down to the sea. +\v 17 They entered into the boat, and were going over the sea to Capernaum. It was now dark, and Jesus had not come to them. +\v 18 The sea was tossed by a great wind blowing. +\v 19 When therefore they had rowed about twenty-five or thirty stadia,\f + \fr 6:19 \ft 25 to 30 stadia is about 5 to 6 kilometers or about 3 to 4 miles\f* they saw Jesus walking on the sea\x + \xo 6:19 \xt See Job 9:8\x* and drawing near to the boat; and they were afraid. +\v 20 But he said to them, \wj “It is I.\wj*\f + \fr 6:20 \ft or, I AM\f* \wj Don’t be afraid.”\wj* +\v 21 They were willing therefore to receive him into the boat. Immediately the boat was at the land where they were going. +\p +\v 22 On the next day, the multitude that stood on the other side of the sea saw that there was no other boat there, except the one in which his disciples had embarked, and that Jesus hadn’t entered with his disciples into the boat, but his disciples had gone away alone. +\v 23 However, boats from Tiberias came near to the place where they ate the bread after the Lord had given thanks. +\v 24 When the multitude therefore saw that Jesus wasn’t there, nor his disciples, they themselves got into the boats and came to Capernaum, seeking Jesus. +\v 25 When they found him on the other side of the sea, they asked him, “Rabbi, when did you come here?” +\p +\v 26 Jesus answered them, \wj “Most certainly I tell you, you seek me, not because you saw signs, but because you ate of the loaves and were filled. \wj* +\v 27 \wj Don’t work for the food which perishes, but for the food which remains to eternal life, which the Son of Man will give to you. For God the Father has sealed him.”\wj* +\p +\v 28 They said therefore to him, “What must we do, that we may work the works of God?” +\p +\v 29 Jesus answered them, \wj “This is the work of God, that you believe in him whom he has sent.”\wj* +\p +\v 30 They said therefore to him, “What then do you do for a sign, that we may see and believe you? What work do you do? +\v 31 Our fathers ate the manna in the wilderness. As it is written, ‘He gave them bread out of heaven\f + \fr 6:31 \ft Greek and Hebrew use the same word for “heaven”, “the heavens”, “the sky”, and “the air”.\f* to eat.’”\x + \xo 6:31 \xt Exodus 16:4; Nehemiah 9:15; Psalm 78:24-25\x* +\p +\v 32 Jesus therefore said to them, \wj “Most certainly, I tell you, it wasn’t Moses who gave you the bread out of heaven, but my Father gives you the true bread out of heaven. \wj* +\v 33 \wj For the bread of God is that which comes down out of heaven and gives life to the world.”\wj* +\p +\v 34 They said therefore to him, “Lord, always give us this bread.” +\p +\v 35 Jesus said to them, \wj “I am the bread of life. Whoever comes to me will not be hungry, and whoever believes in me will never be thirsty. \wj* +\v 36 \wj But I told you that you have seen me, and yet you don’t believe. \wj* +\v 37 \wj All those whom the Father gives me will come to me. He who comes to me I will in no way throw out. \wj* +\v 38 \wj For I have come down from heaven, not to do my own will, but the will of him who sent me. \wj* +\v 39 \wj This is the will of my Father who sent me, that of all he has given to me I should lose nothing, but should raise him up at the last day. \wj* +\v 40 \wj This is the will of the one who sent me, that everyone who sees the Son and believes in him should have eternal life; and I will raise him up at the last day.”\wj* +\p +\v 41 The Jews therefore murmured concerning him, because he said, \wj “I am the bread which came down out of heaven.”\wj* +\v 42 They said, “Isn’t this Jesus, the son of Joseph, whose father and mother we know? How then does he say, \wj ‘I have come down out of heaven?’” \wj* +\p +\v 43 Therefore Jesus answered them, \wj “Don’t murmur among yourselves. \wj* +\v 44 \wj No one can come to me unless the Father who sent me draws him; and I will raise him up in the last day. \wj* +\v 45 \wj It is written in the prophets, ‘They will all be taught by God.’ \wj* \x + \xo 6:45 \xt Isaiah 54:13\x* \wj Therefore everyone who hears from the Father and has learned, comes to me. \wj* +\v 46 \wj Not that anyone has seen the Father, except he who is from God. He has seen the Father. \wj* +\v 47 \wj Most certainly, I tell you, he who believes in me has eternal life. \wj* +\v 48 \wj I am the bread of life. \wj* +\v 49 \wj Your fathers ate the manna in the wilderness and they died. \wj* +\v 50 \wj This is the bread which comes down out of heaven, that anyone may eat of it and not die. \wj* +\v 51 \wj I am the living bread which came down out of heaven. If anyone eats of this bread, he will live forever. Yes, the bread which I will give for the life of the world is my flesh.”\wj* +\p +\v 52 The Jews therefore contended with one another, saying, “How can this man give us his flesh to eat?” +\p +\v 53 Jesus therefore said to them, \wj “Most certainly I tell you, unless you eat the flesh of the Son of Man and drink his blood, you don’t have life in yourselves. \wj* +\v 54 \wj He who eats my flesh and drinks my blood has eternal life, and I will raise him up at the last day. \wj* +\v 55 \wj For my flesh is food indeed, and my blood is drink indeed. \wj* +\v 56 \wj He who eats my flesh and drinks my blood lives in me, and I in him. \wj* +\v 57 \wj As the living Father sent me, and I live because of the Father, so he who feeds on me will also live because of me. \wj* +\v 58 \wj This is the bread which came down out of heaven—not as our fathers ate the manna and died. He who eats this bread will live forever.”\wj* +\v 59 He said these things in the synagogue, as he taught in Capernaum. +\p +\v 60 Therefore many of his disciples, when they heard this, said, “This is a hard saying! Who can listen to it?” +\p +\v 61 But Jesus knowing in himself that his disciples murmured at this, said to them, \wj “Does this cause you to stumble? \wj* +\v 62 \wj Then what if you would see the Son of Man ascending to where he was before? \wj* +\v 63 \wj It is the spirit who gives life. The flesh profits nothing. The words that I speak to you are spirit, and are life. \wj* +\v 64 \wj But there are some of you who don’t believe.”\wj* For Jesus knew from the beginning who they were who didn’t believe, and who it was who would betray him. +\v 65 He said, \wj “For this cause I have said to you that no one can come to me, unless it is given to him by my Father.”\wj* +\p +\v 66 At this, many of his disciples went back and walked no more with him. +\v 67 Jesus said therefore to the twelve, \wj “You don’t also want to go away, do you?”\wj* +\p +\v 68 Simon Peter answered him, “Lord, to whom would we go? You have the words of eternal life. +\v 69 We have come to believe and know that you are the Christ, the Son of the living God.” +\p +\v 70 Jesus answered them, \wj “Didn’t I choose you, the twelve, and one of you is a devil?”\wj* +\v 71 Now he spoke of Judas, the son of Simon Iscariot, for it was he who would betray him, being one of the twelve. +\c 7 +\p +\v 1 After these things, Jesus was walking in Galilee, for he wouldn’t walk in Judea, because the Jews sought to kill him. +\v 2 Now the feast of the Jews, the Feast of Booths, was at hand. +\v 3 His brothers therefore said to him, “Depart from here and go into Judea, that your disciples also may see your works which you do. +\v 4 For no one does anything in secret while he seeks to be known openly. If you do these things, reveal yourself to the world.” +\v 5 For even his brothers didn’t believe in him. +\p +\v 6 Jesus therefore said to them, \wj “My time has not yet come, but your time is always ready. \wj* +\v 7 \wj The world can’t hate you, but it hates me, because I testify about it, that its works are evil. \wj* +\v 8 \wj You go up to the feast. I am not yet going up to this feast, because my time is not yet fulfilled.”\wj* +\p +\v 9 Having said these things to them, he stayed in Galilee. +\v 10 But when his brothers had gone up to the feast, then he also went up, not publicly, but as it were in secret. +\v 11 The Jews therefore sought him at the feast, and said, “Where is he?” +\v 12 There was much murmuring among the multitudes concerning him. Some said, “He is a good man.” Others said, “Not so, but he leads the multitude astray.” +\v 13 Yet no one spoke openly of him for fear of the Jews. +\v 14 But when it was now the middle of the feast, Jesus went up into the temple and taught. +\v 15 The Jews therefore marveled, saying, “How does this man know letters, having never been educated?” +\p +\v 16 Jesus therefore answered them, \wj “My teaching is not mine, but his who sent me. \wj* +\v 17 \wj If anyone desires to do his will, he will know about the teaching, whether it is from God or if I am speaking from myself. \wj* +\v 18 \wj He who speaks from himself seeks his own glory, but he who seeks the glory of him who sent him is true, and no unrighteousness is in him. \wj* +\v 19 \wj Didn’t Moses give you the law, and yet none of you keeps the law? Why do you seek to kill me?”\wj* +\p +\v 20 The multitude answered, “You have a demon! Who seeks to kill you?” +\p +\v 21 Jesus answered them, \wj “I did one work and you all marvel because of it. \wj* +\v 22 \wj Moses has given you circumcision (not that it is of Moses, but of the fathers), and on the Sabbath you circumcise a boy. \wj* +\v 23 \wj If a boy receives circumcision on the Sabbath, that the law of Moses may not be broken, are you angry with me because I made a man completely healthy on the Sabbath? \wj* +\v 24 \wj Don’t judge according to appearance, but judge righteous judgment.” \wj* +\p +\v 25 Therefore some of them of Jerusalem said, “Isn’t this he whom they seek to kill? +\v 26 Behold, he speaks openly, and they say nothing to him. Can it be that the rulers indeed know that this is truly the Christ? +\v 27 However, we know where this man comes from, but when the Christ comes, no one will know where he comes from.” +\p +\v 28 Jesus therefore cried out in the temple, teaching and saying, \wj “You both know me, and know where I am from. I have not come of myself, but he who sent me is true, whom you don’t know. \wj* +\v 29 \wj I know him, because I am from him, and he sent me.”\wj* +\p +\v 30 They sought therefore to take him; but no one laid a hand on him, because his hour had not yet come. +\v 31 But of the multitude, many believed in him. They said, “When the Christ comes, he won’t do more signs than those which this man has done, will he?” +\v 32 The Pharisees heard the multitude murmuring these things concerning him, and the chief priests and the Pharisees sent officers to arrest him. +\p +\v 33 Then Jesus said, \wj “I will be with you a little while longer, then I go to him who sent me. \wj* +\v 34 \wj You will seek me and won’t find me. You can’t come where I am.”\wj* +\p +\v 35 The Jews therefore said among themselves, “Where will this man go that we won’t find him? Will he go to the Dispersion among the Greeks and teach the Greeks? +\v 36 What is this word that he said, \wj ‘You will seek me, and won’t find me;’\wj* and \wj ‘Where I am, you can’t come’\wj*?” +\p +\v 37 Now on the last and greatest day of the feast, Jesus stood and cried out, \wj “If anyone is thirsty, let him come to me and drink! \wj* +\v 38 \wj He who believes in me, as the Scripture has said, from within him will flow rivers of living water.”\wj* +\v 39 But he said this about the Spirit, which those believing in him were to receive. For the Holy Spirit was not yet given, because Jesus wasn’t yet glorified. +\p +\v 40 Many of the multitude therefore, when they heard these words, said, “This is truly the prophet.” +\v 41 Others said, “This is the Christ.” But some said, “What, does the Christ come out of Galilee? +\v 42 Hasn’t the Scripture said that the Christ comes of the offspring\f + \fr 7:42 \ft or, seed\f* of David, \x + \xo 7:42 \xt 2 Samuel 7:12\x* and from Bethlehem,\x + \xo 7:42 \xt Micah 5:2\x* the village where David was?” +\v 43 So a division arose in the multitude because of him. +\v 44 Some of them would have arrested him, but no one laid hands on him. +\v 45 The officers therefore came to the chief priests and Pharisees; and they said to them, “Why didn’t you bring him?” +\p +\v 46 The officers answered, “No man ever spoke like this man!” +\p +\v 47 The Pharisees therefore answered them, “You aren’t also led astray, are you? +\v 48 Have any of the rulers or any of the Pharisees believed in him? +\v 49 But this multitude that doesn’t know the law is cursed.” +\p +\v 50 Nicodemus (he who came to him by night, being one of them) said to them, +\v 51 “Does our law judge a man unless it first hears from him personally and knows what he does?” +\p +\v 52 They answered him, “Are you also from Galilee? Search and see that no prophet has arisen out of Galilee.”\x + \xo 7:52 \xt See Isaiah 9:1; Matthew 4:13-16\x* +\p +\v 53 Everyone went to his own house, +\c 8 +\nb +\v 1 but Jesus went to the Mount of Olives. +\p +\v 2 Now very early in the morning, he came again into the temple, and all the people came to him. He sat down and taught them. +\v 3 The scribes and the Pharisees brought a woman taken in adultery. Having set her in the middle, +\v 4 they told him, “Teacher, we found this woman in adultery, in the very act. +\v 5 Now in our law, Moses commanded us to stone such women.\x + \xo 8:5 \xt Leviticus 20:10; Deuteronomy 22:22\x* What then do you say about her?” +\v 6 They said this testing him, that they might have something to accuse him of. +\p But Jesus stooped down and wrote on the ground with his finger. +\v 7 But when they continued asking him, he looked up and said to them, \wj “He who is without sin among you, let him throw the first stone at her.” \wj* +\v 8 Again he stooped down and wrote on the ground with his finger. +\p +\v 9 They, when they heard it, being convicted by their conscience, went out one by one, beginning from the oldest, even to the last. Jesus was left alone with the woman where she was, in the middle. +\v 10 Jesus, standing up, saw her and said, \wj “Woman, where are your accusers? Did no one condemn you?”\wj* +\p +\v 11 She said, “No one, Lord.” +\p Jesus said, \wj “Neither do I condemn you. Go your way. From now on, sin no more.”\wj*\f + \fr 8:11 \ft NU includes John 7:53–John 8:11, but puts brackets around it to indicate that the textual critics had less confidence that this was original.\f* +\p +\v 12 Again, therefore, Jesus spoke to them, saying, \wj “I am the light of the world.\wj*\x + \xo 8:12 \xt Isaiah 60:1\x* \wj He who follows me will not walk in the darkness, but will have the light of life.”\wj* +\p +\v 13 The Pharisees therefore said to him, “You testify about yourself. Your testimony is not valid.” +\p +\v 14 Jesus answered them, \wj “Even if I testify about myself, my testimony is true, for I know where I came from, and where I am going; but you don’t know where I came from, or where I am going. \wj* +\v 15 \wj You judge according to the flesh. I judge no one. \wj* +\v 16 \wj Even if I do judge, my judgment is true, for I am not alone, but I am with the Father who sent me. \wj* +\v 17 \wj It’s also written in your law that the testimony of two people is valid.\wj*\x + \xo 8:17 \xt Deuteronomy 17:6; 19:15\x* +\v 18 \wj I am one who testifies about myself, and the Father who sent me testifies about me.”\wj* +\p +\v 19 They said therefore to him, “Where is your Father?” +\p Jesus answered, \wj “You know neither me nor my Father. If you knew me, you would know my Father also.”\wj* +\v 20 Jesus spoke these words in the treasury, as he taught in the temple. Yet no one arrested him, because his hour had not yet come. +\v 21 Jesus said therefore again to them, \wj “I am going away, and you will seek me, and you will die in your sins. Where I go, you can’t come.” \wj* +\p +\v 22 The Jews therefore said, “Will he kill himself, because he says, \wj ‘Where I am going, you can’t come’\wj*?” +\p +\v 23 He said to them, \wj “You are from beneath. I am from above. You are of this world. I am not of this world. \wj* +\v 24 \wj I said therefore to you that you will die in your sins; for unless you believe that I am\wj*\f + \fr 8:24 \ft or, I AM\f* \wj he, you will die in your sins.” \wj* +\p +\v 25 They said therefore to him, “Who are you?” +\p Jesus said to them, \wj “Just what I have been saying to you from the beginning. \wj* +\v 26 \wj I have many things to speak and to judge concerning you. However, he who sent me is true; and the things which I heard from him, these I say to the world.”\wj* +\p +\v 27 They didn’t understand that he spoke to them about the Father. +\v 28 Jesus therefore said to them, \wj “When you have lifted up the Son of Man, then you will know that I am he, and I do nothing of myself, but as my Father taught me, I say these things. \wj* +\v 29 \wj He who sent me is with me. The Father hasn’t left me alone, for I always do the things that are pleasing to him.”\wj* +\p +\v 30 As he spoke these things, many believed in him. +\v 31 Jesus therefore said to those Jews who had believed him, \wj “If you remain in my word, then you are truly my disciples. \wj* +\v 32 \wj You will know the truth, and the truth will make you free.” \wj*\x + \xo 8:32 \xt Psalm 119:45\x* +\p +\v 33 They answered him, “We are Abraham’s offspring, and have never been in bondage to anyone. How do you say, \wj ‘You will be made free’\wj*?” +\p +\v 34 Jesus answered them, \wj “Most certainly I tell you, everyone who commits sin is the bondservant of sin. \wj* +\v 35 \wj A bondservant doesn’t live in the house forever. A son remains forever. \wj* +\v 36 \wj If therefore the Son makes you free, you will be free indeed. \wj* +\v 37 \wj I know that you are Abraham’s offspring, yet you seek to kill me, because my word finds no place in you. \wj* +\v 38 \wj I say the things which I have seen with my Father; and you also do the things which you have seen with your father.”\wj* +\p +\v 39 They answered him, “Our father is Abraham.” +\p Jesus said to them, \wj “If you were Abraham’s children, you would do the works of Abraham. \wj* +\v 40 \wj But now you seek to kill me, a man who has told you the truth which I heard from God. Abraham didn’t do this. \wj* +\v 41 \wj You do the works of your father.”\wj* +\p They said to him, “We were not born of sexual immorality. We have one Father, God.” +\p +\v 42 Therefore Jesus said to them, \wj “If God were your father, you would love me, for I came out and have come from God. For I haven’t come of myself, but he sent me. \wj* +\v 43 \wj Why don’t you understand my speech? Because you can’t hear my word. \wj* +\v 44 \wj You are of your father the devil, and you want to do the desires of your father. He was a murderer from the beginning, and doesn’t stand in the truth, because there is no truth in him. When he speaks a lie, he speaks on his own; for he is a liar, and the father of lies. \wj* +\v 45 \wj But because I tell the truth, you don’t believe me. \wj* +\v 46 \wj Which of you convicts me of sin? If I tell the truth, why do you not believe me? \wj* +\v 47 \wj He who is of God hears the words of God. For this cause you don’t hear, because you are not of God.”\wj* +\p +\v 48 Then the Jews answered him, “Don’t we say well that you are a Samaritan, and have a demon?” +\p +\v 49 Jesus answered, \wj “I don’t have a demon, but I honor my Father and you dishonor me. \wj* +\v 50 \wj But I don’t seek my own glory. There is one who seeks and judges. \wj* +\v 51 \wj Most certainly, I tell you, if a person keeps my word, he will never see death.”\wj* +\p +\v 52 Then the Jews said to him, “Now we know that you have a demon. Abraham died, as did the prophets; and you say, \wj ‘If a man keeps my word, he will never taste of death.’\wj* +\v 53 Are you greater than our father Abraham, who died? The prophets died. Who do you make yourself out to be?” +\p +\v 54 Jesus answered, \wj “If I glorify myself, my glory is nothing. It is my Father who glorifies me, of whom you say that he is our God. \wj* +\v 55 \wj You have not known him, but I know him. If I said, ‘I don’t know him,’ I would be like you, a liar. But I know him and keep his word. \wj* +\v 56 \wj Your father Abraham rejoiced to see my day. He saw it and was glad.”\wj* +\p +\v 57 The Jews therefore said to him, “You are not yet fifty years old! Have you seen Abraham?” +\p +\v 58 Jesus said to them, \wj “Most certainly, I tell you, before Abraham came into existence, I AM.\wj*\x + \xo 8:58 \xt Exodus 3:14\x*\wj ”\wj* +\p +\v 59 Therefore they took up stones to throw at him, but Jesus hid himself and went out of the temple, having gone through the middle of them, and so passed by. +\c 9 +\p +\v 1 As he passed by, he saw a man blind from birth. +\v 2 His disciples asked him, “Rabbi, who sinned, this man or his parents, that he was born blind?” +\p +\v 3 Jesus answered, \wj “This man didn’t sin, nor did his parents, but that the works of God might be revealed in him. \wj* +\v 4 \wj I must work the works of him who sent me while it is day. The night is coming, when no one can work. \wj* +\v 5 \wj While I am in the world, I am the light of the world.”\wj* +\v 6 When he had said this, he spat on the ground, made mud with the saliva, anointed the blind man’s eyes with the mud, +\v 7 and said to him, \wj “Go, wash in the pool of Siloam”\wj* (which means “Sent”). So he went away, washed, and came back seeing. +\p +\v 8 Therefore the neighbors and those who saw that he was blind before said, “Isn’t this he who sat and begged?” +\v 9 Others were saying, “It is he.” Still others were saying, “He looks like him.” +\p He said, “I am he.” +\p +\v 10 They therefore were asking him, “How were your eyes opened?” +\p +\v 11 He answered, “A man called Jesus made mud, anointed my eyes, and said to me, \wj ‘Go to the pool of Siloam and wash.’\wj* So I went away and washed, and I received sight.” +\p +\v 12 Then they asked him, “Where is he?” +\p He said, “I don’t know.” +\p +\v 13 They brought him who had been blind to the Pharisees. +\v 14 It was a Sabbath when Jesus made the mud and opened his eyes. +\v 15 Again therefore the Pharisees also asked him how he received his sight. He said to them, “He put mud on my eyes, I washed, and I see.” +\p +\v 16 Some therefore of the Pharisees said, “This man is not from God, because he doesn’t keep the Sabbath.” +\p Others said, “How can a man who is a sinner do such signs?” So there was division among them. +\p +\v 17 Therefore they asked the blind man again, “What do you say about him, because he opened your eyes?” +\p He said, “He is a prophet.” +\p +\v 18 The Jews therefore didn’t believe concerning him, that he had been blind and had received his sight, until they called the parents of him who had received his sight, +\v 19 and asked them, “Is this your son, whom you say was born blind? How then does he now see?” +\p +\v 20 His parents answered them, “We know that this is our son, and that he was born blind; +\v 21 but how he now sees, we don’t know; or who opened his eyes, we don’t know. He is of age. Ask him. He will speak for himself.” +\v 22 His parents said these things because they feared the Jews; for the Jews had already agreed that if any man would confess him as Christ, he would be put out of the synagogue. +\v 23 Therefore his parents said, “He is of age. Ask him.” +\p +\v 24 So they called the man who was blind a second time, and said to him, “Give glory to God. We know that this man is a sinner.” +\p +\v 25 He therefore answered, “I don’t know if he is a sinner. One thing I do know: that though I was blind, now I see.” +\p +\v 26 They said to him again, “What did he do to you? How did he open your eyes?” +\p +\v 27 He answered them, “I told you already, and you didn’t listen. Why do you want to hear it again? You don’t also want to become his disciples, do you?” +\p +\v 28 They insulted him and said, “You are his disciple, but we are disciples of Moses. +\v 29 We know that God has spoken to Moses. But as for this man, we don’t know where he comes from.” +\p +\v 30 The man answered them, “How amazing! You don’t know where he comes from, yet he opened my eyes. +\v 31 We know that God doesn’t listen to sinners, but if anyone is a worshiper of God and does his will, he listens to him.\x + \xo 9:31 \xt Psalm 66:18; Proverbs 15:29; 28:9\x* +\v 32 Since the world began it has never been heard of that anyone opened the eyes of someone born blind. +\v 33 If this man were not from God, he could do nothing.” +\p +\v 34 They answered him, “You were altogether born in sins, and do you teach us?” Then they threw him out. +\p +\v 35 Jesus heard that they had thrown him out, and finding him, he said, \wj “Do you believe in the Son of God?”\wj* +\p +\v 36 He answered, “Who is he, Lord, that I may believe in him?” +\p +\v 37 Jesus said to him, \wj “You have both seen him, and it is he who speaks with you.”\wj* +\p +\v 38 He said, “Lord, I believe!” and he worshiped him. +\p +\v 39 Jesus said, \wj “I came into this world for judgment, that those who don’t see may see; and that those who see may become blind.”\wj* +\p +\v 40 Those of the Pharisees who were with him heard these things, and said to him, “Are we also blind?” +\p +\v 41 Jesus said to them, \wj “If you were blind, you would have no sin; but now you say, ‘We see.’ Therefore your sin remains.\wj* +\c 10 +\p +\v 1 \wj “Most certainly, I tell you, one who doesn’t enter by the door into the sheep fold, but climbs up some other way, is a thief and a robber. \wj* +\v 2 \wj But one who enters in by the door is the shepherd of the sheep. \wj* +\v 3 \wj The gatekeeper opens the gate for him, and the sheep listen to his voice. He calls his own sheep by name and leads them out. \wj* +\v 4 \wj Whenever he brings out his own sheep, he goes before them; and the sheep follow him, for they know his voice. \wj* +\v 5 \wj They will by no means follow a stranger, but will flee from him; for they don’t know the voice of strangers.”\wj* +\v 6 Jesus spoke this parable to them, but they didn’t understand what he was telling them. +\p +\v 7 Jesus therefore said to them again, \wj “Most certainly, I tell you, I am the sheep’s door. \wj* +\v 8 \wj All who came before me are thieves and robbers, but the sheep didn’t listen to them. \wj* +\v 9 \wj I am the door. If anyone enters in by me, he will be saved, and will go in and go out and will find pasture. \wj* +\v 10 \wj The thief only comes to steal, kill, and destroy. I came that they may have life, and may have it abundantly. \wj* +\p +\v 11 \wj “I am the good shepherd.\wj*\x + \xo 10:11 \xt Isaiah 40:11; Ezekiel 34:11-12,15,22\x* \wj The good shepherd lays down his life for the sheep. \wj* +\v 12 \wj He who is a hired hand, and not a shepherd, who doesn’t own the sheep, sees the wolf coming, leaves the sheep, and flees. The wolf snatches the sheep and scatters them. \wj* +\v 13 \wj The hired hand flees because he is a hired hand and doesn’t care for the sheep. \wj* +\v 14 \wj I am the good shepherd. I know my own, and I’m known by my own; \wj* +\v 15 \wj even as the Father knows me, and I know the Father. I lay down my life for the sheep. \wj* +\v 16 \wj I have other sheep which are not of this fold.\wj*\x + \xo 10:16 \xt Isaiah 56:8 \x* \wj I must bring them also, and they will hear my voice. They will become one flock with one shepherd. \wj* +\v 17 \wj Therefore the Father loves me, because I lay down my life, \wj*\x + \xo 10:17 \xt Isaiah 53:7-8\x* \wj that I may take it again. \wj* +\v 18 \wj No one takes it away from me, but I lay it down by myself. I have power to lay it down, and I have power to take it again. I received this commandment from my Father.”\wj* +\p +\v 19 Therefore a division arose again among the Jews because of these words. +\v 20 Many of them said, “He has a demon and is insane! Why do you listen to him?” +\v 21 Others said, “These are not the sayings of one possessed by a demon. It isn’t possible for a demon to open the eyes of the blind, is it?”\x + \xo 10:21 \xt Exodus 4:11\x* +\p +\v 22 It was the Feast of the Dedication\f + \fr 10:22 \ft The “Feast of the Dedication” is the Greek name for “Hanukkah”, a celebration of the rededication of the Temple.\f* at Jerusalem. +\v 23 It was winter, and Jesus was walking in the temple, in Solomon’s porch. +\v 24 The Jews therefore came around him and said to him, “How long will you hold us in suspense? If you are the Christ, tell us plainly.” +\p +\v 25 Jesus answered them, \wj “I told you, and you don’t believe. The works that I do in my Father’s name, these testify about me. \wj* +\v 26 \wj But you don’t believe, because you are not of my sheep, as I told you. \wj* +\v 27 \wj My sheep hear my voice, and I know them, and they follow me. \wj* +\v 28 \wj I give eternal life to them. They will never perish, and no one will snatch them out of my hand. \wj* +\v 29 \wj My Father who has given them to me is greater than all. No one is able to snatch them out of my Father’s hand. \wj* +\v 30 \wj I and the Father are one.”\wj* +\p +\v 31 Therefore the Jews took up stones again to stone him. +\v 32 Jesus answered them, \wj “I have shown you many good works from my Father. For which of those works do you stone me?”\wj* +\p +\v 33 The Jews answered him, “We don’t stone you for a good work, but for blasphemy, because you, being a man, make yourself God.” +\p +\v 34 Jesus answered them, \wj “Isn’t it written in your law, ‘I said, you are gods?’\wj*\x + \xo 10:34 \xt Psalm 82:6\x* +\v 35 \wj If he called them gods, to whom the word of God came (and the Scripture can’t be broken), \wj* +\v 36 \wj do you say of him whom the Father sanctified and sent into the world, ‘You blaspheme,’ because I said, ‘I am the Son of God?’ \wj* +\v 37 \wj If I don’t do the works of my Father, don’t believe me. \wj* +\v 38 \wj But if I do them, though you don’t believe me, believe the works, that you may know and believe that the Father is in me, and I in the Father.” \wj* +\p +\v 39 They sought again to seize him, and he went out of their hand. +\v 40 He went away again beyond the Jordan into the place where John was baptizing at first, and he stayed there. +\v 41 Many came to him. They said, “John indeed did no sign, but everything that John said about this man is true.” +\v 42 Many believed in him there. +\c 11 +\p +\v 1 Now a certain man was sick, Lazarus from Bethany, of the village of Mary and her sister, Martha. +\v 2 It was that Mary who had anointed the Lord with ointment and wiped his feet with her hair, whose brother Lazarus was sick. +\v 3 The sisters therefore sent to him, saying, “Lord, behold, he for whom you have great affection is sick.” +\p +\v 4 But when Jesus heard it, he said, \wj “This sickness is not to death, but for the glory of God, that God’s Son may be glorified by it.”\wj* +\v 5 Now Jesus loved Martha, and her sister, and Lazarus. +\v 6 When therefore he heard that he was sick, he stayed two days in the place where he was. +\v 7 Then after this he said to the disciples, \wj “Let’s go into Judea again.”\wj* +\p +\v 8 The disciples asked him, “Rabbi, the Jews were just trying to stone you. Are you going there again?” +\p +\v 9 Jesus answered, \wj “Aren’t there twelve hours of daylight? If a man walks in the day, he doesn’t stumble, because he sees the light of this world. \wj* +\v 10 \wj But if a man walks in the night, he stumbles, because the light isn’t in him.”\wj* +\v 11 He said these things, and after that, he said to them, \wj “Our friend Lazarus has fallen asleep, but I am going so that I may awake him out of sleep.”\wj* +\p +\v 12 The disciples therefore said, “Lord, if he has fallen asleep, he will recover.” +\p +\v 13 Now Jesus had spoken of his death, but they thought that he spoke of taking rest in sleep. +\v 14 So Jesus said to them plainly then, \wj “Lazarus is dead. \wj* +\v 15 \wj I am glad for your sakes that I was not there, so that you may believe. Nevertheless, let’s go to him.”\wj* +\p +\v 16 Thomas therefore, who is called Didymus,\f + \fr 11:16 \ft “Didymus” means “Twin”.\f* said to his fellow disciples, “Let’s also go, that we may die with him.” +\p +\v 17 So when Jesus came, he found that he had been in the tomb four days already. +\v 18 Now Bethany was near Jerusalem, about fifteen stadia\f + \fr 11:18 \ft 15 stadia is about 2.8 kilometers or 1.7 miles\f* away. +\v 19 Many of the Jews had joined the women around Martha and Mary, to console them concerning their brother. +\v 20 Then when Martha heard that Jesus was coming, she went and met him, but Mary stayed in the house. +\v 21 Therefore Martha said to Jesus, “Lord, if you would have been here, my brother wouldn’t have died. +\v 22 Even now I know that whatever you ask of God, God will give you.” +\p +\v 23 Jesus said to her, \wj “Your brother will rise again.”\wj* +\p +\v 24 Martha said to him, “I know that he will rise again in the resurrection at the last day.” +\p +\v 25 Jesus said to her, \wj “I am the resurrection and the life. He who believes in me will still live, even if he dies. \wj* +\v 26 \wj Whoever lives and believes in me will never die. Do you believe this?”\wj* +\p +\v 27 She said to him, “Yes, Lord. I have come to believe that you are the Christ, God’s Son, he who comes into the world.” +\p +\v 28 When she had said this, she went away and called Mary, her sister, secretly, saying, “The Teacher is here and is calling you.” +\p +\v 29 When she heard this, she arose quickly and went to him. +\v 30 Now Jesus had not yet come into the village, but was in the place where Martha met him. +\v 31 Then the Jews who were with her in the house and were consoling her, when they saw Mary, that she rose up quickly and went out, followed her, saying, “She is going to the tomb to weep there.” +\p +\v 32 Therefore when Mary came to where Jesus was and saw him, she fell down at his feet, saying to him, “Lord, if you would have been here, my brother wouldn’t have died.” +\p +\v 33 When Jesus therefore saw her weeping, and the Jews weeping who came with her, he groaned in the spirit and was troubled, +\v 34 and said, \wj “Where have you laid him?”\wj* +\p They told him, “Lord, come and see.” +\p +\v 35 Jesus wept. +\p +\v 36 The Jews therefore said, “See how much affection he had for him!” +\v 37 Some of them said, “Couldn’t this man, who opened the eyes of him who was blind, have also kept this man from dying?” +\p +\v 38 Jesus therefore, again groaning in himself, came to the tomb. Now it was a cave, and a stone lay against it. +\v 39 Jesus said, \wj “Take away the stone.”\wj* +\p Martha, the sister of him who was dead, said to him, “Lord, by this time there is a stench, for he has been dead four days.” +\p +\v 40 Jesus said to her, \wj “Didn’t I tell you that if you believed, you would see God’s glory?”\wj* +\p +\v 41 So they took away the stone from the place where the dead man was lying.\f + \fr 11:41 \ft NU omits “from the place where the dead man was lying.”\f* Jesus lifted up his eyes and said, \wj “Father, I thank you that you listened to me. \wj* +\v 42 \wj I know that you always listen to me, but because of the multitude standing around I said this, that they may believe that you sent me.” \wj* +\v 43 When he had said this, he cried with a loud voice, \wj “Lazarus, come out!”\wj* +\p +\v 44 He who was dead came out, bound hand and foot with wrappings, and his face was wrapped around with a cloth. +\p Jesus said to them, \wj “Free him, and let him go.”\wj* +\p +\v 45 Therefore many of the Jews who came to Mary and saw what Jesus did believed in him. +\v 46 But some of them went away to the Pharisees and told them the things which Jesus had done. +\v 47 The chief priests therefore and the Pharisees gathered a council, and said, “What are we doing? For this man does many signs. +\v 48 If we leave him alone like this, everyone will believe in him, and the Romans will come and take away both our place and our nation.” +\p +\v 49 But a certain one of them, Caiaphas, being high priest that year, said to them, “You know nothing at all, +\v 50 nor do you consider that it is advantageous for us that one man should die for the people, and that the whole nation not perish.” +\v 51 Now he didn’t say this of himself, but being high priest that year, he prophesied that Jesus would die for the nation, +\v 52 and not for the nation only, but that he might also gather together into one the children of God who are scattered abroad. +\v 53 So from that day forward they took counsel that they might put him to death. +\v 54 Jesus therefore walked no more openly among the Jews, but departed from there into the country near the wilderness, to a city called Ephraim. He stayed there with his disciples. +\p +\v 55 Now the Passover of the Jews was at hand. Many went up from the country to Jerusalem before the Passover, to purify themselves. +\v 56 Then they sought for Jesus and spoke with one another as they stood in the temple, “What do you think—that he isn’t coming to the feast at all?” +\v 57 Now the chief priests and the Pharisees had commanded that if anyone knew where he was, he should report it, that they might seize him. +\c 12 + +\p +\v 1 Then, six days before the Passover, Jesus came to Bethany, where Lazarus was, who had been dead, whom he raised from the dead. +\v 2 So they made him a supper there. Martha served, but Lazarus was one of those who sat at the table with him. +\v 3 Therefore Mary took a pound\f + \fr 12:3 \ft a Roman pound of 12 ounces, or about 340 grams\f* of ointment of pure nard, very precious, and anointed Jesus’ feet and wiped his feet with her hair. The house was filled with the fragrance of the ointment. +\p +\v 4 Then Judas Iscariot, Simon’s son, one of his disciples, who would betray him, said, +\v 5 “Why wasn’t this ointment sold for three hundred denarii\f + \fr 12:5 \ft 300 denarii was about a year’s wages for an agricultural laborer.\f* and given to the poor?” +\v 6 Now he said this, not because he cared for the poor, but because he was a thief, and having the money box, used to steal what was put into it. +\p +\v 7 But Jesus said, \wj “Leave her alone. She has kept this for the day of my burial. \wj* +\v 8 \wj For you always have the poor with you, but you don’t always have me.”\wj* +\p +\v 9 A large crowd therefore of the Jews learned that he was there; and they came, not for Jesus’ sake only, but that they might see Lazarus also, whom he had raised from the dead. +\v 10 But the chief priests conspired to put Lazarus to death also, +\v 11 because on account of him many of the Jews went away and believed in Jesus. +\p +\v 12 On the next day a great multitude had come to the feast. When they heard that Jesus was coming to Jerusalem, +\v 13 they took the branches of the palm trees and went out to meet him, and cried out, “Hosanna!\f + \fr 12:13 \ft “Hosanna” means “save us” or “help us, we pray”.\f* Blessed is he who comes in the name of the Lord,\x + \xo 12:13 \xt Psalm 118:25-26 \x* the King of Israel!” +\p +\v 14 Jesus, having found a young donkey, sat on it. As it is written, +\v 15 “Don’t be afraid, daughter of Zion. Behold, your King comes, sitting on a donkey’s colt.”\x + \xo 12:15 \xt Zechariah 9:9\x* +\v 16 His disciples didn’t understand these things at first, but when Jesus was glorified, then they remembered that these things were written about him, and that they had done these things to him. +\v 17 The multitude therefore that was with him when he called Lazarus out of the tomb and raised him from the dead was testifying about it. +\v 18 For this cause also the multitude went and met him, because they heard that he had done this sign. +\v 19 The Pharisees therefore said among themselves, “See how you accomplish nothing. Behold, the world has gone after him.” +\p +\v 20 Now there were certain Greeks among those who went up to worship at the feast. +\v 21 Therefore, these came to Philip, who was from Bethsaida of Galilee, and asked him, saying, “Sir, we want to see Jesus.” +\v 22 Philip came and told Andrew, and in turn, Andrew came with Philip, and they told Jesus. +\p +\v 23 Jesus answered them, \wj “The time has come for the Son of Man to be glorified. \wj* +\v 24 \wj Most certainly I tell you, unless a grain of wheat falls into the earth and dies, it remains by itself alone. But if it dies, it bears much fruit. \wj* +\v 25 \wj He who loves his life will lose it. He who hates his life in this world will keep it to eternal life. \wj* +\v 26 \wj If anyone serves me, let him follow me. Where I am, there my servant will also be. If anyone serves me, the Father will honor him.\wj* +\p +\v 27 \wj “Now my soul is troubled. What shall I say? ‘Father, save me from this time?’ But I came to this time for this cause. \wj* +\v 28 \wj Father, glorify your name!”\wj* +\p Then a voice came out of the sky, saying, “I have both glorified it and will glorify it again.” +\p +\v 29 Therefore the multitude who stood by and heard it said that it had thundered. Others said, “An angel has spoken to him.” +\p +\v 30 Jesus answered, \wj “This voice hasn’t come for my sake, but for your sakes. \wj* +\v 31 \wj Now is the judgment of this world. Now the prince of this world will be cast out. \wj* +\v 32 \wj And I, if I am lifted up from the earth, will draw all people to myself.”\wj* +\v 33 But he said this, signifying by what kind of death he should die. +\p +\v 34 The multitude answered him, “We have heard out of the law that the Christ remains forever.\x + \xo 12:34 \xt Isaiah 9:7; Daniel 2:44; See Isaiah 53:8\x* How do you say, \wj ‘The Son of Man must be lifted up?’\wj* Who is this Son of Man?” +\p +\v 35 Jesus therefore said to them, \wj “Yet a little while the light is with you. Walk while you have the light, that darkness doesn’t overtake you. He who walks in the darkness doesn’t know where he is going. \wj* +\v 36 \wj While you have the light, believe in the light, that you may become children of light.”\wj* Jesus said these things, and he departed and hid himself from them. +\v 37 But though he had done so many signs before them, yet they didn’t believe in him, +\v 38 that the word of Isaiah the prophet might be fulfilled, which he spoke: +\q1 “Lord, who has believed our report? +\q2 To whom has the arm of the Lord been revealed?”\x + \xo 12:38 \xt Isaiah 53:1\x* +\p +\v 39 For this cause they couldn’t believe, for Isaiah said again: +\q1 +\v 40 “He has blinded their eyes and he hardened their heart, +\q2 lest they should see with their eyes, +\q2 and perceive with their heart, +\q2 and would turn, +\q2 and I would heal them.”\x + \xo 12:40 \xt Isaiah 6:10\x* +\p +\v 41 Isaiah said these things when he saw his glory, and spoke of him. \x + \xo 12:41 \xt Isaiah 6:1\x* +\v 42 Nevertheless, even many of the rulers believed in him, but because of the Pharisees they didn’t confess it, so that they wouldn’t be put out of the synagogue, +\v 43 for they loved men’s praise more than God’s praise. +\p +\v 44 Jesus cried out and said, \wj “Whoever believes in me, believes not in me, but in him who sent me. \wj* +\v 45 \wj He who sees me sees him who sent me. \wj* +\v 46 \wj I have come as a light into the world, that whoever believes in me may not remain in the darkness. \wj* +\v 47 \wj If anyone listens to my sayings and doesn’t believe, I don’t judge him. For I came not to judge the world, but to save the world. \wj* +\v 48 \wj He who rejects me, and doesn’t receive my sayings, has one who judges him. The word that I spoke will judge him in the last day. \wj* +\v 49 \wj For I spoke not from myself, but the Father who sent me gave me a commandment, what I should say and what I should speak. \wj* +\v 50 \wj I know that his commandment is eternal life. The things therefore which I speak, even as the Father has said to me, so I speak.”\wj* +\c 13 +\p +\v 1 Now before the feast of the Passover, Jesus, knowing that his time had come that he would depart from this world to the Father, having loved his own who were in the world, he loved them to the end. +\v 2 During supper, the devil having already put into the heart of Judas Iscariot, Simon’s son, to betray him, +\v 3 Jesus, knowing that the Father had given all things into his hands, and that he came from God and was going to God, +\v 4 arose from supper, and laid aside his outer garments. He took a towel and wrapped a towel around his waist. +\v 5 Then he poured water into the basin, and began to wash the disciples’ feet and to wipe them with the towel that was wrapped around him. +\v 6 Then he came to Simon Peter. He said to him, “Lord, do you wash my feet?” +\p +\v 7 Jesus answered him, \wj “You don’t know what I am doing now, but you will understand later.”\wj* +\p +\v 8 Peter said to him, “You will never wash my feet!” +\p Jesus answered him, \wj “If I don’t wash you, you have no part with me.” \wj* +\p +\v 9 Simon Peter said to him, “Lord, not my feet only, but also my hands and my head!” +\p +\v 10 Jesus said to him, \wj “Someone who has bathed only needs to have his feet washed, but is completely clean. You are clean, but not all of you.” \wj* +\v 11 For he knew him who would betray him; therefore he said, \wj “You are not all clean.”\wj* +\v 12 So when he had washed their feet, put his outer garment back on, and sat down again, he said to them, \wj “Do you know what I have done to you? \wj* +\v 13 \wj You call me, ‘Teacher’ and ‘Lord.’ You say so correctly, for so I am. \wj* +\v 14 \wj If I then, the Lord and the Teacher, have washed your feet, you also ought to wash one another’s feet. \wj* +\v 15 \wj For I have given you an example, that you should also do as I have done to you. \wj* +\v 16 \wj Most certainly I tell you, a servant is not greater than his lord, neither is one who is sent greater than he who sent him. \wj* +\v 17 \wj If you know these things, blessed are you if you do them. \wj* +\v 18 \wj I don’t speak concerning all of you. I know whom I have chosen; but that the Scripture may be fulfilled, ‘He who eats bread with me has lifted up his heel against me.’\wj*\x + \xo 13:18 \xt Psalm 41:9\x* +\v 19 \wj From now on, I tell you before it happens, that when it happens, you may believe that I am he. \wj* +\v 20 \wj Most certainly I tell you, he who receives whomever I send, receives me; and he who receives me, receives him who sent me.”\wj* +\p +\v 21 When Jesus had said this, he was troubled in spirit, and testified, \wj “Most certainly I tell you that one of you will betray me.”\wj* +\p +\v 22 The disciples looked at one another, perplexed about whom he spoke. +\v 23 One of his disciples, whom Jesus loved, was at the table, leaning against Jesus’ breast. +\v 24 Simon Peter therefore beckoned to him, and said to him, “Tell us who it is of whom he speaks.” +\p +\v 25 He, leaning back, as he was, on Jesus’ breast, asked him, “Lord, who is it?” +\p +\v 26 Jesus therefore answered, \wj “It is he to whom I will give this piece of bread when I have dipped it.”\wj* So when he had dipped the piece of bread, he gave it to Judas, the son of Simon Iscariot. +\v 27 After the piece of bread, then Satan entered into him. +\p Then Jesus said to him, \wj “What you do, do quickly.”\wj* +\p +\v 28 Now nobody at the table knew why he said this to him. +\v 29 For some thought, because Judas had the money box, that Jesus said to him, “Buy what things we need for the feast,” or that he should give something to the poor. +\v 30 Therefore having received that morsel, he went out immediately. It was night. +\p +\v 31 When he had gone out, Jesus said, \wj “Now the Son of Man has been glorified, and God has been glorified in him. \wj* +\v 32 \wj If God has been glorified in him, God will also glorify him in himself, and he will glorify him immediately. \wj* +\v 33 \wj Little children, I will be with you a little while longer. You will seek me, and as I said to the Jews, ‘Where I am going, you can’t come,’ so now I tell you. \wj* +\v 34 \wj A new commandment I give to you, that you love one another. Just as I have loved you, you also love one another. \wj* +\v 35 \wj By this everyone will know that you are my disciples, if you have love for one another.”\wj* +\p +\v 36 Simon Peter said to him, “Lord, where are you going?” +\p Jesus answered, \wj “Where I am going, you can’t follow now, but you will follow afterwards.”\wj* +\p +\v 37 Peter said to him, “Lord, why can’t I follow you now? I will lay down my life for you.” +\p +\v 38 Jesus answered him, \wj “Will you lay down your life for me? Most certainly I tell you, the rooster won’t crow until you have denied me three times.\wj* +\c 14 +\p +\v 1 \wj “Don’t let your heart be troubled. Believe in God. Believe also in me. \wj* +\v 2 \wj In my Father’s house are many homes. If it weren’t so, I would have told you. I am going to prepare a place for you. \wj* +\v 3 \wj If I go and prepare a place for you, I will come again and will receive you to myself; that where I am, you may be there also. \wj* +\v 4 \wj You know where I go, and you know the way.”\wj* +\p +\v 5 Thomas said to him, “Lord, we don’t know where you are going. How can we know the way?” +\p +\v 6 Jesus said to him, \wj “I am the way, the truth, and the life. No one comes to the Father, except through me. \wj* +\v 7 \wj If you had known me, you would have known my Father also. From now on, you know him and have seen him.”\wj* +\p +\v 8 Philip said to him, “Lord, show us the Father, and that will be enough for us.” +\p +\v 9 Jesus said to him, \wj “Have I been with you such a long time, and do you not know me, Philip? He who has seen me has seen the Father. How do you say, ‘Show us the Father?’ \wj* +\v 10 \wj Don’t you believe that I am in the Father, and the Father in me? The words that I tell you, I speak not from myself; but the Father who lives in me does his works. \wj* +\v 11 \wj Believe me that I am in the Father, and the Father in me; or else believe me for the very works’ sake. \wj* +\v 12 \wj Most certainly I tell you, he who believes in me, the works that I do, he will do also; and he will do greater works than these, because I am going to my Father. \wj* +\v 13 \wj Whatever you will ask in my name, I will do it, that the Father may be glorified in the Son. \wj* +\v 14 \wj If you will ask anything in my name, I will do it. \wj* +\v 15 \wj If you love me, keep my commandments. \wj* +\v 16 \wj I will pray to the Father, and he will give you another Counselor, \wj*\f + \fr 14:16 \ft Greek παρακλητον: Counselor, Helper, Intercessor, Advocate, and Comforter.\f* \wj that he may be with you forever:\wj* +\v 17 \wj the Spirit of truth, whom the world can’t receive, for it doesn’t see him and doesn’t know him. You know him, for he lives with you and will be in you. \wj* +\v 18 \wj I will not leave you orphans. I will come to you. \wj* +\v 19 \wj Yet a little while, and the world will see me no more; but you will see me. Because I live, you will live also. \wj* +\v 20 \wj In that day you will know that I am in my Father, and you in me, and I in you. \wj* +\v 21 \wj One who has my commandments and keeps them, that person is one who loves me. One who loves me will be loved by my Father, and I will love him, and will reveal myself to him.”\wj* +\p +\v 22 Judas (not Iscariot) said to him, “Lord, what has happened that you are about to reveal yourself to us, and not to the world?” +\p +\v 23 Jesus answered him, \wj “If a man loves me, he will keep my word. My Father will love him, and we will come to him and make our home with him. \wj* +\v 24 \wj He who doesn’t love me doesn’t keep my words. The word which you hear isn’t mine, but the Father’s who sent me. \wj* +\p +\v 25 \wj “I have said these things to you while still living with you. \wj* +\v 26 \wj But the Counselor, the Holy Spirit, whom the Father will send in my name, will teach you all things, and will remind you of all that I said to you. \wj* +\v 27 \wj Peace I leave with you. My peace I give to you; not as the world gives, I give to you. Don’t let your heart be troubled, neither let it be fearful. \wj* +\v 28 \wj You heard how I told you, ‘I am going away, and I will come back to you.’ If you loved me, you would have rejoiced because I said ‘I am going to my Father;’ for the Father is greater than I. \wj* +\v 29 \wj Now I have told you before it happens so that when it happens, you may believe. \wj* +\v 30 \wj I will no more speak much with you, for the prince of the world comes, and he has nothing in me. \wj* +\v 31 \wj But that the world may know that I love the Father, and as the Father commanded me, even so I do. Arise, let’s go from here.\wj* +\c 15 +\p +\v 1 \wj “I am the true vine, and my Father is the farmer. \wj* +\v 2 \wj Every branch in me that doesn’t bear fruit, he takes away. Every branch that bears fruit, he prunes, that it may bear more fruit. \wj* +\v 3 \wj You are already pruned clean because of the word which I have spoken to you. \wj* +\v 4 \wj Remain in me, and I in you. As the branch can’t bear fruit by itself unless it remains in the vine, so neither can you, unless you remain in me. \wj* +\v 5 \wj I am the vine. You are the branches. He who remains in me and I in him bears much fruit, for apart from me you can do nothing. \wj* +\v 6 \wj If a man doesn’t remain in me, he is thrown out as a branch and is withered; and they gather them, throw them into the fire, and they are burned. \wj* +\v 7 \wj If you remain in me, and my words remain in you, you will ask whatever you desire, and it will be done for you.\wj* +\p +\v 8 \wj “In this my Father is glorified, that you bear much fruit; and so you will be my disciples. \wj* +\v 9 \wj Even as the Father has loved me, I also have loved you. Remain in my love. \wj* +\v 10 \wj If you keep my commandments, you will remain in my love, even as I have kept my Father’s commandments and remain in his love. \wj* +\v 11 \wj I have spoken these things to you, that my joy may remain in you, and that your joy may be made full.\wj* +\p +\v 12 \wj “This is my commandment, that you love one another, even as I have loved you. \wj* +\v 13 \wj Greater love has no one than this, that someone lay down his life for his friends. \wj* +\v 14 \wj You are my friends if you do whatever I command you. \wj* +\v 15 \wj No longer do I call you servants, for the servant doesn’t know what his lord does. But I have called you friends, for everything that I heard from my Father, I have made known to you. \wj* +\v 16 \wj You didn’t choose me, but I chose you and appointed you, that you should go and bear fruit, and that your fruit should remain; that whatever you will ask of the Father in my name, he may give it to you.\wj* +\p +\v 17 \wj “I command these things to you, that you may love one another. \wj* +\v 18 \wj If the world hates you, you know that it has hated me before it hated you. \wj* +\v 19 \wj If you were of the world, the world would love its own. But because you are not of the world, since I chose you out of the world, therefore the world hates you. \wj* +\v 20 \wj Remember the word that I said to you: ‘A servant is not greater than his lord.’\wj*\x + \xo 15:20 \xt John 13:16\x* \wj If they persecuted me, they will also persecute you. If they kept my word, they will also keep yours. \wj* +\v 21 \wj But they will do all these things to you for my name’s sake, because they don’t know him who sent me. \wj* +\v 22 \wj If I had not come and spoken to them, they would not have had sin; but now they have no excuse for their sin. \wj* +\v 23 \wj He who hates me, hates my Father also. \wj* +\v 24 \wj If I hadn’t done among them the works which no one else did, they wouldn’t have had sin. But now they have seen and also hated both me and my Father. \wj* +\v 25 \wj But this happened so that the word may be fulfilled which was written in their law, ‘They hated me without a cause.’\wj*\x + \xo 15:25 \xt Psalm 35:19; 69:4\x* +\p +\v 26 \wj “When the Counselor\wj*\f + \fr 15:26 \ft Greek Parakletos: Counselor, Helper, Advocate, Intercessor, and Comforter.\f* \wj has come, whom I will send to you from the Father, the Spirit of truth, who proceeds from the Father, he will testify about me. \wj* +\v 27 \wj You will also testify, because you have been with me from the beginning.\wj* +\c 16 +\p +\v 1 \wj “I have said these things to you so that you wouldn’t be caused to stumble. \wj* +\v 2 \wj They will put you out of the synagogues. Yes, the time is coming that whoever kills you will think that he offers service to God. \wj* +\v 3 \wj They will do these things\wj*\f + \fr 16:3 \ft TR adds “to you”\f* \wj because they have not known the Father nor me. \wj* +\v 4 \wj But I have told you these things so that when the time comes, you may remember that I told you about them. I didn’t tell you these things from the beginning, because I was with you. \wj* +\v 5 \wj But now I am going to him who sent me, and none of you asks me, ‘Where are you going?’ \wj* +\v 6 \wj But because I have told you these things, sorrow has filled your heart. \wj* +\v 7 \wj Nevertheless I tell you the truth: It is to your advantage that I go away; for if I don’t go away, the Counselor won’t come to you. But if I go, I will send him to you. \wj* +\v 8 \wj When he has come, he will convict the world about sin, about righteousness, and about judgment; \wj* +\v 9 \wj about sin, because they don’t believe in me; \wj* +\v 10 \wj about righteousness, because I am going to my Father, and you won’t see me any more; \wj* +\v 11 \wj about judgment, because the prince of this world has been judged. \wj* +\p +\v 12 \wj “I still have many things to tell you, but you can’t bear them now. \wj* +\v 13 \wj However, when he, the Spirit of truth, has come, he will guide you into all truth, for he will not speak from himself; but whatever he hears, he will speak. He will declare to you things that are coming. \wj* +\v 14 \wj He will glorify me, for he will take from what is mine and will declare it to you. \wj* +\v 15 \wj All things that the Father has are mine; therefore I said that he takes\wj*\f + \fr 16:15 \ft TR reads “will take” instead of “takes”\f* \wj of mine and will declare it to you. \wj* +\p +\v 16 \wj “A little while, and you will not see me. Again a little while, and you will see me.”\wj* +\p +\v 17 Some of his disciples therefore said to one another, “What is this that he says to us, \wj ‘A little while, and you won’t see me, and again a little while, and you will see me;’\wj* and, \wj ‘Because I go to the Father’\wj*?” +\v 18 They said therefore, “What is this that he says, \wj ‘A little while’\wj*? We don’t know what he is saying.” +\p +\v 19 Therefore Jesus perceived that they wanted to ask him, and he said to them, \wj “Do you inquire among yourselves concerning this, that I said, ‘A little while, and you won’t see me, and again a little while, and you will see me?’ \wj* +\v 20 \wj Most certainly I tell you that you will weep and lament, but the world will rejoice. You will be sorrowful, but your sorrow will be turned into joy. \wj* +\v 21 \wj A woman, when she gives birth, has sorrow because her time has come. But when she has delivered the child, she doesn’t remember the anguish any more, for the joy that a human being is born into the world. \wj* +\v 22 \wj Therefore you now have sorrow, but I will see you again, and your heart will rejoice, and no one will take your joy away from you.\wj* +\p +\v 23 \wj “In that day you will ask me no questions. Most certainly I tell you, whatever you may ask of the Father in my name, he will give it to you. \wj* +\v 24 \wj Until now, you have asked nothing in my name. Ask, and you will receive, that your joy may be made full. \wj* +\p +\v 25 \wj “I have spoken these things to you in figures of speech. But the time is coming when I will no more speak to you in figures of speech, but will tell you plainly about the Father. \wj* +\v 26 \wj In that day you will ask in my name; and I don’t say to you that I will pray to the Father for you, \wj* +\v 27 \wj for the Father himself loves you, because you have loved me, and have believed that I came from God. \wj* +\v 28 \wj I came from the Father and have come into the world. Again, I leave the world and go to the Father.”\wj* +\p +\v 29 His disciples said to him, “Behold, now you are speaking plainly, and using no figures of speech. +\v 30 Now we know that you know all things, and don’t need for anyone to question you. By this we believe that you came from God.” +\p +\v 31 Jesus answered them, \wj “Do you now believe? \wj* +\v 32 \wj Behold, the time is coming, yes, and has now come, that you will be scattered, everyone to his own place, and you will leave me alone. Yet I am not alone, because the Father is with me. \wj* +\v 33 \wj I have told you these things, that in me you may have peace. In the world you have trouble; but cheer up! I have overcome the world.” \wj* +\c 17 +\p +\v 1 Jesus said these things, then lifting up his eyes to heaven, he said, \wj “Father, the time has come. Glorify your Son, that your Son may also glorify you; \wj* +\v 2 \wj even as you gave him authority over all flesh, so he will give eternal life to all whom you have given him. \wj* +\v 3 \wj This is eternal life, that they should know you, the only true God, and him whom you sent, Jesus Christ. \wj* +\v 4 \wj I glorified you on the earth. I have accomplished the work which you have given me to do. \wj* +\v 5 \wj Now, Father, glorify me with your own self with the glory which I had with you before the world existed. \wj* +\p +\v 6 \wj “I revealed your name to the people whom you have given me out of the world. They were yours, and you have given them to me. They have kept your word. \wj* +\v 7 \wj Now they have known that all things whatever you have given me are from you, \wj* +\v 8 \wj for the words which you have given me I have given to them; and they received them, and knew for sure that I came from you. They have believed that you sent me. \wj* +\v 9 \wj I pray for them. I don’t pray for the world, but for those whom you have given me, for they are yours. \wj* +\v 10 \wj All things that are mine are yours, and yours are mine, and I am glorified in them. \wj* +\v 11 \wj I am no more in the world, but these are in the world, and I am coming to you. Holy Father, keep them through your name which you have given me, that they may be one, even as we are. \wj* +\v 12 \wj While I was with them in the world, I kept them in your name. I have kept those whom you have given me. None of them is lost except the son of destruction, that the Scripture might be fulfilled. \wj* +\v 13 \wj But now I come to you, and I say these things in the world, that they may have my joy made full in themselves. \wj* +\v 14 \wj I have given them your word. The world hated them because they are not of the world, even as I am not of the world. \wj* +\v 15 \wj I pray not that you would take them from the world, but that you would keep them from the evil one. \wj* +\v 16 \wj They are not of the world, even as I am not of the world. \wj* +\v 17 \wj Sanctify them in your truth. Your word is truth.\wj*\x + \xo 17:17 \xt Psalm 119:142\x* +\v 18 \wj As you sent me into the world, even so I have sent them into the world. \wj* +\v 19 \wj For their sakes I sanctify myself, that they themselves also may be sanctified in truth. \wj* +\p +\v 20 \wj “Not for these only do I pray, but for those also who will believe in me through their word, \wj* +\v 21 \wj that they may all be one; even as you, Father, are in me, and I in you, that they also may be one in us; that the world may believe that you sent me. \wj* +\v 22 \wj The glory which you have given me, I have given to them, that they may be one, even as we are one, \wj* +\v 23 \wj I in them, and you in me, that they may be perfected into one, that the world may know that you sent me and loved them, even as you loved me. \wj* +\v 24 \wj Father, I desire that they also whom you have given me be with me where I am, that they may see my glory which you have given me, for you loved me before the foundation of the world. \wj* +\v 25 \wj Righteous Father, the world hasn’t known you, but I knew you; and these knew that you sent me. \wj* +\v 26 \wj I made known to them your name, and will make it known; that the love with which you loved me may be in them, and I in them.”\wj* +\c 18 +\p +\v 1 When Jesus had spoken these words, he went out with his disciples over the brook Kidron, where there was a garden, into which he and his disciples entered. +\v 2 Now Judas, who betrayed him, also knew the place, for Jesus often met there with his disciples. +\v 3 Judas then, having taken a detachment of soldiers and officers from the chief priests and the Pharisees, came there with lanterns, torches, and weapons. +\v 4 Jesus therefore, knowing all the things that were happening to him, went out and said to them, \wj “Who are you looking for?”\wj* +\p +\v 5 They answered him, “Jesus of Nazareth.” +\p Jesus said to them, \wj “I am he.”\wj* +\p Judas also, who betrayed him, was standing with them. +\v 6 When therefore he said to them, \wj “I am he,”\wj* they went backward and fell to the ground. +\p +\v 7 Again therefore he asked them, \wj “Who are you looking for?”\wj* +\p They said, “Jesus of Nazareth.” +\p +\v 8 Jesus answered, \wj “I told you that I am he. If therefore you seek me, let these go their way,”\wj* +\v 9 that the word might be fulfilled which he spoke, \wj “Of those whom you have given me, I have lost none.”\wj*\x + \xo 18:9 \xt John 6:39\x* +\p +\v 10 Simon Peter therefore, having a sword, drew it, struck the high priest’s servant, and cut off his right ear. The servant’s name was Malchus. +\v 11 Jesus therefore said to Peter, \wj “Put the sword into its sheath. The cup which the Father has given me, shall I not surely drink it?”\wj* +\p +\v 12 So the detachment, the commanding officer, and the officers of the Jews seized Jesus and bound him, +\v 13 and led him to Annas first, for he was father-in-law to Caiaphas, who was high priest that year. +\v 14 Now it was Caiaphas who advised the Jews that it was expedient that one man should perish for the people. +\p +\v 15 Simon Peter followed Jesus, as did another disciple. Now that disciple was known to the high priest, and entered in with Jesus into the court of the high priest; +\v 16 but Peter was standing at the door outside. So the other disciple, who was known to the high priest, went out and spoke to her who kept the door, and brought in Peter. +\v 17 Then the maid who kept the door said to Peter, “Are you also one of this man’s disciples?” +\p He said, “I am not.” +\p +\v 18 Now the servants and the officers were standing there, having made a fire of coals, for it was cold. They were warming themselves. Peter was with them, standing and warming himself. +\p +\v 19 The high priest therefore asked Jesus about his disciples and about his teaching. +\p +\v 20 Jesus answered him, \wj “I spoke openly to the world. I always taught in synagogues and in the temple, where the Jews always meet. I said nothing in secret. \wj* +\v 21 \wj Why do you ask me? Ask those who have heard me what I said to them. Behold, they know the things which I said.”\wj* +\p +\v 22 When he had said this, one of the officers standing by slapped Jesus with his hand, saying, “Do you answer the high priest like that?” +\p +\v 23 Jesus answered him, \wj “If I have spoken evil, testify of the evil; but if well, why do you beat me?”\wj* +\p +\v 24 Annas sent him bound to Caiaphas, the high priest. +\p +\v 25 Now Simon Peter was standing and warming himself. They said therefore to him, “You aren’t also one of his disciples, are you?” +\p He denied it and said, “I am not.” +\p +\v 26 One of the servants of the high priest, being a relative of him whose ear Peter had cut off, said, “Didn’t I see you in the garden with him?” +\p +\v 27 Peter therefore denied it again, and immediately the rooster crowed. +\p +\v 28 They led Jesus therefore from Caiaphas into the Praetorium. It was early, and they themselves didn’t enter into the Praetorium, that they might not be defiled, but might eat the Passover. +\v 29 Pilate therefore went out to them and said, “What accusation do you bring against this man?” +\p +\v 30 They answered him, “If this man weren’t an evildoer, we wouldn’t have delivered him up to you.” +\p +\v 31 Pilate therefore said to them, “Take him yourselves, and judge him according to your law.” +\p Therefore the Jews said to him, “It is illegal for us to put anyone to death,” +\v 32 that the word of Jesus might be fulfilled, which he spoke, signifying by what kind of death he should die. +\p +\v 33 Pilate therefore entered again into the Praetorium, called Jesus, and said to him, “Are you the King of the Jews?” +\p +\v 34 Jesus answered him, \wj “Do you say this by yourself, or did others tell you about me?”\wj* +\p +\v 35 Pilate answered, “I’m not a Jew, am I? Your own nation and the chief priests delivered you to me. What have you done?” +\p +\v 36 Jesus answered, \wj “My Kingdom is not of this world. If my Kingdom were of this world, then my servants would fight, that I wouldn’t be delivered to the Jews. But now my Kingdom is not from here.”\wj* +\p +\v 37 Pilate therefore said to him, “Are you a king then?” +\p Jesus answered, \wj “You say that I am a king. For this reason I have been born, and for this reason I have come into the world, that I should testify to the truth. Everyone who is of the truth listens to my voice.”\wj* +\p +\v 38 Pilate said to him, “What is truth?” +\p When he had said this, he went out again to the Jews, and said to them, “I find no basis for a charge against him. +\v 39 But you have a custom that I should release someone to you at the Passover. Therefore, do you want me to release to you the King of the Jews?” +\p +\v 40 Then they all shouted again, saying, “Not this man, but Barabbas!” Now Barabbas was a robber. +\c 19 +\p +\v 1 So Pilate then took Jesus and flogged him. +\v 2 The soldiers twisted thorns into a crown and put it on his head, and dressed him in a purple garment. +\v 3 They kept saying, “Hail, King of the Jews!” and they kept slapping him. +\p +\v 4 Then Pilate went out again, and said to them, “Behold, I bring him out to you, that you may know that I find no basis for a charge against him.” +\p +\v 5 Jesus therefore came out, wearing the crown of thorns and the purple garment. Pilate said to them, “Behold, the man!” +\p +\v 6 When therefore the chief priests and the officers saw him, they shouted, saying, “Crucify! Crucify!” +\p Pilate said to them, “Take him yourselves and crucify him, for I find no basis for a charge against him.” +\p +\v 7 The Jews answered him, “We have a law, and by our law he ought to die, because he made himself the Son of God.” +\p +\v 8 When therefore Pilate heard this saying, he was more afraid. +\v 9 He entered into the Praetorium again, and said to Jesus, “Where are you from?” But Jesus gave him no answer. +\v 10 Pilate therefore said to him, “Aren’t you speaking to me? Don’t you know that I have power to release you and have power to crucify you?” +\p +\v 11 Jesus answered, \wj “You would have no power at all against me, unless it were given to you from above. Therefore he who delivered me to you has greater sin.”\wj* +\p +\v 12 At this, Pilate was seeking to release him, but the Jews cried out, saying, “If you release this man, you aren’t Caesar’s friend! Everyone who makes himself a king speaks against Caesar!” +\p +\v 13 When Pilate therefore heard these words, he brought Jesus out and sat down on the judgment seat at a place called “The Pavement”, but in Hebrew, “Gabbatha.” +\v 14 Now it was the Preparation Day of the Passover, at about the sixth hour.\f + \fr 19:14 \ft “the sixth hour” would have been 6:00 a.m. according to the Roman timekeeping system, or noon for the Jewish timekeeping system in use, then. \f* He said to the Jews, “Behold, your King!” +\p +\v 15 They cried out, “Away with him! Away with him! Crucify him!” +\p Pilate said to them, “Shall I crucify your King?” +\p The chief priests answered, “We have no king but Caesar!” +\p +\v 16 So then he delivered him to them to be crucified. So they took Jesus and led him away. +\v 17 He went out, bearing his cross, to the place called “The Place of a Skull”, which is called in Hebrew, “Golgotha”, +\v 18 where they crucified him, and with him two others, on either side one, and Jesus in the middle. +\v 19 Pilate wrote a title also, and put it on the cross. There was written, “JESUS OF NAZARETH, THE KING OF THE JEWS.” +\v 20 Therefore many of the Jews read this title, for the place where Jesus was crucified was near the city; and it was written in Hebrew, in Latin, and in Greek. +\v 21 The chief priests of the Jews therefore said to Pilate, “Don’t write, ‘The King of the Jews,’ but, ‘he said, “I am King of the Jews.”’” +\p +\v 22 Pilate answered, “What I have written, I have written.” +\p +\v 23 Then the soldiers, when they had crucified Jesus, took his garments and made four parts, to every soldier a part; and also the tunic. Now the tunic was without seam, woven from the top throughout. +\v 24 Then they said to one another, “Let’s not tear it, but cast lots for it to decide whose it will be,” that the Scripture might be fulfilled, which says, +\q1 “They parted my garments among them. +\q2 They cast lots for my clothing.”\x + \xo 19:24 \xt Psalm 22:18\x* +\m Therefore the soldiers did these things. +\p +\v 25 But standing by Jesus’ cross were his mother, his mother’s sister, Mary the wife of Clopas, and Mary Magdalene. +\v 26 Therefore when Jesus saw his mother, and the disciple whom he loved standing there, he said to his mother, \wj “Woman, behold, your son!” \wj* +\v 27 Then he said to the disciple, \wj “Behold, your mother!”\wj* From that hour, the disciple took her to his own home. +\p +\v 28 After this, Jesus, seeing\f + \fr 19:28 \ft NU, TR read “knowing” instead of “seeing” \f* that all things were now finished, that the Scripture might be fulfilled, said, \wj “I am thirsty!”\wj* +\v 29 Now a vessel full of vinegar was set there; so they put a sponge full of the vinegar on hyssop, and held it at his mouth. +\v 30 When Jesus therefore had received the vinegar, he said, \wj “It is finished!”\wj* Then he bowed his head and gave up his spirit. +\p +\v 31 Therefore the Jews, because it was the Preparation Day, so that the bodies wouldn’t remain on the cross on the Sabbath (for that Sabbath was a special one), asked of Pilate that their legs might be broken and that they might be taken away. +\v 32 Therefore the soldiers came and broke the legs of the first and of the other who was crucified with him; +\v 33 but when they came to Jesus and saw that he was already dead, they didn’t break his legs. +\v 34 However, one of the soldiers pierced his side with a spear, and immediately blood and water came out. +\v 35 He who has seen has testified, and his testimony is true. He knows that he tells the truth, that you may believe. +\v 36 For these things happened that the Scripture might be fulfilled, “A bone of him will not be broken.”\x + \xo 19:36 \xt Exodus 12:46; Numbers 9:12; Psalm 34:20 \x* +\v 37 Again another Scripture says, “They will look on him whom they pierced.”\x + \xo 19:37 \xt Zechariah 12:10\x* +\p +\v 38 After these things, Joseph of Arimathaea, being a disciple of Jesus, but secretly for fear of the Jews, asked of Pilate that he might take away Jesus’ body. Pilate gave him permission. He came therefore and took away his body. +\v 39 Nicodemus, who at first came to Jesus by night, also came bringing a mixture of myrrh and aloes, about a hundred Roman pounds.\f + \fr 19:39 \ft 100 Roman pounds of 12 ounces each, or about 72 pounds, or 33 Kilograms.\f* +\v 40 So they took Jesus’ body, and bound it in linen cloths with the spices, as the custom of the Jews is to bury. +\v 41 Now in the place where he was crucified there was a garden. In the garden was a new tomb in which no man had ever yet been laid. +\v 42 Then, because of the Jews’ Preparation Day (for the tomb was near at hand), they laid Jesus there. +\c 20 +\p +\v 1 Now on the first day of the week, Mary Magdalene went early, while it was still dark, to the tomb, and saw that the stone had been taken away from the tomb. +\v 2 Therefore she ran and came to Simon Peter and to the other disciple whom Jesus loved, and said to them, “They have taken away the Lord out of the tomb, and we don’t know where they have laid him!” +\p +\v 3 Therefore Peter and the other disciple went out, and they went toward the tomb. +\v 4 They both ran together. The other disciple outran Peter and came to the tomb first. +\v 5 Stooping and looking in, he saw the linen cloths lying there; yet he didn’t enter in. +\v 6 Then Simon Peter came, following him, and entered into the tomb. He saw the linen cloths lying, +\v 7 and the cloth that had been on his head, not lying with the linen cloths, but rolled up in a place by itself. +\v 8 So then the other disciple who came first to the tomb also entered in, and he saw and believed. +\v 9 For as yet they didn’t know the Scripture, that he must rise from the dead. +\v 10 So the disciples went away again to their own homes. +\p +\v 11 But Mary was standing outside at the tomb weeping. So as she wept, she stooped and looked into the tomb, +\v 12 and she saw two angels in white sitting, one at the head and one at the feet, where the body of Jesus had lain. +\v 13 They asked her, “Woman, why are you weeping?” +\p She said to them, “Because they have taken away my Lord, and I don’t know where they have laid him.” +\v 14 When she had said this, she turned around and saw Jesus standing, and didn’t know that it was Jesus. +\p +\v 15 Jesus said to her, \wj “Woman, why are you weeping? Who are you looking for?”\wj* +\p She, supposing him to be the gardener, said to him, “Sir, if you have carried him away, tell me where you have laid him, and I will take him away.” +\p +\v 16 Jesus said to her, \wj “Mary.”\wj* +\p She turned and said to him, “Rabboni!”\f + \fr 20:16 \ft Rabboni is a transliteration of the Hebrew word for “great teacher.”\f* which is to say, “Teacher!”\f + \fr 20:16 \ft or, Master\f* +\p +\v 17 Jesus said to her, \wj “Don’t hold me, for I haven’t yet ascended to my Father; but go to my brothers and tell them, ‘I am ascending to my Father and your Father, to my God and your God.’”\wj* +\p +\v 18 Mary Magdalene came and told the disciples that she had seen the Lord, and that he had said these things to her. +\v 19 When therefore it was evening on that day, the first day of the week, and when the doors were locked where the disciples were assembled, for fear of the Jews, Jesus came and stood in the middle and said to them, \wj “Peace be to you.”\wj* +\p +\v 20 When he had said this, he showed them his hands and his side. The disciples therefore were glad when they saw the Lord. +\v 21 Jesus therefore said to them again, \wj “Peace be to you. As the Father has sent me, even so I send you.”\wj* +\v 22 When he had said this, he breathed on them, and said to them, \wj “Receive the Holy Spirit! \wj* +\v 23 \wj If you forgive anyone’s sins, they have been forgiven them. If you retain anyone’s sins, they have been retained.”\wj* +\p +\v 24 But Thomas, one of the twelve, called Didymus,\f + \fr 20:24 \ft or, Twin\f* wasn’t with them when Jesus came. +\v 25 The other disciples therefore said to him, “We have seen the Lord!” +\p But he said to them, “Unless I see in his hands the print of the nails, put my finger into the print of the nails, and put my hand into his side, I will not believe.” +\p +\v 26 After eight days, again his disciples were inside and Thomas was with them. Jesus came, the doors being locked, and stood in the middle, and said, \wj “Peace be to you.”\wj* +\v 27 Then he said to Thomas, \wj “Reach here your finger, and see my hands. Reach here your hand, and put it into my side. Don’t be unbelieving, but believing.”\wj* +\p +\v 28 Thomas answered him, “My Lord and my God!” +\p +\v 29 Jesus said to him, \wj “Because you have seen me,\wj*\f + \fr 20:29 \ft TR adds “Thomas,”\f* \wj you have believed. Blessed are those who have not seen and have believed.”\wj* +\p +\v 30 Therefore Jesus did many other signs in the presence of his disciples, which are not written in this book; +\v 31 but these are written that you may believe that Jesus is the Christ, the Son of God, and that believing you may have life in his name. +\c 21 +\p +\v 1 After these things, Jesus revealed himself again to the disciples at the sea of Tiberias. He revealed himself this way. +\v 2 Simon Peter, Thomas called Didymus,\f + \fr 21:2 \ft or, Twin\f* Nathanael of Cana in Galilee, and the sons of Zebedee, and two others of his disciples were together. +\v 3 Simon Peter said to them, “I’m going fishing.” +\p They told him, “We are also coming with you.” They immediately went out and entered into the boat. That night, they caught nothing. +\v 4 But when day had already come, Jesus stood on the beach; yet the disciples didn’t know that it was Jesus. +\v 5 Jesus therefore said to them, \wj “Children, have you anything to eat?” \wj* +\p They answered him, “No.” +\p +\v 6 He said to them, \wj “Cast the net on the right side of the boat, and you will find some.”\wj* +\p They cast it therefore, and now they weren’t able to draw it in for the multitude of fish. +\v 7 That disciple therefore whom Jesus loved said to Peter, “It’s the Lord!” +\p So when Simon Peter heard that it was the Lord, he wrapped his coat around himself (for he was naked), and threw himself into the sea. +\v 8 But the other disciples came in the little boat (for they were not far from the land, but about two hundred cubits\f + \fr 21:8 \ft 200 cubits is about 100 yards or about 91 meters\f* away), dragging the net full of fish. +\v 9 So when they got out on the land, they saw a fire of coals there, with fish and bread laid on it. +\v 10 Jesus said to them, \wj “Bring some of the fish which you have just caught.”\wj* +\p +\v 11 Simon Peter went up, and drew the net to land, full of one hundred fifty-three great fish. Even though there were so many, the net wasn’t torn. +\p +\v 12 Jesus said to them, \wj “Come and eat breakfast!”\wj* +\p None of the disciples dared inquire of him, “Who are you?” knowing that it was the Lord. +\p +\v 13 Then Jesus came and took the bread, gave it to them, and the fish likewise. +\v 14 This is now the third time that Jesus was revealed to his disciples after he had risen from the dead. +\v 15 So when they had eaten their breakfast, Jesus said to Simon Peter, \wj “Simon, son of Jonah, do you love me more than these?”\wj* +\p He said to him, “Yes, Lord; you know that I have affection for you.” +\p He said to him, \wj “Feed my lambs.”\wj* +\v 16 He said to him again a second time, \wj “Simon, son of Jonah, do you love me?”\wj* +\p He said to him, “Yes, Lord; you know that I have affection for you.” +\p He said to him, \wj “Tend my sheep.”\wj* +\v 17 He said to him the third time, \wj “Simon, son of Jonah, do you have affection for me?”\wj* +\p Peter was grieved because he asked him the third time, \wj “Do you have affection for me?”\wj* He said to him, “Lord, you know everything. You know that I have affection for you.” +\p Jesus said to him, \wj “Feed my sheep. \wj* +\v 18 \wj Most certainly I tell you, when you were young, you dressed yourself and walked where you wanted to. But when you are old, you will stretch out your hands, and another will dress you and carry you where you don’t want to go.”\wj* +\p +\v 19 Now he said this, signifying by what kind of death he would glorify God. When he had said this, he said to him, \wj “Follow me.”\wj* +\p +\v 20 Then Peter, turning around, saw a disciple following. This was the disciple whom Jesus loved, the one who had also leaned on Jesus’ breast at the supper and asked, “Lord, who is going to betray you?” +\v 21 Peter, seeing him, said to Jesus, “Lord, what about this man?” +\p +\v 22 Jesus said to him, \wj “If I desire that he stay until I come, what is that to you? You follow me.”\wj* +\v 23 This saying therefore went out among the brothers\f + \fr 21:23 \ft The word for “brothers” here may be also correctly translated “brothers and sisters” or “siblings.”\f* that this disciple wouldn’t die. Yet Jesus didn’t say to him that he wouldn’t die, but, \wj “If I desire that he stay until I come, what is that to you?”\wj* +\p +\v 24 This is the disciple who testifies about these things, and wrote these things. We know that his witness is true. +\v 25 There are also many other things which Jesus did, which if they would all be written, I suppose that even the world itself wouldn’t have room for the books that would be written. diff --git a/c-sharp/assets/WEB/45ACTengWEBUS.SFM b/c-sharp/assets/WEB/45ACTengWEBUS.SFM new file mode 100644 index 0000000000..b95f2d09f9 --- /dev/null +++ b/c-sharp/assets/WEB/45ACTengWEBUS.SFM @@ -0,0 +1,1411 @@ +\id ACT 44-ACT-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Acts +\toc1 The Acts of the Apostles +\toc2 Acts +\toc3 Acts +\mt1 The Acts of the Apostles +\c 1 +\p +\v 1 The first book I wrote, Theophilus, concerned all that Jesus began both to do and to teach, +\v 2 until the day in which he was received up, after he had given commandment through the Holy Spirit to the apostles whom he had chosen. +\v 3 To these he also showed himself alive after he suffered, by many proofs, appearing to them over a period of forty days and speaking about God’s Kingdom. +\v 4 Being assembled together with them, he commanded them, \wj “Don’t depart from Jerusalem, but wait for the promise of the Father, which you heard from me. \wj* +\v 5 \wj For John indeed baptized in water, but you will be baptized in the Holy Spirit not many days from now.”\wj* +\p +\v 6 Therefore, when they had come together, they asked him, “Lord, are you now restoring the kingdom to Israel?” +\p +\v 7 He said to them, \wj “It isn’t for you to know times or seasons which the Father has set within his own authority. \wj* +\v 8 \wj But you will receive power when the Holy Spirit has come upon you. You will be witnesses to me in Jerusalem, in all Judea and Samaria, and to the uttermost parts of the earth.”\wj* +\p +\v 9 When he had said these things, as they were looking, he was taken up, and a cloud received him out of their sight. +\v 10 While they were looking steadfastly into the sky as he went, behold,\f + \fr 1:10 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* two men stood by them in white clothing, +\v 11 who also said, “You men of Galilee, why do you stand looking into the sky? This Jesus, who was received up from you into the sky, will come back in the same way as you saw him going into the sky.” +\p +\v 12 Then they returned to Jerusalem from the mountain called Olivet, which is near Jerusalem, a Sabbath day’s journey away. +\v 13 When they had come in, they went up into the upper room where they were staying, that is Peter, John, James, Andrew, Philip, Thomas, Bartholomew, Matthew, James the son of Alphaeus, Simon the Zealot, and Judas the son of James. +\v 14 All these with one accord continued steadfastly in prayer and supplication, along with the women and Mary the mother of Jesus, and with his brothers. +\p +\v 15 In these days, Peter stood up in the middle of the disciples (and the number of names was about one hundred twenty), and said, +\v 16 “Brothers, it was necessary that this Scripture should be fulfilled, which the Holy Spirit spoke before by the mouth of David concerning Judas, who was guide to those who took Jesus. +\v 17 For he was counted with us, and received his portion in this ministry. +\v 18 Now this man obtained a field with the reward for his wickedness; and falling headlong, his body burst open and all his intestines gushed out. +\v 19 It became known to everyone who lived in Jerusalem that in their language that field was called ‘Akeldama,’ that is, ‘The field of blood.’ +\v 20 For it is written in the book of Psalms, +\q1 ‘Let his habitation be made desolate. +\q2 Let no one dwell in it;’\x + \xo 1:20 \xt Psalm 69:25\x* +\p and, +\q1 ‘Let another take his office.’\x + \xo 1:20 \xt Psalm 109:8\x* +\p +\v 21 “Of the men therefore who have accompanied us all the time that the Lord Jesus went in and out among us, +\v 22 beginning from the baptism of John to the day that he was received up from us, of these one must become a witness with us of his resurrection.” +\p +\v 23 They put forward two: Joseph called Barsabbas, who was also called Justus, and Matthias. +\v 24 They prayed and said, “You, Lord, who know the hearts of all men, show which one of these two you have chosen +\v 25 to take part in this ministry and apostleship from which Judas fell away, that he might go to his own place.” +\v 26 They drew lots for them, and the lot fell on Matthias; and he was counted with the eleven apostles. +\c 2 +\p +\v 1 Now when the day of Pentecost had come, they were all with one accord in one place. +\v 2 Suddenly there came from the sky a sound like the rushing of a mighty wind, and it filled all the house where they were sitting. +\v 3 Tongues like fire appeared and were distributed to them, and one sat on each of them. +\v 4 They were all filled with the Holy Spirit and began to speak with other languages, as the Spirit gave them the ability to speak. +\p +\v 5 Now there were dwelling in Jerusalem Jews, devout men, from every nation under the sky. +\v 6 When this sound was heard, the multitude came together and were bewildered, because everyone heard them speaking in his own language. +\v 7 They were all amazed and marveled, saying to one another, “Behold, aren’t all these who speak Galileans? +\v 8 How do we hear, everyone in our own native language? +\v 9 Parthians, Medes, Elamites, and people from Mesopotamia, Judea, Cappadocia, Pontus, Asia, +\v 10 Phrygia, Pamphylia, Egypt, the parts of Libya around Cyrene, visitors from Rome, both Jews and proselytes, +\v 11 Cretans and Arabians—we hear them speaking in our languages the mighty works of God!” +\v 12 They were all amazed and were perplexed, saying to one another, “What does this mean?” +\v 13 Others, mocking, said, “They are filled with new wine.” +\p +\v 14 But Peter, standing up with the eleven, lifted up his voice and spoke out to them, “You men of Judea and all you who dwell at Jerusalem, let this be known to you, and listen to my words. +\v 15 For these aren’t drunken, as you suppose, seeing it is only the third hour of the day.\f + \fr 2:15 \ft about 9:00 a.m.\f* +\v 16 But this is what has been spoken through the prophet Joel: +\q1 +\v 17 ‘It will be in the last days, says God, +\q2 that I will pour out my Spirit on all flesh. +\q1 Your sons and your daughters will prophesy. +\q2 Your young men will see visions. +\q2 Your old men will dream dreams. +\q1 +\v 18 Yes, and on my servants and on my handmaidens in those days, +\q2 I will pour out my Spirit, and they will prophesy. +\q1 +\v 19 I will show wonders in the sky above, +\q2 and signs on the earth beneath: +\q2 blood, and fire, and billows of smoke. +\q1 +\v 20 The sun will be turned into darkness, +\q2 and the moon into blood, +\q2 before the great and glorious day of the Lord comes. +\q1 +\v 21 It will be that whoever will call on the name of the Lord will be saved.’\x + \xo 2:21 \xt Joel 2:28-32\x* +\p +\v 22 “Men of Israel, hear these words! Jesus of Nazareth, a man approved by God to you by mighty works and wonders and signs which God did by him among you, even as you yourselves know, +\v 23 him, being delivered up by the determined counsel and foreknowledge of God, you have taken by the hand of lawless men, crucified and killed; +\v 24 whom God raised up, having freed him from the agony of death, because it was not possible that he should be held by it. +\v 25 For David says concerning him, +\q1 ‘I saw the Lord always before my face, +\q2 for he is on my right hand, that I should not be moved. +\q1 +\v 26 Therefore my heart was glad, and my tongue rejoiced. +\q2 Moreover my flesh also will dwell in hope, +\q1 +\v 27 because you will not leave my soul in Hades,\f + \fr 2:27 \ft or, Hell\f* +\q2 neither will you allow your Holy One to see decay. +\q1 +\v 28 You made known to me the ways of life. +\q2 You will make me full of gladness with your presence.’\x + \xo 2:28 \xt Psalm 16:8-11 \x* +\p +\v 29 “Brothers, I may tell you freely of the patriarch David, that he both died and was buried, and his tomb is with us to this day. +\v 30 Therefore, being a prophet, and knowing that God had sworn with an oath to him that of the fruit of his body, according to the flesh, he would raise up the Christ\f + \fr 2:30 \ft “Christ” means “Anointed One”.\f* to sit on his throne, +\v 31 he foreseeing this, spoke about the resurrection of the Christ, that his soul wasn’t left in Hades,\f + \fr 2:31 \ft or, Hell\f* and his flesh didn’t see decay. +\v 32 This Jesus God raised up, to which we all are witnesses. +\v 33 Being therefore exalted by the right hand of God, and having received from the Father the promise of the Holy Spirit, he has poured out this which you now see and hear. +\v 34 For David didn’t ascend into the heavens, but he says himself, +\q1 ‘The Lord said to my Lord, “Sit by my right hand +\q2 +\v 35 until I make your enemies a footstool for your feet.”’\x + \xo 2:35 \xt Psalm 110:1 \x* +\p +\v 36 “Let all the house of Israel therefore know certainly that God has made him both Lord and Christ, this Jesus whom you crucified.” +\p +\v 37 Now when they heard this, they were cut to the heart, and said to Peter and the rest of the apostles, “Brothers, what shall we do?” +\p +\v 38 Peter said to them, “Repent and be baptized, every one of you, in the name of Jesus Christ for the forgiveness of sins, and you will receive the gift of the Holy Spirit. +\v 39 For the promise is to you and to your children, and to all who are far off, even as many as the Lord our God will call to himself.” +\v 40 With many other words he testified and exhorted them, saying, “Save yourselves from this crooked generation!” +\p +\v 41 Then those who gladly received his word were baptized. There were added that day about three thousand souls. +\v 42 They continued steadfastly in the apostles’ teaching and fellowship, in the breaking of bread, and prayer. +\v 43 Fear came on every soul, and many wonders and signs were done through the apostles. +\v 44 All who believed were together, and had all things in common. +\v 45 They sold their possessions and goods, and distributed them to all, according as anyone had need. +\v 46 Day by day, continuing steadfastly with one accord in the temple, and breaking bread at home, they took their food with gladness and singleness of heart, +\v 47 praising God and having favor with all the people. The Lord added to the assembly day by day those who were being saved. +\c 3 +\p +\v 1 Peter and John were going up into the temple at the hour of prayer, the ninth hour.\f + \fr 3:1 \ft 3:00 p.m.\f* +\v 2 A certain man who was lame from his mother’s womb was being carried, whom they laid daily at the door of the temple which is called Beautiful, to ask gifts for the needy of those who entered into the temple. +\v 3 Seeing Peter and John about to go into the temple, he asked to receive gifts for the needy. +\v 4 Peter, fastening his eyes on him, with John, said, “Look at us.” +\v 5 He listened to them, expecting to receive something from them. +\v 6 But Peter said, “I have no silver or gold, but what I have, that I give you. In the name of Jesus Christ of Nazareth, get up and walk!” +\v 7 He took him by the right hand and raised him up. Immediately his feet and his ankle bones received strength. +\v 8 Leaping up, he stood and began to walk. He entered with them into the temple, walking, leaping, and praising God. +\v 9 All the people saw him walking and praising God. +\v 10 They recognized him, that it was he who used to sit begging for gifts for the needy at the Beautiful Gate of the temple. They were filled with wonder and amazement at what had happened to him. +\v 11 As the lame man who was healed held on to Peter and John, all the people ran together to them in the porch that is called Solomon’s, greatly wondering. +\p +\v 12 When Peter saw it, he responded to the people, “You men of Israel, why do you marvel at this man? Why do you fasten your eyes on us, as though by our own power or godliness we had made him walk? +\v 13 The God of Abraham, Isaac, and Jacob, the God of our fathers, has glorified his Servant Jesus, whom you delivered up and denied in the presence of Pilate, when he had determined to release him. +\v 14 But you denied the Holy and Righteous One and asked for a murderer to be granted to you, +\v 15 and killed the Prince of life, whom God raised from the dead, to which we are witnesses. +\v 16 By faith in his name, his name has made this man strong, whom you see and know. Yes, the faith which is through him has given him this perfect soundness in the presence of you all. +\p +\v 17 “Now, brothers,\f + \fr 3:17 \ft The word for “brothers” here may be also correctly translated “brothers and sisters” or “siblings.”\f* I know that you did this in ignorance, as did also your rulers. +\v 18 But the things which God announced by the mouth of all his prophets, that Christ should suffer, he thus fulfilled. +\p +\v 19 “Repent therefore, and turn again, that your sins may be blotted out, so that there may come times of refreshing from the presence of the Lord, +\v 20 and that he may send Christ Jesus, who was ordained for you before, +\v 21 whom heaven must receive until the times of restoration of all things, which God spoke long ago by the mouth of his holy prophets. +\v 22 For Moses indeed said to the fathers, ‘The Lord God will raise up a prophet for you from among your brothers, like me. You shall listen to him in all things whatever he says to you. +\v 23 It will be that every soul that will not listen to that prophet will be utterly destroyed from among the people.’\x + \xo 3:23 \xt Deuteronomy 18:15,18-19 \x* +\v 24 Yes, and all the prophets from Samuel and those who followed after, as many as have spoken, also told of these days. +\v 25 You are the children of the prophets, and of the covenant which God made with our fathers, saying to Abraham, ‘All the families of the earth will be blessed through your offspring.’\f + \fr 3:25 \ft or, seed\f*\x + \xo 3:25 \xt Genesis 22:18; 26:4\x* +\v 26 God, having raised up his servant Jesus, sent him to you first to bless you, in turning away every one of you from your wickedness.” +\c 4 +\p +\v 1 As they spoke to the people, the priests and the captain of the temple and the Sadducees came to them, +\v 2 being upset because they taught the people and proclaimed in Jesus the resurrection from the dead. +\v 3 They laid hands on them, and put them in custody until the next day, for it was now evening. +\v 4 But many of those who heard the word believed, and the number of the men came to be about five thousand. +\p +\v 5 In the morning, their rulers, elders, and scribes were gathered together in Jerusalem. +\v 6 Annas the high priest was there, with Caiaphas, John, Alexander, and as many as were relatives of the high priest. +\v 7 When they had stood Peter and John in the middle of them, they inquired, “By what power, or in what name, have you done this?” +\p +\v 8 Then Peter, filled with the Holy Spirit, said to them, “You rulers of the people and elders of Israel, +\v 9 if we are examined today concerning a good deed done to a crippled man, by what means this man has been healed, +\v 10 may it be known to you all, and to all the people of Israel, that in the name of Jesus Christ of Nazareth, whom you crucified, whom God raised from the dead, this man stands here before you whole in him. +\v 11 He is ‘the stone which was regarded as worthless by you, the builders, which has become the head of the corner.’\x + \xo 4:11 \xt Psalm 118:22\x* +\v 12 There is salvation in no one else, for there is no other name under heaven that is given among men, by which we must be saved!” +\p +\v 13 Now when they saw the boldness of Peter and John, and had perceived that they were unlearned and ignorant men, they marveled. They recognized that they had been with Jesus. +\v 14 Seeing the man who was healed standing with them, they could say nothing against it. +\v 15 But when they had commanded them to go aside out of the council, they conferred among themselves, +\v 16 saying, “What shall we do to these men? Because indeed a notable miracle has been done through them, as can be plainly seen by all who dwell in Jerusalem, and we can’t deny it. +\v 17 But so that this spreads no further among the people, let’s threaten them, that from now on they don’t speak to anyone in this name.” +\v 18 They called them, and commanded them not to speak at all nor teach in the name of Jesus. +\p +\v 19 But Peter and John answered them, “Whether it is right in the sight of God to listen to you rather than to God, judge for yourselves, +\v 20 for we can’t help telling the things which we saw and heard.” +\p +\v 21 When they had further threatened them, they let them go, finding no way to punish them, because of the people; for everyone glorified God for that which was done. +\v 22 For the man on whom this miracle of healing was performed was more than forty years old. +\p +\v 23 Being let go, they came to their own company and reported all that the chief priests and the elders had said to them. +\v 24 When they heard it, they lifted up their voice to God with one accord and said, “O Lord, you are God, who made the heaven, the earth, the sea, and all that is in them; +\v 25 who by the mouth of your servant David, said, +\q1 ‘Why do the nations rage, +\q2 and the peoples plot a vain thing? +\q1 +\v 26 The kings of the earth take a stand, +\q2 and the rulers plot together, +\q2 against the Lord, and against his Christ.’\f + \fr 4:26 \ft Christ (Greek) and Messiah (Hebrew) both mean Anointed One.\f*\x + \xo 4:26 \xt Psalm 2:1-2\x* +\p +\v 27 “For truly,\f + \fr 4:27 \ft nu adds “in this city,”\f* both Herod and Pontius Pilate, with the Gentiles and the people of Israel, were gathered together against your holy servant Jesus, whom you anointed, +\v 28 to do whatever your hand and your counsel foreordained to happen. +\v 29 Now, Lord, look at their threats, and grant to your servants to speak your word with all boldness, +\v 30 while you stretch out your hand to heal; and that signs and wonders may be done through the name of your holy Servant Jesus.” +\p +\v 31 When they had prayed, the place was shaken where they were gathered together. They were all filled with the Holy Spirit, and they spoke the word of God with boldness. +\p +\v 32 The multitude of those who believed were of one heart and soul. Not one of them claimed that anything of the things which he possessed was his own, but they had all things in common. +\v 33 With great power, the apostles gave their testimony of the resurrection of the Lord Jesus. Great grace was on them all. +\v 34 For neither was there among them any who lacked, for as many as were owners of lands or houses sold them, and brought the proceeds of the things that were sold, +\v 35 and laid them at the apostles’ feet; and distribution was made to each, according as anyone had need. +\p +\v 36 Joses, who by the apostles was also called Barnabas (which is, being interpreted, Son of Encouragement), a Levite, a man of Cyprus by race, +\v 37 having a field, sold it and brought the money and laid it at the apostles’ feet. +\c 5 +\p +\v 1 But a certain man named Ananias, with Sapphira his wife, sold a possession, +\v 2 and kept back part of the price, his wife also being aware of it, then brought a certain part and laid it at the apostles’ feet. +\v 3 But Peter said, “Ananias, why has Satan filled your heart to lie to the Holy Spirit and to keep back part of the price of the land? +\v 4 While you kept it, didn’t it remain your own? After it was sold, wasn’t it in your power? How is it that you have conceived this thing in your heart? You haven’t lied to men, but to God.” +\p +\v 5 Ananias, hearing these words, fell down and died. Great fear came on all who heard these things. +\v 6 The young men arose and wrapped him up, and they carried him out and buried him. +\v 7 About three hours later, his wife, not knowing what had happened, came in. +\v 8 Peter answered her, “Tell me whether you sold the land for so much.” +\p She said, “Yes, for so much.” +\p +\v 9 But Peter asked her, “How is it that you have agreed together to tempt the Spirit of the Lord? Behold, the feet of those who have buried your husband are at the door, and they will carry you out.” +\p +\v 10 She fell down immediately at his feet and died. The young men came in and found her dead, and they carried her out and buried her by her husband. +\v 11 Great fear came on the whole assembly, and on all who heard these things. +\p +\v 12 By the hands of the apostles many signs and wonders were done among the people. They were all with one accord in Solomon’s porch. +\v 13 None of the rest dared to join them; however, the people honored them. +\v 14 More believers were added to the Lord, multitudes of both men and women. +\v 15 They even carried out the sick into the streets and laid them on cots and mattresses, so that as Peter came by, at least his shadow might overshadow some of them. +\v 16 The multitude also came together from the cities around Jerusalem, bringing sick people and those who were tormented by unclean spirits; and they were all healed. +\p +\v 17 But the high priest rose up, and all those who were with him (which is the sect of the Sadducees), and they were filled with jealousy +\v 18 and laid hands on the apostles, then put them in public custody. +\v 19 But an angel of the Lord opened the prison doors by night, and brought them out and said, +\v 20 “Go stand and speak in the temple to the people all the words of this life.” +\p +\v 21 When they heard this, they entered into the temple about daybreak and taught. But the high priest and those who were with him came and called the council together, with all the senate of the children of Israel, and sent to the prison to have them brought. +\v 22 But the officers who came didn’t find them in the prison. They returned and reported, +\v 23 “We found the prison shut and locked, and the guards standing before the doors, but when we opened them, we found no one inside!” +\p +\v 24 Now when the high priest, the captain of the temple, and the chief priests heard these words, they were very perplexed about them and what might become of this. +\v 25 One came and told them, “Behold, the men whom you put in prison are in the temple, standing and teaching the people.” +\v 26 Then the captain went with the officers, and brought them without violence, for they were afraid that the people might stone them. +\p +\v 27 When they had brought them, they set them before the council. The high priest questioned them, +\v 28 saying, “Didn’t we strictly command you not to teach in this name? Behold, you have filled Jerusalem with your teaching, and intend to bring this man’s blood on us.” +\p +\v 29 But Peter and the apostles answered, “We must obey God rather than men. +\v 30 The God of our fathers raised up Jesus, whom you killed, hanging him on a tree. +\v 31 God exalted him with his right hand to be a Prince and a Savior, to give repentance to Israel, and remission of sins. +\v 32 We are his witnesses of these things; and so also is the Holy Spirit, whom God has given to those who obey him.” +\p +\v 33 But they, when they heard this, were cut to the heart, and were determined to kill them. +\v 34 But one stood up in the council, a Pharisee named Gamaliel, a teacher of the law, honored by all the people, and commanded to put the apostles out for a little while. +\v 35 He said to them, “You men of Israel, be careful concerning these men, what you are about to do. +\v 36 For before these days Theudas rose up, making himself out to be somebody; to whom a number of men, about four hundred, joined themselves. He was slain; and all, as many as obeyed him, were dispersed and came to nothing. +\v 37 After this man, Judas of Galilee rose up in the days of the enrollment, and drew away some people after him. He also perished, and all, as many as obeyed him, were scattered abroad. +\v 38 Now I tell you, withdraw from these men and leave them alone. For if this counsel or this work is of men, it will be overthrown. +\v 39 But if it is of God, you will not be able to overthrow it, and you would be found even to be fighting against God!” +\p +\v 40 They agreed with him. Summoning the apostles, they beat them and commanded them not to speak in the name of Jesus, and let them go. +\v 41 They therefore departed from the presence of the council, rejoicing that they were counted worthy to suffer dishonor for Jesus’ name. +\p +\v 42 Every day, in the temple and at home, they never stopped teaching and preaching Jesus, the Christ. +\c 6 +\p +\v 1 Now in those days, when the number of the disciples was multiplying, a complaint arose from the Hellenists\f + \fr 6:1 \ft The Hellenists used Greek language and culture, even though they were also of Hebrew descent.\f* against the Hebrews, because their widows were neglected in the daily service. +\v 2 The twelve summoned the multitude of the disciples and said, “It is not appropriate for us to forsake the word of God and serve tables. +\v 3 Therefore, select from among you, brothers, seven men of good report, full of the Holy Spirit and of wisdom, whom we may appoint over this business. +\v 4 But we will continue steadfastly in prayer and in the ministry of the word.” +\p +\v 5 These words pleased the whole multitude. They chose Stephen, a man full of faith and of the Holy Spirit, Philip, Prochorus, Nicanor, Timon, Parmenas, and Nicolaus, a proselyte of Antioch, +\v 6 whom they set before the apostles. When they had prayed, they laid their hands on them. +\p +\v 7 The word of God increased and the number of the disciples greatly multiplied in Jerusalem. A great company of the priests were obedient to the faith. +\p +\v 8 Stephen, full of faith and power, performed great wonders and signs among the people. +\v 9 But some of those who were of the synagogue called “The Libertines”, and of the Cyrenians, of the Alexandrians, and of those of Cilicia and Asia arose, disputing with Stephen. +\v 10 They weren’t able to withstand the wisdom and the Spirit by which he spoke. +\v 11 Then they secretly induced men to say, “We have heard him speak blasphemous words against Moses and God.” +\v 12 They stirred up the people, the elders, and the scribes, and came against him and seized him, then brought him in to the council, +\v 13 and set up false witnesses who said, “This man never stops speaking blasphemous words against this holy place and the law. +\v 14 For we have heard him say that this Jesus of Nazareth will destroy this place, and will change the customs which Moses delivered to us.” +\v 15 All who sat in the council, fastening their eyes on him, saw his face like it was the face of an angel. +\c 7 +\p +\v 1 The high priest said, “Are these things so?” +\p +\v 2 He said, “Brothers and fathers, listen. The God of glory appeared to our father Abraham when he was in Mesopotamia, before he lived in Haran, +\v 3 and said to him, ‘Get out of your land and away from your relatives, and come into a land which I will show you.’\x + \xo 7:3 \xt Genesis 12:1\x* +\v 4 Then he came out of the land of the Chaldaeans and lived in Haran. From there, when his father was dead, God moved him into this land where you are now living. +\v 5 He gave him no inheritance in it, no, not so much as to set his foot on. He promised that he would give it to him for a possession, and to his offspring after him, when he still had no child. +\v 6 God spoke in this way: that his offspring would live as aliens in a strange land, and that they would be enslaved and mistreated for four hundred years. +\v 7 ‘I will judge the nation to which they will be in bondage,’ said God, ‘and after that they will come out and serve me in this place.’\x + \xo 7:7 \xt Genesis 15:13-14\x* +\v 8 He gave him the covenant of circumcision. So Abraham became the father of Isaac, and circumcised him the eighth day. Isaac became the father of Jacob, and Jacob became the father of the twelve patriarchs. +\p +\v 9 “The patriarchs, moved with jealousy against Joseph, sold him into Egypt. God was with him +\v 10 and delivered him out of all his afflictions, and gave him favor and wisdom before Pharaoh, king of Egypt. He made him governor over Egypt and all his house. +\v 11 Now a famine came over all the land of Egypt and Canaan, and great affliction. Our fathers found no food. +\v 12 But when Jacob heard that there was grain in Egypt, he sent out our fathers the first time. +\v 13 On the second time Joseph was made known to his brothers, and Joseph’s family was revealed to Pharaoh. +\v 14 Joseph sent and summoned Jacob his father and all his relatives, seventy-five souls. +\v 15 Jacob went down into Egypt and he died, himself and our fathers; +\v 16 and they were brought back to Shechem and laid in the tomb that Abraham bought for a price in silver from the children of Hamor of Shechem. +\p +\v 17 “But as the time of the promise came close which God had sworn to Abraham, the people grew and multiplied in Egypt, +\v 18 until there arose a different king who didn’t know Joseph. +\v 19 The same took advantage of our race and mistreated our fathers, and forced them to abandon their babies, so that they wouldn’t stay alive. +\v 20 At that time Moses was born, and was exceedingly handsome to God. He was nourished three months in his father’s house. +\v 21 When he was abandoned, Pharaoh’s daughter took him up and reared him as her own son. +\v 22 Moses was instructed in all the wisdom of the Egyptians. He was mighty in his words and works. +\v 23 But when he was forty years old, it came into his heart to visit his brothers,\f + \fr 7:23 \ft The word for “brothers” here and where the context allows may be also correctly translated “brothers and sisters” or “siblings.”\f* the children of Israel. +\v 24 Seeing one of them suffer wrong, he defended him and avenged him who was oppressed, striking the Egyptian. +\v 25 He supposed that his brothers understood that God, by his hand, was giving them deliverance; but they didn’t understand. +\p +\v 26 “The day following, he appeared to them as they fought, and urged them to be at peace again, saying, ‘Sirs, you are brothers. Why do you wrong one another?’ +\v 27 But he who did his neighbor wrong pushed him away, saying, ‘Who made you a ruler and a judge over us? +\v 28 Do you want to kill me as you killed the Egyptian yesterday?’\x + \xo 7:28 \xt Exodus 2:14\x* +\v 29 Moses fled at this saying, and became a stranger in the land of Midian, where he became the father of two sons. +\p +\v 30 “When forty years were fulfilled, an angel of the Lord appeared to him in the wilderness of Mount Sinai, in a flame of fire in a bush. +\v 31 When Moses saw it, he wondered at the sight. As he came close to see, the voice of the Lord came to him, +\v 32 ‘I am the God of your fathers: the God of Abraham, the God of Isaac, and the God of Jacob.’\x + \xo 7:32 \xt Exodus 3:6\x* Moses trembled and dared not look. +\v 33 The Lord said to him, ‘Take off your sandals, for the place where you stand is holy ground. +\v 34 I have surely seen the affliction of my people who are in Egypt, and have heard their groaning. I have come down to deliver them. Now come, I will send you into Egypt.’\x + \xo 7:34 \xt Exodus 3:5,7-8,10\x* +\p +\v 35 “This Moses whom they refused, saying, ‘Who made you a ruler and a judge?’—God has sent him as both a ruler and a deliverer by the hand of the angel who appeared to him in the bush. +\v 36 This man led them out, having worked wonders and signs in Egypt, in the Red Sea, and in the wilderness for forty years. +\v 37 This is that Moses who said to the children of Israel, ‘The Lord our God will raise up a prophet for you from among your brothers, like me.’\f + \fr 7:37 \ft TR adds “You shall listen to him.”\f*\x + \xo 7:37 \xt Deuteronomy 18:15\x* +\v 38 This is he who was in the assembly in the wilderness with the angel that spoke to him on Mount Sinai, and with our fathers, who received living revelations to give to us, +\v 39 to whom our fathers wouldn’t be obedient, but rejected him and turned back in their hearts to Egypt, +\v 40 saying to Aaron, ‘Make us gods that will go before us, for as for this Moses who led us out of the land of Egypt, we don’t know what has become of him.’\x + \xo 7:40 \xt Exodus 32:1\x* +\v 41 They made a calf in those days, and brought a sacrifice to the idol, and rejoiced in the works of their hands. +\v 42 But God turned away and gave them up to serve the army of the sky,\f + \fr 7:42 \ft This idiom could also be translated “host of heaven”, or “angelic beings”, or “heavenly bodies.”\f* as it is written in the book of the prophets, +\q1 ‘Did you offer to me slain animals and sacrifices +\q2 forty years in the wilderness, O house of Israel? +\q1 +\v 43 You took up the tabernacle of Moloch, +\q2 the star of your god Rephan, +\q1 the figures which you made to worship, +\q2 so I will carry you away\x + \xo 7:43 \xt Amos 5:25-27\x* beyond Babylon.’ +\p +\v 44 “Our fathers had the tabernacle of the testimony in the wilderness, even as he who spoke to Moses commanded him to make it according to the pattern that he had seen; +\v 45 which also our fathers, in their turn, brought in with Joshua when they entered into the possession of the nations whom God drove out before the face of our fathers to the days of David, +\v 46 who found favor in the sight of God, and asked to find a habitation for the God of Jacob. +\v 47 But Solomon built him a house. +\v 48 However, the Most High doesn’t dwell in temples made with hands, as the prophet says, +\q1 +\v 49 ‘heaven is my throne, +\q2 and the earth a footstool for my feet. +\q1 What kind of house will you build me?’ says the Lord. +\q2 ‘Or what is the place of my rest? +\q1 +\v 50 Didn’t my hand make all these things?’\x + \xo 7:50 \xt Isaiah 66:1-2\x* +\p +\v 51 “You stiff-necked and uncircumcised in heart and ears, you always resist the Holy Spirit! As your fathers did, so you do. +\v 52 Which of the prophets didn’t your fathers persecute? They killed those who foretold the coming of the Righteous One, of whom you have now become betrayers and murderers. +\v 53 You received the law as it was ordained by angels, and didn’t keep it!” +\p +\v 54 Now when they heard these things, they were cut to the heart, and they gnashed at him with their teeth. +\v 55 But he, being full of the Holy Spirit, looked up steadfastly into heaven and saw the glory of God, and Jesus standing on the right hand of God, +\v 56 and said, “Behold, I see the heavens opened and the Son of Man standing at the right hand of God!” +\p +\v 57 But they cried out with a loud voice and stopped their ears, then rushed at him with one accord. +\v 58 They threw him out of the city and stoned him. The witnesses placed their garments at the feet of a young man named Saul. +\v 59 They stoned Stephen as he called out, saying, “Lord Jesus, receive my spirit!” +\v 60 He kneeled down and cried with a loud voice, “Lord, don’t hold this sin against them!” When he had said this, he fell asleep. +\c 8 +\p +\v 1 Saul was consenting to his death. A great persecution arose against the assembly which was in Jerusalem in that day. They were all scattered abroad throughout the regions of Judea and Samaria, except for the apostles. +\v 2 Devout men buried Stephen and lamented greatly over him. +\v 3 But Saul ravaged the assembly, entering into every house and dragged both men and women off to prison. +\v 4 Therefore those who were scattered abroad went around preaching the word. +\v 5 Philip went down to the city of Samaria and proclaimed to them the Christ. +\v 6 The multitudes listened with one accord to the things that were spoken by Philip when they heard and saw the signs which he did. +\v 7 For unclean spirits came out of many of those who had them. They came out, crying with a loud voice. Many who had been paralyzed and lame were healed. +\v 8 There was great joy in that city. +\p +\v 9 But there was a certain man, Simon by name, who used to practice sorcery in the city and amazed the people of Samaria, making himself out to be some great one, +\v 10 to whom they all listened, from the least to the greatest, saying, “This man is that great power of God.” +\v 11 They listened to him because for a long time he had amazed them with his sorceries. +\v 12 But when they believed Philip preaching good news concerning God’s Kingdom and the name of Jesus Christ, they were baptized, both men and women. +\v 13 Simon himself also believed. Being baptized, he continued with Philip. Seeing signs and great miracles occurring, he was amazed. +\p +\v 14 Now when the apostles who were at Jerusalem heard that Samaria had received the word of God, they sent Peter and John to them, +\v 15 who, when they had come down, prayed for them, that they might receive the Holy Spirit; +\v 16 for as yet he had fallen on none of them. They had only been baptized in the name of Christ Jesus. +\v 17 Then they laid their hands on them, and they received the Holy Spirit. +\v 18 Now when Simon saw that the Holy Spirit was given through the laying on of the apostles’ hands, he offered them money, +\v 19 saying, “Give me also this power, that whomever I lay my hands on may receive the Holy Spirit.” +\v 20 But Peter said to him, “May your silver perish with you, because you thought you could obtain the gift of God with money! +\v 21 You have neither part nor lot in this matter, for your heart isn’t right before God. +\v 22 Repent therefore of this, your wickedness, and ask God if perhaps the thought of your heart may be forgiven you. +\v 23 For I see that you are in the poison of bitterness and in the bondage of iniquity.” +\p +\v 24 Simon answered, “Pray for me to the Lord, that none of the things which you have spoken happen to me.” +\p +\v 25 They therefore, when they had testified and spoken the word of the Lord, returned to Jerusalem, and preached the Good News to many villages of the Samaritans. +\p +\v 26 Then an angel of the Lord spoke to Philip, saying, “Arise, and go toward the south to the way that goes down from Jerusalem to Gaza. This is a desert.” +\p +\v 27 He arose and went; and behold, there was a man of Ethiopia, a eunuch of great authority under Candace, queen of the Ethiopians, who was over all her treasure, who had come to Jerusalem to worship. +\v 28 He was returning and sitting in his chariot, and was reading the prophet Isaiah. +\p +\v 29 The Spirit said to Philip, “Go near, and join yourself to this chariot.” +\p +\v 30 Philip ran to him, and heard him reading Isaiah the prophet, and said, “Do you understand what you are reading?” +\p +\v 31 He said, “How can I, unless someone explains it to me?” He begged Philip to come up and sit with him. +\v 32 Now the passage of the Scripture which he was reading was this, +\q1 “He was led as a sheep to the slaughter. +\q2 As a lamb before his shearer is silent, +\q2 so he doesn’t open his mouth. +\q1 +\v 33 In his humiliation, his judgment was taken away. +\q2 Who will declare His generation? +\q2 For his life is taken from the earth.”\x + \xo 8:33 \xt Isaiah 53:7,8\x* +\p +\v 34 The eunuch answered Philip, “Who is the prophet talking about? About himself, or about someone else?” +\p +\v 35 Philip opened his mouth, and beginning from this Scripture, preached to him about Jesus. +\v 36 As they went on the way, they came to some water; and the eunuch said, “Behold, here is water. What is keeping me from being baptized?” +\p +\v 37 \f + \fr 8:37 \ft TR adds \fqa Philip said, “If you believe with all your heart, you may.” He answered, “I believe that Jesus Christ is the Son of God.”\f* +\v 38 He commanded the chariot to stand still, and they both went down into the water, both Philip and the eunuch, and he baptized him. +\p +\v 39 When they came up out of the water, the Spirit of the Lord caught Philip away, and the eunuch didn’t see him any more, for he went on his way rejoicing. +\v 40 But Philip was found at Azotus. Passing through, he preached the Good News to all the cities until he came to Caesarea. +\c 9 +\p +\v 1 But Saul, still breathing threats and slaughter against the disciples of the Lord, went to the high priest +\v 2 and asked for letters from him to the synagogues of Damascus, that if he found any who were of the Way, whether men or women, he might bring them bound to Jerusalem. +\v 3 As he traveled, he got close to Damascus, and suddenly a light from the sky shone around him. +\v 4 He fell on the earth, and heard a voice saying to him, \wj “Saul, Saul, why do you persecute me?”\wj* +\p +\v 5 He said, “Who are you, Lord?” +\p The Lord said, \wj “I am Jesus, whom you are persecuting.\wj*\f + \fr 9:5 \ft TR adds “It’s hard for you to kick against the cattle prods.”\f* +\v 6 \wj But\wj*\f + \fr 9:6 \ft TR omits “But” \f* \wj rise up and enter into the city, then you will be told what you must do.”\wj* +\p +\v 7 The men who traveled with him stood speechless, hearing the sound, but seeing no one. +\v 8 Saul arose from the ground, and when his eyes were opened, he saw no one. They led him by the hand and brought him into Damascus. +\v 9 He was without sight for three days, and neither ate nor drank. +\p +\v 10 Now there was a certain disciple at Damascus named Ananias. The Lord said to him in a vision, \wj “Ananias!”\wj* +\p He said, “Behold, it’s me, Lord.” +\p +\v 11 The Lord said to him, \wj “Arise and go to the street which is called Straight, and inquire in the house of Judah\wj*\f + \fr 9:11 \ft or, Judas\f* \wj for one named Saul, a man of Tarsus. For behold, he is praying, \wj* +\v 12 \wj and in a vision he has seen a man named Ananias coming in and laying his hands on him, that he might receive his sight.”\wj* +\p +\v 13 But Ananias answered, “Lord, I have heard from many about this man, how much evil he did to your saints at Jerusalem. +\v 14 Here he has authority from the chief priests to bind all who call on your name.” +\p +\v 15 But the Lord said to him, \wj “Go your way, for he is my chosen vessel to bear my name before the nations and kings, and the children of Israel. \wj* +\v 16 \wj For I will show him how many things he must suffer for my name’s sake.”\wj* +\p +\v 17 Ananias departed and entered into the house. Laying his hands on him, he said, “Brother Saul, the Lord, who appeared to you on the road by which you came, has sent me that you may receive your sight and be filled with the Holy Spirit.” +\v 18 Immediately something like scales fell from his eyes, and he received his sight. He arose and was baptized. +\v 19 He took food and was strengthened. +\p Saul stayed several days with the disciples who were at Damascus. +\v 20 Immediately in the synagogues he proclaimed the Christ, that he is the Son of God. +\v 21 All who heard him were amazed, and said, “Isn’t this he who in Jerusalem made havoc of those who called on this name? And he had come here intending to bring them bound before the chief priests!” +\p +\v 22 But Saul increased more in strength, and confounded the Jews who lived at Damascus, proving that this is the Christ. +\v 23 When many days were fulfilled, the Jews conspired together to kill him, +\v 24 but their plot became known to Saul. They watched the gates both day and night that they might kill him, +\v 25 but his disciples took him by night and let him down through the wall, lowering him in a basket. +\p +\v 26 When Saul had come to Jerusalem, he tried to join himself to the disciples; but they were all afraid of him, not believing that he was a disciple. +\v 27 But Barnabas took him and brought him to the apostles, and declared to them how he had seen the Lord on the way, and that he had spoken to him, and how at Damascus he had preached boldly in the name of Jesus. +\v 28 He was with them entering into\f + \fr 9:28 \ft TR and NU add “and going out” \f* Jerusalem, +\v 29 preaching boldly in the name of the Lord Jesus.\f + \fr 9:29 \ft TR and NU omit “Jesus” and reverse the order of verses 28 & 29.\f* He spoke and disputed against the Hellenists,\f + \fr 9:29 \ft The Hellenists were Hebrews who used Greek language and culture.\f* but they were seeking to kill him. +\v 30 When the brothers\f + \fr 9:30 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* knew it, they brought him down to Caesarea and sent him off to Tarsus. +\p +\v 31 So the assemblies throughout all Judea, Galilee, and Samaria had peace and were built up. They were multiplied, walking in the fear of the Lord and in the comfort of the Holy Spirit. +\p +\v 32 As Peter went throughout all those parts, he came down also to the saints who lived at Lydda. +\v 33 There he found a certain man named Aeneas, who had been bedridden for eight years because he was paralyzed. +\v 34 Peter said to him, “Aeneas, Jesus Christ heals you. Get up and make your bed!” Immediately he arose. +\v 35 All who lived at Lydda and in Sharon saw him, and they turned to the Lord. +\p +\v 36 Now there was at Joppa a certain disciple named Tabitha, which when translated means Dorcas.\f + \fr 9:36 \ft “Dorcas” is Greek for “Gazelle.”\f* This woman was full of good works and acts of mercy which she did. +\v 37 In those days, she became sick and died. When they had washed her, they laid her in an upper room. +\v 38 As Lydda was near Joppa, the disciples, hearing that Peter was there, sent two men\f + \fr 9:38 \ft Reading from NU, TR; MT omits “two men”\f* to him, imploring him not to delay in coming to them. +\v 39 Peter got up and went with them. When he had come, they brought him into the upper room. All the widows stood by him weeping, and showing the tunics and other garments which Dorcas had made while she was with them. +\v 40 Peter sent them all out, and knelt down and prayed. Turning to the body, he said, “Tabitha, get up!” She opened her eyes, and when she saw Peter, she sat up. +\v 41 He gave her his hand and raised her up. Calling the saints and widows, he presented her alive. +\v 42 This became known throughout all Joppa, and many believed in the Lord. +\v 43 He stayed many days in Joppa with a tanner named Simon. +\c 10 +\p +\v 1 Now there was a certain man in Caesarea, Cornelius by name, a centurion of what was called the Italian Regiment, +\v 2 a devout man, and one who feared God with all his house, who gave gifts for the needy generously to the people, and always prayed to God. +\v 3 At about the ninth hour of the day,\f + \fr 10:3 \ft 3:00 p.m.\f* he clearly saw in a vision an angel of God coming to him and saying to him, “Cornelius!” +\p +\v 4 He, fastening his eyes on him and being frightened, said, “What is it, Lord?” +\p He said to him, “Your prayers and your gifts to the needy have gone up for a memorial before God. +\v 5 Now send men to Joppa, and get Simon, who is also called Peter. +\v 6 He is staying with a tanner named Simon, whose house is by the seaside.\f + \fr 10:6 \ft TR adds “This one will tell you what it is necessary for you to do.”\f* +\p +\v 7 When the angel who spoke to him had departed, Cornelius called two of his household servants and a devout soldier of those who waited on him continually. +\v 8 Having explained everything to them, he sent them to Joppa. +\p +\v 9 Now on the next day as they were on their journey and got close to the city, Peter went up on the housetop to pray at about noon. +\v 10 He became hungry and desired to eat, but while they were preparing, he fell into a trance. +\v 11 He saw heaven opened and a certain container descending to him, like a great sheet let down by four corners on the earth, +\v 12 in which were all kinds of four-footed animals of the earth, wild animals, reptiles, and birds of the sky. +\v 13 A voice came to him, \wj “Rise, Peter, kill and eat!”\wj* +\p +\v 14 But Peter said, “Not so, Lord; for I have never eaten anything that is common or unclean.” +\p +\v 15 A voice came to him again the second time, \wj “What God has cleansed, you must not call unclean.”\wj* +\v 16 This was done three times, and immediately the thing was received up into heaven. +\p +\v 17 Now while Peter was very perplexed in himself what the vision which he had seen might mean, behold, the men who were sent by Cornelius, having made inquiry for Simon’s house, stood before the gate, +\v 18 and called and asked whether Simon, who was also called Peter, was lodging there. +\v 19 While Peter was pondering the vision, the Spirit said to him, “Behold, three\f + \fr 10:19 \ft Reading from TR and NU. MT omits “three”\f* men seek you. +\v 20 But arise, get down, and go with them, doubting nothing; for I have sent them.” +\p +\v 21 Peter went down to the men, and said, “Behold, I am he whom you seek. Why have you come?” +\p +\v 22 They said, “Cornelius, a centurion, a righteous man and one who fears God, and well spoken of by all the nation of the Jews, was directed by a holy angel to invite you to his house, and to listen to what you say.” +\v 23 So he called them in and provided a place to stay. +\p On the next day Peter arose and went out with them, and some of the brothers from Joppa accompanied him. +\v 24 On the next day they entered into Caesarea. Cornelius was waiting for them, having called together his relatives and his near friends. +\v 25 When Peter entered, Cornelius met him, fell down at his feet, and worshiped him. +\v 26 But Peter raised him up, saying, “Stand up! I myself am also a man.” +\v 27 As he talked with him, he went in and found many gathered together. +\v 28 He said to them, “You yourselves know how it is an unlawful thing for a man who is a Jew to join himself or come to one of another nation, but God has shown me that I shouldn’t call any man unholy or unclean. +\v 29 Therefore I also came without complaint when I was sent for. I ask therefore, why did you send for me?” +\p +\v 30 Cornelius said, “Four days ago, I was fasting until this hour; and at the ninth hour,\f + \fr 10:30 \ft 3:00 p.m.\f* I prayed in my house, and behold, a man stood before me in bright clothing +\v 31 and said, ‘Cornelius, your prayer is heard, and your gifts to the needy are remembered in the sight of God. +\v 32 Send therefore to Joppa and summon Simon, who is also called Peter. He is staying in the house of a tanner named Simon, by the seaside. When he comes, he will speak to you.’ +\v 33 Therefore I sent to you at once, and it was good of you to come. Now therefore we are all here present in the sight of God to hear all things that have been commanded you by God.” +\p +\v 34 Peter opened his mouth and said, “Truly I perceive that God doesn’t show favoritism; +\v 35 but in every nation he who fears him and works righteousness is acceptable to him. +\v 36 The word which he sent to the children of Israel, preaching good news of peace by Jesus Christ—he is Lord of all— +\v 37 you yourselves know what happened, which was proclaimed throughout all Judea, beginning from Galilee, after the baptism which John preached; +\v 38 how God anointed Jesus of Nazareth with the Holy Spirit and with power, who went about doing good and healing all who were oppressed by the devil, for God was with him. +\v 39 We are witnesses of everything he did both in the country of the Jews and in Jerusalem; whom they also\f + \fr 10:39 \ft TR omits “also”\f* killed, hanging him on a tree. +\v 40 God raised him up the third day and gave him to be revealed, +\v 41 not to all the people, but to witnesses who were chosen before by God, to us, who ate and drank with him after he rose from the dead. +\v 42 He commanded us to preach to the people and to testify that this is he who is appointed by God as the Judge of the living and the dead. +\v 43 All the prophets testify about him, that through his name everyone who believes in him will receive remission of sins.” +\p +\v 44 While Peter was still speaking these words, the Holy Spirit fell on all those who heard the word. +\v 45 They of the circumcision who believed were amazed, as many as came with Peter, because the gift of the Holy Spirit was also poured out on the Gentiles. +\v 46 For they heard them speaking in other languages and magnifying God. +\p Then Peter answered, +\v 47 “Can anyone forbid these people from being baptized with water? They have received the Holy Spirit just like us.” +\v 48 He commanded them to be baptized in the name of Jesus Christ. Then they asked him to stay some days. +\c 11 +\p +\v 1 Now the apostles and the brothers\f + \fr 11:1 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* who were in Judea heard that the Gentiles had also received the word of God. +\v 2 When Peter had come up to Jerusalem, those who were of the circumcision contended with him, +\v 3 saying, “You went in to uncircumcised men and ate with them!” +\p +\v 4 But Peter began, and explained to them in order, saying, +\v 5 “I was in the city of Joppa praying, and in a trance I saw a vision: a certain container descending, like it was a great sheet let down from heaven by four corners. It came as far as me. +\v 6 When I had looked intently at it, I considered, and saw the four-footed animals of the earth, wild animals, creeping things, and birds of the sky. +\v 7 I also heard a voice saying to me, \wj ‘Rise, Peter, kill and eat!’ \wj* +\v 8 But I said, ‘Not so, Lord, for nothing unholy or unclean has ever entered into my mouth.’ +\v 9 But a voice answered me the second time out of heaven, \wj ‘What God has cleansed, don’t you call unclean.’\wj* +\v 10 This was done three times, and all were drawn up again into heaven. +\v 11 Behold, immediately three men stood before the house where I was, having been sent from Caesarea to me. +\v 12 The Spirit told me to go with them without discriminating. These six brothers also accompanied me, and we entered into the man’s house. +\v 13 He told us how he had seen the angel standing in his house and saying to him, ‘Send to Joppa and get Simon, who is called Peter, +\v 14 who will speak to you words by which you will be saved, you and all your house.’ +\v 15 As I began to speak, the Holy Spirit fell on them, even as on us at the beginning. +\v 16 I remembered the word of the Lord, how he said, \wj ‘John indeed baptized in water, but you will be baptized in the Holy Spirit.’\wj* +\v 17 If then God gave to them the same gift as us when we believed in the Lord Jesus Christ, who was I, that I could withstand God?” +\p +\v 18 When they heard these things, they held their peace and glorified God, saying, “Then God has also granted to the Gentiles repentance to life!” +\p +\v 19 They therefore who were scattered abroad by the oppression that arose about Stephen traveled as far as Phoenicia, Cyprus, and Antioch, speaking the word to no one except to Jews only. +\v 20 But there were some of them, men of Cyprus and Cyrene, who, when they had come to Antioch, spoke to the Hellenists,\f + \fr 11:20 \ft A Hellenist is someone who keeps Greek customs and culture.\f* preaching the Lord Jesus. +\v 21 The hand of the Lord was with them, and a great number believed and turned to the Lord. +\v 22 The report concerning them came to the ears of the assembly which was in Jerusalem. They sent out Barnabas to go as far as Antioch, +\v 23 who, when he had come, and had seen the grace of God, was glad. He exhorted them all, that with purpose of heart they should remain near to the Lord. +\v 24 For he was a good man, and full of the Holy Spirit and of faith, and many people were added to the Lord. +\p +\v 25 Barnabas went out to Tarsus to look for Saul. +\v 26 When he had found him, he brought him to Antioch. For a whole year they were gathered together with the assembly, and taught many people. The disciples were first called Christians in Antioch. +\p +\v 27 Now in these days, prophets came down from Jerusalem to Antioch. +\v 28 One of them named Agabus stood up and indicated by the Spirit that there should be a great famine all over the world, which also happened in the days of Claudius. +\v 29 As any of the disciples had plenty, each determined to send relief to the brothers who lived in Judea; +\v 30 which they also did, sending it to the elders by the hands of Barnabas and Saul. +\c 12 +\p +\v 1 Now about that time, King Herod stretched out his hands to oppress some of the assembly. +\v 2 He killed James, the brother of John, with the sword. +\v 3 When he saw that it pleased the Jews, he proceeded to seize Peter also. This was during the days of unleavened bread. +\v 4 When he had arrested him, he put him in prison and delivered him to four squads of four soldiers each to guard him, intending to bring him out to the people after the Passover. +\v 5 Peter therefore was kept in the prison, but constant prayer was made by the assembly to God for him. +\v 6 The same night when Herod was about to bring him out, Peter was sleeping between two soldiers, bound with two chains. Guards in front of the door kept the prison. +\p +\v 7 And behold, an angel of the Lord stood by him, and a light shone in the cell. He struck Peter on the side and woke him up, saying, “Stand up quickly!” His chains fell off his hands. +\v 8 The angel said to him, “Get dressed and put on your sandals.” He did so. He said to him, “Put on your cloak and follow me.” +\v 9 And he went out and followed him. He didn’t know that what was being done by the angel was real, but thought he saw a vision. +\v 10 When they were past the first and the second guard, they came to the iron gate that leads into the city, which opened to them by itself. They went out and went down one street, and immediately the angel departed from him. +\p +\v 11 When Peter had come to himself, he said, “Now I truly know that the Lord has sent out his angel and delivered me out of the hand of Herod, and from everything the Jewish people were expecting.” +\v 12 Thinking about that, he came to the house of Mary, the mother of John who was called Mark, where many were gathered together and were praying. +\v 13 When Peter knocked at the door of the gate, a servant girl named Rhoda came to answer. +\v 14 When she recognized Peter’s voice, she didn’t open the gate for joy, but ran in and reported that Peter was standing in front of the gate. +\p +\v 15 They said to her, “You are crazy!” But she insisted that it was so. They said, “It is his angel.” +\v 16 But Peter continued knocking. When they had opened, they saw him and were amazed. +\v 17 But he, beckoning to them with his hand to be silent, declared to them how the Lord had brought him out of the prison. He said, “Tell these things to James and to the brothers.” Then he departed and went to another place. +\p +\v 18 Now as soon as it was day, there was no small stir among the soldiers about what had become of Peter. +\v 19 When Herod had sought for him and didn’t find him, he examined the guards, then commanded that they should be put to death. He went down from Judea to Caesarea, and stayed there. +\p +\v 20 Now Herod was very angry with the people of Tyre and Sidon. They came with one accord to him and, having made Blastus, the king’s personal aide, their friend, they asked for peace, because their country depended on the king’s country for food. +\v 21 On an appointed day, Herod dressed himself in royal clothing, sat on the throne, and gave a speech to them. +\v 22 The people shouted, “The voice of a god, and not of a man!” +\v 23 Immediately an angel of the Lord struck him, because he didn’t give God the glory. Then he was eaten by worms and died. +\p +\v 24 But the word of God grew and multiplied. +\v 25 Barnabas and Saul returned to\f + \fr 12:25 \ft TR reads “from” instead of “to”\f* Jerusalem when they had fulfilled their service, also taking with them John who was called Mark. +\c 13 +\p +\v 1 Now in the assembly that was at Antioch there were some prophets and teachers: Barnabas, Simeon who was called Niger, Lucius of Cyrene, Manaen the foster brother of Herod the tetrarch, and Saul. +\v 2 As they served the Lord and fasted, the Holy Spirit said, “Separate Barnabas and Saul for me, for the work to which I have called them.” +\p +\v 3 Then, when they had fasted and prayed and laid their hands on them, they sent them away. +\v 4 So, being sent out by the Holy Spirit, they went down to Seleucia. From there they sailed to Cyprus. +\v 5 When they were at Salamis, they proclaimed God’s word in the Jewish synagogues. They also had John as their attendant. +\v 6 When they had gone through the island to Paphos, they found a certain sorcerer, a false prophet, a Jew whose name was Bar Jesus, +\v 7 who was with the proconsul, Sergius Paulus, a man of understanding. This man summoned Barnabas and Saul, and sought to hear the word of God. +\v 8 But Elymas the sorcerer (for so is his name by interpretation) withstood them, seeking to turn the proconsul away from the faith. +\v 9 But Saul, who is also called Paul, filled with the Holy Spirit, fastened his eyes on him +\v 10 and said, “You son of the devil, full of all deceit and all cunning, you enemy of all righteousness, will you not cease to pervert the right ways of the Lord? +\v 11 Now, behold, the hand of the Lord is on you, and you will be blind, not seeing the sun for a season!” +\p Immediately a mist and darkness fell on him. He went around seeking someone to lead him by the hand. +\v 12 Then the proconsul, when he saw what was done, believed, being astonished at the teaching of the Lord. +\p +\v 13 Now Paul and his company set sail from Paphos and came to Perga in Pamphylia. John departed from them and returned to Jerusalem. +\v 14 But they, passing on from Perga, came to Antioch of Pisidia. They went into the synagogue on the Sabbath day and sat down. +\v 15 After the reading of the law and the prophets, the rulers of the synagogue sent to them, saying, “Brothers, if you have any word of exhortation for the people, speak.” +\p +\v 16 Paul stood up, and gesturing with his hand said, “Men of Israel, and you who fear God, listen. +\v 17 The God of this people\f + \fr 13:17 \ft TR, NU add “Israel”\f* chose our fathers, and exalted the people when they stayed as aliens in the land of Egypt, and with an uplifted arm, he led them out of it. +\v 18 For a period of about forty years he put up with them in the wilderness. +\v 19 When he had destroyed seven nations in the land of Canaan, he gave them their land for an inheritance for about four hundred fifty years. +\v 20 After these things, he gave them judges until Samuel the prophet. +\v 21 Afterward they asked for a king, and God gave to them Saul the son of Kish, a man of the tribe of Benjamin, for forty years. +\v 22 When he had removed him, he raised up David to be their king, to whom he also testified, ‘I have found David the son of Jesse, a man after my heart, who will do all my will.’ +\v 23 From this man’s offspring, God has brought salvation\f + \fr 13:23 \ft TR, NU read “a Savior, Jesus” instead of “salvation”\f* to Israel according to his promise, +\v 24 before his coming, when John had first preached the baptism of repentance to Israel.\f + \fr 13:24 \ft TR, NU read “to all the people of Israel” instead of “to Israel”\f* +\v 25 As John was fulfilling his course, he said, ‘What do you suppose that I am? I am not he. But behold, one comes after me, the sandals of whose feet I am not worthy to untie.’ +\p +\v 26 “Brothers, children of the stock of Abraham, and those among you who fear God, the word of this salvation is sent out to you. +\v 27 For those who dwell in Jerusalem, and their rulers, because they didn’t know him, nor the voices of the prophets which are read every Sabbath, fulfilled them by condemning him. +\v 28 Though they found no cause for death, they still asked Pilate to have him killed. +\v 29 When they had fulfilled all things that were written about him, they took him down from the tree and laid him in a tomb. +\v 30 But God raised him from the dead, +\v 31 and he was seen for many days by those who came up with him from Galilee to Jerusalem, who are his witnesses to the people. +\v 32 We bring you good news of the promise made to the fathers, +\v 33 that God has fulfilled this to us, their children, in that he raised up Jesus. As it is also written in the second psalm, +\q1 ‘You are my Son. +\q2 Today I have become your father.’\x + \xo 13:33 \xt Psalm 2:7\x* +\p +\v 34 “Concerning that he raised him up from the dead, now no more to return to corruption, he has spoken thus: ‘I will give you the holy and sure blessings of David.’\x + \xo 13:34 \xt Isaiah 55:3\x* +\v 35 Therefore he says also in another psalm, ‘You will not allow your Holy One to see decay.’\x + \xo 13:35 \xt Psalm 16:10\x* +\v 36 For David, after he had in his own generation served the counsel of God, fell asleep, was laid with his fathers, and saw decay. +\v 37 But he whom God raised up saw no decay. +\v 38 Be it known to you therefore, brothers,\f + \fr 13:38 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* that through this man is proclaimed to you remission of sins; +\v 39 and by him everyone who believes is justified from all things, from which you could not be justified by the law of Moses. +\v 40 Beware therefore, lest that come on you which is spoken in the prophets: +\q1 +\v 41 ‘Behold, you scoffers! +\q2 Wonder and perish, +\q2 for I work a work in your days, +\q2 a work which you will in no way believe, if one declares it to you.’” \x + \xo 13:41 \xt Habakkuk 1:5\x* +\p +\v 42 So when the Jews went out of the synagogue, the Gentiles begged that these words might be preached to them the next Sabbath. +\v 43 Now when the synagogue broke up, many of the Jews and of the devout proselytes followed Paul and Barnabas; who, speaking to them, urged them to continue in the grace of God. +\p +\v 44 The next Sabbath, almost the whole city was gathered together to hear the word of God. +\v 45 But when the Jews saw the multitudes, they were filled with jealousy, and contradicted the things which were spoken by Paul, and blasphemed. +\p +\v 46 Paul and Barnabas spoke out boldly, and said, “It was necessary that God’s word should be spoken to you first. Since indeed you thrust it from yourselves, and judge yourselves unworthy of eternal life, behold, we turn to the Gentiles. +\v 47 For so has the Lord commanded us, saying, +\q1 ‘I have set you as a light for the Gentiles, +\q2 that you should bring salvation to the uttermost parts of the earth.’” \x + \xo 13:47 \xt Isaiah 49:6\x* +\p +\v 48 As the Gentiles heard this, they were glad and glorified the word of God. As many as were appointed to eternal life believed. +\v 49 The Lord’s word was spread abroad throughout all the region. +\v 50 But the Jews stirred up the devout and prominent women and the chief men of the city, and stirred up a persecution against Paul and Barnabas, and threw them out of their borders. +\v 51 But they shook off the dust of their feet against them, and came to Iconium. +\v 52 The disciples were filled with joy and with the Holy Spirit. +\c 14 +\p +\v 1 In Iconium, they entered together into the synagogue of the Jews, and so spoke that a great multitude both of Jews and of Greeks believed. +\v 2 But the disbelieving\f + \fr 14:2 \ft or, disobedient\f* Jews stirred up and embittered the souls of the Gentiles against the brothers. +\v 3 Therefore they stayed there a long time, speaking boldly in the Lord, who testified to the word of his grace, granting signs and wonders to be done by their hands. +\v 4 But the multitude of the city was divided. Part sided with the Jews and part with the apostles. +\v 5 When some of both the Gentiles and the Jews, with their rulers, made a violent attempt to mistreat and stone them, +\v 6 they became aware of it and fled to the cities of Lycaonia, Lystra, Derbe, and the surrounding region. +\v 7 There they preached the Good News. +\p +\v 8 At Lystra a certain man sat, impotent in his feet, a cripple from his mother’s womb, who never had walked. +\v 9 He was listening to Paul speaking, who, fastening eyes on him and seeing that he had faith to be made whole, +\v 10 said with a loud voice, “Stand upright on your feet!” He leaped up and walked. +\v 11 When the multitude saw what Paul had done, they lifted up their voice, saying in the language of Lycaonia, “The gods have come down to us in the likeness of men!” +\v 12 They called Barnabas “Jupiter”, and Paul “Mercury”, because he was the chief speaker. +\v 13 The priest of Jupiter, whose temple was in front of their city, brought oxen and garlands to the gates, and would have made a sacrifice along with the multitudes. +\p +\v 14 But when the apostles, Barnabas and Paul, heard of it, they tore their clothes and sprang into the multitude, crying out, +\v 15 “Men, why are you doing these things? We also are men of the same nature as you, and bring you good news, that you should turn from these vain things to the living God, who made the sky, the earth, the sea, and all that is in them; +\v 16 who in the generations gone by allowed all the nations to walk in their own ways. +\v 17 Yet he didn’t leave himself without witness, in that he did good and gave you\f + \fr 14:17 \ft TR reads “us” instead of “you”\f* rains from the sky and fruitful seasons, filling our hearts with food and gladness.” +\p +\v 18 Even saying these things, they hardly stopped the multitudes from making a sacrifice to them. +\v 19 But some Jews from Antioch and Iconium came there, and having persuaded the multitudes, they stoned Paul and dragged him out of the city, supposing that he was dead. +\p +\v 20 But as the disciples stood around him, he rose up, and entered into the city. On the next day he went out with Barnabas to Derbe. +\p +\v 21 When they had preached the Good News to that city and had made many disciples, they returned to Lystra, Iconium, and Antioch, +\v 22 strengthening the souls of the disciples, exhorting them to continue in the faith, and that through many afflictions we must enter into God’s Kingdom. +\v 23 When they had appointed elders for them in every assembly, and had prayed with fasting, they commended them to the Lord on whom they had believed. +\p +\v 24 They passed through Pisidia and came to Pamphylia. +\v 25 When they had spoken the word in Perga, they went down to Attalia. +\v 26 From there they sailed to Antioch, from where they had been committed to the grace of God for the work which they had fulfilled. +\v 27 When they had arrived and had gathered the assembly together, they reported all the things that God had done with them, and that he had opened a door of faith to the nations. +\v 28 They stayed there with the disciples for a long time. +\c 15 +\p +\v 1 Some men came down from Judea and taught the brothers,\f + \fr 15:1 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* “Unless you are circumcised after the custom of Moses, you can’t be saved.” +\v 2 Therefore when Paul and Barnabas had no small discord and discussion with them, they appointed Paul, Barnabas, and some others of them to go up to Jerusalem to the apostles and elders about this question. +\v 3 They, being sent on their way by the assembly, passed through both Phoenicia and Samaria, declaring the conversion of the Gentiles. They caused great joy to all the brothers. +\v 4 When they had come to Jerusalem, they were received by the assembly and the apostles and the elders, and they reported everything that God had done with them. +\p +\v 5 But some of the sect of the Pharisees who believed rose up, saying, “It is necessary to circumcise them, and to command them to keep the law of Moses.” +\p +\v 6 The apostles and the elders were gathered together to see about this matter. +\v 7 When there had been much discussion, Peter rose up and said to them, “Brothers, you know that a good while ago God made a choice among you that by my mouth the nations should hear the word of the Good News and believe. +\v 8 God, who knows the heart, testified about them, giving them the Holy Spirit, just like he did to us. +\v 9 He made no distinction between us and them, cleansing their hearts by faith. +\v 10 Now therefore why do you tempt God, that you should put a yoke on the neck of the disciples which neither our fathers nor we were able to bear? +\v 11 But we believe that we are saved through the grace of the Lord Jesus,\f + \fr 15:11 \ft TR adds “Christ”\f* just as they are.” +\p +\v 12 All the multitude kept silence, and they listened to Barnabas and Paul reporting what signs and wonders God had done among the nations through them. +\v 13 After they were silent, James answered, “Brothers, listen to me. +\v 14 Simeon has reported how God first visited the nations to take out of them a people for his name. +\v 15 This agrees with the words of the prophets. As it is written, +\q1 +\v 16 ‘After these things I will return. +\q1 I will again build the tabernacle of David, which has fallen. +\q1 I will again build its ruins. +\q1 I will set it up +\v 17 that the rest of men may seek after the Lord: +\q1 all the Gentiles who are called by my name, +\q1 says the Lord, who does all these things.’\x + \xo 15:17 \xt Amos 9:11-12\x* +\p +\v 18 “All of God’s works are known to him from eternity. +\v 19 Therefore my judgment is that we don’t trouble those from among the Gentiles who turn to God, +\v 20 but that we write to them that they abstain from the pollution of idols, from sexual immorality, from what is strangled, and from blood. +\v 21 For Moses from generations of old has in every city those who preach him, being read in the synagogues every Sabbath.” +\p +\v 22 Then it seemed good to the apostles and the elders, with the whole assembly, to choose men out of their company, and send them to Antioch with Paul and Barnabas: Judas called Barsabbas, and Silas, chief men among the brothers.\f + \fr 15:22 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* +\v 23 They wrote these things by their hand: +\p “The apostles, the elders, and the brothers, to the brothers who are of the Gentiles in Antioch, Syria, and Cilicia: greetings. +\v 24 Because we have heard that some who went out from us have troubled you with words, unsettling your souls, saying, ‘You must be circumcised and keep the law,’ to whom we gave no commandment; +\v 25 it seemed good to us, having come to one accord, to choose out men and send them to you with our beloved Barnabas and Paul, +\v 26 men who have risked their lives for the name of our Lord Jesus Christ. +\v 27 We have sent therefore Judas and Silas, who themselves will also tell you the same things by word of mouth. +\v 28 For it seemed good to the Holy Spirit, and to us, to lay no greater burden on you than these necessary things: +\v 29 that you abstain from things sacrificed to idols, from blood, from things strangled, and from sexual immorality, from which if you keep yourselves, it will be well with you. Farewell.” +\p +\v 30 So, when they were sent off, they came to Antioch. Having gathered the multitude together, they delivered the letter. +\v 31 When they had read it, they rejoiced over the encouragement. +\v 32 Judas and Silas, also being prophets themselves, encouraged the brothers with many words and strengthened them. +\v 33 After they had spent some time there, they were dismissed in peace from the brothers to the apostles. +\v 34 \f + \fr 15:34 \ft Some manuscripts add: \fqa But it seemed good to Silas to stay there. \f* +\v 35 But Paul and Barnabas stayed in Antioch, teaching and preaching the word of the Lord, with many others also. +\p +\v 36 After some days Paul said to Barnabas, “Let’s return now and visit our brothers in every city in which we proclaimed the word of the Lord, to see how they are doing.” +\v 37 Barnabas planned to take John, who was called Mark, with them also. +\v 38 But Paul didn’t think that it was a good idea to take with them someone who had withdrawn from them in Pamphylia, and didn’t go with them to do the work. +\v 39 Then the contention grew so sharp that they separated from each other. Barnabas took Mark with him and sailed away to Cyprus, +\v 40 but Paul chose Silas and went out, being commended by the brothers to the grace of God. +\v 41 He went through Syria and Cilicia, strengthening the assemblies. +\c 16 +\p +\v 1 He came to Derbe and Lystra; and behold, a certain disciple was there, named Timothy, the son of a Jewess who believed, but his father was a Greek. +\v 2 The brothers who were at Lystra and Iconium gave a good testimony about him. +\v 3 Paul wanted to have him go out with him, and he took and circumcised him because of the Jews who were in those parts, for they all knew that his father was a Greek. +\v 4 As they went on their way through the cities, they delivered the decrees to them to keep which had been ordained by the apostles and elders who were at Jerusalem. +\v 5 So the assemblies were strengthened in the faith, and increased in number daily. +\p +\v 6 When they had gone through the region of Phrygia and Galatia, they were forbidden by the Holy Spirit to speak the word in Asia. +\v 7 When they had come opposite Mysia, they tried to go into Bithynia, but the Spirit didn’t allow them. +\v 8 Passing by Mysia, they came down to Troas. +\v 9 A vision appeared to Paul in the night. There was a man of Macedonia standing, begging him and saying, “Come over into Macedonia and help us.” +\v 10 When he had seen the vision, immediately we sought to go out to Macedonia, concluding that the Lord had called us to preach the Good News to them. +\v 11 Setting sail therefore from Troas, we made a straight course to Samothrace, and the day following to Neapolis; +\v 12 and from there to Philippi, which is a city of Macedonia, the foremost of the district, a Roman colony. We were staying some days in this city. +\p +\v 13 On the Sabbath day we went outside of the city by a riverside, where we supposed there was a place of prayer, and we sat down and spoke to the women who had come together. +\v 14 A certain woman named Lydia, a seller of purple, of the city of Thyatira, one who worshiped God, heard us. The Lord opened her heart to listen to the things which were spoken by Paul. +\v 15 When she and her household were baptized, she begged us, saying, “If you have judged me to be faithful to the Lord, come into my house and stay.” So she persuaded us. +\p +\v 16 As we were going to prayer, a certain girl having a spirit of divination met us, who brought her masters much gain by fortune telling. +\v 17 Following Paul and us, she cried out, “These men are servants of the Most High God, who proclaim to us a way of salvation!” +\v 18 She was doing this for many days. +\p But Paul, becoming greatly annoyed, turned and said to the spirit, “I command you in the name of Jesus Christ to come out of her!” It came out that very hour. +\v 19 But when her masters saw that the hope of their gain was gone, they seized Paul and Silas and dragged them into the marketplace before the rulers. +\v 20 When they had brought them to the magistrates, they said, “These men, being Jews, are agitating our city +\v 21 and advocate customs which it is not lawful for us to accept or to observe, being Romans.” +\p +\v 22 The multitude rose up together against them and the magistrates tore their clothes from them, then commanded them to be beaten with rods. +\v 23 When they had laid many stripes on them, they threw them into prison, charging the jailer to keep them safely. +\v 24 Having received such a command, he threw them into the inner prison and secured their feet in the stocks. +\p +\v 25 But about midnight Paul and Silas were praying and singing hymns to God, and the prisoners were listening to them. +\v 26 Suddenly there was a great earthquake, so that the foundations of the prison were shaken; and immediately all the doors were opened, and everyone’s bonds were loosened. +\v 27 The jailer, being roused out of sleep and seeing the prison doors open, drew his sword and was about to kill himself, supposing that the prisoners had escaped. +\v 28 But Paul cried with a loud voice, saying, “Don’t harm yourself, for we are all here!” +\p +\v 29 He called for lights, sprang in, fell down trembling before Paul and Silas, +\v 30 brought them out, and said, “Sirs, what must I do to be saved?” +\p +\v 31 They said, “Believe in the Lord Jesus Christ, and you will be saved, you and your household.” +\v 32 They spoke the word of the Lord to him, and to all who were in his house. +\p +\v 33 He took them the same hour of the night and washed their stripes, and was immediately baptized, he and all his household. +\v 34 He brought them up into his house and set food before them, and rejoiced greatly with all his household, having believed in God. +\p +\v 35 But when it was day, the magistrates sent the sergeants, saying, “Let those men go.” +\p +\v 36 The jailer reported these words to Paul, saying, “The magistrates have sent to let you go; now therefore come out and go in peace.” +\p +\v 37 But Paul said to them, “They have beaten us publicly without a trial, men who are Romans, and have cast us into prison! Do they now release us secretly? No, most certainly, but let them come themselves and bring us out!” +\p +\v 38 The sergeants reported these words to the magistrates, and they were afraid when they heard that they were Romans, +\v 39 and they came and begged them. When they had brought them out, they asked them to depart from the city. +\v 40 They went out of the prison and entered into Lydia’s house. When they had seen the brothers, they encouraged them, then departed. +\c 17 +\p +\v 1 Now when they had passed through Amphipolis and Apollonia, they came to Thessalonica, where there was a Jewish synagogue. +\v 2 Paul, as was his custom, went in to them; and for three Sabbath days reasoned with them from the Scriptures, +\v 3 explaining and demonstrating that the Christ had to suffer and rise again from the dead, and saying, “This Jesus, whom I proclaim to you, is the Christ.” +\p +\v 4 Some of them were persuaded and joined Paul and Silas: of the devout Greeks a great multitude, and not a few of the chief women. +\v 5 But the unpersuaded Jews took along\f + \fr 17:5 \ft TR reads “And the Jews who were unpersuaded, becoming envious and taking along” instead of “But the unpersuaded Jews took along”\f* some wicked men from the marketplace and gathering a crowd, set the city in an uproar. Assaulting the house of Jason, they sought to bring them out to the people. +\v 6 When they didn’t find them, they dragged Jason and certain brothers\f + \fr 17:6 \ft The word for “brothers” here and where the context allows may be also correctly translated “brothers and sisters” or “siblings.”\f* before the rulers of the city, crying, “These who have turned the world upside down have come here also, +\v 7 whom Jason has received. These all act contrary to the decrees of Caesar, saying that there is another king, Jesus!” +\v 8 The multitude and the rulers of the city were troubled when they heard these things. +\v 9 When they had taken security from Jason and the rest, they let them go. +\p +\v 10 The brothers immediately sent Paul and Silas away by night to Beroea. When they arrived, they went into the Jewish synagogue. +\p +\v 11 Now these were more noble than those in Thessalonica, in that they received the word with all readiness of mind, examining the Scriptures daily to see whether these things were so. +\v 12 Many of them therefore believed; also of the prominent Greek women, and not a few men. +\v 13 But when the Jews of Thessalonica had knowledge that the word of God was proclaimed by Paul at Beroea also, they came there likewise, agitating the multitudes. +\v 14 Then the brothers immediately sent out Paul to go as far as to the sea, and Silas and Timothy still stayed there. +\v 15 But those who escorted Paul brought him as far as Athens. Receiving a commandment to Silas and Timothy that they should come to him very quickly, they departed. +\p +\v 16 Now while Paul waited for them at Athens, his spirit was provoked within him as he saw the city full of idols. +\v 17 So he reasoned in the synagogue with the Jews and the devout persons, and in the marketplace every day with those who met him. +\v 18 Some of the Epicurean and Stoic philosophers also\f + \fr 17:18 \ft TR omits “also” \f* were conversing with him. Some said, “What does this babbler want to say?” +\p Others said, “He seems to be advocating foreign deities,” because he preached Jesus and the resurrection. +\p +\v 19 They took hold of him and brought him to the Areopagus, saying, “May we know what this new teaching is, which you are speaking about? +\v 20 For you bring certain strange things to our ears. We want to know therefore what these things mean.” +\v 21 Now all the Athenians and the strangers living there spent their time in nothing else, but either to tell or to hear some new thing. +\p +\v 22 Paul stood in the middle of the Areopagus and said, “You men of Athens, I perceive that you are very religious in all things. +\v 23 For as I passed along and observed the objects of your worship, I also found an altar with this inscription: ‘TO AN UNKNOWN GOD.’ What therefore you worship in ignorance, I announce to you. +\v 24 The God who made the world and all things in it, he, being Lord of heaven and earth, doesn’t dwell in temples made with hands. +\v 25 He isn’t served by men’s hands, as though he needed anything, seeing he himself gives to all life and breath and all things. +\v 26 He made from one blood every nation of men to dwell on all the surface of the earth, having determined appointed seasons and the boundaries of their dwellings, +\v 27 that they should seek the Lord, if perhaps they might reach out for him and find him, though he is not far from each one of us. +\v 28 ‘For in him we live, move, and have our being.’ As some of your own poets have said, ‘For we are also his offspring.’ +\v 29 Being then the offspring of God, we ought not to think that the Divine Nature is like gold, or silver, or stone, engraved by art and design of man. +\v 30 The times of ignorance therefore God overlooked. But now he commands that all people everywhere should repent, +\v 31 because he has appointed a day in which he will judge the world in righteousness by the man whom he has ordained; of which he has given assurance to all men, in that he has raised him from the dead.” +\p +\v 32 Now when they heard of the resurrection of the dead, some mocked; but others said, “We want to hear you again concerning this.” +\p +\v 33 Thus Paul went out from among them. +\v 34 But certain men joined with him and believed, including Dionysius the Areopagite, and a woman named Damaris, and others with them. +\c 18 +\p +\v 1 After these things Paul departed from Athens and came to Corinth. +\v 2 He found a certain Jew named Aquila, a man of Pontus by race, who had recently come from Italy with his wife Priscilla, because Claudius had commanded all the Jews to depart from Rome. He came to them, +\v 3 and because he practiced the same trade, he lived with them and worked, for by trade they were tent makers. +\v 4 He reasoned in the synagogue every Sabbath and persuaded Jews and Greeks. +\p +\v 5 When Silas and Timothy came down from Macedonia, Paul was compelled by the Spirit, testifying to the Jews that Jesus was the Christ. +\v 6 When they opposed him and blasphemed, he shook out his clothing and said to them, “Your blood be on your own heads! I am clean. From now on, I will go to the Gentiles!” +\p +\v 7 He departed there and went into the house of a certain man named Justus, one who worshiped God, whose house was next door to the synagogue. +\v 8 Crispus, the ruler of the synagogue, believed in the Lord with all his house. Many of the Corinthians, when they heard, believed and were baptized. +\v 9 The Lord said to Paul in the night by a vision, \wj “Don’t be afraid, but speak and don’t be silent; \wj* +\v 10 \wj for I am with you, and no one will attack you to harm you, for I have many people in this city.”\wj* +\p +\v 11 He lived there a year and six months, teaching the word of God among them. +\v 12 But when Gallio was proconsul of Achaia, the Jews with one accord rose up against Paul and brought him before the judgment seat, +\v 13 saying, “This man persuades men to worship God contrary to the law.” +\p +\v 14 But when Paul was about to open his mouth, Gallio said to the Jews, “If indeed it were a matter of wrong or of wicked crime, you Jews, it would be reasonable that I should bear with you; +\v 15 but if they are questions about words and names and your own law, look to it yourselves. For I don’t want to be a judge of these matters.” +\v 16 So he drove them from the judgment seat. +\p +\v 17 Then all the Greeks seized Sosthenes, the ruler of the synagogue, and beat him before the judgment seat. Gallio didn’t care about any of these things. +\p +\v 18 Paul, having stayed after this many more days, took his leave of the brothers,\f + \fr 18:18 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* and sailed from there for Syria, together with Priscilla and Aquila. He shaved his head in Cenchreae, for he had a vow. +\v 19 He came to Ephesus, and he left them there; but he himself entered into the synagogue and reasoned with the Jews. +\v 20 When they asked him to stay with them a longer time, he declined; +\v 21 but taking his leave of them, he said, “I must by all means keep this coming feast in Jerusalem, but I will return again to you if God wills.” Then he set sail from Ephesus. +\p +\v 22 When he had landed at Caesarea, he went up and greeted the assembly, and went down to Antioch. +\v 23 Having spent some time there, he departed and went through the region of Galatia and Phrygia, in order, establishing all the disciples. +\v 24 Now a certain Jew named Apollos, an Alexandrian by race, an eloquent man, came to Ephesus. He was mighty in the Scriptures. +\v 25 This man had been instructed in the way of the Lord; and being fervent in spirit, he spoke and taught accurately the things concerning Jesus, although he knew only the baptism of John. +\v 26 He began to speak boldly in the synagogue. But when Priscilla and Aquila heard him, they took him aside, and explained to him the way of God more accurately. +\p +\v 27 When he had determined to pass over into Achaia, the brothers encouraged him; and wrote to the disciples to receive him. When he had come, he greatly helped those who had believed through grace; +\v 28 for he powerfully refuted the Jews, publicly showing by the Scriptures that Jesus was the Christ. +\c 19 +\p +\v 1 While Apollos was at Corinth, Paul, having passed through the upper country, came to Ephesus and found certain disciples. +\v 2 He said to them, “Did you receive the Holy Spirit when you believed?” +\p They said to him, “No, we haven’t even heard that there is a Holy Spirit.” +\p +\v 3 He said, “Into what then were you baptized?” +\p They said, “Into John’s baptism.” +\p +\v 4 Paul said, “John indeed baptized with the baptism of repentance, saying to the people that they should believe in the one who would come after him, that is, in Christ Jesus.”\f + \fr 19:4 \ft NU omits Christ.\f* +\p +\v 5 When they heard this, they were baptized in the name of the Lord Jesus. +\v 6 When Paul had laid his hands on them, the Holy Spirit came on them and they spoke with other languages and prophesied. +\v 7 They were about twelve men in all. +\p +\v 8 He entered into the synagogue and spoke boldly for a period of three months, reasoning and persuading about the things concerning God’s Kingdom. +\p +\v 9 But when some were hardened and disobedient, speaking evil of the Way before the multitude, he departed from them and separated the disciples, reasoning daily in the school of Tyrannus. +\v 10 This continued for two years, so that all those who lived in Asia heard the word of the Lord Jesus, both Jews and Greeks. +\p +\v 11 God worked special miracles by the hands of Paul, +\v 12 so that even handkerchiefs or aprons were carried away from his body to the sick, and the diseases departed from them, and the evil spirits went out. +\v 13 But some of the itinerant Jews, exorcists, took on themselves to invoke over those who had the evil spirits the name of the Lord Jesus, saying, “We adjure you by Jesus whom Paul preaches.” +\v 14 There were seven sons of one Sceva, a Jewish chief priest, who did this. +\p +\v 15 The evil spirit answered, “Jesus I know, and Paul I know, but who are you?” +\v 16 The man in whom the evil spirit was leaped on them, overpowered them, and prevailed against them, so that they fled out of that house naked and wounded. +\v 17 This became known to all, both Jews and Greeks, who lived at Ephesus. Fear fell on them all, and the name of the Lord Jesus was magnified. +\v 18 Many also of those who had believed came, confessing and declaring their deeds. +\v 19 Many of those who practiced magical arts brought their books together and burned them in the sight of all. They counted their price, and found it to be fifty thousand pieces of silver.\f + \fr 19:19 \ft The 50,000 pieces of silver here probably referred to 50,000 drachmas. If so, the value of the burned books was equivalent to about 160 man-years of wages for agricultural laborers\f* +\v 20 So the word of the Lord was growing and becoming mighty. +\p +\v 21 Now after these things had ended, Paul determined in the Spirit, when he had passed through Macedonia and Achaia, to go to Jerusalem, saying, “After I have been there, I must also see Rome.” +\p +\v 22 Having sent into Macedonia two of those who served him, Timothy and Erastus, he himself stayed in Asia for a while. +\v 23 About that time there arose no small disturbance concerning the Way. +\v 24 For a certain man named Demetrius, a silversmith who made silver shrines of Artemis, brought no little business to the craftsmen, +\v 25 whom he gathered together with the workmen of like occupation, and said, “Sirs, you know that by this business we have our wealth. +\v 26 You see and hear that not at Ephesus alone, but almost throughout all Asia, this Paul has persuaded and turned away many people, saying that they are no gods that are made with hands. +\v 27 Not only is there danger that this our trade come into disrepute, but also that the temple of the great goddess Artemis will be counted as nothing and her majesty destroyed, whom all Asia and the world worships.” +\p +\v 28 When they heard this they were filled with anger, and cried out, saying, “Great is Artemis of the Ephesians!” +\v 29 The whole city was filled with confusion, and they rushed with one accord into the theater, having seized Gaius and Aristarchus, men of Macedonia, Paul’s companions in travel. +\v 30 When Paul wanted to enter in to the people, the disciples didn’t allow him. +\v 31 Certain also of the Asiarchs, being his friends, sent to him and begged him not to venture into the theater. +\v 32 Some therefore cried one thing, and some another, for the assembly was in confusion. Most of them didn’t know why they had come together. +\v 33 They brought Alexander out of the multitude, the Jews putting him forward. Alexander beckoned with his hand, and would have made a defense to the people. +\v 34 But when they perceived that he was a Jew, all with one voice for a time of about two hours cried out, “Great is Artemis of the Ephesians!” +\p +\v 35 When the town clerk had quieted the multitude, he said, “You men of Ephesus, what man is there who doesn’t know that the city of the Ephesians is temple keeper of the great goddess Artemis, and of the image which fell down from Zeus? +\v 36 Seeing then that these things can’t be denied, you ought to be quiet and to do nothing rash. +\v 37 For you have brought these men here, who are neither robbers of temples nor blasphemers of your goddess. +\v 38 If therefore Demetrius and the craftsmen who are with him have a matter against anyone, the courts are open and there are proconsuls. Let them press charges against one another. +\v 39 But if you seek anything about other matters, it will be settled in the regular assembly. +\v 40 For indeed we are in danger of being accused concerning today’s riot, there being no cause. Concerning it, we wouldn’t be able to give an account of this commotion.” +\v 41 When he had thus spoken, he dismissed the assembly. +\c 20 +\p +\v 1 After the uproar had ceased, Paul sent for the disciples, took leave of them, and departed to go into Macedonia. +\v 2 When he had gone through those parts and had encouraged them with many words, he came into Greece. +\v 3 When he had spent three months there, and a plot was made against him by Jews as he was about to set sail for Syria, he determined to return through Macedonia. +\v 4 These accompanied him as far as Asia: Sopater of Beroea, Aristarchus and Secundus of the Thessalonians, Gaius of Derbe, Timothy, and Tychicus and Trophimus of Asia. +\v 5 But these had gone ahead, and were waiting for us at Troas. +\v 6 We sailed away from Philippi after the days of Unleavened Bread, and came to them at Troas in five days, where we stayed seven days. +\p +\v 7 On the first day of the week, when the disciples were gathered together to break bread, Paul talked with them, intending to depart on the next day; and continued his speech until midnight. +\v 8 There were many lights in the upper room where we\f + \fr 20:8 \ft TR reads “they” instead of “we”\f* were gathered together. +\v 9 A certain young man named Eutychus sat in the window, weighed down with deep sleep. As Paul spoke still longer, being weighed down by his sleep, he fell down from the third floor and was taken up dead. +\v 10 Paul went down and fell upon him, and embracing him said, “Don’t be troubled, for his life is in him.” +\p +\v 11 When he had gone up, had broken bread and eaten, and had talked with them a long while, even until break of day, he departed. +\v 12 They brought the boy in alive, and were greatly comforted. +\p +\v 13 But we, going ahead to the ship, set sail for Assos, intending to take Paul aboard there; for he had so arranged, intending himself to go by land. +\v 14 When he met us at Assos, we took him aboard and came to Mitylene. +\v 15 Sailing from there, we came the following day opposite Chios. The next day we touched at Samos and stayed at Trogyllium, and the day after we came to Miletus. +\v 16 For Paul had determined to sail past Ephesus, that he might not have to spend time in Asia; for he was hastening, if it were possible for him, to be in Jerusalem on the day of Pentecost. +\p +\v 17 From Miletus he sent to Ephesus and called to himself the elders of the assembly. +\v 18 When they had come to him, he said to them, “You yourselves know, from the first day that I set foot in Asia, how I was with you all the time, +\v 19 serving the Lord with all humility, with many tears, and with trials which happened to me by the plots of the Jews; +\v 20 how I didn’t shrink from declaring to you anything that was profitable, teaching you publicly and from house to house, +\v 21 testifying both to Jews and to Greeks repentance toward God and faith toward our Lord Jesus.\f + \fr 20:21 \ft TR adds “Christ”\f* +\v 22 Now, behold, I go bound by the Spirit to Jerusalem, not knowing what will happen to me there; +\v 23 except that the Holy Spirit testifies in every city, saying that bonds and afflictions wait for me. +\v 24 But these things don’t count; nor do I hold my life dear to myself, so that I may finish my race with joy, and the ministry which I received from the Lord Jesus, to fully testify to the Good News of the grace of God. +\p +\v 25 “Now, behold, I know that you all, among whom I went about preaching God’s Kingdom, will see my face no more. +\v 26 Therefore I testify to you today that I am clean from the blood of all men, +\v 27 for I didn’t shrink from declaring to you the whole counsel of God. +\v 28 Take heed, therefore, to yourselves and to all the flock, in which the Holy Spirit has made you overseers, to shepherd the assembly of the Lord and\f + \fr 20:28 \ft TR, NU omit “the Lord and”\f* God which he purchased with his own blood. +\v 29 For I know that after my departure, vicious wolves will enter in among you, not sparing the flock. +\v 30 Men will arise from among your own selves, speaking perverse things, to draw away the disciples after them. +\v 31 Therefore watch, remembering that for a period of three years I didn’t cease to admonish everyone night and day with tears. +\v 32 Now, brothers,\f + \fr 20:32 \ft The word for “brothers” here and where the context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* I entrust you to God and to the word of his grace, which is able to build up and to give you the inheritance among all those who are sanctified. +\v 33 I coveted no one’s silver, gold, or clothing. +\v 34 You yourselves know that these hands served my necessities, and those who were with me. +\v 35 In all things I gave you an example, that so laboring you ought to help the weak, and to remember the words of the Lord Jesus, that he himself said, \wj ‘It is more blessed to give than to receive.’\wj*” +\p +\v 36 When he had spoken these things, he knelt down and prayed with them all. +\v 37 They all wept freely, and fell on Paul’s neck and kissed him, +\v 38 sorrowing most of all because of the word which he had spoken, that they should see his face no more. Then they accompanied him to the ship. +\c 21 +\p +\v 1 When we had departed from them and had set sail, we came with a straight course to Cos, and the next day to Rhodes, and from there to Patara. +\v 2 Having found a ship crossing over to Phoenicia, we went aboard and set sail. +\v 3 When we had come in sight of Cyprus, leaving it on the left hand, we sailed to Syria and landed at Tyre, for the ship was there to unload her cargo. +\v 4 Having found disciples, we stayed there seven days. These said to Paul through the Spirit that he should not go up to Jerusalem. +\v 5 When those days were over, we departed and went on our journey. They all, with wives and children, brought us on our way until we were out of the city. Kneeling down on the beach, we prayed. +\v 6 After saying goodbye to each other, we went on board the ship, and they returned home again. +\p +\v 7 When we had finished the voyage from Tyre, we arrived at Ptolemais. We greeted the brothers and stayed with them one day. +\v 8 On the next day, we who were Paul’s companions departed and came to Caesarea. +\p We entered into the house of Philip the evangelist, who was one of the seven, and stayed with him. +\v 9 Now this man had four virgin daughters who prophesied. +\v 10 As we stayed there some days, a certain prophet named Agabus came down from Judea. +\v 11 Coming to us and taking Paul’s belt, he bound his own feet and hands, and said, “The Holy Spirit says: ‘So the Jews at Jerusalem will bind the man who owns this belt, and will deliver him into the hands of the Gentiles.’” +\p +\v 12 When we heard these things, both we and the people of that place begged him not to go up to Jerusalem. +\v 13 Then Paul answered, “What are you doing, weeping and breaking my heart? For I am ready not only to be bound, but also to die at Jerusalem for the name of the Lord Jesus.” +\p +\v 14 When he would not be persuaded, we ceased, saying, “The Lord’s will be done.” +\p +\v 15 After these days we took up our baggage and went up to Jerusalem. +\v 16 Some of the disciples from Caesarea also went with us, bringing one Mnason of Cyprus, an early disciple, with whom we would stay. +\p +\v 17 When we had come to Jerusalem, the brothers received us gladly. +\v 18 The day following, Paul went in with us to James; and all the elders were present. +\v 19 When he had greeted them, he reported one by one the things which God had worked among the Gentiles through his ministry. +\v 20 They, when they heard it, glorified God. They said to him, “You see, brother, how many thousands there are among the Jews of those who have believed, and they are all zealous for the law. +\v 21 They have been informed about you, that you teach all the Jews who are among the Gentiles to forsake Moses, telling them not to circumcise their children and not to walk after the customs. +\v 22 What then? The assembly must certainly meet, for they will hear that you have come. +\v 23 Therefore do what we tell you. We have four men who have taken a vow. +\v 24 Take them and purify yourself with them, and pay their expenses for them, that they may shave their heads. Then all will know that there is no truth in the things that they have been informed about you, but that you yourself also walk keeping the law. +\v 25 But concerning the Gentiles who believe, we have written our decision that they should observe no such thing, except that they should keep themselves from food offered to idols, from blood, from strangled things, and from sexual immorality.” +\p +\v 26 Then Paul took the men, and the next day purified himself and went with them into the temple, declaring the fulfillment of the days of purification, until the offering was offered for every one of them. +\v 27 When the seven days were almost completed, the Jews from Asia, when they saw him in the temple, stirred up all the multitude and laid hands on him, +\v 28 crying out, “Men of Israel, help! This is the man who teaches all men everywhere against the people, and the law, and this place. Moreover, he also brought Greeks into the temple and has defiled this holy place!” +\v 29 For they had seen Trophimus the Ephesian, with him in the city, and they supposed that Paul had brought him into the temple. +\p +\v 30 All the city was moved and the people ran together. They seized Paul and dragged him out of the temple. Immediately the doors were shut. +\v 31 As they were trying to kill him, news came up to the commanding officer of the regiment that all Jerusalem was in an uproar. +\v 32 Immediately he took soldiers and centurions and ran down to them. They, when they saw the chief captain and the soldiers, stopped beating Paul. +\v 33 Then the commanding officer came near, arrested him, commanded him to be bound with two chains, and inquired who he was and what he had done. +\v 34 Some shouted one thing and some another, among the crowd. When he couldn’t find out the truth because of the noise, he commanded him to be brought into the barracks. +\p +\v 35 When he came to the stairs, he was carried by the soldiers because of the violence of the crowd; +\v 36 for the multitude of the people followed after, crying out, “Away with him!” +\v 37 As Paul was about to be brought into the barracks, he asked the commanding officer, “May I speak to you?” +\p He said, “Do you know Greek? +\v 38 Aren’t you then the Egyptian who before these days stirred up to sedition and led out into the wilderness the four thousand men of the Assassins?” +\p +\v 39 But Paul said, “I am a Jew from Tarsus in Cilicia, a citizen of no insignificant city. I beg you, allow me to speak to the people.” +\p +\v 40 When he had given him permission, Paul, standing on the stairs, beckoned with his hand to the people. When there was a great silence, he spoke to them in the Hebrew language, saying, +\c 22 +\p +\v 1 “Brothers and fathers, listen to the defense which I now make to you.” +\p +\v 2 When they heard that he spoke to them in the Hebrew language, they were even more quiet. +\p He said, +\v 3 “I am indeed a Jew, born in Tarsus of Cilicia, but brought up in this city at the feet of Gamaliel, instructed according to the strict tradition of the law of our fathers, being zealous for God, even as you all are today. +\v 4 I persecuted this Way to the death, binding and delivering into prisons both men and women, +\v 5 as also the high priest and all the council of the elders testify, from whom also I received letters to the brothers, and traveled to Damascus to bring them also who were there to Jerusalem in bonds to be punished. +\p +\v 6 “As I made my journey and came close to Damascus, about noon suddenly a great light shone around me from the sky. +\v 7 I fell to the ground and heard a voice saying to me, \wj ‘Saul, Saul, why are you persecuting me?’\wj* +\v 8 I answered, ‘Who are you, Lord?’ He said to me, \wj ‘I am Jesus of Nazareth, whom you persecute.’\wj* +\p +\v 9 “Those who were with me indeed saw the light and were afraid, but they didn’t understand the voice of him who spoke to me. +\v 10 I said, ‘What shall I do, Lord?’ The Lord said to me, \wj ‘Arise, and go into Damascus. There you will be told about all things which are appointed for you to do.’\wj* +\v 11 When I couldn’t see for the glory of that light, being led by the hand of those who were with me, I came into Damascus. +\p +\v 12 “One Ananias, a devout man according to the law, well reported of by all the Jews who lived in Damascus, +\v 13 came to me, and standing by me said to me, ‘Brother Saul, receive your sight!’ In that very hour I looked up at him. +\v 14 He said, ‘The God of our fathers has appointed you to know his will, and to see the Righteous One, and to hear a voice from his mouth. +\v 15 For you will be a witness for him to all men of what you have seen and heard. +\v 16 Now why do you wait? Arise, be baptized, and wash away your sins, calling on the name of the Lord.’ +\p +\v 17 “When I had returned to Jerusalem and while I prayed in the temple, I fell into a trance +\v 18 and saw him saying to me, \wj ‘Hurry and get out of Jerusalem quickly, because they will not receive testimony concerning me from you.’\wj* +\v 19 I said, ‘Lord, they themselves know that I imprisoned and beat in every synagogue those who believed in you. +\v 20 When the blood of Stephen, your witness, was shed, I also was standing by, consenting to his death, and guarding the cloaks of those who killed him.’ +\p +\v 21 “He said to me, \wj ‘Depart, for I will send you out far from here to the Gentiles.’\wj*” +\p +\v 22 They listened to him until he said that; then they lifted up their voice and said, “Rid the earth of this fellow, for he isn’t fit to live!” +\p +\v 23 As they cried out, threw off their cloaks, and threw dust into the air, +\v 24 the commanding officer commanded him to be brought into the barracks, ordering him to be examined by scourging, that he might know for what crime they shouted against him like that. +\v 25 When they had tied him up with thongs, Paul asked the centurion who stood by, “Is it lawful for you to scourge a man who is a Roman, and not found guilty?” +\p +\v 26 When the centurion heard it, he went to the commanding officer and told him, “Watch what you are about to do, for this man is a Roman!” +\p +\v 27 The commanding officer came and asked him, “Tell me, are you a Roman?” +\p He said, “Yes.” +\p +\v 28 The commanding officer answered, “I bought my citizenship for a great price.” +\p Paul said, “But I was born a Roman.” +\p +\v 29 Immediately those who were about to examine him departed from him, and the commanding officer also was afraid when he realized that he was a Roman, because he had bound him. +\v 30 But on the next day, desiring to know the truth about why he was accused by the Jews, he freed him from the bonds and commanded the chief priests and all the council to come together, and brought Paul down and set him before them. +\c 23 +\p +\v 1 Paul, looking steadfastly at the council, said, “Brothers, I have lived before God in all good conscience until today.” +\p +\v 2 The high priest, Ananias, commanded those who stood by him to strike him on the mouth. +\p +\v 3 Then Paul said to him, “God will strike you, you whitewashed wall! Do you sit to judge me according to the law, and command me to be struck contrary to the law?” +\p +\v 4 Those who stood by said, “Do you malign God’s high priest?” +\p +\v 5 Paul said, “I didn’t know, brothers, that he was high priest. For it is written, ‘You shall not speak evil of a ruler of your people.’”\x + \xo 23:5 \xt Exodus 22:28\x* +\p +\v 6 But when Paul perceived that the one part were Sadducees and the other Pharisees, he cried out in the council, “Men and brothers, I am a Pharisee, a son of Pharisees. Concerning the hope and resurrection of the dead I am being judged!” +\p +\v 7 When he had said this, an argument arose between the Pharisees and Sadducees, and the crowd was divided. +\v 8 For the Sadducees say that there is no resurrection, nor angel, nor spirit; but the Pharisees confess all of these. +\v 9 A great clamor arose, and some of the scribes of the Pharisees’ part stood up, and contended, saying, “We find no evil in this man. But if a spirit or angel has spoken to him, let’s not fight against God!” +\p +\v 10 When a great argument arose, the commanding officer, fearing that Paul would be torn in pieces by them, commanded the soldiers to go down and take him by force from among them and bring him into the barracks. +\p +\v 11 The following night, the Lord stood by him and said, \wj “Cheer up, Paul, for as you have testified about me at Jerusalem, so you must testify also at Rome.”\wj* +\p +\v 12 When it was day, some of the Jews banded together and bound themselves under a curse, saying that they would neither eat nor drink until they had killed Paul. +\v 13 There were more than forty people who had made this conspiracy. +\v 14 They came to the chief priests and the elders, and said, “We have bound ourselves under a great curse to taste nothing until we have killed Paul. +\v 15 Now therefore, you with the council inform the commanding officer that he should bring him down to you tomorrow, as though you were going to judge his case more exactly. We are ready to kill him before he comes near.” +\p +\v 16 But Paul’s sister’s son heard they were lying in wait, and he came and entered into the barracks and told Paul. +\v 17 Paul summoned one of the centurions and said, “Bring this young man to the commanding officer, for he has something to tell him.” +\p +\v 18 So he took him and brought him to the commanding officer and said, “Paul, the prisoner, summoned me and asked me to bring this young man to you. He has something to tell you.” +\p +\v 19 The commanding officer took him by the hand, and going aside, asked him privately, “What is it that you have to tell me?” +\p +\v 20 He said, “The Jews have agreed to ask you to bring Paul down to the council tomorrow, as though intending to inquire somewhat more accurately concerning him. +\v 21 Therefore don’t yield to them, for more than forty men lie in wait for him, who have bound themselves under a curse to neither eat nor drink until they have killed him. Now they are ready, looking for the promise from you.” +\p +\v 22 So the commanding officer let the young man go, charging him, “Tell no one that you have revealed these things to me.” +\p +\v 23 He called to himself two of the centurions, and said, “Prepare two hundred soldiers to go as far as Caesarea, with seventy horsemen and two hundred men armed with spears, at the third hour of the night.”\f + \fr 23:23 \ft about 9:00 p.m.\f* +\v 24 He asked them to provide mounts, that they might set Paul on one, and bring him safely to Felix the governor. +\v 25 He wrote a letter like this: +\p +\v 26 “Claudius Lysias to the most excellent governor Felix: Greetings. +\p +\v 27 “This man was seized by the Jews, and was about to be killed by them when I came with the soldiers and rescued him, having learned that he was a Roman. +\v 28 Desiring to know the cause why they accused him, I brought him down to their council. +\v 29 I found him to be accused about questions of their law, but not to be charged with anything worthy of death or of imprisonment. +\v 30 When I was told that the Jews lay in wait for the man, I sent him to you immediately, charging his accusers also to bring their accusations against him before you. Farewell.” +\p +\v 31 So the soldiers, carrying out their orders, took Paul and brought him by night to Antipatris. +\v 32 But on the next day they left the horsemen to go with him, and returned to the barracks. +\v 33 When they came to Caesarea and delivered the letter to the governor, they also presented Paul to him. +\v 34 When the governor had read it, he asked what province he was from. When he understood that he was from Cilicia, he said, +\v 35 “I will hear you fully when your accusers also arrive.” He commanded that he be kept in Herod’s palace. +\c 24 +\p +\v 1 After five days, the high priest, Ananias, came down with certain elders and an orator, one Tertullus. They informed the governor against Paul. +\v 2 When he was called, Tertullus began to accuse him, saying, “Seeing that by you we enjoy much peace, and that prosperity is coming to this nation by your foresight, +\v 3 we accept it in all ways and in all places, most excellent Felix, with all thankfulness. +\v 4 But that I don’t delay you, I entreat you to bear with us and hear a few words. +\v 5 For we have found this man to be a plague, an instigator of insurrections among all the Jews throughout the world, and a ringleader of the sect of the Nazarenes. +\v 6 He even tried to profane the temple, and we arrested him.\f + \fr 24:6 \ft TR adds “We wanted to judge him according to our law,”\f* +\v 7 \f + \fr 24:7 \ft TR adds “but the commanding officer, Lysias, came by and with great violence took him out of our hands,”\f* +\v 8 \f + \fr 24:8 \ft TR adds “commanding his accusers to come to you.”\f*By examining him yourself you may ascertain all these things of which we accuse him.” +\p +\v 9 The Jews also joined in the attack, affirming that these things were so. +\p +\v 10 When the governor had beckoned to him to speak, Paul answered, “Because I know that you have been a judge of this nation for many years, I cheerfully make my defense, +\v 11 seeing that you can verify that it is not more than twelve days since I went up to worship at Jerusalem. +\v 12 In the temple they didn’t find me disputing with anyone or stirring up a crowd, either in the synagogues or in the city. +\v 13 Nor can they prove to you the things of which they now accuse me. +\v 14 But this I confess to you, that according to the Way, which they call a sect, so I serve the God of our fathers, believing all things which are according to the law, and which are written in the prophets; +\v 15 having hope toward God, which these also themselves look for, that there will be a resurrection of the dead, both of the just and unjust. +\v 16 In this I also practice always having a conscience void of offense toward God and men. +\v 17 Now after some years, I came to bring gifts for the needy to my nation, and offerings; +\v 18 amid which certain Jews from Asia found me purified in the temple, not with a mob, nor with turmoil. +\v 19 They ought to have been here before you and to make accusation if they had anything against me. +\v 20 Or else let these men themselves say what injustice they found in me when I stood before the council, +\v 21 unless it is for this one thing that I cried standing among them, ‘Concerning the resurrection of the dead I am being judged before you today!’” +\p +\v 22 But Felix, having more exact knowledge concerning the Way, deferred them, saying, “When Lysias, the commanding officer, comes down, I will decide your case.” +\v 23 He ordered the centurion that Paul should be kept in custody and should have some privileges, and not to forbid any of his friends to serve him or to visit him. +\p +\v 24 After some days, Felix came with Drusilla his wife, who was a Jewess, and sent for Paul and heard him concerning the faith in Christ Jesus. +\v 25 As he reasoned about righteousness, self-control, and the judgment to come, Felix was terrified, and answered, “Go your way for this time, and when it is convenient for me, I will summon you.” +\v 26 Meanwhile, he also hoped that money would be given to him by Paul, that he might release him. Therefore also he sent for him more often and talked with him. +\p +\v 27 But when two years were fulfilled, Felix was succeeded by Porcius Festus, and desiring to gain favor with the Jews, Felix left Paul in bonds. +\c 25 +\p +\v 1 Festus therefore, having come into the province, after three days went up to Jerusalem from Caesarea. +\v 2 Then the high priest and the principal men of the Jews informed him against Paul, and they begged him, +\v 3 asking a favor against him, that he would summon him to Jerusalem, plotting to kill him on the way. +\v 4 However Festus answered that Paul should be kept in custody at Caesarea, and that he himself was about to depart shortly. +\v 5 “Let them therefore”, he said, “that are in power among you go down with me, and if there is anything wrong in the man, let them accuse him.” +\p +\v 6 When he had stayed among them more than ten days, he went down to Caesarea, and on the next day he sat on the judgment seat, and commanded Paul to be brought. +\v 7 When he had come, the Jews who had come down from Jerusalem stood around him, bringing against him many and grievous charges which they could not prove, +\v 8 while he said in his defense, “Neither against the law of the Jews, nor against the temple, nor against Caesar, have I sinned at all.” +\p +\v 9 But Festus, desiring to gain favor with the Jews, answered Paul and said, “Are you willing to go up to Jerusalem and be judged by me there concerning these things?” +\p +\v 10 But Paul said, “I am standing before Caesar’s judgment seat, where I ought to be tried. I have done no wrong to the Jews, as you also know very well. +\v 11 For if I have done wrong and have committed anything worthy of death, I don’t refuse to die; but if none of those things is true that they accuse me of, no one can give me up to them. I appeal to Caesar!” +\p +\v 12 Then Festus, when he had conferred with the council, answered, “You have appealed to Caesar. To Caesar you shall go.” +\p +\v 13 Now when some days had passed, King Agrippa and Bernice arrived at Caesarea and greeted Festus. +\v 14 As he stayed there many days, Festus laid Paul’s case before the king, saying, “There is a certain man left a prisoner by Felix; +\v 15 about whom, when I was at Jerusalem, the chief priests and the elders of the Jews informed me, asking for a sentence against him. +\v 16 I answered them that it is not the custom of the Romans to give up any man to destruction before the accused has met the accusers face to face and has had opportunity to make his defense concerning the matter laid against him. +\v 17 When therefore they had come together here, I didn’t delay, but on the next day sat on the judgment seat and commanded the man to be brought. +\v 18 When the accusers stood up, they brought no charges against him of such things as I supposed; +\v 19 but had certain questions against him about their own religion and about one Jesus, who was dead, whom Paul affirmed to be alive. +\v 20 Being perplexed how to inquire concerning these things, I asked whether he was willing to go to Jerusalem and there be judged concerning these matters. +\v 21 But when Paul had appealed to be kept for the decision of the emperor, I commanded him to be kept until I could send him to Caesar.” +\p +\v 22 Agrippa said to Festus, “I also would like to hear the man myself.” +\p “Tomorrow,” he said, “you shall hear him.” +\p +\v 23 So on the next day, when Agrippa and Bernice had come with great pomp, and they had entered into the place of hearing with the commanding officers and the principal men of the city, at the command of Festus, Paul was brought in. +\v 24 Festus said, “King Agrippa, and all men who are here present with us, you see this man about whom all the multitude of the Jews petitioned me, both at Jerusalem and here, crying that he ought not to live any longer. +\v 25 But when I found that he had committed nothing worthy of death, and as he himself appealed to the emperor, I determined to send him, +\v 26 of whom I have no certain thing to write to my lord. Therefore I have brought him out before you, and especially before you, King Agrippa, that, after examination I may have something to write. +\v 27 For it seems to me unreasonable, in sending a prisoner, not to also specify the charges against him.” +\c 26 +\p +\v 1 Agrippa said to Paul, “You may speak for yourself.” +\p Then Paul stretched out his hand, and made his defense. +\v 2 “I think myself happy, King Agrippa, that I am to make my defense before you today concerning all the things that I am accused by the Jews, +\v 3 especially because you are expert in all customs and questions which are among the Jews. Therefore I beg you to hear me patiently. +\p +\v 4 “Indeed, all the Jews know my way of life from my youth up, which was from the beginning among my own nation and at Jerusalem; +\v 5 having known me from the first, if they are willing to testify, that after the strictest sect of our religion I lived a Pharisee. +\v 6 Now I stand here to be judged for the hope of the promise made by God to our fathers, +\v 7 which our twelve tribes, earnestly serving night and day, hope to attain. Concerning this hope I am accused by the Jews, King Agrippa! +\v 8 Why is it judged incredible with you if God does raise the dead? +\p +\v 9 “I myself most certainly thought that I ought to do many things contrary to the name of Jesus of Nazareth. +\v 10 I also did this in Jerusalem. I both shut up many of the saints in prisons, having received authority from the chief priests; and when they were put to death I gave my vote against them. +\v 11 Punishing them often in all the synagogues, I tried to make them blaspheme. Being exceedingly enraged against them, I persecuted them even to foreign cities. +\p +\v 12 “Whereupon as I traveled to Damascus with the authority and commission from the chief priests, +\v 13 at noon, O king, I saw on the way a light from the sky, brighter than the sun, shining around me and those who traveled with me. +\v 14 When we had all fallen to the earth, I heard a voice saying to me in the Hebrew language, \wj ‘Saul, Saul, why are you persecuting me? It is hard for you to kick against the goads.’\wj* +\p +\v 15 “I said, ‘Who are you, Lord?’ +\p “He said, \wj ‘I am Jesus, whom you are persecuting. \wj* +\v 16 \wj But arise, and stand on your feet, for I have appeared to you for this purpose: to appoint you a servant and a witness both of the things which you have seen and of the things which I will reveal to you; \wj* +\v 17 \wj delivering you from the people and from the Gentiles, to whom I send you, \wj* +\v 18 \wj to open their eyes, that they may turn from darkness to light and from the power of Satan to God, that they may receive remission of sins and an inheritance among those who are sanctified by faith in me.’\wj* +\p +\v 19 “Therefore, King Agrippa, I was not disobedient to the heavenly vision, +\v 20 but declared first to them of Damascus, at Jerusalem, and throughout all the country of Judea, and also to the Gentiles, that they should repent and turn to God, doing works worthy of repentance. +\v 21 For this reason the Jews seized me in the temple and tried to kill me. +\v 22 Having therefore obtained the help that is from God, I stand to this day testifying both to small and great, saying nothing but what the prophets and Moses said would happen, +\v 23 how the Christ must suffer, and how, by the resurrection of the dead, he would be first to proclaim light both to these people and to the Gentiles.” +\p +\v 24 As he thus made his defense, Festus said with a loud voice, “Paul, you are crazy! Your great learning is driving you insane!” +\p +\v 25 But he said, “I am not crazy, most excellent Festus, but boldly declare words of truth and reasonableness. +\v 26 For the king knows of these things, to whom also I speak freely. For I am persuaded that none of these things is hidden from him, for this has not been done in a corner. +\v 27 King Agrippa, do you believe the prophets? I know that you believe.” +\p +\v 28 Agrippa said to Paul, “With a little persuasion are you trying to make me a Christian?” +\p +\v 29 Paul said, “I pray to God, that whether with little or with much, not only you, but also all that hear me today, might become such as I am, except for these bonds.” +\p +\v 30 The king rose up with the governor and Bernice, and those who sat with them. +\v 31 When they had withdrawn, they spoke to one another, saying, “This man does nothing worthy of death or of bonds.” +\v 32 Agrippa said to Festus, “This man might have been set free if he had not appealed to Caesar.” +\c 27 +\p +\v 1 When it was determined that we should sail for Italy, they delivered Paul and certain other prisoners to a centurion named Julius, of the Augustan band. +\v 2 Embarking in a ship of Adramyttium, which was about to sail to places on the coast of Asia, we put to sea, Aristarchus, a Macedonian of Thessalonica being with us. +\v 3 The next day, we touched at Sidon. Julius treated Paul kindly and gave him permission to go to his friends and refresh himself. +\v 4 Putting to sea from there, we sailed under the lee of Cyprus, because the winds were contrary. +\v 5 When we had sailed across the sea which is off Cilicia and Pamphylia, we came to Myra, a city of Lycia. +\v 6 There the centurion found a ship of Alexandria sailing for Italy, and he put us on board. +\v 7 When we had sailed slowly many days, and had come with difficulty opposite Cnidus, the wind not allowing us further, we sailed under the lee of Crete, opposite Salmone. +\v 8 With difficulty sailing along it we came to a certain place called Fair Havens, near the city of Lasea. +\p +\v 9 When much time had passed and the voyage was now dangerous because the Fast had now already gone by, Paul admonished them +\v 10 and said to them, “Sirs, I perceive that the voyage will be with injury and much loss, not only of the cargo and the ship, but also of our lives.” +\v 11 But the centurion gave more heed to the master and to the owner of the ship than to those things which were spoken by Paul. +\v 12 Because the haven was not suitable to winter in, the majority advised going to sea from there, if by any means they could reach Phoenix and winter there, which is a port of Crete, looking southwest and northwest. +\p +\v 13 When the south wind blew softly, supposing that they had obtained their purpose, they weighed anchor and sailed along Crete, close to shore. +\v 14 But before long, a stormy wind beat down from shore, which is called Euroclydon.\f + \fr 27:14 \ft Or, “a northeaster”.\f* +\v 15 When the ship was caught and couldn’t face the wind, we gave way to it and were driven along. +\v 16 Running under the lee of a small island called Clauda, we were able, with difficulty, to secure the boat. +\v 17 After they had hoisted it up, they used cables to help reinforce the ship. Fearing that they would run aground on the Syrtis sand bars, they lowered the sea anchor, and so were driven along. +\v 18 As we labored exceedingly with the storm, the next day they began to throw things overboard. +\v 19 On the third day, they threw out the ship’s tackle with their own hands. +\v 20 When neither sun nor stars shone on us for many days, and no small storm pressed on us, all hope that we would be saved was now taken away. +\p +\v 21 When they had been long without food, Paul stood up in the middle of them and said, “Sirs, you should have listened to me, and not have set sail from Crete and have gotten this injury and loss. +\v 22 Now I exhort you to cheer up, for there will be no loss of life among you, but only of the ship. +\v 23 For there stood by me this night an angel, belonging to the God whose I am and whom I serve, +\v 24 saying, ‘Don’t be afraid, Paul. You must stand before Caesar. Behold, God has granted you all those who sail with you.’ +\v 25 Therefore, sirs, cheer up! For I believe God, that it will be just as it has been spoken to me. +\v 26 But we must run aground on a certain island.” +\p +\v 27 But when the fourteenth night had come, as we were driven back and forth in the Adriatic Sea, about midnight the sailors surmised that they were drawing near to some land. +\v 28 They took soundings and found twenty fathoms.\f + \fr 27:28 \ft 20 fathoms = 120 feet = 36.6 meters\f* After a little while, they took soundings again, and found fifteen fathoms.\f + \fr 27:28 \ft 15 fathoms = 90 feet = 27.4 meters\f* +\v 29 Fearing that we would run aground on rocky ground, they let go four anchors from the stern, and wished for daylight. +\v 30 As the sailors were trying to flee out of the ship and had lowered the boat into the sea, pretending that they would lay out anchors from the bow, +\v 31 Paul said to the centurion and to the soldiers, “Unless these stay in the ship, you can’t be saved.” +\v 32 Then the soldiers cut away the ropes of the boat and let it fall off. +\p +\v 33 While the day was coming on, Paul begged them all to take some food, saying, “Today is the fourteenth day that you wait and continue fasting, having taken nothing. +\v 34 Therefore I beg you to take some food, for this is for your safety; for not a hair will perish from any of your heads.” +\v 35 When he had said this and had taken bread, he gave thanks to God in the presence of all; then he broke it and began to eat. +\v 36 Then they all cheered up, and they also took food. +\v 37 In all, we were two hundred seventy-six souls on the ship. +\v 38 When they had eaten enough, they lightened the ship, throwing out the wheat into the sea. +\v 39 When it was day, they didn’t recognize the land, but they noticed a certain bay with a beach, and they decided to try to drive the ship onto it. +\v 40 Casting off the anchors, they left them in the sea, at the same time untying the rudder ropes. Hoisting up the foresail to the wind, they made for the beach. +\v 41 But coming to a place where two seas met, they ran the vessel aground. The bow struck and remained immovable, but the stern began to break up by the violence of the waves. +\p +\v 42 The soldiers’ counsel was to kill the prisoners, so that none of them would swim out and escape. +\v 43 But the centurion, desiring to save Paul, stopped them from their purpose, and commanded that those who could swim should throw themselves overboard first to go toward the land; +\v 44 and the rest should follow, some on planks and some on other things from the ship. So they all escaped safely to the land. +\c 28 +\p +\v 1 When we had escaped, then they\f + \fr 28:1 \ft NU reads “we”\f* learned that the island was called Malta. +\v 2 The natives showed us uncommon kindness; for they kindled a fire and received us all, because of the present rain and because of the cold. +\v 3 But when Paul had gathered a bundle of sticks and laid them on the fire, a viper came out because of the heat and fastened on his hand. +\v 4 When the natives saw the creature hanging from his hand, they said to one another, “No doubt this man is a murderer, whom, though he has escaped from the sea, yet Justice has not allowed to live.” +\v 5 However he shook off the creature into the fire, and wasn’t harmed. +\v 6 But they expected that he would have swollen or fallen down dead suddenly, but when they watched for a long time and saw nothing bad happen to him, they changed their minds and said that he was a god. +\p +\v 7 Now in the neighborhood of that place were lands belonging to the chief man of the island, named Publius, who received us and courteously entertained us for three days. +\v 8 The father of Publius lay sick of fever and dysentery. Paul entered in to him, prayed, and laying his hands on him, healed him. +\v 9 Then when this was done, the rest also who had diseases in the island came and were cured. +\v 10 They also honored us with many honors; and when we sailed, they put on board the things that we needed. +\p +\v 11 After three months, we set sail in a ship of Alexandria which had wintered in the island, whose figurehead was “The Twin Brothers.” +\v 12 Touching at Syracuse, we stayed there three days. +\v 13 From there we circled around and arrived at Rhegium. After one day, a south wind sprang up, and on the second day we came to Puteoli, +\v 14 where we found brothers,\f + \fr 28:14 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* and were entreated to stay with them for seven days. So we came to Rome. +\v 15 From there the brothers, when they heard of us, came to meet us as far as The Market of Appius and The Three Taverns. When Paul saw them, he thanked God and took courage. +\v 16 When we entered into Rome, the centurion delivered the prisoners to the captain of the guard, but Paul was allowed to stay by himself with the soldier who guarded him. +\p +\v 17 After three days Paul called together those who were the leaders of the Jews. When they had come together, he said to them, “I, brothers, though I had done nothing against the people or the customs of our fathers, still was delivered prisoner from Jerusalem into the hands of the Romans, +\v 18 who, when they had examined me, desired to set me free, because there was no cause of death in me. +\v 19 But when the Jews spoke against it, I was constrained to appeal to Caesar, not that I had anything about which to accuse my nation. +\v 20 For this cause therefore I asked to see you and to speak with you. For because of the hope of Israel I am bound with this chain.” +\p +\v 21 They said to him, “We neither received letters from Judea concerning you, nor did any of the brothers come here and report or speak any evil of you. +\v 22 But we desire to hear from you what you think. For, as concerning this sect, it is known to us that everywhere it is spoken against.” +\p +\v 23 When they had appointed him a day, many people came to him at his lodging. He explained to them, testifying about God’s Kingdom, and persuading them concerning Jesus, both from the law of Moses and from the prophets, from morning until evening. +\v 24 Some believed the things which were spoken, and some disbelieved. +\v 25 When they didn’t agree among themselves, they departed after Paul had spoken one message: “The Holy Spirit spoke rightly through Isaiah the prophet to our fathers, +\v 26 saying, +\q1 ‘Go to this people and say, +\q1 in hearing, you will hear, +\q2 but will in no way understand. +\q1 In seeing, you will see, +\q2 but will in no way perceive. +\q1 +\v 27 For this people’s heart has grown callous. +\q2 Their ears are dull of hearing. +\q2 Their eyes they have closed. +\q1 Lest they should see with their eyes, +\q2 hear with their ears, +\q2 understand with their heart, +\q2 and would turn again, +\q2 then I would heal them.’\x + \xo 28:27 \xt Isaiah 6:9-10\x* +\p +\v 28 “Be it known therefore to you that the salvation of God is sent to the nations, and they will listen.” +\p +\v 29 When he had said these words, the Jews departed, having a great dispute among themselves.\f + \fr 28:29 \ft NU omits verse 29.\f* +\p +\v 30 Paul stayed two whole years in his own rented house and received all who were coming to him, +\v 31 preaching God’s Kingdom and teaching the things concerning the Lord Jesus Christ with all boldness, without hindrance. diff --git a/c-sharp/assets/WEB/46ROMengWEBUS.SFM b/c-sharp/assets/WEB/46ROMengWEBUS.SFM new file mode 100644 index 0000000000..98f5cb8a3d --- /dev/null +++ b/c-sharp/assets/WEB/46ROMengWEBUS.SFM @@ -0,0 +1,627 @@ +\id ROM 45-ROM-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Romans +\toc1 Paul’s Letter to the Romans +\toc2 Romans +\toc3 Romans +\mt2 Paul’s Letter to the +\mt1 Romans +\c 1 +\p +\v 1 Paul, a servant of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* called to be an apostle, set apart for the Good News of God, +\v 2 which he promised before through his prophets in the holy Scriptures, +\v 3 concerning his Son, who was born of the offspring\f + \fr 1:3 \ft or, seed\f* of David according to the flesh, +\v 4 who was declared to be the Son of God with power according to the Spirit of holiness, by the resurrection from the dead, Jesus Christ our Lord, +\v 5 through whom we received grace and apostleship for obedience of faith among all the nations for his name’s sake; +\v 6 among whom you are also called to belong to Jesus Christ; +\v 7 to all who are in Rome, beloved of God, called to be saints: Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 8 First, I thank my God through Jesus Christ for all of you, that your faith is proclaimed throughout the whole world. +\v 9 For God is my witness, whom I serve in my spirit in the Good News of his Son, how unceasingly I make mention of you always in my prayers, +\v 10 requesting, if by any means now at last I may be prospered by the will of God to come to you. +\v 11 For I long to see you, that I may impart to you some spiritual gift, to the end that you may be established; +\v 12 that is, that I with you may be encouraged in you, each of us by the other’s faith, both yours and mine. +\p +\v 13 Now I don’t desire to have you unaware, brothers, that I often planned to come to you (and was hindered so far), that I might have some fruit among you also, even as among the rest of the Gentiles. +\v 14 I am debtor both to Greeks and to foreigners, both to the wise and to the foolish. +\v 15 So as much as is in me, I am eager to preach the Good News to you also who are in Rome. +\p +\v 16 For I am not ashamed of the Good News of Christ, because it is the power of God for salvation for everyone who believes, for the Jew first, and also for the Greek. +\v 17 For in it is revealed God’s righteousness from faith to faith. As it is written, “But the righteous shall live by faith.”\x + \xo 1:17 \xt Habakkuk 2:4\x* +\p +\v 18 For the wrath of God is revealed from heaven against all ungodliness and unrighteousness of men who suppress the truth in unrighteousness, +\v 19 because that which is known of God is revealed in them, for God revealed it to them. +\v 20 For the invisible things of him since the creation of the world are clearly seen, being perceived through the things that are made, even his everlasting power and divinity, that they may be without excuse. +\v 21 Because knowing God, they didn’t glorify him as God, and didn’t give thanks, but became vain in their reasoning, and their senseless heart was darkened. +\p +\v 22 Professing themselves to be wise, they became fools, +\v 23 and traded the glory of the incorruptible God for the likeness of an image of corruptible man, and of birds, four-footed animals, and creeping things. +\v 24 Therefore God also gave them up in the lusts of their hearts to uncleanness, that their bodies should be dishonored among themselves; +\v 25 who exchanged the truth of God for a lie, and worshiped and served the creature rather than the Creator, who is blessed forever. Amen. +\p +\v 26 For this reason, God gave them up to vile passions. For their women changed the natural function into that which is against nature. +\v 27 Likewise also the men, leaving the natural function of the woman, burned in their lust toward one another, men doing what is inappropriate with men, and receiving in themselves the due penalty of their error. +\v 28 Even as they refused to have God in their knowledge, God gave them up to a reprobate mind, to do those things which are not fitting; +\v 29 being filled with all unrighteousness, sexual immorality, wickedness, covetousness, malice; full of envy, murder, strife, deceit, evil habits, secret slanderers, +\v 30 backbiters, hateful to God, insolent, arrogant, boastful, inventors of evil things, disobedient to parents, +\v 31 without understanding, covenant breakers, without natural affection, unforgiving, unmerciful; +\v 32 who, knowing the ordinance of God, that those who practice such things are worthy of death, not only do the same, but also approve of those who practice them. +\c 2 +\p +\v 1 Therefore you are without excuse, O man, whoever you are who judge. For in that which you judge another, you condemn yourself. For you who judge practice the same things. +\v 2 We know that the judgment of God is according to truth against those who practice such things. +\v 3 Do you think this, O man who judges those who practice such things, and do the same, that you will escape the judgment of God? +\v 4 Or do you despise the riches of his goodness, forbearance, and patience, not knowing that the goodness of God leads you to repentance? +\v 5 But according to your hardness and unrepentant heart you are treasuring up for yourself wrath in the day of wrath, revelation, and of the righteous judgment of God, +\v 6 who “will pay back to everyone according to their works:”\x + \xo 2:6 \xt Psalm 62:12; Proverbs 24:12\x* +\v 7 to those who by perseverance in well-doing seek for glory, honor, and incorruptibility, eternal life; +\v 8 but to those who are self-seeking and don’t obey the truth, but obey unrighteousness, will be wrath, indignation, +\v 9 oppression, and anguish on every soul of man who does evil, to the Jew first, and also to the Greek. +\p +\v 10 But glory, honor, and peace go to every man who does good, to the Jew first, and also to the Greek. +\v 11 For there is no partiality with God. +\v 12 For as many as have sinned without the law will also perish without the law. As many as have sinned under the law will be judged by the law. +\v 13 For it isn’t the hearers of the law who are righteous before God, but the doers of the law will be justified +\v 14 (for when Gentiles who don’t have the law do by nature the things of the law, these, not having the law, are a law to themselves, +\v 15 in that they show the work of the law written in their hearts, their conscience testifying with them, and their thoughts among themselves accusing or else excusing them) +\v 16 in the day when God will judge the secrets of men, according to my Good News, by Jesus Christ. +\p +\v 17 Indeed you bear the name of a Jew, rest on the law, glory in God, +\v 18 know his will, and approve the things that are excellent, being instructed out of the law, +\v 19 and are confident that you yourself are a guide of the blind, a light to those who are in darkness, +\v 20 a corrector of the foolish, a teacher of babies, having in the law the form of knowledge and of the truth. +\v 21 You therefore who teach another, don’t you teach yourself? You who preach that a man shouldn’t steal, do you steal? +\v 22 You who say a man shouldn’t commit adultery, do you commit adultery? You who abhor idols, do you rob temples? +\v 23 You who glory in the law, do you dishonor God by disobeying the law? +\v 24 For “the name of God is blasphemed among the Gentiles because of you,” \x + \xo 2:24 \xt Isaiah 52:5; Ezekiel 36:22\x* just as it is written. +\v 25 For circumcision indeed profits, if you are a doer of the law, but if you are a transgressor of the law, your circumcision has become uncircumcision. +\v 26 If therefore the uncircumcised keep the ordinances of the law, won’t his uncircumcision be accounted as circumcision? +\v 27 Won’t those who are physically uncircumcised, but fulfill the law, judge you, who with the letter and circumcision are a transgressor of the law? +\v 28 For he is not a Jew who is one outwardly, neither is that circumcision which is outward in the flesh; +\v 29 but he is a Jew who is one inwardly, and circumcision is that of the heart, in the spirit, not in the letter; whose praise is not from men, but from God. +\c 3 +\p +\v 1 Then what advantage does the Jew have? Or what is the profit of circumcision? +\v 2 Much in every way! Because first of all, they were entrusted with the revelations of God. +\v 3 For what if some were without faith? Will their lack of faith nullify the faithfulness of God? +\v 4 May it never be! Yes, let God be found true, but every man a liar. As it is written, +\q1 “that you might be justified in your words, +\q2 and might prevail when you come into judgment.”\x + \xo 3:4 \xt Psalm 51:4\x* +\p +\v 5 But if our unrighteousness commends the righteousness of God, what will we say? Is God unrighteous who inflicts wrath? I speak like men do. +\v 6 May it never be! For then how will God judge the world? +\v 7 For if the truth of God through my lie abounded to his glory, why am I also still judged as a sinner? +\v 8 Why not (as we are slanderously reported, and as some affirm that we say), “Let’s do evil, that good may come?” Those who say so are justly condemned. +\p +\v 9 What then? Are we better than they? No, in no way. For we previously warned both Jews and Greeks that they are all under sin. +\v 10 As it is written, +\q1 “There is no one righteous; +\q2 no, not one. +\q1 +\v 11 There is no one who understands. +\q2 There is no one who seeks after God. +\q1 +\v 12 They have all turned away. +\q2 They have together become unprofitable. +\q1 There is no one who does good, +\q2 no, not so much as one.”\x + \xo 3:12 \xt Psalm 14:1-3; 53:1-3; Ecclesiastes 7:20\x* +\q1 +\v 13 “Their throat is an open tomb. +\q2 With their tongues they have used deceit.”\x + \xo 3:13 \xt Psalm 5:9\x* +\q1 “The poison of vipers is under their lips.”\x + \xo 3:13 \xt Psalm 140:3\x* +\q2 +\v 14 “Their mouth is full of cursing and bitterness.”\x + \xo 3:14 \xt Psalm 10:7\x* +\q1 +\v 15 “Their feet are swift to shed blood. +\q2 +\v 16 Destruction and misery are in their ways. +\q2 +\v 17 The way of peace, they haven’t known.”\x + \xo 3:17 \xt Isaiah 59:7-8\x* +\q1 +\v 18 “There is no fear of God before their eyes.”\x + \xo 3:18 \xt Psalm 36:1\x* +\p +\v 19 Now we know that whatever things the law says, it speaks to those who are under the law, that every mouth may be closed, and all the world may be brought under the judgment of God. +\v 20 Because by the works of the law, no flesh will be justified in his sight; for through the law comes the knowledge of sin. +\p +\v 21 But now apart from the law, a righteousness of God has been revealed, being testified by the law and the prophets; +\v 22 even the righteousness of God through faith in Jesus Christ to all and on all those who believe. For there is no distinction, +\v 23 for all have sinned, and fall short of the glory of God; +\v 24 being justified freely by his grace through the redemption that is in Christ Jesus, +\v 25 whom God sent to be an atoning sacrifice\f + \fr 3:25 \ft or, a propitiation\f* through faith in his blood, for a demonstration of his righteousness through the passing over of prior sins, in God’s forbearance; +\v 26 to demonstrate his righteousness at this present time, that he might himself be just and the justifier of him who has faith in Jesus. +\p +\v 27 Where then is the boasting? It is excluded. By what kind of law? Of works? No, but by a law of faith. +\v 28 We maintain therefore that a man is justified by faith apart from the works of the law. +\v 29 Or is God the God of Jews only? Isn’t he the God of Gentiles also? Yes, of Gentiles also, +\v 30 since indeed there is one God who will justify the circumcised by faith and the uncircumcised through faith. +\p +\v 31 Do we then nullify the law through faith? May it never be! No, we establish the law. +\c 4 +\p +\v 1 What then will we say that Abraham, our forefather, has found according to the flesh? +\v 2 For if Abraham was justified by works, he has something to boast about, but not toward God. +\v 3 For what does the Scripture say? “Abraham believed God, and it was accounted to him for righteousness.”\x + \xo 4:3 \xt Genesis 15:6\x* +\v 4 Now to him who works, the reward is not counted as grace, but as something owed. +\v 5 But to him who doesn’t work, but believes in him who justifies the ungodly, his faith is accounted for righteousness. +\v 6 Even as David also pronounces blessing on the man to whom God counts righteousness apart from works: +\q1 +\v 7 “Blessed are they whose iniquities are forgiven, +\q2 whose sins are covered. +\q1 +\v 8 Blessed is the man whom the Lord will by no means charge with sin.” \x + \xo 4:8 \xt Psalm 32:1-2\x* +\p +\v 9 Is this blessing then pronounced only on the circumcised, or on the uncircumcised also? For we say that faith was accounted to Abraham for righteousness. +\v 10 How then was it counted? When he was in circumcision, or in uncircumcision? Not in circumcision, but in uncircumcision. +\v 11 He received the sign of circumcision, a seal of the righteousness of the faith which he had while he was in uncircumcision, that he might be the father of all those who believe, though they might be in uncircumcision, that righteousness might also be accounted to them. +\v 12 He is the father of circumcision to those who not only are of the circumcision, but who also walk in the steps of that faith of our father Abraham, which he had in uncircumcision. +\p +\v 13 For the promise to Abraham and to his offspring that he would be heir of the world wasn’t through the law, but through the righteousness of faith. +\v 14 For if those who are of the law are heirs, faith is made void, and the promise is made of no effect. +\v 15 For the law produces wrath; for where there is no law, neither is there disobedience. +\p +\v 16 For this cause it is of faith, that it may be according to grace, to the end that the promise may be sure to all the offspring, not to that only which is of the law, but to that also which is of the faith of Abraham, who is the father of us all. +\v 17 As it is written, “I have made you a father of many nations.”\x + \xo 4:17 \xt Genesis 17:5\x* This is in the presence of him whom he believed: God, who gives life to the dead, and calls the things that are not, as though they were. +\v 18 Against hope, Abraham in hope believed, to the end that he might become a father of many nations, according to that which had been spoken, “So will your offspring be.”\x + \xo 4:18 \xt Genesis 15:5\x* +\v 19 Without being weakened in faith, he didn’t consider his own body, already having been worn out, (he being about a hundred years old), and the deadness of Sarah’s womb. +\v 20 Yet, looking to the promise of God, he didn’t waver through unbelief, but grew strong through faith, giving glory to God, +\v 21 and being fully assured that what he had promised, he was also able to perform. +\v 22 Therefore it also was “credited to him for righteousness.”\x + \xo 4:22 \xt Genesis 15:6\x* +\v 23 Now it was not written that it was accounted to him for his sake alone, +\v 24 but for our sake also, to whom it will be accounted, who believe in him who raised Jesus our Lord from the dead, +\v 25 who was delivered up for our trespasses, and was raised for our justification. +\c 5 +\p +\v 1 Being therefore justified by faith, we have peace with God through our Lord Jesus Christ; +\v 2 through whom we also have our access by faith into this grace in which we stand. We rejoice in hope of the glory of God. +\v 3 Not only this, but we also rejoice in our sufferings, knowing that suffering produces perseverance; +\v 4 and perseverance, proven character; and proven character, hope; +\v 5 and hope doesn’t disappoint us, because God’s love has been poured into our hearts through the Holy Spirit who was given to us. +\p +\v 6 For while we were yet weak, at the right time Christ died for the ungodly. +\v 7 For one will hardly die for a righteous man. Yet perhaps for a good person someone would even dare to die. +\v 8 But God commends his own love toward us, in that while we were yet sinners, Christ died for us. +\p +\v 9 Much more then, being now justified by his blood, we will be saved from God’s wrath through him. +\v 10 For if while we were enemies, we were reconciled to God through the death of his Son, much more, being reconciled, we will be saved by his life. +\p +\v 11 Not only so, but we also rejoice in God through our Lord Jesus Christ, through whom we have now received the reconciliation. +\v 12 Therefore, as sin entered into the world through one man, and death through sin, so death passed to all men because all sinned. +\v 13 For until the law, sin was in the world; but sin is not charged when there is no law. +\v 14 Nevertheless death reigned from Adam until Moses, even over those whose sins weren’t like Adam’s disobedience, who is a foreshadowing of him who was to come. +\p +\v 15 But the free gift isn’t like the trespass. For if by the trespass of the one the many died, much more did the grace of God and the gift by the grace of the one man, Jesus Christ, abound to the many. +\v 16 The gift is not as through one who sinned; for the judgment came by one to condemnation, but the free gift followed many trespasses to justification. +\v 17 For if by the trespass of the one, death reigned through the one; so much more will those who receive the abundance of grace and of the gift of righteousness reign in life through the one, Jesus Christ. +\p +\v 18 So then as through one trespass, all men were condemned; even so through one act of righteousness, all men were justified to life. +\v 19 For as through the one man’s disobedience many were made sinners, even so through the obedience of the one, many will be made righteous. +\v 20 The law came in that the trespass might abound; but where sin abounded, grace abounded more exceedingly, +\v 21 that as sin reigned in death, even so grace might reign through righteousness to eternal life through Jesus Christ our Lord. +\c 6 +\p +\v 1 What shall we say then? Shall we continue in sin, that grace may abound? +\v 2 May it never be! We who died to sin, how could we live in it any longer? +\v 3 Or don’t you know that all of us who were baptized into Christ Jesus were baptized into his death? +\v 4 We were buried therefore with him through baptism into death, that just as Christ was raised from the dead through the glory of the Father, so we also might walk in newness of life. +\p +\v 5 For if we have become united with him in the likeness of his death, we will also be part of his resurrection; +\v 6 knowing this, that our old man was crucified with him, that the body of sin might be done away with, so that we would no longer be in bondage to sin. +\v 7 For he who has died has been freed from sin. +\v 8 But if we died with Christ, we believe that we will also live with him, +\v 9 knowing that Christ, being raised from the dead, dies no more. Death no longer has dominion over him! +\v 10 For the death that he died, he died to sin one time; but the life that he lives, he lives to God. +\v 11 Thus consider yourselves also to be dead to sin, but alive to God in Christ Jesus our Lord. +\p +\v 12 Therefore don’t let sin reign in your mortal body, that you should obey it in its lusts. +\v 13 Also, do not present your members to sin as instruments of unrighteousness, but present yourselves to God as alive from the dead, and your members as instruments of righteousness to God. +\v 14 For sin will not have dominion over you, for you are not under law, but under grace. +\p +\v 15 What then? Shall we sin because we are not under law but under grace? May it never be! +\v 16 Don’t you know that when you present yourselves as servants and obey someone, you are the servants of whomever you obey, whether of sin to death, or of obedience to righteousness? +\v 17 But thanks be to God that, whereas you were bondservants of sin, you became obedient from the heart to that form of teaching to which you were delivered. +\v 18 Being made free from sin, you became bondservants of righteousness. +\p +\v 19 I speak in human terms because of the weakness of your flesh; for as you presented your members as servants to uncleanness and to wickedness upon wickedness, even so now present your members as servants to righteousness for sanctification. +\v 20 For when you were servants of sin, you were free from righteousness. +\v 21 What fruit then did you have at that time in the things of which you are now ashamed? For the end of those things is death. +\v 22 But now, being made free from sin and having become servants of God, you have your fruit of sanctification and the result of eternal life. +\v 23 For the wages of sin is death, but the free gift of God is eternal life in Christ Jesus our Lord. +\c 7 +\p +\v 1 Or don’t you know, brothers\f + \fr 7:1 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* (for I speak to men who know the law), that the law has dominion over a man for as long as he lives? +\v 2 For the woman that has a husband is bound by law to the husband while he lives, but if the husband dies, she is discharged from the law of the husband. +\v 3 So then if, while the husband lives, she is joined to another man, she would be called an adulteress. But if the husband dies, she is free from the law, so that she is no adulteress, though she is joined to another man. +\v 4 Therefore, my brothers, you also were made dead to the law through the body of Christ, that you would be joined to another, to him who was raised from the dead, that we might produce fruit to God. +\v 5 For when we were in the flesh, the sinful passions which were through the law worked in our members to bring out fruit to death. +\v 6 But now we have been discharged from the law, having died to that in which we were held; so that we serve in newness of the spirit, and not in oldness of the letter. +\p +\v 7 What shall we say then? Is the law sin? May it never be! However, I wouldn’t have known sin except through the law. For I wouldn’t have known coveting unless the law had said, “You shall not covet.”\x + \xo 7:7 \xt Exodus 20:17; Deuteronomy 5:21\x* +\v 8 But sin, finding occasion through the commandment, produced in me all kinds of coveting. For apart from the law, sin is dead. +\v 9 I was alive apart from the law once, but when the commandment came, sin revived and I died. +\v 10 The commandment which was for life, this I found to be for death; +\v 11 for sin, finding occasion through the commandment, deceived me, and through it killed me. +\v 12 Therefore the law indeed is holy, and the commandment holy, righteous, and good. +\p +\v 13 Did then that which is good become death to me? May it never be! But sin, that it might be shown to be sin, was producing death in me through that which is good; that through the commandment sin might become exceedingly sinful. +\v 14 For we know that the law is spiritual, but I am fleshly, sold under sin. +\v 15 For I don’t understand what I am doing. For I don’t practice what I desire to do; but what I hate, that I do. +\v 16 But if what I don’t desire, that I do, I consent to the law that it is good. +\v 17 So now it is no more I that do it, but sin which dwells in me. +\v 18 For I know that in me, that is, in my flesh, dwells no good thing. For desire is present with me, but I don’t find it doing that which is good. +\v 19 For the good which I desire, I don’t do; but the evil which I don’t desire, that I practice. +\v 20 But if what I don’t desire, that I do, it is no more I that do it, but sin which dwells in me. +\v 21 I find then the law that, while I desire to do good, evil is present. +\v 22 For I delight in God’s law after the inward person, +\v 23 but I see a different law in my members, warring against the law of my mind, and bringing me into captivity under the law of sin which is in my members. +\v 24 What a wretched man I am! Who will deliver me out of the body of this death? +\v 25 I thank God through Jesus Christ, our Lord! So then with the mind, I myself serve God’s law, but with the flesh, sin’s law. +\c 8 +\p +\v 1 There is therefore now no condemnation to those who are in Christ Jesus, who don’t walk according to the flesh, but according to the Spirit.\f + \fr 8:1 \ft NU omits “who don’t walk according to the flesh, but according to the Spirit”\f* +\v 2 For the law of the Spirit of life in Christ Jesus made me free from the law of sin and of death. +\v 3 For what the law couldn’t do, in that it was weak through the flesh, God did, sending his own Son in the likeness of sinful flesh and for sin, he condemned sin in the flesh, +\v 4 that the ordinance of the law might be fulfilled in us who don’t walk according to the flesh, but according to the Spirit. +\v 5 For those who live according to the flesh set their minds on the things of the flesh, but those who live according to the Spirit, the things of the Spirit. +\v 6 For the mind of the flesh is death, but the mind of the Spirit is life and peace; +\v 7 because the mind of the flesh is hostile toward God, for it is not subject to God’s law, neither indeed can it be. +\v 8 Those who are in the flesh can’t please God. +\p +\v 9 But you are not in the flesh but in the Spirit, if it is so that the Spirit of God dwells in you. But if any man doesn’t have the Spirit of Christ, he is not his. +\v 10 If Christ is in you, the body is dead because of sin, but the spirit is alive because of righteousness. +\v 11 But if the Spirit of him who raised up Jesus from the dead dwells in you, he who raised up Christ Jesus from the dead will also give life to your mortal bodies through his Spirit who dwells in you. +\p +\v 12 So then, brothers, we are debtors, not to the flesh, to live after the flesh. +\v 13 For if you live after the flesh, you must die; but if by the Spirit you put to death the deeds of the body, you will live. +\v 14 For as many as are led by the Spirit of God, these are children of God. +\v 15 For you didn’t receive the spirit of bondage again to fear, but you received the Spirit of adoption, by whom we cry, “Abba!\f + \fr 8:15 \ft Abba is an Aramaic word for “Father” or “Daddy”, which can be used affectionately and respectfully in prayer to our Father in heaven.\f* Father!” +\p +\v 16 The Spirit himself testifies with our spirit that we are children of God; +\v 17 and if children, then heirs—heirs of God and joint heirs with Christ, if indeed we suffer with him, that we may also be glorified with him. +\p +\v 18 For I consider that the sufferings of this present time are not worthy to be compared with the glory which will be revealed toward us. +\v 19 For the creation waits with eager expectation for the children of God to be revealed. +\v 20 For the creation was subjected to vanity, not of its own will, but because of him who subjected it, in hope +\v 21 that the creation itself also will be delivered from the bondage of decay into the liberty of the glory of the children of God. +\v 22 For we know that the whole creation groans and travails in pain together until now. +\v 23 Not only so, but ourselves also, who have the first fruits of the Spirit, even we ourselves groan within ourselves, waiting for adoption, the redemption of our body. +\v 24 For we were saved in hope, but hope that is seen is not hope. For who hopes for that which he sees? +\v 25 But if we hope for that which we don’t see, we wait for it with patience. +\p +\v 26 In the same way, the Spirit also helps our weaknesses, for we don’t know how to pray as we ought. But the Spirit himself makes intercession for us with groanings which can’t be uttered. +\v 27 He who searches the hearts knows what is on the Spirit’s mind, because he makes intercession for the saints according to God. +\p +\v 28 We know that all things work together for good for those who love God, for those who are called according to his purpose. +\v 29 For whom he foreknew, he also predestined to be conformed to the image of his Son, that he might be the firstborn among many brothers.\f + \fr 8:29 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* +\v 30 Whom he predestined, those he also called. Whom he called, those he also justified. Whom he justified, those he also glorified. +\p +\v 31 What then shall we say about these things? If God is for us, who can be against us? +\v 32 He who didn’t spare his own Son, but delivered him up for us all, how would he not also with him freely give us all things? +\v 33 Who could bring a charge against God’s chosen ones? It is God who justifies. +\v 34 Who is he who condemns? It is Christ who died, yes rather, who was raised from the dead, who is at the right hand of God, who also makes intercession for us. +\p +\v 35 Who shall separate us from the love of Christ? Could oppression, or anguish, or persecution, or famine, or nakedness, or peril, or sword? +\v 36 Even as it is written, +\q1 “For your sake we are killed all day long. +\q2 We were accounted as sheep for the slaughter.”\x + \xo 8:36 \xt Psalm 44:22\x* +\m +\v 37 No, in all these things we are more than conquerors through him who loved us. +\v 38 For I am persuaded that neither death, nor life, nor angels, nor principalities, nor things present, nor things to come, nor powers, +\v 39 nor height, nor depth, nor any other created thing will be able to separate us from God’s love which is in Christ Jesus our Lord. +\c 9 +\p +\v 1 I tell the truth in Christ. I am not lying, my conscience testifying with me in the Holy Spirit +\v 2 that I have great sorrow and unceasing pain in my heart. +\v 3 For I could wish that I myself were accursed from Christ for my brothers’ sake, my relatives according to the flesh +\v 4 who are Israelites; whose is the adoption, the glory, the covenants, the giving of the law, the service, and the promises; +\v 5 of whom are the fathers, and from whom is Christ as concerning the flesh, who is over all, God, blessed forever. Amen. +\p +\v 6 But it is not as though the word of God has come to nothing. For they are not all Israel that are of Israel. +\v 7 Neither, because they are Abraham’s offspring, are they all children. But, “your offspring will be accounted as from Isaac.”\x + \xo 9:7 \xt Genesis 21:12\x* +\v 8 That is, it is not the children of the flesh who are children of God, but the children of the promise are counted as heirs. +\v 9 For this is a word of promise: “At the appointed time I will come, and Sarah will have a son.”\x + \xo 9:9 \xt Genesis 18:10,14\x* +\v 10 Not only so, but Rebekah also conceived by one, by our father Isaac. +\v 11 For being not yet born, neither having done anything good or bad, that the purpose of God according to election might stand, not of works, but of him who calls,\f + \fr 9:11 \ft NU puts the phrase “not of works, but of him who calls” at the beginning of verse 12 instead of the end of verse 11.\f* +\v 12 it was said to her, “The elder will serve the younger.”\x + \xo 9:12 \xt Genesis 25:23\x* +\v 13 Even as it is written, “Jacob I loved, but Esau I hated.”\x + \xo 9:13 \xt Malachi 1:2-3\x* +\p +\v 14 What shall we say then? Is there unrighteousness with God? May it never be! +\v 15 For he said to Moses, “I will have mercy on whom I have mercy, and I will have compassion on whom I have compassion.”\x + \xo 9:15 \xt Exodus 33:19\x* +\v 16 So then it is not of him who wills, nor of him who runs, but of God who has mercy. +\v 17 For the Scripture says to Pharaoh, “For this very purpose I caused you to be raised up, that I might show in you my power, and that my name might be proclaimed in all the earth.”\x + \xo 9:17 \xt Exodus 9:16\x* +\v 18 So then, he has mercy on whom he desires, and he hardens whom he desires. +\p +\v 19 You will say then to me, “Why does he still find fault? For who withstands his will?” +\v 20 But indeed, O man, who are you to reply against God? Will the thing formed ask him who formed it, “Why did you make me like this?”\x + \xo 9:20 \xt Isaiah 29:16; 45:9\x* +\v 21 Or hasn’t the potter a right over the clay, from the same lump to make one part a vessel for honor, and another for dishonor? +\v 22 What if God, willing to show his wrath and to make his power known, endured with much patience vessels of wrath prepared for destruction, +\v 23 and that he might make known the riches of his glory on vessels of mercy, which he prepared beforehand for glory— +\v 24 us, whom he also called, not from the Jews only, but also from the Gentiles? +\v 25 As he says also in Hosea, +\q1 “I will call them ‘my people,’ which were not my people; +\q2 and her ‘beloved,’ who was not beloved.”\x + \xo 9:25 \xt Hosea 2:23\x* +\q1 +\v 26 “It will be that in the place where it was said to them, ‘You are not my people,’ +\q2 there they will be called ‘children of the living God.’”\x + \xo 9:26 \xt Hosea 1:10 \x* +\p +\v 27 Isaiah cries concerning Israel, +\q1 “If the number of the children of Israel are as the sand of the sea, +\q2 it is the remnant who will be saved; +\q1 +\v 28 for he will finish the work and cut it short in righteousness, +\q2 because the Lord will make a short work upon the earth.”\x + \xo 9:28 \xt Isaiah 10:22-23\x* +\p +\v 29 As Isaiah has said before, +\q1 “Unless the Lord of Armies\f + \fr 9:29 \ft Greek: Sabaoth (for Hebrew: Tze’va’ot) \f* had left us a seed, +\q2 we would have become like Sodom, +\q2 and would have been made like Gomorrah.”\x + \xo 9:29 \xt Isaiah 1:9\x* +\p +\v 30 What shall we say then? That the Gentiles, who didn’t follow after righteousness, attained to righteousness, even the righteousness which is of faith; +\v 31 but Israel, following after a law of righteousness, didn’t arrive at the law of righteousness. +\v 32 Why? Because they didn’t seek it by faith, but as it were by works of the law. They stumbled over the stumbling stone, +\v 33 even as it is written, +\q1 “Behold,\f + \fr 9:33 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I lay in Zion a stumbling stone and a rock of offense; +\q2 and no one who believes in him will be disappointed.”\x + \xo 9:33 \xt Isaiah 8:14; 28:16\x* +\c 10 +\p +\v 1 Brothers, my heart’s desire and my prayer to God is for Israel, that they may be saved. +\v 2 For I testify about them that they have a zeal for God, but not according to knowledge. +\v 3 For being ignorant of God’s righteousness, and seeking to establish their own righteousness, they didn’t subject themselves to the righteousness of God. +\v 4 For Christ is the fulfillment\f + \fr 10:4 \ft or, completion, or end\f* of the law for righteousness to everyone who believes. +\p +\v 5 For Moses writes about the righteousness of the law, “The one who does them will live by them.”\x + \xo 10:5 \xt Leviticus 18:5\x* +\v 6 But the righteousness which is of faith says this, “Don’t say in your heart, ‘Who will ascend into heaven?’\x + \xo 10:6 \xt Deuteronomy 30:12\x* (that is, to bring Christ down); +\v 7 or, ‘Who will descend into the abyss?’\x + \xo 10:7 \xt Deuteronomy 30:13\x* (that is, to bring Christ up from the dead.)” +\v 8 But what does it say? “The word is near you, in your mouth and in your heart;”\x + \xo 10:8 \xt Deuteronomy 30:14\x* that is, the word of faith which we preach: +\v 9 that if you will confess with your mouth that Jesus is Lord and believe in your heart that God raised him from the dead, you will be saved. +\v 10 For with the heart one believes resulting in righteousness; and with the mouth confession is made resulting in salvation. +\v 11 For the Scripture says, “Whoever believes in him will not be disappointed.”\x + \xo 10:11 \xt Isaiah 28:16\x* +\p +\v 12 For there is no distinction between Jew and Greek; for the same Lord is Lord of all, and is rich to all who call on him. +\v 13 For, “Whoever will call on the name of the Lord will be saved.”\x + \xo 10:13 \xt Joel 2:32\x* +\v 14 How then will they call on him in whom they have not believed? How will they believe in him whom they have not heard? How will they hear without a preacher? +\v 15 And how will they preach unless they are sent? As it is written: +\q1 “How beautiful are the feet of those who preach the Good News of peace, +\q2 who bring glad tidings of good things!”\x + \xo 10:15 \xt Isaiah 52:7\x* +\p +\v 16 But they didn’t all listen to the glad news. For Isaiah says, “Lord, who has believed our report?”\x + \xo 10:16 \xt Isaiah 53:1\x* +\v 17 So faith comes by hearing, and hearing by the word of God. +\v 18 But I say, didn’t they hear? Yes, most certainly, +\q1 “Their sound went out into all the earth, +\q2 their words to the ends of the world.”\x + \xo 10:18 \xt Psalm 19:4\x* +\p +\v 19 But I ask, didn’t Israel know? First Moses says, +\q1 “I will provoke you to jealousy with that which is no nation. +\q2 I will make you angry with a nation void of understanding.”\x + \xo 10:19 \xt Deuteronomy 32:21\x* +\p +\v 20 Isaiah is very bold and says, +\q1 “I was found by those who didn’t seek me. +\q2 I was revealed to those who didn’t ask for me.”\x + \xo 10:20 \xt Isaiah 65:1\x* +\p +\v 21 But about Israel he says, “All day long I stretched out my hands to a disobedient and contrary people.”\x + \xo 10:21 \xt Isaiah 65:2\x* +\c 11 +\p +\v 1 I ask then, did God reject his people? May it never be! For I also am an Israelite, a descendant of Abraham, of the tribe of Benjamin. +\v 2 God didn’t reject his people, whom he foreknew. Or don’t you know what the Scripture says about Elijah? How he pleads with God against Israel: +\v 3 “Lord, they have killed your prophets. They have broken down your altars. I am left alone, and they seek my life.”\x + \xo 11:3 \xt 1 Kings 19:10,14\x* +\v 4 But how does God answer him? “I have reserved for myself seven thousand men who have not bowed the knee to Baal.”\x + \xo 11:4 \xt 1 Kings 19:18\x* +\v 5 Even so too at this present time also there is a remnant according to the election of grace. +\v 6 And if by grace, then it is no longer of works; otherwise grace is no longer grace. But if it is of works, it is no longer grace; otherwise work is no longer work. +\p +\v 7 What then? That which Israel seeks for, that he didn’t obtain, but the chosen ones obtained it, and the rest were hardened. +\v 8 According as it is written, “God gave them a spirit of stupor, eyes that they should not see, and ears that they should not hear, to this very day.” \x + \xo 11:8 \xt Deuteronomy 29:4; Isaiah 29:10\x* +\p +\v 9 David says, +\q1 “Let their table be made a snare, a trap, +\q2 a stumbling block, and a retribution to them. +\q1 +\v 10 Let their eyes be darkened, that they may not see. +\q2 Always keep their backs bent.”\x + \xo 11:10 \xt Psalm 69:22,23\x* +\p +\v 11 I ask then, did they stumble that they might fall? May it never be! But by their fall salvation has come to the Gentiles, to provoke them to jealousy. +\v 12 Now if their fall is the riches of the world, and their loss the riches of the Gentiles, how much more their fullness! +\p +\v 13 For I speak to you who are Gentiles. Since then as I am an apostle to Gentiles, I glorify my ministry, +\v 14 if by any means I may provoke to jealousy those who are my flesh, and may save some of them. +\v 15 For if the rejection of them is the reconciling of the world, what would their acceptance be, but life from the dead? +\p +\v 16 If the first fruit is holy, so is the lump. If the root is holy, so are the branches. +\v 17 But if some of the branches were broken off, and you, being a wild olive, were grafted in among them and became partaker with them of the root and of the richness of the olive tree, +\v 18 don’t boast over the branches. But if you boast, remember that it is not you who support the root, but the root supports you. +\v 19 You will say then, “Branches were broken off, that I might be grafted in.” +\v 20 True; by their unbelief they were broken off, and you stand by your faith. Don’t be conceited, but fear; +\v 21 for if God didn’t spare the natural branches, neither will he spare you. +\v 22 See then the goodness and severity of God. Toward those who fell, severity; but toward you, goodness, if you continue in his goodness; otherwise you also will be cut off. +\v 23 They also, if they don’t continue in their unbelief, will be grafted in, for God is able to graft them in again. +\v 24 For if you were cut out of that which is by nature a wild olive tree, and were grafted contrary to nature into a good olive tree, how much more will these, which are the natural branches, be grafted into their own olive tree? +\p +\v 25 For I don’t desire you to be ignorant, brothers,\f + \fr 11:25 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* of this mystery, so that you won’t be wise in your own conceits, that a partial hardening has happened to Israel, until the fullness of the Gentiles has come in, +\v 26 and so all Israel will be saved. Even as it is written, +\q1 “There will come out of Zion the Deliverer, +\q2 and he will turn away ungodliness from Jacob. +\q1 +\v 27 This is my covenant with them, +\q2 when I will take away their sins.”\x + \xo 11:27 \xt Isaiah 59:20-21; 27:9; Jeremiah 31:33-34\x* +\p +\v 28 Concerning the Good News, they are enemies for your sake. But concerning the election, they are beloved for the fathers’ sake. +\v 29 For the gifts and the calling of God are irrevocable. +\v 30 For as you in time past were disobedient to God, but now have obtained mercy by their disobedience, +\v 31 even so these also have now been disobedient, that by the mercy shown to you they may also obtain mercy. +\v 32 For God has bound all to disobedience, that he might have mercy on all. +\p +\v 33 Oh the depth of the riches both of the wisdom and the knowledge of God! How unsearchable are his judgments, and his ways past tracing out! +\q1 +\v 34 “For who has known the mind of the Lord? +\q2 Or who has been his counselor?”\x + \xo 11:34 \xt Isaiah 40:13\x* +\q1 +\v 35 “Or who has first given to him, +\q2 and it will be repaid to him again?”\x + \xo 11:35 \xt Job 41:11\x* +\p +\v 36 For of him and through him and to him are all things. To him be the glory for ever! Amen. +\c 12 +\p +\v 1 Therefore I urge you, brothers, by the mercies of God, to present your bodies a living sacrifice, holy, acceptable to God, which is your spiritual service. +\v 2 Don’t be conformed to this world, but be transformed by the renewing of your mind, so that you may prove what is the good, well-pleasing, and perfect will of God. +\p +\v 3 For I say through the grace that was given me, to everyone who is among you, not to think of yourself more highly than you ought to think; but to think reasonably, as God has apportioned to each person a measure of faith. +\v 4 For even as we have many members in one body, and all the members don’t have the same function, +\v 5 so we, who are many, are one body in Christ, and individually members of one another, +\v 6 having gifts differing according to the grace that was given to us: if prophecy, let’s prophesy according to the proportion of our faith; +\v 7 or service, let’s give ourselves to service; or he who teaches, to his teaching; +\v 8 or he who exhorts, to his exhorting; he who gives, let him do it with generosity; he who rules, with diligence; he who shows mercy, with cheerfulness. +\p +\v 9 Let love be without hypocrisy. Abhor that which is evil. Cling to that which is good. +\v 10 In love of the brothers be tenderly affectionate to one another; in honor prefer one another, +\v 11 not lagging in diligence, fervent in spirit, serving the Lord, +\v 12 rejoicing in hope, enduring in troubles, continuing steadfastly in prayer, +\v 13 contributing to the needs of the saints, and given to hospitality. +\p +\v 14 Bless those who persecute you; bless, and don’t curse. +\v 15 Rejoice with those who rejoice. Weep with those who weep. +\v 16 Be of the same mind one toward another. Don’t set your mind on high things, but associate with the humble. Don’t be wise in your own conceits. +\v 17 Repay no one evil for evil. Respect what is honorable in the sight of all men. +\v 18 If it is possible, as much as it is up to you, be at peace with all men. +\v 19 Don’t seek revenge yourselves, beloved, but give place to God’s wrath. For it is written, “Vengeance belongs to me; I will repay, says the Lord.” \x + \xo 12:19 \xt Deuteronomy 32:35\x* +\v 20 Therefore +\q1 “If your enemy is hungry, feed him. +\q2 If he is thirsty, give him a drink; +\q2 for in doing so, you will heap coals of fire on his head.”\x + \xo 12:20 \xt Proverbs 25:21-22\x* +\p +\v 21 Don’t be overcome by evil, but overcome evil with good. +\c 13 +\p +\v 1 Let every soul be in subjection to the higher authorities, for there is no authority except from God, and those who exist are ordained by God. +\v 2 Therefore he who resists the authority withstands the ordinance of God; and those who withstand will receive to themselves judgment. +\v 3 For rulers are not a terror to the good work, but to the evil. Do you desire to have no fear of the authority? Do that which is good, and you will have praise from the authority, +\v 4 for he is a servant of God to you for good. But if you do that which is evil, be afraid, for he doesn’t bear the sword in vain; for he is a servant of God, an avenger for wrath to him who does evil. +\v 5 Therefore you need to be in subjection, not only because of the wrath, but also for conscience’ sake. +\v 6 For this reason you also pay taxes, for they are servants of God’s service, continually doing this very thing. +\v 7 Therefore give everyone what you owe: if you owe taxes, pay taxes; if customs, then customs; if respect, then respect; if honor, then honor. +\p +\v 8 Owe no one anything, except to love one another; for he who loves his neighbor has fulfilled the law. +\v 9 For the commandments, “You shall not commit adultery,” “You shall not murder,” “You shall not steal,”\f + \fr 13:9 \ft TR adds “You shall not give false testimony,”\f* “You shall not covet,” \x + \xo 13:9 \xt Exodus 20:13-15,17; Deuteronomy 5:17-19,21\x* and whatever other commandments there are, are all summed up in this saying, namely, “You shall love your neighbor as yourself.”\x + \xo 13:9 \xt Leviticus 19:18\x* +\v 10 Love doesn’t harm a neighbor. Love therefore is the fulfillment of the law. +\p +\v 11 Do this, knowing the time, that it is already time for you to awaken out of sleep, for salvation is now nearer to us than when we first believed. +\v 12 The night is far gone, and the day is near. Let’s therefore throw off the deeds of darkness, and let’s put on the armor of light. +\v 13 Let’s walk properly, as in the day; not in reveling and drunkenness, not in sexual promiscuity and lustful acts, and not in strife and jealousy. +\v 14 But put on the Lord Jesus Christ, and make no provision for the flesh, for its lusts. +\c 14 +\p +\v 1 Now accept one who is weak in faith, but not for disputes over opinions. +\v 2 One man has faith to eat all things, but he who is weak eats only vegetables. +\v 3 Don’t let him who eats despise him who doesn’t eat. Don’t let him who doesn’t eat judge him who eats, for God has accepted him. +\v 4 Who are you who judge another’s servant? To his own lord he stands or falls. Yes, he will be made to stand, for God has power to make him stand. +\p +\v 5 One man esteems one day as more important. Another esteems every day alike. Let each man be fully assured in his own mind. +\v 6 He who observes the day, observes it to the Lord; and he who does not observe the day, to the Lord he does not observe it. He who eats, eats to the Lord, for he gives God thanks. He who doesn’t eat, to the Lord he doesn’t eat, and gives God thanks. +\v 7 For none of us lives to himself, and none dies to himself. +\v 8 For if we live, we live to the Lord. Or if we die, we die to the Lord. If therefore we live or die, we are the Lord’s. +\v 9 For to this end Christ died, rose, and lived again, that he might be Lord of both the dead and the living. +\p +\v 10 But you, why do you judge your brother? Or you again, why do you despise your brother? For we will all stand before the judgment seat of Christ. +\v 11 For it is written, +\q1 “‘As I live,’ says the Lord, ‘to me every knee will bow. +\q2 Every tongue will confess to God.’”\x + \xo 14:11 \xt Isaiah 45:23\x* +\p +\v 12 So then each one of us will give account of himself to God. +\p +\v 13 Therefore let’s not judge one another any more, but judge this rather, that no man put a stumbling block in his brother’s way, or an occasion for falling. +\v 14 I know and am persuaded in the Lord Jesus that nothing is unclean of itself; except that to him who considers anything to be unclean, to him it is unclean. +\v 15 Yet if because of food your brother is grieved, you walk no longer in love. Don’t destroy with your food him for whom Christ died. +\v 16 Then don’t let your good be slandered, +\v 17 for God’s Kingdom is not eating and drinking, but righteousness, peace, and joy in the Holy Spirit. +\v 18 For he who serves Christ in these things is acceptable to God and approved by men. +\v 19 So then, let’s follow after things which make for peace, and things by which we may build one another up. +\v 20 Don’t overthrow God’s work for food’s sake. All things indeed are clean, however it is evil for that man who creates a stumbling block by eating. +\v 21 It is good to not eat meat, drink wine, nor do anything by which your brother stumbles, is offended, or is made weak. +\p +\v 22 Do you have faith? Have it to yourself before God. Happy is he who doesn’t judge himself in that which he approves. +\v 23 But he who doubts is condemned if he eats, because it isn’t of faith; and whatever is not of faith is sin. +\p +\v 24 Now to him who is able to establish you according to my Good News and the preaching of Jesus Christ, according to the revelation of the mystery which has been kept secret through long ages, +\v 25 but now is revealed, and by the Scriptures of the prophets, according to the commandment of the eternal God, is made known for obedience of faith to all the nations; +\v 26 to the only wise God, through Jesus Christ, to whom be the glory forever! Amen.\f + \fr 14:26 \ft TR places verses 24-26 after Romans 16:24 as verses 25-27. \f* +\c 15 +\p +\v 1 Now we who are strong ought to bear the weaknesses of the weak, and not to please ourselves. +\v 2 Let each one of us please his neighbor for that which is good, to be building him up. +\v 3 For even Christ didn’t please himself. But, as it is written, “The reproaches of those who reproached you fell on me.”\x + \xo 15:3 \xt Psalm 69:9\x* +\v 4 For whatever things were written before were written for our learning, that through perseverance and through encouragement of the Scriptures we might have hope. +\v 5 Now the God of perseverance and of encouragement grant you to be of the same mind with one another according to Christ Jesus, +\v 6 that with one accord you may with one mouth glorify the God and Father of our Lord Jesus Christ. +\p +\v 7 Therefore accept one another, even as Christ also accepted you,\f + \fr 15:7 \ft TR reads “us” instead of “you”\f* to the glory of God. +\v 8 Now I say that Christ has been made a servant of the circumcision for the truth of God, that he might confirm the promises given to the fathers, +\v 9 and that the Gentiles might glorify God for his mercy. As it is written, +\q1 “Therefore I will give praise to you among the Gentiles +\q2 and sing to your name.”\x + \xo 15:9 \xt 2 Samuel 22:50; Psalm 18:49\x* +\p +\v 10 Again he says, +\q1 “Rejoice, you Gentiles, with his people.”\x + \xo 15:10 \xt Deuteronomy 32:43\x* +\p +\v 11 Again, +\q1 “Praise the Lord, all you Gentiles! +\q2 Let all the peoples praise him.”\x + \xo 15:11 \xt Psalm 117:1\x* +\p +\v 12 Again, Isaiah says, +\q1 “There will be the root of Jesse, +\q2 he who arises to rule over the Gentiles; +\q2 in him the Gentiles will hope.”\x + \xo 15:12 \xt Isaiah 11:10\x* +\p +\v 13 Now may the God of hope fill you with all joy and peace in believing, that you may abound in hope in the power of the Holy Spirit. +\p +\v 14 I myself am also persuaded about you, my brothers,\f + \fr 15:14 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* that you yourselves are full of goodness, filled with all knowledge, able also to admonish others. +\v 15 But I write the more boldly to you in part as reminding you, because of the grace that was given to me by God, +\v 16 that I should be a servant of Christ Jesus to the Gentiles, serving as a priest of the Good News of God, that the offering up of the Gentiles might be made acceptable, sanctified by the Holy Spirit. +\v 17 I have therefore my boasting in Christ Jesus in things pertaining to God. +\v 18 For I will not dare to speak of any things except those which Christ worked through me for the obedience of the Gentiles, by word and deed, +\v 19 in the power of signs and wonders, in the power of God’s Spirit; so that from Jerusalem and around as far as to Illyricum, I have fully preached the Good News of Christ; +\v 20 yes, making it my aim to preach the Good News, not where Christ was already named, that I might not build on another’s foundation. +\v 21 But, as it is written, +\q1 “They will see, to whom no news of him came. +\q2 They who haven’t heard will understand.”\x + \xo 15:21 \xt Isaiah 52:15\x* +\p +\v 22 Therefore also I was hindered these many times from coming to you, +\v 23 but now, no longer having any place in these regions, and having these many years a longing to come to you, +\v 24 whenever I travel to Spain, I will come to you. For I hope to see you on my journey, and to be helped on my way there by you, if first I may enjoy your company for a while. +\v 25 But now, I say, I am going to Jerusalem, serving the saints. +\v 26 For it has been the good pleasure of Macedonia and Achaia to make a certain contribution for the poor among the saints who are at Jerusalem. +\v 27 Yes, it has been their good pleasure, and they are their debtors. For if the Gentiles have been made partakers of their spiritual things, they owe it to them also to serve them in material things. +\v 28 When therefore I have accomplished this, and have sealed to them this fruit, I will go on by way of you to Spain. +\v 29 I know that when I come to you, I will come in the fullness of the blessing of the Good News of Christ. +\p +\v 30 Now I beg you, brothers, by our Lord Jesus Christ and by the love of the Spirit, that you strive together with me in your prayers to God for me, +\v 31 that I may be delivered from those who are disobedient in Judea, and that my service which I have for Jerusalem may be acceptable to the saints, +\v 32 that I may come to you in joy through the will of God, and together with you, find rest. +\v 33 Now the God of peace be with you all. Amen. +\c 16 +\p +\v 1 I commend to you Phoebe, our sister, who is a servant\f + \fr 16:1 \ft or, deacon \f* of the assembly that is at Cenchreae, +\v 2 that you receive her in the Lord in a way worthy of the saints, and that you assist her in whatever matter she may need from you, for she herself also has been a helper of many, and of my own self. +\p +\v 3 Greet Prisca and Aquila, my fellow workers in Christ Jesus, +\v 4 who risked their own necks for my life, to whom not only I give thanks, but also all the assemblies of the Gentiles. +\v 5 Greet the assembly that is in their house. Greet Epaenetus, my beloved, who is the first fruits of Achaia to Christ. +\v 6 Greet Mary, who labored much for us. +\v 7 Greet Andronicus and Junia, my relatives and my fellow prisoners, who are notable among the apostles, who were also in Christ before me. +\v 8 Greet Amplias, my beloved in the Lord. +\v 9 Greet Urbanus, our fellow worker in Christ, and Stachys, my beloved. +\v 10 Greet Apelles, the approved in Christ. Greet those who are of the household of Aristobulus. +\v 11 Greet Herodion, my kinsman. Greet them of the household of Narcissus, who are in the Lord. +\v 12 Greet Tryphaena and Tryphosa, who labor in the Lord. Greet Persis, the beloved, who labored much in the Lord. +\v 13 Greet Rufus, the chosen in the Lord, and his mother and mine. +\v 14 Greet Asyncritus, Phlegon, Hermes, Patrobas, Hermas, and the brothers\f + \fr 16:14 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* who are with them. +\v 15 Greet Philologus and Julia, Nereus and his sister, and Olympas, and all the saints who are with them. +\v 16 Greet one another with a holy kiss. The assemblies of Christ greet you. +\p +\v 17 Now I beg you, brothers, look out for those who are causing the divisions and occasions of stumbling, contrary to the doctrine which you learned, and turn away from them. +\v 18 For those who are such don’t serve our Lord Jesus Christ, but their own belly; and by their smooth and flattering speech they deceive the hearts of the innocent. +\v 19 For your obedience has become known to all. I rejoice therefore over you. But I desire to have you wise in that which is good, but innocent in that which is evil. +\v 20 And the God of peace will quickly crush Satan under your feet. +\p The grace of our Lord Jesus Christ be with you. +\p +\v 21 Timothy, my fellow worker, greets you, as do Lucius, Jason, and Sosipater, my relatives. +\v 22 I, Tertius, who write the letter, greet you in the Lord. +\v 23 Gaius, my host and host of the whole assembly, greets you. Erastus, the treasurer of the city, greets you, as does Quartus, the brother. +\v 24 The grace of our Lord Jesus Christ be with you all! Amen. +\v 25 \f + \fr 16:25 \ft TR places Romans 14:24-26 at the end of Romans instead of at the end of chapter 14, and numbers these verses 16:25-27.\f* diff --git a/c-sharp/assets/WEB/471COengWEBUS.SFM b/c-sharp/assets/WEB/471COengWEBUS.SFM new file mode 100644 index 0000000000..1c7827c7b3 --- /dev/null +++ b/c-sharp/assets/WEB/471COengWEBUS.SFM @@ -0,0 +1,555 @@ +\id 1CO 46-1CO-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 1 Corinthians +\toc1 Paul’s First Letter to the Corinthians +\toc2 1 Corinthians +\toc3 1 Corinthians +\mt1 Paul’s First Letter to the Corinthians +\c 1 +\p +\v 1 Paul, called to be an apostle of Jesus Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* through the will of God, and our brother Sosthenes, +\v 2 to the assembly of God which is at Corinth—those who are sanctified in Christ Jesus, called saints, with all who call on the name of our Lord Jesus Christ in every place, both theirs and ours: +\v 3 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 4 I always thank my God concerning you for the grace of God which was given you in Christ Jesus, +\v 5 that in everything you were enriched in him, in all speech and all knowledge— +\v 6 even as the testimony of Christ was confirmed in you— +\v 7 so that you come behind in no gift, waiting for the revelation of our Lord Jesus Christ, +\v 8 who will also confirm you until the end, blameless in the day of our Lord Jesus Christ. +\v 9 God is faithful, through whom you were called into the fellowship of his Son, Jesus Christ our Lord. +\p +\v 10 Now I beg you, brothers,\f + \fr 1:10 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* through the name of our Lord, Jesus Christ, that you all speak the same thing, and that there be no divisions among you, but that you be perfected together in the same mind and in the same judgment. +\v 11 For it has been reported to me concerning you, my brothers, by those who are from Chloe’s household, that there are contentions among you. +\v 12 Now I mean this, that each one of you says, “I follow Paul,” “I follow Apollos,” “I follow Cephas,” and, “I follow Christ.” +\v 13 Is Christ divided? Was Paul crucified for you? Or were you baptized into the name of Paul? +\v 14 I thank God that I baptized none of you except Crispus and Gaius, +\v 15 so that no one should say that I had baptized you into my own name. +\v 16 (I also baptized the household of Stephanas; besides them, I don’t know whether I baptized any other.) +\v 17 For Christ sent me not to baptize, but to preach the Good News—not in wisdom of words, so that the cross of Christ wouldn’t be made void. +\v 18 For the word of the cross is foolishness to those who are dying, but to us who are being saved it is the power of God. +\v 19 For it is written, +\q1 “I will destroy the wisdom of the wise. +\q2 I will bring the discernment of the discerning to nothing.”\x + \xo 1:19 \xt Isaiah 29:14\x* +\p +\v 20 Where is the wise? Where is the scribe? Where is the debater of this age? Hasn’t God made foolish the wisdom of this world? +\v 21 For seeing that in the wisdom of God, the world through its wisdom didn’t know God, it was God’s good pleasure through the foolishness of the preaching to save those who believe. +\v 22 For Jews ask for signs, Greeks seek after wisdom, +\v 23 but we preach Christ crucified, a stumbling block to Jews and foolishness to Greeks, +\v 24 but to those who are called, both Jews and Greeks, Christ is the power of God and the wisdom of God; +\v 25 because the foolishness of God is wiser than men, and the weakness of God is stronger than men. +\p +\v 26 For you see your calling, brothers, that not many are wise according to the flesh, not many mighty, and not many noble; +\v 27 but God chose the foolish things of the world that he might put to shame those who are wise. God chose the weak things of the world that he might put to shame the things that are strong. +\v 28 God chose the lowly things of the world, and the things that are despised, and the things that don’t exist, that he might bring to nothing the things that exist, +\v 29 that no flesh should boast before God. +\v 30 Because of him, you are in Christ Jesus, who was made to us wisdom from God, and righteousness and sanctification, and redemption, +\v 31 that, as it is written, “He who boasts, let him boast in the Lord.”\x + \xo 1:31 \xt Jeremiah 9:24\x* +\c 2 +\p +\v 1 When I came to you, brothers, I didn’t come with excellence of speech or of wisdom, proclaiming to you the testimony of God. +\v 2 For I determined not to know anything among you except Jesus Christ and him crucified. +\v 3 I was with you in weakness, in fear, and in much trembling. +\v 4 My speech and my preaching were not in persuasive words of human wisdom, but in demonstration of the Spirit and of power, +\v 5 that your faith wouldn’t stand in the wisdom of men, but in the power of God. +\p +\v 6 We speak wisdom, however, among those who are full grown, yet a wisdom not of this world nor of the rulers of this world who are coming to nothing. +\v 7 But we speak God’s wisdom in a mystery, the wisdom that has been hidden, which God foreordained before the worlds for our glory, +\v 8 which none of the rulers of this world has known. For had they known it, they wouldn’t have crucified the Lord of glory. +\v 9 But as it is written, +\q1 “Things which an eye didn’t see, and an ear didn’t hear, +\q2 which didn’t enter into the heart of man, +\q2 these God has prepared for those who love him.”\x + \xo 2:9 \xt Isaiah 64:4\x* +\p +\v 10 But to us, God revealed them through the Spirit. For the Spirit searches all things, yes, the deep things of God. +\v 11 For who among men knows the things of a man except the spirit of the man which is in him? Even so, no one knows the things of God except God’s Spirit. +\v 12 But we received not the spirit of the world, but the Spirit which is from God, that we might know the things that were freely given to us by God. +\v 13 We also speak these things, not in words which man’s wisdom teaches but which the Holy Spirit teaches, comparing spiritual things with spiritual things. +\v 14 Now the natural man doesn’t receive the things of God’s Spirit, for they are foolishness to him; and he can’t know them, because they are spiritually discerned. +\v 15 But he who is spiritual discerns all things, and he himself is to be judged by no one. +\v 16 “For who has known the mind of the Lord that he should instruct him?” \x + \xo 2:16 \xt Isaiah 40:13\x* But we have Christ’s mind. +\c 3 +\p +\v 1 Brothers, I couldn’t speak to you as to spiritual, but as to fleshly, as to babies in Christ. +\v 2 I fed you with milk, not with solid food, for you weren’t yet ready. Indeed, you aren’t ready even now, +\v 3 for you are still fleshly. For insofar as there is jealousy, strife, and factions among you, aren’t you fleshly, and don’t you walk in the ways of men? +\v 4 For when one says, “I follow Paul,” and another, “I follow Apollos,” aren’t you fleshly? +\p +\v 5 Who then is Apollos, and who is Paul, but servants through whom you believed, and each as the Lord gave to him? +\v 6 I planted. Apollos watered. But God gave the increase. +\v 7 So then neither he who plants is anything, nor he who waters, but God who gives the increase. +\v 8 Now he who plants and he who waters are the same, but each will receive his own reward according to his own labor. +\v 9 For we are God’s fellow workers. You are God’s farming, God’s building. +\p +\v 10 According to the grace of God which was given to me, as a wise master builder I laid a foundation, and another builds on it. But let each man be careful how he builds on it. +\v 11 For no one can lay any other foundation than that which has been laid, which is Jesus Christ. +\v 12 But if anyone builds on the foundation with gold, silver, costly stones, wood, hay, or straw, +\v 13 each man’s work will be revealed. For the Day will declare it, because it is revealed in fire; and the fire itself will test what sort of work each man’s work is. +\v 14 If any man’s work remains which he built on it, he will receive a reward. +\v 15 If any man’s work is burned, he will suffer loss, but he himself will be saved, but as through fire. +\p +\v 16 Don’t you know that you are God’s temple and that God’s Spirit lives in you? +\v 17 If anyone destroys God’s temple, God will destroy him; for God’s temple is holy, which you are. +\p +\v 18 Let no one deceive himself. If anyone thinks that he is wise among you in this world, let him become a fool that he may become wise. +\v 19 For the wisdom of this world is foolishness with God. For it is written, “He has taken the wise in their craftiness.”\x + \xo 3:19 \xt Job 5:13\x* +\v 20 And again, “The Lord knows the reasoning of the wise, that it is worthless.”\x + \xo 3:20 \xt Psalm 94:11\x* +\v 21 Therefore let no one boast in men. For all things are yours, +\v 22 whether Paul, or Apollos, or Cephas, or the world, or life, or death, or things present, or things to come. All are yours, +\v 23 and you are Christ’s, and Christ is God’s. +\c 4 +\p +\v 1 So let a man think of us as Christ’s servants and stewards of God’s mysteries. +\v 2 Here, moreover, it is required of stewards that they be found faithful. +\v 3 But with me it is a very small thing that I should be judged by you, or by a human court. Yes, I don’t even judge my own self. +\v 4 For I know nothing against myself. Yet I am not justified by this, but he who judges me is the Lord. +\v 5 Therefore judge nothing before the time, until the Lord comes, who will both bring to light the hidden things of darkness and reveal the counsels of the hearts. Then each man will get his praise from God. +\p +\v 6 Now these things, brothers, I have in a figure transferred to myself and Apollos for your sakes, that in us you might learn not to think beyond the things which are written, that none of you be puffed up against one another. +\v 7 For who makes you different? And what do you have that you didn’t receive? But if you did receive it, why do you boast as if you had not received it? +\p +\v 8 You are already filled. You have already become rich. You have come to reign without us. Yes, and I wish that you did reign, that we also might reign with you! +\v 9 For I think that God has displayed us, the apostles, last of all, like men sentenced to death. For we are made a spectacle to the world, both to angels and men. +\v 10 We are fools for Christ’s sake, but you are wise in Christ. We are weak, but you are strong. You have honor, but we have dishonor. +\v 11 Even to this present hour we hunger, thirst, are naked, are beaten, and have no certain dwelling place. +\v 12 We toil, working with our own hands. When people curse us, we bless. Being persecuted, we endure. +\v 13 Being defamed, we entreat. We are made as the filth of the world, the dirt wiped off by all, even until now. +\p +\v 14 I don’t write these things to shame you, but to admonish you as my beloved children. +\v 15 For though you have ten thousand tutors in Christ, you don’t have many fathers. For in Christ Jesus, I became your father through the Good News. +\v 16 I beg you therefore, be imitators of me. +\v 17 Because of this I have sent Timothy to you, who is my beloved and faithful child in the Lord, who will remind you of my ways which are in Christ, even as I teach everywhere in every assembly. +\v 18 Now some are puffed up, as though I were not coming to you. +\v 19 But I will come to you shortly, if the Lord is willing. And I will know, not the word of those who are puffed up, but the power. +\v 20 For God’s Kingdom is not in word, but in power. +\v 21 What do you want? Shall I come to you with a rod, or in love and a spirit of gentleness? +\c 5 +\p +\v 1 It is actually reported that there is sexual immorality among you, and such sexual immorality as is not even named among the Gentiles, that one has his father’s wife. +\v 2 You are arrogant, and didn’t mourn instead, that he who had done this deed might be removed from among you. +\v 3 For I most certainly, as being absent in body but present in spirit, have already, as though I were present, judged him who has done this thing. +\v 4 In the name of our Lord Jesus Christ, when you are gathered together with my spirit with the power of our Lord Jesus Christ, +\v 5 you are to deliver such a one to Satan for the destruction of the flesh, that the spirit may be saved in the day of the Lord Jesus. +\p +\v 6 Your boasting is not good. Don’t you know that a little yeast leavens the whole lump? +\v 7 Purge out the old yeast, that you may be a new lump, even as you are unleavened. For indeed Christ, our Passover, has been sacrificed in our place. +\v 8 Therefore let’s keep the feast, not with old yeast, neither with the yeast of malice and wickedness, but with the unleavened bread of sincerity and truth. +\p +\v 9 I wrote to you in my letter to have no company with sexual sinners; +\v 10 yet not at all meaning with the sexual sinners of this world, or with the covetous and extortionists, or with idolaters, for then you would have to leave the world. +\v 11 But as it is, I wrote to you not to associate with anyone who is called a brother who is a sexual sinner, or covetous, or an idolater, or a slanderer, or a drunkard, or an extortionist. Don’t even eat with such a person. +\v 12 For what do I have to do with also judging those who are outside? Don’t you judge those who are within? +\v 13 But those who are outside, God judges. “Put away the wicked man from among yourselves.”\x + \xo 5:13 \xt Deuteronomy 17:7; 19:19; 21:21; 22:21; 24:7\x* +\c 6 +\p +\v 1 Dare any of you, having a matter against his neighbor, go to law before the unrighteous, and not before the saints? +\v 2 Don’t you know that the saints will judge the world? And if the world is judged by you, are you unworthy to judge the smallest matters? +\v 3 Don’t you know that we will judge angels? How much more, things that pertain to this life? +\v 4 If then you have to judge things pertaining to this life, do you set them to judge who are of no account in the assembly? +\v 5 I say this to move you to shame. Isn’t there even one wise man among you who would be able to decide between his brothers? +\v 6 But brother goes to law with brother, and that before unbelievers! +\v 7 Therefore it is already altogether a defect in you that you have lawsuits one with another. Why not rather be wronged? Why not rather be defrauded? +\v 8 No, but you yourselves do wrong and defraud, and that against your brothers. +\p +\v 9 Or don’t you know that the unrighteous will not inherit God’s Kingdom? Don’t be deceived. Neither the sexually immoral, nor idolaters, nor adulterers, nor male prostitutes, nor homosexuals, +\v 10 nor thieves, nor covetous, nor drunkards, nor slanderers, nor extortionists, will inherit God’s Kingdom. +\v 11 Some of you were such, but you were washed. You were sanctified. You were justified in the name of the Lord Jesus, and in the Spirit of our God. +\p +\v 12 “All things are lawful for me,” but not all things are expedient. “All things are lawful for me,” but I will not be brought under the power of anything. +\v 13 “Foods for the belly, and the belly for foods,” but God will bring to nothing both it and them. But the body is not for sexual immorality, but for the Lord, and the Lord for the body. +\v 14 Now God raised up the Lord, and will also raise us up by his power. +\v 15 Don’t you know that your bodies are members of Christ? Shall I then take the members of Christ and make them members of a prostitute? May it never be! +\v 16 Or don’t you know that he who is joined to a prostitute is one body? For, “The two”, he says, “will become one flesh.”\x + \xo 6:16 \xt Genesis 2:24\x* +\v 17 But he who is joined to the Lord is one spirit. +\v 18 Flee sexual immorality! “Every sin that a man does is outside the body,” but he who commits sexual immorality sins against his own body. +\v 19 Or don’t you know that your body is a temple of the Holy Spirit who is in you, whom you have from God? You are not your own, +\v 20 for you were bought with a price. Therefore glorify God in your body and in your spirit, which are God’s. +\c 7 +\p +\v 1 Now concerning the things about which you wrote to me: it is good for a man not to touch a woman. +\v 2 But, because of sexual immoralities, let each man have his own wife, and let each woman have her own husband. +\v 3 Let the husband give his wife the affection owed her,\f + \fr 7:3 \ft NU and TR have “what is owed her” instead of “the affection owed her”.\f* and likewise also the wife her husband. +\v 4 The wife doesn’t have authority over her own body, but the husband does. Likewise also the husband doesn’t have authority over his own body, but the wife does. +\v 5 Don’t deprive one another, unless it is by consent for a season, that you may give yourselves to fasting and prayer, and may be together again, that Satan doesn’t tempt you because of your lack of self-control. +\p +\v 6 But this I say by way of concession, not of commandment. +\v 7 Yet I wish that all men were like me. However, each man has his own gift from God, one of this kind, and another of that kind. +\v 8 But I say to the unmarried and to widows, it is good for them if they remain even as I am. +\v 9 But if they don’t have self-control, let them marry. For it’s better to marry than to burn with passion. +\v 10 But to the married I command—not I, but the Lord—that the wife not leave her husband +\v 11 (but if she departs, let her remain unmarried, or else be reconciled to her husband), and that the husband not leave his wife. +\p +\v 12 But to the rest I—not the Lord—say, if any brother has an unbelieving wife, and she is content to live with him, let him not leave her. +\v 13 The woman who has an unbelieving husband, and he is content to live with her, let her not leave her husband. +\v 14 For the unbelieving husband is sanctified in the wife, and the unbelieving wife is sanctified in the husband. Otherwise your children would be unclean, but now they are holy. +\v 15 Yet if the unbeliever departs, let there be separation. The brother or the sister is not under bondage in such cases, but God has called us in peace. +\v 16 For how do you know, wife, whether you will save your husband? Or how do you know, husband, whether you will save your wife? +\p +\v 17 Only, as the Lord has distributed to each man, as God has called each, so let him walk. So I command in all the assemblies. +\p +\v 18 Was anyone called having been circumcised? Let him not become uncircumcised. Has anyone been called in uncircumcision? Let him not be circumcised. +\v 19 Circumcision is nothing, and uncircumcision is nothing, but what matters is keeping God’s commandments. +\v 20 Let each man stay in that calling in which he was called. +\v 21 Were you called being a bondservant? Don’t let that bother you, but if you get an opportunity to become free, use it. +\v 22 For he who was called in the Lord being a bondservant is the Lord’s free man. Likewise he who was called being free is Christ’s bondservant. +\v 23 You were bought with a price. Don’t become bondservants of men. +\v 24 Brothers, let each man, in whatever condition he was called, stay in that condition with God. +\p +\v 25 Now concerning virgins, I have no commandment from the Lord, but I give my judgment as one who has obtained mercy from the Lord to be trustworthy. +\v 26 Therefore I think that because of the distress that is on us, it’s good for a man to remain as he is. +\v 27 Are you bound to a wife? Don’t seek to be freed. Are you free from a wife? Don’t seek a wife. +\v 28 But if you marry, you have not sinned. If a virgin marries, she has not sinned. Yet such will have oppression in the flesh, and I want to spare you. +\v 29 But I say this, brothers: the time is short. From now on, both those who have wives may be as though they had none; +\v 30 and those who weep, as though they didn’t weep; and those who rejoice, as though they didn’t rejoice; and those who buy, as though they didn’t possess; +\v 31 and those who use the world, as not using it to the fullest. For the mode of this world passes away. +\p +\v 32 But I desire to have you to be free from cares. He who is unmarried is concerned for the things of the Lord, how he may please the Lord; +\v 33 but he who is married is concerned about the things of the world, how he may please his wife. +\v 34 There is also a difference between a wife and a virgin. The unmarried woman cares about the things of the Lord, that she may be holy both in body and in spirit. But she who is married cares about the things of the world—how she may please her husband. +\v 35 This I say for your own benefit, not that I may ensnare you, but for that which is appropriate, and that you may attend to the Lord without distraction. +\p +\v 36 But if any man thinks that he is behaving inappropriately toward his virgin, if she is past the flower of her age, and if need so requires, let him do what he desires. He doesn’t sin. Let them marry. +\v 37 But he who stands steadfast in his heart, having no urgency, but has power over his own will, and has determined in his own heart to keep his own virgin, does well. +\v 38 So then both he who gives his own virgin in marriage does well, and he who doesn’t give her in marriage does better. +\p +\v 39 A wife is bound by law for as long as her husband lives; but if the husband is dead, she is free to be married to whomever she desires, only in the Lord. +\v 40 But she is happier if she stays as she is, in my judgment, and I think that I also have God’s Spirit. +\c 8 +\p +\v 1 Now concerning things sacrificed to idols: We know that we all have knowledge. Knowledge puffs up, but love builds up. +\v 2 But if anyone thinks that he knows anything, he doesn’t yet know as he ought to know. +\v 3 But anyone who loves God is known by him. +\p +\v 4 Therefore concerning the eating of things sacrificed to idols, we know that no idol is anything in the world, and that there is no other God but one. +\v 5 For though there are things that are called “gods”, whether in the heavens or on earth—as there are many “gods” and many “lords”— +\v 6 yet to us there is one God, the Father, of whom are all things, and we for him; and one Lord, Jesus Christ, through whom are all things, and we live through him. +\p +\v 7 However, that knowledge isn’t in all men. But some, with consciousness of an idol until now, eat as of a thing sacrificed to an idol, and their conscience, being weak, is defiled. +\v 8 But food will not commend us to God. For neither, if we don’t eat are we the worse, nor if we eat are we the better. +\v 9 But be careful that by no means does this liberty of yours become a stumbling block to the weak. +\v 10 For if a man sees you who have knowledge sitting in an idol’s temple, won’t his conscience, if he is weak, be emboldened to eat things sacrificed to idols? +\v 11 And through your knowledge, he who is weak perishes, the brother for whose sake Christ died. +\v 12 Thus, sinning against the brothers, and wounding their conscience when it is weak, you sin against Christ. +\v 13 Therefore, if food causes my brother to stumble, I will eat no meat forever more, that I don’t cause my brother to stumble. +\c 9 +\p +\v 1 Am I not free? Am I not an apostle? Haven’t I seen Jesus Christ, our Lord? Aren’t you my work in the Lord? +\v 2 If to others I am not an apostle, yet at least I am to you; for you are the seal of my apostleship in the Lord. +\p +\v 3 My defense to those who examine me is this: +\v 4 Have we no right to eat and to drink? +\v 5 Have we no right to take along a wife who is a believer, even as the rest of the apostles, and the brothers of the Lord, and Cephas? +\v 6 Or have only Barnabas and I no right to not work? +\v 7 What soldier ever serves at his own expense? Who plants a vineyard, and doesn’t eat of its fruit? Or who feeds a flock, and doesn’t drink from the flock’s milk? +\p +\v 8 Do I speak these things according to the ways of men? Or doesn’t the law also say the same thing? +\v 9 For it is written in the law of Moses, “You shall not muzzle an ox while it treads out the grain.”\x + \xo 9:9 \xt Deuteronomy 25:4\x* Is it for the oxen that God cares, +\v 10 or does he say it assuredly for our sake? Yes, it was written for our sake, because he who plows ought to plow in hope, and he who threshes in hope should partake of his hope. +\v 11 If we sowed to you spiritual things, is it a great thing if we reap your fleshly things? +\v 12 If others partake of this right over you, don’t we yet more? +\p Nevertheless we didn’t use this right, but we bear all things, that we may cause no hindrance to the Good News of Christ. +\v 13 Don’t you know that those who serve around sacred things eat from the things of the temple, and those who wait on the altar have their portion with the altar? +\v 14 Even so the Lord ordained that those who proclaim the Good News should live from the Good News. +\p +\v 15 But I have used none of these things, and I don’t write these things that it may be done so in my case; for I would rather die, than that anyone should make my boasting void. +\v 16 For if I preach the Good News, I have nothing to boast about, for necessity is laid on me; but woe is to me if I don’t preach the Good News. +\v 17 For if I do this of my own will, I have a reward. But if not of my own will, I have a stewardship entrusted to me. +\v 18 What then is my reward? That when I preach the Good News, I may present the Good News of Christ without charge, so as not to abuse my authority in the Good News. +\p +\v 19 For though I was free from all, I brought myself under bondage to all, that I might gain the more. +\v 20 To the Jews I became as a Jew, that I might gain Jews; to those who are under the law, as under the law,\f + \fr 9:20 \ft NU adds: though I myself am not under the law\f* that I might gain those who are under the law; +\v 21 to those who are without law, as without law (not being without law toward God, but under law toward Christ), that I might win those who are without law. +\v 22 To the weak I became as weak, that I might gain the weak. I have become all things to all men, that I may by all means save some. +\v 23 Now I do this for the sake of the Good News, that I may be a joint partaker of it. +\v 24 Don’t you know that those who run in a race all run, but one receives the prize? Run like that, so that you may win. +\v 25 Every man who strives in the games exercises self-control in all things. Now they do it to receive a corruptible crown, but we an incorruptible. +\v 26 I therefore run like that, not aimlessly. I fight like that, not beating the air, +\v 27 but I beat my body and bring it into submission, lest by any means, after I have preached to others, I myself should be disqualified. +\c 10 +\p +\v 1 Now I would not have you ignorant, brothers, that our fathers were all under the cloud, and all passed through the sea; +\v 2 and were all baptized into Moses in the cloud and in the sea; +\v 3 and all ate the same spiritual food; +\v 4 and all drank the same spiritual drink. For they drank of a spiritual rock that followed them, and the rock was Christ. +\v 5 However with most of them, God was not well pleased, for they were overthrown in the wilderness. +\p +\v 6 Now these things were our examples, to the intent we should not lust after evil things as they also lusted. +\v 7 Don’t be idolaters, as some of them were. As it is written, “The people sat down to eat and drink, and rose up to play.”\x + \xo 10:7 \xt Exodus 32:6\x* +\v 8 Let’s not commit sexual immorality, as some of them committed, and in one day twenty-three thousand fell. +\v 9 Let’s not test Christ,\f + \fr 10:9 \ft NU reads “the Lord” instead of “Christ”.\f* as some of them tested, and perished by the serpents. +\v 10 Don’t grumble, as some of them also grumbled, and perished by the destroyer. +\v 11 Now all these things happened to them by way of example, and they were written for our admonition, on whom the ends of the ages have come. +\v 12 Therefore let him who thinks he stands be careful that he doesn’t fall. +\p +\v 13 No temptation has taken you except what is common to man. God is faithful, who will not allow you to be tempted above what you are able, but will with the temptation also make the way of escape, that you may be able to endure it. +\p +\v 14 Therefore, my beloved, flee from idolatry. +\v 15 I speak as to wise men. Judge what I say. +\v 16 The cup of blessing which we bless, isn’t it a sharing of the blood of Christ? The bread which we break, isn’t it a sharing of the body of Christ? +\v 17 Because there is one loaf of bread, we, who are many, are one body; for we all partake of the one loaf of bread. +\v 18 Consider Israel according to the flesh. Don’t those who eat the sacrifices participate in the altar? +\p +\v 19 What am I saying then? That a thing sacrificed to idols is anything, or that an idol is anything? +\v 20 But I say that the things which the Gentiles sacrifice, they sacrifice to demons and not to God, and I don’t desire that you would have fellowship with demons. +\v 21 You can’t both drink the cup of the Lord and the cup of demons. You can’t both partake of the table of the Lord and of the table of demons. +\v 22 Or do we provoke the Lord to jealousy? Are we stronger than he? +\p +\v 23 “All things are lawful for me,” but not all things are profitable. “All things are lawful for me,” but not all things build up. +\v 24 Let no one seek his own, but each one his neighbor’s good. +\v 25 Whatever is sold in the butcher shop, eat, asking no question for the sake of conscience, +\v 26 for “the earth is the Lord’s, and its fullness.”\x + \xo 10:26 \xt Psalm 24:1 \x* +\v 27 But if one of those who don’t believe invites you to a meal, and you are inclined to go, eat whatever is set before you, asking no questions for the sake of conscience. +\v 28 But if anyone says to you, “This was offered to idols,” don’t eat it for the sake of the one who told you, and for the sake of conscience. For “the earth is the Lord’s, with all its fullness.” +\v 29 Conscience, I say, not your own, but the other’s conscience. For why is my liberty judged by another conscience? +\v 30 If I partake with thankfulness, why am I denounced for something I give thanks for? +\p +\v 31 Whether therefore you eat or drink, or whatever you do, do all to the glory of God. +\v 32 Give no occasion for stumbling, whether to Jews, to Greeks, or to the assembly of God; +\v 33 even as I also please all men in all things, not seeking my own profit, but the profit of the many, that they may be saved. +\c 11 +\p +\v 1 Be imitators of me, even as I also am of Christ. +\p +\v 2 Now I praise you, brothers, that you remember me in all things, and hold firm the traditions, even as I delivered them to you. +\v 3 But I would have you know that the head\f + \fr 11:3 \ft or, origin\f* of every man is Christ, and the head\f + \fr 11:3 \ft or, origin\f* of the woman is man, and the head\f + \fr 11:3 \ft or, origin\f* of Christ is God. +\v 4 Every man praying or prophesying, having his head covered, dishonors his head. +\v 5 But every woman praying or prophesying with her head uncovered dishonors her head. For it is one and the same thing as if she were shaved. +\v 6 For if a woman is not covered, let her hair also be cut off. But if it is shameful for a woman to have her hair cut off or be shaved, let her be covered. +\v 7 For a man indeed ought not to have his head covered, because he is the image and glory of God, but the woman is the glory of the man. +\v 8 For man is not from woman, but woman from man; +\v 9 for man wasn’t created for the woman, but woman for the man. +\v 10 For this cause the woman ought to have authority over her own head, because of the angels. +\p +\v 11 Nevertheless, neither is the woman independent of the man, nor the man independent of the woman, in the Lord. +\v 12 For as woman came from man, so a man also comes through a woman; but all things are from God. +\v 13 Judge for yourselves. Is it appropriate that a woman pray to God unveiled? +\v 14 Doesn’t even nature itself teach you that if a man has long hair, it is a dishonor to him? +\v 15 But if a woman has long hair, it is a glory to her, for her hair is given to her for a covering. +\v 16 But if any man seems to be contentious, we have no such custom, neither do God’s assemblies. +\p +\v 17 But in giving you this command I don’t praise you, because you come together not for the better but for the worse. +\v 18 For first of all, when you come together in the assembly, I hear that divisions exist among you, and I partly believe it. +\v 19 For there also must be factions among you, that those who are approved may be revealed among you. +\v 20 When therefore you assemble yourselves together, it is not the Lord’s supper that you eat. +\v 21 For in your eating each one takes his own supper first. One is hungry, and another is drunken. +\v 22 What, don’t you have houses to eat and to drink in? Or do you despise God’s assembly and put them to shame who don’t have enough? What shall I tell you? Shall I praise you? In this I don’t praise you. +\p +\v 23 For I received from the Lord that which also I delivered to you, that the Lord Jesus on the night in which he was betrayed took bread. +\v 24 When he had given thanks, he broke it and said, \wj “Take, eat. This is my body, which is broken for you. Do this in memory of me.”\wj* +\v 25 In the same way he also took the cup after supper, saying, \wj “This cup is the new covenant in my blood. Do this, as often as you drink, in memory of me.”\wj* +\v 26 For as often as you eat this bread and drink this cup, you proclaim the Lord’s death until he comes. +\p +\v 27 Therefore whoever eats this bread or drinks the Lord’s cup in a way unworthy of the Lord will be guilty of the body and the blood of the Lord. +\v 28 But let a man examine himself, and so let him eat of the bread and drink of the cup. +\v 29 For he who eats and drinks in an unworthy way eats and drinks judgment to himself if he doesn’t discern the Lord’s body. +\v 30 For this cause many among you are weak and sickly, and not a few sleep. +\v 31 For if we discerned ourselves, we wouldn’t be judged. +\v 32 But when we are judged, we are disciplined by the Lord, that we may not be condemned with the world. +\v 33 Therefore, my brothers, when you come together to eat, wait for one another. +\v 34 But if anyone is hungry, let him eat at home, lest your coming together be for judgment. The rest I will set in order whenever I come. +\c 12 +\p +\v 1 Now concerning spiritual things, brothers, I don’t want you to be ignorant. +\v 2 You know that when you were heathen,\f + \fr 12:2 \ft or Gentiles\f* you were led away to those mute idols, however you might be led. +\v 3 Therefore I make known to you that no man speaking by God’s Spirit says, “Jesus is accursed.” No one can say, “Jesus is Lord,” but by the Holy Spirit. +\p +\v 4 Now there are various kinds of gifts, but the same Spirit. +\v 5 There are various kinds of service, and the same Lord. +\v 6 There are various kinds of workings, but the same God who works all things in all. +\v 7 But to each one is given the manifestation of the Spirit for the profit of all. +\v 8 For to one is given through the Spirit the word of wisdom, and to another the word of knowledge according to the same Spirit, +\v 9 to another faith by the same Spirit, and to another gifts of healings by the same Spirit, +\v 10 and to another workings of miracles, and to another prophecy, and to another discerning of spirits, to another different kinds of languages, and to another the interpretation of languages. +\v 11 But the one and the same Spirit produces all of these, distributing to each one separately as he desires. +\p +\v 12 For as the body is one and has many members, and all the members of the body, being many, are one body; so also is Christ. +\v 13 For in one Spirit we were all baptized into one body, whether Jews or Greeks, whether bond or free; and were all given to drink into one Spirit. +\p +\v 14 For the body is not one member, but many. +\v 15 If the foot would say, “Because I’m not the hand, I’m not part of the body,” it is not therefore not part of the body. +\v 16 If the ear would say, “Because I’m not the eye, I’m not part of the body,” it’s not therefore not part of the body. +\v 17 If the whole body were an eye, where would the hearing be? If the whole were hearing, where would the smelling be? +\v 18 But now God has set the members, each one of them, in the body, just as he desired. +\v 19 If they were all one member, where would the body be? +\v 20 But now they are many members, but one body. +\v 21 The eye can’t tell the hand, “I have no need for you,” or again the head to the feet, “I have no need for you.” +\v 22 No, much rather, those members of the body which seem to be weaker are necessary. +\v 23 Those parts of the body which we think to be less honorable, on those we bestow more abundant honor; and our unpresentable parts have more abundant modesty, +\v 24 while our presentable parts have no such need. But God composed the body together, giving more abundant honor to the inferior part, +\v 25 that there should be no division in the body, but that the members should have the same care for one another. +\v 26 When one member suffers, all the members suffer with it. When one member is honored, all the members rejoice with it. +\p +\v 27 Now you are the body of Christ, and members individually. +\v 28 God has set some in the assembly: first apostles, second prophets, third teachers, then miracle workers, then gifts of healings, helps, governments, and various kinds of languages. +\v 29 Are all apostles? Are all prophets? Are all teachers? Are all miracle workers? +\v 30 Do all have gifts of healings? Do all speak with various languages? Do all interpret? +\v 31 But earnestly desire the best gifts. Moreover, I show a most excellent way to you. +\c 13 +\p +\v 1 If I speak with the languages of men and of angels, but don’t have love, I have become sounding brass or a clanging cymbal. +\v 2 If I have the gift of prophecy, and know all mysteries and all knowledge, and if I have all faith, so as to remove mountains, but don’t have love, I am nothing. +\v 3 If I give away all my goods to feed the poor, and if I give my body to be burned, but don’t have love, it profits me nothing. +\p +\v 4 Love is patient and is kind. Love doesn’t envy. Love doesn’t brag, is not proud, +\v 5 doesn’t behave itself inappropriately, doesn’t seek its own way, is not provoked, takes no account of evil; +\v 6 doesn’t rejoice in unrighteousness, but rejoices with the truth; +\v 7 bears all things, believes all things, hopes all things, and endures all things. +\p +\v 8 Love never fails. But where there are prophecies, they will be done away with. Where there are various languages, they will cease. Where there is knowledge, it will be done away with. +\v 9 For we know in part and we prophesy in part; +\v 10 but when that which is complete has come, then that which is partial will be done away with. +\v 11 When I was a child, I spoke as a child, I felt as a child, I thought as a child. Now that I have become a man, I have put away childish things. +\v 12 For now we see in a mirror, dimly, but then face to face. Now I know in part, but then I will know fully, even as I was also fully known. +\v 13 But now faith, hope, and love remain—these three. The greatest of these is love. +\c 14 +\p +\v 1 Follow after love and earnestly desire spiritual gifts, but especially that you may prophesy. +\v 2 For he who speaks in another language speaks not to men, but to God, for no one understands, but in the Spirit he speaks mysteries. +\v 3 But he who prophesies speaks to men for their edification, exhortation, and consolation. +\v 4 He who speaks in another language edifies himself, but he who prophesies edifies the assembly. +\v 5 Now I desire to have you all speak with other languages, but even more that you would prophesy. For he is greater who prophesies than he who speaks with other languages, unless he interprets, that the assembly may be built up. +\p +\v 6 But now, brothers,\f + \fr 14:6 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* if I come to you speaking with other languages, what would I profit you unless I speak to you either by way of revelation, or of knowledge, or of prophesying, or of teaching? +\v 7 Even lifeless things that make a sound, whether pipe or harp, if they didn’t give a distinction in the sounds, how would it be known what is piped or harped? +\v 8 For if the trumpet gave an uncertain sound, who would prepare himself for war? +\v 9 So also you, unless you uttered by the tongue words easy to understand, how would it be known what is spoken? For you would be speaking into the air. +\v 10 There are, it may be, so many kinds of languages in the world, and none of them is without meaning. +\v 11 If then I don’t know the meaning of the language, I would be to him who speaks a foreigner, and he who speaks would be a foreigner to me. +\v 12 So also you, since you are zealous for spiritual gifts, seek that you may abound to the building up of the assembly. +\p +\v 13 Therefore let him who speaks in another language pray that he may interpret. +\v 14 For if I pray in another language, my spirit prays, but my understanding is unfruitful. +\p +\v 15 What should I do? I will pray with the spirit, and I will pray with the understanding also. I will sing with the spirit, and I will sing with the understanding also. +\v 16 Otherwise, if you bless with the spirit, how will he who fills the place of the unlearned say the “Amen” at your giving of thanks, seeing he doesn’t know what you say? +\v 17 For you most certainly give thanks well, but the other person is not built up. +\v 18 I thank my God, I speak with other languages more than you all. +\v 19 However, in the assembly I would rather speak five words with my understanding, that I might instruct others also, than ten thousand words in another language. +\p +\v 20 Brothers, don’t be children in thoughts, yet in malice be babies, but in thoughts be mature. +\v 21 In the law it is written, “By men of strange languages and by the lips of strangers I will speak to this people. They won’t even listen to me that way, says the Lord.”\x + \xo 14:21 \xt Isaiah 28:11-12\x* +\v 22 Therefore other languages are for a sign, not to those who believe, but to the unbelieving; but prophesying is for a sign, not to the unbelieving, but to those who believe. +\v 23 If therefore the whole assembly is assembled together and all speak with other languages, and unlearned or unbelieving people come in, won’t they say that you are crazy? +\v 24 But if all prophesy, and someone unbelieving or unlearned comes in, he is reproved by all, and he is judged by all. +\v 25 And thus the secrets of his heart are revealed. So he will fall down on his face and worship God, declaring that God is among you indeed. +\p +\v 26 What is it then, brothers? When you come together, each one of you has a psalm, has a teaching, has a revelation, has another language, or has an interpretation. Let all things be done to build each other up. +\v 27 If any man speaks in another language, let there be two, or at the most three, and in turn; and let one interpret. +\v 28 But if there is no interpreter, let him keep silent in the assembly, and let him speak to himself and to God. +\v 29 Let two or three of the prophets speak, and let the others discern. +\v 30 But if a revelation is made to another sitting by, let the first keep silent. +\v 31 For you all can prophesy one by one, that all may learn and all may be exhorted. +\v 32 The spirits of the prophets are subject to the prophets, +\v 33 for God is not a God of confusion but of peace, as in all the assemblies of the saints. +\v 34 Let the wives be quiet in the assemblies, for it has not been permitted for them to be talking except in submission, as the law also says,\x + \xo 14:34 \xt Deuteronomy 27:9\x* +\v 35 if they desire to learn anything. “Let them ask their own husbands at home, for it is shameful for a wife to be talking in the assembly.” +\v 36 What!? Was it from you that the word of God went out? Or did it come to you alone? +\p +\v 37 If any man thinks himself to be a prophet or spiritual, let him recognize the things which I write to you, that they are the commandment of the Lord. +\v 38 But if anyone is ignorant, let him be ignorant. +\p +\v 39 Therefore, brothers, desire earnestly to prophesy, and don’t forbid speaking with other languages. +\v 40 Let all things be done decently and in order. +\c 15 +\p +\v 1 Now I declare to you, brothers, the Good News which I preached to you, which also you received, in which you also stand, +\v 2 by which also you are saved, if you hold firmly the word which I preached to you—unless you believed in vain. +\p +\v 3 For I delivered to you first of all that which I also received: that Christ died for our sins according to the Scriptures, +\v 4 that he was buried, that he was raised on the third day according to the Scriptures, +\v 5 and that he appeared to Cephas, then to the twelve. +\v 6 Then he appeared to over five hundred brothers at once, most of whom remain until now, but some have also fallen asleep. +\v 7 Then he appeared to James, then to all the apostles, +\v 8 and last of all, as to the child born at the wrong time, he appeared to me also. +\v 9 For I am the least of the apostles, who is not worthy to be called an apostle, because I persecuted the assembly of God. +\v 10 But by the grace of God I am what I am. His grace which was given to me was not futile, but I worked more than all of them; yet not I, but the grace of God which was with me. +\v 11 Whether then it is I or they, so we preach, and so you believed. +\p +\v 12 Now if Christ is preached, that he has been raised from the dead, how do some among you say that there is no resurrection of the dead? +\v 13 But if there is no resurrection of the dead, neither has Christ been raised. +\v 14 If Christ has not been raised, then our preaching is in vain and your faith also is in vain. +\v 15 Yes, we are also found false witnesses of God, because we testified about God that he raised up Christ, whom he didn’t raise up if it is true that the dead are not raised. +\v 16 For if the dead aren’t raised, neither has Christ been raised. +\v 17 If Christ has not been raised, your faith is vain; you are still in your sins. +\v 18 Then they also who are fallen asleep in Christ have perished. +\v 19 If we have only hoped in Christ in this life, we are of all men most pitiable. +\p +\v 20 But now Christ has been raised from the dead. He became the first fruit of those who are asleep. +\v 21 For since death came by man, the resurrection of the dead also came by man. +\v 22 For as in Adam all die, so also in Christ all will be made alive. +\v 23 But each in his own order: Christ the first fruits, then those who are Christ’s at his coming. +\v 24 Then the end comes, when he will deliver up the Kingdom to God the Father, when he will have abolished all rule and all authority and power. +\v 25 For he must reign until he has put all his enemies under his feet. +\v 26 The last enemy that will be abolished is death. +\v 27 For, “He put all things in subjection under his feet.”\x + \xo 15:27 \xt Psalm 8:6\x* But when he says, “All things are put in subjection”, it is evident that he is excepted who subjected all things to him. +\v 28 When all things have been subjected to him, then the Son will also himself be subjected to him who subjected all things to him, that God may be all in all. +\p +\v 29 Or else what will they do who are baptized for the dead? If the dead aren’t raised at all, why then are they baptized for the dead? +\v 30 Why do we also stand in jeopardy every hour? +\v 31 I affirm, by the boasting in you which I have in Christ Jesus our Lord, I die daily. +\v 32 If I fought with animals at Ephesus for human purposes, what does it profit me? If the dead are not raised, then “let’s eat and drink, for tomorrow we die.”\x + \xo 15:32 \xt Isaiah 22:13\x* +\v 33 Don’t be deceived! “Evil companionships corrupt good morals.” +\v 34 Wake up righteously and don’t sin, for some have no knowledge of God. I say this to your shame. +\p +\v 35 But someone will say, “How are the dead raised?” and, “With what kind of body do they come?” +\v 36 You foolish one, that which you yourself sow is not made alive unless it dies. +\v 37 That which you sow, you don’t sow the body that will be, but a bare grain, maybe of wheat, or of some other kind. +\v 38 But God gives it a body even as it pleased him, and to each seed a body of its own. +\v 39 All flesh is not the same flesh, but there is one flesh of men, another flesh of animals, another of fish, and another of birds. +\v 40 There are also celestial bodies and terrestrial bodies; but the glory of the celestial differs from that of the terrestrial. +\v 41 There is one glory of the sun, another glory of the moon, and another glory of the stars; for one star differs from another star in glory. +\p +\v 42 So also is the resurrection of the dead. The body is sown perishable; it is raised imperishable. +\v 43 It is sown in dishonor; it is raised in glory. It is sown in weakness; it is raised in power. +\v 44 It is sown a natural body; it is raised a spiritual body. There is a natural body and there is also a spiritual body. +\p +\v 45 So also it is written, “The first man Adam became a living soul.” \x + \xo 15:45 \xt Genesis 2:7\x* The last Adam became a life-giving spirit. +\v 46 However, that which is spiritual isn’t first, but that which is natural, then that which is spiritual. +\v 47 The first man is of the earth, made of dust. The second man is the Lord from heaven. +\v 48 As is the one made of dust, such are those who are also made of dust; and as is the heavenly, such are they also that are heavenly. +\v 49 As we have borne the image of those made of dust, let’s\f + \fr 15:49 \ft NU, TR read “we will” instead of “let’s”\f* also bear the image of the heavenly. +\v 50 Now I say this, brothers,\f + \fr 15:50 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* that flesh and blood can’t inherit God’s Kingdom; neither does the perishable inherit imperishable. +\p +\v 51 Behold,\f + \fr 15:51 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I tell you a mystery. We will not all sleep, but we will all be changed, +\v 52 in a moment, in the twinkling of an eye, at the last trumpet. For the trumpet will sound and the dead will be raised incorruptible, and we will be changed. +\v 53 For this perishable body must become imperishable, and this mortal must put on immortality. +\v 54 But when this perishable body will have become imperishable, and this mortal will have put on immortality, then what is written will happen: “Death is swallowed up in victory.”\x + \xo 15:54 \xt Isaiah 25:8\x* +\q1 +\v 55 “Death, where is your sting? +\q2 Hades,\f + \fr 15:55 \ft or, Hell\f* where is your victory?”\x + \xo 15:55 \xt See Hosea 13:14\x* +\p +\v 56 The sting of death is sin, and the power of sin is the law. +\v 57 But thanks be to God, who gives us the victory through our Lord Jesus Christ. +\v 58 Therefore, my beloved brothers, be steadfast, immovable, always abounding in the Lord’s work, because you know that your labor is not in vain in the Lord. +\c 16 +\p +\v 1 Now concerning the collection for the saints: as I commanded the assemblies of Galatia, you do likewise. +\v 2 On the first day of every week, let each one of you save as he may prosper, that no collections are made when I come. +\v 3 When I arrive, I will send whoever you approve with letters to carry your gracious gift to Jerusalem. +\v 4 If it is appropriate for me to go also, they will go with me. +\p +\v 5 I will come to you when I have passed through Macedonia, for I am passing through Macedonia. +\v 6 But with you it may be that I will stay with you, or even winter with you, that you may send me on my journey wherever I go. +\v 7 For I do not wish to see you now in passing, but I hope to stay a while with you, if the Lord permits. +\v 8 But I will stay at Ephesus until Pentecost, +\v 9 for a great and effective door has opened to me, and there are many adversaries. +\p +\v 10 Now if Timothy comes, see that he is with you without fear, for he does the work of the Lord, as I also do. +\v 11 Therefore let no one despise him. But set him forward on his journey in peace, that he may come to me; for I expect him with the brothers. +\p +\v 12 Now concerning Apollos the brother, I strongly urged him to come to you with the brothers, but it was not at all his desire to come now; but he will come when he has an opportunity. +\p +\v 13 Watch! Stand firm in the faith! Be courageous! Be strong! +\v 14 Let all that you do be done in love. +\p +\v 15 Now I beg you, brothers—you know the house of Stephanas, that it is the first fruits of Achaia, and that they have set themselves to serve the saints— +\v 16 that you also be in subjection to such, and to everyone who helps in the work and labors. +\v 17 I rejoice at the coming of Stephanas, Fortunatus, and Achaicus; for that which was lacking on your part, they supplied. +\v 18 For they refreshed my spirit and yours. Therefore acknowledge those who are like that. +\p +\v 19 The assemblies of Asia greet you. Aquila and Priscilla greet you warmly in the Lord, together with the assembly that is in their house. +\v 20 All the brothers greet you. Greet one another with a holy kiss. +\p +\v 21 This greeting is by me, Paul, with my own hand. +\v 22 If any man doesn’t love the Lord Jesus Christ, let him be cursed.\f + \fr 16:22 \ft Greek: anathema.\f* Come, Lord!\f + \fr 16:22 \ft Aramaic: Maranatha!\f* +\v 23 The grace of the Lord Jesus Christ be with you. +\v 24 My love to all of you in Christ Jesus. Amen. diff --git a/c-sharp/assets/WEB/482COengWEBUS.SFM b/c-sharp/assets/WEB/482COengWEBUS.SFM new file mode 100644 index 0000000000..4cd6e63aa4 --- /dev/null +++ b/c-sharp/assets/WEB/482COengWEBUS.SFM @@ -0,0 +1,345 @@ +\id 2CO 47-2CO-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 2 Corinthians +\toc1 Paul’s Second Letter to the Corinthians +\toc2 2 Corinthians +\toc3 2 Corinthians +\mt1 Paul’s Second Letter to the Corinthians +\c 1 +\p +\v 1 Paul, an apostle of Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* Jesus through the will of God, and Timothy our brother, to the assembly of God which is at Corinth, with all the saints who are in the whole of Achaia: +\v 2 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 3 Blessed be the God and Father of our Lord Jesus Christ, the Father of mercies and God of all comfort, +\v 4 who comforts us in all our affliction, that we may be able to comfort those who are in any affliction, through the comfort with which we ourselves are comforted by God. +\v 5 For as the sufferings of Christ abound to us, even so our comfort also abounds through Christ. +\v 6 But if we are afflicted, it is for your comfort and salvation. If we are comforted, it is for your comfort, which produces in you the patient enduring of the same sufferings which we also suffer. +\v 7 Our hope for you is steadfast, knowing that, since you are partakers of the sufferings, so you are also of the comfort. +\p +\v 8 For we don’t desire to have you uninformed, brothers,\f + \fr 1:8 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* concerning our affliction which happened to us in Asia: that we were weighed down exceedingly, beyond our power, so much that we despaired even of life. +\v 9 Yes, we ourselves have had the sentence of death within ourselves, that we should not trust in ourselves, but in God who raises the dead, +\v 10 who delivered us out of so great a death, and does deliver, on whom we have set our hope that he will also still deliver us, +\v 11 you also helping together on our behalf by your supplication; that, for the gift given to us by means of many, thanks may be given by many persons on your behalf. +\p +\v 12 For our boasting is this: the testimony of our conscience that in holiness and sincerity of God, not in fleshly wisdom but in the grace of God, we behaved ourselves in the world, and more abundantly toward you. +\v 13 For we write no other things to you than what you read or even acknowledge, and I hope you will acknowledge to the end— +\v 14 as also you acknowledged us in part—that we are your boasting, even as you also are ours, in the day of our Lord Jesus. +\p +\v 15 In this confidence, I was determined to come first to you, that you might have a second benefit, +\v 16 and by you to pass into Macedonia, and again from Macedonia to come to you, and to be sent forward by you on my journey to Judea. +\v 17 When I therefore planned this, did I show fickleness? Or the things that I plan, do I plan according to the flesh, that with me there should be the “Yes, yes” and the “No, no?” +\v 18 But as God is faithful, our word toward you was not “Yes and no.” +\v 19 For the Son of God, Jesus Christ, who was preached among you by us—by me, Silvanus, and Timothy—was not “Yes and no,” but in him is “Yes.” +\v 20 For however many are the promises of God, in him is the “Yes.” Therefore also through him is the “Amen”, to the glory of God through us. +\p +\v 21 Now he who establishes us with you in Christ and anointed us is God, +\v 22 who also sealed us and gave us the down payment of the Spirit in our hearts. +\p +\v 23 But I call God for a witness to my soul, that to spare you, I didn’t come to Corinth. +\v 24 We don’t control your faith, but are fellow workers with you for your joy. For you stand firm in faith. +\c 2 +\p +\v 1 But I determined this for myself, that I would not come to you again in sorrow. +\v 2 For if I make you grieve, then who will make me glad but he who is made to grieve by me? +\v 3 And I wrote this very thing to you, so that when I came, I wouldn’t have sorrow from them of whom I ought to rejoice; having confidence in you all that my joy would be shared by all of you. +\v 4 For out of much affliction and anguish of heart I wrote to you with many tears, not that you should be made to grieve, but that you might know the love that I have so abundantly for you. +\p +\v 5 But if any has caused sorrow, he has caused sorrow not to me, but in part (that I not press too heavily) to you all. +\v 6 This punishment which was inflicted by the many is sufficient for such a one; +\v 7 so that, on the contrary, you should rather forgive him and comfort him, lest by any means such a one should be swallowed up with his excessive sorrow. +\v 8 Therefore I beg you to confirm your love toward him. +\v 9 For to this end I also wrote, that I might know the proof of you, whether you are obedient in all things. +\v 10 Now I also forgive whomever you forgive anything. For if indeed I have forgiven anything, I have forgiven that one for your sakes in the presence of Christ, +\v 11 that no advantage may be gained over us by Satan, for we are not ignorant of his schemes. +\p +\v 12 Now when I came to Troas for the Good News of Christ, and when a door was opened to me in the Lord, +\v 13 I had no relief for my spirit, because I didn’t find Titus my brother, but taking my leave of them, I went out into Macedonia. +\p +\v 14 Now thanks be to God who always leads us in triumph in Christ, and reveals through us the sweet aroma of his knowledge in every place. +\v 15 For we are a sweet aroma of Christ to God in those who are saved and in those who perish: +\v 16 to the one a stench from death to death, to the other a sweet aroma from life to life. Who is sufficient for these things? +\v 17 For we are not as so many, peddling the word of God. But as of sincerity, but as of God, in the sight of God, we speak in Christ. +\c 3 +\p +\v 1 Are we beginning again to commend ourselves? Or do we need, as do some, letters of commendation to you or from you? +\v 2 You are our letter, written in our hearts, known and read by all men, +\v 3 being revealed that you are a letter of Christ, served by us, written not with ink, but with the Spirit of the living God; not in tablets of stone, but in tablets that are hearts of flesh. +\p +\v 4 Such confidence we have through Christ toward God, +\v 5 not that we are sufficient of ourselves to account anything as from ourselves; but our sufficiency is from God, +\v 6 who also made us sufficient as servants of a new covenant, not of the letter but of the Spirit. For the letter kills, but the Spirit gives life. +\p +\v 7 But if the service of death, written engraved on stones, came with glory, so that the children of Israel could not look steadfastly on the face of Moses for the glory of his face, which was passing away, +\v 8 won’t service of the Spirit be with much more glory? +\v 9 For if the service of condemnation has glory, the service of righteousness exceeds much more in glory. +\v 10 For most certainly that which has been made glorious has not been made glorious in this respect, by reason of the glory that surpasses. +\v 11 For if that which passes away was with glory, much more that which remains is in glory. +\p +\v 12 Having therefore such a hope, we use great boldness of speech, +\v 13 and not as Moses, who put a veil on his face so that the children of Israel wouldn’t look steadfastly on the end of that which was passing away. +\v 14 But their minds were hardened, for until this very day at the reading of the old covenant the same veil remains, because in Christ it passes away. +\v 15 But to this day, when Moses is read, a veil lies on their heart. +\v 16 But whenever someone turns to the Lord, the veil is taken away. +\v 17 Now the Lord is the Spirit; and where the Spirit of the Lord is, there is liberty. +\v 18 But we all, with unveiled face seeing the glory of the Lord as in a mirror, are transformed into the same image from glory to glory, even as from the Lord, the Spirit. +\c 4 +\p +\v 1 Therefore, seeing we have this ministry, even as we obtained mercy, we don’t faint. +\v 2 But we have renounced the hidden things of shame, not walking in craftiness nor handling the word of God deceitfully, but by the manifestation of the truth commending ourselves to every man’s conscience in the sight of God. +\v 3 Even if our Good News is veiled, it is veiled in those who are dying, +\v 4 in whom the god of this world has blinded the minds of the unbelieving, that the light of the Good News of the glory of Christ, who is the image of God, should not dawn on them. +\v 5 For we don’t preach ourselves, but Christ Jesus as Lord, and ourselves as your servants for Jesus’ sake, +\v 6 seeing it is God who said, “Light will shine out of darkness,”\x + \xo 4:6 \xt Genesis 1:3\x* who has shone in our hearts to give the light of the knowledge of the glory of God in the face of Jesus Christ. +\p +\v 7 But we have this treasure in clay vessels, that the exceeding greatness of the power may be of God and not from ourselves. +\v 8 We are pressed on every side, yet not crushed; perplexed, yet not to despair; +\v 9 pursued, yet not forsaken; struck down, yet not destroyed; +\v 10 always carrying in the body the putting to death of the Lord Jesus, that the life of Jesus may also be revealed in our body. +\v 11 For we who live are always delivered to death for Jesus’ sake, that the life also of Jesus may be revealed in our mortal flesh. +\v 12 So then death works in us, but life in you. +\p +\v 13 But having the same spirit of faith, according to that which is written, “I believed, and therefore I spoke.”\x + \xo 4:13 \xt Psalm 116:10\x* We also believe, and therefore we also speak, +\v 14 knowing that he who raised the Lord Jesus will raise us also with Jesus, and will present us with you. +\v 15 For all things are for your sakes, that the grace, being multiplied through the many, may cause the thanksgiving to abound to the glory of God. +\p +\v 16 Therefore we don’t faint, but though our outward person is decaying, yet our inward person is renewed day by day. +\v 17 For our light affliction, which is for the moment, works for us more and more exceedingly an eternal weight of glory, +\v 18 while we don’t look at the things which are seen, but at the things which are not seen. For the things which are seen are temporal, but the things which are not seen are eternal. +\c 5 +\p +\v 1 For we know that if the earthly house of our tent is dissolved, we have a building from God, a house not made with hands, eternal, in the heavens. +\v 2 For most certainly in this we groan, longing to be clothed with our habitation which is from heaven, +\v 3 if indeed being clothed, we will not be found naked. +\v 4 For indeed we who are in this tent do groan, being burdened, not that we desire to be unclothed, but that we desire to be clothed, that what is mortal may be swallowed up by life. +\v 5 Now he who made us for this very thing is God, who also gave to us the down payment of the Spirit. +\p +\v 6 Therefore we are always confident and know that while we are at home in the body, we are absent from the Lord; +\v 7 for we walk by faith, not by sight. +\v 8 We are courageous, I say, and are willing rather to be absent from the body and to be at home with the Lord. +\v 9 Therefore also we make it our aim, whether at home or absent, to be well pleasing to him. +\v 10 For we must all be revealed before the judgment seat of Christ that each one may receive the things in the body according to what he has done, whether good or bad. +\p +\v 11 Knowing therefore the fear of the Lord, we persuade men, but we are revealed to God, and I hope that we are revealed also in your consciences. +\v 12 For we are not commending ourselves to you again, but speak as giving you occasion of boasting on our behalf, that you may have something to answer those who boast in appearance and not in heart. +\v 13 For if we are beside ourselves, it is for God. Or if we are of sober mind, it is for you. +\v 14 For the love of Christ compels us; because we judge thus: that one died for all, therefore all died. +\v 15 He died for all, that those who live should no longer live to themselves, but to him who for their sakes died and rose again. +\p +\v 16 Therefore we know no one according to the flesh from now on. Even though we have known Christ according to the flesh, yet now we know him so no more. +\v 17 Therefore if anyone is in Christ, he is a new creation. The old things have passed away. Behold,\f + \fr 5:17 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* all things have become new. +\v 18 But all things are of God, who reconciled us to himself through Jesus Christ, and gave to us the ministry of reconciliation; +\v 19 namely, that God was in Christ reconciling the world to himself, not reckoning to them their trespasses, and having committed to us the word of reconciliation. +\p +\v 20 We are therefore ambassadors on behalf of Christ, as though God were entreating by us: we beg you on behalf of Christ, be reconciled to God. +\v 21 For him who knew no sin he made to be sin on our behalf, so that in him we might become the righteousness of God. +\c 6 +\p +\v 1 Working together, we entreat also that you do not receive the grace of God in vain. +\v 2 For he says, +\q1 “At an acceptable time I listened to you. +\q1 In a day of salvation I helped you.”\x + \xo 6:2 \xt Isaiah 49:8\x* +\p Behold, now is the acceptable time. Behold, now is the day of salvation. +\v 3 We give no occasion of stumbling in anything, that our service may not be blamed, +\v 4 but in everything commending ourselves as servants of God: in great endurance, in afflictions, in hardships, in distresses, +\v 5 in beatings, in imprisonments, in riots, in labors, in watchings, in fastings, +\v 6 in pureness, in knowledge, in perseverance, in kindness, in the Holy Spirit, in sincere love, +\v 7 in the word of truth, in the power of God, by the armor of righteousness on the right hand and on the left, +\v 8 by glory and dishonor, by evil report and good report, as deceivers and yet true, +\v 9 as unknown and yet well known, as dying and behold—we live, as punished and not killed, +\v 10 as sorrowful yet always rejoicing, as poor yet making many rich, as having nothing and yet possessing all things. +\p +\v 11 Our mouth is open to you, Corinthians. Our heart is enlarged. +\v 12 You are not restricted by us, but you are restricted by your own affections. +\v 13 Now in return—I speak as to my children—you also open your hearts. +\p +\v 14 Don’t be unequally yoked with unbelievers, for what fellowship do righteousness and iniquity have? Or what fellowship does light have with darkness? +\v 15 What agreement does Christ have with Belial? Or what portion does a believer have with an unbeliever? +\v 16 What agreement does a temple of God have with idols? For you are a temple of the living God. Even as God said, “I will dwell in them and walk in them. I will be their God and they will be my people.”\x + \xo 6:16 \xt Leviticus 26:12; Jeremiah 32:38; Ezekiel 37:27\x* +\v 17 Therefore +\q1 “‘Come out from among them, +\q2 and be separate,’ says the Lord. +\q1 ‘Touch no unclean thing. +\q2 I will receive you.\x + \xo 6:17 \xt Isaiah 52:11; Ezekiel 20:34,41\x* +\q1 +\v 18 I will be to you a Father. +\q2 You will be to me sons and daughters,’ +\p says the Lord Almighty.”\x + \xo 6:18 \xt 2 Samuel 7:14; 7:8\x* +\c 7 +\p +\v 1 Having therefore these promises, beloved, let’s cleanse ourselves from all defilement of flesh and spirit, perfecting holiness in the fear of God. +\p +\v 2 Open your hearts to us. We wronged no one. We corrupted no one. We took advantage of no one. +\v 3 I say this not to condemn you, for I have said before that you are in our hearts to die together and live together. +\v 4 Great is my boldness of speech toward you. Great is my boasting on your behalf. I am filled with comfort. I overflow with joy in all our affliction. +\p +\v 5 For even when we had come into Macedonia, our flesh had no relief, but we were afflicted on every side. Fightings were outside. Fear was inside. +\v 6 Nevertheless, he who comforts the lowly, God, comforted us by the coming of Titus, +\v 7 and not by his coming only, but also by the comfort with which he was comforted in you while he told us of your longing, your mourning, and your zeal for me, so that I rejoiced still more. +\p +\v 8 For though I grieved you with my letter, I do not regret it, though I did regret it. For I see that my letter made you grieve, though just for a while. +\v 9 I now rejoice, not that you were grieved, but that you were grieved to repentance. For you were grieved in a godly way, that you might suffer loss by us in nothing. +\v 10 For godly sorrow produces repentance leading to salvation, which brings no regret. But the sorrow of the world produces death. +\v 11 For behold, this same thing, that you were grieved in a godly way, what earnest care it worked in you. Yes, what defense, indignation, fear, longing, zeal, and vindication! In everything you demonstrated yourselves to be pure in the matter. +\v 12 So although I wrote to you, I wrote not for his cause that did the wrong, nor for his cause that suffered the wrong, but that your earnest care for us might be revealed in you in the sight of God. +\v 13 Therefore we have been comforted. In our comfort we rejoiced the more exceedingly for the joy of Titus, because his spirit has been refreshed by you all. +\v 14 For if in anything I have boasted to him on your behalf, I was not disappointed. But as we spoke all things to you in truth, so our glorying also which I made before Titus was found to be truth. +\v 15 His affection is more abundantly toward you, while he remembers all of your obedience, how with fear and trembling you received him. +\v 16 I rejoice that in everything I am confident concerning you. +\c 8 +\p +\v 1 Moreover, brothers, we make known to you the grace of God which has been given in the assemblies of Macedonia, +\v 2 how in a severe ordeal of affliction, the abundance of their joy and their deep poverty abounded to the riches of their generosity. +\v 3 For according to their power, I testify, yes and beyond their power, they gave of their own accord, +\v 4 begging us with much entreaty to receive this grace and the fellowship in the service to the saints. +\v 5 This was not as we had expected, but first they gave their own selves to the Lord, and to us through the will of God. +\v 6 So we urged Titus, that as he had made a beginning before, so he would also complete in you this grace. +\v 7 But as you abound in everything—in faith, utterance, knowledge, all earnestness, and in your love to us—see that you also abound in this grace. +\p +\v 8 I speak not by way of commandment, but as proving through the earnestness of others the sincerity also of your love. +\v 9 For you know the grace of our Lord Jesus Christ, that though he was rich, yet for your sakes he became poor, that you through his poverty might become rich. +\v 10 I give advice in this: it is expedient for you who were the first to start a year ago, not only to do, but also to be willing. +\v 11 But now complete the doing also, that as there was the readiness to be willing, so there may be the completion also out of your ability. +\v 12 For if the readiness is there, it is acceptable according to what you have, not according to what you don’t have. +\v 13 For this is not that others may be eased and you distressed, +\v 14 but for equality. Your abundance at this present time supplies their lack, that their abundance also may become a supply for your lack, that there may be equality. +\v 15 As it is written, “He who gathered much had nothing left over, and he who gathered little had no lack.”\x + \xo 8:15 \xt Exodus 16:18\x* +\p +\v 16 But thanks be to God, who puts the same earnest care for you into the heart of Titus. +\v 17 For he indeed accepted our exhortation, but being himself very earnest, he went out to you of his own accord. +\v 18 We have sent together with him the brother whose praise in the Good News is known throughout all the assemblies. +\v 19 Not only so, but he was also appointed by the assemblies to travel with us in this grace, which is served by us to the glory of the Lord himself, and to show our readiness. +\v 20 We are avoiding this, that any man should blame us concerning this abundance which is administered by us. +\v 21 Having regard for honorable things, not only in the sight of the Lord, but also in the sight of men. +\v 22 We have sent with them our brother whom we have many times proved earnest in many things, but now much more earnest, by reason of the great confidence which he has in you. +\v 23 As for Titus, he is my partner and fellow worker for you. As for our brothers, they are the apostles of the assemblies, the glory of Christ. +\v 24 Therefore show the proof of your love to them before the assemblies, and of our boasting on your behalf. +\c 9 +\p +\v 1 It is indeed unnecessary for me to write to you concerning the service to the saints, +\v 2 for I know your readiness, of which I boast on your behalf to those of Macedonia, that Achaia has been prepared for the past year. Your zeal has stirred up very many of them. +\v 3 But I have sent the brothers so that our boasting on your behalf may not be in vain in this respect, that, just as I said, you may be prepared, +\v 4 lest by any means, if anyone from Macedonia comes there with me and finds you unprepared, we (to say nothing of you) would be disappointed in this confident boasting. +\v 5 I thought it necessary therefore to entreat the brothers that they would go before to you and arrange ahead of time the generous gift that you promised before, that the same might be ready as a matter of generosity, and not of greediness. +\p +\v 6 Remember this: he who sows sparingly will also reap sparingly. He who sows bountifully will also reap bountifully. +\v 7 Let each man give according as he has determined in his heart, not grudgingly or under compulsion, for God loves a cheerful giver. +\v 8 And God is able to make all grace abound to you, that you, always having all sufficiency in everything, may abound to every good work. +\v 9 As it is written, +\q1 “He has scattered abroad. He has given to the poor. +\q2 His righteousness remains forever.”\x + \xo 9:9 \xt Psalm 112:9\x* +\p +\v 10 Now may he who supplies seed to the sower and bread for food, supply and multiply your seed for sowing, and increase the fruits of your righteousness, +\v 11 you being enriched in everything for all generosity, which produces thanksgiving to God through us. +\v 12 For this service of giving that you perform not only makes up for lack among the saints, but abounds also through much giving of thanks to God, +\v 13 seeing that through the proof given by this service, they glorify God for the obedience of your confession to the Good News of Christ and for the generosity of your contribution to them and to all, +\v 14 while they themselves also, with supplication on your behalf, yearn for you by reason of the exceeding grace of God in you. +\v 15 Now thanks be to God for his unspeakable gift! +\c 10 +\p +\v 1 Now I Paul, myself, entreat you by the humility and gentleness of Christ, I who in your presence am lowly among you, but being absent am bold toward you. +\v 2 Yes, I beg you that I may not, when present, show courage with the confidence with which I intend to be bold against some, who consider us to be walking according to the flesh. +\v 3 For though we walk in the flesh, we don’t wage war according to the flesh; +\v 4 for the weapons of our warfare are not of the flesh, but mighty before God to the throwing down of strongholds, +\v 5 throwing down imaginations and every high thing that is exalted against the knowledge of God and bringing every thought into captivity to the obedience of Christ, +\v 6 and being in readiness to avenge all disobedience when your obedience is made full. +\p +\v 7 Do you look at things only as they appear in front of your face? If anyone trusts in himself that he is Christ’s, let him consider this again with himself, that even as he is Christ’s, so we also are Christ’s. +\v 8 For even if I boast somewhat abundantly concerning our authority, which the Lord gave for building you up and not for casting you down, I will not be ashamed, +\v 9 that I may not seem as if I desire to terrify you by my letters. +\v 10 For, “His letters”, they say, “are weighty and strong, but his bodily presence is weak, and his speech is despised.” +\v 11 Let such a person consider this, that what we are in word by letters when we are absent, such are we also in deed when we are present. +\p +\v 12 For we are not bold to number or compare ourselves with some of those who commend themselves. But they themselves, measuring themselves by themselves, and comparing themselves with themselves, are without understanding. +\v 13 But we will not boast beyond proper limits, but within the boundaries with which God appointed to us, which reach even to you. +\v 14 For we don’t stretch ourselves too much, as though we didn’t reach to you. For we came even as far as to you with the Good News of Christ, +\v 15 not boasting beyond proper limits in other men’s labors, but having hope that as your faith grows, we will be abundantly enlarged by you in our sphere of influence, +\v 16 so as to preach the Good News even to the parts beyond you, not to boast in what someone else has already done. +\v 17 But “he who boasts, let him boast in the Lord.”\x + \xo 10:17 \xt Jeremiah 9:24 \x* +\v 18 For it isn’t he who commends himself who is approved, but whom the Lord commends. +\c 11 +\p +\v 1 I wish that you would bear with me in a little foolishness, but indeed you do bear with me. +\v 2 For I am jealous over you with a godly jealousy. For I promised you in marriage to one husband, that I might present you as a pure virgin to Christ. +\v 3 But I am afraid that somehow, as the serpent deceived Eve in his craftiness, so your minds might be corrupted from the simplicity that is in Christ. +\v 4 For if he who comes preaches another Jesus whom we didn’t preach, or if you receive a different spirit which you didn’t receive, or a different “good news” which you didn’t accept, you put up with that well enough. +\v 5 For I reckon that I am not at all behind the very best apostles. +\v 6 But though I am unskilled in speech, yet I am not unskilled in knowledge. No, in every way we have been revealed to you in all things. +\p +\v 7 Or did I commit a sin in humbling myself that you might be exalted, because I preached to you God’s Good News free of charge? +\v 8 I robbed other assemblies, taking wages from them that I might serve you. +\v 9 When I was present with you and was in need, I wasn’t a burden on anyone, for the brothers, when they came from Macedonia, supplied the measure of my need. In everything I kept myself from being burdensome to you, and I will continue to do so. +\v 10 As the truth of Christ is in me, no one will stop me from this boasting in the regions of Achaia. +\v 11 Why? Because I don’t love you? God knows. +\p +\v 12 But what I do, that I will continue to do, that I may cut off opportunity from those who desire an opportunity, that in which they boast, they may be recognized just like us. +\v 13 For such men are false apostles, deceitful workers, masquerading as Christ’s apostles. +\v 14 And no wonder, for even Satan masquerades as an angel of light. +\v 15 It is no great thing therefore if his servants also masquerade as servants of righteousness, whose end will be according to their works. +\p +\v 16 I say again, let no one think me foolish. But if so, yet receive me as foolish, that I also may boast a little. +\v 17 That which I speak, I don’t speak according to the Lord, but as in foolishness, in this confidence of boasting. +\v 18 Seeing that many boast after the flesh, I will also boast. +\v 19 For you bear with the foolish gladly, being wise. +\v 20 For you bear with a man if he brings you into bondage, if he devours you, if he takes you captive, if he exalts himself, or if he strikes you on the face. +\v 21 To my shame, I speak as though we had been weak. Yet in whatever way anyone is bold (I speak in foolishness), I am bold also. +\v 22 Are they Hebrews? So am I. Are they Israelites? So am I. Are they the offspring\f + \fr 11:22 \ft or, seed\f* of Abraham? So am I. +\v 23 Are they servants of Christ? (I speak as one beside himself.) I am more so: in labors more abundantly, in prisons more abundantly, in stripes above measure, and in deaths often. +\v 24 Five times I received forty stripes minus one from the Jews. +\v 25 Three times I was beaten with rods. Once I was stoned. Three times I suffered shipwreck. I have been a night and a day in the deep. +\v 26 I have been in travels often, perils of rivers, perils of robbers, perils from my countrymen, perils from the Gentiles, perils in the city, perils in the wilderness, perils in the sea, perils among false brothers; +\v 27 in labor and travail, in watchings often, in hunger and thirst, in fastings often, and in cold and nakedness. +\p +\v 28 Besides those things that are outside, there is that which presses on me daily: anxiety for all the assemblies. +\v 29 Who is weak, and I am not weak? Who is caused to stumble, and I don’t burn with indignation? +\p +\v 30 If I must boast, I will boast of the things that concern my weakness. +\v 31 The God and Father of the Lord Jesus Christ, he who is blessed forever more, knows that I don’t lie. +\v 32 In Damascus the governor under King Aretas guarded the Damascenes’ city, desiring to arrest me. +\v 33 I was let down in a basket through a window by the wall, and escaped his hands. +\c 12 +\p +\v 1 It is doubtless not profitable for me to boast, but I will come to visions and revelations of the Lord. +\v 2 I know a man in Christ who was caught up into the third heaven fourteen years ago—whether in the body, I don’t know, or whether out of the body, I don’t know; God knows. +\v 3 I know such a man (whether in the body, or outside of the body, I don’t know; God knows), +\v 4 how he was caught up into Paradise and heard unspeakable words, which it is not lawful for a man to utter. +\v 5 On behalf of such a one I will boast, but on my own behalf I will not boast, except in my weaknesses. +\v 6 For if I would desire to boast, I will not be foolish; for I will speak the truth. But I refrain, so that no man may think more of me than that which he sees in me or hears from me. +\v 7 By reason of the exceeding greatness of the revelations, that I should not be exalted excessively, a thorn in the flesh was given to me: a messenger of Satan to torment me, that I should not be exalted excessively. +\v 8 Concerning this thing, I begged the Lord three times that it might depart from me. +\v 9 He has said to me, \wj “My grace is sufficient for you, for my power is made perfect in weakness.”\wj* Most gladly therefore I will rather glory in my weaknesses, that the power of Christ may rest on me. +\p +\v 10 Therefore I take pleasure in weaknesses, in injuries, in necessities, in persecutions, and in distresses, for Christ’s sake. For when I am weak, then am I strong. +\v 11 I have become foolish in boasting. You compelled me, for I ought to have been commended by you, for I am in no way inferior to the very best apostles, though I am nothing. +\v 12 Truly the signs of an apostle were worked among you in all perseverance, in signs and wonders and mighty works. +\v 13 For what is there in which you were made inferior to the rest of the assemblies, unless it is that I myself was not a burden to you? Forgive me this wrong! +\p +\v 14 Behold, this is the third time I am ready to come to you, and I will not be a burden to you; for I seek not your possessions, but you. For the children ought not to save up for the parents, but the parents for the children. +\v 15 I will most gladly spend and be spent for your souls. If I love you more abundantly, am I loved the less? +\v 16 Even so, I myself didn’t burden you. But you might say that being crafty, I caught you with deception. +\v 17 Did I take advantage of you by anyone of those whom I have sent to you? +\v 18 I exhorted Titus, and I sent the brother with him. Did Titus take any advantage of you? Didn’t we walk in the same spirit? Didn’t we walk in the same steps? +\p +\v 19 Again, do you think that we are excusing ourselves to you? In the sight of God we speak in Christ. But all things, beloved, are for your edifying. +\v 20 For I am afraid that perhaps when I come, I might find you not the way I want to, and that I might be found by you as you don’t desire, that perhaps there would be strife, jealousy, outbursts of anger, factions, slander, whisperings, proud thoughts, or riots, +\v 21 that again when I come my God would humble me before you, and I would mourn for many of those who have sinned before now, and not repented of the uncleanness, sexual immorality, and lustfulness which they committed. +\c 13 +\p +\v 1 This is the third time I am coming to you. “At the mouth of two or three witnesses shall every word be established.”\x + \xo 13:1 \xt Deuteronomy 19:15\x* +\v 2 I have warned previously, and I warn again, as when I was present the second time, so now, being absent, I write to those who have sinned before now and to all the rest that if I come again, I will not spare, +\v 3 seeing that you seek a proof of Christ who speaks in me who is not weak, but is powerful in you. +\v 4 For he was crucified through weakness, yet he lives through the power of God. For we also are weak in him, but we will live with him through the power of God toward you. +\p +\v 5 Examine your own selves, whether you are in the faith. Test your own selves. Or don’t you know about your own selves, that Jesus Christ is in you?—unless indeed you are disqualified. +\v 6 But I hope that you will know that we aren’t disqualified. +\p +\v 7 Now I pray to God that you do no evil; not that we may appear approved, but that you may do that which is honorable, though we may seem to have failed. +\v 8 For we can do nothing against the truth, but for the truth. +\v 9 For we rejoice when we are weak and you are strong. We also pray for this: your becoming perfect. +\v 10 For this cause I write these things while absent, that I may not deal sharply when present, according to the authority which the Lord gave me for building up and not for tearing down. +\p +\v 11 Finally, brothers, rejoice! Be perfected. Be comforted. Be of the same mind. Live in peace, and the God of love and peace will be with you. +\v 12 Greet one another with a holy kiss. +\p +\v 13 All the saints greet you. +\p +\v 14 The grace of the Lord Jesus Christ, God’s love, and the fellowship of the Holy Spirit be with you all. Amen. diff --git a/c-sharp/assets/WEB/49GALengWEBUS.SFM b/c-sharp/assets/WEB/49GALengWEBUS.SFM new file mode 100644 index 0000000000..0887b9a3d2 --- /dev/null +++ b/c-sharp/assets/WEB/49GALengWEBUS.SFM @@ -0,0 +1,201 @@ +\id GAL 48-GAL-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Galatians +\toc1 Paul’s Letter to the Galatians +\toc2 Galatians +\toc3 Galatians +\mt1 Paul’s Letter to the Galatians +\c 1 +\p +\v 1 Paul, an apostle—not from men, nor through man, but through Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* and God the Father, who raised him from the dead— +\v 2 and all the brothers\f + \fr 1:2 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* who are with me, to the assemblies of Galatia: +\v 3 Grace to you and peace from God the Father and our Lord Jesus Christ, +\v 4 who gave himself for our sins, that he might deliver us out of this present evil age, according to the will of our God and Father— +\v 5 to whom be the glory forever and ever. Amen. +\p +\v 6 I marvel that you are so quickly deserting him who called you in the grace of Christ to a different “good news”, +\v 7 but there isn’t another “good news.” Only there are some who trouble you and want to pervert the Good News of Christ. +\v 8 But even though we, or an angel from heaven, should preach to you any “good news” other than that which we preached to you, let him be cursed. +\v 9 As we have said before, so I now say again: if any man preaches to you any “good news” other than that which you received, let him be cursed. +\p +\v 10 For am I now seeking the favor of men, or of God? Or am I striving to please men? For if I were still pleasing men, I wouldn’t be a servant of Christ. +\p +\v 11 But I make known to you, brothers, concerning the Good News which was preached by me, that it is not according to man. +\v 12 For I didn’t receive it from man, nor was I taught it, but it came to me through revelation of Jesus Christ. +\v 13 For you have heard of my way of living in time past in the Jews’ religion, how that beyond measure I persecuted the assembly of God and ravaged it. +\v 14 I advanced in the Jews’ religion beyond many of my own age among my countrymen, being more exceedingly zealous for the traditions of my fathers. +\v 15 But when it was the good pleasure of God, who separated me from my mother’s womb and called me through his grace, +\v 16 to reveal his Son in me, that I might preach him among the Gentiles, I didn’t immediately confer with flesh and blood, +\v 17 nor did I go up to Jerusalem to those who were apostles before me, but I went away into Arabia. Then I returned to Damascus. +\p +\v 18 Then after three years I went up to Jerusalem to visit Peter, and stayed with him fifteen days. +\v 19 But of the other apostles I saw no one except James, the Lord’s brother. +\v 20 Now about the things which I write to you, behold,\f + \fr 1:20 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* before God, I’m not lying. +\v 21 Then I came to the regions of Syria and Cilicia. +\v 22 I was still unknown by face to the assemblies of Judea which were in Christ, +\v 23 but they only heard, “He who once persecuted us now preaches the faith that he once tried to destroy.” +\v 24 So they glorified God in me. +\c 2 +\p +\v 1 Then after a period of fourteen years I went up again to Jerusalem with Barnabas, taking Titus also with me. +\v 2 I went up by revelation, and I laid before them the Good News which I preach among the Gentiles, but privately before those who were respected, for fear that I might be running, or had run, in vain. +\v 3 But not even Titus, who was with me, being a Greek, was compelled to be circumcised. +\v 4 This was because of the false brothers secretly brought in, who stole in to spy out our liberty which we have in Christ Jesus, that they might bring us into bondage, +\v 5 to whom we gave no place in the way of subjection, not for an hour, that the truth of the Good News might continue with you. +\v 6 But from those who were reputed to be important—whatever they were, it makes no difference to me; God doesn’t show partiality to man—they, I say, who were respected imparted nothing to me, +\v 7 but to the contrary, when they saw that I had been entrusted with the Good News for the uncircumcised, even as Peter with the Good News for the circumcised— +\v 8 for he who worked through Peter in the apostleship with the circumcised also worked through me with the Gentiles— +\v 9 and when they perceived the grace that was given to me, James and Cephas and John, those who were reputed to be pillars, gave to Barnabas and me the right hand of fellowship, that we should go to the Gentiles, and they to the circumcision. +\v 10 They only asked us to remember the poor—which very thing I was also zealous to do. +\p +\v 11 But when Peter came to Antioch, I resisted him to his face, because he stood condemned. +\v 12 For before some people came from James, he ate with the Gentiles. But when they came, he drew back and separated himself, fearing those who were of the circumcision. +\v 13 And the rest of the Jews joined him in his hypocrisy, so that even Barnabas was carried away with their hypocrisy. +\v 14 But when I saw that they didn’t walk uprightly according to the truth of the Good News, I said to Peter before them all, “If you, being a Jew, live as the Gentiles do, and not as the Jews do, why do you compel the Gentiles to live as the Jews do? +\p +\v 15 “We, being Jews by nature and not Gentile sinners, +\v 16 yet knowing that a man is not justified by the works of the law but through faith in Jesus Christ, even we believed in Christ Jesus, that we might be justified by faith in Christ and not by the works of the law, because no flesh will be justified by the works of the law. +\v 17 But if while we sought to be justified in Christ, we ourselves also were found sinners, is Christ a servant of sin? Certainly not! +\v 18 For if I build up again those things which I destroyed, I prove myself a law-breaker. +\v 19 For I through the law died to the law, that I might live to God. +\v 20 I have been crucified with Christ, and it is no longer I who live, but Christ lives in me. That life which I now live in the flesh, I live by faith in the Son of God, who loved me and gave himself up for me. +\v 21 I don’t reject the grace of God. For if righteousness is through the law, then Christ died for nothing!” +\c 3 +\p +\v 1 Foolish Galatians, who has bewitched you not to obey the truth, before whose eyes Jesus Christ was openly portrayed among you as crucified? +\v 2 I just want to learn this from you: Did you receive the Spirit by the works of the law, or by hearing of faith? +\v 3 Are you so foolish? Having begun in the Spirit, are you now completed in the flesh? +\v 4 Did you suffer so many things in vain, if it is indeed in vain? +\v 5 He therefore who supplies the Spirit to you and does miracles among you, does he do it by the works of the law, or by hearing of faith? +\v 6 Even so, Abraham “believed God, and it was counted to him for righteousness.”\x + \xo 3:6 \xt Genesis 15:6\x* +\v 7 Know therefore that those who are of faith are children of Abraham. +\v 8 The Scripture, foreseeing that God would justify the Gentiles by faith, preached the Good News beforehand to Abraham, saying, “In you all the nations will be blessed.”\x + \xo 3:8 \xt Genesis 12:3; 18:18; 22:18\x* +\v 9 So then, those who are of faith are blessed with the faithful Abraham. +\p +\v 10 For as many as are of the works of the law are under a curse. For it is written, “Cursed is everyone who doesn’t continue in all things that are written in the book of the law, to do them.”\x + \xo 3:10 \xt Deuteronomy 27:26\x* +\v 11 Now that no man is justified by the law before God is evident, for, “The righteous will live by faith.”\x + \xo 3:11 \xt Habakkuk 2:4\x* +\v 12 The law is not of faith, but, “The man who does them will live by them.”\x + \xo 3:12 \xt Leviticus 18:5\x* +\p +\v 13 Christ redeemed us from the curse of the law, having become a curse for us. For it is written, “Cursed is everyone who hangs on a tree,”\x + \xo 3:13 \xt Deuteronomy 21:23\x* +\v 14 that the blessing of Abraham might come on the Gentiles through Christ Jesus, that we might receive the promise of the Spirit through faith. +\p +\v 15 Brothers, speaking of human terms, though it is only a man’s covenant, yet when it has been confirmed, no one makes it void or adds to it. +\v 16 Now the promises were spoken to Abraham and to his offspring.\f + \fr 3:16 \ft or, seed\f* He doesn’t say, “To descendants\f + \fr 3:16 \ft or, seeds\f*”, as of many, but as of one, “To your offspring”,\x + \xo 3:16 \xt Genesis 12:7; 13:15; 24:7\x* which is Christ. +\v 17 Now I say this: A covenant confirmed beforehand by God in Christ, the law, which came four hundred thirty years after, does not annul, so as to make the promise of no effect. +\v 18 For if the inheritance is of the law, it is no more of promise; but God has granted it to Abraham by promise. +\p +\v 19 Then why is there the law? It was added because of transgressions, until the offspring should come to whom the promise has been made. It was ordained through angels by the hand of a mediator. +\v 20 Now a mediator is not between one, but God is one. +\p +\v 21 Is the law then against the promises of God? Certainly not! For if there had been a law given which could make alive, most certainly righteousness would have been of the law. +\v 22 But the Scripture imprisoned all things under sin, that the promise by faith in Jesus Christ might be given to those who believe. +\p +\v 23 But before faith came, we were kept in custody under the law, confined for the faith which should afterwards be revealed. +\v 24 So that the law has become our tutor to bring us to Christ, that we might be justified by faith. +\v 25 But now that faith has come, we are no longer under a tutor. +\v 26 For you are all children of God, through faith in Christ Jesus. +\v 27 For as many of you as were baptized into Christ have put on Christ. +\v 28 There is neither Jew nor Greek, there is neither slave nor free man, there is neither male nor female; for you are all one in Christ Jesus. +\v 29 If you are Christ’s, then you are Abraham’s offspring and heirs according to promise. +\c 4 +\p +\v 1 But I say that so long as the heir is a child, he is no different from a bondservant, though he is lord of all, +\v 2 but is under guardians and stewards until the day appointed by the father. +\v 3 So we also, when we were children, were held in bondage under the elemental principles of the world. +\v 4 But when the fullness of the time came, God sent out his Son, born to a woman, born under the law, +\v 5 that he might redeem those who were under the law, that we might receive the adoption as children. +\v 6 And because you are children, God sent out the Spirit of his Son into your hearts, crying, “Abba,\f + \fr 4:6 \ft Abba is a Greek spelling for the Aramaic word for “Father” or “Daddy” used in a familiar, respectful, and loving way. \f* Father!” +\v 7 So you are no longer a bondservant, but a son; and if a son, then an heir of God through Christ. +\p +\v 8 However at that time, not knowing God, you were in bondage to those who by nature are not gods. +\v 9 But now that you have come to know God, or rather to be known by God, why do you turn back again to the weak and miserable elemental principles, to which you desire to be in bondage all over again? +\v 10 You observe days, months, seasons, and years. +\v 11 I am afraid for you, that I might have wasted my labor for you. +\p +\v 12 I beg you, brothers, become as I am, for I also have become as you are. You did me no wrong, +\v 13 but you know that because of weakness in the flesh I preached the Good News to you the first time. +\v 14 That which was a temptation to you in my flesh, you didn’t despise nor reject; but you received me as an angel of God, even as Christ Jesus. +\p +\v 15 What was the blessing you enjoyed? For I testify to you that, if possible, you would have plucked out your eyes and given them to me. +\v 16 So then, have I become your enemy by telling you the truth? +\v 17 They zealously seek you in no good way. No, they desire to alienate you, that you may seek them. +\v 18 But it is always good to be zealous in a good cause, and not only when I am present with you. +\p +\v 19 My little children, of whom I am again in travail until Christ is formed in you— +\v 20 but I could wish to be present with you now, and to change my tone, for I am perplexed about you. +\p +\v 21 Tell me, you that desire to be under the law, don’t you listen to the law? +\v 22 For it is written that Abraham had two sons, one by the servant, and one by the free woman. +\v 23 However, the son by the servant was born according to the flesh, but the son by the free woman was born through promise. +\v 24 These things contain an allegory, for these are two covenants. One is from Mount Sinai, bearing children to bondage, which is Hagar. +\v 25 For this Hagar is Mount Sinai in Arabia, and answers to the Jerusalem that exists now, for she is in bondage with her children. +\v 26 But the Jerusalem that is above is free, which is the mother of us all. +\v 27 For it is written, +\q1 “Rejoice, you barren who don’t bear. +\q2 Break out and shout, you who don’t travail. +\q2 For the desolate women have more children than her who has a husband.” \x + \xo 4:27 \xt Isaiah 54:1\x* +\p +\v 28 Now we, brothers, as Isaac was, are children of promise. +\v 29 But as then, he who was born according to the flesh persecuted him who was born according to the Spirit, so also it is now. +\v 30 However, what does the Scripture say? “Throw out the servant and her son, for the son of the servant will not inherit with the son of the free woman.”\x + \xo 4:30 \xt Genesis 21:10\x* +\v 31 So then, brothers, we are not children of a servant, but of the free woman. +\c 5 +\p +\v 1 Stand firm therefore in the liberty by which Christ has made us free, and don’t be entangled again with a yoke of bondage. +\p +\v 2 Behold, I, Paul, tell you that if you receive circumcision, Christ will profit you nothing. +\v 3 Yes, I testify again to every man who receives circumcision that he is a debtor to do the whole law. +\v 4 You are alienated from Christ, you who desire to be justified by the law. You have fallen away from grace. +\v 5 For we through the Spirit, by faith wait for the hope of righteousness. +\v 6 For in Christ Jesus neither circumcision nor uncircumcision amounts to anything, but faith working through love. +\p +\v 7 You were running well! Who interfered with you that you should not obey the truth? +\v 8 This persuasion is not from him who calls you. +\v 9 A little yeast grows through the whole lump. +\v 10 I have confidence toward you in the Lord that you will think no other way. But he who troubles you will bear his judgment, whoever he is. +\p +\v 11 But I, brothers, if I still preach circumcision, why am I still persecuted? Then the stumbling block of the cross has been removed. +\v 12 I wish that those who disturb you would cut themselves off. +\p +\v 13 For you, brothers, were called for freedom. Only don’t use your freedom as an opportunity for the flesh, but through love be servants to one another. +\v 14 For the whole law is fulfilled in one word, in this: “You shall love your neighbor as yourself.”\x + \xo 5:14 \xt Leviticus 19:18\x* +\v 15 But if you bite and devour one another, be careful that you don’t consume one another. +\p +\v 16 But I say, walk by the Spirit, and you won’t fulfill the lust of the flesh. +\v 17 For the flesh lusts against the Spirit, and the Spirit against the flesh; and these are contrary to one another, that you may not do the things that you desire. +\v 18 But if you are led by the Spirit, you are not under the law. +\v 19 Now the deeds of the flesh are obvious, which are: adultery, sexual immorality, uncleanness, lustfulness, +\v 20 idolatry, sorcery, hatred, strife, jealousies, outbursts of anger, rivalries, divisions, heresies, +\v 21 envy, murders, drunkenness, orgies, and things like these; of which I forewarn you, even as I also forewarned you, that those who practice such things will not inherit God’s Kingdom. +\p +\v 22 But the fruit of the Spirit is love, joy, peace, patience, kindness, goodness, faith,\f + \fr 5:22 \ft or, faithfulness\f* +\v 23 gentleness, and self-control. Against such things there is no law. +\v 24 Those who belong to Christ have crucified the flesh with its passions and lusts. +\p +\v 25 If we live by the Spirit, let’s also walk by the Spirit. +\v 26 Let’s not become conceited, provoking one another, and envying one another. +\c 6 +\p +\v 1 Brothers, even if a man is caught in some fault, you who are spiritual must restore such a one in a spirit of gentleness, looking to yourself so that you also aren’t tempted. +\v 2 Bear one another’s burdens, and so fulfill the law of Christ. +\v 3 For if a man thinks himself to be something when he is nothing, he deceives himself. +\v 4 But let each man examine his own work, and then he will have reason to boast in himself, and not in someone else. +\v 5 For each man will bear his own burden. +\p +\v 6 But let him who is taught in the word share all good things with him who teaches. +\p +\v 7 Don’t be deceived. God is not mocked, for whatever a man sows, that he will also reap. +\v 8 For he who sows to his own flesh will from the flesh reap corruption. But he who sows to the Spirit will from the Spirit reap eternal life. +\v 9 Let’s not be weary in doing good, for we will reap in due season if we don’t give up. +\v 10 So then, as we have opportunity, let’s do what is good toward all men, and especially toward those who are of the household of the faith. +\p +\v 11 See with what large letters I write to you with my own hand. +\v 12 As many as desire to make a good impression in the flesh compel you to be circumcised, just so they may not be persecuted for the cross of Christ. +\v 13 For even they who receive circumcision don’t keep the law themselves, but they desire to have you circumcised, so that they may boast in your flesh. +\v 14 But far be it from me to boast except in the cross of our Lord Jesus Christ, through which the world has been crucified to me, and I to the world. +\v 15 For in Christ Jesus neither is circumcision anything, nor uncircumcision, but a new creation. +\v 16 As many as walk by this rule, peace and mercy be on them, and on God’s Israel. +\p +\v 17 From now on, let no one cause me any trouble, for I bear the marks of the Lord Jesus branded on my body. +\p +\v 18 The grace of our Lord Jesus Christ be with your spirit, brothers. Amen. diff --git a/c-sharp/assets/WEB/50EPHengWEBUS.SFM b/c-sharp/assets/WEB/50EPHengWEBUS.SFM new file mode 100644 index 0000000000..1d51e0f971 --- /dev/null +++ b/c-sharp/assets/WEB/50EPHengWEBUS.SFM @@ -0,0 +1,198 @@ +\id EPH 49-EPH-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Ephesians +\toc1 Paul’s Letter to the Ephesians +\toc2 Ephesians +\toc3 Ephesians +\mt1 Paul’s Letter to the Ephesians +\c 1 +\p +\v 1 Paul, an apostle of Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* Jesus through the will of God, to the saints who are at Ephesus, and the faithful in Christ Jesus: +\v 2 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 3 Blessed be the God and Father of our Lord Jesus Christ, who has blessed us with every spiritual blessing in the heavenly places in Christ, +\v 4 even as he chose us in him before the foundation of the world, that we would be holy and without defect before him in love, +\v 5 having predestined us for adoption as children through Jesus Christ to himself, according to the good pleasure of his desire, +\v 6 to the praise of the glory of his grace, by which he freely gave us favor in the Beloved. +\v 7 In him we have our redemption through his blood, the forgiveness of our trespasses, according to the riches of his grace +\v 8 which he made to abound toward us in all wisdom and prudence, +\v 9 making known to us the mystery of his will, according to his good pleasure which he purposed in him +\v 10 to an administration of the fullness of the times, to sum up all things in Christ, the things in the heavens and the things on the earth, in him. +\v 11 We were also assigned an inheritance in him, having been foreordained according to the purpose of him who does all things after the counsel of his will, +\v 12 to the end that we should be to the praise of his glory, we who had before hoped in Christ. +\v 13 In him you also, having heard the word of the truth, the Good News of your salvation—in whom, having also believed, you were sealed with the promised Holy Spirit, +\v 14 who is a pledge of our inheritance, to the redemption of God’s own possession, to the praise of his glory. +\p +\v 15 For this cause I also, having heard of the faith in the Lord Jesus which is among you and the love which you have toward all the saints, +\v 16 don’t cease to give thanks for you, making mention of you in my prayers, +\v 17 that the God of our Lord Jesus Christ, the Father of glory, may give to you a spirit of wisdom and revelation in the knowledge of him, +\v 18 having the eyes of your hearts\f + \fr 1:18 \ft TR reads “understanding” instead of “hearts”\f* enlightened, that you may know what is the hope of his calling, and what are the riches of the glory of his inheritance in the saints, +\v 19 and what is the exceeding greatness of his power toward us who believe, according to that working of the strength of his might +\v 20 which he worked in Christ when he raised him from the dead and made him to sit at his right hand in the heavenly places, +\v 21 far above all rule, authority, power, dominion, and every name that is named, not only in this age, but also in that which is to come. +\v 22 He put all things in subjection under his feet, and gave him to be head over all things for the assembly, +\v 23 which is his body, the fullness of him who fills all in all. +\c 2 +\p +\v 1 You were made alive when you were dead in transgressions and sins, +\v 2 in which you once walked according to the course of this world, according to the prince of the power of the air, the spirit who now works in the children of disobedience. +\v 3 We also all once lived among them in the lusts of our flesh, doing the desires of the flesh and of the mind, and were by nature children of wrath, even as the rest. +\v 4 But God, being rich in mercy, for his great love with which he loved us, +\v 5 even when we were dead through our trespasses, made us alive together with Christ—by grace you have been saved— +\v 6 and raised us up with him, and made us to sit with him in the heavenly places in Christ Jesus, +\v 7 that in the ages to come he might show the exceeding riches of his grace in kindness toward us in Christ Jesus; +\v 8 for by grace you have been saved through faith, and that not of yourselves; it is the gift of God, +\v 9 not of works, that no one would boast. +\v 10 For we are his workmanship, created in Christ Jesus for good works, which God prepared before that we would walk in them. +\p +\v 11 Therefore remember that once you, the Gentiles in the flesh, who are called “uncircumcision” by that which is called “circumcision” (in the flesh, made by hands), +\v 12 that you were at that time separate from Christ, alienated from the commonwealth of Israel, and strangers from the covenants of the promise, having no hope and without God in the world. +\v 13 But now in Christ Jesus you who once were far off are made near in the blood of Christ. +\v 14 For he is our peace, who made both one, and broke down the middle wall of separation, +\v 15 having abolished in his flesh the hostility, the law of commandments contained in ordinances, that he might create in himself one new man of the two, making peace, +\v 16 and might reconcile them both in one body to God through the cross, having killed the hostility through it. +\v 17 He came and preached peace to you who were far off and to those who were near. +\v 18 For through him we both have our access in one Spirit to the Father. +\v 19 So then you are no longer strangers and foreigners, but you are fellow citizens with the saints and of the household of God, +\v 20 being built on the foundation of the apostles and prophets, Christ Jesus himself being the chief cornerstone; +\v 21 in whom the whole building, fitted together, grows into a holy temple in the Lord; +\v 22 in whom you also are built together for a habitation of God in the Spirit. +\c 3 +\p +\v 1 For this cause I, Paul, am the prisoner of Christ Jesus on behalf of you Gentiles, +\v 2 if it is so that you have heard of the administration of that grace of God which was given me toward you, +\v 3 how that by revelation the mystery was made known to me, as I wrote before in few words, +\v 4 by which, when you read, you can perceive my understanding in the mystery of Christ, +\v 5 which in other generations was not made known to the children of men, as it has now been revealed to his holy apostles and prophets in the Spirit, +\v 6 that the Gentiles are fellow heirs and fellow members of the body, and fellow partakers of his promise in Christ Jesus through the Good News, +\v 7 of which I was made a servant according to the gift of that grace of God which was given me according to the working of his power. +\v 8 To me, the very least of all saints, was this grace given, to preach to the Gentiles the unsearchable riches of Christ, +\v 9 and to make all men see what is the administration\f + \fr 3:9 \ft TR reads “fellowship” instead of “administration”\f* of the mystery which for ages has been hidden in God, who created all things through Jesus Christ, +\v 10 to the intent that now through the assembly the manifold wisdom of God might be made known to the principalities and the powers in the heavenly places, +\v 11 according to the eternal purpose which he accomplished in Christ Jesus our Lord. +\v 12 In him we have boldness and access in confidence through our faith in him. +\v 13 Therefore I ask that you may not lose heart at my troubles for you, which are your glory. +\p +\v 14 For this cause, I bow my knees to the Father of our Lord Jesus Christ, +\v 15 from whom every family in heaven and on earth is named, +\v 16 that he would grant you, according to the riches of his glory, that you may be strengthened with power through his Spirit in the inner person, +\v 17 that Christ may dwell in your hearts through faith, to the end that you, being rooted and grounded in love, +\v 18 may be strengthened to comprehend with all the saints what is the width and length and height and depth, +\v 19 and to know Christ’s love which surpasses knowledge, that you may be filled with all the fullness of God. +\p +\v 20 Now to him who is able to do exceedingly abundantly above all that we ask or think, according to the power that works in us, +\v 21 to him be the glory in the assembly and in Christ Jesus to all generations, forever and ever. Amen. +\c 4 +\p +\v 1 I therefore, the prisoner in the Lord, beg you to walk worthily of the calling with which you were called, +\v 2 with all lowliness and humility, with patience, bearing with one another in love, +\v 3 being eager to keep the unity of the Spirit in the bond of peace. +\v 4 There is one body and one Spirit, even as you also were called in one hope of your calling, +\v 5 one Lord, one faith, one baptism, +\v 6 one God and Father of all, who is over all and through all and in us all. +\v 7 But to each one of us, the grace was given according to the measure of the gift of Christ. +\v 8 Therefore he says, +\q1 “When he ascended on high, +\q2 he led captivity captive, +\q2 and gave gifts to people.”\x + \xo 4:8 \xt Psalm 68:18\x* +\m +\v 9 Now this, “He ascended”, what is it but that he also first descended into the lower parts of the earth? +\v 10 He who descended is the one who also ascended far above all the heavens, that he might fill all things. +\p +\v 11 He gave some to be apostles; and some, prophets; and some, evangelists; and some, shepherds\f + \fr 4:11 \ft or, pastors\f* and teachers; +\v 12 for the perfecting of the saints, to the work of serving, to the building up of the body of Christ, +\v 13 until we all attain to the unity of the faith and of the knowledge of the Son of God, to a full grown man, to the measure of the stature of the fullness of Christ, +\v 14 that we may no longer be children, tossed back and forth and carried about with every wind of doctrine, by the trickery of men, in craftiness, after the wiles of error; +\v 15 but speaking truth in love, we may grow up in all things into him who is the head, Christ, +\v 16 from whom all the body, being fitted and knit together through that which every joint supplies, according to the working in measure of each individual part, makes the body increase to the building up of itself in love. +\p +\v 17 This I say therefore, and testify in the Lord, that you no longer walk as the rest of the Gentiles also walk, in the futility of their mind, +\v 18 being darkened in their understanding, alienated from the life of God because of the ignorance that is in them, because of the hardening of their hearts. +\v 19 They, having become callous, gave themselves up to lust, to work all uncleanness with greediness. +\v 20 But you didn’t learn Christ that way, +\v 21 if indeed you heard him and were taught in him, even as truth is in Jesus: +\v 22 that you put away, as concerning your former way of life, the old man that grows corrupt after the lusts of deceit, +\v 23 and that you be renewed in the spirit of your mind, +\v 24 and put on the new man, who in the likeness of God has been created in righteousness and holiness of truth. +\p +\v 25 Therefore, putting away falsehood, speak truth each one with his neighbor, for we are members of one another. +\v 26 “Be angry, and don’t sin.”\x + \xo 4:26 \xt Psalm 4:4\x* Don’t let the sun go down on your wrath, +\v 27 and don’t give place\f + \fr 4:27 \ft or, opportunity\f* to the devil. +\v 28 Let him who stole steal no more; but rather let him labor, producing with his hands something that is good, that he may have something to give to him who has need. +\v 29 Let no corrupt speech proceed out of your mouth, but only what is good for building others up as the need may be, that it may give grace to those who hear. +\v 30 Don’t grieve the Holy Spirit of God, in whom you were sealed for the day of redemption. +\v 31 Let all bitterness, wrath, anger, outcry, and slander be put away from you, with all malice. +\v 32 And be kind to one another, tender hearted, forgiving each other, just as God also in Christ forgave you. +\c 5 +\p +\v 1 Be therefore imitators of God, as beloved children. +\v 2 Walk in love, even as Christ also loved us and gave himself up for us, an offering and a sacrifice to God for a sweet-smelling fragrance. +\p +\v 3 But sexual immorality, and all uncleanness or covetousness, let it not even be mentioned among you, as becomes saints; +\v 4 nor filthiness, nor foolish talking, nor jesting, which are not appropriate, but rather giving of thanks. +\p +\v 5 Know this for sure, that no sexually immoral person, nor unclean person, nor covetous man (who is an idolater), has any inheritance in the Kingdom of Christ and God. +\p +\v 6 Let no one deceive you with empty words, for because of these things the wrath of God comes on the children of disobedience. +\v 7 Therefore don’t be partakers with them. +\v 8 For you were once darkness, but are now light in the Lord. Walk as children of light, +\v 9 for the fruit of the Spirit is in all goodness and righteousness and truth, +\v 10 proving what is well pleasing to the Lord. +\v 11 Have no fellowship with the unfruitful deeds of darkness, but rather even reprove them. +\v 12 For it is a shame even to speak of the things which are done by them in secret. +\v 13 But all things, when they are reproved, are revealed by the light, for everything that reveals is light. +\v 14 Therefore he says, “Awake, you who sleep, and arise from the dead, and Christ will shine on you.” +\p +\v 15 Therefore watch carefully how you walk, not as unwise, but as wise, +\v 16 redeeming the time, because the days are evil. +\v 17 Therefore, don’t be foolish, but understand what the will of the Lord is. +\v 18 Don’t be drunken with wine, in which is dissipation, but be filled with the Spirit, +\v 19 speaking to one another in psalms, hymns, and spiritual songs; singing and making melody in your heart to the Lord; +\v 20 giving thanks always concerning all things in the name of our Lord Jesus Christ to God, even the Father; +\v 21 subjecting yourselves to one another in the fear of Christ. +\p +\v 22 Wives, be subject to your own husbands, as to the Lord. +\v 23 For the husband is the head of the wife, as Christ also is the head of the assembly, being himself the savior of the body. +\v 24 But as the assembly is subject to Christ, so let the wives also be to their own husbands in everything. +\p +\v 25 Husbands, love your wives, even as Christ also loved the assembly and gave himself up for her, +\v 26 that he might sanctify her, having cleansed her by the washing of water with the word, +\v 27 that he might present the assembly to himself gloriously, not having spot or wrinkle or any such thing, but that she should be holy and without defect. +\v 28 Even so husbands also ought to love their own wives as their own bodies. He who loves his own wife loves himself. +\v 29 For no man ever hated his own flesh, but nourishes and cherishes it, even as the Lord also does the assembly, +\v 30 because we are members of his body, of his flesh and bones. +\v 31 “For this cause a man will leave his father and mother and will be joined to his wife. Then the two will become one flesh.”\x + \xo 5:31 \xt Genesis 2:24\x* +\v 32 This mystery is great, but I speak concerning Christ and the assembly. +\v 33 Nevertheless each of you must also love his own wife even as himself; and let the wife see that she respects her husband. +\c 6 +\p +\v 1 Children, obey your parents in the Lord, for this is right. +\v 2 “Honor your father and mother,” which is the first commandment with a promise: +\v 3 “that it may be well with you, and you may live long on the earth.” \x + \xo 6:3 \xt Deuteronomy 5:16\x* +\p +\v 4 You fathers, don’t provoke your children to wrath, but nurture them in the discipline and instruction of the Lord. +\p +\v 5 Servants, be obedient to those who according to the flesh are your masters, with fear and trembling, in singleness of your heart, as to Christ, +\v 6 not in the way of service only when eyes are on you, as men pleasers, but as servants of Christ, doing the will of God from the heart, +\v 7 with good will doing service as to the Lord and not to men, +\v 8 knowing that whatever good thing each one does, he will receive the same good again from the Lord, whether he is bound or free. +\p +\v 9 You masters, do the same things to them, and give up threatening, knowing that he who is both their Master and yours is in heaven, and there is no partiality with him. +\p +\v 10 Finally, be strong in the Lord and in the strength of his might. +\v 11 Put on the whole armor of God, that you may be able to stand against the wiles of the devil. +\v 12 For our wrestling is not against flesh and blood, but against the principalities, against the powers, against the world’s rulers of the darkness of this age, and against the spiritual forces of wickedness in the heavenly places. +\v 13 Therefore put on the whole armor of God, that you may be able to withstand in the evil day, and having done all, to stand. +\v 14 Stand therefore, having the utility belt of truth buckled around your waist, and having put on the breastplate of righteousness, +\v 15 and having fitted your feet with the preparation of the Good News of peace, +\v 16 above all, taking up the shield of faith, with which you will be able to quench all the fiery darts of the evil one. +\v 17 And take the helmet of salvation, and the sword of the Spirit, which is the word\f + \fr 6:17 \ft from the Greek “ῥῆμα” (rhema), which means “spoken word”\f* of God; +\v 18 with all prayer and requests, praying at all times in the Spirit, and being watchful to this end in all perseverance and requests for all the saints. +\v 19 Pray for me, that utterance may be given to me in opening my mouth, to make known with boldness the mystery of the Good News, +\v 20 for which I am an ambassador in chains; that in it I may speak boldly, as I ought to speak. +\p +\v 21 But that you also may know my affairs, how I am doing, Tychicus, the beloved brother and faithful servant in the Lord, will make known to you all things. +\v 22 I have sent him to you for this very purpose, that you may know our state and that he may comfort your hearts. +\p +\v 23 Peace be to the brothers, and love with faith, from God the Father and the Lord Jesus Christ. +\v 24 Grace be with all those who love our Lord Jesus Christ with incorruptible love. Amen. diff --git a/c-sharp/assets/WEB/51PHPengWEBUS.SFM b/c-sharp/assets/WEB/51PHPengWEBUS.SFM new file mode 100644 index 0000000000..b20a48c477 --- /dev/null +++ b/c-sharp/assets/WEB/51PHPengWEBUS.SFM @@ -0,0 +1,139 @@ +\id PHP 50-PHP-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Philippians +\toc1 Paul’s Letter to the Philippians +\toc2 Philippians +\toc3 Philippians +\mt1 Paul’s Letter to the Philippians +\c 1 +\p +\v 1 Paul and Timothy, servants of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* to all the saints in Christ Jesus who are at Philippi, with the overseers\f + \fr 1:1 \ft or, superintendents, or bishops\f* and servants:\f + \fr 1:1 \ft Or, deacons\f* +\v 2 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 3 I thank my God whenever I remember you, +\v 4 always in every request of mine on behalf of you all, making my requests with joy, +\v 5 for your partnership\f + \fr 1:5 \ft The word translated “partnership” (κοινωνίᾳ) also means “fellowship” and “sharing”.\f* in furtherance of the Good News from the first day until now; +\v 6 being confident of this very thing, that he who began a good work in you will complete it until the day of Jesus Christ. +\v 7 It is even right for me to think this way on behalf of all of you, because I have you in my heart, because both in my bonds and in the defense and confirmation of the Good News, you all are partakers with me of grace. +\v 8 For God is my witness, how I long after all of you in the tender mercies of Christ Jesus. +\p +\v 9 This I pray, that your love may abound yet more and more in knowledge and all discernment, +\v 10 so that you may approve the things that are excellent, that you may be sincere and without offense to the day of Christ, +\v 11 being filled with the fruits of righteousness which are through Jesus Christ, to the glory and praise of God. +\p +\v 12 Now I desire to have you know, brothers,\f + \fr 1:12 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* that the things which happened to me have turned out rather to the progress of the Good News, +\v 13 so that it became evident to the whole palace\f + \fr 1:13 \ft or, praetorian \f* guard, and to all the rest, that my bonds are in Christ, +\v 14 and that most of the brothers in the Lord, being confident through my bonds, are more abundantly bold to speak the word of God without fear. +\v 15 Some indeed preach Christ even out of envy and strife, and some also out of good will. +\v 16 The former insincerely preach Christ from selfish ambition, thinking that they add affliction to my chains; +\v 17 but the latter out of love, knowing that I am appointed for the defense of the Good News. +\p +\v 18 What does it matter? Only that in every way, whether in pretense or in truth, Christ is proclaimed. I rejoice in this, yes, and will rejoice. +\v 19 For I know that this will turn out to my salvation through your prayers and the supply of the Spirit of Jesus Christ, +\v 20 according to my earnest expectation and hope, that I will in no way be disappointed, but with all boldness, as always, now also Christ will be magnified in my body, whether by life or by death. +\v 21 For to me to live is Christ, and to die is gain. +\v 22 But if I live on in the flesh, this will bring fruit from my work; yet I don’t know what I will choose. +\v 23 But I am hard pressed between the two, having the desire to depart and be with Christ, which is far better. +\v 24 Yet to remain in the flesh is more needful for your sake. +\v 25 Having this confidence, I know that I will remain, yes, and remain with you all for your progress and joy in the faith, +\v 26 that your boasting\f + \fr 1:26 \ft or, rejoicing\f* may abound in Christ Jesus in me through my presence with you again. +\p +\v 27 Only let your way of life be worthy of the Good News of Christ, that whether I come and see you or am absent, I may hear of your state, that you stand firm in one spirit, with one soul striving for the faith of the Good News; +\v 28 and in nothing frightened by the adversaries, which is for them a proof of destruction, but to you of salvation, and that from God. +\v 29 Because it has been granted to you on behalf of Christ, not only to believe in him, but also to suffer on his behalf, +\v 30 having the same conflict which you saw in me and now hear is in me. +\c 2 +\p +\v 1 If therefore there is any exhortation in Christ, if any consolation of love, if any fellowship of the Spirit, if any tender mercies and compassion, +\v 2 make my joy full by being like-minded, having the same love, being of one accord, of one mind; +\v 3 doing nothing through rivalry or through conceit, but in humility, each counting others better than himself; +\v 4 each of you not just looking to his own things, but each of you also to the things of others. +\p +\v 5 Have this in your mind, which was also in Christ Jesus, +\v 6 who, existing in the form of God, didn’t consider equality with God a thing to be grasped, +\v 7 but emptied himself, taking the form of a servant, being made in the likeness of men. +\v 8 And being found in human form, he humbled himself, becoming obedient to the point of death, yes, the death of the cross. +\v 9 Therefore God also highly exalted him, and gave to him the name which is above every name, +\v 10 that at the name of Jesus every knee should bow, of those in heaven, those on earth, and those under the earth, +\v 11 and that every tongue should confess that Jesus Christ is Lord, to the glory of God the Father. +\p +\v 12 So then, my beloved, even as you have always obeyed, not only in my presence, but now much more in my absence, work out your own salvation with fear and trembling. +\v 13 For it is God who works in you both to will and to work for his good pleasure. +\p +\v 14 Do all things without complaining and arguing, +\v 15 that you may become blameless and harmless, children of God without defect in the middle of a crooked and perverse generation, among whom you are seen as lights in the world, +\v 16 holding up the word of life, that I may have something to boast in the day of Christ that I didn’t run in vain nor labor in vain. +\v 17 Yes, and if I am poured out on the sacrifice and service of your faith, I am glad and rejoice with you all. +\v 18 In the same way, you also should be glad and rejoice with me. +\p +\v 19 But I hope in the Lord Jesus to send Timothy to you soon, that I also may be cheered up when I know how you are doing. +\v 20 For I have no one else like-minded, who will truly care about you. +\v 21 For they all seek their own, not the things of Jesus Christ. +\v 22 But you know that he has proved himself. As a child serves a father, so he served with me in furtherance of the Good News. +\v 23 Therefore I hope to send him at once, as soon as I see how it will go with me. +\v 24 But I trust in the Lord that I myself also will come shortly. +\p +\v 25 But I thought it necessary to send to you Epaphroditus, my brother, fellow worker, fellow soldier, and your apostle and servant of my need, +\v 26 since he longed for you all, and was very troubled because you had heard that he was sick. +\v 27 For indeed he was sick nearly to death, but God had mercy on him, and not on him only, but on me also, that I might not have sorrow on sorrow. +\v 28 I have sent him therefore the more diligently, that when you see him again, you may rejoice, and that I may be the less sorrowful. +\v 29 Receive him therefore in the Lord with all joy, and hold such people in honor, +\v 30 because for the work of Christ he came near to death, risking his life to supply that which was lacking in your service toward me. +\c 3 +\p +\v 1 Finally, my brothers, rejoice in the Lord! To write the same things to you, to me indeed is not tiresome, but for you it is safe. +\p +\v 2 Beware of the dogs; beware of the evil workers; beware of the false circumcision. +\v 3 For we are the circumcision, who worship God in the Spirit, and rejoice in Christ Jesus, and have no confidence in the flesh; +\v 4 though I myself might have confidence even in the flesh. If any other man thinks that he has confidence in the flesh, I yet more: +\v 5 circumcised the eighth day, of the stock of Israel, of the tribe of Benjamin, a Hebrew of Hebrews; concerning the law, a Pharisee; +\v 6 concerning zeal, persecuting the assembly; concerning the righteousness which is in the law, found blameless. +\p +\v 7 However, I consider those things that were gain to me as a loss for Christ. +\v 8 Yes most certainly, and I count all things to be a loss for the excellency of the knowledge of Christ Jesus, my Lord, for whom I suffered the loss of all things, and count them nothing but refuse, that I may gain Christ +\v 9 and be found in him, not having a righteousness of my own, that which is of the law, but that which is through faith in Christ, the righteousness which is from God by faith, +\v 10 that I may know him and the power of his resurrection, and the fellowship of his sufferings, becoming conformed to his death, +\v 11 if by any means I may attain to the resurrection from the dead. +\v 12 Not that I have already obtained, or am already made perfect; but I press on, that I may take hold of that for which also I was taken hold of by Christ Jesus. +\p +\v 13 Brothers, I don’t regard myself as yet having taken hold, but one thing I do: forgetting the things which are behind and stretching forward to the things which are before, +\v 14 I press on toward the goal for the prize of the high calling of God in Christ Jesus. +\v 15 Let us therefore, as many as are perfect, think this way. If in anything you think otherwise, God will also reveal that to you. +\v 16 Nevertheless, to the extent that we have already attained, let’s walk by the same rule. Let’s be of the same mind. +\p +\v 17 Brothers, be imitators together of me, and note those who walk this way, even as you have us for an example. +\v 18 For many walk, of whom I told you often, and now tell you even weeping, as the enemies of the cross of Christ, +\v 19 whose end is destruction, whose god is the belly, and whose glory is in their shame, who think about earthly things. +\v 20 For our citizenship is in heaven, from where we also wait for a Savior, the Lord Jesus Christ, +\v 21 who will change the body of our humiliation to be conformed to the body of his glory, according to the working by which he is able even to subject all things to himself. +\c 4 +\p +\v 1 Therefore, my brothers, beloved and longed for, my joy and crown, stand firm in the Lord in this way, my beloved. +\p +\v 2 I exhort Euodia, and I exhort Syntyche, to think the same way in the Lord. +\v 3 Yes, I beg you also, true partner, help these women, for they labored with me in the Good News with Clement also, and the rest of my fellow workers, whose names are in the book of life. +\p +\v 4 Rejoice in the Lord always! Again I will say, “Rejoice!” +\v 5 Let your gentleness be known to all men. The Lord is at hand. +\v 6 In nothing be anxious, but in everything, by prayer and petition with thanksgiving, let your requests be made known to God. +\v 7 And the peace of God, which surpasses all understanding, will guard your hearts and your thoughts in Christ Jesus. +\p +\v 8 Finally, brothers, whatever things are true, whatever things are honorable, whatever things are just, whatever things are pure, whatever things are lovely, whatever things are of good report: if there is any virtue and if there is anything worthy of praise, think about these things. +\v 9 Do the things which you learned, received, heard, and saw in me, and the God of peace will be with you. +\p +\v 10 But I rejoice in the Lord greatly that now at length you have revived your thought for me; in which you did indeed take thought, but you lacked opportunity. +\v 11 Not that I speak because of lack, for I have learned in whatever state I am, to be content in it. +\v 12 I know how to be humbled, and I also know how to abound. In any and all circumstances I have learned the secret both to be filled and to be hungry, both to abound and to be in need. +\v 13 I can do all things through Christ who strengthens me. +\v 14 However you did well that you shared in my affliction. +\v 15 You yourselves also know, you Philippians, that in the beginning of the Good News, when I departed from Macedonia, no assembly shared with me in the matter of giving and receiving but you only. +\v 16 For even in Thessalonica you sent once and again to my need. +\v 17 Not that I seek for the gift, but I seek for the fruit that increases to your account. +\v 18 But I have all things and abound. I am filled, having received from Epaphroditus the things that came from you, a sweet-smelling fragrance, an acceptable and well-pleasing sacrifice to God. +\v 19 My God will supply every need of yours according to his riches in glory in Christ Jesus. +\v 20 Now to our God and Father be the glory forever and ever! Amen. +\p +\v 21 Greet every saint in Christ Jesus. The brothers who are with me greet you. +\v 22 All the saints greet you, especially those who are of Caesar’s household. +\p +\v 23 The grace of the Lord Jesus Christ be with you all. Amen. diff --git a/c-sharp/assets/WEB/52COLengWEBUS.SFM b/c-sharp/assets/WEB/52COLengWEBUS.SFM new file mode 100644 index 0000000000..c91d38f2d7 --- /dev/null +++ b/c-sharp/assets/WEB/52COLengWEBUS.SFM @@ -0,0 +1,134 @@ +\id COL 51-COL-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Colossians +\toc1 Paul’s Letter to the Colossians +\toc2 Colossians +\toc3 Colossians +\mt1 Paul’s Letter to the Colossians +\c 1 +\p +\v 1 Paul, an apostle of Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* Jesus through the will of God, and Timothy our brother, +\v 2 to the saints and faithful brothers\f + \fr 1:2 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* in Christ at Colossae: Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 3 We give thanks to God the Father of our Lord Jesus Christ, praying always for you, +\v 4 having heard of your faith in Christ Jesus and of the love which you have toward all the saints, +\v 5 because of the hope which is laid up for you in the heavens, of which you heard before in the word of the truth of the Good News +\v 6 which has come to you, even as it is in all the world and is bearing fruit and growing, as it does in you also, since the day you heard and knew the grace of God in truth, +\v 7 even as you learned from Epaphras our beloved fellow servant, who is a faithful servant of Christ on your\f + \fr 1:7 \ft NU reads \fqa our\f* behalf, +\v 8 who also declared to us your love in the Spirit. +\p +\v 9 For this cause, we also, since the day we heard this, don’t cease praying and making requests for you, that you may be filled with the knowledge of his will in all spiritual wisdom and understanding, +\v 10 that you may walk worthily of the Lord, to please him in all respects, bearing fruit in every good work and increasing in the knowledge of God, +\v 11 strengthened with all power, according to the might of his glory, for all endurance and perseverance with joy, +\v 12 giving thanks to the Father, who made us fit to be partakers of the inheritance of the saints in light, +\v 13 who delivered us out of the power of darkness, and translated us into the Kingdom of the Son of his love, +\v 14 in whom we have our redemption,\f + \fr 1:14 \ft TR adds “through his blood,” \f* the forgiveness of our sins. +\p +\v 15 He is the image of the invisible God, the firstborn of all creation. +\v 16 For by him all things were created in the heavens and on the earth, visible things and invisible things, whether thrones or dominions or principalities or powers. All things have been created through him and for him. +\v 17 He is before all things, and in him all things are held together. +\v 18 He is the head of the body, the assembly, who is the beginning, the firstborn from the dead, that in all things he might have the preeminence. +\v 19 For all the fullness was pleased to dwell in him, +\v 20 and through him to reconcile all things to himself by him, whether things on the earth or things in the heavens, having made peace through the blood of his cross. +\p +\v 21 You, being in past times alienated and enemies in your mind in your evil deeds, +\v 22 yet now he has reconciled in the body of his flesh through death, to present you holy and without defect and blameless before him, +\v 23 if it is so that you continue in the faith, grounded and steadfast, and not moved away from the hope of the Good News which you heard, which is being proclaimed in all creation under heaven, of which I, Paul, was made a servant. +\p +\v 24 Now I rejoice in my sufferings for your sake, and fill up on my part that which is lacking of the afflictions of Christ in my flesh for his body’s sake, which is the assembly, +\v 25 of which I was made a servant according to the stewardship of God which was given me toward you to fulfill the word of God, +\v 26 the mystery which has been hidden for ages and generations. But now it has been revealed to his saints, +\v 27 to whom God was pleased to make known what are the riches of the glory of this mystery among the Gentiles, which is Christ in you, the hope of glory. +\v 28 We proclaim him, admonishing every man and teaching every man in all wisdom, that we may present every man perfect in Christ Jesus; +\v 29 for which I also labor, striving according to his working, which works in me mightily. +\c 2 +\p +\v 1 For I desire to have you know how greatly I struggle for you and for those at Laodicea, and for as many as have not seen my face in the flesh; +\v 2 that their hearts may be comforted, they being knit together in love, and gaining all riches of the full assurance of understanding, that they may know the mystery of God, both of the Father and of Christ, +\v 3 in whom all the treasures of wisdom and knowledge are hidden. +\v 4 Now I say this that no one may delude you with persuasiveness of speech. +\v 5 For though I am absent in the flesh, yet I am with you in the spirit, rejoicing and seeing your order, and the steadfastness of your faith in Christ. +\p +\v 6 As therefore you received Christ Jesus the Lord, walk in him, +\v 7 rooted and built up in him and established in the faith, even as you were taught, abounding in it in thanksgiving. +\p +\v 8 Be careful that you don’t let anyone rob you through his philosophy and vain deceit, after the tradition of men, after the elemental spirits of the world, and not after Christ. +\v 9 For in him all the fullness of the Deity dwells bodily, +\v 10 and in him you are made full, who is the head of all principality and power. +\v 11 In him you were also circumcised with a circumcision not made with hands, in the putting off of the body of the sins of the flesh, in the circumcision of Christ, +\v 12 having been buried with him in baptism, in which you were also raised with him through faith in the working of God, who raised him from the dead. +\v 13 You were dead through your trespasses and the uncircumcision of your flesh. He made you alive together with him, having forgiven us all our trespasses, +\v 14 wiping out the handwriting in ordinances which was against us. He has taken it out of the way, nailing it to the cross. +\v 15 Having stripped the principalities and the powers, he made a show of them openly, triumphing over them in it. +\p +\v 16 Let no one therefore judge you in eating or drinking, or with respect to a feast day or a new moon or a Sabbath day, +\v 17 which are a shadow of the things to come; but the body is Christ’s. +\v 18 Let no one rob you of your prize by self-abasement and worshiping of the angels, dwelling in the things which he has not seen, vainly puffed up by his fleshly mind, +\v 19 and not holding firmly to the Head, from whom all the body, being supplied and knit together through the joints and ligaments, grows with God’s growth. +\p +\v 20 If you died with Christ from the elemental spirits of the world, why, as though living in the world, do you subject yourselves to ordinances, +\v 21 “Don’t handle, nor taste, nor touch” +\v 22 (all of which perish with use), according to the precepts and doctrines of men? +\v 23 These things indeed appear like wisdom in self-imposed worship, humility, and severity to the body, but aren’t of any value against the indulgence of the flesh. +\c 3 +\p +\v 1 If then you were raised together with Christ, seek the things that are above, where Christ is, seated on the right hand of God. +\v 2 Set your mind on the things that are above, not on the things that are on the earth. +\v 3 For you died, and your life is hidden with Christ in God. +\v 4 When Christ, our life, is revealed, then you will also be revealed with him in glory. +\p +\v 5 Put to death therefore your members which are on the earth: sexual immorality, uncleanness, depraved passion, evil desire, and covetousness, which is idolatry. +\v 6 For these things’ sake the wrath of God comes on the children of disobedience. +\v 7 You also once walked in those, when you lived in them, +\v 8 but now you must put them all away: anger, wrath, malice, slander, and shameful speaking out of your mouth. +\v 9 Don’t lie to one another, seeing that you have put off the old man with his doings, +\v 10 and have put on the new man, who is being renewed in knowledge after the image of his Creator, +\v 11 where there can’t be Greek and Jew, circumcision and uncircumcision, barbarian, Scythian, bondservant, or free person; but Christ is all, and in all. +\p +\v 12 Put on therefore, as God’s chosen ones, holy and beloved, a heart of compassion, kindness, lowliness, humility, and perseverance; +\v 13 bearing with one another, and forgiving each other, if any man has a complaint against any; even as Christ forgave you, so you also do. +\p +\v 14 Above all these things, walk in love, which is the bond of perfection. +\v 15 And let the peace of God rule in your hearts, to which also you were called in one body, and be thankful. +\v 16 Let the word of Christ dwell in you richly; in all wisdom teaching and admonishing one another with psalms, hymns, and spiritual songs, singing with grace in your heart to the Lord. +\p +\v 17 Whatever you do, in word or in deed, do all in the name of the Lord Jesus, giving thanks to God the Father through him. +\p +\v 18 Wives, be in subjection to your husbands, as is fitting in the Lord. +\p +\v 19 Husbands, love your wives, and don’t be bitter against them. +\p +\v 20 Children, obey your parents in all things, for this pleases the Lord. +\p +\v 21 Fathers, don’t provoke your children, so that they won’t be discouraged. +\p +\v 22 Servants, obey in all things those who are your masters according to the flesh, not just when they are looking, as men pleasers, but in singleness of heart, fearing God. +\v 23 And whatever you do, work heartily, as for the Lord and not for men, +\v 24 knowing that from the Lord you will receive the reward of the inheritance; for you serve the Lord Christ. +\v 25 But he who does wrong will receive again for the wrong that he has done, and there is no partiality. +\c 4 +\p +\v 1 Masters, give to your servants that which is just and equal, knowing that you also have a Master in heaven. +\p +\v 2 Continue steadfastly in prayer, watching in it with thanksgiving, +\v 3 praying together for us also, that God may open to us a door for the word, to speak the mystery of Christ, for which I am also in bonds, +\v 4 that I may reveal it as I ought to speak. +\p +\v 5 Walk in wisdom toward those who are outside, redeeming the time. +\v 6 Let your speech always be with grace, seasoned with salt, that you may know how you ought to answer each one. +\p +\v 7 All my affairs will be made known to you by Tychicus, the beloved brother, faithful servant, and fellow bondservant in the Lord. +\v 8 I am sending him to you for this very purpose, that he may know your circumstances and comfort your hearts, +\v 9 together with Onesimus, the faithful and beloved brother, who is one of you. They will make known to you everything that is going on here. +\p +\v 10 Aristarchus, my fellow prisoner, greets you, and Mark the cousin of Barnabas (concerning whom you received instructions, “if he comes to you, receive him”), +\v 11 and Jesus who is called Justus. These are my only fellow workers for God’s Kingdom who are of the circumcision, men who have been a comfort to me. +\p +\v 12 Epaphras, who is one of you, a servant of Christ, salutes you, always striving for you in his prayers, that you may stand perfect and complete in all the will of God. +\v 13 For I testify about him that he has great zeal for you, and for those in Laodicea, and for those in Hierapolis. +\v 14 Luke the beloved physician and Demas greet you. +\v 15 Greet the brothers who are in Laodicea, with Nymphas and the assembly that is in his house. +\v 16 When this letter has been read among you, cause it to be read also in the assembly of the Laodiceans, and that you also read the letter from Laodicea. +\v 17 Tell Archippus, “Take heed to the ministry which you have received in the Lord, that you fulfill it.” +\p +\v 18 I, Paul, write this greeting with my own hand. Remember my chains. Grace be with you. Amen. diff --git a/c-sharp/assets/WEB/531THengWEBUS.SFM b/c-sharp/assets/WEB/531THengWEBUS.SFM new file mode 100644 index 0000000000..a2bda706b1 --- /dev/null +++ b/c-sharp/assets/WEB/531THengWEBUS.SFM @@ -0,0 +1,122 @@ +\id 1TH 52-1TH-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 1 Thessalonians +\toc1 Paul’s First Letter to the Thessalonians +\toc2 1 Thessalonians +\toc3 1 Thessalonians +\mt1 Paul’s First Letter to the Thessalonians +\c 1 +\p +\v 1 Paul, Silvanus, and Timothy, to the assembly of the Thessalonians in God the Father and the Lord Jesus Christ:\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 2 We always give thanks to God for all of you, mentioning you in our prayers, +\v 3 remembering without ceasing your work of faith and labor of love and perseverance of hope in our Lord Jesus Christ, before our God and Father. +\v 4 We know, brothers\f + \fr 1:4 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* loved by God, that you are chosen, +\v 5 and that our Good News came to you not in word only, but also in power, and in the Holy Spirit and with much assurance. You know what kind of men we showed ourselves to be among you for your sake. +\v 6 You became imitators of us and of the Lord, having received the word in much affliction, with joy of the Holy Spirit, +\v 7 so that you became an example to all who believe in Macedonia and in Achaia. +\v 8 For from you the word of the Lord has been declared, not only in Macedonia and Achaia, but also in every place your faith toward God has gone out, so that we need not to say anything. +\v 9 For they themselves report concerning us what kind of a reception we had from you, and how you turned to God from idols to serve a living and true God, +\v 10 and to wait for his Son from heaven, whom he raised from the dead: Jesus, who delivers us from the wrath to come. +\c 2 +\p +\v 1 For you yourselves know, brothers, our visit to you wasn’t in vain, +\v 2 but having suffered before and been shamefully treated, as you know, at Philippi, we grew bold in our God to tell you the Good News of God in much conflict. +\v 3 For our exhortation is not of error, nor of uncleanness, nor in deception. +\v 4 But even as we have been approved by God to be entrusted with the Good News, so we speak—not as pleasing men, but God, who tests our hearts. +\v 5 For neither were we at any time found using words of flattery, as you know, nor a cloak of covetousness (God is witness), +\v 6 nor seeking glory from men (neither from you nor from others), when we might have claimed authority as apostles of Christ. +\v 7 But we were gentle among you, like a nursing mother cherishes her own children. +\p +\v 8 Even so, affectionately longing for you, we were well pleased to impart to you not the Good News of God only, but also our own souls, because you had become very dear to us. +\v 9 For you remember, brothers, our labor and travail; for working night and day, that we might not burden any of you, we preached to you the Good News of God. +\v 10 You are witnesses with God how holy, righteously, and blamelessly we behaved ourselves toward you who believe. +\v 11 As you know, we exhorted, comforted, and implored every one of you, as a father does his own children, +\v 12 to the end that you should walk worthily of God, who calls you into his own Kingdom and glory. +\p +\v 13 For this cause we also thank God without ceasing that when you received from us the word of the message of God, you accepted it not as the word of men, but as it is in truth, God’s word, which also works in you who believe. +\v 14 For you, brothers, became imitators of the assemblies of God which are in Judea in Christ Jesus; for you also suffered the same things from your own countrymen, even as they did from the Jews +\v 15 who killed both the Lord Jesus and their own prophets, and drove us out, and don’t please God, and are contrary to all men, +\v 16 forbidding us to speak to the Gentiles that they may be saved, to fill up their sins always. But wrath has come on them to the uttermost. +\p +\v 17 But we, brothers, being bereaved of you for a short season in presence, not in heart, tried even harder to see your face with great desire, +\v 18 because we wanted to come to you—indeed, I, Paul, once and again—but Satan hindered us. +\v 19 For what is our hope, or joy, or crown of rejoicing? Isn’t it even you, before our Lord Jesus\f + \fr 2:19 \ft TR adds “Christ”\f* at his coming? +\v 20 For you are our glory and our joy. +\c 3 +\p +\v 1 Therefore when we couldn’t stand it any longer, we thought it good to be left behind at Athens alone, +\v 2 and sent Timothy, our brother and God’s servant in the Good News of Christ, to establish you and to comfort you concerning your faith, +\v 3 that no one would be moved by these afflictions. For you know that we are appointed to this task. +\v 4 For most certainly, when we were with you, we told you beforehand that we are to suffer affliction, even as it happened, and you know. +\v 5 For this cause I also, when I couldn’t stand it any longer, sent that I might know your faith, for fear that by any means the tempter had tempted you, and our labor would have been in vain. +\p +\v 6 But Timothy has just now come to us from you, and brought us glad news of your faith and love, and that you have good memories of us always, longing to see us, even as we also long to see you. +\v 7 For this cause, brothers, we were comforted over you in all our distress and affliction through your faith. +\v 8 For now we live, if you stand fast in the Lord. +\v 9 For what thanksgiving can we render again to God for you, for all the joy with which we rejoice for your sakes before our God, +\v 10 night and day praying exceedingly that we may see your face and may perfect that which is lacking in your faith? +\p +\v 11 Now may our God and Father himself, and our Lord Jesus Christ, direct our way to you. +\v 12 May the Lord make you to increase and abound in love toward one another and toward all men, even as we also do toward you, +\v 13 to the end he may establish your hearts blameless in holiness before our God and Father at the coming of our Lord Jesus with all his saints. +\c 4 +\p +\v 1 Finally then, brothers, we beg and exhort you in the Lord Jesus, that as you received from us how you ought to walk and to please God, that you abound more and more. +\v 2 For you know what instructions we gave you through the Lord Jesus. +\v 3 For this is the will of God: your sanctification, that you abstain from sexual immorality, +\v 4 that each one of you know how to control his own body\f + \fr 4:4 \ft literally, possess his own vessel\f* in sanctification and honor, +\v 5 not in the passion of lust, even as the Gentiles who don’t know God, +\v 6 that no one should take advantage of and wrong a brother or sister in this matter; because the Lord is an avenger in all these things, as also we forewarned you and testified. +\v 7 For God called us not for uncleanness, but in sanctification. +\v 8 Therefore he who rejects this doesn’t reject man, but God, who has also given his Holy Spirit to you. +\p +\v 9 But concerning brotherly love, you have no need that one write to you. For you yourselves are taught by God to love one another, +\v 10 for indeed you do it toward all the brothers who are in all Macedonia. But we exhort you, brothers, that you abound more and more; +\v 11 and that you make it your ambition to lead a quiet life, and to do your own business, and to work with your own hands, even as we instructed you, +\v 12 that you may walk properly toward those who are outside, and may have need of nothing. +\p +\v 13 But we don’t want you to be ignorant, brothers, concerning those who have fallen asleep, so that you don’t grieve like the rest, who have no hope. +\v 14 For if we believe that Jesus died and rose again, even so God will bring with him those who have fallen asleep in Jesus. +\v 15 For this we tell you by the word of the Lord, that we who are alive, who are left until the coming of the Lord, will in no way precede those who have fallen asleep. +\v 16 For the Lord himself will descend from heaven with a shout, with the voice of the archangel and with God’s trumpet. The dead in Christ will rise first, +\v 17 then we who are alive, who are left, will be caught up together with them in the clouds to meet the Lord in the air. So we will be with the Lord forever. +\v 18 Therefore comfort one another with these words. +\c 5 +\p +\v 1 But concerning the times and the seasons, brothers, you have no need that anything be written to you. +\v 2 For you yourselves know well that the day of the Lord comes like a thief in the night. +\v 3 For when they are saying, “Peace and safety,” then sudden destruction will come on them, like birth pains on a pregnant woman. Then they will in no way escape. +\v 4 But you, brothers, aren’t in darkness, that the day should overtake you like a thief. +\v 5 You are all children of light and children of the day. We don’t belong to the night, nor to darkness, +\v 6 so then let’s not sleep, as the rest do, but let’s watch and be sober. +\v 7 For those who sleep, sleep in the night; and those who are drunk are drunk in the night. +\v 8 But since we belong to the day, let’s be sober, putting on the breastplate of faith and love, and for a helmet, the hope of salvation. +\v 9 For God didn’t appoint us to wrath, but to the obtaining of salvation through our Lord Jesus Christ, +\v 10 who died for us, that, whether we wake or sleep, we should live together with him. +\v 11 Therefore exhort one another, and build each other up, even as you also do. +\p +\v 12 But we beg you, brothers, to know those who labor among you, and are over you in the Lord and admonish you, +\v 13 and to respect and honor them in love for their work’s sake. +\p Be at peace among yourselves. +\v 14 We exhort you, brothers: Admonish the disorderly; encourage the faint-hearted; support the weak; be patient toward all. +\v 15 See that no one returns evil for evil to anyone, but always follow after that which is good for one another and for all. +\p +\v 16 Always rejoice. +\v 17 Pray without ceasing. +\v 18 In everything give thanks, for this is the will of God in Christ Jesus toward you. +\v 19 Don’t quench the Spirit. +\v 20 Don’t despise prophecies. +\v 21 Test all things, and hold firmly that which is good. +\v 22 Abstain from every form of evil. +\p +\v 23 May the God of peace himself sanctify you completely. May your whole spirit, soul, and body be preserved blameless at the coming of our Lord Jesus Christ. +\p +\v 24 He who calls you is faithful, who will also do it. +\p +\v 25 Brothers, pray for us. +\p +\v 26 Greet all the brothers with a holy kiss. +\v 27 I solemnly command you by the Lord that this letter be read to all the holy brothers. +\p +\v 28 The grace of our Lord Jesus Christ be with you. Amen. diff --git a/c-sharp/assets/WEB/542THengWEBUS.SFM b/c-sharp/assets/WEB/542THengWEBUS.SFM new file mode 100644 index 0000000000..4afb9aacfb --- /dev/null +++ b/c-sharp/assets/WEB/542THengWEBUS.SFM @@ -0,0 +1,68 @@ +\id 2TH 53-2TH-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 2 Thessalonians +\toc1 Paul’s Second Letter to the Thessalonians +\toc2 2 Thessalonians +\toc3 2 Thessalonians +\mt1 Paul’s Second Letter to the Thessalonians +\c 1 +\p +\v 1 Paul, Silvanus, and Timothy, to the assembly of the Thessalonians in God our Father and the Lord Jesus Christ: +\v 2 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 3 We are bound to always give thanks to God for you, brothers,\f + \fr 1:3 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* even as it is appropriate, because your faith grows exceedingly, and the love of each and every one of you toward one another abounds, +\v 4 so that we ourselves boast about you in the assemblies of God for your perseverance and faith in all your persecutions and in the afflictions which you endure. +\v 5 This is an obvious sign of the righteous judgment of God, to the end that you may be counted worthy of God’s Kingdom, for which you also suffer. +\v 6 For it is a righteous thing with God to repay affliction to those who afflict you, +\v 7 and to give relief to you who are afflicted with us when the Lord Jesus is revealed from heaven with his mighty angels in flaming fire, +\v 8 punishing those who don’t know God, and to those who don’t obey the Good News of our Lord Jesus, +\v 9 who will pay the penalty: eternal destruction from the face of the Lord and from the glory of his might, +\v 10 when he comes in that day to be glorified in his saints and to be admired among all those who have believed, because our testimony to you was believed. +\p +\v 11 To this end we also pray always for you that our God may count you worthy of your calling, and fulfill every desire of goodness and work of faith with power, +\v 12 that the name of our Lord Jesus\f + \fr 1:12 \ft TR adds “Christ”\f* may be glorified in you, and you in him, according to the grace of our God and the Lord Jesus Christ. +\c 2 +\p +\v 1 Now, brothers, concerning the coming of our Lord Jesus Christ and our gathering together to him, we ask you +\v 2 not to be quickly shaken in your mind or troubled, either by spirit or by word or by letter as if from us, saying that the day of Christ has already come. +\v 3 Let no one deceive you in any way. For it will not be unless the rebellion\f + \fr 2:3 \ft or, \fqa falling away\ft , or, \fqa defection\f* comes first, and the man of sin is revealed, the son of destruction. +\v 4 He opposes and exalts himself against all that is called God or that is worshiped, so that he sits as God in the temple of God, setting himself up as God. +\v 5 Don’t you remember that when I was still with you, I told you these things? +\v 6 Now you know what is restraining him, to the end that he may be revealed in his own season. +\v 7 For the mystery of lawlessness already works. Only there is one who restrains now, until he is taken out of the way. +\v 8 Then the lawless one will be revealed, whom the Lord will kill with the breath of his mouth and destroy by the manifestation of his coming; +\v 9 even he whose coming is according to the working of Satan with all power and signs and lying wonders, +\v 10 and with all deception of wickedness for those who are being lost, because they didn’t receive the love of the truth, that they might be saved. +\v 11 Because of this, God sends them a powerful delusion, that they should believe a lie, +\v 12 that they all might be judged who didn’t believe the truth, but had pleasure in unrighteousness. +\p +\v 13 But we are bound to always give thanks to God for you, brothers loved by the Lord, because God chose you from the beginning for salvation through sanctification of the Spirit and belief in the truth, +\v 14 to which he called you through our Good News, for the obtaining of the glory of our Lord Jesus Christ. +\v 15 So then, brothers, stand firm and hold the traditions which you were taught by us, whether by word or by letter. +\p +\v 16 Now our Lord Jesus Christ himself, and God our Father, who loved us and gave us eternal comfort and good hope through grace, +\v 17 comfort your hearts and establish you in every good work and word. +\c 3 +\p +\v 1 Finally, brothers, pray for us, that the word of the Lord may spread rapidly and be glorified, even as also with you, +\v 2 and that we may be delivered from unreasonable and evil men; for not all have faith. +\v 3 But the Lord is faithful, who will establish you and guard you from the evil one. +\v 4 We have confidence in the Lord concerning you, that you both do and will do the things we command. +\v 5 May the Lord direct your hearts into God’s love and into the perseverance of Christ. +\p +\v 6 Now we command you, brothers, in the name of our Lord Jesus Christ, that you withdraw yourselves from every brother who walks in rebellion and not after the tradition which they received from us. +\v 7 For you know how you ought to imitate us. For we didn’t behave ourselves rebelliously among you, +\v 8 neither did we eat bread from anyone’s hand without paying for it, but in labor and travail worked night and day, that we might not burden any of you. +\v 9 This was not because we don’t have the right, but to make ourselves an example to you, that you should imitate us. +\v 10 For even when we were with you, we commanded you this: “If anyone is not willing to work, don’t let him eat.” +\v 11 For we hear of some who walk among you in rebellion, who don’t work at all, but are busybodies. +\v 12 Now those who are that way, we command and exhort in the Lord Jesus Christ, that they work with quietness and eat their own bread. +\p +\v 13 But you, brothers, don’t be weary in doing what is right. +\v 14 If any man doesn’t obey our word in this letter, note that man and have no company with him, to the end that he may be ashamed. +\v 15 Don’t count him as an enemy, but admonish him as a brother. +\p +\v 16 Now may the Lord of peace himself give you peace at all times in all ways. The Lord be with you all. +\p +\v 17 I, Paul, write this greeting with my own hand, which is the sign in every letter. This is how I write. +\v 18 The grace of our Lord Jesus Christ be with you all. Amen. diff --git a/c-sharp/assets/WEB/551TIengWEBUS.SFM b/c-sharp/assets/WEB/551TIengWEBUS.SFM new file mode 100644 index 0000000000..af4360d125 --- /dev/null +++ b/c-sharp/assets/WEB/551TIengWEBUS.SFM @@ -0,0 +1,160 @@ +\id 1TI 54-1TI-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 1 Timothy +\toc1 Paul’s First Letter to Timothy +\toc2 1 Timothy +\toc3 1 Timothy +\mt1 Paul’s First Letter to Timothy +\c 1 +\p +\v 1 Paul, an apostle of Jesus Christ according to the commandment of God our Savior and the Lord Jesus Christ\f + \fr 1:1 \ft NU reads \fqa Christ Jesus \ft and omits \fqa the Lord. \f* our hope, +\v 2 to Timothy, my true child in faith: Grace, mercy, and peace from God our Father and Christ Jesus our Lord. +\p +\v 3 As I urged you when I was going into Macedonia, stay at Ephesus that you might command certain men not to teach a different doctrine, +\v 4 and not to pay attention to myths and endless genealogies, which cause disputes rather than God’s stewardship, which is in faith. +\v 5 But the goal of this command is love from a pure heart, a good conscience, and sincere faith, +\v 6 from which things some, having missed the mark, have turned away to vain talking, +\v 7 desiring to be teachers of the law, though they understand neither what they say nor about what they strongly affirm. +\p +\v 8 But we know that the law is good if a person uses it lawfully, +\v 9 as knowing this, that law is not made for a righteous person, but for the lawless and insubordinate, for the ungodly and sinners, for the unholy and profane, for murderers of fathers and murderers of mothers, for manslayers, +\v 10 for the sexually immoral, for homosexuals, for slave-traders, for liars, for perjurers, and for any other thing contrary to the sound doctrine, +\v 11 according to the Good News of the glory of the blessed God, which was committed to my trust. +\p +\v 12 I thank him who enabled me, Christ Jesus our Lord, because he counted me faithful, appointing me to service, +\v 13 although I used to be a blasphemer, a persecutor, and insolent. However, I obtained mercy because I did it ignorantly in unbelief. +\v 14 The grace of our Lord abounded exceedingly with faith and love which is in Christ Jesus. +\v 15 The saying is faithful and worthy of all acceptance, that Christ Jesus came into the world to save sinners, of whom I am chief. +\v 16 However, for this cause I obtained mercy, that in me first, Jesus Christ might display all his patience for an example of those who were going to believe in him for eternal life. +\v 17 Now to the King eternal, immortal, invisible, to God who alone is wise, be honor and glory forever and ever. Amen. +\p +\v 18 I commit this instruction to you, my child Timothy, according to the prophecies which were given to you before, that by them you may wage the good warfare, +\v 19 holding faith and a good conscience, which some having thrust away made a shipwreck concerning the faith, +\v 20 of whom are Hymenaeus and Alexander, whom I delivered to Satan that they might be taught not to blaspheme. +\c 2 +\p +\v 1 I exhort therefore, first of all, that petitions, prayers, intercessions, and givings of thanks be made for all men, +\v 2 for kings and all who are in high places, that we may lead a tranquil and quiet life in all godliness and reverence. +\v 3 For this is good and acceptable in the sight of God our Savior, +\v 4 who desires all people to be saved and come to full knowledge of the truth. +\v 5 For there is one God and one mediator between God and men, the man Christ Jesus, +\v 6 who gave himself as a ransom for all, the testimony at the proper time, +\v 7 to which I was appointed a preacher and an apostle—I am telling the truth in Christ, not lying—a teacher of the Gentiles in faith and truth. +\p +\v 8 I desire therefore that the men in every place pray, lifting up holy hands without anger and doubting. +\v 9 In the same way, that women also adorn themselves in decent clothing, with modesty and propriety, not\f + \fr 2:9 \ft The word for “not” is the negative particle “μη” which denies an expected idea, as opposed to the usual word for “not” (ου) which denies a fact. Thus “μη” in this context is denying an expected idea (that women can be properly dressed without good works).\f* with braided hair, gold, pearls, or expensive clothing, +\v 10 but with good works, which is appropriate for women professing godliness. +\v 11 Let a woman learn in quietness with full submission. +\v 12 But I don’t permit a woman to teach, nor to exercise authority over a man, but to be in quietness. +\v 13 For Adam was formed first, then Eve. +\v 14 Adam wasn’t deceived, but the woman, being deceived, has fallen into disobedience; +\v 15 but she will be saved through her childbearing, if they continue in faith, love, and holiness with sobriety. +\c 3 +\p +\v 1 This is a faithful saying: someone who seeks to be an overseer\f + \fr 3:1 \ft or, superintendent, or bishop\f* desires a good work. +\v 2 The overseer therefore must be without reproach, the husband of one wife, temperate, sensible, modest, hospitable, good at teaching; +\v 3 not a drinker, not violent, not greedy for money, but gentle, not quarrelsome, not covetous; +\v 4 one who rules his own house well, having children in subjection with all reverence; +\v 5 (for how could someone who doesn’t know how to rule his own house take care of God’s assembly?) +\v 6 not a new convert, lest being puffed up he fall into the same condemnation as the devil. +\v 7 Moreover he must have good testimony from those who are outside, to avoid falling into reproach and the snare of the devil. +\p +\v 8 Servants,\f + \fr 3:8 \ft or, Deacons.\f* in the same way, must be reverent, not double-tongued, not addicted to much wine, not greedy for money, +\v 9 holding the mystery of the faith in a pure conscience. +\v 10 Let them also first be tested; then let them serve\f + \fr 3:10 \ft or, serve as deacons\f* if they are blameless. +\v 11 Their wives in the same way must be reverent, not slanderers, temperate, and faithful in all things. +\v 12 Let servants\f + \fr 3:12 \ft or, deacons\f* be husbands of one wife, ruling their children and their own houses well. +\v 13 For those who have served well\f + \fr 3:13 \ft or, served well as deacons\f* gain for themselves a good standing and great boldness in the faith which is in Christ Jesus. +\p +\v 14 These things I write to you, hoping to come to you shortly, +\v 15 but if I wait long, that you may know how men ought to behave themselves in God’s house, which is the assembly of the living God, the pillar and ground of the truth. +\v 16 Without controversy, the mystery of godliness is great: +\q1 God\f + \fr 3:16 \ft NU replaces “God” with “who”\f* was revealed in the flesh, +\q1 justified in the spirit, +\q1 seen by angels, +\q1 preached among the nations, +\q1 believed on in the world, +\q1 and received up in glory. +\c 4 +\p +\v 1 But the Spirit says expressly that in later times some will fall away from the faith, paying attention to seducing spirits and doctrines of demons, +\v 2 through the hypocrisy of men who speak lies, branded in their own conscience as with a hot iron, +\v 3 forbidding marriage and commanding to abstain from foods which God created to be received with thanksgiving by those who believe and know the truth. +\v 4 For every creature of God is good, and nothing is to be rejected if it is received with thanksgiving. +\v 5 For it is sanctified through the word of God and prayer. +\p +\v 6 If you instruct the brothers of these things, you will be a good servant of Christ Jesus, nourished in the words of the faith and of the good doctrine which you have followed. +\v 7 But refuse profane and old wives’ fables. Exercise yourself toward godliness. +\v 8 For bodily exercise has some value, but godliness has value in all things, having the promise of the life which is now and of that which is to come. +\v 9 This saying is faithful and worthy of all acceptance. +\v 10 For to this end we both labor and suffer reproach, because we have set our trust in the living God, who is the Savior of all men, especially of those who believe. +\v 11 Command and teach these things. +\p +\v 12 Let no man despise your youth; but be an example to those who believe, in word, in your way of life, in love, in spirit, in faith, and in purity. +\v 13 Until I come, pay attention to reading, to exhortation, and to teaching. +\v 14 Don’t neglect the gift that is in you, which was given to you by prophecy with the laying on of the hands of the elders. +\v 15 Be diligent in these things. Give yourself wholly to them, that your progress may be revealed to all. +\v 16 Pay attention to yourself and to your teaching. Continue in these things, for in doing this you will save both yourself and those who hear you. +\c 5 +\p +\v 1 Don’t rebuke an older man, but exhort him as a father; the younger men as brothers; +\v 2 the elder women as mothers; the younger as sisters, in all purity. +\p +\v 3 Honor widows who are widows indeed. +\v 4 But if any widow has children or grandchildren, let them learn first to show piety toward their own family and to repay their parents, for this is\f + \fr 5:4 \ft TR adds “good and”\f* acceptable in the sight of God. +\v 5 Now she who is a widow indeed and desolate, has her hope set on God and continues in petitions and prayers night and day. +\v 6 But she who gives herself to pleasure is dead while she lives. +\v 7 Also command these things, that they may be without reproach. +\v 8 But if anyone doesn’t provide for his own, and especially his own household, he has denied the faith and is worse than an unbeliever. +\p +\v 9 Let no one be enrolled as a widow under sixty years old, having been the wife of one man, +\v 10 being approved by good works, if she has brought up children, if she has been hospitable to strangers, if she has washed the saints’ feet, if she has relieved the afflicted, and if she has diligently followed every good work. +\p +\v 11 But refuse younger widows, for when they have grown wanton against Christ, they desire to marry, +\v 12 having condemnation, because they have rejected their first pledge. +\v 13 Besides, they also learn to be idle, going about from house to house. Not only idle, but also gossips and busybodies, saying things which they ought not. +\v 14 I desire therefore that the younger widows marry, bear children, rule the household, and give no occasion to the adversary for insulting. +\v 15 For already some have turned away after Satan. +\v 16 If any man or woman who believes has widows, let them relieve them, and don’t let the assembly be burdened, that it might relieve those who are widows indeed. +\p +\v 17 Let the elders who rule well be counted worthy of double honor, especially those who labor in the word and in teaching. +\v 18 For the Scripture says, “You shall not muzzle the ox when it treads out the grain.”\x + \xo 5:18 \xt Deuteronomy 25:4\x* And, \wj “The laborer is worthy of his wages.”\wj*\x + \xo 5:18 \xt Luke 10:7; Leviticus 19:13\x* +\p +\v 19 Don’t receive an accusation against an elder except at the word of two or three witnesses. +\v 20 Those who sin, reprove in the sight of all, that the rest also may be in fear. +\v 21 I command you in the sight of God, and the Lord Jesus Christ, and the chosen angels, that you observe these things without prejudice, doing nothing by partiality. +\v 22 Lay hands hastily on no one. Don’t be a participant in other people’s sins. Keep yourself pure. +\p +\v 23 Be no longer a drinker of water only, but use a little wine for your stomach’s sake and your frequent infirmities. +\p +\v 24 Some men’s sins are evident, preceding them to judgment, and some also follow later. +\v 25 In the same way also there are good works that are obvious, and those that are otherwise can’t be hidden. +\c 6 +\p +\v 1 Let as many as are bondservants under the yoke count their own masters worthy of all honor, that the name of God and the doctrine not be blasphemed. +\v 2 Those who have believing masters, let them not despise them because they are brothers, but rather let them serve them, because those who partake of the benefit are believing and beloved. Teach and exhort these things. +\p +\v 3 If anyone teaches a different doctrine and doesn’t consent to sound words, the words of our Lord Jesus Christ, and to the doctrine which is according to godliness, +\v 4 he is conceited, knowing nothing, but obsessed with arguments, disputes, and word battles, from which come envy, strife, insulting, evil suspicions, +\v 5 constant friction of people of corrupt minds and destitute of the truth, who suppose that godliness is a means of gain. Withdraw yourself from such.\f + \fr 6:5 \ft NU omits “Withdraw yourself from such.”\f* +\p +\v 6 But godliness with contentment is great gain. +\v 7 For we brought nothing into the world, and we certainly can’t carry anything out. +\v 8 But having food and clothing, we will be content with that. +\v 9 But those who are determined to be rich fall into a temptation, a snare, and many foolish and harmful lusts, such as drown men in ruin and destruction. +\v 10 For the love of money is a root of all kinds of evil. Some have been led astray from the faith in their greed, and have pierced themselves through with many sorrows. +\p +\v 11 But you, man of God, flee these things, and follow after righteousness, godliness, faith, love, perseverance, and gentleness. +\v 12 Fight the good fight of faith. Take hold of the eternal life to which you were called, and you confessed the good confession in the sight of many witnesses. +\v 13 I command you before God who gives life to all things, and before Christ Jesus who before Pontius Pilate testified the good confession, +\v 14 that you keep the commandment without spot, blameless until the appearing of our Lord Jesus Christ, +\v 15 which at the right time he will show, who is the blessed and only Ruler, the King of kings and Lord of lords. +\v 16 He alone has immortality, dwelling in unapproachable light, whom no man has seen nor can see, to whom be honor and eternal power. Amen. +\p +\v 17 Charge those who are rich in this present age that they not be arrogant, nor have their hope set on the uncertainty of riches, but on the living God, who richly provides us with everything to enjoy; +\v 18 that they do good, that they be rich in good works, that they be ready to distribute, willing to share; +\v 19 laying up in store for themselves a good foundation against the time to come, that they may lay hold of eternal life. +\p +\v 20 Timothy, guard that which is committed to you, turning away from the empty chatter and oppositions of what is falsely called knowledge, +\v 21 which some profess, and thus have wandered from the faith. +\p Grace be with you. Amen. diff --git a/c-sharp/assets/WEB/562TIengWEBUS.SFM b/c-sharp/assets/WEB/562TIengWEBUS.SFM new file mode 100644 index 0000000000..ddcdefd498 --- /dev/null +++ b/c-sharp/assets/WEB/562TIengWEBUS.SFM @@ -0,0 +1,123 @@ +\id 2TI 55-2TI-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 2 Timothy +\toc1 Paul’s Second Letter to Timothy +\toc2 2 Timothy +\toc3 2 Timothy +\mt1 Paul’s Second Letter to Timothy +\c 1 +\p +\v 1 Paul, an apostle of Jesus Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* through the will of God, according to the promise of the life which is in Christ Jesus, +\v 2 to Timothy, my beloved child: Grace, mercy, and peace, from God the Father and Christ Jesus our Lord. +\p +\v 3 I thank God, whom I serve as my forefathers did, with a pure conscience. How unceasing is my memory of you in my petitions, night and day +\v 4 longing to see you, remembering your tears, that I may be filled with joy; +\v 5 having been reminded of the sincere faith that is in you, which lived first in your grandmother Lois and your mother Eunice and, I am persuaded, in you also. +\p +\v 6 For this cause, I remind you that you should stir up the gift of God which is in you through the laying on of my hands. +\v 7 For God didn’t give us a spirit of fear, but of power, love, and self-control. +\v 8 Therefore don’t be ashamed of the testimony of our Lord, nor of me his prisoner; but endure hardship for the Good News according to the power of God, +\v 9 who saved us and called us with a holy calling, not according to our works, but according to his own purpose and grace, which was given to us in Christ Jesus before times eternal, +\v 10 but has now been revealed by the appearing of our Savior, Christ Jesus, who abolished death, and brought life and immortality to light through the Good News. +\v 11 For this I was appointed as a preacher, an apostle, and a teacher of the Gentiles. +\v 12 For this cause I also suffer these things. +\p Yet I am not ashamed, for I know him whom I have believed, and I am persuaded that he is able to guard that which I have committed to him against that day. +\p +\v 13 Hold the pattern of sound words which you have heard from me, in faith and love which is in Christ Jesus. +\v 14 That good thing which was committed to you, guard through the Holy Spirit who dwells in us. +\p +\v 15 This you know, that all who are in Asia turned away from me, of whom are Phygelus and Hermogenes. +\v 16 May the Lord grant mercy to the house of Onesiphorus, for he often refreshed me, and was not ashamed of my chain, +\v 17 but when he was in Rome, he sought me diligently and found me +\v 18 (the Lord grant to him to find the Lord’s mercy in that day); and in how many things he served at Ephesus, you know very well. +\c 2 +\p +\v 1 You therefore, my child, be strengthened in the grace that is in Christ Jesus. +\v 2 The things which you have heard from me among many witnesses, commit the same things to faithful men who will be able to teach others also. +\v 3 You therefore must endure hardship as a good soldier of Christ Jesus. +\v 4 No soldier on duty entangles himself in the affairs of life, that he may please him who enrolled him as a soldier. +\v 5 Also, if anyone competes in athletics, he isn’t crowned unless he has competed by the rules. +\v 6 The farmer who labors must be the first to get a share of the crops. +\v 7 Consider what I say, and may the Lord give you understanding in all things. +\p +\v 8 Remember Jesus Christ, risen from the dead, of the offspring\f + \fr 2:8 \ft or, seed\f* of David, according to my Good News, +\v 9 in which I suffer hardship to the point of chains as a criminal. But God’s word isn’t chained. +\v 10 Therefore I endure all things for the chosen ones’ sake, that they also may obtain the salvation which is in Christ Jesus with eternal glory. +\v 11 This saying is trustworthy: +\q1 “For if we died with him, +\q2 we will also live with him. +\q1 +\v 12 If we endure, +\q2 we will also reign with him. +\q1 If we deny him, +\q2 he also will deny us. +\q1 +\v 13 If we are faithless, +\q2 he remains faithful; +\q2 for he can’t deny himself.” +\p +\v 14 Remind them of these things, charging them in the sight of the Lord that they don’t argue about words to no profit, to the subverting of those who hear. +\p +\v 15 Give diligence to present yourself approved by God, a workman who doesn’t need to be ashamed, properly handling the Word of Truth. +\v 16 But shun empty chatter, for it will go further in ungodliness, +\v 17 and those words will consume like gangrene, of whom is Hymenaeus and Philetus: +\v 18 men who have erred concerning the truth, saying that the resurrection is already past, and overthrowing the faith of some. +\v 19 However, God’s firm foundation stands, having this seal: “The Lord knows those who are his,”\x + \xo 2:19 \xt Numbers 16:5\x* and, “Let every one who names the name of the Lord\f + \fr 2:19 \ft TR reads “Christ” instead of “the Lord”\f* depart from unrighteousness.” +\p +\v 20 Now in a large house there are not only vessels of gold and of silver, but also of wood and of clay. Some are for honor and some for dishonor. +\v 21 If anyone therefore purges himself from these, he will be a vessel for honor, sanctified, and suitable for the master’s use, prepared for every good work. +\p +\v 22 Flee from youthful lusts; but pursue righteousness, faith, love, and peace with those who call on the Lord out of a pure heart. +\v 23 But refuse foolish and ignorant questionings, knowing that they generate strife. +\v 24 The Lord’s servant must not quarrel, but be gentle toward all, able to teach, patient, +\v 25 in gentleness correcting those who oppose him. Perhaps God may give them repentance leading to a full knowledge of the truth, +\v 26 and they may recover themselves out of the devil’s snare, having been taken captive by him to do his will. +\c 3 +\p +\v 1 But know this: that in the last days, grievous times will come. +\v 2 For men will be lovers of self, lovers of money, boastful, arrogant, blasphemers, disobedient to parents, unthankful, unholy, +\v 3 without natural affection, unforgiving, slanderers, without self-control, fierce, not lovers of good, +\v 4 traitors, headstrong, conceited, lovers of pleasure rather than lovers of God, +\v 5 holding a form of godliness but having denied its power. Turn away from these, also. +\v 6 For some of these are people who creep into houses and take captive gullible women loaded down with sins, led away by various lusts, +\v 7 always learning and never able to come to the knowledge of the truth. +\v 8 Even as Jannes and Jambres opposed Moses, so these also oppose the truth, men corrupted in mind, who concerning the faith are rejected. +\v 9 But they will proceed no further. For their folly will be evident to all men, as theirs also came to be. +\p +\v 10 But you followed my teaching, conduct, purpose, faith, patience, love, steadfastness, +\v 11 persecutions, and sufferings—those things that happened to me at Antioch, Iconium, and Lystra. I endured those persecutions. The Lord delivered me out of them all. +\v 12 Yes, and all who desire to live godly in Christ Jesus will suffer persecution. +\v 13 But evil men and impostors will grow worse and worse, deceiving and being deceived. +\v 14 But you remain in the things which you have learned and have been assured of, knowing from whom you have learned them. +\v 15 From infancy, you have known the holy Scriptures which are able to make you wise for salvation through faith which is in Christ Jesus. +\v 16 Every Scripture is God-breathed and\f + \fr 3:16 \ft or, Every writing inspired by God is\f* profitable for teaching, for reproof, for correction, and for instruction in righteousness, +\v 17 that each person who belongs to God may be complete, thoroughly equipped for every good work. +\c 4 +\p +\v 1 I command you therefore before God and the Lord Jesus Christ, who will judge the living and the dead at his appearing and his Kingdom: +\v 2 preach the word; be urgent in season and out of season; reprove, rebuke, and exhort with all patience and teaching. +\v 3 For the time will come when they will not listen to the sound doctrine, but having itching ears, will heap up for themselves teachers after their own lusts, +\v 4 and will turn away their ears from the truth, and turn away to fables. +\v 5 But you be sober in all things, suffer hardship, do the work of an evangelist, and fulfill your ministry. +\p +\v 6 For I am already being offered, and the time of my departure has come. +\v 7 I have fought the good fight. I have finished the course. I have kept the faith. +\v 8 From now on, the crown of righteousness is stored up for me, which the Lord, the righteous judge, will give to me on that day; and not to me only, but also to all those who have loved his appearing. +\p +\v 9 Be diligent to come to me soon, +\v 10 for Demas left me, having loved this present world, and went to Thessalonica; Crescens to Galatia; and Titus to Dalmatia. +\v 11 Only Luke is with me. Take Mark and bring him with you, for he is useful to me for service. +\v 12 But I sent Tychicus to Ephesus. +\v 13 Bring the cloak that I left at Troas with Carpus when you come—and the books, especially the parchments. +\v 14 Alexander the coppersmith did much evil to me. The Lord will repay him according to his deeds. +\v 15 Beware of him, for he greatly opposed our words. +\p +\v 16 At my first defense, no one came to help me, but all left me. May it not be held against them. +\v 17 But the Lord stood by me and strengthened me, that through me the message might be fully proclaimed, and that all the Gentiles might hear. So I was delivered out of the mouth of the lion. +\v 18 And the Lord will deliver me from every evil work and will preserve me for his heavenly Kingdom. To him be the glory forever and ever. Amen. +\p +\v 19 Greet Prisca and Aquila, and the house of Onesiphorus. +\v 20 Erastus remained at Corinth, but I left Trophimus at Miletus sick. +\v 21 Be diligent to come before winter. Eubulus salutes you, as do Pudens, Linus, Claudia, and all the brothers. +\p +\v 22 The Lord Jesus Christ be with your spirit. Grace be with you. Amen. diff --git a/c-sharp/assets/WEB/57TITengWEBUS.SFM b/c-sharp/assets/WEB/57TITengWEBUS.SFM new file mode 100644 index 0000000000..511019e982 --- /dev/null +++ b/c-sharp/assets/WEB/57TITengWEBUS.SFM @@ -0,0 +1,67 @@ +\id TIT 56-TIT-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Titus +\toc1 Paul’s Letter to Titus +\toc2 Titus +\toc3 Titus +\mt1 Paul’s Letter to Titus +\c 1 +\p +\v 1 Paul, a servant of God and an apostle of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* according to the faith of God’s chosen ones and the knowledge of the truth which is according to godliness, +\v 2 in hope of eternal life, which God, who can’t lie, promised before time began; +\v 3 but in his own time revealed his word in the message with which I was entrusted according to the commandment of God our Savior, +\v 4 to Titus, my true child according to a common faith: Grace, mercy, and peace from God the Father and the Lord Jesus Christ our Savior. +\p +\v 5 I left you in Crete for this reason, that you would set in order the things that were lacking and appoint elders in every city, as I directed you— +\v 6 if anyone is blameless, the husband of one wife, having children who believe, who are not accused of loose or unruly behavior. +\v 7 For the overseer must be blameless, as God’s steward, not self-pleasing, not easily angered, not given to wine, not violent, not greedy for dishonest gain; +\v 8 but given to hospitality, a lover of good, sober minded, fair, holy, self-controlled, +\v 9 holding to the faithful word which is according to the teaching, that he may be able to exhort in the sound doctrine, and to convict those who contradict him. +\p +\v 10 For there are also many unruly men, vain talkers and deceivers, especially those of the circumcision, +\v 11 whose mouths must be stopped: men who overthrow whole houses, teaching things which they ought not, for dishonest gain’s sake. +\v 12 One of them, a prophet of their own, said, “Cretans are always liars, evil beasts, and idle gluttons.” +\v 13 This testimony is true. For this cause, reprove them sharply, that they may be sound in the faith, +\v 14 not paying attention to Jewish fables and commandments of men who turn away from the truth. +\v 15 To the pure, all things are pure, but to those who are defiled and unbelieving, nothing is pure; but both their mind and their conscience are defiled. +\v 16 They profess that they know God, but by their deeds they deny him, being abominable, disobedient, and unfit for any good work. +\c 2 +\p +\v 1 But say the things which fit sound doctrine, +\v 2 that older men should be temperate, sensible, sober minded, sound in faith, in love, and in perseverance, +\v 3 and that older women likewise be reverent in behavior, not slanderers nor enslaved to much wine, teachers of that which is good, +\v 4 that they may train the young wives to love their husbands, to love their children, +\v 5 to be sober minded, chaste, workers at home, kind, being in subjection to their own husbands, that God’s word may not be blasphemed. +\p +\v 6 Likewise, exhort the younger men to be sober minded. +\v 7 In all things show yourself an example of good works. In your teaching, show integrity, seriousness, incorruptibility, +\v 8 and soundness of speech that can’t be condemned, that he who opposes you may be ashamed, having no evil thing to say about us. +\p +\v 9 Exhort servants to be in subjection to their own masters and to be well-pleasing in all things, not contradicting, +\v 10 not stealing, but showing all good fidelity, that they may adorn the doctrine of God, our Savior, in all things. +\v 11 For the grace of God has appeared, bringing salvation to all men, +\v 12 instructing us to the intent that, denying ungodliness and worldly lusts, we would live soberly, righteously, and godly in this present age; +\v 13 looking for the blessed hope and appearing of the glory of our great God and Savior, Jesus Christ, +\v 14 who gave himself for us, that he might redeem us from all iniquity and purify for himself a people for his own possession, zealous for good works. +\p +\v 15 Say these things and exhort and reprove with all authority. Let no one despise you. +\c 3 +\p +\v 1 Remind them to be in subjection to rulers and to authorities, to be obedient, to be ready for every good work, +\v 2 to speak evil of no one, not to be contentious, to be gentle, showing all humility toward all men. +\v 3 For we were also once foolish, disobedient, deceived, serving various lusts and pleasures, living in malice and envy, hateful, and hating one another. +\v 4 But when the kindness of God our Savior and his love toward mankind appeared, +\v 5 not by works of righteousness which we did ourselves, but according to his mercy, he saved us through the washing of regeneration and renewing by the Holy Spirit, +\v 6 whom he poured out on us richly through Jesus Christ our Savior; +\v 7 that being justified by his grace, we might be made heirs according to the hope of eternal life. +\v 8 This saying is faithful, and concerning these things I desire that you insist confidently, so that those who have believed God may be careful to maintain good works. These things are good and profitable to men; +\v 9 but shun foolish questionings, genealogies, strife, and disputes about the law; for they are unprofitable and vain. +\v 10 Avoid a factious man after a first and second warning, +\v 11 knowing that such a one is perverted and sinful, being self-condemned. +\p +\v 12 When I send Artemas to you, or Tychicus, be diligent to come to me to Nicopolis, for I have determined to winter there. +\v 13 Send Zenas the lawyer and Apollos on their journey speedily, that nothing may be lacking for them. +\v 14 Let our people also learn to maintain good works to meet necessary needs, that they may not be unfruitful. +\p +\v 15 All who are with me greet you. Greet those who love us in faith. +\p Grace be with you all. Amen. diff --git a/c-sharp/assets/WEB/58PHMengWEBUS.SFM b/c-sharp/assets/WEB/58PHMengWEBUS.SFM new file mode 100644 index 0000000000..dcc9f106f0 --- /dev/null +++ b/c-sharp/assets/WEB/58PHMengWEBUS.SFM @@ -0,0 +1,41 @@ +\id PHM 57-PHM-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Philemon +\toc1 Paul’s Letter to Philemon +\toc2 Philemon +\toc3 Philemon +\mt1 Paul’s Letter to Philemon +\c 1 +\p +\v 1 Paul, a prisoner of Christ\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* Jesus, and Timothy our brother, to Philemon, our beloved fellow worker, +\v 2 to the beloved Apphia, to Archippus our fellow soldier, and to the assembly in your house: +\v 3 Grace to you and peace from God our Father and the Lord Jesus Christ. +\p +\v 4 I thank my God always, making mention of you in my prayers, +\v 5 hearing of your love and of the faith which you have toward the Lord Jesus and toward all the saints, +\v 6 that the fellowship of your faith may become effective in the knowledge of every good thing which is in us in Christ Jesus. +\v 7 For we have much joy and comfort in your love, because the hearts of the saints have been refreshed through you, brother. +\p +\v 8 Therefore though I have all boldness in Christ to command you that which is appropriate, +\v 9 yet for love’s sake I rather appeal to you, being such a one as Paul, the aged, but also a prisoner of Jesus Christ. +\v 10 I appeal to you for my child Onesimus, whom I have become the father of in my chains,\f + \fr 1:10 \ft Onesimus means “useful”.\f* +\v 11 who once was useless to you, but now is useful to you and to me. +\v 12 I am sending him back. Therefore receive him, that is, my own heart, +\v 13 whom I desired to keep with me, that on your behalf he might serve me in my chains for the Good News. +\v 14 But I was willing to do nothing without your consent, that your goodness would not be as of necessity, but of free will. +\v 15 For perhaps he was therefore separated from you for a while that you would have him forever, +\v 16 no longer as a slave, but more than a slave, a beloved brother—especially to me, but how much rather to you, both in the flesh and in the Lord. +\p +\v 17 If then you count me a partner, receive him as you would receive me. +\v 18 But if he has wronged you at all or owes you anything, put that to my account. +\v 19 I, Paul, write this with my own hand: I will repay it (not to mention to you that you owe to me even your own self besides). +\v 20 Yes, brother, let me have joy from you in the Lord. Refresh my heart in the Lord. +\p +\v 21 Having confidence in your obedience, I write to you, knowing that you will do even beyond what I say. +\p +\v 22 Also, prepare a guest room for me, for I hope that through your prayers I will be restored to you. +\p +\v 23 Epaphras, my fellow prisoner in Christ Jesus, greets you, +\v 24 as do Mark, Aristarchus, Demas, and Luke, my fellow workers. +\p +\v 25 The grace of our Lord Jesus Christ be with your spirit. Amen. diff --git a/c-sharp/assets/WEB/59HEBengWEBUS.SFM b/c-sharp/assets/WEB/59HEBengWEBUS.SFM new file mode 100644 index 0000000000..84e596773d --- /dev/null +++ b/c-sharp/assets/WEB/59HEBengWEBUS.SFM @@ -0,0 +1,497 @@ +\id HEB 58-HEB-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Hebrews +\toc1 The Letter to the Hebrews +\toc2 Hebrews +\toc3 Hebrews +\mt1 The Letter to the Hebrews +\c 1 +\p +\v 1 God, having in the past spoken to the fathers through the prophets at many times and in various ways, +\v 2 has at the end of these days spoken to us by his Son, whom he appointed heir of all things, through whom also he made the worlds. +\v 3 His Son is the radiance of his glory, the very image of his substance, and upholding all things by the word of his power, who, when he had by himself purified us of our sins, sat down on the right hand of the Majesty on high, +\v 4 having become as much better than the angels as the more excellent name he has inherited is better than theirs. +\v 5 For to which of the angels did he say at any time, +\q1 “You are my Son. +\q2 Today I have become your father?”\x + \xo 1:5 \xt Psalm 2:7\x* +\m and again, +\q1 “I will be to him a Father, +\q2 and he will be to me a Son?”\x + \xo 1:5 \xt 2 Samuel 7:14; 1 Chronicles 17:13\x* +\p +\v 6 When he again brings in the firstborn into the world he says, “Let all the angels of God worship him.”\x + \xo 1:6 \xt Deuteronomy 32:43 LXX\x* +\v 7 Of the angels he says, +\q1 “He makes his angels winds, +\q2 and his servants a flame of fire.”\x + \xo 1:7 \xt Psalm 104:4\x* +\p +\v 8 But of the Son he says, +\q1 “Your throne, O God, is forever and ever. +\q2 The scepter of uprightness is the scepter of your Kingdom. +\q1 +\v 9 You have loved righteousness and hated iniquity; +\q2 therefore God, your God, has anointed you with the oil of gladness above your fellows.”\x + \xo 1:9 \xt Psalm 45:6-7\x* +\p +\v 10 And, +\q1 “You, Lord, in the beginning, laid the foundation of the earth. +\q2 The heavens are the works of your hands. +\q1 +\v 11 They will perish, but you continue. +\q2 They all will grow old like a garment does. +\q1 +\v 12 You will roll them up like a mantle, +\q2 and they will be changed; +\q2 but you are the same. +\q2 Your years won’t fail.”\x + \xo 1:12 \xt Psalm 102:25-27\x* +\p +\v 13 But which of the angels has he told at any time, +\q1 “Sit at my right hand, +\q2 until I make your enemies the footstool of your feet?”\x + \xo 1:13 \xt Psalm 110:1\x* +\p +\v 14 Aren’t they all serving spirits, sent out to do service for the sake of those who will inherit salvation? +\c 2 +\p +\v 1 Therefore we ought to pay greater attention to the things that were heard, lest perhaps we drift away. +\v 2 For if the word spoken through angels proved steadfast, and every transgression and disobedience received a just penalty, +\v 3 how will we escape if we neglect so great a salvation—which at the first having been spoken through the Lord, was confirmed to us by those who heard, +\v 4 God also testifying with them, both by signs and wonders, by various works of power, and by gifts of the Holy Spirit, according to his own will? +\p +\v 5 For he didn’t subject the world to come, of which we speak, to angels. +\v 6 But one has somewhere testified, saying, +\q1 “What is man, that you think of him? +\q2 Or the son of man, that you care for him? +\q1 +\v 7 You made him a little lower than the angels. +\q2 You crowned him with glory and honor.\f + \fr 2:7 \ft TR adds “and set him over the works of your hands”\f* +\q2 +\v 8 You have put all things in subjection under his feet.”\x + \xo 2:8 \xt Psalm 8:4-6 \x* +\p For in that he subjected all things to him, he left nothing that is not subject to him. But now we don’t yet see all things subjected to him. +\v 9 But we see him who has been made a little lower than the angels, Jesus, because of the suffering of death crowned with glory and honor, that by the grace of God he should taste of death for everyone. +\p +\v 10 For it became him, for whom are all things and through whom are all things, in bringing many children to glory, to make the author of their salvation perfect through sufferings. +\v 11 For both he who sanctifies and those who are sanctified are all from one, for which cause he is not ashamed to call them brothers,\f + \fr 2:11 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* +\v 12 saying, +\q1 “I will declare your name to my brothers. +\q2 Among the congregation I will sing your praise.”\x + \xo 2:12 \xt Psalm 22:22\x* +\p +\v 13 Again, “I will put my trust in him.” Again, “Behold, here I am with the children whom God has given me.”\x + \xo 2:13 \xt Isaiah 8:18\x* +\v 14 Since then the children have shared in flesh and blood, he also himself in the same way partook of the same, that through death he might bring to nothing him who had the power of death, that is, the devil, +\v 15 and might deliver all of them who through fear of death were all their lifetime subject to bondage. +\v 16 For most certainly, he doesn’t give help to angels, but he gives help to the offspring\f + \fr 2:16 \ft or, seed\f* of Abraham. +\v 17 Therefore he was obligated in all things to be made like his brothers, that he might become a merciful and faithful high priest in things pertaining to God, to make atonement for the sins of the people. +\v 18 For in that he himself has suffered being tempted, he is able to help those who are tempted. +\c 3 +\p +\v 1 Therefore, holy brothers, partakers of a heavenly calling, consider the Apostle and High Priest of our confession: Jesus, +\v 2 who was faithful to him who appointed him, as also Moses was in all his house. +\v 3 For he has been counted worthy of more glory than Moses, because he who built the house has more honor than the house. +\v 4 For every house is built by someone; but he who built all things is God. +\v 5 Moses indeed was faithful in all his house as a servant, for a testimony of those things which were afterward to be spoken, +\v 6 but Christ\f + \fr 3:6 \ft “Christ” means “Anointed One”.\f* is faithful as a Son over his house. We are his house, if we hold fast our confidence and the glorying of our hope firm to the end. +\v 7 Therefore, even as the Holy Spirit says, +\q1 “Today if you will hear his voice, +\q2 +\v 8 don’t harden your hearts as in the rebellion, +\q2 in the day of the trial in the wilderness, +\q2 +\v 9 where your fathers tested me and tried me, +\q2 and saw my deeds for forty years. +\q1 +\v 10 Therefore I was displeased with that generation, +\q2 and said, ‘They always err in their heart, +\q2 but they didn’t know my ways.’ +\q1 +\v 11 As I swore in my wrath, +\q2 ‘They will not enter into my rest.’”\x + \xo 3:11 \xt Psalm 95:7-11\x* +\p +\v 12 Beware, brothers, lest perhaps there might be in any one of you an evil heart of unbelief, in falling away from the living God; +\v 13 but exhort one another day by day, so long as it is called “today”, lest any one of you be hardened by the deceitfulness of sin. +\v 14 For we have become partakers of Christ, if we hold the beginning of our confidence firm to the end, +\v 15 while it is said, +\q1 “Today if you will hear his voice, +\q2 don’t harden your hearts, as in the rebellion.”\x + \xo 3:15 \xt Psalm 95:7-8\x* +\p +\v 16 For who, when they heard, rebelled? Wasn’t it all those who came out of Egypt led by Moses? +\v 17 With whom was he displeased forty years? Wasn’t it with those who sinned, whose bodies fell in the wilderness? +\v 18 To whom did he swear that they wouldn’t enter into his rest, but to those who were disobedient? +\v 19 We see that they weren’t able to enter in because of unbelief. +\c 4 +\p +\v 1 Let’s fear therefore, lest perhaps anyone of you should seem to have come short of a promise of entering into his rest. +\v 2 For indeed we have had good news preached to us, even as they also did, but the word they heard didn’t profit them, because it wasn’t mixed with faith by those who heard. +\v 3 For we who have believed do enter into that rest, even as he has said, “As I swore in my wrath, they will not enter into my rest;”\x + \xo 4:3 \xt Psalm 95:11 \x* although the works were finished from the foundation of the world. +\v 4 For he has said this somewhere about the seventh day, “God rested on the seventh day from all his works;”\x + \xo 4:4 \xt Genesis 2:2\x* +\v 5 and in this place again, “They will not enter into my rest.”\x + \xo 4:5 \xt Psalm 95:11\x* +\p +\v 6 Seeing therefore it remains that some should enter into it, and they to whom the good news was preached before failed to enter in because of disobedience, +\v 7 he again defines a certain day, “today”, saying through David so long a time afterward (just as has been said), +\q1 “Today if you will hear his voice, +\q2 don’t harden your hearts.”\x + \xo 4:7 \xt Psalm 95:7-8\x* +\p +\v 8 For if Joshua had given them rest, he would not have spoken afterward of another day. +\v 9 There remains therefore a Sabbath rest for the people of God. +\v 10 For he who has entered into his rest has himself also rested from his works, as God did from his. +\v 11 Let’s therefore give diligence to enter into that rest, lest anyone fall after the same example of disobedience. +\v 12 For the word of God is living and active, and sharper than any two-edged sword, piercing even to the dividing of soul and spirit, of both joints and marrow, and is able to discern the thoughts and intentions of the heart. +\v 13 There is no creature that is hidden from his sight, but all things are naked and laid open before the eyes of him to whom we must give an account. +\p +\v 14 Having then a great high priest who has passed through the heavens, Jesus, the Son of God, let’s hold tightly to our confession. +\v 15 For we don’t have a high priest who can’t be touched with the feeling of our infirmities, but one who has been in all points tempted like we are, yet without sin. +\v 16 Let’s therefore draw near with boldness to the throne of grace, that we may receive mercy and may find grace for help in time of need. +\c 5 +\p +\v 1 For every high priest, being taken from among men, is appointed for men in things pertaining to God, that he may offer both gifts and sacrifices for sins. +\v 2 The high priest can deal gently with those who are ignorant and going astray, because he himself is also surrounded with weakness. +\v 3 Because of this, he must offer sacrifices for sins for the people, as well as for himself. +\v 4 Nobody takes this honor on himself, but he is called by God, just like Aaron was. +\v 5 So also Christ didn’t glorify himself to be made a high priest, but it was he who said to him, +\q1 “You are my Son. +\q2 Today I have become your father.”\x + \xo 5:5 \xt Psalm 2:7\x* +\p +\v 6 As he says also in another place, +\q1 “You are a priest forever, +\q2 after the order of Melchizedek.”\x + \xo 5:6 \xt Psalm 110:4\x* +\p +\v 7 He, in the days of his flesh, having offered up prayers and petitions with strong crying and tears to him who was able to save him from death, and having been heard for his godly fear, +\v 8 though he was a Son, yet learned obedience by the things which he suffered. +\v 9 Having been made perfect, he became to all of those who obey him the author of eternal salvation, +\v 10 named by God a high priest after the order of Melchizedek. +\p +\v 11 About him we have many words to say, and hard to interpret, seeing you have become dull of hearing. +\v 12 For although by this time you should be teachers, you again need to have someone teach you the rudiments of the first principles of the revelations of God. You have come to need milk, and not solid food. +\v 13 For everyone who lives on milk is not experienced in the word of righteousness, for he is a baby. +\v 14 But solid food is for those who are full grown, who by reason of use have their senses exercised to discern good and evil. +\c 6 +\p +\v 1 Therefore leaving the teaching of the first principles of Christ, let’s press on to perfection—not laying again a foundation of repentance from dead works, of faith toward God, +\v 2 of the teaching of baptisms, of laying on of hands, of resurrection of the dead, and of eternal judgment. +\v 3 This will we do, if God permits. +\v 4 For concerning those who were once enlightened and tasted of the heavenly gift, and were made partakers of the Holy Spirit, +\v 5 and tasted the good word of God and the powers of the age to come, +\v 6 and then fell away, it is impossible to renew them again to repentance; seeing they crucify the Son of God for themselves again, and put him to open shame. +\v 7 For the land which has drunk the rain that comes often on it and produces a crop suitable for them for whose sake it is also tilled, receives blessing from God; +\v 8 but if it bears thorns and thistles, it is rejected and near being cursed, whose end is to be burned. +\p +\v 9 But, beloved, we are persuaded of better things for you, and things that accompany salvation, even though we speak like this. +\v 10 For God is not unrighteous, so as to forget your work and the labor of love which you showed toward his name, in that you served the saints, and still do serve them. +\v 11 We desire that each one of you may show the same diligence to the fullness of hope even to the end, +\v 12 that you won’t be sluggish, but imitators of those who through faith and perseverance inherited the promises. +\p +\v 13 For when God made a promise to Abraham, since he could swear by no one greater, he swore by himself, +\v 14 saying, “Surely blessing I will bless you, and multiplying I will multiply you.”\x + \xo 6:14 \xt Genesis 22:17\x* +\v 15 Thus, having patiently endured, he obtained the promise. +\v 16 For men indeed swear by a greater one, and in every dispute of theirs the oath is final for confirmation. +\v 17 In this way God, being determined to show more abundantly to the heirs of the promise the immutability of his counsel, interposed with an oath, +\v 18 that by two immutable things, in which it is impossible for God to lie, we may have a strong encouragement, who have fled for refuge to take hold of the hope set before us. +\v 19 This hope we have as an anchor of the soul, a hope both sure and steadfast and entering into that which is within the veil, +\v 20 where as a forerunner Jesus entered for us, having become a high priest forever after the order of Melchizedek. +\c 7 +\p +\v 1 For this Melchizedek, king of Salem, priest of God Most High, who met Abraham returning from the slaughter of the kings and blessed him, +\v 2 to whom also Abraham divided a tenth part of all (being first, by interpretation, “king of righteousness”, and then also “king of Salem”, which means “king of peace”, +\v 3 without father, without mother, without genealogy, having neither beginning of days nor end of life, but made like the Son of God), remains a priest continually. +\p +\v 4 Now consider how great this man was, to whom even Abraham the patriarch gave a tenth out of the best plunder. +\v 5 They indeed of the sons of Levi who receive the priest’s office have a commandment to take tithes from the people according to the law, that is, of their brothers, though these have come out of the body of Abraham, +\v 6 but he whose genealogy is not counted from them has accepted tithes from Abraham, and has blessed him who has the promises. +\v 7 But without any dispute the lesser is blessed by the greater. +\v 8 Here people who die receive tithes, but there one receives tithes of whom it is testified that he lives. +\v 9 We can say that through Abraham even Levi, who receives tithes, has paid tithes, +\v 10 for he was yet in the body of his father when Melchizedek met him. +\p +\v 11 Now if perfection was through the Levitical priesthood (for under it the people have received the law), what further need was there for another priest to arise after the order of Melchizedek, and not be called after the order of Aaron? +\v 12 For the priesthood being changed, there is of necessity a change made also in the law. +\v 13 For he of whom these things are said belongs to another tribe, from which no one has officiated at the altar. +\v 14 For it is evident that our Lord has sprung out of Judah, about which tribe Moses spoke nothing concerning priesthood. +\v 15 This is yet more abundantly evident, if after the likeness of Melchizedek there arises another priest, +\v 16 who has been made, not after the law of a fleshly commandment, but after the power of an endless life; +\v 17 for it is testified, +\q1 “You are a priest forever, +\q2 according to the order of Melchizedek.”\x + \xo 7:17 \xt Psalm 110:4\x* +\p +\v 18 For there is an annulling of a foregoing commandment because of its weakness and uselessness +\v 19 (for the law made nothing perfect), and a bringing in of a better hope, through which we draw near to God. +\v 20 Inasmuch as he was not made priest without the taking of an oath +\v 21 (for they indeed have been made priests without an oath), but he with an oath by him that says of him, +\q1 “The Lord swore and will not change his mind, +\q2 ‘You are a priest forever, +\q2 according to the order of Melchizedek.’”\x + \xo 7:21 \xt Psalm 110:4\x* +\p +\v 22 By so much, Jesus has become the guarantee of a better covenant. +\p +\v 23 Many, indeed, have been made priests, because they are hindered from continuing by death. +\v 24 But he, because he lives forever, has his priesthood unchangeable. +\v 25 Therefore he is also able to save to the uttermost those who draw near to God through him, seeing that he lives forever to make intercession for them. +\p +\v 26 For such a high priest was fitting for us: holy, guiltless, undefiled, separated from sinners, and made higher than the heavens; +\v 27 who doesn’t need, like those high priests, to offer up sacrifices daily, first for his own sins, and then for the sins of the people. For he did this once for all, when he offered up himself. +\v 28 For the law appoints men as high priests who have weakness, but the word of the oath, which came after the law, appoints a Son forever who has been perfected. +\c 8 +\p +\v 1 Now in the things which we are saying, the main point is this: we have such a high priest, who sat down on the right hand of the throne of the Majesty in the heavens, +\v 2 a servant of the sanctuary and of the true tabernacle which the Lord pitched, not man. +\v 3 For every high priest is appointed to offer both gifts and sacrifices. Therefore it is necessary that this high priest also have something to offer. +\v 4 For if he were on earth, he would not be a priest at all, seeing there are priests who offer the gifts according to the law, +\v 5 who serve a copy and shadow of the heavenly things, even as Moses was warned by God when he was about to make the tabernacle, for he said, “See, you shall make everything according to the pattern that was shown to you on the mountain.”\x + \xo 8:5 \xt Exodus 25:40\x* +\v 6 But now he has obtained a more excellent ministry, by as much as he is also the mediator of a better covenant, which on better promises has been given as law. +\p +\v 7 For if that first covenant had been faultless, then no place would have been sought for a second. +\v 8 For finding fault with them, he said, +\q1 “Behold,\f + \fr 8:8 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the days are coming”, says the Lord, +\q2 “that I will make a new covenant with the house of Israel and with the house of Judah; +\q1 +\v 9 not according to the covenant that I made with their fathers +\q2 in the day that I took them by the hand to lead them out of the land of Egypt; +\q1 for they didn’t continue in my covenant, +\q2 and I disregarded them,” says the Lord. +\q1 +\v 10 “For this is the covenant that I will make with the house of Israel +\q2 after those days,” says the Lord: +\q1 “I will put my laws into their mind; +\q2 I will also write them on their heart. +\q1 I will be their God, +\q2 and they will be my people. +\q1 +\v 11 They will not teach every man his fellow citizen\f + \fr 8:11 \ft TR reads “neighbor” instead of “fellow citizen”\f* +\q2 and every man his brother, saying, ‘Know the Lord,’ +\q2 for all will know me, +\q2 from their least to their greatest. +\q1 +\v 12 For I will be merciful to their unrighteousness. +\q2 I will remember their sins and lawless deeds no more.”\x + \xo 8:12 \xt Jeremiah 31:31-34\x* +\p +\v 13 In that he says, “A new covenant”, he has made the first obsolete. But that which is becoming obsolete and grows aged is near to vanishing away. +\c 9 +\p +\v 1 Now indeed even the first\f + \fr 9:1 \ft TR adds “tabernacle”\f* covenant had ordinances of divine service and an earthly sanctuary. +\v 2 For a tabernacle was prepared. In the first part were the lamp stand, the table, and the show bread, which is called the Holy Place. +\v 3 After the second veil was the tabernacle which is called the Holy of Holies, +\v 4 having a golden altar of incense and the ark of the covenant overlaid on all sides with gold, in which was a golden pot holding the manna, Aaron’s rod that budded, and the tablets of the covenant; +\v 5 and above it cherubim of glory overshadowing the mercy seat, of which things we can’t speak now in detail. +\p +\v 6 Now these things having been thus prepared, the priests go in continually into the first tabernacle, accomplishing the services, +\v 7 but into the second the high priest alone, once in the year, not without blood, which he offers for himself and for the errors of the people. +\v 8 The Holy Spirit is indicating this, that the way into the Holy Place wasn’t yet revealed while the first tabernacle was still standing. +\v 9 This is a symbol of the present age, where gifts and sacrifices are offered that are incapable, concerning the conscience, of making the worshiper perfect, +\v 10 being only (with foods and drinks and various washings) fleshly ordinances, imposed until a time of reformation. +\p +\v 11 But Christ having come as a high priest of the coming good things, through the greater and more perfect tabernacle, not made with hands, that is to say, not of this creation, +\v 12 nor yet through the blood of goats and calves, but through his own blood, entered in once for all into the Holy Place, having obtained eternal redemption. +\v 13 For if the blood of goats and bulls, and the ashes of a heifer sprinkling those who have been defiled, sanctify to the cleanness of the flesh, +\v 14 how much more will the blood of Christ, who through the eternal Spirit offered himself without defect to God, cleanse your conscience from dead works to serve the living God? +\v 15 For this reason he is the mediator of a new covenant, since a death has occurred for the redemption of the transgressions that were under the first covenant, that those who have been called may receive the promise of the eternal inheritance. +\v 16 For where a last will and testament is, there must of necessity be the death of him who made it. +\v 17 For a will is in force where there has been death, for it is never in force while he who made it lives. +\v 18 Therefore even the first covenant has not been dedicated without blood. +\v 19 For when every commandment had been spoken by Moses to all the people according to the law, he took the blood of the calves and the goats, with water and scarlet wool and hyssop, and sprinkled both the book itself and all the people, +\v 20 saying, “This is the blood of the covenant which God has commanded you.”\x + \xo 9:20 \xt Exodus 24:8\x* +\p +\v 21 He sprinkled the tabernacle and all the vessels of the ministry in the same way with the blood. +\v 22 According to the law, nearly everything is cleansed with blood, and apart from shedding of blood there is no remission. +\p +\v 23 It was necessary therefore that the copies of the things in the heavens should be cleansed with these, but the heavenly things themselves with better sacrifices than these. +\v 24 For Christ hasn’t entered into holy places made with hands, which are representations of the true, but into heaven itself, now to appear in the presence of God for us; +\v 25 nor yet that he should offer himself often, as the high priest enters into the holy place year by year with blood not his own, +\v 26 or else he must have suffered often since the foundation of the world. But now once at the end of the ages, he has been revealed to put away sin by the sacrifice of himself. +\v 27 Inasmuch as it is appointed for men to die once, and after this, judgment, +\v 28 so Christ also, having been offered once to bear the sins of many, will appear a second time, not to deal with sin, but to save those who are eagerly waiting for him. +\c 10 +\p +\v 1 For the law, having a shadow of the good to come, not the very image of the things, can never with the same sacrifices year by year, which they offer continually, make perfect those who draw near. +\v 2 Or else wouldn’t they have ceased to be offered, because the worshipers, having been once cleansed, would have had no more consciousness of sins? +\v 3 But in those sacrifices there is a yearly reminder of sins. +\v 4 For it is impossible that the blood of bulls and goats should take away sins. +\v 5 Therefore when he comes into the world, he says, +\q1 “You didn’t desire sacrifice and offering, +\q2 but you prepared a body for me. +\q1 +\v 6 You had no pleasure in whole burnt offerings and sacrifices for sin. +\q2 +\v 7 Then I said, ‘Behold, I have come (in the scroll of the book it is written of me) +\q2 to do your will, O God.’”\x + \xo 10:7 \xt Psalm 40:6-8\x* +\p +\v 8 Previously saying, “Sacrifices and offerings and whole burnt offerings and sacrifices for sin you didn’t desire, neither had pleasure in them” (those which are offered according to the law), +\v 9 then he has said, “Behold, I have come to do your will.” He takes away the first, that he may establish the second, +\v 10 by which will we have been sanctified through the offering of the body of Jesus Christ once for all. +\p +\v 11 Every priest indeed stands day by day serving and offering often the same sacrifices, which can never take away sins, +\v 12 but he, when he had offered one sacrifice for sins forever, sat down on the right hand of God, +\v 13 from that time waiting until his enemies are made the footstool of his feet. +\v 14 For by one offering he has perfected forever those who are being sanctified. +\v 15 The Holy Spirit also testifies to us, for after saying, +\q1 +\v 16 “This is the covenant that I will make with them +\q2 after those days,” says the Lord, +\q1 “I will put my laws on their heart, +\q2 I will also write them on their mind;”\x + \xo 10:16 \xt Jeremiah 31:33\x* +\p then he says, +\q1 +\v 17 “I will remember their sins and their iniquities no more.”\x + \xo 10:17 \xt Jeremiah 31:34\x* +\p +\v 18 Now where remission of these is, there is no more offering for sin. +\p +\v 19 Having therefore, brothers, boldness to enter into the holy place by the blood of Jesus, +\v 20 by the way which he dedicated for us, a new and living way, through the veil, that is to say, his flesh, +\v 21 and having a great priest over God’s house, +\v 22 let’s draw near with a true heart in fullness of faith, having our hearts sprinkled from an evil conscience and having our body washed with pure water, +\v 23 let’s hold fast the confession of our hope without wavering; for he who promised is faithful. +\p +\v 24 Let’s consider how to provoke one another to love and good works, +\v 25 not forsaking our own assembling together, as the custom of some is, but exhorting one another, and so much the more as you see the Day approaching. +\p +\v 26 For if we sin willfully after we have received the knowledge of the truth, there remains no more a sacrifice for sins, +\v 27 but a certain fearful expectation of judgment, and a fierceness of fire which will devour the adversaries. +\v 28 A man who disregards Moses’ law dies without compassion on the word of two or three witnesses. +\v 29 How much worse punishment do you think he will be judged worthy of who has trodden under foot the Son of God, and has counted the blood of the covenant with which he was sanctified an unholy thing, and has insulted the Spirit of grace? +\v 30 For we know him who said, “Vengeance belongs to me. I will repay,” says the Lord.\x + \xo 10:30 \xt Deuteronomy 32:35\x* Again, “The Lord will judge his people.”\x + \xo 10:30 \xt Deuteronomy 32:36; Psalm 135:14\x* +\v 31 It is a fearful thing to fall into the hands of the living God. +\p +\v 32 But remember the former days, in which, after you were enlightened, you endured a great struggle with sufferings: +\v 33 partly, being exposed to both reproaches and oppressions, and partly, becoming partakers with those who were treated so. +\v 34 For you both had compassion on me in my chains and joyfully accepted the plundering of your possessions, knowing that you have for yourselves a better possession and an enduring one in the heavens. +\v 35 Therefore don’t throw away your boldness, which has a great reward. +\v 36 For you need endurance so that, having done the will of God, you may receive the promise. +\q1 +\v 37 “In a very little while, +\q2 he who comes will come and will not wait. +\q1 +\v 38 But the righteous one will live by faith. +\q2 If he shrinks back, my soul has no pleasure in him.”\x + \xo 10:38 \xt Habakkuk 2:3-4\x* +\p +\v 39 But we are not of those who shrink back to destruction, but of those who have faith to the saving of the soul. +\c 11 +\p +\v 1 Now faith is assurance of things hoped for, proof of things not seen. +\v 2 For by this, the elders obtained approval. +\v 3 By faith we understand that the universe has been framed by the word of God, so that what is seen has not been made out of things which are visible. +\p +\v 4 By faith Abel offered to God a more excellent sacrifice than Cain, through which he had testimony given to him that he was righteous, God testifying with respect to his gifts; and through it he, being dead, still speaks. +\p +\v 5 By faith Enoch was taken away, so that he wouldn’t see death, and he was not found, because God translated him. For he has had testimony given to him that before his translation he had been well pleasing to God. +\v 6 Without faith it is impossible to be well pleasing to him, for he who comes to God must believe that he exists, and that he is a rewarder of those who seek him. +\p +\v 7 By faith Noah, being warned about things not yet seen, moved with godly fear,\f + \fr 11:7 \ft or, reverence\f* prepared a ship for the saving of his house, through which he condemned the world and became heir of the righteousness which is according to faith. +\p +\v 8 By faith Abraham, when he was called, obeyed to go out to the place which he was to receive for an inheritance. He went out, not knowing where he went. +\v 9 By faith he lived as an alien in the land of promise, as in a land not his own, dwelling in tents with Isaac and Jacob, the heirs with him of the same promise. +\v 10 For he was looking for the city which has foundations, whose builder and maker is God. +\p +\v 11 By faith even Sarah herself received power to conceive, and she bore a child when she was past age, since she counted him faithful who had promised. +\v 12 Therefore as many as the stars of the sky in multitude, and as innumerable as the sand which is by the sea shore, were fathered by one man, and him as good as dead. +\p +\v 13 These all died in faith, not having received the promises, but having seen\f + \fr 11:13 \ft TR adds “and being convinced of”\f* them and embraced them from afar, and having confessed that they were strangers and pilgrims on the earth. +\v 14 For those who say such things make it clear that they are seeking a country of their own. +\v 15 If indeed they had been thinking of that country from which they went out, they would have had enough time to return. +\v 16 But now they desire a better country, that is, a heavenly one. Therefore God is not ashamed of them, to be called their God, for he has prepared a city for them. +\p +\v 17 By faith, Abraham, being tested, offered up Isaac. Yes, he who had gladly received the promises was offering up his only born\f + \fr 11:17 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* son, +\v 18 to whom it was said, “Your offspring will be accounted as from Isaac,” \x + \xo 11:18 \xt Genesis 21:12\x* +\v 19 concluding that God is able to raise up even from the dead. Figuratively speaking, he also did receive him back from the dead. +\p +\v 20 By faith Isaac blessed Jacob and Esau, even concerning things to come. +\p +\v 21 By faith Jacob, when he was dying, blessed each of the sons of Joseph, and worshiped, leaning on the top of his staff. +\p +\v 22 By faith Joseph, when his end was near, made mention of the departure of the children of Israel, and gave instructions concerning his bones. +\p +\v 23 By faith Moses, when he was born, was hidden for three months by his parents, because they saw that he was a beautiful child; and they were not afraid of the king’s commandment. +\p +\v 24 By faith Moses, when he had grown up, refused to be called the son of Pharaoh’s daughter, +\v 25 choosing rather to share ill treatment with God’s people than to enjoy the pleasures of sin for a time, +\v 26 considering the reproach of Christ greater riches than the treasures of Egypt; for he looked to the reward. +\v 27 By faith he left Egypt, not fearing the wrath of the king; for he endured, as seeing him who is invisible. +\v 28 By faith he kept the Passover and the sprinkling of the blood, that the destroyer of the firstborn should not touch them. +\p +\v 29 By faith they passed through the Red Sea as on dry land. When the Egyptians tried to do so, they were swallowed up. +\p +\v 30 By faith the walls of Jericho fell down after they had been encircled for seven days. +\p +\v 31 By faith Rahab the prostitute didn’t perish with those who were disobedient, having received the spies in peace. +\p +\v 32 What more shall I say? For the time would fail me if I told of Gideon, Barak, Samson, Jephthah, David, Samuel, and the prophets— +\v 33 who through faith subdued kingdoms, worked out righteousness, obtained promises, stopped the mouths of lions,\x + \xo 11:33 \xt Daniel 6:22-23\x* +\v 34 quenched the power of fire,\x + \xo 11:34 \xt Daniel 3:1-30\x* escaped the edge of the sword,\x + \xo 11:34 \xt 1 Kings 19:1-3; 2 Kings 6:31—7:20\x* from weakness were made strong, grew mighty in war, and caused foreign armies to flee. +\v 35 Women received their dead by resurrection.\x + \xo 11:35 \xt 1 Kings 17:17-23; 2 Kings 4:32-37\x* Others were tortured, not accepting their deliverance, that they might obtain a better resurrection. +\v 36 Others were tried by mocking and scourging, yes, moreover by bonds and imprisonment. +\v 37 They were stoned.\x + \xo 11:37 \xt 2 Chronicles 24:20-21\x* They were sawn apart. They were tempted. They were slain with the sword.\x + \xo 11:37 \xt Jeremiah 26:20-23; 1 Kings 19:10\x* They went around in sheep skins and in goat skins; being destitute, afflicted, ill-treated— +\v 38 of whom the world was not worthy—wandering in deserts, mountains, caves, and the holes of the earth. +\p +\v 39 These all, having been commended for their faith, didn’t receive the promise, +\v 40 God having provided some better thing concerning us, so that apart from us they should not be made perfect. +\c 12 +\p +\v 1 Therefore let’s also, seeing we are surrounded by so great a cloud of witnesses, lay aside every weight and the sin which so easily entangles us, and let’s run with perseverance the race that is set before us, +\v 2 looking to Jesus, the author and perfecter of faith, who for the joy that was set before him endured the cross, despising its shame, and has sat down at the right hand of the throne of God. +\p +\v 3 For consider him who has endured such contradiction of sinners against himself, that you don’t grow weary, fainting in your souls. +\v 4 You have not yet resisted to blood, striving against sin. +\v 5 You have forgotten the exhortation which reasons with you as with children, +\q1 “My son, don’t take lightly the chastening of the Lord, +\q2 nor faint when you are reproved by him; +\q2 +\v 6 for whom the Lord loves, he disciplines, +\q2 and chastises every son whom he receives.”\x + \xo 12:6 \xt Proverbs 3:11-12\x* +\p +\v 7 It is for discipline that you endure. God deals with you as with children, for what son is there whom his father doesn’t discipline? +\v 8 But if you are without discipline, of which all have been made partakers, then you are illegitimate, and not children. +\v 9 Furthermore, we had the fathers of our flesh to chasten us, and we paid them respect. Shall we not much rather be in subjection to the Father of spirits and live? +\v 10 For they indeed for a few days disciplined us as seemed good to them, but he for our profit, that we may be partakers of his holiness. +\v 11 All chastening seems for the present to be not joyous but grievous; yet afterward it yields the peaceful fruit of righteousness to those who have been trained by it. +\v 12 Therefore lift up the hands that hang down and the feeble knees, \x + \xo 12:12 \xt Isaiah 35:3\x* +\v 13 and make straight paths for your feet,\x + \xo 12:13 \xt Proverbs 4:26\x* so what is lame may not be dislocated, but rather be healed. +\p +\v 14 Follow after peace with all men, and the sanctification without which no man will see the Lord, +\v 15 looking carefully lest there be any man who falls short of the grace of God, lest any root of bitterness springing up trouble you and many be defiled by it, +\v 16 lest there be any sexually immoral person or profane person, like Esau, who sold his birthright for one meal. +\v 17 For you know that even when he afterward desired to inherit the blessing, he was rejected, for he found no place for a change of mind though he sought it diligently with tears. +\p +\v 18 For you have not come to a mountain that might be touched and that burned with fire, and to blackness, darkness, storm, +\v 19 the sound of a trumpet, and the voice of words; which those who heard it begged that not one more word should be spoken to them, +\v 20 for they could not stand that which was commanded, “If even an animal touches the mountain, it shall be stoned”.\f + \fr 12:20 \ft TR adds “or shot with an arrow”\f*\x + \xo 12:20 \xt Exodus 19:12-13\x* +\v 21 So fearful was the appearance that Moses said, “I am terrified and trembling.”\x + \xo 12:21 \xt Deuteronomy 9:19\x* +\p +\v 22 But you have come to Mount Zion and to the city of the living God, the heavenly Jerusalem, and to innumerable multitudes of angels, +\v 23 to the festal gathering and assembly of the firstborn who are enrolled in heaven, to God the Judge of all, to the spirits of just men made perfect, +\v 24 to Jesus, the mediator of a new covenant,\x + \xo 12:24 \xt Jeremiah 31:31\x* and to the blood of sprinkling that speaks better than that of Abel. +\p +\v 25 See that you don’t refuse him who speaks. For if they didn’t escape when they refused him who warned on the earth, how much more will we not escape who turn away from him who warns from heaven, +\v 26 whose voice shook the earth then, but now he has promised, saying, “Yet once more I will shake not only the earth, but also the heavens.”\x + \xo 12:26 \xt Haggai 2:6\x* +\v 27 This phrase, “Yet once more” signifies the removing of those things that are shaken, as of things that have been made, that those things which are not shaken may remain. +\v 28 Therefore, receiving a Kingdom that can’t be shaken, let’s have grace, through which we serve God acceptably, with reverence and awe, +\v 29 for our God is a consuming fire.\x + \xo 12:29 \xt Deuteronomy 4:24\x* +\c 13 +\p +\v 1 Let brotherly love continue. +\v 2 Don’t forget to show hospitality to strangers, for in doing so, some have entertained angels without knowing it. +\v 3 Remember those who are in bonds, as bound with them, and those who are ill-treated, since you are also in the body. +\v 4 Let marriage be held in honor among all, and let the bed be undefiled; but God will judge the sexually immoral and adulterers. +\p +\v 5 Be free from the love of money, content with such things as you have, for he has said, “I will in no way leave you, neither will I in any way forsake you.”\x + \xo 13:5 \xt Deuteronomy 31:6\x* +\v 6 So that with good courage we say, +\q1 “The Lord is my helper. I will not fear. +\q2 What can man do to me?”\x + \xo 13:6 \xt Psalm 118:6-7\x* +\p +\v 7 Remember your leaders, men who spoke to you the word of God, and considering the results of their conduct, imitate their faith. +\v 8 Jesus Christ is the same yesterday, today, and forever. +\v 9 Don’t be carried away by various and strange teachings, for it is good that the heart be established by grace, not by foods, through which those who were so occupied were not benefited. +\p +\v 10 We have an altar from which those who serve the holy tabernacle have no right to eat. +\v 11 For the bodies of those animals, whose blood is brought into the holy place by the high priest as an offering for sin, are burned outside of the camp.\x + \xo 13:11 \xt Leviticus 16:27\x* +\v 12 Therefore Jesus also, that he might sanctify the people through his own blood, suffered outside of the gate. +\v 13 Let’s therefore go out to him outside of the camp, bearing his reproach. +\v 14 For we don’t have here an enduring city, but we seek that which is to come. +\v 15 Through him, then, let’s offer up a sacrifice of praise to God \x + \xo 13:15 \xt Psalm 50:23\x* continually, that is, the fruit of lips which proclaim allegiance to his name. +\v 16 But don’t forget to be doing good and sharing, for with such sacrifices God is well pleased. +\p +\v 17 Obey your leaders and submit to them, for they watch on behalf of your souls, as those who will give account, that they may do this with joy and not with groaning, for that would be unprofitable for you. +\p +\v 18 Pray for us, for we are persuaded that we have a good conscience, desiring to live honorably in all things. +\v 19 I strongly urge you to do this, that I may be restored to you sooner. +\p +\v 20 Now may the God of peace, who brought again from the dead the great shepherd of the sheep with the blood of an eternal covenant, our Lord Jesus, +\v 21 make you complete in every good work to do his will, working in you that which is well pleasing in his sight, through Jesus Christ, to whom be the glory forever and ever. Amen. +\p +\v 22 But I exhort you, brothers, endure the word of exhortation, for I have written to you in few words. +\v 23 Know that our brother Timothy has been freed, with whom, if he comes shortly, I will see you. +\p +\v 24 Greet all of your leaders and all the saints. The Italians greet you. +\p +\v 25 Grace be with you all. Amen. diff --git a/c-sharp/assets/WEB/60JASengWEBUS.SFM b/c-sharp/assets/WEB/60JASengWEBUS.SFM new file mode 100644 index 0000000000..6028285001 --- /dev/null +++ b/c-sharp/assets/WEB/60JASengWEBUS.SFM @@ -0,0 +1,144 @@ +\id JAS 59-JAS-web.sfm World English Bible (WEB) +\ide UTF-8 +\h James +\toc1 The Letter from James +\toc2 James +\toc3 James +\mt1 The Letter from James +\c 1 +\p +\v 1 James, a servant of God and of the Lord Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* to the twelve tribes which are in the Dispersion: Greetings. +\p +\v 2 Count it all joy, my brothers,\f + \fr 1:2 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* when you fall into various temptations, +\v 3 knowing that the testing of your faith produces endurance. +\v 4 Let endurance have its perfect work, that you may be perfect and complete, lacking in nothing. +\p +\v 5 But if any of you lacks wisdom, let him ask of God, who gives to all liberally and without reproach, and it will be given to him. +\v 6 But let him ask in faith, without any doubting, for he who doubts is like a wave of the sea, driven by the wind and tossed. +\v 7 For that man shouldn’t think that he will receive anything from the Lord. +\v 8 He is a double-minded man, unstable in all his ways. +\p +\v 9 Let the brother in humble circumstances glory in his high position; +\v 10 and the rich, in that he is made humble, because like the flower in the grass, he will pass away. +\v 11 For the sun arises with the scorching wind and withers the grass; and the flower in it falls, and the beauty of its appearance perishes. So the rich man will also fade away in his pursuits. +\p +\v 12 Blessed is a person who endures temptation, for when he has been approved, he will receive the crown of life which the Lord promised to those who love him. +\p +\v 13 Let no man say when he is tempted, “I am tempted by God,” for God can’t be tempted by evil, and he himself tempts no one. +\v 14 But each one is tempted when he is drawn away by his own lust and enticed. +\v 15 Then the lust, when it has conceived, bears sin. The sin, when it is full grown, produces death. +\v 16 Don’t be deceived, my beloved brothers. +\v 17 Every good gift and every perfect gift is from above, coming down from the Father of lights, with whom can be no variation nor turning shadow. +\v 18 Of his own will he gave birth to us by the word of truth, that we should be a kind of first fruits of his creatures. +\p +\v 19 So, then, my beloved brothers, let every man be swift to hear, slow to speak, and slow to anger; +\v 20 for the anger of man doesn’t produce the righteousness of God. +\v 21 Therefore, putting away all filthiness and overflowing of wickedness, receive with humility the implanted word, which is able to save your souls.\f + \fr 1:21 \ft or, preserve your life.\f* +\p +\v 22 But be doers of the word, and not only hearers, deluding your own selves. +\v 23 For if anyone is a hearer of the word and not a doer, he is like a man looking at his natural face in a mirror; +\v 24 for he sees himself, and goes away, and immediately forgets what kind of man he was. +\v 25 But he who looks into the perfect law of freedom and continues, not being a hearer who forgets but a doer of the work, this man will be blessed in what he does. +\p +\v 26 If anyone among you thinks himself to be religious while he doesn’t bridle his tongue, but deceives his heart, this man’s religion is worthless. +\v 27 Pure religion and undefiled before our God and Father is this: to visit the fatherless and widows in their affliction, and to keep oneself unstained by the world. +\c 2 +\p +\v 1 My brothers, don’t hold the faith of our glorious Lord Jesus Christ with partiality. +\v 2 For if a man with a gold ring, in fine clothing, comes into your synagogue,\f + \fr 2:2 \ft or, meeting\f* and a poor man in filthy clothing also comes in, +\v 3 and you pay special attention to him who wears the fine clothing and say, “Sit here in a good place;” and you tell the poor man, “Stand there,” or “Sit by my footstool” +\v 4 haven’t you shown partiality among yourselves, and become judges with evil thoughts? +\v 5 Listen, my beloved brothers. Didn’t God choose those who are poor in this world to be rich in faith and heirs of the Kingdom which he promised to those who love him? +\v 6 But you have dishonored the poor man. Don’t the rich oppress you and personally drag you before the courts? +\v 7 Don’t they blaspheme the honorable name by which you are called? +\p +\v 8 However, if you fulfill the royal law according to the Scripture, “You shall love your neighbor as yourself,”\x + \xo 2:8 \xt Leviticus 19:18\x* you do well. +\v 9 But if you show partiality, you commit sin, being convicted by the law as transgressors. +\v 10 For whoever keeps the whole law, and yet stumbles in one point, he has become guilty of all. +\v 11 For he who said, “Do not commit adultery,”\x + \xo 2:11 \xt Exodus 20:14; Deuteronomy 5:18\x* also said, “Do not commit murder.”\x + \xo 2:11 \xt Exodus 20:13; Deuteronomy 5:17 \x* Now if you do not commit adultery but do murder, you have become a transgressor of the law. +\v 12 So speak and so do as men who are to be judged by the law of freedom. +\v 13 For judgment is without mercy to him who has shown no mercy. Mercy triumphs over judgment. +\p +\v 14 What good is it, my brothers, if a man says he has faith, but has no works? Can faith save him? +\v 15 And if a brother or sister is naked and in lack of daily food, +\v 16 and one of you tells them, “Go in peace. Be warmed and filled;” yet you didn’t give them the things the body needs, what good is it? +\v 17 Even so faith, if it has no works, is dead in itself. +\v 18 Yes, a man will say, “You have faith, and I have works.” Show me your faith without works, and I will show you my faith by my works. +\p +\v 19 You believe that God is one. You do well. The demons also believe—and shudder. +\v 20 But do you want to know, vain man, that faith apart from works is dead? +\v 21 Wasn’t Abraham our father justified by works, in that he offered up Isaac his son on the altar? +\v 22 You see that faith worked with his works, and by works faith was perfected. +\v 23 So the Scripture was fulfilled which says, “Abraham believed God, and it was accounted to him as righteousness,”\x + \xo 2:23 \xt Genesis 15:6\x* and he was called the friend of God. +\v 24 You see then that by works a man is justified, and not only by faith. +\v 25 In the same way, wasn’t Rahab the prostitute also justified by works when she received the messengers and sent them out another way? +\v 26 For as the body apart from the spirit is dead, even so faith apart from works is dead. +\c 3 +\p +\v 1 Let not many of you be teachers, my brothers, knowing that we will receive heavier judgment. +\v 2 For we all stumble in many things. Anyone who doesn’t stumble in word is a perfect person, able to bridle the whole body also. +\v 3 Indeed, we put bits into the horses’ mouths so that they may obey us, and we guide their whole body. +\v 4 Behold,\f + \fr 3:4 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the ships also, though they are so big and are driven by fierce winds, are yet guided by a very small rudder, wherever the pilot desires. +\v 5 So the tongue is also a little member, and boasts great things. See how a small fire can spread to a large forest! +\v 6 And the tongue is a fire. The world of iniquity among our members is the tongue, which defiles the whole body, and sets on fire the course of nature, and is set on fire by Gehenna.\f + \fr 3:6 \ft or, Hell\f* +\v 7 For every kind of animal, bird, creeping thing, and sea creature is tamed, and has been tamed by mankind; +\v 8 but nobody can tame the tongue. It is a restless evil, full of deadly poison. +\v 9 With it we bless our God and Father, and with it we curse men who are made in the image of God. +\v 10 Out of the same mouth comes blessing and cursing. My brothers, these things ought not to be so. +\v 11 Does a spring send out from the same opening fresh and bitter water? +\v 12 Can a fig tree, my brothers, yield olives, or a vine figs? Thus no spring yields both salt water and fresh water. +\p +\v 13 Who is wise and understanding among you? Let him show by his good conduct that his deeds are done in gentleness of wisdom. +\v 14 But if you have bitter jealousy and selfish ambition in your heart, don’t boast and don’t lie against the truth. +\v 15 This wisdom is not that which comes down from above, but is earthly, sensual, and demonic. +\v 16 For where jealousy and selfish ambition are, there is confusion and every evil deed. +\v 17 But the wisdom that is from above is first pure, then peaceful, gentle, reasonable, full of mercy and good fruits, without partiality, and without hypocrisy. +\v 18 Now the fruit of righteousness is sown in peace by those who make peace. +\c 4 +\p +\v 1 Where do wars and fightings among you come from? Don’t they come from your pleasures that war in your members? +\v 2 You lust, and don’t have. You murder and covet, and can’t obtain. You fight and make war. You don’t have, because you don’t ask. +\v 3 You ask, and don’t receive, because you ask with wrong motives, so that you may spend it on your pleasures. +\v 4 You adulterers and adulteresses, don’t you know that friendship with the world is hostility toward God? Whoever therefore wants to be a friend of the world makes himself an enemy of God. +\v 5 Or do you think that the Scripture says in vain, “The Spirit who lives in us yearns jealously”? +\v 6 But he gives more grace. Therefore it says, “God resists the proud, but gives grace to the humble.”\x + \xo 4:6 \xt Proverbs 3:34\x* +\v 7 Be subject therefore to God. Resist the devil, and he will flee from you. +\v 8 Draw near to God, and he will draw near to you. Cleanse your hands, you sinners. Purify your hearts, you double-minded. +\v 9 Lament, mourn, and weep. Let your laughter be turned to mourning and your joy to gloom. +\v 10 Humble yourselves in the sight of the Lord, and he will exalt you. +\p +\v 11 Don’t speak against one another, brothers. He who speaks against a brother and judges his brother, speaks against the law and judges the law. But if you judge the law, you are not a doer of the law but a judge. +\v 12 Only one is the lawgiver, who is able to save and to destroy. But who are you to judge another? +\p +\v 13 Come now, you who say, “Today or tomorrow let’s go into this city and spend a year there, trade, and make a profit.” +\v 14 Yet you don’t know what your life will be like tomorrow. For what is your life? For you are a vapor that appears for a little time and then vanishes away. +\v 15 For you ought to say, “If the Lord wills, we will both live, and do this or that.” +\v 16 But now you glory in your boasting. All such boasting is evil. +\v 17 To him therefore who knows to do good and doesn’t do it, to him it is sin. +\c 5 +\p +\v 1 Come now, you rich, weep and howl for your miseries that are coming on you. +\v 2 Your riches are corrupted and your garments are moth-eaten. +\v 3 Your gold and your silver are corroded, and their corrosion will be for a testimony against you and will eat your flesh like fire. You have laid up your treasure in the last days. +\v 4 Behold, the wages of the laborers who mowed your fields, which you have kept back by fraud, cry out; and the cries of those who reaped have entered into the ears of the Lord of Armies.\f + \fr 5:4 \ft Greek: Sabaoth (for Hebrew: Tze’va’ot)\f* +\v 5 You have lived in luxury on the earth, and taken your pleasure. You have nourished your hearts as in a day of slaughter. +\v 6 You have condemned and you have murdered the righteous one. He doesn’t resist you. +\p +\v 7 Be patient therefore, brothers, until the coming of the Lord. Behold, the farmer waits for the precious fruit of the earth, being patient over it, until it receives the early and late rain. +\v 8 You also be patient. Establish your hearts, for the coming of the Lord is at hand. +\p +\v 9 Don’t grumble, brothers, against one another, so that you won’t be judged. Behold, the judge stands at the door. +\v 10 Take, brothers, for an example of suffering and of perseverance, the prophets who spoke in the name of the Lord. +\v 11 Behold, we call them blessed who endured. You have heard of the perseverance of Job and have seen the Lord in the outcome, and how the Lord is full of compassion and mercy. +\p +\v 12 But above all things, my brothers, don’t swear— not by heaven, or by the earth, or by any other oath; but let your “yes” be “yes”, and your “no”, “no”, so that you don’t fall into hypocrisy.\f + \fr 5:12 \ft TR reads “under judgment” instead of “into hypocrisy”\f* +\p +\v 13 Is any among you suffering? Let him pray. Is any cheerful? Let him sing praises. +\v 14 Is any among you sick? Let him call for the elders of the assembly, and let them pray over him, anointing him with oil in the name of the Lord; +\v 15 and the prayer of faith will heal him who is sick, and the Lord will raise him up. If he has committed sins, he will be forgiven. +\v 16 Confess your sins to one another and pray for one another, that you may be healed. The insistent prayer of a righteous person is powerfully effective. +\v 17 Elijah was a man with a nature like ours, and he prayed earnestly that it might not rain, and it didn’t rain on the earth for three years and six months. +\v 18 He prayed again, and the sky gave rain, and the earth produced its fruit. +\p +\v 19 Brothers, if any among you wanders from the truth and someone turns him back, +\v 20 let him know that he who turns a sinner from the error of his way will save a soul from death and will cover a multitude of sins. diff --git a/c-sharp/assets/WEB/611PEengWEBUS.SFM b/c-sharp/assets/WEB/611PEengWEBUS.SFM new file mode 100644 index 0000000000..9519c1dfb1 --- /dev/null +++ b/c-sharp/assets/WEB/611PEengWEBUS.SFM @@ -0,0 +1,162 @@ +\id 1PE 60-1PE-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 1 Peter +\toc1 Peter’s First Letter +\toc2 1 Peter +\toc3 1 Peter +\mt1 Peter’s First Letter +\c 1 +\p +\v 1 Peter, an apostle of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* to the chosen ones who are living as foreigners in the Dispersion in Pontus, Galatia, Cappadocia, Asia, and Bithynia, +\v 2 according to the foreknowledge of God the Father, in sanctification of the Spirit, that you may obey Jesus Christ and be sprinkled with his blood: Grace to you and peace be multiplied. +\p +\v 3 Blessed be the God and Father of our Lord Jesus Christ, who according to his great mercy caused us to be born again to a living hope through the resurrection of Jesus Christ from the dead, +\v 4 to an incorruptible and undefiled inheritance that doesn’t fade away, reserved in Heaven for you, +\v 5 who by the power of God are guarded through faith for a salvation ready to be revealed in the last time. +\v 6 In this you greatly rejoice, though now for a little while, if need be, you have been grieved in various trials, +\v 7 that the proof of your faith, which is more precious than gold that perishes, even though it is tested by fire, may be found to result in praise, glory, and honor at the revelation of Jesus Christ— +\v 8 whom, not having known, you love. In him, though now you don’t see him, yet believing, you rejoice greatly with joy that is unspeakable and full of glory, +\v 9 receiving the result of your faith, the salvation of your souls. +\p +\v 10 Concerning this salvation, the prophets sought and searched diligently. They prophesied of the grace that would come to you, +\v 11 searching for who or what kind of time the Spirit of Christ which was in them pointed to when he predicted the sufferings of Christ and the glories that would follow them. +\v 12 To them it was revealed that they served not themselves, but you, in these things, which now have been announced to you through those who preached the Good News to you by the Holy Spirit sent out from heaven; which things angels desire to look into. +\p +\v 13 Therefore prepare your minds for action.\f + \fr 1:13 \ft literally, “gird up the waist of your mind” or “put on the belt of the waist of your mind”\f* Be sober, and set your hope fully on the grace that will be brought to you at the revelation of Jesus Christ— +\v 14 as children of obedience, not conforming yourselves according to your former lusts as in your ignorance, +\v 15 but just as he who called you is holy, you yourselves also be holy in all of your behavior, +\v 16 because it is written, “You shall be holy, for I am holy.”\x + \xo 1:16 \xt Leviticus 11:44-45\x* +\p +\v 17 If you call on him as Father, who without respect of persons judges according to each man’s work, pass the time of your living as foreigners here in reverent fear, +\v 18 knowing that you were redeemed, not with corruptible things like silver or gold, from the useless way of life handed down from your fathers, +\v 19 but with precious blood, as of a lamb without blemish or spot, the blood of Christ, +\v 20 who was foreknown indeed before the foundation of the world, but was revealed in this last age for your sake, +\v 21 who through him are believers in God, who raised him from the dead and gave him glory, so that your faith and hope might be in God. +\p +\v 22 Seeing you have purified your souls in your obedience to the truth through the Spirit in sincere brotherly affection, love one another from the heart fervently, +\v 23 having been born again, not of corruptible seed, but of incorruptible, through the word of God, which lives and remains forever. +\v 24 For, +\q1 “All flesh is like grass, +\q2 and all of man’s glory like the flower in the grass. +\q1 The grass withers, and its flower falls; +\q2 +\v 25 but the Lord’s word endures forever.”\x + \xo 1:25 \xt Isaiah 40:6-8\x* +\p This is the word of Good News which was preached to you. +\c 2 +\p +\v 1 Putting away therefore all wickedness, all deceit, hypocrisies, envies, and all evil speaking, +\v 2 as newborn babies, long for the pure spiritual milk, that with it you may grow, +\v 3 if indeed you have tasted that the Lord is gracious. +\v 4 Come to him, a living stone, rejected indeed by men, but chosen by God, precious. +\v 5 You also as living stones are built up as a spiritual house, to be a holy priesthood, to offer up spiritual sacrifices, acceptable to God through Jesus Christ. +\v 6 Because it is contained in Scripture, +\q1 “Behold,\f + \fr 2:6 \ft “Behold”, from “הִנֵּה” or “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* I lay in Zion a chief cornerstone, chosen and precious. +\q2 He who believes in him will not be disappointed.”\x + \xo 2:6 \xt Isaiah 28:16 \x* +\p +\v 7 For you who believe therefore is the honor, but for those who are disobedient, +\q1 “The stone which the builders rejected +\q2 has become the chief cornerstone,”\x + \xo 2:7 \xt Psalm 118:22\x* +\p +\v 8 and, +\q1 “a stumbling stone and a rock of offense.”\x + \xo 2:8 \xt Isaiah 8:14\x* +\p For they stumble at the word, being disobedient, to which also they were appointed. +\v 9 But you are a chosen race, a royal priesthood, a holy nation, a people for God’s own possession, that you may proclaim the excellence of him who called you out of darkness into his marvelous light. +\v 10 In the past, you were not a people, but now are God’s people, who had not obtained mercy, but now have obtained mercy. +\p +\v 11 Beloved, I beg you as foreigners and pilgrims to abstain from fleshly lusts which war against the soul, +\v 12 having good behavior among the nations, so in that of which they speak against you as evildoers, they may see your good works and glorify God in the day of visitation. +\p +\v 13 Therefore subject yourselves to every ordinance of man for the Lord’s sake: whether to the king, as supreme, +\v 14 or to governors, as sent by him for vengeance on evildoers and for praise to those who do well. +\v 15 For this is the will of God, that by well-doing you should put to silence the ignorance of foolish men. +\v 16 Live as free people, yet not using your freedom for a cloak of wickedness, but as bondservants of God. +\p +\v 17 Honor all men. Love the brotherhood. Fear God. Honor the king. +\p +\v 18 Servants, be in subjection to your masters with all respect, not only to the good and gentle, but also to the wicked. +\v 19 For it is commendable if someone endures pain, suffering unjustly, because of conscience toward God. +\v 20 For what glory is it if, when you sin, you patiently endure beating? But if when you do well, you patiently endure suffering, this is commendable with God. +\v 21 For you were called to this, because Christ also suffered for us, leaving you\f + \fr 2:21 \ft TR reads “us” instead of “you”\f* an example, that you should follow his steps, +\v 22 who didn’t sin, “neither was deceit found in his mouth.”\x + \xo 2:22 \xt Isaiah 53:9\x* +\v 23 When he was cursed, he didn’t curse back. When he suffered, he didn’t threaten, but committed himself to him who judges righteously. +\v 24 He himself bore our sins in his body on the tree, that we, having died to sins, might live to righteousness. You were healed by his wounds.\f + \fr 2:24 \ft or, stripes\f* +\v 25 For you were going astray like sheep; but now you have returned to the Shepherd and Overseer\f + \fr 2:25 \ft “Overseer” is from the Greek ἐπίσκοπον, which can mean overseer, curator, guardian, or superintendent.\f* of your souls. +\c 3 +\p +\v 1 In the same way, wives, be in subjection to your own husbands, so that, even if any don’t obey the Word, they may be won by the behavior of their wives without a word, +\v 2 seeing your pure behavior in fear. +\v 3 Let your beauty come not from the outward adorning of braiding your hair, and of wearing gold ornaments or of putting on fine clothing, +\v 4 but from the hidden person of the heart, in the incorruptible adornment of a gentle and quiet spirit, which is very precious in God’s sight. +\v 5 For this is how in the past the holy women who hoped in God also adorned themselves, being in subjection to their own husbands. +\v 6 So Sarah obeyed Abraham, calling him lord, whose children you now are if you do well and are not put in fear by any terror. +\p +\v 7 You husbands, in the same way, live with your wives according to knowledge, giving honor to the woman as to the weaker vessel, as also being joint heirs of the grace of life, that your prayers may not be hindered. +\p +\v 8 Finally, all of you be like-minded, compassionate, loving as brothers, tenderhearted, courteous, +\v 9 not rendering evil for evil or insult for insult; but instead blessing, knowing that you were called to this, that you may inherit a blessing. +\v 10 For, +\q1 “He who would love life +\q2 and see good days, +\q1 let him keep his tongue from evil +\q2 and his lips from speaking deceit. +\q1 +\v 11 Let him turn away from evil and do good. +\q2 Let him seek peace and pursue it. +\q1 +\v 12 For the eyes of the Lord are on the righteous, +\q2 and his ears open to their prayer; +\q2 but the face of the Lord is against those who do evil.”\x + \xo 3:12 \xt Psalm 34:12-16\x* +\p +\v 13 Now who will harm you if you become imitators of that which is good? +\v 14 But even if you should suffer for righteousness’ sake, you are blessed. “Don’t fear what they fear, neither be troubled.”\x + \xo 3:14 \xt Isaiah 8:12\x* +\v 15 But sanctify the Lord God in your hearts. Always be ready to give an answer to everyone who asks you a reason concerning the hope that is in you, with humility and fear, +\v 16 having a good conscience. Thus, while you are spoken against as evildoers, they may be disappointed who curse your good way of life in Christ. +\v 17 For it is better, if it is God’s will, that you suffer for doing what is right than for doing evil. +\v 18 Because Christ also suffered for sins once, the righteous for the unrighteous, that he might bring you to God, being put to death in the flesh, but made alive in the Spirit, +\v 19 in whom he also went and preached to the spirits in prison, +\v 20 who before were disobedient when God waited patiently in the days of Noah while the ship was being built. In it, few, that is, eight souls, were saved through water. +\v 21 This is a symbol of baptism, which now saves you—not the putting away of the filth of the flesh, but the answer of a good conscience toward God—through the resurrection of Jesus Christ, +\v 22 who is at the right hand of God, having gone into heaven, angels and authorities and powers being made subject to him. +\c 4 +\p +\v 1 Therefore, since Christ suffered for us in the flesh, arm yourselves also with the same mind; for he who has suffered in the flesh has ceased from sin, +\v 2 that you no longer should live the rest of your time in the flesh for the lusts of men, but for the will of God. +\v 3 For we have spent enough of our past time doing the desire of the Gentiles, and having walked in lewdness, lusts, drunken binges, orgies, carousings, and abominable idolatries. +\v 4 They think it is strange that you don’t run with them into the same excess of riot, speaking evil of you. +\v 5 They will give account to him who is ready to judge the living and the dead. +\v 6 For to this end the Good News was preached even to the dead, that they might be judged indeed as men in the flesh, but live as to God in the spirit. +\p +\v 7 But the end of all things is near. Therefore be of sound mind, self-controlled, and sober in prayer. +\v 8 And above all things be earnest in your love among yourselves, for love covers a multitude of sins. +\v 9 Be hospitable to one another without grumbling. +\v 10 As each has received a gift, employ it in serving one another, as good managers of the grace of God in its various forms. +\v 11 If anyone speaks, let it be as it were the very words of God. If anyone serves, let it be as of the strength which God supplies, that in all things God may be glorified through Jesus Christ, to whom belong the glory and the dominion forever and ever. Amen. +\p +\v 12 Beloved, don’t be astonished at the fiery trial which has come upon you to test you, as though a strange thing happened to you. +\v 13 But because you are partakers of Christ’s sufferings, rejoice, that at the revelation of his glory you also may rejoice with exceeding joy. +\v 14 If you are insulted for the name of Christ, you are blessed, because the Spirit of glory and of God rests on you. On their part he is blasphemed, but on your part he is glorified. +\v 15 But let none of you suffer as a murderer, or a thief, or an evil doer, or a meddler in other men’s matters. +\v 16 But if one of you suffers for being a Christian, let him not be ashamed; but let him glorify God in this matter. +\v 17 For the time has come for judgment to begin with the household of God. If it begins first with us, what will happen to those who don’t obey the Good News of God? +\v 18 “If it is hard for the righteous to be saved, what will happen to the ungodly and the sinner?”\x + \xo 4:18 \xt Proverbs 11:31\x* +\v 19 Therefore let them also who suffer according to the will of God in doing good entrust their souls to him, as to a faithful Creator. +\c 5 +\p +\v 1 Therefore I exhort the elders among you, as a fellow elder and a witness of the sufferings of Christ, and who will also share in the glory that will be revealed: +\v 2 shepherd the flock of God which is among you, exercising the oversight, not under compulsion, but voluntarily; not for dishonest gain, but willingly; +\v 3 not as lording it over those entrusted to you, but making yourselves examples to the flock. +\v 4 When the chief Shepherd is revealed, you will receive the crown of glory that doesn’t fade away. +\p +\v 5 Likewise, you younger ones, be subject to the elder. Yes, all of you clothe yourselves with humility and subject yourselves to one another; for “God resists the proud, but gives grace to the humble.”\x + \xo 5:5 \xt Proverbs 3:34 \x* +\v 6 Humble yourselves therefore under the mighty hand of God, that he may exalt you in due time, +\v 7 casting all your worries on him, because he cares for you. +\p +\v 8 Be sober and self-controlled. Be watchful. Your adversary, the devil, walks around like a roaring lion, seeking whom he may devour. +\v 9 Withstand him steadfast in your faith, knowing that your brothers who are in the world are undergoing the same sufferings. +\v 10 But may the God of all grace, who called you to his eternal glory by Christ Jesus, after you have suffered a little while, perfect, establish, strengthen, and settle you. +\v 11 To him be the glory and the power forever and ever. Amen. +\p +\v 12 Through Silvanus, our faithful brother, as I consider him, I have written to you briefly, exhorting and testifying that this is the true grace of God in which you stand. +\v 13 She who is in Babylon, chosen together with you, greets you. So does Mark, my son. +\v 14 Greet one another with a kiss of love. +\p Peace be to all of you who are in Christ Jesus. Amen. diff --git a/c-sharp/assets/WEB/622PEengWEBUS.SFM b/c-sharp/assets/WEB/622PEengWEBUS.SFM new file mode 100644 index 0000000000..91412fce3f --- /dev/null +++ b/c-sharp/assets/WEB/622PEengWEBUS.SFM @@ -0,0 +1,82 @@ +\id 2PE 61-2PE-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 2 Peter +\toc1 Peter’s Second Letter +\toc2 2 Peter +\toc3 2 Peter +\mt1 Peter’s Second Letter +\c 1 +\p +\v 1 Simon Peter, a servant and apostle of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* to those who have obtained a like precious faith with us in the righteousness of our God and Savior, Jesus Christ: +\v 2 Grace to you and peace be multiplied in the knowledge of God and of Jesus our Lord, +\v 3 seeing that his divine power has granted to us all things that pertain to life and godliness, through the knowledge of him who called us by his own glory and virtue, +\v 4 by which he has granted to us his precious and exceedingly great promises; that through these you may become partakers of the divine nature, having escaped from the corruption that is in the world by lust. +\v 5 Yes, and for this very cause adding on your part all diligence, in your faith supply moral excellence; and in moral excellence, knowledge; +\v 6 and in knowledge, self-control; and in self-control, perseverance; and in perseverance, godliness; +\v 7 and in godliness, brotherly affection; and in brotherly affection, love. +\v 8 For if these things are yours and abound, they make you to not be idle or unfruitful in the knowledge of our Lord Jesus Christ. +\v 9 For he who lacks these things is blind, seeing only what is near, having forgotten the cleansing from his old sins. +\v 10 Therefore, brothers,\f + \fr 1:10 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.” \f* be more diligent to make your calling and election sure. For if you do these things, you will never stumble. +\v 11 For thus you will be richly supplied with the entrance into the eternal Kingdom of our Lord and Savior, Jesus Christ. +\p +\v 12 Therefore I will not be negligent to remind you of these things, though you know them and are established in the present truth. +\v 13 I think it right, as long as I am in this tent, to stir you up by reminding you, +\v 14 knowing that the putting off of my tent comes swiftly, even as our Lord Jesus Christ made clear to me. +\v 15 Yes, I will make every effort that you may always be able to remember these things even after my departure. +\p +\v 16 For we didn’t follow cunningly devised fables when we made known to you the power and coming of our Lord Jesus Christ, but we were eyewitnesses of his majesty. +\v 17 For he received from God the Father honor and glory when the voice came to him from the Majestic Glory, “This is my beloved Son, in whom I am well pleased.”\x + \xo 1:17 \xt Matthew 17:5; Mark 9:7; Luke 9:35\x* +\v 18 We heard this voice come out of heaven when we were with him on the holy mountain. +\p +\v 19 We have the more sure word of prophecy; and you do well that you heed it as to a lamp shining in a dark place, until the day dawns and the morning star arises in your hearts, +\v 20 knowing this first, that no prophecy of Scripture is of private interpretation. +\v 21 For no prophecy ever came by the will of man, but holy men of God spoke, being moved by the Holy Spirit. +\c 2 +\p +\v 1 But false prophets also arose among the people, as false teachers will also be among you, who will secretly bring in destructive heresies, denying even the Master who bought them, bringing on themselves swift destruction. +\v 2 Many will follow their immoral\f + \fr 2:2 \ft TR reads “destructive” instead of “immoral”\f* ways, and as a result, the way of the truth will be maligned. +\v 3 In covetousness they will exploit you with deceptive words: whose sentence now from of old doesn’t linger, and their destruction will not slumber. +\p +\v 4 For if God didn’t spare angels when they sinned, but cast them down to Tartarus,\f + \fr 2:4 \ft Tartarus is another name for Hell\f* and committed them to pits of darkness to be reserved for judgment; +\v 5 and didn’t spare the ancient world, but preserved Noah with seven others, a preacher of righteousness, when he brought a flood on the world of the ungodly, +\v 6 and turning the cities of Sodom and Gomorrah into ashes, condemned them to destruction, having made them an example to those who would live in an ungodly way, +\v 7 and delivered righteous Lot, who was very distressed by the lustful life of the wicked +\v 8 (for that righteous man dwelling among them was tormented in his righteous soul from day to day with seeing and hearing lawless deeds), +\v 9 then the Lord knows how to deliver the godly out of temptation and to keep the unrighteous under punishment for the day of judgment, +\v 10 but chiefly those who walk after the flesh in the lust of defilement and despise authority. Daring, self-willed, they are not afraid to speak evil of dignitaries, +\v 11 whereas angels, though greater in might and power, don’t bring a slanderous judgment against them before the Lord. +\v 12 But these, as unreasoning creatures, born natural animals to be taken and destroyed, speaking evil in matters about which they are ignorant, will in their destroying surely be destroyed, +\v 13 receiving the wages of unrighteousness; people who count it pleasure to revel in the daytime, spots and defects, reveling in their deceit while they feast with you; +\v 14 having eyes full of adultery, and who can’t cease from sin, enticing unsettled souls, having a heart trained in greed, accursed children! +\v 15 Forsaking the right way, they went astray, having followed the way of Balaam the son of Beor, who loved the wages of wrongdoing; +\v 16 but he was rebuked for his own disobedience. A speechless donkey spoke with a man’s voice and stopped the madness of the prophet. +\p +\v 17 These are wells without water, clouds driven by a storm, for whom the blackness of darkness has been reserved forever. +\v 18 For, uttering great swelling words of emptiness, they entice in the lusts of the flesh, by licentiousness, those who are indeed escaping from those who live in error; +\v 19 promising them liberty, while they themselves are bondservants of corruption; for a man is brought into bondage by whoever overcomes him. +\p +\v 20 For if, after they have escaped the defilement of the world through the knowledge of the Lord and Savior Jesus Christ, they are again entangled in it and overcome, the last state has become worse for them than the first. +\v 21 For it would be better for them not to have known the way of righteousness, than after knowing it, to turn back from the holy commandment delivered to them. +\v 22 But it has happened to them according to the true proverb, “The dog turns to his own vomit again,”\x + \xo 2:22 \xt Proverbs 26:11\x* and “the sow that has washed to wallowing in the mire.” +\c 3 +\p +\v 1 This is now, beloved, the second letter that I have written to you; and in both of them I stir up your sincere mind by reminding you +\v 2 that you should remember the words which were spoken before by the holy prophets and the commandment of us, the apostles of the Lord and Savior, +\v 3 knowing this first, that in the last days mockers will come, walking after their own lusts +\v 4 and saying, “Where is the promise of his coming? For, from the day that the fathers fell asleep, all things continue as they were from the beginning of the creation.” +\v 5 For they willfully forget that there were heavens from of old, and an earth formed out of water and amid water by the word of God, +\v 6 by which means the world that existed then, being overflowed with water, perished. +\v 7 But the heavens that exist now and the earth, by the same word have been stored up for fire, being reserved against the day of judgment and destruction of ungodly men. +\p +\v 8 But don’t forget this one thing, beloved, that one day is with the Lord as a thousand years, and a thousand years as one day. +\v 9 The Lord is not slow concerning his promise, as some count slowness; but he is patient with us, not wishing that anyone should perish, but that all should come to repentance. +\v 10 But the day of the Lord will come as a thief in the night, in which the heavens will pass away with a great noise, and the elements will be dissolved with fervent heat; and the earth and the works that are in it will be burned up. +\v 11 Therefore, since all these things will be destroyed like this, what kind of people ought you to be in holy living and godliness, +\v 12 looking for and earnestly desiring the coming of the day of God, which will cause the burning heavens to be dissolved, and the elements will melt with fervent heat? +\v 13 But, according to his promise, we look for new heavens and a new earth, in which righteousness dwells. +\p +\v 14 Therefore, beloved, seeing that you look for these things, be diligent to be found in peace, without defect and blameless in his sight. +\v 15 Regard the patience of our Lord as salvation; even as our beloved brother Paul also, according to the wisdom given to him, wrote to you, +\v 16 as also in all of his letters, speaking in them of these things. In those, there are some things that are hard to understand, which the ignorant and unsettled twist, as they also do to the other Scriptures, to their own destruction. +\v 17 You therefore, beloved, knowing these things beforehand, beware, lest being carried away with the error of the wicked, you fall from your own steadfastness. +\v 18 But grow in the grace and knowledge of our Lord and Savior Jesus Christ. To him be the glory both now and forever. Amen. diff --git a/c-sharp/assets/WEB/631JNengWEBUS.SFM b/c-sharp/assets/WEB/631JNengWEBUS.SFM new file mode 100644 index 0000000000..8e5c365a52 --- /dev/null +++ b/c-sharp/assets/WEB/631JNengWEBUS.SFM @@ -0,0 +1,148 @@ +\id 1JN 62-1JN-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 1 John +\toc1 John’s First Letter +\toc2 1 John +\toc3 1 John +\mt1 John’s First Letter +\c 1 +\p +\v 1 That which was from the beginning, that which we have heard, that which we have seen with our eyes, that which we saw, and our hands touched, concerning the Word of life +\v 2 (and the life was revealed, and we have seen, and testify, and declare to you the life, the eternal life, which was with the Father, and was revealed to us); +\v 3 that which we have seen and heard we declare to you, that you also may have fellowship with us. Yes, and our fellowship is with the Father and with his Son, Jesus Christ.\f + \fr 1:3 \ft “Christ” means “Anointed One”.\f* +\v 4 And we write these things to you, that our joy may be fulfilled. +\p +\v 5 This is the message which we have heard from him and announce to you, that God is light, and in him is no darkness at all. +\v 6 If we say that we have fellowship with him and walk in the darkness, we lie and don’t tell the truth. +\v 7 But if we walk in the light as he is in the light, we have fellowship with one another, and the blood of Jesus Christ his Son, cleanses us from all sin. +\v 8 If we say that we have no sin, we deceive ourselves, and the truth is not in us. +\v 9 If we confess our sins, he is faithful and righteous to forgive us the sins and to cleanse us from all unrighteousness. +\v 10 If we say that we haven’t sinned, we make him a liar, and his word is not in us. +\c 2 +\p +\v 1 My little children, I write these things to you so that you may not sin. If anyone sins, we have a Counselor\f + \fr 2:1 \ft Greek παρακλητον: Counselor, Helper, Intercessor, Advocate, and Comforter.\f* with the Father, Jesus Christ, the righteous. +\v 2 And he is the atoning sacrifice\f + \fr 2:2 \ft “atoning sacrifice” is from the Greek “ιλασμος”, an appeasing, propitiating, or the means of appeasement or propitiation—the sacrifice that turns away God’s wrath because of our sin. \f* for our sins, and not for ours only, but also for the whole world. +\v 3 This is how we know that we know him: if we keep his commandments. +\v 4 One who says, “I know him,” and doesn’t keep his commandments, is a liar, and the truth isn’t in him. +\v 5 But God’s love has most certainly been perfected in whoever keeps his word. This is how we know that we are in him: +\v 6 he who says he remains in him ought himself also to walk just like he walked. +\p +\v 7 Brothers, I write no new commandment to you, but an old commandment which you had from the beginning. The old commandment is the word which you heard from the beginning. +\v 8 Again, I write a new commandment to you, which is true in him and in you, because the darkness is passing away and the true light already shines. +\v 9 He who says he is in the light and hates his brother is in the darkness even until now. +\v 10 He who loves his brother remains in the light, and there is no occasion for stumbling in him. +\v 11 But he who hates his brother is in the darkness, and walks in the darkness, and doesn’t know where he is going, because the darkness has blinded his eyes. +\p +\v 12 I write to you, little children, because your sins are forgiven you for his name’s sake. +\p +\v 13 I write to you, fathers, because you know him who is from the beginning. +\p I write to you, young men, because you have overcome the evil one. +\p I write to you, little children, because you know the Father. +\p +\v 14 I have written to you, fathers, because you know him who is from the beginning. +\p I have written to you, young men, because you are strong, and the word of God remains in you, and you have overcome the evil one. +\p +\v 15 Don’t love the world or the things that are in the world. If anyone loves the world, the Father’s love isn’t in him. +\v 16 For all that is in the world—the lust of the flesh, the lust of the eyes, and the pride of life—isn’t the Father’s, but is the world’s. +\v 17 The world is passing away with its lusts, but he who does God’s will remains forever. +\p +\v 18 Little children, these are the end times, and as you heard that the Antichrist is coming, even now many antichrists have arisen. By this we know that it is the final hour. +\v 19 They went out from us, but they didn’t belong to us; for if they had belonged to us, they would have continued with us. But they left, that they might be revealed that none of them belong to us. +\v 20 You have an anointing from the Holy One, and you all have knowledge.\f + \fr 2:20 \ft Or, “know what is true”, or, “know all things”\f* +\v 21 I have not written to you because you don’t know the truth, but because you know it, and because no lie is of the truth. +\v 22 Who is the liar but he who denies that Jesus is the Christ? This is the Antichrist, he who denies the Father and the Son. +\v 23 Whoever denies the Son doesn’t have the Father. He who confesses the Son has the Father also. +\p +\v 24 Therefore, as for you, let that remain in you which you heard from the beginning. If that which you heard from the beginning remains in you, you also will remain in the Son, and in the Father. +\v 25 This is the promise which he promised us, the eternal life. +\p +\v 26 These things I have written to you concerning those who would lead you astray. +\v 27 As for you, the anointing which you received from him remains in you, and you don’t need for anyone to teach you. But as his anointing teaches you concerning all things, and is true, and is no lie, and even as it taught you, you will remain in him. +\p +\v 28 Now, little children, remain in him, that when he appears, we may have boldness and not be ashamed before him at his coming. +\v 29 If you know that he is righteous, you know that everyone who practices righteousness has been born of him. +\c 3 +\p +\v 1 See how great a love the Father has given to us, that we should be called children of God! For this cause the world doesn’t know us, because it didn’t know him. +\v 2 Beloved, now we are children of God. It is not yet revealed what we will be; but we know that when he is revealed, we will be like him, for we will see him just as he is. +\v 3 Everyone who has this hope set on him purifies himself, even as he is pure. +\p +\v 4 Everyone who sins also commits lawlessness. Sin is lawlessness. +\v 5 You know that he was revealed to take away our sins, and no sin is in him. +\v 6 Whoever remains in him doesn’t sin. Whoever sins hasn’t seen him and doesn’t know him. +\p +\v 7 Little children, let no one lead you astray. He who does righteousness is righteous, even as he is righteous. +\v 8 He who sins is of the devil, for the devil has been sinning from the beginning. To this end the Son of God was revealed: that he might destroy the works of the devil. +\v 9 Whoever is born of God doesn’t commit sin, because his seed remains in him, and he can’t sin, because he is born of God. +\v 10 In this the children of God are revealed, and the children of the devil. Whoever doesn’t do righteousness is not of God, neither is he who doesn’t love his brother. +\v 11 For this is the message which you heard from the beginning, that we should love one another— +\v 12 unlike Cain, who was of the evil one and killed his brother. Why did he kill him? Because his deeds were evil, and his brother’s righteous. +\p +\v 13 Don’t be surprised, my brothers, if the world hates you. +\v 14 We know that we have passed out of death into life, because we love the brothers. He who doesn’t love his brother remains in death. +\v 15 Whoever hates his brother is a murderer, and you know that no murderer has eternal life remaining in him. +\p +\v 16 By this we know love, because he laid down his life for us. And we ought to lay down our lives for the brothers. +\v 17 But whoever has the world’s goods and sees his brother in need, then closes his heart of compassion against him, how does God’s love remain in him? +\p +\v 18 My little children, let’s not love in word only, or with the tongue only, but in deed and truth. +\v 19 And by this we know that we are of the truth and persuade our hearts before him, +\v 20 because if our heart condemns us, God is greater than our heart, and knows all things. +\v 21 Beloved, if our hearts don’t condemn us, we have boldness toward God; +\v 22 so whatever we ask, we receive from him, because we keep his commandments and do the things that are pleasing in his sight. +\v 23 This is his commandment, that we should believe in the name of his Son, Jesus Christ, and love one another, even as he commanded. +\v 24 He who keeps his commandments remains in him, and he in him. By this we know that he remains in us, by the Spirit which he gave us. +\c 4 +\p +\v 1 Beloved, don’t believe every spirit, but test the spirits, whether they are of God, because many false prophets have gone out into the world. +\v 2 By this you know the Spirit of God: every spirit who confesses that Jesus Christ has come in the flesh is of God, +\v 3 and every spirit who doesn’t confess that Jesus Christ has come in the flesh is not of God; and this is the spirit of the Antichrist, of whom you have heard that it comes. Now it is in the world already. +\v 4 You are of God, little children, and have overcome them, because greater is he who is in you than he who is in the world. +\v 5 They are of the world. Therefore they speak of the world, and the world hears them. +\v 6 We are of God. He who knows God listens to us. He who is not of God doesn’t listen to us. By this we know the spirit of truth, and the spirit of error. +\p +\v 7 Beloved, let’s love one another, for love is of God; and everyone who loves has been born of God and knows God. +\v 8 He who doesn’t love doesn’t know God, for God is love. +\v 9 By this God’s love was revealed in us, that God has sent his only born\f + \fr 4:9 \ft The phrase “only born” is from the Greek word “μονογενη”, which is sometimes translated “only begotten” or “one and only”.\f* Son into the world that we might live through him. +\v 10 In this is love, not that we loved God, but that he loved us, and sent his Son as the atoning sacrifice\f + \fr 4:10 \ft “atoning sacrifice” is from the Greek “ιλασμος”, an appeasing, propitiating, or the means of appeasement or propitiation—the sacrifice that turns away God’s wrath because of our sin. \f* for our sins. +\v 11 Beloved, if God loved us in this way, we also ought to love one another. +\v 12 No one has seen God at any time. If we love one another, God remains in us, and his love has been perfected in us. +\p +\v 13 By this we know that we remain in him and he in us, because he has given us of his Spirit. +\v 14 We have seen and testify that the Father has sent the Son as the Savior of the world. +\v 15 Whoever confesses that Jesus is the Son of God, God remains in him, and he in God. +\v 16 We know and have believed the love which God has for us. God is love, and he who remains in love remains in God, and God remains in him. +\v 17 In this, love has been made perfect among us, that we may have boldness in the day of judgment, because as he is, even so we are in this world. +\v 18 There is no fear in love; but perfect love casts out fear, because fear has punishment. He who fears is not made perfect in love. +\v 19 We love him,\f + \fr 4:19 \ft NU omits “him”.\f* because he first loved us. +\v 20 If a man says, “I love God,” and hates his brother, he is a liar; for he who doesn’t love his brother whom he has seen, how can he love God whom he has not seen? +\v 21 This commandment we have from him, that he who loves God should also love his brother. +\c 5 +\p +\v 1 Whoever believes that Jesus is the Christ has been born of God. Whoever loves the Father also loves the child who is born of him. +\v 2 By this we know that we love the children of God, when we love God and keep his commandments. +\v 3 For this is loving God, that we keep his commandments. His commandments are not grievous. +\v 4 For whatever is born of God overcomes the world. This is the victory that has overcome the world: your faith. +\v 5 Who is he who overcomes the world, but he who believes that Jesus is the Son of God? +\p +\v 6 This is he who came by water and blood, Jesus Christ; not with the water only, but with the water and the blood. It is the Spirit who testifies, because the Spirit is the truth. +\v 7 For there are three who testify:\f + \fr 5:7 \ft Only a few recent manuscripts add “in heaven: the Father, the Word, and the Holy Spirit; and these three are one. And there are three that testify on earth:”\f* +\v 8 the Spirit, the water, and the blood; and the three agree as one. +\v 9 If we receive the witness of men, the witness of God is greater; for this is God’s testimony which he has testified concerning his Son. +\v 10 He who believes in the Son of God has the testimony in himself. He who doesn’t believe God has made him a liar, because he has not believed in the testimony that God has given concerning his Son. +\v 11 The testimony is this: that God gave to us eternal life, and this life is in his Son. +\v 12 He who has the Son has the life. He who doesn’t have God’s Son doesn’t have the life. +\p +\v 13 These things I have written to you who believe in the name of the Son of God, that you may know that you have eternal life, and that you may continue to believe in the name of the Son of God. +\p +\v 14 This is the boldness which we have toward him, that if we ask anything according to his will, he listens to us. +\v 15 And if we know that he listens to us, whatever we ask, we know that we have the petitions which we have asked of him. +\p +\v 16 If anyone sees his brother sinning a sin not leading to death, he shall ask, and God will give him life for those who sin not leading to death. There is sin leading to death. I don’t say that he should make a request concerning this. +\v 17 All unrighteousness is sin, and there is sin not leading to death. +\p +\v 18 We know that whoever is born of God doesn’t sin, but he who was born of God keeps himself, and the evil one doesn’t touch him. +\v 19 We know that we are of God, and the whole world lies in the power of the evil one. +\v 20 We know that the Son of God has come and has given us an understanding, that we know him who is true; and we are in him who is true, in his Son Jesus Christ. This is the true God and eternal life. +\p +\v 21 Little children, keep yourselves from idols. diff --git a/c-sharp/assets/WEB/642JNengWEBUS.SFM b/c-sharp/assets/WEB/642JNengWEBUS.SFM new file mode 100644 index 0000000000..55c6a8538a --- /dev/null +++ b/c-sharp/assets/WEB/642JNengWEBUS.SFM @@ -0,0 +1,25 @@ +\id 2JN 63-2JN-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 2 John +\toc1 John’s Second Letter +\toc2 2 John +\toc3 2 John +\mt1 John’s Second Letter +\c 1 +\p +\v 1 The elder, to the chosen lady and her children, whom I love in truth, and not I only, but also all those who know the truth, +\v 2 for the truth’s sake, which remains in us, and it will be with us forever: +\v 3 Grace, mercy, and peace will be with us, from God the Father and from the Lord Jesus Christ,\f + \fr 1:3 \ft “Christ” means “Anointed One”.\f* the Son of the Father, in truth and love. +\p +\v 4 I rejoice greatly that I have found some of your children walking in truth, even as we have been commanded by the Father. +\v 5 Now I beg you, dear lady, not as though I wrote to you a new commandment, but that which we had from the beginning, that we love one another. +\v 6 This is love, that we should walk according to his commandments. This is the commandment, even as you heard from the beginning, that you should walk in it. +\p +\v 7 For many deceivers have gone out into the world, those who don’t confess that Jesus Christ came in the flesh. This is the deceiver and the Antichrist. +\v 8 Watch yourselves, that we don’t lose the things which we have accomplished, but that we receive a full reward. +\v 9 Whoever transgresses and doesn’t remain in the teaching of Christ doesn’t have God. He who remains in the teaching has both the Father and the Son. +\v 10 If anyone comes to you and doesn’t bring this teaching, don’t receive him into your house, and don’t welcome him, +\v 11 for he who welcomes him participates in his evil deeds. +\p +\v 12 Having many things to write to you, I don’t want to do so with paper and ink, but I hope to come to you and to speak face to face, that our joy may be made full. +\v 13 The children of your chosen sister greet you. Amen. diff --git a/c-sharp/assets/WEB/653JNengWEBUS.SFM b/c-sharp/assets/WEB/653JNengWEBUS.SFM new file mode 100644 index 0000000000..7ec58fa7d5 --- /dev/null +++ b/c-sharp/assets/WEB/653JNengWEBUS.SFM @@ -0,0 +1,29 @@ +\id 3JN 64-3JN-web.sfm World English Bible (WEB) +\ide UTF-8 +\h 3 John +\toc1 John’s Third Letter +\toc2 3 John +\toc3 3 John +\mt1 John’s Third Letter +\c 1 +\p +\v 1 The elder to Gaius the beloved, whom I love in truth. +\p +\v 2 Beloved, I pray that you may prosper in all things and be healthy, even as your soul prospers. +\v 3 For I rejoiced greatly when brothers came and testified about your truth, even as you walk in truth. +\v 4 I have no greater joy than this: to hear about my children walking in truth. +\p +\v 5 Beloved, you do a faithful work in whatever you accomplish for those who are brothers and strangers. +\v 6 They have testified about your love before the assembly. You will do well to send them forward on their journey in a way worthy of God, +\v 7 because for the sake of the Name they went out, taking nothing from the Gentiles. +\v 8 We therefore ought to receive such, that we may be fellow workers for the truth. +\p +\v 9 I wrote to the assembly, but Diotrephes, who loves to be first among them, doesn’t accept what we say. +\v 10 Therefore, if I come, I will call attention to his deeds which he does, unjustly accusing us with wicked words. Not content with this, he doesn’t receive the brothers himself, and those who would, he forbids and throws out of the assembly. +\p +\v 11 Beloved, don’t imitate that which is evil, but that which is good. He who does good is of God. He who does evil hasn’t seen God. +\v 12 Demetrius has the testimony of all, and of the truth itself; yes, we also testify, and you know that our testimony is true. +\p +\v 13 I had many things to write to you, but I am unwilling to write to you with ink and pen; +\v 14 but I hope to see you soon. Then we will speak face to face. +\p Peace be to you. The friends greet you. Greet the friends by name. diff --git a/c-sharp/assets/WEB/66JUDengWEBUS.SFM b/c-sharp/assets/WEB/66JUDengWEBUS.SFM new file mode 100644 index 0000000000..0437b371fe --- /dev/null +++ b/c-sharp/assets/WEB/66JUDengWEBUS.SFM @@ -0,0 +1,39 @@ +\id JUD 65-JUD-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Jude +\toc1 The Letter from Jude +\toc2 Jude +\toc3 Jude +\mt1 The Letter from Jude +\c 1 +\p +\v 1 Jude,\f + \fr 1:1 \ft or, Judah\f* a servant of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* and brother of James, to those who are called, sanctified by God the Father, and kept for Jesus Christ: +\v 2 May mercy, peace, and love be multiplied to you. +\p +\v 3 Beloved, while I was very eager to write to you about our common salvation, I was constrained to write to you exhorting you to contend earnestly for the faith which was once for all delivered to the saints. +\v 4 For there are certain men who crept in secretly, even those who were long ago written about for this condemnation: ungodly men, turning the grace of our God into indecency, and denying our only Master, God, and Lord, Jesus Christ. +\p +\v 5 Now I desire to remind you, though you already know this, that the Lord, having saved a people out of the land of Egypt, afterward destroyed those who didn’t believe. +\v 6 Angels who didn’t keep their first domain, but deserted their own dwelling place, he has kept in everlasting bonds under darkness for the judgment of the great day. +\v 7 Even as Sodom and Gomorrah and the cities around them, having in the same way as these given themselves over to sexual immorality and gone after strange flesh, are shown as an example, suffering the punishment of eternal fire. +\v 8 Yet in the same way, these also in their dreaming defile the flesh, despise authority, and slander celestial beings. +\v 9 But Michael, the archangel, when contending with the devil and arguing about the body of Moses, dared not bring against him an abusive condemnation, but said, “May the Lord rebuke you!” +\v 10 But these speak evil of whatever things they don’t know. They are destroyed in these things that they understand naturally, like the creatures without reason. +\v 11 Woe to them! For they went in the way of Cain, and ran riotously in the error of Balaam for hire, and perished in Korah’s rebellion. +\v 12 These are hidden rocky reefs in your love feasts when they feast with you, shepherds who without fear feed themselves; clouds without water, carried along by winds; autumn trees without fruit, twice dead, plucked up by the roots; +\v 13 wild waves of the sea, foaming out their own shame; wandering stars, for whom the blackness of darkness has been reserved forever. +\v 14 About these also Enoch, the seventh from Adam, prophesied, saying, “Behold,\f + \fr 1:14 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* the Lord came with ten thousands of his holy ones, +\v 15 to execute judgment on all, and to convict all the ungodly of all their works of ungodliness which they have done in an ungodly way, and of all the hard things which ungodly sinners have spoken against him.” +\v 16 These are murmurers and complainers, walking after their lusts—and their mouth speaks proud things—showing respect of persons to gain advantage. +\p +\v 17 But you, beloved, remember the words which have been spoken before by the apostles of our Lord Jesus Christ. +\v 18 They said to you, “In the last time there will be mockers, walking after their own ungodly lusts.” +\v 19 These are those who cause divisions and are sensual, not having the Spirit. +\p +\v 20 But you, beloved, keep building up yourselves on your most holy faith, praying in the Holy Spirit. +\v 21 Keep yourselves in God’s love, looking for the mercy of our Lord Jesus Christ to eternal life. +\v 22 On some have compassion, making a distinction, +\v 23 and some save, snatching them out of the fire with fear, hating even the clothing stained by the flesh. +\p +\v 24 Now to him who is able to keep them\f + \fr 1:24 \ft TR and NU read “you”\f* from stumbling, and to present you faultless before the presence of his glory in great joy, +\v 25 to God our Savior, who alone is wise, be glory and majesty, dominion and power, both now and forever. Amen. diff --git a/c-sharp/assets/WEB/67REVengWEBUS.SFM b/c-sharp/assets/WEB/67REVengWEBUS.SFM new file mode 100644 index 0000000000..5462d3bc67 --- /dev/null +++ b/c-sharp/assets/WEB/67REVengWEBUS.SFM @@ -0,0 +1,602 @@ +\id REV 66-REV-web.sfm World English Bible (WEB) +\ide UTF-8 +\h Revelation +\toc1 The Revelation to John +\toc2 Revelation +\toc3 Revelation +\mt1 The Revelation to John +\c 1 +\p +\v 1 This is the Revelation of Jesus Christ,\f + \fr 1:1 \ft “Christ” means “Anointed One”.\f* which God gave him to show to his servants the things which must happen soon, which he sent and made known by his angel\f + \fr 1:1 \ft or, messenger (here and wherever angel is mentioned)\f* to his servant, John, +\v 2 who testified to God’s word and of the testimony of Jesus Christ, about everything that he saw. +\p +\v 3 Blessed is he who reads and those who hear the words of the prophecy, and keep the things that are written in it, for the time is near. +\p +\v 4 John, to the seven assemblies that are in Asia: Grace to you and peace from God, who is and who was and who is to come; and from the seven Spirits who are before his throne; +\v 5 and from Jesus Christ, the faithful witness, the firstborn of the dead, and the ruler of the kings of the earth. To him who loves us, and washed us from our sins by his blood— +\v 6 and he made us to be a Kingdom, priests\x + \xo 1:6 \xt Exodus 19:6; Isaiah 61:6 \x* to his God and Father—to him be the glory and the dominion forever and ever. Amen. +\p +\v 7 Behold,\f + \fr 1:7 \ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\f* he is coming with the clouds, and every eye will see him, including those who pierced him. All the tribes of the earth will mourn over him. Even so, Amen. +\p +\v 8 \wj “I am the Alpha and the Omega,\wj*\f + \fr 1:8 \ft TR adds “the Beginning and the End”\f*\wj ”\wj* says the Lord God,\f + \fr 1:8 \ft TR omits “God”\f* \wj “who is and who was and who is to come, the Almighty.”\wj* +\p +\v 9 I John, your brother and partner with you in the oppression, Kingdom, and perseverance in Christ Jesus, was on the isle that is called Patmos because of God’s Word and the testimony of Jesus Christ. +\v 10 I was in the Spirit on the Lord’s day, and I heard behind me a loud voice, like a trumpet +\v 11 saying,\f + \fr 1:11 \ft TR adds “I am the Alpha and the Omega, the First and the Last.”\f* \wj “What you see, write in a book and send to the seven assemblies:\wj*\f + \fr 1:11 \ft TR adds “which are in Asia”\f* \wj to Ephesus, Smyrna, Pergamum, Thyatira, Sardis, Philadelphia, and to Laodicea.”\wj* +\p +\v 12 I turned to see the voice that spoke with me. Having turned, I saw seven golden lamp stands. +\v 13 And among the lamp stands was one like a son of man,\x + \xo 1:13 \xt Daniel 7:13 \x* clothed with a robe reaching down to his feet, and with a golden sash around his chest. +\v 14 His head and his hair were white as white wool, like snow. His eyes were like a flame of fire. +\v 15 His feet were like burnished brass, as if it had been refined in a furnace. His voice was like the voice of many waters. +\v 16 He had seven stars in his right hand. Out of his mouth proceeded a sharp two-edged sword. His face was like the sun shining at its brightest. +\v 17 When I saw him, I fell at his feet like a dead man. +\p He laid his right hand on me, saying, \wj “Don’t be afraid. I am the first and the last, \wj* +\v 18 \wj and the Living one. I was dead, and behold, I am alive forever and ever. Amen. I have the keys of Death and of Hades.\wj*\f + \fr 1:18 \ft or, Hell\f* +\v 19 \wj Write therefore the things which you have seen, and the things which are, and the things which will happen hereafter. \wj* +\v 20 \wj The mystery of the seven stars which you saw in my right hand, and the seven golden lamp stands is this: The seven stars are the angels\wj*\f + \fr 1:20 \ft or, messengers (here and wherever angels are mentioned)\f* \wj of the seven assemblies. The seven lamp stands are seven assemblies.\wj* +\c 2 +\p +\v 1 \wj “To the angel of the assembly in Ephesus write:\wj* +\p \wj “He who holds the seven stars in his right hand, he who walks among the seven golden lamp stands says these things:\wj* +\p +\v 2 \wj “I know your works, and your toil and perseverance, and that you can’t tolerate evil men, and have tested those who call themselves apostles, and they are not, and found them false. \wj* +\v 3 \wj You have perseverance and have endured for my name’s sake, and have \wj*\f + \fr 2:3 \ft TR adds “have labored and”\f* \wj not grown weary. \wj* +\v 4 \wj But I have this against you, that you left your first love. \wj* +\v 5 \wj Remember therefore from where you have fallen, and repent and do the first works; or else I am coming to you swiftly, and will move your lamp stand out of its place, unless you repent. \wj* +\v 6 \wj But this you have, that you hate the works of the Nicolaitans, which I also hate. \wj* +\v 7 \wj He who has an ear, let him hear what the Spirit says to the assemblies. To him who overcomes I will give to eat from the tree of life, which is in the Paradise of my God.\wj* +\p +\v 8 \wj “To the angel of the assembly in Smyrna write:\wj* +\p \wj “The first and the last, who was dead, and has come to life says these things:\wj* +\p +\v 9 \wj “I know your works, oppression, and your poverty (but you are rich), and the blasphemy of those who say they are Jews, and they are not, but are a synagogue of Satan. \wj* +\v 10 \wj Don’t be afraid of the things which you are about to suffer. Behold, the devil is about to throw some of you into prison, that you may be tested; and you will have oppression for ten days. Be faithful to death, and I will give you the crown of life. \wj* +\v 11 \wj He who has an ear, let him hear what the Spirit says to the assemblies. He who overcomes won’t be harmed by the second death.\wj* +\p +\v 12 \wj “To the angel of the assembly in Pergamum write:\wj* +\p \wj “He who has the sharp two-edged sword says these things:\wj* +\p +\v 13 \wj “I know your works and where you dwell, where Satan’s throne is. You hold firmly to my name, and didn’t deny my faith in the days of Antipas my witness, my faithful one, who was killed among you, where Satan dwells. \wj* +\v 14 \wj But I have a few things against you, because you have there some who hold the teaching of Balaam, who taught Balak to throw a stumbling block before the children of Israel, to eat things sacrificed to idols, and to commit sexual immorality. \wj* +\v 15 \wj So also you likewise have some who hold to the teaching of the Nicolaitans.\wj*\f + \fr 2:15 \ft TR reads “which I hate” instead of “likewise”\f* +\v 16 \wj Repent therefore, or else I am coming to you quickly and I will make war against them with the sword of my mouth. \wj* +\v 17 \wj He who has an ear, let him hear what the Spirit says to the assemblies. To him who overcomes, to him I will give of the hidden manna, \wj*\f + \fr 2:17 \ft Manna is supernatural food, named after the Hebrew for “What is it?”. See Exodus 11:7-9.\f* \wj and I will give him a white stone, and on the stone a new name written which no one knows but he who receives it.\wj* +\p +\v 18 \wj “To the angel of the assembly in Thyatira write:\wj* +\p \wj “The Son of God, who has his eyes like a flame of fire, and his feet are like burnished brass, says these things:\wj* +\p +\v 19 \wj “I know your works, your love, faith, service, patient endurance, and that your last works are more than the first. \wj* +\v 20 \wj But I have this against you, that you tolerate your\wj*\f + \fr 2:20 \ft TR, NU read “that” instead of “your”\f* \wj woman Jezebel, who calls herself a prophetess. She teaches and seduces my servants to commit sexual immorality and to eat things sacrificed to idols. \wj* +\v 21 \wj I gave her time to repent, but she refuses to repent of her sexual immorality. \wj* +\v 22 \wj Behold, I will throw her and those who commit adultery with her into a bed of great oppression, unless they repent of her works. \wj* +\v 23 \wj I will kill her children with Death, and all the assemblies will know that I am he who searches the minds and hearts. I will give to each one of you according to your deeds. \wj* +\v 24 \wj But to you I say, to the rest who are in Thyatira—as many as don’t have this teaching, who don’t know what some call ‘the deep things of Satan’—to you I say, I am not putting any other burden on you. \wj* +\v 25 \wj Nevertheless, hold that which you have firmly until I come. \wj* +\v 26 \wj He who overcomes, and he who keeps my works to the end, to him I will give authority over the nations. \wj* +\v 27 \wj He will rule them with a rod of iron, shattering them like clay pots,\wj*\x + \xo 2:27 \xt Psalm 2:9\x* \wj as I also have received of my Father; \wj* +\v 28 \wj and I will give him the morning star. \wj* +\v 29 \wj He who has an ear, let him hear what the Spirit says to the assemblies.\wj* +\c 3 +\p +\v 1 \wj “And to the angel of the assembly in Sardis write:\wj* +\p \wj “He who has the seven Spirits of God and the seven stars says these things:\wj* +\p \wj “I know your works, that you have a reputation of being alive, but you are dead. \wj* +\v 2 \wj Wake up and strengthen the things that remain, which you were about to throw away,\wj*\f + \fr 3:2 \ft NU & TR read “which were about to die” instead of “which you were about to throw away”.\f* \wj for I have found no works of yours perfected before my God. \wj* +\v 3 \wj Remember therefore how you have received and heard. Keep it and repent. If therefore you won’t watch, I will come as a thief, and you won’t know what hour I will come upon you. \wj* +\v 4 \wj Nevertheless you have a few names in Sardis that didn’t defile their garments. They will walk with me in white, for they are worthy. \wj* +\v 5 \wj He who overcomes will be arrayed in white garments, and I will in no way blot his name out of the book of life, and I will confess his name before my Father, and before his angels. \wj* +\v 6 \wj He who has an ear, let him hear what the Spirit says to the assemblies.\wj* +\p +\v 7 \wj “To the angel of the assembly in Philadelphia write:\wj* +\p \wj “He who is holy, he who is true, he who has the key of David, he who opens and no one can shut, and who shuts and no one opens, says these things: \wj* +\p +\v 8 \wj “I know your works (behold, I have set before you an open door, which no one can shut), that you have a little power, and kept my word, and didn’t deny my name. \wj* +\v 9 \wj Behold, I make some of the synagogue of Satan, of those who say they are Jews, and they are not, but lie—behold, I will make them to come and worship before your feet, and to know that I have loved you. \wj* +\v 10 \wj Because you kept my command to endure, I also will keep you from the hour of testing which is to come on the whole world, to test those who dwell on the earth. \wj* +\v 11 \wj I am coming quickly! Hold firmly that which you have, so that no one takes your crown. \wj* +\v 12 \wj He who overcomes, I will make him a pillar in the temple of my God, and he will go out from there no more. I will write on him the name of my God and the name of the city of my God, the new Jerusalem, which comes down out of heaven from my God, and my own new name. \wj* +\v 13 \wj He who has an ear, let him hear what the Spirit says to the assemblies.\wj* +\p +\v 14 \wj “To the angel of the assembly in Laodicea write:\wj* +\p \wj “The Amen, the Faithful and True Witness, the Beginning\wj*\f + \fr 3:14 \ft or, Source, or Head\f* \wj of God’s creation, says these things:\wj* +\p +\v 15 \wj “I know your works, that you are neither cold nor hot. I wish you were cold or hot. \wj* +\v 16 \wj So, because you are lukewarm, and neither hot nor cold, I will vomit you out of my mouth. \wj* +\v 17 \wj Because you say, ‘I am rich, and have gotten riches, and have need of nothing,’ and don’t know that you are the wretched one, miserable, poor, blind, and naked; \wj* +\v 18 \wj I counsel you to buy from me gold refined by fire, that you may become rich; and white garments, that you may clothe yourself, and that the shame of your nakedness may not be revealed; and eye salve to anoint your eyes, that you may see. \wj* +\v 19 \wj As many as I love, I reprove and chasten. Be zealous therefore, and repent. \wj* +\v 20 \wj Behold, I stand at the door and knock. If anyone hears my voice and opens the door, then I will come in to him and will dine with him, and he with me. \wj* +\v 21 \wj He who overcomes, I will give to him to sit down with me on my throne, as I also overcame and sat down with my Father on his throne. \wj* +\v 22 \wj He who has an ear, let him hear what the Spirit says to the assemblies.”\wj* +\c 4 +\p +\v 1 After these things I looked and saw a door opened in heaven; and the first voice that I heard, like a trumpet speaking with me, was one saying, “Come up here, and I will show you the things which must happen after this.” +\p +\v 2 Immediately I was in the Spirit. Behold, there was a throne set in heaven, and one sitting on the throne +\v 3 that looked like a jasper stone and a sardius. There was a rainbow around the throne, like an emerald to look at. +\v 4 Around the throne were twenty-four thrones. On the thrones were twenty-four elders sitting, dressed in white garments, with crowns of gold on their heads. +\v 5 Out of the throne proceed lightnings, sounds, and thunders. There were seven lamps of fire burning before his throne, which are the seven Spirits of God. +\v 6 Before the throne was something like a sea of glass, similar to crystal. In the middle of the throne, and around the throne were four living creatures full of eyes before and behind. +\v 7 The first creature was like a lion, the second creature like a calf, the third creature had a face like a man, and the fourth was like a flying eagle. +\v 8 The four living creatures, each one of them having six wings, are full of eyes around and within. They have no rest day and night, saying, “Holy, holy, holy\f + \fr 4:8 \ft Hodges/Farstad MT reads “holy” 9 times instead of 3.\f* is the Lord God, the Almighty, who was and who is and who is to come!” +\p +\v 9 When the living creatures give glory, honor, and thanks to him who sits on the throne, to him who lives forever and ever, +\v 10 the twenty-four elders fall down before him who sits on the throne and worship him who lives forever and ever, and throw their crowns before the throne, saying, +\v 11 “Worthy are you, our Lord and God, the Holy One,\f + \fr 4:11 \ft TR omits “and God, the Holy One,”\f* to receive the glory, the honor, and the power, for you created all things, and because of your desire they existed and were created!” +\c 5 +\p +\v 1 I saw, in the right hand of him who sat on the throne, a book written inside and outside, sealed shut with seven seals. +\v 2 I saw a mighty angel proclaiming with a loud voice, “Who is worthy to open the book, and to break its seals?” +\v 3 No one in heaven above, or on the earth, or under the earth, was able to open the book or to look in it. +\v 4 Then I wept much, because no one was found worthy to open the book or to look in it. +\v 5 One of the elders said to me, “Don’t weep. Behold, the Lion who is of the tribe of Judah, the Root of David, has overcome: he who opens the book and its seven seals.” +\p +\v 6 I saw in the middle of the throne and of the four living creatures, and in the middle of the elders, a Lamb standing, as though it had been slain, having seven horns and seven eyes, which are the seven Spirits of God, sent out into all the earth. +\v 7 Then he came, and he took it out of the right hand of him who sat on the throne. +\v 8 Now when he had taken the book, the four living creatures and the twenty-four elders fell down before the Lamb, each one having a harp, and golden bowls full of incense, which are the prayers of the saints. +\v 9 They sang a new song, saying, +\q1 “You are worthy to take the book +\q2 and to open its seals, +\q1 for you were killed, +\q2 and bought us for God with your blood +\q2 out of every tribe, language, people, and nation, +\q1 +\v 10 and made us kings and priests to our God; +\q2 and we will reign on the earth.” +\p +\v 11 I looked, and I heard something like a voice of many angels around the throne, the living creatures, and the elders. The number of them was ten thousands of ten thousands, and thousands of thousands, +\v 12 saying with a loud voice, “Worthy is the Lamb who has been killed to receive the power, wealth, wisdom, strength, honor, glory, and blessing!” +\p +\v 13 I heard every created thing which is in heaven, on the earth, under the earth, on the sea, and everything in them, saying, “To him who sits on the throne and to the Lamb be the blessing, the honor, the glory, and the dominion, forever and ever! Amen!”\f + \fr 5:13 \ft TR omits “Amen!”\f* +\p +\v 14 The four living creatures said, “Amen!” Then the\f + \fr 5:14 \ft TR adds “twenty-four”\f* elders fell down and worshiped.\f + \fr 5:14 \ft TR adds “the one living forever and ever”\f* +\c 6 +\p +\v 1 I saw that the Lamb opened one of the seven seals, and I heard one of the four living creatures saying, as with a voice of thunder, “Come and see!” +\v 2 Then a white horse appeared, and he who sat on it had a bow. A crown was given to him, and he came out conquering, and to conquer. +\p +\v 3 When he opened the second seal, I heard the second living creature saying, “Come!” +\v 4 Another came out, a red horse. To him who sat on it was given power to take peace from the earth, and that they should kill one another. There was given to him a great sword. +\p +\v 5 When he opened the third seal, I heard the third living creature saying, “Come and see!” And behold, a black horse, and he who sat on it had a balance in his hand. +\v 6 I heard a voice in the middle of the four living creatures saying, “A choenix\f + \fr 6:6 \ft A choenix is a dry volume measure that is a little more than a liter (a little more than a quart).\f* of wheat for a denarius, and three choenix of barley for a denarius! Don’t damage the oil and the wine!” +\p +\v 7 When he opened the fourth seal, I heard the fourth living creature saying, “Come and see!” +\v 8 And behold, a pale horse, and the name of he who sat on it was Death. Hades\f + \fr 6:8 \ft or, Hell\f* followed with him. Authority over one fourth of the earth, to kill with the sword, with famine, with death, and by the wild animals of the earth was given to him. +\p +\v 9 When he opened the fifth seal, I saw underneath the altar the souls of those who had been killed for the Word of God, and for the testimony of the Lamb which they had. +\v 10 They cried with a loud voice, saying, “How long, Master, the holy and true, until you judge and avenge our blood on those who dwell on the earth?” +\v 11 A long white robe was given to each of them. They were told that they should rest yet for a while, until their fellow servants and their brothers,\f + \fr 6:11 \ft The word for “brothers” here and where context allows may also be correctly translated “brothers and sisters” or “siblings.”\f* who would also be killed even as they were, should complete their course. +\p +\v 12 I saw when he opened the sixth seal, and there was a great earthquake. The sun became black as sackcloth made of hair, and the whole moon became as blood. +\v 13 The stars of the sky fell to the earth, like a fig tree dropping its unripe figs when it is shaken by a great wind. +\v 14 The sky was removed like a scroll when it is rolled up. Every mountain and island was moved out of its place. +\v 15 The kings of the earth, the princes, the commanding officers, the rich, the strong, and every slave and free person, hid themselves in the caves and in the rocks of the mountains. +\v 16 They told the mountains and the rocks, “Fall on us, and hide us from the face of him who sits on the throne, and from the wrath of the Lamb, +\v 17 for the great day of his wrath has come, and who is able to stand?” +\c 7 +\p +\v 1 After this, I saw four angels standing at the four corners of the earth, holding the four winds of the earth, so that no wind would blow on the earth, or on the sea, or on any tree. +\v 2 I saw another angel ascend from the sunrise, having the seal of the living God. He cried with a loud voice to the four angels to whom it was given to harm the earth and the sea, +\v 3 saying, “Don’t harm the earth, the sea, or the trees, until we have sealed the bondservants of our God on their foreheads!” +\v 4 I heard the number of those who were sealed, one hundred forty-four thousand, sealed out of every tribe of the children of Israel: +\q1 +\v 5 of the tribe of Judah twelve thousand were sealed, +\q1 of the tribe of Reuben twelve thousand, +\q1 of the tribe of Gad twelve thousand, +\q1 +\v 6 of the tribe of Asher twelve thousand, +\q1 of the tribe of Naphtali twelve thousand, +\q1 of the tribe of Manasseh twelve thousand, +\q1 +\v 7 of the tribe of Simeon twelve thousand, +\q1 of the tribe of Levi twelve thousand, +\q1 of the tribe of Issachar twelve thousand, +\q1 +\v 8 of the tribe of Zebulun twelve thousand, +\q1 of the tribe of Joseph twelve thousand, and +\q1 of the tribe of Benjamin twelve thousand were sealed. +\p +\v 9 After these things I looked, and behold, a great multitude which no man could count, out of every nation and of all tribes, peoples, and languages, standing before the throne and before the Lamb, dressed in white robes, with palm branches in their hands. +\v 10 They cried with a loud voice, saying, “Salvation be to our God, who sits on the throne, and to the Lamb!” +\p +\v 11 All the angels were standing around the throne, the elders, and the four living creatures; and they fell on their faces before his throne, and worshiped God, +\v 12 saying, “Amen! Blessing, glory, wisdom, thanksgiving, honor, power, and might, be to our God forever and ever! Amen.” +\p +\v 13 One of the elders answered, saying to me, “These who are arrayed in the white robes, who are they, and where did they come from?” +\p +\v 14 I told him, “My lord, you know.” +\p He said to me, “These are those who came out of the great suffering.\f + \fr 7:14 \ft or, oppression\f* They washed their robes and made them white in the Lamb’s blood. +\v 15 Therefore they are before the throne of God, and they serve him day and night in his temple. He who sits on the throne will spread his tabernacle over them. +\v 16 They will never be hungry or thirsty any more. The sun won’t beat on them, nor any heat; +\v 17 for the Lamb who is in the middle of the throne shepherds them and leads them to springs of life-giving waters. And God will wipe away every tear from their eyes.” +\c 8 +\p +\v 1 When he opened the seventh seal, there was silence in heaven for about half an hour. +\v 2 I saw the seven angels who stand before God, and seven trumpets were given to them. +\p +\v 3 Another angel came and stood over the altar, having a golden censer. Much incense was given to him, that he should add it to the prayers of all the saints on the golden altar which was before the throne. +\v 4 The smoke of the incense, with the prayers of the saints, went up before God out of the angel’s hand. +\v 5 The angel took the censer, and he filled it with the fire of the altar, then threw it on the earth. Thunders, sounds, lightnings, and an earthquake followed. +\p +\v 6 The seven angels who had the seven trumpets prepared themselves to sound. +\p +\v 7 The first sounded, and there followed hail and fire, mixed with blood, and they were thrown to the earth. One third of the earth was burned up,\f + \fr 8:7 \ft TR omits “One third of the earth was burned up”\f* and one third of the trees were burned up, and all green grass was burned up. +\p +\v 8 The second angel sounded, and something like a great burning mountain was thrown into the sea. One third of the sea became blood, +\v 9 and one third of the living creatures which were in the sea died. One third of the ships were destroyed. +\p +\v 10 The third angel sounded, and a great star fell from the sky, burning like a torch, and it fell on one third of the rivers, and on the springs of water. +\v 11 The name of the star is “Wormwood.” One third of the waters became wormwood. Many people died from the waters, because they were made bitter. +\p +\v 12 The fourth angel sounded, and one third of the sun was struck, and one third of the moon, and one third of the stars, so that one third of them would be darkened; and the day wouldn’t shine for one third of it, and the night in the same way. +\v 13 I saw, and I heard an eagle,\f + \fr 8:13 \ft TR reads “angel” instead of “eagle” \f* flying in mid heaven, saying with a loud voice, “Woe! Woe! Woe to those who dwell on the earth, because of the other blasts of the trumpets of the three angels, who are yet to sound!” +\c 9 +\p +\v 1 The fifth angel sounded, and I saw a star from the sky which had fallen to the earth. The key to the pit of the abyss was given to him. +\v 2 He opened the pit of the abyss, and smoke went up out of the pit, like the smoke from a\f + \fr 9:2 \ft TR adds “great”\f* burning furnace. The sun and the air were darkened because of the smoke from the pit. +\v 3 Then out of the smoke came locusts on the earth, and power was given to them, as the scorpions of the earth have power. +\v 4 They were told that they should not hurt the grass of the earth, neither any green thing, neither any tree, but only those people who don’t have God’s seal on their foreheads. +\v 5 They were given power, not to kill them, but to torment them for five months. Their torment was like the torment of a scorpion when it strikes a person. +\v 6 In those days people will seek death, and will in no way find it. They will desire to die, and death will flee from them. +\p +\v 7 The shapes of the locusts were like horses prepared for war. On their heads were something like golden crowns, and their faces were like people’s faces. +\v 8 They had hair like women’s hair, and their teeth were like those of lions. +\v 9 They had breastplates like breastplates of iron. The sound of their wings was like the sound of many chariots and horses rushing to war. +\v 10 They have tails like those of scorpions, with stingers. In their tails they have power to harm men for five months. +\v 11 They have over them as king the angel of the abyss. His name in Hebrew is “Abaddon”,\f + \fr 9:11 \ft “Abaddon” is a Hebrew word that means “ruin”, “destruction”, or “the place of destruction”\f* but in Greek, he has the name “Apollyon”.\f + \fr 9:11 \ft “Apollyon” means “Destroyer”.\f* +\p +\v 12 The first woe is past. Behold, there are still two woes coming after this. +\p +\v 13 The sixth angel sounded. I heard a voice from the horns of the golden altar which is before God, +\v 14 saying to the sixth angel who had the trumpet, “Free the four angels who are bound at the great river Euphrates!” +\p +\v 15 The four angels were freed who had been prepared for that hour and day and month and year, so that they might kill one third of mankind. +\v 16 The number of the armies of the horsemen was two hundred million.\f + \fr 9:16 \ft literally, “ten thousands of ten thousands”\f* I heard the number of them. +\v 17 Thus I saw the horses in the vision and those who sat on them, having breastplates of fiery red, hyacinth blue, and sulfur yellow; and the horses’ heads resembled lions’ heads. Out of their mouths proceed fire, smoke, and sulfur. +\v 18 By these three plagues, one third of mankind was killed: by the fire, the smoke, and the sulfur, which proceeded out of their mouths. +\v 19 For the power of the horses is in their mouths and in their tails. For their tails are like serpents, and have heads; and with them they harm. +\p +\v 20 The rest of mankind, who were not killed with these plagues, didn’t repent of the works of their hands, that they wouldn’t worship demons, and the idols of gold, and of silver, and of brass, and of stone, and of wood, which can’t see, hear, or walk. +\v 21 They didn’t repent of their murders, their sorceries,\f + \fr 9:21 \ft The word for “sorceries” (pharmakeia) also implies the use of potions, poisons, and drugs\f* their sexual immorality, or their thefts. +\c 10 +\p +\v 1 I saw a mighty angel coming down out of the sky, clothed with a cloud. A rainbow was on his head. His face was like the sun, and his feet like pillars of fire. +\v 2 He had in his hand a little open book. He set his right foot on the sea, and his left on the land. +\v 3 He cried with a loud voice, as a lion roars. When he cried, the seven thunders uttered their voices. +\v 4 When the seven thunders sounded, I was about to write; but I heard a voice from the sky saying, “Seal up the things which the seven thunders said, and don’t write them.” +\p +\v 5 The angel whom I saw standing on the sea and on the land lifted up his right hand to the sky +\v 6 and swore by him who lives forever and ever, who created heaven and the things that are in it, the earth and the things that are in it, and the sea and the things that are in it, that there will no longer be delay, +\v 7 but in the days of the voice of the seventh angel, when he is about to sound, then the mystery of God is finished, as he declared to his servants the prophets. +\p +\v 8 The voice which I heard from heaven, again speaking with me, said, “Go, take the book which is open in the hand of the angel who stands on the sea and on the land.” +\p +\v 9 I went to the angel, telling him to give me the little book. +\p He said to me, “Take it and eat it. It will make your stomach bitter, but in your mouth it will be as sweet as honey.” +\p +\v 10 I took the little book out of the angel’s hand, and ate it. It was as sweet as honey in my mouth. When I had eaten it, my stomach was made bitter. +\v 11 They\f + \fr 10:11 \ft TR reads “He” instead of “They”\f* told me, “You must prophesy again over many peoples, nations, languages, and kings.” +\c 11 +\p +\v 1 A reed like a rod was given to me. Someone said, “Rise and measure God’s temple, and the altar, and those who worship in it. +\v 2 Leave out the court which is outside of the temple, and don’t measure it, for it has been given to the nations. They will tread the holy city under foot for forty-two months. +\v 3 I will give power to my two witnesses, and they will prophesy one thousand two hundred sixty days, clothed in sackcloth.” +\p +\v 4 These are the two olive trees and the two lamp stands, standing before the Lord of the earth. +\v 5 If anyone desires to harm them, fire proceeds out of their mouth and devours their enemies. If anyone desires to harm them, he must be killed in this way. +\v 6 These have the power to shut up the sky, that it may not rain during the days of their prophecy. They have power over the waters, to turn them into blood, and to strike the earth with every plague, as often as they desire. +\p +\v 7 When they have finished their testimony, the beast that comes up out of the abyss will make war with them, and overcome them, and kill them. +\v 8 Their dead bodies will be in the street of the great city, which spiritually is called Sodom and Egypt, where also their Lord was crucified. +\v 9 From among the peoples, tribes, languages, and nations, people will look at their dead bodies for three and a half days, and will not allow their dead bodies to be laid in a tomb. +\v 10 Those who dwell on the earth will rejoice over them, and they will be glad. They will give gifts to one another, because these two prophets tormented those who dwell on the earth. +\p +\v 11 After the three and a half days, the breath of life from God entered into them, and they stood on their feet. Great fear fell on those who saw them. +\v 12 I heard a loud voice from heaven saying to them, “Come up here!” They went up into heaven in a cloud, and their enemies saw them. +\v 13 In that day there was a great earthquake, and a tenth of the city fell. Seven thousand people were killed in the earthquake, and the rest were terrified and gave glory to the God of heaven. +\p +\v 14 The second woe is past. Behold, the third woe comes quickly. +\p +\v 15 The seventh angel sounded, and great voices in heaven followed, saying, “The kingdom of the world has become the Kingdom of our Lord and of his Christ. He will reign forever and ever!” +\p +\v 16 The twenty-four elders, who sit on their thrones before God’s throne, fell on their faces and worshiped God, +\v 17 saying: “We give you thanks, Lord God, the Almighty, the one who is and who was,\f + \fr 11:17 \ft TR adds “and who is coming”\f* because you have taken your great power and reigned. +\v 18 The nations were angry, and your wrath came, as did the time for the dead to be judged, and to give your bondservants the prophets, their reward, as well as to the saints and those who fear your name, to the small and the great, and to destroy those who destroy the earth.” +\p +\v 19 God’s temple that is in heaven was opened, and the ark of the Lord’s covenant was seen in his temple. Lightnings, sounds, thunders, an earthquake, and great hail followed. +\c 12 +\p +\v 1 A great sign was seen in heaven: a woman clothed with the sun, and the moon under her feet, and on her head a crown of twelve stars. +\v 2 She was with child. She cried out in pain, laboring to give birth. +\p +\v 3 Another sign was seen in heaven. Behold, a great red dragon, having seven heads and ten horns, and on his heads seven crowns. +\v 4 His tail drew one third of the stars of the sky, and threw them to the earth. The dragon stood before the woman who was about to give birth, so that when she gave birth he might devour her child. +\v 5 She gave birth to a son, a male child, who is to rule all the nations with a rod of iron. Her child was caught up to God and to his throne. +\v 6 The woman fled into the wilderness, where she has a place prepared by God, that there they may nourish her one thousand two hundred sixty days. +\p +\v 7 There was war in the sky. Michael and his angels made war on the dragon. The dragon and his angels made war. +\v 8 They didn’t prevail. No place was found for them any more in heaven. +\v 9 The great dragon was thrown down, the old serpent, he who is called the devil and Satan, the deceiver of the whole world. He was thrown down to the earth, and his angels were thrown down with him. +\p +\v 10 I heard a loud voice in heaven, saying, “Now the salvation, the power, and the Kingdom of our God, and the authority of his Christ has come; for the accuser of our brothers has been thrown down, who accuses them before our God day and night. +\v 11 They overcame him because of the Lamb’s blood, and because of the word of their testimony. They didn’t love their life, even to death. +\v 12 Therefore rejoice, heavens, and you who dwell in them. Woe to the earth and to the sea, because the devil has gone down to you, having great wrath, knowing that he has but a short time.” +\p +\v 13 When the dragon saw that he was thrown down to the earth, he persecuted the woman who gave birth to the male child. +\v 14 Two wings of the great eagle were given to the woman, that she might fly into the wilderness to her place, so that she might be nourished for a time, times, and half a time, from the face of the serpent. +\v 15 The serpent spewed water out of his mouth after the woman like a river, that he might cause her to be carried away by the stream. +\v 16 The earth helped the woman, and the earth opened its mouth and swallowed up the river which the dragon spewed out of his mouth. +\v 17 The dragon grew angry with the woman, and went away to make war with the rest of her offspring,\f + \fr 12:17 \ft or, seed\f* who keep God’s commandments and hold Jesus’ testimony. +\c 13 + +\p +\v 1 Then I stood\f + \fr 13:1 \ft NU reads \fqa he stood\f* on the sand of the sea. I saw a beast coming up out of the sea, having ten horns and seven heads. On his horns were ten crowns, and on his heads, blasphemous names. +\v 2 The beast which I saw was like a leopard, and his feet were like those of a bear, and his mouth like the mouth of a lion. The dragon gave him his power, his throne, and great authority. +\v 3 One of his heads looked like it had been wounded fatally. His fatal wound was healed, and the whole earth marveled at the beast. +\v 4 They worshiped the dragon because he gave his authority to the beast; and they worshiped the beast, saying, “Who is like the beast? Who is able to make war with him?” +\p +\v 5 A mouth speaking great things and blasphemy was given to him. Authority to make war for forty-two months was given to him. +\v 6 He opened his mouth for blasphemy against God, to blaspheme his name, his dwelling, and those who dwell in heaven. +\v 7 It was given to him to make war with the saints and to overcome them. Authority over every tribe, people, language, and nation was given to him. +\v 8 All who dwell on the earth will worship him, everyone whose name has not been written from the foundation of the world in the book of life of the Lamb who has been killed. +\v 9 If anyone has an ear, let him hear. +\v 10 If anyone is to go into captivity, he will go into captivity. If anyone is to be killed with the sword, he must be killed.\f + \fr 13:10 \ft TR reads “If anyone leads into captivity, into captivity he goes. If anyone will kill with the sword, he must be killed with a sword.” instead of “If anyone is to go into captivity, he will go into captivity. If anyone is to be killed with the sword, he must be killed.” \f* Here is the endurance and the faith of the saints. +\p +\v 11 I saw another beast coming up out of the earth. He had two horns like a lamb and it spoke like a dragon. +\v 12 He exercises all the authority of the first beast in his presence. He makes the earth and those who dwell in it to worship the first beast, whose fatal wound was healed. +\v 13 He performs great signs, even making fire come down out of the sky to the earth in the sight of people. +\v 14 He deceives my own\f + \fr 13:14 \ft NU omits “my own”\f* people who dwell on the earth because of the signs he was granted to do in front of the beast, saying to those who dwell on the earth that they should make an image to the beast who had the sword wound and lived. +\v 15 It was given to him to give breath to the image of the beast, that the image of the beast should both speak, and cause as many as wouldn’t worship the image of the beast to be killed. +\v 16 He causes all, the small and the great, the rich and the poor, and the free and the slave, to be given marks on their right hands or on their foreheads; +\v 17 and that no one would be able to buy or to sell unless he has that mark, which is the name of the beast or the number of his name. +\v 18 Here is wisdom. He who has understanding, let him calculate the number of the beast, for it is the number of a man. His number is six hundred sixty-six. +\c 14 +\p +\v 1 I saw, and behold, the Lamb standing on Mount Zion, and with him a number, one hundred forty-four thousand, having his name and the name of his Father written on their foreheads. +\v 2 I heard a sound from heaven like the sound of many waters and like the sound of a great thunder. The sound which I heard was like that of harpists playing on their harps. +\v 3 They sing a new song before the throne and before the four living creatures and the elders. No one could learn the song except the one hundred forty-four thousand, those who had been redeemed out of the earth. +\v 4 These are those who were not defiled with women, for they are virgins. These are those who follow the Lamb wherever he goes. These were redeemed by Jesus from among men, the first fruits to God and to the Lamb. +\v 5 In their mouth was found no lie, for they are blameless.\f + \fr 14:5 \ft TR adds “before the throne of God”\f* +\p +\v 6 I saw an angel flying in mid heaven, having an eternal Good News to proclaim to those who dwell on the earth—to every nation, tribe, language, and people. +\v 7 He said with a loud voice, “Fear the Lord, and give him glory, for the hour of his judgment has come. Worship him who made the heaven, the earth, the sea, and the springs of waters!” +\p +\v 8 Another, a second angel, followed, saying, “Babylon the great has fallen, which has made all the nations to drink of the wine of the wrath of her sexual immorality.” +\p +\v 9 Another angel, a third, followed them, saying with a great voice, “If anyone worships the beast and his image, and receives a mark on his forehead or on his hand, +\v 10 he also will drink of the wine of the wrath of God, which is prepared unmixed in the cup of his anger. He will be tormented with fire and sulfur in the presence of the holy angels and in the presence of the Lamb. +\v 11 The smoke of their torment goes up forever and ever. They have no rest day and night, those who worship the beast and his image, and whoever receives the mark of his name. +\p +\v 12 Here is the perseverance of the saints, those who keep the commandments of God and the faith of Jesus.” +\p +\v 13 I heard a voice from heaven saying, “Write, ‘Blessed are the dead who die in the Lord from now on.’” +\p “Yes,” says the Spirit, “that they may rest from their labors, for their works follow with them.” +\p +\v 14 I looked, and saw a white cloud, and on the cloud one sitting like a son of man,\x + \xo 14:14 \xt Daniel 7:13\x* having on his head a golden crown, and in his hand a sharp sickle. +\v 15 Another angel came out of the temple, crying with a loud voice to him who sat on the cloud, “Send your sickle and reap, for the hour to reap has come; for the harvest of the earth is ripe!” +\v 16 He who sat on the cloud thrust his sickle on the earth, and the earth was reaped. +\p +\v 17 Another angel came out of the temple which is in heaven. He also had a sharp sickle. +\v 18 Another angel came out from the altar, he who has power over fire, and he called with a great voice to him who had the sharp sickle, saying, “Send your sharp sickle and gather the clusters of the vine of the earth, for the earth’s grapes are fully ripe!” +\v 19 The angel thrust his sickle into the earth, and gathered the vintage of the earth and threw it into the great wine press of the wrath of God. +\v 20 The wine press was trodden outside of the city, and blood came out of the wine press, up to the bridles of the horses, as far as one thousand six hundred stadia.\f + \fr 14:20 \ft 1600 stadia = 296 kilometers or 184 miles\f* +\c 15 +\p +\v 1 I saw another great and marvelous sign in the sky: seven angels having the seven last plagues, for in them God’s wrath is finished. +\p +\v 2 I saw something like a sea of glass mixed with fire, and those who overcame the beast, his image,\f + \fr 15:2 \ft TR adds “his mark,”\f* and the number of his name, standing on the sea of glass, having harps of God. +\v 3 They sang the song of Moses, the servant of God, and the song of the Lamb, saying, +\q1 “Great and marvelous are your works, Lord God, the Almighty! +\q2 Righteous and true are your ways, you King of the nations. +\q1 +\v 4 Who wouldn’t fear you, Lord, +\q2 and glorify your name? +\q1 For you only are holy. +\q2 For all the nations will come and worship before you. +\q2 For your righteous acts have been revealed.” +\p +\v 5 After these things I looked, and the temple of the tabernacle of the testimony in heaven was opened. +\v 6 The seven angels who had the seven plagues came out, clothed with pure, bright linen, and wearing golden sashes around their chests. +\p +\v 7 One of the four living creatures gave to the seven angels seven golden bowls full of the wrath of God, who lives forever and ever. +\v 8 The temple was filled with smoke from the glory of God and from his power. No one was able to enter into the temple until the seven plagues of the seven angels would be finished. +\c 16 +\p +\v 1 I heard a loud voice out of the temple, saying to the seven angels, “Go and pour out the seven bowls of the wrath of God on the earth!” +\p +\v 2 The first went, and poured out his bowl into the earth, and it became a harmful and painful sore on the people who had the mark of the beast, and who worshiped his image. +\p +\v 3 The second angel poured out his bowl into the sea, and it became blood as of a dead man. Every living thing in the sea died. +\p +\v 4 The third poured out his bowl into the rivers and springs of water, and they became blood. +\v 5 I heard the angel of the waters saying, “You are righteous, who are and who were, O Holy One, because you have judged these things. +\v 6 For they poured out the blood of saints and prophets, and you have given them blood to drink. They deserve this.” +\p +\v 7 I heard the altar saying, “Yes, Lord God, the Almighty, true and righteous are your judgments.” +\p +\v 8 The fourth poured out his bowl on the sun, and it was given to him to scorch men with fire. +\v 9 People were scorched with great heat, and people blasphemed the name of God who has the power over these plagues. They didn’t repent and give him glory. +\p +\v 10 The fifth poured out his bowl on the throne of the beast, and his kingdom was darkened. They gnawed their tongues because of the pain, +\v 11 and they blasphemed the God of heaven because of their pains and their sores. They still didn’t repent of their works. +\p +\v 12 The sixth poured out his bowl on the great river, the Euphrates. Its water was dried up, that the way might be prepared for the kings that come from the sunrise.\f + \fr 16:12 \ft or, east\f* +\v 13 I saw coming out of the mouth of the dragon, and out of the mouth of the beast, and out of the mouth of the false prophet, three unclean spirits, something like frogs; +\v 14 for they are spirits of demons, performing signs, which go out to the kings of the whole inhabited earth, to gather them together for the war of that great day of God the Almighty. +\p +\v 15 \wj “Behold, I come like a thief. Blessed is he who watches, and keeps his clothes, so that he doesn’t walk naked, and they see his shame.” \wj* +\v 16 He gathered them together into the place which is called in Hebrew, “Harmagedon”. +\p +\v 17 The seventh poured out his bowl into the air. A loud voice came out of the temple of heaven, from the throne, saying, “It is done!” +\v 18 There were lightnings, sounds, and thunders; and there was a great earthquake such as has not happened since there were men on the earth—so great an earthquake and so mighty. +\v 19 The great city was divided into three parts, and the cities of the nations fell. Babylon the great was remembered in the sight of God, to give to her the cup of the wine of the fierceness of his wrath. +\v 20 Every island fled away, and the mountains were not found. +\v 21 Great hailstones, about the weight of a talent,\f + \fr 16:21 \ft A talent is about 30 kilograms or 66 pounds.\f* came down out of the sky on people. People blasphemed God because of the plague of the hail, for this plague was exceedingly severe. +\c 17 +\p +\v 1 One of the seven angels who had the seven bowls came and spoke with me, saying, “Come here. I will show you the judgment of the great prostitute who sits on many waters, +\v 2 with whom the kings of the earth committed sexual immorality. Those who dwell in the earth were made drunken with the wine of her sexual immorality.” +\v 3 He carried me away in the Spirit into a wilderness. I saw a woman sitting on a scarlet-colored beast, full of blasphemous names, having seven heads and ten horns. +\v 4 The woman was dressed in purple and scarlet, and decked with gold and precious stones and pearls, having in her hand a golden cup full of abominations and the impurities of the sexual immorality of the earth. +\v 5 And on her forehead a name was written, “MYSTERY, BABYLON THE GREAT, THE MOTHER OF THE PROSTITUTES AND OF THE ABOMINATIONS OF THE EARTH.” +\v 6 I saw the woman drunken with the blood of the saints and with the blood of the martyrs of Jesus. When I saw her, I wondered with great amazement. +\p +\v 7 The angel said to me, “Why do you wonder? I will tell you the mystery of the woman and of the beast that carries her, which has the seven heads and the ten horns. +\v 8 The beast that you saw was, and is not; and is about to come up out of the abyss and to go into destruction. Those who dwell on the earth and whose names have not been written in the book of life from the foundation of the world will marvel when they see that the beast was, and is not, and shall be present.\f + \fr 17:8 \ft TR reads “yet is” instead of “shall be present”\f* +\p +\v 9 Here is the mind that has wisdom. The seven heads are seven mountains on which the woman sits. +\v 10 They are seven kings. Five have fallen, the one is, and the other has not yet come. When he comes, he must continue a little while. +\v 11 The beast that was, and is not, is himself also an eighth, and is of the seven; and he goes to destruction. +\v 12 The ten horns that you saw are ten kings who have received no kingdom as yet, but they receive authority as kings with the beast for one hour. +\v 13 These have one mind, and they give their power and authority to the beast. +\v 14 These will war against the Lamb, and the Lamb will overcome them, for he is Lord of lords and King of kings; and those who are with him are called, chosen, and faithful.” +\v 15 He said to me, “The waters which you saw, where the prostitute sits, are peoples, multitudes, nations, and languages. +\v 16 The ten horns which you saw, they and the beast will hate the prostitute, will make her desolate, will strip her naked, will eat her flesh, and will burn her utterly with fire. +\v 17 For God has put in their hearts to do what he has in mind, to be of one mind, and to give their kingdom to the beast, until the words of God should be accomplished. +\v 18 The woman whom you saw is the great city which reigns over the kings of the earth.” +\c 18 +\p +\v 1 After these things, I saw another angel coming down out of the sky, having great authority. The earth was illuminated with his glory. +\v 2 He cried with a mighty voice, saying, “Fallen, fallen is Babylon the great, and she has become a habitation of demons, a prison of every unclean spirit, and a prison of every unclean and hated bird! +\v 3 For all the nations have drunk of the wine of the wrath of her sexual immorality, the kings of the earth committed sexual immorality with her, and the merchants of the earth grew rich from the abundance of her luxury.” +\p +\v 4 I heard another voice from heaven, saying, “Come out of her, my people, that you have no participation in her sins, and that you don’t receive of her plagues, +\v 5 for her sins have reached to the sky, and God has remembered her iniquities. +\v 6 Return to her just as she returned, and repay her double as she did, and according to her works. In the cup which she mixed, mix to her double. +\v 7 However much she glorified herself and grew wanton, so much give her of torment and mourning. For she says in her heart, ‘I sit a queen, and am no widow, and will in no way see mourning.’ +\v 8 Therefore in one day her plagues will come: death, mourning, and famine; and she will be utterly burned with fire, for the Lord God who has judged her is strong. +\p +\v 9 The kings of the earth who committed sexual immorality and lived wantonly with her will weep and wail over her, when they look at the smoke of her burning, +\v 10 standing far away for the fear of her torment, saying, ‘Woe, woe, the great city, Babylon, the strong city! For your judgment has come in one hour.’ +\v 11 The merchants of the earth weep and mourn over her, for no one buys their merchandise any more: +\v 12 merchandise of gold, silver, precious stones, pearls, fine linen, purple, silk, scarlet, all expensive wood, every vessel of ivory, every vessel made of most precious wood, and of brass, and iron, and marble; +\v 13 and cinnamon, incense, perfume, frankincense, wine, olive oil, fine flour, wheat, sheep, horses, chariots, and people’s bodies and souls. +\v 14 The fruits which your soul lusted after have been lost to you. All things that were dainty and sumptuous have perished from you, and you will find them no more at all. +\v 15 The merchants of these things, who were made rich by her, will stand far away for the fear of her torment, weeping and mourning, +\v 16 saying, ‘Woe, woe, the great city, she who was dressed in fine linen, purple, and scarlet, and decked with gold and precious stones and pearls! +\v 17 For in an hour such great riches are made desolate.’ Every ship master, and everyone who sails anywhere, and mariners, and as many as gain their living by sea, stood far away, +\v 18 and cried out as they looked at the smoke of her burning, saying, ‘What is like the great city?’ +\v 19 They cast dust on their heads, and cried, weeping and mourning, saying, ‘Woe, woe, the great city, in which all who had their ships in the sea were made rich by reason of her great wealth!’ For she is made desolate in one hour. +\p +\v 20 “Rejoice over her, O heaven, you saints, apostles, and prophets, for God has judged your judgment on her.” +\p +\v 21 A mighty angel took up a stone like a great millstone and cast it into the sea, saying, “Thus with violence will Babylon, the great city, be thrown down, and will be found no more at all. +\v 22 The voice of harpists, minstrels, flute players, and trumpeters will be heard no more at all in you. No craftsman of whatever craft will be found any more at all in you. The sound of a mill will be heard no more at all in you. +\v 23 The light of a lamp will shine no more at all in you. The voice of the bridegroom and of the bride will be heard no more at all in you, for your merchants were the princes of the earth; for with your sorcery all the nations were deceived. +\v 24 In her was found the blood of prophets and of saints, and of all who have been slain on the earth.” +\c 19 +\p +\v 1 After these things I heard something like a loud voice of a great multitude in heaven, saying, “Hallelujah! Salvation, power, and glory belong to our God; +\v 2 for his judgments are true and righteous. For he has judged the great prostitute who corrupted the earth with her sexual immorality, and he has avenged the blood of his servants at her hand.” +\p +\v 3 A second said, “Hallelujah! Her smoke goes up forever and ever.” +\v 4 The twenty-four elders and the four living creatures fell down and worshiped God who sits on the throne, saying, “Amen! Hallelujah!” +\p +\v 5 A voice came from the throne, saying, “Give praise to our God, all you his servants, you who fear him, the small and the great!” +\p +\v 6 I heard something like the voice of a great multitude, and like the voice of many waters, and like the voice of mighty thunders, saying, “Hallelujah! For the Lord our God, the Almighty, reigns! +\v 7 Let’s rejoice and be exceedingly glad, and let’s give the glory to him. For the wedding of the Lamb has come, and his wife has made herself ready.” +\v 8 It was given to her that she would array herself in bright, pure, fine linen, for the fine linen is the righteous acts of the saints. +\p +\v 9 He said to me, “Write, ‘Blessed are those who are invited to the wedding supper of the Lamb.’” He said to me, “These are true words of God.” +\p +\v 10 I fell down before his feet to worship him. He said to me, “Look! Don’t do it! I am a fellow bondservant with you and with your brothers who hold the testimony of Jesus. Worship God, for the testimony of Jesus is the Spirit of Prophecy.” +\p +\v 11 I saw the heaven opened, and behold, a white horse, and he who sat on it is called Faithful and True. In righteousness he judges and makes war. +\v 12 His eyes are a flame of fire, and on his head are many crowns. He has names written and a name written which no one knows but he himself. +\v 13 He is clothed in a garment sprinkled with blood. His name is called “The Word of God.” +\v 14 The armies which are in heaven, clothed in white, pure, fine linen, followed him on white horses. +\v 15 Out of his mouth proceeds a sharp, double-edged sword that with it he should strike the nations. He will rule them with an iron rod.\x + \xo 19:15 \xt Psalm 2:9 \x* He treads the wine press of the fierceness of the wrath of God, the Almighty. +\v 16 He has on his garment and on his thigh a name written, “KING OF KINGS AND LORD OF LORDS.” +\p +\v 17 I saw an angel standing in the sun. He cried with a loud voice, saying to all the birds that fly in the sky, “Come! Be gathered together to the great supper of God,\f + \fr 19:17 \ft TR reads “supper of the great God” instead of “great supper of God”\f* +\v 18 that you may eat the flesh of kings, the flesh of captains, the flesh of mighty men, and the flesh of horses and of those who sit on them, and the flesh of all men, both free and slave, small and great.” +\v 19 I saw the beast, the kings of the earth, and their armies, gathered together to make war against him who sat on the horse and against his army. +\v 20 The beast was taken, and with him the false prophet who worked the signs in his sight, with which he deceived those who had received the mark of the beast and those who worshiped his image. These two were thrown alive into the lake of fire that burns with sulfur. +\v 21 The rest were killed with the sword of him who sat on the horse, the sword which came out of his mouth. So all the birds were filled with their flesh. +\c 20 +\p +\v 1 I saw an angel coming down out of heaven, having the key of the abyss and a great chain in his hand. +\v 2 He seized the dragon, the old serpent, who is the devil and Satan, who deceives the whole inhabited earth,\f + \fr 20:2 \ft TR and NU omit “who deceives the whole inhabited earth”.\f* and bound him for a thousand years, +\v 3 and cast him into the abyss, and shut it and sealed it over him, that he should deceive the nations no more until the thousand years were finished. After this, he must be freed for a short time. +\p +\v 4 I saw thrones, and they sat on them, and judgment was given to them. I saw the souls of those who had been beheaded for the testimony of Jesus and for the word of God, and such as didn’t worship the beast nor his image, and didn’t receive the mark on their forehead and on their hand. They lived and reigned with Christ for a thousand years. +\v 5 The rest of the dead didn’t live until the thousand years were finished. This is the first resurrection. +\v 6 Blessed and holy is he who has part in the first resurrection. Over these, the second death has no power, but they will be priests of God and of Christ, and will reign with him one thousand years. +\p +\v 7 And after the thousand years, Satan will be released from his prison +\v 8 and he will come out to deceive the nations which are in the four corners of the earth, Gog and Magog, to gather them together to the war, whose number is as the sand of the sea. +\v 9 They went up over the width of the earth and surrounded the camp of the saints and the beloved city. Fire came down out of heaven from God and devoured them. +\v 10 The devil who deceived them was thrown into the lake of fire and sulfur, where the beast and the false prophet are also. They will be tormented day and night forever and ever. +\p +\v 11 I saw a great white throne and him who sat on it, from whose face the earth and the heaven fled away. There was found no place for them. +\v 12 I saw the dead, the great and the small, standing before the throne, and they opened books. Another book was opened, which is the book of life. The dead were judged out of the things which were written in the books, according to their works. +\v 13 The sea gave up the dead who were in it. Death and Hades\f + \fr 20:13 \ft or, Hell \f* gave up the dead who were in them. They were judged, each one according to his works. +\v 14 Death and Hades\f + \fr 20:14 \ft or, Hell\f* were thrown into the lake of fire. This is the second death, the lake of fire. +\v 15 If anyone was not found written in the book of life, he was cast into the lake of fire. +\c 21 + +\p +\v 1 I saw a new heaven and a new earth, for the first heaven and the first earth have passed away, and the sea is no more. +\v 2 I saw the holy city, New Jerusalem, coming down out of heaven from God, prepared like a bride adorned for her husband. +\v 3 I heard a loud voice out of heaven saying, “Behold, God’s dwelling is with people; and he will dwell with them, and they will be his people, and God himself will be with them as their God. +\v 4 He will wipe away every tear from their eyes. Death will be no more; neither will there be mourning, nor crying, nor pain any more. The first things have passed away.” +\p +\v 5 He who sits on the throne said, \wj “Behold, I am making all things new.”\wj* He said, \wj “Write, for these words of God are faithful and true.” \wj* +\v 6 He said to me, \wj “I am the Alpha and the Omega, the Beginning and the End. I will give freely to him who is thirsty from the spring of the water of life. \wj* +\v 7 \wj He who overcomes, I will give him these things. I will be his God, and he will be my son. \wj* +\v 8 \wj But for the cowardly, unbelieving, sinners,\wj*\f + \fr 21:8 \ft TR and NU omit “sinners”\f* \wj abominable, murderers, sexually immoral, sorcerers,\wj*\f + \fr 21:8 \ft The word for “sorcerers” here also includes users of potions and drugs.\f* \wj idolaters, and all liars, their part is in the lake that burns with fire and sulfur, which is the second death.”\wj* +\p +\v 9 One of the seven angels who had the seven bowls which were loaded with the seven last plagues came, and he spoke with me, saying, “Come here. I will show you the bride, the Lamb’s wife.” +\v 10 He carried me away in the Spirit to a great and high mountain, and showed me the holy city, Jerusalem, coming down out of heaven from God, +\v 11 having the glory of God. Her light was like a most precious stone, like a jasper stone, clear as crystal; +\v 12 having a great and high wall with twelve gates, and at the gates twelve angels, and names written on them, which are the names of the twelve tribes of the children of Israel. +\v 13 On the east were three gates, and on the north three gates, and on the south three gates, and on the west three gates. +\v 14 The wall of the city had twelve foundations, and on them twelve names of the twelve Apostles of the Lamb. +\p +\v 15 He who spoke with me had for a measure a golden reed to measure the city, its gates, and its walls. +\v 16 The city is square. Its length is as great as its width. He measured the city with the reed: twelve thousand twelve stadia.\f + \fr 21:16 \ft 12,012 stadia = 2,221 kilometers or 1,380 miles. TR reads 12,000 stadia instead of 12,012 stadia.\f* Its length, width, and height are equal. +\v 17 Its wall is one hundred forty-four cubits,\f + \fr 21:17 \ft 144 cubits is about 65.8 meters or 216 feet\f* by the measure of a man, that is, of an angel. +\v 18 The construction of its wall was jasper. The city was pure gold, like pure glass. +\v 19 The foundations of the city’s wall were adorned with all kinds of precious stones. The first foundation was jasper, the second sapphire;\f + \fr 21:19 \ft or, lapis lazuli\f* the third chalcedony, the fourth emerald, +\v 20 the fifth sardonyx, the sixth sardius, the seventh chrysolite, the eighth beryl, the ninth topaz, the tenth chrysoprase, the eleventh jacinth, and the twelfth amethyst. +\v 21 The twelve gates were twelve pearls. Each one of the gates was made of one pearl. The street of the city was pure gold, like transparent glass. +\p +\v 22 I saw no temple in it, for the Lord God the Almighty and the Lamb are its temple. +\v 23 The city has no need for the sun or moon to shine, for the very glory of God illuminated it and its lamp is the Lamb. +\v 24 The nations will walk in its light. The kings of the earth bring the glory and honor of the nations into it. +\v 25 Its gates will in no way be shut by day (for there will be no night there), +\v 26 and they shall bring the glory and the honor of the nations into it so that they may enter. +\v 27 There will in no way enter into it anything profane, or one who causes an abomination or a lie, but only those who are written in the Lamb’s book of life. +\c 22 +\p +\v 1 He showed me a\f + \fr 22:1 \ft TR adds “pure”\f* river of water of life, clear as crystal, proceeding out of the throne of God and of the Lamb, +\v 2 in the middle of its street. On this side of the river and on that was the tree of life, bearing twelve kinds of fruits, yielding its fruit every month. The leaves of the tree were for the healing of the nations. +\v 3 There will be no curse any more. The throne of God and of the Lamb will be in it, and his servants will serve him. +\v 4 They will see his face, and his name will be on their foreheads. +\v 5 There will be no night, and they need no lamp light or sun light; for the Lord God will illuminate them. They will reign forever and ever. +\p +\v 6 He said to me, “These words are faithful and true. The Lord God of the spirits of the prophets sent his angel to show to his bondservants the things which must happen soon.” +\p +\v 7 \wj “Behold, I am coming soon! Blessed is he who keeps the words of the prophecy of this book.”\wj* +\p +\v 8 Now I, John, am the one who heard and saw these things. When I heard and saw, I fell down to worship before the feet of the angel who had shown me these things. +\v 9 He said to me, “You must not do that! I am a fellow bondservant with you and with your brothers, the prophets, and with those who keep the words of this book. Worship God.” +\v 10 He said to me, “Don’t seal up the words of the prophecy of this book, for the time is at hand. +\v 11 He who acts unjustly, let him act unjustly still. He who is filthy, let him be filthy still. He who is righteous, let him do righteousness still. He who is holy, let him be holy still.” +\p +\v 12 \wj “Behold, I am coming soon! My reward is with me, to repay to each man according to his work. \wj* +\v 13 \wj I am the Alpha and the Omega, the First and the Last, the Beginning and the End. \wj* +\v 14 \wj Blessed are those who do his commandments,\wj*\f + \fr 22:14 \ft NU reads “wash their robes” instead of “do his commandments”.\f* \wj that they may have the right to the tree of life, and may enter in by the gates into the city. \wj* +\v 15 \wj Outside are the dogs, the sorcerers, the sexually immoral, the murderers, the idolaters, and everyone who loves and practices falsehood. \wj* +\v 16 \wj I, Jesus, have sent my angel to testify these things to you for the assemblies. I am the root and the offspring of David, the Bright and Morning Star.”\wj* +\p +\v 17 The Spirit and the bride say, “Come!” He who hears, let him say, “Come!” He who is thirsty, let him come. He who desires, let him take the water of life freely. +\p +\v 18 I testify to everyone who hears the words of the prophecy of this book: if anyone adds to them, God will add to him the plagues which are written in this book. +\v 19 If anyone takes away from the words of the book of this prophecy, God will take away his part from the tree\f + \fr 22:19 \ft TR reads “Book” instead of “tree”\f* of life, and out of the holy city, which are written in this book. +\v 20 He who testifies these things says, \wj “Yes, I am coming soon.” \wj* +\p Amen! Yes, come, Lord Jesus! +\p +\v 21 The grace of the Lord Jesus Christ be with all the saints. Amen. diff --git a/c-sharp/assets/WEB/68TOBengWEBUS.SFM b/c-sharp/assets/WEB/68TOBengWEBUS.SFM new file mode 100644 index 0000000000..68feedbaef --- /dev/null +++ b/c-sharp/assets/WEB/68TOBengWEBUS.SFM @@ -0,0 +1,407 @@ +\id TOB - Tobit +\h Tobit +\toc1 Tobit +\toc2 Tobit +\toc3 Tobit +\mt1 Tobit +\ip \bk Tobit\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\c 1 + +\p +\v 1 The book of the words of Tobit, the son of Tobiel, the son of Ananiel, the son of Aduel, the son of Gabael, of the seed of Asiel, of the tribe of Naphtali; +\v 2 who in the days of Enemessar\f + \fr 1:2 \ft That is, \fqa Shalmaneser. \ft Compare 2 Kings 17:3, 23. \f* king of the Assyrians was carried away captive out of Thisbe, which is on the right hand of Kedesh Naphtali in Galilee above Asher. +\p +\v 3 I, Tobit walked in the ways of truth and righteousness all the days of my life, and I did many alms deeds to my kindred and my nation, who went with me into the land of the Assyrians, to Nineveh. +\v 4 When I was in my own country, in the land of Israel, while I was yet young, all the tribe of Naphtali my father fell away from the house of Jerusalem, which was chosen out of all the tribes of Israel, that all the tribes should sacrifice there, and the temple of the habitation of the Most High was hallowed and built therein for all ages. +\v 5 All the tribes which fell away together sacrificed to the heifer Baal, and so did the house of Naphtali my father. +\v 6 I alone went often to Jerusalem at the feasts, as it has been ordained to all Israel by an everlasting decree, having the first fruits and the tenths of my increase, and that which was first shorn; and I gave them at the altar to the priests the sons of Aaron. +\v 7 I gave a tenth part of all my increase to the sons of Levi, who ministered at Jerusalem. A second tenth part I sold away, and went, and spent it each year at Jerusalem. +\v 8 A third tenth I gave to them to whom it was appropriate, as Deborah my father’s mother had commanded me, because I was left an orphan by my father. +\v 9 When I became a man, I took as wife Anna of the seed of our own family. With her, I became the father of Tobias. +\v 10 When I was carried away captive to Nineveh, all my kindred and my relatives ate of the bread of the Gentiles; +\v 11 but I kept myself from eating, +\v 12 because I remembered God with all my soul. +\v 13 So the Most High gave me grace and favor\f + \fr 1:13 \ft Gr. \fqa beauty. \f* in the sight of Enemessar, and I was his purchasing agent. +\v 14 And I went into Media, and left ten talents of silver in trust with Gabael, the brother of Gabrias, at Rages of Media. +\p +\v 15 And when Enemessar was dead, Sennacherib his son reigned in his place. In his time, the highways were troubled,\f + \fr 1:15 \ft Gr. \fqa his highways were troubled. \f* and I could no longer go into Media. +\v 16 In the days of Enemessar, I did many alms deeds to my kindred: I gave my bread to the hungry, +\v 17 and my garments to the naked. If I saw any of my race dead, and thrown out on\f + \fr 1:17 \ft Some ancient authorities read \fqa behind. \f* the wall of Ninevah, I buried him. +\v 18 If Sennacherib the king killed any, when he came fleeing from Judea, I buried them privately; for in his wrath he killed many; and the bodies were sought for by the king, and were not found. +\v 19 But one of the Ninevites went and showed to the king concerning me, how I buried them, and hid myself; and when I knew that I was sought for to be put to death, I withdrew myself for fear. +\v 20 And all my goods were forcibly taken away, and there was nothing left to me, save my wife Anna and my son Tobias. +\v 21 No more than fifty five days passed before two of his sons killed him, and they fled into the mountains of Ararat. And Sarchedonus\f + \fr 1:21 \ft That is, \fqa Esar-haddon, \ft and so in verse 22. \f* his son reigned in his place; and he appointed Achiacharus my brother Anael’s son over all the accounts of his kingdom, and over all his affairs. +\v 22 Achiacharus requested me, and I came to Nineveh. Now Achiacharus was cupbearer, keeper of the signet, steward, and overseer of the accounts. Sarchedonus appointed him next to himself, but he was my brother’s son. +\c 2 +\p +\v 1 Now when I had come home again, and my wife Anna was restored to me, and my son Tobias, in the feast of Pentecost, which is the holy feast of the seven weeks, there was a good dinner prepared for me, and I sat down to eat. +\v 2 I saw abundance of meat, and I said to my son, “Go and bring whatever poor man you find of our kindred, who is mindful of the Lord. Behold, I wait for you.” +\p +\v 3 Then he came, and said, “Father, one of our race is strangled, and has been cast out in the marketplace.” +\v 4 Before I had tasted anything, I sprang up, and took him up into a chamber until the sun had set. +\v 5 Then I returned, washed myself, ate my bread in heaviness, +\v 6 and remembered the prophecy of Amos, as he said, +\q1 \x + \xo 2:6 \xt Amos 8:10\x*“Your feasts will be turned into mourning, +\q2 and all your mirth into lamentation. +\p +\v 7 So I wept: and when the sun had set, I went and dug a grave, and buried him. +\v 8 My neighbors mocked me, and said, “He is no longer afraid to be put to death for this matter; and yet he fled away. Behold, he buries the dead again.” +\v 9 The same night I returned from burying him, and slept by the wall of my courtyard, being polluted; and my face was uncovered. +\v 10 I didn’t know that there were sparrows in the wall. My eyes were open and the sparrows dropped warm dung into my eyes, and white films came over my eyes. I went to the physicians, and they didn’t help me; but Achiacharus nourished me, until I went\f + \fr 2:10 \ft Some authorities read \fqa until he went. \f* into Elymais. +\p +\v 11 My wife Anna wove cloth in the women’s chambers, +\v 12 and sent the work back to the owners. They on their part paid her wages, and also gave her a kid. +\v 13 But when it came to my house, it began to cry, and I said to her, “Where did this kid come from? Is it stolen? Give it back to the owners; for it is not lawful to eat anything that is stolen.” +\v 14 But she said, “It has been given to me for a gift more than the wages.” +\p I didn’t believe her, and I asked her to return it to the owners; and I was ashamed of her. +\p But she answered and said to me, “Where are your alms and your righteous deeds? Behold, you and all your works are known.\f + \fr 2:14 \ft Gr. \fqa all things are known with you. \f*” +\c 3 +\p +\v 1 I was grieved and wept, and prayed in sorrow, saying, +\p +\v 2 “O Lord, you are righteous, and all your works and all your ways are mercy and truth, and you judge true and righteous judgment forever. +\v 3 Remember me, and look at me. Don’t take vengeance on me for my sins and my ignorances, and the sins of my fathers who sinned before you. +\v 4 For they disobeyed your commandments. You gave us as plunder, for captivity, for death, and for a proverb of reproach to all the nations among whom we are dispersed. +\v 5 Now your judgments are many and true, that you should deal with me according to my sins and the sins of my fathers, because we didn’t keep your commandments, for we didn’t walk in truth before you. +\v 6 Now deal with me according to that which is pleasing in your sight. Command my spirit to be taken from me, that I may be released, and become earth. For it is more profitable for me to die rather than to live, because I have heard false reproaches, and there is much sorrow in me. Command that I be released from my distress, now, and go to the everlasting place. Don’t turn your face away from me.” +\p +\v 7 The same day it happened to Sarah the daughter of Raguel in Ecbatana of Media, that she also was reproached by her father’s maidservants; +\v 8 because that she had been given to seven husbands, and Asmodaeus the evil spirit\f + \fr 3:8 \ft Gr. \fqa demon. \f* killed them, before they had lain with her. And they said to her, “Do you not know that you strangle your husbands? You have had already seven husbands, and you haven’t borne the name of any one of them. +\v 9 Why do you scourge us? If they are dead, go your ways with them. Let us never see either son or daughter from you.” +\v 10 When she heard these things, she was grieved exceedingly, so that she thought about hanging herself. Then she said, “I am the only daughter of my father. If I do this, it will be a reproach to him, and I will bring down his old age with sorrow to the grave.\f + \fr 3:10 \ft Gr. \fqa Hades. \f*” +\v 11 Then she prayed by the window, and said, “Blessed are you, O Lord my God, and blessed is your holy and honorable name forever! Let all your works praise you forever! +\v 12 And now, Lord, I have set my eyes and my face toward you. +\v 13 Command that I be released from the earth, and that I no longer hear reproach. +\v 14 You know, Lord, that I am pure from all sin with man, +\v 15 and that I never polluted my name or the name of my father in the land of my captivity. I am the only daughter of my father, and he has no child that will be his heir, nor brother near him, nor son belonging to him, that I should keep myself for a wife to him. Seven husbands of mine are dead already. Why should I live? If it doesn’t please you to kill me, command some regard to be had of me, and pity taken of me, and that I hear no more reproach.” +\p +\v 16 The prayer of both was heard before the glory of the great God. +\v 17 Raphael also was sent to heal them both, to scale away the white films from Tobit’s eyes, and to give Sarah the daughter of Raguel for a wife to Tobias the son of Tobit; and to bind Asmodaeus the evil spirit\f + \fr 3:17 \ft Gr. \fqa demon. \f*; because it belonged to Tobias that he should inherit her. At that very time, Tobit returned and entered into his house, and Sarah the daughter of Raguel came down from her upper chamber. +\c 4 +\p +\v 1 In that day Tobit remembered the money which he had left in trust with Gabael in Rages of Media, +\v 2 and he said to himself, I have asked for death; why do I not call my son Tobias, that I may explain to him about the money before I die? +\v 3 And he called him, and said, +\p “My child, if I die, bury me. Don’t despise your mother. Honor her all the days of your life, and do that which is pleasing to her, and don’t grieve her. +\v 4 Remember, my child, that she has seen many dangers for you, when you were in her womb. When she is dead, bury her by me in one grave. +\v 5 My child, be mindful of the Lord our God all your days, and don’t let your will be set to sin and to transgress his commandments: do righteousness all the days of your life, and don’t follow the ways of unrighteousness. +\v 6 For if you do what is true, your deeds will prosperously succeed for you, and for all those who do righteousness. +\v 7 Give alms from your possessions. When you give alms, don’t let your eye be envious. Don’t turn away your face from any poor man, and the face of God won’t be turned away from you. +\v 8 As your possessions are, give alms of it according to your abundance. If you have little, don’t be afraid to give alms according to that little; +\v 9 for you lay up a good treasure for yourself against the day of necessity; +\v 10 because alms-giving delivers from death, and doesn’t allow you to come into darkness. +\v 11 Alms is a good gift in the sight of the Most High for all that give it. +\v 12 Beware, my child, of all fornication, and take first a wife of the seed of your fathers. Don’t take a strange wife, who is not of your father’s tribe; for we are the descendants of the prophets. Remember, my child, that Noah, Abraham, Isaac, and Jacob, our fathers of old time, all took wives of their kindred, and were blessed in their children, and their seed will inherit the land. +\v 13 And now, my child, love your kindred, and don’t scorn your kindred and the sons and the daughters of your people in your heart, to take a wife of them; for in scornfulness is destruction and much trouble, and in idleness is decay and great lack; for idleness is the mother of famine. +\v 14 Don’t let the wages of any man who works for you wait with you, but give it to him out of hand. If you serve God, you will be rewarded. Take heed to yourself, my child, in all your works, and be discreet in all your behavior. +\v 15 And what you yourself hate, do to no man. Don’t drink wine to drunkenness, and don’t let drunkenness go with you on your way. +\v 16 Give of your bread to the hungry, and of your garments to those who are naked. Give alms from all your abundance. Don’t let your eye be envious when you give alms. +\v 17 Pour out your bread on the burial\f + \fr 4:17 \ft Or, \fqa tomb \f* of the just, and give nothing to sinners. +\v 18 Ask counsel of every man who is wise, and don’t despise any counsel that is profitable. +\v 19 Bless the Lord your God at all times, and ask of him that your ways may be made straight, and that all your paths and counsels may prosper; for every nation has no counsel; but the Lord himself gives all good things, and he humbles whom he will, as he will. And now, my child, remember my commandments, and let them not be blotted out of your mind. +\v 20 And now I explain to you about the ten talents of silver, which I left in trust with Gabael the son of Gabrias at Rages of Media. +\v 21 And fear not, my child, because we are made poor. You have much wealth, if you fear God, and depart from all sin, and do that which is pleasing in his sight.” +\c 5 +\p +\v 1 Then Tobias answered and said to him, “Father, I will do all things, whatever you have commanded me. +\v 2 But how could I receive the money, since I don’t know him?” +\p +\v 3 He gave him the handwriting, and said to him, “Seek a man who will go with you, and I will give him wages, while I still live; and go and receive the money.” +\p +\v 4 He went to seek a man, and found Raphael who was an angel; +\v 5 and he didn’t know it. He said to him, “Can I go with you to Rages of Media? Do you know those places well?” +\p +\v 6 The angel said to him, “I will go with you. I know the way well. I have lodged with our brother Gabael.” +\p +\v 7 Tobias said to him, “Wait for me, and I will tell my father.” +\p +\v 8 He said to him, “Go, and don’t wait. And he went in and said to his father, “Behold, I have found someone who will go with me.” +\p But he said, “Call him to me, that I may know of what tribe he is, and whether he be a trustworthy man to go with you.” +\p +\v 9 So he called him, and he came in, and they saluted one another. +\v 10 And Tobit said to him, “Brother, of what tribe and of what family are you? Tell me.” +\p +\v 11 He said to him, “Do you seek a tribe and a family, or a hired man which will go with your son?” +\p And Tobit said to him, “I want to know, brother, your kindred and your name.” +\p +\v 12 And he said, “I am Azarias, the son of Ananias the great, of your kindred.” +\p +\v 13 And he said to him, “Welcome, brother. Don’t be angry with me, because I sought to know your tribe and family. You are my brother, of an honest and good lineage; for I knew Ananias and Jathan, the sons of Shemaiah the great, when we went together to Jerusalem to worship, and offered the firstborn, and the tenths of our increase; and they didn’t go astray in the error of our kindred. My brother, you are of a great stock. +\v 14 But tell me, what wages shall I give you? A drachma a day, and those things that be necessary for you, as to my son? +\v 15 And moreover, if you both return safe and sound, I will add something to your wages.” +\p +\v 16 And so they agreed. And he said to Tobias, “Prepare yourself for the journey. May God prosper you.” So his son prepared what was needful for the journey, and his father said to him, “Go with this man; but God, who dwells in heaven, will prosper your journey. May his angel go with you.” +\p Then they both departed, and the young man’s dog went with them. +\v 17 But Anna his mother wept, and said to Tobit, “Why have you sent away our child? Isn’t he the staff of our hand, in going in and out before us? +\v 18 Don’t be greedy to add money to money; but let it be as refuse compared to our child. +\v 19 For what the Lord has given us to live is enough for us.” +\p +\v 20 Tobit said to her, “Don’t worry, my sister. He will return safe and sound, and your eyes will see him. +\v 21 For a good angel will go with him. His journey will be prospered, and he will return safe and sound.” +\p +\v 22 So she stopped weeping. +\c 6 +\p +\v 1 Now as they went on their journey, they came at evening to the river Tigris, and they lodged there. +\v 2 But the young man went down to wash himself, and a fish leaped out of the river, and would have swallowed up the young man. +\v 3 But the angel said to him, “Grab the fish!” +\p So the young man grabbed the fish, and hauled it up onto the land. +\p +\v 4 And the angel said to him, “Cut the fish open, and take the heart, the liver, and the bile, and keep them with you.” +\v 5 And the young man did as the angel commanded him; but they roasted the fish, and ate it. And they both went on their way, till they drew near to Ecbatana. +\p +\v 6 The young man said to the angel, “Brother Azarias, of what use is the heart, the liver, and the bile of the fish?” +\p +\v 7 He said to him, “About the heart and the liver: If a demon or an evil spirit troubles anyone, we must burn those and make smoke of them before the man or the woman, and the affliction will flee. +\v 8 But as for the bile, it is good to anoint a man that has white films in his eyes, and he will be healed.” +\p +\v 9 But when they drew near to Rages, +\v 10 the angel said to the young man, “Brother, today we will lodge with Raguel. He is your kinsman. He has an only daughter named Sarah. I will speak about her, that she should be given to you for a wife. +\v 11 For her inheritance belongs to you, and you only are of her kindred. +\v 12 The maid is fair and wise. And now hear me, and I will speak to her father. When we return from Rages we will celebrate the marriage; for I know that Raguel may in no way marry her to another according to the law of Moses, or else he would be liable to death, because it belongs to you to take the inheritance, rather than any other.” +\p +\v 13 Then the young man said to the angel, “Brother Azarias, I have heard that this maid has been given to seven men, and that they all perished in the bride-chamber. +\v 14 Now I am the only son of my father, and I am afraid, lest I go in and die, even as those before me. For a demon loves her, which harms no man, but those which come to her. Now I fear lest I die, and bring my father’s and my mother’s life to the grave with sorrow because of me. They have no other son to bury them.” +\p +\v 15 But the angel said to him, “Don’t you remember the words which your father commanded you, that you should take a wife of your own kindred? Now hear me, brother; for she will be your wife. Don’t worry about the demon; for this night she will be given you as wife. +\v 16 And when\f + \fr 6:16 \ft Gr. \fqa if. \f* you come into the bride-chamber, you shall take the ashes of incense, and shall lay upon them some of the heart and liver of the fish, and shall make smoke with them. +\v 17 The demon will smell it, and flee away, and never come again any more. But when you go near to her, both of you rise up, and cry to God who is merciful. He will save you, and have mercy on you. Don’t be afraid, for she was prepared for you from the beginning; and you will save her, and she will go with you. And I suppose that you will have children with her.” +\p When Tobias heard these things, he loved her, and his soul was strongly joined to her. +\c 7 +\p +\v 1 They came to Ecbatana, and arrived at the house of Raguel. But Sarah met them; and she greeted them, and they her. Then she brought them into the house. +\v 2 Raguel said to Edna his wife, “This young man really resembles Tobit my cousin!” +\v 3 And Raguel asked them, “Where are you two from, kindred?” +\p They said to him, “We are of the sons of Naphtali, who are captives in Nineveh.” +\p +\v 4 He said to them, “Do you know Tobit our brother?” +\p They said, “We know him.” +\p Then he said to them, “Is he in good health?” +\p +\v 5 They said, “He is both alive, and in good health.” Tobias said, “He is my father.” +\p +\v 6 And Raguel sprang up, and kissed him, wept, +\v 7 blessed him, and said to him, “You are the son of an honest and good man.” When he had heard that Tobit had lost his sight, he was grieved, and wept; +\v 8 and Edna his wife and Sarah his daughter wept. They received them gladly; and they killed a ram of the flock, and served them meat. +\p But Tobias said to Raphael, “Brother Azarias, speak of those things of which you talked about in the way, and let the matter be finished.” +\p +\v 9 So he communicated the thing to Raguel. Raguel said to Tobias, “Eat, drink, and make merry: +\v 10 for it belongs to you to take my child. However I will tell you the truth. +\v 11 I have given my child to seven men of our relatives, and whenever they came in to her, they died in the night. But for the present be merry.” +\p And Tobias said, “I will taste nothing here, until you all make a covenant and enter into that covenant with me.” +\p +\v 12 Raguel said, “Take her to yourself from now on according to custom. You are her relative, and she is yours. The merciful God will give all good success to you.” +\v 13 And he called his daughter Sarah, and took her by the hand, and gave her to be wife of Tobias, and said, “Behold, take her to yourself after the law of Moses, and lead her away to your father.” And he blessed them. +\v 14 He called Edna his wife, then took a book, wrote a contract, and sealed it. +\v 15 Then they began to eat. +\p +\v 16 And Raguel called his wife Edna, and said to her, “Sister, prepare the other chamber, and bring her in there.” +\v 17 She did as he asked her, and brought her in there. She wept, and she received the tears of her daughter, and said to her, +\v 18 “Be comforted, my child. May the Lord of heaven and earth give you favor\f + \fr 7:18 \ft Many ancient authorities read \fqa joy. \f* for this your sorrow. Be comforted, my daughter.” +\c 8 +\p +\v 1 When they had finished their supper, they brought Tobias in to her. +\v 2 But as he went, he remembered the words of Raphael, and took the ashes of the incense, and put the heart and the liver of the fish on them, and made smoke with them. +\v 3 When the demon smelled that smell, it fled into the uppermost parts of Egypt, and the angel bound him. +\v 4 But after they were both shut in together, Tobias rose up from the bed, and said, “Sister, arise, and let’s pray that the Lord may have mercy on us.” +\v 5 And Tobias began to say, “Blessed are you, O God of our fathers, and blessed is your holy and glorious name forever. Let the heavens bless you, and all your creatures. +\v 6 You made Adam, and gave him Eve his wife for a helper and support. From them came the seed of men. You said, it is not good that the man should be alone. Let’s make him a helper like him. +\v 7 And now, O Lord, I take not this my sister for lust, but in truth. Command that I may find mercy and grow old with her.” +\p +\v 8 She said with him, “Amen.” And they both slept that night. +\p +\v 9 Raguel arose, and went and dug a grave, +\v 10 saying, “Lest he also should die.” +\v 11 And Raguel came into his house, +\v 12 and said to Edna his wife, “Send one of the maidservants, and let them see if he is alive. If not, we will bury him, and no man will know it.” +\p +\v 13 So the maidservant opened the door, and went in, and found them both sleeping, +\v 14 and came out, and told them that he was alive. +\p +\v 15 Then Raguel blessed God, saying, “Blessed are you, O God, with all pure and holy blessing! Let your saints bless you, and all your creatures! Let all your angels and your elect bless you forever! +\v 16 Blessed are you, because you have made me glad; and it has not happened to me as I suspected; but you have dealt with us according to your great mercy. +\v 17 Blessed are you, because you have had mercy on two that were the only begotten children of their parents. Show them mercy, O Lord. Fulfill their life in health with gladness and mercy. +\p +\v 18 He commanded his servants to fill the grave. +\v 19 He kept the wedding feast for them fourteen days. +\v 20 Before the days of the wedding feast were finished, Raguel sware to him, that he should not depart till the fourteen days of the wedding feast were fulfilled; +\v 21 and that then he should take half of his goods, and go in safety to his father; and the rest, said he, when my wife and I die. +\c 9 +\p +\v 1 And Tobias called Raphael, and said to him, +\v 2 “Brother Azarias, take with you a servant and two camels, and go to Rages of Media to Gabael, and receive the money for me, and bring him to the wedding feast, +\v 3 because Raguel has sworn that I must not depart. +\v 4 My father counts the days; and if I wait long, he will be very grieved. +\v 5 So Raphael went on his way, and lodged with Gabael, and gave him the handwriting; so he brought forth the bags with their seals, and gave them to him. +\v 6 Then they rose up early in the morning together, and came to the wedding feast. Tobias blessed his wife. +\c 10 +\p +\v 1 Tobit his father counted every day. When the days of the journey were expired, and they didn’t come, +\v 2 he said, “Is he perchance detained?\f + \fr 10:2 \ft Many ancient authorities read \fqa “Are they perchance put to shame?” \f* Or is Gabael perchance dead, and there is no one to give him the money?” +\v 3 He was very grieved. +\p +\v 4 But his wife said to him, “The child has perished, seeing he waits long.” She began to bewail him, and said, +\v 5 “I care about nothing,\f + \fr 10:5 \ft Some authorities read \fqa “Woe is me.”\f* my child, since I have let you go, the light of my eyes.” +\v 6 Tobit said to her, “Hold your peace. Don’t worry. He is in good health.” +\p +\v 7 And she said to him, “Hold your peace. Don’t deceive me. My child has perished.” And she went out every day into the way by which they went, and ate no bread in the day-time, and didn’t stop bewailing her son Tobias for whole nights, until the fourteen days of the wedding feast were expired, which Raguel had sworn that he should spend there. +\p Then Tobias said to Raguel, “Send me away, for my father and my mother look no more to see me.” +\v 8 But his father-in-law said to him, “Stay with me, and I will send to your father, and they will declare to him how things go with you.” +\v 9 Tobias said, “No. Send me away to my father.” +\p +\v 10 Raguel arose, and gave him Sarah his wife, and half his goods, servants and cattle and money; +\v 11 and he blessed them, and sent them away, saying, “The God of heaven will prosper you, my children, before I die.” +\v 12 And he said to his daughter, “Honor your father-in-law and your mother-in-law. They are now your parents. Let me hear a good report of you.” Then he kissed her. +\p Edna said to Tobias, “May the Lord of heaven restore you, dear brother, and grant to me that I may see your children of my daughter Sarah, that I may rejoice before the Lord. Behold, I commit my daughter to you in special trust. Don’t cause her grief. +\c 11 +\p +\v 1 After these things Tobias also went his way, blessing God because he had prospered his journey; and he blessed Raguel and Edna his wife. Then he went on his way until they drew near to Nineveh. +\v 2 Raphael said to Tobias, “Don’t you know, brother, how you left your father? +\v 3 Let’s run forward before your wife, and prepare the house. +\v 4 But take in your hand the bile of the fish.” So they went their way, and the dog went after them. +\p +\v 5 Anna sat looking around toward the path for her son. +\v 6 She saw him coming, and said to his father, “Behold, your son is coming with the man that went with him!” +\p +\v 7 Raphael said, “I know, Tobias, that your father will open his eyes. +\v 8 Therefore anoint his eyes with the bile, and being pricked with it, he will rub, and will make the white films fall away. Then he will see you.” +\p +\v 9 Anna ran to him, and fell upon the neck of her son, and said to him, “I have seen you, my child! I am ready to die.” They both wept. +\p +\v 10 Tobit went toward the door and stumbled; but his son ran to him, +\v 11 and took hold of his father. He rubbed the bile on his father’s eyes, saying, “Cheer up, my father.” +\v 12 When his eyes began to hurt, he rubbed them. +\v 13 Then the white films peeled away from the corners of his eyes; and he saw his son, and fell upon his neck. +\p +\v 14 He wept, and said, “Blessed are you, O God, and blessed is your name forever! Blessed are all your holy angels! +\v 15 For you scourged, and had mercy on me. Behold, I see my son Tobias.” And his son went in rejoicing, and told his father the great things that had happened to him in Media. +\p +\v 16 Tobit went out to meet his daughter-in-law at the gate of Nineveh, rejoicing and blessing God. Those who saw him go marveled, because he had received his sight. +\v 17 Tobit gave thanks before them, because God had shown mercy on him. When Tobit came near to Sarah his daughter-in-law, he blessed her, saying, “Welcome, daughter! Blessed is God who has brought you to us, and blessed are your father and your mother.” And there was joy among all his kindred who were at Nineveh. +\v 18 Achiacharus and Nasbas his brother’s son came. +\v 19 Tobias’ wedding feast was kept seven days with great gladness. +\c 12 +\p +\v 1 And Tobit called his son Tobias, and said to him, “See, my child, that the man which went with you have his wages, and you must give him more.” +\p +\v 2 And he said to him, “Father, it is no harm to me to give him the half of those things which I have brought; +\v 3 for he has led me for you in safety, and he cured my wife, and brought my money, and likewise cured you.” +\p +\v 4 The old man said, “It is due to him.” +\p +\v 5 And he called the angel, and said to him, “Take half of all that you have brought.” +\p +\v 6 Then he called them both privately, and said to them, “Bless God, and give him thanks, and magnify him, and give him thanks in the sight of all that live, for the things which he has done with you. It is good to bless God and exalt his name, showing forth with honor the works of God. Don’t be slack to give him thanks. +\v 7 It is good to conceal the secret of a king, but to reveal gloriously the works of God. Do good, and evil won’t find you. +\v 8 Good is prayer with fasting, alms, and righteousness. A little with righteousness is better than much with unrighteousness. It is better to give alms than to lay up gold. +\v 9 Alms delivers from death, and it purges away all sin. Those who give alms and do righteousness will be filled with life; +\v 10 but those who sin are enemies to their own life. +\v 11 Surely I will conceal nothing from you. I have said, ‘It is good to conceal the secret of a king, but to reveal gloriously the works of God.’ +\v 12 And now, when you prayed, and Sarah your daughter-in-law, I brought the memorial of your prayer before the Holy One. When you buried the dead, I was with you likewise. +\v 13 And when you didn’t delay to rise up, and leave your dinner, that you might go and cover the dead, your good deed was not hidden from me. I was with you. +\v 14 And now God sent me to heal you and Sarah your daughter-in-law. +\v 15 I am Raphael, one of the seven holy angels which present the prayers of the saints and go in before the glory of the Holy One.” +\p +\v 16 And they were both troubled, and fell upon their faces; for they were afraid. +\v 17 And he said to them, “Don’t be afraid. You will all have peace; but bless God forever. +\v 18 For I came not of any favor of my own, but by the will of your God. Therefore bless him forever. +\v 19 All these days I appeared to you. I didn’t eat or drink, but you all saw a vision. +\v 20 Now give God thanks, because I ascend to him who sent me. Write in a book all the things which have been done.” +\v 21 Then they rose up, and saw him no more. +\v 22 They confessed the great and wonderful works of God, and how the angel of the Lord had appeared to them. +\c 13 +\p +\v 1 And Tobit wrote a prayer for rejoicing, and said, +\q1 “Blessed is God who lives forever! +\q2 Blessed is his kingdom! +\q1 +\v 2 For he scourges, and shows mercy. +\q2 He leads down to the grave,\f + \fr 13:2 \ft Gr. \fqa Hades. \f* and brings up again. +\q2 There is no one who will escape his hand. +\q1 +\v 3 Give thanks to him before the Gentiles, all you children of Israel! +\q2 For he has scattered us among them. +\q1 +\v 4 Declare his greatness, there. +\q2 Extol him before all the living, +\q1 because he is our Lord, +\q2 and God is our Father forever. +\q1 +\v 5 He will scourge us for our iniquities, and will again show mercy, +\q2 and will gather us out of all the nations among whom you are all scattered. +\q1 +\v 6 If you turn to him with your whole heart and with your whole soul, +\q2 to do truth before him, +\q1 then he will turn to you, +\q2 and won’t hide his face from you. +\q1 See what he will do with you. +\q2 Give him thanks with your whole mouth. +\q1 Bless the Lord of righteousness. +\q2 Exalt the everlasting King. +\q1 I give him thanks in the land of my captivity, +\q2 and show his strength and majesty to a nation of sinners. +\q1 Turn, you sinners, and do righteousness before him. +\q2 Who can tell if he will accept you and have mercy on you? +\q1 +\v 7 I exalt my God. +\q2 My soul exalts the King of heaven, +\q2 and rejoices in his greatness. +\q1 +\v 8 Let all men speak, +\q2 and let them give him thanks in Jerusalem. +\q1 +\v 9 O Jerusalem, the holy city, +\q2 he will scourge you for the works of your sons, +\q2 and will again have mercy on the sons of the righteous. +\q1 +\v 10 Give thanks to the Lord with goodness, +\q2 and bless the everlasting King, +\q1 that his tabernacle may be built in you again with joy, +\q2 and that he may make glad in you those who are captives, +\q2 and love in you forever those who are miserable. +\q1 +\v 11 Many nations will come from afar to the name of the Lord God +\q2 with gifts in their hands, even gifts to the King of heaven. +\q1 Generations of generations will praise you, +\q2 and sing songs of rejoicing. +\q1 +\v 12 All those who hate you are cursed. +\q2 All those who love you forever will be blessed. +\q1 +\v 13 Rejoice and be exceedingly glad for the sons of the righteous; +\q2 for they will be gathered together and will bless the Lord of the righteous. +\q1 +\v 14 Oh blessed are those who love you. +\q2 They will rejoice for your peace. +\q1 Blessed are all those who mourned for all your scourges; +\q2 because they will rejoice for you when they have seen all your glory. +\q1 They will be made glad forever. +\q2 +\v 15 Let my soul bless God the great King. +\q1 +\v 16 For Jerusalem will be built with sapphires, emeralds, and precious stones; +\q2 your walls and towers and battlements with pure gold. +\q1 +\v 17 The streets of Jerusalem will be paved with beryl, carbuncle, and stones of Ophir. +\q2 +\v 18 All her streets will say, “Hallelujah!” +\q2 and give praise, saying, “Blessed be God, who has exalted you forever!” +\c 14 +\p +\v 1 Then Tobit finished giving thanks. +\v 2 He was fifty-eight years old when he lost his sight. After eight years, he received it again. He gave alms and he feared the Lord God more and more, and gave thanks to him. +\p +\v 3 Now he grew very old; and he called his son with the six sons of his son, and said to him, “My child, take your sons. Behold, I have grown old, and am ready to depart out of this life. +\v 4 Go into Media, my child, for I surely believe all the things which Jonah the prophet spoke of Nineveh, that it will be overthrown, but in Media there will rather be peace for a season. Our kindred will be scattered in the earth from the good land. Jerusalem will be desolate, and the house of God in it will be burned up, and will be desolate for a time. +\v 5 God will again have mercy on them, and bring them back into the land, and they will build the house, but not like to the former house, until the times of that age are fulfilled. Afterward they will return from the places of their captivity, and build up Jerusalem with honor. The house of God will be built in it forever with a glorious building, even as the prophets spoke concerning it. +\v 6 And all the nations will turn to fear the Lord God truly, and will bury their idols. +\v 7 All the nations will bless the Lord, and his people will give thanks to God, and the Lord will exalt his people; and all those who love the Lord God in truth and righteousness will rejoice, showing mercy to our kindred. +\v 8 And now, my child, depart from Nineveh, because those things which the prophet Jonah spoke will surely come to pass. +\v 9 But you must keep the law and the ordinances, and show yourself merciful and righteous, that it may be well with you. +\v 10 Bury me decently, and your mother with me. Don’t stay at Nineveh. See, my child, what Aman did to Achiacharus who nourished him, how out of light he brought him into darkness, and all the recompense that he made him. Achiacharus was saved, but the other had his recompense, and he went down into darkness. Manasses gave alms, and escaped the snare of death which he set for him; but Aman fell into the snare, and perished. +\v 11 And now, my children, consider what alms does, and how righteousness delivers.” +\p While he was saying these things, he gave up the ghost in the bed; but he was one hundred fifty eight years old. Tobias buried him magnificently. +\v 12 When Anna died, he buried her with his father. But Tobias departed with his wife and his sons to Ecbatana to Raguel his father-in-law, +\v 13 and he grew old in honor, and he buried his father-in-law and mother-in-law magnificently, and he inherited their possessions, and his father Tobit’s. +\v 14 He died at Ecbatana of Media, being one hundred twenty seven years old. +\v 15 Before he died, he heard of the destruction of Nineveh, which Nebuchadnezzar and Ahasuerus took captive. Before his death, he rejoiced over Nineveh. diff --git a/c-sharp/assets/WEB/69JDTengWEBUS.SFM b/c-sharp/assets/WEB/69JDTengWEBUS.SFM new file mode 100644 index 0000000000..8da213e1da --- /dev/null +++ b/c-sharp/assets/WEB/69JDTengWEBUS.SFM @@ -0,0 +1,506 @@ +\id JDT Judith +\h Judith +\toc1 Judith +\toc2 Judith +\toc3 Judith +\mt1 Judith +\ip \bk Judith\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\c 1 + +\p +\v 1 In the twelfth year of the reign of Nebuchadnezzar, who reigned over the Assyrians in Nineveh, the great city, in the days of Arphaxad, who reigned over the Medes in Ecbatana, +\v 2 and built around Ecbatana walls of hewn stones three cubits broad and six cubits long, and made the height of the wall seventy cubits, and its breadth fifty cubits, +\v 3 and set its towers at its gates one hundred cubits high, and its breadth in the foundation was sixty cubits, +\v 4 and made its gates, even gates that were raised to the height of seventy cubits, and their breadth forty cubits, for his mighty army to go out of, and the setting in array of his footmen— +\v 5 in those days King Nebuchadnezzar made war with King Arphaxad in the great plain. This plain is on the borders of Ragau. +\v 6 There came to meet him all that lived in the hill country, and all that lived by Euphrates, Tigris, and Hydaspes, and in the plain of Arioch the king of the Elymaeans. Many nations of the sons of Chelod assembled themselves to the battle. +\p +\v 7 And Nebuchadnezzar king of the Assyrians sent to all who lived in Persia, and to all who lived westward, to those who lived in Cilicia, Damascus, Libanus, Antilibanus, and to all who lived along the sea coast, +\v 8 and to those among the nations that were of Carmel and Gilead, and to the higher Galilee and the great plain of Esdraelon, +\v 9 and to all who were in Samaria and its cities, and beyond Jordan to Jerusalem, Betane, Chellus, Kadesh, the river of Egypt, Tahpanhes, Rameses, and all the land of Goshen, +\v 10 until you come above Tanis and Memphis, and to all that lived in Egypt, until you come to the borders of Ethiopia. +\v 11 All those who lived in all the land made light of the commandment of Nebuchadnezzar king of the Assyrians, and didn’t go with him to the war; for they were not afraid of him, but he was before them as one man. They turned away his messengers from their presence without effect, and with disgrace. +\p +\v 12 And Nebuchadnezzar was exceedingly angry with all this land, and he swore by his throne and kingdom that he would surely be avenged upon all the coasts of Cilicia, Damascus, and Syria, that he would kill with his sword all the inhabitants of the land of Moab, the children of Ammon, all Judea, and all who were in Egypt, until you come to the borders of the two seas. +\v 13 And he set the battle in array with his army against King Arphaxad in the seventeenth year; and he prevailed in his battle, and turned to flight all the army of Arphaxad, with all his horses and all his chariots. +\v 14 He took possession of his cities. He came to Ecbatana and took the towers, plundered its streets, and turned its beauty into shame. +\v 15 He took Arphaxad in the mountains of Ragau, struck him through with his darts, and utterly destroyed him to this day. +\v 16 He returned with them to Nineveh, he and all his company of sundry nations—an exceedingly great multitude of men of war. There he took his ease and banqueted, he and his army, for one hundred twenty days. +\c 2 +\p +\v 1 In the eighteenth year, the twenty-second day of the first month, there was talk in the house of Nebuchadnezzar king of the Assyrians that he should be avenged on all the land, even as he spoke. +\v 2 He called together all his servants and all his great men, and communicated with them his secret counsel, and with his own mouth, recounted the wickedness of all the land. +\v 3 They decreed to destroy all flesh which didn’t follow the word of his mouth. +\p +\v 4 It came to pass, when he had ended his counsel, Nebuchadnezzar king of the Assyrians called Holofernes the chief captain of his army, who was second to himself, and said to him, +\v 5 “The great king, the lord of all the earth, says: ‘Behold, you shall go out from my presence, and take with you men who trust in their strength, to one hundred twenty thousand footmen and twelve thousand horses with their riders. +\v 6 And you shall go out against all the west country, because they disobeyed the commandment of my mouth. +\v 7 You shall declare to them that they should prepare earth and water, because I will go out in my wrath against them, and will cover the whole face of the earth with the feet of my army, who will plunder them. +\v 8 Their slain will fill their valleys and brooks, and the river will be filled with their dead until it overflows. +\v 9 I will lead them as captives to the utmost parts of all the earth. +\v 10 But you shall go forth, and take all their coasts for me first. If they will yield themselves to you,\f + \fr 2:10 \ft Gr. \fqa they will yield...and you shall reserve.\f* then you must reserve them for me until the day of their reproof. +\v 11 As for those who resist, your eye shall not spare; but you shall give them up to be slain and to be plundered in all your land. +\v 12 For as I live, and by the power of my kingdom, I have spoken, and I will do this with my hand. +\v 13 Moreover, you shall not transgress anything of the commandments of your lord, but you shall surely accomplish them, as I have commanded you. You shall not defer to do them.’” +\p +\v 14 So Holofernes went out from the presence of his lord, and called all the governors, the captains, and officers of the army of Asshur. +\v 15 He counted chosen men for the battle, as his lord had commanded him, to one hundred twenty thousand, with twelve thousand archers on horseback. +\v 16 He arranged them as a great multitude is ordered for the war. +\v 17 He took camels, donkeys, and mules for their baggage, an exceedingly great multitude, and sheep, oxen, and goats without number for their provision, +\v 18 and a large supply of rations for every man, and a huge amount of gold and silver out of the king’s house. +\v 19 He went out, he and all his army, on their journey, to go before King Nebuchadnezzar, and to cover all the face of the earth westward with their chariots, horsemen, and chosen footmen. +\v 20 A great company of various nations went out with them like locusts and like the sand of the earth. For they could not be counted by reason of their multitude. +\p +\v 21 And they departed out of Nineveh three days’ journey toward the plain of Bectileth, and encamped from Bectileth near the mountain which is at the left hand of the Upper Cilicia. +\v 22 And he took all his army, his footmen, horsemen, and chariots, and went away from there into the hill country, +\v 23 and destroyed Put and Lud, and plundered all the children of Rasses and the children of Ishmael, which were along the wilderness to the south of the land of the Chellians. +\v 24 And he went over Euphrates, and went through Mesopotamia, and broke down all the high cities that were upon the river Arbonai, until you come to the sea. +\v 25 And he took possession of the borders of Cilicia, and killed all who resisted him, and came to the borders of Japheth, which were toward the south, opposite Arabia. +\v 26 He surrounded all the children of Midian, and set their tents on fire, and plundered their sheepfolds. +\v 27 He went down into the plain of Damascus in the days of wheat harvest, and set all their fields on fire, and utterly destroyed their flocks and herds, plundered their cities, laid their plains waste, and struck all their young men with the edge of the sword. +\p +\v 28 And the fear and the dread of him fell upon those who lived on the sea coast, upon those who were in Sidon and Tyre, those who lived in Sur and Ocina, and all who lived in Jemnaan. Those who lived in Azotus and Ascalon feared him exceedingly. +\c 3 +\p +\v 1 And they sent to him messengers with words of peace, saying, +\v 2 “Behold, we the servants of Nebuchadnezzar the great king lie before you. Use us as it is pleasing in your sight. +\v 3 Behold, our dwellings, and all our country, and all our fields of wheat, and our flocks and herds, and all the sheepfolds of our tents, lie before your face. Use them as it may please you. +\v 4 Behold, even our cities and those who dwell in them are your servants. Come and deal with them as it is good in your eyes.” +\p +\v 5 So the men came to Holofernes, and declared to him according to these words. +\p +\v 6 He came down toward the sea coast, he and his army, and set garrisons in the high cities, and took out of them chosen men for allies. +\v 7 They received him, they and all the country round about them, with garlands and dances and timbrels. +\v 8 He cast down all their borders, and cut down their sacred groves. It had been given to him to destroy all the gods of the land, that all the nations would worship Nebuchadnezzar only, and that all their tongues and their tribes would call upon him as a god. +\p +\v 9 Then he came toward Esdraelon near to Dotaea, which is opposite the great ridge of Judea. +\v 10 He encamped between Geba and Scythopolis. He was there a whole month, that he might gather together all the baggage of his army. +\c 4 +\p +\v 1 The children of Israel who lived in Judea heard all that Holofernes the chief captain of Nebuchadnezzar king of the Assyrians had done to the nations, and how he had plundered all their temples and destroyed them utterly. +\v 2 They were exceedingly afraid at his approach, and were troubled for Jerusalem and for the temple of the Lord their God; +\v 3 because they had newly come up from the captivity, and all the people of Judea were recently gathered together; and the vessels, the altar, and the house were sanctified after being profaned. +\p +\v 4 And they sent into every coast of Samaria, to Konae, to Beth-horon, Belmaim, Jericho, to Choba, Aesora, and to the valley of Salem; +\v 5 and they occupied beforehand all the tops of the high mountains, fortified the villages that were in them, and stored supplies for the provision of war, for their fields were newly reaped. +\v 6 Joakim the high priest, who was in those days at Jerusalem, wrote to those who lived in Bethulia and Betomesthaim, which is opposite Esdraelon toward the plain that is near to Dothaim, +\v 7 charging them to seize upon the ascents of the hill country; because by them was the entrance into Judea, and it was easy to stop them from approaching, inasmuch as the approach was narrow, with space for two men at the most. +\v 8 And the children of Israel did as Joakim the high priest had commanded them, as did the senate of all the people of Israel, which was in session at Jerusalem. +\p +\v 9 And every man of Israel cried to God with great earnestness, and with great earnestness they humbled their souls. +\v 10 They, their wives, their children, their cattle, and every sojourner, hireling, and servant bought with their money put sackcloth on their loins. +\v 11 Every man and woman of Israel, including the little children and the inhabitants of Jerusalem, fell prostrate before the temple, cast ashes upon their heads, and spread out their sackcloth before the Lord. They put sackcloth around the altar. +\v 12 They cried to the God of Israel earnestly with one consent, that he would not give their children as prey, their wives as plunder, the cities of their inheritance to destruction, and the sanctuary to being profaned and being made a reproach, for the nations to rejoice at. +\v 13 The Lord heard their voice, and looked at their affliction. The people continued fasting many days in all Judea and Jerusalem before the sanctuary of the Lord Almighty. +\v 14 And Joakim the high priest, and all the priests who stood before the Lord, and those who ministered to the Lord, had their loins dressed in sackcloth and offered the continual burnt offering, the vows, and the free gifts of the people. +\v 15 They had ashes on their turbans. They cried to the Lord with all their power, that he would look upon all the house of Israel for good. +\c 5 +\p +\v 1 Holofernes, the chief captain of the army of Asshur, was told that the children of Israel had prepared for war, had shut up the passages of the hill country, had fortified all the tops of the high hills, and had set up barricades in the plains. +\v 2 Then he was exceedingly angry, and he called all the princes of Moab, the captains of Ammon, and all the governors of the sea coast, +\v 3 and he said to them, “Tell me now, you sons of Canaan, who are these people who dwell in the hill country? What are the cities that they inhabit? How large is their army? Where is their power and their strength? What king is set over them, to be the leader of their army? +\v 4 Why have they turned their backs, that they should not come and meet me, more than all who dwell in the west?” +\p +\v 5 Then Achior, the leader of all the children of Ammon, said to him, “Let my lord now hear a word from the mouth of your servant, and I will tell you the truth concerning these people who dwell in this hill country, near to the place where you dwell. No lie will come out of the mouth of your servant. +\v 6 These people are descended from the Chaldeans. +\v 7 They sojourned before this in Mesopotamia, because they didn’t want to follow the gods of their fathers, which were in the land of the Chaldeans. +\v 8 They departed from the way of their parents, and worshiped the God of heaven, the God whom they knew. Their parents cast them out from the face of their gods, and they fled into Mesopotamia and sojourned there many days. +\v 9 Then their God commanded them to depart from the place where they sojourned, and to go into the land of Canaan. They lived there, and prospered with gold and silver, and with exceedingly much cattle. +\v 10 Then they went down into Egypt, for a famine covered all the land of Canaan. They sojourned there until they had grown up. They became a great multitude there, so that one could not count the population of their nation. +\v 11 Then the king of Egypt rose up against them, and dealt subtly with them, and brought them low, making them labor in brick,\f + \fr 5:11 \ft Some authorities read \fqa and he brought them low with clay and brick, etc. \f* and made them slaves. +\v 12 They cried to their God, and he struck all the land of Egypt with incurable plagues; so the Egyptians cast them out of their sight. +\v 13 God dried up the Red sea before them, +\v 14 and brought them into the way of Sinai Kadesh-Barnea and they cast out all that lived in the wilderness. +\v 15 They lived in the land of the Amorites, and they destroyed by their strength everyone in Heshbon. Passing over Jordan, they possessed all the hill country. +\v 16 They cast out before them the Canaanite, the Perizzite, the Jebusite, the Shechemite, and all the Girgashites, and they lived in that country many days. +\p +\v 17 And while they didn’t sin before their God, they prospered, because God who hates iniquity was with them. +\v 18 But when they departed from the way which he appointed them, they were destroyed in many severe battles, and were led captives into a land that was not theirs. The temple of their God was razed to the ground, and their cities were taken by their adversaries. +\v 19 And now they have returned to their God, and have come up from the dispersion where they were dispersed, and have possessed Jerusalem, where their sanctuary is, and are settled in the hill country; for it was desolate. +\p +\v 20 And now, my lord and master, if there is any error in this people, and they sin against their God, we will find out what this thing is in which they stumble, and we will go up and overcome them. +\v 21 But if there is no lawlessness in their nation, let my lord now pass by, lest their Lord defend them, and their God be for them, and we will be a reproach before all the earth.” +\p +\v 22 It came to pass, when Achior had finished speaking these words, all the people standing around the tent complained. The great men of Holofernes, and all who lived by the sea side and in Moab, said that he should be cut to pieces. +\v 23 For, they said, “We will not be afraid of the children of Israel, because, behold, they are a people that has no power nor might to make the battle strong. +\v 24 Therefore now we will go up, and they will be a prey to be devoured by all your army, Lord Holofernes.” +\c 6 +\p +\v 1 And when the disturbance of the men that were around the council had ceased, Holofernes the chief captain of the army of Asshur said to Achior and to all the children of Moab\f + \fr 6:1 \ft Some authorities read \fqa Ammon. \ft Compare ver. 5. \f* before all the people of the foreigners: +\p +\v 2 “And who are you, Achior, and the mercenaries of Ephraim,\f + \fr 6:2 \ft Some authorities read \fqa Ammon. \ft Compare ver. 5. \f* that you have prophesied among us as today, and have said that we should not make war with the race of Israel, because their God will defend them? And who is God but Nebuchadnezzar? +\v 3 He will send forth his might, and will destroy them from the face of the earth, and their God will not deliver them; but we his servants will strike them as one man. They will not sustain the might of our cavalry. +\v 4 For with them we will burn them up. Their mountains will be drunken with their blood. Their plains will be filled with their dead bodies. Their footsteps will not stand before us, but they will surely perish, says King Nebuchadnezzar, lord of all the earth; for he said, ‘The words that I have spoken\f + \fr 6:4 \ft Gr. \fqa he has spoken. \f* will not be in vain.’ +\p +\v 5 But you, Achior, hireling of Ammon, who have spoken these words in the day of your iniquity, will see my face no more from this day, until I am avenged of the race of those that came out of Egypt. +\v 6 And then the sword of my army, and the multitude of those who serve me, will pass through your sides, and you will fall among their slain when I return. +\v 7 Then my servants will bring you back into the hill country, and will set you in one of the cities by the passes. +\v 8 You will not perish until you are destroyed with them. +\v 9 And if you hope in your heart that they will not be taken, don’t let your countenance fall. I have spoken it, and none of my words will fall to the ground.” +\p +\v 10 Then Holofernes commanded his servants who waited in his tent to take Achior, and bring him back to Bethulia, and deliver him into the hands of the children of Israel. +\v 11 So his servants took him, and brought him out of the camp into the plain, and they moved from the midst of the plains into the hill country, and came to the springs that were under Bethulia. +\v 12 When the men of the city saw them on the top of the hill, they took up their weapons, and went out of the city against them to the top of the hill. Every man that used a sling kept them from coming up, and threw stones at them. +\v 13 They took cover under the hill, bound Achior, cast him down, left him at the foot of the hill, and went away to their lord. +\p +\v 14 But the children of Israel descended from their city, and came to him, untied him, led him away into Bethulia, and presented him to the rulers of their city, +\v 15 which were in those days Ozias the son of Micah, of the tribe of Simeon, and Chabris the son of Gothoniel, and Charmis the son of Melchiel. +\v 16 Then they called together all the elders of the city; and all their young men ran together, with their women, to the assembly. They set Achior in the midst of all their people. Then Ozias asked him what had happened. +\v 17 He answered and declared to them the words of the council of Holofernes, and all the words that he had spoken in the midst of the princes of the children of Asshur, and all the great words that Holofernes had spoken against the house of Israel. +\v 18 Then the people fell down and worshiped God, and cried, saying, +\v 19 “O Lord God of heaven, behold their arrogance, and pity the low estate of our race. Look upon the face of those who are sanctified to you this day.” +\v 20 They comforted Achior, and praised him exceedingly. +\v 21 Then Ozias took him out of the assembly into his house, and made a feast for the elders. They called on the God of Israel for help all that night. +\c 7 +\p +\v 1 The next day Holofernes commanded all his army and all the people who had come to be his allies, that they should move their camp toward Bethulia, seize the passes of the hill country, and make war against the children of Israel. +\v 2 Every mighty man of them moved that day. The army of their men of war was one hundred seventy thousand footmen, plus twelve thousand horsemen, besides the baggage and the men who were on foot among them—an exceedingly great multitude. +\v 3 They encamped in the valley near Bethulia, by the fountain. They spread themselves in breadth over Dothaim even to Belmaim, and in length from Bethulia to Cyamon, which is near Esdraelon. +\p +\v 4 But the children of Israel, when they saw the multitude of them, were terrified, and everyone said to his neighbor, “Now these men will lick up the face of all the earth. Neither the high mountains, nor the valleys, nor the hills will be able to bear their weight. +\v 5 Every man took up his weapons of war, and when they had kindled fires upon their towers, they remained and watched all that night. +\p +\v 6 But on the second day Holofernes led out all his cavalry in the sight of the children of Israel which were in Bethulia, +\v 7 viewed the ascents to their city, and searched out the springs of the waters, seized upon them, and set garrisons of men of war over them. Then he departed back to his people. +\p +\v 8 All the rulers of the children of Esau, all the leaders of the people of Moab, and the captains of the sea coast came to him and said, +\v 9 “Let our lord now hear a word, that there not be losses in your army. +\v 10 For this people of the children of Israel do not trust in their spears, but in the height of the mountains wherein they dwell, for it is not easy to come up to the tops of their mountains. +\v 11 And now, my lord, don’t fight against them as men fight who join battle, and there will not so much as one man of your people perish. +\v 12 Remain in your camp, and keep every man of your army safe. Let your servants get possession of the water spring, which flows from the foot of the mountain, +\v 13 because all the inhabitants of Bethulia get their water from there. Then thirst will kill them, and they will give up their city. Then we and our people will go up to the tops of the mountains that are near, and will camp upon them, to watch that not one man gets out of the city. +\v 14 They will be consumed with famine—they, their wives, and their children. Before the sword comes against them they will be laid low in the streets where they dwell. +\v 15 And you will pay them back with evil, because they rebelled, and didn’t meet your face in peace.” +\p +\v 16 Their words were pleasing in the sight of Holofernes and in the sight of all his servants; and he ordered them to do as they had spoken. +\v 17 And the army of the children of Ammon moved, and with them five thousand of the children of Asshur, and they encamped in the valley. They seized the waters and the springs of the waters of the children of Israel. +\v 18 The children of Esau went up with the children of Ammon, and encamped in the hill country near Dothaim. They sent some of them toward the south, and toward the east, near Ekrebel, which is near Chusi, that is upon the brook Mochmur. The rest of the army of the Assyrians encamped in the plain, and covered all the face of the land. Their tents and baggage were pitched upon it in a great crowd. They were an exceedingly great multitude. +\p +\v 19 The children of Israel cried to the Lord their God, for their spirit fainted; for all their enemies had surrounded them. There was no way to escape out from among them. +\v 20 All the army of Asshur remained around them, their footmen and their chariots and their horsemen, for thirty-four days. All their vessels of water ran dry for all the inhabitants of Bethulia. +\v 21 The cisterns were emptied, and they had no water to drink their fill for one day; for they rationed drink by measure. +\v 22 Their young children were discouraged. The women and the young men fainted for thirst. They fell down in the streets of the city, and in the passages of the gates. There was no longer any strength in them. +\p +\v 23 All the people, including the young men, the women, and the children, were gathered together against Ozias, and against the rulers of the city. They cried with a loud voice, and said before all the elders, +\v 24 “God be judge between all of you and us, because you have done us great wrong, in that you have not spoken words of peace with the children of Asshur. +\v 25 Now we have no helper; but God has sold us into their hands, that we should be laid low before them with thirst and great destruction. +\v 26 And now summon them, and deliver up the whole city as prey to the people of Holofernes, and to all his army. +\v 27 For it is better for us to be captured by them. For we will be servants, and our souls will live, and we will not see the death of our babies before our eyes, and our wives and our children fainting in death. +\v 28 We take to witness against you the heaven and the earth, and our God and the Lord of our fathers, who punishes us according to our sins and the sins of our fathers. Do what we have said today!” +\p +\v 29 And there was great weeping of all with one consent in the midst of the assembly; and they cried to the Lord God with a loud voice. +\v 30 And Ozias said to them, “Brethren, be of good courage! Let us endure five more days, during which the Lord our God will turn his mercy toward us; for he will not forsake us utterly. +\v 31 But if these days pass, and no help comes to us, I will do what you say.” +\v 32 Then he dispersed the people, every man to his own camp; and they went away to the walls and towers of their city. He sent the women and children into their houses. They were brought very low in the city. +\c 8 +\p +\v 1 In those days Judith heard about this. She was the daughter of Merari, the son of Ox, the son of Joseph, the son of Oziel, the son of Elkiah, the son of Ananias, the son of Gideon, the son of Raphaim, the son of Ahitub, the son of Elihu, the son of Eliab, the son of Nathanael, the son of Salamiel, the son of Salasadai, the son of Israel. +\v 2 Her husband was Manasses, of her tribe and of her family. He died in the days of barley harvest. +\v 3 For he stood over those who bound sheaves in the field, and was overcome by the burning heat, and he fell on his bed, and died in his city Bethulia. So they buried him with his fathers in the field which is between Dothaim and Balamon. +\v 4 Judith was a widow in her house three years and four months. +\v 5 She made herself a tent upon the roof of her house, and put on sackcloth upon her loins. The garments of her widowhood were upon her. +\v 6 And she fasted all the days of her widowhood, except the eves of the Sabbaths, the Sabbaths, the eves of the new moons, the new moons, and the feasts and joyful days of the house of Israel. +\v 7 She was beautiful in appearance, and lovely to behold. Her husband Manasses had left her gold, silver, menservants, maidservants, cattle, and lands. She remained on those lands. +\v 8 No one said anything evil about her, for she feared God exceedingly. +\p +\v 9 She heard the evil words of the people against the governor, because they fainted for lack of water; and Judith heard all the words that Ozias spoke to them, how he swore to them that he would deliver the city to the Assyrians after five days. +\v 10 So she sent her maid, who was over all things that she had, to summon Ozias, Chabris, and Charmis, the elders of her city. +\v 11 They came to her, and she said to them, “Hear me now, O you rulers of the inhabitants of Bethulia! For your word that you have spoken before the people this day is not right. You have set the oath which you have pronounced between God and you, and have promised to deliver the city to our enemies, unless within these days the Lord turns to help you. +\v 12 Now who are you that you have tested God this day, and stand in the place of God among the children of men? +\v 13 Now try the Lord Almighty, and you will never know anything. +\v 14 For you will not find the depth of the heart of man, and you will not perceive the things that he thinks. How will you search out God, who has made all these things, and know his mind, and comprehend his purpose? No, my kindred, don’t provoke the Lord our God to anger! +\v 15 For if he has not decided to help us within these five days, he has power to defend us in such time as he will, or to destroy us before the face of our enemies. +\v 16 But don’t you pledge the counsels of the Lord our God! For God is not like a human being, that he should be threatened, neither is he like a son of man, that he should be won over by pleading. +\v 17 Therefore let’s wait for the salvation that comes from him, and call upon him to help us. He will hear our voice, if it pleases him. +\v 18 For there arose none in our age, neither is there any of us today, tribe, or kindred, or family, or city, which worship gods made with hands, as it was in the former days; +\v 19 for which cause our fathers were given to the sword, and for plunder, and fell with a great destruction before our enemies. +\v 20 But we know no other god beside him. Therefore we hope that he will not despise us, nor any of our race. +\v 21 For if we are captured, all Judea will be captured and our sanctuary will be plundered; and he will require our blood for profaning it. +\v 22 The slaughter of our kindred, the captivity of the land, and the desolation of our inheritance, he will bring on our heads among the Gentiles, wherever we will be in bondage. We will be an offense and a reproach to those who take us for a possession. +\v 23 For our bondage will not be ordered to favor; but the Lord our God will turn it to dishonor. +\v 24 And now, kindred, let’s show an example to our kindred, because their soul depends on us, and the sanctuary, the house, and the altar depend on us. +\v 25 Besides all this let’s give thanks to the Lord our God, who tries us, even as he did our fathers also. +\v 26 Remember all the things which he did to Abraham, and all the things in which he tried Isaac, and all the things which happened to Jacob in Mesopotamia of Syria, when he kept the sheep of Laban his mother’s brother. +\v 27 For he has not tried us in the fire, as he did them, to search out their hearts, neither has he taken vengeance on us; but the Lord scourges those who come near to him, to admonish them.” +\p +\v 28 And Ozias said to her, “All that you have spoken, you have spoken with a good heart. There is no one who will deny your words. +\v 29 For this is not the first day wherein your wisdom is manifested; but from the beginning of your days all the people have known your understanding, because the disposition of your heart is good. +\v 30 But the people were exceedingly thirsty, and compelled us to do as we spoke to them, and to bring an oath upon ourselves, which we will not break. +\v 31 And now pray for us, because you are a godly woman, and the Lord will send us rain to fill our cisterns, and we will faint no more.” +\p +\v 32 Then Judith said to them, “Hear me, and I will do a thing, which will go down to all generations among the children of our race. +\v 33 You shall all stand at the gate tonight. I will go out with my maid. Within the days after which you said that you would deliver the city to our enemies, the Lord will deliver Israel by my hand. +\v 34 But you shall not inquire of my act; for I will not tell you until the things are finished that I will do.” +\p +\v 35 Then Ozias and the rulers said to her, “Go in peace. May the Lord God be before you, to take vengeance on our enemies.” +\v 36 So they returned from the tent, and went to their stations. +\c 9 +\p +\v 1 But Judith fell upon her face, and put ashes upon her head, and uncovered the sackcloth with which she was clothed. The incense of that evening was now being offered at Jerusalem in the house of God, and Judith cried to the Lord with a loud voice, and said, +\v 2 “O Lord God of my father Simeon, into whose hand you gave a sword to take vengeance on the strangers who loosened the belt of a virgin to defile her, uncovered her thigh to her shame, and profaned her womb to her reproach; for you said, ‘It shall not be so;’ and they did so. +\v 3 Therefore you gave their rulers to be slain, and their bed, which was ashamed for her who was deceived,\f + \fr 9:3 \ft Some authorities read \fqa which was ashamed for their deceit that they practiced. \f* to be dyed in blood, and struck the servants with their masters, and the masters upon their thrones; +\v 4 and gave their wives for a prey, and their daughters to be captives, and all their spoils to be divided among your dear children; which were moved with zeal for you, and abhorred the pollution of their blood, and called upon you for aid. O God, O my God, hear me also who am a widow. +\v 5 For you did the things that were before those things, and those things, and such as come after; and you planned the things which are now, and the things which are to come. The things which you planned came to pass. +\v 6 Yes, the things which you determined stood before you, and said, ‘Behold, we are here; for all your ways are prepared, and your judgment is with foreknowledge.’ +\v 7 For, behold, the Assyrians are multiplied in their power. They are exalted with horse and rider. They were proud of the strength of their footmen. They have trusted in shield, spear, bow, and sling. They don’t know that you are the Lord who breaks the battles. ‘The Lord’ is your name. +\v 8 Break their strength in your power, and bring down their force in your wrath; for they intend to profane your sanctuary, and to defile the tabernacle where your glorious name rests, and to destroy the horn of your altar with the sword. +\v 9 Look at their pride, and send your wrath upon their heads. Give into my hand, which am a widow, the might that I have conceived. +\v 10 Strike by the deceit of my lips the servant with the prince, and the prince with his servant. Break down their arrogance by the hand of a woman. +\v 11 For your power stands not in numbers, nor your might in strong men, but you are a God of the afflicted. You are a helper of the oppressed, a helper of the weak, a protector of the forsaken, a savior of those who are without hope. +\v 12 Please, please, God of my father, and God of the inheritance of Israel, Lord of the heavens and of the earth, Creator of the waters, King of all your creation, hear my prayer. +\v 13 Make my speech and deceit to be their wound and bruise, who intend hard things against your covenant, your holy house, the top of Zion, and the house of the possession of your children. +\v 14 Make every nation and tribe of yours to know that you are God, the God of all power and might, and that there is no other who protects the race of Israel but you.” +\c 10 +\p +\v 1 It came to pass, when she had ceased to cry to the God of Israel, and had finished saying all these words, +\v 2 that she rose up where she had fallen down, called her maid, and went down into the house that she lived on the Sabbath days and on her feast days. +\v 3 She pulled off the sackcloth which she had put on, took off the garments of her widowhood, washed her body all over with water, anointed herself with rich ointment, braided the hair of her head, and put a tiara upon it. She put on her garments of gladness, which she used to wear in the days of the life of Manasses her husband. +\v 4 She took sandals for her feet, and put on her anklet, bracelets, rings, earrings, and all her jewelry. She made herself very beautiful to deceive the eyes of all men who would see her. +\v 5 She gave her maid a leather container of wine and a flask of oil, and filled a bag with roasted grain, lumps of figs, and fine bread. She packed all her vessels together, and laid them upon her. +\p +\v 6 They went out to the gate of the city of Bethulia, and found Ozias and the elders of the city, Chabris and Charmis standing by it. +\v 7 But when they saw her, that her countenance was altered and her apparel was changed, they were greatly astonished by her beauty and said to her, +\v 8 “May the God of our fathers give you favor, and accomplish your purposes to the glory of the children of Israel, and to the exaltation of Jerusalem.” +\p Then she worshiped God, +\v 9 and said to them, “Command that they open the gate of the city for me, and I will go out to accomplish the things you spoke with me about.” +\p And they commanded the young men to open to her, as she had spoken; +\v 10 and they did so. +\p Then Judith went out, she, and her handmaid with her. The men of the city watched her until she had gone down the mountain, until she had passed the valley, and they could see her no more. +\v 11 They went straight onward in the valley. The watch of the Assyrians met her; +\v 12 and they took her, and asked her, “Of what people are you? Where are you coming from? Where are you going?” +\p She said, “I am a daughter of the Hebrews. I am fleeing away from their presence, because they are about to be given you to be consumed. +\v 13 I am coming into the presence of Holofernes the chief captain of your army, to declare words of truth. I will show him a way that he can go and win all the hill country, and there will not be lacking of his men one person, nor one life.” +\p +\v 14 Now when the men heard her words, and considered her countenance, the beauty thereof was exceedingly marvelous in their eyes. They said to her, +\v 15 “You have saved your life, in that you have hurried to come down to the presence of our master. Now come to his tent. Some of us will guide you until they deliver you into his hands. +\v 16 But when\f + \fr 10:16 \ft Gr. \fqa if. \f* you stand before him, don’t be afraid in your heart, but declare to him what you just said, and he will treat you well.” +\v 17 They chose out of them a hundred men, and appointed them to accompany her and her maid; and they brought them to the tent of Holofernes. +\p +\v 18 And there was great excitement throughout all the camp, for her coming was reported among the tents. They came and surrounded her as she stood outside Holofernes’ tent, until they told him about her. +\v 19 They marveled at her beauty, and marveled at the children of Israel because of her. Each one said to his neighbor, “Who would despise these people, who have among them such women? For it is not good that one man of them be left, seeing that, if they are let go, they will be able to deceive the whole earth. +\p +\v 20 Then the guards of Holofernes and all his servants came out and brought her into the tent. +\v 21 And Holofernes was resting upon his bed under the canopy, which was woven with purple, gold, emeralds, and precious stones. +\v 22 And they told him about her; and he came out into the space before his tent, with silver lamps going before him. +\v 23 But when Judith had come before him and his servants, they all marveled at the beauty of her countenance. She fell down upon her face and bowed down to him, but his servants raised her up. +\c 11 +\p +\v 1 Holofernes said to her, “Woman, take courage. Don’t be afraid in your heart; for I never hurt anyone who has chosen to serve Nebuchadnezzar, the king of all the earth. +\v 2 And now, if your people who dwell in the hill country had not slighted me, I would not have lifted up my spear against them; but they have done these things to themselves. +\v 3 And now tell me why you fled from them and came to us; for you have come to save yourself. Take courage! You will live tonight, and hereafter; +\v 4 for there is no one that will wrong you, but all will treat you well, as is done to the servants of King Nebuchadnezzar my lord.” +\p +\v 5 And Judith said to him, “Receive the words of your servant, and let your handmaid speak in your presence, and I won’t lie to my lord tonight. +\v 6 If you will follow the words of your handmaid, God will bring the thing to pass perfectly with you; and my lord will not fail to accomplish his purposes. +\v 7 As Nebuchadnezzar king of all the earth lives, and as his power lives, who has sent you for the preservation of every living thing, not only do men serve him by you, but also the beasts of the field, the cattle, and the birds of the sky will live through your strength, in the time of Nebuchadnezzar and of all his house. +\v 8 For we have heard of your wisdom and the subtle plans of your soul. It has been reported in all the earth that you only are brave in all the kingdom, mighty in knowledge, and wonderful in feats of war. +\v 9 And now as concerning the matter which Achior spoke in your council, we have heard his words; for the men of Bethulia saved him, and he declared to them all that he had spoken before you. +\v 10 Therefore, O lord and master, don’t neglect his word, but lay it up in your heart, for it is true; for our race will not be punished, neither will the sword prevail against them, unless they sin against their God. +\v 11 And now, that my lord may not be defeated and frustrated in his purpose, and that death may fall upon them, their sin has overtaken them, wherewith they will provoke their God to anger, whenever they do wickedness. +\v 12 Since their food failed them, and all their water was scant, they took counsel to kill their livestock, and determined to consume all those things which God charged them by his laws that they should not eat. +\v 13 They are resolved to spend the first fruits of the grain and the tithes of the wine and the oil, which they had sanctified and reserved for the priests who stand before the face of our God in Jerusalem, which it is not fitting for any of the people so much as to touch with their hands. +\v 14 They have sent some to Jerusalem, because they also that dwell there have done this thing, to bring them permission from the council of elders. +\v 15 When these instructions come to them and they do it, they will be given to you to be destroyed the same day. +\v 16 Therefore I your servant, knowing all this, fled away from their presence. God sent me to work things with you, at which all the earth will be astonished, even as many as hear it. +\v 17 For your servant is religious, and serves the God of heaven day and night. Now, my lord, I will stay with you; and your servant will go out by night into the valley. I will pray to God, and he will tell me when they have committed their sins. +\v 18 Then I will come and tell you. Then you can go out with all your army, and there will be none of them that will resist you. +\v 19 And I will lead you through the midst of Judea, until you come to Jerusalem. I will set your throne in the midst of it. You will drive them as sheep that have no shepherd, and a dog will not so much as open his mouth before you; for these things were told me according to my foreknowledge, and were declared to me, and I was sent to tell you.” +\p +\v 20 Her words were pleasing in the sight of Holofernes and of all his servants. They marveled at her wisdom, and said, +\v 21 “There is not such a woman from one end of the earth to the other, for beauty of face and wisdom of words.” +\p +\v 22 Holofernes said to her, “God did well to send you before the people, that might would be in our hands, and destruction among those who slighted my lord. +\v 23 And now you are beautiful in your countenance, and wise in your words. If you will do as you have spoken, your God will be my God, and you will dwell in the palace of King Nebuchadnezzar, and will be renowned through the whole earth.” +\c 12 +\p +\v 1 He commanded that she should be brought in where his silver vessels were set, and asked that his servants should prepare some of his own delicacies for her, and that she should drink from his own wine. +\p +\v 2 And Judith said, “I can’t eat of it, lest there be an occasion of stumbling; but provision will be made for me from the things that have come with me.” +\p +\v 3 And Holofernes said to her, “But if the things that are with you should run out, from where will we be able to give you more like it? For there is none of your race with us.” +\p +\v 4 And Judith said to him, “As your soul lives, my lord, your servant will not use up those things that are with me until the Lord works by my hand the things that he has determined.” +\v 5 Then Holofernes’ servants brought her into the tent, and she slept until midnight. Then she rose up toward the morning watch, +\v 6 and sent to Holofernes, saying, “Let my lord now command that they allow your servant to go out to pray.” +\p +\v 7 Holofernes commanded his guards that they should not stop her. She stayed in the camp three days, and went out every night into the valley of Bethulia and washed herself at the fountain of water in the camp. +\v 8 And when she came up, she implored the Lord God of Israel to direct her way to the triumph of the children of his people. +\v 9 She came in clean and remained in the tent until she ate her food toward evening. +\p +\v 10 It came to pass on the fourth day, that Holofernes made a feast for his own servants only, and called none of the officers to the banquet. +\v 11 And he said to Bagoas the eunuch, who had charge over all that he had, “Go now, and persuade this Hebrew woman who is with you that she come to us, and eat and drink with us. +\v 12 For behold, it would be a disgrace if we shall let such a woman go, not having had her company; for if we don’t draw her to ourselves, she will laugh us to scorn.” +\p +\v 13 Bagoas went from the presence of Holofernes, and came in to her, and said, “Let this fair lady not fear to come to my lord, and to be honored in his presence, and to drink wine and be merry with us, and to be made this day as one of the daughters of the children of Asshur who serve in Nebuchadnezzar’s palace.” +\p +\v 14 Judith said to him, “Who am I, that I should contradict my lord? For whatever would be pleasing in his eyes, I will do speedily, and this will be my joy to the day of my death.” +\v 15 She arose, and decked herself with her apparel and all her woman’s attire; and her servant went and laid fleeces on the ground for her next to Holofernes, which she had received from Bagoas for her daily use, that she might sit and eat upon them. +\p +\v 16 Judith came in and sat down, and Holofernes’ heart was ravished with her. His passion was aroused, and he exceedingly desired her company. He was watching for a time to deceive her from the day that he had seen her. +\v 17 Holofernes said to her, “Drink now, and be merry with us.” +\p +\v 18 Judith said, “I will drink now, my lord, because my life is magnified in me this day more than all the days since I was born.” +\v 19 Then she took and ate and drank before him what her servant had prepared. +\v 20 Holofernes took great delight in her, and drank exceedingly much wine, more than he had drunk at any time in one day since he was born. +\c 13 +\p +\v 1 But when the evening had come, his servants hurried to depart. Bagoas shut the tent outside, and dismissed those who waited from the presence of his lord. They went away to their beds; for they were all weary, because the feast had been long. +\v 2 But Judith was left alone in the tent, with Holofernes lying along upon his bed; for he was drunk with wine. +\v 3 Judith had said to her servant that she should stand outside her bedchamber, and wait for her to come out, as she did daily; for she said she would go out to her prayer. She spoke to Bagoas according to the same words. +\v 4 All went away from her presence, and none was left in the bedchamber, small or great. Judith, standing by his bed, said in her heart, O Lord God of all power, look in this hour upon the works of my hands for the exaltation of Jerusalem. +\v 5 For now is the time to help your inheritance, and to do the thing that I have purposed to the destruction of the enemies which have risen up against us. +\v 6 She came to the bedpost which was at Holofernes’ head, and took down his sword from there. +\v 7 She drew near to the bed, took hold of the hair of his head, and said, “Strengthen me, O Lord God of Israel, this day.” +\v 8 She struck twice upon his neck with all her might and cut off his head, +\v 9 tumbled his body down from the bed, and took down the canopy from the posts. After a little while she went out, and gave Holofernes’ head to her maid; +\v 10 and she put it in her bag of food. They both went out together to prayer, according to their custom. They passed through the camp, circled around that valley, and went up to the mountain of Bethulia, and came to its gates. +\p +\v 11 Judith said afar off to the watchmen at the gates, “Open, open the gate, now. God is with us, even our God, to show his power yet in Israel, and his might against the enemy, as he has done even this day.” +\p +\v 12 It came to pass, when the men of her city heard her voice, they made haste to go down to the gate of their city, and they called together the elders of the city. +\v 13 They all ran together, both small and great, for it seemed unbelievable to them that she had come. They opened the gate and received them, making a fire to give light, and surrounded them. +\v 14 She said to them with a loud voice, “Praise God! Praise him! Praise God, who has not taken away his mercy from the house of Israel, but has destroyed our enemies by my hand tonight!” +\p +\v 15 Then she took the head out of the bag and showed it, and said to them, “Behold, the head of Holofernes, the chief captain of the army of Asshur, and behold, the canopy under which he laid in his drunkenness. The Lord struck him by the hand of a woman. +\v 16 And as the Lord lives, who preserved me in my way that I went, my countenance deceived him to his destruction, and he didn’t commit sin with me, to defile and shame me.” +\p +\v 17 All the people were exceedingly amazed, and bowed themselves, and worshiped God, and said with one accord, “Blessed are you, O our God, who have this day humiliated the enemies of your people.” +\p +\v 18 Ozias said to her, “Blessed are you, daughter, in the sight of the Most High God, above all the women upon the earth; and blessed is the Lord God, who created the heavens and the earth, who directed you to cut off the head of the prince of our enemies. +\v 19 For your hope will not depart from the heart of men that remember the strength of God forever. +\v 20 May God turn these things to you for a perpetual praise, to visit you with good things, because you didn’t spare your life by reason of the affliction of our race, but prevented our ruin, walking a straight way before our God.” +\p And all the people said, “Amen! Amen!” +\c 14 +\p +\v 1 Judith said to them, “Hear me now, my kindred, and take this head, and hang it upon the battlement of your wall. +\v 2 It will be, so soon as the morning appears, and the sun comes up on the earth, you shall each take up his weapons of war, and every valiant man of you go out of the city. You shall set a captain over them, as though you would go down to the plain toward the watch of the children of Asshur; but you men shall not go down. +\v 3 These will take up their full armor, and shall go into their camp and rouse up the captains of the army of Asshur. They will run together to Holofernes’ tent. They won’t find him. Fear will fall upon them, and they will flee before your face. +\v 4 You men, and all that inhabit every border of Israel, shall pursue them and overthrow them as they go. +\v 5 But before you do these things, summon Achior the Ammonite to me, that he may see and know him that despised the house of Israel, and that sent him to us, as it were to death. +\p +\v 6 And they called Achior out of the house of Ozias; but when he came, and saw the head of Holofernes in a man’s hand in the assembly of the people, he fell upon his face, and his spirit failed. +\v 7 But when they had recovered him,\f + \fr 14:7 \ft Many authorities read \fqa he had recovered himself. \f* he fell at Judith’s feet, bowed down to her, and said, “Blessed are you in every tent of Judah! In every nation, those who hear your name will be troubled. +\v 8 Now tell me all the things that you have done in these days.” +\p And Judith declared to him in the midst of the people all the things that she had done, from the day that she went out until the time that she spoke to them. +\v 9 But when she finished speaking, the people shouted with a loud voice, and made a joyful noise in their city. +\v 10 But when Achior saw all the things that the God of Israel had done, he believed in God exceedingly, and circumcised the flesh of his foreskin, and was joined to the house of Israel, to this day. +\p +\v 11 But as soon as the morning arose, they hanged the head of Holofernes upon the wall, and every man took up his weapons, and they went forth by bands to the ascents of the mountain. +\v 12 But when the children of Asshur saw them, they sent word to their leaders, and they went to their captains and tribunes, and to every one of their rulers. +\v 13 They came to Holofernes’ tent, and said to him that was over all that he had, “Wake our lord up, now, for the slaves have been bold to come down against us to battle, that they may be utterly destroyed.” +\p +\v 14 Bagoas went in, and knocked at the outer door of the tent; for he supposed that Holofernes was sleeping with Judith. +\v 15 But when no one answered, he opened it, went into the bedchamber, and found him cast upon the threshold dead; and his head had been taken from him. +\v 16 He cried with a loud voice, with weeping, groaning, and shouting, and tore his garments. +\v 17 He entered into the tent where Judith lodged, and he didn’t find her. He leaped out to the people, and cried aloud, +\v 18 “The slaves have dealt treacherously! One woman of the Hebrews has brought shame upon the house of King Nebuchadnezzar; for, behold, Holofernes lies upon the ground, and his head is not on him!” +\p +\v 19 But when the rulers of the army of Asshur heard this, they tore their tunics, and their souls were troubled exceedingly. There were cries and an exceedingly great noise in the midst of the camp. +\c 15 +\p +\v 1 When those who were in the tents heard, they were amazed at what happened. +\v 2 Trembling and fear fell upon them, and no man dared stay any more in the sight of his neighbor, but rushing out with one accord, they fled into every way of the plain and of the hill country. +\v 3 Those who had encamped in the hill country round about Bethulia fled away. And then the children of Israel, every one who was a warrior among them, rushed out upon them. +\v 4 Ozias sent to Betomasthaim, Bebai, Chobai, and Chola, and to every border of Israel, to tell about the things that had been accomplished, and that all should rush upon their enemies to destroy them. +\v 5 But when the children of Israel heard this, they all fell upon them with one accord, and struck them to Chobai. Yes, and in like manner also, people from Jerusalem and from all the hill country came (for men had told them about what happened in their enemies’ camp), and those who were in Gilead and in Galilee fell upon their flank with a great slaughter, until they were past Damascus and its borders. +\v 6 The rest of the people who lived at Bethulia fell upon the camp of Asshur, and plundered them, and were enriched exceedingly. +\v 7 The children of Israel returned from the slaughter, and got possession of that which remained. The villages and the cities that were in the hill country and in the plain country took many spoils; for there was an exceedingly great supply. +\p +\v 8 Joakim the high priest, and the elders of the children of Israel who lived in Jerusalem, came to see the good things which the Lord had showed to Israel, and to see Judith and to greet her. +\v 9 When they came to her, they all blessed her with one accord, and said to her, “You are the exaltation of Jerusalem! You are the great glory of Israel! You are the great rejoicing of our race! +\v 10 You have done all these things by your hand. You have done with Israel the things that are good, and God is pleased with it. May you be blessed by the Almighty Lord forever!” +\p And all the people said, “Amen!” +\p +\v 11 And the people plundered the camp for thirty days; and they gave Holofernes’ tent to Judith, along with all his silver cups, his beds, his bowls, and all his furniture. She took them, placed them on her mule, prepared her wagons, and piled them on it. +\p +\v 12 And all the women of Israel ran together to see her; and they blessed her, and made a dance among them for her. She took branches in her hand, and distributed them to the women who were with her.\f + \fr 15:12 \ft Compare 2 Maccabees 10:7. \f* +\v 13 Then they made themselves garlands of olive, she and those who were with her, and she went before all the people in the dance, leading all the women. All the men of Israel followed in their armor with garlands, and with songs in their mouths. +\c 16 +\p +\v 1 And Judith began to sing this song of thanksgiving in all Israel, and all the people sang with loud voices this song of praise. +\v 2 Judith said, +\q1 “Begin a song to my God with timbrels. +\q2 Sing to my Lord with cymbals. +\q1 Make melody to him with psalm and praise. +\q2 Exalt him, and call upon his name. +\q1 +\v 3 For the Lord is the God that crushes battles. +\q2 For in his armies in the midst of the people, +\q2 he delivered me out of the hand of those who persecuted me. +\q1 +\v 4 Asshur came out of the mountains from the north. +\q2 He came with ten thousands of his army. +\q1 Its multitude stopped the torrents. +\q2 Their horsemen covered the hills. +\q1 +\v 5 He said that he would burn up my borders, +\q2 kill my young men with the sword, +\q2 throw my nursing children to the ground, +\q2 give my infants up as prey, +\q2 and make my virgins a plunder. +\b +\q1 +\v 6 “The Almighty Lord brought them to nothing by the hand of a woman. +\q2 +\v 7 For their mighty one didn’t fall by young men, +\q2 neither did sons of the Titans strike him. +\q1 Tall giants didn’t attack him, +\q2 but Judith the daughter of Merari made him weak with the beauty of her countenance. +\b +\q1 +\v 8 “For she put off the apparel of her widowhood +\q2 for the exaltation of those who were distressed in Israel. +\q1 She anointed her face with ointment, +\q2 bound her hair in a tiara, +\q2 and took a linen garment to deceive him. +\q1 +\v 9 Her sandal ravished his eye. +\q2 Her beauty took his soul prisoner. +\q2 The sword passed through his neck. +\q1 +\v 10 “The Persians quaked at her daring. +\q2 The Medes were daunted at her boldness. +\b +\q1 +\v 11 “Then my lowly ones shouted aloud. +\q2 My oppressed people were terrified and trembled for fear. +\q2 They lifted up their voices and the enemy fled. +\q1 +\v 12 The children of slave-girls pierced them through, +\q2 and wounded them as fugitives’ children. +\q2 They perished by the army of my Lord. +\b +\q1 +\v 13 “I will sing to my God a new song: +\q2 O Lord, you are great and glorious, +\q2 marvelous in strength, invincible. +\q1 +\v 14 Let all your creation serve you; +\q2 for you spoke, and they were made. +\q1 You sent out your spirit, and it built them. +\q2 There is no one who can resist your voice. +\q1 +\v 15 For the mountains will be moved from their foundations with the waters, +\q2 and the rocks will melt as wax at your presence: +\q2 But you are yet merciful to those who fear you. +\q1 +\v 16 For all sacrifice is little for a sweet savor, +\q2 and all the fat is very little for a whole burnt offering to you; +\q2 but he who fears the Lord is great continually. +\b +\q1 +\v 17 “Woe to the nations who rise up against my race! +\q2 The Lord Almighty will take vengeance on them in the day of judgment +\q2 and put fire and worms in their flesh; +\q2 and they will weep and feel their pain forever.” +\p +\v 18 Now when they came to Jerusalem, they worshiped God. When the people were purified, they offered their whole burnt offerings, their free will offerings, and their gifts. +\v 19 Judith dedicated all Holofernes’ stuff, which the people had given her, and gave the canopy, which she had taken for herself out of his bedchamber, for a gift to the Lord. +\p +\v 20 And the people continued feasting in Jerusalem before the sanctuary for three months, and Judith remained with them. +\p +\v 21 After these days, everyone departed to his own inheritance. Judith went away to Bethulia, and remained in her own possession, and was honorable in her time in all the land. +\v 22 Many desired her, but no man knew her all the days of her life from the day that Manasses her husband died and was gathered to his people. +\v 23 She increased in greatness exceedingly; and she grew old in her husband’s house, to one hundred five years. She let her maid go free. Then she died in Bethulia. They buried her in the cave of her husband Manasses. +\v 24 The house of Israel mourned for her seven days. She distributed her goods before she died to all those who were nearest of kin to Manasses her husband, and to those who were nearest of her own kindred. +\v 25 There was no one who made the children of Israel afraid any more in the days of Judith, nor for a long time after her death. diff --git a/c-sharp/assets/WEB/70ESGengWEBUS.SFM b/c-sharp/assets/WEB/70ESGengWEBUS.SFM new file mode 100644 index 0000000000..612783bc5b --- /dev/null +++ b/c-sharp/assets/WEB/70ESGengWEBUS.SFM @@ -0,0 +1,288 @@ +\id ESG +\h Esther (Greek) +\toc1 Esther (Greek) +\toc2 Esther (Greek) +\toc3 ESG +\mt1 Esther +\mt2 translated from the Greek Septuagint +\is1 Introduction +\ip The book of Esther in the Greek Septuagint contains 5 additions that the traditional Hebrew text doesn’t have. These additions are recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. Those additions are enclosed in [square brackets]. Because the additions by themselves make little sense without the broader context of the book, we present here a translation of the whole book of Esther from the Greek. +\ip We have chosen not to distract the reader with confusing out-of-order chapter numbers that would result from using the KJV versification, but rather merge these 5 additions as extensions at the beginning of 1:1 and after 3:13, 4:17, 8:12, and 10:3. This makes some verses (1:1, 5:1, and 8:12) really long, but it also makes the verses line up with the same verse numbers in Esther as translated from the traditional Hebrew text. Some of the proper names in this book have been changed to the more familiar Hebrew form instead of the direct transliteration from the Greek. +\c 1 + +\p +\v 1 [In the second year of the reign of Ahasuerus the great king, on the first day of Nisan, Mordecai the son of Jair, the son of Shimei, the son of Kish, of the tribe of Benjamin, a Jew dwelling in the city Susa, a great man, serving in the king’s palace, saw a vision. Now he was one of the captives whom Nebuchadnezzar king of Babylon had carried captive from Jerusalem with Jeconiah the king of Judea. This was his dream: Behold, voices and a noise, thunders and earthquake, tumult upon the earth. And, behold, two great serpents came out, both ready for conflict. A great voice came from them. Every nation was prepared for battle by their voice, even to fight against the nation of the just. Behold, a day of darkness and blackness, suffering and anguish, affection and tumult upon the earth. And all the righteous nation was troubled, fearing their own afflictions. They prepared to die, and cried to God. Something like a great river from a little spring with much water, came from their cry. Light and the sun arose, and the lowly were exalted, and devoured the honorable. +\p Mordecai, who had seen this vision and what God desired to do, having arisen, kept it in his heart, and desired by all means to interpret it, even until night. +\p Mordecai rested quietly in the palace with Gabatha and Tharrha the king’s two chamberlains, eunuchs who guarded the palace. He heard their conversation and searched out their plans. He learned that they were preparing to lay hands on King Ahasuerus; and he informed the king concerning them. The king examined the two chamberlains. They confessed, and were led away and executed. The king wrote these things for a record. Mordecai also wrote concerning these matters. The king commanded Mordecai to serve in the palace, and gave gifts for this service. But Haman the son of Hammedatha the Bougean was honored in the sight of the king, and he endeavored to harm Mordecai and his people, because of the king’s two chamberlains.] +\p \f + \fr 1:1 \fl Note: \ft In the \fl Hebrew \ft and some copies of LXX, Esther begins here.\f* And it came to pass after these things\f + \fr 1:1 \fl Greek \ft words.\f* in the days of Ahasuerus, —(this Ahasuerus ruled over one hundred twenty-seven provinces from India)— +\v 2 in those days, when King Ahasuerus was on the throne in the city of Susa, +\v 3 in the third year of his reign, he made a feast for his friends, for people from the rest of the nations, for the nobles of the Persians and Medes, and for the chief of the local governors. +\v 4 After this—after he had shown them the wealth of his kingdom and the abundant glory of his wealth during one hundred eighty days— +\v 5 when the days of the wedding feast were completed, the king made a banquet lasting six days for the people of the nations who were present in the city, in the court of the king’s house, +\v 6 which was adorned with fine linen and flax on cords of fine linen and purple, fastened to golden and silver studs on pillars of white marble and stone. There were golden and silver couches on a pavement of emerald stone, and of mother-of-pearl, and of white marble, with transparent coverings variously flowered, having roses arranged around it. +\v 7 There were gold and silver cups, and a small cup of carbuncle set out, of the value of thirty thousand talents, with abundant and sweet wine, which the king himself drank. +\v 8 This banquet was not according to the appointed law, but as the king desired to have it. He charged the stewards to perform his will and that of the company. +\p +\v 9 Also Vashti the queen made a banquet for the women in the palace where King Ahasuerus lived. +\v 10 Now on the seventh day, the king, being merry, told Haman, Bazan, Tharrha, Baraze, Zatholtha, Abataza, and Tharaba, the seven chamberlains, servants of King Ahasuerus, +\v 11 to bring in the queen to him, to\f + \fr 1:11 \fl Greek \ft to make her queen. \f* enthrone her, and crown her with the diadem, and to show her to the princes, and her beauty to the nations, for she was beautiful. +\v 12 But queen Vashti refused to come with the chamberlains; so the king was grieved and angered. +\v 13 And he said to his friends, “This is what Vashti said. Therefore pronounce your legal judgment on this case.” +\p +\v 14 So Arkesaeus, Sarsathaeus, and Malisear, the princes of the Persians and Medes, who were near the king, who sat chief in rank by the king, drew near to him, +\v 15 and reported to him according to the laws what it was proper to do to queen Vashti, because she had not done the things commanded by the king through the chamberlains. +\v 16 And Memucan said to the king and to the princes, “Queen Vashti has not wronged the king only, but also all the king’s rulers and princes; +\v 17 for he has told them the words of the queen, and how she\f + \fr 1:17 \fl Greek \ft contradicted. \f* disobeyed the king. As she then refused to obey King Ahasuerus, +\v 18 so this day the other wives of the chiefs of the Persians and Medes, having heard what she said to the king, will dare in the same way to dishonor their husbands. +\v 19 If then it seems good to the king, let him make a royal decree, and let it be written according to the laws of the Medes and Persians, and let him not alter it: ‘Don’t allow the queen to come in to him any more. Let the king give her royalty to a woman better than she.’ +\v 20 Let the law of the king which he will have made be widely proclaimed in his kingdom. Then all the women will give honor to their husbands, from the poor even to the rich.” +\v 21 This advice pleased the king and the princes; and the king did as Memucan had said, +\v 22 and sent into all his kingdom through the several provinces, according to their language, so that men might be feared in their own houses. +\c 2 +\p +\v 1 After this, the king’s anger was pacified, and he no more mentioned Vashti, bearing in mind what she had said, and how he had condemned her. +\v 2 Then the servants of the king said, “Let chaste, beautiful young virgins be sought for the king. +\v 3 Let the king appoint local governors in all the provinces of his kingdom, and let them select beautiful, chaste young ladies and bring them to the city Susa, into the women’s apartment. Let them be consigned to the king’s chamberlain, the keeper of the women. Then let things for purification and other needs be given to them. +\v 4 Let the woman who pleases the king be queen instead of Vashti.” +\p This thing pleased the king; and he did so. +\p +\v 5 Now there was a Jew in the city Susa, and his name was Mordecai, the son of Jairus, the son of Shimei, the son of Kish, of the tribe of Benjamin. +\v 6 He had been brought as a prisoner from Jerusalem, whom Nebuchadnezzar king of Babylon had carried into captivity. +\v 7 He had a foster child, daughter of Aminadab his father’s brother. Her name was Esther. When her parents died, he brought her up to womanhood as his own. This lady was beautiful. +\v 8 And because the king’s ordinance was published, many ladies were gathered to the city of Susa under the hand of Hegai; and Esther was brought to Hegai, the keeper of the women. +\v 9 The lady pleased him, and she found favor in his sight. He hurried to give her the things for purification, her portion, and the seven maidens appointed her out of the palace. He treated her and her maidens well in the women’s apartment. +\v 10 But Esther didn’t reveal her family or her kindred, for Mordecai had charged her not to tell. +\v 11 But Mordecai used to walk every day by the women’s court, to see what would become of Esther. +\p +\v 12 Now this was the time for a virgin to go into the king, when she had completed twelve months; for so are the days of purification fulfilled, six months while they are anointing themselves with oil of myrrh, and six months with spices and women’s purifications. +\v 13 And then the lady goes in to the king. The officer that he commands to do so will bring her to come in with him from the women’s apartment to the king’s chamber. +\v 14 She enters in the evening, and in the morning she departs to the second women’s apartment, where Hegai the king’s chamberlain is keeper of the women. She doesn’t go in to the king again, unless she is called by name. +\v 15 And when the time was fulfilled for Esther the daughter of Aminadab the brother of Mordecai’s father to go in to the king, she neglected nothing which the chamberlain, the women’s keeper, commanded; for Esther found grace in the sight of all who looked at her. +\v 16 So Esther went in to King Ahasuerus in the twelfth month, which is Adar, in the seventh year of his reign. +\v 17 The king loved Esther, and she found favor beyond all the other virgins. He put the queen’s crown on her. +\v 18 The king made a banquet for all his friends and great men for seven days, and he highly celebrated the marriage of Esther; and he granted a remission of taxes to those who were under his dominion. +\p +\v 19 Meanwhile, Mordecai served in the courtyard. +\v 20 Now Esther had not revealed her country, for so Mordecai commanded her, to fear God, and perform his commandments, as when she was with him. Esther didn’t change her manner of life. +\p +\v 21 Two chamberlains of the king, the chiefs of the body-guard, were grieved, because Mordecai was promoted; and they sought to kill King Ahasuerus. +\v 22 And the matter was discovered by Mordecai, and he made it known to Esther, and she declared to the king the matter of the conspiracy. +\v 23 And the king examined the two chamberlains and hanged them. Then the king gave orders to make a note for a memorial in the royal library of the goodwill shown by Mordecai, as a commendation. +\c 3 +\p +\v 1 After this, King Ahasuerus highly honored Haman the son of Hammedatha, the Bugaean. He exalted him and set his seat above all his friends. +\v 2 All in the palace bowed down to him, for so the king had given orders to do; but Mordecai didn’t bow down to him. +\v 3 And they in the king’s palace said to Mordecai, “Mordecai, why do you transgress the commands of the king?” +\v 4 They questioned him daily, but he didn’t listen to them; so they reported to Haman that Mordecai resisted the commands of the king; and Mordecai had shown to them that he was a Jew. +\v 5 When Haman understood that Mordecai didn’t bow down to him, he was greatly enraged, +\v 6 and plotted to utterly destroy all the Jews who were under the rule of Ahasuerus. +\p +\v 7 In the twelfth year of the reign of Ahasuerus, Haman made a decision by casting lots by day and month, to kill the race of Mordecai in one day. The lot fell on the fourteenth day of the month of Adar. +\v 8 So he spoke to King Ahasuerus, saying, “There is a nation scattered among the nations in all your kingdom, and their laws differ from all the other nations. They disobey the king’s laws. It is not expedient for the king to tolerate them. +\v 9 If it seem good to the king, let him make a decree to destroy them, and I will remit into the king’s treasury ten thousand talents of silver.” +\p +\v 10 So the king took off his ring, and gave it into the hands of Haman to seal the decrees against the Jews. +\v 11 The king said to Haman, “Keep the silver, and treat the nation as you will.” +\v 12 So the king’s recorders were called in the first month, on the thirteenth day, and they wrote as Haman commanded to the captains and governors in every province, from India even to Ethiopia, to one hundred twenty-seven provinces; and to the rulers of the nations according to their languages, in the name of King Ahasuerus. +\v 13 The message was sent by couriers throughout the kingdom of Ahasuerus, to utterly destroy the race of the Jews on the first day of the twelfth month, which is Adar, and to plunder their goods.\f + \fr 3:13 \fl Note: \ft The part in brackets is not in \fl Hebrew\f* [The following is the copy of the letter. “From the great King Ahasuerus to the rulers and the governors under them of one hundred twenty-seven provinces, from India even to Ethiopia, who hold authority under him: +\p “Ruling over many nations and having obtained dominion over the whole world, I was determined (not elated by the confidence of power, but ever conducting myself with great moderation and gentleness) to make the lives of my subjects continually tranquil, desiring both to maintain the kingdom quiet and orderly to its utmost limits, and to restore the peace desired by all men. When I had asked my counselors how this should be brought to pass, Haman, who excels in soundness of judgment among us, and has been manifestly well inclined without wavering and with unshaken fidelity, and had obtained the second post in the kingdom, informed us that a certain ill-disposed people is scattered among all the tribes throughout the world, opposed in their law to every other nation, and continually neglecting the commands of the king, so that the united government blamelessly administered by us is not quietly established. Having then conceived that this nation is continually set in opposition to every man, introducing as a change a foreign code of laws, and injuriously plotting to accomplish the worst of evils against our interests, and against the happy establishment of the monarchy, we instruct you in the letter written by Haman, who is set over the public affairs and is our second governor, to destroy them all utterly with their wives and children by the swords of the enemies, without pitying or sparing any, on the fourteenth day of the twelfth month Adar, of the present year; that the people aforetime and now ill-disposed to us having been violently consigned to death in one day, may hereafter secure to us continually a well constituted and quiet state of affairs.”] +\v 14 Copies of the letters were published in every province; and an order was given to all the nations to be ready for that day. +\v 15 This business was hastened also in Susa. The king and Haman began to drink, but the city was confused. +\c 4 +\p +\v 1 But Mordecai, having perceived what was done, tore his garments, put on sackcloth, and sprinkled dust upon himself. Having rushed forth through the open street of the city, he cried with a loud voice, “A nation that has done no wrong is going to be destroyed!” +\v 2 He came to the king’s gate, and stood; for it was not lawful for him to enter into the palace wearing sackcloth and ashes. +\v 3 And in every province where the letters were published, there was crying, lamentation, and great mourning on the part of the Jews. They wore sackcloth and ashes. +\v 4 The queen’s maids and chamberlains went in and told her; and when she had heard what was done, she was deeply troubled. She sent clothes to Mordecai to replace his sackcloth, but he refused. +\v 5 So Esther called for her chamberlain Hathach, who waited upon her; and she sent to learn the truth from Mordecai. +\v 7 Mordecai showed him what was done, and the promise which Haman had made the king of ten thousand talents to be paid into the treasury, that he might destroy the Jews. +\v 8 And he gave him the copy of what was published in Susa concerning their destruction to show to Esther; and told him to charge her to go in and entreat the king, and to beg him for the people. “Remember, he said, the days of your humble condition, how you were nursed by my hand; because Haman, who holds the next place to the king, has spoken against us to cause our death. Call upon the Lord, and speak to the king concerning us, to deliver us from death.” +\p +\v 9 So Hathach went in and told her all these words. +\v 10 Esther said to Hathach, “Go to Mordecai, and say, +\v 11 ‘All the nations of the empire know than any man or woman who goes in to the king into the inner court without being called, that person must die, unless the king stretches out his golden sceptre; then he shall live. I haven’t been called to go into the king for thirty days.’” +\p +\v 12 So Hathach reported to Mordecai all the words of Esther. +\v 13 Then Mordecai said to Hathach, “Go, and say to her, ‘Esther, don’t say to yourself that you alone will escape in the kingdom, more than all the other Jews. +\v 14 For if you keep quiet on this occasion, help and protection will come to the Jews from another place; but you and your father’s house will perish. Who knows if you have been made queen for this occasion?’” +\p +\v 15 And Esther sent the messenger who came to her to Mordecai, saying, +\v 16 “Go and assemble the Jews that are in Susa, and all of you fast for me. Don’t eat or drink for three days, night and day. My maidens and I will also fast. Then I will go in to the king contrary to the law, even if I must die.” +\p +\v 17 So Mordecai went and did all that Esther commanded him.\f + \fr 4:17 \ft Note: The part between brackets, \fl i.e. \ft to the end of chapter 5 is not in the Hebrew \f* +\v 18 [He prayed to the Lord, making mention of all the works of the Lord. +\v 19 He said, “Lord\f + \fr 4:19 \ft See 3 Kings 8.53. \fl Note. \f* God, you are king ruling over all, for all things are in your power, and there is no one who can oppose you in your purpose to save Israel; +\v 20 for you have made the heaven and the earth and every wonderful thing under heaven. +\v 21 You are Lord of all, and there is no one who can resist you, Lord. +\v 22 You know all things. You know, Lord, that it is not in insolence, nor arrogance, nor love of glory, that I have done this, to refuse to bow down to the arrogant Haman. +\v 23 For I would gladly have kissed the soles of his feet for the safety of Israel. +\v 24 But I have done this that I might not set the glory of man above the glory of God. I will not worship anyone except you, my Lord, and I will not do these things in arrogance. +\v 25 And now, O Lord God, the King, the God of Abraham, spare your people, for our enemies are planning our destruction, and they have desired to destroy your ancient inheritance. +\v 26 Do not overlook your people, whom you have redeemed for yourself out of the land of Egypt. +\v 27 Listen to my prayer. Have mercy on your inheritance and turn our mourning into gladness, that we may live and sing praise to your name, O Lord. Don’t utterly destroy the mouth of those who praise you, O Lord.” +\p +\v 28 All Israel cried with all their might, for death was before their eyes. +\v 29 And queen Esther took refuge in the Lord, being taken as it were in the agony of death. +\v 30 Having taken off her glorious apparel, she put on garments of distress and mourning. Instead of grand perfumes she filled her head with ashes and dung. She greatly humbled her body, and she filled every place of her glad adorning with her tangled hair. +\v 31 She implored the Lord God of Israel, and said, “O my Lord, you alone are our king. Help me. I am destitute, and have no helper but you, +\v 32 for my danger is near at hand\f + \fr 4:32 \fl Greek \ft in my hand. \f*. +\v 33 I have heard from my birth in the tribe of my kindred that you, Lord, took Israel out of all the nations, and our fathers out of all their kindred for a perpetual inheritance, and have done for them all that you have said. +\v 34 And now we have sinned before you, and you have delivered us into the hands of our enemies, +\v 35 because we honored their gods. You are righteous, O Lord. +\v 36 But now they have not been content with the bitterness of our slavery, but have laid their hands on the hands of their idols +\v 37 to abolish the decree of your mouth, and utterly to destroy your inheritance, and to stop the mouth of those who praise you, and to extinguish the glory of your house and your altar, +\v 38 and to open the mouth of the Gentiles to speak the\f + \fr 4:38 \fl Greek \ft virtues. \f* praises of vanities, and that a mortal king should be admired forever. +\v 39 O Lord, don’t surrender your sceptre to those who don’t exist, and don’t let them laugh at our fall, but turn their counsel against themselves, and make an example of him who has begun to injure us. +\v 40 Remember us, O Lord! Manifest yourself in the time of our affliction. Encourage me, O King of gods, and ruler of all dominion! +\v 41 Put harmonious speech into my mouth before the lion, and turn his heart to hate him who fights against us, to the utter destruction of those who agree with him. +\v 42 But deliver us by your hand, and help me who am alone and have no one but you, O Lord. +\v 43 You know all things, and know that I hate the glory of transgressors,\f + \fr 4:43 \fl Or, \ft opinion. \f* and that I abhor the bed of the uncircumcised and of every stranger. +\v 44 You know my necessity, for I abhor the symbol of my proud station, which is upon my head in the days of my\f + \fr 4:44 \fl Greek \ft vision.\f* splendor. I abhor it as a menstruous cloth, and I don’t wear it in the days of my tranquility. +\v 45 Your handmaid has not eaten at Haman’s table, and I have not honored the banquet of the king, neither have I drunk wine of libations. +\v 46 Neither has your handmaid rejoiced since the day of my promotion until now, except in you, O Lord God of Abraham. +\v 47 O god, who has power over all, listen to the voice of the desperate, and deliver us from the hand of those who devise mischief. Deliver me from my fear.] +\c 5 +\p +\v 1 \f + \fr 5:1 \ft From the first verse to the third, the \fl Greek widely differs from the \fl Hebrew \f* It came to pass on the third day, when she had ceased praying, that she took off her servant’s dress and put on her glorious apparel. Being splendidly dressed and having called upon God the Overseer and Preserver of all things, she took her two maids, and she leaned upon one, as a delicate female, and the other followed bearing her train. She was blooming in the perfection of her beauty. Her face was cheerful and looked lovely, but her heart was filled with fear. Having passed through all the doors, she stood before the king. He was sitting on his royal throne. He had put on all his glorious apparel, covered all over with gold and precious stones, and was very terrifying. And having raised his face resplendent with glory, he looked with intense anger. The queen fell, and changed her color as she fainted. She bowed herself upon the head of the maid who went before her. But God changed the spirit of the king to gentleness, and in intense feeling, he sprang from off his throne, and took her into his arms, until she recovered. He comforted her with peaceful words, and said to her, “What is the matter, Esther? I am your relative. Cheer up! You shall not die, for our command is openly declared to you: ‘Draw near.’” +\p +\v 2 And having raised the golden sceptre, he laid it upon her neck, and embraced her. He said, “Speak to me.” +\p So she said to him, “I saw you, my lord, as an angel of God, and my heart was troubled for fear of your glory; for you, my lord, are to be wondered at, and your face is full of grace.” While she was speaking, she fainted and fell. +\p Then the king was troubled, and all his servants comforted her. +\v 3 The king said, “What do you desire, Esther? What is your request? Ask even to the half of my kingdom, and it shall be yours.” +\p +\v 4 Esther said, “Today is a special day. So if it seems good to the king, let both him and Haman come to the feast which I will prepare this day.” +\p +\v 5 The king said, “Hurry and bring Haman here, that we may do as Esther said.” So they both came to the feast about which Esther had spoken. +\v 6 At the banquet, the king said to Esther, “What is your request, queen Esther? You shall have all that you require.” +\p +\v 7 She said, “My request and my petition is: +\v 8 if I have found favor in the king’s sight, let the king and Haman come again tomorrow to the feast which I shall prepare for them, and tomorrow I will do as I have done today.” +\p +\v 9 So Haman went out from the king very glad and merry; but when Haman saw Mordecai the Jew in the court, he was greatly enraged. +\v 10 Having gone into his own house, he called his friends, and his wife Zeresh. +\v 11 He showed them his wealth and the glory with which the king had invested him, and how he had promoted him to be chief ruler in the kingdom. +\v 12 Haman said, “The queen has called no one to the feast with the king but me, and I am invited tomorrow. +\v 13 But these things don’t please me while I see Mordecai the Jew in the court. +\p +\v 14 Then Zeresh his wife and his friends said to him, “Let a fifty cubit tall\f + \fr 5:14 \fl Greek \ft a tree cut. \f* gallows be made for you. In the morning you speak to the king, and let Mordecai be hanged on the gallows; but you go in to the feast with the king, and be merry.” +\p The saying pleased Haman, and the gallows was prepared. +\c 6 +\p +\v 1 The Lord removed sleep from the king that night; so he told his servant to bring in the\f + \fr 6:1 \fl Greek \ft letters. \f* books, the registers of daily events, to read to him. +\v 2 And he found the\f + \fr 6:2 \fl Greek \ft letters. \f* records written concerning Mordecai, how he had told the king about the king’s two chamberlains, when they were keeping guard, and sought to lay hands on Ahasuerus. +\v 3 The king said, “What honor or favor have we done for Mordecai?” +\p The king’s servants said, “You haven’t done anything for him.” +\p +\v 4 And while the king was enquiring about the kindness of Mordecai, behold, Haman was in the court. The king said, “Who is in the court? Now Haman had come in to speak to the king about hanging Mordecai on the gallows which he had prepared. +\v 5 The king’s servants said, “Behold, Haman stands in the court.” +\p And the king said, “Call him!” +\p +\v 6 The king said to Haman, “What should I do for the man whom I wish to honor?” +\p Haman said within himself, “Whom would the king honor but myself?” +\v 7 He said to the king, “As for the man whom the king wishes to honor, +\v 8 let the king’s servants bring the robe of fine linen which the king puts on, and the horse on which the king rides, +\v 9 and let him give it to one of the king’s noble friends, and let him dress the man whom the king loves. Let him mount him on the horse, and proclaim through the\f + \fr 6:9 \fl Or, \ft wide space. \f* streets of the city, saying, “This is what will be done for every man whom the king honors!” +\p +\v 10 Then the king said to Haman, “You have spoken well. Do so for Mordecai the Jew, who waits in the palace, and let not a word of what you have spoken be neglected!” +\p +\v 11 So Haman took the robe and the horse, dressed Mordecai, mounted him on the horse, and went through the streets of the city, proclaiming, “This is what will be done for every man whom the king wishes to honor.” +\v 12 Then Mordecai returned to the palace; but Haman went home mourning, with his head covered. +\p +\v 13 Haman related the events that had happened to him to Zeresh his wife and to his friends. His friends and his wife said to him, “If Mordecai is of the race of the Jews, and you have begun to be humbled before him, you will assuredly fall; and you will not be able to withstand him, for the living God is with him.” +\v 14 While they were still speaking, the chamberlains arrived to rush Haman to the banquet which Esther had prepared. +\c 7 +\p +\v 1 So the king and Haman went in to drink with the queen. +\v 2 The king said to Esther at the banquet on the second day, “What is it, queen Esther? What is your request? What is your petition? It shall be done for you, up to half of my kingdom.” +\p +\v 3 She answered and said, “If I have found favor in the sight of the king, let my life be granted as my petition, and my people as my request. +\v 4 For both I and my people are sold for destruction, pillage, and genocide. If both we and our children were sold for male and female slaves, I would not have bothered you, for this\f + \fr 7:4 \ft see \fqa Hebrew: slanderer \f* isn’t worthy of the king’s palace.” +\p +\v 5 The king said, “Who has dared to do this thing?” +\p +\v 6 Esther said, “The enemy is Haman, this wicked man!” +\p Then Haman was terrified in the presence of the king and the queen. +\v 7 The king rose up from the banquet to go into the garden. Haman began to beg the queen for mercy, for he saw that he was in serious trouble. +\v 8 The king returned from the garden; and Haman had fallen upon the couch, begging the queen for mercy. The king said, “Will you even assault my wife in my house?” +\p And when Haman heard it, he changed countenance. +\v 9 And Bugathan, one of the chamberlains, said to the king, “Behold, Haman has also prepared a gallows for Mordecai, who spoke concerning the king, and a fifty cubit high gallows has been set up on Haman’s property.” +\p The king said, “Let him be\f + \fr 7:9 \fl Or, \ft impaled. \f* hanged on it!” +\v 10 So Haman was hanged on the gallows that had been prepared for Mordecai. Then the king’s wrath was abated. +\c 8 +\p +\v 1 On that day, King Ahasuerus gave to Esther all that belonged to Haman the slanderer. The king called Mordecai, for Esther had told that he was related to her. +\v 2 The king took the ring which he had taken away from Haman and gave it to Mordecai. Esther appointed Mordecai over all that had been Haman’s. +\v 3 She spoke yet again to the king, and fell at his feet, and implored him to undo Haman’s mischief and all that he had done against the Jews. +\v 4 Then the king extended the golden sceptre to Esther; and Esther arose to stand near the king. +\v 5 Esther said, “If it seems good to you, and I have found favor in your sight, let an order be sent that the letters sent by Haman may be reversed—letters that were written for the destruction of the Jews who are in your kingdom. +\v 6 For how could I see the affliction of my people, and how could I survive the destruction of my\f + \fr 8:6 \fl Greek \ft country. \f* kindred?” +\p +\v 7 Then the king said to Esther, “If I have given and freely granted you all that was Haman’s, and hanged him on a gallows because he laid his hands upon the Jews, what more do you seek? +\v 8 Write in my name whatever seems good to you, and seal it with my ring; for whatever is written at the command of the king, and sealed with my ring, cannot be countermanded. +\v 9 So the scribes were called in the first month, which is Nisan, on the twenty-third day of the same year; and orders were written to the Jews, whatever the king had commanded to the\f + \fr 8:9 \fl Greek \ft stewards.\f* local governors and chiefs of the local governors, from India even to Ethiopia—one hundred twenty-seven local governors, according to the several provinces, in their own languages. +\v 10 They were written by order of the king, sealed with his ring, and the letters were sent by the couriers. +\v 11 In them, he charged them to use their own laws in every city, to help each other, and to treat their adversaries and those who attacked them as they pleased, +\v 12 on one day in all the kingdom of Ahasuerus, on the thirteenth day of the twelfth month, which is Adar. +\v 13 Let the copies be posted in conspicuous places throughout the kingdom. Let all the Jews be ready against this day, to fight against their enemies. The following is a copy of the letter containing orders: +\p \f + \fr 8:13 \ft the passages in brackets are not in the \fl Hebrew. \f* [The great King Ahasuerus sends greetings to the rulers of provinces in one hundred twenty-seven local governance regions, from India to Ethiopia, even to those who are faithful to our interests. Many who have been frequently honored by the most abundant kindness of their\f + \fr 8:13 \ft perhaps rulers, see Luke 22. 25. \f* benefactors have conceived ambitious designs, and not only endeavor to hurt our subjects, but moreover, not being able to bear prosperity, they also endeavor to plot against their own benefactors. They not only would utterly abolish gratitude from among men, but also, elated by the boastings of men who are strangers to all that is good, they supposed that they would escape the sin-hating vengeance of the ever-seeing God. And oftentimes evil exhortation has made partakers of the guilt of shedding innocent blood, and has involved in irremediable calamities many of those who had been appointed to offices of authority, who had been entrusted with the management of their friends’ affairs; while men, by the false sophistry of an evil disposition, have deceived the simple goodwill of the ruling powers. And it is possible to see this, not so much from more ancient traditional accounts, as it is immediately in your power to see it by examining what things have been wickedly\f + \fr 8:13 \fl Greek \ft contrived. \f* perpetrated by the baseness of men unworthily holding power. It is right to take heed with regard to the future, that we may maintain the government in undisturbed peace for all men, adopting needful changes, and ever judging those cases which come under our notice with truly equitable decisions. For whereas Haman, a Macedonian, the son of Hammedatha, in reality an alien from the blood of the Persians, and differing widely from our mild course of government, having been hospitably entertained by us, obtained so large a share of our universal kindness as to be called our father, and to continue the person next to the royal throne, reverenced of all; he however, overcome by\f + \fr 8:13 \fl Greek \ft not having borne.\f* pride, endeavored to deprive us of our dominion, and our life;\f + \fr 8:13 \fl Greek \ft spirit. \f* having by various and subtle artifices demanded for destruction both Mordecai our deliverer and perpetual benefactor, and Esther the blameless consort of our kingdom, along with their whole nation. For by these methods he thought, having surprised us in a defenseless state, to transfer the dominion of the Persians to the Macedonians. But we find that the Jews, who have been consigned to destruction by the\f + \fr 8:13 \fl Greek \ft thrice guilty. \f* most abominable of men, are not malefactors, but living according to the most just laws, and being the sons of the living God, the most high and\f + \fr 8:13 \fl Greek \ft greatest. \f* mighty, who maintains the kingdom, to us as well as to our forefathers, in the most excellent order. You will therefore do well in refusing to obey the letter sent by Haman the son of Hammedatha, because he who has done these things has been hanged with his whole family at the gates of Susa, Almighty God having swiftly returned to him a worthy punishment. We enjoin you then, having openly published a copy of this letter in every place, to give the Jews permission to use their own lawful customs and to strengthen them, that on the thirteenth of the twelfth month Adar, on the self-same day, they may defend themselves against those who attack them in a time of affliction. For in the place of the destruction of the chosen race, Almighty God has granted them this time of gladness. Therefore you also, among your notable feasts, must keep a distinct day with all festivity, that both now and hereafter it may be a day of deliverance to us and who are well disposed toward the Persians, but to those that plotted against us a memorial of destruction. And every city and province collectively, which shall not do accordingly, shall be consumed with vengeance by spear and fire. It shall be made not only inaccessible to men, but most hateful to wild beasts and birds forever.] Let the copies be posted in conspicuous places throughout the kingdom and let all the Jews be ready against this day, to fight against their enemies. +\v 14 So the horsemen went forth with haste to perform the king’s commands. The ordinance was also published in Susa. +\p +\v 15 Mordecai went out robed in royal apparel, wearing a golden crown and a diadem of fine purple linen. The people in Susa saw it and rejoiced. +\v 16 The Jews had light and gladness +\v 17 in every city and province where the ordinance was published. Wherever the proclamation took place, the Jews had joy and gladness, feasting and mirth. Many of the Gentiles were circumcised and became Jews for fear of the Jews. +\c 9 +\p +\v 1 Now in the twelfth month, on the thirteenth day of the month, which is Adar, the letters written by the king arrived. +\v 2 In that day, the adversaries of the Jews perished; for no one resisted, through fear of them. +\v 3 For the chiefs of the local governors, and the princes and the royal scribes, honored the Jews; for the fear of Mordecai was upon them. +\v 4 For the order of the king was in force, that he should be celebrated in all the kingdom. +\v 6 In the city Susa the Jews killed five hundred men, +\v 7 including Pharsannes, Delphon, Phasga, +\v 8 Pharadatha, Barea, Sarbaca, +\v 9 Marmasima, Ruphaeus, Arsaeus, and Zabuthaeus, +\v 10 the ten sons of Haman the son of Hammedatha the Bugaean, the enemy of the Jews; and they plundered their property on the same day. +\v 11 The number of those who perished in Susa was reported to the king. +\p +\v 12 Then the king said to Esther, “The Jews have slain five hundred men in the city Susa. What do you think they have done in the rest of the country? What more do you ask, that it may be done for you?” +\p +\v 13 Esther said to the king, “Let it be granted to the Jews to do the same to them tomorrow. Also, hang the bodies of the ten sons of Haman.” +\p +\v 14 He permitted it to be done; and he gave up to the Jews of the city the bodies of the sons of Haman to hang. +\v 15 The Jews assembled in Susa on the fourteenth day of Adar and killed three hundred men, but plundered no property. +\p +\v 16 The rest of the Jews who were in the kingdom assembled, and helped one another, and obtained rest from their enemies; for they destroyed fifteen thousand of them on the thirteenth day of Adar, but took no spoil. +\v 17 They rested on the fourteenth of the same month, and kept it as a day of rest with joy and gladness. +\p +\v 18 The Jews in the city of Susa assembled also on the fourteenth day and rested; and they also observed the fifteenth with joy and gladness. +\v 19 On this account then, the Jews dispersed in every foreign land keep the fourteenth of Adar as a\f + \fr 9:19 \fl Greek \ft good day. \f* holy day with joy, each sending gifts of food to his neighbor. +\p +\v 20 Mordecai wrote these things in a book and sent them to the Jews, as many as were in the kingdom of Ahasuerus, both those who were near and those who were far away, +\v 21 to establish these as joyful days and to keep the fourteenth and fifteenth of Adar; +\v 22 for on these days the Jews obtained rest from their enemies; and in that month, which was Adar, in which a change was made for them from mourning to joy, and from sorrow to a holiday, to spend the whole of it in good days of\f + \fr 9:22 \fl Greek \ft weddings. \f* feasting and gladness, sending portions to their friends and to the poor. +\v 23 And the Jews consented to this as Mordecai wrote to them, +\v 24 showing how Haman the son of Hammedatha the Macedonian fought against them, how he made a decree and cast\f + \fr 9:24 \fl Greek \ft lot. \f* lots to destroy them utterly; +\v 25 also how he went in to the king, telling him to hang Mordecai; but all the calamities he tried to bring upon the Jews came upon himself, and he was hanged, along with his children. +\v 26 Therefore these days were called Purim, because of the lots (for in their language they are called Purim) because of the words of this letter, and because of all they suffered on this account, and all that happened to them. +\v 27 Mordecai established it, and the Jews took upon themselves, upon their offspring, and upon those who were joined to them to observe it, neither would they on any account behave differently; but these days were to be a memorial kept in every generation, city, family, and province. +\v 28 These days of Purim shall be kept forever, and their memorial shall not fail in any generation. +\p +\v 29 Queen Esther the daughter of Aminadab and Mordecai the Jew wrote all that they had done, and gave the confirmation of the letter about Purim. +\v 31 Mordecai and Esther the queen established this decision on their own, pledging their own well-being to their plan. +\v 32 And Esther established it by a command forever, and it was written for a memorial. +\c 10 +\p +\v 1 The king levied a tax upon his kingdom both by land and sea. +\v 2 As for his strength and valour, and the wealth and glory of his kingdom, behold, they are written in the book of the Persians and Medes for a memorial. +\p +\v 3 Mordecai\f + \fr 10:3 \fl Greek \ft succeded to \fl Or, came into the place of. \f* was viceroy to King Ahasuerus, and was a great man in the kingdom, honored by the Jews, and lived his life loved by all his nation.\f + \fr 10:3 \ft the passages in brackets are not in the \fl Hebrew. \f* +\v 4 [Mordecai said, “These things have come from God. +\v 5 For I remember the dream which I had concerning these matters; for not one detail of them has failed. +\v 6 There was the little spring which became a river, and there was light, and the sun and much water. The river is Esther, whom the king married and made queen. +\v 7 The two serpents are Haman and me. +\v 8 The nations are those which combined to destroy the name of the Jews. +\v 9 But as for my nation, this is Israel, even those who cried to God and were delivered; for the Lord delivered his people. The Lord rescued us out of all these calamities; and God worked such signs and great wonders as have not been done among the nations. +\v 10 Therefore he ordained two lots. One for the people of God, and one for all the other nations. +\v 11 And these two lots came for an appointed season, and for a day of judgment, before God, and for all the nations. +\v 12 God remembered his people and vindicated his inheritance. +\v 13 They shall observe these days in the month Adar, on the fourteenth and on the fifteenth day of the month, with an assembly, joy, and gladness before God, throughout the generations forever among his people Israel. +\v 14 In the fourth year of the reign of Ptolemeus and Cleopatra, Dositheus, who said he was a priest and Levite, and Ptolemeus his son brought this letter of Purim, which they said was authentic, and that Lysimachus the son of Ptolemeus, who was in Jerusalem, had interpreted.] diff --git a/c-sharp/assets/WEB/71WISengWEBUS.SFM b/c-sharp/assets/WEB/71WISengWEBUS.SFM new file mode 100644 index 0000000000..89d176a0a4 --- /dev/null +++ b/c-sharp/assets/WEB/71WISengWEBUS.SFM @@ -0,0 +1,1618 @@ +\id WIS - The Wisdom Of Solomon +\h Wisdom of Solomon +\toc1 The Wisdom of Solomon +\toc2 Wisdom of Solomon +\toc3 Wisdom +\mt1 The Wisdom of Solomon +\ip The \bk Wisdom of Solomon\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\c 1 + +\q1 +\v 1 Love righteousness, all you who are judges of the earth. +\q2 Think of the Lord\f + \fr 1:1 \ft Gr. \fqa in goodness. \f* with a good mind. +\q1 Seek him in singleness of heart, +\q2 +\v 2 because he is found by those who don’t put him to the test, +\q2 and is manifested to those who trust him. +\q1 +\v 3 for crooked thoughts separate from God. +\q2 His Power convicts when it is tested, +\q2 and exposes the foolish; +\q1 +\v 4 because wisdom will not enter into a soul that devises evil, +\q2 nor dwell in a body that is enslaved by sin. +\q1 +\v 5 For a holy spirit of discipline will flee deceit, +\q2 and will depart from thoughts that are without understanding, +\q2 and will be ashamed when unrighteousness has come in. +\b +\q1 +\v 6 For\f + \fr 1:6 \ft Some authorities read \fqa the spirit of wisdom is loving to man. \f* wisdom is a spirit who loves man, +\q2 and she will not hold a\f + \fr 1:6 \ft Or, \fqa reviler \f* blasphemer guiltless for his lips, +\q2 because God is witness of his inmost self, +\q2 and is a true overseer of his heart, +\q2 and a hearer of his tongue. +\q1 +\v 7 Because the spirit of the Lord has filled\f + \fr 1:7 \ft Gr. \fqa the inhabited earth. \f* the world, +\q2 and that which holds all things together knows what is said. +\q1 +\v 8 Therefore no one who utters unrighteous things will be unseen; +\q2 neither will Justice, when it convicts, pass him by. +\q1 +\v 9 For in his counsels the ungodly will be searched out, +\q2 and the sound of his words will come to the Lord to bring his lawless deeds to conviction; +\q1 +\v 10 because a jealous ear listens to all things, +\q2 and the noise of murmurings is not hidden. +\q1 +\v 11 Beware then of unprofitable murmuring, +\q2 and keep your tongue from slander; +\q2 because no secret utterance will go on its way void, +\q2 and a lying mouth destroys a soul. +\q1 +\v 12 Don’t court death in the error of your life. +\q2 Don’t draw destruction upon yourselves by the works of your hands; +\q2 +\v 13 because God didn’t make death, +\q2 neither does he delight when the living perish. +\q1 +\v 14 For he created all things that they might have being. +\q2 The generative powers of the world are wholesome, +\q2 and there is no poison of destruction in them, +\q2 nor has Hades\f + \fr 1:14 \ft Or, \fqa a royal house \f* royal dominion upon earth; +\q1 +\v 15 for righteousness is immortal, +\q2 +\v 16 but ungodly men by their hands and their words summon death; +\q2 deeming him a friend they\f + \fr 1:16 \ft Or, \fqa were consumed \ft with love of him \f* pined away. +\q1 They made a covenant with him, +\q2 because they are worthy to belong with him. +\b +\c 2 +\q1 +\v 1 For they said\f + \fr 2:1 \ft Or, \fqa among \f* within themselves, with unsound reasoning, +\q2 “Our life is short and sorrowful. +\q2 There is no healing when a man comes to his end, +\q2 and no one was ever known who\f + \fr 2:1 \ft Or, \fqa returned out of Hades \f* was released from Hades. +\q1 +\v 2 Because we were born by mere chance, +\q2 and hereafter we will be as though we had never been, +\q2 because the breath in our nostrils is smoke, +\q2 and reason is a spark kindled by the beating of our heart, +\q1 +\v 3 which being extinguished, the body will be turned into ashes, +\q2 and the spirit will be dispersed as thin air. +\q1 +\v 4 Our name will be forgotten in time. +\q2 No one will remember our works. +\q2 Our life will pass away as the traces of a cloud, +\q2 and will be scattered as is a mist, +\q2 when it is chased by the rays of the sun, +\q2 and\f + \fr 2:4 \ft Gr. \fqa weighed down. \f* overcome by its heat. +\q1 +\v 5 For our allotted time is the passing of a shadow, +\q2 and our end doesn’t retreat, +\q2 because it is securely sealed, and no one\f + \fr 2:5 \ft Or, \fqa comes again \f* turns it back. +\b +\q1 +\v 6 “Come therefore and let’s enjoy the good things that exist. +\q2 Let’s use the creation earnestly as in our youth. +\q1 +\v 7 Let’s fill ourselves with costly wine and perfumes, +\q2 and let no spring flower pass us by. +\q1 +\v 8 Let’s crown ourselves with rosebuds before they wither. +\q1 +\v 9 Let none of us go without his share in our proud revelry. +\q2 Let’s leave tokens of mirth everywhere, +\q2 because this is our portion, and this is our lot. +\q1 +\v 10 Let’s oppress the righteous poor. +\q2 Let’s not spare the widow, +\q2 nor regard the gray hair of the old man. +\q1 +\v 11 But let our strength be a law of righteousness; +\q2 for that which is weak is proven useless. +\q1 +\v 12 But let’s lie in wait for the righteous man, +\q2 because he annoys us, +\q2 is contrary to our works, +\q2 reproaches us with sins against the law, +\q2 and charges us with sins against our training. +\q1 +\v 13 He professes to have knowledge of God, +\q2 and calls himself a child of the Lord. +\q1 +\v 14 He became to us a reproof of our thoughts. +\q1 +\v 15 He is grievous to us even to look at, +\q2 because his life is unlike other men’s, +\q2 and his paths are strange. +\q1 +\v 16 We were regarded by him as something worthless, +\q2 and he abstains from our ways as from uncleanness. +\q2 He calls the latter end of the righteous happy. +\q2 He boasts that God is his father. +\q1 +\v 17 Let’s see if his words are true. +\q2 Let’s test what will happen at the end of his life. +\q1 +\v 18 For if the righteous man is God’s son, he will uphold him, +\q2 and he will deliver him out of the hand of his adversaries. +\q1 +\v 19 Let’s test him with insult and torture, +\q2 that we may find out how gentle he is, +\q2 and test his patience. +\q1 +\v 20 Let’s condemn him to a shameful death, +\q2 for he will be protected, according to his words.” +\b +\q1 +\v 21 Thus they reasoned, and they were led astray; +\q2 for their wickedness blinded them, +\q1 +\v 22 and they didn’t know the mysteries of God, +\q2 neither did they hope for wages of holiness, +\q2 nor did they discern that there is a prize for blameless souls. +\q1 +\v 23 Because God created man for incorruption, +\q2 and made him an image of his own everlastingness; +\q1 +\v 24 but death entered into the world by the envy of the devil, +\q2 and those who belong to him experience it. +\c 3 +\q1 +\v 1 But the souls of the righteous are in the hand of God, +\q2 and no torment will touch them. +\q1 +\v 2 In the eyes of the foolish they seemed to have died. +\q2 Their departure was considered a disaster, +\q2 +\v 3 and their travel away from us ruin, +\q2 but they are in peace. +\q1 +\v 4 For even if in the sight of men they are punished, +\q2 their hope is full of immortality. +\q1 +\v 5 Having borne a little chastening, they will receive great good; +\q2 because God tested them, and found them worthy of himself. +\q1 +\v 6 He tested them like gold in the furnace, +\q2 and he accepted them as a whole burnt offering. +\q1 +\v 7 In the time of their visitation they will shine. +\q2 They will run back and forth like sparks among stubble. +\q1 +\v 8 They will judge nations and have dominion over peoples. +\q2 The Lord will reign over them forever. +\q2 +\v 9 Those who trust him will understand truth. +\q2 The faithful will live with him in love, +\q2 because grace and mercy are with his chosen ones. +\b +\q1 +\v 10 But the ungodly will be punished even as their reasoning deserves, +\q2 those who neglected righteousness and revolted from the Lord; +\q2 +\v 11 for he who despises wisdom and discipline is miserable. +\q1 Their hope is void and their toils unprofitable. +\q2 Their works are useless. +\q1 +\v 12 Their wives are foolish and their children are wicked. +\q2 +\v 13 Their descendants are cursed. +\q1 For the barren woman who is undefiled is happy, +\q2 she who has not conceived in transgression. +\q2 She will have fruit when God examines souls. +\q1 +\v 14 So is the eunuch which has done no lawless deed with his hands, +\q2 nor imagined wicked things against the Lord; +\q1 for a precious gift will be given to him for his faithfulness, +\q2 and a delightful inheritance in the Lord’s sanctuary. +\q1 +\v 15 For good labors have fruit of great renown. +\q2 The root of understanding can’t fail. +\q1 +\v 16 But children of adulterers will not come to maturity. +\q2 The seed of an unlawful union will vanish away. +\q1 +\v 17 For if they live long, they will not be esteemed, +\q2 and in the end, their old age will be without honor. +\q1 +\v 18 If they die young, they will have no hope, +\q2 nor consolation in the day of judgment. +\q1 +\v 19 For the end of an unrighteous generation is always grievous. +\c 4 +\q1 +\v 1 It is better to be childless with virtue, +\q2 for immortality is in the memory of virtue, +\q2 because it is recognized both before God and before men. +\q1 +\v 2 When it is present, people imitate it. +\q2 They long after it when it has departed. +\q1 Throughout all time it marches, crowned in triumph, +\q2 victorious in the competition for the prizes that are undefiled. +\q1 +\v 3 But the multiplying brood of the ungodly will be of no profit, +\q2 and their illegitimate offshoots won’t take deep root, +\q2 nor will they establish a sure hold. +\q1 +\v 4 For even if they grow branches and flourish for a season, +\q2 standing unsure, they will be shaken by the wind. +\q2 They will be uprooted by the violence of winds. +\q1 +\v 5 Their branches will be broken off before they come to maturity. +\q2 Their fruit will be useless, +\q2 never ripe to eat, and fit for nothing. +\q1 +\v 6 For unlawfully conceived children are witnesses of wickedness +\q2 against parents when they are investigated. +\b +\q1 +\v 7 But a righteous man, even if he dies before his time, will be at rest. +\q1 +\v 8 For honorable old age is not that which stands in length of time, +\q2 nor is its measure given by number of years, +\q2 +\v 9 but understanding is gray hair to men, +\q2 and an unspotted life is ripe old age. +\b +\q1 +\v 10 Being found well-pleasing to God, someone was loved. +\q2 While living among sinners he was transported. +\q1 +\v 11 He was caught away, lest evil should change his understanding, +\q2 or guile deceive his soul. +\q1 +\v 12 For the fascination of wickedness obscures the things which are good, +\q2 and the whirl of desire perverts an innocent mind. +\q1 +\v 13 Being made perfect quickly, +\q2 he filled a long time; +\q2 +\v 14 for his soul was pleasing to the Lord. +\q2 Therefore he hurried out of the midst of wickedness. +\q1 +\v 15 But the peoples saw and didn’t understand, +\q2 not considering this, that grace and mercy are with his chosen, +\q2 and that he visits his holy ones; +\q1 +\v 16 but a righteous man who is dead will condemn the ungodly who are living, +\q2 and youth who is quickly perfected will condemn the many years of an unrighteous man’s old age. +\q1 +\v 17 For the ungodly will see a wise man’s end, +\q2 and won’t understand what the Lord planned for him, +\q2 and why he safely kept him. +\q1 +\v 18 They will see, and they will despise; +\q2 but the Lord will laugh them to scorn. +\q1 After this, they will become a dishonored carcass +\q2 and a reproach among the dead forever; +\q1 +\v 19 because he will dash them speechless to the ground, +\q2 and will shake them from the foundations. +\q1 They will lie utterly waste. +\q2 They will be in anguish +\q2 and their memory will perish. +\b +\q1 +\v 20 They will come with coward fear when their sins are counted. +\q2 Their lawless deeds will convict them to their face. +\c 5 +\q1 +\v 1 Then the righteous man will stand in great boldness +\q2 before the face of those who afflicted him, +\q2 and those who make his labors of no account. +\q1 +\v 2 When they see him, they will be troubled with terrible fear, +\q2 and will be amazed at the marvel of salvation. +\q1 +\v 3 They will speak among themselves repenting, +\q2 and for distress of spirit they will groan, +\q2 “This was he whom we used to hold in derision, +\q2 as a parable of reproach. +\q1 +\v 4 We fools considered his life madness, +\q2 and his end without honor. +\q1 +\v 5 How was he counted among sons of God? +\q2 How is his lot among saints? +\q1 +\v 6 Truly we went astray from the way of truth. +\q2 The light of righteousness didn’t shine for us. +\q2 The sun didn’t rise for us. +\q1 +\v 7 We\f + \fr 5:7 \ft See Proverbs 14:14. \f* took our fill of the paths of lawlessness and destruction. +\q2 We traveled through trackless deserts, +\q2 but we didn’t know the Lord’s way. +\q1 +\v 8 What did our arrogance profit us? +\q2 What good have riches and boasting brought us? +\b +\q1 +\v 9 Those things all passed away as a shadow, +\q2 like a rumor that runs by, +\q2 +\v 10 like a ship passing through the billowy water, +\q2 which, when it has gone by, there is no trace to be found, +\q2 no pathway of its keel in the waves. +\q1 +\v 11 Or it is like when a bird flies through the air, +\q2 no evidence of its passage is found, +\q2 but the light wind, lashed with the stroke of its pinions, +\q2 and torn apart with the violent rush of the moving wings, is passed through. +\q2 Afterwards no sign of its coming remains. +\q1 +\v 12 Or it is like when an arrow is shot at a mark, +\q2 the air it divided closes up again immediately, +\q2 so that men don’t know where it passed through. +\q1 +\v 13 So we also, as soon as we were born, ceased to be; +\q2 and we had no sign of virtue to show, +\q2 but we were utterly consumed in our wickedness.” +\q1 +\v 14 Because the hope of the ungodly man is like chaff carried by the wind, +\q2 and\f + \fr 5:14 \ft Gr. \fqa like foam chased to thinness: \ft or, \fqa as thin foam chased. \f* as\f + \fr 5:14 \ft Most Greek authorities read \fqa hoar frost: \ft some authorities, perhaps rightly, \fqa a spider’s web.\f* foam vanishing before a tempest; +\q2 and is scattered like smoke by the wind, +\q2 and passes by as the remembrance of a guest who stays just a day. +\b +\q1 +\v 15 But the righteous live forever. +\q2 Their reward is in the Lord, +\q2 and the care for them with the Most High. +\q1 +\v 16 Therefore they will receive the crown of royal dignity +\q2 and the diadem of beauty from the Lord’s hand, +\q1 because he will cover them with his right hand, +\q2 and he will shield them with his arm. +\q1 +\v 17 He will take his zeal as complete armor, +\q2 and will make the whole creation his weapons to punish his enemies: +\q1 +\v 18 He will put on righteousness as a breastplate, +\q2 and will wear impartial judgment as a helmet. +\q1 +\v 19 He will take holiness as an invincible shield. +\q2 +\v 20 He will sharpen stern wrath for a sword. +\q2 The universe will go with him to fight against his frenzied foes. +\q1 +\v 21 Shafts of lightning will fly with true aim. +\q2 They will leap to the mark from the clouds, as from a well-drawn bow. +\q1 +\v 22 Hailstones full of wrath will be hurled as from a catapult. +\q2 The water of the sea will be angered against them. +\q2 Rivers will sternly overwhelm them. +\q1 +\v 23 A mighty wind will encounter them. +\q2 It will winnow them away like a tempest. +\q1 So lawlessness will make all the land desolate. +\q2 Their evil-doing will overturn the thrones of princes. +\c 6 +\q1 +\v 1 Hear therefore, you kings, and understand. +\q2 Learn, you judges of the ends of the earth. +\q2 +\v 2 Give ear, you rulers who have dominion over many people, +\q2 and make your boast\f + \fr 6:2 \ft Or, \fqa in the multitudes of your nations \f* in multitudes of nations, +\q1 +\v 3 because your dominion was given to you from the Lord, +\q2 and your sovereignty from the Most High. +\q1 He will search out your works, +\q2 and will inquire about your plans, +\q1 +\v 4 because being officers of his kingdom, you didn’t judge rightly, +\q2 nor did you keep the law, +\q2 nor did you walk according to God’s counsel. +\q1 +\v 5 He will come upon you awfully and swiftly, +\q2 because a stern judgment comes on those who are in high places. +\q1 +\v 6 For the man of low estate may be pardoned in mercy, +\q2 but mighty men will be mightily tested. +\q1 +\v 7 For the Sovereign Lord of all will not be impressed with anyone, +\q2 neither will he show deference to greatness; +\q1 because it is he who made both small and great, +\q2 and cares about them all; +\q1 +\v 8 but the scrutiny that comes upon the powerful is strict. +\q1 +\v 9 Therefore, my words are to you, O princes, +\q2 that you may learn wisdom and not fall away. +\q1 +\v 10 For those who have kept the things that are holy in holiness will be made holy. +\q2 Those who have been taught them will find what to say in defense. +\q1 +\v 11 Therefore set your desire on my words. +\q2 Long for them, and you princes will be instructed. +\b +\q1 +\v 12 Wisdom is radiant and doesn’t fade away; +\q2 and is easily seen by those who love her, +\q2 and found by those who seek her. +\q1 +\v 13 She anticipates those who desire her, making herself known. +\q1 +\v 14 He who rises up early to seek her won’t have difficulty, +\q2 for he will find her sitting at his gates. +\q2 +\v 15 For to think upon her is perfection of understanding, +\q2 and he who watches for her will quickly be free from care; +\q1 +\v 16 because she herself goes around, seeking those who are worthy of her, +\q2 and in their paths she appears to them graciously, +\q2 and in every purpose she meets them. +\q1 +\v 17 For her true beginning is desire for instruction; +\q2 and desire for instruction is love. +\q1 +\v 18 And love is observance of her laws. +\q2 To give heed to her laws confirms immortality. +\q1 +\v 19 Immortality brings closeness to God. +\q2 +\v 20 So then desire for wisdom promotes to a kingdom. +\b +\q1 +\v 21 If therefore you delight in thrones and sceptres, you princes of peoples, +\q2 honor wisdom, that you may reign forever. +\q1 +\v 22 But what wisdom is, and how she came into being, I will declare. +\q2 I won’t hide mysteries from you; +\q2 but I will explore from her first beginning, +\q2 bring the knowledge of her into clear light, +\q2 and I will not pass by the truth. +\q1 +\v 23 Indeed, I won’t travel with consuming envy, +\q2 because envy will have no fellowship with wisdom. +\q1 +\v 24 But a multitude of wise men is salvation to the world, +\q2 and an understanding king is stability for his people. +\q1 +\v 25 Therefore be instructed by my words, and you will profit. +\c 7 +\q1 +\v 1 I myself am also\f + \fr 7:1 \ft Many authorities read \fqa a mortal man.\f* mortal, like everyone else, +\q2 and am a descendant of one formed first and born of the earth. +\q1 +\v 2 I molded into flesh in the time of ten months in my mother’s womb, +\q2 being compacted in blood from the seed of man and pleasure of marriage. +\q1 +\v 3 I also, when I was born, drew in the common air, +\q2 and fell upon the kindred earth, +\q1 uttering, like all, for my first voice, the same cry. +\q1 +\v 4 I was nursed with care in swaddling clothes. +\q1 +\v 5 For no king had a different beginning, +\q2 +\v 6 but all men have one entrance into life, and a common departure. +\b +\q1 +\v 7 For this cause I prayed, and understanding was given to me. +\q2 I asked, and a spirit of wisdom came to me. +\q1 +\v 8 I preferred her before sceptres and thrones. +\q2 I considered riches nothing in comparison to her. +\q1 +\v 9 Neither did I liken to her any priceless gem, +\q2 because all gold in her presence is a little sand, +\q2 and silver will be considered as clay before her. +\q1 +\v 10 I loved her more than health and beauty, +\q2 and I chose to have her rather than light, +\q2 because her bright shining is never laid to sleep. +\q1 +\v 11 All good things came to me with her, +\q2 and innumerable riches are in her hands. +\q1 +\v 12 And I rejoiced over them all because wisdom leads them; +\q2 although I didn’t know that she was their mother. +\q1 +\v 13 As I learned without guile, I impart without grudging. +\q2 I don’t hide her riches. +\q1 +\v 14 For she is a treasure for men that doesn’t fail, +\q2 and those who use it obtain friendship with God, +\q2 commended by the gifts which they present through discipline. +\b +\q1 +\v 15 But may God grant that I may speak his judgment, +\q2 and to conceive thoughts worthy of what has been given me; +\q2 because he is one who guides even wisdom and who corrects the wise. +\q1 +\v 16 For both we and our words are in his hand, +\q2 with all understanding and skill in various crafts. +\q1 +\v 17 For he himself gave me an unerring knowledge of the things that are, +\q2 to know the structure of the universe and the operation of the elements; +\q2 +\v 18 the beginning, end, and middle of times; +\q2 the alternations of the solstices and the changes of seasons; +\q2 +\v 19 the circuits of years and the positions of stars; +\q2 +\v 20 the natures of living creatures and the raging of wild beasts; +\q2 the violence of\f + \fr 7:20 \ft Or, \fqa spirits \f* winds and the thoughts of men; +\q2 the diversities of plants and the virtues of roots. +\q1 +\v 21 All things that are either secret or manifest I learned, +\q2 +\v 22 for wisdom, that is the architect of all things, taught me. +\b +\q1 For there is in her a spirit that is quick to understand, holy, +\q2 unique, manifold, subtle, freely moving, clear in utterance, unpolluted, +\q2 distinct, invulnerable, loving what is good, keen, unhindered, +\q2 +\v 23 beneficent, loving toward man, steadfast, sure, free from care, all-powerful, all-surveying, +\q2 and penetrating through all spirits that are quick to understand, pure, most subtle. +\q1 +\v 24 For wisdom is more mobile than any motion. +\q2 Yes, she pervades and penetrates all things by reason of her purity. +\q1 +\v 25 For she is a breath of the power of God, +\q2 and a pure emanation of the glory of the Almighty. +\q1 Therefore nothing defiled can find entrance into her. +\q1 +\v 26 For she is a reflection of everlasting light, +\q2 an unspotted mirror of the working of God, +\q2 and an image of his goodness. +\q1 +\v 27 Although she is one, she has power to do all things. +\q2 Remaining in herself, she renews all things. +\q1 From generation to generation passing into holy souls, +\q2 she makes friends of God and prophets. +\q2 +\v 28 For God loves nothing as much as one who dwells with wisdom. +\q1 +\v 29 For she is fairer than the sun, +\q2 and above all the constellations of the stars. +\q2 She is better than light. +\q1 +\v 30 For daylight yields to night, +\q2 but evil does not prevail against wisdom. +\c 8 +\q1 +\v 1 But she reaches from one end to the other with full strength, +\q2 and orders all things well. +\b +\q1 +\v 2 I loved her and sought her from my youth. +\q2 I sought to take her for my bride. +\q2 I became enamoured by her beauty. +\q1 +\v 3 She glorifies her noble birth by living with God. +\q2 The Sovereign Lord of all loves her. +\q1 +\v 4 For she is initiated into the knowledge of God, +\q2 and she chooses his works. +\q1 +\v 5 But if riches are a desired possession in life, +\q2 what is richer than wisdom, which makes all things? +\q1 +\v 6 And if understanding is effective, +\q2 who more than\f + \fr 8:6 \ft Gr. \fqa she. \f* wisdom is an architect of the things that exist? +\q1 +\v 7 If a man loves righteousness, +\q2 the fruits of wisdom’s labor\f + \fr 8:7 \ft Gr. \fqa her labors\f* are virtues, +\q2 for she teaches soberness, understanding, righteousness, and courage. +\q2 There is nothing in life more profitable for people than these. +\q1 +\v 8 And if anyone longs for wide experience, +\q2 she knows the things of old, and infers the things to come. +\q2 She understands subtleties of speeches and interpretations of dark sayings. +\q2 She foresees signs and wonders, and the issues of seasons and times. +\b +\q1 +\v 9 Therefore I determined to take her to live with me, +\q2 knowing that she is one who would give me good counsel, +\q2 and encourage me in cares and grief. +\q1 +\v 10 Because of her, I will have glory among multitudes, +\q2 and honor in the sight of elders, though I am young. +\q1 +\v 11 I will be found keen when I give judgment. +\q2 I will be admired in the presence of rulers. +\q1 +\v 12 When I am silent, they will wait for me. +\q2 When I open my lips, they will heed what I say. +\q2 If I continue speaking, they will put their hands on their mouths. +\q1 +\v 13 Because of her, I will have immortality, +\q2 and leave behind an eternal memory to those who come after me. +\q1 +\v 14 I will govern peoples. +\q2 Nations will be subjected to me. +\q1 +\v 15 Dreaded monarchs will fear me when they hear of me. +\q2 Among the people, I will show myself to be good, and courageous in war. +\q1 +\v 16 When I come into my house, I will find rest with her. +\q2 For conversation with her has no bitterness, +\q2 and living with her has no pain, but gladness and joy. +\q1 +\v 17 When I considered these things in myself, +\q2 and thought in my heart how immortality is in kinship to wisdom, +\q1 +\v 18 and in her friendship is good delight, +\q2 and in the labors of her hands is wealth that doesn’t fail, +\q2 and understanding is in her companionship, +\q2 and great renown in having fellowship with her words, +\q2 I went about seeking how to take her to myself. +\q1 +\v 19 Now I was a clever child, and received a good soul. +\q2 +\v 20 Or rather, being good, I came into an undefiled body. +\q1 +\v 21 But perceiving that I could not otherwise possess wisdom unless God gave her to me— +\q2 yes, and to know and understand by whom the grace is given— +\q2 I pleaded with the Lord and implored him, and with my whole heart I said: +\c 9 +\q1 +\v 1 “O God of my ancestors and Lord of mercy, +\q2 who made all things by your word; +\q1 +\v 2 and by your wisdom you formed man, +\q2 that he should have dominion over the creatures that were made by you, +\q1 +\v 3 and rule the world in holiness and righteousness, +\q2 and execute judgment in uprightness of soul, +\q2 +\v 4 give me wisdom, her who sits by you on your thrones. +\q1 Don’t reject me from among your\f + \fr 9:4 \ft Or, \fqa children \f* servants, +\q2 +\v 5 because I am your servant and the son of your handmaid, +\q2 a weak and short-lived man, +\q2 with little power to understand judgment and laws. +\q1 +\v 6 For even if a man is perfect among the sons of men, +\q2 if the wisdom that comes from you is not with him, he will count for nothing. +\q1 +\v 7 You chose me to be king of your people, +\q2 and a judge for your sons and daughters. +\q1 +\v 8 You gave a command to build a sanctuary on your holy mountain, +\q2 and\f + \fr 9:8 \ft Or, \fqa a place of sacrifice \f* an altar in the city where you live, +\q2 a copy of the holy tent which you prepared from the beginning. +\q1 +\v 9 Wisdom is with you and knows your works, +\q2 and was present when you were making the world, +\q2 and understands what is pleasing in your eyes, +\q2 and what is right according to your commandments. +\q1 +\v 10 Send her from the holy heavens, +\q2 and ask her to come from the throne of your glory, +\q2 that being present with me she may work, +\q2 and I may learn what pleases you well. +\q1 +\v 11 For she knows all things and understands, +\q2 and she will guide me prudently in my actions. +\q2 She will guard me in her glory. +\q1 +\v 12 So my works will be acceptible. +\q2 I will judge your people righteously, +\q2 and I will be worthy of my father’s\f + \fr 9:12 \ft Gr. \fqa thrones. \f* throne. +\q1 +\v 13 For what man will know the counsel of God? +\q2 Or who will conceive what the Lord wills? +\q1 +\v 14 For the thoughts of mortals are unstable, +\q2 and our plans are prone to fail. +\q1 +\v 15 For a corruptible body weighs down the soul. +\q2 The earthy tent burdens a mind that is full of cares. +\q1 +\v 16 We can hardly guess the things that are on earth, +\q2 and we find the things that are close at hand with labor; +\q2 but who has traced out the things that are in the heavens? +\q1 +\v 17 Who gained knowledge of your counsel, unless you gave wisdom, +\q2 and sent your holy spirit from on high? +\q1 +\v 18 It was thus that the ways of those who are on earth were corrected, +\q2 and men were taught the things that are pleasing to you. +\q2 They were saved through wisdom.” +\b +\c 10 +\q1 +\v 1 Wisdom\f + \fr 10:1 \ft Gr. \fqa She. \f* guarded to the end the first formed father of the world, who was created alone, +\q2 and delivered him out of his own transgression, +\q1 +\v 2 and gave him strength to rule over all things. +\q1 +\v 3 But when an unrighteous man fell away from her in his anger, +\q2 he perished himself in the rage with which he killed his brother. +\q1 +\v 4 When for his cause the earth was drowning with a flood, +\q1 wisdom again saved it, +\q1 guiding the righteous man’s course by a paltry piece of wood. +\b +\q1 +\v 5 Moreover, when nations consenting together in wickedness had been confounded, +\q2 wisdom\f + \fr 10:5 \ft Gr. \fqa she \f* knew the righteous man, and preserved him blameless to God, +\q2 and kept him strong when his heart yearned toward his child. +\b +\q1 +\v 6 While the ungodly were perishing, wisdom\f + \fr 10:6 \ft Gr. \fqa she \f* delivered a righteous man, +\q2 when he fled from the fire that descended out of heaven on the five cities. +\q1 +\v 7 To whose wickedness a smoking waste still witnesses, +\q2 and plants bearing fair fruit that doesn’t ripen, +\q2 a disbelieving soul has a memorial: a standing pillar of salt. +\q1 +\v 8 For having passed wisdom by, +\q2 not only were they disabled from recognising the things which are good, +\q2 but they also left behind them for their life a monument of their folly, +\q2 to the end that where they stumbled, they might fail even to be unseen; +\q1 +\v 9 but wisdom delivered those who waited on her out of troubles. +\b +\q1 +\v 10 When a righteous man was a fugitive from a brother’s wrath,\f + \fr 10:10 \ft Gr. \fqa she. \f* wisdom guided him in straight paths. +\q2 She showed him God’s kingdom, and gave him knowledge of holy things. +\q2 She prospered him in his toils, and multiplied the fruits of his labor. +\q1 +\v 11 When in their covetousness men dealt harshly with him, +\q2 she stood by him and made him rich. +\q1 +\v 12 She guarded him from enemies, +\q2 and she kept him safe from those who lay in wait. +\q2 Over his severe conflict, she watched as judge, +\q2 that he might know that godliness is more powerful than every one. +\b +\q1 +\v 13 When a righteous man was sold,\f + \fr 10:13 \ft Gr. \fqa she. \f* wisdom didn’t forsake him, +\q2 but she delivered him from sin. +\q2 She went down with him into a dungeon, +\q1 +\v 14 and in bonds she didn’t depart from him, +\q2 until she brought him the sceptre of a kingdom, +\q2 and authority over those that dealt like a tyrant with him. +\q2 She also showed those who had mockingly accused him to be false, +\q2 and gave him eternal glory. +\b +\q1 +\v 15 Wisdom\f + \fr 10:15 \ft Gr. \fqa she. \f* delivered a holy people and a blameless seed from a nation of oppressors. +\q1 +\v 16 She entered into the soul of a servant of the Lord, +\q2 and withstood terrible kings in wonders and signs. +\q1 +\v 17 She rendered to holy men a reward of their toils. +\q2 She guided them along a marvelous way, +\q2 and became to them a covering in the day-time, +\q2 and a starry flame through the night. +\q1 +\v 18 She brought them over the Red sea, +\q2 and led them through much water; +\q1 +\v 19 but she drowned their enemies, +\q2 and she cast them up from the bottom of the deep. +\q1 +\v 20 Therefore the righteous plundered the ungodly, +\q2 and they sang praise to your holy name, O Lord, +\q2 and extolled with one accord your hand that fought for them, +\q1 +\v 21 because wisdom opened the mouth of the mute, +\q1 and made the tongues of babes to speak clearly. +\b +\c 11 +\q1 +\v 1 Wisdom prospered their works in the hand of a holy prophet. +\b +\q1 +\v 2 They traveled through a desert without inhabitant, +\q2 and they pitched their tents in trackless regions. +\q1 +\v 3 They withstood enemies and repelled foes. +\q1 +\v 4 They thirsted, and they called upon you, +\q2 and water was given to them out of the\f + \fr 11:4 \ft See Deuteronomy 8:15; Psalm 114:8. \f* flinty rock, +\q2 and healing of their thirst out of the hard stone. +\q1 +\v 5 For by what things their foes were punished, +\q2 by these they in their need were benefited. +\q1 +\v 6 When enemies were troubled with clotted blood +\q2 instead of a river’s ever-flowing fountain, +\q1 +\v 7 to rebuke the decree for the slaying of babies, +\q2 you gave them abundant water beyond all hope, +\q1 +\v 8 having shown by the thirst which they had suffered +\q2 how you punished the adversaries. +\q1 +\v 9 For when they were tried, although chastened in mercy, +\q2 they learned how the ungodly were tormented, being judged with wrath. +\q1 +\v 10 For you tested these as a father admonishing them; +\q2 but you searched out those as a stern king condemning them. +\q1 +\v 11 Yes and whether they were far off or near, +\q2 they were equally distressed; +\q1 +\v 12 for a double grief seized them, +\q2 and a groaning at the memory of things past. +\q1 +\v 13 For when they heard that through their own punishments the others benefited, +\q2 they recognized the Lord. +\q1 +\v 14 For him who long before was thrown out and exposed they stopped mocking. +\q2 In the end of what happened, they marveled, +\q2 having thirsted in another manner than the righteous. +\b +\q1 +\v 15 But in return for the senseless imaginings of their unrighteousness, +\q2 wherein they were led astray to worship irrational reptiles and wretched vermin, +\q2 you sent upon them a multitude of irrational creatures to punish them, +\q2 +\v 16 that they might learn that by what things a man sins, by these he is punished. +\q1 +\v 17 For your all-powerful hand +\q2 that created the world out of formless matter +\q2 didn’t lack means to send upon them a multitude of bears, fierce lions, +\q2 +\v 18 or newly-created and unknown wild beasts, full of rage, +\q2 either breathing out a blast of fiery breath, +\q2 or belching out smoke, +\q2 or flashing dreadful sparks from their eyes; +\q1 +\v 19 which had power not only to consume them by their violence, +\q2 but to destroy them even by the terror of their sight. +\q1 +\v 20 Yes and without these they might have fallen by a single breath, +\q2 being pursued by Justice, and scattered abroad by the breath of your power; +\q2 but you arranged all things by measure, number, and weight. +\b +\q1 +\v 21 For to be greatly strong is yours at all times. +\q2 Who could withstand the might of your arm? +\q1 +\v 22 Because the whole world before you is as a grain in a balance, +\q2 and as a drop of dew that comes down upon the earth in the morning. +\q1 +\v 23 But you have mercy on all men, because you have power to do all things, +\q2 and you overlook the sins of men to the end that they may repent. +\q1 +\v 24 For you love all things that are, +\q2 and abhor none of the things which you made; +\q2 For you never would have formed anything if you hated it. +\q1 +\v 25 How would anything have endured unless you had willed it? +\q2 Or that which was not called by you, how would it have been preserved? +\q1 +\v 26 But you spare all things, because they are yours, +\q2 O Sovereign Lord, you who love the living. +\c 12 +\q1 +\v 1 For your incorruptible spirit is in all things. +\q1 +\v 2 Therefore you convict little by little those who fall from the right way, +\q2 and, putting them in remembrance by the things wherein they sin, you admonish them, +\q2 that escaping from their wickedness they may believe in you, O Lord. +\b +\q1 +\v 3 For truly the old inhabitants of your holy land, +\q2 +\v 4 hating them because they practiced detestable works of enchantments and unholy rites— +\q2 +\v 5 merciless slaughters of children +\q2 and sacrificial banquets of men’s flesh and of blood— +\q2 +\v 6 allies in an impious fellowship, +\q2 and murderers of their own helpless babes, +\q2 it was your counsel to destroy by the hands of our fathers; +\q2 +\v 7 that the land which in your sight is most precious of all +\q2 might receive a worthy colony of God’s servants.\f + \fr 12:7 \ft Or, \fqa children \f* +\q1 +\v 8 Nevertheless you even spared these as men, +\q2 and you sent hornets\f + \fr 12:8 \ft Or, \fqa wasps \f* as forerunners of your army, +\q2 to cause them to perish little by little. +\q1 +\v 9 Not that you were unable to subdue the ungodly under the hand of the righteous in battle, +\q2 or by terrible beasts or by a stern word to make away with them at once, +\q1 +\v 10 but judging them little by little you gave them a chance to repent, +\q2 not being ignorant that their nature by birth was evil, +\q2 their wickedness inborn, +\q2 and that their manner of thought would never be changed. +\q1 +\v 11 For they were a cursed seed from the beginning. +\q2 It wasn’t through fear of any that you left them unpunished for their sins. +\b +\q1 +\v 12 For who will say, “What have you done?” +\q2 Or “Who will withstand your judgment?” +\q1 Who will accuse you for the perishing of nations which you caused? +\q2 Or who will come and stand before you as an avenger for unrighteous men? +\q1 +\v 13 For there isn’t any God beside you that cares for all, +\q2 that you might show that you didn’t judge unrighteously. +\q1 +\v 14 No king or prince will be able to confront you +\q2 about those whom you have punished. +\q1 +\v 15 But being righteous, you rule all things righteously, +\q2 deeming it a thing alien from your power +\q2 to condemn one who doesn’t deserve to be punished. +\q1 +\v 16 For your strength is the source of righteousness, +\q2 and your sovereignty over all makes you to forbear all. +\q1 +\v 17 For when men don’t believe that you are perfect in power, you show your strength, +\q2 and in dealing with those who think this, you confuse their boldness. +\q1 +\v 18 But you, being sovereign in strength, judge in gentleness, +\q2 and with great forbearance you govern us; +\q2 for the power is yours whenever you desire it. +\b +\q1 +\v 19 But you taught your people by such works as these, +\q2 how the righteous must be kind. +\q1 You made your sons to have good hope, +\q2 because you give repentance when men have sinned. +\q1 +\v 20 For if on those who were enemies of your servants\f + \fr 12:20 \ft Or, \fqa children \f* and deserving of death, +\q2 you took vengeance with so great deliberation and indulgence, +\q2 giving them times and opportunities when they might escape from their wickedness, +\q1 +\v 21 with how great care you judged your sons, +\q2 to whose fathers you gave oaths and covenants of good promises! +\q1 +\v 22 Therefore while you chasten us, you scourge our enemies ten thousand times more, +\q2 to the intent that we may ponder your goodness when we judge, +\q2 and when we are judged may look for mercy. +\b +\q1 +\v 23 Therefore also the unrighteous that lived in a life of folly, +\q2 you tormented through their own abominations. +\q1 +\v 24 For truly they went astray very far in the ways of error, +\q2 Taking as gods those animals\f + \fr 12:24 \ft Gr. \fqa living creatures: \ft and so elsewhere in this book. \f* which even among their enemies were held in dishonor, +\q2 deceived like foolish babes. +\q1 +\v 25 Therefore, as to unreasoning children, you sent your judgment to mock them. +\q1 +\v 26 But those who would not be admonished by mild correction +\q2 will experience the deserved judgment of God. +\q1 +\v 27 For through the sufferings they were indignant of, +\q2 being punished in these creatures which they supposed to be gods, +\q2 they saw and recognized as the true God him whom they previously refused to know. +\q2 Therefore also the result of extreme condemnation came upon them. +\b +\c 13 +\q1 +\v 1 For truly all men who had no perception of God were foolish by nature, +\q2 and didn’t gain power to know him who exists from the good things that are seen. +\q2 They didn’t recognize the architect from his works. +\q1 +\v 2 But they thought that either fire, or wind, or swift air, +\q2 or circling stars, or raging water, or luminaries of heaven +\q2 were gods that rule the world. +\q1 +\v 3 If it was through delight in their beauty that they took them to be gods, +\q2 let them know how much better their Sovereign Lord is than these, +\q2 for the first author of beauty created them. +\q1 +\v 4 But if it was through astonishment at their power and influence, +\q2 then let them understand from them how much more powerful he who formed them is. +\q1 +\v 5 For from the greatness of the beauty of created things, +\q2 mankind forms the corresponding perception of their Maker.\f + \fr 13:5 \ft Gr. \fqa is the first maker of them seen.\f* +\q1 +\v 6 But yet for these men there is but small blame, +\q2 for they too perhaps go astray +\q2 while they are seeking God and desiring to find him. +\q1 +\v 7 For they diligently search while living among his works, +\q2 and they trust their sight that the things that they look at are beautiful. +\q1 +\v 8 But again even they are not to be excused. +\q1 +\v 9 For if they had power to know so much, +\q2 that they should be able to explore the world, +\q2 how is it that they didn’t find the Sovereign Lord sooner? +\b +\q1 +\v 10 But they were miserable, and their hopes were in dead things, +\q2 who called them gods which are works of men’s hands, +\q2 gold and silver, skillfully made, and likenesses of animals, +\q2 or a useless stone, the work of an ancient hand. +\q1 +\v 11 Yes and some\f + \fr 13:11 \ft Gr. \fqa carpenter who is a woodcutter. \f* woodcutter might saw down a tree that is easily moved, +\q2 skillfully strip away all its bark, +\q2 and fashion it in attractive form, make a useful vessel to serve his life’s needs. +\q1 +\v 12 Burning the scraps from his handiwork to cook his food, +\q2 he eats his fill. +\q1 +\v 13 Taking a discarded scrap which served no purpose, +\q2 a crooked piece of wood and full of knots, +\q2 he carves it with the diligence of his idleness, +\q2 and shapes it by the skill of his idleness. +\q1 He shapes it in the image of a man, +\q2 +\v 14 or makes it like some worthless animal, +\q2 smearing it with something red, painting it red, +\q2 and smearing over every stain in it. +\q1 +\v 15 Having made a worthy chamber for it, +\q2 he sets it in a wall, securing it with iron. +\q1 +\v 16 He plans for it that it may not fall down, +\q2 knowing that it is unable to help itself +\q2 (for truly it is an image, and needs help). +\q1 +\v 17 When he makes his prayer concerning goods and his marriage and children, +\q2 he is not ashamed to speak to that which has no life. +\q1 +\v 18 Yes, for health, he calls upon that which is weak. +\q2 For life, he implores that which is dead. +\q2 For aid, he supplicates that which has no experience. +\q2 For a good journey, he asks that which can’t so much as move a step. +\q1 +\v 19 And for profit in business and good success of his hands, +\q2 he asks ability from that which has hands with no ability. +\c 14 +\q1 +\v 1 Again, one preparing to sail, and about to journey over raging waves, +\q2 calls upon a piece of wood more fragile than the vessel that carries him. +\q1 +\v 2 For the hunger for profit planned it, +\q2 and wisdom was the craftsman who built it. +\q1 +\v 3 Your providence, O Father, guides it along, +\q2 because even in the sea you gave a way, +\q2 and in the waves a sure path, +\q1 +\v 4 showing that you can save out of every danger, +\q2 that even a man without skill may put to sea. +\q1 +\v 5 It is your will that the works of your wisdom should not be ineffective. +\q2 Therefore men also entrust their lives to a little piece of wood, +\q2 and passing through the surge on a raft come safely to land. +\q1 +\v 6 For\f + \fr 14:6 \ft The Greek text here may be corrupt. \f* in the old time also, when proud giants were perishing, +\q2 the hope of the world, taking refuge on a raft, +\q2 your hand guided the seed of generations of the race of men. +\q1 +\v 7 For blessed is wood through which comes righteousness; +\q2 +\v 8 but the idol made with hands is accursed, itself and he that made it; +\q2 because his was the working, and the corruptible thing was called a god. +\q1 +\v 9 For both the ungodly and his ungodliness are alike hateful to God; +\q2 +\v 10 for truly the deed will be punished together with him who committed it. +\q2 +\v 11 Therefore also there will be a visitation among the idols of the nation, +\q2 because, though formed of things which God created, they were made an abomination, +\q2 stumbling blocks to the souls of men, +\q2 and a snare to the feet of the foolish. +\b +\q1 +\v 12 For the devising of idols was the beginning of fornication, +\q2 and the invention of them the corruption of life. +\q1 +\v 13 For they didn’t exist from the beginning, and they won’t exist forever. +\q1 +\v 14 For by the boastfulness of men they entered into the world, +\q2 and therefore a speedy end was planned for them. +\b +\q1 +\v 15 For a father worn with untimely grief, +\q2 making an image of the child quickly taken away, +\q2 now honored him as a god which was then a dead human being, +\q2 and delivered to those that were under him mysteries and solemn rites. +\q1 +\v 16 Afterward the ungodly custom, in process of time grown strong, was kept as a law, +\q2 and the engraved images received worship by the commandments of princes. +\q1 +\v 17 And when men could not honor them in presence because they lived far off, +\q2 imagining the likeness from afar, +\q2 they made a visible image of the king whom they honored, +\q2 that by their zeal they might flatter the absent as if present. +\b +\q1 +\v 18 But worship was raised to a yet higher pitch, even by those who didn’t know him, +\q2 urged forward by the ambition of the architect; +\q1 +\v 19 for he, wishing perhaps to please his ruler, +\q2 used his art to force the likeness toward a greater beauty. +\q1 +\v 20 So the multitude, allured by reason of the grace of his handiwork, +\q2 now consider an object of devotion him that a little before was honored as a man. +\q1 +\v 21 And this became an ambush, +\q2 because men, in bondage either to calamity or to tyranny, +\q2 invested stones and stocks with the Name that shouldn’t be shared. +\b +\q1 +\v 22 Afterward it was not enough for them to go astray concerning the knowledge of God, +\q2 but also, while they live in a great war of ignorance, they call a multitude of evils peace. +\q1 +\v 23 For either slaughtering children in solemn rites, or celebrating secret mysteries, +\q2 or holding frenzied revels of strange customs, +\q1 +\v 24 no longer do they guard either life or purity of marriage, +\q2 but one brings upon another either death by treachery, or anguish by adultery. +\q1 +\v 25 And all things confusedly are filled with blood and murder, theft and deceit, +\q2 corruption, faithlessness, tumult, perjury, +\q1 +\v 26 confusion about what is good, forgetfulness of favors, +\q2 ingratitude for benefits, +\q2 defiling of souls, confusion of sex, +\q2 disorder in marriage, adultery and wantonness. +\q2 +\v 27 For the worship of idols that may not be named \x + \xo 14:27 \xt Exodus 23:13; Psalm 16:4; Hosea 2:17; Wisdom 14:21\x* +\q2 is a beginning and cause and end of every evil. +\q1 +\v 28 For their worshipers either make merry to madness, or prophesy lies, +\q2 or live unrighteously, or lightly commit perjury. +\q1 +\v 29 For putting their trust in lifeless idols, +\q2 when they have sworn a wicked oath, they expect not to suffer harm. +\q1 +\v 30 But on both counts, the just doom will pursue them, +\q2 because they had evil thoughts of God by giving heed to idols, +\q2 and swore unrighteously in deceit through contempt for holiness. +\q1 +\v 31 For it is not the power of things by which men swear, +\q2 but it is the just penalty for those who sin +\q2 that always visits the transgression of the unrighteous. +\b +\c 15 +\q1 +\v 1 But you, our God, are gracious and true, +\q2 patient, and in mercy ordering all things. +\q1 +\v 2 For even if we sin, we are yours, knowing your dominion; +\q2 but we will not sin, knowing that we have been accounted yours. +\q1 +\v 3 For to be acquainted with you is\f + \fr 15:3 \ft Gr. \fqa entire. \f* perfect righteousness, +\q2 and to know your dominion is the root of immortality. +\q1 +\v 4 For we weren’t led astray by any evil plan of men’s, +\q2 nor yet by painters’ fruitless labor, +\q2 a form stained with varied colors, +\q1 +\v 5 the sight of which leads fools into\f + \fr 15:5 \ft Some authorities read \fqa reproach. \f* lust. +\q2 Their desire is for the breathless form of a dead image. +\q1 +\v 6 Lovers of evil things, and worthy of such hopes, +\q2 are those who make, desire, and worship them. +\b +\q1 +\v 7 For a potter, kneading soft earth, +\q2 laboriously molds each article for our service. +\q1 He fashions out of the same clay +\q2 both the vessels that minister to clean uses, and those of a contrary sort, +\q2 all in like manner. +\q1 What shall be the use of each article of either sort, +\q2 the potter is the judge. +\q1 +\v 8 Also, laboring to an evil end, he molds a vain god out of the same clay, +\q2 he who, having but a little before been made of earth, +\q2 after a short space goes his way to the earth out of which he was taken, +\q2 when he is required to render back the\f + \fr 15:8 \ft Or, \fqa life \f* soul which was lent him. +\q1 +\v 9 However he has anxious care, +\q2 not because his powers must fail, +\q2 nor because his span of life is short; +\q1 But he compares himself with goldsmiths and silversmiths, +\q2 and he imitates molders in\f + \fr 15:9 \ft Or, \fqa copper \f* brass, +\q2 and considers it great that he molds counterfeit gods. +\q1 +\v 10 His heart is ashes. +\q2 His hope is of less value than earth. +\q2 His life is of less honor than clay, +\q1 +\v 11 because he was ignorant of him who molded him, +\q2 and of him that inspired into him\f + \fr 15:11 \ft Gr. \fqa a soul that moves to activity. \f* an active\f + \fr 15:11 \ft Or, \fqa life \f* soul, +\q2 and breathed into him a vital spirit. +\q1 +\v 12 But\f + \fr 15:12 \ft Some authorities read \fqa they accounted. \f* he accounted our life to be a game, +\q2 and our\f + \fr 15:12 \ft Or, \fqa way of life \f* lifetime a festival for profit; +\q1 for, he says, one must get gain however one can, even if it is by evil. +\q1 +\v 13 For this man, beyond all others, knows that he sins, +\q2 out of earthy matter making brittle vessels and engraved images. +\q1 +\v 14 But most foolish and more miserable than a baby, +\q2 are the enemies of your people, who oppressed them; +\q1 +\v 15 because they even considered all the idols of the nations to be gods, +\q2 which have neither the use of eyes for seeing, +\q2 nor nostrils for drawing breath, +\q2 nor ears to hear, +\q2 nor fingers for handling, +\q2 and their feet are helpless for walking. +\q1 +\v 16 For a man made them, +\q2 and one whose own spirit is borrowed molded them; +\q2 for no one has power as a man to mold a god like himself. +\q1 +\v 17 But, being mortal, he makes a dead thing by the work of lawless hands; +\q2 for he is better than the objects of his worship, +\q2 since he indeed had life, but they never did. +\b +\q1 +\v 18 Yes, and they worship the creatures that are most hateful, +\q2 for, being compared as to lack of sense, these are worse than all others; +\q1 +\v 19 Neither, as seen beside other creatures, are they beautiful, so that one should desire them, +\q2 but they have escaped both the praise of God and his blessing. +\c 16 +\q1 +\v 1 For this cause, they were deservedly punished through creatures like those which they worship, +\q2 and tormented through a multitude of vermin. +\q1 +\v 2 Instead of this punishment, you, giving benefits to your people, +\q2 prepared quails for food, +\q1 a delicacy to satisfy the desire of their appetite, +\q1 +\v 3 to the end that your enemies, desiring food, +\q2 might for the hideousness of the creatures sent among them, +\q2 loathe even the necessary appetite; +\q1 but these, your people, having for a short time suffered lack, +\q2 might even partake of delicacies. +\q1 +\v 4 For it was necessary that inescapable lack should come upon those oppressors, +\q2 but that to these it should only be showed how their enemies were tormented. +\q1 +\v 5 For even when terrible raging of wild beasts came upon your people, +\q2 and they were perishing by the bites of crooked serpents, +\q2 your wrath didn’t continue to the uttermost; +\q1 +\v 6 but for admonition were they troubled for a short time, +\q2 having a token of salvation +\q2 to put them in remembrance of the commandment of your law; +\b +\q1 +\v 7 for he who turned toward it was not saved because of that which was seen, +\q2 but because of you, the Savior of all. +\q1 +\v 8 Yes, and in this you persuaded our enemies +\q2 that you are he who delivers out of every evil. +\q1 +\v 9 For the bites of locusts and flies truly killed them. +\q2 No healing for their life was found, +\q2 because they were worthy to be punished by such things. +\q1 +\v 10 But your children weren’t overcome by the very fangs of venomous dragons, +\q2 for your mercy passed by where they were and healed them. +\q1 +\v 11 For they were bitten to put them in remembrance of your oracles, +\q2 and were quickly saved, lest, falling into deep forgetfulness, +\q2 they should become unable to respond to your kindness. +\q1 +\v 12 For truly it was neither herb nor poultice that cured them, +\q2 but your word, O Lord, which heals all people. +\q1 +\v 13 For you have authority over life and death, +\q2 and you lead down to the gates of Hades, and lead up again. +\q1 +\v 14 But though a man kills by his wickedness, +\q2 he can’t retrieve the spirit that has departed +\q2 or release the imprisoned soul. +\b +\q1 +\v 15 But it is not possible to escape your hand; +\q1 +\v 16 for ungodly men, refusing to know you, were scourged in the strength of your arm, +\q2 pursued with strange rains and hails and relentless storms, +\q2 and utterly consumed with fire. +\q1 +\v 17 For, what was most marvelous, +\q2 in the water which quenches all things, the fire burned hotter; +\q2 for the world fights for the righteous. +\q1 +\v 18 For at one time the flame was restrained, +\q2 that it might not burn up the creatures sent against the ungodly, +\q2 but that these themselves as they looked might see that they were chased by the judgment of God. +\q1 +\v 19 At another time even in the midst of water it burns more intensely than fire, +\q2 that it may destroy the produce of an unrighteous land. +\q1 +\v 20 Instead of these things, you gave your people angels’ food to eat, +\q2 and you provided ready-to-eat bread for them from heaven without toil, +\q2 having the virtue of every pleasant flavor, +\q2 and agreeable to every taste. +\q1 +\v 21 For your nature showed your sweetness toward your children, +\q2 while that bread, serving the desire of the eater, +\q2 changed itself according to every man’s choice. +\q1 +\v 22 But snow and ice endured fire, and didn’t melt, +\q2 that people might know that fire was destroying the fruits of the enemies, +\q2 burning in the hail and flashing in the rains; +\q1 +\v 23 and that this fire, again, in order that righteous people may be nourished, +\q2 has even forgotten its own power. +\q1 +\v 24 For the creation, ministering to you, its maker, +\q2 strains its force against the unrighteous for punishment +\q2 and in kindness, slackens it on behalf of those who trust in you. +\q1 +\v 25 Therefore at that time also, converting itself into all forms, +\q2 it ministered to your all-nourishing bounty, +\q2 according to the desire of those who had need, +\q1 +\v 26 that your children, whom you loved, O Lord, might learn +\q2 that it is not the growth of crops that nourishes a man, +\q2 but that your word preserves those who trust you. +\q1 +\v 27 For that which was not destroyed by fire, +\q2 melted away when it was simply warmed by a faint sunbeam, +\q1 +\v 28 that it might be known that we must rise before the sun to give you thanks, +\q2 and must pray to you at the dawning of the light; +\q1 +\v 29 for the hope of the unthankful will melt as the winter’s hoar frost, +\q2 and will flow away as water that has no use. +\b +\c 17 +\q1 +\v 1 For your judgments are great, and hard to interpret; +\q2 therefore undisciplined souls went astray. +\q1 +\v 2 For when lawless men had supposed that they held a holy nation in their power, +\q2 they, prisoners of darkness, and bound in the fetters of a long night, +\q2 kept close beneath their roofs, +\q2 lay exiled from the eternal providence. +\q1 +\v 3 For while they thought that they were unseen in their secret sins, +\q2 they were divided from one another by a dark curtain of forgetfulness, +\q2 stricken with terrible awe, and very troubled by apparitions. +\q1 +\v 4 For neither did the dark recesses that held them guard them from fears, +\q2 but terrifying sounds rang around them, +\q2 and dismal phantoms appeared with unsmiling faces. +\q1 +\v 5 And no power of fire prevailed to give light, +\q2 neither were the brightest flames of the stars strong enough to illuminate that gloomy night; +\q1 +\v 6 but only the glimmering of a self-kindled fire appeared to them, full of fear. +\q2 In terror, they considered the things which they saw +\q2 to be worse than that sight, on which they could not gaze. +\q1 +\v 7 The mockeries of their magic arts were powerless, now, +\q2 and a shameful rebuke of their boasted understanding: +\q1 +\v 8 For those who promised to drive away terrors and disorders from a sick soul, +\q2 these were sick with a ludicrous fearfulness. +\q1 +\v 9 For even if no troubling thing frighted them, +\q2 yet, scared with the creeping of vermin and hissing of serpents, +\q1 +\v 10 they perished trembling in fear, +\q2 refusing even to look at the air, which could not be escaped on any side. +\q1 +\v 11 For wickedness, condemned by a witness within, is a coward thing, +\q2 and, being pressed hard by conscience, always has added forecasts of the worst. +\q2 +\v 12 For fear is nothing else but a surrender of the help which reason offers; +\q2 +\v 13 and from within, the expectation of being less +\q2 prefers ignorance of the cause that brings the torment. +\q1 +\v 14 But they, all through the night which was powerless indeed, +\q2 and which came upon them out of the recesses of powerless Hades, +\q2 sleeping the same sleep, +\q2 +\v 15 now were haunted by monstrous apparitions, +\q2 and now were paralyzed by their soul’s surrendering; +\q2 for sudden and unexpected fear came upon them. +\q1 +\v 16 So then whoever it might be, sinking down in his place, +\q2 was kept captive, shut up in that prison which was not barred with iron; +\q1 +\v 17 for whether he was a farmer, or a shepherd, +\q2 or a laborer whose toils were in the wilderness, +\q2 he was overtaken, and endured that inescapable sentence; +\q2 for they were all bound with one chain of darkness. +\q1 +\v 18 Whether there was a whistling wind, +\q2 or a melodious sound of birds among the spreading branches, +\q2 or a measured fall of water running violently, +\q2 +\v 19 or a harsh crashing of rocks hurled down, +\q2 or the swift course of animals bounding along unseen, +\q2 or the voice of wild beasts harshly roaring, +\q2 or an echo rebounding from the hollows of the mountains, +\q2 all these things paralyzed them with terror. +\q1 +\v 20 For the whole world was illuminated with clear light, +\q2 and was occupied with unhindered works, +\q2 +\v 21 while over them alone was spread a heavy night, +\q2 an image of the darkness that should afterward receive them; +\q2 but to themselves, they were heavier than darkness. +\c 18 +\q1 +\v 1 But for your holy ones there was great light. +\q2 Their enemies, hearing their voice but not seeing their form, +\q2 counted it a happy thing that they too had suffered, +\q1 +\v 2 yet for that they do not hurt them, though wronged by them before, they are thankful; +\q2 and because they had been at variance with them, they begged for pardon. +\q1 +\v 3 Therefore you provided a burning pillar of fire, +\q2 to be a guide for your people’s unknown journey, +\q2 and a harmless sun for their glorious exile. +\q1 +\v 4 For the Egyptians well deserved to be deprived of light and imprisoned by darkness, +\q2 they who had imprisoned your children, +\q2 through whom the incorruptible light of the law was to be given to the race of men. +\b +\q1 +\v 5 After they had taken counsel to kill the babes of the holy ones, +\q2 and when a single child had been abandoned and saved to convict them of their sin, +\q2 you took away from them their multitude of children, +\q2 and destroyed all their army together in a mighty flood. +\q1 +\v 6 Our fathers were made aware of that night beforehand, +\q2 that, having sure knowledge, they might be cheered by the oaths which they had trusted. +\q1 +\v 7 Salvation of the righteous and destruction of the enemies was expected by your people. +\q1 +\v 8 For as you took vengeance on the adversaries, +\q2 by the same means, calling us to yourself, you glorified us. +\q1 +\v 9 For holy children of good men offered sacrifice in secret, +\q2 and with one consent they agreed to the covenant of the divine law, +\q2 that they would partake alike in the same good things and the same perils, +\q2 the fathers already leading the sacred songs of praise. +\q1 +\v 10 But the discordant cry of the enemies echoed back, +\q2 and a pitiful voice of lamentation for children was spread abroad. +\q1 +\v 11 Both servant and master were punished with the same just doom, +\q2 and the commoner suffering the same as king; +\q1 +\v 12 Yes, they all together, under one form of death, +\q2 had corpses without number. +\q1 For the living were not sufficient even to bury them, +\q2 Since at a single stroke, their most cherished offspring was consumed. +\q1 +\v 13 For while they were disbelieving all things by reason of the enchantments, +\q2 upon the destruction of the firstborn they confessed the people to be God’s children. +\q1 +\v 14 For while peaceful silence wrapped all things, +\q2 and night in her own swiftness was half spent, +\q1 +\v 15 your all-powerful word leaped from heaven, from the royal throne, +\q2 a stern warrior, into the midst of the doomed land, +\q1 +\v 16 bearing as a sharp sword your authentic commandment, +\q2 and standing, it filled all things with death, +\q2 and while it touched the heaven it stood upon the earth. +\q1 +\v 17 Then immediately apparitions in dreams terribly troubled them, +\q2 and unexpected fears came upon them. +\q1 +\v 18 And each, one thrown here half dead, another there, +\q2 made known why he was dying; +\q1 +\v 19 for the dreams, disturbing them, forewarned them of this, +\q2 that they might not perish without knowing why they were afflicted. +\b +\q1 +\v 20 The experience of death also touched the righteous, +\q2 and a multitude were destroyed in the wilderness, +\q2 but the wrath didn’t last long. +\q1 +\v 21 For a blameless man hurried to be their champion, +\q2 bringing the weapon of his own ministry, +\q2 prayer, and the atoning sacrifice of incense. +\q1 He withstood the indignation and set an end to the calamity, +\q2 showing that he was your servant. +\q1 +\v 22 And he overcame the anger, +\q2 not by strength of body, not by force of weapons, +\q2 but by his word, he subdued the avenger +\q2 by bringing to remembrance oaths and covenants made with the fathers. +\q1 +\v 23 For when the dead had already fallen in heaps one upon another, +\q2 he intervened and stopped the wrath, +\q2 and cut off its way to the living. +\q1 +\v 24 For the whole world was pictured on his long robe, +\q2 and the glories of the fathers were upon the engraving of the four rows of precious stones, +\q2 and your majesty was upon the diadem on his head. +\q1 +\v 25 The destroyer yielded to these, and they feared; +\q2 for it was enough only to test the wrath. +\b +\c 19 +\q1 +\v 1 But indignation without mercy came upon the ungodly to the end; +\q2 for God also foreknew their future, +\q1 +\v 2 how, having changed their minds to let your people go, +\q2 and having sped them eagerly on their way, +\q2 they would change their minds and pursue them. +\q1 +\v 3 For while they were yet in the midst of their mourning, +\q2 and lamenting at the graves of the dead, +\q2 they made another foolish decision, +\q2 and pursued as fugitives those whom they had begged to leave and driven out. +\q1 +\v 4 For the doom which they deserved was drawing them to this end, +\q2 and it made them forget the things that had happened to them, +\q2 that they might fill up the punishment which was yet lacking from their torments, +\q2 +\v 5 and that your people might journey on by a marvelous road, +\q2 but they themselves might find a strange death. +\b +\q1 +\v 6 For the whole creation, each part in its diverse kind, was made new again, +\q2 complying with your commandments, +\q2 that your servants might be kept unharmed. +\q1 +\v 7 Then the cloud that overshadowed the camp was seen, +\q2 and dry land rising up out of what had been water, +\q2 out of the Red sea an unhindered highway, +\q2 and a grassy plain out of the violent surge, +\q2 +\v 8 by which they passed over with all their army, +\q2 these who were covered with your hand, +\q2 having seen strange marvels. +\q1 +\v 9 For like horses they roamed at large, +\q2 and they skipped about like lambs, +\q2 praising you, O Lord, who was their deliverer. +\q1 +\v 10 For they still remembered the things that happened in the time of their sojourning, +\q2 how instead of bearing cattle, the land brought forth lice, +\q2 and instead of fish, the river spewed out a multitude of frogs. +\q1 +\v 11 But afterwards, they also saw a new kind of birds, +\q2 when, led on by desire, they asked for luxurious dainties; +\q1 +\v 12 for, to comfort them, quails came up for them from the sea. +\b +\q1 +\v 13 Punishments came upon the sinners, +\q2 not without the signs that were given beforehand by the violence of the thunder, +\q2 for they justly suffered through their own wickednesses, +\q2 for the hatred which they practiced toward guests was grievous indeed. +\q1 +\v 14 For while the others didn’t receive the strangers when they came to them, +\q2 the Egyptians made slaves of guests who were their benefactors. +\q1 +\v 15 And not only so, but while punishment of some sort will come upon the former, +\q2 since they received as enemies those who were aliens; +\q2 +\v 16 because these first welcomed with feastings, +\q2 and then afflicted with dreadful toils, +\q2 those who had already shared with them in the same rights. +\q1 +\v 17 And moreover they were stricken with loss of sight +\q2 (even as were those others at the righteous man’s doors), +\q2 when, being surrounded with yawning darkness, +\q2 they each looked for the passage through his own door. +\b +\q1 +\v 18 For as the notes of a lute vary the character of the rhythm, +\q2 even so the elements, changing their order one with another, +\q2 continuing always in its sound, +\q2 as may clearly be conjectured from the sight of the things that have happened. +\q1 +\v 19 For creatures of the dry land were turned into creatures of the waters, +\q2 and creatures that swim moved upon the land. +\q1 +\v 20 Fire kept the mastery of its own power in water, +\q2 and water forgot its quenching nature. +\q1 +\v 21 On the contrary, flames didn’t consume flesh of perishable creatures that walked among them, +\q2 neither did they melt the crystalline grains of ambrosial food that were melted easily. +\b +\q1 +\v 22 For in all things, O Lord, you magnified your people, +\q2 and you glorified them and didn’t lightly regard them, +\q2 standing by their side in every time and place. diff --git a/c-sharp/assets/WEB/72SIRengWEBUS.SFM b/c-sharp/assets/WEB/72SIRengWEBUS.SFM new file mode 100644 index 0000000000..6c97aad9a3 --- /dev/null +++ b/c-sharp/assets/WEB/72SIRengWEBUS.SFM @@ -0,0 +1,4899 @@ +\id SIR Ecclesiasticus +\h Sirach +\toc1 The Wisdom of Jesus the Son of Sirach, or Ecclesiasticus +\toc2 Sirach +\toc3 Sirach +\mt1 The Wisdom of Jesus the Son of Sirach, +\mt2 or +\mt1 Ecclesiaticus +\ip \bk The Wisdom of Jesus the Son of Sirach\bk*, also called \bk Ecclesiasticus\bk*, is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\is1 The Prologue of the Wisdom of Jesus the Son of Sirach. +\ip WHEREAS many and great things have been delivered to us by the law and the prophets, and by the others that have followed in their steps, for which we must give Israel the praise for instruction and wisdom; and since not only the readers need to become skillful themselves, but also those who love learning must be able to profit those who are outside, both by speaking and writing; my grandfather Jesus, having much given himself to the reading of the law, and the prophets, and the other books of our fathers, and having gained great familiarity with them, was also drawn on himself to write somewhat pertaining to instruction and wisdom, in order that those who love learning, and are devoted to these things, might make progress much more by living according to the law. You are entreated therefore to read with favor and attention, and to pardon us, if in any parts of what we have labored to interpret, we may seem to fail in some of the phrases. For things originally spoken in Hebrew don’t have the same force in them when they are translated into another language. Not only these, but the law itself, and the prophecies, and the rest of the books, have no small difference, when they are spoken in their original language. For having come into Egypt in the thirty-eighth year of Energetes the king, and having continued there some time, I found a copy giving no small instruction. I thought it therefore most necessary for me to apply some diligence and travail to translate this book, applying indeed much watchfulness and skill in that space of time to bring the book to an end and publish for them also, who in the land of their travels are desiring to learn, preparing their character in advance, so as to live according to the law. +\c 1 + +\b +\q1 +\v 1 All wisdom comes from the Lord, +\q2 and is with him forever. +\q1 +\v 2 Who can count the sand of the seas, +\q2 the drops of rain, +\q2 and the days of eternity? +\q1 +\v 3 Who will search out the height of the sky, +\q2 the breadth of the earth, the deep, +\q2 and wisdom? +\q1 +\v 4 Wisdom has been created before all things, +\q2 and the understanding of prudence from everlasting. +\v 5 \f + \fr 1:5 \ft Verse 5 is omitted by the best authorities: \fqa The source of wisdom is God’s word in the highest heaven, and her ways are the eternal commandments.\f* +\q1 +\v 6 To whom has the root of wisdom been revealed? +\q2 Who has known her shrewd counsels? +\v 7 \f + \fr 1:7 \ft Verse 7 is omitted by the best authorities: \fqa To whom was the knowledge of wisdom manifested? Who has understood her abundant experience?\f* +\q1 +\v 8 There is one wise, greatly to be feared, +\q2 sitting upon his throne: the Lord. +\q1 +\v 9 He created her. +\q2 He saw and measured her. +\q2 He poured her out upon all his works. +\q1 +\v 10 She is with all flesh according to his gift. +\q2 He gave her freely to those who love him. +\b +\q1 +\v 11 The fear of the Lord is glory, exultation, +\q2 gladness, and a crown of rejoicing. +\q1 +\v 12 The fear of the Lord will delight the heart, +\q2 and will give gladness, joy, and length of days. +\q1 +\v 13 Whoever fears the Lord, it will go well with him at the last. +\q2 He will be blessed in the day of his death. +\b +\q1 +\v 14 To fear the Lord is the beginning of wisdom. +\q2 It was created together with the faithful in the womb. +\q1 +\v 15 She\f + \fr 1:15 \ft Gr. \fqa nested. \f* laid an eternal foundation with men. +\q2 She will be trusted among their offspring. +\q1 +\v 16 To fear the Lord is the fullness of wisdom. +\q2 She inebriates men with her fruits. +\q1 +\v 17 She will fill all her house with desirable things, +\q2 and her storehouses with her produce. +\q1 +\v 18 The fear of the Lord is the crown of wisdom, +\q2 making peace and\f + \fr 1:18 \ft Gr. \fqa health of cure. \f* perfect health to flourish.\f + \fr 1:18 \ft The remainder of this verse is omitted by the best authorities: \fqa Both are gifts of God for peace; glory opens out for those who love him. He saw her and took her measure.\f* +\q1 +\v 19 He both saw and measured her. +\q2 He rained down skill and knowledge of understanding, +\q2 and exalted the honor of those who hold her fast. +\q1 +\v 20 To fear the Lord is the root of wisdom. +\q2 Her branches are length of days. +\v 21 \f + \fr 1:21 \ft Verse 21 is omitted by the best authorities: \fqa The fear of the Lord drives away sins. Where it resides, it will turn away all anger. \f* +\b +\q1 +\v 22 Unjust wrath can never be justified, +\q2 for his wrath tips the scale to his downfall. +\q1 +\v 23 A man that is patient will resist for a season, +\q2 and afterward gladness will spring up to him. +\q1 +\v 24 He will hide his words until the right moment, +\q2 and the lips of many will tell of his understanding. +\b +\q1 +\v 25 A wise saying is in the treasures of wisdom; +\q2 but godliness is an abomination to a sinner. +\q1 +\v 26 If you desire wisdom, keep the commandments +\q2 and the Lord will give her to you freely; +\q1 +\v 27 for the fear of the Lord is wisdom and instruction. +\q2 Faith and humility are his good pleasure. +\q1 +\v 28 Don’t disobey the fear of the Lord. +\q2 Don’t come to him with a double heart. +\q1 +\v 29 Don’t be a hypocrite in men’s sight. +\q2 Keep watch over your lips. +\q1 +\v 30 Don’t exalt yourself, +\q2 lest you fall and bring dishonor upon your soul. +\q1 The Lord will reveal your secrets +\q2 and will cast you down in the midst of the congregation, +\q2 because you didn’t come to the fear of the Lord +\q2 and your heart was full of deceit. +\b +\c 2 +\q1 +\v 1 My son, if you come to serve the Lord, +\q2 prepare your soul for temptation. +\q1 +\v 2 Set your heart aright, constantly endure, +\q2 and don’t make haste in time of calamity. +\q1 +\v 3 Cling to him, and don’t depart, +\q2 that you may be increased at your latter end. +\q1 +\v 4 Accept whatever is brought upon you, +\q2 and be patient when you suffer humiliation. +\q1 +\v 5 For gold is tried in the fire, +\q2 and acceptable men in the furnace of humiliation. +\q1 +\v 6 Put your trust in him, and he will help you. +\q2 Make your ways straight, and set your hope on him. +\b +\q1 +\v 7 All you who fear the Lord, wait for his mercy. +\q2 Don’t turn aside, lest you fall. +\q1 +\v 8 All you who fear the Lord, put your trust in him, +\q2 and your reward will not fail. +\q1 +\v 9 All you who fear the Lord, hope for good things, +\q2 and for eternal gladness and mercy. +\q1 +\v 10 Look at the generations of old, and see: +\q2 Who ever put his trust in the Lord, and was ashamed? +\q2 Or who remained in his fear, and was forsaken? +\q2 Or who called upon him, and he neglected him? +\q1 +\v 11 For the Lord is full of compassion and mercy. +\q2 He forgives sins and saves in time of affliction. +\b +\q1 +\v 12 Woe to fearful hearts, to faint hands, +\q2 and to the sinner who goes two ways! +\q1 +\v 13 Woe to the faint heart! For it doesn’t believe. +\q2 Therefore it won’t be defended. +\q1 +\v 14 Woe to you who have lost your patience! +\q2 And what will you all do when the Lord visits you? +\b +\q1 +\v 15 Those who fear the Lord will not disobey his words. +\q2 Those who love him will keep his ways. +\q1 +\v 16 Those who fear the Lord will seek his good pleasure. +\q2 Those who love him will be filled with the law. +\q1 +\v 17 Those who fear the Lord will prepare their hearts, +\q2 and will humble their souls in his sight. +\q1 +\v 18 We will fall into the hands of the Lord, +\q2 and not into the hands of men; +\q1 for as his majesty is, +\q2 so also is his mercy. +\b +\c 3 +\q1 +\v 1 Hear me, your father, O my children, +\q2 and do what you hear, that you all may be safe. +\q1 +\v 2 For the Lord honors the father over the children, +\q2 and has confirmed the judgment of the mother over her sons. +\q1 +\v 3 He who honors his father will make atonement for sins. +\q2 +\v 4 He who gives glory to his mother is as one who lays up treasure. +\q1 +\v 5 Whoever honors his father will have joy in his own children. +\q2 He will be heard in the day of his prayer. +\q1 +\v 6 He who gives glory to his father will have length of days. +\q2 He who listens to the Lord will bring rest to his mother, +\q1 +\v 7 \f + \fr 3:7 \ft Some manuscripts add \fqa those who fear the Lord honor their father,\f* and will serve under his parents, as to masters. +\q1 +\v 8 Honor your father in deed and word, +\q2 that a blessing may come upon you from him. +\q1 +\v 9 For the blessing of the father establishes the houses of children, +\q2 but the curse of the mother roots out the foundations. +\b +\q1 +\v 10 Don’t glorify yourself in the dishonor of your father, +\q2 for your father’s dishonor is no glory to you. +\q1 +\v 11 For the glory of a man is from the honor of his father, +\q2 and a mother in dishonor is a reproach to her children. +\q1 +\v 12 My son, help your father in his old age, +\q2 and don’t grieve him as long as he lives. +\q1 +\v 13 If he fails in understanding, have patience with him. +\q2 Don’t dishonor him in your full strength. +\q1 +\v 14 For the kindness to your father will not be forgotten. +\q2 Instead of sins it will be added to build you up. +\q1 +\v 15 In the day of your affliction it will be remembered for you, +\q2 as fair weather upon ice, +\q2 so your sins will also melt away. +\q1 +\v 16 He who forsakes his father is as a blasphemer. +\q2 He who provokes his mother is cursed by the Lord. +\b +\q1 +\v 17 My son, go on with your business in humility; +\q2 so you will be loved by an acceptable man. +\q1 +\v 18 The greater you are, humble yourself the more, +\q2 and you will find favor before the Lord. +\v 19 \f + \fr 3:19 \ft Some manuscripts add \fqa Many are lofty and renowned, but he reveals his secrets to the humble.\f* +\q1 +\v 20 For the power of the Lord is great, +\q2 and he is glorified by those who are lowly. +\q1 +\v 21 Don’t seek things that are too hard for you, +\q2 and don’t search out things that are above your strength. +\q1 +\v 22 Think about the things that have been commanded you, +\q2 for you have no need of the things that are secret. +\q1 +\v 23 Don’t be overly busy in tasks that are beyond you, +\q2 for more things are shown to you than men can understand. +\q1 +\v 24 For the conceit of many has led them astray. +\q2 Evil opinion has caused their judgment to slip. +\q1 +\v 25 \f + \fr 3:25 \ft Some manuscripts omit verse 25.\f*There is no light without eyes. +\q2 There is no wisdom without knowledge. +\b +\q1 +\v 26 A stubborn heart will do badly at the end. +\q2 He who loves danger will perish in it. +\q1 +\v 27 A stubborn heart will be burdened with troubles. +\q2 The sinner will heap sin upon sins. +\q1 +\v 28 The calamity of the proud has no healing, +\q2 for a weed of wickedness has taken root in him. +\q1 +\v 29 The heart of the prudent will understand a proverb. +\q2 A wise man desires the ear of a listener. +\b +\q1 +\v 30 Water will quench a flaming fire; +\q2 almsgiving will make atonement for sins. +\q1 +\v 31 He who repays good turns is mindful of that which comes afterward. +\q2 In the time of his falling he will find a support. +\b +\c 4 +\q1 +\v 1 My son, don’t deprive the poor of his living. +\q2 Don’t make the needy eyes wait long. +\q1 +\v 2 Don’t make a hungry soul sorrowful, +\q2 or provoke a man in his distress. +\q1 +\v 3 Don’t add more trouble to a heart that is provoked. +\q2 Don’t put off giving to him who is in need. +\q1 +\v 4 Don’t reject a suppliant in his affliction. +\q2 Don’t turn your face away from a poor man. +\q1 +\v 5 Don’t turn your eye away from one who asks. +\q2 Give no occasion to a man to curse you. +\q1 +\v 6 For if he curses you in the bitterness of his soul, +\q2 he who made him will hear his supplication. +\b +\q1 +\v 7 Endear yourself to the assembly. +\q2 Bow your head to a great man. +\q1 +\v 8 Incline your ear to a poor man. +\q2 Answer him with peaceful words in humility. +\q1 +\v 9 Deliver him who is wronged from the hand of him who wrongs him; +\q2 Don’t be hesitant in giving judgment. +\q1 +\v 10 Be as a father to the fatherless, +\q2 and like a husband to their mother. +\q1 So you will be as a son of the Most High, +\q2 and he will love you more than your mother does. +\b +\q1 +\v 11 Wisdom exalts her sons, +\q2 and takes hold of those who seek her. +\q1 +\v 12 He who loves her loves life. +\q2 Those who seek her early will be filled with gladness. +\q1 +\v 13 He who holds her fast will inherit glory. +\q2 Where\f + \fr 4:13 \ft Or, \fqa she \f* he enters, the Lord will bless. +\q1 +\v 14 Those who serve her minister to the Holy One. +\q2 The Lord loves those who love her. +\q1 +\v 15 He who listens to her will judge the nations. +\q2 He who heeds her will dwell securely. +\q1 +\v 16 If he trusts her, he will inherit her, +\q2 and his generations will possess her. +\q1 +\v 17 For at the first she will walk with him in crooked ways, +\q2 and will bring fear and dread upon him, +\q2 and torment him with her discipline, +\q2 until she may trust his soul, and try him by her judgments. +\q1 +\v 18 Then she will return him again to the straight way, +\q2 and will gladden him, and reveal to him her secrets. +\q1 +\v 19 If he goes astray, she will forsake him, +\q2 and hand him over to his fall. +\b +\q1 +\v 20 Watch for the opportunity, and beware of evil. +\q2 Don’t be ashamed of your soul. +\q1 +\v 21 For there is a shame that brings sin, +\q2 and there is a shame that is glory and grace. +\q1 +\v 22 Don’t show partiality, discrediting your soul. +\q2 Don’t revere any man to your falling. +\q1 +\v 23 Don’t refrain from speaking when it is for safety. +\q2 \f + \fr 4:23 \ft Some manuscripts omit this line. \f*Don’t hide your wisdom for the sake of seeming fair. +\q1 +\v 24 For wisdom will be known by speech, +\q2 and instruction by the word of the tongue. +\q1 +\v 25 Don’t speak against the truth +\q2 and be shamed for your ignorance. +\q1 +\v 26 Don’t be ashamed to confess your sins. +\q2 Don’t fight the river’s current. +\q1 +\v 27 Don’t lay yourself down for a fool to tread upon. +\q2 Don’t be partial to one who is mighty. +\q1 +\v 28 Strive for the truth to death, +\q2 and the Lord God will fight for you. +\b +\q1 +\v 29 Don’t be hasty with your tongue, +\q2 or slack and negligent in your deeds. +\q1 +\v 30 Don’t be like a lion in your house, +\q2 or suspicious of your servants. +\q1 +\v 31 Don’t let your hand be stretched out to receive, +\q2 and closed when you should repay. +\c 5 +\q1 +\v 1 Don’t set your heart upon your goods. +\q2 Don’t say, “They are sufficient for me.” +\q1 +\v 2 Don’t follow your own mind and your strength +\q2 to walk in the desires of your heart. +\q1 +\v 3 Don’t say, “Who will have dominion over me?” +\q2 for the Lord will surely take vengeance on you. +\b +\q1 +\v 4 Don’t say, “I sinned, and what happened to me?” +\q2 for the Lord is patient. +\q1 +\v 5 Don’t be so confident of atonement +\q2 that you add sin upon sins. +\q1 +\v 6 Don’t say, “His compassion is great. +\q2 He will be pacified for the multitude of my sins,” +\q2 for mercy and wrath are with him, +\q2 and his indignation will rest on sinners. +\q1 +\v 7 Don’t wait to turn to the Lord. +\q2 Don’t put off from day to day; +\q2 for suddenly the wrath of the Lord will come on you, +\q2 and you will perish in the time of vengeance. +\b +\q1 +\v 8 Don’t set your heart upon unrighteous gains, +\q2 for you will profit nothing in the day of calamity. +\q1 +\v 9 Don’t winnow with every wind. +\q2 Don’t walk in every path. +\q2 This is what the sinner who has a double tongue does. +\q1 +\v 10 Be steadfast in your understanding. +\q2 Let your speech be consistent. +\b +\q1 +\v 11 Be swift to hear +\q2 and answer with patience. +\q1 +\v 12 If you have understanding, answer your neighbor; +\q2 but if not, put your hand over your mouth. +\q1 +\v 13 Glory and dishonor is in talk. +\q2 A man’s tongue may be his downfall. +\q1 +\v 14 Don’t be called a whisperer. +\q2 Don’t lie in wait with your tongue; +\q2 for shame is on the thief, +\q2 and an evil condemnation is on him who has a double tongue. +\q1 +\v 15 Don’t be ignorant in a great or small matter. +\c 6 +\q1 +\v 1 Don’t become an enemy instead of a friend; +\q2 for an evil name will inherit shame and reproach. +\q2 So it is with the sinner who has a double tongue. +\b +\q1 +\v 2 Don’t exalt yourself in the counsel of your soul, +\q2 that your soul not be torn in pieces like a bull. +\q1 +\v 3 You will eat up your leaves, destroy your fruit, +\q2 and leave yourself like a dry tree. +\q1 +\v 4 A wicked soul will destroy him who has it, +\q2 and will make him a laughing stock to his enemies. +\b +\q1 +\v 5 Sweet words will multiply a man’s friends. +\q2 A gracious tongue will multiply courtesies. +\q1 +\v 6 Let those that are at peace with you be many, +\q2 but your advisers one of a thousand. +\q1 +\v 7 If you want to gain a friend, get him in a time of testing, +\q2 and don’t be in a hurry to trust him. +\q1 +\v 8 For there is a friend just for an occasion. +\q2 He won’t continue in the day of your affliction. +\q1 +\v 9 And there is a friend who turns into an enemy. +\q2 He will discover strife to your reproach. +\q1 +\v 10 And there is a friend who is a companion at the table, +\q2 but he won’t continue in the day of your affliction. +\q1 +\v 11 In your prosperity he will be as yourself, +\q2 and will be bold over your servants. +\q1 +\v 12 If you are brought low, he will be against you, +\q2 and will hide himself from your face. +\q1 +\v 13 Separate yourself from your enemies, +\q2 and beware of your friends. +\b +\q1 +\v 14 A faithful friend is a strong defense. +\q2 He who has found him has found a treasure. +\q1 +\v 15 There is nothing that can be taken in exchange for a faithful friend. +\q2 His excellency is beyond price. +\q1 +\v 16 A faithful friend is a life-saving medicine. +\q2 Those who fear the Lord will find him. +\q1 +\v 17 He who fears the Lord directs his friendship properly; +\q2 for as he is, so is his neighbor also. +\b +\q1 +\v 18 My son, gather instruction from your youth up. +\q2 Even when you have gray hair you will find wisdom. +\q1 +\v 19 Come to her as one who plows and sows +\q2 and wait for her good fruit; +\q1 for your toil will be little in her cultivation, +\q2 and you will soon eat of her fruit. +\q1 +\v 20 How exceedingly harsh she is to the unlearned! +\q2 He who is without understanding will not remain in her. +\q1 +\v 21 She will rest upon him as a mighty stone of trial. +\q2 He won’t hesitate to cast her from him. +\q1 +\v 22 For wisdom is according to her name. +\q1 She isn’t manifest to many. +\b +\q1 +\v 23 Give ear, my son, and accept my judgment. +\q2 Don’t refuse my counsel. +\q1 +\v 24 Bring your feet into her fetters, +\q2 and your neck into her chain. +\q1 +\v 25 Put your shoulder under her and bear her. +\q2 Don’t be grieved with her bonds. +\q1 +\v 26 Come to her with all your soul. +\q2 Keep her ways with your whole power. +\q1 +\v 27 Search and seek, and she will be made known to you. +\q2 When you get hold of her, don’t let her go. +\q1 +\v 28 For at the last you will find her rest; +\q2 and she will be turned for you into gladness. +\q1 +\v 29 Her fetters will be to you for a covering of strength, +\q2 and her chains for a robe of glory. +\q1 +\v 30 For there is a golden ornament upon her, +\q2 and her bands are \x + \xo 6:30 \xt Numbers 15:38\x* a purple cord. +\q1 +\v 31 You shall put her on as a robe of glory, +\q2 and shall put her on as a crown of rejoicing. +\b +\q1 +\v 32 My son, if you are willing, you will be instructed. +\q2 If you will yield your soul, you will be prudent. +\q1 +\v 33 If you love to hear, you will receive. +\q2 If you incline your ear, you will be wise. +\q1 +\v 34 Stand in the multitude of the elders. +\q2 Attach yourself to whomever is wise. +\q1 +\v 35 Be willing to listen to every godly discourse. +\q2 Don’t let the proverbs of understanding escape you. +\q1 +\v 36 If you see a man of understanding, get to him early. +\q2 Let your foot wear out the steps of his doors. +\q1 +\v 37 Let your mind dwell on the ordinances of the Lord +\q2 and meditate continually on his commandments. +\q1 He will establish your heart +\q2 and your desire for wisdom will be given to you. +\b +\c 7 +\q1 +\v 1 Do no evil, +\q2 so no evil will overtake you. +\q1 +\v 2 Depart from wrong, +\q2 and it will turn away from you. +\q1 +\v 3 My son, don’t sow upon the furrows of unrighteousness, +\q2 and you won’t reap them sevenfold. +\b +\q1 +\v 4 Don’t seek preeminence from the Lord, +\q2 nor the seat of honor from the king. +\q1 +\v 5 Don’t justify yourself in the presence of the Lord, +\q2 and don’t display your wisdom before the king. +\q1 +\v 6 Don’t seek to be a judge, +\q2 lest you not be able to take away iniquities, +\q2 lest perhaps you fear the person of a mighty man, +\q2 and lay a stumbling block in the way of your uprightness. +\b +\q1 +\v 7 Don’t sin against the multitude of the city. +\q2 Don’t disgrace yourself in the crowd. +\b +\q1 +\v 8 Don’t commit a sin twice, +\q2 for even in one you will not be unpunished. +\q1 +\v 9 Don’t say, “He will look upon the multitude of my gifts. +\q2 When I make an offering to the Most High God, he will accept it.” +\q1 +\v 10 Don’t be faint-hearted in your prayer. +\q2 Don’t neglect to give alms. +\b +\q1 +\v 11 Don’t laugh a man to scorn when he is in the bitterness of his soul, +\q2 for there is one who humbles and exalts. +\q1 +\v 12 Don’t devise\f + \fr 7:12 \ft Gr. \fqa Don’t plow\f* a lie against your brother, +\q2 or do the same to a friend. +\q1 +\v 13 Refuse to utter a lie, +\q2 for that habit results in no good. +\q1 +\v 14 Don’t babble in the assembly of elders. +\q2 Don’t repeat your words in your prayer. +\b +\q1 +\v 15 Don’t hate hard labor +\q2 or farm work, which the Most High has created. +\q1 +\v 16 Don’t number yourself among the multitude of sinners. +\q2 Remember that wrath will not wait. +\q1 +\v 17 Humble your soul greatly, +\q2 for the punishment of the ungodly man is fire and the worm. +\b +\q1 +\v 18 Don’t exchange a friend for something, +\q2 neither a true brother for the gold of Ophir. +\q1 +\v 19 Don’t deprive yourself of a wise and good wife, +\q2 for her grace is worth more than gold. +\q1 +\v 20 Don’t abuse a servant who works faithfully, +\q2 or a hireling who gives you his life. +\q1 +\v 21 Let your soul love a wise servant. +\q2 Don’t defraud him of liberty. +\b +\q1 +\v 22 Do you have cattle? Look after them. +\q2 If they are profitable to you, let them stay by you. +\q1 +\v 23 Do you have children? Correct them, +\q2 and make them obedient from their youth. +\q1 +\v 24 Do you have daughters? Take care of their bodies, +\q2 and don’t be overly indulgent toward them. +\q1 +\v 25 Give your daughter in marriage, and you will have accomplished a great matter. +\q2 Give her to a man of understanding. +\b +\q1 +\v 26 Do you have a wife who pleases you? Don’t cast her out. +\q2 \f + \fr 7:26 \ft Many authorities omit this line \f* But don’t trust yourself to one who is hateful. +\b +\q1 +\v 27 Honor your father with your whole heart, +\q2 and don’t forget the birth pangs of your mother. +\q1 +\v 28 Remember that you were born of them. +\q2 What will you repay them for the things that they have done for you? +\b +\q1 +\v 29 Fear the Lord with all your soul; +\q2 and revere his priests. +\q1 +\v 30 With all your strength love him who made you. +\q2 Don’t forsake his ministers. +\q1 +\v 31 Fear the Lord and honor the priest. +\q2 Give him his portion, even as it is commanded you: +\q2 the first fruits, the trespass offering, the gift of the shoulders, +\q2 the sacrifice of sanctification, and the first fruits of holy things. +\b +\q1 +\v 32 Also stretch out your hand to the poor man, +\q2 that your blessing may be complete. +\q1 +\v 33 A gift has grace in the sight of every living man. +\q2 Don’t withhold grace for a dead man. +\q1 +\v 34 Don’t avoid those who weep, +\q2 and mourn with those who mourn. +\q1 +\v 35 Don’t be slow to visit a sick man, +\q2 for by such things you will gain love. +\q1 +\v 36 In all your words, remember eternity, +\q2 and you will never sin. +\b +\c 8 +\q1 +\v 1 Don’t contend with a mighty man, +\q2 lest perhaps you fall into his hands. +\q1 +\v 2 Don’t strive with a rich man, lest perhaps he overpower you; +\q2 for gold has destroyed many, +\q2 and turned away the hearts of kings. +\q1 +\v 3 Don’t argue with a loudmouthed man. +\q2 Don’t heap wood upon his fire. +\b +\q1 +\v 4 Don’t make fun of a rude man, +\q2 lest your ancestors be dishonored. +\q1 +\v 5 Don’t reproach a man when he turns from sin. +\q2 Remember that we are all worthy of punishment. +\q1 +\v 6 Don’t dishonor a man in his old age, +\q2 for some of us are also growing old. +\q1 +\v 7 Don’t rejoice over anyone’s death. +\q2 Remember that we all die. +\b +\q1 +\v 8 Don’t neglect the discourse of the wise. +\q2 Be conversant with their proverbs; +\q2 for from them you will learn discipline +\q2 and how to serve great men. +\q1 +\v 9 Don’t miss the discourse of the aged, +\q2 for they also learned from their parents, +\q2 because from them you will learn understanding, +\q2 and to give an answer in time of need. +\b +\q1 +\v 10 Don’t kindle the coals of a sinner, +\q2 lest you be burned with the flame of his fire. +\q1 +\v 11 Don’t rise up from the presence of an insolent man, +\q2 lest he lie in wait as an ambush for your mouth. +\q1 +\v 12 Don’t lend to a man who is stronger than you; +\q2 and if you lend, count it as a loss. +\q1 +\v 13 Don’t be surety beyond your means. +\q2 If you give surety, think as one who will have to pay. +\b +\q1 +\v 14 Don’t go to law with a judge; +\q2 for according to his honor they will give judgment for him. +\q1 +\v 15 Don’t travel with a reckless man, +\q2 lest he be burdensome to you; +\q2 for he will do as he pleases, +\q2 and you will perish with his folly. +\q1 +\v 16 Don’t fight with a wrathful man. +\q2 Don’t travel with him through the desert, +\q2 for blood is as nothing in his sight. +\q2 Where there is no help, he will overthrow you. +\q1 +\v 17 Don’t consult with a fool, +\q2 for he will not be able to keep a secret. +\q1 +\v 18 Do no secret thing before a stranger, +\q2 for you don’t know what it will cause. +\q1 +\v 19 Don’t open your heart to every man. +\q2 Don’t let him return you a favor. +\b +\c 9 +\q1 +\v 1 Don’t be jealous over the wife of your bosom, +\q2 and don’t teach her an evil lesson against yourself. +\q1 +\v 2 Don’t give your soul to a woman +\q2 and let her trample down your strength. +\q1 +\v 3 Don’t go to meet a woman who plays the prostitute, +\q2 lest perhaps you fall into her snares. +\q1 +\v 4 Don’t associate with a woman who is a singer, +\q2 lest perhaps you be caught by her tricks. +\q1 +\v 5 Don’t gaze at a virgin, +\q2 lest perhaps you stumble and incur penalties for her. +\q1 +\v 6 Don’t give your soul to prostitutes, +\q2 that you not lose your inheritance. +\q1 +\v 7 Don’t look around in the streets of the city. +\q2 Don’t wander in its deserted places. +\q1 +\v 8 Turn your eye away from a beautiful woman, +\q2 and don’t gaze at another’s beauty. +\q1 Many have been led astray by the beauty of a woman; +\q2 and with this, passion is kindled like a fire. +\q1 +\v 9 Don’t dine at all with a woman who has a husband, +\q2 or revel with her at wine,\f + \fr 9:9 \ft The preceding line of this verse is omitted by the best authorities. \f* +\q2 lest perhaps your soul turn away to her, +\q2 and with your spirit you slide into destruction. +\b +\q1 +\v 10 Don’t forsake an old friend; +\q2 for a new one is not comparable to him. +\q1 A new friend is like new wine: +\q2 if it becomes old, you will drink it with gladness. +\b +\q1 +\v 11 Don’t envy the success of a sinner; +\q2 for you don’t know what his end will be. +\q1 +\v 12 Don’t delight in the delights of the ungodly. +\q2 Remember they will not go unpunished to\f + \fr 9:12 \ft Gr. \fqa Hades. \f* the grave. +\b +\q1 +\v 13 Keep yourself far from the man who has\f + \fr 9:13 \ft Or, \fqa authority \f* power to kill, +\q2 and you will not be troubled by the fear of death. +\q1 If you come to him, commit no fault, +\q2 lest he take away your life. +\q1 Know surely that you go about in the midst of snares, +\q2 and walk upon the battlements of a city. +\b +\q1 +\v 14 As well as you can, aim to know your neighbors, +\q2 and take counsel with the wise. +\q1 +\v 15 Let your conversation be with men of understanding. +\q2 Let all your discourse be in the law of the Most High. +\q1 +\v 16 Let righteous people be companions at your table. +\q2 Let your glorying be in the fear of the Lord. +\b +\q1 +\v 17 A work is commended because of the skill of the artisan; +\q2 so he who rules the people will be considered wise for his speech. +\q1 +\v 18 A loudmouthed man is dangerous in his city. +\q2 He who is reckless in his speech will be hated. +\b +\c 10 +\q1 +\v 1 A wise judge will instruct his people. +\q2 The government of a man of understanding will be well ordered. +\q1 +\v 2 As is the judge of his people, so are his officials. +\q2 As the city’s ruler is, so are all those who dwell in it. +\q1 +\v 3 An undisciplined king will destroy his people. +\q2 A city will be established through the understanding of the powerful. +\q1 +\v 4 The government of the earth is in the Lord’s hand. +\q2 In due time, he will raise up over it the right person at the right time. +\q1 +\v 5 A man’s prosperity is in the Lord’s hand. +\q2 He will lay his honor upon the person of the scribe. +\b +\q1 +\v 6 Don’t be angry with your neighbor for every wrong. +\q2 Do nothing by works of violence. +\q1 +\v 7 Pride is hateful before the Lord and men. +\q2 Arrogance is abhorrent in the judgment of both. +\q1 +\v 8 Sovereignty is transferred from nation to nation +\q2 because of injustice, violence, and greed for money. +\q1 +\v 9 Why are dirt and ashes proud?\f + \fr 10:9 \ft Two lines of this verse are here omitted by the best authorities.\f* +\q2 Because in life, my body decays. +\q1 +\v 10 A long disease mocks the physician. +\q2 The king of today will die tomorrow. +\q1 +\v 11 For when a man is dead, +\q2 he will inherit maggots, vermin, and worms. +\q1 +\v 12 It is the beginning of pride when a man departs from the Lord. +\q2 His heart has departed from him who made him. +\q1 +\v 13 For the beginning of pride is sin. +\q2 He who keeps it will pour out abomination. +\q1 For this cause the Lord brought upon them strange calamities +\q2 and utterly overthrew them. +\q1 +\v 14 The Lord cast down the thrones of rulers +\q2 and set the lowly in their place. +\q1 +\v 15 The Lord plucked up the roots of nations +\q2 and planted the lowly in their place. +\q1 +\v 16 The Lord overthrew the lands of nations +\q2 and destroyed them to the foundations of the earth. +\q1 +\v 17 He took some of them away and destroyed them, +\q2 and made their memory to cease from the earth. +\q1 +\v 18 Pride has not been created for men, +\q2 nor wrathful anger for the offspring of women. +\b +\q1 +\v 19 Whose offspring has honor? +\q2 Human offspring who fear the Lord. +\q1 Whose offspring has no honor? +\q2 Human offspring who break the commandments. +\q1 +\v 20 In the midst of kindred he who rules them has honor. +\q2 Those who fear the Lord have honor in his eyes. +\v 21 \f + \fr 10:21 \ft Verse 21 is omitted by the best authorities: Fear of the Lord is the beginning of acceptance, but obstinance and pride are the beginning of rejection.\f* +\q1 +\v 22 The rich man, the honorable, and the poor +\q2 all glory in the fear of the Lord. +\q1 +\v 23 It is not right to dishonor a poor man who has understanding. +\q2 It is not fitting to glorify a man who is a sinner. +\q1 +\v 24 The prince, the judge, and the mighty man will be honored. +\q2 There is not one of them greater than he who fears the Lord. +\q1 +\v 25 Free men will minister to a wise servant. +\q2 A man who has knowledge will not complain. +\b +\q1 +\v 26 Don’t flaunt your wisdom in doing your work. +\q2 Don’t boast in the time of your distress. +\q1 +\v 27 Better is he who labors and abounds in all things, +\q2 than he who boasts and lacks bread. +\q1 +\v 28 My son, glorify your soul in humility, +\q2 and ascribe to yourself honor according to your worthiness. +\q1 +\v 29 Who will justify him who sins against his own soul? +\q2 Who will honor him who dishonors his own life? +\b +\q1 +\v 30 A poor man is honored for his knowledge. +\q2 A rich man is honored for his riches. +\q1 +\v 31 But he who is honored in poverty, how much more in riches? +\q2 He who is dishonored in riches, how much more in poverty? +\b +\c 11 +\q1 +\v 1 The wisdom of the lowly will lift up his head, +\q2 and make him sit in the midst of great men. +\b +\q1 +\v 2 Don’t commend a man for his good looks. +\q2 Don’t abhor a man for his outward appearance. +\q1 +\v 3 The bee is little among flying creatures, +\q2 but what it produces is the best of confections. +\q1 +\v 4 Don’t boast about the clothes you wear, +\q2 and don’t exalt yourself in the day of honor; +\q1 for the Lord’s works are wonderful, +\q2 and his works are hidden among men. +\q1 +\v 5 Many\f + \fr 11:5 \ft Gr. \fqa tyrants \f* kings have sat down upon the ground, +\q2 but one who was never thought of has worn a crown. +\q1 +\v 6 Many mighty men have been greatly disgraced. +\q2 Men of renown have been delivered into other men’s hands. +\b +\q1 +\v 7 Don’t blame before you investigate. +\q2 Understand first, and then rebuke. +\q1 +\v 8 Don’t answer before you have heard. +\q2 Don’t interrupt while someone else is speaking. +\q1 +\v 9 Don’t argue about a matter that doesn’t concern you. +\q2 Don’t sit with sinners when they judge. +\b +\q1 +\v 10 My son, don’t be busy about many matters; +\q2 for if you meddle much, you will not be unpunished. +\q1 If you pursue, you will not overtake, +\q2 and you will not escape by fleeing. +\q1 +\v 11 There is one who toils, labors, and hurries, +\q2 and is even more behind. +\q1 +\v 12 There is one who is sluggish, and needs help, +\q2 lacking in strength, and who abounds in poverty, +\q1 but the Lord’s eyes looked upon him for good, +\q2 and he raised him up from his low condition, +\q1 +\v 13 and lifted up his head +\q2 so that many marveled at him. +\b +\q1 +\v 14 Good things and bad, life and death, +\q2 poverty and riches, are from the Lord. +\v 15-16 \f + \fr 11:15-16 \ft Verses 15 and 16 are omitted by the best authorities. \f* +\q1 +\v 17 The Lord’s gift remains with the godly. +\q2 His good pleasure will prosper forever. +\q1 +\v 18 One grows rich by his diligence and self-denial, +\q2 and this is the portion of his reward: +\q1 +\v 19 when he says, “I have found rest, +\q2 and now I will eat of my goods!” +\q1 he doesn’t know how much time will pass +\q2 until he leaves them to others and dies. +\q1 +\v 20 Be steadfast in your covenant and be doing it, +\q2 and grow old in your work. +\b +\q1 +\v 21 Don’t marvel at the works of a sinner, +\q2 but trust the Lord and stay in your labor; +\q1 for it is an easy thing in the sight of the Lord +\q2 to swiftly and suddenly make a poor man rich. +\q1 +\v 22 The Lord’s blessing is in the reward of the godly. +\q2 He makes his blessing flourish in an hour that comes swiftly. +\q1 +\v 23 Don’t say, “What use is there of me? +\q2 What further good things can be mine?” +\q1 +\v 24 Don’t say, “I have enough. +\q2 What harm could happen to me now?” +\q1 +\v 25 In the day of good things, bad things are forgotten. +\q2 In the day of bad things, a man will not remember things that are good. +\q1 +\v 26 For it is an easy thing in the sight of the Lord +\q2 to reward a man in the day of death according to his ways. +\q1 +\v 27 The affliction of an hour causes delights to be forgotten. +\q2 In the end, a man’s deeds are revealed. +\q1 +\v 28 Call no man happy before his death. +\q2 A man will be known in his children. +\b +\q1 +\v 29 Don’t bring every man into your house, +\q2 for many are the tricks of a deceitful man. +\q1 +\v 30 Like a decoy partridge in a cage, so is the heart of a proud man. +\q2 Like a spy, he looks for your weakness. +\q1 +\v 31 For he lies in wait to turn things that are good into evil, +\q2 and assigns blame in things that are praiseworthy. +\q1 +\v 32 From a spark of fire, a heap of many coals is kindled, +\q2 and a sinful man lies in wait to shed blood. +\q1 +\v 33 Take heed of an evil-doer, for he plans wicked things, +\q2 lest perhaps he ruin your reputation forever. +\q1 +\v 34 Receive a stranger into your house, and he will distract you with arguments +\q2 and estrange you from your own family. +\b +\c 12 +\q1 +\v 1 If you do good, know to whom you do it, +\q2 and your good deeds will have thanks. +\q1 +\v 2 Do good to a godly man, and you will find a reward— +\q2 if not from him, then from the Most High. +\q1 +\v 3 No good will come to him who continues to do evil, +\q2 nor to him who gives no alms. +\q1 +\v 4 Give to the godly man, +\q2 and don’t help the sinner. +\q1 +\v 5 Do good to one who is lowly. +\q2 Don’t give to an ungodly man. +\q1 Keep back his bread, and don’t give it to him, +\q2 lest he subdue you with it; +\q1 for you would receive twice as much evil +\q2 for all the good you would have done to him. +\q1 +\v 6 For the Most High also hates sinners, +\q2 and will repay vengeance to the ungodly.\f + \fr 12:6 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 7 Give to the good man, +\q2 and don’t help the sinner. +\b +\q1 +\v 8 A man’s friend won’t be\f + \fr 12:8 \ft Or, \fqa punished \f* fully tried in prosperity. +\q2 His enemy won’t be hidden in adversity. +\q1 +\v 9 In a man’s prosperity, his enemies are grieved. +\q2 In his adversity, even his friend leaves. +\q1 +\v 10 Never trust your enemy, +\q2 for his wickedness is like corrosion in copper. +\q1 +\v 11 Though he humbles himself and walks bowed down, +\q2 still be careful and beware of him. +\q1 You will be to him as one who has wiped a mirror, +\q2 to be sure it doesn’t completely tarnish. +\q1 +\v 12 Don’t set him next to you, +\q2 lest he overthrow you and stand in your place. +\q1 Don’t let him sit on your right hand, +\q2 lest he seek to take your seat, +\q1 and at the last you acknowledge my words, +\q2 and be pricked with my sayings. +\b +\q1 +\v 13 Who will pity a charmer that is bitten by a snake, +\q2 or any who come near wild beasts? +\q1 +\v 14 Even so, who will pity him who goes to a sinner, +\q2 and is associated with him in his sins? +\q1 +\v 15 For a while he will stay with you, +\q2 and if you falter, he will not stay. +\q1 +\v 16 The enemy will speak sweetly with his lips, +\q2 and in his heart plan to throw you into a pit. +\q1 The enemy may weep with his eyes, +\q2 but if he finds opportunity, he will want more blood. +\q1 +\v 17 If adversity meets you, you will find him there before you. +\q2 Pretending to help you, he will trip you. +\q1 +\v 18 He will shake his head, clap his hands, +\q2 whisper much, and change his countenance. +\b +\c 13 +\q1 +\v 1 He who touches pitch will be defiled. +\q2 He who has fellowship with a proud man will become like him. +\q1 +\v 2 Don’t take up a burden above your strength. +\q2 Have no fellowship with one who is mightier and richer than yourself. +\q1 What fellowship would the earthen pot have with the kettle? +\q2 The kettle will strike, and the pot will be dashed in pieces. +\q1 +\v 3 The rich man does a wrong and threatens. +\q2 The poor is wronged and apologizes. +\q1 +\v 4 If you are profitable, he will exploit you. +\q2 If you are in need, he will forsake you. +\q1 +\v 5 If you own something, he will live with you. +\q2 He will drain your resources and will not be sorry. +\q1 +\v 6 Does he need you? Then he will deceive you, +\q2 smile at you, and give you hope. +\q2 He will speak kindly to you and say, “What do you need?” +\q1 +\v 7 He will shame you by his delicacies +\q2 until he has made you bare twice or thrice, +\q2 and in the end he will laugh you to scorn. +\q1 Afterward he will see you, will forsake you, +\q2 and shake his head at you. +\b +\q1 +\v 8 Beware that you are not deceived +\q2 and brought low in your enjoyment. +\q1 +\v 9 If a mighty man invites you, be reserved, +\q2 and he will invite you more. +\q1 +\v 10 Don’t press him, lest you be thrust back. +\q2 Don’t stand far off, lest you be forgotten. +\q1 +\v 11 Don’t try to speak with him as an equal, +\q2 and don’t believe his many words; +\q1 for he will test you with much talk, +\q2 and will examine you in a smiling manner. +\q1 +\v 12 He who doesn’t keep secrets to himself is unmerciful. +\q2 He won’t hesitate to harm and to bind. +\q1 +\v 13 Keep them to yourself and be careful, +\q2 for you walk\f + \fr 13:13 \ft Gr. \fqa along with. \f* in danger of falling. +\v 14 \f + \fr 13:14 \ft The remainder of verse 13, and verse 14, are omitted by the best authorities. \f* +\b +\q1 +\v 15 Every living creature loves its own kind, +\q2 and every man loves his neighbor. +\q1 +\v 16 All flesh associates with their own kind. +\q2 A man will stick to people like himself. +\q1 +\v 17 What fellowship would the wolf have with the lamb? +\q2 So is the sinner to the godly. +\q1 +\v 18 What peace is there between a hyena and a dog? +\q2 What peace is there between a rich man and the poor? +\q1 +\v 19 Wild donkeys are the prey of lions in the wilderness; +\q2 likewise poor men are feeding grounds for the rich. +\q1 +\v 20 Lowliness is an abomination to a proud man; +\q2 likewise a poor man is an abomination to the rich. +\b +\q1 +\v 21 When a rich man is shaken, he is supported by his friends, +\q2 but when the humble is down, he is pushed away even by his friends. +\q1 +\v 22 When a rich man falls, there are many helpers. +\q2 He speaks things not to be spoken, and men justify him. +\q1 A humble man falls, and men rebuke him. +\q2 He utters wisdom, and is not listened to. +\q1 +\v 23 A rich man speaks, and all keep silence. +\q2 They extol what he says to the clouds. +\q1 A poor man speaks, and they say, “Who is this?” +\q2 If he stumbles, they will help to overthrow him. +\b +\q1 +\v 24 Riches are good if they have no sin. +\q2 Poverty is evil only in the opinion of the ungodly. +\b +\q1 +\v 25 The heart of a man changes his countenance, +\q2 whether it is for good or for evil.\f + \fr 13:25 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 26 A cheerful countenance is a sign of a prosperous heart. +\q2 Devising proverbs takes strenuous thinking. +\c 14 +\q1 +\v 1 Blessed is the man who has not slipped with his mouth, +\q2 and doesn’t suffer from sorrow for sins. +\q1 +\v 2 Blessed is he whose soul does not condemn him, +\q2 and who has not given up hope. +\b +\q1 +\v 3 Riches are not appropriate for a stingy person. +\q2 What would a miser do with money? +\q1 +\v 4 He who gathers by denying himself gathers for others. +\q2 Others will revel in his goods. +\q1 +\v 5 If one is mean to himself, to whom will he be good? +\q2 He won’t enjoy his possessions. +\q1 +\v 6 There is none more evil than he who is grudging to himself. +\q2 This is a punishment for his wickedness. +\q1 +\v 7 Even if he does good, he does it in forgetfulness. +\q2 In the end, he reveals his wickedness. +\q1 +\v 8 A miser is evil. +\q2 He turns away and disregards souls. +\q1 +\v 9 A covetous man’s eye is not satisfied with his portion. +\q2 Wicked injustice dries up his soul. +\q1 +\v 10 A miser begrudges bread, +\q2 and it is lacking at his table. +\b +\q1 +\v 11 My son, according to what you have, treat yourself well, +\q2 and bring worthy offerings to the Lord. +\q1 +\v 12 Remember that death will not wait, +\q2 and that the covenant of Hades hasn’t been shown to you. +\q1 +\v 13 Do good to your friends before you die. +\q2 According to your ability, reach out and give to them. +\q1 +\v 14 Don’t deprive yourself of a good day. +\q2 Don’t let your share of a desired good pass you by. +\q1 +\v 15 Won’t you leave your labors to another, +\q2 and your toils be divided by lot? +\q1 +\v 16 Give, take, and treat yourself well, +\q2 because there is no seeking of luxury in Hades. +\q1 +\v 17 All flesh grows old like a garment, +\q2 for the covenant from the beginning is, “You must die!” +\q1 +\v 18 Like the leaves flourishing on a thick tree, +\q2 some it sheds, and some grow, +\q1 so also are the generations of flesh and blood: +\q2 one comes to an end and another is born. +\q1 +\v 19 Every work rots and falls away, +\q2 and its builder will depart with it. +\b +\q1 +\v 20 Blessed is the man who meditates on wisdom, +\q2 and who reasons by his understanding. +\q1 +\v 21 He who considers her ways in his heart +\q2 will also have knowledge of her secrets. +\q1 +\v 22 Go after her like a hunter, +\q2 and lie in wait in her paths. +\q1 +\v 23 He who peers in at her windows +\q2 will also listen at her doors. +\q1 +\v 24 He who lodges close to her house +\q2 will also fasten a nail in her walls. +\q1 +\v 25 He will pitch his tent near at hand to her, +\q2 and will lodge in a lodging where good things are. +\q1 +\v 26 He will set his children under her shelter, +\q2 and will rest under her branches. +\q1 +\v 27 By her he will be covered from heat, +\q2 and will lodge in her glory. +\c 15 +\q1 +\v 1 He who fears the Lord will do this. +\q2 He who has possession of the law will obtain her. +\q1 +\v 2 She will meet him like a mother, +\q2 and receive him like a wife married in her virginity. +\q1 +\v 3 She will feed him with bread of understanding +\q2 and give him water of wisdom to drink. +\q1 +\v 4 He will be stayed upon her, and will not be moved. +\q2 He will rely upon her, and will not be confounded. +\q1 +\v 5 She will exalt him above his neighbors. +\q2 She will open his mouth in the midst of the congregation. +\q1 +\v 6 He will inherit joy, a crown of gladness, +\q2 and an everlasting name. +\q1 +\v 7 Foolish men will not obtain her. +\q2 Sinners will not see her. +\q1 +\v 8 She is far from pride. +\q2 Liars will not remember her. +\q1 +\v 9 Praise is not attractive in the mouth of a sinner; +\q2 for it was not sent to him from the Lord. +\q1 +\v 10 For praise will be spoken in wisdom; +\q2 The Lord will prosper it. +\b +\q1 +\v 11 Don’t say, “It is through the Lord that I fell away;” +\q2 for you shall not do the things that he hates. +\q1 +\v 12 Don’t say, “It is he that caused me to err;” +\q2 for he has no need of a sinful man. +\q1 +\v 13 The Lord hates every abomination; +\q2 and those who fear him don’t love them. +\q1 +\v 14 He himself made man from the beginning +\q2 and left him in the hand of his own counsel. +\q1 +\v 15 If you choose, you can keep the commandments. +\q2 To be faithful is a matter of your choice. +\q1 +\v 16 He has set fire and water before you. +\q2 You will stretch forth your hand to whichever you desire. +\q1 +\v 17 Before man is life and death. +\q2 Whichever he likes, it will be given to him. +\q1 +\v 18 For the wisdom of the Lord is great. +\q2 He is mighty in power, and sees all things. +\q1 +\v 19 His eyes are upon those who fear him. +\q2 He knows every act of man. +\q1 +\v 20 He has not commanded any man to be ungodly. +\q2 He has not given any man license to sin. +\b +\c 16 +\q1 +\v 1 Don’t desire a multitude of unprofitable children, +\q2 neither delight in ungodly sons. +\q1 +\v 2 If they multiply, don’t delight in them +\q2 unless the fear of the Lord is in them. +\q1 +\v 3 Don’t trust in their life. +\q2 Don’t rely on their numbers; +\q2 for one can be better than a thousand, +\q2 and to die childless than to have ungodly children. +\q1 +\v 4 For from one who has understanding, a city will be populated, +\q2 but a race of wicked men will be made desolate. +\q1 +\v 5 I have seen many such things with my eyes. +\q2 My ear has heard mightier things than these. +\b +\q1 +\v 6 In a congregation of sinners, a fire will be kindled. +\q2 In a disobedient nation, wrath is kindled. +\q1 +\v 7 He was not pacified toward the giants of old time, +\q2 who revolted in their strength. +\q1 +\v 8 He didn’t spare Lot’s neighbors, +\q2 whom he abhorred for their pride. +\q1 +\v 9 He didn’t pity the people of perdition +\q2 who were taken away in their sins, +\q2 +\v 10 or in like manner, the six hundred thousand footmen +\q2 who were gathered together in the hardness of their hearts. +\q1 +\v 11 Even if there is one stiff-necked person, +\q2 it is a marvel if he will be unpunished; +\q2 for mercy and wrath are both with him who is mighty to forgive, +\q2 and he pours out wrath. +\q1 +\v 12 As his mercy is great, so is his correction also. +\q2 He judges a man according to his works. +\q1 +\v 13 The sinner will not escape with plunder. +\q2 The perseverance of the godly will not be frustrated. +\q1 +\v 14 He will make room for every work of mercy. +\q2 Each man will receive according to his works. +\v 15-16 \f + \fr 16:15-16 \ft Verses 15 and 16 are omitted by the best authorities. \f* +\b +\q1 +\v 17 Don’t say, “I will be hidden from the Lord,” +\q2 and “Who will remember me from on high?” +\q1 I will not be known among so many people, +\q2 for what is my soul in a boundless creation? +\q1 +\v 18 Behold, the heaven, the heaven of heavens, +\q2 the deep, and the earth, will be moved when he visits. +\q1 +\v 19 The mountains and the foundations of the earth together +\q2 are shaken with trembling when he looks at them. +\q1 +\v 20 No heart will think about these things. +\q2 Who could comprehend his ways? +\q1 +\v 21 Like a tempest which no man can see, +\q2 so, the majority of his works are\f + \fr 16:21 \ft Gr. \fqa among hidden things. \f* hidden. +\q1 +\v 22 Who will declare his works of righteousness? +\q2 Who will wait for them? +\q2 For his covenant is afar off.\f + \fr 16:22 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 23 He who is lacking in\f + \fr 16:23 \ft Gr. \fqa heart. \f* understanding thinks about these things. +\q2 An unwise and erring man thinks foolishly. +\b +\q1 +\v 24 My son, listen to me, learn knowledge, +\q2 and heed my words with your heart. +\q1 +\v 25 I will impart instruction with precision, +\q2 and declare knowledge exactly. +\b +\q1 +\v 26 In the judgment of the Lord are his works from the beginning. +\q2 From the making of them he determined their boundaries. +\q1 +\v 27 He arranged his works for all time, +\q2 and their beginnings to their generations. +\q1 They aren’t hungry or weary, +\q2 and they don’t cease from their works. +\q1 +\v 28 No one pushes aside his neighbor. +\q2 They will never disobey his word. +\q1 +\v 29 After this also the Lord looked at the earth +\q2 and filled it with his blessings. +\q1 +\v 30 All manner of living things covered its surface, +\q2 and they return into it. +\b +\c 17 +\q1 +\v 1 The Lord created mankind out of earth, +\q2 and turned them back to it again. +\q1 +\v 2 He gave them days by number, and a set time, +\q2 and gave them authority over the things that are on it. +\q1 +\v 3 He endowed them with strength proper to them, +\q2 and made them according to his own image. +\q1 +\v 4 He put the fear of man upon all flesh, +\q2 and gave him dominion over beasts and birds. +\v 5 \f + \fr 17:5 \ft Verse 5 is omitted by the best authorities. \f* +\q1 +\v 6 He gave them counsel, tongue, eyes, +\q2 ears, and heart to have understanding. +\q1 +\v 7 He filled them with the knowledge of wisdom, +\q2 and showed them good and evil. +\q1 +\v 8 He set his eye upon their hearts, +\q2 to show them the majesty of his works. +\v 9 \f + \fr 17:9 \ft Verse 9 is omitted by the best authorities. \f* +\q1 +\v 10 And they will praise his holy name, +\q2 \f + \fr 17:10 \ft This line is added by the best authorities. \f* that they may declare the majesty of his works. +\q1 +\v 11 He added to them knowledge, +\q2 and gave them a law of life for a heritage. +\q1 +\v 12 He made an everlasting covenant with them, +\q2 and showed them his decrees. +\q1 +\v 13 Their eyes saw the majesty of his glory. +\q2 Their ears heard the glory of his voice. +\q1 +\v 14 He said to them, “Beware of all unrighteousness.” +\q2 So he gave them commandment, each man concerning his neighbor. +\b +\q1 +\v 15 Their ways are ever before him. +\q2 They will not be hidden from his eyes. +\v 16 \f + \fr 17:16 \ft Verses 16, 18, and 21 are omitted by the best authorities. \f* +\q1 +\v 17 \f + \fr 17:17 \ft The preceding part of this verse is omitted by the best authorities. \f*For every nation he appointed a ruler, +\q2 but Israel is the Lord’s portion. +\v 18 \f + \fr 17:18 \ft Verses 16, 18, and 21 are omitted by the best authorities.\f* +\q1 +\v 19 All their works are as clear as the sun before him. +\q2 His eyes are continually upon their ways. +\q1 +\v 20 Their iniquities are not hidden from him. +\q2 All their sins are before the Lord. +\v 21 \f + \fr 17:21 \ft Verses 16, 18, and 21 are omitted by the best authorities.\f* +\q1 +\v 22 With him the alms of a man is as a signet. +\q2 He will keep a man’s kindness as the pupil of the eye.\f + \fr 17:22 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 23 Afterwards he will rise up and repay them, +\q2 and render their repayment upon their head. +\q1 +\v 24 However to those who repent he grants a return. +\q2 He comforts those who are losing hope. +\b +\q1 +\v 25 Return to the Lord, and forsake sins. +\q2 Make your prayer before his face offend less. +\q1 +\v 26 Turn again to the Most High, and turn away from iniquity.\f + \fr 17:26 \ft A line is here omitted by the best authorities. \f* +\q2 Greatly hate the abominable thing. +\q1 +\v 27 Who will give praise to the Most High in Hades, +\q2 in place of the living who return thanks? +\q1 +\v 28 Thanksgiving perishes from the dead, as from one who doesn’t exist. +\q2 He who is in life and health will praise the Lord. +\q1 +\v 29 How great is the mercy of the Lord, +\q2 and his forgiveness to those who turn to him! +\q1 +\v 30 For humans are not capable of everything, +\q2 because the son of man is not immortal. +\q1 +\v 31 What is brighter than the sun? Yet even this can be eclipsed. +\q2 So flesh and blood devise evil. +\q1 +\v 32 He looks upon the power of the height of heaven, +\q2 while all men are earth and ashes. +\b +\c 18 +\q1 +\v 1 He who lives forever created the whole universe. +\q1 +\v 2 The Lord alone is just. +\v 3 \f + \fr 18:3 \ft The remainder of verse 2, and verse 3, are omitted by the best authorities. \f* +\q1 +\v 4 He has given power to declare his works to no one. +\q2 Who could trace out his mighty deeds? +\q1 +\v 5 Who could measure the strength of his majesty? +\q2 Who could also proclaim his mercies? +\q1 +\v 6 As for the wondrous works of the Lord, it is not possible to take from them nor add to them, +\q2 neither is it possible to explore them. +\q1 +\v 7 When a man has finished, then he is just at the beginning. +\q2 When he stops, then he will be perplexed. +\q1 +\v 8 What is mankind, and what purpose do they serve? +\q2 What is their good, and what is their evil? +\q1 +\v 9 The number of man’s days at the most are a hundred years. +\q1 +\v 10 As a drop of water from the sea, and a pebble from the sand, +\q2 so are a few years in the day of eternity. +\q1 +\v 11 For this cause the Lord was patient over them, +\q2 and poured out his mercy upon them. +\q1 +\v 12 He saw and perceived their end, that it is evil. +\q2 Therefore he multiplied his forgiveness. +\q1 +\v 13 The mercy of a man is on his neighbor; +\q2 but the mercy of the Lord is on all flesh: +\q2 reproving, chastening, teaching, +\q2 and bringing back, as a shepherd does his flock. +\q1 +\v 14 He has mercy on those who accept chastening, +\q2 and that diligently seek after his judgments. +\b +\q1 +\v 15 My son, don’t add reproach to your good deeds, +\q2 and no harsh words in any of your giving. +\q1 +\v 16 Doesn’t the dew relieve the scorching heat? +\q2 So a word is better than a gift. +\q1 +\v 17 Behold, isn’t a word better than a gift? +\q2 Both are with a gracious person. +\q1 +\v 18 A fool is ungracious and abusive. +\q2 The gift of an grudging person consumes the eyes. +\b +\q1 +\v 19 Learn before you speak. +\q2 Take care of your health before you get sick. +\q1 +\v 20 Before judgment, examine yourself, +\q2 and in the hour of scrutiny you will find forgiveness. +\q1 +\v 21 Humble yourself before you get sick. +\q2 In the time of sins, repent. +\q1 +\v 22 Let nothing hinder you to pay your vow in due time. +\q2 Don’t wait until death to be released. +\q1 +\v 23 Before you make a vow, prepare yourself. +\q2 Don’t be like a man who tests the Lord. +\q1 +\v 24 Think about the wrath coming in the days of the end, +\q2 and the time of vengeance, when he turns away his face. +\q1 +\v 25 In the days of fullness remember the time of hunger. +\q2 Remember poverty and lack in the days of wealth. +\q1 +\v 26 From morning until evening, the time changes. +\q2 All things are speedy before the Lord. +\q1 +\v 27 A wise man is cautious in everything. +\q2 In days of sinning, he will beware of offense.\f + \fr 18:27 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 28 Every man of understanding knows wisdom. +\q2 He will give thanks to him who found her. +\q1 +\v 29 They who were of understanding in sayings also became wise themselves, +\q2 and poured out apt proverbs. +\b +\q1 +\v 30 Don’t go after your lusts. +\q2 Restrain your appetites. +\q1 +\v 31 If you give fully to your soul the delight of her desire, +\q2 she will make you\f + \fr 18:31 \ft Or, \fqa a rejoicing to \f* the laughing stock of your enemies. +\q1 +\v 32 Don’t make merry in much luxury, +\q2 and don’t be tied to its expense. +\q1 +\v 33 Don’t be made a beggar by banqueting with borrowed money +\q2 when you have nothing in your purse.\f + \fr 18:33 \ft The remainder of this verse is omitted by the best authorities. \f* +\b +\c 19 +\q1 +\v 1 A worker who is a drunkard will not become rich. +\q2 He who despises small things will fall little by little. +\q1 +\v 2 Wine and women will make men of understanding go astray. +\q2 He who joins with prostitutes is reckless. +\q1 +\v 3 Decay and worms will have him as their heritage. +\q2 A reckless soul will be taken away. +\b +\q1 +\v 4 He who is hasty to trust is shallow-hearted. +\q2 He who sins offends against his own soul. +\q1 +\v 5 He who rejoices in wickedness will be condemned.\f + \fr 19:5 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 6 \f + \fr 19:6 \ft The preceding part of this verse is omitted by the best authorities. \f* He who hates gossip has less wickedness. +\q1 +\v 7 Never repeat what is told you, +\q2 and you won’t lose anything. +\q1 +\v 8 Whether it is of friend or foe, don’t tell it. +\q2 Unless it is a sin to you, don’t reveal it. +\q1 +\v 9 For if he has heard you and observed you, +\q2 when the time comes, he will hate you. +\q1 +\v 10 Have you heard something? Let it die with you. +\q2 Be brave: it will not make you burst! +\q1 +\v 11 A fool will travail in pain with a word, +\q2 as a woman in labor with a child. +\q1 +\v 12 As an arrow that sticks in the flesh of the thigh, +\q2 so is gossip in a fool. +\b +\q1 +\v 13 Question a friend; it may be he didn’t do it. +\q2 If he did something, it may be that he may do it no more. +\q1 +\v 14 Question your neighbor; it may be he didn’t say it. +\q2 If he has said it, it may be that he may not say it again. +\q1 +\v 15 Question a friend; for many times there is slander. +\q2 Don’t trust every word. +\q1 +\v 16 There is one who slips, and not from the heart. +\q2 Who is he who hasn’t sinned with his tongue? +\q1 +\v 17 Reprove your neighbor before you threaten him; +\q2 and give place to the law of the Most High. +\v 18-19 \f + \fr 19:18-19 \ft Verses 18 and 19 are omitted by the best authorities.\f* +\b +\q1 +\v 20 All wisdom is the fear of the Lord. +\q2 In all wisdom is the doing of the law. +\v 21 \f + \fr 19:21 \ft The remainder of verse 20 and verse 21 are omitted by the best authorities. \f* +\q1 +\v 22 The knowledge of wickedness is not wisdom. +\q2 The prudence of sinners is not counsel. +\q1 +\v 23 There is a wickedness, and it is an abomination. +\q1 There is a fool lacking in wisdom. +\q1 +\v 24 Better is one who has little understanding, and fears God, +\q2 than one who has much intelligence and transgresses the law. +\q1 +\v 25 There is an exquisite subtlety, and it is unjust. +\q2 And there is one who perverts favor to gain a judgment.\f + \fr 19:25 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 26 There is one who does wickedly, who hangs down his head with mourning; +\q2 but inwardly he is full of deceit, +\q2 +\v 27 bowing down his face, and pretending to be deaf in one ear. +\q2 Where he isn’t known, he will take advantage of you. +\q1 +\v 28 And if for lack of power he is hindered from sinning, +\q2 if he finds opportunity, he will do mischief. +\q1 +\v 29 A man will be known by his appearance. +\q2 One who has understanding will be known by his face when you meet him. +\q1 +\v 30 A man’s attire, grinning laughter, +\q2 and the way he walks show what he is. +\b +\c 20 +\q1 +\v 1 There is a reproof that is not timely; +\q2 and there is a person who is wise enough to keep silent. +\q1 +\v 2 How good is it to reprove, rather than to be angry. +\q2 He who confesses will be kept back from harm. +\v 3 \f + \fr 20:3 \ft Verse 3 is omitted by the best authorities. \f* +\q1 +\v 4 As is the lust of a eunuch to deflower a virgin, +\q2 so is he who executes judgments with violence. +\q1 +\v 5 There is one who keeps silent and is found wise; +\q2 and there is one who is hated for his much talk. +\q1 +\v 6 There is one who keeps silent, for he has no answer to make; +\q2 And there is one who keeps silent, knowing when to speak. +\q1 +\v 7 A wise man will be silent until his time has come, +\q2 but the braggart and fool will miss his time. +\q1 +\v 8 He who uses many words will be abhorred. +\q2 He who takes authority for himself will be hated in it. +\b +\q1 +\v 9 There is a prosperity that a man finds in misfortunes; +\q2 and there is a gain that turns to loss. +\q1 +\v 10 There is a gift that will not profit you; +\q2 and there is a gift that pays back double. +\q1 +\v 11 There are losses because of glory; +\q2 and there is one who has lifted up his head from a low estate. +\q1 +\v 12 There is one who buys much for a little, +\q2 and pays for it again sevenfold. +\q1 +\v 13 He who is wise in words will make himself beloved; +\q2 but the pleasantries of fools will be wasted. +\q1 +\v 14 The gift of a fool will not profit you,\f + \fr 20:14 \ft A line of this verse is here omitted by the best authorities. \f* +\q2 for he looks for repayment many times instead of one. +\q1 +\v 15 He will give little and insult much. +\q2 He will open his mouth like a crier. +\q1 Today he will lend, and tomorrow he will ask for it back. +\q2 Such a one is a hateful man. +\q1 +\v 16 The fool will say, “I have no friend, +\q2 and I have no thanks for my good deeds. +\q2 Those who eat my bread have an evil tongue.” +\q1 +\v 17 How often, and of how many, will he be laughed to scorn!\f + \fr 20:17 \ft The latter part of verse 17 is omitted by the best authorities. \f* +\b +\q1 +\v 18 A slip on a pavement is better than a slip with the tongue. +\q2 So the fall of the wicked will come speedily. +\q1 +\v 19 A man without grace is a tale out of season. +\q2 It will be continually in the mouth of the ignorant. +\q1 +\v 20 A parable from a fool’s mouth will be rejected; +\q2 for he won’t tell it at the proper time. +\b +\q1 +\v 21 There is one who is hindered from sinning through lack. +\q2 When he rests, he will not be troubled. +\q1 +\v 22 There is one who destroys his soul through bashfulness. +\q2 By a foolish countenance, he will destroy it. +\q1 +\v 23 There is one who for bashfulness makes promises to his friend; +\q2 and he makes him his enemy for nothing. +\b +\q1 +\v 24 A lie is an ugly blot on a person. +\q2 It will be continually in the mouth of the ignorant. +\q1 +\v 25 A thief is better than a man who is continually lying, +\q2 but they both will inherit destruction. +\q1 +\v 26 The destination of a liar is dishonor. +\q2 His shame is with him continually. +\b +\q1 +\v 27 He who is wise in words will advance himself. +\q2 And one who is prudent will please great men. +\q1 +\v 28 He who tills his land will raise his harvest high. +\q2 He who pleases great men will get pardon for iniquity. +\q1 +\v 29 Favors and gifts blind the eyes of the wise, +\q2 and as a muzzle on the mouth, turn away reproofs. +\q1 +\v 30 Wisdom that is hidden, and treasure that is out of sight— +\q2 what profit is in either of them? +\q1 +\v 31 Better is a man who hides his folly +\q2 than a man who hides his wisdom. +\v 32 \f + \fr 20:32 \ft Verse 32 is omitted by the best authorities.\f* +\b +\c 21 +\q1 +\v 1 My son, have you sinned? +\q2 Do it no more; +\q2 and ask forgiveness for your past sins. +\q1 +\v 2 Flee from sin as from the face of a snake; +\q2 for if you go near, it will bite you. +\q1 Its teeth are like lion’s teeth, +\q2 slaying people’s souls. +\q1 +\v 3 All iniquity is as a two-edged sword. +\q2 Its stroke has no healing. +\b +\q1 +\v 4 Terror and violence will waste away riches. +\q2 So the house of an arrogant man will be laid waste. +\q1 +\v 5 Supplication from a poor man’s mouth reaches to the ears of\f + \fr 21:5 \ft Gr. \fqa him. \f* God, +\q2 and his judgment comes speedily. +\q1 +\v 6 One who hates reproof is in the path of the sinner. +\q2 He who fears the Lord will repent in his heart. +\q1 +\v 7 He who is mighty in tongue is known far away; +\q2 but the man of understanding knows when he slips. +\b +\q1 +\v 8 He who builds his house with other men’s money +\q2 is like one who gathers stones for his own tomb. +\q1 +\v 9 The congregation of wicked men is as a bundle of tow +\q2 with a flame of fire at the end of them. +\q1 +\v 10 The way of sinners is paved with stones; +\q2 and at the end of it is the pit of Hades. +\b +\q1 +\v 11 He who keeps the law becomes master of its intent. +\q2 The fulfilment of the fear of the Lord is wisdom. +\q1 +\v 12 He who is not clever will not be instructed. +\q2 There is a cleverness which makes bitterness abound. +\q1 +\v 13 The knowledge of a wise man will be made to abound as a flood, +\q2 and his counsel as a fountain of life. +\q1 +\v 14 The inward parts of a fool are like a broken vessel. +\q2 He will hold no knowledge. +\b +\q1 +\v 15 If a man of knowledge hears a wise word, +\q2 he will commend it and add to it. +\q1 The wanton man hears it, and it displeases him, +\q2 so he throws it away behind his back. +\q1 +\v 16 The chatter of a fool is like a burden in the way, +\q2 but grace will be found on the lips of the wise. +\q1 +\v 17 The utterance of the prudent man will be sought for in the congregation. +\q2 They will ponder his words in their heart. +\b +\q1 +\v 18 As a house that is destroyed, so is wisdom to a fool. +\q2 The knowledge of an unwise man is talk without sense.\f + \fr 21:18 \ft Gr. \fqa unexamined words. \f* +\q1 +\v 19 Instruction is as fetters on the feet of an unwise man, +\q2 and as manacles on the right hand. +\q1 +\v 20 A fool lifts up his voice with laughter, +\q2 but a clever man smiles quietly. +\q1 +\v 21 Instruction is to a prudent man as an ornament of gold, +\q2 and as a bracelet upon his right arm. +\b +\q1 +\v 22 The foot of a fool rushes into a house, +\q2 but a man of experience will be ashamed of entering. +\q1 +\v 23 A foolish man peers into the door of a house, +\q2 but a man who is instructed will stand outside. +\q1 +\v 24 It is rude for someone to listen at a door, +\q2 but a prudent person will be grieved with the disgrace. +\q1 +\v 25 The lips of strangers will be grieved at these things, +\q2 but the words of prudent men will be weighed in the balance. +\b +\q1 +\v 26 The heart of fools is in their mouth, +\q2 but the mouth of wise men is their heart. +\q1 +\v 27 When the ungodly curses an adversary, +\q2 he curses his own soul. +\q1 +\v 28 A whisperer defiles his own soul, +\q2 and will be hated wherever he travels. +\b +\c 22 +\q1 +\v 1 A slothful man is compared to a stone that is defiled. +\q2 Everyone will at hiss at him in his disgrace. +\q1 +\v 2 A slothful man is compared to the filth of a dunghill. +\q2 Anyone who picks it up will shake it out of his hand. +\b +\q1 +\v 3 An undisciplined child is a disgrace to his father, +\q2 and a foolish daughter is born to his loss. +\q1 +\v 4 A prudent daughter will inherit a husband of her own. +\q2 She who brings shame is the grief of her father. +\q1 +\v 5 She who is arrogant brings shame on father and husband. +\q2 She will be despised by both of them. +\q1 +\v 6 Ill-timed conversation is like music in mourning, +\q2 but stripes and correction are wisdom in every season. +\b +\q1 +\v 7 He who teaches a fool is like one who glues potsherds together, +\q2 even like one who wakes a sleeper out of a deep sleep. +\q1 +\v 8 He who teaches a fool is as one who teaches a man who slumbers. +\q2 In the end he will say, “What is it?” +\v 9-10 \f + \fr 22:9-10 \ft Verses 9 and 10 are omitted by the best authorities. \f* +\q1 +\v 11 Weep for the dead, for he lacks light. +\q2 Weep for a fool, for he lacks understanding. +\q1 Weep more sweetly for the dead, because he has found rest, +\q2 but the life of the fool is worse than death. +\q1 +\v 12 Mourning for the dead lasts seven days, +\q2 but for a fool and an ungodly man, it lasts all the days of his life. +\b +\q1 +\v 13 Don’t talk much with a foolish man, +\q2 and don’t go to one who has no understanding. +\q1 Beware of him, lest you have trouble and be defiled in his onslaught. +\q2 Turn away from him, and you will find rest, +\q2 and you won’t be wearied in his madness. +\q1 +\v 14 What would be heavier than lead? +\q2 What is its name, but “Fool”? +\q1 +\v 15 Sand, salt, and a mass of iron is easier to bear +\q2 than a man without understanding. +\b +\q1 +\v 16 Timber girded and bound into a building will not be released with shaking. +\q2 So a heart established in due season on well advised counsel will not be afraid. +\q1 +\v 17 A heart settled upon a thoughtful understanding +\q2 is as an ornament of plaster on a polished wall. +\q1 +\v 18 Fences set on a high place will not stand against the wind; +\q2 so a fearful heart in the imagination of a fool will not stand against any fear. +\b +\q1 +\v 19 He who pricks the eye will make tears fall. +\q2 He who pricks the heart makes it show feeling. +\q1 +\v 20 Whoever casts a stone at birds scares them away. +\q2 He who insults a friend will dissolve friendship. +\q1 +\v 21 If you have drawn a sword against a friend, don’t despair, +\q2 for there may be a way back. +\q1 +\v 22 If you have opened your mouth against a friend, don’t be afraid, +\q2 for there may be reconciliation, +\q2 unless it is for insulting, arrogance, disclosing of a secret, or a treacherous blow— +\q2 for these things any friend will flee. +\b +\q1 +\v 23 Gain trust with your neighbor in his poverty, +\q2 that in his prosperity you may have gladness. +\q1 Stay steadfast to him in the time of his affliction, +\q2 that you may be heir with him in his inheritance.\f + \fr 22:23 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 24 Before fire is the vapor and smoke of a furnace, +\q2 so insults precede bloodshed. +\q1 +\v 25 I won’t be ashamed to shelter a friend. +\q2 I won’t hide myself from his face. +\q1 +\v 26 If any evil happens to me because of him, +\q2 everyone who hears it will beware of him. +\b +\q1 +\v 27 Who will set a watch over my mouth, +\q2 and a seal of shrewdness upon my lips, +\q2 that I may not fall from it, and that my tongue may not destroy me? +\c 23 +\q1 +\v 1 O Lord, Father and Master of my life, +\q2 don’t abandon me to their counsel. +\q2 Don’t let me fall because of them. +\q1 +\v 2 Who will set scourges over my thought, +\q2 and a discipline of wisdom over my heart, +\q2 that they spare me not for my errors, +\q2 and not overlook their sins? +\q1 +\v 3 Otherwise my errors might be multiplied, +\q2 and my sins abound, +\q2 I fall before my adversaries, +\q2 and my enemy rejoice over me.\f + \fr 23:3 \ft The remainder of this verse is omitted by the best authorities.\f* +\q1 +\v 4 O Lord, Father and God of my life, +\q2 don’t give me a haughty eyes,\f + \fr 23:4 \ft The remainder of this verse is omitted by the best authorities.\f* +\q2 +\v 5 and turn away evil desire from me.\f + \fr 23:5 \ft The remainder of this verse is omitted by the best authorities.\f* +\q1 +\v 6 Let neither gluttony nor lust overtake me. +\q2 Don’t give me over to a shameless mind. +\b +\q1 +\v 7 Listen, my children, to the discipline of the mouth. +\q2 He who keeps it will not be caught. +\q1 +\v 8 The sinner will be overpowered through his lips. +\q2 By them, the insulter and the arrogant will stumble. +\q1 +\v 9 Don’t accustom your mouth to an oath, +\q2 and don’t be accustomed to naming the Holy One, +\q1 +\v 10 for as a servant who is continually scourged will not lack bruises, +\q2 so he also who swears and continually utters the Name will not be cleansed from sin. +\q1 +\v 11 A man of many oaths will be filled with iniquity. +\q2 The scourge will not depart from his house. +\q1 If he offends, his sin will be upon him. +\q2 If he disregards it, he has sinned doubly. +\q1 If he has sworn falsely, he will not be justified, +\q2 for his house will be filled with calamities. +\b +\q1 +\v 12 There is a manner of speech that is clothed with death. +\q2 Let it not be found in the heritage of Jacob, +\q2 for all these things will be far from the godly, +\q2 and they will not wallow in sins. +\q1 +\v 13 Don’t accustom your mouth to gross rudeness, +\q2 for it involves sinful speech. +\q1 +\v 14 Remember your father and your mother, +\q2 for you sit in the midst of great men, +\q2 that you be not forgetful before them, +\q2 and become a fool by your bad habit; +\q1 so you may wish that you had not been born, +\q2 and curse the day of your birth. +\q1 +\v 15 A man who is accustomed to abusive language +\q2 won’t be corrected all the days of his life. +\b +\q1 +\v 16 Two sorts of people multiply sins, +\q2 and the third will bring wrath: +\q2 a hot passion, like a burning fire, will not be quenched until it is consumed; +\q2 a fornicator in the body of his flesh will never cease until he has burned out the fire. +\q1 +\v 17 All bread is sweet to a fornicator. +\q2 He will not cease until he dies. +\q1 +\v 18 A man who goes astray from his own marriage bed +\q2 says in his heart, “Who sees me? +\q1 Darkness is around me, and the walls hide me. +\q2 No one sees me. Of whom am I afraid? +\q2 The Most High will not remember my sins.” +\q1 +\v 19 The eyes of men are his terror. +\q2 He doesn’t know that the eyes of the Lord are ten thousand times brighter than the sun, +\q2 seeing all the ways of men, +\q2 and looking into secret places. +\q1 +\v 20 All things were known to him before they were created, +\q2 and also after they were completed. +\q1 +\v 21 This man will be punished in the streets of the city. +\q2 He will be seized where he least expects it. +\b +\q1 +\v 22 So also is a wife who leaves her husband, +\q2 and produces an heir by another man. +\q1 +\v 23 For first, she was disobedient in the law of the Most High. +\q2 Second, she trespassed against her own husband. +\q2 Third, she played the adulteress in fornication, +\q2 and had children by another man. +\q1 +\v 24 She shall be brought out into the congregation. +\q2 Her punishment will extend to her children. +\q1 +\v 25 Her children will not take root. +\q2 Her branches will bear no fruit. +\q1 +\v 26 She will leave her memory for a curse. +\q2 Her reproach won’t be blotted out. +\q1 +\v 27 And those who are left behind will know that there is nothing better than the fear of the Lord, +\q2 and nothing sweeter than to heed the commandments of the Lord. +\v 28 \f + \fr 23:28 \ft Verse 28 is omitted by the best authorities.\f* +\c 24 +\q1 +\v 1 Wisdom will praise her own soul, +\q2 and will proclaim her glory in the midst of her people. +\q1 +\v 2 She will open her mouth in the congregation of the Most High, +\q2 and proclaim her glory in the presence of his power. +\q1 +\v 3 “I came out of the mouth of the Most High, +\q2 and covered the earth as a mist. +\q1 +\v 4 I lived in high places, +\q2 and my throne is in the pillar of the cloud. +\q1 +\v 5 Alone I surrounded the circuit of heaven, +\q2 and walked in the depth of the abyss. +\q1 +\v 6 In the waves of the sea, and in all the earth, +\q2 and in every people and nation, I obtained a possession. +\q1 +\v 7 With all these I sought rest. +\q2 In whose inheritance shall I lodge? +\q1 +\v 8 Then the Creator of all things gave me a command. +\q2 He who created me made my tent to rest, +\q2 and said, ‘Let your dwelling be in Jacob, +\q2 and your inheritance in Israel.’ +\q1 +\v 9 He created me from the beginning, before the ages. +\q2 For all ages, I will not cease to exist. +\q1 +\v 10 In the holy tabernacle, I ministered before him. +\q2 So I was established in Zion. +\q1 +\v 11 In the beloved city, likewise he gave me rest. +\q2 In Jerusalem was my domain. +\q1 +\v 12 I took root in a people that was honored, +\q2 even in the portion of the Lord’s own inheritance. +\b +\q1 +\v 13 I was exalted like a cedar in Lebanon, +\q2 And like a cypress tree on the mountains of Hermon. +\q1 +\v 14 I was exalted like a palm tree on the sea shore, +\q2 like rose bushes in Jericho, +\q2 and like a fair olive tree in the plain. +\q2 I was exalted like a plane tree. +\q1 +\v 15 Like cinnamon and aspalathus, I have given a scent to perfumes. +\q2 Like choice myrrh, I spread abroad a pleasant fragrance, +\q2 like\f + \fr 24:15 \ft See Exodus 30:34. \f* galbanum, onycha, stacte, +\q2 and as the smell of frankincense in the tabernacle. +\q1 +\v 16 Like the terebinth, I stretched out my branches. +\q2 My branches are glorious and graceful. +\q1 +\v 17 Like the vine, I put forth grace. +\q2 My flowers are the fruit of glory and riches. +\v 18 \f + \fr 24:18 \ft Verse 18 is omitted by the best authorities.\f* +\b +\q1 +\v 19 “Come to me, all you who desire me, +\q2 and be filled with my fruits. +\q1 +\v 20 For my memory is sweeter than honey, +\q2 and my inheritance than the honeycomb. +\q1 +\v 21 Those who eat me will be hungry for more. +\q2 Those who drink me will be thirsty for more. +\q1 +\v 22 He who obeys me will not be ashamed. +\q2 Those who work with me will not sin.” +\b +\q1 +\v 23 All these things are the book of the covenant of the Most High God, +\q2 the law which Moses commanded us for an inheritance for the assemblies of Jacob. +\v 24 \f + \fr 24:24 \ft Verse 24 is omitted by the best authorities.\f* +\q1 +\v 25 It is he who makes wisdom abundant, as Pishon, +\q2 and as Tigris in the days of first fruits. +\q1 +\v 26 He makes understanding full as the Euphrates, +\q2 and as the Jordan in the days of harvest, +\q1 +\v 27 who makes instruction shine forth as the light, +\q2 as Gihon in the days of vintage. +\q1 +\v 28 The first man didn’t know her perfectly. +\q2 In like manner, the last has not explored her. +\q1 +\v 29 For her thoughts are filled from the sea, +\q2 and her counsels from the great deep. +\b +\q1 +\v 30 I came out as a canal stream from a river, +\q2 and as an irrigation ditch into a garden. +\q1 +\v 31 I said, “I will water my garden, +\q2 and will drench my garden bed.” +\q1 Behold, my stream became a river, +\q2 and my river became a sea. +\q1 +\v 32 I will yet bring instruction to light as the morning, +\q2 and will make these things clear from far away. +\q1 +\v 33 I will continue to pour out teaching like prophecy, +\q2 and leave it to all generations. +\q1 +\v 34 See that I have not labored for myself only, +\q2 but for all those who diligently seek wisdom. +\b +\c 25 +\q1 +\v 1 I enjoy three things, +\q2 and they are beautiful before the Lord and men: +\q2 the agreement of kindred, +\q2 the friendship of neighbors, +\q2 and a woman and her husband who walk together in agreement. +\q1 +\v 2 But my soul hates three sorts of people, +\q2 and I am greatly offended at their life: +\q2 a poor man who is arrogant, +\q2 a rich man who is a liar, +\q2 and an old fool who is an adulterer. +\b +\q1 +\v 3 If you gathered nothing in your youth, +\q2 how could you find anything in your old age? +\q1 +\v 4 How beautiful a thing is judgment in the gray-haired, +\q2 and for elders to know good counsel! +\q1 +\v 5 How beautiful is the wisdom of old men, +\q2 and understanding and counsel to men who are in honor! +\q1 +\v 6 Much experience is the crown of the aged. +\q2 Their glory is the fear of the Lord. +\b +\q1 +\v 7 There are nine things that I have thought of, and in my heart counted happy, +\q2 and the tenth I will utter with my tongue: +\q2 a man who has joy with his children, +\q2 and a man who lives and sees the fall of his enemies. +\q1 +\v 8 Happy is he who dwells with a wife of understanding, +\q2 he who has not slipped with his tongue, +\q2 and he who has not served a man who is unworthy of him. +\q1 +\v 9 Happy is he who has found prudence, +\q2 and he who speaks in the ears of those who listen. +\q1 +\v 10 How great is he who has found wisdom! +\q2 Yet is there none above him who fears the Lord. +\q1 +\v 11 The fear of the Lord surpasses all things. +\q2 To whom shall he who holds it be likened? +\v 12 \f + \fr 25:12 \ft Verse 12 is omitted by the best authorities.\f* +\b +\q1 +\v 13 Any wound but a wound of the heart! +\q2 Any wickedness but the wickedness of a woman! +\q1 +\v 14 Any calamity but a calamity from those who hate me! +\q2 Any vengeance but the vengeance of enemies! +\q1 +\v 15 There is no venom worse than a snake’s venom. +\q2 There is no wrath worse than an enemy’s wrath. +\b +\q1 +\v 16 I would rather dwell with a lion and a dragon +\q2 than keep house with a wicked woman. +\q1 +\v 17 The wickedness of a woman changes her appearance, +\q2 and darkens her countenance like that of a bear. +\q1 +\v 18 Her husband will sit among his neighbors, +\q2 and when he hears it, he sighs bitterly. +\q1 +\v 19 All malice is small compared to the malice of a woman. +\q2 Let the portion of a sinner fall on her. +\q1 +\v 20 As walking up a sandy hill is to the feet of the aged, +\q2 so is a wife full of words to a quiet man. +\q1 +\v 21 Don’t be ensnared by a woman’s beauty. +\q2 Don’t desire a woman for her beauty. +\q1 +\v 22 There is anger, impudence, and great reproach +\q2 if a woman supports her husband. +\q1 +\v 23 A wicked woman is abasement of heart, +\q2 sadness of countenance, and a wounded heart. +\q1 A woman who won’t make her husband happy +\q2 is like hands that hang down, and weak knees. +\q1 +\v 24 The beginning of sin came from a woman. +\q2 Because of her, we all die. +\q1 +\v 25 Don’t give water an outlet, +\q2 and don’t give a wicked woman freedom of speech. +\q1 +\v 26 If she doesn’t go as you direct, +\q2 cut her away from your flesh.\f + \fr 25:26 \ft The remainder of this verse is omitted by the best authorities.\f* +\b +\c 26 +\q1 +\v 1 Happy is the husband of a good wife. +\q2 The number of his days will be doubled. +\q1 +\v 2 A faithful wife gives joy to her husband. +\q2 He will fulfill his years in peace. +\q1 +\v 3 A good wife is a great gift. +\q2 She will be given to those who fear the Lord. +\q1 +\v 4 Whether a man is rich or poor, +\q2 a good heart makes a cheerful face at all times. +\b +\q1 +\v 5 Of three things my heart was afraid, +\q2 and concerning the fourth\f + \fr 26:5 \ft Gr. \fqa countenance. \f* kind I made supplication: +\q2 The slander of a city, the assembly of a mob, and a false accusation. +\q2 All these are more grievous than death. +\q1 +\v 6 A grief of heart and sorrow is a woman who is jealous of another woman. +\q2 Her tongue-lashing makes it known to all. +\q1 +\v 7 A wicked woman is like a chafing yoke. +\q2 He who takes hold of her is like one who grasps a scorpion. +\q1 +\v 8 A drunken woman causes great wrath. +\q2 She will not cover her own shame. +\q1 +\v 9 The fornication of a woman is in the lifting up of her eyes; +\q2 it will be known by her eyelids. +\q1 +\v 10 Keep strict watch on a headstrong daughter, +\q2 lest she find liberty for herself, and use it. +\q1 +\v 11 Watch out for an impudent eye, +\q2 and don’t be surprised if it sins against you. +\q1 +\v 12 She will open her mouth like a thirsty traveller, +\q2 and drink from every water that is near. +\q1 She will sit down at every post, +\q2 and open her quiver to any arrow. +\b +\q1 +\v 13 The grace of a wife will delight her husband. +\q2 Her knowledge will strengthen\f + \fr 26:13 \ft or, fatten\f* his bones. +\q1 +\v 14 A silent woman is a gift of the Lord. +\q2 There is nothing worth so much as a well-instructed soul. +\q1 +\v 15 A modest woman is grace upon grace. +\q2 There are no scales that can weigh the value of a self-controlled soul. +\q1 +\v 16 As the sun when it arises in the highest places of the Lord, +\q2 so is the beauty of a good wife in her well-organized home. +\q1 +\v 17 As the lamp that shines upon the holy lampstand, +\q2 so is the beauty of the face on a well-proportioned body. +\q1 +\v 18 As the golden pillars are upon a base of silver, +\q2 so are beautiful feet with the breasts of one who is steadfast. +\v 19-27 \f + \fr 26:19-27 \ft Verses 19-27 are omitted by the best authorities. \f* +\b +\q1 +\v 28 For two things my heart is grieved, +\q2 and for the third anger comes upon me: +\q2 a warrior who suffers for poverty, +\q2 men of understanding who are counted as garbage, +\q2 and one who turns back from righteousness to sin— +\q2 the Lord will prepare him for the sword! +\b +\q1 +\v 29 It is difficult for a merchant to keep himself from wrong doing, +\q2 and for a retailer to be acquitted of sin. +\c 27 +\q1 +\v 1 Many have sinned for profit. +\q2 He who seeks to multiply wealth will turn his eye away. +\q1 +\v 2 As a nail will stick fast between the joinings of stones, +\q2 so sin will thrust itself in between buying and selling. +\q1 +\v 3 Unless a person holds on diligently to the fear of the Lord, +\q2 his house will be overthrown quickly. +\b +\q1 +\v 4 In the shaking of a sieve, the refuse remains, +\q2 so does the filth of man in his thoughts. +\q1 +\v 5 The furnace tests the potter’s vessels; +\q2 so the test of a person is in his thoughts. +\q1 +\v 6 The fruit of a tree discloses its cultivation, +\q2 so is the utterance of the thought of a person’s heart. +\q1 +\v 7 Praise no man before you hear his thoughts, +\q2 for this is how people are tested. +\b +\q1 +\v 8 If you follow righteousness, you will obtain it, +\q1 and put it on like a long robe of glory. +\q1 +\v 9 Birds will return to their own kind, +\q2 so truth will return to those who practice it. +\q1 +\v 10 The lion lies in wait for prey. +\q2 So does sin for those who do evil. +\b +\q1 +\v 11 The discourse of a godly man is always wise, +\q2 but the fool changes like the moon. +\q1 +\v 12 Limit your time among people void of understanding, +\q2 but persevere among the thoughtful. +\q1 +\v 13 The talk of fools is offensive. +\q2 Their laughter is wantonly sinful. +\q1 +\v 14 Their talk with much swearing makes hair stand upright. +\q2 Their strife makes others plug their ears. +\q1 +\v 15 The strife of the proud leads to bloodshed. +\q2 Their abuse of each other is a grievous thing to hear. +\b +\q1 +\v 16 He who reveals secrets destroys trust, +\q2 and will not find a close friend. +\q1 +\v 17 Love a friend, and keep faith with him; +\q2 but if you reveal his secrets, +\q2 you shall not follow him; +\q1 +\v 18 for as a man has destroyed his enemy, +\q2 so you have destroyed the friendship of your neighbor. +\q1 +\v 19 As a bird which you have released out of your hand, +\q2 so you have let your neighbor go, and you will not catch him again. +\q1 +\v 20 Don’t pursue him, for he has gone far away, +\q2 and has escaped like a gazelle out of the snare. +\q1 +\v 21 For a wound may be bound up, and after abuse there may be reconciliation; +\q2 but he who reveals secrets is without hope. +\b +\q1 +\v 22 One who winks the eye contrives evil things; +\q2 and those who know him will keep their distance. +\q1 +\v 23 When you are present, he will speak sweetly, +\q2 and will admire your words; +\q2 but afterward he will twist his speech +\q2 and set a trap in your words. +\q1 +\v 24 I have hated many things, but nothing like him. +\q2 The Lord will hate him. +\b +\q1 +\v 25 One who casts a stone straight up casts it on his own head. +\q2 A deceitful blow opens wounds. +\q1 +\v 26 He who digs a pit will fall into it. +\q2 He who sets a snare will be caught in it. +\q1 +\v 27 He who does evil things, they will roll back upon him, +\q2 and he will not know where they came from. +\q1 +\v 28 Mockery and reproach are from the arrogant. +\q2 Vengeance lies in wait for them like a lion. +\q1 +\v 29 Those who rejoice at the fall of the godly will be caught in a snare. +\q2 Anguish will consume them before they die. +\b +\q1 +\v 30 Wrath and anger, these also are abominations. +\q2 A sinner will possess them. +\c 28 +\q1 +\v 1 He who takes vengeance will find vengeance from the Lord, +\q2 and he will surely make his sins firm. +\q1 +\v 2 Forgive your neighbor the hurt that he has done, +\q2 and then your sins will be pardoned when you pray. +\q1 +\v 3 Does anyone harbor anger against another +\q2 and expect healing from the Lord? +\q1 +\v 4 Upon a man like himself he has no mercy, +\q2 and does he make supplication for his own sins? +\q1 +\v 5 He himself, being flesh, nourishes wrath. +\q2 Who will make atonement for his sins? +\q1 +\v 6 Remember your last end, and stop enmity. +\q2 Remember corruption and death, and be true to the commandments. +\q1 +\v 7 Remember the commandments, and don’t be angry with your neighbor. +\q2 Remember the covenant of the Highest, and overlook ignorance. +\b +\q1 +\v 8 Abstain from strife, and you will diminish your sins, +\q2 for a passionate man will kindle strife. +\q1 +\v 9 A man who is a sinner will trouble friends +\q2 and sow discord among those who are at peace. +\q1 +\v 10 As is the fuel of the fire, so it will burn; +\q2 and as the stoutness of the strife is, so it will burn. +\q1 As is the strength of the man, so will be his wrath; +\q2 and as is his wealth, so he will exalt his anger. +\q1 +\v 11 A contention begun in haste kindles a fire; +\q2 and hasty fighting sheds blood. +\b +\q1 +\v 12 If you blow on a spark, it will burn; +\q2 and if you spit upon it, it will be quenched. +\q2 Both of these come out of your mouth. +\b +\q1 +\v 13 Curse the whisperer and double-tongued, +\q2 for he has destroyed many who were at peace. +\q1 +\v 14 A slanderer has shaken many, +\q2 and dispersed them from nation to nation. +\q1 It has pulled down strong cities +\q2 and overthrown the houses of great men. +\q1 +\v 15 A slanderer has cast out brave women +\q2 and deprived them of their labors. +\q1 +\v 16 He who listens to it will not find rest, +\q2 nor will he live quietly. +\q1 +\v 17 The stroke of a whip makes a mark in the flesh, +\q2 but the stroke of a tongue will break bones. +\q1 +\v 18 Many have fallen by the edge of the sword, +\q2 yet not so many as those who have fallen because of the tongue. +\q1 +\v 19 Happy is he who is sheltered from it, +\q2 who has not passed through its wrath, +\q2 who has not drawn its yoke, +\q2 and has not been bound with its bands. +\q1 +\v 20 For its yoke is a yoke of iron, +\q2 and its bands are bands of brass. +\q1 +\v 21 Its death is an evil death, +\q2 and Hades is better than it. +\q1 +\v 22 It will not have rule over godly men. +\q2 They will not be burned in its flame. +\q1 +\v 23 Those who forsake the Lord will fall into it. +\q2 It will burn among them, and won’t be quenched. +\q1 It will be sent against them like a lion. +\q2 It will destroy them like a leopard. +\q1 +\v 24 As you hedge your possession about with thorns, +\q2 and secure your silver and your gold, +\q1 +\v 25 so make a balance and a weight for your words, +\q2 and make a door and a bar for your mouth. +\q1 +\v 26 Take heed lest you slip with it, +\q2 lest you fall before one who lies in wait. +\b +\c 29 +\q1 +\v 1 He who shows mercy will lend to his neighbor. +\q2 He who strengthens him with his hand keeps the commandments. +\q1 +\v 2 Lend to your neighbor in time of his need. +\q2 Repay your neighbor on time. +\q1 +\v 3 Confirm your word, and keep faith with him; +\q2 and at all seasons you will find what you need. +\q1 +\v 4 Many have considered a loan to be a windfall, +\q2 and have given trouble to those who helped them. +\q1 +\v 5 Until he has received, he will kiss a man’s hands. +\q2 For his neighbor’s money he will speak submissively. +\q1 Then when payment is due, he will prolong the time, +\q2 return excuses, and complain about the season. +\q1 +\v 6 If he prevails, the creditor will hardly receive half; +\q2 and he will count it as a windfall. +\q1 If not, he has deprived him of his money, +\q2 and he has gotten him for an enemy without cause. +\q1 He will pay him with cursing and railing. +\q2 Instead of honor, he will pay him disgrace. +\q1 +\v 7 Many on account of fraud have turned away. +\q2 They are afraid of being defrauded for nothing. +\q1 +\v 8 However be patient with a man in poor estate. +\q2 Don’t keep him waiting for your alms. +\q1 +\v 9 Help a poor man for the commandment’s sake. +\q2 According to his need don’t send him empty away. +\q1 +\v 10 Lose your money for a brother and a friend. +\q2 Don’t let it rust under a stone and be lost. +\q1 +\v 11 Allocate your treasure according to the commandments of the Most High +\q2 and it will profit you more than gold. +\q1 +\v 12 Store up almsgiving in your store-chambers +\q2 and it will deliver you out of all affliction. +\q1 +\v 13 It will fight for you against your enemy +\q2 better than a mighty shield and a ponderous spear. +\b +\q1 +\v 14 A good man will be surety for his neighbor. +\q2 He who has lost shame will fail him. +\q1 +\v 15 Don’t forget the kindness of your guarantor, +\q2 for he has given his life for you. +\q1 +\v 16 A sinner will waste the property of his guarantor. +\q2 +\v 17 He who is thankless will fail him who delivered him. +\q1 +\v 18 Being surety has undone many who were prospering +\q2 and shaken them as a wave of the sea. +\q1 It has driven mighty men from their homes. +\q2 They wandered among foreign nations. +\q1 +\v 19 A sinner who falls into suretiship and undertakes contracts for work +\q2 will fall into lawsuits. +\q1 +\v 20 Help your neighbor according to your power, +\q2 and be careful not to fall yourself. +\b +\q1 +\v 21 The essentials of life are water, bread, +\q2 a garment, and a house for privacy. +\q1 +\v 22 Better is the life of a poor man under a shelter of logs +\q2 than sumptuous fare in another man’s house. +\q1 +\v 23 With little or with much, be well satisfied.\f + \fr 29:23 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 24 It is a miserable life to go from house to house. +\q2 Where you are a guest, you dare not open your mouth. +\q1 +\v 25 You will entertain, serve drinks, and have no thanks. +\q2 In addition to this, you will hear bitter words. +\q1 +\v 26 “Come here, you sojourner, set a table, +\q2 and if you have anything in your hand, feed me with it.” +\q1 +\v 27 “Leave, you sojourner, for an honored guest is here. +\q2 My brother has come to be my guest. I need my house.” +\q1 +\v 28 These things are grievous to a man of understanding: +\q2 The scolding about lodging and the insults of creditors. +\b +\c 30 +\q1 +\v 1 He who loves his son will continue to lay stripes upon him, +\q2 that he may have joy from him in the end. +\q1 +\v 2 He who chastises his son will have profit from him, +\q2 and will brag about him among his acquaintances. +\q1 +\v 3 He who teaches his son will provoke his enemy to jealousy. +\q2 Before friends, he will rejoice in him. +\q1 +\v 4 His father dies, and is as though he had not died; +\q2 for he has left one behind him like himself. +\q1 +\v 5 In his life, he saw his son and rejoiced. +\q2 When he died, it was without regret. +\q1 +\v 6 He left behind him an avenger against his enemies, +\q2 and one to repay kindness to his friends. +\b +\q1 +\v 7 He who makes too much of his son will bind up his wounds. +\q2 His heart will be troubled at every cry. +\q1 +\v 8 An unbroken horse becomes stubborn. +\q2 An unrestrained son becomes headstrong. +\q1 +\v 9 Pamper your child, and he will make you afraid. +\q2 Play with him, and he will grieve you. +\q1 +\v 10 Don’t laugh with him, lest you have sorrow with him, +\q2 and you gnash your teeth in the end. +\q1 +\v 11 Give him no liberty in his youth, +\q2 and don’t ignore his follies.\f + \fr 30:11 \ft This line and the previous two lines are absent from some older MSS.\f* +\q1 +\v 12 \f + \fr 30:12 \ft These three lines are absent from the oldest MSS.\f*Bow down his neck in his youth, +\q2 and beat him on the sides while he is a child, +\q2 lest he become stubborn, and be disobedient to you, +\q2 and there be sorrow to your soul.\f + \fr 30:12 \ft These three lines are absent from the oldest MSS.\f* +\q1 +\v 13 Chastise your son, and give him work, +\q2 lest his shameless behavior be an offense to you. +\b +\q1 +\v 14 Better is a poor man who is healthy and fit, +\q2 than a rich man who is afflicted in his body. +\q1 +\v 15 Health and fitness are better than all gold, +\q2 and a strong body better than wealth without measure. +\q1 +\v 16 There is no wealth better than health of body. +\q2 There is no gladness above the joy of the heart. +\q1 +\v 17 Death is better than a bitter life, +\q2 and eternal rest than a continual sickness. +\b +\q1 +\v 18 Good things poured out upon a mouth that is closed +\q2 are like food offerings laid upon a grave. +\q1 +\v 19 What does an offering profit an idol? +\q2 For it can’t eat or smell. +\q1 So is he who is punished by the Lord, +\q2 +\v 20 seeing with his eyes and groaning, +\q2 like a eunuch embracing a virgin and groaning. +\b +\q1 +\v 21 Don’t give your soul to sorrow. +\q2 Don’t afflict yourself deliberately. +\q1 +\v 22 Gladness of heart is the life of a man. +\q2 Cheerfulness of a man lengthens his days. +\q1 +\v 23 Love your own soul, and comfort your heart. +\q2 Remove sorrow far from you, +\q2 for sorrow has destroyed many, +\q2 and there is no profit in it. +\q1 +\v 24 Envy and wrath shorten life. +\q2 Anxiety brings old age before its time. +\q1 +\v 25 Those who are cheerful and merry +\q2 will benefit from their food. +\c 31 +\q1 +\v 1 Wakefulness that comes from riches consumes the flesh, +\q2 and anxiety about it takes away sleep. +\q1 +\v 2 Wakeful anxiety will crave slumber. +\q2 In a severe disease, sleep will be broken. +\b +\q1 +\v 3 A rich man toils in gathering money together. +\q2 When he rests, he is filled with his good things. +\q1 +\v 4 A poor man toils in lack of substance. +\q2 When he rests, he becomes needy. +\q1 +\v 5 He who loves gold won’t be justified. +\q2 He who follows destruction will himself have his fill of it. +\q1 +\v 6 Many have been given over to ruin for the sake of gold. +\q2 Their destruction meets them face to face. +\q1 +\v 7 It is a stumbling block to those who sacrifice to it. +\q2 Every fool will be taken by it. +\q1 +\v 8 Blessed is the rich person who is found blameless, +\q2 and who doesn’t go after gold. +\q1 +\v 9 Who is he, that we may call him blessed? +\q2 For he has done wonderful things among his people. +\q1 +\v 10 Who has been tried by it, and found perfect? +\q2 Then let him boast. +\q1 Who has had the power to transgress, and has not transgressed? +\q2 And to do evil, and has not done it? +\q1 +\v 11 His prosperity will be made sure. +\q2 The congregation will proclaim his alms. +\b +\q1 +\v 12 Do you sit at a great table? Don’t be greedy there. +\q2 Don’t say, “There is a lot of food on it!” +\q1 +\v 13 Remember that a greedy eye is a wicked thing. +\q2 What has been created more greedy than an eye? +\q2 Therefore it sheds tears from every face. +\q1 +\v 14 Don’t stretch your hand wherever it looks. +\q2 Don’t thrust yourself with it into the dish. +\q1 +\v 15 Consider your neighbor’s feelings by your own. +\q2 Be discreet in every point. +\q1 +\v 16 Eat like a human being those things which are set before you. +\q2 Don’t eat greedily, lest you be hated. +\q1 +\v 17 Be first to stop for manners’ sake. +\q2 Don’t be insatiable, lest you offend. +\q1 +\v 18 And if you sit among many, +\q2 Don’t reach out your hand before them. +\b +\q1 +\v 19 How sufficient to a well-mannered man is a very little. +\q2 He doesn’t breathe heavily in his bed. +\q1 +\v 20 Healthy sleep comes from moderate eating. +\q2 He rises early, and his wits are with him. +\q1 The pain of wakefulness, colic, +\q2 and griping are with an insatiable man. +\q1 +\v 21 And if you have been forced to eat, +\q2 rise up in the middle of it, and you shall have rest. +\q1 +\v 22 Hear me, my son, and don’t despise me, +\q2 and in the end you will appreciate my words. +\q1 In all your works be skillful, +\q2 and no disease will come to you. +\b +\q1 +\v 23 People bless him who is liberal with his food. +\q2 The testimony of his excellence will be believed. +\q1 +\v 24 The city will murmur at him who is a stingy with his food. +\q2 The testimony of his stinginess will be accurate. +\b +\q1 +\v 25 Don’t show yourself valiant in wine, +\q2 for wine has destroyed many. +\q1 +\v 26 The furnace tests the temper of steel by dipping; +\q2 so does wine test hearts in the quarreling of the proud. +\q1 +\v 27 Wine is as good as life to men, +\q2 if you drink it in moderation. +\q1 What life is there to a man who is without wine? +\q2 It has been created to make men glad. +\q1 +\v 28 Wine drunk in season and in moderation +\q2 is joy of heart and gladness of soul: +\q1 +\v 29 Wine drunk excessively is bitterness of soul, +\q2 with provocation and conflict. +\q1 +\v 30 Drunkenness increases the rage of a fool to his hurt. +\q2 It diminishes strength and adds wounds. +\b +\q1 +\v 31 Don’t rebuke your neighbor at a banquet of wine. +\q2 Don’t despise him in his mirth. +\q1 Don’t speak a word of reproach to him. +\q2 Don’t distress him by making demands of him. +\c 32 +\q1 +\v 1 Have they made you ruler of a feast? +\q2 Don’t be lifted up. +\q2 Be among them as one of them. +\q2 Take care of them first, and then sit down. +\q1 +\v 2 And when you have done all your duties, take your place, +\q2 that you may be gladdened on their account, +\q2 and receive a wreath for your good service. +\b +\q1 +\v 3 Speak, you who are older, for it’s your right, but with sound knowledge; +\q2 and don’t interrupt the music. +\q1 +\v 4 Don’t pour out talk where there is a performance of music. +\q2 Don’t display your wisdom at the wrong time. +\q1 +\v 5 As a ruby signet in a setting of gold, +\q2 so is a music concert at a wine banquet. +\q1 +\v 6 As an emerald signet in a work of gold, +\q2 so is musical melody with pleasant wine. +\b +\q1 +\v 7 Speak, young man, if you are obliged to, +\q2 but no more than twice, and only if asked. +\q1 +\v 8 Sum up your speech, many things in few words. +\q2 Be as one who knows and yet holds his tongue. +\q1 +\v 9 When among great men, don’t behave as their equal. +\q2 When another is speaking, don’t babble. +\b +\q1 +\v 10 Lightning speeds before thunder. +\q2 Approval goes before one who is modest. +\q1 +\v 11 Rise up in good time, and don’t be last. +\q2 Go home quickly and don’t loiter +\q1 +\v 12 Amuse yourself there and do what is in your heart. +\q2 Don’t sin by proud speech. +\q1 +\v 13 For these things bless your Maker, +\q2 who gives you to drink freely of his good things. +\b +\q1 +\v 14 He who fears the Lord will receive discipline. +\q2 Those who seek him early will find favor. +\q1 +\v 15 He who seeks the law shall be filled with it, +\q2 but the hypocrite will stumble at it. +\q1 +\v 16 Those who fear the Lord will find true judgment, +\q2 and will kindle righteous acts like a light. +\q1 +\v 17 A sinful man shuns reproof, +\q2 and will find a judgment according to his will. +\b +\q1 +\v 18 A sensible person won’t neglect a thought. +\q2 An insolent and proud man won’t crouch in fear, +\q2 even after he has done a thing by himself without counsel. +\q1 +\v 19 Do nothing without counsel, +\q2 but when you have acted, don’t regret it. +\q1 +\v 20 Don’t go in a way of conflict. +\q2 Don’t stumble in stony places. +\q1 +\v 21 Don’t be overconfident on a smooth road. +\q2 +\v 22 Beware of your own children. +\q1 +\v 23 In every work guard your own soul, +\q2 for this is the keeping of the commandments. +\b +\q1 +\v 24 He who believes the law gives heed to the commandment. +\q2 He who trusts in the Lord will suffer no loss. +\c 33 +\q1 +\v 1 No evil will happen to him who fears the Lord, +\q2 but in trials once and again he will deliver him. +\q1 +\v 2 A wise man will not hate the law, +\q2 but he who is a hypocrite about it is like a boat in a storm. +\q1 +\v 3 A man of understanding will put his trust in the law. +\q2 And the law is faithful to him, as when one asks a divine oracle. +\b +\q1 +\v 4 Prepare your speech, and so you will be heard. +\q2 Bind up instruction, and make your answer. +\q1 +\v 5 The heart of a fool is like a cartwheel. +\q2 His thoughts are like a rolling axle. +\q1 +\v 6 A stallion horse is like a mocking friend. +\q2 He neighs under every one who sits upon him. +\b +\q1 +\v 7 Why does one day excel another, +\q2 when all the light of every day in the year is from the sun? +\q1 +\v 8 They were distinguished by the Lord’s knowledge, +\q2 and he varied seasons and feasts. +\q1 +\v 9 Some of them he exalted and hallowed, +\q2 and some of them he has made ordinary days. +\q1 +\v 10 And all men are from the ground. +\q2 Adam was created from dust. +\q1 +\v 11 In the abundance of his knowledge the Lord distinguished them, +\q2 and made their ways different. +\q1 +\v 12 Some of them he blessed and exalted, +\q2 and some of them he made holy and brought near to himself. +\q1 Some of them he cursed and brought low, +\q2 and overthrew them from their place. +\q1 +\v 13 As the clay of the potter in his hand, +\q2 all his ways are according to his good pleasure, +\q1 so men are in the hand of him who made them, +\q2 to render to them according to his judgment. +\b +\q1 +\v 14 Good is the opposite of evil, +\q2 and life is the opposite of death; +\q2 so\f + \fr 33:14 \ft A line of this verse is here omitted by the best authorities. \f* the sinner is the opposite of the godly. +\q1 +\v 15 Look upon all the works of the Most High like this, +\q2 they come in pairs, one against another. +\b +\q1 +\v 16 I was the last on watch, +\q2 like one who gleans after the grape gatherers. +\q1 +\v 17 By the Lord’s blessing I arrived before them, +\q2 and filled my winepress like one who gathers grapes. +\q1 +\v 18 Consider that I labored not for myself alone, +\q2 but for all those who seek instruction. +\q1 +\v 19 Hear me, you great men of the people, +\q2 and listen with your ears, you rulers of the congregation. +\b +\q1 +\v 20 To son and wife, to brother and friend, +\q2 don’t give power over yourself while you live, +\q2 and don’t give your goods to another, +\q2 lest you regret it and must ask for them. +\q1 +\v 21 While you still live and breath is in you, +\q2 don’t give yourself over to anybody. +\q1 +\v 22 For it is better that your children should ask from you +\q2 than that you should look to the hand of your children. +\q1 +\v 23 Excel in all your works. +\q2 Don’t bring a stain on your honor. +\q1 +\v 24 In the day that you end the days of your life, +\q2 in the time of death, distribute your inheritance. +\b +\q1 +\v 25 Fodder, a stick, and burdens are for a donkey. +\q2 Bread, discipline, and work are for a servant. +\q1 +\v 26 Set your slave to work, and you will find rest. +\q2 Leave his hands idle, and he will seek liberty. +\q1 +\v 27 Yoke and thong will bow the neck. +\q2 For an evil slave there are racks and tortures. +\q1 +\v 28 Send him to labor, that he not be idle, +\q2 for idleness teaches much mischief. +\q1 +\v 29 Set him to work, as is fit for him. +\q2 If he doesn’t obey, make his fetters heavy. +\q1 +\v 30 Don’t be excessive toward any. +\q2 Do nothing unjust. +\b +\q1 +\v 31 If you have a slave, treat him like yourself, +\q2 because you have bought him with blood. +\q1 +\v 32 If you have a slave, treat him like yourself. +\q2 For like your own soul, you will need him. +\q1 If you treat him ill, and he departs and runs away, +\q2 +\v 33 which way will you go to seek him? +\b +\c 34 +\q1 +\v 1 Vain and false hopes are for a man void of understanding. +\q2 Dreams give wings to fools. +\q1 +\v 2 As one who grasps at a shadow and follows after the wind, +\q2 so is he who sets his mind on dreams. +\q1 +\v 3 The vision of dreams is a reflection, +\q2 the likeness of a face near a face. +\q1 +\v 4 From an unclean thing what can be cleansed? +\q2 From that which is false what can be true? +\q1 +\v 5 Divinations, and soothsayings, and dreams, are vain. +\q2 The heart has fantasies like a woman in labor. +\q1 +\v 6 If they are not sent in a visitation from the Most High, +\q2 don’t give your heart to them. +\q1 +\v 7 For dreams have led many astray. +\q2 They have failed by putting their hope in them. +\q1 +\v 8 Without lying the law will be fulfilled. +\q2 Wisdom is complete in a faithful mouth. +\b +\q1 +\v 9 A well-instructed man knows many things. +\q2 He who has much experience will declare understanding. +\q1 +\v 10 He who has no experience knows few things. +\q2 But he who has traveled increases cleverness. +\q1 +\v 11 I have seen many things in my travels. +\q2 My understanding is more than my words. +\q1 +\v 12 I was often in danger even to death. +\q2 I was preserved because of these experiences. +\q1 +\v 13 The spirit of those who fear the Lord will live, +\q2 for their hope is in him who saves them. +\q1 +\v 14 Whoever fears the Lord won’t be afraid, and won’t be a coward, +\q2 for he is his hope. +\q1 +\v 15 Blessed is the soul of him who fears the Lord. +\q2 To whom does he give heed? Who is his support? +\q1 +\v 16 The eyes of the Lord are on those who love him, +\q2 a mighty protection and strong support, +\q2 a cover from the hot blast, a shade from the noonday sun, +\q2 a guard from stumbling, and a help from falling. +\q1 +\v 17 He raises up the soul, and enlightens the eyes. +\q2 He gives health, life, and blessing. +\b +\q1 +\v 18 He who sacrifices a thing wrongfully gotten, his offering is made in mockery. +\q2 The mockeries of wicked men are not acceptable. +\q1 +\v 19 The Most High has no pleasure in the offerings of the ungodly, +\q2 Neither is he pacified for sins by the multitude of sacrifices. +\q1 +\v 20 Like one who kills a son before his father’s eyes +\q2 is he who brings a sacrifice from the goods of the poor. +\q1 +\v 21 The bread of the needy is the life of the poor. +\q2 He who deprives him of it is a man of blood. +\q1 +\v 22 Like one who murders his neighbor is he who takes away his living. +\q2 Like a shedder of blood is he who deprives a hireling of his hire. +\b +\q1 +\v 23 When one builds, and another pulls down, +\q2 what profit do they have but toil? +\q1 +\v 24 When one prays, and another curses, +\q2 whose voice will the Lord listen to? +\q1 +\v 25 He who washes himself after touching a dead body, and touches it again, +\q2 what does he gain by his washing? +\q1 +\v 26 Even so a man fasting for his sins, +\q2 and going again, and doing the same, +\q2 who will listen to his prayer? +\q2 What profit does he have in his humiliation? +\b +\c 35 +\q1 +\v 1 He who keeps the law multiplies offerings. +\q2 He who heeds the commandments sacrifices a peace offering. +\q1 +\v 2 He who returns a kindness offers fine flour. +\q2 He who gives alms sacrifices a thank offering. +\q1 +\v 3 To depart from wickedness pleases the Lord. +\q2 To depart from unrighteousness is an atoning sacrifice. +\q1 +\v 4 See that you don’t appear in the presence of the Lord empty. +\q2 +\v 5 For all these things are done because of the commandment. +\q1 +\v 6 The offering of the righteous enriches the altar. +\q2 The sweet fragrance of it is before the Most High. +\q1 +\v 7 The sacrifice of a righteous man is acceptable. +\q2 It won’t be forgotten. +\q1 +\v 8 Glorify the Lord with generosity. +\q2 Don’t reduce the first fruits of your hands. +\q1 +\v 9 In every gift show a cheerful countenance, +\q1 And dedicate your tithe with gladness. +\q1 +\v 10 Give to the Most High according as he has given. +\q2 As your hand has found, give generously. +\q1 +\v 11 For the Lord repays, +\q2 and he will repay you sevenfold. +\b +\q1 +\v 12 Don’t plan to bribe him with gifts, for he will not receive them. +\q2 Don’t set your mind on an unrighteous sacrifice, +\q2 For the Lord is the judge, +\q2 and with him is no respect of persons. +\q1 +\v 13 He won’t accept any person against a poor man. +\q2 He will listen to the prayer of him who is wronged. +\q1 +\v 14 He will in no way despise the supplication of the fatherless +\q2 or the widow, when she pours out her tale. +\q1 +\v 15 Don’t the tears of the widow run down her cheek? +\q2 Isn’t her cry against him who has caused them to fall? +\q1 +\v 16 He who serves God according to his good pleasure will be accepted. +\q2 His supplication will reach to the clouds. +\q1 +\v 17 The prayer of the humble pierces the clouds. +\q2 until it comes near, he will not be comforted. +\q1 He won’t depart until the Most High visits +\q2 and he judges righteously and executes judgment. +\q1 +\v 18 And the Lord will not be slack, neither will he be patient toward them, +\q2 until he has crushed the loins of the unmerciful. +\q1 He will repay vengeance to the heathen +\q2 until he has taken away the multitude of the arrogant +\q2 and broken in pieces the sceptres of the unrighteous, +\q2 +\v 19 until he has rendered to every man according to his deeds, +\q2 and repaid the works of men according to their plans, +\q2 until he has judged the cause of his people, +\q2 and he will make them rejoice in his mercy. +\q1 +\v 20 Mercy is as welcome in the time of his affliction, +\q2 as clouds of rain in the time of drought. +\b +\c 36 +\q1 +\v 1 Have mercy upon us, O Lord the God of all, and look at us with favor; +\q2 +\v 2 and send your fear upon all the nations.\f + \fr 36:2 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 3 Lift up your hand against the foreign nations +\q2 and let them see your mighty power. +\q1 +\v 4 As you showed your holiness in us before them, +\q2 so be magnified in them before us. +\q1 +\v 5 Let them know you, as we also have known you, +\q2 that there is no God but only you, O God. +\q1 +\v 6 Show new signs, and work various wonders. +\q2 Glorify your hand and your right arm.\f + \fr 36:6 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 7 Raise up indignation and pour out wrath. +\q2 Take away the adversary and destroy the enemy. +\q1 +\v 8 Hasten the time and remember your oath. +\q2 Let them declare your mighty works. +\q1 +\v 9 Let him who escapes be devoured by raging fire. +\q2 May those who harm your people find destruction. +\q1 +\v 10 Crush the heads of the rulers of the enemies +\q2 who say, “There is no one but ourselves.” +\q1 +\v 11 Gather all the tribes of Jacob together, +\q2 and\f + \fr 36:11 \ft The ancient authorities read \fqa I took them for my inheritance: \ft but the Greek text is here very confused. \f* take them for your inheritance, as from the beginning. +\q1 +\v 12 O Lord, have mercy upon the people that is called by your name, +\q2 and upon Israel, whom you likened to a firstborn. +\q1 +\v 13 Have compassion upon the city of your sanctuary, +\q2 Jerusalem, the place of your rest. +\q1 +\v 14 Fill Zion. Exalt your oracles +\q2 and fill your people with your glory. +\q1 +\v 15 Give testimony to those who were your creatures in the beginning, +\q2 and fulfill the prophecies that have been spoken in your name. +\q1 +\v 16 Reward those who wait for you, +\q2 and men will put their trust in your prophets. +\q1 +\v 17 Listen, O Lord, to the prayer of your servants, +\q2 according to the blessing of Aaron concerning your people; +\q2 and all those who are on the earth will know +\q2 that you are the Lord, the\f + \fr 36:17 \ft Gr. \fqa God of the ages.\f* eternal God. +\b +\q1 +\v 18 The belly will eat any food, +\q2 but one food is better than another. +\q1 +\v 19 The mouth tastes meats taken in hunting, +\q2 so does an understanding heart detect false speech. +\q1 +\v 20 A contrary heart will cause heaviness. +\q2 A man of experience will pay him back. +\q1 +\v 21 A woman will receive any man, +\q2 but one daughter is better than another. +\q1 +\v 22 The beauty of a woman cheers the countenance. +\q2 A man desires nothing more. +\q1 +\v 23 If kindness and humility are on her tongue, +\q2 her husband is not like other sons of men. +\q1 +\v 24 He who gets a wife gets his richest treasure, +\q2 a help meet for him and a pillar of support. +\q1 +\v 25 Where no hedge is, the property will be plundered. +\q2 He who has no wife will mourn as he wanders. +\q1 +\v 26 For who would trust a nimble robber who skips from city to city? +\q2 Even so, who would trust a man who has no nest, and lodges wherever he finds himself at nightfall? +\b +\c 37 +\q1 +\v 1 Every friend will say, “I also am his friend”; +\q2 but there is a friend which is only a friend in name. +\q1 +\v 2 Isn’t there a grief in it even to death +\q2 when a companion and friend is turned into an enemy? +\q1 +\v 3 O wicked imagination, why were you formed +\q2 to cover the dry land with deceit? +\q1 +\v 4 There is a companion who rejoices in the gladness of a friend, +\q2 but in time of affliction will be against him. +\q1 +\v 5 There is a companion who for the belly’s sake labors with his friend, +\q2 yet in the face of battle will carry his buckler. +\q1 +\v 6 Don’t forget a friend in your soul. +\q2 Don’t be unmindful of him in your riches. +\b +\q1 +\v 7 Every counselor extols counsel, +\q2 but some give counsel in their own interest. +\q1 +\v 8 Let your soul beware of a counselor, +\q2 and know in advance what is his interest +\q2 (for he will take counsel for himself), +\q2 lest he cast the lot against you, +\q2 +\v 9 and say to you, “Your way is good.” +\q2 Then he will stand near you, to see what will happen to you. +\q1 +\v 10 Don’t take counsel with one who looks askance at you. +\q2 Hide your counsel from those who are jealous of you. +\q1 +\v 11 Don’t consult with a woman about her rival, +\q2 with a coward about war, +\q2 with a merchant about business, +\q2 with a buyer about selling, +\q2 with an envious man about thankfulness, +\q2 with an unmerciful man about kindliness, +\q2 with a sluggard about any kind of work, +\q2 with a hireling in your house about finishing his work, +\q2 or with an idle servant about much business. +\q2 Pay no attention to these in any matter of counsel. +\q1 +\v 12 But rather be continually with a godly man, +\q2 whom you know to be a keeper of the commandments, +\q2 who in his soul is as your own soul, +\q2 and who will grieve with you, if you fail. +\q1 +\v 13 Make the counsel of your heart stand, +\q2 for there is no one more faithful to you than it. +\q1 +\v 14 For a man’s soul is sometimes inclined to inform him +\q2 better than seven watchmen who sit on high on a watch-tower. +\q1 +\v 15 Above all this ask the Most High +\q2 that he may direct your way in truth. +\b +\q1 +\v 16 Let reason be the beginning of every work. +\q2 Let counsel go before every action. +\q1 +\v 17 As a token of the changing of the heart, +\q2 +\v 18 four kinds of things rise up: +\q2 good and evil, life and death. +\q2 That which rules over them continually is the tongue. +\q1 +\v 19 There is one who is clever and the instructor of many, +\q2 and yet is unprofitable to his own soul. +\q1 +\v 20 There is one who is subtle in words, and is hated. +\q2 He will be destitute of all food. +\q1 +\v 21 For grace was not given to him from the Lord, +\q2 because he is deprived of all wisdom. +\q1 +\v 22 There is one who is wise to his own soul; +\q2 and the fruits of his understanding are trustworthy in the mouth. +\q1 +\v 23 A wise man will instruct his own people. +\q2 The fruits of his understanding are trustworthy. +\q1 +\v 24 A wise man will be filled with blessing. +\q2 All those who see him will call him happy. +\q1 +\v 25 The life of a man is counted by days. +\q2 The days of Israel are innumerable. +\q1 +\v 26 The wise man will inherit confidence among his people. +\q2 His name will live forever. +\b +\q1 +\v 27 My son, test your soul in your life. +\q2 See what is evil for it, and don’t give in to it. +\q1 +\v 28 For not all things are profitable for all men. +\q2 Not every soul has pleasure in everything. +\q1 +\v 29 Don’t be insatiable in any luxury. +\q2 Don’t be greedy in the things that you eat. +\q1 +\v 30 For overeating brings disease, +\q2 and gluttony causes nausea. +\q1 +\v 31 Because of gluttony, many have perished, +\q2 but he who takes heed shall prolong his life. +\b +\c 38 +\q1 +\v 1 Honor a physician according to your need with the honors due to him, +\q2 for truly the Lord has created him. +\q1 +\v 2 For healing comes from the Most High, +\q2 and he shall receive a gift from the king. +\q1 +\v 3 The skill of the physician will lift up his head. +\q2 He will be admired in the sight of great men. +\q1 +\v 4 The Lord created medicines out of the earth. +\q2 A prudent man will not despise them. +\q1 +\v 5 Wasn’t water made sweet with wood, +\q3 that its power might be known? +\q1 +\v 6 He gave men skill +\q2 that he might be glorified in his marvelous works. +\q1 +\v 7 With them he heals +\q2 and takes away pain. +\q1 +\v 8 With these, the pharmacist makes a mixture. +\q2 God’s works won’t be brought to an end. +\q2 From him, peace is upon the face of the earth. +\b +\q1 +\v 9 My son, in your sickness don’t be negligent, +\q2 but pray to the Lord, and he will heal you. +\q1 +\v 10 Put away wrong doing, and direct your hands in righteousness. +\q2 Cleanse your heart from all sin. +\q1 +\v 11 Give a sweet savor and a memorial of fine flour, +\q2 and pour oil on your offering, according to your means. +\q1 +\v 12 Then give place to the physician, for truly the Lord has created him. +\q2 Don’t let him leave you, for you need him. +\q1 +\v 13 There is a time when in recovery is in their hands. +\q2 +\v 14 For they also shall ask the Lord +\q2 to prosper them in diagnosis and in healing for the maintenance of life. +\q1 +\v 15 He who sins before his Maker, +\q2 let him fall into the hands of the physician. +\b +\q1 +\v 16 My son, let your tears fall over the dead, +\q2 and as one who suffers grievously, begin lamentation. +\q2 Wind up his body with due honor. +\q2 Don’t neglect his burial. +\q1 +\v 17 Make bitter weeping and make passionate wailing. +\q2 Let your mourning be according to his merit, +\q2 for one day or two, lest you be spoken evil of; +\q2 and so be comforted for your sorrow. +\q1 +\v 18 For from sorrow comes death. +\q2 Sorrow of heart saps one’s strength. +\q1 +\v 19 In calamity, sorrow also remains. +\q2 A poor man’s life is grievous to the heart. +\q1 +\v 20 Don’t give your heart to sorrow. +\q2 Put it away, remembering the end. +\q1 +\v 21 Don’t forget it, for there is no returning again. +\q2 You do him no good, and you would harm yourself. +\q1 +\v 22 Remember his end, for so also will yours be: +\q2 yesterday for me, and today for you. +\q1 +\v 23 When the dead is at rest, let his remembrance rest. +\q2 Be comforted for him when his spirit departs from him. +\b +\q1 +\v 24 The wisdom of the scribe comes by the opportunity of leisure. +\q2 He who has little business can become wise. +\q1 +\v 25 How could he become wise who holds the plow, +\q2 who glories in the shaft of the goad, +\q2 who drives oxen and is occupied in their labors, +\q2 and who mostly talks about bulls? +\q1 +\v 26 He will set his heart upon turning his furrows. +\q2 His lack of sleep is to give his heifers their fodder. +\q1 +\v 27 So is every craftsman and master artisan +\q2 who passes his time by night as by day, +\q2 those who cut engravings of signets. +\q1 His diligence is to make great variety. +\q2 He sets his heart to preserve likeness in his portraiture, +\q2 and is careful to finish his work. +\q1 +\v 28 So too is the smith sitting by the anvil +\q2 and considering the unwrought iron. +\q1 The smoke of the fire will waste his flesh. +\q2 He toils in the heat of the furnace. +\q1 The noise of the hammer deafens his ear. +\q2 His eyes are upon the pattern of the object. +\q1 He will set his heart upon perfecting his works. +\q2 He will be careful to adorn them perfectly. +\q1 +\v 29 So is the potter sitting at his work +\q2 and turning the wheel around with his feet, +\q2 who is always anxiously set at his work. +\q2 He produces his handiwork in quantity. +\q1 +\v 30 He will fashion the clay with his arm +\q2 and will bend its strength in front of his feet. +\q1 He will apply his heart to finish the glazing. +\q2 He will be careful to clean the kiln. +\b +\q1 +\v 31 All these put their trust in their hands. +\q2 Each becomes skillful in his own work. +\q1 +\v 32 Without these no city would be inhabited. +\q2 Men wouldn’t reside as foreigners or walk up and down there. +\q1 +\v 33 They won’t be sought for in the council of the people. +\q2 They won’t mount on high in the assembly. +\q2 They won’t sit on the seat of the judge. +\q2 They won’t understand the covenant of judgment. +\q2 Neither will they declare instruction and judgment. +\q2 They won’t be found where parables are. +\q1 +\v 34 But they will maintain the fabric of the age. +\q2 Their prayer is in the handiwork of their craft. +\b +\c 39 +\q1 +\v 1 Not so he who has applied his soul +\q2 and meditates in the law of the Most High. +\q1 He will seek out the wisdom of all the ancients +\q2 and will be occupied with prophecies. +\q1 +\v 2 He will keep the sayings of the men of renown +\q2 and will enter in amidst the subtleties of parables. +\q1 +\v 3 He will seek out the hidden meaning of proverbs +\q2 and be conversant in the dark sayings of parables. +\q1 +\v 4 He will serve among great men +\q2 and appear before him who rules. +\q1 He will travel through the land of foreign nations, +\q2 for he has learned what is good and evil among men. +\q1 +\v 5 He will apply his heart to return early to the Lord who made him, +\q2 and will make supplication before the Most High, +\q2 and will open his mouth in prayer, +\q2 and will ask for pardon for his sins. +\b +\q1 +\v 6 If the great Lord wills, +\q2 he will be filled with the spirit of understanding; +\q2 he will pour forth the words of his wisdom +\q2 and in prayer give thanks to the Lord. +\q1 +\v 7 He will direct his counsel and knowledge, +\q2 and he will meditate in his secrets. +\q1 +\v 8 He will show the instruction which he has been taught +\q2 and will glory in the law of the covenant of the Lord. +\q1 +\v 9 Many will commend his understanding. +\q2 So long as the world endures, it won’t be blotted out. +\q1 His memory won’t depart. +\q2 His name will live from generation to generation. +\q1 +\v 10 Nations will declare his wisdom. +\q2 The congregation will proclaim his praise. +\q1 +\v 11 If he continues, he will leave a greater name than a thousand. +\q2 If he finally rests, it is enough for him. +\b +\q1 +\v 12 Yet more I will utter, which I have thought about. +\q2 I am filled like the full moon. +\q1 +\v 13 Listen to me, you holy children, +\q2 and bud forth like a rose growing by a brook of water. +\q1 +\v 14 Give a sweet fragrance like frankincense. +\q2 Put forth flowers like a lily. +\q2 Scatter a sweet smell and sing a song of praise. +\q2 Bless the Lord for all his works! +\q1 +\v 15 Magnify his name +\q2 and give utterance to his praise +\q2 with the songs on your lips and with harps! +\q1 Say this when you utter his praise: +\b +\q1 +\v 16 All the works of the Lord are exceedingly good, +\q2 and every command will be done in its time. +\q1 +\v 17 No one can say, “What is this?” “Why is that?” +\q2 for at the proper time they will all be sought out. +\q1 At his word, the waters stood as a heap, +\q2 as did the reservoirs of water at the word of his mouth. +\q1 +\v 18 At his command all his good pleasure is fulfilled. +\q2 There is no one who can hinder his salvation. +\q1 +\v 19 The works of all flesh are before him. +\q2 It’s impossible to be hidden from his eyes. +\q1 +\v 20 He sees from everlasting to everlasting. +\q2 There is nothing too wonderful for him. +\q1 +\v 21 No one can say, “What is this?” “Why is that?” +\q2 for all things are created for their own uses. +\b +\q1 +\v 22 His blessing covered the dry land as a river +\q2 and saturated it as a flood. +\q1 +\v 23 As he has made the waters salty, +\q2 so the heathen will inherit his wrath. +\q1 +\v 24 His ways are plain to the holy. +\q2 They are stumbling blocks to the wicked. +\q1 +\v 25 Good things are created from the beginning for the good. +\q2 So are evil things for sinners. +\q1 +\v 26 The main things necessary for the life of man +\q2 are water, fire, iron, salt, +\q2 wheat flour, and honey, milk, +\q2 the blood of the grape, oil, and clothing. +\q1 +\v 27 All these things are for good to the godly, +\q2 but for sinners, they will be turned into evils. +\b +\q1 +\v 28 There are winds that are created for vengeance, +\q2 and in their fury they lay on their scourges heavily. +\q1 In the time of reckoning, they pour out their strength, +\q2 and will appease the wrath of him who made them. +\q1 +\v 29 Fire, hail, famine, and death— +\q2 all these are created for vengeance— +\q2 +\v 30 wild beasts’ teeth, scorpions, adders, +\q2 and a sword punishing the ungodly to destruction. +\q1 +\v 31 They will rejoice in his commandment, +\q2 and will be made ready upon earth when needed. +\q2 In their seasons, they won’t disobey his command. +\b +\q1 +\v 32 Therefore from the beginning I was convinced, +\q2 and I thought it through and left it in writing: +\q1 +\v 33 All the works of the Lord are good. +\q2 He will supply every need in its time. +\q1 +\v 34 No one can say, “This is worse than that,” +\q2 for they will all be well approved in their time. +\q1 +\v 35 Now with all your hearts and voices, sing praises +\q2 and bless the Lord’s name! +\b +\c 40 +\q1 +\v 1 Great travail is created for every man. +\q2 A heavy yoke is upon the sons of Adam, +\q2 from the day of their coming forth from their mother’s womb, +\q2 until the day for their burial in the mother of all things. +\q1 +\v 2 The expectation of things to come, and the day of death, +\q2 trouble their thoughts, and cause fear in their hearts. +\q1 +\v 3 From him who sits on a throne of glory, +\q2 even to him who is humbled in earth and ashes, +\q1 +\v 4 from him who wears purple and a crown, +\q2 even to him who is clothed in burlap, +\q1 +\v 5 there is wrath, jealousy, trouble, unrest, +\q2 fear of death, anger, and strife. +\q1 In the time of rest upon his bed, +\q2 his night sleep changes his knowledge. +\q1 +\v 6 He gets little or no rest, +\q2 and afterward in his sleep, as in a day of keeping watch, +\q2 he is troubled in the vision of his heart, +\q2 as one who has escaped from the front of battle. +\q1 +\v 7 In the very time of his deliverance, he awakens, +\q2 and marvels that the fear is nothing. +\b +\q1 +\v 8 To all creatures, human and animal, +\q2 and upon sinners sevenfold more, +\q2 +\v 9 come death, bloodshed, strife, sword, +\q2 calamities, famine, suffering, and plague. +\q1 +\v 10 All these things were created for the wicked, +\q2 and because of them the flood came. +\q1 +\v 11 All things that are of the earth turn to the earth again. +\q2 All things that are of the waters return into the sea. +\b +\q1 +\v 12 All bribery and injustice will be blotted out. +\q2 Good faith will stand forever. +\q1 +\v 13 The goods of the unjust will be dried up like a river, +\q2 and like a great thunder in rain will go off in noise. +\q1 +\v 14 In opening his hands, a man will be made glad; +\q2 so lawbreakers will utterly fail. +\q1 +\v 15 The children of the ungodly won’t grow many branches, +\q2 and are as unhealthy roots on a sheer rock. +\q1 +\v 16 The reeds by every water or river bank +\q2 will be plucked up before all grass. +\q1 +\v 17 Kindness is like a garden of blessings. +\q2 Almsgiving endures forever. +\b +\q1 +\v 18 The life of one who labors and is content will be made sweet. +\q2 He who finds a treasure is better than both. +\q1 +\v 19 Children and the building of a city establish a name. +\q2 A blameless wife is better than both. +\q1 +\v 20 Wine and music rejoice the heart. +\q2 The love of wisdom is better than both. +\q1 +\v 21 The pipe and the lute make pleasant melody. +\q2 A pleasant tongue is better than both. +\q1 +\v 22 Your eye desires grace and beauty, +\q2 but the green shoots of grain more than both. +\q1 +\v 23 A friend and a companion is always welcome, +\q2 and a wife with her husband is better than both. +\q1 +\v 24 Relatives and helpers are for a time of affliction, +\q2 but almsgiving rescues better than both. +\q1 +\v 25 Gold and silver will make the foot stand sure, +\q2 and counsel is esteemed better than both. +\q1 +\v 26 Riches and strength will lift up the heart. +\q2 The fear of the Lord is better than both. +\q1 There is nothing lacking in the fear of the Lord. +\q2 In it, there is no need to seek help. +\q1 +\v 27 The fear of the Lord is like a garden of blessing +\q2 and covers a man more than any glory. +\b +\q1 +\v 28 My son, don’t lead a beggar’s life. +\q2 It is better to die than to beg. +\q1 +\v 29 A man who looks to the table of another, +\q2 his life is not to be considered a life. +\q1 He will pollute his soul with another person’s food, +\q2 but a wise and well-instructed person will beware of that. +\q1 +\v 30 Begging will be sweet in the mouth of the shameless, +\q2 but it kindles a fire in his belly. +\b +\c 41 +\q1 +\v 1 O death, how bitter is the memory of you to a man who is at peace in his possessions, +\q2 to the man who has nothing to distract him and has prosperity in all things, +\q2 and who still has strength to enjoy food! +\q1 +\v 2 O death, your sentence is acceptable to a man who is needy and who fails in strength, +\q2 who is in extreme old age, is distracted about all things, +\q2 is perverse, and has lost patience! +\q1 +\v 3 Don’t be afraid of the sentence of death. +\q2 Remember those who have been before you and who come after. +\q1 This is the sentence from the Lord over all flesh. +\q2 +\v 4 And why do you refuse when it is the good pleasure of the Most High? +\q1 Whether life lasts ten, or a hundred, or a thousand years, +\q2 there is no inquiry about life in Hades.\f + \fr 41:4 \ft or, \fqa the place of the dead \ft or, \fqa Sheol\f* +\b +\q1 +\v 5 The children of sinners are abominable children +\q2 and they frequent the dwellings of the ungodly. +\q1 +\v 6 The inheritance of sinners’ children will perish +\q2 and with their posterity will be a perpetual disgrace. +\q1 +\v 7 Children will complain of an ungodly father, +\q2 because they suffer disgrace because of him. +\q1 +\v 8 Woe to you, ungodly men, +\q2 who have forsaken the law of the Most High God!\f + \fr 41:8 \ft The remainder of this verse is omitted by the best authorities.\f* +\q1 +\v 9 If you are born, you will be born to a curse. +\q2 If you die, a curse will be your portion. +\q1 +\v 10 All things that are of the earth will go back to the earth; +\q2 so the ungodly will go from a curse to perdition. +\b +\q1 +\v 11 The mourning of men is about their bodies; +\q2 but the evil name of sinners will be blotted out. +\q1 +\v 12 Have regard for your name, +\q2 for it continues with you longer than a thousand great treasures of gold. +\q1 +\v 13 A good life has its number of days, +\q2 but a good name continues forever. +\b +\q1 +\v 14 My children, follow instruction in peace. +\q2 But wisdom that is hidden and a treasure that is not seen, +\q2 what benefit is in them both? +\q1 +\v 15 Better is a man who hides his foolishness +\q2 than a man who hides his wisdom. +\q1 +\v 16 Therefore show respect for my words; +\q2 for it is not good to retain every kind of shame. +\q2 Not everything is approved by all in good faith. +\b +\q1 +\v 17 Be ashamed of sexual immorality before father and mother, +\q2 of a lie before a prince and a mighty man, +\q2 +\v 18 of an offense before a judge and ruler, +\q2 of iniquity before the congregation and the people, +\q2 of unjust dealing before a partner and friend, +\q2 +\v 19 and of theft in the place where you sojourn. +\q1 Be ashamed in regard of the truth of God and his covenant, +\q2 of leaning on your elbow at dinner, +\q2 of contemptuous behavior in the matter of giving and taking, +\q2 +\v 20 of silence before those who greet you, +\q2 of looking at a woman who is a prostitute, +\q2 +\v 21 of turning away your face from a kinsman, +\q2 of taking away a portion or a gift, +\q2 of gazing at a woman who has a husband, +\q2 +\v 22 of meddling with his maid—and don’t come near her bed, +\q2 of abusive speech to friends—and after you have given, don’t insult, +\q2 +\v 23 of repeating and speaking what you have heard, +\q2 and of revealing of secrets. +\q1 +\v 24 So you will be ashamed of the right things +\q2 and find favor in the sight of every man. +\b +\c 42 +\q1 +\v 1 Don’t be ashamed of these things, +\q2 and don’t sin to save face: +\q2 +\v 2 of the law of the Most High and his covenant, +\q2 of judgment to do justice to the ungodly, +\q2 +\v 3 of reckoning with a partner and with travellers, +\q2 of a gift from the inheritance of friends, +\q2 +\v 4 of exactness of scales and weights, +\q2 of getting much or little, +\q2 +\v 5 of bargaining dealing with merchants, +\q2 of frequent correction of children, +\q2 and of making the back of an evil slave to bleed. +\q1 +\v 6 A seal is good where an evil wife is. +\q2 Where there are many hands, lock things up. +\q1 +\v 7 Whatever you hand over, let it be by number and weight. +\q2 In giving and receiving, let all be in writing. +\q1 +\v 8 Don’t be ashamed to instruct the unwise and foolish, +\q2 and one of extreme old age who contends with those who are young. +\q1 So you will be well instructed indeed +\q2 and approved in the sight of every living man. +\b +\q1 +\v 9 A daughter is a secret cause of wakefulness to a father. +\q2 Care for her takes away sleep— +\q2 in her youth, lest she pass the flower of her age; +\q2 when she is married, lest she should be hated; +\q2 +\v 10 in her virginity, lest she should be defiled and be with child in her father’s house; +\q2 when she has a husband, lest she should transgress; +\q2 and when she is married, lest she should be barren. +\q1 +\v 11 Keep a strict watch over a headstrong daughter, +\q2 lest she make you a laughingstock to your enemies, +\q2 a byword in the city and notorious among the people, +\q2 and shame you in public. +\b +\q1 +\v 12 Don’t gaze at every beautiful body. +\q2 Don’t sit in the midst of women. +\q1 +\v 13 For from garments comes a moth, +\q2 and from a woman comes a woman’s wickedness. +\q1 +\v 14 Better is the wickedness of a man than a pleasant woman, +\q2 a woman who puts you to shame and disgrace. +\b +\q1 +\v 15 I will make mention now of the works of the Lord, +\q2 and will declare the things that I have seen. +\q2 The Lord’s works are in his words. +\q1 +\v 16 The sun that gives light looks at all things. +\q2 The Lord’s work is full of his glory. +\q1 +\v 17 The Lord has not given power to the saints to declare all his marvelous works, +\q2 which the Almighty Lord firmly settled, +\q2 that the universe might be established in his glory. +\q1 +\v 18 He searches out the deep and the heart. +\q2 He has understanding of their secrets. +\q1 For the Most High knows all knowledge. +\q2 He sees the signs of the world. +\q1 +\v 19 He declares the things that are past and the things that shall be, +\q2 and reveals the traces of hidden things. +\q1 +\v 20 No thought escapes him. +\q2 There is not a word hidden from him. +\q1 +\v 21 He has ordered the mighty works of his wisdom. +\q2 He is from everlasting to everlasting. +\q1 Nothing has been added to them, nor diminished from them. +\q2 He had no need of any counselor. +\q1 +\v 22 How desirable are all his works! +\q2 One may see this even in a spark. +\q1 +\v 23 All these things live and remain forever in all manner of uses. +\q2 They are all obedient. +\q1 +\v 24 All things are in pairs, one opposite the other. +\q2 He has made nothing imperfect. +\q1 +\v 25 One thing establishes the good things of another. +\q2 Who could ever see enough of his glory? +\b +\c 43 +\q1 +\v 1 The pride of the heavenly heights is the clear sky, +\q2 the appearance of heaven, in the spectacle of its glory. +\q1 +\v 2 The sun, when it appears, bringing tidings as it rises, +\q2 is a marvelous instrument, the work of the Most High. +\q1 +\v 3 At noon, it dries up the land. +\q2 Who can stand against its burning heat? +\q1 +\v 4 A man tending a furnace is in burning heat, +\q2 but the sun three times more, burning up the mountains, +\q2 breathing out fiery vapors, +\q2 and sending out bright beams, it blinds the eyes. +\q1 +\v 5 Great is the Lord who made it. +\q2 At his word, he hastens on its course. +\b +\q1 +\v 6 The moon marks the changing seasons, +\q2 declares times, and is a sign for the world. +\q1 +\v 7 From the moon is the sign of feast days, +\q2 a light that wanes when it completes its course. +\q1 +\v 8 The month is called after its name, +\q2 increasing wonderfully in its changing— +\q2 an instrument of the army on high, +\q2 shining in the structure of heaven, +\q2 +\v 9 the beauty of heaven, the glory of the stars, +\q2 an ornament giving light in the highest places of the Lord. +\q1 +\v 10 At the word of the Holy One, they will stand in due order. +\q2 They won’t faint in their watches. +\q1 +\v 11 Look at the rainbow, and praise him who made it. +\q2 It is exceedingly beautiful in its brightness. +\q1 +\v 12 It encircles the sky with its glorious circle. +\q2 The hands of the Most High have stretched it out. +\b +\q1 +\v 13 By his commandment, he makes the snow fall +\q2 and swiftly sends the lightnings of his judgment. +\q1 +\v 14 Therefore the storehouses are opened, +\q2 and clouds fly out like birds. +\q1 +\v 15 By his mighty power, he makes the clouds strong +\q2 and the hailstones are broken in pieces. +\q1 +\v 16 At his appearing, the mountains will be shaken. +\q2 At his will, the south wind will blow. +\q1 +\v 17 The voice of his thunder rebukes the earth. +\q2 So does the northern storm and the whirlwind. +\q1 Like birds flying down, he sprinkles the snow. +\q2 It falls down like the lighting of locusts. +\q1 +\v 18 The eye is dazzled at the beauty of its whiteness. +\q2 The heart is amazed as it falls. +\q1 +\v 19 He also pours out frost on the earth like salt. +\q2 When it is freezes, it has points like thorns. +\b +\q1 +\v 20 The cold north wind blows +\q2 and ice freezes on the water. +\q1 It settles on every pool of water. +\q2 The water puts it on like it was a breastplate. +\q1 +\v 21 It will devour the mountains, burn up the wilderness, +\q2 and consume the green grass like fire. +\q1 +\v 22 A mist coming speedily heals all things. +\q2 A dew coming after heat brings cheerfulness. +\b +\q1 +\v 23 By his counsel, he has calmed the deep +\q2 and planted islands in it. +\q1 +\v 24 Those who sail on the sea tell of its dangers. +\q2 We marvel when we hear it with our ears. +\q1 +\v 25 There are also those strange and wondrous works in it— +\q2 variety of all that has life and the huge creatures of the sea. +\q1 +\v 26 Because of him, his messengers succeed. +\q2 By his word, all things hold together. +\b +\q1 +\v 27 We may say many things, but couldn’t say enough. +\q2 The summary of our words is, “He is everything!” +\q1 +\v 28 How could we have strength to glorify him? +\q2 For he is himself the greater than all his works. +\q1 +\v 29 The Lord is awesome and exceedingly great! +\q2 His power is marvelous! +\q1 +\v 30 Glorify the Lord and exalt him as much as you can! +\q2 For even yet, he will surpass that. +\q1 When you exalt him, summon your full strength. +\q2 Don’t be weary, because you can’t praise him enough. +\q1 +\v 31 Who has seen him, that he may describe him? +\q2 Who can magnify him as he is? +\q1 +\v 32 Many things greater than these are hidden, +\q2 for we have seen just a few of his works. +\q1 +\v 33 For the Lord made all things. +\q2 He gave wisdom to the godly. +\b +\c 44 +\q1 +\v 1 Let us now praise famous men, +\q2 our ancestors in their generations. +\q1 +\v 2 The Lord created great glory in them— +\q2 his mighty power from the beginning. +\q1 +\v 3 Some ruled in their kingdoms +\q2 and were men renowned for their power, +\q2 giving counsel by their understanding. +\q1 Some have spoken in prophecies, +\q2 +\v 4 leaders of the people by their counsels, +\q2 and by their understanding, giving instruction for the people. +\q2 Their words in their instruction were wise. +\q1 +\v 5 Some composed musical tunes, +\q2 and set forth verses in writing, +\q2 +\v 6 rich men endowed with ability, +\q2 living peaceably in their homes. +\q1 +\v 7 All these were honored in their generations, +\q2 and were outstanding in their days. +\q1 +\v 8 Some of them have left a name behind them, +\q2 so that others declare their praises. +\q1 +\v 9 But of others, there is no memory. +\q2 They perished as though they had not been. +\q2 They become as though they had not been born, +\q2 they and their children after them. +\q1 +\v 10 But these were men of mercy, +\q2 whose righteous deeds have not been forgotten. +\q1 +\v 11 A good inheritance remains with their offspring. +\q2 Their children are within the covenant. +\q1 +\v 12 Their offspring stand fast, +\q2 with their children, for their sakes. +\q1 +\v 13 Their offspring will remain forever. +\q2 Their glory won’t be blotted out. +\q1 +\v 14 Their bodies were buried in peace. +\q2 Their name lives to all generations. +\q1 +\v 15 People will declare their wisdom. +\q2 The congregation proclaims their praise. +\b +\q1 +\v 16 Enoch pleased the Lord, and was taken up, +\q2 an example of repentance to all generations. +\b +\q1 +\v 17 Noah was found perfect and righteous. +\q2 In the season of wrath, he kept the race alive. +\q1 Therefore a remnant was left on the earth +\q2 when the flood came. +\q1 +\v 18 Everlasting covenants were made with him, +\q2 that all flesh should no more be blotted out by a flood. +\b +\q1 +\v 19 Abraham was a great father of a multitude of nations. +\q2 There was none found like him in glory, +\q2 +\v 20 who kept the law of the Most High, +\q2 and was taken into covenant with him. +\q1 In his flesh he established the covenant. +\q2 When he was tested, he was found faithful. +\q1 +\v 21 Therefore he assured him by an oath +\q2 that the nations would be blessed through his offspring, +\q2 that he would multiply him like the dust of the earth, +\q2 exalt his offspring like the stars, +\q2 and cause them to inherit from sea to sea, +\q2 and from the Euphrates River to the utmost parts of the earth. +\b +\q1 +\v 22 In Isaac also, he established the same assurance for Abraham his father’s sake, +\q2 the blessing of all men, and the covenant. +\q1 +\v 23 He made it rest upon the head of Jacob. +\q2 He acknowledged him in his blessings, +\q2 gave to him by inheritance, +\q2 and divided his portions. +\q2 He distributed them among twelve tribes. +\c 45 +\q1 +\v 1 He brought out of him a man of mercy, +\q2 who found favor in the sight of all people, +\q2 a man loved by God and men, even Moses, +\q2 whose memory is blessed. +\q1 +\v 2 He made him equal to the glory of the saints, +\q2 and magnified him in the fears of his enemies. +\q1 +\v 3 By his words he caused the wonders to cease. +\q2 God glorified him in the sight of kings. +\q1 He gave him commandments for his people +\q2 and showed him part of his glory. +\q1 +\v 4 He sanctified him in his faithfulness and meekness. +\q2 He chose him out of all people. +\q1 +\v 5 He made him to hear his voice, +\q2 led him into the thick darkness, +\q2 and gave him commandments face to face, +\q2 even the law of life and knowledge, +\q2 that he might teach Jacob the covenant, +\q2 and Israel his judgments. +\b +\q1 +\v 6 He exalted Aaron, a holy man like Moses, +\q2 even his brother, of the tribe of Levi. +\q1 +\v 7 He established an everlasting covenant with him, +\q2 and gave him the priesthood of the people. +\q1 He blessed him with stateliness, +\q2 and dressed him in a glorious robe. +\q1 +\v 8 He clothed him in perfect splendor, +\q2 and strengthened him with symbols of authority: +\q2 the linen trousers, the long robe, and the ephod. +\q1 +\v 9 He encircled him with pomegranates; +\q2 with many golden bells around him, +\q2 to make a sound as he went, +\q2 to make a sound that might be heard in the temple, +\q2 for a reminder for the children of his people; +\q2 +\v 10 with a holy garment, with gold, blue, and purple, the work of the embroiderer; +\q2 with an oracle of judgment—Urim and Thummim; +\q2 +\v 11 with twisted scarlet, the work of the craftsman; +\q2 with precious stones engraved like a signet, in a setting of gold, the work of the jeweller, +\q2 for a reminder engraved in writing, after the number of the tribes of Israel; +\q2 +\v 12 with a crown of gold upon the mitre, having engraved on it, as on a signet, “HOLINESS”, +\q2 an ornament of honor, the work of an expert, +\q2 the desires of the eyes, goodly and beautiful. +\q1 +\v 13 Before him there never have been anything like it. +\q2 No stranger put them on, but only his sons and his offspring perpetually. +\q1 +\v 14 His sacrifices shall be wholly burned, +\q2 twice every day continually. +\q1 +\v 15 Moses consecrated him, +\q2 and anointed him with holy oil. +\q1 It was an everlasting covenant with him +\q2 and to his offspring, all the days of heaven, +\q2 to minister to the Lord, to serve as a priest, +\q2 and to bless his people in his name. +\q1 +\v 16 He chose him out of all living +\q2 to offer sacrifice to the Lord— +\q2 incense, and a sweet fragrance, for a memorial, +\q2 to make atonement for your people. +\q1 +\v 17 He gave to him in his commandments, +\q2 authority in the covenants of judgments, +\q2 to teach Jacob the testimonies, +\q2 and to enlighten Israel in his law. +\q1 +\v 18 Strangers conspired against him +\q2 and envied him in the wilderness: +\q2 Dathan and Abiram with their company, +\q2 and the congregation of Korah, with wrath and anger. +\q1 +\v 19 The Lord saw it, and it displeased him. +\q2 In the wrath of his anger, they were destroyed. +\q1 He did wonders upon them, +\q2 to consume them with flaming fire. +\q1 +\v 20 He added glory to Aaron, +\q2 and gave him a heritage. +\q1 He divided to him the first fruits of the increase, +\q2 and prepared bread of first fruits in abundance. +\q1 +\v 21 For they eat the sacrifices of the Lord, +\q2 which he gave to him and to his offspring. +\q1 +\v 22 However, in the land of the people, he has no inheritance, +\q2 and he has no portion among the people, +\q2 for the Lord himself is your portion and inheritance. +\b +\q1 +\v 23 Phinehas the son of Eleazar is the third in glory, +\q2 in that he was zealous in the fear of the Lord, +\q2 and stood fast when the people turned away, +\q2 and he made atonement for Israel. +\q1 +\v 24 Therefore, a covenant of peace was established for him, +\q2 that he should be leader of the sanctuary and of his people, +\q2 that he and his offspring should have the dignity of the priesthood forever. +\q1 +\v 25 Also he made a covenant with David the son of Jesse, of the tribe of Judah. +\q2 The inheritance of the king is his alone from son to son. +\q2 So the inheritance of Aaron is also to his seed. +\b +\q1 +\v 26 May God give you wisdom in your heart +\q2 to judge his people in righteousness, +\q2 that their good things may not be abolished, +\q2 and that their glory may endure for all their generations. +\b +\c 46 +\q1 +\v 1 Joshua the son of Nun was valiant in war, +\q2 and was the successor of Moses in prophecies. +\q1 He was made great according to his name +\q2 for the saving of\f + \fr 46:1 \ft Gr. \fqa his. \f* God’s elect, +\q2 to take vengeance on the enemies that rose up against them, +\q2 that he might give Israel their inheritance. +\q1 +\v 2 How was he glorified in the lifting up his hands, +\q2 and in stretching out his sword against the cities! +\q1 +\v 3 Who before him stood so firm? +\q2 For the Lord himself brought his enemies to him. +\q1 +\v 4 Didn’t the sun go back by his hand? +\q2 Didn’t one day become as two? +\q1 +\v 5 He called upon the Most High, the Mighty One, +\q2 when his foes pressed in all around him, +\q2 and the great Lord heard him. +\q1 +\v 6 With hailstones of mighty power, +\q2 he caused war to break violently upon the nation, +\q2 and\f + \fr 46:6 \ft See Joshua 10:11 \f* on the slope he destroyed those who resisted, +\q2 so that the nations might know his armor, +\q2 how he fought in the sight of the Lord; +\q2 for he followed the Mighty One. +\q1 +\v 7 Also in the time of Moses, he did a work of mercy— +\q2 he and Caleb the son of Jephunneh— +\q2 in that they withstood the adversary, +\q2 hindered the people from sin, +\q2 and stilled their wicked complaining. +\q1 +\v 8 And of six hundred thousand people on foot, they two alone were preserved +\q2 to bring them into their inheritance, +\q2 into a land flowing with milk and honey. +\q1 +\v 9 The Lord gave strength to Caleb, +\q2 and it remained with him to his old age, +\q2 so that he entered the hill country, +\q2 and his offspring obtained it for an inheritance, +\q2 +\v 10 that all the children of Israel might see that it is good to follow the Lord. +\b +\q1 +\v 11 Also the judges, every one by his name, +\q2 all whose hearts didn’t engage in immorality, +\q2 and who didn’t turn away from the Lord— +\q2 may their memory be blessed! +\q1 +\v 12 May their bones flourish again out of their place. +\q2 May the name of those who have been honored be renewed in their children. +\b +\q1 +\v 13 Samuel, the prophet of the Lord, loved by his Lord, +\q2 established a kingdom and anointed princes over his people. +\q1 +\v 14 By the law of the Lord he judged the congregation, +\q2 and the Lord watched over Jacob. +\q1 +\v 15 By his faithfulness he was proved to be a prophet. +\q2 By his words he was known to be faithful in vision. +\q1 +\v 16 When his enemies pressed on him on every side, +\q2 he called upon the Lord, the Mighty One, +\q2 with the offering of the suckling lamb. +\q1 +\v 17 Then the Lord thundered from heaven. +\q2 He made his voice heard with a mighty sound. +\q1 +\v 18 He utterly destroyed the rulers of the Tyrians +\q2 and all the princes of the Philistines. +\q1 +\v 19 Before the time of his age-long sleep, +\q2 he testified in the sight of the lord and his anointed, +\q2 “I have not taken any man’s goods, so much as a sandal;” +\q2 and no one accused him. +\q1 +\v 20 Even after he fell asleep, he prophesied, +\q2 and showed the king his end, +\q2 and lifted up his voice from the earth in prophecy, +\q2 to blot out the wickedness of the people. +\b +\c 47 +\q1 +\v 1 After him, Nathan rose up +\q2 to prophesy in the days of David. +\q1 +\v 2 As is the fat when it is separated from the peace offering, +\q2 so was David separated from the children of Israel. +\q1 +\v 3 He played with lions as with kids, +\q2 and with bears as with lambs of the flock. +\q1 +\v 4 In his youth didn’t he kill a giant, +\q2 and take away reproach from the people +\q2 when he lifted up his hand with a sling stone, +\q2 and beat down the boasting Goliath? +\q1 +\v 5 For he called upon the Most High Lord, +\q2 and he gave him strength in his right hand +\q2 to kill a man mighty in war, +\q2 to exalt the horn of his people. +\q1 +\v 6 So they glorified him for his tens of thousands, +\q2 and praised him for the blessings of the Lord, +\q2 in that a glorious diadem was given to him. +\q1 +\v 7 For he destroyed the enemies on every side, +\q2 and defeated the Philistines his adversaries. +\q2 He broke their horn in pieces to this day. +\q1 +\v 8 In every work of his he gave thanks to the Holy One Most High with words of glory. +\q2 He sang praise with his whole heart, +\q2 and loved him who made him. +\q1 +\v 9 He set singers before the altar, +\q2 to make sweet melody by their music.\f + \fr 47:9 \ft The remainder of this verse is omitted by the best authorities. \f* +\q1 +\v 10 He gave beauty to the feasts, +\q2 and set in order the seasons to completion +\q2 while they praised his holy name, +\q2 and the sanctuary resounded from early morning. +\q1 +\v 11 The Lord took away his sins, +\q2 and exalted his horn forever. +\q1 He gave him a covenant of kings, +\q2 and a glorious throne in Israel. +\b +\q1 +\v 12 After him a wise son rose up, +\q2 who because of him lived in security. +\q1 +\v 13 Solomon reigned in days of peace. +\q2 God gave him rest all around, +\q2 that he might set up a house for his name, +\q2 and prepare a sanctuary forever. +\q1 +\v 14 How wise you were made in your youth, +\q2 and filled as a river with understanding! +\q1 +\v 15 Your influence covered the earth, +\q2 and you filled it with parables and riddles. +\q1 +\v 16 Your name reached to the far away islands, +\q2 and you were loved for your peace. +\q1 +\v 17 For your songs, proverbs, parables, +\q2 and interpretations, the countries marveled at you. +\q1 +\v 18 By the name of the Lord God, +\q2 who is called the God of Israel, +\q2 you gathered gold like tin, +\q2 and multiplied silver like lead. +\q1 +\v 19 You bowed your loins to women, +\q2 and in your body you were brought into subjection. +\q1 +\v 20 You blemished your honor, +\q2 and defiled your offspring, +\q2 to bring wrath upon your children. +\q2 I was grieved for your folly, +\q2 +\v 21 because the sovereignty was divided, +\q2 and a disobedient kingdom ruled out of Ephraim. +\q1 +\v 22 But the Lord will never forsake his mercy. +\q2 He won’t destroy any of his works, +\q2 nor blot out the posterity of his elect. +\q1 He won’t take away the offspring him who loved him. +\q2 He gave a remnant to Jacob, +\q2 and to David a root from his own family. +\b +\q1 +\v 23 So Solomon rested with his fathers. +\q2 Of his offspring, he left behind him Rehoboam, +\q2 the foolishness of the people, and one who lacked understanding, +\q2 who made the people revolt by his counsel. +\q1 Also Jeroboam the son of Nebat, +\q2 who made Israel to sin, +\q2 and gave a way of sin to Ephraim. +\q1 +\v 24 Their sins were multiplied exceedingly, +\q2 until they were removed from their land. +\q1 +\v 25 For they sought out all manner of wickedness, +\q2 until vengeance came upon them. +\b +\c 48 +\q1 +\v 1 Then Elijah arose, the prophet like fire. +\q2 His word burned like a torch. +\q1 +\v 2 He brought a famine upon them, +\q2 and by his zeal made them few in number. +\q1 +\v 3 By the word of the Lord he shut up the heavens. +\q2 He brought down fire three times. +\q1 +\v 4 How you were glorified, O Elijah, in your wondrous deeds! +\q2 Whose glory is like yours? +\q1 +\v 5 You raised up a dead man from death, +\q2 from Hades, by the word of the Most High. +\q1 +\v 6 You brought down kings to destruction, +\q2 and honorable men from their sickbeds. +\q1 +\v 7 You heard rebuke in Sinai, +\q2 and judgments of vengeance in Horeb. +\q1 +\v 8 You anointed kings for retribution, +\q2 and prophets to succeed after you. +\q1 +\v 9 You were taken up in a tempest of fire, +\q2 in a chariot of fiery horses. +\q1 +\v 10 You were recorded for reproofs in their seasons, +\q2 to pacify anger, before it broke out into wrath, +\q2 to turn the heart of the father to the son, +\q2 and to restore the tribes of Jacob. +\q1 +\v 11 Blessed are those who saw you, +\q2 and those who have been beautified with love; +\q2 for we also shall surely live. +\b +\q1 +\v 12 Elijah was wrapped in a whirlwind. +\q2 Elisha was filled with his spirit. +\q2 In his days he was not moved by the fear of any ruler, +\q2 and no one brought him into subjection. +\q1 +\v 13 Nothing was too hard for him. +\q2 When he was buried, his body prophesied. +\q1 +\v 14 As in his life he did wonders, +\q2 so his works were also marvelous in death. +\q1 +\v 15 For all this the people didn’t repent. +\q2 They didn’t depart from their sins, +\q2 until they were carried away as a plunder from their land, +\q2 and were scattered through all the earth. +\q1 The people were left very few in number, +\q2 but with a ruler from the house of David. +\q1 +\v 16 Some of them did that which was right, +\q2 but some multiplied sins. +\b +\q1 +\v 17 Hezekiah fortified his city, +\q2 and brought water into its midst. +\q1 He tunneled through rock with iron, +\q2 and built cisterns for water. +\q1 +\v 18 In his days Sennacherib invaded, +\q2 and sent Rabshakeh, and departed. +\q1 He lifted up his hand against Zion, +\q2 and boasted great things in his arrogance. +\q1 +\v 19 Then their hearts and their hands were shaken, +\q2 and they were in pain, as women in labor. +\q1 +\v 20 But they called upon the Lord who is merciful, +\q2 spreading out their hands to him. +\q1 The Holy One quickly heard them out of Heaven, +\q2 and delivered them by the hand of Isaiah. +\q1 +\v 21 He struck the camp of the Assyrians, +\q2 and his angel utterly destroyed them. +\q1 +\v 22 For Hezekiah did that which was pleasing to the Lord, +\q2 and was strong in the ways of his ancestor David, +\q2 which Isaiah the prophet commanded, +\q2 who was great and faithful in his vision. +\b +\q1 +\v 23 In his days the sun went backward. +\q2 He prolonged the life of the king. +\q1 +\v 24 He saw by an excellent spirit what would come to pass in the future; +\q2 and he comforted those who mourned in Zion. +\q1 +\v 25 He showed the things that would happen through the end of time, +\q2 and the hidden things before they came. +\b +\c 49 +\q1 +\v 1 The memory of Josiah is like the composition of incense +\q2 prepared by the work of the perfumer. +\q1 It will be sweet as honey in every mouth, +\q2 and like music at a banquet of wine. +\q1 +\v 2 He did what was right in the reforming of the people, +\q2 and took away the abominations of iniquity. +\q1 +\v 3 He set his heart right toward the Lord. +\q2 In lawless days, he made godliness prevail. +\b +\q1 +\v 4 Except David, Hezekiah, and Josiah, +\q2 all were wicked, +\q2 because they abandoned the law of the Most High. +\q2 The kings of Judah came to an end. +\q1 +\v 5 They gave their power to others, +\q2 and their glory to a foreign nation. +\q1 +\v 6 They set the chosen city of the sanctuary on fire +\q2 and made her streets desolate, as it was written by the hand of Jeremiah. +\q1 +\v 7 For they mistreated him; +\q2 yet he was sanctified in the womb to be a prophet, +\q2 to root out, to afflict, to destroy +\q2 and likewise to build and to plant. +\b +\q1 +\v 8 Ezekiel saw the vision of glory, +\q2 which God showed him on the chariot of the cherubim. +\q1 +\v 9 For truly he remembered the enemies in rainstorm, +\q2 and to do good to those who directed their ways aright. +\q1 +\v 10 Also of the twelve prophets,\f + \fr 49:10 \ft The remainder of this line is omitted by the best authorities. \f* +\q2 may their bones flourish again out of their place. +\q1 He comforted the people of Jacob, +\q2 and delivered them by confident hope. +\b +\q1 +\v 11 How shall we magnify Zerubbabel? +\q2 He was like a signet ring on the right hand. +\q1 +\v 12 So was Jesus the son of Josedek, +\q2 who in their days built the house, +\q2 and exalted a\f + \fr 49:12 \ft Some ancient authorities read \fqa temple. \f* people holy to the Lord, +\q2 prepared for everlasting glory. +\q1 +\v 13 Also of Nehemiah the memory is great. +\q2 He raised up for us fallen walls, +\q2 set up the gates and bars, +\q2 and rebuilt our houses. +\b +\q1 +\v 14 No man was created upon the earth like Enoch, +\q2 for he was taken up from the earth. +\q1 +\v 15 Nor was there a man born like Joseph, +\q2 a leader of his kindred, a supporter of the people. +\q2 Even his bones were cared for. +\q1 +\v 16 Shem and Seth were honored among men, +\q2 but above every living thing in the creation was Adam. +\b +\c 50 +\q1 +\v 1 It was Simon, the son of Onias, the high priest, +\q2 who in his life repaired the house, +\q2 and in his days strengthened the temple. +\q1 +\v 2 The foundation was built by him to the height of the double walls, +\q2 the lofty retaining walls of the temple enclosure. +\q1 +\v 3 In his days, a water cistern was dug, +\q2 the brazen vessel like the sea in circumference. +\q1 +\v 4 He planned to save his people from ruin, +\q2 and fortified the city against siege. +\q1 +\v 5 How glorious he was when the people gathered around him +\q2 as he came out of the house of the veil! +\q1 +\v 6 He was like the morning star among clouds, +\q2 like the full moon, +\q2 +\v 7 like the sun shining on the temple of the Most High, +\q2 like the rainbow shining in clouds of glory, +\q2 +\v 8 like roses in the days of first fruits, +\q2 like lilies by a water spring, +\q2 like the shoot of the frankincense tree in summer time, +\q2 +\v 9 like fire and incense in the censer, +\q2 like a vessel of beaten gold adorned with all kinds of precious stones, +\q2 +\v 10 like an olive tree loaded with fruit, +\q2 and like a cypress growing high among the clouds. +\q1 +\v 11 When he put on his glorious robe, +\q2 and clothed himself in perfect splendor, +\q2 ascending to the holy altar, +\q2 he made the court of the sanctuary glorious. +\b +\q1 +\v 12 When he received the portions out of the priests’ hands, +\q2 as he stood by the hearth of the altar, +\q2 with his kindred like a garland around him, +\q2 he was like a young cedar in Lebanon +\q2 surrounded by the trunks of palm trees. +\q1 +\v 13 All the sons of Aaron in their glory, +\q2 held the Lord’s offering in their hands before all the congregation of Israel. +\q1 +\v 14 Finishing the service at the altars, +\q2 that he might arrange the offering of the Most High, the Almighty, +\q2 +\v 15 he stretched out his hand to the cup of libation, +\q2 and poured out the cup of the grape. +\q1 He poured it out at the foot of the altar, +\q2 a sweet smelling fragrance to the Most High, the King of all. +\q1 +\v 16 Then the sons of Aaron shouted. +\q2 They sounded the trumpets of beaten work. +\q1 They made a great fanfare to be heard, +\q2 for a reminder before the Most High. +\q1 +\v 17 Then all the people together hurried, +\q2 and fell down to the ground on their faces +\q2 to worship their Lord, the Almighty, God Most High. +\b +\q1 +\v 18 The singers also praised him with their voices. +\q2 There was a sweet melody in the whole house. +\q1 +\v 19 And the people implored the Lord Most High, +\q2 in prayer before him who is merciful, +\q2 until the worship of the Lord was finished, +\q2 and so they accomplished his service. +\q1 +\v 20 Then he went down, and lifted up his hands +\q2 over the whole congregation of the children of Israel, +\q2 to give blessing to the Lord with his lips, +\q2 and to glory in his name. +\q1 +\v 21 He bowed himself down in worship the second time, +\q2 to declare the blessing from the Most High. +\b +\q1 +\v 22 Now bless the God of all, +\q2 who everywhere does great things, +\q2 who exalts our days from the womb, +\q2 and deals with us according to his mercy. +\q1 +\v 23 May he grant us joyfulness of heart, +\q2 and that peace may be in our days in Israel for the days of eternity, +\q2 +\v 24 to entrust his mercy with us, +\q2 and let him deliver us in his time! +\b +\q1 +\v 25 With two nations my soul is vexed, +\q2 and the third is no nation: +\q2 +\v 26 Those who sit on the mountain of\f + \fr 50:26 \ft According to some ancient versions, \fqa Seir. \f* Samaria, the Philistines, +\q2 and the foolish people who live in Shechem. +\b +\q1 +\v 27 I have written in this book the instruction of understanding and knowledge, +\q2 I Jesus, the son of Sirach Eleazar, of Jerusalem, +\q2 who out of his heart poured forth wisdom. +\q1 +\v 28 Blessed is he who will exercise these things. +\q2 He who lays them up in his heart will become wise. +\q1 +\v 29 For if he does them, he will be strong in all things, +\q2 for the light of the Lord is his guide.\f + \fr 50:29 \ft The remainder of this verse is omitted by the best authorities. \f* +\c 51 +\p A Prayer of Jesus the son of Sirach. +\q1 +\v 1 I will give thanks to you, O Lord, O King, +\q2 and will praise you, O God my Savior. +\q1 I give thanks to your name, +\q2 +\v 2 for you have been my protector and helper, +\q2 and delivered my body out of destruction, +\q2 and out of the snare of a slanderous tongue, +\q2 from lips that fabricate lies. +\q1 You were my helper before those who stood by, +\q2 +\v 3 and delivered me, according to the abundance of your mercy and of your name, +\q2 from the gnashings of teeth ready to devour, +\q2 out of the hand of those seeking my life, +\q2 out of the many afflictions I endured, +\q2 +\v 4 from the choking of a fire on every side, +\q2 and out of the midst of fire that I hadn’t kindled, +\q2 +\v 5 out of the depth of the belly of Hades, +\q2 from an unclean tongue, +\q2 and from lying words— +\q2 +\v 6 the slander of an unrighteous tongue to the king. +\q1 My soul drew near to death. +\q2 My life was near to Hades. +\q1 +\v 7 They surrounded me on every side. +\q2 There was no one to help me. +\q1 I was looking for human help, +\q2 and there was none. +\q1 +\v 8 Then I remembered your mercy, O Lord, +\q2 and your working which has been from everlasting, +\q2 how you deliver those who wait for you, +\q2 and save them out of the hand of their enemies. +\q1 +\v 9 I lifted up my prayer from the earth, +\q2 and prayed for deliverance from death. +\q1 +\v 10 I called upon the Lord, the Father of my Lord, +\q2 that he would not forsake me in the days of affliction, +\q2 in the time when there was no help against the proud. +\q1 +\v 11 I will praise your name continually. +\q2 I will sing praise with thanksgiving. +\q2 My prayer was heard. +\q1 +\v 12 You saved me from destruction +\q2 and delivered me from the evil time. +\q1 Therefore I will give thanks and praise to you, +\q2 and bless the name of the Lord. +\b +\q1 +\v 13 When I was yet young, +\q2 before I went abroad, +\q2 I sought wisdom openly in my prayer. +\q1 +\v 14 Before the temple I asked for her. +\q2 I will seek her out even to the end. +\q1 +\v 15 From the first flower to the ripening grape my heart delighted in her. +\q2 My foot walked in uprightness. +\q2 From my youth I followed her steps. +\q1 +\v 16 I inclined my ear a little, and received her, +\q2 and found for myself much instruction. +\q1 +\v 17 I profited in her. +\q2 I will give glory to him who gives me wisdom. +\q1 +\v 18 For I determined to practice her. +\q2 I was zealous for that which is good. +\q2 I will never be put to shame. +\q1 +\v 19 My soul has wrestled with her. +\q2 In my conduct I was exact. +\q1 I spread out my hands to the heaven above, +\q2 and bewailed my ignorances of her. +\q1 +\v 20 I directed my soul to her. +\q2 In purity I found her. +\q1 I got myself a heart joined with her from the beginning. +\q2 Therefore I won’t be forsaken. +\q1 +\v 21 My belly also was troubled to seek her. +\q2 Therefore I have gained a good possession. +\q1 +\v 22 The Lord gave me a tongue for my reward. +\q2 I will praise him with it. +\b +\q1 +\v 23 Draw near to me, all you who are uneducated, +\q2 and live in the house of instruction. +\q1 +\v 24 Why therefore are you all lacking in these things, +\q2 and your souls are very thirsty? +\q1 +\v 25 I opened my mouth and spoke, +\q2 “Get her for yourselves without money.” +\q1 +\v 26 Put your neck under the yoke, +\q2 and let your soul receive instruction. +\q2 She is near to find. +\b +\q1 +\v 27 See with your eyes +\q2 how that I labored just a little +\q2 and found for myself much rest. +\q1 +\v 28 Get instruction with a great sum of silver, +\q2 and gain much gold by her. +\q1 +\v 29 May your soul rejoice in his mercy, +\q2 and may you all not be put to shame in praising him. +\q1 +\v 30 Work your work before the time comes, +\q2 and in his time he will give you your reward. diff --git a/c-sharp/assets/WEB/73BARengWEBUS.SFM b/c-sharp/assets/WEB/73BARengWEBUS.SFM new file mode 100644 index 0000000000..348f91e8ad --- /dev/null +++ b/c-sharp/assets/WEB/73BARengWEBUS.SFM @@ -0,0 +1,253 @@ +\id BAR - Baruch +\h Baruch +\toc1 Baruch +\toc2 Baruch +\toc3 Baruch +\mt1 Baruch +\ip The book of \bk Baruch\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. In some Bibles, Baruch chapter 6 is listed as a separate book called \bk The Letter of Jeremiah\bk*, reflecting its separation from Baruch in some copies of the Greek Septuagint. +\c 1 + +\p +\v 1 These are the words of the book which Baruch the son of Nerias, the son of Maaseas, the son of Sedekias, the son of Asadias, the son of Helkias, wrote in Babylon, +\v 2 in the fifth year, in the seventh day of the month, at the time when the Chaldeans took Jerusalem and burned it with fire. +\v 3 Baruch read the words of this book in the hearing of Jechonias the son of Joakim king of Judah, and in the hearing of all the people who came to hear the book, +\v 4 and in the hearing of the mighty men, and of the kings’ sons, and in the hearing of the elders, and in the hearing of all the people, from the least to the greatest, even of all those who lived at Babylon by the river Sud. +\v 5 Then they wept, fasted,\f + \fr 1:5 \ft Another reading is, \fqa and vowed vows. \f* and prayed before the Lord. +\v 6 They also made a collection of money according to every man’s ability; +\v 7 and they sent it to Jerusalem to Joakim the high priest, the son of Helkias, the son of Salom, and to the priests and to all the people who were found with him at Jerusalem, +\v 8 at the same time when he took the vessels of the house of the Lord, that had been carried out of the temple, to return them into the land of Judah, the tenth day of Sivan—silver vessels which Sedekias the son of Josias king of Judah had made, +\v 9 after Nabuchodonosor king of Babylon had carried away Jechonias, the princes, the captives, the mighty men, and the people of the land from Jerusalem, and brought them to Babylon. +\p +\v 10 And they said: Behold, we have sent you money; therefore buy with the money burnt offerings, sin offerings, and incense, and prepare an oblation, and offer upon the altar of the Lord our God; +\v 11 and pray for the life of Nabuchodonosor king of Babylon, and for the life of Baltasar his son, that their days may be\f + \fr 1:11 \ft See Deuteronomy 11:21. \f* as the days of heaven above the earth. +\v 12 The Lord will give us strength and light to our eyes. We will live under the shadow of Nabuchodonosor king of Babylon and under the shadow of Baltasar his son, and we shall serve them many days, and find favor in their sight. +\v 13 Pray for us also to the Lord our God, for we have sinned against the Lord our God. To this day the wrath of the Lord and his indignation is not turned from us. +\v 14 You shall read this book which we have sent to you, to make confession in the house of the Lord upon the day of the feast and on the days of the solemn assembly. +\p +\v 15 You shall say: To the Lord our God belongs righteousness, but to us confusion of face, as at this day—to the men of Judah, to the inhabitants of Jerusalem, +\v 16 to our kings, to our princes, to our priests, to our prophets, and to our fathers, +\v 17 because we have sinned before the Lord. +\v 18 We have disobeyed him and have not listened to the voice of the Lord our God, to walk in the commandments of the Lord that he has set before us. +\v 19 Since the day that the Lord brought our fathers out of the land of Egypt to this present day, we have been disobedient to the Lord our God, and we have been negligent in not listening to his voice. +\v 20 Therefore the plagues have clung to us, along with the curse which the Lord declared through Moses his servant in the day that he brought our fathers out of the land of Egypt to give us a land that flows with milk and honey, as at this day. +\v 21 Nevertheless we didn’t listen to the voice of the Lord our God, according to all the words of the prophets whom he sent to us, +\v 22 but we each walked in the imagination of his own wicked heart, to serve strange gods and to do what is evil in the sight of the Lord our God. +\c 2 +\p +\v 1 Therefore the Lord has made good his word which he pronounced against us, and against our judges who judged Israel, and against our kings, and against our princes, and against the men of Israel and Judah, +\v 2 to bring upon us great plagues such as never happened before under the whole heaven,\f + \fr 2:2 \ft Another reading is, \fqa even as he has done. \f* as it came to pass in Jerusalem, according to the things that are written in the law of Moses, +\v 3 that we should each eat the flesh of our own son, and each eat the flesh of our own daughter. +\v 4 Moreover he has given them to be in subjection to all the kingdoms that are around us, to be a reproach and a desolation among all the people around us, where the Lord has scattered them. +\v 5 Thus they were cast down and not exalted, because we sinned against the Lord our God in not listening to his voice. +\v 6 To the Lord our God belongs righteousness, but to us and to our fathers confusion of face, as at this day. +\v 7 All these plagues have come upon us which the Lord has pronounced against us. +\v 8 Yet have we not entreated the favor of the Lord by everyone turning from the thoughts of his wicked heart. +\v 9 Therefore the Lord has kept watch over the plagues. The Lord has brought them upon us, for the Lord is righteous in all his works which he has commanded us. +\v 10 Yet we have not listened to his voice, to walk in the commandments of the Lord that he has set before us. +\p +\v 11 And now, O Lord, you God of Israel who have brought your people out of the land of Egypt with a mighty hand, with signs, with wonders, with great power, and with a high arm, and have gotten yourself a name, as at this day: +\v 12 O Lord our God, we have sinned. We have been ungodly. We have done wrong in all your ordinances. +\v 13 Let your wrath turn from us, for we are but a few left among the heathen where you have scattered us. +\v 14 Hear our prayer, O Lord, and our petition, and deliver us for your own sake. Give us favor in the sight of those who have led us away captive, +\v 15 that all the earth may know that you are the Lord our God, because Israel and his posterity is called by your name. +\v 16 O Lord, look down from your holy house and consider us. Incline your ear, O Lord, and hear. +\v 17 Open your eyes, and see; for the dead that are in Hades, whose breath is taken from their bodies, will give to the Lord neither glory nor righteousness; +\v 18 but the soul who is greatly vexed, who goes stooping and feeble, and the eyes that fail, and the hungry soul, will declare your glory and righteousness, O Lord. +\p +\v 19 For we do not present our supplication before you, O Lord our God, for the righteousness of our fathers and of our kings. +\v 20 For you have sent your wrath and your indignation upon us, as you have spoken by your servants the prophets, saying, +\v 21 “The Lord says, ‘Bow your shoulders to serve the king of Babylon, and remain in the land that I gave to your fathers. +\v 22 But if you won’t hear the voice of the Lord to serve the king of Babylon, +\v 23 I will cause to cease out of the cities of Judah and from the region near Jerusalem the voice of mirth, the voice of gladness, voice of the bridegroom, and the voice of the bride. The whole land will be desolate without inhabitant.’” +\v 24 But we wouldn’t listen to your voice, to serve the king of Babylon. Therefore you have made good your words that you spoke by your servants the prophets, that the bones of our kings and the bones of our fathers would be taken out of their places. +\v 25 Behold, they are cast out to the heat by day and to the frost by night. They died in great miseries by famine, by sword, and by\f + \fr 2:25 \ft See Jeremiah 32:36. \f* pestilence. +\v 26 You have made the house that is called by your name as it is today because of the wickedness of the house of Israel and the house of Judah. +\p +\v 27 Yet, O Lord our God, you have dealt with us after all your kindness and according to all your great mercy, +\v 28 as you spoke by your servant Moses in the day when you commanded him to write your law in the presence of the children of Israel, saying, +\v 29 “If you won’t hear my voice, surely this very great multitude will be turned into a small number among the nations where I will scatter them. +\v 30 For I know that they will not hear me, because they are a stiff-necked people; but in the land of their captivity they will take it to heart, +\v 31 and will know that I am the Lord their God. I will give them a heart and ears to hear. +\v 32 Then they will praise me in the land of their captivity, and think about my name, +\v 33 and will return from their stiff neck and from their wicked deeds; for they will remember the way of their fathers who sinned before the Lord. +\v 34 I will bring them again into the land which I promised to their fathers, to Abraham, to Isaac, and to Jacob, and they will rule over it. I will increase them, and they won’t be diminished. +\v 35 And I will make an everlasting covenant with them to be their God, and they will be my people. I will no more remove my people Israel out of the land that I have given them.” +\c 3 +\p +\v 1 O Lord Almighty, you God of Israel, the soul in anguish and the troubled spirit cries to you. +\v 2 Hear, O Lord, and have mercy; for you are a merciful God. Yes, have mercy upon us, because we have sinned before you. +\v 3 For you are enthroned forever, and we keep perishing. +\v 4 O Lord Almighty, you God of Israel, hear now the prayer of the dead Israelites, and of the children of those who were sinners before you, who didn’t listen to the voice of you their God; because of this, these plagues cling to us. +\v 5 Don’t remember the iniquities of our fathers, but remember your power and your name at this time. +\v 6 For you are the Lord our God, and we will praise you, O Lord. +\v 7 For this cause, you have put your fear in our hearts, to the intent that we should call upon your name. We will praise you in our captivity, for we have called to mind all the iniquity of our fathers who sinned before you. +\v 8 Behold, we are yet this day in our captivity where you have scattered us, for a reproach and a curse, and to be subject to penalty according to all the iniquities of our fathers who departed from the Lord our God. +\p +\v 9 Hear, O Israel, the commandments of life! Give ear to understand wisdom! +\v 10 How is it, O Israel, that you are in your enemies’ land, that you have become old in a strange country, that you are defiled with the dead, +\v 11 that you are counted with those who are in Hades? +\v 12 You have forsaken the fountain of wisdom. +\v 13 If you had walked in the way of God, you would have dwelled in peace forever. +\v 14 Learn where there is wisdom, where there is strength, and where there is understanding, that you may also know where there is length of days and life, where there is the light of the eyes and peace. +\v 15 Who has found out her place? Who has come into her treasuries? +\v 16 Where are the princes of the heathen, and those who ruled the beasts that are on the earth, +\v 17 those who had their pastime with the fowls of the air, and those who hoarded up silver and gold, in which people trust, and of their getting there is no end? +\v 18 For those who diligently sought silver, and were so anxious, and whose works are past finding out, +\v 19 they have vanished and gone down to Hades, and others have come up in their place. +\p +\v 20 Younger men have seen the light and lived upon the earth, but they haven’t known the way of knowledge, +\v 21 nor understood its paths. Their children haven’t embraced it. They are far off from their way. +\v 22 It has not been heard of in Canaan, neither has it been seen in Teman. +\v 23 The sons also of Agar who seek understanding, which are in the land, the merchants of Merran and Teman, and the authors of fables, and the searchers out of understanding—none of these have known the way of wisdom or remembered her paths. +\p +\v 24 O Israel, how great is the house of God! How large is the place of his possession! +\v 25 It is great and has no end. It is high and unmeasurable. +\v 26 Giants were born that were famous of old, great of stature, and expert in war. +\v 27 God didn’t choose these, nor did he give the way of knowledge to them, +\v 28 so they perished, because they had no wisdom. They perished through their own foolishness. +\v 29 Who has gone up into heaven, taken her, and brought her down from the clouds? +\v 30 Who has gone over the sea, found her, and will bring her for choice gold? +\v 31 There is no one who knows her way, nor any who comprehend her path. +\v 32 But he that knows all things knows her, he found her out with his understanding. He who prepared the earth for all time has filled it with four-footed beasts. +\v 33 It is he who sends forth the light, and it goes. He called it, and it obeyed him with fear. +\v 34 The stars shone in their watches, and were glad. When he called them, they said, “Here we are.” They shone with gladness to him who made them. +\v 35 This is our God. No other can be compared to him. +\v 36 He has found out all the way of knowledge, and has given it to Jacob his servant and to Israel who is loved by him. +\v 37 Afterward she appeared upon earth, and lived with men. +\c 4 +\p +\v 1 This is the book of God’s commandments and the law that endures forever. All those who hold it fast will live, but those who leave it will die. +\v 2 Turn, O Jacob, and take hold of it. Walk toward the shining of its light. +\v 3 Don’t give your glory to another, nor the things that are to your advantage to a foreign nation. +\v 4 O Israel, we are happy; for the things that are pleasing to God are made known to us. +\p +\v 5 Be of good cheer, my people, the memorial of Israel. +\v 6 You were not sold to the nations for destruction, but because you moved God to wrath, you were delivered to your adversaries. +\v 7 For you provoked him who made you by sacrificing to demons and not to God. +\v 8 You forgot the everlasting God who brought you up. You also grieved Jerusalem, who nursed you. +\v 9 For she saw the wrath that came upon you from God, and said, “Listen, you who dwell near Zion; for God has brought upon me great mourning. +\v 10 For I have seen the captivity of my sons and daughters, which the Everlasting has brought upon them. +\v 11 For with joy I nourished them, but sent them away with weeping and mourning. +\v 12 Let no man rejoice over me, a widow and forsaken by many. For the sins of my children, I am left desolate, because they turned away from the law of God +\v 13 and had no regard for his statutes. They didn’t walk in the ways of God’s commandments or tread in the paths of discipline in his righteousness. +\v 14 Let those who dwell near Zion come and remember the captivity of my sons and daughters, which the Everlasting has brought upon them. +\v 15 For he has brought a nation upon them from afar, a shameless nation with a strange language, who didn’t respect old men or pity children. +\v 16 They have carried away the dear beloved sons of the widow, and left her who was alone desolate of her daughters.” +\p +\v 17 But I—how can I help you? +\v 18 For he who brought these calamities upon you will deliver you from the hand of your enemies. +\v 19 Go your way, O my children. Go your way, for I am left desolate. +\v 20 I have put off the garment of peace, and put on the sackcloth of my petition. I will cry to the Everlasting as long as I live. +\p +\v 21 Take courage, my children. Cry to God, and he will deliver you from the power and hand of the enemies. +\v 22 For I have trusted in the Everlasting, that he will save you; and joy has come to me from the Holy One, because of the mercy that will soon come to you from your Everlasting Savior. +\v 23 For I sent you out with mourning and weeping, but God will give you to me again with joy and gladness forever. +\v 24 For as now those who dwell near Zion have seen your captivity, so they will shortly see your salvation from our God which will come upon you with great glory and brightness of the Everlasting. +\v 25 My children, suffer patiently the wrath that has come upon you from God, for your enemy has persecuted you; but shortly you will see his destruction and will tread upon their necks. +\v 26 My delicate ones have traveled rough roads. They were taken away like a flock carried off by enemies. +\p +\v 27 Take courage, my children, and cry to God; for you will be remembered by him who has brought this upon you. +\v 28 For as it was your decision to go astray from God, return and seek him ten times more. +\v 29 For he who brought these calamities upon you will bring you everlasting joy again with your salvation. +\v 30 Take courage, O Jerusalem, for he who called you by name will comfort you. +\v 31 Miserable are those who afflicted you and rejoiced at your fall. +\v 32 Miserable are the cities which your children served. Miserable is she who received your sons. +\v 33 For as she rejoiced at your fall and was glad of your ruin, so she will be grieved at her own desolation. +\v 34 And I will take away her pride in her great multitude and her boasting will be turned into mourning. +\v 35 For fire will come upon her from the Everlasting for many days; and she will be inhabited by demons for a long time. +\p +\v 36 O Jerusalem, look around you toward the east, and behold the joy that comes to you from God. +\v 37 Behold, your sons come, whom you sent away. They come gathered together from the east to the west at the word of the Holy One, rejoicing in the glory of God. +\c 5 +\p +\v 1 Take off the garment of your mourning and affliction, O Jerusalem, and put on forever the beauty of the glory from God. +\v 2 Put on the robe of the righteousness from God. Set on your head a diadem of the glory of the Everlasting. +\v 3 For God will show your splendor everywhere under heaven. +\v 4 For your name will be called by God forever “Righteous Peace, Godly Glory”. +\p +\v 5 Arise, O Jerusalem, and stand upon the height. Look around you toward the east and see your children gathered from the going down of the sun to its rising at the word of the Holy One, rejoicing that God has remembered them. +\v 6 For they went from you on foot, being led away by their enemies, but God brings them in to you carried on high with glory, on a royal throne. +\v 7 For God has appointed that every high mountain and the everlasting hills should be made low, and the valleys filled up to make the ground level, that Israel may go safely in the glory of God. +\v 8 Moreover the woods and every sweet smelling tree have shaded Israel by the commandment of God. +\v 9 For God will lead Israel with joy in the light of his glory with the mercy and righteousness that come from him. +\c 6 + +\s1 The Letter of Jeremy (Jeremiah) +\p +\v 1 A copy of a letter that Jeremy sent to those who were to be led captives into Babylon by the king of the Babylonians, to give them the message that God commanded him. +\p +\v 2 Because of the sins which you have committed before God, you will be led away captives to Babylon by Nabuchodonosor king of the Babylonians. +\v 3 So when you come to Babylon, you will remain there many years, and for a long season, even for seven generations. After that, I will bring you out peacefully from there. +\v 4 But now you will see in Babylon gods of silver, gold, wood carried on shoulders, which cause the nations to fear. +\v 5 Beware therefore that you in no way become like these foreigners. Don’t let fear take hold of you because of them when you see the multitude before them and behind them, worshiping them. +\v 6 But say in your hearts, “O Lord, we must worship you.” +\v 7 For my angel is with you, and I myself care for your souls. +\v 8 For their tongue is polished by the workman, and they themselves are overlaid with gold and with silver; yet they are only fake, and can’t speak. +\v 9 And taking gold, as if it were for a virgin who loves to be happy, they make crowns for the heads of their gods. +\v 10 Sometimes also the priests take gold and silver from their gods, and spend it on themselves. +\v 11 They will even give some of it to the common prostitutes. They dress them like men with garments, even the gods of silver, gods of gold, and gods of wood. +\v 12 Yet these gods can’t save themselves from rust and moths, even though they are covered with purple garments. +\v 13 They wipe their faces because of the dust of the temple, which is thick upon them. +\v 14 And he who can’t put to death one who offends against him holds a sceptre, as though he were judge of a country. +\v 15 He has also a dagger in his right hand, and an axe, but can’t deliver himself from war and robbers. +\v 16 By this they are known not to be gods. Therefore don’t fear them. +\v 17 For like a vessel that a man uses is worth nothing when it is broken, even so it is with their gods. When they are set up in the temples, their eyes are full of dust through the feet of those who come in. +\v 18 As the courts are secured on every side upon him who offends the king, as being committed to suffer death, even so the priests secure their temples with doors, with locks, and bars, lest they be carried off by robbers. +\v 19 They light candles for them, yes, more than for themselves, even though they can’t see one. +\v 20 They are like one of the beams of the temple. Men say their hearts are eaten out when things creeping out of the earth devour both them and their clothing. They don’t feel it +\v 21 when their faces are blackened through the smoke that comes out of the temple. +\v 22 Bats, swallows, and birds land on their bodies and heads. So do the cats. +\v 23 By this you may know that they are no gods. Therefore don’t fear them. +\v 24 Notwithstanding the gold with which they are covered to make them beautiful, unless someone wipes off the tarnish, they won’t shine; for they didn’t even feel it when they were molten. +\v 25 Things in which there is no breath are bought at any cost. +\v 26 Having no feet, they are carried upon shoulders. By this, they declare to men that they are worth nothing. +\v 27 Those who serve them are also ashamed, for if they fall to the ground at any time, they can’t rise up again by themselves. If they are bowed down, they can’t make themselves straight; but the offerings are set before them, as if they were dead men. +\v 28 And the things that are sacrificed to them, their priests sell and spend. In like manner, their wives also lay up part of it in salt; but to the poor and to the impotent they give none of it. +\v 29 The menstruous woman and the woman in childbed touch their sacrifices, knowing therefore by these things that they are no gods. Don’t fear them. +\v 30 For how can they be called gods? Because women set food before the gods of silver, gold, and wood. +\v 31 And in their temples the priests sit on seats, having their clothes torn and their heads and beards shaven, and nothing on their heads. +\v 32 They roar and cry before their gods, as men do at the feast when one is dead. +\v 33 The priests also take off garments from them and clothe their wives and children with them. +\v 34 Whether it is evil or good what one does to them, they are not able to repay it. They can’t set up a king or put him down. +\v 35 In like manner, they can neither give riches nor money. Though a man make a vow to them and doesn’t keep it, they will never exact it. +\v 36 They can save no man from death. They can’t deliver the weak from the mighty. +\v 37 They can’t restore a blind man to his sight, or deliver anyone who is in distress. +\v 38 They can show no mercy to the widow, or do good to the fatherless. +\v 39 They are like the stones that are cut out of the mountain, these gods of wood that are overlaid with gold and with silver. Those who minister to them will be confounded. +\p +\v 40 How could a man then think or say that they are gods, when even the Chaldeans themselves dishonor them? +\v 41 If they shall see one mute who can’t speak, they bring him and ask him to call upon Bel, as though he were able to understand. +\v 42 Yet they can’t perceive this themselves, and forsake them; for they have no understanding. +\v 43 The women also with cords around them sit in the ways, burning bran for incense; but if any of them, drawn by someone who passes by, lies with him, she reproaches her fellow, that she was not thought as worthy as herself and her cord wasn’t broken. +\v 44 Whatever is done among them is false. How could a man then think or say that they are gods? +\v 45 They are fashioned by carpenters and goldsmiths. They can be nothing else than what the workmen make them to be. +\v 46 And they themselves who fashioned them can never continue long. How then should the things that are fashioned by them? +\v 47 For they have left lies and reproaches to those who come after. +\v 48 For when there comes any war or plague upon them, the priests consult with themselves, where they may be hidden with them. +\v 49 How then can’t men understand that they are no gods, which can’t save themselves from war or from plague? +\v 50 For seeing they are only wood and overlaid with gold and silver, it will be known hereafter that they are false. +\v 51 It will be manifest to all nations and kings that they are no gods, but the works of men’s hands, and that there is no work of God in them. +\v 52 Who then may not know that they are not gods? +\p +\v 53 For they can’t set up a king in a land or give rain to men. +\v 54 They can’t judge their own cause, or redress a wrong, being unable; for they are like crows between heaven and earth. +\v 55 For even when fire falls upon the house of gods of wood overlaid with gold or with silver, their priests will flee away, and escape, but they themselves will be burned apart like beams. +\v 56 Moreover they can’t withstand any king or enemies. How could a man then admit or think that they are gods? +\v 57 Those gods of wood overlaid with silver or with gold aren’t able to escape from thieves or robbers. +\v 58 The gold, silver, and garments with which they are clothed—those who are strong will take from them, and go away with them. They won’t be able to help themselves. +\v 59 Therefore it is better to be a king who shows his manhood, or else a vessel in a house profitable for whatever the owner needs, than such false gods—or even a door in a house, to keep the things safe that are in it, than such false gods; or better to be a pillar of wood in a palace than such false gods. +\p +\v 60 For sun, moon, and stars, being bright and sent to do their jobs, are obedient. +\v 61 Likewise also the lightning when it flashes is beautiful to see. In the same way, the wind also blows in every country. +\v 62 And when God commands the clouds to go over the whole world, they do as they are told. +\v 63 And the fire sent from above to consume mountains and woods does as it is commanded; but these are to be compared to them neither in show nor power. +\v 64 Therefore a man shouldn’t think or say that they are gods, seeing they aren’t able to judge causes or to do good to men. +\v 65 Knowing therefore that they are no gods, don’t fear them. +\v 66 For they can neither curse nor bless kings. +\v 67 They can’t show signs in the heavens among the nations, or shine as the sun, or give light as the moon. +\v 68 The beasts are better than they; for they can get under a covert, and help themselves. +\v 69 In no way then is it manifest to us that they are gods. Therefore don’t fear them. +\v 70 For as a scarecrow in a garden of cucumbers that keeps nothing, so are their gods of wood overlaid with gold and silver. +\v 71 Likewise also their gods of wood overlaid with gold and with silver, are like a white thorn in an orchard that every bird sits upon. They are also like a dead body that is thrown out into the dark. +\v 72 You will know them to be no gods by the bright purple that rots upon them. They themselves will be consumed afterwards, and will be a reproach in the country. +\v 73 Better therefore is the just man who has no idols; for he will be far from reproach. diff --git a/c-sharp/assets/WEB/781MAengWEBUS.SFM b/c-sharp/assets/WEB/781MAengWEBUS.SFM new file mode 100644 index 0000000000..f05d329896 --- /dev/null +++ b/c-sharp/assets/WEB/781MAengWEBUS.SFM @@ -0,0 +1,1137 @@ +\id 1MA +\h 1 Maccabees +\toc1 The First Book of the Maccabees +\toc2 1 Maccabees +\toc3 1Ma +\mt1 The First Book of the Maccabees +\ip \bk The First Book of the Maccabees\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\c 1 + +\p +\v 1 After Alexander the Macedonian, the son of Philip, who came out of the land of Chittim, and struck Darius king of the Persians and Medes, it came to pass, after he had struck him, that he reigned in his place, in former time, over\f + \fr 1:1 \ft That is, the Greek Empire. Compare 1 Maccabees 1:10 and 1 Maccabees 6:2. \f* Greece. +\v 2 He fought many battles, won many strongholds, killed the kings of the earth, +\v 3 went through to the ends of the earth, and took spoils of a multitude of nations. The earth was quiet before him. He was exalted. His heart was lifted up. +\v 4 He gathered together an exceedingly strong army and ruled over countries, nations, and principalities, and they paid him tribute. +\p +\v 5 After these things he fell sick, and perceived that he was going to die. +\v 6 He called his honorable servants, which had been brought up with him from his youth, and he divided to them his kingdom while he was still alive. +\v 7 Alexander reigned twelve years, then he died. +\v 8 Then his servants ruled, each one in his place. +\v 9 They all put crowns upon themselves after he was dead, and so did their sons after them many years; and they multiplied evils in the earth. +\p +\v 10 There came out of them a sinful root, Antiochus Epiphanes, son of Antiochus the king, who had been a hostage at Rome, and he reigned in\f + \fr 1:10 \ft circa B.C. 176. \f* the one hundred thirty seventh year of the kingdom of the Greeks. +\p +\v 11 In those days transgressors of the law came out of Israel and persuaded many, saying, let’s go make a covenant with the\f + \fr 1:11 \ft Or, \fqa nations: \ft and so throughout this book.\f* Gentiles around us; for since we were separated from them many evils have befallen us. +\v 12 That proposal was good in their eyes. +\v 13 Some of the people eagerly went to the king, and he authorized them to observe the ordinances of the\f + \fr 1:13 \ft Or, \fqa nations: \ft and so throughout this book.\f* Gentiles. +\v 14 So\f + \fr 1:14 \ft See 2 Maccabees 4:9, 12. \f* they built a gymnasium in Jerusalem according to the laws of the\f + \fr 1:14 \ft Or, \fqa nations: \ft and so throughout this book. \f* Gentiles. +\v 15 They made themselves uncircumcised, forsook the holy covenant, joined themselves to the\f + \fr 1:15 \ft Or, \fqa nations: \ft and so throughout this book \f* Gentiles, and sold themselves to do evil. +\p +\v 16 The kingdom was established in the sight of Antiochus, and he planned to reign over Egypt, that he might reign over both kingdoms. +\v 17 He entered into Egypt with a\f + \fr 1:17 \ft Gr. \fqa heavy. \f* great multitude, with chariots, with elephants, with cavalry, and with a great\f + \fr 1:17 \ft Or, \fqa armament \f* navy. +\v 18 He made war against Ptolemy king of Egypt. Ptolemy was put to shame before him, and fled; and many fell wounded to death. +\v 19 They took possession of the strong cities in the land of Egypt, and he took the spoils of Egypt. +\p +\v 20 Antiochus, after he had defeated Egypt, returned in\f + \fr 1:20 \ft circa B.C. 170. See 2 Maccabees 5:11-16. \f* the one hundred forty third year, and went up against Israel and Jerusalem with a\f + \fr 1:20 \ft Gr. \fqa heavy. \f* great multitude, +\v 21 and entered presumptuously into the sanctuary, and took the golden altar, the lampstand for the light, and all its utensils. +\v 22 He took the table of the show bread, the cups for the drink offerings, the bowls, the golden censers, the veil, the crowns, and the gold decoration on the front of the temple. He peeled it all off. +\v 23 He took the silver, the gold, and the precious vessels. He took the hidden treasures which he found. +\v 24 When he had taken all of these, he went away into his own land. He made a great slaughter, and spoke very arrogantly. +\v 25 Great mourning came upon Israel, in every place where they were. +\v 26 The rulers and elders groaned. The virgins and young men were made feeble. The beauty of the women was changed. +\v 27 Every bridegroom took up lamentation. She who sat in the marriage chamber was mourning. +\v 28 The land was moved for its inhabitants, and all the house of Jacob was clothed with shame. +\p +\v 29 \f + \fr 1:29 \ft See 2 Maccabees 5:24. \f*After two full years, the king sent a chief collector of tribute to the cities of Judah, and he came to Jerusalem with a\f + \fr 1:29 \ft Gr. \fqa heavy. \f* great multitude. +\v 30 He spoke words of peace to them in subtlety, and they believed him. Then he fell upon the city suddenly, struck it very severely, and destroyed many people of Israel. +\v 31 He took the spoils of the city, set it on fire, and pulled down its houses and its walls on every side. +\v 32 They led captive the women and the children, and seized the livestock. +\v 33 Then they fortified the city of David with a large, strong wall and with strong towers, and it became their citadel. +\v 34 They put a sinful nation, transgressors of the law, there, and they strengthened themselves in it. +\v 35 They stored up weapons and food, and gathering together the spoils of Jerusalem, they stored them there, and they became a great menace. +\v 36 It became a place to lie in wait against the sanctuary, and an evil adversary to Israel continually. +\v 37 They shed innocent blood on every side of the sanctuary, and defiled the sanctuary. +\v 38 The inhabitants of Jerusalem fled because of them. She became a habitation of foreigners. She became foreign to those who were born in her, and her children forsook her. +\v 39 Her sanctuary was laid waste like a wilderness,\f + \fr 1:39 \ft See 2 Maccabees 6:6. \f* her feasts were turned into mourning, her Sabbaths into reproach, and her honor into contempt. +\v 40 According to her glory, so was her dishonor multiplied, and her exaltation was turned into mourning. +\p +\v 41 King Antiochus wrote to his whole kingdom that all should be one people, +\v 42 and that each should forsake his own laws. All the nations agreed according to the word of the king. +\v 43 Many of Israel consented to his worship, sacrificed to the idols, and profaned the Sabbath. +\v 44 The king sent letters by the hand of messengers to Jerusalem and the cities of Judah, that they should follow laws strange to the land, +\v 45 and should forbid whole burnt offerings and sacrifice and drink offerings in the sanctuary; and should profane the Sabbaths and feasts, +\v 46 and pollute the sanctuary and those who were holy; +\v 47 that they should build altars, and temples, and shrines for idols, and should sacrifice swine’s flesh and unclean animals; +\v 48 and that they should leave their sons uncircumcised, that they should make their souls abominable with all manner of uncleanness and profanation; +\v 49 so that they might forget the law, and change all the ordinances. +\v 50 Whoever doesn’t do according to the word of the king, he shall die. +\v 51 According to all these words wrote he to his whole kingdom. He appointed overseers over all the people, and he commanded the cities of Judah to sacrifice, city by city. +\v 52 From the people were gathered together to them many, everyone who had forsaken the law; and they did evil things in the land. +\v 53 They made Israel to hide themselves in every place of refuge which they had. +\p +\v 54 On the fifteenth day of Chislev, in\f + \fr 1:54 \ft circa B.C. 168. See 2 Maccabees 5:11. \f* the one hundred forty fifth year, they built an abomination of desolation upon the altar,\f + \fr 1:54 \ft The two words rendered \fqa altar \ft are different in the Greek: and so in 1 Maccabees 1:59. \f* and in the cities of Judah on every side they built idol altars.\f + \fr 1:54 \ft The two words rendered \fqa altar \ft are different in the Greek: and so in 1 Maccabees 1:59. \f* +\v 55 At the doors of the houses and in the streets they burned incense. +\v 56 They tore the books of the law which they found in pieces and set them on fire. +\v 57 Anyone who was found with any a book of the covenant, and if any consented to the law, the king’s sentence delivered him to death. +\v 58 Thus did they in their might to Israel, to those who were found month by month in the cities. +\v 59 On the twenty-fifth day of the month they sacrificed upon the idol altar that was on top of the altar of burnt offering. +\v 60 \f + \fr 1:60 \ft See 2 Maccabees 6:10.\f*They put to death women who had circumcised their children, according to the commandment. +\v 61 They hung their babies around their necks, and their houses, and those who had circumcised them. +\v 62 Many in Israel were fully resolved and confirmed in themselves not to eat unclean things. +\v 63 \f + \fr 1:63 \ft See 2 Maccabees 6:19 and 7:1, etc. \f*They chose to die, that they might not be defiled with the food, and that they might not profane the holy covenant; and they died. +\v 64 Exceedingly great wrath came upon Israel. +\c 2 +\p +\v 1 In those days Mattathias the son of John, the son of Simeon, a priest of the sons of Joarib, from Jerusalem rose up; and he lived at Modin. +\v 2 And he had five sons:\f + \fr 2:2 \ft Gr. \fqa Joannes. \f* John, who was surnamed Gaddis; +\v 3 Simon, who was called Thassi; +\v 4 Judas, who was called Maccabaeus; +\v 5 Eleazar, who was called Avaran; and Jonathan, who was called Apphus. +\p +\v 6 He saw the blasphemies that were committed in Judah and in Jerusalem, +\v 7 and he said, “Woe is me! Why was I born to see the destruction of my people and the destruction of the holy city, and to dwell there when it was given into the hand of the enemy, the sanctuary into the hand of foreigners? +\v 8 Her temple has become like a man who was glorious. +\v 9 Her vessels of glory are carried away into captivity. Her infants are slain in her streets. Her young men are slain with the enemy’s sword. +\v 10 What nation has not inherited her palaces and taken possession of her spoils? +\v 11 Her adornment has all been taken away. Instead of a free woman, she has become a slave. +\v 12 Behold, our holy things, our beauty, and our glory are laid waste. The Gentiles have profaned them. +\v 13 Why should we live any longer?” +\p +\v 14 Mattathias and his sons tore their clothes, put on sackcloth, and mourned exceedingly. +\p +\v 15 And the king’s officers who were enforcing the apostasy came into the city Modin to sacrifice. +\v 16 Many of Israel came to them, and Mattathias and his sons were gathered together. +\v 17 The king’s officers answered and spoke to Mattathias, saying, “You are a ruler and an honorable and great man in this city, and strengthened with sons and kindred. +\v 18 Now therefore come first and do the commandment of the king, as all the nations have done, including the men of Judah and those who remain in Jerusalem. You and your house will be numbered among the king’s\f + \fr 2:18 \ft See 1 Maccabees 3:38; 10:10, etc.; Compare 1 Maccabees 10:65; 11:27; 2 Maccabees 8:9. \f* friends, and you and your sons will be honored with silver and gold and many gifts.” +\p +\v 19 And Mattathias answered and said with a loud voice, “If all the nations that are in the house of the king’s dominion listen to him, to fall away each one from the worship of his fathers, and have made choice to follow his commandments, +\v 20 yet I and my sons and my kindred will walk in the covenant of our fathers. +\v 21 Far be it from us that we should forsake the law and the ordinances. +\v 22 We will not listen to the king’s words, to turn aside from our worship, to the right hand, or to the left.” +\p +\v 23 When he had finished speaking these words, a Jew came in the sight of all to sacrifice on the altar which was at Modin, according to the king’s commandment. +\v 24 Mattathias saw it, so his zeal was kindled, and his guts trembled, and he vented his wrath according to judgment, and ran and killed him upon the altar. +\v 25 He killed the king’s officer, who compelled men to sacrifice, at the same time, and pulled down the altar. +\v 26 He was zealous for the law, even as Phinehas did to Zimri the son of Salu. +\p +\v 27 Mattathias cried out in the city with a loud voice, saying, “Whoever is zealous for the law and maintains the covenant, let him follow me!” +\v 28 He and his sons fled into the mountains, and left all that they had in the city. +\p +\v 29 Then many who sought justice and judgment went down into the wilderness to live there— +\v 30 they, their children, their wives, and their livestock—because evils were multiplied upon them. +\v 31 It was told the king’s officers and the forces that were in Jerusalem, the city of David, that certain men who had broken the king’s commandment had gone down into the secret places in the wilderness; +\v 32 and many pursued after them, and having overtaken them, they encamped against them and set the battle in array against them on the Sabbath day. +\v 33 They said to them, “Enough of this! Come out and do according to the word of the king, and you will all live!” +\p +\v 34 They said, “We won’t come out. We won’t do the word of the king, to profane the Sabbath day.” +\p +\v 35 Then the enemy hurried to attack them. +\p +\v 36 They didn’t answer them. They didn’t cast a stone at them, or block their secret places, +\v 37 saying, “Let’s all die in our innocence. Heaven and earth testify for us, that you put us to death unjustly.” +\p +\v 38 So they attacked them on the Sabbath, and they died—they, their wives, their children, and their livestock—in number a thousand souls of men. +\p +\v 39 When Mattathias and his friends found out about it, and they mourned over them exceedingly. +\v 40 One said to another, “If we all do as our kindred have done, and don’t fight against the Gentiles for our lives and our ordinances, they will quickly destroy us from off the earth.” +\v 41 So they decided that day, saying, “Whoever comes against us to battle on the Sabbath day, let’s fight against him, and we will in no way all die, as our kindred died in the secret places.” +\p +\v 42 Then a company of the Hasidaeans,\f + \fr 2:42 \ft That is, \fqa Chasidim. \f* mighty men of Israel, everyone who offered himself willingly for the law, were gathered together to them. +\v 43 All those who fled from the evils were added to them, and supported them. +\v 44 They mustered an army, and struck sinners in their anger, and lawless men in their wrath. The rest fled to the Gentiles for safety. +\v 45 And Mattathias and his friends went around and pulled down the altars. +\v 46 They forcibly circumcised the boys who were uncircumcised, as many as they found in the coasts of Israel. +\v 47 They pursued the arrogant, and the work prospered in their hand. +\v 48 They rescued the law out of the hand of the Gentiles and out of the hand of the kings. They never allowed the sinner to triumph. +\p +\v 49 The days of Mattathias drew near that he should die, and he said to his sons, “Now pride and scorn have gained strength. It is a season of overthrow and indignant wrath. +\v 50 Now, my children, be zealous for the law, and give your lives for the covenant of your fathers. +\v 51 Call to remembrance the deeds of our fathers which they did in their generations; and receive great glory and an everlasting name. +\v 52 Wasn’t Abraham found faithful in temptation, and it was reckoned to him for righteousness? +\v 53 Joseph in the time of his distress kept the commandment, and became lord of Egypt. +\v 54 Phinehas our father, because he was exceedingly zealous, obtained the covenant of an everlasting priesthood. +\v 55 Joshua became a judge in Israel for fulfilling the word. +\v 56 Caleb obtained a heritage in the land for testifying in the congregation. +\v 57 David inherited the throne of a kingdom forever and ever for being merciful. +\v 58 Elijah was taken up into heaven because he was exceedingly zealous for the law. +\v 59 Hananiah, Azariah, and Mishael believed, and were saved out of the flame. +\v 60 Daniel was delivered from the mouth of lions for his innocence. +\p +\v 61 “Thus consider from generation to generation that no one who put their trust in him will lack for strength. +\v 62 Don’t be afraid of the words of a sinful man; for his glory will be dung and worms. +\v 63 Today he will be lifted up, and tomorrow he will in no way be found, because he has returned to dust, and his thought has perished. +\v 64 You, my children, be strong, and show yourselves men on behalf of the law; for in it you will obtain glory. +\v 65 Behold, Simon your brother, whom I know to be a man of counsel. Always listen to him. He shall be a father to you. +\v 66 Judas Maccabaeus has been strong and mighty from his youth. He shall be your captain and shall fight\f + \fr 2:66 \ft Some ancient authorities read \fqa you shall fight. \f* the battle of the people. +\v 67 Rally around all the doers of the law, and avenge the wrong done to your people. +\v 68 Repay the Gentiles, and obey the commandments of the law.” +\p +\v 69 He blessed them, and was gathered to his ancestors. +\v 70 He died in\f + \fr 2:70 \ft circa B.C. 167. \f* the one hundred forty sixth year, and his sons buried him in the tombs of his ancestors at Modin. All Israel made great lamentation for him. +\c 3 +\p +\v 1 His son Judas, who was called Maccabaeus, rose up in his place. +\v 2 All his kindred helped him, and so did all those who joined with his father, and they fought with gladness the battle of Israel. +\v 3 He got his people great glory, and put on a breastplate like a giant, and bound his warlike harness around him, and set battles in array, protecting the army with his sword. +\v 4 He was like a lion in his deeds, and like a lion’s cub roaring for prey. +\v 5 He hunted and pursued the lawless, and he burned up those who troubled his people. +\v 6 The lawless shrunk back for fear of him, and all the workers of lawlessness were very troubled, and deliverance prospered in his hand. +\v 7 He angered many kings and made Jacob glad with his acts. His memory is blessed forever. +\v 8 He went through the cities of Judah, destroyed the ungodly\f + \fr 3:8 \ft Gr. \fqa out of it. \f* out of the land, and turned away wrath from Israel. +\v 9 He was renowned to the utmost part of the earth. He gathered together those who were ready to perish. +\p +\v 10 Apollonius gathered the Gentiles together with a great army from Samaria to fight against Israel. +\v 11 Judas learned of it, and he went out to meet him, struck him, and killed him. Many fell wounded to death, and the rest fled. +\v 12 They took their spoils, and Judas took Apollonius’ sword, and he fought with it all his days. +\p +\v 13 Seron, the commander of the army of Syria, heard that Judas had gathered a large company, including a body of faithful men who stayed with him, went out to war. +\v 14 He said, “I will make myself a name and get myself glory in the kingdom. I will fight against Judas and those who are with him, who despise the king’s command. +\v 15 A mighty army of the ungodly went up with him to help him, to take vengeance on the children of Israel. +\p +\v 16 He came near to the ascent of Bethhoron, and Judas went out to meet him with a small company. +\v 17 But when they saw the army coming to meet them, they said to Judas, “What? Shall we be able, being a small company, to fight against so great and strong a multitude? We for our part are faint, having tasted no food this day.” +\p +\v 18 Judas said, “It is an easy thing for many to be hemmed in by the hands of a few. With\f + \fr 3:18 \ft Some ancient authorities read \fqa the God of heaven. \f* heaven it is all one, to save by many or by few; +\v 19 for victory in battle stands not in the multitude of an army, but strength is from heaven. +\v 20 They come to us in fullness of insolence and lawlessness, to destroy us and our wives and our children, and to plunder us, +\v 21 but we fight for our lives and our laws. +\v 22 He himself will crush them before our face; but as for you, don’t be afraid of them. +\p +\v 23 Now when he had finished speaking, he rushed suddenly against Seron and his army, and they were defeated before him. +\v 24 They pursued them down the descent of Bethhoron to the plain, and about eight hundred men of them fell; but the rest fled into the land of the Philistines. +\p +\v 25 The fear of Judas and his kindred, and the dread of them, began to fall on the nations around them. +\v 26 His fame reached the king, and every nation told of the battles of Judas. +\p +\v 27 But when King Antiochus heard these words, he was full of indignation; and he sent and gathered together all the forces of his realm, an exceedingly strong army. +\v 28 He opened his treasury and gave his forces pay for a year, and commanded them to be ready for every need. +\v 29 He saw that the money was gone from his treasures, and that the tributes of the country were small, because of the dissension and disaster which he had brought upon the land, to the end that he might take away the laws which had been from the first days. +\v 30 He was afraid that he wouldn’t have enough as at other times for the charges and the gifts which he used to give with a liberal hand, more abundantly than the kings who were before him. +\v 31 And he was exceedingly perplexed in his mind, and he determined to go into Persia, and to take the tributes of those countries, and to gather much money. +\v 32 He left Lysias, an honorable man, and one of royal lineage, to be over the affairs of the king from the river Euphrates to the borders of Egypt, +\v 33 and to bring up his son Antiochus, until he came again. +\v 34 He delivered to Lysias half of his forces and the elephants, and gave him charge of all the things that he would have done, and concerning those who lived in Judea and in Jerusalem, +\v 35 that he should send an army against them to root out and destroy the strength of Israel and the remnant of Jerusalem, and to take away their memory from the place, +\v 36 and that he should make foreigners live in all their territory, and should divide their land to them by lot. +\v 37 The king took the half that remained of the forces, and left Antioch, his royal city, in the one hundred forty seventh year;\f + \fr 3:37 \ft circa B.C. 166. \f* and he passed over the river Euphrates, and went through the upper countries. +\p +\v 38 Lysias chose Ptolemy the son of Dorymenes, Nicanor, and Gorgias, mighty men of the king’s friends;\f + \fr 3:38 \ft See 1 Maccabees 2:18. \f* +\v 39 and with them, he sent forty thousand infantry and seven thousand cavalry to go into the land of Judah and to destroy it, according to the word of the king. +\v 40 They set out with all their army, and came and encamped near Emmaus in the plain country. +\v 41 The merchants of the country heard of their fame, and took silver and gold in large quantities, and fetters,\f + \fr 3:41 \ft Most of the authorities read \fqa servants. \f* and came into the camp to take the children of Israel for slaves. Forces of Syria and of the land of the Philistines\f + \fr 3:41 \ft Gr. \fqa foreigners. \f* joined with them. +\p +\v 42 Judas and his kindred saw that evils were multiplied, and that the forces were encamping in their borders. They learned about the king’s words which he had commanded, to destroy the people and make an end of them. +\v 43 Then they each said to his neighbor, “Let’s repair the ruins of our people. Let’s fight for our people and the holy place.” +\v 44 The congregation was gathered together, that they might be ready for battle, and that they might pray and ask for mercy and compassion. +\v 45 Jerusalem was without inhabitant like a wilderness. There was none of her offspring who went in or went out. The sanctuary was trampled down. Children of foreigners were in the citadel. The Gentiles lived there. Joy was taken away from Jacob, and the pipe and the harp ceased. +\v 46 They gathered themselves together, and came to Mizpeh, near Jerusalem; for in Mizpeh there used to be a place of prayer for Israel. +\v 47 They fasted that day, put on sackcloth, put ashes on their heads, tore their clothes, +\v 48 and opened the book of the law, to learn about the things for which the Gentiles consulted the images of their idols. +\v 49 They brought the priests’ garments, the first fruits, and the tithes. They stirred up the Nazarites, who had accomplished their days. +\v 50 They cried aloud toward heaven, saying, “What should we do with these men? Where should we carry them away? +\v 51 Your holy place is trampled down and profaned. Your priests mourn in humiliation. +\v 52 Behold, the Gentiles are assembled together against us to destroy us. You know what things they imagine against us. +\v 53 How will we be able to stand against them, unless you help us?” +\v 54 They sounded with the trumpets, and gave a loud shout. +\p +\v 55 And after this Judas appointed leaders of the people: captains of thousands, captains of hundreds, captains of fifties, and captains of tens. +\v 56 He said to those who were building houses, were betrothing wives, were planting vineyards, and were fearful, that they should return, each man to his own house, according to the law. +\v 57 The army marched out and encamped upon the south side of Emmaus. +\v 58 Judas said, “Arm yourselves and be valiant men! Be ready in the morning to fight with these Gentiles who are assembled together against us to destroy us and our holy place. +\v 59 For it is better for us to die in battle than to see the calamities of our nation and the holy place. +\v 60 Nevertheless, as may be the will in heaven, so shall he do. +\c 4 +\p +\v 1 Gorgias took five thousand infantry, a thousand chosen cavalry, and the army moved out at night, +\v 2 that it might fall upon the army of the Jews and strike them suddenly. The men of the citadel were his guides. +\v 3 Judas heard of this, and he and the valiant men moved, that he might strike the king’s army which was at Emmaus +\v 4 while the forces were still dispersed from the camp. +\v 5 Gorgias came into the camp of Judas at night and found no man. He sought them in the mountains; for he said, “These men are running away from us.” +\p +\v 6 As soon as it was day, Judas appeared in the plain with three thousand men. However they didn’t have the armor and swords they desired. +\v 7 They saw the camp of the Gentiles strong and fortified, with cavalry all around it; and these were expert in war. +\v 8 Judas said to the men who were with him, “Don’t be afraid of their numbers, or when they charge. +\v 9 Remember how our fathers were saved in the Red sea, when Pharaoh pursued them with an army. +\v 10 Now let’s cry to heaven, if he will have us, and will remember the covenant of our fathers, and destroy this army before our face today. +\v 11 Then all the Gentiles will know that there is one who redeems and saves Israel. +\p +\v 12 The foreigners lifted up their eyes, and saw them coming near them. +\v 13 They went out of the camp to battle. Those who were with Judas sounded their trumpets +\v 14 and joined battle. The Gentiles were defeated, and fled into the plain. +\v 15 But all those in the rear fell by the sword. They pursued them to\f + \fr 4:15 \ft Gr. \fqa Gazera. \f* Gazara, and to the plains of Idumaea, Azotus, and Jamnia. About three thousand of those men fell. +\v 16 Then Judas and his army returned from pursuing them; +\v 17 and he said to the people, “Don’t be greedy for the spoils, because there is a battle before us. +\v 18 Gorgias and his army are near us on the mountain. But stand now against our enemies and fight against them, and afterwards take the spoils with boldness.” +\v 19 While Judas was finishing this speech, a part of them appeared looking out from the mountain. +\v 20 They saw that their army had been put to flight, and that the Jews were burning the camp; for the smoke that was seen declared what was done. +\v 21 But when they perceived these things, they were very afraid. Perceiving also the army of Judas in the plain ready for battle, +\v 22 they all fled into the land of the\f + \fr 4:22 \ft Gr. \fqa foreigners. \f* Philistines. +\v 23 Judas returned to plunder the camp, and they took much gold, silver, blue, sea purple, and great riches. +\v 24 Then they returned home, and sang a song of thanksgiving, and gave praise to heaven, because he is good, because his mercy endures forever. +\v 25 Israel had a great deliverance that day. +\p +\v 26 The foreigners who had escaped came and told Lysias all the things that had happened. +\v 27 When he heard of it, he was confounded and discouraged, because the things he desired had not been done to Israel, nor had such things happened as the king commanded him. +\p +\v 28 In the next year, he gathered together sixty thousand chosen infantry and five thousand cavalry, that he might subdue them. +\v 29 They came into Idumaea and encamped at Bethsura. Judas met them with ten thousand men. +\v 30 He saw that the army was strong, and he prayed and said, “Blessed are you, O Savior of Israel, who defeated the attack of the mighty warrior by the hand of your servant David, and delivered the army of the\f + \fr 4:30 \ft Gr. \fqa foreigners. \f* Philistines into the hands of Jonathan the son of Saul, and of his armor bearer. +\v 31 Hem in this army in the hand of your people Israel, and let them be ashamed for their army and their cavalry. +\v 32 Give them faintness of heart. Cause the boldness of their strength to melt away, and let them quake at their destruction. +\v 33 Strike them down with the sword of those who love you, and let all who know your name praise you with thanksgiving.” +\p +\v 34 They joined in battle; and about five thousand men of Lysias’ army fell. They fell down near them. +\v 35 But when Lysias saw that his troops were put to flight, and the boldness that had come upon those who were with Judas, and how they were ready either to live or to die nobly, he withdrew to Antioch, and gathered together hired soldiers, that he might come again into Judea with an even greater army. +\p +\v 36 But Judas and his kindred said, “Behold, our enemies are defeated. Let’s go up to cleanse the holy place and to rededicate it.” +\v 37 All the army was gathered together, and they went up to mount Zion. +\v 38 They saw the sanctuary laid desolate, the altar profaned, the gates burned up, shrubs growing in the courts as in a forest or as on one of the mountains, and the priests’ chambers pulled down; +\v 39 and they tore their clothes, made great lamentation, put ashes upon their heads, +\v 40 fell on their faces to the ground, \f + \fr 4:40 \ft Compare Numbers 31:6. \f* blew with the solemn trumpets,\f + \fr 4:40 \ft Gr. \fqa trumpets of signals. \f* and cried toward heaven. +\v 41 Then Judas appointed certain men to fight against those who were in the citadel until he had cleansed the holy place. +\p +\v 42 He chose blameless priests who were devoted to the law; +\v 43 and they cleansed the holy place and carried the defiled stones out to an unclean place. +\v 44 They deliberated what to do with the altar of burnt offerings, which had been profaned. +\v 45 A good plan came into their mind, that they should pull it down, lest it would be a reproach to them, because the Gentiles had defiled it. So they pulled down the altar +\v 46 and laid up the stones on the temple hill in a convenient place, until a prophet would come to give an answer concerning them. +\v 47 They took whole stones according to the law, and built a new altar like the former. +\v 48 They built the holy place and the inner parts of the house; and they consecrated the courts. +\v 49 They made new holy vessels, and they brought the lampstand, the altar of incense, and the table into the temple. +\v 50 They burned incense on the altar, and they lit the lamps that were upon the lampstand, and they gave light in the temple. +\v 51 They set loaves upon the table, hung up the curtains, and finished all the work which they had done. +\p +\v 52 They rose up early in the morning, on the twenty-fifth day of the ninth month, which is the month Chislev, in\f + \fr 4:52 \ft circa B.C. 165. \f* the one hundred forty eighth year, +\v 53 and offered sacrifice according to the law on the new altar of burnt offerings which they had made. +\v 54 At the time and day the Gentiles had profaned it, even then it was dedicated with songs, harps, lutes, and with cymbals. +\v 55 All the people fell on their faces, worshiped, and gave praise toward heaven, which had given them good success. +\v 56 They celebrated the dedication of the altar eight days, and offered burnt offerings with gladness, and sacrificed a sacrifice of deliverance and praise. +\v 57 They decorated the front of the temple with crowns of gold and small shields. They dedicated the gates and the priests’ chambers, and made doors for them. +\v 58 There was exceedingly great gladness among the people, and the reproach of the Gentiles was turned away. +\p +\v 59 Judas and his kindred and the whole congregation of Israel ordained that the days of the dedication of the altar should be kept in their seasons from year to year for eight days, from the twenty-fifth day of the month Chislev, with gladness and joy. +\p +\v 60 At that time, they fortified mount Zion with high walls and strong towers around it, lest perhaps the Gentiles might come and trample them down, as they had done before. +\v 61 Judas stationed a garrison to guard it. They fortified Bethsura to keep it, that the people might have a stronghold near Idumaea. +\c 5 +\p +\v 1 It came to pass, when the Gentiles all around heard that the altar had been rebuilt and the sanctuary dedicated as before, they were exceedingly angry. +\v 2 They took counsel to destroy the race of Jacob that was in the midst of them, and they began to kill and destroy among the people. +\v 3 Judas fought against the children of Esau in Idumaea at Akrabattine, because they besieged Israel. He struck them with a great slaughter, humbled them, and took their spoils. +\v 4 He remembered the wickedness of the children of\f + \fr 5:4 \ft Compare 2 Maccabees 10:18-23. \f* Baean, who were a snare and a stumbling block to the people, lying in wait for them on the highways. +\v 5 They were shut up by him in the towers. He encamped against them, and destroyed them utterly, and burned with fire the towers of the place with all who were in them. +\v 6 He passed over to the children of Ammon, and found a mighty band and many people, with Timotheus for their leader. +\v 7 He fought many battles with them, and they were defeated before his face. He struck them, +\v 8 and took possession of Jazer and its villages,\f + \fr 5:8 \ft Gr. \fqa daughters. \ft Compare Numbers 21:25. \f* and returned again into Judea. +\p +\v 9 The Gentiles who were in Gilead gathered themselves together against the Israelites who were on their borders, to destroy them. They fled to the stronghold of Dathema, +\v 10 and sent letters to Judas and his kindred, saying, “The Gentiles who are around us are gathered together against us to destroy us. +\v 11 They are preparing to come and get possession of the stronghold where we fled for refuge, and Timotheus is the leader of their army. +\v 12 Now therefore come and deliver us from their hand, for many of us have fallen. +\v 13 All our kindred who were in the land of \f + \fr 5:13 \ft Compare 2 Maccabees 12:17. \f*Tubias have been put to death. They have carried their wives, their children, and their stuff into captivity. They destroyed about a thousand men there.” +\p +\v 14 While the letters were still being read, behold, other messengers came from Galilee with their clothes torn, bringing a similar report, +\v 15 saying, “People of Ptolemais, of Tyre, of Sidon, and all Galilee of the\f + \fr 5:15 \ft Gr. \fqa foreigners. \f* Gentiles have gathered together to destroy us.” +\p +\v 16 Now when Judas and the people heard these words, a great congregation assembled together to determine what they should do for their kindred who were in distress and under attack. +\v 17 Judas said to Simon his brother, “Choose men and go deliver your kindred who are in Galilee, but Jonathan my brother and I will go into the land of Gilead.” +\v 18 He left Joseph the son of Zacharias, and Azarias, as leaders of the people, with the remnant of the army, in Judea, to guard it. +\v 19 He commanded them, saying, “Take charge of this people, and fight no battle with the Gentiles until we return.” +\v 20 Then three thousand men were assigned to go into Galilee with Simon, but eight thousand men were assigned to Judas to go into the land of Gilead. +\p +\v 21 Simon went into Galilee and fought many battles with the Gentiles, and the Gentiles were defeated before him. +\v 22 He pursued them to the gate of Ptolemais. About three thousand men of the Gentiles fell, and he took their spoils. +\v 23 They took to them those who were in Galilee and in Arbatta, with their wives, their children, and all that they had, and brought them into Judea with great gladness. +\v 24 Judas Maccabaeus and his brother Jonathan passed over the Jordan, and went three days’ journey in the wilderness. +\v 25 They met with the Nabathaeans, and these met them in a peaceful manner and told them all things that had happened to their kindred in the land of Gilead, +\v 26 and how many of them were shut up in Bosora, Bosor, Alema,\f + \fr 5:26 \ft Compare 2 Maccabees 12:13. \f* Casphor, Maked, and\f + \fr 5:26 \ft compare 2 Maccabees 12:21. \f* Carnaim—all these cities are strong and large— +\v 27 and how they were shut up in the rest of the cities of the land of Gilead, and that tomorrow they planned to encamp against the strongholds, and to take them, and to destroy all these men in one day. +\p +\v 28 Judas and his army turned suddenly by the way of the wilderness to Bosora; and he took the city, and killed all the males with the edge of the sword, took all their spoils, and burned the city with fire. +\v 29 He left there at night, and went until he came to the stronghold. +\v 30 When the morning came, they lifted up their eyes and saw many people who couldn’t be counted, bearing ladders and engines of war, to take the stronghold; and they were fighting against them. +\v 31 Judas saw that the battle had begun, and that the cry of the city went up to heaven, with trumpets and a great sound, +\v 32 and he said to the men of his army, “Fight today for your kindred!” +\v 33 Then he went out behind them in three companies. They sounded with their trumpets and cried out in prayer. +\v 34 And the army of Timotheus perceived that it was Maccabaeus, and they fled from before him. He struck them with a great slaughter. About eight thousand men of them fell on that day. +\p +\v 35 He turned away to Mizpeh and fought against it, took it, killed all its males, took its spoils, and burned it with fire. +\v 36 From there he marched and took\f + \fr 5:36 \ft See 1 Maccabees 5:26 \f* Casphor, Maked, Bosor, and the other cities of the land of Gilead. +\p +\v 37 Now after these things, Timotheus gathered another army and encamped near Raphon beyond the brook. +\v 38 Judas sent men to spy on the army; and they brought him word, saying, “All the Gentiles who are around us are gathered together to them, an exceedingly great army. +\v 39 They have hired Arabians to help them, and are encamped beyond the brook, ready to come against you to battle.” So Judas went to meet them. +\p +\v 40 Timotheus said to the captains of his army when Judas and his army drew near to the brook of water, “If he crosses over to us first, we won’t be able to withstand him, for he will certainly defeat us; +\v 41 but if he is afraid, and encamps beyond the river, we will cross over to him, and defeat him.” +\v 42 Now when Judas came near to the water brook, he caused the scribes of the people to remain by the brook, and commanded them, saying, “Allow no man to encamp, but let all come to the battle.” +\v 43 Then he crossed over the first against them, and all the people after him; and all the Gentiles were defeated before his face, and threw away their weapons, and fled to the temple at \f + \fr 5:43 \ft See 1 Maccabees 5:26. \f*Carnaim. +\v 44 They took the city and burned the temple with fire, together with all who were in it. Carnaim was subdued. They couldn’t stand any longer before the face of Judas. +\p +\v 45 Judas gathered together all Israel, those who were in the land of Gilead, from the least to the greatest, with their wives, their children, and their stuff, an exceedingly great army, that they might come into the land of Judah. +\v 46 They came as far as Ephron, and this same city was large and very strong. It was on the road where they were going. They couldn’t turn away from it on the right hand or on the left, but needed to pass through the middle of it. +\v 47 The people of the city shut them out and blocked the gates with stones. +\v 48 Judas sent to them with words of peace, saying, “We will pass through your land to go into our own land, and no one will harm you. We will only pass by on our feet.” But they wouldn’t open to him. +\v 49 Then Judas commanded proclamation to be made in the army, that each man should encamp in the place where he was. +\v 50 So the men of the army encamped, and fought against the city all that day and all that night, and the city was delivered into his hands. +\v 51 He destroyed all the males with the edge of the sword, razed the city, took its plunder, and passed through the city over those who were slain. +\v 52 They went over the Jordan into the great plain near Bethshan. +\v 53 And Judas gathered together those who lagged behind and encouraged the people all the way through, until he came into the land of Judah. +\v 54 They went up to mount Zion with gladness and joy, and offered whole burnt offerings, because not so much as one of them was slain until they returned in peace. +\p +\v 55 In the days when Judas and Jonathan were in the land of Gilead, and Simon his brother in Galilee before Ptolemais, +\v 56 Joseph the son of Zacharias, and Azarias, rulers of the army, heard of their exploits and of the war, and what things they had done. +\v 57 They said, “Let’s also get us a name, and let’s go fight against the Gentiles who are around us.” +\v 58 So they gave orders to the men of the army that was with them, and went toward Jamnia. +\v 59 Gorgias and his men came out of the city to meet them in battle. +\v 60 Joseph and Azarias were put to flight, and were pursued to the borders of Judea. About two thousand men of Israel fell on that day. +\v 61 There was a great overthrow among the people, because they didn’t listen to Judas and his kindred, thinking to do some exploit. +\v 62 But they were not of the family of those men by whose hand deliverance was given to Israel. +\p +\v 63 The man Judas and his kindred were glorified exceedingly in the sight of all Israel, and of all the Gentiles, wherever their name was heard of. +\v 64 Men gathered together to them, acclaiming them. +\p +\v 65 Judas and his kindred went out and fought against the children of Esau in the land toward the south. He struck Hebron and its villages,\f + \fr 5:65 \ft Gr. \fqa daughters. \ft Compare Numbers 21:25. \f* pulled down its strongholds, and burned its towers all around. +\v 66 He marched to go into the land of the\f + \fr 5:66 \ft Gr. \fqa foreigners. \f* Philistines, and he went through\f + \fr 5:66 \ft Or, \fqa Marisa \ft See Josephus, Antiquities 12:8. 6, and 2 Maccabees 12:35. \f* Samaria. +\v 67 In that day certain priests, desiring to do exploits there, were slain in battle, when they went out to battle unadvisedly. +\v 68 But Judas turned toward Azotus, to the land of the\f + \fr 5:68 \ft Gr. \fqa foreigners. \f* Philistines, pulled down their altars, burned the carved images of their gods with fire, took the plunder of their cities, and returned into the land of Judah. +\c 6 +\p +\v 1 King Antiochus was traveling through the upper countries; and he heard that in Elymais in Persia there was a city renowned for riches, for silver and gold, +\v 2 and that the temple which was in it was exceedingly rich, and that in it were golden shields, breastplates, and weapons which Alexander, son of Philip, the Macedonian king, who reigned first among the Greeks, left behind there. +\v 3 So he came and tried to take the city and to pillage it; and he was not able, because his plan was known to them of the city, +\v 4 and they rose up against him in battle. He fled and returned to Babylon with great disappointment. +\p +\v 5 Then someone came into Persia bringing him news that the armies which went against the land of Judah had been put to flight, +\v 6 and that Lysias went first with a strong army and was put to shame before them, and that they had grown strong because of weapons, power, and a supply of plunder which they took from the armies that they had cut off, +\v 7 and that they had pulled down the abomination which he had built upon the altar that was in Jerusalem, and that they had surrounded the sanctuary with high walls, as before, and also Bethsura, his city. +\p +\v 8 It came to pass, when the king heard these words, he was astonished and moved exceedingly. He laid himself down on his bed, and fell sick for grief, because it had not turned out for him as he had planned. +\v 9 He was there many days, because great grief continually gripped him, and he realized that he would die. +\v 10 He called for all his\f + \fr 6:10 \ft See 1 Maccabees 2:18. \f* friends, and said to them, “Sleep departs from my eyes, and my heart fails because of worry. +\v 11 I said in my heart, ‘To what suffering I have come! How great a flood it is that I’m in, now! For I was gracious and loved in my power.’ +\v 12 But now I remember the evils which I did at Jerusalem, and that I took all the vessels of silver and gold that were in it, and sent out to destroy the inhabitants of Judah without a cause. +\v 13 I perceive that it is because of this that these evils have come upon me. Behold, I am perishing through great grief in a strange land.” +\p +\v 14 Then he called for Philip, one of his\f + \fr 6:14 \ft See 1 Maccabees 2:18. \f* friends, and set him over all his kingdom. +\v 15 He gave him his crown, his robe, and his signet ring, so that he could guide Antiochus his son, and nourish him up that he might be king. +\v 16 Then King Antiochus died there in the one hundred forty-ninth year.\f + \fr 6:16 \ft Circa B.C. 164.\f* +\v 17 When Lysias learned that the king was dead, he set up Antiochus his son to reign, whom he had nourished up being young, and he called his name Eupator. +\p +\v 18 Those who were in the citadel kept hemming Israel in around the sanctuary, and always sought to harm them and to strengthen the Gentiles. +\v 19 Judas planned to destroy them, and called all the people together to besiege them. +\v 20 They were gathered together, and besieged them in\f + \fr 6:20 \ft circa B.C. 163. \f* the one hundred fiftieth year, and he made mounds to shoot from, and engines of war. +\v 21 Some of those who were hemmed in came out, and some of the ungodly men of Israel were joined to them. +\v 22 They went to the king, and said, “How long will you not execute judgment, and avenge our kindred? +\v 23 We were willing to serve your father and to live by his words, and to follow his commandments. +\v 24 Because of this, the children of our people besieged the citadel\f + \fr 6:24 \ft Gr. \fqa it. \f* and were alienated from us; but as many of us as they could catch, they killed, and plundered our inheritances. +\v 25 Not against us only did they stretch out their hand, but also against all their borders. +\v 26 Behold, they are encamped this day against the citadel at Jerusalem to take it. They have fortified the sanctuary and Bethsura. +\v 27 If you don’t quickly prevent them, they will do greater things than these, and you won’t be able to control them. +\p +\v 28 When the king heard this, he was angry, and gathered together all his\f + \fr 6:28 \ft See 1 Maccabees 2:18. \f* friends, the rulers of his army, and those who were over the cavalry. +\v 29 Bands of hired soldiers came to him from other kingdoms and from islands of the sea. +\v 30 The number of his forces was one hundred thousand infantry, and twenty thousand cavalry, and thirty-two elephants trained for war. +\v 31 They went through Idumaea, and encamped against Bethsura, and fought against it many days, and made engines of war. The Jews came out and burned them with fire, and fought valiantly. +\p +\v 32 Judas marched away from the citadel and encamped at Bethzacharias, near the king’s camp. +\v 33 The king rose early in the morning, and marched his army\f + \fr 6:33 \ft Or, \fqa itself eager for the fight \f* at full speed along the road to Bethzacharias. His forces made themselves ready to battle and sounded their trumpets. +\v 34 They offered the elephants the juice of grapes and mulberries, that they might prepare them for the battle. +\v 35 They distributed the animals among the phalanxes. They set by each elephant a thousand men armed with coats of mail and helmets of brass on their heads. Five hundred chosen cavalry were appointed for each elephant. +\v 36 These were ready beforehand, wherever the elephant was. Wherever the elephant went, they went with it. They didn’t leave it. +\v 37 Strong, covered wooden towers were upon them, one upon each elephant, fastened upon it with secure harnesses. Upon each were four valiant men who fought upon them, beside his Indian driver. +\v 38 The rest of the cavalry he set on this side and that side on the two flanks of the army, striking terror into the enemy, and protected by the phalanxes. +\v 39 Now when the sun shone upon the shields of gold and brass, the mountains lit up, and blazed like flaming torches. +\p +\v 40 A part of the king’s army was spread upon the high hills and some on the low ground, and they went on firmly and in order. +\v 41 All who heard the noise of their multitude, the marching of the multitude, and the rattling of the weapons trembled; for the army was exceedingly great and strong. +\v 42 Judas and his army drew near for battle, and six hundred men of the king’s army fell. +\v 43 Eleazar, who was called Avaran, saw one of the animals armed with royal breastplates, and it was taller than all the animals, and the king seemed to be on it. +\v 44 He gave his life to deliver his people, and to get himself an everlasting name. +\v 45 He ran upon him courageously into the midst of the phalanx, and killed on the right hand and on the left, and they parted away from him on this side and on that. +\v 46 He crept under the elephant, and stabbed it from beneath, and killed it. The elephant fell to the earth upon him, and he died there. +\v 47 They saw the strength of the kingdom and the fierce attack of the army, and turned away from them. +\p +\v 48 But the soldiers of the king’s army went up to Jerusalem to meet them, and the king encamped toward Judea and toward mount Zion. +\v 49 He made peace with the people of Bethsura. He came out of the city because they had no food there to endure the siege, because it was a Sabbath to the land. +\v 50 The king took Bethsura, and appointed a garrison there to keep it. +\v 51 He encamped against the sanctuary many days; and set there mounds to shoot from, and engines of war, and machines for throwing fire and stones, and weapons to throw darts, and slings. +\v 52 The Jews also made engines of war against their engines, and fought for many days. +\v 53 But there was no food in the sanctuary, because it was the seventh year, and those who fled for safety into Judea from among the Gentiles had eaten up the rest of the stores. +\v 54 There were only a few people left in the sanctuary, because the famine prevailed against them, and they were scattered, each man to his own place. +\p +\v 55 Lysias heard that Philip, whom Antiochus the king, while he was yet alive, appointed to raise his son Antiochus to be king, +\v 56 had returned from Persia and Media, and with him the forces that went with the king, and that he was seeking to take control of the government. +\v 57 He made haste, and gave orders to depart. He said to the king and the leaders of the army and to the men, “We get weaker daily, our food is scant, the place where we encamp is strong, and the affairs of the kingdom lie upon us. +\v 58 Now therefore let’s negotiate with these men, and make peace with them and with all their nation, +\v 59 and covenant with them, that they may walk after their own laws, as before; for because of their laws which we abolished they were angered, and did all these things.” +\p +\v 60 The speech pleased the king and the princes, and he sent to them to make peace; and they accepted it. +\v 61 The king and the princes swore to them. On these conditions, they came out from the stronghold. +\v 62 Then the king entered into mount Zion. He saw the strength of the place, and broke the oath which he had sworn, and gave orders to pull down the wall all around. +\v 63 Then he left in haste and returned to Antioch, and found Philip master of the city. He fought against him, and took the city by force. +\c 7 +\p +\v 1 In the one hundred fifty first year,\f + \fr 7:1 \ft circa B.C. 162. \f* Demetrius the son of Seleucus came out of Rome, and went up with a few men to a city by the sea, and reigned there. +\v 2 It came to pass, when he would go into the house of the kingdom of his fathers, that the army laid hands on Antiochus and Lysias, to bring them to him. +\v 3 The thing became known to him, and he said, “Don’t show me their faces!” +\v 4 So the army killed them. Then Demetrius sat upon the throne of his kingdom. +\p +\v 5 All the lawless and ungodly men of Israel came to him. Alcimus was their leader, desiring to be high priest. +\v 6 They accused the people to the king, saying, “Judas and his kindred have destroyed all your friends, and have scattered us from our own land. +\v 7 Now therefore send a man whom you trust, and let him go and see all the destruction which he has brought on us and the king’s country, and how he has punished them and all who helped them.” +\v 8 So the king chose Bacchides, one of the king’s\f + \fr 7:8 \ft See 1 Maccabees 2:18. \f* friends, who was ruler in the country beyond the river, and was a great man in the kingdom, and faithful to the king. +\v 9 He sent him and that ungodly Alcimus, whom he made the high priest; and he commanded him to take vengeance upon the children of Israel. +\p +\v 10 They marched away and came with a great army into the land of Judah. He sent messengers to Judas and his kindred with words of peace deceitfully. +\v 11 They paid no attention to their words; for they saw that they had come with a great army. +\v 12 A group of scribes gathered together to Alcimus and Bacchides to seek just terms. +\v 13 The\f + \fr 7:13 \ft That is, Chasidim. \f* Hasidaeans were the first among the children of Israel who sought peace from them, +\v 14 for they said, “One who is a priest of the seed of Aaron has come with the army, and he will do us no wrong.” +\v 15 He spoke with them words of peace, and swore to them, saying, “We won’t seek to harm you or your friends.” +\v 16 They trusted him. Then he seized sixty men of them, and killed them in one day, according to the word which was written, +\q1 +\v 17 \f + \fr 7:17 \ft Psalm 79:2, 3. \f* The flesh of your saints +\q2 and their blood was shed all around Jerusalem, +\q2 and there was no one to bury them. +\p +\v 18 The fear and the dread of them fell upon all the people, for they said, “There is neither truth nor justice in them; for they have broken the covenant and the oath which they swore.” +\v 19 Bacchides withdrew from Jerusalem, and encamped in Bezeth. He sent and seized many of the deserters who were with him, and some of the people, and he killed them, throwing them into a large pit. +\v 20 He placed Alcimus in charge of the country and left with him a force to aid him. Then Bacchides went away to the king. +\p +\v 21 Alcimus struggled to maintain his high priesthood. +\v 22 All those who troubled their people joined him, and they took control of the land of Judah, and did great damage in Israel. +\v 23 Judas saw all the wrongs that Alcimus and his company had done among the children of Israel, even more than the Gentiles. +\v 24 He went out into all the borders of Judea and took vengeance on the men who had deserted from him, and they were restrained from going out into the country. +\v 25 But when Alcimus saw that Judas and his company had grown strong, and knew that he was not able to withstand them, he returned to the king, and brought evil accusations against them. +\p +\v 26 \f + \fr 7:26 \ft See 2 Maccabees 14:12. \f*Then the king sent Nicanor, one of his honorable princes, a man who hated Israel and was their enemy, and commanded him to destroy the people. +\v 27 Nicanor came to Jerusalem with a great army. He sent to Judas and his kindred deceitfully with words of peace, saying, +\v 28 “Let there be no battle between me and you; I will come with a few men, that I may see your faces in peace.” +\v 29 He came to Judas, and they saluted one another peaceably. The enemies were ready to seize Judas by violence. +\v 30 This was known to Judas, that he came to him with deceit, and he was very afraid of him, and would see his face no more. +\v 31 Nicanor found out that his plan was disclosed; and he went out to meet Judas in battle beside Capharsalama. +\v 32 About five hundred men of Nicanor’s army fell, and the rest fled into the city of David. +\p +\v 33 After these things, Nicanor went up to mount Zion. Some of the priests came out of the sanctuary, with some of the elders of the people, to salute him peaceably, and to show him the whole burned sacrifice that was being offered for the king. +\v 34 He mocked them, laughed at them, derided them shamefully,\f + \fr 7:34 \ft Gr. \fqa polluted them. \f* spoke arrogantly, +\v 35 and swore in a rage, saying, “Unless Judas and his army are now delivered into my hands, it shall be that, if I return safely, I will burn up this house!” And he went out in a great rage. +\v 36 The priests entered in, and stood before the altar and the temple; and they wept, and said, +\v 37 “You chose this house to be called by your name, to be a house of prayer and supplication for your people. +\v 38 Take vengeance on this man and his army, and let them fall by the sword. Remember their blasphemies, and don’t allow them to live any longer.” +\p +\v 39 Then Nicanor went out from Jerusalem and encamped in Bethhoron, and there the Syrian army met him. +\v 40 Judas encamped in Adasa with three thousand men. Judas prayed and said, +\v 41 “When those who came from the king blasphemed, your angel went out, and struck among them one hundred eighty-five thousand. +\v 42 Even so, crush this army before us today, and let all the rest know that he has spoken wickedly against your sanctuary. Judge him according to his wickedness.” +\v 43 On the thirteenth day of the month Adar, the armies met in battle. Nicanor’s army was defeated, and he himself was the first to fall in the battle. +\v 44 Now when his army saw that Nicanor had fallen, they threw away their weapons and fled. +\v 45 They pursued them a day’s journey from Adasa until you come to\f + \fr 7:45 \ft Gr. \fqa Gazera. \f* Gazara, and they sounded an alarm after them with the signal trumpets. +\v 46 Men came out of all the surrounding villages of Judea, and outflanked them. These turned them back on those, and they all fell by the sword. There wasn’t one of them left. +\v 47 The Jews took the spoils and the booty, and they cut off Nicanor’s head and his right hand, which he had stretched out so arrogantly, and brought them, and hung them up beside Jerusalem. +\v 48 The people were exceedingly glad, and they kept that day as a day of great gladness. +\v 49 \f + \fr 7:49 \ft See 2 Maccabees 15:36. \f*They ordained to keep this day year by year on the thirteenth day of Adar. +\v 50 So the land of Judah had rest a few days. +\c 8 +\p +\v 1 Judas heard of the fame of the Romans, that they are valiant men, and have pleasure in all who join themselves to them, and make friends with all who come to them, +\v 2 and that they are valiant men. They told him of their wars and exploits which they do among the Gauls, and how they conquered them, and forced them to pay tribute; +\v 3 and what things they did in the land of Spain, that they might take control of the silver and gold mines which were there; +\v 4 and how by their policy and persistence they conquered all the place (and the place was exceedingly far from them), and the kings who came against them from the uttermost part of the earth, until they had defeated them, and struck them severely; and how the rest give them tribute year by year. +\v 5 Philip, and Perseus, king of Chittim, and those who lifted up themselves against them, they defeated in battle, and conquered them. +\v 6 Antiochus also, the great king of Asia, came against them to battle, having one hundred twenty elephants, with cavalry, chariots, and an exceedingly great army, and he was defeated by them. +\v 7 They took him alive, and decreed that both he and those who reigned after him should give them a great tribute, and should give hostages, and a parcel of land from the best of their provinces: +\v 8 the countries of India, Media, and Lydia. They took them from him, and gave them to King Eumenes. +\v 9 Judas heard how the Greeks planned to come and destroy them, +\v 10 but this became known to them, and they sent against them a general who fought against them, and many of them fell down wounded to death, and they made captive their wives and their children, and plundered them, and conquered their land, and pulled down their strongholds, and plundered them, and brought them into bondage to this day. +\v 11 The remaining kingdoms and islands, as many as rose up against them at any time, they destroyed and made them to be their servants; +\v 12 but with their friends and those who relied on them they stayed friends. They conquered the kingdoms that were near and those that were far off, and all that heard of their fame were afraid of them. +\v 13 Moreover, whoever they desired to help and to make kings, these they make kings; and whoever they desired, they depose. They are exalted exceedingly. +\v 14 For all this, none of them ever put on a crown, neither did they clothe themselves with purple, as a display of grandeur. +\v 15 Judas heard how they had made for themselves a senate house, and day by day, three hundred twenty men sat in council, consulting always for the people, to the end they might be well governed, +\v 16 and how they commit their government to one man year by year, that he should rule over them, and control all their country, and all are obedient to that one, and there is neither envy nor emulation among them. +\p +\v 17 So Judas chose Eupolemus the son of John, the son of Accos, and Jason the son of Eleazar, and sent them to Rome, to establish friendship and alliance with them, +\v 18 and that they should free the yoke from themselves; for they saw that the kingdom of the Greeks kept Israel in bondage. +\v 19 Then they went to Rome, a very long journey, and they entered into the senate house, and said, +\v 20 “Judas, who is also called Maccabaeus, and his kindred, and the people of the Jews, have sent us to you, to make an alliance and peace with you, and that we might be registered as your allies and friends.” +\p +\v 21 This thing was pleasing to them. +\v 22 This is the copy of the writing which they wrote back again on tables of brass, and sent to Jerusalem, that it might be with them there for a memorial of peace and alliance: +\p +\v 23 “Good success be to the Romans, and to the nation of the Jews, by sea and by land forever. May the sword and the enemy be far from them. +\v 24 But if war arises for Rome first, or any of their allies in all their dominion, +\v 25 the nation of the Jews shall help them as allies, as the occasion shall indicate to them, with all their heart. +\v 26 To those who make war upon them, they shall not give supplies, food, weapons, money, or ships, as it has seemed good to Rome, and they shall keep their ordinances without taking anything in return. +\v 27 In the same way, moreover, if war comes first upon the nation of the Jews, the Romans shall willingly help them as allies, as the occasion shall indicate to them; +\v 28 and to those who are fighting with them, there shall not be given food, weapons, money, or ships, as it has seemed good to Rome. They shall keep these ordinances, and that without deceit. +\v 29 According to these terms, the Romans made a treaty with the Jewish people. +\v 30 But if hereafter the one party and the other shall determine to add or diminish anything, they shall do it at their pleasure, and whatever they add or take away shall be ratified. +\p +\v 31 Concerning the evils which King Demetrius is doing to them, we have written to him, saying, ‘Why have you made your yoke heavy on our friends and allies the Jews? +\v 32 If therefore they plead any more against you, we will do them justice, and fight with you on sea and on land.’” +\c 9 + +\p +\v 1 Demetrius heard that Nicanor had fallen with his forces in battle, and he sent Bacchides and Alcimus again into the land of Judah a second time, and the right wing of his army with them. +\v 2 They went by the way that leads to Gilgal, and encamped against Mesaloth, which is in Arbela, and took possession of it, and killed many people. +\v 3 The first month of the one hundred fifty-second year, \f + \fr 9:3 \ft circa B.C. 161. \f* they encamped against Jerusalem. +\v 4 Then they marched away and went to Berea with twenty thousand infantry and two thousand cavalry. +\v 5 Judas was encamped at Elasa with three thousand chosen men. +\v 6 They saw the multitude of the forces, that they were many, and they were terrified. Many slipped away out of the army. There were not left of them more than eight hundred men. +\p +\v 7 Judas saw that his army slipped away and that the battle pressed upon him, and he was very troubled in spirit, because he had no time to gather them together, and he became faint. +\v 8 He said to those who were left, “Let’s arise and go up against our adversaries, if perhaps we may be able to fight with them.” +\p +\v 9 They tried to dissuade him, saying, “There is no way we are able; but let’s rather save our lives now. Let’s return again with our kindred, and fight against them; but we are too few.” +\p +\v 10 Judas said, “Let it not be so that I should do this thing, to flee from them. If our time has come, let’s die in a manly way for our kindred’s sake, and not leave a cause of reproach against our honor.” +\p +\v 11 The army marched out from the camp, and stood to encounter them. The cavalry was divided into two companies, and the slingers and the archers went before the army, and all the mighty men that fought in the front of the battle. +\v 12 Bacchides was in the right wing. The phalanx advanced on the two parts, and they blew with their trumpets. +\v 13 The men by Judas’ side sounded with their trumpets, and the earth shook with the shout of the armies, and the battle was joined, and continued from morning until evening. +\p +\v 14 Judas saw that Bacchides and the strength of his army were on the right side, and all that were brave in heart went with him, +\v 15 and the right wing was defeated by them, and he pursued after them to the mount Azotus. +\v 16 Those who were on the left wing saw that the right wing was defeated, and they turned and followed in the footsteps of Judas and of those who were with him. +\v 17 The battle became desparate, and many on both sides fell wounded to death. +\v 18 Judas fell, and the rest fled. +\p +\v 19 Jonathan and Simon took Judas their brother, and buried him in the tomb of his ancestors at Modin. +\v 20 They wept for him. All Israel made great lamentation for him, and mourned many days, and said, +\v 21 “How is the mighty fallen, the savior of Israel!” +\v 22 The rest of the acts of Judas, and his wars, and the valiant deeds which he did, and his greatness, are not written; for they were exceedingly many. +\p +\v 23 It came to pass after the death of Judas, that the lawless emerged within all the borders of Israel. All those who did iniquity rose up. +\v 24 In those days there was an exceedingly great famine, and the country went over to their side. +\v 25 Bacchides chose the ungodly men and made them rulers of the country. +\v 26 They inquired and searched for the friends of Judas, and brought them to Bacchides, and he took vengeance on them and used them despitefully. +\v 27 There was great suffering in Israel, such as was not since the time prophets stopped appearing to them. +\p +\v 28 All the friends of Judas were gathered together, and they said to Jonathan, +\v 29 “Since your brother Judas has died, we have no man like him to go out against our enemies and Bacchides, and among those of our nation who hate us. +\v 30 Now therefore we have chosen you this day to be our prince and leader in his place, that you may fight our battles.” +\v 31 So Jonathan took the governance upon him at that time, and rose up in the place of his brother Judas. +\p +\v 32 When Bacchides found out, he tried to kill him. +\v 33 Jonathan, and Simon his brother, and all who were with him, knew it; and they fled into the wilderness of Tekoah, and encamped by the water of the pool of Asphar. +\v 34 Bacchides found this out on the Sabbath day, and came—he and all his army—over the Jordan. +\p +\v 35 Jonathan sent his brother, a leader of the multitude, and implored his friends the Nabathaeans, that they might store their baggage, which was much, with them. +\v 36 The children of Jambri came out of Medaba, and seized John and all that he had, and went their way with it. +\p +\v 37 But after these things, they brought word to Jonathan and Simon his brother that the children of Jambri were celebrating a great wedding, and were bringing the bride, a daughter of one of the great nobles of Canaan, from Nadabath with a large escort. +\v 38 They remembered John their brother, and went up, and hid themselves under the cover of the mountain. +\v 39 They lifted up their eyes and looked, and saw a great procession with much baggage. The bridegroom came out with his friends and his kindred to meet them with timbrels, musicians, and many weapons. +\v 40 They rose up against them from their ambush and killed them, and many fell wounded to death. The remnant fled into the mountain, and the Jews took all their spoils. +\v 41 So the wedding was turned into mourning, and the voice of their musicians into lamentation. +\v 42 They avenged fully the blood of their brother, and turned back to the marshes of the Jordan. +\p +\v 43 Bacchides heard it, and he came on the Sabbath day to the banks of Jordan with a great army. +\v 44 Jonathan said to his company, “Let’s stand up now and fight for our lives, for things are different today than they were yesterday and the day before. +\v 45 For, behold, the battle is before us and behind us. Moreover the water of the Jordan is on this side and on that side, and marsh and thicket. There is no place to escape. +\v 46 Now therefore cry to heaven, that you may be delivered out of the hand of your enemies.” +\v 47 So the battle was joined, and Jonathan stretched out his hand to strike Bacchides, and he turned away back from him. +\v 48 Jonathan and those who were with him leapt into the Jordan, and swam over to the other side. The enemy didn’t pass over the Jordan against them. +\v 49 About a thousand men of Bacchides’ company fell that day; +\v 50 and he returned to Jerusalem. They built strong cities in Judea, the stronghold that was in Jericho, and Emmaus, Bethhoron, Bethel, Timnath, Pharathon, and Tephon, with high walls and gates and bars. +\v 51 He set garrisons in them to harass Israel. +\v 52 He fortified the city Bethsura, Gazara, and the citadel, and put troops and stores of food in them. +\v 53 He took the sons of the chief men of the country for hostages, and put them under guard in the citadel at Jerusalem. +\p +\v 54 And in the one hundred fifty-third year,\f + \fr 9:54 \ft circa B.C. 160. \f* in the second month, Alcimus gave orders to pull down the wall of the inner court of the sanctuary. He also pulled down the works of the prophets. +\v 55 He began to pull down. At that time was Alcimus stricken, and his works were hindered; and his mouth was stopped, and he was taken with a palsy, and he could no more speak anything and give orders concerning his house. +\v 56 Alcimus died at that time with great torment. +\v 57 Bacchides saw that Alcimus was dead, and he returned to the king. Then the land of Judah had rest for two years. +\p +\v 58 Then all the lawless men took counsel, saying, “Behold, Jonathan and his men are dwelling at ease and in security. Now therefore we will bring Bacchides, and he will capture them all in one night. +\v 59 They went and consulted with him. +\v 60 He marched out and came with a great army, and sent letters secretly to all his allies who were in Judea, that they should seize Jonathan and those who were with him; but they couldn’t, because their plan was known to them. +\v 61 Jonathan’s men seized about fifty of the men of the country who were authors of the wickedness, and he killed them. +\v 62 Jonathan, Simon, and those who were with him, went away to Bethbasi, which is in the wilderness, and he built up that which had been pulled down, and they made it strong. +\v 63 Bacchides found out about it, and he gathered together all his multitude, and sent orders to those who were of Judea. +\v 64 He went and encamped against Bethbasi and fought against it many days, and made engines of war. +\p +\v 65 Jonathan left his brother Simon in the city, and went out into the country, and he went with a few men. +\v 66 He struck Odomera and his kindred, and the children of Phasiron in their tents. +\v 67 They began to strike them, and to go up with their forces. Then Simon and those who were with him went out of the city, and set the engines of war on fire, +\v 68 and fought against Bacchides, and he was defeated by them. They afflicted him severely; for his counsel and expedition was in vain. +\v 69 They were very angry with the lawless men who gave him counsel to come into the country, and they killed many of them. Then he decided to depart into his own land. +\p +\v 70 Jonathan learned of this and sent ambassadors to him, to the end that they should make peace with him, and that he should restore to them the captives. +\v 71 He accepted the thing, and did according to his words, and swore to him that he would not seek his harm all the days of his life. +\v 72 He restored to him the captives which he had taken before out of the land of Judah, and he returned and departed into his own land, and didn’t come any more into their borders. +\v 73 Thus the sword ceased from Israel. Jonathan lived at Michmash. Jonathan began to judge the people; and he destroyed the ungodly out of Israel. +\c 10 +\p +\v 1 In the one hundred sixtieth year,\f + \fr 10:1 \ft circa B.C. 153. \f* Alexander Epiphanes, the son of Antiochus, went up and took possession of Ptolemais. They received him, and he reigned there. +\v 2 King Demetrius heard about this, and he gathered together exceedingly great forces, and went out to meet him in battle. +\p +\v 3 Demetrius sent a letter to Jonathan with words of peace, so as to honor him. +\v 4 For he said, “Let’s go beforehand to make peace with them, before he makes peace with Alexander against us; +\v 5 for he will remember all the evils that we have done against him, and to his kindred and to his nation.” +\v 6 So he gave him authority to gather together forces, and to provide weapons, and that he should be his ally. He also commanded that they should release the hostages that were in the citadel to him. +\p +\v 7 Jonathan came to Jerusalem, and read the letter in the hearing of all the people, and of those who were in the citadel. +\v 8 They were very afraid when they heard that the king had given him authority to gather together an army. +\v 9 Those in the citadel released the hostages to Jonathan, and he restored them to their parents. +\p +\v 10 Jonathan lived in Jerusalem and began to build and renew the city. +\v 11 He commanded those who did the work to build the walls and encircle Mount Zion with\f + \fr 10:11 \ft So the versions and Josephus. Gr. \fqa four-foot stones. \f* square stones for defense; and they did so. +\v 12 The foreigners who were in the strongholds which Bacchides had built fled away. +\v 13 Each man left his place and departed into his own land. +\v 14 Only at Bethsura, there were left some of those who had forsaken the law and the commandments, for it was a place of refuge to them. +\p +\v 15 King Alexander heard all the promises which Demetrius had sent to Jonathan. They told him of the battles and the valiant deeds which he and his kindred had done, and of the troubles which they had endured. +\v 16 So he said, “Could we find another man like him? Now we will make him our\f + \fr 10:16 \ft See 1 Maccabees 2:18. Compare 1 Maccabees 10:65. \f* friend and ally.” +\v 17 He wrote a letter and sent it to him, in these words, saying, +\v 18 “King Alexander to his brother Jonathan, greetings. +\v 19 We have heard of you, that you are a mighty man of valour, and worthy to be our\f + \fr 10:19 \ft See 1 Maccabees 2:18. Compare 1 Maccabees 10:65. \f* friend. +\v 20 Now we have appointed you this day to be high priest of your nation, and to be called the king’s\f + \fr 10:20 \ft See 1 Maccabees 2:18. Compare 1 Maccabees 10:65. \f* friend, and to take our side, and to keep friendship with us.” He also sent to him a purple robe and a golden crown. +\p +\v 21 And Jonathan put on the holy garments in the seventh month of the one hundred sixtieth year,\f + \fr 10:21 \ft circa B.C. 153. \f* at the feast of tabernacles; and he gathered together forces and provided weapons in abundance. +\p +\v 22 When Demetrius heard these things, he was grieved and said, +\v 23 “What is this that we have done, that Alexander has gotten ahead of us in establishing friendship with the Jews to strengthen himself? +\v 24 I also will write to them words of encouragement and of honor and of gifts, that they may be with me to aid me.” +\v 25 So he sent to them this message: +\p “King Demetrius to the nation of the Jews, greetings. +\v 26 Since as you have kept your covenants with us, and continued in our friendship, and have not joined yourselves to our enemies, we have heard of this, and are glad. +\v 27 Now continue still to keep faith with us, and we will repay you with good in return for your dealings with us. +\v 28 We will grant you many immunities and give you gifts. +\p +\v 29 “Now I free you and release all the Jews from the tributes, from the salt tax, and from the crown levies. +\v 30 Instead of the third part of the seed, and instead of half of the fruit of the trees, which falls to me to receive, I release it from this day and henceforth, so that I will not take it from the land of Judah, and from the three districts which are added to it from the country of Samaria and Galilee, from this day forth and for all time. +\v 31 Let Jerusalem be holy and free, with her borders, tithes, and taxes. +\v 32 I yield up also my authority over the citadel which is at Jerusalem, and give it to the high priest, that he may appoint in it men whom he chooses to keep it. +\v 33 Every soul of the Jews who has been carried captive from the land of Judah into any part of my kingdom, I set at liberty without payment. Let all officials also cancel the taxes on their livestock. +\p +\v 34 “All the feasts, the Sabbaths, new moons, appointed days, three days before a feast, and three days after a feast, let them all be days of immunity and release for all the Jews who are in my kingdom. +\v 35 No man shall have authority to exact anything from any of them, or to trouble them concerning any matter. +\p +\v 36 “Let there be enrolled among the king’s forces about thirty thousand men of the Jews, and pay shall be given to them, as is due to all the king’s forces. +\v 37 Of them, some shall be placed in the king’s great strongholds, and some of them shall be placed over the affairs of the kingdom, which are positions of trust. Let those who are over them and their rulers be of themselves, and let them walk after their own laws, even as the king has commanded in the land of Judah. +\p +\v 38 “The three districts that have been added to Judea from the country of Samaria, let them be annexed to Judea, that they may be reckoned to be under one ruler, that they may not obey any other authority than the high priest’s. +\v 39 As for Ptolemais and its land, I have given it as a gift to the sanctuary that is at Jerusalem, for the expenses of the sanctuary. +\v 40 I also give every year fifteen thousand shekels of silver from the king’s revenues from the places that are appropriate. +\v 41 And all the additional funds which those who manage the king’s affairs didn’t pay as in the first years, they shall give from now on toward the works of the temple. +\v 42 Besides this, the five thousand shekels of silver which they received from the uses of the sanctuary from the revenue year by year is also released, because it belongs to the priests who minister there. +\v 43 Whoever flees to the temple that is at Jerusalem, and within all of its borders, whether one owe money to the king, or any other matter, let them go free, along with all that they have in my kingdom. +\v 44 For the building and renewing of the structures of the sanctuary, the expense shall also be given out of the king’s revenue. +\v 45 For the building of the walls of Jerusalem and fortifying it all around, the expense shall also be given out of the king’s revenue, also for the building of the walls in Judea.” +\p +\v 46 Now when Jonathan and the people heard these words, they gave no credence to them, and didn’t accept them, because they remembered the great evil which he had done in Israel, and that he had afflicted them very severely. +\v 47 They were well pleased with Alexander, because he was the first who spoke words of peace to them, and they were allies with him always. +\p +\v 48 King Alexander gathered together great forces and encamped near Demetrius. +\v 49 The two kings joined battle, and the army of Alexander fled; and Demetrius followed after him, and prevailed against them. +\v 50 He strengthened the battle exceedingly until the sun went down; and Demetrius fell that day. +\p +\v 51 Alexander sent ambassadors to Ptolemy king of Egypt with this message: +\v 52 “Since I have returned to my kingdom, and am seated on the throne of my fathers, and have established my dominion, and have overthrown Demetrius, and have taken possession of our country— +\v 53 yes, I joined the battle with him, and he and his army were defeated by us, and we sat on the throne of his kingdom— +\v 54 now also let’s make friends with one another. Give me now your daughter as my wife. I will be joined with you, and will give both you and her gifts worthy of you.” +\p +\v 55 Ptolemy the king answered, saying, “Happy is the day you returned to the land of your ancestors and sat on the throne of their kingdom. +\v 56 Now I will do to you as you have written, but meet me at Ptolemais, that we may see one another; and I will join with you, even as you have said.” +\v 57 So Ptolemy went out of Egypt, himself and Cleopatra his daughter, and came to Ptolemais in the one hundred sixty-second year.\f + \fr 10:57 \ft circa B.C. 151. \f* +\v 58 King Alexander met him, and he gave him his daughter Cleopatra, and celebrated her wedding at Ptolemais with great pomp, as kings do. +\p +\v 59 King Alexander wrote to Jonathan, that he should come to meet him. +\v 60 He went with pomp to Ptolemais, and met the two kings. He gave them and their friends\f + \fr 10:60 \ft See 1 Maccabees 2:18. Compare 1 Maccabees 10:65. \f* silver and gold, and many gifts, and found favor in their sight. +\v 61 Some malcontents out of Israel, men who were transgressors of the law, gathered together against him to complain against him; but the king paid no attention to them. +\v 62 The king commanded that they take off Jonathan’s garments and clothe him in purple, and they did so. +\v 63 The king made him sit with him, and said to his princes, “Go out with him into the midst of the city, and proclaim that no man may complain against him of any matter, and let no man trouble him for any reason.” +\v 64 It came to pass, when those who complained against him saw his honor according to the proclamation, and saw him clothed in purple, they all fled away. +\v 65 The king gave him honor, and enrolled him among his chief friends,\f + \fr 10:65 \ft See 1 Maccabees 11:27; 2 Maccabees 8:9. Compare 1 Maccabees 2:18; 10:16, etc. \f* and made him a captain and governor of a province. +\v 66 Then Jonathan returned to Jerusalem with peace and gladness. +\p +\v 67 In the one hundred sixty-fifth year,\f + \fr 10:67 \ft circa B.C. 148. \f* Demetrius, son of Demetrius, came out of Crete into the land of his ancestors. +\v 68 When King Alexander heard of it, he grieved exceedingly and returned to Antioch. +\v 69 Demetrius appointed Apollonius, who was over Coelesyria, and he gathered together a great army, and encamped against Jamnia, and sent to Jonathan the high priest, saying, +\p +\v 70 “You alone lift up yourself against us, but I am ridiculed and in reproach because of you. Why do you assume authority against us in the mountains? +\v 71 Now therefore, if you trust in your forces, come down to us into the plain, and let’s match strength with each other there; for the power of the cities is with me. +\v 72 Ask and learn who I am, and the rest who help us. They say, ‘Your foot can’t stand before our face; for your ancestors have been put to flight twice in their own land.’ +\v 73 Now you won’t be able to withstand the cavalry and such an army as this in the plain, where is there is no stone or pebble, or place to flee.” +\p +\v 74 Now when Jonathan heard the words of Apollonius, he was moved in his mind, and he chose ten thousand men, and went out from Jerusalem; and Simon his brother met him to help him. +\v 75 Then he encamped against Joppa. The people of the city shut him out, because Apollonius had a garrison in Joppa. +\v 76 So they fought against it. The people of the city were afraid, and opened to him; and Jonathan became master of Joppa. +\p +\v 77 Apollonius heard about that, and he gathered an army of three thousand cavalry, and a great army, and went to Azotus as though he were on a journey, and at the same time advanced onward into the plain, because he had a multitude of cavalry which he trusted. +\v 78 He pursued him to Azotus, and the armies joined battle.\f + \fr 10:78 \ft Most of the authorities here repeat \fqa after him.\f* +\v 79 Apollonius had secretly left a thousand cavalry behind them. +\v 80 Jonathan learned that there was an ambush behind him. They surrounded his army, and shot their arrows at the people, from morning until evening; +\v 81 but the people stood fast, as Jonathan commanded them; and the enemy’s horses grew tired. +\p +\v 82 Then Simon brought forward his army and joined battle with the phalanx (for the cavalry were exhausted), and they were defeated by him and fled. +\v 83 The cavalry were scattered in the plain. They fled to Azotus and entered into Beth-dagon, their idol’s temple, to save themselves. +\v 84 Jonathan burned Azotus and the cities around it and took their spoils. He burned the temple of Dagon and those who fled into it with fire. +\v 85 Those who had fallen by the sword plus those who were burned were about eight thousand men. +\p +\v 86 From there, Jonathan left and encamped against Ascalon. The people of the city came out to meet him with great pomp. +\v 87 Jonathan, with those who were on his side, returned to Jerusalem, having many spoils. +\v 88 It came to pass, when King Alexander heard these things, he honored Jonathan even more. +\v 89 He sent him a gold buckle, as the custom is to give to the king’s kindred. He gave him Ekron and all its land for a possession. +\c 11 +\p +\v 1 Then the king of Egypt gathered together great forces, as the sand which is by the sea shore, and many ships, and sought to make himself master of Alexander’s kingdom by deceit, and to add it to his own kingdom. +\v 2 He went out into Syria with words of peace, and the people of the cities opened their gates to him and met him; for King Alexander’s command was that they should meet him, because he was his father-in-law. +\v 3 Now as he entered into the cities of Ptolemais, he set his forces for a garrison in each city. +\p +\v 4 But when he came near to Azotus, they showed him the temple of Dagon burned with fire, and Azotus and its pasture lands destroyed, and the bodies cast out, and those who had been burned, whom he burned in the war, for they had made heaps of them in his way. +\v 5 They told the king what Jonathan had done, that they might cast blame on him; but the king kept silent. +\v 6 Jonathan met the king with pomp at Joppa, and they greeted one another, and they slept there. +\v 7 Jonathan went with the king as far as the river that is called Eleutherus, then returned to Jerusalem. +\p +\v 8 But King Ptolemy took control of the cities along the sea coast, to Selucia which is by the sea, and he devised evil plans concerning Alexander. +\v 9 He sent ambassadors to King Demetrius, saying, “Come! Let’s make a covenant with one another, and I will give you my daughter whom Alexander has, and you shall reign over your father’s kingdom; +\v 10 for I regret that I gave my daughter to him, for he tried to kill me. +\v 11 He accused him, because he coveted his kingdom. +\v 12 Taking his daughter from him, he gave her to Demetrius, and was estranged from Alexander, and their enmity was openly seen. +\p +\v 13 Ptolemy entered into Antioch, and put on himself the crown of Asia. He put two crowns upon his head, the crown of Egypt and that of Asia. +\v 14 But King Alexander was in Cilicia at that time, because the people of that region were in revolt. +\v 15 When Alexander heard of it, he came against him in war. Ptolemy marched out and met him with a strong force, and put him to flight. +\v 16 Alexander fled into Arabia, that he might be sheltered there; but King Ptolemy was triumphant. +\v 17 Zabdiel the Arabian took off Alexander’s head, and sent it to Ptolemy. +\v 18 King Ptolemy died the third day after, and those who were in his strongholds were slain by the inhabitants of the strongholds. +\v 19 Demetrius became king in the one hundred sixty-seventh year.\f + \fr 11:19 \ft circa B.C. 146.\f* +\p +\v 20 In those days Jonathan gathered together the Judeans to take the citadel that was at Jerusalem. He made many engines of war to use against it. +\v 21 Some lawless men who hated their own nation went to the king and reported to him that Jonathan was besieging the citadel. +\v 22 He heard, and was angry, but when he heard it, he set out immediately, and came to Ptolemais, and wrote to Jonathan, that he should not besiege it, and that he should meet him and speak with him at Ptolemais with all speed. +\p +\v 23 But when Jonathan heard this, he gave orders to continue the siege. He chose some of the elders of Israel and of the priests, and put himself in peril +\v 24 by taking silver, gold, clothing, and various other presents, and went to Ptolemais to the king. Then he found favor in his sight. +\v 25 Some lawless men of those who were of the nation made complaints against him, +\v 26 and the king did to him even as his predecessors had done to him, and exalted him in the sight of all his\f + \fr 11:26 \ft See 1 Maccabees 2:18. \f* friends, +\v 27 and confirmed to him the high priesthood, and all the other honors that he had before, and gave him preeminence among his\f + \fr 11:27 \ft See 1 Maccabees 10:65. \f* chief friends. +\v 28 And Jonathan requested of the king that he would make Judea free from tribute, along with the three\f + \fr 11:28 \ft Gr. \fqa toparchies \f* provinces and the country of Samaria, and promised him three hundred talents. +\v 29 The king consented, and wrote letters to Jonathan concerning all these things as follows: +\p +\v 30 “King Demetrius to his brother Jonathan, and to the nation of the Jews, greetings. +\v 31 The copy of the letter which we wrote to Lasthenes our kinsman concerning you, we have written also to you, that you may see it. +\v 32 ‘King Demetrius to Lasthenes his father, greetings. +\v 33 We have determined to do good to the nation of the Jews, who are our friends, and observe what is just toward us, because of their good will toward us. +\v 34 We have confirmed therefore to them the borders of Judea, and also the three governments of Aphaerema, Lydda, and Ramathaim (these were added to Judea from the country of Samaria), and all their territory to them, for all who do sacrifice in Jerusalem, instead of the king’s dues which the king received of them yearly before from the produce of the earth and the fruits of trees. +\v 35 As for the other payments to us from henceforth, of the tithes and the taxes that pertain to us, and the salt pits, and the crown taxes due to us, all these we will give back to them. +\v 36 Not one of these grants shall be annulled from this time forth and forever. +\v 37 Now therefore be careful to make a copy of these things, and let it be given to Jonathan, and let it be set up on the holy mountain in a suitable and conspicuous place.’” +\p +\v 38 When King Demetrius saw that the land was quiet before him, and that no resistance was made to him, he sent away all his troops, each man to his own place, except the foreign troops, which he had raised from the islands of the Gentiles. So all the troops of his fathers hated him. +\v 39 Now Tryphon was one of those who previously had been on Alexander’s side, and he saw that all the forces murmured against Demetrius. So he went to Imalcue the Arabian, who was raising up Antiochus the young child of Alexander, +\v 40 and urgently insisted to him that he should deliver him to him, that he might reign in his father’s place. He told him all that Demetrius had done, and the hatred with which his forces hated him; and he stayed there many days. +\p +\v 41 Now Jonathan sent to King Demetrius, that he should remove the troops of the citadel from Jerusalem, and the troops who were in the strongholds; for they fought against Israel continually. +\v 42 Demetrius sent to Jonathan, saying, “I will not only do this for you and your nation, but I will greatly honor you and your nation, if I find an opportunity. +\v 43 Now therefore you shall do well if you send me men who will fight for me; for all my forces have revolted.” +\v 44 So Jonathan sent him three thousand valiant men to Antioch. They came to the king, and the king was glad at their coming. +\p +\v 45 The people of the city gathered themselves together into the midst of the city, to the number of one hundred and twenty thousand men, and they wanted to kill the king. +\v 46 The king fled into the court of the palace, and the people of the city seized the main streets of the city and began to fight. +\v 47 The king called the Jews to help him, and they were gathered together to him all at once, and they dispersed themselves in the city, and killed that day about one hundred thousand. +\v 48 They set the city on fire, and seized many spoils that day, and saved the king. +\v 49 The people of the city saw that the Jews had taken control of the city as they pleased, and they became faint in their hearts, and they cried out to the king with supplication, saying, +\v 50 “Give us your right hand, and let the Jews cease from fighting against us and the city.” +\v 51 They threw away their weapons and made peace. The Jews were glorified in the sight of the king, and before all who were in his kingdom. Then they returned to Jerusalem, having much plunder. +\v 52 So King Demetrius sat on the throne of his kingdom, and the land was quiet before him. +\v 53 He lied in all that he spoke, and estranged himself from Jonathan, and didn’t repay him according to the benefits with which he had repaid him, and treated him very harshly. +\p +\v 54 Now after this, Tryphon returned, and with him the young child Antiochus, who reigned and put on a crown. +\v 55 All the forces which Demetrius had sent away with disgrace were gathered to him, and they fought against him, and he fled and was routed. +\v 56 Tryphon took the elephants, and took control of Antioch. +\v 57 The young Antiochus wrote to Jonathan, saying, “I confirm to you the high priesthood, and appoint you over the four districts, and to be one of the king’s\f + \fr 11:57 \ft See 1 Maccabees 2:18. \f* friends.” +\v 58 He sent to him golden vessels and furniture for the table, and gave him permission to drink in golden vessels, and to be clothed in purple, and to have a golden buckle. +\v 59 He made his brother Simon governor from the Ladder of Tyre to the borders of Egypt. +\p +\v 60 Jonathan went out and took his journey beyond the river and through the cities. All the forces of Syria gathered themselves to him to be his allies. He came to Ascalon, and the people of the city met him honorably. +\v 61 He departed from there to Gaza, and the people of Gaza shut him out. So he besieged it and burned its pasture lands with fire, and plundered them. +\v 62 The people of Gaza pleaded with Jonathan, and he gave them his right hand, and took the sons of their princes for hostages, and sent them away to Jerusalem. Then he passed through the country as far as Damascus. +\p +\v 63 Then Jonathan heard that Demetrius’ princes had come to Kedesh, which is in Galilee, with a great army, intending to remove him from his office. +\v 64 He went to meet them, but he left Simon his brother in the country. +\v 65 Simon encamped against Bethsura, and fought against it many days, and hemmed it in. +\v 66 They asked him to give them his right hand, and he gave it to them. He removed them from there, took possession of the city, and set a garrison over it. +\p +\v 67 Jonathan and his army encamped at the water of Gennesareth, and early in the morning they marched to the plain of Hazor. +\v 68 Behold, an army of foreigners met him in the plain. They laid an ambush for him in the mountains, but they themselves met him face to face. +\v 69 But those who lay in ambush rose out of their places and joined battle. All those who were on Jonathan’s side fled. +\v 70 Not one of them was left, except Mattathias the son of Absalom, and Judas the son of Chalphi, captains of the forces. +\v 71 Jonathan tore his clothes, put dirt on his head, and prayed. +\v 72 He turned again to them in battle, and routed them, and they fled. +\v 73 When the men on his side who had fled saw this, they returned to him and pursued with him to Kedesh to their camp, and they encamped there. +\v 74 About three thousand men of the foreigners fell on that day. Then Jonathan returned to Jerusalem. +\c 12 +\p +\v 1 Jonathan saw that the time was favorable for him, so he chose men and sent them to Rome to confirm and renew the friendship that they had with them. +\v 2 He also sent similar letters to the Spartans, and to other places. +\v 3 They went to Rome, entered into the senate house, and said, “Jonathan the high priest and the nation of the Jews have sent us to renew for them the friendship and the alliance, as in former time.” +\v 4 They gave them letters to the men in every place, that they should provide safe conduct for them on their way to the land of Judah. +\v 5 This is the copy of the letters which Jonathan wrote to the Spartans: +\p +\v 6 “Jonathan the high priest, and the senate of the nation, and the priests, and the rest of the people of the Jews, to their kindred the Spartans, greetings. +\v 7 Even before this time letters were sent to Onias the high priest from Arius,\f + \fr 12:7 \ft So the old Latin versions and Josephus: compare also ver. 20. All the other authorities read \fqa Darius \ft in this place. \f* who was reigning among you, to signify that you are our kindred, as the copy written below shows. +\v 8 Onias welcomed honorably the man who was sent and received the letters, wherein declaration was made of alliance and friendship. +\v 9 Therefore we also, even though we need none of these things, having for our encouragement the holy books which are in our hands, +\v 10 have undertaken to send that we might renew our brotherhood and friendship with you, to the end that we should not become estranged from you altogether; for a long time has passed since you sent your letter to us. +\v 11 We therefore at all times without ceasing, both in our feasts, and on the other convenient days, remember you in the sacrifices which we offer, and in our prayers, as it is right and proper to be mindful of kindred. +\v 12 Moreover, we are glad for your glory. +\v 13 But as for ourselves, many afflictions and many wars have encompassed us, and the kings who are around us have fought against us. +\v 14 We were unwilling to be troublesome to you, and to the rest of our allies and friends, in these wars; +\v 15 for we have the help which is from heaven to help us, and we have been delivered from our enemies, and our enemies have been humbled. +\v 16 We chose therefore Numenius the son of Antiochus and Antipater the son of Jason, and have sent them to the Romans, to renew the friendship that we had with them, and the former alliance. +\v 17 We commanded them therefore to go also to you, and to salute you, and to deliver you our letters concerning the renewing of friendship and our brotherhood. +\v 18 And now you will do well if you give us a reply.” +\p +\v 19 And this is the copy of the letters which they sent to Onias: +\p +\v 20 “Arius king of the Spartans to Onias the chief priest, greetings. +\v 21 It has been found in writing, concerning the Spartans and the Jews, that they are kindred, and that they are of the descendants of Abraham. +\v 22 Now, since this has come to our knowledge, you will do well to write to us of your\f + \fr 12:22 \ft Gr. \fqa peace \f* prosperity. +\v 23 We moreover write on our part to you, that your livestock and goods are ours, and ours are yours. We do command therefore that they make report to you accordingly.” +\p +\v 24 Now Jonathan heard that Demetrius’ princes had returned to fight against him with a greater army than before, +\v 25 so he marched away from Jerusalem, and met them in the country of Hamath; for he gave them no opportunity to set foot in his country. +\v 26 He sent spies into his camp, and they came again, and reported to him that they were preparing to attack them at night. +\v 27 But as soon as the sun was down, Jonathan commanded his men to watch, and to be armed, that all the night long they might be ready for battle. He stationed sentinels around the camp. +\v 28 The adversaries heard that Jonathan and his men were ready for battle, and they feared, and trembled in their hearts, and they kindled fires in their camp then withdrew. +\v 29 But Jonathan and his men didn’t know it until the morning; for they saw the fires burning. +\v 30 Jonathan pursued after them, but didn’t overtake them; for they had gone over the river Eleutherus. +\v 31 Then Jonathan turned toward the Arabians, who are called Zabadaeans, and struck them, and took their spoils. +\v 32 He came out from there, and came to Damascus, and took his journey through all the country. +\p +\v 33 Simon went out, and took his journey as far as Ascalon, and the strongholds that were near it. Then he turned toward Joppa and took possession of it; +\v 34 for he had heard that they were planning to hand over the stronghold to Demetrius’ men. He set a garrison there to guard it. +\p +\v 35 Then Jonathan returned and called the elders of the people together. He planned with them to build strongholds in Judea, +\v 36 and to make the walls of Jerusalem higher, and to raise a great mound between the citadel and the city, to separate it from the city, that so it might be isolated, that its garrison might neither buy nor sell. +\v 37 They were gathered together to build the city. Part of the wall of the brook that is on the east side fell down, and he repaired the section called Chaphenatha. +\v 38 Simon also built Adida in the\f + \fr 12:38 \ft Gr. \fqa Sephela.\f* plain country, made it strong, and set up gates and bars. +\p +\v 39 And Tryphon sought to reign over Asia and to crown himself, and to stretch out his hand against Antiochus the king. +\v 40 He was afraid that Jonathan wouldn’t allow him, and that he would fight against him; and he sought a way to seize him, that he might destroy him. So he marched out and came to Bethshan. +\v 41 Jonathan came out to meet him with forty thousand men chosen for battle, and came to Bethshan. +\v 42 Tryphon saw that he came with a great army, and he was afraid to stretch out his hand against him. +\v 43 He received him honorably, and commended him to all his\f + \fr 12:43 \ft See 1 Maccabees 2:18. \f* friends, and gave him gifts, and commanded his forces to be obedient to him, as to himself. +\v 44 He said to Jonathan, “Why have you put all this people to so much trouble, seeing there is no war between us? +\v 45 Now send them away to their homes, but choose for yourself a few men who shall be with you, and come with me to Ptolemais, and I will give it to you, and the rest of the strongholds and the rest of the forces, and all the king’s officers. Then I will turn around and depart; for this is why I came.” +\p +\v 46 He put his trust in him, and did even as he said, and sent away his forces, and they departed into the land of Judah. +\v 47 But he reserved to himself three thousand men, of whom he left two thousand in Galilee, but one thousand went with him. +\v 48 Now as soon as Jonathan entered into Ptolemais, the people of Ptolemais shut the gates and seized him. They killed all those who came in with him with the sword. +\p +\v 49 Tryphon sent troops and cavalry into Galilee, and into the Great Plain, to destroy all Jonathan’s men. +\v 50 They perceived that he had been seized and had perished, along with those who were with him. They encouraged one another and went on their way close together, prepared to fight. +\v 51 Those who followed them saw that they were ready to fight for their lives, and turned back again. +\v 52 They all came in peace into the land of Judah, and they mourned for Jonathan and those who were with him, and they were very afraid. All Israel mourned with a great mourning. +\v 53 And all the Gentiles who were around them sought to destroy them utterly; for they said, “They have no ruler nor anyone to help them. Now therefore let’s fight against them, and take away their memory from among men.” +\c 13 +\p +\v 1 Simon heard that Tryphon had gathered together a mighty army to come into the land of Judah and destroy it utterly. +\v 2 He saw that the people were trembling in great fear. So he went up to Jerusalem and gathered the people together. +\v 3 He encouraged them, and said to them, “You yourselves know all the things that I, my kindred, and my father’s house have done for the laws and the sanctuary, and the battles and the distresses which we have seen. +\v 4 Because of this, all my brothers have perished for Israel’s sake, and I am left alone. +\v 5 Now be it far from me, that I should spare my own life in any time of affliction, for I am not better than my kindred. +\v 6 However, I will take vengeance for my nation, for the sanctuary, and for our wives and children, because all the Gentiles have gathered out of hatred to destroy us.” +\p +\v 7 The spirit of the people revived as soon as they heard these words. +\v 8 They answered with a loud voice, saying, “You are our leader in the place of Judas and Jonathan your brothers. +\v 9 Fight our battles, and we will do all that you tell us to do.” +\p +\v 10 He gathered together all the men of war, and hurried to finish the walls of Jerusalem. He fortified it all around. +\v 11 He sent Jonathan the son of Absalom, and with him a great army, to Joppa. He threw out those who were in it, and lived there. +\p +\v 12 Tryphon left Ptolemais with a mighty army to enter into the land of Judah, and Jonathan was with him under guard. +\v 13 But Simon encamped at Adida, near the plain. +\v 14 Tryphon knew that Simon had risen up in the place of his brother Jonathan, and meant to join battle with him, so he sent ambassadors to him, saying, +\v 15 “It is for money which Jonathan your brother owed to the king’s treasury, by reason of the offices which he had, that we are detaining him. +\v 16 Now send one hundred talents of silver and two of his sons for hostages, so that when he is released he may not revolt against us, and we will release him.” +\p +\v 17 Simon knew that they spoke to him deceitfully, but he sent to get the money and the children, lest perhaps he would arouse great hostility among the people, +\v 18 who might say, “Because I didn’t send him the money and the children, he perished.” +\v 19 So he sent the children and the hundred talents, but Tryphon lied, and didn’t release Jonathan. +\p +\v 20 After this, Tryphon came to invade the land and destroy it, and he went around by the way that leads to Adora. Simon and his army marched near him to every place, wherever he went. +\v 21 Now the people of the citadel sent to Tryphon ambassadors, urging him to come to them through the wilderness, and to send them food. +\v 22 So Tryphon prepared all his cavalry to come, but on that night a very heavy snow fell, and he didn’t come because of the snow. He marched off and went into the land of Gilead. +\v 23 When he came near to Bascama, he killed Jonathan, and he was buried there. +\v 24 Then Tryphon turned back, and went away into his own land. +\p +\v 25 Simon sent, and took the bones of Jonathan his brother, and buried him at Modin, the city of his fathers. +\v 26 All Israel made great lamentation over him, and mourned for him many days. +\v 27 Simon built a monument on the tomb of his father and his kindred, and raised it high so that it could be seen, with polished stone on the front and back. +\v 28 He also set up seven pyramids, one near another, for his father, his mother, and his four brothers. +\v 29 For these, he made an elaborate setting, erecting great pillars around them, and upon the pillars he made suits of armor for a perpetual memorial, and beside the suits of armor, he carved ships, so that they could be seen by all who sail on the sea. +\v 30 This is the tomb which he made at Modin. It remains to this day. +\p +\v 31 Now Tryphon deceived the young King Antiochus and killed him, +\v 32 and reigned in his place. He put on himself the crown of Asia and brought a great calamity upon the land. +\v 33 Simon built up the strongholds of Judea, and walled them all around with high towers, great walls, gates, and bars; and he stored food in the strongholds. +\v 34 Simon chose men, and sent to King Demetrius with a request that he grant the country an immunity, because all that Tryphon did was to plunder. +\v 35 King Demetrius sent to him according to these words, and answered him, and wrote a letter to him, as follows: +\p +\v 36 “King Demetrius to Simon the high priest and friend\f + \fr 13:36 \ft See 1 Maccabees 2:18. \f* of kings, and to the elders and nation of the Jews, greetings. +\v 37 The golden crown and the palm branch, which you sent, we have received. We are ready to make a steadfast peace with you, yes, and to write to our officers to release you from tribute. +\v 38 Whatever things we confirmed to you, they are confirmed. The strongholds, which you have built, let them be your own. +\v 39 As for any oversights and faults committed to this day, we forgive them, and the crown tax which you owed us. If there were any other tax collected in Jerusalem, let it be collected no longer. +\v 40 If any among you are qualified to be enrolled in our court, let them be enrolled, and let there be peace between us.” +\p +\v 41 In the one hundred seventieth year,\f + \fr 13:41 \ft circa B.C. 143. \f* the yoke of the Gentiles was taken away from Israel. +\v 42 The people began to write in their instruments and contracts, “In the first year of Simon, the great high priest and captain and leader of the Jews.” +\p +\v 43 In those days Simon encamped against\f + \fr 13:43 \ft See 1 Maccabees 13:53 (compare 1 Maccabees 13:48); 1 Maccabees 14:7, 34; 15:28; 16:1: also Josephus. All the authorities read \fqa Gaza \ft in this verse. \f* Gazara, and surrounded it with troops. He made a seige engine, and brought it up to the city, and struck a tower, and captured it. +\v 44 Those who were in the engine leaped out into the city; and there was a great uproar in the city. +\v 45 The people of the city tore their clothes, and went up on the walls with their wives and children, and cried with a loud voice, asking Simon to give them\f + \fr 13:45 \ft Gr. \fqa right hands. \f* his right hand. +\v 46 They said, “Don’t deal with us according to our wickednesses, but according to your mercy.” +\v 47 So Simon was reconciled to them, and didn’t fight against them; but he expelled them from the city and cleansed the houses where the idols were, and then entered into it with singing and giving praise. +\v 48 He removed all uncleanness out of it, and placed in it men who would keep the law, and made it stronger than it was before, and built a dwelling place for himself in it. +\p +\v 49 But the people of the citadel in Jerusalem were hindered from going out and from going into the country, and from buying and selling. So they were very hungry, and a great number of them perished from famine. +\v 50 Then they cried out to Simon, that he should give them his right hand; and he gave it to them; but he expelled them from there, and he cleansed the citadel from its pollutions. +\v 51 He entered into it on the twenty-third day of the second month, in the one hundred seventy-first year,\f + \fr 13:51 \ft circa B.C. 142. \f* with praise and palm branches, with harps, with cymbals, and with stringed instruments, with hymns, and with songs, because a great enemy had been destroyed out of Israel. +\v 52 Simon ordained that they should keep that day every year with gladness. He made the hill of the temple that was by the citadel stronger than before, and he lived there with his men. +\v 53 Simon saw that his son John was a man, so he made him leader of all his forces; and he lived in Gazara. +\c 14 +\p +\v 1 In the one hundred seventy-second year,\f + \fr 14:1 \ft circa B.C. 141. \f* King Demetrius gathered his forces together, and went into Media to get help, that he might fight against Tryphon. +\v 2 When Arsaces, the king of Persia and Media, heard that Demetrius had come into his borders, he sent one of his princes to take him alive. +\v 3 He went and struck the army of Demetrius, and seized him and brought him to Arsaces, who put him under guard. +\p +\v 4 The land had rest all the days of Simon. He sought the good of his nation. His authority and his honor was pleasing to them all his days. +\v 5 Amid all his honors, he took Joppa for a harbor, and made it an entrance for the islands of the sea. +\v 6 He enlarged the borders of his nation and took possession of the country. +\v 7 He gathered together a great number of captives, and took control of Gazara, Bethsura, and the citadel, and he removed its uncleannesses from it. There was no one who resisted him. +\v 8 They tilled their land in peace, and the land gave her increase, and the trees of the plains gave their fruit. +\v 9 The old men sat in the streets; they all conversed together about good things. The young men put on glorious and warlike apparel. +\v 10 He provided food for the cities and furnished them with means of defense, until the glory of his name was known to the end of the earth. +\v 11 He made peace in the land, and Israel rejoiced with great joy. +\v 12 Each man sat under his vine and his fig tree, and there was no one to make them afraid. +\v 13 No one was left in the land who fought against them. The kings were defeated in those days. +\v 14 He strengthened all those of his people who were humble. He searched out the law, and every lawless and wicked person he took away. +\v 15 He glorified the sanctuary, and added to the vessels of the temple. +\p +\v 16 It was heard at Rome that Jonathan was dead, and even in Sparta, and they were exceedingly grieved. +\v 17 But as soon as they heard that his brother Simon was made high priest in his place, and ruled the country and the cities in it, +\v 18 they wrote to him on brass tablets to renew with him the friendship and the alliance which they had confirmed with his brothers Judas and Jonathan. +\v 19 These were read before the congregation at Jerusalem. +\p +\v 20 This is the copy of the letters which the Spartans sent: +\p “The rulers and the city of the Spartans, to Simon the high priest, to the elders, the priests, and the rest of the people of the Jews, our kindred, greetings. +\v 21 The ambassadors who were sent to our people reported to us about your glory and honor. We were glad for their coming, +\v 22 and we registered the things that were spoken by them in the public records\f + \fr 14:22 \ft Gr. \fqa counsels of the people. \f* as follows: ‘Numenius son of Antiochus, and Antipater son of Jason, the Jews’ ambassadors, came to us to renew the friendship they had with us. +\v 23 It pleased the people to entertain the men honorably, and to put the copy of their words in the public records,\f + \fr 14:23 \ft Gr. \fqa books that are appointed for the people. \f* to the end that the people of the Spartans might have a record of them. Moreover they wrote a copy of these things to Simon the high priest.’” +\p +\v 24 After this, Simon sent Numenius to Rome with a great shield of gold of weighing one thousand minas,\f + \fr 14:24 \ft 1,000 minas is about 499 kg or 1,098 pounds. \f* in order to confirm the alliance with them. +\p +\v 25 But when the people heard these things, they said, “What thanks shall we give to Simon and his sons? +\v 26 For he and his brothers and the house of his father have made themselves strong, and have fought and chased away Israel’s enemies, and confirmed liberty to Israel.\f + \fr 14:26 \ft Gr. \fqa him. \f*” +\v 27 So they wrote on tablets of brass, and set them on pillars on mount Zion. This is the copy of the writing: +\p “On the eighteenth day of Elul, in the one hundred seventy-second year,\f + \fr 14:27 \ft circa B.C. 141. \f* which is the third year of Simon the high priest, +\v 28 in Asaramel, in a great congregation of priests and people and princes of the nation, and of the elders of the country, it was proclaimed to us:\f + \fr 14:28 \ft Gr. \fqa he made known. \f* +\v 29 ‘Since wars often occurred in the country, Simon the son of Mattathias, the son of the sons of Joarib, and his brothers, put themselves in jeopardy and withstood the enemies of their nation, that their sanctuary and the law might be established, and glorified their nation with great glory. +\v 30 Jonathan rallied the nation, became their high priest, and was gathered to his people. +\v 31 Their enemies planned to invade their country, that they might destroy their country utterly, and stretch out their hands against their sanctuary. +\v 32 Then Simon rose up and fought for his nation. He spent much of his own money to arm the valiant men of his nation and give them wages. +\v 33 He fortified the cities of Judea and Bethsura that lies on the borders of Judea, where the weapons of the enemies were had been stored, and there he placed a garrison of Jews. +\v 34 He fortified Joppa which is upon the sea, and Gazara which is upon the borders of Azotus, where the enemies used to live, and placed Jews there, and set in there all things necessary for their restoration. +\v 35 The people saw Simon’s faith,\f + \fr 14:35 \ft Some authorities read \fqa acts. \f* and the glory which he resolved to bring to his nation, and they made him their leader and high priest, because he had done all these things, and for the justice and the faith which he kept to his nation, and because he sought by all means to exalt his people. +\v 36 In his days, things prospered in his hands, so that the Gentiles were taken away out of their country, and they also who were in the city of David, those who were in Jerusalem, who had made themselves a citadel, out of which they used to go, and polluted everything around the sanctuary, and did great damage to its purity. +\v 37 He placed Jews in it and fortified it for the safety of the country and the city, and made high the walls of Jerusalem. +\v 38 King Demetrius confirmed to him the high priesthood according to these things, +\v 39 and made him one of his friends,\f + \fr 14:39 \ft See 1 Maccabees 2:18. \f* and honored him with great honor; +\v 40 for he had heard that the Jews had been called by the Romans friends, allies, and kindred, and that they had met the ambassadors of Simon honorably; +\v 41 and that the Jews and the priests were well pleased that Simon should be their leader and high priest forever, until there should arise a faithful prophet; +\v 42 and that he should be governor over them, and should take charge of the sanctuary, to set them over their works, and over the country, and over the weapons, and over the strongholds; and that he should take charge of the sanctuary, +\v 43 and that he should be obeyed by all, and that all contracts in the country should be written in his name, and that he should be clothed in purple, and wear gold; +\v 44 and that it should not be lawful for any of the people or of the priests to nullify any of these things, or to oppose the words that he should speak, or to gather an assembly in the country without him, or to be clothed in purple, or wear a buckle of gold; +\v 45 but whoever should do otherwise, or nullify any of these things, he will be liable to punishment.’” +\v 46 All the people consented to ordain for Simon that he should do according to these words. +\v 47 So Simon accepted this, and consented to be high priest, and to be captain and governor\f + \fr 14:47 \ft Gr. \fqa ethnarch. \f* of the Jews and of the priests, and to be protector of all. +\p +\v 48 They commanded to put this writing on tablets of brass, and to set them up within the precinct of the sanctuary in a conspicuous place, +\v 49 and moreover to put copies of them in the treasury, so that Simon and his sons might have them. +\c 15 +\p +\v 1 Antiochus son of Demetrius the king sent a letter from the islands of the sea to Simon the priest and\f + \fr 15:1 \ft Gr. \fqa ethnarch. \f* governor of the Jews, and to all the nation. +\v 2 Its contents follow: +\p “King Antiochus to Simon the chief priest and\f + \fr 15:2 \ft Gr. \fqa ethnarch. \f* governor, and to the nation of the Jews, greetings. +\v 3 Whereas certain troublemakers have made themselves masters of the kingdom of our fathers, but my purpose is to claim the kingdom, that I may restore it as it was before; and moreover I have raised a multitude of foreign soldiers, and have prepared warships; +\v 4 moreover I plan to land in the country, that I may punish those who have destroyed our country, and those who have made many cities in the kingdom desolate; +\v 5 now therefore I confirm to you all the tax remissions which the kings who were before me remitted to you, and whatever gifts besides they remitted to you, +\v 6 and I permit you to coin money for your country with your own stamp, +\v 7 but that Jerusalem and the sanctuary should be free. All the weapons that you have prepared, and the strongholds that you have built, which you have in your possession, let them remain yours. +\v 8 Every debt owed to the king, and the things that will be owed to the king from henceforth and for evermore, let them be remitted to you. +\v 9 Moreover, when we have established our kingdom, we will glorify you and your nation and the temple with great glory, so that your glory will be made manifest in all the earth. +\p +\v 10 In the one hundred seventy-fourth year,\f + \fr 15:10 \ft circa B.C. 139 \f* Antiochus went into the land of his fathers; and all the forces came together to him, so that there were few men with Tryphon. +\v 11 King Antiochus pursued him, and he came, as he fled, to Dor, which is by the sea; +\v 12 for he knew that troubles had come upon him all at once, and that his forces had deserted him. +\v 13 Antiochus encamped against Dor, and with him one hundred twenty thousand men of war and eight thousand cavalry. +\v 14 He surrounded the city, and the ships joined in the attack from the sea. He harassed the city by land and sea, and permitted no one to go out or in. +\p +\v 15 Numenius and his company came from Rome, having letters to the kings and to the countries, in which were written these things: +\p +\v 16 “Lucius, consul of the Romans, to King Ptolemy, greetings. +\v 17 The Jews’ ambassadors came to us as our friends and allies, to renew the old friendship and alliance, being sent from Simon the high priest, and from the people of the Jews. +\v 18 Moreover they brought a shield of gold weighing one thousand minas.\f + \fr 15:18 \ft 1,000 minas is about 499 kg. or about 1,098 pounds.\f* +\v 19 It pleased us therefore to write to the kings and to the countries, that they should not seek their harm or fight against them, their cities, and their country, or be allies with those who fight against them. +\v 20 Moreover, it seemed good to us to receive the shield from them. +\v 21 If therefore any troublemakers have fled from their country to you, deliver them to Simon the high priest, that he may take vengeance on them according to their law.” +\p +\v 22 He wrote the same things to King Demetrius, to Attalus, to Arathes, to Arsaces, +\v 23 to all the countries, to\f + \fr 15:23 \ft Some authorities read \fqa Sampsaces: \ft the Latin versions have \fqa Lampsacus. \f* Sampsames, to the Spartans, to Delos, to Myndos, to Sicyon, to Caria, to Samos, to Pamphylia, to Lycia, to Halicarnassus, to Rhodes, to Phaselis, to Cos, to Side, to Aradus, Gortyna, Cnidus, Cyprus, and Cyrene. +\v 24 They also wrote this copy to Simon the high priest. +\p +\v 25 But King Antiochus encamped against Dor the second day, bringing his forces up to it continually, and making engines of war; and he shut up Tryphon from going in or out. +\v 26 Simon sent him two thousand chosen men to fight on his side, with silver, gold, and instruments of war in abundance. +\v 27 He would not receive them, but nullified all the covenants which he had made with him before, and was estranged from him. +\v 28 He sent to him Athenobius, one of his friends,\f + \fr 15:28 \ft See 1 Maccabees 2:18. \f* to confer with him, saying, “You hold possession of Joppa, Gazara, and the citadel that is in Jerusalem, cities of my kingdom. +\v 29 You have devastated their territory, and done great harm in the land, and control of many places in my kingdom. +\v 30 Now therefore hand over the cities which you have taken, and the tributes of the places which you have taken control of outside of the borders of Judea; +\v 31 or else give me for them five hundred talents of silver; and for the harm that you have done, and the tributes of the cities, another five hundred talents. Otherwise we will come and subdue you.” +\p +\v 32 Athenobius, the king’s friend,\f + \fr 15:32 \ft See 1 Maccabees 2:18. \f* came to Jerusalem. When he saw the glory of Simon, the cupboard of gold and silver vessels, and his great attendance, he was amazed. He reported to him the king’s words. +\v 33 Simon answered, and said to him, “We have not taken other men’s land nor do we have possession of that which belongs to others, but of the inheritance of our fathers. However, it had been in possession of our enemies wrongfully for a while. +\v 34 But we, having opportunity, firmly hold the inheritance of our fathers. +\v 35 As for Joppa and Gazara, which you demand, they did great harm among the people throughout our country. We will give one hundred talents for them.” +\p Athenobius didn’t answer even one word, +\v 36 but returned in a rage to the king, and reported to him these words, and the glory of Simon, and all that he had seen; and the king was exceedingly angry. +\v 37 Meanwhile, Tryphon embarked on board a ship, and fled to Orthosia. +\p +\v 38 The king appointed Cendebaeus chief captain of the sea coast, and gave him troops of infantry and cavalry. +\v 39 He commanded him to encamp against Judea, and he commanded him to build up Kidron, and to fortify the gates, and that he should fight against the people; but the king pursued Tryphon. +\v 40 So Cendebaeus came to Jamnia and began to provoke the people, and to invade Judea, and to take the people captive and kill them. +\v 41 He built Kidron and stationed cavalry and infantry there, to the end that going out they might make raids on the highways of Judea, as the king had commanded him. +\c 16 +\p +\v 1 John went up from Gazara and told Simon his father what Cendebaeus was doing. +\v 2 Simon called his two oldest sons, Judas and John, and said to them, “I and my brothers and my father’s house have fought the battles of Israel from our youth, even to this day; and things have prospered in our hands, that we have often delivered Israel. +\v 3 But now I am old, and you moreover, by his mercy, are of a sufficient age. Take the place of me and my brother, and go out and fight for our nation; and let the help which is from heaven be with you. +\p +\v 4 He chose out of the country twenty thousand men of war and cavalry, and they went against Cendebaeus, and slept at Modin. +\v 5 Rising up in the morning, they went into the plain, and, behold, a great army of infantry and cavalry came to meet them. There was a brook between them. +\v 6 He encamped near them, he and his people. He saw that the people were afraid to pass over the brook, and he passed over first. When the men saw him, they passed over after him. +\v 7 He divided the people, and placed the calvary in the midst of the infantry; but the enemies’ cavalry were exceedingly many. +\v 8 They sounded the trumpets; and Cendebaeus and his army were put to flight, and many of them fell wounded to death, but those who were left fled to the stronghold. +\v 9 At that time Judas, John’s brother, was wounded; but John pursued after them until he came to Kidron, which Cendebaeus had built. +\v 10 They fled to the towers that are in the fields of Azotus; and he burned it with fire. About two thousand men men of them fell. Then he returned into Judea in peace. +\p +\v 11 Ptolemy the son of Abubus had been appointed governor over the plain of Jericho, and he had much silver and gold; +\v 12 for he was the high priest’s son-in-law. +\v 13 His heart was lifted up, and he planned to make himself master of the country, and he made deceitful plans against Simon and his sons, to do away with them. +\v 14 Now Simon was visiting the cities that were in the country, and attending to their needs. He went down to Jericho—himself with Mattathias and Judas his sons—in the one hundred seventy-seventh year,\f + \fr 16:14 \ft circa B.C. 136. \f* in the eleventh month, which is the month Sebat. +\v 15 The son of Abubus received them deceitfully into the little stronghold that is called Dok, which he had built, and made them a great banquet, and hid men there. +\v 16 When Simon and his sons had drunk freely, Ptolemy and his men rose up, took their weapons, rushed in against Simon in the banqueting place, and killed him, his two sons, and some of his servants. +\v 17 He committed a great iniquity, and repaid evil for good. +\p +\v 18 Ptolemy wrote these things and sent to the king, that he should send him forces to aid him, and should deliver him their country and the cities. +\v 19 He sent others to Gazara to do away with John. To the captains of thousands, he sent letters to come to him, that he might give them silver, gold, and gifts. +\v 20 He sent others to take possession of Jerusalem and the temple hill. +\v 21 One ran before to Gazara, and told John that his father and kindred had perished, and he has sent to kill you also. +\v 22 When he heard, he was greatly shocked. He seized the men who came to destroy him and killed them; for he perceived that they were seeking to destroy him. +\p +\v 23 And the rest of the acts of John and of his wars and of his valiant deeds which he did, and of the building of the walls which he built, and of his achievements, +\v 24 behold, they are written in the chronicles\f + \fr 16:24 \ft Gr. \fqa book of days. \f* of his high priesthood, from the time that he was made high priest after his father. diff --git a/c-sharp/assets/WEB/792MAengWEBUS.SFM b/c-sharp/assets/WEB/792MAengWEBUS.SFM new file mode 100644 index 0000000000..263bd1e6a2 --- /dev/null +++ b/c-sharp/assets/WEB/792MAengWEBUS.SFM @@ -0,0 +1,708 @@ +\id 2MA +\h 2 Maccabees +\toc1 The Second Book of the Maccabees +\toc2 2 Maccabees +\toc3 2Ma +\mt1 The Second Book of the Maccabees +\ip \bk The Second Book of the Maccabees\bk* is recognized as Deuterocanonical Scripture by the Roman Catholic, Greek Orthodox, and Russian Orthodox Churches. +\c 1 + +\p +\v 1 The kindred, the Jews who are in Jerusalem and those who are in the country of Judea, send greetings and good peace to the kindred, the Jews who are throughout Egypt. +\v 2 May God do good to you, and remember his covenant with Abraham, Isaac, and Jacob, his faithful servants, +\v 3 and give you all a heart to worship him and do his will with a strong heart and a willing soul. +\v 4 May God open your heart to his law and his statutes, and make peace, +\v 5 and listen to your requests, and be reconciled with you, and not forsake you in an evil time. +\v 6 Now we are praying for you here. +\p +\v 7 In the reign of Demetrius, in the one hundred sixty-ninth year, we the Jews have already written to you in the suffering and in the distress that has come upon us in these years, from the time that Jason and his company revolted from the holy land and the kingdom, +\v 8 and set the gate on fire, and shed innocent blood. We prayed to the Lord, and were heard. We offered sacrifices and meal offerings. We lit the lamps. We set out the show bread.\f + \fr 1:8 \ft Gr. \fqa loaves \f* +\v 9 Now see that you keep the days of the feast of tabernacles in the month Chislev in the one hundred eighty-eighth year. +\b +\p +\v 10 The people of Jerusalem and those who are in Judea, with the senate and Judas, to Aristobulus, King Ptolemy’s teacher, who is also of the stock of the anointed priests, and to the Jews who are in Egypt, we send greetings and health. +\p +\v 11 Having been saved by God out of great perils, as men arrayed against a king, we thank him greatly. +\v 12 For he threw out into Persia those who fought against us in the holy city. +\v 13 For when the prince had come there, with an army that seemed irresistible, they were cut to pieces in the temple of Nanaea by the treachery of Nanaea’s priests. +\v 14 For Antiochus, on the pretense that he would marry her, came into the place, he and his friends who were with him, that they might take a large part of the treasures as a dowry. +\v 15 And when the priests of Nanaea’s temple had set the treasures out, and he had come there with a small company within the wall of the sacred precinct, they locked the temple when Antiochus had come in. +\v 16 Opening the secret door of the panelled ceiling, they threw stones and struck down the prince. They cut him and his company in pieces, and cut off their heads, and threw them to the people who were outside. +\v 17 Blessed be our God in all things, who handed over those who had committed impiety. +\p +\v 18 Since we are now about to celebrate the purification of the temple in the month Chislev, on the twenty-fifth day, we thought it necessary to notify you, so that you may also keep a feast of tabernacles, and remember the fire which was given when Nehemiah offered sacrifices, after he had built both the temple and the altar. +\p +\v 19 For indeed when our fathers were about to be led into the land of Persia, the godly priests of that time took some of the fire of the altar, and hid it secretly in the hollow of a well that was without water, where they made sure that the place was unknown to anyone. +\v 20 Now after many years, when it pleased God, Nehemiah, having received a charge from the king of Persia, sent in quest of the fire the descendants of the priests who hid it. When they declared to us that they had found no fire, but thick liquid, +\v 21 he commanded them to draw some of it out and bring it to him. When the sacrifices had been offered, Nehemiah commanded the priests to sprinkle with that liquid both the wood and the things laid on it. +\v 22 When that was done and some time had passed, and the sun shone out, which before was hidden with clouds, a great blaze was kindled, so that all men marveled. +\v 23 The priests made a prayer while the sacrifice was being consumed—both the priests and all the others. Jonathan led and the rest responded, as Nehemiah did. +\p +\v 24 The prayer was like this: “O Lord, Lord God, the Creator of all things, who are awesome, strong, righteous, and merciful, who alone are King and gracious, +\v 25 who alone supply every need, who alone are righteous, almighty, and eternal, you who save Israel out of all evil, who chose the ancestors and sanctified them, +\v 26 accept the sacrifice for all your people Israel, and preserve your own portion, and consecrate it. +\v 27 Gather together our scattered people, set at liberty those who are in bondage among the heathen, look upon those who are despised and abhorred, and let the heathen know that you are our God. +\v 28 Punish those who oppress us and in arrogance shamefully entreat us. +\v 29 Plant your people in your holy place, even as Moses said.” +\p +\v 30 Then the priests sang the hymns. +\v 31 As soon as the sacrifice was consumed, then Nehemiah commanded that the rest of the liquid be poured on large stones. +\v 32 When this was done, a flame was kindled; but when the light from the altar shone back, it went out. +\v 33 When the matter became known, and it was told the king of the Persians that, in the place where the priests who were led away had hid the fire, the liquid appeared which Nehemiah and those who were with him purified the sacrifice, +\v 34 then the king enclosed the place and made it sacred after he had investigated the matter. +\v 35 When the king would show favor to any, he would exchange many presents and give them some of this liquid. +\v 36 Nehemiah and those who were with him called this thing “Nephthar”, which is by interpretation, “Cleansing”; but most men call it Nephthai. +\c 2 +\p +\v 1 It is also found in the records that Jeremiah the prophet commanded those who were carried away to take some of the fire, as has been mentioned, +\v 2 and how that the prophet charged those who were carried away, having given them the law, that they should not forget the statutes of the Lord or be led astray in their minds when they saw images of gold and silver, and their adornment. +\v 3 With other such words exhorted he them, that the law should not depart from their hearts. +\p +\v 4 It was in the writing that the prophet, being warned by God, commanded that the tabernacle and the ark should follow with him,\f + \fr 2:4 \ft Gr. \fqa and when. \ft The Greek text here is probably corrupt. \f* when he went out to the mountain where Moses had gone up and saw God’s inheritance. +\v 5 Jeremiah came and found a cave, he brought the tabernacle, the ark, and the altar of incense into it; then he sealed the entrance. +\v 6 Some of those who followed with him came there that they might mark the way, and could not find it. +\v 7 But when Jeremiah learned about that, he rebuked them, saying, “The place shall be unknown until God gathers the people together again and shows mercy. +\v 8 Then the Lord will disclose these things, and the glory of the Lord shall be seen with the cloud, as it was also shown to Moses, also as Solomon implored that the place might be consecrated greatly, +\v 9 and it was also declared that he, having wisdom, offered a sacrifice of dedication, and of the finishing of the temple. +\v 10 As Moses prayed to the Lord and fire came down out of heaven and consumed the sacrifice, even so Solomon also prayed, and the fire came down and consumed the burnt offerings. +\v 11 \f + \fr 2:11 \ft See Leviticus 10:16 and 9:24. \f*Moses said, ‘Because the sin offering had not been eaten, it was consumed in like manner.’ +\v 12 Likewise Solomon kept the eight days.” +\p +\v 13 The same things were reported both in the public archives and in Nehemiah’s records, and also how he, founding a library, gathered together the books about the kings and prophets, and the writings of David, and letters of kings about sacred gifts. +\v 14 In like manner Judas also gathered together for us all those books that had been scattered by reason of the war, and they are still with us. +\v 15 If therefore you have need of them, send some people to bring them to you. +\p +\v 16 Seeing then that we are about to celebrate the purification, we write to you. You will therefore do well if you celebrate the days. +\v 17 Now God, who saved all his people, and restored the heritage to all, with the kingdom, the priesthood, and the consecration, +\v 18 even as he promised through the law— in God have we hope, that he will soon have mercy upon us, and gather us together out of everywhere under heaven into his holy place; for he delivered us out of great evils, and purified the place. +\b +\pc ——————— +\b +\p +\v 19 Now the things concerning Judas Maccabaeus and his brothers, the purification of the greatest temple, the dedication of the altar, +\v 20 and further the wars against Antiochus Epiphanes and Eupator his son, +\v 21 and the manifestations that came from heaven to those who fought with one another in brave deeds for the religion of the Jews; so that, being but a few, they seized the whole country, chased the barbarous multitudes, +\v 22 recovered again the temple renowned all the world over, freed the city, and restored the laws which were about to be overthrown, seeing the Lord became gracious to them with all kindness. +\v 23 These things which have been declared by Jason of Cyrene in five books, we will attempt to abridge in one book. +\v 24 For having in view the confused mass of the numbers, and the\f + \fr 2:24 \ft Or, weariness \f* difficulty which awaits those who would enter into the narratives of the history, by reason of the abundance of the matter, +\v 25 we were careful that those who choose to read may be attracted, and that those who wish us well may find it easy to recall, and that all readers may benefit. +\v 26 Although to us, who have taken upon ourselves the painful labor of the abridgement, the task is not easy, but a matter of sweat and sleeplessness, +\v 27 even as it is no light thing to him who prepares a banquet, and seeks the benefit of others. Nevertheless, for the sake of the gratitude of the many we will gladly endure the painful labor, +\v 28 leaving to the historian the exact handling of every particular, and again having no strength to fill in the outlines of our abridgement. +\v 29 For as the masterbuilder of a new house must care for the whole structure, and again he who undertakes to decorate and paint it must seek out the things fit for its adorning; even so I think it is also with us. +\v 30 To occupy the ground, and to indulge in long discussions, and to be curious in particulars, is fitting for the first author of the history; +\v 31 but to strive after brevity of expression, and to avoid a labored fullness in the treatment, is to be granted to him who would bring a writing into a new form. +\v 32 Here then let’s begin the narration, only adding this much to that which has already been said; for it is a foolish thing to make a long prologue to the history, and to abridge the history itself. +\b +\c 3 +\p +\v 1 When the holy city was inhabited with unbroken peace and the laws were kept very well because of the godliness of Onias the high priest and his hatred of wickedness, +\v 2 it came to pass that even the kings themselves honored the place and glorified the temple with the noblest presents, +\v 3 so that even King Seleucus of Asia bore all the costs belonging to the services of the sacrifices out of his own revenues. +\v 4 But a man named Simon of the tribe of Benjamin, having been made guardian of the temple, disagreed with the high priest about the ruling of the market in the city. +\v 5 When he couldn’t overcome Onias, he went to Apollonius of \f + \fr 3:5 \ft Greek \fqa Thraseas\f*Tarsus, who at that time was governor of Coelesyria and Phoenicia. +\v 6 He brought him word how that the treasury in Jerusalem was full of untold sums of money, so that the multitude of the funds was innumerable, and that they didn’t pertain to the account of the sacrifices, but that it was possible that these should fall under the king’s power. +\v 7 When Apollonius met the king, he informed him of the money about which he had been told. So the king appointed Heliodorus, who was his chancellor, and sent him with a command to accomplish the removal of the reported money. +\v 8 So Heliodorus set out on his journey at once, ostensibly to visit the cities of Coelesyria and Phoenicia, but in fact to execute the king’s purpose. +\p +\v 9 When he had come to Jerusalem and had been courteously received by the high priest of the city, he told him about the information which had been given, and declared why he had come; and he inquired if in truth these things were so. +\v 10 The high priest explained to him that there were in the treasury deposits of widows and orphans, +\v 11 and moreover some money belonging to Hyrcanus the son of Tobias, a man in very high place, not as that impious Simon falsely alleged; and that in all there were four hundred talents of silver and two hundred of gold, +\v 12 and that it was altogether impossible that wrong should be done to those who had put trust in the holiness of the place, and in the majesty and inviolable sanctity of the temple, honored over all the world. +\v 13 But Heliodorus, because of the king’s command given him, said that in any case this money must be confiscated for the king’s treasury. +\p +\v 14 So having appointed a day, he entered in to direct the inquiry concerning these matters; and there was no small distress throughout the whole city. +\v 15 The priests, prostrating themselves before the altar in their priestly garments, and called toward heaven upon him who gave the law concerning deposits, that he should preserve these treasures safe for those who had deposited them. +\v 16 Whoever saw the appearance of the high priest was wounded in mind; for his countenance and the change of his color betrayed the distress of his soul. +\v 17 For a terror and a shuddering of the body had come over the man, by which the pain that was in his heart was plainly shown to those who looked at him. +\v 18 Those who were in the houses rushed out in crowds to make a universal supplication, because the place was about to come into dishonor. +\v 19 The women, girded with sackcloth under their breasts, thronged the streets. The virgins who were kept indoors ran together, some to the gates, others to the walls, and some looked out through the windows. +\v 20 All, stretching out their hands toward heaven, made their solemn supplication. +\v 21 Then it was pitiful to see the multitude prostrating themselves all mixed together, and the anxiety of the high priest in his great distress. +\p +\v 22 While therefore they called upon the Almighty Lord to keep the things entrusted to them \f + \fr 3:22 \ft Gr. \fqa safe with all security.\f* safe and secure for those who had entrusted them, +\v 23 Heliodorus went on to execute that which had been decreed. +\v 24 But when he was already present there with his guards near the treasury, the Sovereign of spirits and of all authority caused a great manifestation, so that all who had presumed to come with him, stricken with dismay at the power of God, fainted in terror. +\v 25 For they saw a horse with a frightening rider, adorned with beautiful trappings, and he rushed fiercely and struck at Heliodorus with his forefeet. It seemed like he who sat on the horse had complete armor of gold. +\v 26 Two others also appeared to him, young men notable in their strength, and beautiful in their glory, and splendid in their apparel, who stood by him on either side, and scourged him unceasingly, inflicting on him many sore stripes. +\v 27 When he had fallen suddenly to the ground, and great darkness had come over him, his guards picked him up and put him on a stretcher, +\v 28 and carried him—this man who had just now entered with a great retinue and all his guard into the aforesaid treasury, himself now brought to utter helplessness, manifestly made to recognize the sovereignty of God. +\v 29 So, while he, through the working of God, speechless and bereft of all hope and deliverance, lay prostrate, +\v 30 they blessed the Lord who acted marvelously for his own place. The temple, which a little before was full of terror and alarm, was filled with joy and gladness after the Almighty Lord appeared. +\p +\v 31 But quickly some of Heliodorus’s familiar friends implored Onias to call upon the Most High to grant life to him who lay quite at the last gasp. +\v 32 The high priest, secretly fearing lest the king might come to think that some treachery toward Heliodorus had been perpetrated by the Jews, brought a sacrifice for the recovery of the man. +\v 33 But as the high priest was making the atoning sacrifice, the same young men appeared again to Heliodorus, arrayed in the same garments. They stood and said, “Give Onias the high priest great thanks, for for his sake the Lord has granted you life. +\v 34 See that you, since you have been scourged from heaven, proclaim to all men the sovereign majesty of God.” When they had spoken these words, they vanished out of sight. +\v 35 So Heliodorus, having offered a sacrifice to the Lord and vowed \f + \fr 3:35 \ft Gr. \fqa greatest. \f*great vows to him who had saved his life, and having bidden Onias farewell, returned with his army to the king. +\v 36 He testified to all men the works of the greatest God, which he had seen with his eyes. +\p +\v 37 When the king asked Heliodorus what sort of man was fit to be sent yet once again to Jerusalem, he said, +\v 38 “If you have any enemy or conspirator against the state, send him there, and you will receive him back well scourged, if he even escapes with his life; because truly there is some power of God in that place. +\v 39 For he who has his dwelling in heaven himself has his eyes on that place and helps it. Those who come to hurt it, he strikes and destroys.” +\p +\v 40 This was the history of Heliodorus and the keeping of the treasury. +\c 4 +\p +\v 1 The previously mentioned Simon, who had given information about the money against his country, slandered Onias, saying that it was he who had incited Heliodorus and had been the real cause of these evils. +\v 2 He dared to call him a conspirator against the state who was actually the benefactor of the city, the guardian of his fellow countrymen, and a zealot for the laws. +\v 3 When his hatred grew so great that even murders were perpetrated through one of Simon’s approved agents, +\v 4 Onias, seeing the danger of the contention, and that \f + \fr 4:4 \ft Compare 2 Maccabees 4:21. See also 2 Maccabees 3:5. The Greek as commonly read means \fqa Apollonius, as \ft being \fqa the governor...Phoenicia, did rage, and increase etc. \f*Apollonius the son of Menestheus, the governor of Coelesyria and Phoenicia, was increasing Simon’s malice, +\v 5 appealed to the king, not to be an accuser of his fellow-citizens, but looking to the good of all the\f + \fr 4:5 \ft Gr. \fqa multitude. \f* people, both public and private; +\v 6 for he saw that without the king’s involvement it was impossible for the state to obtain peace any more, and that Simon would not cease from his madness. +\p +\v 7 When Seleucus was deceased, and Antiochus, who was called Epiphanes, succeeded to the kingdom, Jason the brother of Onias supplanted his brother in the high priesthood, +\v 8 having promised to the king at an audience three hundred sixty talents of silver, and out of another fund eighty talents. +\v 9 In addition to this, he undertook to assign one hundred fifty more, if it might be allowed him \f + \fr 4:9 \ft Gr. \fqa through his. \f*through the king’s authority to set him up a gymnasium and a body of youths to be trained in it, and to register the inhabitants of Jerusalem as citizens of Antioch. +\v 10 When the king had assented, and Jason had taken possession of the office, he immediately shifted those of his own race to the Greek way of life. +\v 11 Setting aside the royal ordinances of special favor to the Jews, granted by the means of John the father of Eupolemus, who went on the mission to the Romans to establish friendship and alliance, and seeking to overthrow the lawful ways of living, he brought in new customs forbidden by the law. +\v 12 For he eagerly established a gymnasium under the citadel itself, and caused the noblest of the young men to wear the Greek hat. +\v 13 Thus there was an extreme of hellenization, and an advance of a foreign religion, by reason of the exceeding profaneness of Jason, who was an ungodly man and not a high priest; +\v 14 so that the priests had no more any zeal for the services of the altar; but despising the sanctuary and neglecting the sacrifices, they hastened to enjoy that which was unlawfully provided in the wrestling arena, after the summons to the discus-throwing. +\v 15 They despised the honors of their fathers, and valued the prestige of the Greeks best of all. +\v 16 For this reason, severe calamity overtook them. The men whose ways of living they earnestly followed, and to whom they desired to be made like in all things, these became their enemies and punished them. +\v 17 For it is not a light thing to show irreverence to God’s laws, but later events will make this clear. +\p +\v 18 Now when certain games that came every fifth year were kept at Tyre, and the king was present, +\v 19 the vile Jason sent sacred envoys,\f + \fr 4:19 \ft See ver. 9.\f* as being Antiochians of Jerusalem, bearing three hundred drachmas of silver to the sacrifice of Hercules, which even the bearers thereof thought not right to use for any sacrifice, because it was not fit, but to spend it for another purpose. +\v 20 Although the intended purpose of the sender this money was for the sacrifice of Hercules, yet on account of \f + \fr 4:20 \ft Some authorities read \fqa the bearers. \f*present circumstances it went to the construction of trireme warships. +\p +\v 21 Now when Apollonius the son of Menestheus was sent into Egypt for the \f + \fr 4:21 \ft The exact meaning of the Greek word is uncertain.\f* enthronement of Philometor as king, Antiochus, learning that Philometor had shown himself hostile toward the government, took precautions for the security of his realm. Therefore, going to Joppa, he travelled on to Jerusalem. +\v 22 Being magnificently received by Jason and the city, he was brought in with torches and shouting. Then he led his army down into Phoenicia. +\p +\v 23 Now after a space of three years, Jason sent Menelaus, the previously mentioned Simon’s brother, to carry the money to the king, and to make reports concerning some necessary matters. +\v 24 But he being commended to the king, and having been glorified by the display of his authority, secured the high priesthood for himself, outbidding Jason by three hundred talents of silver. +\v 25 After receiving the royal mandates, he returned bringing nothing worthy of the high priesthood, but having the passion of a cruel tyrant and the rage of a savage animal. +\v 26 So Jason, who had supplanted his own brother, was supplanted by another and driven as a fugitive into the country of the Ammonites, +\v 27 Menelaus had possession of the office; but of the money that had been promised to the king nothing was regularly paid, even though Sostratus the governor of the citadel demanded it— +\v 28 for his job was the gathering of the revenues—so they were both called by the king to his presence. +\v 29 Menelaus left his own brother Lysimachus for his\f + \fr 4:29 \ft Gr. \fqa successor. \f* deputy in the high priesthood; and Sostratus left Crates, who was over the Cyprians. +\p +\v 30 Now while this was the state of things, it came to pass that the people of Tarsus and Mallus revolted because they were to be given as a present to Antiochis, the king’s concubine. +\v 31 The king therefore quickly came to settle matters, leaving for his \f + \fr 4:31 \ft Gr. \fqa successor. \f*deputy Andronicus, a man of high rank. +\v 32 Then Menelaus, supposing that he had gotten a favorable opportunity, presented to Andronicus certain vessels of gold belonging to the temple, which he had stolen. He had already sold others into Tyre and the neighboring cities. +\v 33 When Onias had sure knowledge of this, he sharply reproved him, having withdrawn himself into a sanctuary at Daphne, that lies by Antioch. +\v 34 Therefore Menelaus, taking Andronicus aside, asked him to kill Onias. Coming to Onias, and being persuaded to use treachery, and being received as a friend, Andronicus gave him his right hand with oaths and, though he was suspicious, persuaded him to come out of the sanctuary. Then, with no regard for justice, he immediately put him to death. +\v 35 For this reason not only Jews, but many also of the other nations, had indignation and displeasure at the unjust murder of the man. +\v 36 And when the king had come back from the places in Cilicia, the Jews who were in the city appealed to him against Andronicus (the Greeks also joining with them in hatred of the wickedness), urging that Onias had been wrongfully slain. +\v 37 Antiochus therefore was heartily sorry, and was moved to pity, and wept, because of the sober and well ordered life of him who was dead. +\v 38 Being inflamed with anger, he immediately stripped off Andronicus’s purple robe, and tore off his under garments, and when he had led him round through the whole city to that very place where he had committed the outrage against Onias, there he put the murderer out of the way, the Lord rendering to him the punishment he had deserved. +\p +\v 39 Now when many sacrileges had been committed in the city by Lysimachus with the consent of Menelaus, and when the report of them had spread abroad outside, the people gathered themselves together against Lysimachus, after many vessels of gold had already been stolen. +\v 40 When the multitudes were rising against him and were filled with anger, Lysimachus armed about three thousand men, and with unrighteous violence began the attack under the leadership of Hauran, a man far gone in years and no less also in folly. +\v 41 But when they perceived the assault of Lysimachus, some caught up stones, others logs of wood, and some took handfuls of the ashes that lay near, and they flung them all in wild confusion at Lysimachus and those who were with him. +\v 42 As a result, they wounded many of them, they killed some, and they forced the rest of them to flee, but the author of the sacrilege himself they killed beside the treasury. +\p +\v 43 But about these matters, there was an accusation laid against Menelaus. +\v 44 When the king had come to Tyre, the three men who were sent by the senate pleaded the cause before him. +\v 45 But Menelaus, seeing himself now defeated, promised much money to Ptolemy the son of Dorymenes, that he might win over the king. +\v 46 Therefore Ptolemy taking the king aside into a cloister, as if to get some fresh air, convinced him to change his mind. +\v 47 He who was the cause of all the evil, Menelaus, he discharged from the accusations; but these hapless men, who, if they had pleaded even before Scythians, would have been discharged uncondemned, them he sentenced to death. +\v 48 Those who were spokesmen for the city and the families of Israel and the holy vessels soon suffered that unrighteous penalty. +\v 49 Therefore even certain Tyrians, moved with hatred of the wickedness, provided magnificently for their burial. +\v 50 But Menelaus, through the covetous dealings of those who were in power, remained still in his office, growing in wickedness, established as a great conspirator against his fellow-citizens. +\c 5 +\p +\v 1 Now about this time Antiochus made his second invasion into Egypt. +\v 2 It happened that throughout all the city, for almost forty days, cavalry appeared in the midst of the sky in swift motion, wearing robes woven with gold and carrying spears, equipped with troops for battle— +\v 3 drawing swords, squadrons of cavalry in array, encounters and pursuits of both armies, shaking shields, multitudes of lances, throwing of missiles, flashing of golden trappings, and putting on all sorts of armor. +\v 4 Therefore everyone prayed that the manifestation might have been given for good. +\p +\v 5 When a false rumor had arisen that Antiochus was dead, Jason took not less than a thousand men, and suddenly made an assault upon the city. When those who were on the wall were being routed, and the city was at length nearly taken, Menelaus took refuge in the citadel. +\v 6 But Jason slaughtered his own citizens without mercy, not considering that good success against kinsmen is the greatest misfortune, but supposing himself to be setting up trophies over enemies, and not over fellow-countrymen. +\v 7 He didn’t win control of the government, but receiving shame as the result of his conspiracy, he fled again as a fugitive into the country of the Ammonites. +\v 8 At last therefore he met with a miserable end. Having been imprisoned at the court of Aretas the prince of the Arabians, fleeing from city to city, pursued by all men, hated as an rebel against the laws, and abhorred as the executioner of his country and his fellow citizens, he was cast ashore in Egypt. +\v 9 He who had driven many from their own country into exile perished in exile, having crossed the sea to the Lacedaemonians, hoping to find shelter there because they were\f + \fr 5:9 \ft See 1 Maccabees 12:7. \f* near of kin. +\v 10 He who had thrown out a multitude unburied had none to mourn for him. He didn’t have any funeral at all and no place in the tomb of his ancestors. +\p +\v 11 Now when news came to the king concerning that which was done, he thought that Judea was in revolt. So, setting out from Egypt in a rage, he took the city by force of weapons, +\v 12 and commanded his soldiers to cut down without mercy those who came in their way, and to kill those who went into their houses. +\v 13 Then there was killing of young and old, destruction of boys, women, and children, and slaying of virgins and infants. +\v 14 In a total of three days, eighty thousand were destroyed, of which forty thousand were slain in close combat, and no fewer were sold into slavery than slain. +\p +\v 15 Not content with this, he presumed to enter into the most holy temple of all the earth, having Menelaus for his guide (who had proved himself a traitor both to the laws and to his country), +\v 16 even taking the sacred vessels with his polluted hands, and dragging down with his profane hands the offerings that had been dedicated by other kings to enhance the glory and honor of the place. +\v 17 Antiochus was lifted up in mind, not seeing that because of the sins of those who lived in the city the Sovereign Lord had been provoked to anger a little while, and therefore his eye was turned away from the place. +\v 18 But had it not been so that they were already bound by many sins, this man, even as Heliodorus who was sent by King Seleucus to view the treasury, would, as soon as he came forward, have been scourged and turned back from his daring deed. +\v 19 However the Lord didn’t choose the nation for the place’s sake, but the place for the nation’s sake. +\v 20 Therefore also the place itself, having shared in the calamities that happened to the nation, did afterward share in its benefits; and the place which was forsaken in the wrath of the Almighty was, at the reconciliation of the great Sovereign, restored again with all glory. +\p +\v 21 As for Antiochus, when he had carried away out of the temple one thousand eight hundred talents, he hurried away to Antioch, thinking in his arrogance that he could sail on land and walk on the sea, because his heart was lifted up. +\v 22 Moreover he left governors to afflict the race: at Jerusalem, Philip, by race a Phrygian, and in character more barbarous than him who set him there; +\v 23 and at Gerizim, Andronicus; and besides these, Menelaus, who worse than all the rest, exalted himself against his fellow-citizens. Having a malicious mind\f + \fr 5:23 \ft Some authorities read \fqa toward the Jews, he sent. \ft The Greek text of this sentence is uncertain. \f* toward the Jews\f + \fr 5:23 \ft Compare 2 Maccabees 4:9, 19; 9:19. \f* whom he had made his citizens, +\v 24 he sent that\f + \fr 5:24 \ft Gr. \fqa Μυσάρχην, \ft which also may mean \fqa ruler of the Mysians. \f* lord of pollutions Apollonius with an army of twenty-two thousand, commanding him to kill all those who were of full age, and to sell the women and the boys as slaves. +\v 25 He came to Jerusalem, and pretending to be a man of peace, waited till the holy day of the Sabbath, and finding the Jews at rest from work, he commanded his men to parade fully armed. +\v 26 He put to the sword all those who came out to the spectacle. Running into the city with the armed men, he killed great multitudes. +\v 27 But Judas, who is also called Maccabaeus, with about nine others, withdrew himself, and with his company kept himself alive in the mountains like wild animals do. They continued feeding on what grew wild, that they might not be partakers of the defilement. +\c 6 +\p +\v 1 Not long after this, the king sent out \f + \fr 6:1 \ft Or, \fqa Geron an Athenian \f*an old man of Athens to compel the Jews to depart from the laws of their fathers and not to live by the laws of God, +\v 2 and also to pollute the sanctuary in Jerusalem and to call it by the name of Olympian Zeus, and to call the sanctuary in Gerizim by the name of Zeus the Protector of foreigners, even as the people who lived in that place did. +\p +\v 3 The visitation of this evil was harsh and utterly grievous. +\v 4 For the temple was filled with debauchery and reveling by the heathen, who \f + \fr 6:4 \ft Or, \fqa idled with their fellows \f* dallied with prostitutes, and had intercourse with women within the sacred precincts, and moreover brought inside things that were not appropriate. +\v 5 The altar was filled with those abominable things which had been prohibited by the laws. +\v 6 A man could neither keep the Sabbath, nor observe the feasts of their ancestors, nor so much as confess himself to be a Jew. +\p +\v 7 On the day of the king’s birth every month, they were led along with bitter constraint to eat of the sacrifices. When the feast of Dionysia came, they were compelled to go in procession in honor of Dionysus, wearing wreaths of ivy. +\v 8 A decree went out to the neighboring Greek cities, by the suggestion of Ptolemy, that they should observe the same conduct against the Jews, and should make them eat of the sacrifices, +\v 9 and that they should kill those who didn’t choose to go over to the Greek rites. So the present misery was for all to see. +\v 10 For example, two women were brought in for having circumcised their children. These, when they had led them publicly around the city with the babes hung from their breasts, they threw down headlong from the wall. +\v 11 Others who had run together into the caves nearby to keep the seventh day secretly, were betrayed to Philip and were all burned together, because their piety kept them from defending themselves, in view of the honor of that most solemn day. +\p +\v 12 I urge those who read this book to not be discouraged because of the calamities, but recognize that these punishments were not for the destruction, but for the chastening of our race. +\v 13 For indeed it is a sign of great kindness that those who act impiously are not let alone for a long time, but immediately meet with retribution. +\v 14 For in the case of the other nations, the Sovereign Lord waits patiently to punish them until they have attained to the full measure of their sins; but not with us, +\v 15 that he may not take vengeance on us afterward,\f + \fr 6:15 \ft Or, \fqa when our sins have come to their height \f* when we have come to the\f + \fr 6:15 \ft Gr. \fqa end. \f* height of our sins. +\v 16 Therefore he never withdraws his mercy from us; but though he chastens with calamity, he doesn’t forsake his own people. +\v 17 However let this that we have spoken suffice to remind you; but after a few words, we must come to the narrative. +\p +\v 18 Eleazar, one of the principal scribes, a man already well advanced in years, and of a noble countenance, was compelled to open his mouth to eat swine’s flesh. +\v 19 But he, welcoming death with honor rather than life with defilement, advanced of his own accord to the instrument of torture, but first spat out the flesh, +\v 20 as men ought to come who are resolute to repel such things as not even for the natural love of life is it lawful to taste. +\p +\v 21 But those who had the charge of that forbidden sacrificial feast took the man aside, for the acquaintance which of old times they had with him, and privately implored him to bring flesh of his own providing, such as was proper for him to use, and to make as if he did eat of the flesh from the sacrifice, as had been commanded by the king; +\v 22 that by so doing he might be delivered from death, and so his ancient friendship with them might be treated kindly. +\v 23 But he, having formed a high resolve, and one that became his years, the dignity of old age, and the gray hairs\f + \fr 6:23 \ft The Greek text appears to be corrupt. \f* which he had reached with honor, and his excellent\f + \fr 6:23 \ft Some authorities read \fqa manner of life. \f* education from a child, or rather the holy laws\f + \fr 6:23 \ft Gr. \fqa legislation. \f* of God’s ordaining, declared his mind accordingly, bidding them to quickly send him to Hades. +\p +\v 24 “For it doesn’t become our years to dissemble,” he said, “that many of the young should suppose that Eleazar, the man of ninety years, had gone over to an alien religion; +\v 25 and so they, by reason of my deception, and for the sake of this brief and momentary life, would be led astray because of me, and I defile and disgrace myself in my old age. +\v 26 For even if for the present time I would remove from me the punishment of men, yet whether I live or die, I wouldn’t escape the hands of the Almighty. +\v 27 Therefore, by bravely parting with my life now, I will show myself worthy of my old age, +\v 28 and \f + \fr 6:28 \ft Gr. \fqa one that has left behind. \f*leave behind a noble example to the young to die willingly and nobly a glorious death for the revered and holy laws.” +\p When he had said these words, he went immediately to the instrument of torture. +\v 29 \f + \fr 6:29 \ft The Greek text of this verse is uncertain. \f* When they changed the good will they bore toward him a little before into ill will because these words of his were, as they thought, sheer madness, +\v 30 and when he was at the point to die with the\f + \fr 6:30 \ft Or, \fqa blows \f* blows, he groaned aloud and said, “To the Lord, who has the holy knowledge, it is manifest that, while I might have been delivered from death, I endure severe pains in my body by being scourged; but in soul I gladly suffer these things because of my fear of him.” +\p +\v 31 So this man also died like this, leaving his death for an example of nobleness and a memorial of virtue, not only to the young but also to the great body of his nation. +\c 7 +\p +\v 1 It came to pass that seven brothers and their mother were at the king’s command taken and shamefully handled with scourges and cords, to compel them to taste of the abominable swine’s flesh. +\v 2 One of them made himself the spokesman and said, “What would you ask and learn from us? For we are ready to die rather than transgress the laws of our ancestors.” +\p +\v 3 The king fell into a rage, and commanded that pans and caldrons be heated. +\v 4 When these were immediately heated, he gave orders to cut out the tongue of him who had been their spokesman, and to scalp him, and to cut off his extremities, with the rest of his brothers and his mother looking on. +\v 5 And when he was utterly\f + \fr 7:5 \ft Gr. \fqa useless. \f* maimed, the king gave orders to bring him to the fire, being yet alive, and to fry him in the pan. And as the smoke from the pan spread far, they and their mother also exhorted one another to die nobly, saying this: +\v 6 “The Lord God sees, and in truth is\f + \fr 7:6 \ft Or, \fqa comforted in \f* entreated for us, as Moses declared in \f + \fr 7:6 \ft See Deuteronomy 31:21 and 32:36. \f*his song, which witnesses against the people to their faces, saying, ‘And he will have compassion on his servants.’” +\p +\v 7 And when the first had died like this, they brought the second to the mocking; and they pulled off the skin of his head with the hair and asked him, “Will you eat, before your body is punished in every limb?” +\p +\v 8 But he answered in the language of his ancestors and said to them, “No.” Therefore he also underwent the next torture in succession, as the first had done. +\v 9 When he was at the last gasp, he said, “You, miscreant, release us out of this present life, but the King of the world will raise us who have died for his laws up to an everlasting renewal of life.” +\p +\v 10 After him, the third was made a victim of their mocking. When he was required, he quickly put out his tongue, and stretched out his hands courageously, +\v 11 and nobly said, “I got these from heaven. For his laws’ sake I treat these with contempt. From him, I hope to receive these back again.” +\v 12 As a result, the king himself and those who were with him were astonished at the young man’s soul, for he regarded the pains as nothing. +\p +\v 13 When he too was dead, they shamefully handled and tortured the fourth in the same way. +\v 14 Being near to death he said this: “It is good to die at the hands of men and look for the hope which is given by God, that we will be raised up again by him. For as for you, you will have no resurrection to life.” +\p +\v 15 Next after him, they brought the fifth and shamefully handled him. +\v 16 But he looked toward \f + \fr 7:16 \ft Gr. \fqa him. \f*the king and said, “Because you have authority among men, though you are corruptible, you do what you please. But don’t think that our race has been forsaken by God. +\v 17 But hold on to your ways, and see how his sovereign majesty will torture you and your descendants!” +\p +\v 18 After him they brought the sixth. When he was about to die, he said, “Don’t be vainly deceived, for we suffer these things for our own doings, as sinning against our own God. Astounding things have come to pass; +\v 19 but don’t think you that you will be unpunished, having tried to fight against God!” +\p +\v 20 But above all, the mother was marvelous and worthy of honorable memory; for when she watched seven sons perishing within the space of one day, she bore the sight with a good courage because of her hope in the Lord. +\v 21 She exhorted each one of them in the language of their fathers, filled with a noble spirit and stirring up her woman’s thoughts with manly courage, saying to them, +\v 22 “I don’t know how you came into my womb. It wasn’t I who gave you your \f + \fr 7:22 \ft Or, \fqa breath \f*spirit and your life. It wasn’t I who brought into order the first elements of each one of you. +\v 23 Therefore the Creator of the world, who shaped the first origin of man and devised the first origin of all things, in mercy gives back to you again both your \f + \fr 7:23 \ft Or, \fqa breath \f*spirit and your life, as you now treat yourselves with contempt for his laws’ sake.” +\p +\v 24 But Antiochus, thinking himself to be despised, and suspecting the reproachful voice, while the youngest was yet alive didn’t only make his appeal to him by words, but also at the same time promised with oaths that he would enrich him and\f + \fr 7:24 \ft Gr. \fqa make him one that is counted happy. \f* raise him to high honor if he would turn from the ways of his ancestors, and that he would take him for his \f + \fr 7:24 \ft See 2 Maccabees 8:9. \f*friend and entrust him with public affairs. +\v 25 But when the young man would in no way listen, the king called to him his mother, and urged her to advise the youth to save himself. +\v 26 When he had urged her with many words, she undertook to persuade her son. +\v 27 But bending toward him, laughing the cruel tyrant to scorn, she spoke this in the language of her fathers: “My son, have pity upon me who carried you nine months in my womb, and nursed you three years, and nourished and brought you up to this age, and sustained you. +\v 28 I beg you, my child, to lift your eyes to the sky and the earth, and to see all things that are in it, and thus to recognize that God made them not of things that were, and that the race of men in this way comes into being. +\v 29 Don’t be afraid of this butcher, but, proving yourself worthy of your brothers, accept your death, that in God’s mercy I may receive you again with your brothers.” +\p +\v 30 But before she had finished speaking, the young man said, “What are you all waiting for? I don’t obey the commandment of the king, but I listen to the commandment of the law that was given to our fathers through Moses. +\v 31 But you, who have devised all kinds of evil against the Hebrews, will in no way escape God’s hands. +\v 32 For we are suffering because of our own sins. +\v 33 If for rebuke and chastening, our living Lord has been angered a little while, yet he will again be reconciled with his own servants. +\v 34 But you, O unholy man and of all most vile, don’t be vainly lifted up in your wild pride with uncertain hopes, raising your hand against the heavenly children. +\v 35 For you have not yet escaped the judgment of the Almighty God who sees all things. +\v 36 For these our brothers, having endured a \f + \fr 7:36 \ft Gr. \fqa short pain of ever-flowing life. \f* short pain that brings everlasting life, have now \f + \fr 7:36 \ft Gr. \fqa fallen. \ft By the omission of one Greek letter the words would signify \fqa having endured a short pain, have now drunk of ever-flowing life under God’s covenant.\f* died under God’s covenant. But you, through God’s judgment, will receive in just measure the penalties of your arrogance. +\v 37 But I, as my brothers, give up both body and soul for the laws of our fathers, calling upon God that he may speedily become \f + \fr 7:37 \ft Gr. \fqa propitious. \f*gracious to the nation, and that you, amidst trials and plagues, may confess that he alone is God, +\v 38 and that in me and my brothers \f + \fr 7:38 \ft Some authorities read \fqa may be stayed. \f* you may bring to an end the wrath of the Almighty which has been justly brought upon our whole race.” +\p +\v 39 But the king, falling into a rage, handled him worse than all the rest, being exasperated at his mocking. +\v 40 So he also died pure, putting his whole trust in the Lord. +\p +\v 41 Last of all, after her sons, the mother died. +\p +\v 42 Let it then suffice to have said thus much concerning the sacrificial feasts and the extreme tortures. +\c 8 +\p +\v 1 But Judas, who is also called Maccabaeus, and those who were with him, making their way secretly into the villages, called to them their kindred. Taking to them those who had continued in the Jews’ religion, gathered together about six thousand. +\v 2 They called upon the Lord to look at the people who were oppressed by all, and to have compassion on the sanctuary that had been profaned by the ungodly men, +\v 3 and to have pity on the city that was suffering ruin and ready to be leveled to the ground, and to listen to the blood that cried out to him, +\v 4 and to remember the lawless destruction of the innocent infants, and concerning the blasphemies that had been committed against his name, and to show his hatred of wickedness. +\p +\v 5 When Maccabaeus had trained his men for service, the heathen at once found him irresistible, for the wrath of the Lord was turned into mercy. +\v 6 \f + \fr 8:6 \ft The Greek text of verses 6 and 7 is uncertain. \f*Coming without warning, he set fire to cities and villages. And in winning back the most important positions, putting to flight no small number of the enemies, +\v 7 he especially took advantage of the nights for such assaults. His courage was loudly talked of everywhere. +\p +\v 8 But when Philip saw the man gaining ground little by little, and increasing more and more in his success, he wrote to Ptolemy, the governor of Coelesyria and Phoenicia, that he should support the king’s cause. +\v 9 Ptolemy quickly appointed Nicanor the son of Patroclus, one of the king’s \f + \fr 8:9 \ft See 1 Maccabees 10:65. Compare 2 Maccabees 1:14; 7:24; 10:13; 14:11; 1 Maccabees 2:18. \f* chief friends, and sent him, in command of no fewer than twenty thousand of all nations, to destroy the whole race of Judea. With him he joined Gorgias also, a captain and one who had experience in matters of war. +\v 10 Nicanor resolved by the sale of the captive Jews to make up for the king the tribute of two thousand talents which he was to pay to the Romans. +\v 11 Immediately he sent to the cities upon the sea coast, inviting them to buy Jewish \f + \fr 8:11 \ft Gr. \fqa bodies. \f*slaves, promising to deliver seventy \f + \fr 8:11 \ft Gr. \fqa bodies. \f*slaves for a talent, not expecting the judgment that was to overtake him from the Almighty. +\p +\v 12 News came to Judas concerning Nicanor’s invasion. When he communicated to those who were with him the presence of the army, +\v 13 those who were cowardly and distrustful of God’s judgment \f + \fr 8:13 \ft The Greek text here is uncertain. \f*ran away and left the country. +\v 14 Others sold all that they had left, and at the same time implored the Lord to deliver those who had been sold as slaves by the impious Nicanor before he ever met them, +\v 15 if not for their own sakes, then for the covenants made with their ancestors, and because he had called them by his holy and glorious name. +\v 16 So Maccabaeus gathered his men together, six thousand in number, and exhorted them not to be frightened by the enemy, nor to fear the great multitude of the heathen who came wrongfully against them, but to fight nobly, +\v 17 setting before their eyes the outrage that had been lawlessly perpetrated upon the holy place, and the torture of the city that had been turned to mockery, and further the overthrow of the way of life received from their ancestors. +\v 18 “For they,” he said, “trust their weapons and daring deeds, but we trust in the almighty God, since he is able at a nod to cast down those who are coming against us, and even the whole world.” +\v 19 Moreover, he recounted to them the help given from time to time in the days of their ancestors, both in the days of Sennacherib, when one hundred eighty-five thousand perished, +\v 20 and in the land of Babylon, in the battle that was fought against the\f + \fr 8:20 \ft Gr. \fqa Galatians. \f* Gauls, how they came to the battle with eight thousand in all, with four thousand Macedonians, and how, the Macedonians being hard pressed, the \f + \fr 8:20 \ft Some authorities read \fqa eight. \f*six thousand destroyed the hundred and twenty thousand because of the help which they had from heaven, and took a great deal of plunder. +\p +\v 21 And when he had with these words filled them with courage and made them ready to die for the laws and their country, he divided his army into four parts. +\v 22 He appointed his brothers, Simon, Joseph, and Jonathan, to be leaders of the divisions with him, giving each the command of one thousand five hundred men. +\v 23 Moreover Eleazer also, having read aloud the sacred book, and having given as watchword, “THE HELP OF GOD”, leading the first band himself, joined battle with Nicanor. +\p +\v 24 Since the Almighty fought on their side, they killed more than nine thousand of the enemy, and wounded and\f + \fr 8:24 \ft Gr. \fqa disabled in their limbs. \f* disabled most of Nicanor’s army, and compelled them all to flee. +\v 25 They took the money of those who had come there to buy them as slaves. After they had pursued them for some \f + \fr 8:25 \ft Or, \fqa while \f*distance, they returned, being constrained by the time of the day; +\v 26 for it was the day before the Sabbath, and for this reason they made no effort to chase them far. +\v 27 \f + \fr 8:27 \ft The exact meaning of this clause is uncertain.\f* When they had gathered \f + \fr 8:27 \ft Gr. \fqa their weapons...the spoils of the enemy.\f*the weapons of the enemy together, and had stripped off their spoils, they kept the Sabbath, greatly blessing and thanking the Lord who had saved them to this day, because he had begun to show mercy to them. +\v 28 After the Sabbath, when they had given some of the spoils to the \f + \fr 8:28 \ft Or, \fqa wounded \ft Gr. \fqa shamefully handled.\f* maimed, and to the widows and orphans, they distributed the rest among themselves and their children. +\v 29 When they had accomplished these things and had made a common supplication, they implored the merciful Lord to be wholly reconciled with his servants. +\p +\v 30 Having had an encounter with the forces of Timotheus and Bacchides, they killed more than twenty thousand of them, and made themselves masters of exceedingly high strongholds, and divided very much plunder, giving the \f + \fr 8:30 \ft Or, \fqa wounded \ft Gr. \fqa shamefully handled.\f*maimed, orphans, widows, and the aged an equal share with themselves. +\v 31 \f + \fr 8:31 \ft The exact meaning of this clause is uncertain.\f* When they had gathered the weapons \f + \fr 8:31 \ft Gr. \fqa of them.\f* of the enemy together, they stored them all up carefully in the most strategic positions, and they carried the rest of the spoils to Jerusalem. +\v 32 They killed the \f + \fr 8:32 \ft That is, probably, the captain of an irregular auxiliary force. Some write \fqa Phylarches, \ft as a proper name. \f*phylarch of Timotheus’s forces, a most unholy man, and one who had done the Jews much harm. +\v 33 \f + \fr 8:33 \ft The Greek text here is perhaps corrupt.\f* As they celebrated the feast of victory in the \f + \fr 8:33 \ft Or, \fqa country \f* city of their fathers, they burned those who had set the sacred \f + \fr 8:33 \ft Or, \fqa porches \f*gates on fire, including Callisthenes, who had fled into \f + \fr 8:33 \ft Or, \fqa a solitary hut \f*a little house. So they received the proper reward for their impiety. +\p +\v 34 The thrice-accursed Nicanor, who had brought the thousand merchants to buy the Jews as slaves, +\v 35 being through the help of the Lord humbled by them who in his eyes were held to be of least account, took off his glorious apparel, and passing through the country, \f + \fr 8:35 \ft Gr. \fqa having made himself solitary. \f*shunning all company like a fugitive slave, arrived at Antioch, \f + \fr 8:35 \ft Or, \fqa having won the greatest possible favor by reason of the destruction of his army\f* having, as he thought, had the greatest possible good fortune, though his army was destroyed. +\v 36 He who had taken upon himself to make tribute sure for the Romans by the captivity of the men of Jerusalem published abroad that the Jews had One who fought for them, and that \f + \fr 8:36 \ft Or, \fqa because of this \ft their \fqa way of life \ft Gr. \fqa because of this manner.\f*because this was so, the Jews were invulnerable, because they followed the laws ordained by him. +\c 9 +\p +\v 1 Now about that time, Antiochus retreated \f + \fr 9:1 \ft Or, \fqa with dishonor \f*in disorder from the region of Persia. +\v 2 For he had entered into the city called Persepolis, and he attempted to rob \f + \fr 9:2 \ft Or, \fqa temples \f*a temple and to control the city. Therefore the multitudes rushed in and the people of the country turned to defend themselves with weapons; and it came to pass that Antiochus was put to flight by the people of the country and broke his camp with disgrace. +\v 3 While he was at Ecbatana, news was brought to him about what had happened to Nicanor and the forces of Timotheus. +\v 4 Being overcome by his anger, he planned to make the Jews suffer for the evil deeds of those who had put him to flight. Therefore, with judgment from heaven even now accompanying him, he ordered his charioteer to drive without ceasing until he completed the journey; for he arrogantly said this: “I will make Jerusalem a common graveyard of Jews when I come there.” +\p +\v 5 But the All-seeing Lord, the God of Israel, struck him with a \f + \fr 9:5 \ft Gr. \fqa remediless. \f*fatal and invisible stroke. As soon as he had finished speaking this word, an incurable pain of the bowels seized him, with bitter torments of the inner parts— +\v 6 and that most justly, for he had tormented other men’s bowels with many and strange sufferings. +\v 7 But he in no way ceased from his rude insolence. No, he was filled with even more arrogance, breathing fire in his passion against the Jews, and giving orders to hasten the journey. But it came to pass moreover that he fell from his chariot as it rushed along, and having a grievous fall was tortured in all of the members of his body. +\v 8 He who had just supposed himself to have the waves of the sea at his bidding because he was so superhumanly arrogant, and who thought to weigh the heights of the mountains in a balance, was now brought to the ground and carried in a litter, \f + \fr 9:8 \ft Or, \fqa showing manifestly to all the power of God \f*showing to all that the power was obviously God’s, +\v 9 so that worms swarmed out of the impious man’s body, and while he was still living in anguish and pains, his flesh fell off, and by reason of the stench all the army turned with loathing from his decay. +\v 10 The man who a little before supposed himself to touch the stars of heaven, no one could endure to carry because of his intolerable stench. +\v 11 Therefore he began in great part to cease from his arrogance, being broken in spirit, and to come to knowledge under the scourge of God, his pains increasing every moment. +\v 12 When he himself could not stand his own smell, he said these words: “It is right to be subject to God, and that one who is mortal should not think they are equal to God.” +\p +\v 13 The vile man vowed to the sovereign Lord, who now no more would have pity upon him, saying +\v 14 that the holy city, to which he was going in haste to lay it even with the ground and to \f + \fr 9:14 \ft Gr. \fqa build. \f*make it a common graveyard, he would declare free. +\v 15 Concerning the Jews, whom he had decided not even to count worthy of burial, but to cast them out to the animals with their infants for the birds to devour, he would make them all equal to citizens of Athens. +\v 16 The holy sanctuary, which before he had plundered, he would adorn with best offerings, and would restore all the sacred vessels many times multiplied, and out of his own revenues would defray the charges that were required for the sacrifices. +\v 17 Beside all this, he said that he would become a Jew and would visit every inhabited place, proclaiming the power of God. +\v 18 But when his sufferings did in no way cease, for the judgment of God had come upon him in righteousness, having given up all hope for himself, he wrote to the Jews the letter written below, having the nature of a supplication, to this effect: +\p +\v 19 “To the worthy Jewish citizens, Antiochus, king and general, wishes much joy and health and prosperity. +\v 20 May you and your children fare well, and may your affairs be as you wish. Having my hope in heaven, +\v 21 I remembered with affection your honor and good will. Returning out of the region of Persia, and being taken with an annoying sickness, I deemed it necessary to take thought for the common safety of all, +\v 22 not despairing of myself, but having great hope to escape from the sickness. +\v 23 But considering that my father also, at the time he led an army into the upper country, appointed his successor, +\v 24 to the end that, if anything fell out contrary to expectation, or if any unwelcome tidings were brought, the people in the country, knowing to whom the state had been left, might not be troubled, +\v 25 and, moreover, observing how the princes who are along the borders and neighbors to my kingdom watch for opportunities and look for the future event, I have appointed my son Antiochus to be king, whom I often entrusted and commended to most of you when I was hurrying to the upper provinces. I have written to him what is written below. +\v 26 I therefore urge you and beg you, having in your remembrance the benefits done to you in common and severally, to preserve your present good will, each of you, toward me and my son. +\v 27 For I am persuaded that he in gentleness and kindness will follow my purpose and treat you with moderation and kindness. +\p +\v 28 So the murderer and blasphemer, having endured the most intense sufferings, even as he had dealt with other men, ended his life among the mountains by a most piteous fate in a strange land. +\v 29 Philip his foster brother took the body home and then, fearing the son of Antiochus, he withdrew himself to Ptolemy Philometor in Egypt. +\c 10 +\p +\v 1 Then Maccabaeus and those who were with him, the Lord leading them on, recovered the temple and the city. +\v 2 They pulled down the altars that had been built in the marketplace by the foreigners, and also the sacred enclosures. +\v 3 Having cleansed the sanctuary, they made another altar of sacrifice. \f + \fr 10:3 \ft Gr. \fqa firing. \f*Striking flint and starting a fire, they offered sacrifices after they had ceased for two years, burned incense, lit lamps, and set out the show bread. +\v 4 When they had done these things, they fell prostrate and implored the Lord that they might fall no more into such evils; but that, if they ever did sin, they might be chastened by him with forbearance, and not be delivered to blaspheming and barbarous heathen. +\v 5 Now on the same day that the sanctuary was profaned by foreigners, upon that very day it came to pass that the sanctuary was cleansed, even on the twenty-fifth day of the same month, which is Chislev. +\v 6 They observed eight days with gladness in the manner of the feast of tabernacles, remembering how \f + \fr 10:6 \ft Or, \fqa not long before they kept the feast of tabernacles by wandering \f*not long before, during the feast of tabernacles, they were wandering in the mountains and in the caves like wild animals. +\v 7 Therefore carrying wands wreathed with leaves, and beautiful branches, and palm fronds also, they offered up hymns of thanksgiving to him who had successfully brought to pass the cleansing of his own place. +\v 8 They ordained also with a public statute and decree, for all the nation of the Jews, that they should observe these days every year. +\p +\v 9 Such were the events of the end of Antiochus, who was called Epiphanes. +\p +\v 10 Now we will declare what came to pass under Antiochus \f + \fr 10:10 \ft That is, \fqa son of a good father. \f*Eupator, who proved himself a son of that ungodly man, and will summarize the main evils of the wars. +\v 11 For this man, when he succeeded to the kingdom, appointed one Lysias to be chancellor and supreme governor of Coelesyria and Phoenicia. +\v 12 For Ptolemy who was called Macron, setting an example of observing justice toward the Jews because of the wrong that had been done to them, endeavored to deal with them on peaceful terms. +\v 13 Whereupon being accused by the king’s \f + \fr 10:13 \ft See 2 Maccabees 8:9 \f*friends before Eupator, and hearing himself called traitor at every turn because he had abandoned Cyprus which Philometor had entrusted to him, and had withdrawn himself to Antiochus Epiphanes, and \f + \fr 10:13 \ft The Greek text here is corrupt.\f* failing to uphold the honor of his office, he took poison and did away with himself. +\p +\v 14 But when Gorgias was made governor of the district, he maintained a force of mercenaries, and at every turn kept up war with the Jews. +\v 15 Together with him the Idumaeans also, being masters of important strongholds, harassed the Jews; and received those who had taken refuge from Jerusalem, they endeavored to keep up the war. +\v 16 But Maccabaeus and his men, having made solemn supplication and having implored God to fight on their side, rushed upon the strongholds of the Idumaeans. +\v 17 Assaulting them vigorously, they took control of the positions, and kept off all who fought upon the wall, and killed those whom they encountered, killing no fewer than twenty thousand. +\p +\v 18 Because no fewer than nine thousand had fled into two very strong towers having everything needed for a seige, +\v 19 Maccabaeus, having left Simon and Joseph, and also Zacchaeus and those who were with him, a force sufficient to besiege them, departed himself to places where he was most needed. +\v 20 But Simon and those who were with him, yielding to covetousness, were bribed by some of those who were in the towers, and receiving seventy thousand drachmas, let some of them slip away. +\v 21 But when word was brought to Maccabaeus of what was done, he gathered the leaders of the people together, and accused those men of having sold their kindred for money by setting their enemies free to fight against them. +\v 22 So he killed these men for having turned traitors, and immediately took possession of the two towers. +\v 23 Prospering with his weapons in everything he undertook, he destroyed more than twenty thousand in the two strongholds. +\p +\v 24 Now Timotheus, who had been defeated by the Jews before, having gathered together foreign forces in great multitudes, and having collected the cavalry which belonged to Asia, not a few, came as though he would take Judea by force of weapons. +\v 25 But as he drew near, Maccabaeus and his men sprinkled dirt on their heads and girded their loins with sackcloth, in supplication to God, +\v 26 and falling down upon the step in front of the altar, implored him to become \f + \fr 10:26 \ft Gr. \fqa propitious. \f*gracious to them, and \f + \fr 10:26 \ft See Exodus 23:22. \f*be an enemy to their enemies and an adversary to their adversaries, as the law declares. +\v 27 Rising from their prayer they took up their weapons, and advanced some distance from the city. When they had come near to their enemies, they\f + \fr 10:27 \ft Gr. \fqa were by themselves.\f* halted. +\v 28 When the dawn was now breaking, the two armies joined in battle, the one part having this, beside virtue, for a pledge of success and victory, that they had fled to the Lord for refuge, the others making their passion their leader in the fight. +\p +\v 29 When the battle became strong, there appeared out of heaven to their adversaries five splendid men on horses with bridles of gold, \f + \fr 10:29 \ft Some authorities read \fqa and leading on the Jews; who also, taking. \f*and two of them, leading on the Jews, +\v 30 and taking Maccabaeus in the midst of them, and covering him with their own armor, guarded him from wounds, while they shot arrows and thunderbolts at the enemies. For this reason, they were blinded and thrown into confusion, and were cut to pieces, filled with bewilderment. +\v 31 Twenty thousand five hundred were slain, beside six hundred cavalry. +\p +\v 32 Timotheus himself fled into a stronghold called Gazara, a fortress of great strength, \f + \fr 10:32 \ft See ver. 37. \f*where Chaereas was in command. +\v 33 Then Maccabaeus and his men were glad and laid siege to the fortress for four days. +\v 34 Those who were within, trusting in the strength of the place, blasphemed exceedingly, and hurled out impious words. +\v 35 But at dawn of the fifth day, certain young men of Maccabaeus’ company, inflamed with anger because of the blasphemies, assaulted the wall with masculine force and with \f + \fr 10:35 \ft Gr. \fqa passion as of wild animals. \f*furious anger, and cut down whoever came in their way. +\v 36 Others climbing up in the same way, while the enemies were distracted with those who had made their way within, set fire to the towers, and kindled fires that burned the blasphemers alive, while others broke open the gates, and, having given entrance to the rest of the band, occupied the city. +\v 37 They killed Timotheus, who was hidden in a cistern, and his brother Chaereas, and Apollophanes. +\v 38 When they had accomplished these things, they blessed the Lord with hymns and thanksgiving, blessing him who provides great benefits to Israel and gives them the victory. +\c 11 +\p +\v 1 Now after a very little time, Lysias, the king’s guardian, kinsman, and chancellor, being very displeased about the things that had happened, +\v 2 collected about eighty thousand infantry and all his cavalry and came against the Jews, planing to make the city a home for Greeks, +\v 3 and to levy tribute on the temple, as \f + \fr 11:3 \ft Or, \fqa on all the sacred places of the heathen \f*on the other sacred places of the nations, and to put up the high priesthood for sale every year. +\v 4 He took no account of God’s power, but was puffed up with his ten thousands of infantry, his thousands of cavalry, and his eighty elephants. +\v 5 Coming into Judea and approaching Bethsuron, which was a strong place and about five stadia\f + \fr 11:5 \ft One stadia was roughly 189 meters or 618 feet, so 5 stadia was about a little less than 1 km or a little more than half a mile.\f* away from Jerusalem, he pressed it hard. +\p +\v 6 When Maccabaeus and his men learned that he was besieging the strongholds, they and all the people with lamentations and tears made supplication to the Lord to send a good angel to save Israel. +\v 7 Maccabaeus himself took up weapons first, and exhorted the others to put themselves in jeopardy together with him and help their kindred; and they went out with him very willingly. +\v 8 As they were there, close to Jerusalem, a horseman appeared at their head in white apparel, brandishing\f + \fr 11:8 \ft Gr. \fqa a panoply. \f* weapons of gold. +\v 9 They all together praised the merciful God, and were yet more strengthened in heart, being ready to \f + \fr 11:9 \ft Gr. \fqa wound. \f*assail not only men but the wildest animals and walls of iron, +\v 10 they advanced in array, having him who is in heaven to fight on their side, for the Lord had mercy on them. +\v 11 Hurling themselves like lions against the enemy, they killed eleven thousand infantry and one thousand six hundred cavalry, and forced all the rest to flee. +\v 12 Most of them escaped wounded and naked. Lysias himself also escaped by shameful flight. +\v 13 But as he was a man not void of understanding, pondering the defeat which had befallen him, and considering that the Hebrews could not be overcome because the Almighty God fought on their side, he sent again +\v 14 and persuaded them to come to terms on condition that all their rights were acknowledged, and \f + \fr 11:14 \ft The Greek text here is corrupt. \f* promised that he would also persuade the king to become their friend. +\v 15 Maccabaeus gave consent upon all the conditions which Lysias proposed to him, being careful of the common good; for whatever requests Maccabaeus delivered in writing to Lysias concerning the Jews the king allowed. +\p +\v 16 The letter written to the Jews from Lysias was to this effect: +\p “Lysias to the \f + \fr 11:16 \ft Gr. \fqa multitude. \f*people of the Jews, greetings. +\v 17 John and Absalom, who were sent from you, having delivered the document written below, made request concerning the things written therein. +\v 18 Whatever things therefore needed to be brought before the king I declared to him, and what things were possible he allowed. +\v 19 If then you will all preserve your good will toward the government, I will also endeavor in the future to contribute to your good. +\v 20 Concerning this, I have given order in detail, both to these men and to those who are sent from me, to confer with you. +\v 21 Farewell. Written in the one hundred forty-eighth year, on the twenty-fourth day of the month \f + \fr 11:21 \ft This month name is not found elsewhere, and is perhaps corrupt.\f*Dioscorinthius.” +\p +\v 22 And the king’s letter contained these words: +\p “King Antiochus to his brother Lysias, greetings. +\v 23 Seeing that our father passed to the gods having the wish that the subjects of his kingdom \f + \fr 11:23 \ft Or, \fqa should not be disquieted but \f*should be undisturbed and give themselves to the care of their own affairs, +\v 24 we, having heard that the Jews do not consent to our father’s purpose to turn them to the customs of the Greeks, but choose rather their own way of living, and make request that the customs of their law be allowed to them— +\v 25 choosing therefore that this nation also should be free from disturbance, we determine that their temple is to be restored to them, and that they live according to the customs that were in the days of their ancestors. +\v 26 You will therefore do well to send messengers to them and give them the right hand of friendship, that they, knowing our mind, may be of good heart, and gladly occupy themselves with the conduct of their own affairs.” +\p +\v 27 And to the nation, the king’s letter was as follows: +\p “King Antiochus to the senate of the Jews and to the other Jews, greetings. +\v 28 If you are all well, it is as we desire. We ourselves also are in good health. +\v 29 Menelaus informed us that your desire was to return home and follow your own business. +\v 30 They therefore who depart home up to the thirtieth day of Xanthicus shall have our \f + \fr 11:30 \ft Gr. \fqa right hand. \f*friendship, with full permission +\v 31 that the Jews use their own foods and observe their own laws, even as formerly. None of them shall be in any way molested for the things that have been done in ignorance. +\v 32 Moreover I have sent Menelaus also, that he may encourage you. +\v 33 Farewell. Written in the one hundred forty-eighth year, on the fifteenth day of Xanthicus.” +\p +\v 34 The Romans also sent to them a letter in these words: +\p “Quintus Memmius and Titus Manius, ambassadors of the Romans, to the people of the Jews, greetings. +\v 35 In regard to the things which Lysias the king’s kinsman granted you, we also give consent. +\v 36 But as for the things which he judged should be referred to the king, send someone promptly, after you have considered them, that we may publish such decrees as are appropriate for your case; for we are on our way to Antioch. +\v 37 Therefore send someone with speed, that we also may learn what is your mind. +\v 38 \f + \fr 11:38 \ft Gr. \fqa Be in good health. \f*Farewell. Written in the one hundred forty-eighth year, on the fifteenth day of Xanthicus. +\c 12 +\p +\v 1 So when this agreement had been made, Lysias departed to the king, and the Jews went about their farming. +\p +\v 2 But some of the governors of districts, Timotheus and Apollonius the son of Gennaeus, and also Hieronymus and Demophon, and beside them Nicanor the governor of Cyprus, would not allow them to enjoy tranquillity and live in peace. +\v 3 Men of Joppa perpetrated this great impiety: they invited the Jews who lived among them to go with their wives and children into the boats which they had provided, as though they had no ill will toward them. +\v 4 When\f + \fr 12:4 \ft Gr. \fqa they also. \f* the Jews,\f + \fr 12:4 \ft Gr. \fqa after. \f* relying on the public vote of the city, accepted the invitation, as men desiring to live in peace and suspecting nothing, they took them out to sea and drowned not less than two hundred of them. +\v 5 When Judas heard of the cruelty done to his fellow-countrymen, giving command to the men that were with him +\v 6 and calling upon God the righteous Judge, he came against the murderers of his kindred, and set the harbor on fire at night, burned the boats, and put to the sword those who had fled there. +\v 7 But when the town gates were closed, he withdrew, intending to come again to root out the whole community of the men of Joppa. +\v 8 But learning that the men of Jamnia intended to do the same thing to the Jews who lived among them, +\v 9 he attacked the Jamnites at night, and set fire to the harbor together with the fleet, so that the glare of the light was seen at Jerusalem, two hundred forty furlongs\f + \fr 12:9 \ft a furlong is about 201 meters or 220 yards, so 240 furlongs is about 48 km. or 30 miles \f* distant. +\p +\v 10 Now when they had drawn off nine furlongs\f + \fr 12:10 \ft a furlong is about 201 meters or 220 yards, so 9 furlongs is about 1.8 km. or 1 1/8 miles \f* from there, as they marched against Timotheus, an army of Arabians attacked him, no fewer than five thousand infantry and five hundred cavalry. +\v 11 And when a hard battle had been fought, and Judas and his company, by the help of God, had good success, the nomads being overcome implored Judas to grant them friendship, promising to give him livestock, and to help \f + \fr 12:11 \ft Gr. \fqa them.\f*his people in all other ways. +\v 12 So Judas, thinking that they would indeed be profitable in many things, agreed to live in peace with them; and receiving pledges of friendship they departed to their tents. +\p +\v 13 He also attacked a certain city, strong and fenced with earthworks and walls, and inhabited by a mixed multitude of various nations. It was named Caspin. +\v 14 Those who were within, trusting in the strength of the walls and their store of provisions, behaved themselves rudely toward Judas and those who were with him, railing, and furthermore blaspheming and speaking impious words. +\v 15 But Judas and his company, calling upon the great Sovereign of the world, who without rams and cunning engines of war hurled down Jericho in the times of Joshua, rushed wildly against the wall. +\v 16 Having taken the city by the will of God, they made unspeakable slaughter, so much that the adjoining lake, which was two furlongs\f + \fr 12:16 \ft a furlong is about 201 meters or 220 yards, so 2 furlongs is about 402 meters or 1/4 mile \f* broad, appeared to be filled with the deluge of blood. +\p +\v 17 When they had gone seven hundred fifty furlongs\f + \fr 12:17 \ft a furlong is about 201 meters or 220 yards, so 750 furlongs is about 151 km. or 94 miles \f* from there, they made their way to Charax, to the Jews that are called \f + \fr 12:17 \ft That is, \fqa men of Tob: \ft see Judges 11:3, 2 Samuel 10:6, and compare 1 Maccabees 5:13. \f*Tubieni. +\v 18 They didn’t find Timotheus in that district, for he had by then departed from the district without accomplishing anything, but had left behind a very strong garrison in one place. +\v 19 But Dositheus and Sosipater, who were captains under Maccabaeus, went out and destroyed those who had been left by Timotheus in the stronghold, more than ten thousand men. +\v 20 Maccabaeus, arranging his own army in divisions, set \f + \fr 12:20 \ft Gr. \fqa them. \f*these two over the bands, and marched in haste against Timotheus, who had with him one hundred twenty thousand infantry and two thousand five hundred cavalry. +\v 21 When Timotheus heard of the approach of Judas, he at once sent away the women and the children with the baggage into the fortress called \f + \fr 12:21 \ft Compare \fqa Carnain,\ft 1 Maccabees 5:26, 43, 44. \f*Carnion; for the place was hard to besiege and difficult of access by reason of the narrowness of the approaches on all sides. +\v 22 When the band of Judas, who led the first division, appeared in sight, and when terror and fear came upon the enemy, because the manifestation of him who sees all things came upon them, they fled in every direction, carried this way and that, so that they were often injured by their own men, and pierced with the points of their own swords. +\v 23 Judas continued the pursuit more vigorously, putting the wicked wretches to the sword, and he destroyed as many as thirty thousand men. +\p +\v 24 Timotheus himself, falling in with the company of Dositheus and Sosipater, implored them with much crafty guile to let him go with his life, because he had in his power the parents of many of them and the kindred of some. \f + \fr 12:24 \ft Gr. \fqa and the result will be that these be disregarded. \ft The Greek text here is perhaps corrupt. \f* “Otherwise, he said, little regard will \f + \fr 12:24 \ft Or, \fqa have been shown \f* be shown to these.” +\v 25 So when he had with many words confirmed the agreement to restore them without harm, they let him go that they might save their kindred. +\p +\v 26 Then Judas, marching against \f + \fr 12:26 \ft Compare \fqa Carnain, \ft 1 Maccabees 5:26, 43, 44. \f*Carnion and the temple of Atergatis, killed twenty-five thousand people. +\v 27 After he had put these to flight and destroyed them, he marched against Ephron also, a strong city, \f + \fr 12:27 \ft The Greek text here is perhaps corrupt. \f*wherein were multitudes of people of all nations. Stalwart young men placed \f + \fr 12:27 \ft Gr. \fqa in front of. \f*on the walls made a vigorous defense. There were great stores of war engines and darts there. +\v 28 But calling upon the Sovereign who with might shatters the \f + \fr 12:28 \ft Some authorities read \fqa weight. \f*strength of \f + \fr 12:28 \ft Or, \fqa his enemies \f*the enemy, they took the city into their hands, and killed as many as twenty-five thousand of those who were in it. +\p +\v 29 Setting out from there, they marched in haste against Scythopolis, which is six hundred furlongs\f + \fr 12:29 \ft a furlong is about 201 meters or 220 yards, so 600 furlongs is about 121 km. or 75 miles \f* away from Jerusalem. +\v 30 But when the Jews who were settled there testified of the good will that the Scythopolitans had shown toward them, and of their kind treatment of them in the times of their misfortune, +\v 31 they gave thanks, and further exhorted them to remain well disposed toward the race for the future. Then they went up to Jerusalem, the feast of weeks being close at hand. +\p +\v 32 But after the feast called Pentecost, they marched in haste against Gorgias the governor of Idumaea. +\v 33 He came out with three thousand infantry and four hundred cavalry. +\v 34 When they had set themselves in array, it came to pass that a few of the Jews fell. +\v 35 A certain Dositheus, one \f + \fr 12:35 \ft The Greek text is uncertain. \f* of Bacenor’s company, who was on horseback and was a strong man, pressed hard on Gorgias, and taking hold of his cloke dragged him along by main force. While he planned to take the accursed man alive, one of the Thracian cavalry bore down on him and disabled his shoulder, and so Gorgias escaped to \f + \fr 12:35 \ft Compare 1 Maccabees 5:65. \f*Marisa. +\p +\v 36 When those who were with Esdris had been fighting long and were weary, Judas called upon the Lord to show himself, fighting on their side and leading in the battle. +\v 37 Then in the language of his ancestors he raised the battle cry joined with hymns. Then he rushed against Gorgias’ troops when they were not expecting it, and put them to flight. +\p +\v 38 Judas gathered his army and came to the city of \f + \fr 12:38 \ft Gr. \fqa Odollam. \f*Adullam. As the seventh day was coming on, they purified themselves according to the custom, and kept the Sabbath there. +\p +\v 39 On the following day, \f + \fr 12:39 \ft The Greek text here is uncertain.\f*when it had become necessary, Judas and his company came to take up the bodies of those who had fallen, \f + \fr 12:39 \ft Or, \fqa and to bring them back to be with their kinsmen in the sepulchres\f*and in company with their kinsmen to bring them back to the sepulchres of their ancestors. +\v 40 But under the garments of each one of the dead they found \f + \fr 12:40 \ft Perhaps these were consecrated images of the idols. \f*consecrated tokens of the idols of Jamnia, which the law forbids the Jews to have anything to do with. It became clear to all that it was for this cause that they had fallen. +\v 41 All therefore, blessing the ways of the Lord, the righteous Judge, who makes manifest the things that are hidden, +\v 42 turned themselves to supplication, praying that the sin committed might be wholly blotted out. The noble Judas exhorted the multitude to keep themselves from sin, for they had seen with their own eyes what happened because of the sin of those who had fallen. +\v 43 When he had made a collection man by man to the sum of two thousand drachmas of silver, he sent to Jerusalem to offer a sacrifice for sin, doing very well and honorably in this, in that he took thought for the resurrection. +\v 44 For if he wasn’t expecting that those who had fallen would rise again, it would be superfluous and idle to pray for the dead. +\v 45 But if he was looking forward to an honorable memorial of gratitude laid up for those who \f + \fr 12:45 \ft Gr. \fqa fall asleep. \f*die \f + \fr 12:45 \ft Or, \fqa on the side of godliness \f*in godliness, then the thought was holy and godly. Therefore he made the atoning sacrifice for those who had died, that they might be released from their sin. +\c 13 +\p +\v 1 In the one hundred forty-ninth year, news was brought to Judas and his company that Antiochus Eupator was coming with multitudes against Judea, +\v 2 and with him Lysias his guardian and chancellor, each having a Greek force of one hundred ten thousand infantry, five thousand three hundred cavalry, twenty-two elephants, and three hundred chariots armed with scythes. +\p +\v 3 And Menelaus also joined himself with them, and with great hypocrisy encouraged Antiochus, not for the saving of his country, but because he thought that he would be set over the government. +\v 4 But the King of kings stirred up the anger of Antiochus against the wicked wretch. When Lysias informed him that this man was the cause of all the evils, the king commanded to bring him to Beroea, and to put him to death in the way customary in that place. +\v 5 Now there is in that place a tower that is fifty cubits high, full of ashes, and it had all around it a \f + \fr 13:5 \ft Gr. \fqa contrivance or machine. \f*circular rim sloping steeply on every side into the ashes. +\v 6 Here one who is guilty of sacrilege or notorious for other crimes is pushed down to destruction. +\v 7 By such a fate it happened that the breaker of the law, Menelaus, died, without obtaining so much as a grave in the earth, and that justly; +\v 8 for inasmuch as he had perpetrated many sins \f + \fr 13:8 \ft Gr. \fqa about. \f* against the altar, whose fire and whose ashes were holy, he received his death in ashes. +\p +\v 9 Now the king,\f + \fr 13:9 \ft Some authorities read \fqa indignant.\f* infuriated in spirit, was coming with intent to inflict on the Jews the very worst of the sufferings that had been done in his father’s time. +\v 10 But when Judas heard of these things, he commanded the multitude to call upon the Lord day and night, if ever at any other time, so now to help those who were at the point of being deprived of the law, their country, and the holy temple, +\v 11 and not to allow the people who had just begun to be revived to fall into the hands of those profane heathen. +\v 12 So when they had all done the same thing together, \f + \fr 13:12 \ft Gr. \fqa and implored. \f* begging the merciful Lord with weeping and fastings and prostration for three days without ceasing, Judas exhorted them and commanded they should join him. +\p +\v 13 Having consulted privately with the elders, he resolved that before the king’s army entered into Judea and made themselves masters of the city, they should go out and decide the matter by the help of \f + \fr 13:13 \ft Some authorities read \fqa the Lord. \f*God. +\v 14 And committing the decision to the \f + \fr 13:14 \ft Some authorities read \fqa Creator. \f*Lord of the world, and exhorting those who were with him to contend nobly even to death for laws, temple, city, country, and way of life, he pitched his camp by Modin. +\v 15 He gave out to his men the watchword, “VICTORY IS GOD’S”, with a chosen force of the bravest young men he attacked by the king’s pavilion by night, and killed of his army as many as two thousand men, and \f + \fr 13:15 \ft The Greek text here is probably corrupt. \f*brought down the leading elephant with him who was in the \f + \fr 13:15 \ft Gr. \fqa house. \f*tower on him. +\v 16 At last they filled the \f + \fr 13:16 \ft Gr. \fqa camp. \f*army with terror and alarm, and departed with good success. +\v 17 This had been accomplished when the day was just dawning, because of the Lord’s protection that gave \f + \fr 13:17 \ft Gr. \fqa him. \f*Judas help. +\p +\v 18 But the king, having had a taste of the exceeding boldness of the Jews, made strategic attacks on their positions, +\v 19 and on a strong fortress of the Jews at Bethsura. He advanced, was turned back, failed, and was defeated. +\v 20 Judas sent the things that were necessary to those who were within. +\v 21 But Rhodocus, from the Jewish ranks, made secrets known to the enemy. He was sought out, arrested, and shut up in prison. +\v 22 The king negotiated with them in Bethsura the second time, gave his hand, took theirs, departed, attacked the forces of Judas, was put to the worse, +\v 23 heard that Philip who had been left as chancellor in Antioch had become reckless, was confounded, made to the Jews an overture of peace, submitted himself and swore to acknowledge all their rights, came to terms with them and offered sacrifice, honored the sanctuary and the place, +\v 24 showed kindness and graciously received Maccabaeus, left Hegemonides governor from Ptolemais even to the \f + \fr 13:24 \ft The form of this word is uncertain. Compare \fqa Girzites \ft (or \fqa Gizrites), \ft 1 Samuel 27:8. One manuscript reads \fqa Gerarenes. \f* Gerrenians, +\v 25 and came to Ptolemais. The men of Ptolemais were displeased at the treaty, for they had exceedingly great indignation against the Jews. They desired to annul the articles of the agreement. +\v 26 Lysias \f + \fr 13:26 \ft Gr. \fqa came forward to the tribune \ft or \fqa judgment seat. \f*came forward to speak, made the best defense that was possible, persuaded, pacified, gained their good will, and departed to Antioch. This was the issue of the attack and departure of the king. +\c 14 +\p +\v 1 Three years later, news was brought to Judas and his company that Demetrius the son of Seleucus, having sailed into the harbor of Tripolis with a mighty army and a fleet, +\v 2 had taken possession of the country, having made away with Antiochus and his guardian Lysias. +\p +\v 3 But one Alcimus, who had formerly been high priest, and had willfully polluted himself in the times when there was no mingling with the Gentiles, considering that there was no deliverance for him in any way, nor any more access to the holy altar, +\v 4 came to King Demetrius in about the one hundred fifty-first year, presenting to him a crown of gold and a palm, and beside these some of the festal olive boughs of the temple. For that day, he held his peace; +\v 5 but having gotten opportunity to further his own madness, being called by Demetrius into a meeting of his council, and asked how the Jews stood affected and what they intended, he answered: +\p +\v 6 “Those of the Jews called \f + \fr 14:6 \ft That is, \fqa Chasidim. \f*Hasidaeans, whose leader is Judas Maccabaeus, keep up war and are seditious, not allowing the kingdom to find tranquillity. +\v 7 Therefore, having laid aside my ancestral glory—I mean the high priesthood—I have now come \f + \fr 14:7 \ft Some authorities read \fqa a second time. \f*here, +\v 8 first for the genuine care I have for the things that concern the king, and secondly because I have regard also to my own fellow citizens. For through the unadvised dealing of those of whom I spoke before, our whole race is in no small misfortune. +\v 9 O king, having informed yourself of these things, take thought both for our country and for our race, which is surrounded by enemies, according to the gracious kindness with which you receive all. +\v 10 For as long as Judas remains alive, it is impossible for the government to find peace. +\v 11 When he had spoken such words as these, at once \f + \fr 14:11 \ft Or, \fqa the \ft king’s \fqa friends likewise \f*the rest of the king’s \f + \fr 14:11 \ft See 2 Maccabees 8:9. \f*friends, having ill will against Judas, inflamed Demetrius yet more. +\v 12 He immediately appointed Nicanor, who had been master of the elephants, and made him governor of Judea. He sent him out, +\v 13 giving him written instructions to kill Judas himself and to scatter those who were with him, and to set up Alcimus as high priest of the \f + \fr 14:13 \ft Gr. \fqa greatest. \f*great temple. +\v 14 Those in Judea who \f + \fr 14:14 \ft See 2 Maccabees 5:27. \f*had driven Judas into exile thronged to Nicanor in flocks, supposing that the misfortunes and calamities of the Jews would be successes to themselves. +\p +\v 15 But when the Jews heard of Nicanor’s advance and the assault of the heathen, they sprinkled dirt on their heads and made solemn prayers to him who had established his own people for evermore, and who always, making manifest his presence, upholds those who are his own heritage. +\v 16 \f + \fr 14:16 \ft The Greek text of this verse and the next is corrupt. \f*When the leader had given orders, he immediately set out from there and joined battle with them at a village called Lessau. +\v 17 But Simon, the brother of Judas, had encountered Nicanor, yet not till late, having been delayed by reason of the sudden consternation caused by his adversaries. +\p +\v 18 Nevertheless Nicanor, hearing of the valor of those who were with Judas, and their courage in fighting for their country, shrank from bringing the matter to the decision of the sword. +\v 19 Therefore he sent Posidonius, Theodotus, and Mattathias to give and receive pledges of friendship. +\v 20 So when these proposals had been long considered, and the leader had made the \f + \fr 14:20 \ft Or, \fqa people \ft Gr. \fqa multitudes. \f*troops acquainted with them, and it appeared that they were all of like mind, they consented to the covenants. +\v 21 They appointed a day on which to meet together by themselves. A chariot came forward from each army. They set up seats of honor. +\v 22 Judas stationed armed men ready in convenient places, lest perhaps there should suddenly be treachery on the part of the enemy. They held a conference as was appropriate. +\v 23 Nicanor waited in Jerusalem, and did nothing to cause disturbance, but dismissed the flocks of people that had gathered together. +\v 24 He kept Judas always in his presence. He had gained a hearty affection for the man. +\v 25 He urged him to marry and have children. He married, settled quietly, and took part in common life. +\p +\v 26 But Alcimus, perceiving the good will that was between them, \f + \fr 14:26 \ft Or, \fqa and the covenants that had been made, took occasion and came\f*and having taken possession of the covenants that had been made, came to Demetrius and told him that Nicanor was disloyal to the government, for he had appointed that conspirator against his kingdom, Judas, to be his successor. +\v 27 The king, falling into a rage, and being exasperated by the false accusations of that most wicked man, wrote to Nicanor, signifying that he was displeased at the covenants, and commanding him to send Maccabaeus prisoner to Antioch in all haste. +\v 28 When this message came to Nicanor, he was confounded, and was very troubled at the thought of annulling the articles that had been agreed upon, the man having done no wrong; +\v 29 but because there was no opposing the king, he watched his time to execute this purpose by strategy. +\v 30 But Maccabaeus, when he perceived that Nicanor was behaving more harshly in his dealings with him, and that he had become ruler in his customary bearing, understanding that this harshness came not of good, gathered together not a few of his men, and concealed himself from Nicanor. +\p +\v 31 But the other,\f + \fr 14:31 \ft Or, \fqa though he was conscious that he had been nobly defeated by \f* when he became aware that he had been bravely defeated by the strategy of Judas,\f + \fr 14:31 \ft Gr. \fqa the man \f* came to the great\f + \fr 14:31 \ft Gr. \fqa greatest. \f* and holy temple, while the priests were offering the usual sacrifices, and commanded them to hand over the man. +\v 32 When they declared with oaths that they had no knowledge where the man was whom he sought, +\v 33 he stretched out his right hand toward the sanctuary, and swore this oath: “If you won’t deliver up to me Judas as a prisoner, I will level this \f + \fr 14:33 \ft Or, \fqa chapel \ft Gr. \fqa enclosure. \f*temple of God even with the ground, break down the altar, and I will erect here a temple to Dionysus for all to see. +\p +\v 34 And having said this, he departed. But the priests, stretching forth their hands toward heaven, called upon him who always fights for our nation, in these words: +\v 35 “You, O Lord of the universe, who in yourself have need of nothing, were well pleased that a sanctuary of your habitation\f + \fr 14:35 \ft Gr. \fqa tabernacling.\f* should be set among us. +\v 36 So now, O holy Lord of all holiness, keep undefiled forever this house that has been recently cleansed.” +\p +\v 37 Now information was given to Nicanor against one Razis, an elder of Jerusalem, who was a lover of his countrymen and a man of very good report, and one called Father of the Jews for his good will. +\v 38 For in the former times when there was no mingling with the Gentiles, he had been accused of following the Jews’ religion, and had risked body and life with all earnestness for the religion of the Jews. +\v 39 Nicanor, wishing to make evident the ill will that he bore against the Jews, sent above five hundred soldiers to seize him; +\v 40 for he thought by seizing him to inflict an injury on them. +\v 41 But when the \f + \fr 14:41 \ft Or, \fqa people \ft Gr. \fqa multitudes. \f*troops were at the point of taking the tower, and were forcing the door of the court, and asked for fire to burn the doors, he, being surrounded on every side, fell upon his sword, +\v 42 choosing rather to die nobly than to fall into the hands of the wicked wretches, and suffer outrage unworthy of his own nobleness. +\v 43 But since he missed his stroke through the excitement of the struggle, and the crowds were now rushing within the door, he ran bravely up to the wall and cast himself down bravely among the crowds. +\v 44 But as they quickly gave back, a space was made, and he fell on the middle of \f + \fr 14:44 \ft Or, \fqa the void place \f*his side. +\v 45 Still having breath within him, and being inflamed with anger, he rose up, and though his blood gushed out in streams and his wounds were grievous, he ran through the crowds, and standing upon a steep rock, +\v 46 when as his blood was now well near spent, he drew forth his bowels through the wound, and taking them in both his hands he shook them at the crowds. Calling upon him who is Lord of life and spirit to restore him \f + \fr 14:46 \ft Some authorities read \fqa the same. \f*these again, he died like this. +\c 15 +\p +\v 1 But Nicanor, hearing that Judas and his company were in the region of Samaria, resolved to attack them with complete safety on the day of rest. +\v 2 When the Jews who were compelled to follow him said, “Don’t destroy so savagely and barbarously, but give due glory to the day which he who sees all things has honored and hallowed above other days.” +\p +\v 3 Then the thrice-accursed wretch asked if there were a Sovereign in heaven who had commanded to keep the Sabbath day. +\p +\v 4 When they declared, “There is the Lord, living himself as Sovereign in heaven, who told us observe the seventh day.” +\p +\v 5 He replied, “I also am a sovereign on the earth, who commands you to take up weapons and execute the king’s business.” Nevertheless he didn’t prevail to execute his cruel plan. +\p +\v 6 And Nicanor, \f + \fr 15:6 \ft Gr. \fqa carrying his neck high.\f* in his utter boastfulness and arrogance, had determined to set up a monument of complete victory over Judas and all those who were with him. +\v 7 But Maccabaeus still trusted unceasingly, with all hope that he should obtain help from the Lord. +\v 8 He exhorted his company not to be fearful at the assault of the heathen, but keeping in mind the help which in former times they had often received from heaven, so now also to look for the victory which would come to them from the Almighty, +\v 9 and encouraging them out of the law and the prophets, and reminding them of the conflicts that they had won, he made them more eager. +\v 10 And when he had aroused their courage, he gave them orders, at the same time pointing out the faithlessness of the heathen and their breach of their oaths. +\v 11 Arming each one of them, not so much with the sure defense of shields and spears as with the encouragement of good words, and moreover relating to them a dream worthy to be believed, he made them all exceedingly glad. +\p +\v 12 The vision of that dream was this: Onias, he who had been high priest, a noble and good man, modest in bearing, yet gentle in manner and well-spoken, and trained from a child in all points of virtue, with outstretched hands invoking blessings on the whole body of the Jews. +\v 13 Then he saw a man appear, of venerable age and exceeding glory, and the dignity around him was wonderful and most majestic. +\v 14 Onias answered and said, “This is the lover of the kindred, he who prays much for the people and the holy city: Jeremiah the prophet of God. +\v 15 Jeremiah stretched out his right hand and delivered to Judas a gold sword, and in giving it addressed him thus: +\v 16 “Take this holy sword, a gift from God, with which you shall strike down the adversaries.” +\p +\v 17 Being encouraged by the words of Judas, which were noble and effective, and able to incite to virtue and to stir the souls of the young to manly courage, they determined not to carry on a campaign, but nobly to bear down upon the enemy, and fighting hand to hand with all courage bring the matter to a conclusion, because the city, the sanctuary, and the temple were in danger. +\v 18 For their fear for wives and children, and furthermore for family and relatives, was less important to them; but greatest and first was their fear for the consecrated sanctuary. +\v 19 Also those who were shut up in the city were in no light distress, being troubled because of the encounter in the open country. +\p +\v 20 When all were now waiting for the decision of the issue, and the enemy had already joined battle, and the army had been set in array, and the elephants\f + \fr 15:20 \ft Gr. \fqa animals. \f* brought back to a convenient post,\f + \fr 15:20 \ft Or, \fqa stationed for convenient action \f* and the cavalry deployed on the flanks, +\v 21 Maccabaeus, perceiving the presence of the \f + \fr 15:21 \ft Gr. \fqa multitudes. \f*troops, and the various weapons with which they were equipped, and the savageness of the \f + \fr 15:21 \ft Gr. \fqa animals. \f*elephants, holding up his hands to heaven called upon the Lord who works wonders, knowing that success comes not by weapons, but that, according to how the Lord judges, he gains the victory for those who are worthy. +\v 22 And calling upon God, he said this: “You, O Sovereign Lord, sent your angel in the time of King Hezekiah of Judea, and he killed of the \f + \fr 15:22 \ft Gr. \fqa camp. \f*army of Sennacherib as many as one hundred eighty-five thousand. +\v 23 So now also, O Sovereign of the heavens, send a good angel before us to bring terror and trembling. +\v 24 Through the greatness of your arm let them be stricken with dismay who with blasphemy have come here against your holy people.” As he finished these words, +\v 25 Nicanor and his company advanced with trumpets and victory songs; +\v 26 but Judas and his company joined battle with the enemy with invocation and prayers. +\v 27 Fighting with their hands and praying to God with their hearts, they killed no less than thirty-five thousand men, being made exceedingly glad by the manifestation of God. +\p +\v 28 When the engagement was over and they were returning again with joy, they recognized Nicanor lying dead in full armor. +\v 29 Then there was shouting and noise, and they blessed the Sovereign Lord in the language of their ancestors. +\v 30 He who in all things was in body and soul the foremost champion of his fellow-citizens, he who kept through life the good will of his youth toward his countrymen, ordered that Nicanor’s head be cut off with his hand and arm, and that they be brought to Jerusalem. +\v 31 When he had arrived there and had called his countrymen together and set the priests before the altar, he sent for those who were in the citadel. +\v 32 Showing the head of the vile Nicanor and the hand of that profane man, which with proud brags he had stretched out against the holy house of the Almighty, +\v 33 and cutting out the tongue of the impious Nicanor, he said that he would give it in pieces to the birds, and hang up these rewards of his folly near the sanctuary. +\v 34 They all, looking up to heaven, blessed the Lord who had manifested himself, saying, “Blessed is he who has preserved his own place undefiled!” +\v 35 He hung Nicanor’s head and shoulder from the citadel, a clear sign evident to all of the help of the Lord. +\v 36 They all ordained with a common decree to in no way let this day pass undistinguished, but to mark with honor the thirteenth day of the twelfth month (it is called Adar in the Syrian language), the day before the day of Mordecai. +\b +\p +\v 37 This then having been the account of the attempt of Nicanor, and the city having from those times been held by the Hebrews, I also will here make an end of my book. +\v 38 If I have written well and to the point in my story, this is what I myself desired; but if its poorly done and mediocre, this is the best I could do. +\v 39 For as it is \f + \fr 15:39 \ft Or, \fqa hurtful \f*distasteful to drink wine alone and likewise to drink water alone, \f + \fr 15:39 \ft Gr. \fqa but even as. \f*while the mingling of wine with water at once gives full pleasantness to the flavor; so also the fashioning of the language delights the ears of those who read the story. +\p Here is the end. diff --git a/c-sharp/assets/WEB/803MAengWEBUS.SFM b/c-sharp/assets/WEB/803MAengWEBUS.SFM new file mode 100644 index 0000000000..34b4f89ecc --- /dev/null +++ b/c-sharp/assets/WEB/803MAengWEBUS.SFM @@ -0,0 +1,262 @@ +\id 3MA +\h 3 Maccabees +\toc1 The Third Book of the Maccabees +\toc2 3 Maccabees +\toc3 3Ma +\mt1 The Third Book of the Maccabees +\ip \bk The Third Book of the Maccabees\bk* is recognized as Deuterocanonical Scripture by the Greek Orthodox and Russian Orthodox Churches. It is considered to be apocrypha by most other church traditions. +\c 1 + +\p +\v 1 Now Philopater, on learning from those who came back that Antiochus had made himself master of the places which belonged to himself, sent orders to all his infantry and cavalry, took with him his sister Arsinoe, and marched out as far as the parts of Raphia, where Antiochus and his forces encamped. +\v 2 And one Theodotus, intending to carry out his design, took with him the bravest of the armed men who had been before committed to his trust by Ptolemy, and got through at night to the tent of Ptolemy, to kill him on his own responsibility, and so to end the war. +\v 3 But Dositheus, called the son of Drimulus, by birth a Jew, afterward a renegade from the laws and observances of his country, conveyed Ptolemy away, and made an obscure person lie down in his stead in the tent. It turned out that this man received the fate which was meant for the other. +\v 4 A fierce battle then took place. The men of Antiochus were prevailing. Arsinoe continually went up and down the ranks, and with dishevelled hair, with tears and entreaties, begged the soldiers to fight bravely for themselves, their children, and wives, and promised that if they proved conquerors, she would give them each two minas of gold. +\v 5 It thus fell out that their enemies were defeated in hand-to-hand encounter, and that many of them were taken prisoners. +\v 6 Having vanquished this attempt, the king then decided to proceed to the neighboring cities, and encourage them. +\v 7 By doing this, and by making donations to their temples, he inspired his subjects with confidence. +\p +\v 8 The Jews sent some of their council and of their elders to him. The greetings, welcoming gifts, and congratulations of the past, given by them, filled him with the greater eagerness to visit their city. +\v 9 Having arrived at Jerusalem, sacrificed, and offered thank-offerings to the Greatest God, and done whatever else was suitable to the sanctity of the place, and entered the inner court, +\v 10 he was so impressed with the magnificence of the place, and so wondered at the orderly arrangements of the temple, that he considered entering the sanctuary itself. +\v 11 When they told him that this was not permissible, none of the nation, not even the priests in general, but only the supreme high priest of all, and he only once in a year, was allowed to go in, he would by no means give way. +\v 12 Then they read the law to him, but he persisted in intruding, exclaiming that he ought to be allowed. He said, “Even if they were deprived of this honor, I shouldn’t be.” +\v 13 He asked why, when he entered all the other temples, did none of the priests who were present forbid him. +\v 14 He was thoroughly answered by someone, that he did wrong to boast of this. +\v 15 “Well, since I have done this,” said he, “be the cause what it may, shall I not enter with or without your consent?” +\p +\v 16 When the priests fell down in their sacred vestments imploring the Greatest God to come and help in time of need, and to avert the violence of the fierce aggressor, and when they filled the temple with lamentations and tears, +\v 17 then those who had been left behind in the city were scared, and rushed out, uncertain of the event. +\v 18 Virgins, who had been shut up within their chambers, came out with their mothers, scattering dust and ashes on their heads, and filling the streets with outcries. +\v 19 Women who had recently been arrayed for marriage left their bridal chambers, left the reserve that befitted them, and ran around the city in a disorderly manner. +\v 20 New-born babes were deserted by the mothers or nurses who waited upon them—some here, some there, in houses, or in fields; these now, with an ardor which could not be checked, swarmed into the Most High temple. +\v 21 Various prayers were offered up by those who assembled in this place because of the unholy attempt of the king. +\v 22 Along with these there were some of the citizens who took courage and would not submit to his obstinacy and his intention of carrying out his purpose. +\v 23 Calling out to arms, and to die bravely in defense of the law of their fathers, they created a great uproar in the place, and were with difficulty brought back by the aged and the elders to the station of prayer which they had occupied before. +\v 24 During this time, the multitude kept on praying. +\v 25 The elders who surrounded the king tried in many ways to divert his arrogant mind from the design which he had formed. +\v 26 He, in his hardened mood, insensible to all persuasion, was going onward with the view of carrying out this design. +\v 27 Yet even his own officers, when they saw this, joined the Jews in an appeal to Him who has all power to aid in the present crisis, and not wink at such haughty lawlessness. +\v 28 Such was the frequency and the vehemence of the cry of the assembled crowd, that an indescribable noise ensued. +\v 29 Not the men only, but the very walls and floor seemed to sound out, all things preferring death rather than to see the place defiled. +\c 2 +\p +\v 1 Now it was that the high priest Simon bowed his knees near the holy place, spread out his hands in reverent form, and uttered the following prayer: +\v 2 “O Lord, Lord, King of the heavens, and Ruler of the whole creation, Holy among the holy, sole Governor, Almighty, give ear to us who are oppressed by a wicked and profane one, who celebrates in his confidence and strength. +\v 3 It is you, the Creator of all, the Lord of the universe, who are a righteous Governor, and judge all who act with pride and insolence. +\v 4 It was you who destroyed the former workers of unrighteousness, among whom were the giants, who trusted in their strength and daring, by covering them with a measureless flood. +\v 5 It was you who made the Sodomites, those workers of exceedingly iniquity, men notorious for their vices, an example to later generations, when you covered them with fire and brimstone\f + \fr 2:5 \ft or, sulfur\f*. +\v 6 You made known your power when you caused the bold Pharaoh, the enslaver of your people, to pass through the ordeal of many and diverse inflictions. +\v 7 You rolled the depths of the sea over him when he pursued with chariots and with a multitude of followers, and gave a safe passage to those who put their trust in you, the Lord of the whole creation. +\v 8 These saw and felt the works of your hands, and praised you, the Almighty. +\v 9 You, O King, when you created the immeasurable and measureless earth, chose this city. You made this place sacred to your name, even though you need nothing. You glorified it with your illustrious presence, after constructing it to the glory of your great and honorable name. +\v 10 You promised, out of love for the people of Israel, that if we fall away from you, become afflicted, and then come to this house and pray, you would hear our prayer. +\v 11 Truly you are faithful and true. +\v 12 When you often aided our fathers when hard pressed and humiliated, and delivered them out of great dangers, +\v 13 see now, holy King, how through our many and great sins we are crushed and made subject to our enemies, and have become weak and powerless. +\v 14 In our low condition, this bold and profane man seeks to dishonor this your holy place, consecrated out of the earth to the name of your Majesty. +\v 15 Your dwelling place, the heaven of heavens, is indeed unapproachable to men. +\v 16 But since it seemed good to you to exhibit your glory among your people Israel, you sanctified this place. +\v 17 Don’t punish us by means of the uncleanness of their men, and don’t chastise us by means of their profanity, lest the lawless ones should boast in their rage, and exult in exuberant pride of speech, and say, +\v 18 ‘We have trampled upon the holy house, as idolatrous houses are trampled upon.’ +\v 19 Blot out our iniquities, do away with our errors, and show your compassion in this hour. +\v 20 Let your mercies quickly go before us. Grant us peace, that the downcast and broken hearted may praise you with their mouth.” +\p +\v 21 At that time God, who sees all things, who is beyond all Holy among the holy, heard that prayer, so suitable, and scourged the man who was greatly uplifted with scorn and insolence. +\v 22 Shaking him back and forth as a reed is shaken with the wind, he threw him down on the pavement, powerless, with limbs paralyzed, and by a righteous judgment deprived of the ability to speak. +\v 23 His friends and bodyguards, seeing the swift recompense which had suddenly overtaken him, struck with exceeding terror, and fearing that he would die, speedily removed him. +\v 24 When in course of time he had come to himself, this severe punishment caused no repentance within him, but he departed with bitter threatenings. +\p +\v 25 He proceeded to Egypt, grew worse in wickedness through his previously mentioned companions in wine, who were lost to all goodness, +\v 26 and not satisfied with countless acts of impiety, his audacity so increased that he raised evil reports there, and many of his friends, watching his purpose attentively, joined in furthering his will. +\v 27 His purpose was to inflict a public stigma upon our race. Therefore he erected a stone pillar in the courtyard, and caused the following inscription to be engraved upon it: +\v 28 “Entrance to this temple is to be refused to all those who would not sacrifice. All the Jews were to be registered among the slaves. Those who resisted are to be forcibly seized and put to death. +\v 29 Those who are thus registered are to be marked on their persons by the ivy-leaf symbol of Dionysus, and to be reduced to these limited rights.” +\v 30 To do away with the appearance of hating them all, he had it written underneath, that if any of them should elect to enter the community of those initiated in the rites, these should have equal rights with the Alexandrians. +\p +\v 31 Some of those who were over the city, therefore, abhorring any approach to the city of piety, unhesitatingly gave in to the king, and expected to derive some great honor from a future connection with him. +\v 32 A nobler spirit, however, prompted the majority to cling to their religious observances, and by paying money that they might live unmolested, these sought to escape the registration, +\v 33 cheerfully looking forward to future aid, they abhorred their own apostates, considering them to be national foes, and depriving them of common fellowship and mutual help. +\c 3 +\p +\v 1 On discovering this, so incensed was the wicked king, that he no longer confined his rage to the Jews in Alexandria. Laying his hand more heavily upon those who lived in the country, he gave orders that they should be quickly collected into one place, and most cruelly deprived of their lives. +\v 2 While this was going on, a hostile rumor was uttered abroad by men who had banded together to injure the Jewish race. The pretext of their charge was that the Jews kept them away from the ordinances of the law. +\v 3 Now the Jews always maintained a feeling of unwavering loyalty toward the kings, +\v 4 yet, as they worshiped God and observed his law, they made certain distinctions, and avoided certain things. Hence they appeared hateful to some people, +\v 5 although, as they adorned their conversation with works of righteousness, they had established themselves in the good opinion of the world. +\v 6 What all the rest of mankind said was, however, disregarded by the foreigners, +\v 7 who said much of the exclusiveness of the Jews with regard to their worship and meats. They alleged that they were unsociable men, hostile to the king’s interests, refusing to associate with him or his troops. By this way of speaking, they brought much hatred on them. +\v 8 This unexpected uproar and sudden gathering of people was observed by the Greeks who lived in the city, concerning men who had never harmed them. Yet to aid them was not in their power, since all was oppression around, but they encouraged them in their troubles, and expected a favorable turn of affairs. +\v 9 He who knows all things will not, they said, disregard so great a people. +\v 10 Some of the neighbors, friends, and business associates of the Jews even called them secretly to an interview, pledged them their assistance, and promised to do their very utmost for them. +\p +\v 11 Now the king, elated with his prosperous fortune, and not regarding the superior power of God, but thinking to persevere in his present purpose, wrote the following letter to the prejudice of the Jews: +\v 12 “King Ptolemy Philopater, to the commanders and soldiers in Egypt, and in all places, health and happiness! +\v 13 I am doing well, and so, too, are my affairs. +\v 14 Since our Asiatic campaign, the particulars of which you know, and which by the aid of the gods, not lightly given, and by our own vigor, has been brought to a successful conclusion according to our expectation, +\v 15 we resolved, not with strength of spear, but with gentleness and much humanity, as it were to nurse the inhabitants of Coele-Syria and Phoenicia, and to be their willing benefactors. +\v 16 So, having bestowed considerable sums of money upon the temples of the several cities, we proceeded even as far as Jerusalem, and went up to honor the temple of these wretched beings who never cease from their folly. +\v 17 To outward appearance they received us willingly, but belied that appearance by their deeds. When we were eager to enter their temple, and to honor it with the most beautiful and exquisite gifts, +\v 18 they were so carried away by their old arrogance as to forbid us the entrance, while we, out of our forbearance toward all men, refrained from exercising our power upon them. +\v 19 Thus, exhibiting their enmity against us, they alone among the nations lift up their heads against kings and benefactors, as men unwilling to submit to any reasonable thing. +\v 20 We then, having endeavored to make allowance for the madness of these people, and on our victorious return treating all people in Egypt courteously, acted in a manner which was befitting. +\v 21 Accordingly, bearing no ill will against their kinsmen, but rather remembering our connection with them, and the numerous matters with sincere heart from a remote period entrusted to them, we wished to venture a total alteration of their state, by giving them the rights of citizens of Alexandria, and to admit them to the everlasting rites of our solemnities. +\v 22 All this, however, they have taken in a very different spirit. With their innate malignity, they have spurned the fair offer, and constantly inclining to evil, +\v 23 have rejected the inestimable rights. Not only so, but by using speech, and by refraining from speech, they abhor the few among them who are heartily disposed toward us, ever deeming that their infamous way of life will force us to do away with our reform. +\v 24 Having then received certain proofs that these Jews bear us every sort of ill will, we must look forward to the possibility of some sudden tumult among ourselves when these impious men may turn traitors and barbarous enemies. +\v 25 Therefore, as soon as the contents of this letter become known to you, in that same hour we order those Jews who dwell among you, with wives and children, to be sent to us, vilified and abused, in chains of iron, to undergo a cruel and shameful death, suitable to enemies. +\v 26 For by the punishment of them in one body we perceive that we have found the only means of establishing our affairs for the future on a firm and satisfactory basis. +\v 27 Whoever protects a Jew, whether it be old man, child, or nursing baby, shall with his whole house be tortured to death. +\v 28 Whoever informs against the Jews, besides receiving the property of the person charged, shall be presented with two thousand drachmas\f + \fr 3:28 \ft a drachma was about a day’s pay for an agricultural laborer\f* from the royal treasury, shall be made free, and shall be crowned. +\v 29 Whatever place shelters a Jew shall be made unapproachable and shall be put under the ban of fire, and be forever rendered useless to every living being for all time to come.” +\v 30 The king’s letter was written in the above form. +\c 4 +\p +\v 1 Wherever this decree was received, the people kept up a revelry of joy and shouting, as if their long-pent-up, hardened hatred would now show itself openly. +\v 2 The Jews suffered great throes of sorrow and wept much, while their hearts, all things around being lamentable, were set on fire as they bewailed the sudden destruction which was decreed against them. +\v 3 What home, or city, or any inhabited place, or what streets were there, which their condition didn’t fill with wailing and lamentation? +\v 4 They were sent out unanimously by the generals in various cities, with such stern and pitiless feeling that the exceptional nature of the infliction moved even some of their enemies. These, influenced by sentiments of common humanity, and reflecting upon the uncertain issue of life, shed tears at their miserable expulsion. +\v 5 A multitude of aged hoary-haired old men were driven along with halting bending feet, urged onward by the impulse of a violent, shameless force to quick speed. +\v 6 Girls who had entered the bridal chamber quite lately, to enjoy the partnership of marriage, exchanged pleasure for misery; and with dust scattered upon their myrrh-anointed heads, were hurried along unveiled; and, in the midst of outlandish insults, set up with one accord a lamentable cry instead of the marriage hymn. +\v 7 Bound and exposed to public gaze, they were hurried violently on board ship. +\v 8 The husbands of these, in the prime of their youthful vigor, instead of crowns, wore ropes round their necks. Instead of feasting and youthful celebration, they spent the rest of their nuptial days in wailing, and saw only the grave at hand. +\v 9 They were dragged along by unyielding chains, like wild animals. Of these, some had their necks thrust into the benches of the rowers, while the feet of others were enclosed in hard fetters. +\v 10 The planks of the deck above them blocked out the light and shut out the day on every side, so that they might be treated like traitors during the whole voyage. +\p +\v 11 They were carried like this in this vessel, and at the end of it arrived at Schedia. The king had ordered them to be cast into the vast hippodrome, which was built in front of the city. This place was well adapted by its situation to expose them to the gaze of all comers into the city, and of those who went from the city into the country. Thus they could hold no communication with his forces. They weren’t deemed worthy of any civilized accommodation. +\v 12 When this was done, the king, hearing that their kindred in the city often went out and lamented the melancholy distress of these victims, +\v 13 was full of rage, and commanded that they should be carefully subjected to the same—and not one bit milder—treatment. +\v 14 The whole nation was now to be registered. Every individual was to be specified by name, not for that hard servitude of labor which we have a little before mentioned, but that he might expose them to the before-mentioned tortures; and finally, in the short space of a day, might exterminate them by his cruelties. +\v 15 The registering of these men was carried on cruelly, zealously, assiduously, from the rising of the sun to its going down, and was not brought to an end in forty days. +\v 16 The king was filled with great and constant joy, and celebrated banquets before the temple idols. His erring heart, far from the truth, and his profane mouth gave glory to idols, deaf and incapable of speaking or aiding, and uttered unworthy speech against the Greatest God. +\v 17 At the end of the above-mentioned interval of time, the registrars brought word to the king that the multitude of the Jews was too great for registration, +\v 18 inasmuch as there were many still left in the land, of whom some were in inhabited houses, and others were scattered about in various places, so that all the commanders in Egypt were insufficient for the work. +\v 19 The king threatened them, and charged them with taking bribes, in order to contrive the escape of the Jews, but was clearly convinced of the truth of what had been said. +\v 20 They said, and proved, that paper and pens had failed them for the carrying out of their purpose. +\v 21 Now this was an active interference of the unconquerable Providence which assisted the Jews from heaven. +\c 5 +\p +\v 1 Then he called Hermon, who had charge of the elephants. Full of rage, altogether fixed in his furious design, +\v 2 he commanded him, with a quantity of unmixed wine with handfuls of incense infused, to drug the elephants early on the following day. These five hundred elephants were, when infuriated by the copious drinks of frankincense, to be led up to the execution of death upon the Jews. +\v 3 The king, after issuing these orders, went to his feasting, and gathered together all those of his friends and of the army who hated the Jews the most. +\v 4 The master of the elephants, Hermon, fulfilled his commission punctually. +\v 5 The servants appointed for the purpose went out about evening and bound the hands of the miserable victims, and took other precautions for their security at night, thinking that the whole race would perish together. +\v 6 The heathen believed the Jews to be destitute of all protection, for chains bound them. +\v 7 They invoked the Almighty Lord, and ceaselessly implored with tears their merciful God and Father, Ruler of all, Lord of every power, +\v 8 to overthrow the evil purpose which had gone out against them, and to deliver them by extraordinary manifestation from that death which was in store for them. +\v 9 Their earnest entreaty went up to heaven. +\v 10 Then Hermon, who had filled his merciless elephants with copious drinks of mixed wine and frankincense, came early to the palace to report on these preparations. +\v 11 He, however, who has sent his good creature sleep from all time by night or by day thus gratifying whom he wills, diffused a portion of it now upon the king. +\v 12 By this sweet and profound influence of the Lord, he was held fast, and thus his unjust purpose was quite frustrated, and his unflinching resolve greatly falsified. +\v 13 But the Jews, having escaped the hour which had been fixed, praised their holy God, and again prayed him who is easily reconciled to display the power of his powerful hand to the arrogant Gentiles. +\v 14 The middle of the tenth hour had nearly arrived, when the person who sent invitations, seeing the guests who were invited present, came and shook the king. +\v 15 He gained his attention with difficulty, and hinting that the mealtime was getting past, talked the matter over with him. +\v 16 The king listened to this, and then turning aside to his drinking, commanded the guests to sit down before him. +\v 17 This done, he asked them to enjoy themselves, and to indulge in mirth at this somewhat late hour of the banquet. +\v 18 Conversation grew on, and the king sent for Hermon, and inquired of him, with fierce denunciations, why the Jews had been allowed to outlive that day. +\v 19 Hermon explained that he had done his bidding over night; and in this he was confirmed by his friends. +\v 20 The king, then, with a barbarity exceeding that of Phalaris, said, “They might thank his sleep of that day. Lose no time, and get ready the elephants against tomorrow, as you did before, for the destruction of these accursed Jews.” +\v 21 When the king said this, the company present were glad, and approved. Then each man went to his own home. +\v 22 They didn’t employ the night in sleep, but in contriving cruel mockeries for those deemed miserable. +\v 23 The morning cock had just crowed, and Hermon, having harnessed the brutes, was stimulating them in the great colonnade. +\v 24 The city crowds were collected together to see the hideous spectacle, and waited impatiently for the dawn. +\v 25 The Jews, breathless with momentary suspense, stretched out their hands and prayed the Greatest God, in mournful strains, again to help them speedily. +\v 26 The sun’s rays were not yet shining and the king was waiting for his friends when Hermon came to him, calling him out, and saying that his desires could now be realized. +\v 27 The king, receiving him, was astonished at his unusual invitation. Overwhelmed with a spirit of oblivion about everything, inquired about the object of this earnest preparation. +\v 28 But this was the working of that Almighty God who had made him forget all his purpose. +\v 29 Hermon and all his friends pointed out the preparation of the animals. They are ready, O king, according to your own strict injunction. +\v 30 The king was filled with fierce anger at these words, for, by the Providence of God regarding these things, his mind had become entirely confused. He looked hard at Hermon, and threatened him as follows: +\v 31 “Your parents, or your children, were they here, would have given a large meal to these wild animals, not these innocent Jews, who have loyally served me and my forefathers. +\v 32 Had it not been for familiar friendship, and the claims of your office, your life should have gone for theirs.” +\p +\v 33 Hermon, being threatened in this unexpected and alarming manner, was troubled in his eyes, and his face fell. +\v 34 The friends, too, stole out one by one, and dismissed the assembled multitudes to their respective occupations. +\v 35 The Jews, having heard of these events, praised the glorious God and King of kings, because they had obtained this help, too, from him. +\v 36 Now the king arranged another banquet in the same way, and proclaimed an invitation to mirth. +\v 37 He summoned Hermon to his presence, and said, with threats, “How often, O wretch, must I repeat my orders to you about these same persons? +\v 38 Once more, arm the elephants for the extermination of the Jews tomorrow!” +\v 39 His kinsmen, who were reclining with him, wondered at his instability, and thus expressed themselves: +\v 40 “O king, how long do you test us, as of men bereft of reason? This is the third time that you have ordered their destruction. When the thing is to be done, you change your mind, and recall your instructions. +\v 41 Because of this, the feeling of expectation causes tumult in the city. It swarms with factions, and is continually on the point of being plundered.” +\p +\v 42 The king, just like another Phalaris, a prey to thoughtlessness, made no account of the changes which his own mind had undergone, issuing in the deliverance of the Jews. He swore a fruitless oath, and determined immediately to send them to hades, crushed by the knees and feet of the elephants. +\v 43 He would also invade Judea, level its towns with fire and the sword, destroy that temple which the heathen might not enter, and prevent sacrifices ever after being offered up there. +\v 44 Joyfully his friends broke up, together with his kinsmen; and, trusting in his determination, arranged their forces in guard at the most convenient places of the city. +\v 45 The master of the elephants urged the animals into an almost maniacal state, drenched them with incense and wine, and decked them with frightful devices. +\v 46 About early morning, when the city was filled with an immense number of people at the hippodrome, he entered the palace and called the king to the business in hand. +\v 47 The king’s heart teemed with impious rage; and he rushed forth with the mass, along with the elephants. With unsoftened feelings and pitiless eyes, he longed to gaze at the hard and wretched doom of the previously mentioned Jews. +\v 48 But the Jews, when the elephants went out at the gate, followed by the armed force. When they saw the dust raised by the throng, and heard the loud cries of the crowd, +\v 49 thought that they had come to the last moment of their lives, to the end of what they had tremblingly expected. They gave way, therefore, to lamentations and moans. They kissed each other. Those nearest of kin to each other hung around one another’s necks—fathers hugging their sons and mothers their daughters. Other women held their infants to their breasts, which drew what seemed their last milk. +\v 50 Nevertheless, when they reflected upon the help previously granted them from heaven, they prostrated themselves with one accord, removed even the sucking children from the breasts, and +\v 51 sent up an exceedingly great cry asking the Lord of all power to reveal himself, and have mercy upon those who now lay at the gates of hades. +\c 6 +\p +\v 1 Then Eleazar, an illustrious priest of the country, who had attained to length of days, and whose life had been adorned with virtue, caused the elders who were around him to cease to cry out to the holy God, and prayed this: +\v 2 “O king, mighty in power, most high, Almighty God, who regulates the whole creation with your tender mercy, +\v 3 look at the seed of Abraham, at the children of the sanctified Jacob, your sanctified inheritance, O Father, now being wrongfully destroyed as foreigners in a foreign land. +\v 4 You destroyed Pharaoh with his army of chariots when that lord of this same Egypt was uplifted with lawless daring and loud-sounding tongue. Shedding the beams of your mercy upon the race of Israel, you overwhelmed him and his proud army. +\v 5 When Sennacherim, the grievous king of the Assyrians, exulting in his countless army, had subdued the whole land with his spear and was lifting himself against your holy city with boastings grievous to be endured, you, O Lord, demolished him and displayed your might to many nations. +\v 6 When the three friends in the land of Babylon of their own will exposed their lives to the fire rather than serve vain things, you sent a moist coolness through the fiery furnace, and brought the fire on all their adversaries. +\v 7 It was you who, when Daniel was hurled, through slander and envy, as a prey to lions down below, brought him back again unharmed to light. +\v 8 When Jonah was pining away in the belly of the sea-born monster, you looked at him, O Father, and recovered him to the sight of his own. +\v 9 Now, you who hate insolence, you who abound in mercy, you who are the protector of all things, appear quickly to those of the race of Israel, who are insulted by abhorred, lawless gentiles. +\v 10 If our life during our exile has been stained with iniquity, deliver us from the hand of the enemy, and destroy us, O Lord, by the death which you prefer. +\v 11 Don’t let the vain-minded congratulate vain idols at the destruction of your beloved, saying, ‘Their god didn’t deliver them.’ +\v 12 You who are All-powerful and Almighty, O Eternal One, behold! Have mercy on us who are being withdrawn from life, like traitors, by the unreasoning insolence of lawless men. +\v 13 Let the heathen cower before your invincible might today, O glorious One, who have all power to save the race of Jacob. +\v 14 The whole band of infants and their parents ask you with tears. +\v 15 Let it be shown to all the nations that you are with us, O Lord, and have not turned your face away from us, but as you said that you would not forget them even in the land of their enemies, so fulfill this saying, O Lord.” +\p +\v 16 Now, at the time that Eleazar had ended his prayer, the king came along to the hippodrome with the wild animals, and with his tumultuous power. +\v 17 When the Jews saw this, they uttered a loud cry to heaven so that the adjacent valleys resounded and caused an irrepressible lamentation throughout the army. +\v 18 Then the all-glorious, all-powerful, and true God, displayed his holy countenance, and opened the gates of heaven, from which two angels, dreadful of form, came down and were visible to all but the Jews. +\v 19 They stood opposite, and filled the enemies’ army with confusion and cowardice, and bound them with immoveable shackles. +\v 20 A cold shudder came over the person of the king, and oblivion paralyzed the vehemence of his spirit. +\v 21 They turned back the animals on the armed forces who followed them; and the animals trampled them and destroyed them. +\v 22 The king’s wrath was converted into compassion; and he wept at the things he had devised. +\v 23 For when he heard the cry, and saw them all on the verge of destruction, with tears he angrily threatened his friends, saying, +\v 24 “You have governed badly, and have exceeded tyrants in cruelty. You have labored to deprive me, your benefactor, at once of my dominion and my life, by secretly devising measures injurious to the kingdom. +\v 25 Who has gathered here, unreasonably removing each from his home, those who, in fidelity to us, had held the fortresses of the country? +\v 26 Who has consigned to unmerited punishments those who in good will toward us from the beginning have in all things surpassed all nations, and who often have engaged in the most dangerous undertakings? +\v 27 Loose, loose the unjust bonds! Send them to their homes in peace, begging pardon for what has been done. +\v 28 Release the sons of the almighty living God of heaven, who from our ancestors’ times until now has granted a glorious and uninterrupted prosperity to our affairs.” +\v 29 He said these things, and they, released the same moment, having now escaped death, praised God their holy Savior. +\p +\v 30 The king then departed to the city, and called his financier to himself, and asked him provide a seven days’ quantity of wine and other materials for feasting for the Jews. He decided that they should keep a cheerful festival of deliverance in the very place in which they expected to meet with their destruction. +\v 31 Then they who were before despised and near to hades, yes, rather advanced into it, partook of the cup of salvation, instead of a grievous and lamentable death. Full of exultation, they apportioned the place intended for their fall and burial into banqueting booths. +\v 32 Ceasing their miserable strain of woe, they took up the subject of their fatherland, singing in praise to God their wonder-working Savior. All groans and all wailing were laid aside. They formed dances as a sign of peaceful joy. +\v 33 So the king also collected a number of guests for the occasion, and returned unceasing thanks with much magnificence for the unexpected deliverance afforded him. +\v 34 Those who had marked them out as for death and for carrion, and had registered them with joy, howled aloud, and were clothed with shame, and had the fire of their rage ingloriously put out. +\v 35 But the Jews, as we just said, instituted a dance, and then gave themselves up to feasting, glad thanksgiving, and psalms. +\v 36 They made a public ordinance to commemorate these things for generations to come, as long as they should be sojourners. They thus established these days as days of mirth, not for the purpose of drinking or luxury, but because God had saved them. +\v 37 They requested the king to send them back to their homes. +\v 38 They were being enrolled from the twenty-fifth of Pachon to the fourth of Epiphi, a period of forty days. The measures taken for their destruction lasted from the fifth of Epiphi till the seventh, that is, three days. +\v 39 The Ruler over all during this time manifested his mercy gloriously, and delivered them all together unharmed. +\v 40 They feasted upon the king’s provision up to the fourteenth day, then asked to be sent away. +\v 41 The king commended them, and wrote the following letter, of magnanimous import for them, to the commanders of every city: +\c 7 +\p +\v 1 “King Ptolemy Philopator to the commanders throughout Egypt, and to all who are set over affairs, joy and strength. +\v 2 We, too, and our children are well. God has directed our affairs as we wish. +\v 3 Certain of our friends out of malice vehemently urged us to punish the Jews of our realm in a body, with the infliction of a monstrous punishment. +\v 4 They pretended that our affairs would never be in a good state till this took place. Such, they said, was the hatred borne by the Jews to all other people. +\v 5 They brought them fettered in grievous chains as slaves, no, as traitors. Without enquiry or examination they endeavored to annihilate them. They buckled themselves with a savage cruelty, worse than Scythian custom. +\v 6 For this cause we severely threatened them; yet, with the clemency which we usually extend to all men, we at length permitted them to live. Finding that the God of heaven cast a shield of protection over the Jews so as to preserve them, and that he fought for them as a father always fights for his sons, +\v 7 and taking into consideration their constancy and fidelity toward us and toward our ancestors, we have, as we ought, acquitted them of every sort of charge. +\v 8 We have dismissed them to their several homes, telling all men everywhere to do them no wrong, or unrighteously revile them about the past. +\v 9 For know this, that should we conceive any evil design, or in any way aggrieve them, we shall ever have as our adversary, not man, but the highest God, the ruler of all might. From Him there will be no escape, as the avenger of such deeds. Farewell.” +\p +\v 10 When they had received this letter, they didn’t hurry to depart immediately. They petitioned the king to be allowed to inflict fitting punishment upon those of their race who had willingly transgressed the holy god, and the law of God. +\v 11 They alleged that men who had for their bellies’ sake transgressed the ordinances of God, would never be faithful to the interests of the king. +\v 12 The king admitted the truth of this reasoning, and commended them. Full power was given them, without warrant or special commission, to destroy those who had transgressed the law of God boldly in every part of the king’s dominions. +\v 13 Their priests, then, as it was appropriate, saluted him with good wishes, and all the people echoed with the “Hallelujah!” Then they joyfully departed. +\v 14 Then they punished and shamefully destroyed every polluted Jew that fell in their way, +\v 15 slaying this way, in that day, more than three hundred men, and esteeming this destruction of the wicked a season of joy. +\v 16 They themselves having held closely to their God to death, and having enjoyed a full deliverance, departed from the city garlanded with sweet-flowered wreaths of every kind. Uttering exclamations of joy, with songs of praise, and melodious hymns, they thanked the God of their fathers, the eternal Savior of Israel. +\v 17 Having arrived at Ptolemais, called from the specialty of that district “Rose-bearing”, where the fleet, in accordance with the general wish, waited for them seven days, +\v 18 they partook of a banquet of deliverance, for the king generously granted them all the means of securing a return home. +\v 19 They were accordingly brought back in peace, while they gave utterance to appropriate thanks; and they determined to observe these days during their sojourn as days of joyfulness. +\v 20 These they registered as sacred upon a pillar, when they had dedicated the place of their festivity to be one of prayer. They departed unharmed, free, abundant in joy, preserved by the king’s command, by land, by sea, and by river, each to his own home. +\v 21 They had more weight than before among their enemies, and were honored and feared. No one in any way robbed them of their goods. +\v 22 Every man received back his own, according to inventory, those who had obtained their goods, giving them up with the greatest terror. For the greatest God made perfect wonders for their salvation. +\v 23 Blessed be the Redeemer of Israel forever! Amen. diff --git a/c-sharp/assets/WEB/814MAengWEBUS.SFM b/c-sharp/assets/WEB/814MAengWEBUS.SFM new file mode 100644 index 0000000000..fe92c0860f --- /dev/null +++ b/c-sharp/assets/WEB/814MAengWEBUS.SFM @@ -0,0 +1,565 @@ +\id 4MA +\h 4 Maccabees +\toc1 The Fourth Book of the Maccabees +\toc2 4 Maccabees +\toc3 4Ma +\mt1 The Fourth Book of the Maccabees +\ip \bk The Fourth Book of the Maccabees\bk* appears in an appendix to the Greek Septuagint. It is considered to be apocrypha by most church traditions. It is preserved here for its supplementary historical value. +\c 1 + +\p +\v 1 As I am going to demonstrate a most philosophical proposition, namely, that religious reasoning is absolute master of the emotions. I would willingly advise you to give the utmost heed to philosophy. +\v 2 For reason is necessary to everyone as a step to science. In addition, it embraces the praise of self-control, the highest virtue. +\v 3 If, then, reasoning appears to hold the mastery over the emotions which stand in the way of temperance, such as gluttony and lust, +\v 4 it surely also and manifestly rules over the affections which are contrary to justice, such as malice, and of those which are hindrances to courage, such as wrath, pain, and fear. +\v 5 Perhaps some may ask, “How is it, then, that reasoning, if it rules the emotions, isn’t also master of forgetfulness and ignorance?” They attempt a ridiculous argument. +\v 6 For reasoning does not rule over its own emotions, but over those that are contrary to justice, courage, temperance, and self-control; and yet over these, so as to withstand, without destroying them. +\p +\v 7 I might prove to you from many other considerations, that religious reasoning is sole master of the emotions; +\v 8 but I will prove it with the greatest force from the fortitude of Eleazar, and seven kindred, and their mother, who suffered death in defense of virtue. +\v 9 For all these, treating pains with contempt even to death, by this contempt, demonstrated that reasoning has command over the emotions. +\v 10 For their virtues, then, it is right that I should commend those men who died with their mother at this time on behalf of nobility and goodness; and for their honors, I may count them blessed. +\v 11 For they, winning admiration not only from men in general, but even from the persecutors, for their courage and endurance, became the means of the destruction of the tyranny against their nation, having conquered the tyrant by their endurance, so that by them their country was purified. +\v 12 But we may now at once enter upon the question, having commenced, as is our custom, with laying down the doctrine, and so proceed to the account of these people, giving glory to the all-wise God. +\p +\v 13 Therefore the question whether reasoning is absolute master of the emotions. +\v 14 Let’s determine, then, what reasoning is and what emotion is, and how many forms of emotion there are, and whether reasoning rules over all of these. +\v 15 Reasoning is intellect accompanied by a life of righteousness, putting foremost the consideration of wisdom. +\v 16 Wisdom is a knowledge of divine and human things, and of their causes. +\v 17 This is contained in the education of the law, by means of which we learn divine things reverently and human things profitably. +\v 18 The forms of wisdom are self-control, justice, courage, and temperance. +\v 19 The leading one of these is self-control, by whose means, indeed, it is that reasoning rules over the emotions. +\v 20 Of the emotions, pleasure and pain are the two most comprehensive; and they also by nature refer to the soul. +\v 21 There are many attendant affections surrounding pleasure and pain. +\v 22 Before pleasure is lust; and after pleasure, joy. +\v 23 Before pain is fear; and after pain is sorrow. +\v 24 Wrath is an affection, common to pleasure and to pain, if any one will pay attention when it comes upon him. +\v 25 There exists in pleasure a malicious disposition, which is the most complex of all the affections. +\v 26 In the soul, it is arrogance, love of money, thirst for honor, contention, faithlessness, and the evil eye. +\v 27 In the body, it is greediness, indiscriminate eating, and solitary gluttony. +\p +\v 28 As pleasure and pain are, therefore, two growths out of the body and the soul, so there are many offshoots of these emotions. +\v 29 Reasoning, the universal farmer, purging and pruning each of these, tying up, watering, and transplanting, in every way improves the materials of the morals and affections. +\v 30 For reasoning is the leader of the virtues, but it is the sole ruler of the emotions. +\p Observe then first, through the very things which stand in the way of temperance, that reasoning is absolute ruler of the emotions. +\v 31 Now temperance consists of a command over the lusts. +\v 32 But of the lusts, some belong to the soul and others to the body. Reasoning appears to rule over both. +\v 33 Otherwise, how is it that when urged on to forbidden meats, we reject the gratification which would come from them? Isn’t it because reasoning is able to command the appetites? I believe so. +\v 34 Hence it is, then, that when craving seafood, birds, four-footed animals, and all kinds of food which are forbidden to us by the law, we withhold ourselves through the mastery of reasoning. +\v 35 For the affections of our appetites are resisted by the temperate understanding, and bent back again, and all the impulses of the body are reined in by reasoning. +\c 2 +\p +\v 1 Is it any wonder? If the lusts of the soul, after participation with what is beautiful, are frustrated, +\v 2 on this ground, therefore, the temperate Joseph is praised in that by reasoning, he subdued, on reflection, the indulgence of the senses. +\v 3 For, although young, and ripe for sexual intercourse, he nullified by reasoning the stimulus of his emotions. +\v 4 It isn’t merely the stimulus of sensual indulgence, but that of every desire, that reasoning is able to master. +\v 5 For instance, the law says, “You shall not covet your neighbor’s wife, nor anything that belongs to your neighbor.” +\v 6 Now, then, since it is the law which has forbidden us to desire, I shall much the more easily persuade you, that reasoning is able to govern our lusts, just as it does the affections which are impediments to justice. +\v 7 Since in what way is a solitary eater, a glutton, and a drunkard reclaimed, unless it is clear that reasoning is lord of the emotions? +\v 8 Therefore, a man who regulates his course by the law, even if he is a lover of money, immediately puts pressure on his own disposition by lending to the needy without interest, and cancelling the debt on the seventh year. +\v 9 If a man is greedy, he is ruled by the law acting through reasoning, so that he doesn’t glean his harvest crops or vintage. In reference to other points we may perceive that it is reasoning that conquers his emotions. +\v 10 For the law conquers even affection toward parents, not surrendering virtue on their account. +\v 11 It prevails over love for one’s wife, rebuking her when she breaks the law. +\v 12 It lords it over the love of parents toward their children, for they punish them for vice. It domineers over the intimacy of friends, reproving them when wicked. +\v 13 Don’t think it is a strange assertion that reasoning can on behalf of the law conquer even enmity. +\v 14 It doesn’t allow cutting down the fruit trees of an enemy, but preserves them from the destroyers, and collects their fallen ruins. +\v 15 Reason appears to be master of the more violent emotions, like love of empire, empty boasting, and slander. +\v 16 For the temperate understanding repels all these malignant emotions, as it does wrath; for it masters even this. +\v 17 Thus Moses, when angered against Dathan and Abiram, did nothing to them in wrath, but regulated his anger by reasoning. +\v 18 For the temperate mind is able, as I said, to be superior to the emotions, and to correct some and destroy others. +\v 19 For why else did our most wise father Jacob blame Simeon and Levi for having irrationally slain the whole race of the Shechemites, saying, “Cursed be their anger!”? +\v 20 For if reasoning didn’t possess the power of subduing angry affections, he would not have said this. +\v 21 For at the time when God created man, he implanted within him his emotions and moral nature. +\v 22 At that time he enthroned the mind above all as the holy leader, through the medium of the senses. +\v 23 He gave a law to this mind, by living according to which it will maintain a temperate, just, good, and courageous reign. +\v 24 How, then, a man may say, if reasoning is master of the emotions, has it no control over forgetfulness and ignorance? +\c 3 +\p +\v 1 The argument is exceedingly ridiculous, for reasoning doesn’t appear to rule over its own affections, but over those of the body, +\v 2 in such a way as that any one of you may not be able to root out desire, but reasoning will enable you to avoid being enslaved to it. +\v 3 One may not be able to root out anger from the soul, but it is possible to withstand anger. +\v 4 Any one of you may not be able to eradicate malice, but reasoning has force to work with you to prevent you yielding to malice. +\v 5 For reasoning is not an eradicator, but an antagonist of the emotions. +\p +\v 6 This may be more clearly comprehended from the thirst of King David. +\v 7 For after David had been attacking the Philistines the whole day, he with the soldiers of his nation killed many of them; +\v 8 then when evening came, sweating and very weary, he came to the royal tent, around which the entire army of our ancestors was encamped. +\v 9 Now all the rest of them were at supper; +\v 10 but the king, being very much thirsty, although he had numerous springs, could not by their means quench his thirst; +\v 11 but a certain irrational longing for the water in the enemy’s camp grew stronger and fiercer upon him, undid and consumed him. +\v 12 Therefore his bodyguards being troubled at this longing of the king, two valiant young soldiers, respecting the desire of the king, fully armed themselves, and taking a pitcher, got over the ramparts of the enemies. +\v 13 Unperceived by the guardians of the gate, they went throughout the whole camp of the enemy in quest. +\v 14 Having boldly discovered the fountain, they filled out of it the drink for the king. +\v 15 But he, though parched with thirst, reasoned that a drink regarded of equal value to blood would be terribly dangerous to his soul. +\v 16 Therefore, setting up reasoning in opposition to his desire, he poured out the drink to God. +\v 17 For the temperate mind has power to conquer the pressure of the emotions, to quench the fires of excitement, +\v 18 and to wrestle down the pains of the body, however excessive, and through the excellency of reasoning, to spurn all the assaults of the emotions. +\v 19 But the occasion now invites us to give an illustration of temperate reasoning from history. +\v 20 For at a time when our fathers were in possession of undisturbed peace through obedience to the law and were prosperous, so that Seleucus Nicanor, the king of Asia, both assigned them money for divine service, and accepted their form of government, +\v 21 then certain people, bringing in new things contrary to the public harmony, in various ways fell into calamities. +\c 4 +\p +\v 1 For a certain man named Simon, who was in opposition to an honorable and good man who once held the high priesthood for life, named Onias. After slandering Onias in every way, Simon couldn’t injure him with the people, so he went away as an exile, with the intention of betraying his country. +\v 2 When coming to Apollonius, the military governor of Syria, Phoenicia, and Cilicia, he said, +\v 3 “Having good will to the king’s affairs, I have come to inform you that tens of thousands in private wealth is laid up in the treasuries of Jerusalem which do not belong to the temple, but belong to King Seleucus.” +\v 4 Apollonius, acquainting himself with the particulars of this, praised Simon for his care of the king’s interests, and going up to Seleucus informed him of the treasure. +\v 5 Getting authority about it, and quickly advancing into our country with the accursed Simon and a very heavy force, +\v 6 he said that he came with the commands of the king that he should take the private money of the treasury. +\v 7 The nation, indignant at this proclamation, and replying to the effect that it was extremely unfair that those who had committed deposits to the sacred treasury should be deprived of them, resisted as well as they could. +\v 8 But Appolonius went away with threats into the temple. +\v 9 The priests, with the women and children, asked God to throw his shield over the holy, despised place, +\v 10 and Appolonius was going up with his armed force to seize the treasure, when angels from heaven appeared riding on horseback, all radiant in armor, filling them with much fear and trembling. +\v 11 Apollonius fell half dead on the court which is open to all nations, and extended his hands to heaven, and implored the Hebrews, with tears, to pray for him, and take away the wrath of the heavenly army. +\v 12 For he said that he had sinned, so as to be consequently worthy of death, and that if he were saved, he would proclaim to all people the blessedness of the holy place. +\v 13 Onias the high priest, induced by these words, although for other reasons anxious that King Seleucus wouldn’t suppose that Apollonius was slain by human device and not by Divine punishment, prayed for him; +\v 14 and he being thus unexpectedly saved, departed to report to the king what had happened to him. +\v 15 But on the death of Seleucus the king, his son Antiochus Epiphanes succeeded to the kingdom—a terrible man of arrogant pride. +\p +\v 16 He, having deposed Onias from the high priesthood, appointed his brother Jason to be high priest, +\v 17 who had made a covenant, if he would give him this authority, to pay yearly three thousand six hundred and sixty talents. +\v 18 He committed to him the high priesthood and rulership over the nation. +\v 19 He both changed the manner of living of the people, and perverted their civil customs into all lawlessness. +\v 20 So that he not only erected a gymnasium on the very citadel of our country, but neglected the guardianship of the temple. +\v 21 Because of that, Divine vengeance was grieved and instigated Antiochus himself against them. +\v 22 For being at war with Ptolemy in Egypt, he heard that on a report of his death being spread abroad, the inhabitants of Jerusalem had exceedingly rejoiced, and he quickly marched against them. +\v 23 Having subdued them, he established a decree that if any of them lived according to the ancestral laws, he should die. +\v 24 When he could by no means destroy by his decrees the obedience to the law of the nation, but saw all his threats and punishments without effect, +\v 25 for even women, because they continued to circumcise their children, were flung down a precipice along with them, knowing beforehand of the punishment. +\v 26 When, therefore, his decrees were disregarded by the people, he himself compelled by means of tortures every one of this race, by tasting forbidden meats, to renounce the Jewish religion. +\c 5 +\p +\v 1 The tyrant Antiochus, therefore, sitting in public state with his assessors upon a certain lofty place, with his armed troops standing in a circle around him, +\v 2 commanded his spearbearers to seize every one of the Hebrews, and to compel them to taste swine’s flesh and things offered to idols. +\v 3 Should any of them be unwilling to eat the accursed food, they were to be tortured on the wheel and so killed. +\v 4 When many had been seized, a foremost man of the assembly, a Hebrew, by name Eleazar, a priest by family, by profession a lawyer, and advanced in years, and for this reason known to many of the king’s followers, was brought near to him. +\p +\v 5 Antiochus, seeing him, said, +\v 6 “I would counsel you, old man, before your tortures begin, to taste the swine’s flesh, and save your life; for I feel respect for your age and hoary head, which since you have had so long, you appear to me to be no philosopher in retaining the superstition of the Jews. +\v 7 For therefore, since nature has conferred upon you the most excellent flesh of this animal, do you loathe it? +\v 8 It seems senseless not to enjoy what is pleasant, yet not disgraceful; and from notions of sinfulness, to reject the gifts of nature. +\v 9 You will be acting, I think, still more senselessly, if you follow vain conceits about the truth. +\v 10 You will, moreover, be despising me to your own punishment. +\v 11 Won’t you awake from your trifling philosophy, give up the folly of your notions, and regaining understanding worthy of your age, search into the truth of an expedient course? +\v 12 Won’t you respect my kindly admonition and have pity on your own years? +\v 13 For bear in mind that if there is any power which watches over this religion of yours, it will pardon you for all transgressions of the law which you commit through compulsion.” +\p +\v 14 While the tyrant incited him in this manner to the unlawful eating of meat, Eleazar begged permission to speak. +\v 15 Having received permission to speak, he began to address the people as follows: +\v 16 “We, O Antiochus, who are persuaded that we live under a divine law, consider no compulsion to be so forcible as obedience to that law. +\v 17 Therefore we consider that we ought not to transgress the law in any way. +\v 18 Indeed, were our law (as you suppose) not truly divine, and if we wrongly think it divine, we would have no right even in that case to destroy our sense of religion. +\v 19 Don’t think that eating unclean meat is a trifling offense. +\v 20 For transgression of the law, whether in small or great matters, is of equal importance; +\v 21 for in either case the law is equally slighted. +\v 22 But you deride our philosophy, as though we lived in it irrationally. +\v 23 Yet it instructs us in self-control, so that we are superior to all pleasures and lusts; and it trains us in courage, so that we cheerfully undergo every grievance. +\v 24 It instructs us in justice, so that in all our dealings we render what is due. It teaches us piety, so that we properly worship the one and only God. +\v 25 That is why we don’t eat the unclean; for believing that the law was established by God, we are convinced that the Creator of the world, in giving his laws, sympathizes with our nature. +\v 26 Those things which are suitable for our souls, he has directed us to eat; but those which are not, he has forbidden. +\v 27 But, tyrant-like, you not only force us to break the law, but also to eat, that you may ridicule us as we thus profanely eat. +\v 28 But you won’t have this cause of laughter against me, +\v 29 nor will I transgress the sacred oaths of my forefathers to keep the law. +\v 30 No, not if you pluck out my eyes, and consume my entrails. +\v 31 I am not so old, and void of courage as to not be youthful in reason and in defense of my religion. +\v 32 Now then, prepare your wheels, and kindle a fiercer flame. +\v 33 I will not so pity my old age, as on my account to break the law of my country. +\v 34 I will not play false to you, O law, my instructor, or forsake you, O beloved self-control! +\v 35 I will not put you to shame, O philosopher Reason, or deny you, O honored priesthood and knowledge of the law. +\v 36 Mouth! You shall not pollute my old age, nor the full stature of a perfect life. +\v 37 My ancestors will receive me as pure, not having feared your compulsion, even to death. +\v 38 For you will rule like a tyrant over the ungodly, but you will not lord it over my thoughts about religion, either by your arguments, or through deeds.” +\c 6 +\p +\v 1 When Eleazar had in this manner answered the exhortations of the tyrant, the spearbearers came up, and rudely dragged Eleazar to the instruments of torture. +\v 2 First, they stripped the old man, adorned as he was with the beauty of piety. +\v 3 Then tying back his arms and hands, they disdainfully flogged him. +\v 4 A herald opposite cried out, “Obey the commands of the king!” +\p +\v 5 But the high-minded and truly noble Eleazar, as one tortured in a dream, ignored it. +\v 6 But raising his eyes on high to heaven, the old man’s flesh was stripped off by the scourges, and his blood streamed down, and his sides were pierced through. +\v 7 Falling on the ground from his body having no power to endure the pains, he still kept his reasoning upright and unbending. +\v 8 Then one of the harsh spearbearers rushed at him and began to kick him in the side to force him to get up again after he fell. +\v 9 But he endured the pains, despised the cruelty, and persevered through the indignities. +\v 10 Like a noble athlete, the old man, when struck, vanquished his torturers. +\v 11 His face sweating, and he panting for breath, he was admired even by the torturers for his courage. +\p +\v 12 Therefore, partly in pity for his old age, +\v 13 partly from the sympathy of acquaintance, and partly in admiration of his endurance, some of the attendants of the king said, +\v 14 “Why do you unreasonably destroy yourself, O Eleazar, with these miseries? +\v 15 We will bring you some meat cooked by yourself, and you can save yourself by pretending that you have eaten swine’s flesh.” +\p +\v 16 Eleazar, as though the advice more painfully tortured him, cried out, +\v 17 “Let us who are children of Abraham not be so evil advised as by giving way to make use of an unbecoming pretense. +\v 18 For it would be irrational, if having lived up to old age in all truth, and having scrupulously guarded our character for it, we would now turn back +\v 19 and ourselves become a pattern of impiety to the young, as being an example of eating pollution. +\v 20 It would be disgraceful if we would live on some short time, and that scorned by all men for cowardice, +\v 21 and be condemned by the tyrant for cowardice by not contending to the death for our divine law. +\v 22 Therefore you, O children of Abraham, die nobly for your religion. +\v 23 You spearbearers of the tyrant, why do you linger?” +\p +\v 24 Beholding him so high-minded against misery, and not changing at their pity, they led him to the fire. +\v 25 Then with their wickedly contrived instruments they burned him on the fire, and poured stinking fluids down into his nostrils. +\p +\v 26 He being at length burned down to the bones, and about to expire, raised his eyes Godward, and said, +\v 27 “You know, O God, that when I might have been saved, I am slain for the sake of the law by tortures of fire. +\v 28 Be merciful to your people, and be satisfied with the punishment of me on their account. +\v 29 Let my blood be a purification for them, and take my life in exchange for theirs.” +\v 30 Thus speaking, the holy man departed, noble in his torments, and even to the agonies of death resisted in his reasoning for the sake of the law. +\v 31 Confessedly, therefore, religious reasoning is master of the emotions. +\v 32 For had the emotions been superior to reasoning, I would have given them the witness of this mastery. +\v 33 But now, since reasoning conquered the emotions, we befittingly award it the authority of first place. +\v 34 It is only fair that we should allow that the power belongs to reasoning, since it masters external miseries. +\v 35 It would be ridiculous if it weren’t so. I prove that reasoning has not only mastered pains, but that it is also superior to the pleasures, and withstands them. +\c 7 +\p +\v 1 The reasoning of our father Eleazar, like a first-rate pilot, steering the vessel of piety in the sea of emotions, +\v 2 and flouted by the threats of the tyrant, and overwhelmed with the breakers of torture, +\v 3 in no way shifted the rudder of piety until it sailed into the harbor of victory over death. +\v 4 No besieged city has ever held out against many and various war machines as that holy man did when his pious soul was tried with the fiery trial of tortures and rackings and moved his besiegers through the religious reasoning that shielded him. +\v 5 For father Eleazar, projecting his disposition, broke the raging waves of the emotions as with a jutting cliff. +\v 6 O priest worthy of the priesthood! You didn’t pollute your sacred teeth, nor make your appetite, which had always embraced the clean and lawful, a partaker of profanity. +\v 7 O harmonizer with the law, and sage devoted to a divine life! +\v 8 Of such a character ought those to be who perform the duties of the law at the risk of their own blood, and defend it with generous sweat by sufferings even to death. +\v 9 You, father, have gloriously established our right government by your endurance; and making of much account our past service, prevented its destruction, and by your deeds, have made credible the words of philosophy. +\v 10 O aged man of more power than tortures, elder more vigorous than fire, greatest king over the emotions, Eleazar! +\v 11 For as father Aaron, armed with a censer, hastening through the consuming fire, vanquished the flame-bearing angel, +\v 12 so, Eleazar, the descendant of Aaron, wasted away by the fire, didn’t give up his reasoning. +\v 13 What is most wonderful is that though he was an old man, though the labors of his body were now spent, his muscles were relaxed, and his sinews worn out, he recovered youth. +\v 14 By the spirit of reasoning, and the reasoning of Isaac, he rendered powerless the many-headed rack. +\v 15 O blessed old age, and reverend hoar head, and life obedient to the law, which the faithful seal of death perfected. +\v 16 If, then, an old man, through religion, despised tortures even to death, then certainly religious reasoning is ruler of the emotions. +\v 17 But perhaps some might say, “It is not all who conquer emotions, as not all possess wise reasoning.” +\v 18 But those who have meditated upon religion with their whole heart, these alone can master the emotions of the flesh: +\v 19 they who believe that to God they don’t die; for, as our forefathers, Abraham, Isaac, and Jacob, they live to God. +\v 20 This circumstance, then, is by no means an objection, that some who have weak reasoning are governed by their emotions, +\v 21 since what person, walking religiously by the whole rule of philosophy, and believing in God, +\v 22 and knowing that it is a blessed thing to endure all kinds of hardships for virtue, would not, for the sake of religion, master his emotion? +\v 23 For only the wise and brave man is lord over his emotions. +\v 24 This is why even boys, trained with the philosophy of religious reasoning, have conquered still more bitter tortures; +\v 25 for when the tyrant was manifestly vanquished in his first attempt, in being unable to force the old man to eat the unclean thing, +\c 8 +\nb +\v 1 then, indeed, vehemently swayed with emotion, he commanded to bring others of the adult Hebrews, and if they would eat of the unclean thing, to let them go when they had eaten; but if they objected, to torment them more grievously. +\v 2 The tyrant having given this charge, seven kindred were brought into his presence, along with their aged mother. They were handsome, modest, well-born, and altogether comely. +\v 3 When the tyrant saw them encircling their mother as in a dance, he was pleased with them. Being struck with their becoming and innocent manner, smiled at them, and calling them near, said, +\v 4 “O youths, with favorable feelings, I admire the beauty of each of you. Greatly honouring so numerous a band of kindred, I not only counsel you not to share the madness of the old man who has been tortured before, +\v 5 but I beg you to yield, and to enjoy my friendship; for I possess the power, not only of punishing those who disobey my commands, but of doing good to those who obey them. +\v 6 Put confidence in me, then, and you will receive places of authority in my government, if you forsake your national way of life, +\v 7 and, conforming to the Greek way of life, alter your rule and revel in youth’s delights. +\v 8 For if you provoke me by your disobedience, you will compel me to destroy every one of you with terrible punishments by tortures. +\v 9 Have mercy, then, upon your own selves, whom I, although an enemy, am compassionate for your age and attractive appearance. +\v 10 Won’t you consider this: that if you disobey, there will be nothing left for you but to die in torture?” +\p +\v 11 When he had said this, he ordered the instruments of torture to be brought forward, that fear might prevail upon them to eat unclean meat. +\v 12 When the spearman brought forward the wheels, the racks, the hooks, racks, caldrons, pans, finger-racks, iron hands and wedges, and bellows, the tyrant continued: +\v 13 “Fear, young men, and the righteousness which you worship will be merciful to you if you transgress because of compulsion.” +\p +\v 14 Now they having listened to these words of persuasion, and seeing the fearful instruments, not only were not afraid, but even answered the arguments of the tyrant, and through their good reasoning destroyed his power. +\v 15 Now let’s consider the matter. Had any of them been weak-spirited and cowardly among them, what reasoning would they have employed but these? +\v 16 “O wretched that we are, and exceedingly senseless! When the king exhorts us, and calls us to his bounty, should we not obey him? +\v 17 Why do we cheer ourselves with vain counsels, and venture upon a disobedience bringing death? +\v 18 Shall we not fear, O kindred, the instruments of torture and weigh the threatenings of torment and shun this vain-glory and destructive pride? +\v 19 Let’s have compassion upon our age and relent over the years of our mother. +\v 20 Let’s bear in mind that we will be dying as rebels. +\v 21 Divine Justice will pardon us if we fear the king through necessity. +\v 22 Why withdraw ourselves from a most sweet life, and deprive ourselves of this pleasant world? +\v 23 Let’s not oppose necessity, nor seek vain-glory by our own torture. +\v 24 The law itself wouldn’t arbitrarily put us to death because we dread torture. +\v 25 Why has such angry zeal taken root in us, and such fatal obstinacy approved itself to us, when we might live unmolested by the king?” +\p +\v 26 But the young men didn’t say or think anything of this kind when about to be tortured. +\v 27 For they were well aware of the sufferings, and masters of the pains. +\v 28-29 So that as soon as the tyrant had ceased counselling them to eat the unclean, they all with one voice, as from the same heart said, +\c 9 +\nb +\v 1 “Why do you delay, O tyrant? For we are more ready to die than to transgress the injunctions of our fathers. +\v 2 We would be disgracing our fathers if we didn’t obey the law, and take knowledge for our guide. +\v 3 O tyrant, counselor of law-breaking, do not, hating us as you do, pity us more than we pity ourselves. +\v 4 For we consider your escape to be worse than death. +\v 5 You try to scare us by threatening us with death by tortures, as though you had learned nothing by the death of Eleazar. +\v 6 But if aged men of the Hebrews have died in the cause of religion after enduring torture, more rightly should we younger men die, scorning your cruel tortures, which our aged instructor overcame. +\v 7 Make the attempt, then, O tyrant. If you put us to death for our religion, don’t think that you harm us by torturing us. +\v 8 For we through this ill-treatment and endurance will gain the rewards of virtue. +\v 9 But you, for the wicked and despotic slaughter of us, will, from the Divine vengeance, endure eternal torture by fire.” +\p +\v 10 When they had said this, the tyrant was not only exasperated against them for being disobedient, but enraged with them for being ungrateful. +\v 11 So, at his bidding, the torturers brought the oldest of them, and tearing through his tunic, bound his hands and arms on each side with thongs. +\v 12 When they had labored hard without effect in scourging him, they hurled him on the wheel. +\v 13 The noble youth, extended upon this, became dislocated. +\v 14 With every member disjointed, he denounced the tyrant, saying, +\v 15 “O most accursed tyrant, and enemy of heavenly justice, and cruel-hearted, I am no murderer, nor sacrilegious man, whom you torture, but a defender of the Divine law.” +\p +\v 16 And when the spearmen said, “Consent to eat, that you may be released from your tortures,” +\v 17 he answered, “Not so powerful, O accursed lackeys, is your wheel, as to stifle my reasoning. Cut my limbs, and burn my flesh, and twist my joints. +\v 18 For through all my torments I will convince you that the children of the Hebrews are alone unconquered on behalf of virtue.” +\p +\v 19 While he was saying this, they heaped up fuel, and setting fire to it, strained him on the wheel still more. +\v 20 The wheel was defiled all over with blood. The hot ashes were quenched by the droppings of gore, and pieces of flesh were scattered about the axles of the machine. +\v 21 Although the framework of his bones was now destroyed, the high-minded and Abrahamic youth didn’t groan. +\v 22 But, as though transformed by fire into immortality, he nobly endured the rackings, saying, +\v 23 “Imitate me, O kindred. Never desert your station, nor renounce my brotherhood in courage. Fight the holy and honorable fight of religion, +\v 24 by which means our just and paternal Providence, becoming merciful to the nation, will punish the pestilent tyrant.” +\v 25 Saying this, the revered youth abruptly closed his life. +\p +\v 26 When all admired his courageous soul, the spearmen brought forward him who was second oldest, and having put on iron gauntlets with sharp hooks, bound him to the rack. +\v 27 When, on enquiring whether he would eat before he was tortured, they heard his noble sentiment. +\v 28 After they with the iron gauntlets had violently dragged all the flesh from the neck to the chin, the panther-like animals tore off the very skin of his head, but he, bearing with firmness this misery, said, +\v 29 “How sweet is every form of death for the religion of our fathers!” Then he said to the tyrant, +\v 30 “Don’t you think, most cruel of all tyrants, that you are now tortured more than I, finding your arrogant conception of tyranny conquered by our perseverance in behalf of our religion? +\v 31 For I lighten my suffering by the pleasures which are connected with virtue. +\v 32 But you are tortured with threatenings for impiety. You won’t escape, most corrupt tyrant, the vengeance of Divine wrath.” +\c 10 +\p +\v 1 Now this one endured this praiseworthy death. The third was brought along, and exhorted by many to taste and save his life. +\v 2 But he cried out and said, “Don’t you know that the father of those who are dead is my father also, and that the same mother bore me, and that I was brought up in the same way? +\v 3 I don’t renounce the noble relationship of my kindred. +\v 4 Now then, whatever instrument of vengeance you have, apply it to my body, for you aren’t able to touch my soul, even if you want to.” +\v 5 But they, highly incensed at his boldness of speech, dislocated his hands and feet with racking engines, and wrenching them from their sockets, dismembered him. +\v 6 They dragged around his fingers, his arms, his legs, and his ankles. +\v 7 Not being able by any means to strangle him, they tore off his skin, together with the extreme tips of his fingers, and then dragged him to the wheel, +\v 8 around which his vertebral joints were loosened, and he saw his own flesh torn to shreds, and streams of blood flowing from his entrails. +\v 9 When about to die, he said, +\v 10 “We, O accursed tyrant, suffer this for the sake of Divine education and virtue. +\v 11 But you, for your impiety and blood shedding, will endure unceasing torments.” +\p +\v 12 Thus having died worthily of his kindred, they dragged forward the fourth, saying, +\v 13 “Don’t share the madness of your kindred, but respect the king and save yourself.” +\p +\v 14 But he said to them, “You don’t have a fire so scorching as to make me play the coward. +\v 15 By the blessed death of my kindred, and the eternal punishment of the tyrant, and the glorious life of the pious, I will not repudiate the noble brotherhood. +\v 16 Invent, O tyrant, tortures, that you may learn, even through them, that I am the brother of those tormented before.” +\p +\v 17 When he had said this, the blood-thirsty, murderous, and unholy Antiochus ordered his tongue to be cut out. +\v 18 But he said, “Even if you take away the organ of speech, God still hears the silent. +\v 19 Behold, my tongue is extended, cut it off; for in spite of that you won’t silence our reasoning. +\v 20 We gladly lose our limbs on behalf of God. +\v 21 But God will speedily find you, since you cut off the tongue, the instrument of divine melody.” +\c 11 +\p +\v 1 When he had died, disfigured in his torments, the fifth leaped forward, and said, +\v 2 “I don’t intend, O tyrant, to get excused from the torment which is on behalf of virtue. +\v 3 But I have come of my own accord, that by my death you may owe heavenly vengeance and punishment for more crimes. +\v 4 O you hater of virtue and of men, what have we done that you thus revel in our blood? +\v 5 Does it seem evil to you that we worship the Founder of all things, and live according to his surpassing law? +\v 6 But this is worthy of honors, not torments, +\v 7 if you had been capable of the higher feelings of men, and possessed the hope of salvation from God. +\v 8 Behold now, being alien from God, you make war against those who are religious toward God.” +\p +\v 9 As he said this, the spearbearers bound him and drew him to the rack, +\v 10 to which binding him at his knees, and fastening them with iron fetters, they bent down his loins upon the wedge of the wheel; and his body was then dismembered, scorpion-fashion. +\v 11 With his breath thus confined, and his body strangled, he said, +\v 12 “A great favor you bestow upon us, O tyrant, by enabling us to manifest our adherence to the law by means of nobler sufferings.” +\p +\v 13 He also being dead, the sixth, quite a youth, was brought out. On the tyrant asking him whether he would eat and be delivered, he said, +\v 14 “I am indeed younger than my brothers, but in understanding I am as old; +\v 15 for having been born and reared to the same end. We are bound to die also on behalf of the same cause. +\v 16 So that if you think it is proper to torment us for not eating the unclean, then torment!” +\p +\v 17 As he said this, they brought him to the wheel. +\v 18 Extended upon this, with limbs racked and dislocated, he was gradually roasted from beneath. +\v 19 Having heated sharp spits, they approached them to his back; and having transfixed his sides, they burned away his entrails. +\v 20 He, while tormented, said, “O good and holy contest, in which for the sake of religion, we kindred have been called to the arena of pain, and have not been conquered. +\v 21 For religious understanding, O tyrant, is unconquered. +\v 22 Armed with upright virtue, I also will depart with my kindred. +\v 23 I, too, bearing with me a great avenger, O inventor of tortures, and enemy of the truly pious. +\v 24 We six youths have destroyed your tyranny. +\v 25 For isn’t your inability to overrule our reasoning, and to compel us to eat the unclean, your destruction? +\v 26 Your fire is cold to us. Your racks are painless, and your violence harmless. +\v 27 For the guards not of a tyrant but of a divine law are our defenders. Through this we keep our reasoning unconquered.” +\c 12 +\p +\v 1 When he, too, had undergone blessed martyrdom, and died in the cauldron into which he had been thrown, the seventh, the youngest of all, came forward, +\v 2 whom the tyrant pitying, though he had been dreadfully reproached by his kindred, +\v 3 seeing him already encompassed with chains, had him brought nearer, and endeavored to counsel him, saying, +\v 4 “You see the end of the madness of your kindred, for they have died in torture through disobedience. You, if disobedient, having been miserably tormented, will yourself perish prematurely. +\v 5 But if you obey, you will be my friend, and have a charge over the affairs of the kingdom.” +\v 6 Having thus exhorted him, he sent for the boy’s mother, that, by showing compassion to her for the loss of so many sons, he might incline her, through the hope of safety, to render the survivor obedient. +\p +\v 7 He, after his mother had urged him on in the Hebrew tongue, (as we will soon relate) said, +\v 8 “Release me that I may speak to the king and all his friends.” +\v 9 They, rejoicing exceedingly at the promise of the youth, quickly let him go. +\v 10 He, running up to the pans, said, +\v 11 “Impious tyrant, and most blasphemous man, were you not ashamed, having received prosperity and a kingdom from God, to kill His servants, and to rack the doers of godliness? +\v 12 Therefore the divine vengeance is reserving you for eternal fire and torments, which will cling to you for all time. +\v 13 Weren’t you ashamed, man as you are, yet most savage, to cut out the tongues of men of like feeling and origin, and having thus abused to torture them? +\v 14 But they, bravely dying, fulfilled their religion toward God. +\v 15 But you will groan as you deserve for having slain without cause the champions of virtue. +\v 16 Therefore,” he continued, “I myself, being about to die, +\v 17 will not forsake my kindred. +\v 18 I call upon the God of my fathers to be merciful to my race. +\v 19 But you, both living and dead, he will punish.” +\v 20 Thus having prayed, he hurled himself into the pans; and so expired. +\c 13 +\p +\v 1 If then, the seven kindred despised troubles even to death, it is admitted on all sides that righteous reasoning is absolute master over the emotions. +\v 2 For just as if they had eaten of the unholy as slaves to the emotions, we would have said that they had been conquered by them. +\v 3 Now it is not so. But by means of the reasoning which is praised by God, they mastered their emotions. +\v 4 It is impossible to overlook the leadership of reflection, for it gained the victory over both emotions and troubles. +\v 5 How, then, can we avoid according to these men mastery of emotion through right reasoning, since they didn’t withdraw from the pains of fire? +\v 6 For just as by means of towers projecting in front of harbors men break the threatening waves, and thus assure a still course to vessels entering port, +\v 7 so that seven-towered right-reasoning of the young men, securing the harbour of religion, conquered the tempest of emotions. +\v 8 For having arranged a holy choir of piety, they encouraged one another, saying, +\v 9 “Brothers, may we die brotherly for the law. Let us imitate the three young men in Assyria who despised the equally afflicting furnace. +\v 10 Let’s not be cowards in the manifestation of piety.” +\v 11 One said, “Courage, brother!” and another, “Nobly endure!” +\v 12 Another said, “Remember of what stock you are;” and by the hand of our father Isaac endured to be slain for the sake of piety. +\v 13 One and all, looking at each other serene and confident, said, “Let’s sacrifice with all our heart our souls to God who gave them, and employ our bodies for the keeping of the law. +\v 14 Let’s not fear him who thinks he kills; +\v 15 for great is the trial of soul and danger of eternal torment laid up for those who transgress the commandment of God. +\v 16 Let’s arm ourselves, therefore, in the self-control, which is divine reasoning. +\v 17 If we suffer like this, Abraham, Isaac, and Jacob will receive us, and all the fathers will commend us. +\v 18 As each one of the kindred was hauled away, the rest exclaimed, “Don’t disgrace us, O brother, nor falsify those who died before you!” +\p +\v 19 Now you are not ignorant of the charm of brotherhood, which the Divine and all wise Providence has imparted through fathers to children, and has engendered through the mother’s womb. +\v 20 In which these brothers having remained an equal time, and having been formed for the same period, and been increased by the same blood, and having been perfected through the same principle of life, +\v 21 and having been brought forth at equal intervals, and having sucked milk from the same springs, hence their brotherly souls are reared up lovingly together, +\v 22 and increase the more powerfully by reason of this simultaneous rearing, and by daily companionship, and by other education, and exercise in the law of God. +\p +\v 23 Brotherly love being thus sympathetically constituted, the seven kindred had a more sympathetic mutual harmony. +\v 24 For being educated in the same law, and practicing the same virtues, and reared up in a just course of life, they increased this harmony with each other. +\v 25 For the same ardor for what is right and honorable increased their goodwill and harmony toward each other. +\v 26 For it acting along with religion, made their brotherly feeling more desirable to them. +\v 27 And yet, although nature, companionship, and virtuous morals increased their brotherly love, those who were left endured to see their kindred, who were mistreated for their religion, tortured even to death. +\c 14 +\p +\v 1 More that this, they even urged them on to this mistreatment; so that they not only despised pains themselves, but they even got the better of their affections of brotherly love. +\v 2 Reasoning is more royal than a king, and freer than freemen! +\v 3 What a sacred and harmonious concert of the seven kindred as concerning piety! +\v 4 None of the seven youths turned cowardly or shrank back from death. +\v 5 But all of them, as though running the road to immortality, hastened on to death through tortures. +\v 6 For just as hands and feet are moved sympathetically with the directions of the soul, so those holy youths agreed to death for religion’s sake, as through the immortal soul of religion. +\v 7 O holy seven of harmonious kindred! For as the seven days of creation, about religion, +\v 8 so the youths, circling around the number seven, annulled the fear of torments. +\v 9 We now shudder at the recital of the affliction of those young men; but they not only saw, and not only heard the immediate execution of the threat, but undergoing it, persevered; and that through the pains of fire. +\v 10 What could be more painful? For the power of fire, being sharp and quick, speedily dissolved their bodies. +\v 11 Don’t think it wonderful that reasoning ruled over those men in their torments, when even a woman’s mind despised more manifold pains. +\v 12 For the mother of those seven youths endured the rackings of each of her children. +\p +\v 13 Consider how comprehensive is the love of offspring, which draws every one to sympathy of affection, +\v 14 where irrational animals possess a similar sympathy and love for their offspring with men. +\v 15 The tame birds frequenting the roofs of our houses defend their fledglings. +\v 16 Others build their nests, and hatch their young, on the tops of mountains and in the precipices of valleys, and the holes and tops of trees, and keep away the intruder. +\v 17 If not able to do this, they fly circling round them in agony of affection, calling out in their own note, and save their offspring in whatever manner they are able. +\v 18 But why should we point attention to the sympathy toward children shown by irrational animals? +\v 19 Even bees, at the season of honey-making, attack all who approach, and pierce with their sting, as with a sword, those who draw near their hive, and repel them even to death. +\v 20 But sympathy with her children didn’t turn away the mother of the young men, who had a spirit kindred with that of Abraham. +\c 15 +\p +\v 1 O reasoning of the sons, lord over the emotions, and religion more desirable to a mother than children! +\v 2 The mother, when two things were set before her, religion and the safety of her seven sons for a time, on the conditional promise of a tyrant, +\v 3 rather elected the religion which according to God preserves to eternal life. +\v 4 In what way can I describe ethically the affections of parents toward their children, the resemblance of soul and of form impressed into the small type of a child in a wonderful manner, especially through the greater sympathy of mothers with the feelings of those born of them! +\v 5 For by how much mothers are by nature weak in disposition and prolific in offspring, by so much the fonder they are of children. +\v 6 Of all mothers, the mother of the seven was the fondest of children, who in seven childbirths had deeply engendered love toward them. +\v 7 Through her many pains undergone in connection with each one, she was compelled to feel sympathy with them; +\v 8 yet, through fear of God, she neglected the temporary salvation of her children. +\v 9 Not only so, but on account of the excellent disposition to the law, her maternal affection toward them was increased. +\v 10 For they were both just and temperate, and courageous, high-minded, fond of their kindred, and so fond of their mother that even to death they obeyed her by observing the law. +\p +\v 11 Yet, though there were so many circumstances connected with love of children to draw on a mother to sympathy, in the case of none of them were the various tortures able to pervert her principle. +\v 12 But she inclined each one separately and all together to death for religion. +\v 13 O holy nature and parental feeling, and reward of bringing up children, and unconquerable maternal affection! +\v 14 At the racking and roasting of each one of them, the observant mother was prevented by religion from changing. +\v 15 She saw her children’s flesh dissolving around the fire, and their extremities quivering on the ground, and the flesh of their heads dropped forward down to their beards, like masks. +\p +\v 16 O you mother, who was tried at this time with bitterer pangs than those at birth! +\v 17 O you only woman who have produced perfect holiness! +\v 18 Your firstborn, expiring, didn’t turn you, nor the second, looking miserable in his torments, nor the third, breathing out his soul. +\v 19 You didn’t weep when you saw each of their eyes looking sternly at their tortures, and their nostrils foreboding death! +\v 20 When you saw children’s flesh heaped upon children’s flesh that had been torn off, heads decapitated upon heads, dead falling upon the dead, and a choir of children turned through torture into a burying ground, you didn’t lament. +\v 21 Not so do siren melodies or songs of swans attract the hearers to listening, O voices of children calling on your mother in the midst of torments! +\v 22 With what and what manner of torments was the mother herself tortured, as her sons were undergoing the wheel and the fires! +\v 23 But religious reasoning, having strengthened her courage in the midst of sufferings, enabled her to forego, for the time, parental love. +\p +\v 24 Although seeing the destruction of seven children, the noble mother, after one embrace, stripped off her feelings through faith in God. +\v 25 For just as in a council room, seeing in her own soul vehement counselors, nature and parentage and love of her children, and the racking of her children, +\v 26 she holding two votes, one for the death, the other for the preservation of her children, +\v 27 didn’t lean to that which would have saved her children for the safety of a brief space. +\v 28 But this daughter of Abraham remembered his holy fortitude. +\p +\v 29 O holy mother of a nation, avenger of the law, defender of religion, and prime bearer in the battle of the affections! +\v 30 O you nobler in endurance than males, and more courageous than men in perseverance! +\v 31 For like Noah’s ship, bearing the world in the world-filling flood, bore up against the waves, +\v 32 so you, the guardian of the law, when surrounded on every side by the flood of emotions, and assaulted by violent storms which were the torments of your children, bore up nobly against the storms against religion. +\c 16 +\p +\v 1 If, then, even a woman, and that an aged one, and the mother of seven children, endured to see her children’s torments even to death, it must be admitted that religious reasoning is master even of the emotions. +\v 2 I have proved, then, that not only men have obtained the mastery of their emotions, but also that a woman despised the greatest torments. +\v 3 The lions around Daniel were not so fierce, nor the furnace of Misael burning with most vehement fires as that natural love of children burned within her, when she saw her seven sons tortured. +\v 4 But with the reasoning of religion the mother quenched emotions so great and powerful. +\v 5 For we must consider also this: that, had the woman been faint hearted, as being their mother, she would have lamented over them, and perhaps might have spoken thus: +\v 6 “Ah! I am wretched and many times miserable, who having born seven sons, have become the mother of none. +\v 7 O seven useless childbirths, and seven profitless periods of labor, and fruitless givings of suck, and miserable nursings at the breast. +\v 8 Vainly, for your sakes, O sons, have I endured many pangs, and the more difficult anxieties of rearing. +\v 9 Alas, of my children, some of you unmarried, and some who have married to no profit, I will not see your children, nor have the joy of being a grandmother. +\v 10 Ah, that I who had many and fair children, should be a lone widow full of sorrows! +\v 11 Nor, should I die, will I have a son to bury me.” But with such a lament as this, the holy and God-fearing mother wept for none of them. +\v 12 Nor did she divert any of them from death, nor grieve for them as for the dead. +\v 13 But as one possessed with an adamant mind, and as one bringing forth again her full number of sons to immortality, she rather urged them to death on behalf of religion. +\v 14 O woman, soldier of God for religion, you, aged and a female, have conquered through endurance even a tyrant; and even though weak, have been found more powerful in deeds and words. +\v 15 For when you were seized along with your children, you stood looking at Eleazar in torture, and said to your sons in the Hebrew tongue, +\v 16 “O sons, the contest is noble, to which you being called as a witness for the nation, strive zealously for the laws of your country. +\v 17 For it would be disgraceful if this old man endured pains for the sake of righteousness, and that you who are younger would be afraid of the tortures. +\v 18 Remember that through God, you obtained existence and have enjoyed it. +\v 19 Therefore, you ought to bear every affliction because of God. +\v 20 For him also our father Abraham was zealous to sacrifice Isaac our progenitor, and didn’t shudder at the sight of his own paternal hand descending down with the sword upon him. +\v 21 The righteous Daniel was cast to the lions; and Ananias, Azarias, and Misael were hurled into a fiery furnace, yet they endured through God. +\v 22 You, then, having the same faith toward God, don’t be troubled. +\v 23 For it is unreasonable that they who know religion wouldn’t stand up against troubles. +\v 24 With these arguments, the mother of seven, exhorting each of her sons, encouraged and persuaded them not to transgress God’s commandment. +\v 25 They saw this, too, that those who die for God, live to God, like Abraham, Isaac, Jacob, and all the patriarchs. +\c 17 +\p +\v 1 Some of the spearbearers said that when she herself was about to be seized for the purpose of being put to death, she threw herself on the pile, rather than let them touch her body. +\v 2 O you mother, who together with seven children destroyed the violence of the tyrant, and rendered void his wicked intentions, and exhibited the nobleness of faith! +\v 3 For you, like a house bravely built on the pillar of your children, bore the shock of tortures without swaying. +\v 4 Cheer up, therefore, O holy-minded mother! Hold the firm hope of your steadfastness with God. +\v 5 Not so gracious does the moon appear with the stars in heaven, as you are established as honorable before God, and fixed in the sky with your sons whom you illuminated with religion to the stars. +\v 6 For your bearing of children was after the manner of a child of Abraham. +\p +\v 7 If it were lawful for us to paint as on a tablet the religion of your story, the spectators wouldn’t shudder at seeing the mother of seven children enduring for the sake of religion various tortures even to death. +\v 8 It would have been a worthwhile thing to have inscribed on the tomb itself these words as a memorial to those of the nation, +\v 9 “Here an aged priest, and an aged woman, and seven sons, are buried through the violence of a tyrant, who wished to destroy the society of the Hebrews. +\v 10 These also avenged their nation, looking to God, and enduring torments to death.” +\v 11 For it was truly a divine contest which was carried through by them. +\v 12 For at that time virtue presided over the contest, approving the victory through endurance, namely, immortality, eternal life. +\v 13 Eleazar was the first to contend. The mother of the seven children entered the contest, and the kindred contended. +\v 14 The tyrant was the antagonist; and the world and living men were the spectators. +\v 15 Reverence for God conquered, and crowned her own athletes. +\v 16 Who didn’t admire those champions of true legislation? Who were not amazed? +\v 17 The tyrant himself, and all their council, admired their endurance, +\v 18 through which, they also now stand beside the divine throne and live a blessed life. +\v 19 For Moses says, “All the saints are under your hands.” +\v 20 These, therefore, having been sanctified through God, have been honored not only with this honor, but that also by the fact that because of them, the enemy didn’t overcome our nation. +\v 21 That tyrant was punished and their country purified. +\v 22 For they became the ransom to the sin of the nation. The Divine Providence saved Israel, which was afflicted before, by the blood of those pious ones and the death that appeased wrath. +\v 23 For the tyrant Antiochus, looking to their courageous virtue and to their endurance in torture, proclaimed that endurance as an example to his soldiers. +\v 24 They proved to be to him noble and brave for land battles and for sieges; and he conquered and stormed the towns of all his enemies. +\c 18 +\p +\v 1 O Israelite children, descendants of the seed of Abraham, obey this law and in every way be religious, +\v 2 knowing that religious reasoning is lord of the emotions, and those not only inward but outward. +\p +\v 3 Therefore those people who gave up their bodies to pains for the sake of religion were not only admired by men, but were deemed worthy of a divine portion. +\v 4 The nation through them obtained peace, and having renewed the observance of the law in their country, drove the enemy out of the land. +\v 5 The tyrant Antiochus was both punished on earth, and is punished now that he is dead; for when he was quite unable to compel the Israelites to adopt foreign customs, and to desert the manner of life of their fathers, +\v 6 then, departing from Jerusalem, he made war against the Persians. +\v 7 The righteous mother of the seven children spoke also as follows to her offspring: “I was a pure virgin, and didn’t go beyond my father’s house, but I took care of the rib from which woman was made. +\v 8 No destroyer of the desert or ravisher of the plain injured me, nor did the destructive, deceitful snake make plunder of my chaste virginity. I remained with my husband during the time of my maturity. +\v 9 When these, my children, arrived at maturity, their father died. He was blessed! For having sought out a life of fertility in children, he was not grieved with a period of loss of children. +\v 10 He used to teach you, when yet with you, the law and the prophets. +\v 11 He used to read to you about the slaying of Abel by Cain, the offering up of Isaac, and the imprisonment of Joseph. +\v 12 He used to tell you of the zealous Phinehas, and informed you of Ananias, Azarias, and Misael in the fire. +\v 13 He used to glorify Daniel, who was in the den of lions, and pronounce him blessed. +\v 14 He used to remind you of the scripture of Esaias, which says, “Even if you pass through the fire, it won’t burn you.” +\v 15 He chanted to you David, the hymn writer, who says, “Many are the afflictions of the just.” +\v 16 He declared the proverbs of Solomon, who says, “He is a tree of life to all those who do His will.” +\v 17 He used to confirm what Ezekiel said: “Will these dry bones live?” +\v 18 For he didn’t forget the song which Moses taught, proclaiming, “I will kill, and I will make alive.” +\v 19 This is our life and the length of our days. +\p +\v 20 O that bitter, and yet not bitter, day when the bitter tyrant of the Greeks, quenching fire with fire in his cruel caldrons, brought with boiling rage the seven sons of the daughter of Abraham to the rack, and to all his torments! +\v 21 He pierced the balls of their eyes, and cut out their tongues, and put them to death with varied tortures. +\v 22 Therefore divine retribution pursued and will pursue the pestilent wretch. +\v 23 But the children of Abraham, with their victorious mother, are assembled together to the choir of their father, having received pure and immortal souls from God. +\v 24 To him be glory forever and ever. Amen. diff --git a/c-sharp/assets/WEB/821ESengWEBUS.SFM b/c-sharp/assets/WEB/821ESengWEBUS.SFM new file mode 100644 index 0000000000..62f94f7312 --- /dev/null +++ b/c-sharp/assets/WEB/821ESengWEBUS.SFM @@ -0,0 +1,543 @@ +\id 1ES - 1 Esdras +\h 1 Esdras +\toc1 The First Book of Esdras +\toc2 1 Esdras +\toc3 1Es +\mt1 The First Book of Esdras +\ip \bk The First Book of Esdras\bk* is recognized as Deuterocanonical Scripture by the Greek Orthodox and Russian Orthodox Churches. It is not recognized by the Roman Catholic Church, but 1 Esdras is placed as an appendix to the Latin Vulgate Bible. +\c 1 + +\p +\v 1 \x + \xo 1:1 \xt 2 Kings 23:21; 2 Chronicles 35:1\x*Josias held the Passover in Jerusalem to his Lord, and offered the Passover the fourteenth day of the first month, +\v 2 having set the priests according to their daily courses, being arrayed in their vestments, in the Lord’s temple. +\v 3 He spoke to the Levites, \x + \xo 1:3 \xt Numbers 3:9\x*the temple servants of Israel, that they should make themselves holy to the Lord, to set the holy ark of the Lord in the house that King Solomon the son of David had built. +\v 4 He said, “You no longer need to carry it on your shoulders. Now therefore serve the Lord your God, and minister to his people Israel, and prepare yourselves by your fathers’ houses and kindred, +\v 5 according to the writing of King David of Israel, and according to the magnificence of Solomon his son. Stand in the holy place according to the divisions of your Levite families who minister in the presence of your kindred the descendants of Israel. +\v 6 Offer the Passover in order, prepare the sacrifices for your kindred, and keep the Passover according to the Lord’s commandment, which was given to Moses. +\p +\v 7 To the people which were present, Josias gave thirty thousand lambs and kids, and three thousand calves. These things were given from the king’s possessions, as he promised, to the people and to the priests and Levites. +\v 8 Helkias, Zacharias, and \f + \fr 1:8 \fq Jehiel, \ft 2 Chronicles 35:8.\f*Esyelus, the rulers of the temple, gave to the priests for the Passover two thousand six hundred sheep, and three hundred calves. +\v 9 Jeconias, Samaias, Nathanael his brother, Sabias, Ochielus, and Joram, captains over thousands, gave to the Levites for the Passover five thousand sheep and seven hundred calves. +\p +\v 10 When these things were done, the priests and Levites, having the unleavened bread, stood in proper order according to the kindred, +\v 11 and according to the several divisions by fathers’ houses, before the people, to offer to the Lord as it is written in the book of Moses. They did this in the morning. +\v 12 They roasted the Passover lamb with fire, as required. They boiled the sacrifices in the brazen vessels and caldrons with a pleasing smell, +\v 13 and set them before all the people. Afterward they prepared for themselves and for their kindred the priests, the sons of Aaron. +\v 14 For the priests offered the fat until night. The Levites prepared for themselves and for their kindred the priests, the sons of Aaron. +\v 15 The holy singers also, the sons of Asaph, were in their order, according to the appointment of David: Asaph, Zacharias, and Eddinus, who represented the king. +\v 16 Moreover the gatekeepers were at every gate. No one needed to depart from his daily duties, for their kindred the Levites prepared for them. +\p +\v 17 So the things that belonged to the Lord’s sacrifices were accomplished in that day, in holding the Passover, +\v 18 and offering sacrifices on the altar of the Lord, according to the commandment of King Josias. +\v 19 So the children of Israel which were present at that time held the Passover and the feast of unleavened bread seven days. +\v 20 Such a Passover had not been held in Israel since the time of the prophet Samuel. +\v 21 Indeed, none of the kings of Israel held such a Passover as Josias with the priests, the Levites, and the Jews, held with all Israel that were present in their dwelling place at Jerusalem. +\v 22 This Passover was held in the eighteenth year of the reign of Josias. +\v 23 The works of Josias were upright before his Lord with a heart full of godliness. +\v 24 Moreover the things that came to pass in his days have been written in times past, concerning those who sinned and did wickedly against the Lord more than any other people or kingdom, and how they grieved him \f + \fr 1:24 \ft Or, \fqa sensibly \ft Judges 16:17.\f*exceedingly, so that the Lord’s words were confirmed against Israel. +\p +\v 25 \x + \xo 1:25 \xt 2 Chronicles 35:20\x*Now after all these acts of Josias, it came to pass that Pharaoh the king of Egypt came to make war at Carchemish on the Euphrates; and Josias went out against him. +\v 26 But the king of Egypt sent to him, saying, “What do I have to do with you, O king of Judea? +\v 27 I wasn’t sent out from the Lord God against you, for my war is against the Euphrates. Now the Lord is with me, yes, the Lord is with me hastening me forward. Depart from me, and don’t be against the Lord.” +\p +\v 28 However, Josias didn’t turn back to his chariot, but tried to fight with him, not regarding the words of the prophet Jeremy from the Lord’s mouth, +\v 29 but joined battle with him in the plain of Megiddo, and the commanders came down against King Josias. +\v 30 Then the king said to his servants, “Carry me away out of the battle, for I am very weak!” Immediately his servants carried him away out of the army. +\v 31 Then he got into his second chariot. After he was brought back to Jerusalem he died, and was buried in the tomb of his ancestors. +\v 32 All Judea mourned for Josias. Jeremy the prophet lamented for Josias, and the chief men with the women made lamentation for him to this day. This was given out for an ordinance to be done continually in all the nation of Israel. +\v 33 These things are written in the book of the histories of the kings of Judea, and every one of the acts that Josias did, and his glory, and his understanding in the law of the Lord, and the things that he had done before, and the things now told, are reported in the book of the kings of Israel and Judah. +\p +\v 34 \x + \xo 1:34 \xt 2 Kings 23:30; 2 Chronicles 36:1\x* The people took \f + \fr 1:34 \ft Another reading is, \fqa Jeconias.\f*Joachaz the son of Josias, and made him king instead of Josias his father, when he was twenty-three years old. +\v 35 He reigned in Judah and Jerusalem for three months. Then the king of Egypt deposed him from reigning in Jerusalem. +\v 36 He set a tax upon the people of one hundred talents of silver and one talent of gold. +\v 37 The king of Egypt also made King Joakim his brother king of Judea and Jerusalem. +\v 38 And Joakim imprisoned the nobles and apprehended his brother Zarakes, and brought him up out of Egypt. +\p +\v 39 \x + \xo 1:39 \xt 2 Chronicles 36:4-5\x*Joakim was twenty-five years old when he began to reign in Judea and Jerusalem. He did that which was evil in the sight of the Lord. +\v 40 King Nabuchodonosor of Babylon came up against him, bound him with a chain of brass, and carried him to Babylon. +\v 41 Nabuchodonosor also took some of the Lord’s holy vessels, carried them away, and stored them in his own temple at Babylon. +\v 42 But those things that are reported of him, and of his uncleanness and impiety, are written in the chronicles of the kings. +\v 43 Then Joakim his son reigned in his place. When he was made king, he was eighteen years old. +\v 44 He reigned three months and ten days in Jerusalem. He did that which was evil before the Lord. +\p +\v 45 So after a year Nabuchodonosor sent and caused him to be brought to Babylon with the holy vessels of the Lord, +\v 46 and made Sedekias king of Judea and Jerusalem when he was twenty-one years old. He reigned eleven years. +\v 47 He also did that which was evil in the sight of the Lord, and didn’t heed the words that were spoken by Jeremy the prophet from the Lord’s mouth. +\v 48 After King Nabuchodonosor had made him to swear by the name of the Lord, he broke his oath and rebelled. Hardening his neck and his heart, he transgressed the laws of the Lord, the God of Israel. +\v 49 Moreover the governors of the people and of the priests did many things wickedly, exceeding all the defilements of all nations, and defiled the temple of the Lord, which was sanctified in Jerusalem. +\v 50 The God of their ancestors sent by his messenger to call them back, because he had compassion on them and on his dwelling place. +\v 51 But they mocked his messengers. In the day when the Lord spoke, they scoffed at his prophets +\v 52 until he, being angry with his people for their great ungodliness, commanded to bring up the kings of the Chaldeans against them. +\v 53 They killed their young men with the sword around their holy temple, and spared neither young man or young woman, old man or child; but he delivered all of them into their hands. +\v 54 They took all the holy vessels of the Lord, both great and small, with the treasure chests of the Lord’s ark and the king’s treasures, and carried them away to Babylon. +\v 55 They burned the Lord’s house, broke down Jerusalem’s walls, and burned its towers with fire. +\v 56 As for her glorious things, they didn’t stop until they had brought them all to nothing. He carried the people who weren’t slain with the sword to Babylon. +\v 57 They were servants to him and to his children until the Persians reigned, to fulfill the word of the Lord by the mouth of Jeremy: +\v 58 “Until the land has enjoyed its Sabbaths, the whole time of her desolation shall she keep Sabbath, to fulfill seventy years. +\c 2 +\p +\v 1 In the \x + \xo 2:1 \xt 2 Chronicles 36:22,23; Ezra 1:1\x*first year of King Cyrus of the Persians, that the word of the Lord by the mouth of Jeremy might be accomplished, +\v 2 the Lord stirred up the spirit of King Cyrus of the Persians, and he made a proclamation throughout all his kingdom, and also by writing, +\v 3 saying, “Cyrus king of the Persians says: The Lord of Israel, the Most High Lord, has made me king of the whole world, +\v 4 and commanded me to build him a house at Jerusalem that is in Judea. +\v 5 If therefore there are any of you that are of his people, let the Lord, even his Lord, be with him, and let him go up to Jerusalem that is in Judea, and build the house of the Lord of Israel. He is the Lord who dwells in Jerusalem. +\v 6 Therefore, of those who dwell in various places, let those who are in his own place help each one with gold, with silver, +\v 7 with gifts, with horses, and cattle, beside the other things which have been added by vow for the temple of the Lord which is in Jerusalem. +\p +\v 8 Then the chief of the families of Judah and of the tribe of Benjamin stood up, with the priests, the Levites, and all whose spirit the Lord had stirred to go up, to build the house for the Lord which is in Jerusalem. +\v 9 Those who lived around them helped them in all things with silver and gold, with horses and cattle, and with very many gifts that were vowed by a great number whose minds were so moved. +\p +\v 10 King Cyrus also brought out the holy vessels of the Lord, which Nabuchodonosor had carried away from Jerusalem and had stored in his temple of idols. +\v 11 Now when King Cyrus of the Persians had brought them out, he delivered them to Mithradates his treasurer, +\v 12 and by him they were delivered to \f + \fr 2:12 \ft Another reading is, \fqa Simanassar.\f*Sanabassar the governor of Judea. +\v 13 This was the number of them: one thousand gold cups, one thousand silver cups, twenty-nine silver censers, thirty gold bowls, two thousand four hundred ten silver bowls, and one thousand other vessels. +\v 14 So all the vessels of gold and of silver were brought up, even five thousand four hundred seventy-nine, +\v 15 and were carried back by Sanabassar, together with the returning exiles, from Babylon to Jerusalem. +\p +\v 16 \x + \xo 2:16 \xt Ezra 4:7\x*In the time of King Artaxerxes of the Persians, Belemus, Mithradates, Tabellius, \f + \fr 2:16 \fqa Rehum,\f*Rathumus, Beeltethmus, and \f + \fr 2:16 \fqa Shimshai.\f*Samellius the scribe, with their other associates, dwelling in Samaria and other places, wrote to him against those who lived in Judea and Jerusalem the following letter: +\p +\v 17 “To King Artaxerxes our Lord, from your servants, Rathumus the recorder, Samellius the scribe, and the rest of their council, and the judges who are in Coelesyria and Phoenicia: +\v 18 Let it now be known to our lord the king, that the Jews that have come up from you to us, having come to Jerusalem, are building that rebellious and wicked city, and are repairing its marketplaces and walls, and are laying the foundation of a temple. +\v 19 Now if this city is built and its walls are finished, they will not only refuse to give tribute, but will even stand up against kings. +\v 20 Since the things pertaining to the temple are now in hand, we think it appropriate not to neglect such a matter, +\v 21 but to speak to our lord the king, to the intent that, if it is your pleasure, search may be made in the books of your ancestors. +\v 22 You will find in the chronicles what is written concerning these things, and will understand that that city was rebellious, troubling both kings and cities, +\v 23 and that the Jews were rebellious, and kept starting wars there in the past. For this cause, this city was laid waste. +\v 24 Therefore now we do declare to you, O lord the king, that if this city is built again, and its walls set up again, you will from then on have no passage into Coelesyria and Phoenicia.” +\p +\v 25 Then the king wrote back again to Rathumus the recorder, Beeltethmus, Samellius the scribe, and to the rest that of their associates who lived in Samaria, Syria, and Phoenicia, as follows: +\p +\v 26 “I have read the letter which you have sent to me. Therefore I commanded to make search, and it has been found that that city of old time has fought against kings, +\v 27 and the men were given to rebellion and war in it, and that mighty and fierce kings were in Jerusalem, who reigned and exacted tribute in Coelesyria and Phoenicia. +\v 28 Now therefore I have commanded to prevent those men from building the city, and heed to be taken that there be nothing done contrary to this order, +\v 29 and that those wicked doings proceed no further to the annoyance of kings.” +\v 30 Then King Artaxerxes, his letters being read, Rathumus, and Samellius the scribe, and the rest of their associates, went in haste to Jerusalem with cavalry and a multitude of people in battle array, and began to hinder the builders. So the building of the temple in Jerusalem ceased until the second year of the reign of King Darius of the Persians. +\c 3 +\p +\v 1 Now King Darius made a great feast for all his subjects, for all who were born in his house, for all the princes of Media and of Persia, +\v 2 and for all the local governors and captains and governors who were under him, from India to Ethiopia, in the one hundred twenty seven provinces. +\v 3 They ate and drank, and when they were satisfied went home. Then King Darius went into his bedchamber slept, but awakened out of his sleep. +\p +\v 4 Then the three young men of the bodyguard, who guarded the king, spoke one to another: +\v 5 “Let every one of us state what one thing is strongest. King Darius will give he whose statement seems wiser than the others great gifts and great honors in token of victory. +\v 6 He shall be clothed in purple, drink from gold cups, sleep on a gold bed, and have a chariot with bridles of gold, a fine linen turban, and a chain around his neck. +\v 7 He shall sit next to Darius because of his wisdom, and shall be called cousin of Darius.” +\p +\v 8 Then they each wrote his sentence, sealed them, and laid them under King Darius’ pillow, +\v 9 and said, “When the king wakes up, someone will give him the writing. Whoever the king and the three princes of Persia judge that his sentence is the wisest, to him shall the victory be given, as it is written.” +\v 10 The first wrote, “Wine is the strongest.” +\v 11 The second wrote, “The king is strongest.” +\v 12 The third wrote, “Women are strongest, but above all things Truth is the victor.” +\p +\v 13 Now when the king woke up, they took the writing and gave it to him, so he read it. +\v 14 Sending out, he called all the princes of Persia and of Media, the local governors, the captains, the governors, and the chief officers +\v 15 and sat himself down in the royal seat of judgment; and the writing was read before them. +\v 16 He said, “Call the young men, and they shall explain their own sentences. So they were called and came in. +\v 17 They said to them, “Explain what you have written.” +\p Then the first, who had spoken of the strength of wine, began +\v 18 and said this: “O sirs, how exceedingly strong wine is! It causes all men who drink it to go astray. +\v 19 It makes the mind of the king and of the fatherless child to be the same, likewise of the bondman and of the freeman, of the poor man and of the rich. +\v 20 It also turns every thought into cheer and mirth, so that a man remembers neither sorrow nor debt. +\v 21 It makes every heart rich, so that a man remembers neither king nor local governor. It makes people say things in large amounts. +\v 22 When they are in their cups, they forget their love both to friends and kindred, and before long draw their swords. +\v 23 But when they awake from their wine, they don’t remember what they have done. +\v 24 O sirs, isn’t wine the strongest, seeing that it forces people to do this?” And when he had said this, he stopped speaking. +\c 4 +\p +\v 1 Then the second, who had spoken of the strength of the king, began to say, +\v 2 “O sirs, don’t men excel in strength who rule over the sea and land, and all things in them? +\v 3 But yet the king is stronger. He is their lord and has dominion over them. In whatever he commands them, they obey him. +\v 4 If he tells them to make war the one against the other, they do it. If he sends them out against the enemies, they go, and conquer mountains, walls, and towers. +\v 5 They kill and are killed, and don’t disobey the king’s commandment. If they win the victory, they bring everything to the king—all the plunder and everything else. +\v 6 Likewise for those who are not soldiers, and don’t have anything to do with wars, but farm, when they have reaped again that which they had sown, they bring some to the king and compel one another to pay tribute to the king. +\v 7 He is just one man! If he commands people to kill, they kill. If he commands them to spare, they spare. +\v 8 If he commands them to strike, they strike. If he commands them to make desolate, they make desolate. If he commands to build, they build. +\v 9 If he commands them to cut down, they cut down. If he commands them to plant, they plant. +\v 10 So all his people and his armies obey him. Furthermore, he lies down, he eats and drinks, and takes his rest; +\v 11 and these keep watch around him. None of them may depart and do his own business. They don’t disobey him in anything. +\v 12 O sirs, how could the king not be the strongest, seeing that he is obeyed like this?” Then he stopped talking. +\p +\v 13 Then the third, who had spoken of women, and of truth, (this was Zorobabel) began to speak: +\v 14 “O sirs, isn’t the king great, and men are many, and isn’t wine strong? Who is it then who rules them, or has the lordship over them? Aren’t they women? +\v 15 Women have given birth to the king and all the people who rule over sea and land. +\v 16 They came from women. Women nourished up those who planted the vineyards, from where the wine comes. +\v 17 Women also make garments for men. These bring glory to men. Without women, men can’t exist. +\v 18 Yes, and if men have gathered together gold and silver and any other beautiful thing, and see a woman who is lovely in appearance and beauty, +\v 19 they let all those things go and gape at her, and with open mouth stare at her. They all have more desire for her than for gold, or silver, or any other beautiful thing. +\v 20 A man leaves his own father who brought him up, leaves his own country, and joins with his wife. +\v 21 With his wife he ends his days, with no thought for his father, mother, or country. +\v 22 By this also you must know that women have dominion over you. Don’t you labor and toil, and bring it all to give to women? +\v 23 Yes, a man takes his sword and goes out to travel, to rob, to steal, and to sail on the sea and on rivers. +\v 24 He sees a lion and walks in the darkness. When he has stolen, plundered, and robbed, he brings it to the woman he loves. +\v 25 Therefore a man loves his wife better than father or mother. +\v 26 Yes, there are many who have lost their minds for women, and become slaves for their sakes. +\v 27 Many also have perished, have stumbled, and sinned, for women. +\v 28 Now don’t you believe me? Isn’t the king great in his power? Don’t all regions fear to touch him? +\v 29 Yet I saw him and Apame the king’s concubine, the daughter of the illustrious Barticus, sitting at the right hand of the king, +\v 30 and taking the crown from the king’s head, and setting it upon her own head. Yes, she struck the king with her left hand. +\v 31 At this, the king gaped and gazed at her with open mouth. If she smiles at him, he laughs. But if she takes any displeasure at him, he flatters her, that she might be reconciled to him again. +\v 32 O sirs, how can it not be that women are strong, seeing they do this?” +\p +\v 33 Then the king and the nobles looked at one another. So he began to speak concerning truth. +\v 34 “O sirs, aren’t women strong? The earth is great. The sky is high. The sun is swift in its course, for it circles around the sky, and returns on its course again in one day. +\v 35 Isn’t he who makes these things great? Therefore the truth is great, and stronger than all things. +\v 36 All the earth calls upon truth, and the sky blesses truth. All works shake and tremble, but with truth there is no unrighteous thing. +\v 37 Wine is unrighteous. The king is unrighteous. Women are unrighteous. All the children of men are unrighteous, and all their works are unrighteous. There is no truth in them. They shall also perish in their unrighteousness. +\v 38 But truth remains, and is strong forever. Truth lives and conquers forevermore. +\v 39 With truth there is no partiality toward persons or rewards, but truth does the things that are just, instead of any unrighteous or wicked things. All men approve truth’s works. +\v 40 In truth’s judgment is not any unrighteousness. Truth is the strength, the kingdom, the power, and the majesty of all ages. Blessed be the God of truth!” +\p +\v 41 With that, he stopped speaking. Then all the people shouted and said, “Great is truth, and strong above all things!” +\p +\v 42 Then the king said to him, “Ask what you wish, even more than is appointed in writing, and we will give it to you, because you are found wisest. You shall sit next me, and shall be called my cousin.” +\p +\v 43 Then he said to the king, “Remember your vow, which you vowed to build Jerusalem, in the day when you came to your kingdom, +\v 44 and to send back all the vessels that were taken out of Jerusalem, which Cyrus set apart when he vowed to destroy Babylon, and vowed to send them back there. +\v 45 You also vowed to build the temple which the Edomites burned when Judea was made desolate by the Chaldeans. +\v 46 Now, O lord the king, this is what I request, and what I desire of you, and this is the princely generosity that may proceed from you: I ask therefore that you make good the vow, the performance of which you have vowed to the King of Heaven with your own mouth.” +\p +\v 47 Then King Darius stood up, kissed him, and wrote letters for him to all the treasurers and governors and captains and local governors, that they should safely bring on their way both him, and all those who would go up with him to build Jerusalem. +\v 48 He wrote letters also to all the governors who were in Coelesyria and Phoenicia, and to them in Libanus, that they should bring cedar wood from Libanus to Jerusalem, and that they should help him build the city. +\v 49 Moreover he wrote for all the Jews who would go out of his realm up into Judea concerning their freedom, that no officer, no governor, no local governor, nor treasurer, should forcibly enter into their doors, +\v 50 and that all the country which they occupied should be free to them without tribute, and that the Edomites should give up the villages of the Jews which they held at that time, +\v 51 and that there should be given twenty talents yearly toward the building of the temple, until the time that it was built, +\v 52 and another ten talents yearly for burnt offerings to be presented upon the altar every day, as they had a commandment to make seventeen offerings, +\v 53 and that all those who would come from Babylonia to build the city should have their freedom—they and their descendants, and all the priests that came. +\v 54 He wrote also to give them their support and the priests’ vestments in which they minister. +\v 55 For the Levites he wrote that their support should be given them until the day that the house was finished and Jerusalem built up. +\v 56 He commanded that land and wages should be given to all who guarded the city. +\v 57 He also sent away all the vessels from Babylon that Cyrus had set apart, and all that Cyrus had given in commandment, he commanded also to be done and to be sent to Jerusalem. +\p +\v 58 Now when this young man had gone out, he lifted up his face to heaven toward Jerusalem, and praised the King of heaven, +\v 59 and said, “From you comes victory. From you comes wisdom. Yours is the glory, and I am your servant. +\v 60 Blessed are you, who have given me wisdom. I give thanks to you, O Lord of our fathers. +\v 61 So he took the letters, went out, came to Babylon, and told it all his kindred. +\v 62 They praised the God of their ancestors, because he had given them freedom and liberty +\v 63 to go up and to build Jerusalem and the temple which is called by his name. They feasted with instruments of music and gladness seven days. +\c 5 +\p +\v 1 After this, the chiefs of fathers’ houses were chosen to go up according to their tribes, with their wives, sons, and daughters, with their menservants and maidservants, and their livestock. +\v 2 Darius sent with them one thousand cavalry to bring them back to Jerusalem with peace, with musical instruments, drums, and flutes. +\v 3 All their kindred were making merry, and he made them go up together with them. +\p +\v 4 These are the names of the men who went up, according to their families among their tribes, after their several divisions. +\v 5 The priests, the sons of Phinees, the sons of Aaron: Jesus the son of Josedek, the son of Saraias, and Joakim the son of Zorobabel, the son of Salathiel, of the house of David, of the lineage of Phares, of the tribe of Judah, +\v 6 who spoke wise words before Darius the king of Persia in the second year of his reign, in the month Nisan, which is the first month. +\p +\v 7 \x + \xo 5:7 \xt Ezra 2:1\x*These are the of Judeans who came up from the captivity, where they lived as foreigners, whom Nabuchodonosor the king of Babylon had carried away to Babylon. +\v 8 They returned to Jerusalem and to the other parts of Judea, every man to his own city, who came with Zorobabel, with Jesus, Nehemias, \f + \fr 5:8 \fqa Seralah.\f* Zaraias, Resaias,\f + \fr 5:8 \ft Or, \fqa Enenis.\f* Eneneus, Mardocheus, Beelsarus,\f + \fr 5:8 \fqa Mispar.\f* Aspharsus,\f + \fr 5:8 \fqa Reclaiah\f* Reelias, Roimus, and Baana, their leaders. +\p +\v 9 The number of them of the nation and their leaders: the sons of Phoros, two thousand one hundred seventy two; the sons of\f + \fr 5:9 \fqa Shephatiah.\f* Saphat, four hundred seventy two; +\v 10 the sons of\f + \fr 5:10 \fqa Arah.\f* Ares, seven hundred fifty six; +\v 11 the sons of\f + \fr 5:11 \fqa Pahath-moab.\f* Phaath Moab, of the sons of Jesus and Joab, two thousand eight hundred twelve; +\v 12 the sons of Elam, one thousand two hundred fifty four; the sons of\f + \fr 5:12 \fqa Zattu.\f* Zathui, nine hundred forty five; the sons of\f + \fr 5:12 \fqa Zaccai.\f* Chorbe, seven hundred five; the sons of Bani, six hundred forty eight; +\v 13 the sons of Bebai, six hundred twenty three; the sons of\f + \fr 5:13 \fqa Asgad.\f* Astad,\f + \fr 5:13 \ft According to other readings, 3622, or 3222.\f* one thousand three hundred twenty two; +\v 14 the sons of Adonikam, six hundred sixty seven; the sons of\f + \fr 5:14 \fqa Bigvai.\f* Bagoi, two thousand sixty six; the sons of\f + \fr 5:14 \fqa Adin.\f* Adinu, four hundred fifty four; +\v 15 the sons of\f + \fr 5:15 \fqa Ater of Hezekiah.\f* Ater, of Ezekias, ninety two; the sons of Kilan and Azetas, sixty seven; the sons of\f + \fr 5:15 \ft Another reading is, \fqa Azuru.\f* Azaru, four hundred thirty two; +\v 16 the sons of\f + \fr 5:16 \ft Another reading is, \fqa Annias.\f* Annis, one hundred one; the sons of Arom, the sons of\f + \fr 5:16 \fqa Bezai.\f* Bassai, three hundred twenty three; the sons of Arsiphurith, one hundred twelve; +\v 17 the sons of Baiterus, three thousand five; the sons of\f + \fr 5:17 \fqa Bethlehem.\f* Bethlomon, one hundred twenty three; +\v 18 those from Netophas, fifty five; those from Anathoth, one hundred fifty eight; those from\f + \fr 5:18 \fqa Azmaveth.\f* Bethasmoth, forty two; +\v 19 those from \f + \fr 5:19 \fqa Kiriath-arim \ft or \fqa Kiriath-jearim.\f* Kariathiarius, twenty five: those from Caphira and Beroth, seven hundred forty three; +\v 20 the Chadiasai and Ammidioi, four hundred twenty two; those from \f + \fr 5:20 \fqa Rumah.\f*Kirama and \f + \fr 5:20 \fqa Geba.\f*Gabbe, six hundred twenty one; +\v 21 those from \f + \fr 5:21 \fqa Michmas.\f*Macalon, one hundred twenty two; those from \f + \fr 5:21 \fqa Bethel.\f*Betolion, fifty two; the sons of \f + \fr 5:21 \fqa Magbish\f*Niphis, one hundred fifty six; +\v 22 the sons of \f + \fr 5:22 \fqa Lod, Hadid.\f*Calamolalus and \f + \fr 5:22 \fqa Ono.\f*Onus, seven hundred twenty five; the sons of \f + \fr 5:22 \fqa Jericho.\f* Jerechu, \f + \fr 5:22 \ft Another reading is, \fqa two\f*three hundred forty five; +\v 23 and the sons of \f + \fr 5:23 \fqa Senaah.\f*Sanaas, three thousand three hundred thirty. +\p +\v 24 The priests: the sons of \f + \fr 5:24 \fqa Jedaiah.\f*Jeddu, the son of Jesus, among the sons of Sanasib, nine hundred seventy two; the sons of \f + \fr 5:24 \fqa Immer.\f* Emmeruth, one thousand fifty two; +\v 25 the sons of \f + \fr 5:25 \fqa Pashhur.\f*Phassurus, one thousand two hundred forty seven; and the sons of \f + \fr 5:25 \fqa Harim.\f*Charme, one thousand seventeen. +\v 26 The Levites: the sons of Jesus, Kadmiel, Bannas, and Sudias, seventy four. +\v 27 The holy singers: the sons of Asaph, one hundred twenty eight. +\v 28 The gatekeepers: the sons of\f + \fr 5:28 \fqa Shallum.\f* Salum, the sons of\f + \fr 5:28 \fqa Ater.\f* Atar, the sons of Tolman, the sons of\f + \fr 5:28 \fqa Akkub.\f* Dacubi, the sons of\f + \fr 5:28 \fqa Hatita.\f* Ateta, the sons of\f + \fr 5:28 \fqa Shobai.\f* Sabi, in all one hundred thirty nine. +\p +\v 29 The temple servants: the sons of\f + \fr 5:29 \fqa Ziha.\f* Esau, the sons of\f + \fr 5:29 \fqa Hasupha.\f* Asipha, the sons of Tabaoth, the sons of\f + \fr 5:29 \fqa Keros.\f* Keras, the sons of\f + \fr 5:29 \fqa Siaha.\f* Sua, the sons of\f + \fr 5:29 \fqa Padon.\f* Phaleas, the sons of Labana, the sons of\f + \fr 5:29 \fqa Hagaba.\f* Aggaba. +\v 30 the sons of\f + \fr 5:30 \fqa Akkub.\f* Acud, the sons of Uta, the sons of Ketab, the sons of\f + \fr 5:30 \fqa Hagab.\f* Accaba, the sons of\f + \fr 5:30 \fqa Shamlai.\f* Subai, the sons of\f + \fr 5:30 \fqa Hanan.\f* Anan, the sons of\f + \fr 5:30 \fqa Giddel.\f* Cathua, the sons of\f + \fr 5:30 \fqa Gahar\f* Geddur, +\v 31 the sons of\f + \fr 5:31 \fqa Reaiah.\f* Jairus, the sons of\f + \fr 5:31 \fqa Rezin.\f* Daisan, the sons of\f + \fr 5:31 \fqa Nekoda.\f* Noeba, the sons of Chaseba, the sons of\f + \fr 5:31 \fqa Gazzam.\f* Gazera, the sons of\f + \fr 5:31 \fqa Uzza.\f* Ozias, the sons of\f + \fr 5:31 \fqa Paseah.\f* Phinoe, the sons of Asara, the sons of\f + \fr 5:31 \fqa Besai.\f* Basthai, the sons of\f + \fr 5:31 \fqa Asnah.\f* Asana, the sons of\f + \fr 5:31 \fqa Meunim.\f* Maani, the sons of\f + \fr 5:31 \fqa Nephisim.\f* Naphisi, the sons of\f + \fr 5:31 \fqa Bakbuk. \ft According to other readings, \fqa Acum, \ft or \fqa Acuph.\f* Acub, the sons of\f + \fr 5:31 \fqa Hakupha.\f* Achipha, the sons of\f + \fr 5:31 \fqa Harhur.\f* Asur, the sons of Pharakim, the sons of\f + \fr 5:31 \fqa Bazluth.\f* Basaloth, +\v 32 the sons of\f + \fr 5:32 \fqa Mehida.\f* Meedda, the sons of Cutha, the sons of\f + \fr 5:32 \fqa Harsha\f* Charea, the sons of\f + \fr 5:32 \fqa Barkos.\f* Barchus, the sons of\f + \fr 5:32 \fqa Sisera.\f* Serar, the sons of\f + \fr 5:32 \fqa Temah\f* Thomei, the sons of\f + \fr 5:32 \fqa Neziah. \ft Another reading is, \fqa Nasith.\f* Nasi, the sons of Atipha. +\p +\v 33 The sons of the servants of Solomon: the sons of\f + \fr 5:33 \fqa Hussophereth.\f* Assaphioth, the sons of\f + \fr 5:33 \fqa Peruda.\f* Pharida, the sons of\f + \fr 5:33 \fqa Jaalah.\f* Jeeli, the sons of\f + \fr 5:33 \fqa Darkon.\f* Lozon, the sons of\f + \fr 5:33 \fqa Giddel.\f* Isdael, the sons of\f + \fr 5:33 \fqa Shephatia.\f* Saphuthi, +\v 34 the sons of\f + \fr 5:34 \fqa Hattil.\f* Agia, the sons of\f + \fr 5:34 \fqa Pochereth-haz-zebaim, \ft Ezra 2:57.\f* Phacareth, the sons of Sabie, the sons of Sarothie, the sons of\f + \fr 5:34 \ft Another reading is, \fqa Misaias.\f* Masias, the sons of Gas, the sons of Addus, the sons of Subas, the sons of Apherra, the sons of Barodis, the sons of Saphat, the sons of Allon. +\p +\v 35 All the temple-servants and the sons of the servants of Solomon were three hundred seventy two. +\v 36 These came up from\f + \fr 5:36 \fqa Telmelah.\f* Thermeleth, and\f + \fr 5:36 \fqa Telharsha.\f* Thelersas,\f + \fr 5:36 \fqa Cherub. Addan.\f* Charaathalan leading them, and Allar; +\v 37 and they could not show their families, nor their stock, how they were of Israel: the sons of\f + \fr 5:37 \fqa Delaiah. \ft Another reading is, \fqa Asan.\f* Dalan the son of\f + \fr 5:37 \fqa Tobiah \ft Another reading is, \fqa Baenan.\f* Ban, the sons of\f + \fr 5:37 \fqa Nekoda.\f* Nekodan, six hundred fifty two. +\p +\v 38 Of the priests, those who usurped the office of the priesthood and were not found: the sons of\f + \fr 5:38 \fqa Habaiah, \ft or \fqa Hobaiah.\f* Obdia, the sons of\f + \fr 5:38 \fqa Hakkoz.\f* Akkos, the sons of Jaddus, who married Augia one of the daughters of\f + \fr 5:38 \fqa Barzillai. \ft Another reading is, \fqa Phaezeldaeus.\f* Zorzelleus, and was called after his name. +\v 39 When the description of the kindred of these men was sought in the register and was not found, they were removed from executing the office of the priesthood; +\v 40 for Nehemias and Attharias told them that they should not be partakers of the holy things until a high priest wearing\f + \fr 5:40 \ft Gr. \fqa the manifestation and truth.\f* Urim and Thummim should arise. +\p +\v 41 So all those of Israel, from twelve years old and upward, beside menservants and women servants, were in number forty two thousand three hundred sixty. +\v 42 Their menservants and handmaids were seven thousand three hundred thirty and seven; the minstrels and singers, two hundred forty five; +\v 43 four hundred thirty and five camels, seven thousand thirty six horses, two hundred forty five mules, and five thousand five hundred twenty five beasts of burden. +\p +\v 44 And some of the chief men of their families, when they came to the temple of God that is in Jerusalem, vowed to set up the house again in its own place according to their ability, +\v 45 and to give into the holy treasury of the works one thousand minas\f + \fr 5:45 \ft A mina is about 570 grams or 1.25 pounds.\f* of gold, five thousand minas of silver, and one hundred priestly vestments. +\p +\v 46 The priests and the Levites and some of the people lived in Jerusalem and the country. The holy singers also and the gatekeepers and all Israel lived in their villages. +\p +\v 47 But when the seventh month was at hand, and when the children of Israel were each in their own place, they all came together with one purpose into the broad place before the first porch which is toward the east. +\v 48 Then Jesus the son of Josedek, his kindred the priests, Zorobabel the son of Salathiel, and his kindred stood up and made the altar of the God of Israel ready +\v 49 to offer burned sacrifices upon it, in accordance with the express commands in the book of Moses the man of God. +\v 50 Some people joined them out of the other nations of the land, and they erected the altar upon its own place, because all the nations of the land were hostile to them and oppressed them; and they offered sacrifices at the proper times and burnt offerings to the Lord both morning and evening. +\v 51 They also held the feast of tabernacles, as it is commanded in the law, and offered sacrifices daily, as appropriate. +\v 52 After that, they offered the continual oblations and the sacrifices of the Sabbaths, of the new moons, and of all the consecrated feasts. +\v 53 All those who had made any vow to God began to offer sacrifices to God from the new moon of the seventh month, although the temple of God was not yet built. +\v 54 They gave money, food, and drink to the masons and carpenters. +\v 55 They also gave carts to the people of Sidon and Tyre, that they should bring cedar trees from Libanus, and convey them in rafts to the harbor of Joppa, according to the commandment which was written for them by Cyrus king of the Persians. +\p +\v 56 In the second year after his coming to the temple of God at Jerusalem, in the second month, Zorobabel the son of Salathiel, Jesus the son of Josedek, their kindred, the Levitical priests, and all those who had come to Jerusalem out of the captivity began work. +\v 57 They laid the foundation of God’s temple on the new moon of the second month, in the second year after they had come to Judea and Jerusalem. +\v 58 \x + \xo 5:58 \xt Ezra 3:8-9\x*They appointed the Levites who were at least twenty years old over the Lord’s works. Then Jesus, with his sons and kindred, Kadmiel his brother, the sons of Jesus, Emadabun, and the sons of Joda the son of Iliadun, and their sons and kindred, all the Levites, with one accord stood up and started the business, laboring to advance the works in the house of God. So the builders built the Lord’s temple. +\p +\v 59 The priests stood arrayed in their vestments with musical instruments and trumpets, and the Levites the sons of Asaph with their cymbals, +\v 60 singing songs of thanksgiving and praising the Lord, according to the directions of King David of Israel. +\v 61 They sang aloud, praising the Lord in songs of thanksgiving, because his goodness and his glory are forever in all Israel. +\v 62 All the people sounded trumpets and shouted with a loud voice, singing songs of thanksgiving to the Lord for the raising up of the Lord’s house. +\v 63 \x + \xo 5:63 \xt Ezra 3:12-13\x*Some of the Levitical priests and of the heads of their families, the elderly who had seen the former house came to the building of this one with lamentation and great weeping. +\v 64 But many with trumpets and joy shouted with a loud voice, +\v 65 so that the people couldn’t hear the trumpets for the weeping of the people, for the multitude sounded loudly, so that it was heard far away. +\p +\v 66 \x + \xo 5:66 \xt Ezra 4:1\x* Therefore when the enemies of the tribe of Judah and Benjamin heard it, they came to know what that noise of trumpets meant. +\v 67 They learned that those who returned from captivity built the temple for the Lord, the God of Israel. +\v 68 So they went to Zorobabel and Jesus, and to the chief men of the families, and said to them, “We will build together with you. +\v 69 For we, just like you, obey your Lord, and sacrifice to him from the days of King \f + \fr 5:69 \ft Another reading is, \fqa Asbacaphath.\f* Asbasareth of the Assyrians, who brought us here.” +\p +\v 70 Then Zorobabel, Jesus and the chief men of the families of Israel said to them, “It is not for you to build the house for the Lord our God. +\v 71 We ourselves alone will build for the Lord of Israel, as King Cyrus of the Persians has commanded us.” +\v 72 But the heathen of the land pressed hard upon the inhabitants of Judea, cut off their supplies, and hindered their building. +\v 73 By their secret plots, and popular persuasions and commotions, they hindered the finishing of the building all the time that King Cyrus lived. So they were hindered from building for two years, until the reign of Darius. +\c 6 +\p +\v 1 Now \x + \xo 6:1 \xt Ezra 4:24; 5:1\x*in the second year of the reign of Darius, Aggaeus and Zacharius the son of\f + \fr 6:1 \fqa Iddo. \ft Another reading is, \fqa Eddin\f* Addo, the prophets, prophesied to the Jews in Judea and Jerusalem in the name of the Lord, the God of Israel. +\v 2 Then Zorobabel the son of Salathiel and Jesus the son of Josedek stood up and began to build the house of the Lord at Jerusalem, the prophets of the Lord being with them and helping them. +\p +\v 3 \x + \xo 6:3 \xt Ezra 5:3\x*At the same time \f + \fr 6:3 \fqa Tattenai.\f*Sisinnes the governor of Syria and Phoenicia came to them, with \f + \fr 6:3 \fqa Shetharbozenai\f*Sathrabuzanes and his companions, and said to them, +\v 4 “By whose authority do you build this house and this roof, and perform all the other things? Who are the builders who do these things?” +\v 5 Nevertheless, the elders of the Jews obtained favor, because the Lord had visited the captives; +\v 6 and they were not hindered from building until such time as communication was made to Darius concerning them, and his answer received. +\p +\v 7 A copy of the letter which Sisinnes, governor of Syria and Phoenicia, and Sathrabuzanes, with their companions, the rulers in Syria and Phoenicia, wrote and sent to Darius: +\p +\v 8 “To King Darius, greetings. Let it be fully known to our lord the king, that having come into the country of Judea, and entered into the city of Jerusalem, we found in the city of Jerusalem the elders of the Jews that were of the captivity +\v 9 building a great new house for the Lord of hewn and costly stones, with timber laid in the walls. +\v 10 Those works are being done with great speed. The work goes on prosperously in their hands, and it is being accomplished with all glory and diligence. +\v 11 Then asked we these elders, saying, ‘By whose authority are you building this house and laying the foundations of these works?’ +\v 12 Therefore, to the intent that we might give knowledge to you by writing who were the leaders, we questioned them, and we required of them the names in writing of their principal men. +\v 13 So they gave us this answer, ‘We are the servants of the Lord who made heaven and earth. +\v 14 As for this house, it was built many years ago by a great and strong king of Israel, and was finished. +\v 15 But when our fathers sinned against the Lord of Israel who is in heaven, and provoked him to wrath, he gave them over into the hands of King Nabuchodonosor of Babylon, king of the Chaldeans. +\v 16 They pulled down the house, burned it, and carried away the people captive to Babylon. +\v 17 But in the first year that Cyrus reigned over the country of Babylon, King Cyrus wrote that this house should be rebuilt. +\v 18 The holy vessels of gold and of silver that Nabuchodonosor had carried away out of the house at Jerusalem and had set up in his own temple, those King Cyrus brought out of the temple in Babylonia, and they were delivered to Zorobabel and to \f + \fr 6:18 \ft Another reading is, \fqa Sabunassarus.\f*Sanabassarus the governor, +\v 19 with commandment that he should carry away all these vessels, and put them in the temple at Jerusalem, and that the Lord’s temple should be built on its site. +\v 20 Then Sanabassarus, having come here, laid the foundations of the Lord’s house which is in Jerusalem. From that time to this we are still building. It is not yet fully completed.’ +\v 21 Now therefore, if it seems good, O king, let a search be made among the royal archives of our lord the king that are in Babylon. +\v 22 If it is found that the building of the house of the Lord which is in Jerusalem has been done with the consent of King Cyrus, and it seems good to our lord the king, let him send us directions concerning these things.” +\p +\v 23 \x + \xo 6:23 \xt Ezra 6:1\x*Then King Darius commanded that a search be made among the archives that were laid up at Babylon. So at Ekbatana the palace, which is in the country of Media, a scroll was found where these things were recorded: +\v 24 “In the first year of the reign of Cyrus, King Cyrus commanded to build up the house of the Lord which is in Jerusalem, where they sacrifice with continual fire. +\v 25 Its height shall be sixty cubits, and the breadth sixty cubits, with three rows of hewn stones, and one row of new wood from that country. Its expenses are to be given out of the house of King Cyrus. +\v 26 The holy vessels of the house of the Lord, both gold and silver, that Nabuchodonosor took out of the house at Jerusalem and carried away to Babylon, should be restored to the house at Jerusalem, and be set in the place where they were before.” +\v 27 Also he commanded that Sisinnes the governor of Syria and Phoenicia, and Sathrabuzanes, and their companions, and those who were appointed rulers in Syria and Phoenicia, should be careful not to meddle with the place, but allow Zorobabel, the servant of the Lord, and governor of Judea, and the elders of the Jews, to build that house of the Lord in its place. +\v 28 “I also command to have it built up whole again; and that they look diligently to help those who are of the captivity of Judea, until the house of the Lord is finished, +\v 29 and that out of the tribute of Coelesyria and Phoenicia a portion shall be carefully given to these men for the sacrifices of the Lord, that is, to Zorobabel the governor for bulls, rams, and lambs, +\v 30 and also corn, salt, wine and oil, and that continually every year without further question, according as the priests who are in Jerusalem may direct to be daily spent, +\v 31 that drink offerings may be made to the Most High God for the king and for his children, and that they may pray for their lives.” +\v 32 He commanded that whoever should transgress, yes, or neglect anything written here, a beam shall be taken out of his own house, and he shall be hanged on it, and all his goods seized for the king. +\v 33 “Therefore may the Lord, whose name is called upon there, utterly destroy every king and nation that stretches out his hand to hinder or damage that house of the Lord in Jerusalem. +\v 34 I, King Darius have ordained that these things be done with diligence.” +\c 7 +\p +\v 1 Then \x + \xo 7:1 \xt Ezra 6:13\x* Sisinnes the governor of Coelesyria and Phoenicia, and Sathrabuzanes, with their companions, following the commandments of King Darius, +\v 2 very carefully supervised the holy work, assisting the elders of the Jews and rulers of the temple. +\v 3 So the holy work prospered, while Aggaeus and Zacharias the prophets prophesied. +\v 4 They finished these things by the commandment of the Lord, the God of Israel, and with the consent of Cyrus, Darius, and Artaxerxes, kings of the Persians. +\v 5 So the holy house was finished by the twenty-third day of the month Adar, in the sixth year of King Darius. +\v 6 The children of Israel, the priests, the Levites, and the others who returned from captivity who joined them did what was written in the book of Moses. +\v 7 For the dedication of the Lord’s temple, they offered one hundred bulls, two hundred rams, four hundred lambs, +\v 8 and twelve male goats for the sin of all Israel, according to the number of the twelve princes of the tribes of Israel. +\v 9 The priests and the Levites stood arrayed in their vestments, according to their kindred, for the services of the Lord, the God of Israel, according to the book of Moses. The gatekeepers were at every gate. +\p +\v 10 The children of Israel who came out of captivity held the Passover the fourteenth day of the first month, when the priests and the Levites were sanctified together, +\v 11 with all those who returned from captivity; for they were sanctified. For the Levites were all sanctified together, +\v 12 and they offered the Passover for all who returned from captivity, for their kindred the priests, and for themselves. +\v 13 The children of Israel who came out of the captivity ate, even all those who had separated themselves from the abominations of the heathen of the land, and sought the Lord. +\v 14 They kept the feast of unleavened bread seven days, rejoicing before the Lord, +\v 15 because he had turned the counsel of the king of Assyria toward them, to strengthen their hands in the works of the Lord, the God of Israel. +\c 8 +\p +\v 1 \x + \xo 8:1 \xt Ezra 7:1\x* After these things, when Artaxerxes the king of the Persians reigned, Esdras came, who was the son of Azaraias, the son of Zechrias, the son of Helkias, the son of Salem, +\v 2 the son of Sadduk, the son of Ahitob, the son of Amarias, the son of Ozias,\f + \fr 8:2 \ft The Vatican MS. omits \fq the son of Memeroth, the son of Zaraias, the son of Savias.\f* the son of Memeroth, the son of Zaraias, the son of Savias, the son of Boccas, the son of Abisne, the son of Phinees, the son of Eleazar, the son of Aaron, the chief priest. +\v 3 This Esdras went up from Babylon as a skilled scribe in the law of Moses, which was given by the God of Israel. +\v 4 The king honored him, for he found favor in his sight in all his requests. +\v 5 There went up with him also some of the children of Israel, and of the priests, Levites, holy singers, gatekeepers, and temple servants to Jerusalem +\v 6 in the seventh year of the reign of Artaxerxes, in the fifth month (this was the king’s seventh year); for they left Babylon on the new moon of the first month and came to Jerusalem, by the prosperous journey which the Lord gave them\f + \fr 8:6 \ft Some MSS. omit \fq for his sake.\f* for his sake. +\v 7 For Esdras had very great skill, so that he omitted nothing of the law and commandments of the Lord, but taught all Israel the ordinances and judgments. +\p +\v 8 Now the commission, which was written from King Artaxerxes, came to Esdras the priest and reader of the law of the Lord, was as follows: +\p +\v 9 “King Artaxerxes to Esdras the priest and reader of the law of the Lord, greetings. +\v 10 Having determined to deal graciously, I have given orders that those of the nation of the Jews, and of the priests and Levites, and of those within our realm who are willing and freely choose to, should go with you to Jerusalem. +\v 11 As many therefore as are so disposed, let them depart with you, as it has seemed good both to me and my seven friends the counselors, +\v 12 that they may look to the affairs of Judea and Jerusalem, in accordance with what is in the Lord’s law, +\v 13 and carry the gifts to the Lord of Israel to Jerusalem, which I and my friends have vowed, and that all the gold and silver that can be found in the country of Babylonia for the Lord in Jerusalem, +\v 14 with that also which is given of the people for the temple of the Lord their God that is at Jerusalem, be collected: even the gold and silver for bulls, rams, and lambs, and what goes with them, +\v 15 to the end that they may offer sacrifices to the Lord upon the altar of the Lord their God, which is in Jerusalem. +\v 16 Whatever you and your kindred decide to do with gold and silver, do that according to the will of your God. +\v 17 The holy vessels of the Lord, which are given you for the use of the temple of your God, which is in Jerusalem, +\v 18 and whatever else you shall remember for the use of the temple of your God, you shall give it out of the king’s treasury. +\v 19 I, King Artaxerxes, have also commanded the keepers of the treasures in Syria and Phoenicia, that whatever Esdras the priest and reader of the law of the Most High God shall send for, they should give it to him with all diligence, +\v 20 to the sum of one hundred talents of silver, likewise also of wheat even to one hundred cors\f + \fr 8:20 \ft a cor is about 230 liters, so 100 cors is about 23 kiloliters or 652 bushels\f*, and one hundred firkins\f + \fr 8:20 \ft a firkin is about 41 liters or 11 gallons.\f* of wine, and\f + \fr 8:20 \ft So some authorities. See Ezra 7:22. The common reading is, \fqa other things.\f* salt in abundance. +\v 21 Let all things be performed after God’s law diligently to the most high God, that wrath come not upon the kingdom of the king and his sons. +\v 22 I command you also that no tax, nor any other imposition, be laid upon any of the priests, or Levites, or holy singers, or gatekeepers, or temple servants, or any that have employment in this temple, and that no man has authority to impose any tax on them. +\v 23 You, Esdras, according to the wisdom of God, ordain judges and justices that they may judge in all Syria and Phoenicia all those who know the law of your God; and those who don’t know it, you shall teach. +\v 24 Whoever transgresses the law of your God and of the king shall be punished diligently, whether it be by death, or other punishment, by penalty of money, or by imprisonment.” +\p +\v 25 Then Esdras the scribe said, “Blessed be the only Lord, the God of my fathers, who has put these things into the heart of the king, to glorify his house that is in Jerusalem, +\v 26 and has honored me in the sight of the king, his counselors, and all his friends and nobles. +\v 27 Therefore I was encouraged by the help of the Lord my God, and gathered together out of Israel men to go up with me. +\p +\v 28 These are the chief according to their families and their several divisions, who went up with me from Babylon in the reign of King Artaxerxes: +\v 29 of the sons of Phinees, Gerson; of the sons of Ithamar, Gamael; of the sons of David,\f + \fr 8:29 \fqa Hattush.\f* Attus\f + \fr 8:29 \ft Ezra 8:3, \fqa of the sons of Shecaniah; of the sons of Parosh.\f* the son of Sechenias; +\v 30 of the sons of Phoros, Zacharais; and with him were counted one hundred fifty men; +\v 31 of the sons of Phaath Moab, Eliaonias the son of\f + \fr 8:31 \fqa Zerehiah.\f* Zaraias, and with him two hundred men; +\v 32 \f + \fr 8:32 \ft Ezra 8:5, \fqa of the sons of Shecaniah, the son of Jahaziel.\f*of the sons of Zathoes, Sechenias the son of Jezelus, and with him three hundred men; of the sons of Adin, Obeth the son of Jonathan, and with him two hundred fifty men; +\v 33 of the sons of Elam, Jesias son of Gotholias, and with him seventy men; +\v 34 of the sons of Saphatias, Zaraias son of Michael, and with him seventy men; +\v 35 of the sons of Joab, Abadias son of Jehiel. Jezelus, and with him two hundred twelve men; +\v 36 \f + \fr 8:36 \ft Ezra 8:10, \fqa of the sons of Shelomith, the son of Josiphiah.\f* of the sons of Banias, Salimoth son of Josaphias, and with him one hundred sixty men; +\v 37 of the sons of Babi, Zacharias son of Bebai, and with him twenty-eight men; +\v 38 of the sons of Azgad: Astath, Joannes son of Hakkatan Akatan, and with him one hundred ten men; +\v 39 of the sons of Adonikam, the last, and these are the names of them, Eliphalat, Jeuel, and Samaias, and with them seventy men; +\v 40 of the sons of Bago, Uthi the son of Istalcurus, and with him seventy men. +\p +\v 41 I gathered them together to the river called Theras. There we pitched our tents three days, and I inspected them. +\v 42 When I had found there none of the priests and Levites, +\v 43 then sent I to Eleazar, Iduel, Maasmas, +\v 44 Elnathan, Samaias, Joribus, Nathan, Ennatan, Zacharias, and Mosollamus, principal men and men of understanding. +\v 45 I asked them to go to Loddeus the captain, who was in the place of the treasury, +\v 46 and commanded them that they should speak to Loddeus, to his kindred, and to the treasurers in that place, to send us such men as might execute the priests’ office in our Lord’s house. +\v 47 By the mighty hand of our Lord, they brought to us men of understanding of the sons of\f + \fr 8:47 \fqa Mahli.\f* Mooli the son of Levi, the son of Israel,\f + \fr 8:47 \fqa Sherebiah.\f* Asebebias, and his sons, and his kindred, who were eighteen, +\v 48 and\f + \fr 8:48 \fqa Hashabiah.\f* Asebias, Annuus, and Osaias his brother, of the sons of Chanuneus, and their sons were twenty men; +\v 49 and of the temple servants whom David and the principal men had appointed for the servants of the Levites, two hundred twenty temple servants. The list of all their names was reported. +\p +\v 50 There I vowed a fast for the young men before our Lord, to seek from him a prosperous journey both for us and for our children and livestock that were with us; +\v 51 for I was ashamed to ask of the king infantry, cavalry, and an escort for protection against our adversaries. +\v 52 For we had said to the king that the power of our Lord would be with those who seek him, to support them in all ways. +\v 53 Again we prayed to our lord about these things, and found him to be merciful. +\p +\v 54 Then I set apart twelve men of the chiefs of the priests,\f + \fr 8:54 \fqa Sherebiah, Hashabiah.\f* Eserebias, Assamias, and ten men of their kindred with them. +\v 55 I weighed out to them the silver, the gold, and the holy vessels of the house of our Lord, which the king, his counselors, the nobles, and all Israel had given. +\v 56 When I had weighed it, I delivered to them six hundred fifty talents of silver, silver vessels weighing one hundred talents, one hundred talents of gold, +\v 57 twenty golden vessels, and twelve vessels of brass, even of fine brass, glittering like gold. +\v 58 I said to them, “You are holy to the Lord, the vessels are holy, and the gold and the silver are a vow to the Lord, the Lord of our fathers. +\v 59 Watch and keep them until you deliver them to the chiefs of the priests and Levites, and to the principal men of the families of Israel in Jerusalem, in the chambers of our Lord’s house. +\v 60 So the priests and the Levites who received the silver, the gold, and the vessels which were in Jerusalem, brought them into the temple of the Lord. +\p +\v 61 We left the river Theras on the twelfth day of the first month. We came to Jerusalem by the mighty hand of our Lord which was upon us. The Lord delivered us from from every enemy on the way, and so we came to Jerusalem. +\v 62 When we had been there three days, the silver and gold was weighed and delivered in our Lord’s house on the fourth day to\f + \fr 8:62 \fqa Meremoth.\f* Marmoth the priest the son of\f + \fr 8:62 \fqa Uriah.\f* Urias. +\v 63 With him was Eleazar the son of Phinees, and with them were Josabdus the son of Jesus and\f + \fr 8:63 \fqa Noadiah the son of Binnui.\f* Moeth the son of Sabannus, the Levites. All was delivered to them by number and weight. +\v 64 All the weight of them was recorded at the same hour. +\v 65 Moreover those who had come out of captivity offered sacrifices to the Lord, the God of Israel, even twelve bulls for all Israel, ninety-six rams, +\v 66 seventy-two lambs, and twelve goats for a peace offering—all of them a sacrifice to the Lord. +\v 67 They delivered the king’s commandments to the king’s stewards and to the governors of Coelesyria and Phoenicia; and they honored the people and the temple of the Lord. +\p +\v 68 Now when these things were done, the principal men came to me and said, +\v 69 “The nation of Israel, the princes, the priests, and the Levites haven’t put away from themselves the foreign people of the land nor the uncleannesses of the Gentiles—the Canaanites, Hittites, Pherezites, Jebusites, Moabites, Egyptians, and Edomites. +\v 70 For both they and their sons have married with their daughters, and the holy seed is mixed with the foreign people of the land. From the beginning of this matter the rulers and the nobles have been partakers of this iniquity.” +\p +\v 71 And as soon as I had heard these things, I tore my clothes and my holy garment, and plucked the hair from off my head and beard, and sat down sad and full of heaviness. +\v 72 So all those who were moved at the word of the Lord, the God of Israel, assembled to me while I mourned for the iniquity, but I sat still full of heaviness until the evening sacrifice. +\v 73 Then rising up from the fast with my clothes and my holy garment torn, and bowing my knees and stretching out my hands to the Lord, +\v 74 I said, “O Lord, I am ashamed and confounded before your face, +\v 75 for our sins are multiplied above our heads, and our errors have reached up to heaven +\v 76 ever since the time of our fathers. We are in great sin, even to this day. +\v 77 For our sins and our fathers’ we with our kindred, our kings, and our priests were given up to the kings of the earth, to the sword, and to captivity, and for a prey with shame, to this day. +\v 78 Now in some measure mercy has been shown to us from you, O Lord, that there should be left us a root and a name in the place of your sanctuary, +\v 79 and to uncover a light in the house of the Lord our God, and to give us food in the time of our servitude. +\v 80 Yes, when we were in bondage, we were not forsaken by our Lord, but he gave us favor before the kings of Persia, so that they gave us food, +\v 81 glorified the temple of our Lord, and raised up the desolate Zion, to give us a sure dwelling in Judea and Jerusalem. +\p +\v 82 “Now, O Lord, what shall we say, having these things? For we have transgressed your commandments which you gave by the hand of your servants the prophets, saying, +\v 83 ‘The land, which you enter into to possess as an inheritance, is a land polluted with the pollutions of the foreigners of the land, and they have filled it with their uncleanness. +\v 84 Therefore now you shall not join your daughters to their sons, neither shall you take their daughters for your sons. +\v 85 You shall never seek to have peace with them, that you may be strong, and eat the good things of the land, and that you may leave it for an inheritance to your children for evermore.’ +\v 86 All that has happened is done to us for our wicked works and great sins, for you, O Lord, made our sins light, +\v 87 and gave to us such a root; but we have turned back again to transgress your law in mingling ourselves with the uncleanness of the heathen of the land. +\v 88 You weren’t angry with us to destroy us until you had left us neither root, seed, nor name. +\v 89 O Lord of Israel, you are true, for we are left a root this day. +\v 90 Behold, now we are before you in our iniquities, for we can’t stand any longer before you because of these things.” +\p +\v 91 \x + \xo 8:91 \xt Ezra 10:1\x*As Esdras in his prayer made his confession, weeping, and lying flat on the ground before the temple, a very great throng of men, women, and children gathered to him from Jerusalem; for there was great weeping among the multitude. +\v 92 Then Jechonias the son of Jeelus, one of the sons of Israel, called out, and said, “O Esdras, we have sinned against the Lord God, we have married foreign women of the heathen of the land, but there is still hope for Israel. +\v 93 Let’s make an oath to the Lord about this, that we will put away all our foreign wives with their children, +\v 94 as seems good to you, and to as many as obey the Lord’s Law. +\v 95 Arise, and take action, for this is your task, and we will be with you to do valiantly.” +\v 96 So Esdras arose, and took an oath from the chief of the priests and Levites of all Israel to do these things; and they swore to it. +\c 9 +\p +\v 1 \x + \xo 9:1 \xt Ezra 10:6\x* Then Esdras rose up from the court of the temple and went to the chamber of Jonas the son of Eliasib, +\v 2 and lodged there, and ate no bread and drank no water, mourning for the great iniquities of the multitude. +\v 3 A proclamation was made in all Judea and Jerusalem to all those who returned from captivity, that they should be gathered together at Jerusalem, +\v 4 and that whoever didn’t meet there within two or three days, in accordance with the ruling of the elders, that their livestock would be seized for the use of the temple, and they would be expelled from the multitude of those who returned from captivity. +\p +\v 5 Within three days, all those of the tribe of Judah and Benjamin gathered together at Jerusalem. This was the ninth month, on the twentieth day of the month. +\v 6 All the multitude sat together shivering in the broad place before the temple because of the present foul weather. +\v 7 So Esdras arose up and said to them, “You have transgressed the law and married foreign wives, increasing the sins of Israel. +\v 8 Now make confession and give glory to the Lord, the God of our fathers, +\v 9 and do his will, and separate yourselves from the heathen of the land, and from the foreign women.” +\p +\v 10 Then the whole multitude cried out, and said with a loud voice, “Just as you have spoken, so we will do. +\v 11 But because the multitude is great, and it is foul weather, so that we can’t stand outside, and this is not a work of one day or two, seeing our sin in these things has spread far, +\v 12 therefore let the rulers of the multitude stay, and let all those of our settlements that have foreign wives come at the time appointed, +\v 13 and with them the rulers and judges of every place, until we turn away the wrath of the Lord from us for this matter.” +\p +\v 14 So Jonathan the son of Azael and\f + \fr 9:14 \ft Another reading is, \fqa Ezias.\f* Ezekias the son of Thocanus took the matter on themselves. Mosollamus and Levis and Sabbateus were judges with them. +\v 15 Those who returned from captivity did according to all these things. +\p +\v 16 Esdras the priest chose for himself principal men of their families, all by name. On the new moon of the tenth month they met together to examine the matter. +\v 17 So their cases of men who had foreign wives was brought to an end by the new moon of the first month. +\p +\v 18 Of the priests who had come together and had foreign wives, there were found +\v 19 of the sons of Jesus the son of Josedek, and his kindred,\f + \fr 9:19 \fqa Maaseiah.\f* Mathelas, Eleazar, and\f + \fr 9:19 \fqa Jarib.\f* Joribus, and\f + \fr 9:19 \fqa Gedaliah\f* Joadanus. +\v 20 They gave their hands to put away their wives, and to offer rams to make reconciliation for their error. +\v 21 Of the sons of Emmer: Ananias, Zabdeus, \f + \fr 9:21 \fqa Harim\f*Manes, \f + \fr 9:21 \fqa Maaseiah.\f*Sameus, \f + \fr 9:21 \fqa Jehiel.\f*Hiereel, and \f + \fr 9:21 \fqa Uzziah.\f*Azarias. +\v 22 Of the sons of \f + \fr 9:22 \fqa Pashhur.\f*Phaisur: Elionas, Massias, Ishmael, Nathanael, \f + \fr 9:22 \fqa Jozabad.\f*Ocidelus, and \f + \fr 9:22 \fqa Elasah.\f*Saloas. +\p +\v 23 Of the Levites: Jozabdus, Semeis, \f + \fr 9:23 \fqa Kelaiah.\f*Colius who was called \f + \fr 9:23 \fqa Kelita.\f*Calitas, \f + \fr 9:23 \fqa Pethahiah.\f*Patheus, Judas, and Jonas. +\v 24 Of the holy singers: \f + \fr 9:24 \fqa Eliashib.\f*Eliasibus and Bacchurus. +\v 25 Of the gatekeepers: Sallumus and\f + \fr 9:25 \fqa Telem.\f* Tolbanes. +\p +\v 26 Of Israel, of the sons of Phoros:\f + \fr 9:26 \fqa Parosh.\f* Hiermas,\f + \fr 9:26 \fqa Ramiah\f* Ieddias,\f + \fr 9:26 \fqa Izziah. \ft Another reading is, \fqa Iezias\f* Melchias, Maelus,\f + \fr 9:26 \fqa Mijamin.\f* Eleazar, Asibas, \f + \fr 9:26 \fqa Malchijah.\f* and Banneas. +\v 27 Of the sons of Ela: Matthanias, Zacharias, \f + \fr 9:27 \fqa Jehiel.\f* Jezrielus, Oabdius, Hieremoth, and\f + \fr 9:27 \fqa Abdi.\f* Aedias. +\v 28 Of the sons of \f + \fr 9:28 \fqa Zattu.\f*Zamoth: \f + \fr 9:28 \fqa Elioenai.\f*Eliadas, \f + \fr 9:28 \fqa Eliashib.\f*Eliasimus, \f + \fr 9:28 \fqa Mattaniah.\f*Othonias, Jarimoth, \f + \fr 9:28 \fqa Zabad.\f*Sabathus, and\f + \fr 9:28 \fqa Aziza.\f* Zardeus. +\v 29 Of the sons of Bebai: Joannes, Ananias, \f + \fr 9:29 \fqa Zabbai.\f*Jozabdus, and \f + \fr 9:29 \fqa Athlai.\f*Ematheis. +\v 30 Of the sons of \f + \fr 9:30 \fqa Bani.\f* Mani: \f + \fr 9:30 \fqa Meshullam.\f*Olamus, \f + \fr 9:30 \fqa Malluch.\f*Mamuchus, \f + \fr 9:30 \fqa Adaiah.\f*Jedeus, Jasubas, \f + \fr 9:30 \fqa Sheal.\f* Jasaelus, and Hieremoth. +\v 31 Of the sons of Addi: Naathus, Moossias, Laccunus, Naidus, Matthanias, Sesthel, Balnuus, and Manasseas. +\v 32 Of the sons of Annas: Elionas, Aseas, Melchias, Sabbeus, and Simon Chosameus. +\v 33 Of the sons of Asom: \f + \fr 9:33 \fqa Mattenai.\f*Maltanneus, \f + \fr 9:33 \fqa Mattattah.\f*Mattathias, \f + \fr 9:33 \fqa Zabad.\f*Sabanneus, Eliphalat, Manasses, and Semei. +\v 34 Of the sons of Baani: Jeremias, Momdis, Ismaerus, Juel, Mamdai, Pedias, Anos, Carabasion, Enasibus, Mamnitamenus, Eliasis, Bannus, Eliali, Someis, Selemias, and Nathanias. Of the sons of Ezora: Sesis, Ezril, Azaelus, Samatus, Zambri, and Josephus. +\v 35 Of the sons of Nooma: Mazitias, Zabadeas, Edos, Juel, and Banaias. +\v 36 All these had taken foreign wives, and they put them away with their children. +\p +\v 37 The priests and Levites, and those who were of Israel, lived in Jerusalem and in the country, on the new moon of the seventh month, and the children of Israel in their settlements. +\p +\v 38 \x + \xo 9:38 \xt Nehemiah 8:1\x*The whole multitude gathered together with one accord into the broad place before the porch of the temple toward the east. +\v 39 They said to Esdras the priest and reader, “Bring the law of Moses that was given by the Lord, the God of Israel.” +\p +\v 40 So Esdras the chief priest brought the law to the whole multitude both of men and women, and to all the priests, to hear the law on the new moon of the seventh month. +\v 41 He read in the broad place before the porch of the temple from morning until midday, before both men and women; and all the multitude gave attention to the law. +\v 42 Esdras the priest and reader of the law stood up upon the pulpit of wood which had been prepared. +\v 43 Beside him stood Mattathias, Sammus, Ananias, Azarias, Urias, \f + \fr 9:43 \fqa Hilkiah.\f*Ezekias, and Baalsamus on the right hand, +\v 44 and on his left hand, \f + \fr 9:44 \fqa Pedaiah.\f*Phaldeus, Misael, Melchias, \f + \fr 9:44 \fqa Hashuin.\f*Lothasubus, Nabarias, and Zacharias. +\v 45 Then Esdras took the book of the law before the multitude, and sat honorably in the first place before all. +\v 46 When he opened the law, they all stood straight up. So Esdras blessed the Lord God Most High, the God of armies, the Almighty. +\v 47 All the people answered, “Amen.” Lifting up their hands, they fell to the ground and worshiped the Lord. +\v 48 Also Jesus, Annus, Sarabias, Iadinus, Jacubus, Sabateus, \f + \fr 9:48 \fqa Hodiah.\f*Auteas, Maiannas, Calitas, Azarias, Jozabdus, Ananias, and Phalias, the Levites, taught the law of the Lord, \f + \fr 9:48 \ft Some authorities omit \fq and read...Lord.\f*and read to the multitude the law of the Lord, explaining what was read. +\p +\v 49 Then Attharates said to Esdras the chief priest and reader, and to the Levites who taught the multitude, even to all, +\v 50 “This day is holy to the Lord—now they all wept when they heard the law— +\v 51 go then, eat the fat, drink the sweet, and send portions to those who have nothing; +\v 52 for the day is holy to the Lord. Don’t be sorrowful, for the Lord will bring you to honor.” +\v 53 So the Levites commanded all things to the people, saying, “This day is holy. Don’t be sorrowful.” +\v 54 Then they went their way, every one to eat, drink, enjoy themselves, to give portions to those who had nothing, and to rejoice greatly, +\v 55 because they \f + \fr 9:55 \ft Or, \fqa were inspired by\f*understood the words they were instructed with, and for which they had been assembled. diff --git a/c-sharp/assets/WEB/832ESengWEBUS.SFM b/c-sharp/assets/WEB/832ESengWEBUS.SFM new file mode 100644 index 0000000000..9f68d8535f --- /dev/null +++ b/c-sharp/assets/WEB/832ESengWEBUS.SFM @@ -0,0 +1,1156 @@ +\id 2ES - 2 Esdras +\h 2 Esdras +\toc1 The Second Book of Esdras +\toc2 2 Esdras +\toc3 2Es +\mt1 The Second Book of Esdras +\ip \bk The Second Book of Esdras\bk* is included in the Slavonic Bible as \bk 3 Esdras\bk*, but is not found in the Greek Septuagint. It is included in the Appendix to the Latin Vulgate Bible as \bk 4 Esdras\bk*. It is considered to be Apocrypha by most church traditions. It is preserved here for its supplementary historical value. +\c 1 + +\p +\v 1 The second book of the prophet Esdras, the son of Saraias, the son of Azaraias, the son of Helkias, the son of Salemas, the son of Sadoc, the son of Ahitob, +\v 2 the son of Achias, the son of Phinees, the son of Heli, the son of Amarias, the son of Aziei, the son of Marimoth, the son of Arna, the son of Ozias, the son of Borith, the son of Abissei, the son of Phinees, the son of Eleazar, +\v 3 the son of Aaron, of the tribe of Levi, who was captive in the land of the Medes, in the reign of Artaxerxes king of the Persians. +\p +\v 4 The Lord’s word came to me, saying, +\v 5 “Go your way and show my people their sinful deeds, and their children their wickedness which they have done against me, that they may tell their children’s children, +\v 6 because the sins of their fathers have increased in them, for they have forgotten me, and have offered sacrifices to foreign gods. +\v 7 Didn’t I bring them out of the land of Egypt, out of the house of bondage? But they have provoked me to wrath and have despised my counsels. +\v 8 So pull out the hair of your head and cast all evils upon them, for they have not been obedient to my law, but they are a rebellious people. +\v 9 How long shall I endure them, to whom I have done so much good? +\v 10 I have overthrown many kings for their sakes. I have struck down Pharoah with his servants and all his army. +\v 11 I have destroyed all the nations before them. In the east, I have scattered the people of two provinces, even of Tyre and Sidon, and have slain all their adversaries. +\v 12 Speak therefore to them, saying: +\p +\v 13 “The Lord says, truly I brought you through the sea, and where there was no path I made highways for you. I gave you Moses for a leader and Aaron for a priest. +\v 14 I gave you light in a pillar of fire. I have done great wonders among you, yet you have forgotten me, says the Lord. +\p +\v 15 “The Lord Almighty says: The quails were for a token to you. I gave you a camp for your protection, but you complained there. +\v 16 You didn’t celebrate in my name for the destruction of your enemies, but even to this day you still complain. +\v 17 Where are the benefits that I have given you? When you were hungry and thirsty in the wilderness, didn’t you cry to me, +\v 18 saying, ‘Why have you brought us into this wilderness to kill us? It would have been better for us to have served the Egyptians than to die in this wilderness.’ +\v 19 I had pity on your mourning and gave you manna for food. You ate angels’ bread. +\v 20 When you were thirsty, didn’t I split the rock, and water flowed out in abundance? Because of the heat, I covered you with the leaves of the trees. +\v 21 I divided fruitful lands among you. I drove out the Canaanites, the Pherezites, and the Philistines before you. What more shall I do for you?” says the Lord. +\p +\v 22 The Lord Almighty says, “When you were in the wilderness, at the bitter stream, being thirsty and blaspheming my name, +\v 23 I gave you not fire for your blasphemies, but threw a tree in the water, and made the river sweet. +\v 24 What shall I do to you, O Jacob? You, Judah, would not obey me. I will turn myself to other nations, and I will give my name to them, that they may keep my statutes. +\v 25 Since you have forsaken me, I also will forsake you. When you ask me to be merciful to you, I will have no mercy upon you. +\v 26 Whenever you call upon me, I will not hear you, for you have defiled your hands with blood, and your feet are swift to commit murder. +\v 27 It is not as though you have forsaken me, but your own selves,” says the Lord. +\p +\v 28 The Lord Almighty says, “Haven’t I asked you as a father his sons, as a mother her daughters, and a nurse her young babies, +\v 29 that you would be my people, and I would be your God, that you would be my children, and I would be your father? +\v 30 I gathered you together, as a hen gathers her chicks under her wings. But now, what should I do to you? I will cast you out from my presence. +\v 31 When you offer burnt sacrifices to me, I will turn my face from you, for I have rejected your solemn feast days, your new moons, and your circumcisions of the flesh. +\v 32 I sent to you my servants the prophets, whom you have taken and slain, and torn their bodies in pieces, whose blood I will require from you,” says the Lord. +\p +\v 33 The Lord Almighty says, “Your house is desolate. I will cast you out as the wind blows stubble. +\v 34 Your children won’t be fruitful, for they have neglected my commandment to you, and done that which is evil before me. +\v 35 I will give your houses to a people that will come, which not having heard of me yet believe me. Those to whom I have shown no signs will do what I have commanded. +\v 36 They have seen no prophets, yet they will remember their former condition. +\v 37 I call to witness the gratitude of the people who will come, whose little ones rejoice with gladness. Although they see me not with bodily eyes, yet in spirit they will believe what I say.” +\p +\v 38 And now, father, behold with glory, and see the people that come from the east: +\v 39 to whom I will give for leaders, Abraham, Isaac, and Jacob, Oseas, Amos, and Micheas, Joel, Abdias, and Jonas, +\v 40 Nahum, and Abacuc, Sophonias, Aggaeus, Zachary, and Malachy, who is also called the Lord’s messenger. +\c 2 +\p +\v 1 The Lord says, “I brought this people out of bondage. I gave them my commandments by my servants the prophets, whom they would not listen to, but made my counsels void. +\v 2 The mother who bore them says to them, ‘Go your way, my children, for I am a widow and forsaken. +\v 3 I brought you up with gladness, and I have lost you with sorrow and heaviness, for you have sinned before the Lord God, and done that which is evil before me. +\v 4 But now what can I do for you? For I am a widow and forsaken. Go your way, my children, and ask for mercy from the Lord.’ +\v 5 As for me, O father, I call upon you for a witness in addition to the mother of these children, because they would not keep my covenant, +\v 6 that you may bring them to confusion, and their mother to ruin, that they may have no offspring. +\v 7 Let them be scattered abroad among the heathen. Let their names be blotted out of the earth, for they have despised my covenant. +\v 8 Woe to you, Assur, you who hide the unrighteous with you! You wicked nation, remember what I did to Sodom and Gomorrah, +\v 9 whose land lies in lumps of pitch and heaps of ashes. That is what I will also do to those who have not listened to me,” says the Lord Almighty. +\p +\v 10 The Lord says to Esdras, “Tell my people that I will give them the kingdom of Jerusalem, which I would have given to Israel. +\v 11 I will also take their glory back to myself, and give these the everlasting tabernacles which I had prepared for them. +\v 12 They will have the tree of life for fragrant perfume. They will neither labor nor be weary. +\v 13 Ask, and you will receive. Pray that your days may be few, that they may be shortened. The kingdom is already prepared for you. Watch! +\v 14 Call heaven and earth to witness. Call them to witness, for I have left out evil, and created the good, for I live, says the Lord. +\p +\v 15 “Mother, embrace your children. I will bring them out with gladness like a dove does. Establish their feet, for I have chosen you, says the Lord. +\v 16 I will raise those who are dead up again from their places, and bring them out from their tombs, for I recognize my name in them. +\v 17 Don’t be afraid, you mother of children, for I have chosen you, says the Lord. +\v 18 For your help, I will send my servants Esaias and Jeremy, after whose counsel I have sanctified and prepared for you twelve trees laden with various fruits, +\v 19 and as many springs flowing with milk and honey, and seven mighty mountains, on which roses and lilies grow, with which I will fill your children with joy. +\v 20 Do right to the widow. Secure justice for the fatherless. Give to the poor. Defend the orphan. Clothe the naked. +\v 21 Heal the broken and the weak. Don’t laugh a lame man to scorn. Defend the maimed. Let the blind man have a vision of my glory. +\v 22 Protect the old and young within your walls. +\v 23 Wherever you find the dead, set a sign upon them and commit them to the grave, and I will give you the first place in my resurrection. +\v 24 Stay still, my people, and take your rest, for your rest will come. +\v 25 Nourish your children, good nurse, and establish their feet. +\v 26 As for the servants whom I have given you, not one of them will perish, for I will require them from among your number. +\v 27 Don’t be anxious, for when the day of suffering and anguish comes, others will weep and be sorrowful, but you will rejoice and have abundance. +\v 28 The nations will envy you, but they will be able to do nothing against you, says the Lord. +\v 29 My hands will cover you, so that your children don’t see Gehenna.\f + \fr 2:29 \ft or, \fqa Hell. \f* +\v 30 Be joyful, mother, with your children, for I will deliver you, says the Lord. +\v 31 Remember your children who sleep, for I will bring them out of the secret places of the earth and show mercy to them, for I am merciful, says the Lord Almighty. +\v 32 Embrace your children until I come, and proclaim mercy to them, for my wells run over, and my grace won’t fail.” +\p +\v 33 I, Esdras, received a command from the Lord on Mount Horeb to go to Israel, but when I came to them, they rejected me and rejected the Lord’s commandment. +\v 34 Therefore I say to you, O nations that hear and understand, “Look for your shepherd. He will give you everlasting rest, for he is near at hand who will come at the end of the age. +\v 35 Be ready for the rewards of the kingdom, for the everlasting light will shine on you forevermore. +\v 36 Flee the shadow of this world, receive the joy of your glory. I call to witness my savior openly. +\v 37 Receive that which is given to you by the Lord, and be joyful, giving thanks to him who has called you to heavenly kingdoms. +\v 38 Arise and stand up, and see the number of those who have been sealed at the Lord’s feast. +\v 39 Those who withdrew themselves from the shadow of the world have received glorious garments from the Lord. +\v 40 Take again your full number, O Zion, and make up the reckoning of those of yours who are clothed in white, which have fulfilled the law of the Lord. +\v 41 The number of your children, whom you long for, is fulfilled. Ask the power of the Lord, that your people, which have been called from the beginning, may be made holy.” +\p +\v 42 I, Esdras, saw upon Mount Zion a great multitude, whom I could not number, and they all praised the Lord with songs. +\v 43 In the midst of them, there was a young man of a high stature, taller than all the rest, and upon every one of their heads he set crowns, and he was more exalted than they were. I marveled greatly at this. +\v 44 So I asked the angel, and said, “What are these, my Lord?” +\p +\v 45 He answered and said to me, “These are those who have put off the mortal clothing, and put on the immortal, and have confessed the name of God. Now are they crowned, and receive palms.” +\p +\v 46 Then said I to the angel, “Who is the young man who sets crowns on them, and gives them palms in their hands?” +\p +\v 47 So he answered and said to me, “He is the Son of God, whom they have confessed in the world.” +\p Then I began to praise those who stood so valiantly for the name of the Lord. +\p +\v 48 Then the angel said to me, “Go your way, and tell my people what kind of things, and how great wonders of the Lord God you have seen.” +\c 3 +\p +\v 1 In the thirtieth year after the ruin of the city, I Salathiel, also called Esdras, was in Babylon, and lay troubled upon my bed, and my thoughts came up over my heart, +\v 2 for I saw the desolation of Zion and the wealth of those who lived at Babylon. +\v 3 My spirit was very agitated, so that I began to speak words full of fear to the Most High, and said, +\v 4 “O sovereign Lord, didn’t you speak at the beginning when you formed the earth—and that yourself alone—and commanded the dust +\v 5 and it gave you Adam, a body without a soul? Yet it was the workmanship of your hands, and you breathed into him the breath of life, and he was made alive in your presence. +\v 6 You led him into the garden which your right hand planted before the earth appeared. +\v 7 You gave him your one commandment, which he transgressed, and immediately you appointed death for him and his descendants. From him were born nations, tribes, peoples, and kindred without number. +\v 8 Every nation walked after their own will, did ungodly things in your sight, and despised your commandments, and you didn’t hinder them. +\v 9 Nevertheless, again in process of time, you brought the flood on those who lived in the world and destroyed them. +\v 10 It came to pass that the same thing happened to them. Just as death came to Adam, so was the flood to these. +\v 11 Nevertheless, you left one of them, Noah with his household, and all the righteous men who descended from him. +\p +\v 12 “It came to pass that when those who lived upon the earth began to multiply, they also multiplied children, peoples, and many nations, and began again to be more ungodly than their ancestors. +\v 13 It came to pass, when they did wickedly before you, you chose one from among them, whose name was Abraham. +\v 14 You loved, and to him only you showed the end of the times secretly by night, +\v 15 and made an everlasting covenant with him, promising him that you would never forsake his descendants. To him, you gave Isaac, and to Isaac you gave Jacob and Esau. +\v 16 You set apart Jacob for yourself, but rejected Esau. Jacob became a great multitude. +\v 17 It came to pass that when you led his descendants out of Egypt, you brought them up to Mount Sinai. +\v 18 You bowed the heavens also, shook the earth, moved the whole world, made the depths tremble, and troubled the age. +\v 19 Your glory went through four gates, of fire, of earthquake, of wind, and of ice, that you might give the law to the descendants of Jacob, and the commandment to the descendants of Israel. +\p +\v 20 “Yet you didn’t take away from them their wicked heart, that your law might produce fruit in them. +\v 21 For the first Adam, burdened with a wicked heart transgressed and was overcome, as were all who are descended from him. +\v 22 Thus disease was made permanent. The law was in the heart of the people along with the wickedness of the root. So the good departed away and that which was wicked remained. +\v 23 So the times passed away, and the years were brought to an end. Then you raised up a servant, called David, +\v 24 whom you commanded to build a city to your name, and to offer burnt offerings to you in it from what is yours. +\v 25 When this was done many years, then those who inhabited the city did evil, +\v 26 in all things doing as Adam and all his generations had done, for they also had a wicked heart. +\v 27 So you gave your city over into the hands of your enemies. +\p +\v 28 “Then I said in my heart, ‘Are their deeds of those who inhabit Babylon any better? Is that why it gained dominion over Zion?’ +\v 29 For it came to pass when I came here, that I also saw impieties without number, and my soul saw many sinners in this thirtieth year, so that my heart failed me. +\v 30 For I have seen how you endure them sinning, and have spared those who act ungodly, and have destroyed your people, and have preserved your enemies; +\v 31 and you have not shown how your way may be comprehended. Are the deeds of Babylon better than those of Zion? +\v 32 Or is there any other nation that knows you beside Israel? Or what tribes have so believed your covenants as these tribes of Jacob? +\v 33 Yet their reward doesn’t appear, and their labor has no fruit, for I have gone here and there through the nations, and I see that they abound in wealth, and don’t think about your commandments. +\v 34 Weigh therefore our iniquities now in the balance, and theirs also who dwell in the world, and so will it be found which way the scale inclines. +\v 35 Or when was it that they who dwell on the earth have not sinned in your sight? Or what nation has kept your commandments so well? +\v 36 You will find some men by name who have kept your precepts, but you won’t find nations.” +\c 4 +\p +\v 1 The angel who was sent to me, whose name was Uriel, gave me an answer, +\v 2 and said to me, “Your understanding has utterly failed you regarding this world. Do you think you can comprehend the way of the Most High?” +\p +\v 3 Then I said, “Yes, my Lord.” +\p He answered me, “I have been sent to show you three ways, and to set before you three problems. +\v 4 If you can solve one for me, I also will show you the way that you desire to see, and I will teach you why the heart is wicked.” +\p +\v 5 I said, “Say on, my Lord.” +\p Then said he to me, “Go, weigh for me the weight of fire, or measure for me blast of wind, or call back for me the day that is past.” +\p +\v 6 Then answered I and said, “Who of the sons of men is able to do this, that you should ask me about such things?” +\p +\v 7 He said to me, “If I had asked you, ‘How many dwellings are there in the heart of the sea? Or how many springs are there at the fountain head of the deep? Or how many streams are above the firmament? Or which are the exits \f + \fr 4:7 \ft So the Syriac. The Latin omits \fqa of hell? or which are the paths.\f*of hell? Or which are the entrances of paradise?’ +\v 8 perhaps you would say to me, ‘I never went down into the deep, or as yet into hell, neither did I ever climb up into heaven.’ +\v 9 Nevertheless now I have only asked you about the fire, wind, and the day, things which you have experienced, and from which you can’t be separated, and yet have you given me no answer about them.” +\p +\v 10 He said moreover to me, “You can’t understand your own things that you grew up with. +\v 11 How then can your mind comprehend the way of the Most High? How can he who is already worn out with the corrupted world understand incorruption?” +\p \f + \fr 4:11 \ft So the Syriac and Aethiopic. The Latin is corrupt.\f*When I heard these things, I fell on my face +\v 12 and said to him, “It would have been better if we weren’t here at all, than that we should come here and live in the midst of ungodliness, and suffer, and not know why.” +\p +\v 13 He answered me, and said, \f + \fr 4:13 \ft So the Oriental versions. The Latin is corrupt. See Judges 9:8. \f*“A forest of the trees of the field went out, and took counsel together, +\v 14 and said, ‘Come! Let’s go and make war against the sea, that it may depart away before us, and that we may make ourselves more forests.’ +\v 15 The waves of the sea also in like manner took counsel together, and said, ‘Come! Let’s go up and subdue the forest of the plain, that there also we may gain more territory.’ +\v 16 The counsel of the wood was in vain, for the fire came and consumed it. +\v 17 Likewise also the counsel of the waves of the sea, for the sand stood up and stopped them. +\v 18 If you were judge now between these two, which would you justify, or which would you condemn?” +\p +\v 19 I answered and said, “It is a foolish counsel that they both have taken, for the ground is given to the wood, and the place of the sea is given to bear its waves.” +\p +\v 20 Then answered he me, and said, “You have given a right judgment. Why don’t you judge your own case? +\v 21 For just as the ground is given to the wood, and the sea to its waves, even so those who dwell upon the earth may understand nothing but what is upon the earth. Only he who dwells above the heavens understands the things that are above the height of the heavens.” +\p +\v 22 Then answered I and said, “I beg you, O Lord, why has the power of understanding been given to me? +\v 23 For it was not in my mind to be curious of the ways above, but of such things as pass by us daily, because Israel is given up as a reproach to the heathen. The people whom you have loved have been given over to ungodly nations. The law of our forefathers is made of no effect, and the written covenants are nowhere regarded. +\v 24 We pass away out of the world like locusts. Our life is like a vapor, and we aren’t worthy to obtain mercy. +\v 25 What will he then do for his name by which we are called? I have asked about these things.” +\p +\v 26 Then he answered me, and said, “If you are alive you will see, and if you live long, you will marvel, for the world hastens quickly to pass away. +\v 27 For it is not able to bear the things that are promised to the righteous in the times to come; for this world is full of sadness and infirmities. +\v 28 For the evil\f + \fr 4:28 \ft so the Syriac and Aethiopic.\f* about which you asked me has been sown, but its harvest hasn’t yet come. +\v 29 If therefore that which is sown isn’t reaped, and if the place where the evil is sown doesn’t pass away, the field where the good is sown won’t come. +\v 30 For a grain of evil seed was sown in the heart of Adam from the beginning, and how much wickedness it has produced to this time! How much more it will yet produce until the time of threshing comes! +\v 31 Ponder now by yourself, how much fruit of wickedness a grain of evil seed has produced. +\v 32 When the grains which are without number are sown, how great a threshing floor they will fill!” +\p +\v 33 Then I answered and said, \f + \fr 4:33 \ft So the chief oriental versions. \f*“How long? When will these things come to pass? Why are our years few and evil?” +\p +\v 34 He answered me, and said, “Don’t hurry faster than the Most High; for your haste is\f + \fr 4:34 \ft So the Syriac. The Latin is corrupt. \f* for your own self, but he who is above hurries on behalf of many. +\v 35 Didn’t the souls of the righteous ask question of these things in their chambers, saying, ‘How long \f + \fr 4:35 \ft So the Syriac. The Latin has \fqa shall I hope on this fashion? \f*will we be here? When does the fruit of the threshing floor come?’ +\v 36 To them, Jeremiel the archangel answered, ‘When the number is fulfilled of those who are like you. For he has weighed the world in the balance. +\v 37 By measure, he has measured the times. By number, he has counted the seasons. He won’t \f + \fr 4:37 \ft Syr. \fqa rest. \f*move or stir them until that measure is fulfilled.’” +\p +\v 38 Then I answered, “O sovereign Lord, all of us are full of ungodiness. +\v 39 Perhaps it is for our sakes that the threshing time of the righteous is kept back—because of the sins of those who dwell on the earth.” +\p +\v 40 So he answered me, “Go your way to a woman with child, and ask of her when she has fulfilled her nine months, if her womb may keep the baby any longer within her.” +\p +\v 41 Then I said, “No, Lord, that can it not.” +\p He said to me, “In Hades, the chambers of souls are like the womb. +\v 42 For just like a woman in labor hurries to escape the anguish of the labor pains, even so these places hurry to deliver those things that are committed to them from the beginning. +\v 43 Then you will be shown those things which you desire to see.” +\p +\v 44 Then I answered, “If I have found favor in your sight, and if it is possible, and if I am worthy, +\v 45 show me this also, whether there is more to come than is past, or whether the greater part has gone over us. +\v 46 For what is gone I know, but I don’t know what is to come.” +\p +\v 47 He said to me, “Stand up on my right side, and I will explain the parable to you.” +\p +\v 48 So I stood, looked, and saw a hot burning oven passed by before me. It happened that when the flame had gone by I looked, and saw that the smoke remained. +\v 49 After this, a watery cloud passed in front of me, and sent down much rain with a storm. When the stormy rain was past, the drops still remained in it.” +\p +\v 50 Then said he to me, “Consider with yourself; as the rain is more than the drops, and the fire is greater than the smoke, so the quantity which is past was far greater; but the drops and the smoke still remained.” +\p +\v 51 Then I prayed, and said, “Do you think that I will live until that time? Or who will be alive in those days?” +\p +\v 52 He answered me, “As for the signs you asked me about, I may tell you of them in part; but I wasn’t sent to tell you about your life, for I don’t know. +\c 5 +\p +\v 1 “Nevertheless, concerning the signs, behold, the days will come when those who dwell on earth will be taken \f + \fr 5:1 \ft So the syriac. \f*with great amazement, and the way of truth will be hidden, and the land will be barren of faith. +\v 2 Iniquity will be increased above what now you see, and beyond what you have heard long ago. +\v 3 The land that you now see ruling will be a trackless waste, and men will see it desolate. +\v 4 But if the Most High grants you to live, you will see what is after the third period will be troubled. The sun will suddenly shine in the night, and the moon in the day. +\v 5 Blood will drop out of wood, and the stone will utter its voice. The peoples will be troubled, and the stars will fall. +\v 6 He will rule whom those who dwell on the earth don’t expect, and the birds will fly away together. +\v 7 The Sodomite sea will cast out fish, and make a noise in the night, which many have not known; but all will hear its voice. +\v 8 There will also be chaos in many places. Fires will break out often, and the wild animals will change their places, and women will bring forth monsters. +\v 9 Salt waters will be found in the sweet, and all friends will destroy one another. Then reason will hide itself, and understanding withdraw itself into its chamber. +\v 10 It will be sought by many, and won’t be found. Unrighteousness and lack of restraint will be multiplied on earth. +\v 11 One country will ask another, ‘Has righteousness, or a man that does righteousness, gone through you?’ And it will say, ‘No.’ +\v 12 It will come to pass at that time that men will hope, but won’t obtain. They will labor, but their ways won’t prosper. +\v 13 I am permitted to show you such signs. If you will pray again, and weep as now, and fast seven days, you will hear yet greater things than these.” +\p +\v 14 Then I woke up, and an extreme trembling went through my body, and my mind was so troubled that it fainted. +\v 15 So the angel who had come to talk with me held me, comforted me, and set me on my feet. +\p +\v 16 In the second night, it came to pass that \f + \fr 5:16 \ft The Syriac has \fqa Psaltiel. \f*Phaltiel the captain of the people came to me, saying, “Where have you been? Why is your face sad? +\v 17 Or don’t you know that Israel is committed to you in the land of their captivity? +\v 18 Get up then, and eat some bread, and don’t forsake us, like a shepherd who leaves the flock in the power of cruel wolves.” +\p +\v 19 Then said I to him, “Go away from me and don’t come near me for seven days, and then you shall come to me.” He heard what I said and left me. +\p +\v 20 So I fasted seven days, mourning and weeping, like Uriel the angel had commanded me. +\v 21 After seven days, the thoughts of my heart were very grievous to me again, +\v 22 and my soul recovered the spirit of understanding, and I began to speak words before the Most High again. +\v 23 I said, “O sovereign Lord of all the woods of the earth, and of all the trees thereof, you have chosen one vine for yourself. +\v 24 Of all the lands of the world you have chosen one \f + \fr 5:24 \ft After the Oriental versions. The Latin has \fqa pit. \f*country for yourself. Of all the flowers of the world, you have chosen one lily for yourself. +\v 25 Of all the depths of the sea, you have filled one river for yourself. Of all built cities, you have consecrated Zion for yourself. +\v 26 Of all the birds that are created you have named for yourself one dove. Of all the livestock that have been made, you have provided for yourself one sheep. +\v 27 Among all the multitudes of peoples you have gotten yourself one people. To this people, whom you loved, you gave a law that is approved by all. +\v 28 Now, O Lord, why have you given this one people over to many, and \f + \fr 5:28 \ft After the Oriental versions. The Latin reads \fqa have prepared.\f*have dishonored the one root above others, and have scattered your only one among many? +\v 29 Those who opposed your promises have trampled down those who believed your covenants. +\v 30 If you really do hate your people so much, they should be punished with your own hands.” +\p +\v 31 Now when I had spoken these words, the angel that came to me the night before was sent to me, +\v 32 and said to me, “Hear me, and I will instruct you. Listen to me, and I will tell you more.” +\p +\v 33 I said, “Speak on, my Lord.” +\p Then said he to me, “You are very troubled in mind for Israel’s sake. Do you love that people more than he who made them?” +\p +\v 34 I said, “No, Lord; but I have spoken out of grief; for my heart is in agony every hour while I labor to comprehend the way of the Most High, and to seek out part of his judgment.” +\p +\v 35 He said to me, “You can’t.” +\p And I said, “Why, Lord? Why was I born? Why wasn’t my mother’s womb my grave, that I might not have seen the travail of Jacob, and the wearisome toil of the people of Israel?” +\p +\v 36 He said to me, “Count for me those who haven’t yet come. Gather together for me the drops that are scattered abroad, and make the withered flowers green again for me. +\v 37 Open for me the chambers that are closed, and bring out the winds for me that are shut up in them. Or show me the image of a voice. Then I will declare to you the travail that you asked to see.” +\p +\v 38 And I said, “O sovereign Lord, who may know these things except he who doesn’t have his dwelling with men? +\v 39 As for me, I lack wisdom. How can I then speak of these things you asked me about?” +\p +\v 40 Then said he to me, “Just as you can do none of these things that I have spoken of, even so you can’t find out my judgment, or the end of the love that I have promised to my people.” +\p +\v 41 I said, “But, behold, O Lord, you have made the promise to those who are alive at the end. What should they do who have been before us, or we ourselves, or those who will come after us?” +\p +\v 42 He said to me, “I will compare my judgment to a ring. Just as there is no slowness of those who are last, even so there is no swiftness of those who be first.” +\p +\v 43 So I answered, “Couldn’t you make them all at once that have been made, and that are now, and that are yet to come, that you might show your judgment sooner?” +\p +\v 44 Then he answered me, “The creature may not move faster than the creator, nor can the world hold them at once who will be created in it.” +\p +\v 45 And I said, “How have you said to your servant, that \f + \fr 5:45 \ft So the Syriac. \f*you will surely make alive at once the creature that you have created? \f + \fr 5:45 \ft The Latin omits \fqa If...alive at once. \f*If therefore they will be alive at once, and the creation will sustain them, even so it might now also support them to be present at once.” +\p +\v 46 And he said to me, “Ask the womb of a woman, and say to her, ‘If you bear ten children, why do you it at different times? Ask her therefore to give birth to ten children at once.” +\p +\v 47 I said, “She can’t, but must do it each in their own time.” +\p +\v 48 Then said he to me, “Even so, I have given the womb of the earth to those who are sown in it in their own times. +\v 49 For just as a young child may not give birth, neither she who has grown old any more, even so have I organized the world which I created.” +\p +\v 50 I asked, “Seeing that you have now shown me the way, I will speak before you. Is our mother, of whom you have told me, still young? Or does she now draw near to old age?” +\p +\v 51 He answered me, “Ask a woman who bears children, and she will tell you. +\v 52 Say to her, ‘Why aren’t they whom you have now brought forth like those who were before, but smaller in stature?’ +\v 53 She also will answer you, ‘Those who are born in the strength of youth are different from those who are born in the time of old age, when the womb fails.’ +\v 54 Consider therefore you also, how you are shorter than those who were before you. +\v 55 So are those who come after you smaller than you, as born of the creature which now begins to be old, and is past the strength of youth.” +\p +\v 56 Then I said, “Lord, I implore you, if I have found favor in your sight, show your servant by whom you visit your creation.” +\c 6 +\p +\v 1 He said to me, “In the beginning, when the earth was made, before the portals of the world were fixed and before the gatherings of the winds blew, +\v 2 before the voices of the thunder sounded and before the flashes of the lightning shone, before the foundations of paradise were laid, +\v 3 before the fair flowers were seen, before the powers of the earthquake were established, before the innumerable army of angels were gathered together, +\v 4 before the heights of the air were lifted up, before the measures of the firmament were named, before the footstool of Zion \f + \fr 6:4 \ft So the Syriac. \f*was established, +\v 5 before the present years were reckoned, before the imaginations of those who now sin were estranged, and before they were sealed who have gathered faith for a treasure— +\v 6 then I considered these things, and they all were made through me alone, and not through another; just as by me also they will be ended, and not by another.” +\p +\v 7 Then I answered, “What will be the dividing of the times? Or when will be the end of the first and the beginning of the age that follows?” +\p +\v 8 He said to me, “From Abraham to Isaac, because Jacob and Esau were born to him, for Jacob’s hand held Esau’s heel from the beginning. +\v 9 For Esau is the end of this age, and Jacob is the beginning of the one that follows. +\v 10 \f + \fr 6:10 \ft So the Syriac, etc. The Latin is defective. \f*The beginning of a man is his hand, and the end of a man is his heel. Seek nothing else between the heel and the hand, Esdras!” +\p +\v 11 Then I answered, “O sovereign Lord, if I have found favor in your sight, +\v 12 I beg you, show your servant the end of your signs which you showed me part on a previous night.” +\p +\v 13 So he answered, “Stand up upon your feet, and you will hear a mighty sounding voice. +\v 14 If the place you stand on is greatly moved +\v 15 when it speaks don’t be afraid, for the word is of the end, and the foundations of the earth will understand +\v 16 that the speech is about them. They will tremble and be moved, for they know that their end must be changed.” +\p +\v 17 It happened that when I had heard it, I stood up on my feet, and listened, and, behold, there was a voice that spoke, and its sound was like the sound of many waters. +\v 18 It said, “Behold, the days come when I draw near to visit those who dwell upon the earth, +\v 19 and when I investigate those who have caused harm unjustly with their unrighteousness, and when the affliction of Zion is complete, +\v 20 and when the seal will be set on the age that is to pass away, then I will show these signs: the books will be opened before the firmament, and all will see together. +\v 21 The children a year old will speak with their voices. The women with child will deliver premature children at three or four months, and they will live and dance. +\v 22 Suddenly the sown places will appear unsown. The full storehouses will suddenly be found empty. +\v 23 The trumpet will give a sound which when every man hears, they will suddenly be afraid. +\v 24 At that time friends will make war against one another like enemies. The earth will stand in fear with those who dwell in it. The springs of the fountains will stand still, so that for three hours they won’t flow. +\p +\v 25 “It will be that whoever remains after all these things that I have told you of, he will be saved and will see my salvation, and the end of my world. +\v 26 They will see the men who have been taken up, who have not tasted death from their birth. The heart of the inhabitants will be changed and turned into a different spirit. +\v 27 For evil will be blotted out and deceit will be quenched. +\v 28 Faith will flourish. Corruption will be overcome, and the truth, which has been so long without fruit, will be declared.” +\p +\v 29 When he talked with me, behold, little by little, the place I stood on \f + \fr 6:29 \ft After the Oriental versions. The Latin is corrupt. \f*rocked back and forth. +\v 30 He said to me, “I came to show you these things \f + \fr 6:30 \ft So the Syriac. The Latin is corrupt. \f*tonight. +\v 31 If therefore you will pray yet again, and fast seven more days, I will \f + \fr 6:31 \ft The Latin has \fqa tell you by day. \f*again tell you greater things than these. +\v 32 For your voice has surely been heard before the Most High. For the Mighty has seen your righteousness. He has also seen your purity, which you have maintained ever since your youth. +\v 33 Therefore he has sent me to show you all these things, and to say to you, ‘Believe, and don’t be afraid! +\v 34 Don’t be hasty to think vain things about the former times, that you may not hasten in the latter times.’” +\p +\v 35 It came to pass after this, that I wept again, and fasted seven days in like manner, that I might fulfill the three weeks which he told me. +\v 36 On the eighth night, my heart was troubled within me again, and I began to speak in the presence of the Most High. +\v 37 For my spirit was greatly aroused, and my soul was in distress. +\v 38 I said, “O Lord, truly you spoke at the beginning of the creation, on the first day, and said this: ‘Let heaven and earth be made,’ and your word perfected the work. +\v 39 Then the spirit was hovering, and darkness and silence were on every side. The sound of man’s voice was not yet there.\f + \fr 6:39 \ft The Latin adds \fqa from you.\f* +\v 40 Then you commanded a ray of light to be brought out of your treasuries, that your works might then appear. +\p +\v 41 “On the second day, again you made the spirit of the firmament and commanded it to divide and to separate the waters, that the one part might go up, and the other remain beneath. +\p +\v 42 “On the third day, you commanded that the waters should be gathered together in the seventh part of the earth. You dried up six parts and kept them, to the intent that of these some being both planted and tilled might serve before you. +\v 43 For as soon as your word went out, the work was done. +\v 44 Immediately, great and innumerable fruit grew, with many pleasant tastes, and flowers of inimitable color, and fragrances of most exquisite smell. This was done the third day. +\p +\v 45 “On the fourth day, you commanded that the sun should shine, the moon give its light, and the stars should be in their order; +\v 46 and gave them a command to serve mankind, who was to be made. +\p +\v 47 “On the fifth day, you said to the seventh part, where the water was gathered together, that it should produce living creatures, fowls and fishes; and so it came to pass +\v 48 that the mute and lifeless water produced living things as it was told, that the nations might therefore praise your wondrous works. +\p +\v 49 “Then you preserved two living creatures. The one you called Behemoth, and the other you called Leviathan. +\v 50 You separated the one from the other; for the seventh part, namely, where the water was gathered together, might not hold them both. +\v 51 To Behemoth, you gave one part, which was dried up on the third day, that he should dwell in it, in which are a thousand hills; +\v 52 but to Leviathan you gave the seventh part, namely, the watery part. You have kept them to be devoured by whom you wish, when you wish. +\p +\v 53 “But on the sixth day, you commanded the earth to produce before you cattle, animals, and creeping things. +\v 54 Over these, you ordained Adam as ruler over all the works that you have made. Of him came all of us, the people whom you have chosen. +\p +\v 55 “All this have I spoken before you, O Lord, because you have said that for our sakes you made \f + \fr 6:55 \ft So the Syriac. The Latin has \fqa the firstborn world. \f*this world. +\v 56 As for the other nations, which also come from Adam, you have said that they are nothing, and are like spittle. You have likened the abundance of them to a drop that falls from a bucket. +\v 57 Now, O Lord, behold these nations, which are reputed as nothing, being rulers over us and devouring us. +\v 58 But we your people, whom you have called your firstborn, your only children, and your fervent lover, are given into their hands. +\v 59 Now if the world is made for our sakes, why don’t we possess our world for an inheritance? How long will this endure?” +\c 7 +\p +\v 1 When I had finished speaking these words, the angel which had been sent to me the nights before was sent to me. +\v 2 He said to me, “Rise, Esdras, and hear the words that I have come to tell you.” +\p +\v 3 I said, “Speak on, my Lord.” +\p Then he said to me, “There is a sea set in a wide place, that it might be \f + \fr 7:3 \ft So the chief Oriental versions. The Latin MSS. have \fqa deep. \f*broad and vast, +\v 4 but its entrance is set in a narrow place so as to be like a river. +\v 5 Whoever desires to go into the sea to look at it, or to rule it, if he didn’t go through the narrow entrance, how could he come into the broad part? +\v 6 Another thing also: There is a city built and set in a plain country, and full of all good things, +\v 7 but its entrance is narrow, and is set in a dangerous place to fall, having fire on the right hand, and deep water on the left. +\v 8 There is one only path between them both, even between the fire and the water, so that only one person can go there at once. +\v 9 If this city is now given to a man for an inheritance, if the heir doesn’t pass the danger before him, how will he receive his inheritance?” +\p +\v 10 I said, “That is so, Lord.” +\p Then said he to me, “Even so also is Israel’s portion. +\v 11 I made the world for their sakes. What is now done was decreed when Adam transgressed my statutes. +\v 12 Then the entrances of this world were made narrow, sorrowful, and toilsome. They are but few and evil, full of perils, and involved in great toils. +\v 13 For the entrances of the greater world are wide and safe, and produce fruit of immortality. +\v 14 So if those who live don’t enter these difficult and vain things, they can never receive those that are reserved for them. +\v 15 Now therefore why are you disturbed, seeing you are but a corruptible man? Why are you moved, since you are mortal? +\v 16 Why haven’t you considered in your mind that which is to come, rather than that which is present?” +\p +\v 17 Then I answered and said, “O sovereign Lord, behold, you have ordained in your law that the righteous will inherit these things, but that the ungodly will perish. +\v 18 The righteous therefore will suffer difficult things, and hope for easier things, but those who have done wickedly have suffered the difficult things, and yet will not see the easier things.” +\p +\v 19 He said to me, “You are not a judge above God, neither do you have more understanding than the Most High. +\v 20 Yes, let many perish who now live, rather than that the law of God which is set before them be despised. +\v 21 For God strictly commanded those who came, even as they came, what they should do to live, and what they should observe to avoid punishment. +\v 22 Nevertheless, they weren’t obedient to him, but spoke against him and imagined for themselves vain things. +\v 23 They made cunning plans of wickedness, and said moreover of the Most High that he doesn’t exist, and they didn’t know his ways. +\v 24 They despised his law and denied his covenants. They haven’t been faithful to his statutes, and haven’t performed his works. +\v 25 Therefore, Esdras, for the empty are empty things, and for the full are the full things. +\v 26 For behold, the time will come, and it will be, when these signs of which I told you before will come to pass, that the bride will appear, even the city coming forth, and she will be seen who now is withdrawn from the earth. +\v 27 Whoever is delivered from the foretold evils will see my wonders. +\v 28 For my son Jesus will be revealed with those who are with him, and those who remain will rejoice four hundred years. +\v 29 After these years my son Christ\f + \fr 7:29 \ft “Christ” means “Anointed One”.\f* will die, along with all of those who have the breath of life\f + \fr 7:29 \ft Lat. \fqa man \f*. +\v 30 Then the world will be turned into the old silence seven days, like as in the first beginning, so that no human will remain. +\v 31 After seven days the world that is not yet awake will be raised up, and what is corruptible will die. +\v 32 The earth will restore those who are asleep in it, and the dust those who dwell in it in silence, and the \f + \fr 7:32 \ft Or, \fqa chambers \ft See 2 Esdras 4:35. \f*secret places will deliver those souls that were committed to them. +\v 33 The Most High will be revealed on the judgment seat, \f + \fr 7:33 \ft The Syriac adds \fqa and the end will come. \f* and compassion will pass away, and patience will be withdrawn. +\v 34 Only judgment will remain. Truth will stand. Faith will grow strong. +\v 35 Recompense will follow. The reward will be shown. Good deeds will awake, and wicked deeds won’t sleep.\f + \fr 7:35 \ft The passage from verse [36] to verse [105], formerly missing, has been restored to the text. See Preface, page ix. \f* +\v 36 The \f + \fr 7:36 \ft So the chief Oriental versions. The Latin MSS. have \fqa place. \f*pit of torment will appear, and near it will be the place of rest. The furnace of hell\f + \fr 7:36 \ft Lat. \fqa Gehenna. \f* will be shown, and near it the paradise of delight. +\v 37 Then the Most High will say to the nations that are raised from the dead, ‘Look and understand whom you have denied, whom you haven’t served, whose commandments you have despised. +\v 38 Look on this side and on that. Here is delight and rest, and there fire and torments.’ Thus \f + \fr 7:38 \ft So the chief Oriental versions. The Latin has \fqa will you speak. \f*he will speak to them in the day of judgment. +\v 39 This is a day that has neither sun, nor moon, nor stars, +\v 40 neither cloud, nor thunder, nor lightning, neither wind, nor water, nor air, neither darkness, nor evening, nor morning, +\v 41 neither summer, nor spring, nor heat, nor\f + \fr 7:41 \ft Or, \fqa storm \f* winter, neither frost, nor cold, nor hail, nor rain, nor dew, +\v 42 neither noon, nor night, nor dawn, neither shining, nor brightness, nor light, except only the splendor of the glory of the Most High, by which all will see the things that are set before them. +\v 43 It will endure as though it were a week of years. +\v 44 This is my judgment and its prescribed order; but I have only shown these things to you.” +\p +\v 45 I answered, “I said then, O Lord, and I say now: Blessed are those who are now alive and keep your commandments! +\v 46 But what about those for whom I prayed? For who is there of those who are alive who has not sinned, and who of the children of men hasn’t transgressed your covenant? +\v 47 Now I see that the world to come will bring delight to few, but torments to many. +\v 48 For an evil heart has grown up in us, which has led us astray from these commandments and has brought us into corruption and into the ways of death. It has shown us the paths of perdition and removed us far from life—and that, not a few only, but nearly all who have been created.” +\p +\v 49 He answered me, “Listen to me, and I will instruct you. I will admonish you yet again. +\v 50 For this reason, the Most High has not made one world, but two. +\v 51 For because you have said that the just are not many, but few, and the ungodly abound, hear the explanation. +\v 52 If you have just a few precious stones, will you add them to lead and clay?” +\p +\v 53 I said, “Lord, how could that be?” +\p +\v 54 He said to me, “Not only that, but ask the earth, and she will tell you. Defer to her, and she will declare it to you. +\v 55 Say to her, ‘You produce gold, silver, and brass, and also iron, lead, and clay; +\v 56 but silver is more abundant than gold, and brass than silver, and iron than brass, and lead than iron, and clay than lead.’ +\v 57 Judge therefore which things are precious and to be desired, what is abundant or what is rare?” +\p +\v 58 I said, “O sovereign Lord, that which is plentiful is of less worth, for that which is more rare is more precious.” +\p +\v 59 He answered me, “Weigh within yourself the things that you have thought, for he who has what is hard to get rejoices over him who has what is plentiful. +\v 60 So also is the judgment which I have promised; for I will rejoice over the few that will be saved, because these are those who have made my glory to prevail now, and through them, my name is now honored. +\v 61 I won’t grieve over the multitude of those who perish; for these are those who are now like mist, and have become like flame and smoke; they are set on fire and burn hotly, and are extinguished.” +\p +\v 62 I answered, “O earth, why have you produced, if the mind is made out of dust, like all other created things? +\v 63 For it would have been better that the dust itself had been unborn, so that the mind might not have been made from it. +\v 64 But now the mind grows with us, and because of this we are tormented, because we perish and we know it. +\v 65 Let the race of men lament and the animals of the field be glad. Let all who are born lament, but let the four-footed animals and the livestock rejoice. +\v 66 For it is far better with them than with us; for they don’t look forward to judgment, neither do they know of torments or of salvation promised to them after death. +\v 67 For what does it profit us, that we will be preserved alive, but yet be afflicted with torment? +\v 68 For all who are born are defiled with iniquities, and are full of sins and laden with transgressions. +\v 69 If after death we were not to come into judgment, perhaps it would have been better for us.” +\p +\v 70 He answered me, “When the Most High made the world and Adam and all those who came from him, he first prepared the judgment and the things that pertain to the judgment. +\v 71 Now understand from your own words, for you have said that the mind grows with us. +\v 72 They therefore who dwell on the earth will be tormented for this reason, that having understanding they have committed iniquity, and receiving commandments have not kept them, and having obtained a law they dealt unfaithfully with that which they received. +\v 73 What then will they have to say in the judgment, or how will they answer in the last times? +\v 74 For how long a time has the Most High been patient with those who inhabit the world, and not for their sakes, but because of the times which he has foreordained!” +\p +\v 75 I answered, “If I have found grace in your sight, O Lord, show this also to your servant, whether after death, even now when every one of us gives up his soul, we will be kept in rest until those times come, in which you renew the creation, or whether we will be tormented immediately.” +\p +\v 76 He answered me, “I will show you this also; but don’t join yourself with those who are scorners, nor count yourself with those who are tormented. +\v 77 For you have a treasure of works laid up with the Most High, but it won’t be shown you until the last times. +\v 78 For concerning death the teaching is: When the decisive sentence has gone out from the Most High that a man shall die, as the spirit leaves the body to return again to him who gave it, it adores the glory of the Most High first of all. +\v 79 And if it is one of those who have been scorners and have not kept the way of the Most High, and that have despised his law, and who hate those who fear God, +\v 80 these spirits won’t enter into habitations, but will wander and be in torments immediately, ever grieving and sad, in seven ways. +\v 81 The first way, because they have despised the law of the Most High. +\v 82 The second way, because they can’t now make a good repentance that they may live. +\v 83 The third way, they will see the reward laid up for those who have believed the covenants of the Most High. +\v 84 The fourth way, they will consider the torment laid up for themselves in the last days. +\v 85 The fifth way, they will see the dwelling places of the others guarded by angels, with great quietness. +\v 86 The sixth way, they will see how immediately some of them will pass into torment. +\v 87 The seventh way, which is more grievous than all the aforesaid ways, because they will pine away in confusion and be consumed with shame, and will be withered up by fears, seeing the glory of the Most High before whom they have sinned while living, and before whom they will be judged in the last times. +\p +\v 88 “Now this is the order of those who have kept the ways of the Most High, when they will be separated from their mortal body. +\v 89 In the time that they lived in it, they painfully served the Most High, and were in jeopardy every hour, that they might keep the law of the lawgiver perfectly. +\v 90 Therefore this is the teaching concerning them: +\v 91 First of all they will see with great joy the glory of him who takes them up, for they will have rest in seven orders. +\v 92 The first order, because they have labored with great effort to overcome the evil thought which was fashioned together with them, that it might not lead them astray from life into death. +\v 93 The second order, because they see the perplexity in which the souls of the ungodly wander, and the punishment that awaits them. +\v 94 The third order, they see the testimony which he who fashioned them gives concerning them, that while they lived they kept the law which was given them in trust. +\v 95 The fourth order, they understand the rest which, being gathered in their chambers, they now enjoy with great quietness, guarded by angels, and the glory that awaits them in the last days. +\v 96 The fifth order, they rejoice that they have now escaped from that which is corruptible, and that they will inherit that which is to come, while they see in addition the difficulty and the pain from which they have been delivered, and the spacious liberty which they will receive with joy and immortality. +\v 97 The sixth order, when it is shown to them how their face will shine like the sun, and how they will be made like the light of the stars, being incorruptible from then on. +\v 98 The seventh order, which is greater than all the previously mentioned orders, because they will rejoice with confidence, and because they will be bold without confusion, and will be glad without fear, for they hurry to see the face of him whom in their lifetime they served, and from whom they will receive their reward in glory. +\v 99 This is the order of the souls of the just, as from henceforth is announced to them. Previously mentioned are the ways of torture which those who would not give heed will suffer from after this.” +\p +\v 100 I answered, “Will time therefore be given to the souls after they are separated from the bodies, that they may see what you have described to me?” +\p +\v 101 He said, “Their freedom will be for seven days, that for seven days they may see the things you have been told, and afterwards they will be gathered together in their habitations.” +\p +\v 102 I answered, “If I have found favor in your sight, show further to me your servant whether in the day of judgment the just will be able to intercede for the ungodly or to entreat the Most High for them, +\v 103 whether fathers for children, or children for parents, or kindred for kindred, or kinsfolk for their next of kin, or friends for those who are most dear.” +\p +\v 104 He answered me, “Since you have found favor in my sight, I will show you this also. The day of judgment is\f + \fr 7:104 \ft The Latin has \fqa a bold day \f* a day of decision, and displays to all the seal of truth. Even as now a father doesn’t send his son, or a son his father, or a master his slave, or a friend him that is most dear, that in his place he may understand, or sleep, or eat, or be healed, +\v 105 so no one will ever pray for another in that day, neither will one lay a burden on another, for then everyone will each bear his own righteousness or unrighteousness.” +\p +\v 106 I answered, “How do we now find that first Abraham prayed for the people of Sodom, and Moses for the ancestors who sinned in the wilderness, +\v 107 and Joshua after him for Israel in the days of \x + \xo 7:107 \xt Joshua 7:1 \x*Achan, +\v 108 and Samuel \f + \fr 7:108 \ft So the Syriac and other versions. The Latin omits \fqa in the days of Saul. \f*in the days of Saul, and David for the plague, and Solomon for those who would worship in the sanctuary, +\v 109 and Elijah for those that received rain, and for the dead, that he might live, +\v 110 and Hezekiah for the people in the days of Sennacherib, and many others prayed for many? +\v 111 If therefore now, when corruption has grown and unrighteousness increased, the righteous have prayed for the ungodly, why will it not be so then also?” +\p +\v 112 He answered me, “This present world is not the end. The full glory doesn’t remain in it. Therefore those who were able prayed for the weak. +\v 113 But the day of judgment will be the end of this age, and the beginning of the immortality to come, in which corruption has passed away, +\v 114 intemperance is at an end, infidelity is cut off, but righteousness has grown, and truth has sprung up. +\v 115 Then no one will be able to have mercy on him who is condemned in judgment, nor to harm someone who is victorious.” +\p +\v 116 I answered then, “This is my first and last saying, that it would have been better if the earth had not produced Adam, or else, when it had produced him, to have restrained him from sinning. +\v 117 For what profit is it for all who are in this present time to live in heaviness, and after death to look for punishment? +\v 118 O Adam, what have you done? For though it was you who sinned, the evil hasn’t fallen on you alone, but on all of us who come from you. +\v 119 For what profit is it to us, if an immortal time is promised to us, but we have done deeds that bring death? +\v 120 And that there is promised us an everlasting hope, but we have most miserably failed? +\v 121 And that there are reserved habitations of health and safety, but we have lived wickedly? +\v 122 And that the glory of the Most High will defend those who have led a pure life, but we have walked in the most wicked ways of all? +\v 123 And that a paradise will be revealed, whose fruit endures without decay, in which is abundance and healing, but we won’t enter into it, +\v 124 for we have lived in perverse ways? +\v 125 And that the faces of those who have practiced self-control will shine more than the stars, but our faces will be blacker than darkness? +\v 126 For while we lived and committed iniquity, we didn’t consider what we would have to suffer after death.” +\p +\v 127 Then he answered, “This is the significance of the battle which humans born on the earth will fight: +\v 128 if they are overcome, they will suffer as you have said, but if they get the victory, they will receive the thing that I say. +\v 129 For this is the way that Moses spoke to the people while he lived, saying, ‘Choose life, that you may live!’ +\v 130 Nevertheless they didn’t believe him or the prophets after him, not even me, who have spoken to them. +\v 131 Therefore there won’t be such heaviness in their destruction, as there will be joy over those who are assured of salvation.” +\p +\v 132 Then I answered, “I know, Lord, that the Most High is now called merciful, in that he has mercy upon those who have not yet come into the world; +\v 133 and compassionate, in that he has compassion upon those who turn to his law; +\v 134 and patient, in that he is patient with those who have sinned, since they are his creatures; +\v 135 and bountiful, in that he is ready to give rather than to take away; +\v 136 and very merciful, in that he multiplies more and more mercies to those who are present, and who are past, and also to those who are to come— +\v 137 for if he wasn’t merciful, the world wouldn’t continue with those who dwell in it— +\v 138 and one who forgives, for if he didn’t forgive out of his goodness, that those who have committed iniquities might be relieved of them, not even one ten thousandth part of mankind would remain living; +\v 139 and a judge, for if he didn’t pardon those who were created by his word, and blot out the multitude of sins, +\v 140 there would perhaps be very few left of an innumerable multitude.” +\c 8 +\p +\v 1 He answered me, “The Most High has made this world for many, but the world to come for few. +\v 2 Now I will tell you a parable, Esdras. Just as when you ask the earth, it will say to you that it gives very much clay from which earthen vessels are made, but little dust that gold comes from. Even so is the course of the present world. +\v 3 Many have been created, but few will be saved.” +\p +\v 4 I answered, “Drink your fill of understanding then, O my soul, and let my heart devour wisdom. +\v 5 For you \f + \fr 8:5 \ft So the Syriac. The Latin is incorrect. \f*have come here apart from your will, and depart against your will, for you have only been given a short time to live. +\v 6 O Lord over us, grant to your servant that we may pray before you, and give us seed for our heart and cultivation for our understanding, that fruit may grow from it, by which everyone who is corrupt, who bears the \f + \fr 8:6 \ft So the Syriac. The Latin has \fqa place. \f*likeness of a man, may live. +\v 7 For you alone exist, and we all one workmanship of your hands, just as you have said. +\v 8 Because you give life to the body that is now fashioned in the womb, and give it members, your creature is preserved in fire and water, and your workmanship endures nine months as your creation which is created in it. +\v 9 But that which keeps and that which is kept will both be kept \f + \fr 8:9 \ft So the Syriac. The Latin is imperfect. \f*by your keeping. When the womb gives up again what has grown in it, +\v 10 you have commanded that out of the parts of the body, that is to say, out of the breasts, be given milk, which is the fruit of the breasts, +\v 11 that the body that is fashioned may be nourished for a time, and afterwards you guide it in your mercy. +\v 12 Yes, you have brought it up in your righteousness, nurtured it in your law, and corrected it with your judgment. +\v 13 You put it to death as your creation, and make it live as your work. +\v 14 If therefore you \f + \fr 8:14 \ft So the Syriac. The Latin is incorrect. \f*lightly and suddenly destroy him which with so great labor was fashioned by your commandment, to what purpose was he made? +\v 15 Now therefore I will speak. About man in general, you know best, but about your people for whose sake I am sorry, +\v 16 and for your inheritance, for whose cause I mourn, for Israel, for whom I am heavy, and for the seed of Jacob, for whose sake I am troubled, +\v 17 therefore I will begin to pray before you for myself and for them; for I see the failings of us who dwell in the land; +\v 18 but I have heard the swiftness of the judgment which is to come. +\v 19 Therefore hear my voice, and understand my saying, and I will speak before you.” +\p The beginning of the words of Esdras, before he was taken up. He said, +\v 20 “O Lord, you who remain forever, whose eyes are exalted, and whose chambers are in the air, +\v 21 whose throne is beyond measure, whose glory is beyond comprehension, before whom the army of angels stand with trembling, +\v 22 \f + \fr 8:22 \ft According to the chief Oriental versions. The Latin has, even they \fqa whose service takes the form of wind etc. \f* at whose bidding they are changed to wind and fire, whose word is sure, and sayings constant, whose ordinance is strong, and commandment fearful, +\v 23 whose look dries up the depths, and whose indignation makes the mountains to melt away, and whose truth bears witness— +\v 24 hear, O Lord, the prayer of your servant, and give ear to the petition of your handiwork. +\v 25 Attend to my words, for as long as I live, I will speak, and as long as I have understanding, I will answer. +\v 26 Don’t look at the sins of your people, but on those who have served you in truth. +\v 27 Don’t regard the doings of those who act wickedly, but of those who have kept your covenants in affliction. +\v 28 Don’t think about those who have lived wickedly before you, but remember those who have willingly known your fear. +\v 29 Let it not be your will to destroy those who have lived like cattle, but look at those who have \f + \fr 8:29 \ft The Syriac has \fqa received the brightness of your law. \f*clearly taught your law. +\v 30 Don’t be indignant at those who are deemed worse than animals, but love those who have always put their trust in your glory. +\v 31 For we and our fathers have \f + \fr 8:31 \ft So the Syriac and Aethiopic versions. \f*passed our lives in \f + \fr 8:31 \ft Lat. \fqa manners. \f*ways that bring death, but you are called merciful because of us sinners. +\v 32 For if you have a desire to have mercy upon us who have no works of righteousness, then you will be called merciful. +\v 33 For the just, which have many good works laid up with you, will be rewarded for their own deeds. +\v 34 For what is man, that you should take displeasure at him? Or what is a corruptible race, that you should be so bitter toward it? +\v 35 For in truth, there is no man among those who are born who has not done wickedly, and among those who have lived, there is none which have not done wrong. +\v 36 For in this, O Lord, your righteousness and your goodness will be declared, if you are merciful to those who have no store of good works.” +\p +\v 37 Then he answered me, “Some things you have spoken rightly, and it will happen according to your words. +\v 38 For indeed I will not think about the fashioning of those who have sinned, or about their death, their judgment, or their destruction; +\v 39 but I will rejoice over the creation of the righteous and their pilgrimage, their salvation, and the reward that they will have. +\v 40 Therefore as I have spoken, so it will be. +\v 41 For as the farmer sows many seeds in the ground, and plants many trees, and yet not all that is sown will \f + \fr 8:41 \ft Lat. \fqa be saved. \f*come up in due season, neither will all that is planted take root, even so those who are sown in the world will not all be saved.” +\p +\v 42 Then I answered, “If I have found favor, let me speak before you. +\v 43 If the farmer’s seed doesn’t come up because it hasn’t received your rain in due season, or if it is ruined by too much rain and perishes, +\v 44 likewise man, who is formed with your hands and is called your own image, because he is made like you, for whose sake you have formed all things, even him have you made like the farmer’s seed. +\v 45 Don’t be angry with us, but spare your people and have mercy upon your inheritance, for you have mercy upon your own creation.” +\p +\v 46 Then he answered me, “Things present are for those who live now, and things to come for those who will live hereafter. +\v 47 For you come far short of being able to love my creature more than I. But you have compared yourself to the unrighteous. Don’t do that! +\v 48 Yet in this will you be admirable to the Most High, +\v 49 in that you have humbled yourself, as it becomes you, and have not judged yourself among the righteous, so as to be much glorified. +\v 50 For many grievous miseries will fall on those who dwell in the world in the last times, because they have walked in great pride. +\v 51 But understand for yourself, and for those who inquire concerning the glory of those like you, +\v 52 because paradise is opened to you. The tree of life is planted. The time to come is prepared. Plenteousness is made ready. A city is built. Rest is \f + \fr 8:52 \ft The Syriac has \fqa established. \f*allowed. Goodness is perfected, and wisdom is perfected beforehand. +\v 53 The root of evil is sealed up from you. Weakness is done away from you, and \f + \fr 8:53 \ft After the chief Oriental versions. \f*death is hidden. Hell and corruption have fled into forgetfulness. +\v 54 Sorrows have passed away, and in the end, the treasure of immortality is shown. +\v 55 Therefore ask no more questions concerning the multitude of those who perish. +\v 56 For when they had received liberty, they despised the Most High, scorned his law, and forsook his ways. +\v 57 Moreover they have trodden down his righteous, +\v 58 and said in their heart that there is no God—even knowing that they must die. +\v 59 For as the things I have said will welcome you, so thirst and pain which are prepared for them. For the Most High didn’t intend that men should be destroyed, +\v 60 but those who are created have themselves defiled the name of him who made them, and were unthankful to him who prepared life for them. +\v 61 Therefore my judgment is now at hand, +\v 62 which I have not shown to all men, but to you, and a few like you.” +\p Then I answered, +\v 63 “Behold, O Lord, now you have shown me the multitude of the wonders which you will do in the last times, but you haven’t shown me when.” +\c 9 +\p +\v 1 He answered me, “Measure diligently within yourself. When you see that a certain part of the signs are past, which have been told you beforehand, +\v 2 then will you understand that it is the very time in which the Most High will visit the world which was made by him. +\v 3 When earthquakes, tumult of peoples, plans of nations, wavering of leaders, and confusion of princes are seen in the world, +\v 4 then will you understand that the Most High spoke of these things from the days that were of old, from the beginning. +\v 5 For just as with everything that is made in the world, the beginning \f + \fr 9:5 \ft So the Syriac. The Latin is corrupt. \f*is evident and the end manifest, +\v 6 so also are the times of the Most High: the beginnings are manifest in wonders and mighty works, and the end in effects and signs. +\v 7 Everyone who will be saved, and will be able to escape by his works, or by faith by which they have believed, +\v 8 will be preserved from the said perils, and will see my salvation in my land and within my borders, which I have sanctified for myself from the beginning. +\v 9 Then those who now have abused my ways will be amazed. Those who have cast them away despitefully will live in torments. +\v 10 For as many as in their life have received benefits, and yet have not known me, +\v 11 and as many as have scorned my law, while they still had liberty and when an opportunity to repent was open to them, didn’t understand, but despised \f + \fr 9:11 \ft Or, me \f* it, +\v 12 must know \f + \fr 9:12 \ft Or, me \f*it in torment after death. +\v 13 Therefore don’t be curious any longer how the ungodly will be punished, but inquire how the righteous will be saved, \f + \fr 9:13 \ft So the Syriac and other versions. The Latin has \fqa and whose... \ft created, \fqa and when. \f*those who the world belongs to, and for whom the world was created.” +\p +\v 14 I answered, +\v 15 “I have said before, and now speak, and will say it again hereafter, that there are more of those who perish than of those who will be saved, +\v 16 like a wave is greater than a drop.” +\p +\v 17 He answered me, “Just as the field is, so also the seed. As the flowers are, so are the colors. As the work is, so also is the \f + \fr 9:17 \ft So the Aethiopic and Arabic. The Latin has \fqa creation. \f*judgment on it. As is the farmer, so also is his threshing floor. For there was a time in the world +\v 18 when I was preparing for those who now live, before the world was made for them to dwell in. Then no one spoke against me, +\v 19 for \f + \fr 9:19 \ft So the Syriac. \f*no one existed. But now those who are created in this world that is prepared, both \f + \fr 9:19 \ft So the Syriac. \f*with a table that doesn’t fail and a law which is unsearchable, are corrupted in their ways. +\v 20 So I considered my world, and behold, it was destroyed, and my earth, and behold, it was in peril, because of the plans that had come into it. +\v 21 I saw and spared them, but not greatly, and saved myself a grape out of a cluster, and a plant out of \f + \fr 9:21 \ft So the Syriac and other versions. The Latin has \fqa great tribes. \f*a great forest. +\v 22 Let the multitude perish then, which were born in vain. Let my grape be saved, and my plant, for I have made them perfect with great labor. +\v 23 Nevertheless, if you will wait seven more days—however don’t fast in them, +\v 24 but go into a field of flowers, where no house is built, and eat only of the flowers of the field, and you shall taste no flesh, and shall drink no wine, but shall eat flowers only— +\v 25 and pray to the Most High continually, then I will come and talk with you.” +\p +\v 26 So I went my way, just as he commanded me, into the field which is called \f + \fr 9:26 \ft The Syriac and Aethiopic have \fqa Arphad. \f*Ardat. There I sat among the flowers, and ate of the herbs of the field, and this food satisfied me. +\v 27 It came to pass after seven days that I lay on the grass, and my heart was troubled again, like before. +\v 28 My mouth was opened, and I began to speak before the Lord Most High, and said, +\v 29 “O Lord, you showed yourself among us, to our fathers in the wilderness, when they went out of Egypt, and when they came into the wilderness, where no man treads and that bears no fruit. +\v 30 You said, ‘Hear me, O Israel. Heed my words, O seed of Jacob. +\v 31 For behold, I sow my law in you, and it will bring forth fruit in you, and you will be glorified in it forever.’ +\v 32 But our fathers, who received the law, didn’t keep it, and didn’t observe the statutes. The fruit of the law didn’t perish, for it couldn’t, because it was yours. +\v 33 Yet those who received it perished, because they didn’t keep the thing that was sown in them. +\v 34 Behold, it is a custom that when the ground has received seed, or the sea a ship, or any vessel food or drink, and when it comes to pass that that which is sown, or that which is launched, +\v 35 or the things which have been received, should come to an end, these come to an end, but the receptacles remain. Yet with us, it doesn’t happen that way. +\v 36 For we who have received the law will perish by sin, along with our heart which received it. +\v 37 Notwithstanding the law doesn’t perish, but remains in its honor.” +\p +\v 38 When I spoke these things in my heart, I looked around me with my eyes, and on my right side I saw a woman, and behold, she mourned and wept with a loud voice, and was much grieved in mind. Her clothes were torn, and she had ashes on her head. +\v 39 Then let I my thoughts go in which I was occupied, and turned myself to her, +\v 40 and said to her, “Why are you weeping? Why are you grieved in your mind?” +\p +\v 41 She said to me, “Leave me alone, my Lord, that I may weep for myself and add to my sorrow, for I am very troubled in my mind, and brought very low.” +\p +\v 42 I said to her, “What ails you? Tell me.” +\p +\v 43 She said to me, “I, your servant, was barren and had no child, though I had a husband thirty years. +\v 44 Every hour and every day these thirty years I made my prayer to the Most High day and night. +\v 45 It came to pass after thirty years that God heard me, your handmaid, and saw my low estate, and considered my trouble, and gave me a son. I rejoiced in him greatly, I and my husband, and all my \f + \fr 9:45 \ft Lat. \fqa townsmen. \f*neighbors. We gave great honor to the Mighty One. +\v 46 I nourished him with great care. +\v 47 So when he grew up, and I came to take him a wife, I made him a feast day. +\c 10 +\p +\v 1 “So it came to pass that when my son was entered into his wedding chamber, he fell down and died. +\v 2 Then we all put out the lamps, and all my \f + \fr 10:2 \ft Lat. \fqa townsmen. \f*neighbors rose up to comfort me. I remained quiet until the second day at night. +\v 3 It came to pass, when they had all stopped consoling me, encouraging me to be quiet, then rose I up by night, and fled, and came here into this field, as you see. +\v 4 Now I don’t intend to return into the city, but to stay here, and not eat or drink, but to continually mourn and fast until I die.” +\p +\v 5 Then I left the reflections I was engaged in, and answered her in anger, +\v 6 “You most foolish woman, don’t you see our mourning, and what has happened to us? +\v 7 For Zion the mother of us all is full of sorrow, and much humbled. +\v 8 \f + \fr 10:8 \ft See the Oriental versions. The Latin is corrupt. \f*It is right now to mourn deeply, since we all mourn, and to be sorrowful, since we are all in sorrow, but you are mourning for one son. +\v 9 Ask the earth, and she will tell you that it is she which ought to mourn for so many that grow upon her. +\v 10 For out of her, all had their beginnings, and others will come; and, behold, almost all of them walk into destruction, and the multitude of them is utterly doomed. +\v 11 Who then should mourn more, \f + \fr 10:11 \ft So the Syriac. \f*she who has lost so great a multitude, or you, who are grieved but for one? +\v 12 But if you say to me, ‘My lamentation is not like the earth’s, for I have lost the fruit of my womb, which I brought forth with pains, and bare with sorrows;’ +\v 13 but it is with the earth after the manner of the earth. The multitude present in it has gone as it came. +\v 14 Then say I to you, ‘Just as you have brought forth with sorrow, even so the earth also has given her fruit, namely, people, ever since the beginning to him who made her.’ +\v 15 Now therefore keep your sorrow to yourself, and bear with a good courage the adversities which have happened to you. +\v 16 For if you will acknowledge the decree of God to be just, you will both receive your son in time, and will be praised among women. +\v 17 Go your way then into the city to your husband.” +\p +\v 18 She said to me, “I won’t do that. I will not go into the city, but I will die here.” +\p +\v 19 So I proceeded to speak further to her, and said, +\v 20 “Don’t do so, but allow yourself to be persuaded by reason of the adversities of Zion; and be comforted by reason of the sorrow of Jerusalem. +\v 21 For you see that our sanctuary has been laid waste, our altar broken down, our temple destroyed, +\v 22 our lute has been brought low, our song is put to silence, our rejoicing is at an end, the light of our candlestick is put out, the ark of our covenant is plundered, our holy things are defiled, and the name that we are called is profaned. Our free men are despitefully treated, our priests are burned, our Levites have gone into captivity, our virgins are defiled and our wives ravished, our righteous men carried away, our little ones betrayed, our young men are brought into bondage, and our strong men have become weak. +\v 23 What is more than all, the seal of Zion has now lost the seal of her honor, and is delivered into the hands of those who hate us. +\v 24 Therefore shake off your great heaviness, and put away from yourself the multitude of sorrows, that the Mighty One may be merciful to you again, and the Most High may give you rest, even ease from your troubles.” +\p +\v 25 It came to pass while I was talking with her, behold, her face suddenly began to shine exceedingly, and her countenance glistered like lightning, so that I was very afraid of her, and wondered what this meant. +\v 26 Behold, suddenly she made a great and very fearful cry, so that the earth shook at the noise. +\v 27 I looked, and behold, the woman appeared to me no more, but there was a city built, and a place shown itself from large foundations. Then I was afraid, and cried with a loud voice, +\v 28 “Where is Uriel the angel, who came to me at the first? For he has caused me to fall into this great trance, and my end has turned into corruption, and my prayer a reproach!” +\p +\v 29 As I was speaking these words, behold, the angel who had come to me at first came to me, and he looked at me. +\v 30 Behold, I lay as one who had been dead, and my understanding was taken from me. He took me by the right hand, and comforted me, and set me on my feet, and said to me, +\v 31 “What ails you? Why are you so troubled? Why is your understanding and the thoughts of your heart troubled?” +\p +\v 32 I said, “Because you have forsaken me; yet I did according to your words, and went into the field, and, behold, I have seen, and still see, that which I am not able to explain.” +\p +\v 33 He said to me, “Stand up like a man, and I will instruct you.” +\p +\v 34 Then I said, “Speak on, my Lord; only don’t forsake me, lest I die before my time. +\v 35 For I have seen what I didn’t know, and hear what I don’t know. +\v 36 Or is my sense deceived, or my soul in a dream? +\v 37 Now therefore I beg you to explain to your servant what this vision means.” +\p +\v 38 He answered me, “Listen to me, and I will inform you, and tell you about the things you are afraid of, for the Most High has revealed many secret things to you. +\v 39 He has seen that your way is righteous, because you are continually sorry for your people, and make great lamentation for Zion. +\v 40 This therefore is the meaning of the vision. +\v 41 The woman who appeared to you a little while ago, whom you saw mourning, and began to comfort her, +\v 42 but now you no longer see the likeness of the woman, but a city under construction appeared to you, +\v 43 and she told you of the death of her son, this is the interpretation: +\v 44 This woman, whom you saw, is Zion,\f + \fr 10:44 \ft So the Syriac and other versions. The Latin is incorrect.\f* whom you now see as a city being built. +\v 45 She told you that she had been barren for thirty years because there were three thousand years in the world in which there was no offering as yet offered in her. +\v 46 And it came to pass after three thousand years that Solomon built the city and offered offerings. It was then that the barren bore a son. +\v 47 She told you that she nourished him with great care. That was the dwelling in Jerusalem. +\v 48 When she said to you, ‘My son died when he entered into his marriage chamber, and that misfortune befell her,’ this was the destruction that came to Jerusalem. +\v 49 Behold, you saw her likeness, how she mourned for her son, and you began to comfort her for what has happened to her. These were the things to be opened to you. +\v 50 For now the Most High, seeing that you are sincerely grieved and suffer from your whole heart for her, has shown you the brightness of her glory and the attractiveness of her beauty. +\v 51 Therefore I asked you to remain in the field where no house was built, +\v 52 for I knew that the Most High would show this to you. +\v 53 Therefore I commanded you to come into the field, where no foundation of any building was. +\v 54 For no human construction could stand in the place in which the city of the Most High was to be shown. +\v 55 Therefore don’t be afraid nor let your heart be terrified, but go your way in and see the beauty and greatness of the building, as much as your eyes are able to see. +\v 56 Then will you hear as much as your ears may comprehend. +\v 57 For you are more blessed than many, and are called by name to be with the Most High, like only a few. +\v 58 But tomorrow at night you shall remain here, +\v 59 and so the Most High will show you those visions in dreams of what the Most High will do to those who live on the earth in the last days.” +\p So I slept that night and another, as he commanded me. +\c 11 +\p +\v 1 It came to pass the second night that I saw a dream, and behold, an eagle which had twelve feathered wings and three heads came up from the sea. +\v 2 I saw, and behold, she spread her wings over all the earth, and all the winds of heaven blew on her, \f + \fr 11:2 \ft So the chief Oriental versions. The Latin has only \fqa and were gathered together. \f*and the clouds were gathered together against her. +\v 3 I saw, and out of her wings there grew other wings near them; and they became little, tiny wings. +\v 4 But her heads were at rest. The head in the middle was larger than the other heads, yet rested it with them. +\v 5 Moreover I saw, and behold, the eagle flew with her wings to reign over the earth and over those who dwell therein. +\v 6 I saw how all things under heaven were subject to her, and no one spoke against her—no, not one creature on earth. +\v 7 I saw, and behold, the eagle rose on her talons, and uttered her voice to her wings, saying, +\v 8 “Don’t all watch at the same time. Let each one sleep in his own place and watch in turn; +\v 9 but let the heads be preserved for the last.” +\p +\v 10 I saw, and behold, the voice didn’t come out of her heads, but from the midst of her body. +\v 11 I counted \f + \fr 11:11 \ft The Syriac has \fqa her little wings, and, etc. \f*her wings that were near the others, and behold, there were eight of them. +\v 12 I saw, and behold, on the right side one wing arose and reigned over all the earth. +\v 13 When it reigned, the end of it came, and it disappeared, so that its place appeared no more. The next wing rose up and reigned, and it ruled a long time. +\v 14 It happened that when it reigned, its end came also, so that it disappeared, like the first. +\v 15 Behold, a voice came to it, and said, +\v 16 “Listen, you who have ruled over the earth all this time! I proclaim this to you, before you disappear, +\v 17 none after you will rule as long as you, not even half as long.” +\p +\v 18 Then the third arose, and ruled as the others before, and it also disappeared. +\v 19 So it went with all the wings one after another, as every one ruled, and then disappeared. +\v 20 I saw, and behold, in process of time the \f + \fr 11:20 \ft The Syriac has \fqa little wings. \f*wings that followed were set up on the \f + \fr 11:20 \ft The Aethiopic has \fqa left. \f*right side, that they might rule also. Some of them ruled, but in a while they disappeared. +\v 21 Some of them also were set up, but didn’t rule. +\p +\v 22 After this I saw, and behold, the twelve wings disappeared, along with two of the little wings. +\v 23 There was no more left on the eagle’s body, except the three heads that rested, and six little wings. +\v 24 I saw, and behold, two little wings divided themselves from the six and remained under the head that was on the right side; but four remained in their place. +\v 25 I saw, and behold, these \f + \fr 11:25 \ft The Syriac has \fqa little wings. \f*under wings planned to set themselves up and to rule. +\v 26 I saw, and behold, there was one set up, but in a while it disappeared. +\v 27 A second also did so, and it disappeared faster than the first. +\v 28 I saw, and behold, the two that remained also planned between themselves to reign. +\v 29 While they thought about it, behold, one of the heads that were at rest awakened, the one that was in the middle, for that was greater than the two other heads. +\v 30 I saw how it joined the two other heads with it. +\v 31 Behold, the head turned with those who were with it, and ate the two \f + \fr 11:31 \ft The Syriac has \fqa little wings. \f*under wings that planned to reign. +\v 32 But this head held the whole earth in possession, and ruled over those who dwell in it with much oppression. It had stronger governance over the world than all the wings that had gone before. +\p +\v 33 After this I saw, and behold, the head also that was in the middle suddenly disappeared, like the wings. +\v 34 But the two heads remained, which also reigned the same way over the earth and over those who dwell in it. +\v 35 I saw, and behold, the head on the right side devoured the one that was on the left side. +\p +\v 36 Then I heard a voice, which said to me, “Look in front of you, and consider the thing that you see.” +\p +\v 37 I saw, and behold, something like a lion roused out of the woods roaring. I heard how he sent out a man’s voice to the eagle, and spoke, saying, +\v 38 “Listen and I will talk with you. The Most High will say to you, +\v 39 ‘Aren’t you the one that remains of the four animals whom I made to reign in my world, that the end of my times might come through them? +\v 40 The fourth came and overcame all the animals that were past, and ruled the world with great trembling, and the whole extent of the earth with grievous oppression. He lived on the earth such a long time with deceit. +\v 41 You have judged the earth, but not with truth. +\v 42 For you have afflicted the meek, you have hurt the peaceful, you have hated those who speak truth, you have loved liars, destroyed the dwellings of those who produced fruit, and threw down the walls of those who did you no harm. +\v 43 Your insolence has come up to the Most High, and your pride to the Mighty. +\v 44 The Most High also has looked at his times, and behold, they are ended, and his ages are fulfilled. +\v 45 Therefore appear no more, you eagle, nor your horrible wings, nor your evil little wings, nor your cruel heads, nor your hurtful talons, nor all your worthless body, +\v 46 that all the earth may be refreshed and relieved, being delivered from your violence, and that she may hope for the judgment and mercy of him who made her.’” +\c 12 +\p +\v 1 It came to pass, while the lion spoke these words to the eagle, I saw, +\v 2 and behold, the head that remained disappeared, and \f + \fr 12:2 \ft So the chief Oriental versions. \f*the two wings which went over to it arose and set themselves up to reign; and their kingdom was brief and full of uproar. +\v 3 I saw, and behold, they disappeared, and the whole body of the eagle was burned, so that the earth was in great fear. +\p Then I woke up because of great perplexity of mind and great fear, and said to my spirit, +\v 4 “Behold, you have done this to me, because you search out the ways of the Most High. +\v 5 Behold, I am still weary in my mind, and very weak in my spirit. There isn’t even a little strength in me, because of the great fear with which I was frightened tonight. +\v 6 Therefore I will now ask the Most High that he would strengthen me to the end.” +\p +\v 7 Then I said, “O sovereign Lord, if I have found favor in your sight, and if I am justified with you more than many others, and if my prayer has indeed come up before your face, +\v 8 strengthen me then, and show me, your servant, the interpretation and plain meaning of this fearful vision, that you may fully comfort my soul. +\v 9 For you have judged me worthy to show me the end of time and the last events of the times.” +\p +\v 10 He said to me, “This is the interpretation of this vision which you saw: +\v 11 The eagle, whom you saw come up from the sea, is the fourth kingdom which appeared in a vision to your brother Daniel. +\v 12 But it was not explained to him, as I now explain it to you or have explained it. +\v 13 Behold, the days come that a kingdom will rise up on earth, and it will be feared more than all the kingdoms that were before it. +\v 14 Twelve kings will reign in it, one after another. +\v 15 Of those, the second will begin to reign, and will reign a longer time than others of the twelve. +\v 16 This is the interpretation of the twelve wings which you saw. +\v 17 As for when you heard a voice which spoke, not going out from the heads, but from the midst of its body, this is the interpretation: +\v 18 That \f + \fr 12:18 \ft The Oriental versions have\fqa in the midst of. \f*after the time of that kingdom, there will arise no small contentions, and it will stand in peril of falling. Nevertheless, it won’t fall then, but will be restored again to its former power. +\v 19 You saw the eight under wings sticking to her wings. This is the interpretation: +\v 20 That in it eight kings will arise, whose times will be short and their years swift. +\v 21 Two of them will perish when the middle time approaches. Four will be kept for a while until the time of the ending of it will approach; but two will be kept to the end. +\v 22 You saw three heads resting. This is the interpretation: +\v 23 In its last days, the Most High will raise up three \f + \fr 12:23 \ft The Oriental versions have \fqa kings \f*kingdoms and renew many things in them. They will rule over the earth, +\v 24 and over those who dwell in it, with much oppression, more than all those who were before them. Therefore they are called the heads of the eagle. +\v 25 For these are those who will accomplish her wickedness, and who will finish her last actions. +\v 26 You saw that the great head disappeared. It signifies that one of them will die on his bed, and yet with pain. +\v 27 But for the two that remained, the sword will devour them. +\v 28 For the sword of the one will devour him that was with him, but he will also fall by the sword in the last days. +\v 29 You saw two under wings passing \f + \fr 12:29 \ft So the Syriac. The Latin has \fqa over the head. \f*over to the head that is on the right side. +\v 30 This is the interpretation: These are they whom the Most High has kept to his end. This is the brief reign that was full of trouble, as you saw. +\p +\v 31 “The lion, whom you saw rising up out of the forest, roaring, speaking to the eagle, and rebuking her for her unrighteousness, and all her words which you have heard, +\v 32 this is the anointed one, whom the Most High has kept to the end \f + \fr 12:32 \ft The words in brackets are added from the Syriac. \f*[of days, who will spring up out of the seed of David, and he will come and speak] to them and reprove them for their wickedness and unrighteousness, and will\f + \fr 12:32 \ft The Syriac has \fqa set in order.\f* heap up before them their contemptuous dealings. +\v 33 For at first he will set them alive in his judgment, and when he has reproved them, he will destroy them. +\v 34 For he will deliver the rest of my people with mercy, those who have been preserved throughout my borders, and he will make them joyful until the coming of the end, even the day of judgment, about which I have spoken to you from the beginning. +\v 35 This is the dream that you saw, and this is its interpretation. +\v 36 Only you have been worthy to know the secret of the Most High. +\v 37 Therefore write all these things that you have seen in a book, and put it in a secret place. +\v 38 You shall teach them to the wise of your people, whose hearts you know are able to comprehend and keep these secrets. +\v 39 But wait here yourself seven more days, that you may be shown whatever it pleases the Most High to show you.” Then he departed from me. +\p +\v 40 It came to pass, when all the people \f + \fr 12:40 \ft So the Syriac. The Latin has \fqa heard. \f*saw that the seven days were past, and I had not come again into the city, they all gathered together, from the least to the greatest, and came to me, and spoke to me, saying, +\v 41 “How have we offended you? What evil have we done against you, that you have utterly forsaken us, and sit in this place? +\v 42 For of all the prophets, only you are left to us, like a cluster of the vintage, and like a lamp in a dark place, and like a harbor for a ship saved from the tempest. +\v 43 Aren’t the evils which have come to us sufficient? +\v 44 If you will forsake us, how much better had it been for us if we also had been consumed in the burning of Zion! +\v 45 For we are not better than those who died there.” Then they wept with a loud voice. I answered them, +\v 46 “Take courage, O Israel! Don’t be sorrowful, you house of Jacob; +\v 47 for the Most High remembers you. The Mighty has not forgotten you \f + \fr 12:47 \ft So the Syriac. \f*forever. +\v 48 As for me, I have not forsaken you. I haven’t departed from you; but I have come into this place to pray for the desolation of Zion, and that I might seek mercy for the humiliation of your sanctuary. +\v 49 Now go your way, every man to his own house, and after these days I will come to you.” +\p +\v 50 So the people went their way into the city, as I told them to do. +\v 51 But I sat in the field seven days, as the angel commanded me. In those days, I ate only of the flowers of the field, and my food was from plants. +\c 13 +\p +\v 1 It came to pass after seven days, I dreamed a dream by night. +\v 2 Behold, a wind arose from the sea that moved all its waves. +\v 3 I saw, and behold, \f + \fr 13:3 \ft The words in brackets are added from the Syriac.\f*[this wind caused to come up from the midst of the sea something like the appearance of a man. I saw, and behold,] that man \f + \fr 13:3 \ft So the Syriac. The Latin has \fqa grew strong \f*flew with the clouds of heaven. When he turned his face to look, everything that he saw trembled. +\v 4 Whenever the voice went out of his mouth, all who heard his voice melted, like the \f + \fr 13:4 \ft So the Syriac and other Oriental versions.\f*wax melts when it feels the fire. +\p +\v 5 After this I saw, and behold, an innumerable multitude of people was gathered together from the four winds of heaven to make war against the man who came out of the sea. +\v 6 I saw, and behold, he carved himself a great mountain, and flew up onto it. +\v 7 I tried to see the region or place from which the mountain was carved, and I couldn’t. +\p +\v 8 After this I saw, and behold, all those who were gathered together to fight against him were very afraid, and yet they dared to fight. +\v 9 Behold, as he saw the assault of the multitude that came, he didn’t lift up his hand, or hold a spear or any weapon of war; +\v 10 but I saw only how he sent out of his mouth something like a flood of fire, and out of his lips a flaming breath, and out of his tongue he shot out a storm of sparks.\f + \fr 13:10 \ft So the Syriac and Arabic. \f* +\v 11 These were all mixed together: the flood of fire, the flaming breath, and the great storm, and fell upon the assault of the multitude which was prepared to fight, and burned up every one of them, so that all of a sudden an innumerable multitude was seen to be nothing but dust of ashes and smell of smoke. When I saw this, I was amazed. +\p +\v 12 Afterward, I saw the same man come down from the mountain, and call to himself another multitude which was peaceful. +\v 13 Many people came to him. Some of them were glad. Some were sorry. Some of them were bound, and some others brought some of those as offerings. Then through great fear I woke up and prayed to the Most High, and said, +\v 14 “You have shown your servant these wonders from the beginning, and have counted me worthy that you should receive my prayer. +\v 15 Now show me also the interpretation of this dream. +\v 16 For as I conceive in my understanding, woe to those who will be left in those days! Much more woe to those who are not left! +\v 17 For those who were not left will be in heaviness, +\v 18 understanding the things that are laid up in the latter days, but not attaining to them. +\v 19 But woe to them also who are left, because they will see great perils and much distress, like these dreams declare. +\v 20 Yet is it \f + \fr 13:20 \ft Lat. \fqa easier. \f*better for one to be in peril and to come into \f + \fr 13:20 \ft So the Syriac. \f*these things, than to pass away as a cloud out of the world, and not to see the things that \f + \fr 13:20 \ft So the Syriac. \f*will happen in the last days.” +\p He answered me, +\v 21 “I will tell you the interpretation of the vision, and I will also open to you the things about which you mentioned. +\v 22 You have spoken of those who are left behind. This is the interpretation: +\v 23 He that will \f + \fr 13:23 \ft So the Syriac. \f*endure the peril in that time will protect those who fall into danger, even those who have works and faith toward the Almighty. +\v 24 Know therefore that those who are left behind are more blessed than those who are dead. +\v 25 These are the interpretations of the vision: Whereas you saw a man coming up from the midst of the sea, +\v 26 this is he whom the Most High has been keeping for many ages, who by his own self will deliver his creation. He will direct those who are left behind. +\v 27 Whereas you saw that out of his mouth came wind, fire, and storm, +\v 28 and whereas he held neither spear, nor any weapon of war, but destroyed the assault of that multitude which came to fight against him, this is the interpretation: +\v 29 Behold, the days come when the Most High will begin to deliver those who are on the earth. +\v 30 Astonishment of mind will come upon those who dwell on the earth. +\v 31 One will plan to make war against another, city against city, place against place, people against people, and kingdom against kingdom. +\v 32 It will be, when these things come to pass, and the signs happen which I showed you before, then my Son will be revealed, whom you saw as a man ascending. +\v 33 It will be, when all the nations hear his voice, every man will leave his own land and the battle they have against one another. +\v 34 An innumerable multitude will be gathered together, as you saw, desiring to come and to fight against him. +\v 35 But he will stand on the top of Mount Zion. +\v 36 Zion will come, and will be shown to all men, being prepared and built, like you saw the mountain carved without hands. +\v 37 My Son will rebuke the nations which have come for their wickedness, with plagues that are like a storm, +\v 38 and will rebuke them to their face with their evil thoughts, and the torments with which they will be tormented, which are like a flame. He will destroy them without labor by the law, which is like fire. +\v 39 Whereas you saw that he gathered to himself another multitude that was peaceful, +\v 40 these are the ten tribes which were led away out of their own land in the time of Osea the king, whom Salmananser the king of the Assyrians led away captive, and he carried them beyond the River, and they were taken into another land. +\v 41 But they made this plan among themselves, that they would leave the multitude of the heathen, and go out into a more distant region, where mankind had never lived, +\v 42 that there they might keep their statutes which they had not kept in their own land. +\v 43 They entered by the narrow passages of the river Euphrates. +\v 44 For the Most High then did signs for them, and stopped the springs of the River until they had passed over. +\v 45 For through that country there was a long way to go, namely, of a year and a half. The same region is called \f + \fr 13:45 \ft That is, \fqa another land. \ft See Deuteronomy 29:28. \f*Arzareth. +\v 46 Then they lived there until the latter time. Now when they begin to come again, +\v 47 the Most High stops the springs of the River again, that they may go through. Therefore you saw the multitude gathered together with peace. +\v 48 But those who are left behind of your people are those who are found within my holy border. +\v 49 It will be therefore when he will destroy the multitude of the nations that are gathered together, he will defend the people who remain. +\v 50 Then will he show them very many wonders.” +\p +\v 51 Then I said, “O sovereign Lord, explain this to me: Why have I seen the man coming up from the midst of the sea?” +\p +\v 52 He said to me, as no one can explore or know what is in the depths of the sea, even so no man on earth can see my Son, or those who are with him, except in the time of \f + \fr 13:52 \ft So the Oriental versions. The Latin omits \fqa his. \f*his day. +\v 53 This is the interpretation of the dream which you saw, and for this only you are enlightened about this, +\v 54 for you have forsaken your own ways, and applied your diligence to mine, and have searched out my law. +\v 55 You have ordered your life in wisdom, and have called understanding your mother. +\v 56 Therefore I have shown you this, for there is a reward laid up with the Most High. It will be, after another three days I will speak other things to you, and declare to you mighty and wondrous things.” +\p +\v 57 Then I went out and passed into the field, giving praise and thanks greatly to the Most High because of his wonders, which he did from time to time, +\v 58 and because he governs the time, and such things as happen in their seasons. So I sat there three days. +\c 14 +\p +\v 1 It came to pass upon the third day, I sat under an oak, and, behold, a voice came out of a bush near me, and said, “Esdras, Esdras!” +\p +\v 2 I said, “Here I am, Lord,” and I stood up on my feet. +\p +\v 3 Then he said to me, “I revealed myself in a bush and talked with Moses when my people were in bondage in Egypt. +\v 4 I sent him, and \f + \fr 14:4 \ft Another reading is. \fqa I. \f* he led my people out of Egypt. I brought him up to Mount Sinai, where I kept him with me for many days. +\v 5 I told him many wondrous things, and showed him the secrets of the times and the end of the seasons. I commanded him, saying, +\v 6 ‘You shall publish these openly, and these you shall hide.’ +\v 7 Now I say to you: +\v 8 Lay up in your heart the signs that I have shown, the dreams that you have seen, and the interpretations which you have heard; +\v 9 for you will be taken away from men, and from now on you will live with my Son and with those who are like you, until the times have ended. +\v 10 For the world has lost its youth, and the times begin to grow old. +\v 11 \f + \fr 14:11 \ft Verses 11, 12 are omitted in the Syriac. The Aethiopic has \fqa For the age is divided into ten parts, and is come to the tenth: and half of the tenth remains. Now etc. \f*For the age is divided into twelve parts, and ten parts of it are already gone, \f + \fr 14:11 \ft Lat. \fqa and. \f*even the half of the tenth part. +\v 12 There remain of it two parts after the middle of the tenth part. +\v 13 Now therefore set your house in order, reprove your people, comfort the lowly among them, \f + \fr 14:13 \ft The Latin alone omits \fqa and...wise. \f* and instruct those of them who are wise, and now renounce the life that is corruptible, +\v 14 and let go of the mortal thoughts, cast away from you the burdens of man, put off now your weak nature, +\v 15 lay aside the thoughts that are most grievous to you, and hurry to escape from these times. +\v 16 For worse evils than those which you have seen happen will be done after this. +\v 17 For look how much the world will be weaker through age, so much that more evils will increase on those who dwell in it. +\v 18 For the truth will withdraw itself further off, and falsehood will be near. For now \f + \fr 14:18 \ft So the Oriental versions. \f*the eagle which you saw in vision hurries to come.” +\p +\v 19 Then I answered and said, \f + \fr 14:19 \ft The Latin omits \fqa I will speak. \f*“Let me speak in your presence, O Lord. +\v 20 Behold, I will go, as you have commanded me, and reprove the people who now live, but who will warn those who will be born afterward? For the world is set in darkness, and those who dwell in it are without light. +\v 21 For your law has been burned, therefore no one knows the things that are done by you, or the works that will be done. +\v 22 But if I have found favor before you, send the Holy Spirit to me, and I will write all that has been done in the world since the beginning, even the things that were written in your law, that men may be able to find the path, and that those who would live in the latter days may live.” +\p +\v 23 He answered me and said, “Go your way, gather the people together, and tell them not to seek you for forty days. +\v 24 But prepare for yourself many tablets, and take with you Sarea, Dabria, Selemia, Ethanus, and Asiel, these five, which are ready to write swiftly; +\v 25 and come here, and I will light a lamp of understanding in your heart which will not be put out until the things have ended about which you will write. +\v 26 When you are done, some things you shall publish openly, and some things you shall deliver in secret to the wise. Tomorrow at this hour you will begin to write.” +\p +\v 27 Then went I out, as he commanded me, and gathered all the people together, and said, +\v 28 “Hear these words, O Israel! +\v 29 Our fathers at the beginning were foreigners in Egypt, and they were delivered from there, +\v 30 and received the law of life, which they didn’t keep, which you also have transgressed after them. +\v 31 Then the land of Zion was given to you for a possession; but you yourselves and your ancestors have done unrighteousness, and have not kept the ways which the Most High commanded you. +\v 32 Because he is a righteous judge, in due time, he took from you what he had given you. +\v 33 Now you are here, and your kindred are among you. +\v 34 Therefore if you will rule over your own understanding and instruct your hearts, you will be kept alive, and after death you will obtain mercy. +\v 35 For after death the judgment will come, when we will live again. Then the names of the righteous will become manifest, and the works of the ungodly will be declared. +\v 36 Let no one therefore come to me now, nor seek me for forty days.” +\p +\v 37 So I took the five men, as he commanded me, and we went out into the field, and remained there. +\v 38 It came to pass on the next day that, behold, a voice called me, saying, “Esdras, open your mouth, and drink what I give you to drink.” +\p +\v 39 Then opened I my mouth, and behold, a full cup was handed to me. It was full of something like water, but its color was like fire. +\v 40 I took it, and drank. When I had drunk it, my heart uttered understanding, and wisdom grew in my breast, for my spirit retained its memory. +\v 41 My mouth was opened, and shut no more. +\v 42 The Most High gave understanding to the five men, and they wrote by course the things that were told them, in \f + \fr 14:42 \ft So the Oriental versions. \f*characters which they didn’t know, and they sat forty days. Now they wrote in the day-time, and at night they ate bread. +\v 43 As for me, I spoke in the day, and by night I didn’t hold my tongue. +\v 44 So in forty days, ninety-four books were written. +\p +\v 45 It came to pass, when the forty days were fulfilled, that the Most High spoke to me, saying, “The first books that you have written, publish openly, and let the worthy and unworthy read them; +\v 46 but keep the last seventy, that you may deliver them to those who are wise among your people; +\v 47 for in them is the spring of understanding, the fountain of wisdom, and the stream of knowledge.” +\p +\v 48 I did so. +\c 15 +\p +\v 1 “Behold, speak in the ears of my people the words of prophecy which I will put in your mouth,” says the Lord. +\v 2 “Cause them to be written on paper, for they are faithful and true. +\v 3 Don’t be afraid of their plots against you. Don’t let the unbelief of those who speak against you trouble you. +\v 4 For all the unbelievers will die in their unbelief. +\p +\v 5 “Behold,” says the Lord, “I bring evils on the whole earth: sword, famine, death, and destruction. +\v 6 For wickedness has prevailed over every land, and their hurtful works have reached their limit. +\v 7 Therefore,” says the Lord, +\v 8 “I will hold my peace no more concerning their wickedness which they profanely commit, neither will I tolerate them in these things, which they wickedly practice. Behold, the innocent and righteous blood cries to me, and the souls of the righteous cry out continually. +\v 9 I will surely avenge them,” says the Lord, “and will receive to me all the innocent blood from among them. +\v 10 Behold, my people is led like a flock to the slaughter. I will not allow them now to dwell in the land of Egypt, +\v 11 but I will bring them out with a mighty hand and with a high arm, and will strike Egypt with plagues, as before, and will destroy all its land.” +\p +\v 12 Let Egypt and its foundations mourn, for the plague of the chastisement and the punishment that God will bring upon it. +\v 13 Let the farmers that till the ground mourn, for their seeds will fail and their trees will be ruined through the blight and hail, and a terrible tempest. +\v 14 Woe to the world and those who dwell in it! +\v 15 For the sword and their destruction draws near, and nation will rise up against nation to battle with weapons in their hands. +\v 16 For there will be sedition among men, and growing strong against one another. In their might, they won’t respect their king or the chief of their great ones. +\v 17 For a man will desire to go into a city, and will not be able. +\v 18 For because of their pride the cities will be troubled, the houses will be destroyed, and men will be afraid. +\v 19 A man will have no pity on his neighbors, but will assault their houses with the sword and plunder their goods, because of the lack of bread, and for great suffering. +\p +\v 20 “Behold,” says God, “I call together all the kings of the earth to stir up those who are from the rising of the sun, from the south, from the east, and Libanus, to turn themselves one against another, and repay the things that they have done to them. +\v 21 Just as they do yet this day to my chosen, so I will do also, and repay into their bosom.” The Lord God says: +\v 22 “My right hand won’t spare the sinners, and my sword won’t cease over those who shed innocent blood on the earth. +\v 23 A fire has gone out from his wrath and has consumed the foundations of the earth and the sinners, like burnt straw. +\v 24 Woe to those who sin and don’t keep my commandments!” says the Lord. +\v 25 “I will not spare them. Go your way, you rebellious children! Don’t defile my sanctuary!” +\v 26 For the Lord knows all those who trespass against him, therefore he will deliver them to death and destruction. +\v 27 For now evils have come upon the whole earth, and you will remain in them; for God will not deliver you, because you have sinned against him. +\p +\v 28 Behold, a horrible sight appearing from the east! +\v 29 The nations of the dragons of Arabia will come out with many chariots. From the day that they set out, their hissing is carried over the earth, so that all those who will hear them may also fear and tremble. +\v 30 Also the Carmonians, raging in wrath, will go out like the wild boars of the forest. They will come with great power and join battle with them, and will devastate a portion of the land of the Assyrians with their teeth. +\v 31 Then the dragons will have the upper hand, remembering their nature. If they will turn themselves, conspiring together in great power to persecute them, +\v 32 then these will be troubled, and keep silence through their power, and will turn and flee. +\v 33 From the land of the Assyrians, an enemy in ambush will attack them and destroy one of them. Upon their army will be fear and trembling, and indecision upon their kings. +\p +\v 34 Behold, clouds from the east, and from the north to the south! They are very horrible to look at, full of wrath and storm. +\v 35 They will clash against one another. They will pour out a heavy storm on the earth, even their own storm. There will be blood from the sword to the horse’s belly, +\v 36 and to the thigh of man, and to the camel’s hock. +\v 37 There will be fearfulness and great trembling upon earth. They who see that wrath will be afraid, and trembling will seize them. +\v 38 After this, great storms will be stirred up from the south, from the north, and another part from the west. +\v 39 Strong winds will arise from the east, and will shut it up, even the cloud which he raised up in wrath; and the storm that was to cause destruction by the east wind will be violently driven toward the south and west. +\v 40 Great and mighty clouds, full of wrath, will be lifted up with the storm, that they may destroy all the earth and those who dwell in it. They will pour out over every high and lofty one a terrible storm, +\v 41 fire, hail, flying swords, and many waters, that all plains may be full, and all rivers, with the abundance of those waters. +\v 42 They will break down the cities and walls, mountains and hills, trees of the forest, and grass of the meadows, and their grain. +\v 43 They will go on steadily to Babylon and destroy her. +\v 44 They will come to it and surround it. They will pour out the storm and all wrath on her. Then the dust and smoke will go up to the sky, and all those who are around it will mourn for it. +\v 45 Those who remain will serve those who have destroyed it. +\p +\v 46 You, Asia, who are partaker in the beauty of Babylon, and in the glory of her person— +\v 47 woe to you, you wretch, because you have made yourself like her. You have decked out your daughters for prostitution, that they might please and glory in your lovers, which have always lusted after you! +\v 48 You have followed her who is hateful in all her works and inventions. Therefore God says, +\v 49 “I will send evils on you: widowhood, poverty, famine, sword, and pestilence, to lay waste your houses and bring you to destruction and death. +\v 50 The glory of your power will be dried up like a flower when the heat rises that is sent over you. +\v 51 You will be weakened like a poor woman who is beaten and wounded, so that you won’t be able to receive your mighty ones and your lovers. +\v 52 Would I have dealt with you with such jealousy,” says the Lord, +\v 53 “if you had not always slain my chosen, exalting and clapping of your hands, and saying over their dead, when you were drunk? +\p +\v 54 “Beautify your face! +\v 55 The reward of a prostitute will be in your bosom, therefore you will be repaid. +\v 56 Just as you will do to my chosen,” says the Lord, “even so God will do to you, and will deliver you to your adversaries. +\v 57 Your children will die of hunger. You will fall by the sword. Your cities will be broken down, and all your people in the field will perish by the sword. +\v 58 Those who are in the mountains will die of hunger, eat their own flesh, and drink their own blood, because of hunger for bread and thirst for water. +\v 59 You, unhappy above all others, will come and will again receive evils. +\v 60 In the passage, they will rush on the hateful city and will destroy some portion of your land, and mar part of your glory, and will return again to Babylon that was destroyed. +\v 61 You will be cast down by them as stubble, and they will be to you as fire. +\v 62 They will devour you, your cities, your land, and your mountains. They will burn all your forests and your fruitful trees with fire. +\v 63 They will carry your children away captive, and will plunder your wealth, and mar the glory of your face.” +\c 16 +\p +\v 1 Woe to you, Babylon, and Asia! Woe to you, Egypt and Syria! +\v 2 Put on sackcloth and garments of goats’ hair, wail for your children and lament; for your destruction is at hand. +\v 3 A sword has been sent upon you, and who is there to turn it back? +\v 4 A fire has been sent upon you, and who is there to quench it? +\v 5 Calamities are sent upon you, and who is there to drive them away? +\v 6 Can one drive away a hungry lion in the forest? Can one quench a fire in stubble, once it has begun to burn? +\v 7 Can one turn back an arrow that is shot by a strong archer? +\v 8 The Lord God sends the calamities, and who will drive them away? +\v 9 A fire will go out from his wrath, and who may quench it? +\v 10 He will flash lightning, and who will not fear? He will thunder, and who wouldn’t tremble? +\v 11 The Lord will threaten, and who will not be utterly broken in pieces at his presence? +\v 12 The earth and its foundations quake. The sea rises up with waves from the deep, and its waves will be troubled, along with the fish in them, at the presence of the Lord, and before the glory of his power. +\v 13 For his right hand that bends the bow is strong, his arrows that he shoots are sharp, and will not miss when they begin to be shot into the ends of the world. +\v 14 Behold, the calamities are sent out, and will not return again until they come upon the earth. +\v 15 The fire is kindled and will not be put out until it consumes the foundations of the earth. +\v 16 Just as an arrow which is shot by a mighty archer doesn’t return backward, even so the calamities that are sent out upon earth won’t return again. +\v 17 Woe is me! Woe is me! Who will deliver me in those days? +\p +\v 18 The beginning of sorrows, when there will be great mourning; the beginning of famine, and many will perish; the beginning of wars, and the powers will stand in fear; the beginning of calamities, and all will tremble! What will they do when the calamities come? +\v 19 Behold, famine and plague, suffering and anguish! They are sent as scourges for correction. +\v 20 But for all these things they will not turn them from their wickedness, nor be always mindful of the scourges. +\v 21 Behold, food will be so cheap on earth that they will think themselves to be in good condition, and even then calamities will grow on earth: sword, famine, and great confusion. +\v 22 For many of those who dwell on earth will perish of famine; and others who escape the famine, the sword will destroy. +\v 23 The dead will be cast out like dung, and there will be no one to comfort them; for the earth will be left desolate, and its cities will be cast down. +\v 24 There will be no farmer left to cultivate the earth or to sow it. +\v 25 The trees will give fruit, but who will gather it? +\v 26 The grapes will ripen, but who will tread them? For in all places there will be a great solitude; +\v 27 for one man will desire to see another, or to hear his voice. +\v 28 For of a city there will be ten left, and two of the field, who have hidden themselves in the thick groves, and in the clefts of the rocks. +\v 29 As in an orchard of olives upon every tree there may be left three or four olives, +\v 30 or as when a vineyard is gathered, there are some clusters left by those who diligently search through the vineyard, +\v 31 even so in those days, there will be three or four left by those who search their houses with the sword. +\v 32 The earth will be left desolate, and its fields will be for briers, and its roads and all her paths will grow thorns, because no sheep will pass along them. +\v 33 The virgins will mourn, having no bridegrooms. The women will mourn, having no husbands. Their daughters will mourn, having no helpers. +\v 34 Their bridegrooms will be destroyed in the wars, and their husbands will perish of famine. +\p +\v 35 Hear now these things, and understand them, you servants of the Lord. +\v 36 Behold, the Lord’s word: receive it. Don’t doubt the things about which the Lord speaks. +\v 37 Behold, the calamities draw near, and are not delayed. +\v 38 Just as a woman with child in the ninth month, when the hour of her delivery draws near, within two or three hours great pains surround her womb, and when the child comes out from the womb, there will be no waiting for a moment, +\v 39 even so the calamities won’t delay coming upon the earth. The world will groan, and sorrows will seize it on every side. +\p +\v 40 “O my people, hear my word: prepare for battle, and in those calamities be like strangers on the earth. +\v 41 He who sells, let him be as he who flees away, and he who buys, as one who will lose. +\v 42 Let he who does business be as he who has no profit by it, and he who builds, as he who won’t dwell in it, +\v 43 and he who sows, as if he wouldn’t reap, so also he who prunes the vines, as he who won’t gather the grapes, +\v 44 those who marry, as those who will have no children, and those who don’t marry, as the widowed. +\v 45 Because of this, those who labor, labor in vain; +\v 46 for foreigners will reap their fruits, plunder their goods, overthrow their houses, and take their children captive, for in captivity and famine they will conceive their children. +\v 47 Those who conduct business, do so only to be plundered. The more they adorn their cities, their houses, their possessions, and their own persons, +\v 48 the more I will hate them for their sins,” says the Lord. +\v 49 Just as a respectable and virtuous woman hates a prostitute, +\v 50 so will righteousness hate iniquity, when she adorns herself, and will accuse her to her face, when he comes who will defend him who diligently searches out every sin on earth. +\p +\v 51 Therefore don’t be like her or her works. +\v 52 For yet a little while, and iniquity will be taken away out of the earth, and righteousness will reign over us. +\v 53 Don’t let the sinner say that he has not sinned; for God will burn coals of fire on the head of one who says “I haven’t sinned before God and his glory.” +\v 54 Behold, the Lord knows all the works of men, their imaginations, their thoughts, and their hearts. +\v 55 He said, “Let the earth be made,” and it was made, “Let the sky be made,” and it was made. +\v 56 At his word, the stars were established, and he knows the number of the stars. +\v 57 He searches the deep and its treasures. He has measured the sea and what it contains. +\v 58 He has shut the sea in the midst of the waters, and with his word, he hung the earth over the waters. +\v 59 He has spread out the sky like a vault. He has founded it over the waters. +\v 60 He has made springs of water in the desert and pools on the tops of the mountains to send out rivers from the heights to water the earth. +\v 61 He formed man, and put a heart in the midst of the body, and gave him breath, life, and understanding, +\v 62 yes, the spirit of God Almighty. He who made all things and searches out hidden things in hidden places, +\v 63 surely he knows your imagination, and what you think in your hearts. Woe to those who sin, and try to hide their sin! +\v 64 Because the Lord will exactly investigate all your works, and he will put you all to shame. +\v 65 When your sins are brought out before men, you will be ashamed, and your own iniquities will stand as your accusers in that day. +\v 66 What will you do? Or how will you hide your sins before God and his angels? +\v 67 Behold, God is the judge. Fear him! Stop sinning, and forget your iniquities, to never again commit them. So will God lead you out, and deliver you from all suffering. +\p +\v 68 For, behold, the burning wrath of a great multitude is kindled over you, and they will take away some of you, and feed you with that which is sacrificed to idols. +\v 69 Those who consent to them will be held in derision and in contempt, and be trodden under foot. +\v 70 For there will be in various places, and in the next cities, a great insurrection against those who fear the Lord. +\v 71 They will be like mad men, sparing none, but spoiling and destroying those who still fear the Lord. +\v 72 For they will destroy and plunder their goods, and throw them out of their houses. +\v 73 Then the trial of my elect will be made known, even as the gold that is tried in the fire. +\v 74 Hear, my elect ones, says the Lord: “Behold, the days of suffering are at hand, and I will deliver you from them. +\v 75 Don’t be afraid, and don’t doubt, for God is your guide. +\v 76 You who keep my commandments and precepts,” says the Lord God, “don’t let your sins weigh you down, and don’t let your iniquities lift themselves up.” +\v 77 Woe to those who are choked with their sins and covered with their iniquities, like a field is choked with bushes, and its path covered with thorns, that no one may travel through! +\v 78 It is shut off and given up to be consumed by fire. diff --git a/c-sharp/assets/WEB/84MANengWEBUS.SFM b/c-sharp/assets/WEB/84MANengWEBUS.SFM new file mode 100644 index 0000000000..e6e89bc0cb --- /dev/null +++ b/c-sharp/assets/WEB/84MANengWEBUS.SFM @@ -0,0 +1,28 @@ +\id MAN +\h Prayer of Manasses +\toc1 The Prayer of Manasses King of Judah when He was Held Captive in Babylon +\toc2 Prayer of Manasses +\toc3 Man +\mt3 The +\mt1 Prayer of Manasses +\mt2 King of Judah, +\mt3 When He Was Held Captive in Babylon +\ip \bk The Prayer of Manasses\bk* is recognized as Deuterocanonical Scripture by the Greek Orthodox and Russian Orthodox Churches. It is included in an appendix to the Latin Vulgate Bible. +\c 1 + +\p +\v 1 O LORD Almighty in heaven, God of our fathers Abraham, Isaac, and Jacob, and of their righteous offspring, +\v 2 you who have made heaven and earth, with all their order, +\v 3 who have bound the sea by the word of your commandment, who have shut up the deep, and sealed it by your terrible and glorious name, +\v 4 whom all things fear, yes, tremble before your power, +\v 5 for the majesty of your glory can’t be borne, and the anger of your threatening toward sinners is unbearable. +\v 6 Your merciful promise is unmeasurable and unsearchable, +\v 7 for you are the Lord Most High, of great compassion, patient and abundant in mercy, and relent at human suffering. +\v 8 \f + \fr 1:8 \ft The Alex. MS. omits \fqa You... saved.\f*You, O Lord, according to your great goodness have promised repentance and forgiveness to those who have sinned against you. Of your infinite mercies, you have appointed repentance to sinners, that they may be saved. You therefore, O Lord, who are the God of the just, have not appointed repentance to the just, to Abraham, Isaac, and Jacob, which have not sinned against you, but you have appointed repentance to me who am a sinner. +\v 9 For I have sinned more than the number of the sands of the sea. My transgressions are multiplied,\f + \fr 1:9 \ft The Alex. MS. omits \fqa O Lord... multiplied.\f* O Lord, my transgressions are multiplied, and I am not worthy to behold and see the height of heaven for the multitude of my iniquities. +\v 10 I am bowed down with many iron bands, so that I can’t lift up my head by reason of my sins,\f + \fr 1:10 \ft Some authorities omit \fqa by reason of my sins.\f* neither have I any relief; for I have provoked your wrath, and done that which is evil before you:\f + \fr 1:10 \ft The Alex. MS. omits \fqa I did... commandments.\f* I didn’t do your will, neither did I keep your commandments. I have set up abominations, and have multiplied detestable things. +\v 11 Now therefore I bow the knee of my heart, asking you for grace. +\v 12 I have sinned, O Lord, I have sinned, and I acknowledge my iniquities; +\v 13 but, I humbly ask you, forgive me, O Lord, forgive me, and please don’t destroy me with my iniquities. Don’t be angry with me forever, by reserving evil for me. Don’t condemn me into the lower parts of the earth. For you, O Lord, are the God of those who repent. +\v 14 In me you will show all your goodness, for you will save me, who am unworthy, according to your great mercy. +\v 15 Then I will praise you forever all the days of my life; for all the army of heaven sings your praise, and yours is the glory forever and ever. Amen. diff --git a/c-sharp/assets/WEB/85PS2engWEBUS.SFM b/c-sharp/assets/WEB/85PS2engWEBUS.SFM new file mode 100644 index 0000000000..75bfe83627 --- /dev/null +++ b/c-sharp/assets/WEB/85PS2engWEBUS.SFM @@ -0,0 +1,33 @@ +\id PS2 +\h Psalm 151 +\toc1 Psalm 151 +\toc2 Psalm 151 +\toc3 Ps151 +\mt1 Psalm 151 +\ip \bk Psalm 151\bk* is recognized as Deuterocanonical Scripture by the Greek Orthodox and Russian Orthodox Churches. +\c 1 + +\cp 151 +\d This Psalm is a genuine one of David, though extra,\f + \fr 1:0 \ft or, supernumerary\f* composed when he fought in single combat with Goliath. +\q1 +\v 1 I was small among my brothers, +\q2 and youngest in my father’s house. +\q2 I tended my father’s sheep. +\q1 +\v 2 My hands formed a musical instrument, +\q2 and my fingers tuned a lyre. +\q1 +\v 3 Who shall tell my Lord? +\q2 The Lord himself, he himself hears. +\q1 +\v 4 He sent forth his angel and took me from my father’s sheep, +\q2 and he anointed me with his anointing oil. +\q1 +\v 5 My brothers were handsome and tall; +\q2 but the Lord didn’t take pleasure in them. +\q1 +\v 6 I went out to meet the Philistine, +\q2 and he cursed me by his idols. +\q1 +\v 7 But I drew his own sword and beheaded him, +\q2 and removed reproach from the children of Israel. diff --git a/c-sharp/assets/WEB/A0FRTengWEBUS.SFM b/c-sharp/assets/WEB/A0FRTengWEBUS.SFM new file mode 100644 index 0000000000..9185836471 --- /dev/null +++ b/c-sharp/assets/WEB/A0FRTengWEBUS.SFM @@ -0,0 +1,37 @@ +\id FRT Preface to the World English Bible +\h Preface +\toc1 Preface +\toc2 Preface +\toc3 Pre +\mt1 Preface to the World English Bible +\is1 What is the Holy Bible? +\ip The Holy Bible is a collection of books and letters written by many people who were inspired by the Holy Spirit of God. These books tell us how we can be saved from the evil of this world and gain eternal life that is truly worth living. Although the Holy Bible contains rules of conduct, it is not just a rule book. It reveals God’s heart—a Father’s heart, full of love and compassion. The Holy Bible tells you what you need to know and believe to be saved from sin and evil and how to live a life that is truly worth living, no matter what your current circumstances may be. +\ip The Holy Bible consists of two main sections: the Old Testament (including Psalms and Proverbs) and the New Testament (Matthew through Revelation). The Old Testament records God’s interaction with mankind before He sent His son to redeem us, while recording prophesy predicting that coming. The New Testament tells us of God’s Son and Anointed One, Jesus, and the wonderful salvation that He purchased for us. +\ip The same Holy Spirit who inspired the Holy Bible is living among us today, and He is happy to help you understand what He intended as you study His Word. Just ask Him, and He is more than happy to help you apply His message to your life. +\ip The Old Testament was originally written mostly in Hebrew. The New Testament was originally written mostly in the common street Greek (not the formal Greek used for official legal matters). The Holy Bible is translated into many languages, and being translated into many more, so that everyone may have an opportunity to hear the Good News about Jesus Christ.\f + \fr 1:0 \ft “Christ” means “Anointed One”.\f* +\is1 Why was the World English Bible translated? +\ip There are already many good translations of the Holy Bible into contemporary English. Unfortunately, almost all of them are restricted by copyright and copyright holder policy. This restricts publication and republication of God’s Word in many ways, such as in downloadable files on the Internet, use of extensive quotations in books, etc. The World English Bible was commissioned by God in response to prayer about this subject. +\ip Because the World English Bible is in the Public Domain (not copyrighted), it can be freely copied, distributed, and redistributed without any payment of royalties. You don’t even have to ask permission to do so. You may publish the whole World English Bible in book form, bind it in leather and sell it. You may incorporate it into your Bible study software. You may make and distribute audio recordings of it. You may broadcast it. All you have to do is maintain the integrity of God’s Word before God, and reserve the name “World English Bible” for faithful copies of this translation. +\is1 How was the World English Bible translated? +\ip The World English Bible is an update of the American Standard Version (ASV) of the Holy Bible, published in 1901. A custom computer program updated the archaic words and word forms to contemporary equivalents, and then a team of volunteers proofread and updated the grammar. The New Testament was updated to conform to the Majority Text reconstruction of the original Greek manuscripts, thus taking advantage of the superior access to manuscripts that we have now compared to when the original ASV was translated. +\is1 What is different about the World English Bible? +\ip The style of the World English Bible, while fairly literally translated, is in informal, spoken English. The World English Bible is designed to sound good and be accurate when read aloud. It is not formal in its language, just as the original Greek of the New Testament was not formal. The WEB uses contractions rather freely. +\ip The World English Bible doesn’t capitalize pronouns pertaining to God. The original manuscripts made no such distinction. Hebrew has no such thing as upper and lower case, and the original Greek manuscripts were written in all upper case letters. Attempting to add in such a distinction raises some difficulties in translating dual-meaning Scriptures such as the coronation psalms. +\ip The World English Bible main edition translates God’s Proper Name in the Old Testament as “Yahweh.” The Messianic Edition and the British Edition of the World English Bible translates the same name as “LORD” (all capital letters), or when used with “Lord” (mixed case, translated from “Adonai”,) GOD. There are solid translational arguments for both traditions. +\ip Because World English Bible uses the Majority Text as the basis for the New Testament, you may notice the following differences in comparing the WEB to other translations: +\ili The order of Matthew 23:13 and 14 is reversed in some translations. +\ili Luke 17:36 and Acts 15:34, which are not found in the majority of the Greek Manuscripts (and are relegated to footnotes in the WEB) may be included in some other translations. +\ili Romans 14:24-26 in the WEB may appear as Romans 16:25-27 in other translations. +\ili 1 John 5:7-8 contains an addition in some translations, including the KJV. Erasmus admitted adding this text to his published Greek New Testament, even though he could at first find no Greek manuscript support for it, because he was being pressured by men to do so, and because he didn’t see any doctrinal harm in it. Lots of things not written by John in this letter are true, but we decline to add them to what the Holy Spirit inspired through John. +\ip With all of the above and some other places where lack of clarity in the original manuscripts has led to multiple possible readings, significant variants are listed in footnotes. The reading that in our prayerful judgment is best is in the main text. Overall, the World English Bible doesn’t differ very much from several other good contemporary English translations of the Holy Bible. The message of Salvation through Jesus Christ is still the same. The point of this translation was not to be very different (except for legal status), but to update the ASV for readability while retaining or improving the accuracy of that well-respected translation and retaining the public domain status of the ASV. +\is1 Does the World English Bible include the Apocrypha? +\ip The World English Bible is an ecumenical project that includes books included in Bibles in many denominations. The main 66 books of the Old and New Testaments are recognized as Scripture by all true Christians. There are also books considered to be part of, depending on which book and who you ask, Deuterocanon, Apocrypha, and Pseudepigrapha. +\ip The following books and parts of books are recognized as Deuterocanonical Scripture by the Roman Catholic, Greek, and Russian Orthodox Churches: \bk Tobit\bk*, \bk Judith\bk*, \bk Esther from the Greek Septuagint\bk*, \bk The Wisdom of Solomon\bk*, \bk Ecclesiasticus\bk* (also called \bk The Wisdom of Jesus Son of Sirach\bk*), \bk Baruch\bk*, \bk The Song of the Three Holy Children\bk*, \bk Susanna\bk*, and \bk Bel and the Dragon\bk*, \bk 1 Maccabees\bk*, \bk 2 Maccabees\bk*. In this edition, \bk The Letter of Jeremiah\bk* is included as chapter 6 of \bk Baruch\bk*. Three of those books come from parts of Daniel found in the Greek Septuagint, but not the Hebrew Old Testament: \bk The Song of the Three Holy Children\bk*, \bk Susanna\bk*, and \bk Bel and the Dragon\bk*. These three are included in \bk Daniel (Greek)\bk*, in context, as they make more sense that way. +\ip The following books are recognized as Deuterocanonical Scripture by the Greek and Russian Orthodox Churches, but not the Roman Catholic Church: 1 Esdras, The Prayer of Manasseh, Psalm 151, and 3 Maccabees. Note that 1 Esdras and the Prayer of Manasseh are also in an appendix to the Latin Vulgate Bible. +\ip The Slavonic Bible includes 2 Esdras, but calls it 3 Esdras. This same book is in the Appendix to the Latin Vulgate as 4 Esdras. +\ip An appendix to the Greek Septuagint contains 4 Maccabees. It is included for its historical value. +\ip Among Christian denominations and among individual Christians, opinions vary widely on the Deuterocanon/Apocrypha, as do the collective names they give them. Many regard them as useful in gaining additional understanding of the Old and New Testaments and the hand of God in history, even if they don’t give them the same status as the 66 books of the Old and New Testaments. They are included here in support of the churches and individuals who read them and use them, as separate from, but frequently used with, the core canon of the 66 books of the Holy Bible. +\is1 What are MT, TR, and NU? +\ip In the footnotes, MT refers to the Greek Majority Text New Testament, which is the authoritative basis for this translation. TR stands for Textus Receptus, which is the Greek Text from which the King James Version New Testament was translated. NU stands for the Nestle-Aland/UBS critical text of the Greek New Testament, which is used as a basis for some other Bible translations. +\is1 More Information +\ip For answers to frequently asked questions about the World English Bible, please visit our web site at WorldEnglish.Bible. diff --git a/c-sharp/assets/WEB/A9GLOengWEBUS.SFM b/c-sharp/assets/WEB/A9GLOengWEBUS.SFM new file mode 100644 index 0000000000..776aa4a986 --- /dev/null +++ b/c-sharp/assets/WEB/A9GLOengWEBUS.SFM @@ -0,0 +1,196 @@ +\id GLO +\h Glossary +\toc1 World English Bible Glossary +\toc2 Glossary +\toc3 Glo +\mt1 World English Bible Glossary +\ip The following words used in the World English Bible (WEB) are not very common, either because they refer to ancient weights, measures, or money, or because they are in some way unique to the Bible. +\ili \k Abaddon\k* + Abaddon is Hebrew for destruction. +\ili \k Abba\k* + Abba is a Chaldee word for father, used in a respectful, affectionate, and familiar way, like papa, dad, or daddy. Often used in prayer to refer to our Father in Heaven. +\ili \k adultery\k* + Adultery is having sexual intercourse with someone besides your own husband or wife. In the Bible, the only legitimate sexual intercourse is between a man and a woman who are married to each other. +\ili \k alpha\k* + Alpha is the first letter of the Greek alphabet. It is sometimes used to mean the beginning or the first. +\ili \k amen\k* + Amen means “So be it” or “I believe it is certainly so.” +\ili \k angel\k* + “Angel” literally means “messenger” or “envoy,” and is usually used to refer to spiritual beings who normally are invisible to us, but can also appear as exceedingly strong creatures or as humans. +\ili \k Apollyon\k* + Apollyon is Greek for destroyer. +\ili \k apostle\k* + “Apostle” means a delegate, messenger, or one sent forth with orders. This term is applied in the New Testament in both a general sense connected with a ministry of establishing and strengthening church fellowships, as well as in a specific sense to “The 12 Apostles of the Lamb” (Revelation 21:14). The former category applies to a specific ministry that continues in the Church (Ephesians 4:11-13) and which includes many more than 12 people, while the latter refers to the apostles named in Matthew 10:2-4, except with Judas Iscariot replaced by Matthias (Acts 1:26). +\ili \k Armageddon\k* + See Har-magedon. +\ili \k assarion\k* + An assarion is a small Roman copper coin worth one tenth of a drachma, or about an hour’s wages for an agricultural laborer. +\ili \k aureus\k* + An aureus is a Roman gold coin, worth 25 silver denarii. An aureus weighed from 115 to 126.3 grains (7.45 to 8.18 grams). +\ili \k baptize\k* + Baptize means to immerse in, or wash with something, usually water. Baptism in the Holy Spirit, fire, the Body of Christ, and suffering are also mentioned in the New Testament, along with baptism in water. Baptism is not just to cleanse the body, but as an outward sign of an inward spiritual cleansing and commitment. Baptism is a sign of repentance, as practiced by John the Baptizer, and of faith in Jesus Christ, as practiced by Jesus’ disciples. +\ili \k bath\k* + A bath is a liquid measure of about 22 liters, 5.8 U. S. gallons, or 4.8 imperial gallons. +\ili \k batos\k* + A batos is a liquid measure of about 39.5 liters, 10.4 U. S. gallons, or 8.7 imperial gallons. +\ili \k Beelzebul\k* + literally, lord of the flies. A name used for the devil. +\ili \k Beersheba\k* + Beersheba is Hebrew for “well of the oath” or “well of the seven.” A city in Israel. +\ili \k behold\k* + Look! See! Wow! Notice this! Lo! +\ili \k cherub\k* + A cherub is a kind of angel with wings and hands that is associated with the throne room of God and guardian duty. See Ezekiel 10. +\ili \k cherubim\k* + Cherubim means more than one cherub or a mighty cherub. +\ili \k choenix\k* + A choenix is a dry volume measure that is a little more than a liter (which is a little more than a quart). A choenix was the daily ration of grain for a soldier in some armies. +\ili \k concubine\k* + a woman who is united to a man for the purpose of providing him with sexual pleasure and children, but not being honored as a full partner in marriage; a second-class wife. In Old Testament times (and in some places now), it was the custom of middle-eastern kings, chiefs, and wealthy men to marry multiple wives and concubines, but God commanded the Kings of Israel not to do so (Deuteronomy 17:17) and Jesus encouraged people to either remain single or marry as God originally intended: one man married to one woman (Matthew 19:3-12; 1 Corinthians 7:1-13). +\ili \k cor\k* + A cor is a dry measure of about 391 liters, 103 U. S. gallons, or 86 imperial gallons. +\ili \k corban\k* + Corban is a Hebrew word for an offering devoted to God. +\ili \k crucify\k* + Crucify means to execute someone by nailing them to a cross with metal spikes. Their hands are stretched out on the crossbeam with spikes driven through their wrists or hands. Their feet or ankles are attached to a cross with a metal spike. The weight of the victim’s body tends to force the air out of his lungs. To rise up to breathe, the victim has to put weight on the wounds, and use a lot of strength. The victim is nailed to the cross while the cross is on the ground, then the cross is raised up and dropped into a hole, thus jarring the wounds. Before crucifixion, the victim was usually whipped with a Roman cat of nine tails, which had bits of glass and metal tied to its ends. This caused chunks of flesh to be removed and open wounds to be placed against the raw wood of the cross. The victim was made to carry the heavy crossbeam of his cross from the place of judgment to the place of crucifixion, but often was physically unable after the scourging, so another person would be pressed into involuntary service to carry the cross for him. Roman crucifixion was generally done totally naked to maximize both shame and discomfort. Eventually, the pain, weakness, dehydration, and exhaustion of the muscles needed to breathe make breathing impossible, and the victim suffocates. +\ili \k cubit\k* + A cubit is a unit of linear measure, from the elbow to the tip of the longest finger of a man. This unit is commonly converted to 0.46 meters or 18 inches, although that varies with height of the man doing the measurement. There is also a “long” cubit that is longer than a regular cubit by a handbreadth. (Ezekiel 43:13) +\ili \k cummin\k* + Cummin is an aromatic seed from Cuminum cyminum, resembling caraway in flavor and appearance. It is used as a spice. +\ili \k darnel\k* + Darnel is a weed grass (probably bearded darnel or Lolium temulentum) that looks very much like wheat until it is mature, when the seeds reveal a great difference. Darnel seeds aren’t good for much except as chicken feed or to burn to prevent the spread of this weed. +\ili \k denarii\k* + denarii: plural form of denarius, a silver Roman coin worth about a day’s wages for a laborer. +\ili \k denarius\k* + A denarius is a silver Roman coin worth about a day’s wages for an agricultural laborer. A denarius was worth 1/25th of a Roman aureus. +\ili \k devil\k* + The word “devil” comes from the Greek “diabolos,” which means “one prone to slander; a liar.” “Devil” is used to refer to a fallen angel, also called “Satan,” who works to steal, kill, destroy, and do evil. The devil’s doom is certain, and it is only a matter of time before he is thrown into the Lake of Fire, never to escape. +\ili \k didrachma\k* + A didrachma is a Greek silver coin worth 2 drachmas, about as much as 2 Roman denarii, or about 2 days wages. It was commonly used to pay the half-shekel temple tax. +\ili \k disciple\k* + a student who follows a teacher to learn both by precept and example. +\ili \k distaff\k* + part of a spinning wheel used for twisting threads. +\ili \k drachma\k* + A drachma is a Greek silver coin worth about one Roman denarius, or about a day’s wages for an agricultural laborer. +\ili \k El-Elohe-Israel\k* + El-Elohe-Israel means “God, the God of Israel” or “The God of Israel is mighty.” +\ili \k ephah\k* + An ephah is a measure of volume of about 22 liters, 5.8 U. S. gallons, 4.8 imperial gallons, or a bit more than half a bushel. +\ili \k Gehenna\k* + Gehenna is one word used for Hell. It comes from the Hebrew Gey-Hinnom, literally “valley of Hinnom.” This word originated as the name for a place south of the old city of Jerusalem where the city’s rubbish was burned. At one time, live babies were thrown crying into the fire under the arms of the idol, Moloch, to die there. This place was so despised by the people after the righteous King Josiah abolished this hideous practice that it was made into a garbage heap. Bodies of diseased animals and executed criminals were thrown there and burned. +\ili \k gittith\k* + Gittith is a musical term possibly meaning “an instrument of Gath.” +\ili \k goad\k* + a sharp, pointed prodding device used to motivate reluctant animals (such as oxen and mules) to move in the right direction. +\ili \k gospel\k* + Gospel means “good news” or “glad tidings,” specifically the Good News of Jesus’ life, death, and resurrection for our salvation, healing, and provision; and the hope of eternal life that Jesus made available to us by God’s grace. +\ili \k Hades\k* + Hades: The nether realm of the disembodied spirits. Also known as “hell.” See also “Sheol”. +\ili \k Har-magedon\k* + Har-magedon, also called Armegeddon, is most likely a reference to hill (“har”) of Megiddo, near the Carmel Range in Israel. This area has a large valley plain with plenty of room for armies to maneuver. +\ili \k hin\k* + A hin is a measure of volume of about about 6.5 liters or 1.7 gallons. +\ili \k homer\k* + One homer is about 220 liters, 6.2 U. S. bushels, 6.1 imperial bushels, 58 U. S. gallons, or 48.4 imperial gallons. +\ili \k hypocrite\k* + a stage actor; someone who pretends to be someone other than who they really are; a pretender; a dissembler +\ili \k Ishmael\k* + Ishmael is the son of Abraham and Hagar. Ishmael literally means, “God hears.” +\ili \k Jehovah\k* + See “Yahweh.” +\ili \k Jesus\k* + “Jesus” is Greek for the Hebrew name “Yeshua,” which is a short version of “Yehoshua,” which comes from “Yoshia,” which means “He will save.” +\ili \k kodrantes\k* + A kodrantes is a small coin worth one half of an Attic chalcus or two lepta. It is worth less than 2% of a day’s wages for an agricultural laborer. +\ili \k lepta\k* + Lepta are very small, brass, Jewish coins worth half a Roman quadrans each, which is worth a quarter of the copper assarion. Lepta are worth less than 1% of an agricultural worker’s daily wages. +\ili \k leviathan\k* + Leviathan is a poetic name for a large aquatic creature, possibly a crocodile or a dinosaur. +\ili \k mahalath\k* + Mahalath is the name of a tune or a musical term. +\ili \k manna\k* + Name for the food that God miraculously provided to the Israelites while they were wandering in the wilderness between Egypt and the promised land. From Hebrew man-hu (What is that?) or manan (to allot). See Exodus 16:14-35. +\ili \k marriage\k* + the union of a husband and a wife for the purpose of cohabitation, procreation, and to enjoy each other’s company. God’s plan for marriage is between one man and one woman (Mark 10:6-9; 1 Corinthians 7). Although there are many cases of a man marrying more than one woman in the Old Testament, being married to one wife is a requirement to serve in certain church leadership positions (1 Timothy 3:2,12; Titus 1:5-6). +\ili \k maschil\k* + Maschil is a musical and literary term for “contemplation” or “meditative psalm.” +\ili \k michtam\k* + A michtam is a poem. +\ili \k mina\k* + A mina is a Greek coin worth 100 Greek drachmas (or 100 Roman denarii), or about 100 day’s wages for an agricultural laborer. +\ili \k myrrh\k* + Myrrh is the fragrant substance that oozes out of the stems and branches of the low, shrubby tree commiphora myrrha or commiphora kataf native to the Arabian deserts and parts of Africa. The fragrant gum drops to the ground and hardens into an oily yellowish-brown resin. Myrrh was highly valued as a perfume, and as an ingredient in medicinal and ceremonial ointments. +\ili \k Nicolaitans\k* + Nicolaitans were most likely Gnostics who taught the detestable lie that the physical and spiritual realms were entirely separate and that immorality in the physical realm wouldn’t harm your spiritual health. +\ili \k omega\k* + Omega is the last letter of the Greek alphabet. It is sometimes used to mean the last or the end. +\ili \k Peniel\k* + Peniel is Hebrew for “face of God.” +\ili \k phylactery\k* + a leather container for holding a small scroll containing important Scripture passages that is worn on the arm or forehead in prayer. These phylacteries (tefillin in Hebrew) are still used by orthodox Jewish men. See Deuteronomy 6:8. +\ili \k Praetorium\k* + Praetorium: the Roman governor’s residence and office building, and those who work there. +\ili \k quadrans\k* + A quadrans is a Roman coin worth about 1/64 of a denarius. A denarius is about one day’s wages for an agricultural laborer. +\ili \k rabbi\k* + Rabbi is a transliteration of the Hebrew word for “my teacher,” used as a title of respect for Jewish teachers. +\ili \k Rahab\k* + Rahab is either (1) The prostitute who hid Joshua’s 2 spies in Jericho (Joshua 2,6) and later became an ancestor of Jesus (Matthew 1:5) and an example of faith (Hebrews 11:31; James 2:25); or (2) Literally, “pride” or “arrogance” — possibly a reference to a large aquatic creature (Job 9:13; 26:12; Isaiah 51:9) or symbolically referring to Egypt (Psalm 87:4; 89:10; Isaiah 30:7). +\ili \k repent\k* + to change one’s mind; turn away from sin and turn toward God; to abhor one’s past sins and determine to follow God. +\ili \k Rhabboni\k* + Rhabboni: a transliteration of the Hebrew word for “great teacher.” +\ili \k Sabbath\k* + The seventh day of the week, set aside by God for man to rest. +\ili \k saints\k* + The Greek word for “saints” literally means “holy ones.” Saints are people set apart for service to God as holy and separate, living in righteousness. Used in the Bible to refer to all Christians and to all of those who worship Yahweh in Old Testament times. +\ili \k Samaritan\k* + A Samaritan is a resident of Samaria. The Samaritans and the Jews generally detested each other during the time that Jesus walked among us. +\ili \k sanctify\k* + To declare or set apart something as holy. To purify and separate a person from sin. +\ili \k sata\k* + A sata is a dry measure of capacity approximately equal to 13 liters or 1.5 pecks. +\ili \k Satan\k* + Satan means “accuser.” This is one name for the devil, an enemy of God and God’s people. +\ili \k scribe\k* + A scribe is one who copies God’s law. They were often respected as teachers and authorities on God’s law. +\ili \k selah\k* + Selah is a musical term indicating a pause or instrumental interlude for reflection. +\ili \k seraphim\k* + Seraphim are 6-winged angels. See Isaiah 6:2-6. +\ili \k sexual immorality\k* + The term “sexual immorality” in the New Testament comes from the Greek “porneia,” which refers to any sexual activity besides that between a husband and his wife. In other words, prostitution (male or female), bestiality, homosexual activity, any sexual intercourse outside of marriage, and the production and consumption of pornography all are included in this term. +\ili \k shekel\k* + A measure of weight, and when referring to that weight in gold, silver, or brass, of money. A shekel is approximately 16 grams, about a half an ounce, or 20 gerahs (Ezekiel 45:12). +\ili \k Sheol\k* + Sheol is the place of the dead. See also “Hades”. +\ili \k Shibah\k* + Shibah is Hebrew for “oath” or “seven.” See Beersheba. +\ili \k shigionoth\k* + Victorious music. +\ili \k soul\k* + “Soul” refers to the emotions and intellect of a living person, as well as that person’s very life. It is distinguished in the Bible from a person’s spirit and body. (1 Thessalonians 5:23, Hebrews 4:12) +\ili \k span\k* + A span is the length from the tip of a man’s thumb to the tip of his little finger when his hand is stretched out (about half a cubit, or 9 inches, or 22.8 cm.) +\ili \k spirit\k* + Spirit, breath, and wind all derive from the same Hebrew and Greek words. A person’s spirit is the very essence of that person’s life, which comes from God, who is a Spirit being (John 4:24, Genesis 1:2; 2:7). The Bible distinguishes between a person’s spirit, soul, and body (1 Thessalonians 5:23, Hebrews 4:12). Some beings may exist as spirits without necessarily having a visible body, such as angels and demons (Luke 9:39, 1 John 4:1-3). +\ili \k stadia\k* + Stadia is plural for “stadion,” a linear measure of about 184.9 meters or 606.6 feet (the length of the race course at Olympia). +\ili \k stater\k* + A stater is a Greek silver coin equivalent to four Attic or two Alexandrian drachmas, or a Jewish shekel: just exactly enough to cover the half-shekel Temple Tax for two people. +\ili \k tabernacle\k* + a dwelling place or place of worship, usually a tent. +\ili \k talent\k* + A measure of weight or mass of 3000 shekels. +\ili \k Tartarus\k* + Tartarus is the Greek name for an underworld for the wicked dead; another name for Gehenna or Hell. +\ili \k teraphim\k* + Teraphim are household idols that may have been associated with inheritance rights to the household property. +\ili \k Yah\k* + “Yah” is a shortened form of “Yahweh,” which is God’s proper name. This form is used occasionally in the Old Testament, mostly in the Psalms. See “Yahweh.” +\ili \k Yahweh\k* + “Yahweh” is God’s proper name. In Hebrew, the four consonants roughly equivalent to YHWH were considered too holy to pronounce, so the Hebrew word for “Lord” (Adonai) was substituted when reading it aloud. When vowel points were added to the Hebrew Old Testament, the vowel points for “Adonai” were mixed with the consonants for “Yahweh,” which if you pronounced it literally as written, would be pronounced “Yehovah” or “Jehovah.” When the Old Testament was translated to Greek, the tradition of substituting “Lord” for God’s proper name continued in the translation of God’s name to “Lord” (Kurios). Some English Bibles translate God’s proper name to “LORD” or “GOD” (usually with small capital letters), based on that same tradition. This can get really confusing, since two other words (“Adonai” and “Elohim”) translate to “Lord” and “God,” and they are sometimes used together. The ASV of 1901 (and some other translations) render YHWH as “Jehovah.” The most probable pronunciation of God’s proper name is “Yahweh.” In Hebrew, the name “Yahweh” is related to the active declaration “I AM.” See Exodus 3:13-14. Since Hebrew has no tenses, the declaration “I AM” can also be interpreted as “I WAS” and “I WILL BE.” Compare Revelation 1:8. +\ili \k Zion\k* + Zion is a name which originally referred one of the mountains of Jerusalem. It became a term synonymous with Jerusalem itself. The term “Heavenly Zion” is also used to refer the future dwelling place of God’s people. +\ip This companion glossary to the World English Bible is in the Public Domain. You may not copyright it or claim authorship over it, but you are free to use, sell, distribute, or copy it. diff --git a/c-sharp/assets/WEB/BookNames.xml b/c-sharp/assets/WEB/BookNames.xml new file mode 100644 index 0000000000..c230de49e9 --- /dev/null +++ b/c-sharp/assets/WEB/BookNames.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/c-sharp/assets/WEB/Settings.xml b/c-sharp/assets/WEB/Settings.xml new file mode 100644 index 0000000000..983731b686 --- /dev/null +++ b/c-sharp/assets/WEB/Settings.xml @@ -0,0 +1,73 @@ + + usfm.sty + English + 8.0.100.76 + World English Bible USA without Strong's numbers + 65001 + F + <p>PUBLIC DOMAIN (not copyrighted)</p> + NFC + engWEBUS + 32664dc3288a28df2e2bb75ded887fc8f17a15fb + Charis SIL + 12 + + + en::: + + 41MAT + + engWEBUS.SFM + Major::BiblicalTerms.xml + F + F + F + Public + Standard:: + + 3 + 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + Z:\tmp\engwebus + 111111111111111111111111111111111111111111111111111111111111111111111111000011111111000000000000000100000000100100000000000 + 4 + NwBB96u5nggee63xW + a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu vv ww xx yy zz + True + + + a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z ’ ' - ? ‌ ‍ χ צִ צִ֛ ת έ β ἄ θ ῦ ά ἐ ῥ Μ ῆ ᾳ + ί – ω ς ι τ ρ ½ υ σ & × π % κ λ = γ α [ ] ε η ἰ ὺ μ δ ν הִ נֵּ ה ο ם לֹ אֱ הִ֑ י / ) ( — 7 8 9 6 4 5 0 3 2 ! ‘ 1 : ; ” “ . , + + False + “ ” + ‘ ’ + “ ” + + Yes + + Yes + + No + No + p p/q1 b/q1 + ' - ? ‌ ‍ ) -_ “ – : _+_ × / _— _&_ %_ ..._ ... _=_ _—_ ]_ _[ ; ! ” —_ , — )_ _( . :_ !_ _‘ ?_ ;_ ”_ _“ ._ ,_ + _,_ + : + + Abbreviation + ShortName + MatchVerseExactly + T + False + False + False + - + , + + ; + ; + LXX|See + 62fd8c641f17fd3e9fafb4ad + English(eng), World English Bible, American English Edition, without Strong's numbers, United States of America, Bible with Deuterocanon, 2022-06-01, Completed, engWEBUS, dbl: matches + 2023-04-26T04:50:43.132462 + + \ No newline at end of file diff --git a/c-sharp/assets/WEB/custom.vrs b/c-sharp/assets/WEB/custom.vrs new file mode 100644 index 0000000000..22f912b66a --- /dev/null +++ b/c-sharp/assets/WEB/custom.vrs @@ -0,0 +1,29 @@ +# custom.vrs +# prepared by Michael Johnson for the World English Bible project +# amend total quantity of verses in chapter +ROM 14:26 +REV 12:17 +TOB 5:22 +TOB 10:12 +SIR 23:28 +ESG 1:22 +ESG 3:15 +ESG 5:14 +ESG 8:17 +ESG 10:14 +SIR 33:33 +SIR 41:24 +BAR 1:22 +4MA 7:25 +4MA 12:20 +# deliberately missing verses +-ROM 16:26 +-ROM 16:27 +-3JN 1:15 +-S3Y 1:49 +-ESG 4:6 +-ESG 9:5 +-ESG 9:30 + + + diff --git a/c-sharp/assets/WEB/en.ldml b/c-sharp/assets/WEB/en.ldml new file mode 100644 index 0000000000..4dfece7ec8 --- /dev/null +++ b/c-sharp/assets/WEB/en.ldml @@ -0,0 +1,27 @@ +[A-Za-z][!'-),-.\:;?\[\]\u00B4\u200C\u200D\u2014\u2018\u2019\u201C\u201D][]['\-?][*][†][a b c d e f g h i j k l m n o p q r s t u v w x y z {aa} {bb} {cc} {dd} {ee} {ff} {gg} {hh} {ii} {jj} {kk} {ll} {mm} {nn} {oo} {pp} {qq} {rr} {ss} {tt} {uu} {vv} {ww} {xx} {yy} {zz}][]left-to-rightstandard \ No newline at end of file diff --git a/c-sharp/assets/usfm.sty b/c-sharp/assets/usfm.sty new file mode 100644 index 0000000000..b90bca58be --- /dev/null +++ b/c-sharp/assets/usfm.sty @@ -0,0 +1,3509 @@ +# Version=3.0.9 +# ******************************************************************** +# * usfm.sty is the default stylesheet for Paratext projects * +# * using USFM markup. * +# * Latest documentation and stylesheets are maintained at: * +# * http://markups.paratext.org/usfm * +# ******************************************************************** + +# File Identification + +\Marker id +\Name id - File - Identification +\Description File identification information (BOOKID, FILENAME, EDITOR, MODIFICATION DATE) +\StyleType Paragraph +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular book +\FontSize 12 + +\Marker usfm +\Name usfm - File - USFM Version ID +\Description File markup version information +\OccursUnder id +\Rank 1 +\StyleType Paragraph +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\FontSize 12 + +\Marker ide +\Name ide - File - Encoding +\Description File encoding information +\OccursUnder id +\Rank 1 +\StyleType Paragraph +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\FontSize 12 + +# Headers + +\Marker h +\Name h - File - Header +\Description Running header text for a book (basic) +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker h1 +\Name DEPRECATED h1 - File - Header +\Description Running header text +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker h2 +\Name DEPRECATED h2 - File - Left Header +\Description Running header text, left side of page +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker h3 +\Name DEPRECATED h3 - File - Right Header +\Description Running header text, right side of page +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker toc1 +\Name toc1 - File - Long Table of Contents Text +\Description Long table of contents text +\OccursUnder h h1 h2 h3 id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Italic +\Bold +\Color 16384 +#!\ColorName highcon green + +\Marker toc2 +\Name toc2 - File - Short Table of Contents Text +\Description Short table of contents text +\OccursUnder h h1 h2 h3 id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Italic +\Color 16384 +#!\ColorName highcon green + +\Marker toc3 +\Name toc3 - File - Book Abbreviation +\Description Book Abbreviation +\OccursUnder h h1 h2 h3 id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Bold +\Italic +\Color 128 +#!\ColorName lowcon red + +\Marker toca1 +\Name toca1 - File - Alternative Language Long Table of Contents Text +\Description Alternative language long table of contents text +\OccursUnder h h1 h2 h3 +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 10 +\Italic +\Color 8421504 +#!\ColorName gray + +\Marker toca2 +\Name toca2 - File - Alternative Language Short Table of Contents Text +\Description Alternative language short table of contents text +\OccursUnder h h1 h2 h3 +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 10 +\Italic +\Color 8421504 +#!\ColorName gray + +\Marker toca3 +\Name toca3 - File - Alternative Language Book Abbreviation +\Description Alternative language book Abbreviation +\OccursUnder h h1 h2 h3 +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 10 +\Italic +\Color 8421504 +#!\ColorName gray + +# Remarks and Comments + +\Marker rem +\Name rem - File - Remark +\Description Comments and remarks +\OccursUnder id ide c +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\StyleType Paragraph +\FontSize 12 +\Color 16711680 +#!\ColorName highcon blue + +\Marker sts +\Name sts - File - Status +\Description Status of this file +\OccursUnder id ide c +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\StyleType Paragraph +\FontSize 12 +\Color 16711680 +#!\ColorName highcon blue + +\Marker restore +\Name restore - File - Restore Information +\Description Project restore information +\OccursUnder id +\Rank 99 +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\StyleType Paragraph +\FontSize 12 +\Color 16711680 +#!\ColorName highcon blue + +# Introduction + +\Marker imt +\Name imt - Introduction - Major Title Level 1 +\Description Introduction major title, level 1 (if single level) (basic) +\OccursUnder id +\Rank 5 +\TextProperties paragraph publishable vernacular level_1 +\TextType Other +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker imt1 +\Name imt1 - Introduction - Major Title Level 1 +\Description Introduction major title, level 1 (if multiple levels) +\OccursUnder id +\Rank 5 +\TextProperties paragraph publishable vernacular level_1 +\TextType Other +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker imt2 +\Name imt2 - Introduction - Major Title Level 2 +\Description Introduction major title, level 2 +\OccursUnder id +\Rank 5 +\TextProperties paragraph publishable vernacular level_2 +\TextType other +\StyleType Paragraph +\FontSize 13 +\Italic +\Justification Center +\SpaceBefore 6 +\SpaceAfter 3 + +\Marker imt3 +\Name imt3 - Introduction - Major Title Level 3 +\Description Introduction major title, level 3 +\OccursUnder id +\Rank 5 +\TextProperties paragraph publishable vernacular level_3 +\TextType Other +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceBefore 2 +\SpaceAfter 2 + +\Marker imt4 +\Name imt4 - Introduction - Major Title Level 4 +\Description Introduction major title, level 4 (usually within parenthesis) +\OccursUnder id +\Rank 5 +\TextProperties paragraph publishable vernacular level_4 +\TextType Other +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Center +\SpaceBefore 2 +\SpaceAfter 2 + +\Marker imte +\Name imte - Introduction - [Uncommon] Major Title at Introduction End Level 1 +\Description Introduction major title at introduction end, level 1 (if single level) +\TextProperties paragraph publishable vernacular level_1 +\TextType Other +\OccursUnder id +\Rank 7 +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker imte1 +\Name imte1 - Introduction - [Uncommon] Major Title at Introduction End Level 1 +\Description Introduction major title at introduction end, level 1 (if multiple levels) +\TextProperties paragraph publishable vernacular level_1 +\TextType Other +\OccursUnder id +\Rank 7 +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker imte2 +\Name imte2 - Introduction - [Uncommon] Major Title at Introduction End Level 2 +\Description Introduction major title at introduction end, level 2 +\TextProperties paragraph publishable vernacular level_2 +\TextType Other +\OccursUnder id +\Rank 7 +\StyleType Paragraph +\FontSize 16 +\Italic +\Justification Center +\SpaceAfter 2 + +\Marker is +\Name is - Introduction - Section Heading Level 1 +\Description Introduction section heading, level 1 (if single level) (basic) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker is1 +\Name is1 - Introduction - Section Heading Level 1 +\Description Introduction section heading, level 1 (if multiple levels) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker is2 +\Name is2 - Introduction - Section Heading Level 2 +\Description Introduction section heading, level 2 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_2 +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker iot +\Name iot - Introduction - Outline Title +\Description Introduction outline title (basic) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker io +\Name io - Introduction - Outline Level 1 +\Description Introduction outline text, level 1 (if single level) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 + +\Marker io1 +\Name io1 - Introduction - Outline Level 1 +\Description Introduction outline text, level 1 (if multiple levels) (basic) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 + +\Marker io2 +\Name io2 - Introduction - Outline Level 2 +\Description Introduction outline text, level 2 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_2 +\StyleType paragraph +\FontSize 12 +\LeftMargin .75 + +\Marker io3 +\Name io3 - Introduction - Outline Level 3 +\Description Introduction outline text, level 3 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_3 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1 + +\Marker io4 +\Name io4 - Introduction - Outline Level 4 +\Description Introduction outline text, level 4 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_4 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1.25 + +\Marker ior +\Endmarker ior* +\Name ior...ior* - Introduction - Outline References Range +\Description Introduction references range for outline entry; for marking references separately +\OccursUnder id io io1 io2 io3 io4 NEST +\TextType Other +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker ip +\Name ip - Introduction - Paragraph +\Description Introduction prose paragraph (basic) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent + +\Marker im +\Name im - Introduction - Paragraph - no first line indent +\Description Introduction prose paragraph, with no first line indent (may occur after poetry) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker ipi +\Name ipi - Introduction - Indented Para - first line indent +\Description Introduction prose paragraph, indented, with first line indent +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .25 +\RightMargin .25 + +\Marker imi +\Name imi - Introduction - Indented Para - no first line indent +\Description Introduction prose paragraph text, indented, with no first line indent +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 + +\Marker ili +\Name ili - Introduction - List Entry - Level 1 +\Description A list entry, level 1 (if single level) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.375 # 1/8 inch indent, 1/2 inch wrap + +\Marker ili1 +\Name ili1 - Introduction - List Entry - Level 1 +\Description A list entry, level 1 (if multiple levels) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.375 # 1/8 inch indent, 1/2 inch wrap + +\Marker ili2 +\Name ili2 - Introduction - List Entry - Level 2 +\Description A list entry, level 2 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular level_2 +\StyleType paragraph +\FontSize 12 +\LeftMargin .75 +\FirstLineIndent -.375 + +\Marker ipq +\Name ipq - Introduction - Paragraph - quote from text +\Description Introduction prose paragraph, quote from the body text +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 +\FirstLineIndent .125 # 1/8 inch first line indent +\Italic + +\Marker imq +\Name imq - Introduction - Paragraph - quote from text - no first line indent +\Description Introduction prose paragraph, quote from the body text, with no first line indent +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 +\Italic + +\Marker ipr +\Name ipr - Introduction - Paragraph - right aligned +\Description Introduction prose paragraph, right aligned +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 +\Justification Right +\Italic + +\Marker ib +\Name ib - Introduction - Blank Line +\Description Introduction blank line +\OccursUnder id +\Rank 6 +\TextProperties paragraph publishable vernacular poetic +\TextType Other +\FontSize 10 +\StyleType paragraph + +\Marker iq +\Name iq - Introduction - Poetry Level 1 +\Description Introduction poetry text, level 1 (if single level) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular poetic level_1 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.75 # 1/4 inch indent, 1 inch wrap +\Italic + +\Marker iq1 +\Name iq1 - Introduction - Poetry Level 1 +\Description Introduction poetry text, level 1 (if multiple levels) +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular poetic level_1 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.75 # 1/4 inch indent, 1 inch wrap +\Italic + +\Marker iq2 +\Name iq2 - Introduction - Poetry Level 2 +\Description Introduction poetry text, level 2 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular poetic level_2 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.5 # 1/2 inch indent, 1 inch wrap +\Italic + +\Marker iq3 +\Name iq3 - Introduction - Poetry Level 3 +\Description Introduction poetry text, level 3 +\OccursUnder id +\Rank 6 +\TextType Other +\TextProperties paragraph publishable vernacular poetic level_3 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.25 # 3/4 inch indent, 1 inch wrap +\Italic + +\Marker iex +\Name iex - Introduction - Explanatory or Bridge Text +\Description Introduction explanatory or bridge text (e.g. explanation of missing book in Short Old Testament) +\OccursUnder id c +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\SpaceBefore 4 +\SpaceAfter 4 + +\Marker iqt +\Endmarker iqt* +\Name iqt...iqt* - Special Text - Quoted Scripture Text in Introduction +\Description For quoted scripture text appearing in the introduction +\OccursUnder imt imt1 imt2 imt3 imt4 ib ie ili ili1 ili2 im imi imq io io1 io2 io3 io4 iot ip ipi ipq ipr iq iq1 iq2 iq3 is is1 is2 imte imte1 imte2 iex +\TextType Other +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker ie +\Name ie - Introduction - End Marker +\Description Introduction ending marker +\OccursUnder id +\Rank 6 +\TextProperties paragraph publishable vernacular +\TextType Other +\FontSize 10 +\StyleType paragraph + +# Chapters and Verses + +\Marker c +\Name c - Chapter Number +\Description Chapter number (necessary for normal Paratext operation) +\OccursUnder id +\Rank 8 +\TextType ChapterNumber +\TextProperties chapter +\StyleType Paragraph +\Bold +\FontSize 18 +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker ca +\Endmarker ca* +\Name ca...ca* - Chapter Number - Alternate +\Description Second (alternate) chapter number (for coding dual versification; useful for places where different traditions of chapter breaks need to be supported in the same translation) +\OccursUnder c +\TextType Other +\StyleType Character +\Italic +\FontSize 16 +\Color 2263842 +#!\ColorName green + +\Marker cp +\Name cp - Chapter Number - Publishing Alternate +\Description Published chapter number (chapter string that should appear in the published text) +\OccursUnder c +\Rank 4 +\TextType Other +\TextProperties paragraph +\StyleType Paragraph +\Bold +\FontSize 18 +\SpaceBefore 8 +\SpaceAfter 4 +\Color 16711680 +#!\ColorName highcon blue + +\Marker cl +\Name cl - Chapter - Publishing Label +\Description Chapter label used for translations that add a word such as "Chapter" before chapter numbers (e.g. Psalms). The subsequent text is the chapter label. +\OccursUnder id c ms ms1 ms2 ms3 mr +\TextType Other +\TextProperties paragraph +\StyleType Paragraph +\Bold +\FontSize 18 +\SpaceBefore 8 +\SpaceAfter 4 +\Justification Center + +\Marker cd +\Name cd - Chapter - Description +\Description Chapter Description (Publishing option D, e.g. in Russian Bibles) +\OccursUnder c +\TextType Other +\TextProperties paragraph +\StyleType Paragraph +\FontSize 11 +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker v +\Name v - Verse Number +\Description A verse number (Necessary for normal paratext operation) (basic) +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 s3 d sp +\TextType VerseNumber +\TextProperties verse +\StyleType Character +\FontSize 12 +\Superscript + +\Marker va +\Endmarker va* +\Name va...va* - Verse Number - Alternate +\Description Second (alternate) verse number (for coding dual numeration in Psalms; see also NRSV Exo 22.1-4) +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 s3 d sp +\TextType Other +\StyleType Character +\FontSize 12 +\Superscript +\Color 2263842 +#!\ColorName green + +\Marker vp +\Endmarker vp* +\Name vp...vp* - Verse Number - Publishing Alternate +\Description Published verse marker (verse string that should appear in the published text) +\OccursUnder cd lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 s3 d sp +\TextType Other +\StyleType Character +\FontSize 12 +\Superscript +\Color 16711680 +#!\ColorName highcon blue + +# Paragraphs + +\Marker p +\Name p - Paragraph - Normal - First Line Indent +\Description Paragraph text, with first line indent (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent + +\Marker m +\Name m - Paragraph - Margin - No First Line Indent +\Description Paragraph text, with no first line indent (may occur after poetry) (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker po +\Name po - Paragraph - Letter Opening +\Description Letter opening +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\SpaceBefore 4 +\SpaceAfter 4 + +\Marker pr +\Name pr - Paragraph - Text Refrain (right aligned) +\Description Text refrain (paragraph text, right aligned) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\Justification Right +\FontSize 12 + +\Marker cls +\Name cls - Paragraph - Letter Closing +\Description Letter Closing +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Justification Right + +\Marker pmo +\Name pmo - Paragraph - Embedded Text Opening +\Description Embedded text opening +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr po q q1 q2 q3 q4 qc qr b s1 s2 s3 s4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 + +\Marker pm +\Name pm - Paragraph - Embedded Text +\Description Embedded text paragraph +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr po psi q q1 q2 q3 q4 qc qr b s1 s2 s3 s4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .25 +\RightMargin .25 + +\Marker pmc +\Name pmc - Paragraph - Embedded Text Closing +\Description Embedded text closing +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr po q q1 q2 q3 q4 qc qr b s1 s2 s3 s4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 + +\Marker pmr +\Name pmr - Paragraph - Embedded Text Refrain +\Description Embedded text refrain (e.g. Then all the people shall say, "Amen!") +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr po q q1 q2 q3 q4 qc qr b s1 s2 s3 s4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\Justification Right +\LeftMargin .25 +\RightMargin .25 + +\Marker pi +\Name pi - Paragraph - Indented - Level 1 - First Line Indent +\Description Paragraph text, level 1 indent (if single level), with first line indent; often used for discourse (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .25 +\RightMargin .25 + +\Marker pi1 +\Name pi1 - Paragraph - Indented - Level 1 - First Line Indent +\Description Paragraph text, level 1 indent (if multiple levels), with first line indent; often used for discourse +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .25 +\RightMargin .25 + +\Marker pi2 +\Name pi2 - Paragraph - Indented - Level 2 - First Line Indent +\Description Paragraph text, level 2 indent, with first line indent; often used for discourse +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_2 +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .5 +\RightMargin .25 + +\Marker pi3 +\Name pi3 - Paragraph - Indented - Level 3 - First Line Indent +\Description Paragraph text, level 3 indent, with first line indent; often used for discourse +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_3 +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .75 +\RightMargin .25 + +\Marker pc +\Name pc - Paragraph - Centered (for Inscription) +\Description Paragraph text, centered (for Inscription) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\Justification Center +\FontSize 12 + +\Marker mi +\Name mi - Paragraph - Indented - No First Line Indent +\Description Paragraph text, indented, with no first line indent; often used for discourse +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .25 +\RightMargin .25 + +\Marker nb +\Name nb - Paragraph - No Break with Previous Paragraph +\Description Paragraph text, with no break from previous paragraph text (at chapter boundary) (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +# Poetry + +\Marker q +\Name q - Poetry - Indent Level 1 - Single Level Only +\Description Poetry text, level 1 indent (if single level) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_1 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 0.75 +\FirstLineIndent -0.5 # 1/8 inch indent, 3/4 inch wrap + +\Marker q1 +\Name q1 - Poetry - Indent Level 1 +\Description Poetry text, level 1 indent (if multiple levels) (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_1 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 0.75 +\FirstLineIndent -0.5 # 1/8 inch indent, 3/4 inch wrap + +\Marker q2 +\Name q2 - Poetry - Indent Level 2 +\Description Poetry text, level 2 indent (basic) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_2 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 0.75 +\FirstLineIndent -0.375 # 1/4 inch indent, 3/4 inch wrap + +\Marker q3 +\Name q3 - Poetry - Indent Level 3 +\Description Poetry text, level 3 indent +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_3 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 0.75 +\FirstLineIndent -0.25 # 3/8 inch indent, 3/4 inch wrap + +\Marker q4 +\Name q4 - Poetry - Indent Level 4 +\Description Poetry text, level 4 indent +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_4 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 0.75 +\FirstLineIndent -0.125 # 1/2 inch indent, 3/4 inch wrap + +\Marker qc +\Name qc - Poetry - Centered +\Description Poetry text, centered +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic +\StyleType Paragraph +\FontSize 12 +\Justification Center + +\Marker qr +\Name qr - Poetry - Right Aligned +\Description Poetry text, Right Aligned +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic +\StyleType Paragraph +\FontSize 12 +\Justification Right + +\Marker qs +\Endmarker qs* +\Name qs...qs* - Poetry Text - Selah +\Description Poetry text, Selah +\OccursUnder q q1 q2 q3 q4 qc qr qd NEST +\Rank 4 +\TextType VerseText +\TextProperties publishable vernacular poetic +\StyleType Character +\FontSize 12 +\Italic + +\Marker qa +\Name qa - Poetry - Acrostic Heading/Marker +\Description Poetry text, Acrostic marker/heading +\OccursUnder c +\Rank 4 +\TextType Other +\TextProperties paragraph publishable vernacular poetic +\StyleType Paragraph +\FontSize 12 +\Italic + +\Marker qac +\Endmarker qac* +\Name qac...qac* - Poetry Text - Acrostic Letter +\Description Poetry text, Acrostic markup of the first character of a line of acrostic poetry +\OccursUnder q q1 q2 q3 q4 qc qr NEST +\Rank 4 +\TextType Other +\TextProperties publishable vernacular poetic +\StyleType Character +\FontSize 12 +\Italic + +\Marker qm +\Name qm - Poetry - Embedded Text - Indent Level 1 - Single Level Only +\Description Poetry text, embedded, level 1 indent (if single level) +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr q q1 q2 q3 q4 qc qr b +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.75 # 1/4 inch indent, 1 inch wrap + +\Marker qm1 +\Name qm1 - Poetry - Embedded Text - Indent Level 1 +\Description Poetry text, embedded, level 1 indent (if multiple levels) +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr q q1 q2 q3 q4 qc qr b +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_1 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.75 # 1/4 inch indent, 1 inch wrap + +\Marker qm2 +\Name qm2 - Poetry - Embedded Text - Indent Level 2 +\Description Poetry text, embedded, level 2 indent +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr q q1 q2 q3 q4 qc qr b +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_2 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.5 # 1/2 inch indent, 1 inch wrap + +\Marker qm3 +\Name qm3 - Poetry - Embedded Text - Indent Level 3 +\Description Poetry text, embedded, level 3 indent +\OccursUnder m mi nb p pc ph phi pi pi1 pi2 pi3 pr q q1 q2 q3 q4 qc qr b +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic level_3 +\StyleType Paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.25 # 3/4 inch indent, 1 inch wrap + +\Marker qd +\Name qd - Poetry - Hebrew Note +\Description A Hebrew musical performance annotation, similar in content to Hebrew descriptive title. +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular poetic +\StyleType Paragraph +\FontSize 12 +\Italic +\LeftMargin .25 + +\Marker b +\Name b - Poetry - Stanza Break (Blank Line) +\Description Poetry text stanza break (e.g. stanza break) (basic) +\OccursUnder c +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +# Titles & Headings + +\Marker mt +\Name mt - Title - Major Title Level 1 +\Description The main title of the book (if single level) +\OccursUnder id +\Rank 3 +\TextProperties paragraph publishable vernacular level_1 +\TextType Title +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker mt1 +\Name mt1 - Title - Major Title Level 1 +\Description The main title of the book (if multiple levels) (basic) +\OccursUnder id +\Rank 3 +\TextProperties paragraph publishable vernacular level_1 +\TextType Title +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 2 +\SpaceAfter 4 + +\Marker mt2 +\Name mt2 - Title - Major Title Level 2 +\Description A secondary title usually occurring before the main title (basic) +\OccursUnder id +\Rank 3 +\TextProperties paragraph publishable vernacular level_2 +\TextType Title +\StyleType Paragraph +\FontSize 16 +\Italic +\Justification Center +\SpaceAfter 2 + +\Marker mt3 +\Name mt3 - Title - Major Title Level 3 +\Description A secondary title occurring after the main title +\OccursUnder id +\Rank 3 +\TextProperties paragraph publishable vernacular level_3 +\TextType Title +\StyleType Paragraph +\FontSize 16 +\Bold +\Justification Center +\SpaceBefore 2 +\SpaceAfter 2 + +\Marker mt4 +\Name mt4 - Title - Major Title level 4 +\Description A small secondary title sometimes occurring within parentheses +\OccursUnder id +\Rank 3 +\TextProperties paragraph publishable vernacular level_4 +\TextType Title +\StyleType Paragraph +\FontSize 12 +\Justification Center +\SpaceBefore 2 +\SpaceAfter 2 + +\Marker mte +\Name mte - Title - [Uncommon] Major Title Ending Level 1 +\Description The main title of the book repeated at the end of the book, level 1 (if single level) +\TextProperties paragraph publishable vernacular level_1 +\TextType Title +\OccursUnder c +\Rank 2 +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker mte1 +\Name mte1 - Title - [Uncommon] Major Title Ending Level 1 +\Description The main title of the book repeated at the end of the book, level 1 (if multiple levels) +\TextProperties paragraph publishable vernacular level_1 +\TextType Title +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tc1 tc2 tc3 tc4 s3 d +\Rank 2 +\StyleType Paragraph +\FontSize 20 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker mte2 +\Name mte2 - Title - [Uncommon] Major Title Ending Level 2 +\Description A secondary title occurring before or after the 'ending' main title +\TextProperties paragraph publishable vernacular level_2 +\TextType Title +\OccursUnder mte1 +\Rank 2 +\StyleType Paragraph +\FontSize 16 +\Italic +\Justification Center +\SpaceAfter 2 + +\Marker ms +\Name ms - Heading - Major Section Level 1 +\Description A major section division heading, level 1 (if single level) (basic) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 16 +\SpaceAfter 4 + +\Marker ms1 +\Name ms1 - Heading - Major Section Level 1 +\Description A major section division heading, level 1 (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 16 +\SpaceAfter 4 + +\Marker ms2 +\Name ms2 - Heading - Major Section Level 2 +\Description A major section division heading, level 2 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Bold +\Justification Center +\SpaceBefore 16 +\SpaceAfter 4 + +\Marker ms3 +\Name ms3 - Heading - Major Section Level 3 +\Description A major section division heading, level 3 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 14 +\Italic +\Justification Center +\SpaceBefore 16 +\SpaceAfter 4 + +\Marker mr +\Name mr - Heading - Major Section Range References +\Description A major section division references range heading (basic) +\OccursUnder ms ms1 ms2 ms3 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Center +\SpaceAfter 4 + +\Marker s +\Name s - Heading - Section Level 1 +\Description A section heading, level 1 (if single level) (basic) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker s1 +\Name s1 - Heading - Section Level 1 +\Description A section heading, level 1 (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker s2 +\Name s2 - Heading - Section Level 2 +\Description A section heading, level 2 (e.g. Proverbs 22-24) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_2 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Center +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker s3 +\Name s3 - Heading - Section Level 3 +\Description A section heading, level 3 (e.g. Genesis "The First Day") +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_3 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Left +\SpaceBefore 6 +\SpaceAfter 3 + +\Marker s4 +\Name s4 - Heading - Section Level 4 +\Description A section heading, level 4 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_4 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Left +\SpaceBefore 6 +\SpaceAfter 3 + +\Marker sr +\Name sr - Heading - Section Range References +\Description A section division references range heading +\OccursUnder s s1 s2 s3 s4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Bold +\Justification Center +\SpaceAfter 4 + +\Marker r +\Name r - Heading - Parallel References +\Description Parallel reference(s) (basic) +\OccursUnder c s s1 s2 s3 s4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Center +\SpaceAfter 4 + +\Marker sp +\Name sp - Label - Speaker +\Description A heading, to identify the speaker (e.g. Job) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Left +\SpaceBefore 8 +\SpaceAfter 4 + +\Marker d +\Name d - Label - Descriptive Title - Hebrew Subtitle +\Description A Hebrew text heading, to provide description (e.g. Psalms) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\FontSize 12 +\Italic +\Justification Center +\SpaceBefore 4 +\SpaceAfter 4 + +\Marker sd +\Name sd - Label - Semantic Division Location - Level 1 +\Description Vertical space used to divide the text into sections, level 1 (if single level) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\SpaceBefore 24 +\SpaceAfter 24 + +\Marker sd1 +\Name sd1 - Label - Semantic Division Location - Level 1 +\Description Vertical space used to divide the text into sections, level 1 (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_1 +\StyleType Paragraph +\SpaceBefore 24 +\SpaceAfter 24 + +\Marker sd2 +\Name sd2 - Label - Semantic Division Location - Level 2 +\Description Vertical space used to divide the text into sections, level 2 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_2 +\StyleType Paragraph +\SpaceBefore 18 +\SpaceAfter 18 + +\Marker sd3 +\Name sd3 - Label - Semantic Division Location - Level 3 +\Description Vertical space used to divide the text into sections, level 3 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_3 +\StyleType Paragraph +\SpaceBefore 12 +\SpaceAfter 12 + +\Marker sd4 +\Name sd4 - Label - Semantic Division Location - Level 4 +\Description Vertical space used to divide the text into sections, level 4 +\OccursUnder c +\Rank 4 +\TextType Section +\TextProperties paragraph publishable vernacular level_4 +\StyleType Paragraph +\SpaceBefore 8 +\SpaceAfter 8 + +# Tables + +\Marker tr +\Name tr - Table - Row +\Description A new table row +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.25 # 6/16 inch + +\Marker th1 +\Name th1 - Table - Column 1 Heading +\Description A table heading, column 1 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th2 +\Name th2 - Table - Column 2 Heading +\Description A table heading, column 2 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th3 +\Name th3 - Table - Column 3 Heading +\Description A table heading, column 3 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th4 +\Name th4 - Table - Column 4 Heading +\Description A table heading, column 4 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th5 +\Name th5 - Table - Column 5 Heading +\Description A table heading, column 5 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th6 +\Name th6 - Table - Column 6 Heading +\Description A table heading, column 6 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th7 +\Name th7 - Table - Column 7 Heading +\Description A table heading, column 7 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th8 +\Name th8 - Table - Column 8 Heading +\Description A table heading, column 8 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th9 +\Name th9 - Table - Column 9 Heading +\Description A table heading, column 9 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th10 +\Name th10 - Table - Column 10 Heading +\Description A table heading, column 10 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th11 +\Name th11 - Table - Column 11 Heading +\Description A table heading, column 11 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker th12 +\Name th12 - Table - Column 12 Heading +\Description A table heading, column 12 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker tc1 +\Name tc1 - Table - Column 1 Cell +\Description A table cell item, column 1 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc2 +\Name tc2 - Table - Column 2 Cell +\Description A table cell item, column 2 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc3 +\Name tc3 - Table - Column 3 Cell +\Description A table cell item, column 3 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc4 +\Name tc4 - Table - Column 4 Cell +\Description A table cell item, column 4 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc5 +\Name tc5 - Table - Column 5 Cell +\Description A table cell item, column 5 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc6 +\Name tc6 - Table - Column 6 Cell +\Description A table cell item, column 6 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc7 +\Name tc7 - Table - Column 7 Cell +\Description A table cell item, column 7 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc8 +\Name tc8 - Table - Column 8 Cell +\Description A table cell item, column 8 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc9 +\Name tc9 - Table - Column 9 Cell +\Description A table cell item, column 9 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc10 +\Name tc10 - Table - Column 10 Cell +\Description A table cell item, column 10 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc11 +\Name tc11 - Table - Column 11 Cell +\Description A table cell item, column 11 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker tc12 +\Name tc12 - Table - Column 12 Cell +\Description A table cell item, column 12 +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +# Center Aligned Table Heads and Columns + +\Marker thc1 +\Name thc1 - Table - Column 1 Heading - Center Aligned +\Description A table heading, column 1, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc2 +\Name thc2 - Table - Column 2 Heading - Center Aligned +\Description A table heading, column 2, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc3 +\Name thc3 - Table - Column 3 Heading - Center Aligned +\Description A table heading, column 3, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc4 +\Name thc4 - Table - Column 4 Heading - Center Aligned +\Description A table heading, column 4, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc5 +\Name thc5 - Table - Column 5 Heading - Center Aligned +\Description A table heading, column 5, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc6 +\Name thc6 - Table - Column 6 Heading - Center Aligned +\Description A table heading, column 6, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc7 +\Name thc7 - Table - Column 7 Heading - Center Aligned +\Description A table heading, column 7, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc8 +\Name thc8 - Table - Column 8 Heading - Center Aligned +\Description A table heading, column 8, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc9 +\Name thc9 - Table - Column 9 Heading - Center Aligned +\Description A table heading, column 9, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc10 +\Name thc10 - Table - Column 10 Heading - Center Aligned +\Description A table heading, column 10, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc11 +\Name thc11 - Table - Column 11 Heading - Center Aligned +\Description A table heading, column 11, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker thc12 +\Name thc12 - Table - Column 12 Heading - Center Aligned +\Description A table heading, column 12, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Center + +\Marker tcc1 +\Name tcc1 - Table - Column 1 Cell - Center Aligned +\Description A table cell item, column 1, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc2 +\Name tcc2 - Table - Column 2 Cell - Center Aligned +\Description A table cell item, column 2, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc3 +\Name tcc3 - Table - Column 3 Cell - Center Aligned +\Description A table cell item, column 3, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc4 +\Name tcc4 - Table - Column 4 Cell - Center Aligned +\Description A table cell item, column 4, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc5 +\Name tcc5 - Table - Column 5 Cell - Center Aligned +\Description A table cell item, column 5, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc6 +\Name tcc6 - Table - Column 6 Cell - Center Aligned +\Description A table cell item, column 6, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc7 +\Name tcc7 - Table - Column 7 Cell - Center Aligned +\Description A table cell item, column 7, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc8 +\Name tcc8 - Table - Column 8 Cell - Center Aligned +\Description A table cell item, column 8, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc9 +\Name tcc9 - Table - Column 9 Cell - Center Aligned +\Description A table cell item, column 9, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc10 +\Name tcc10 - Table - Column 10 Cell - Center Aligned +\Description A table cell item, column 10, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc11 +\Name tcc11 - Table - Column 11 Cell - Center Aligned +\Description A table cell item, column 11, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +\Marker tcc12 +\Name tcc12 - Table - Column 12 Cell - Center Aligned +\Description A table cell item, column 12, center aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Center + +# Right Aligned Table Heads and Columns + +\Marker thr1 +\Name thr1 - Table - Column 1 Heading - Right Aligned +\Description A table heading, column 1, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Right + +\Marker thr2 +\Name thr2 - Table - Column 2 Heading - Right Aligned +\Description A table heading, column 2, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Right + +\Marker thr3 +\Name thr3 - Table - Column 3 Heading - Right Aligned +\Description A table heading, column 3, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Right + +\Marker thr4 +\Name thr4 - Table - Column 4 Heading - Right Aligned +\Description A table heading, column 4, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Right + +\Marker thr5 +\Name thr5 - Table - Column 5 Heading - Right Aligned +\Description A table heading, column 5, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification Right + +\Marker thr6 +\Name thr6 - Table - Column 6 Heading - Right Aligned +\Description A table heading, column 6, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr7 +\Name thr7 - Table - Column 7 Heading - Right Aligned +\Description A table heading, column 7, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr8 +\Name thr8 - Table - Column 8 Heading - Right Aligned +\Description A table heading, column 8, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr9 +\Name thr9 - Table - Column 9 Heading - Right Aligned +\Description A table heading, column 9, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr10 +\Name thr10 - Table - Column 10 Heading - Right Aligned +\Description A table heading, column 10, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr11 +\Name thr11 - Table - Column 11 Heading - Right Aligned +\Description A table heading, column 11, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker thr12 +\Name thr12 - Table - Column 12 Heading - Right Aligned +\Description A table heading, column 12, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Justification right + +\Marker tcr1 +\Name tcr1 - Table - Column 1 Cell - Right Aligned +\Description A table cell item, column 1, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Right + +\Marker tcr2 +\Name tcr2 - Table - Column 2 Cell - Right Aligned +\Description A table cell item, column 2, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Right + +\Marker tcr3 +\Name tcr3 - Table - Column 3 Cell - Right Aligned +\Description A table cell item, column 3, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Right + +\Marker tcr4 +\Name tcr4 - Table - Column 4 Cell - Right Aligned +\Description A table cell item, column 4, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Right + +\Marker tcr5 +\Name tcr5 - Table - Column 5 Cell - Right Aligned +\Description A table cell item, column 5, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification Right + +\Marker tcr6 +\Name tcr6 - Table - Column 6 Cell - Right Aligned +\Description A table cell item, column 6, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr7 +\Name tcr7 - Table - Column 7 Cell - Right Aligned +\Description A table cell item, column 7, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr8 +\Name tcr8 - Table - Column 8 Cell - Right Aligned +\Description A table cell item, column 8, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr9 +\Name tcr9 - Table - Column 9 Cell - Right Aligned +\Description A table cell item, column 9, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr10 +\Name tcr10 - Table - Column 10 Cell - Right Aligned +\Description A table cell item, column 10, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr11 +\Name tcr11 - Table - Column 11 Cell - Right Aligned +\Description A table cell item, column 11, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +\Marker tcr12 +\Name tcr12 - Table - Column 12 Cell - Right Aligned +\Description A table cell item, column 12, right aligned +\OccursUnder tr +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Justification right + +# Lists + +\Marker lh +\Name lh - List Header +\Description List header (introductory remark) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent + +\Marker li +\Name li - List Entry - Level 1 +\Description A list entry, level 1 (if single level) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.375 # 1/8 inch indent, 1/2 inch wrap + +\Marker li1 +\Name li1 - List Entry - Level 1 +\Description A list entry, level 1 (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.375 # 1/8 inch indent, 1/2 inch wrap + +\Marker li2 +\Name li2 - List Entry - Level 2 +\Description A list entry, level 2 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_2 +\StyleType paragraph +\FontSize 12 +\LeftMargin .75 +\FirstLineIndent -.375 + +\Marker li3 +\Name li3 - List Entry - Level 3 +\Description A list entry, level 3 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_3 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.375 + +\Marker li4 +\Name li4 - List Entry - Level 4 +\Description A list entry, level 4 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_4 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1.25 +\FirstLineIndent -.375 + +\Marker lf +\Name lf - List Footer +\Description List footer (concluding remark) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker lim +\Name lim - Embedded List Entry - Level 1 +\Description An embedded list entry, level 1 (if single level) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .75 +\FirstLineIndent -.375 +\RightMargin .25 + +\Marker lim1 +\Name lim1 - Embedded List Entry - Level 1 +\Description An embedded list entry, level 1 (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_1 +\StyleType paragraph +\FontSize 12 +\LeftMargin .75 +\FirstLineIndent -.375 +\RightMargin .25 + +\Marker lim2 +\Name lim2 - Embedded List Entry - Level 2 +\Description An embedded list entry, level 2 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_2 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1 +\FirstLineIndent -.375 + +\Marker lim3 +\Name lim3 - Embedded List Item - Level 3 +\Description An embedded list item, level 3 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_3 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1.25 +\FirstLineIndent -.375 + +\Marker lim4 +\Name lim4 - Embedded List Entry - Level 4 +\Description An embedded list entry, level 4 +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular level_4 +\StyleType paragraph +\FontSize 12 +\LeftMargin 1.5 +\FirstLineIndent -.375 + +\Marker litl +\Endmarker litl* +\Name litl...litl* - List Entry - Total +\Description List entry total text +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker lik +\Endmarker lik* +\Name lik...lik* - Structured List Entry - Key +\Description Structured list entry key text +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker liv +\Endmarker liv* +\Name liv...liv* - Structured List Entry - Value 1 +\Description Structured list entry value 1 content (if single value) +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker liv1 +\Endmarker liv1* +\Name liv1...liv1* - Structured List Entry - Value 1 +\Description Structured list entry value 1 content (if multiple values) +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker liv2 +\Endmarker liv2* +\Name liv2...liv2* - Structured List Entry - Value 2 +\Description Structured list entry value 2 content +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker liv3 +\Endmarker liv3* +\Name liv3...liv3* - Structured List Entry - Value 3 +\Description Structured list entry value 3 content +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker liv4 +\Endmarker liv4* +\Name liv4...liv4* - Structured List Entry - Value 4 +\Description Structured list entry value 4 content +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker liv5 +\Endmarker liv5* +\Name liv5...liv5* - Structured List Entry - Value 5 +\Description Structured list entry value 5 content +\OccursUnder li li1 li2 li3 li4 lim lim1 lim2 lim3 lim4 NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +# Footnotes + +\Marker f +\Endmarker f* +\Name f...f* - Footnote +\Description A Footnote text item (basic) +\OccursUnder c cp lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 qs sp tc1 tc2 tc3 tc4 mt mt1 mt2 mt3 ms ms1 ms2 ms3 s s1 s2 s3 d ip +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Note +\FontSize 12 + +\Marker fe +\Endmarker fe* +\Name fe...fe* - Endnote +\Description An Endnote text item +\OccursUnder c lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tc1 tc2 tc3 tc4 ms ms1 ms2 ms3 s s1 s2 s3 d ip +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Note +\FontSize 12 + +\Marker fr +\Endmarker fr* +\Name fr - Footnote - Reference +\Description The origin reference for the footnote (basic) +\OccursUnder f fe +\TextType NoteText +\TextProperties publishable vernacular note +\StyleType Character +\FontSize 12 +\Bold + +\Marker ft +\Endmarker ft* +\Name ft - Footnote - Text +\Description Footnote text, Protocanon (basic) +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker fk +\Endmarker fk* +\Name fk - Footnote - Keyword +\Description A footnote keyword (basic) +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Bold +\Italic + +\Marker fq +\Endmarker fq* +\Name fq - Footnote - Quotation or Alternate Rendering +\Description A footnote scripture quote or alternate rendering (basic) +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic + +\Marker fqa +\Endmarker fqa* +\Name fqa - Footnote - Alternate Translation Rendering +\Description A footnote alternate rendering for a portion of scripture text +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic + +\Marker fl +\Endmarker fl* +\Name fl - Footnote - Label Text +\Description A footnote label text item, for marking or "labelling" the type or alternate translation being provided in the note. +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic +\Bold + +\Marker fw +\Endmarker fw* +\Name fw - Footnote - Witness List +\Description A footnote witness list, for distinguishing a list of sigla representing witnesses in critical editions. +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker fp +\Endmarker fp* +\Name fp - Footnote Paragraph Mark +\Description A Footnote additional paragraph marker +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker fv +\Endmarker fv* +\Name fv...fv* - Footnote - Embedded Verse Number +\Description A verse number within the footnote text +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Superscript + +\Marker fdc +\Endmarker fdc* +\Name DEPRECATED fdc...fdc* - Footnote - DC text +\Description Footnote text, applies to Deuterocanon only +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker fm +\Endmarker fm* +\Name fm - Footnote - Additional Caller to Previous Note +\Description An additional footnote marker location for a previous footnote +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tc1 tc2 tc3 tc4 ms ms1 ms2 s s1 s2 s3 d ip +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 +\Superscript + +# Cross References + +\Marker x +\Endmarker x* +\Name x...x* - Cross Reference +\Description A list of cross references (basic) +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 qs sp tc1 tc2 tc3 tc4 mt mt1 mt2 mt3 ms ms1 ms2 s s1 s2 s3 d +\TextProperties publishable vernacular note crossreference +\TextType NoteText +\StyleType Note +\FontSize 12 + +\Marker xo +\Endmarker xo* +\Name xo - Cross Reference - Origin Reference +\Description The cross reference origin reference (basic) +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Bold + +\Marker xop +\Endmarker xop* +\Name xop - Cross Reference - Origin Reference Publishing Alternate +\Description Published cross reference origin reference (origin reference that should appear in the published text) +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker xt +\Endmarker xt* +\Name xt - Cross Reference - Target References +\Description The cross reference target reference(s), protocanon only (basic) +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x ef ex NEST +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +#!\Attributes ?link-href + +\Marker xta +\Endmarker xta* +\Name xta - Cross Reference - Target References Added Text +\Description Cross reference target references added text +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker xk +\Endmarker xk* +\Name xk - Cross Reference - Keyword +\Description A cross reference keyword +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic + +\Marker xq +\Endmarker xq* +\Name xq - Cross Reference - Quotation +\Description A cross-reference quotation from the scripture text +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic + +\Marker xot +\Endmarker xot* +\Name xot...xot* - Cross Reference - OT Target Refs (optional) +\Description Cross-reference target reference(s), Old Testament only +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker xnt +\Endmarker xnt* +\Name xnt...xnt* - Cross Reference - NT Target Refs (optional) +\Description Cross-reference target reference(s), New Testament only +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker xdc +\Endmarker xdc* +\Name DEPRECATED xdc...xdc* - Cross Reference - DC Target Refs +\Description Cross-reference target reference(s), Deuterocanon only +\OccursUnder x +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 + +\Marker rq +\Endmarker rq* +\Name rq...rq* - Cross Reference - Inline Quotation References +\Description A cross-reference indicating the source text for the preceding quotation. +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 NEST +\TextType Other +\TextProperties publishable vernacular +\StyleType Character +\FontSize 10 +\Italic + +# Other Special Text + +\Marker qt +\Endmarker qt* +\Name qt...qt* - Special Text - Quoted Text - OT in NT +\Description For Old Testament quoted text appearing in the New Testament (basic) +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker nd +\Endmarker nd* +\Name nd...nd* - Special Text - Name of Deity +\Description For name of deity (basic) +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Underline + +\Marker tl +\Endmarker tl* +\Name tl...tl* - Special Text - Transliterated Word +\Description For transliterated words +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable nonvernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker dc +\Endmarker dc* +\Name dc...dc* - Special Text - Deuterocanonical/LXX Additions +\Description Deuterocanonical/LXX additions or insertions in the Protocanonical text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\Italic + +\Marker bk +\Endmarker bk* +\Name bk...bk* - Special Text - Quoted book title +\Description For the quoted name of a book +\OccursUnder imt imt1 imt2 imt3 imt4 imte imte1 imte2 is is1 is2 ili ili1 ili2 ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker sig +\Endmarker sig* +\Name sig...sig* - Special Text - Author's Signature (Epistles) +\Description For the signature of the author of an Epistle +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker pn +\Endmarker pn* +\Name pn...pn* - Special Text - Proper Name +\Description For a proper name +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Bold +\Underline + +\Marker png +\Endmarker png* +\Name png...png* - Special Text - Geographic Proper Name +\Description For a geographic proper name +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Underline + +\Marker addpn +\Endmarker addpn* +\Name DEPRECATED addpn...addpn* - Special Text for Chinese +\Description For chinese words to be dot underline & underline +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +#\Color 2263842 +##!\ColorName green +\Bold +\Italic +\Underline + +\Marker wj +\Endmarker wj* +\Name wj...wj* - Special Text - Words of Jesus +\Description For marking the words of Jesus +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Color 255 +#!\ColorName highcon red + +\Marker k +\Endmarker k* +\Name k...k* - Special Text - Keyword +\Description For a keyword +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic +\Bold + +\Marker sls +\Endmarker sls* +\Name sls...sls* - Special Text - Secondary Language or Text Source +\Description To represent where the original text is in a secondary language or from an alternate text source +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker ord +\Endmarker ord* +\Name ord...ord* - Special Text - Ordinal number text portion +\Description For the text portion of an ordinal number +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Superscript + +\Marker add +\Endmarker add* +\Name add...add* - Special Text - Translational Addition +\Description For a translational addition to the text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 cls tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +#\Color 2263842 +##!\ColorName green +\Bold +\Italic + +\Marker lit +\Name lit - Special Text - Liturgical note +\Description For a comment or note inserted for liturgical use +\OccursUnder c +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\Justification Right +\FontSize 12 +\Bold + +# Character Styling + +\Marker no +\Endmarker no* +\Name no...no* - Character - Normal Text +\Description A character style, use normal text +\OccursUnder is ip ipi im imi ili ili1 ili2 imq ipq iex iq iot io1 io2 io3 io4 s s1 s2 s3 NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker it +\Endmarker it* +\Name it...it* - Character - Italic Text +\Description A character style, use italic text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker bd +\Endmarker bd* +\Name bd...bd* - Character - Bold Text +\Description A character style, use bold text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Bold + +\Marker bdit +\Endmarker bdit* +\Name bdit...bdit* - Character - BoldItalic Text +\Description A character style, use bold + italic text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Bold +\Italic + +\Marker em +\Endmarker em* +\Name em...em* - Character - Emphasized Text +\Description A character style, use emphasized text style +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Italic + +\Marker sc +\Endmarker sc* +\Name sc...sc* - Character - Small Caps +\Description A character style, for small capitalization text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Smallcaps + +\Marker sup +\Endmarker sup* +\Name sup...sup* - Character - Superscript +\Description A character style, for superscript text. Typically for use in critical edition footnotes. +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +\Superscript + +# Breaks + +\Marker pb +\Name pb - Break - Page Break +\Description Page Break used for new reader portions and children's bibles where content is controlled by the page +\OccursUnder c +\Rank 4 +\TextType Other +\TextProperties publishable +\StyleType Paragraph +\FontSize 12 + +# Special Features + +\Marker fig +\Endmarker fig* +\Name fig...fig* - Auxiliary - Figure/Illustration/Map +\Description Illustration [Columns to span, height, filename, caption text] +\OccursUnder lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 ms ms1 ms2 s s1 s2 s3 d ip +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 +#!\Attributes src size ref ?alt ?loc ?copy + +\Marker jmp +\Endmarker jmp* +\Name jmp...jmp* - Link text +\Description For associating linking attributes to a span of text +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType Other +\StyleType Character +\Color 16711680 +#!\ColorName highcon blue +\Underline +#!\Attributes ?link-href ?link-id ?link-title + +\Marker pro +\Endmarker pro* +\Name DEPRECATED pro...pro* - Special Text - CJK Pronunciation +\Description For indicating pronunciation in CJK texts +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 ms ms1 ms2 s s1 s2 s3 d ip f fe NEST +\TextType Other +\TextProperties Nonpublishable +\StyleType Character +\FontSize 10 + +\Marker rb +\Endmarker rb* +\Name rb...rb* - Special Text - Ruby Glossing +\Description Most often used to provide a reading / pronunciation guide in ideographic scripts +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 sp tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 ms ms1 ms2 s s1 s2 s3 d ip f fe NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +#!\Attributes gloss + +# Peripheral References + +\Marker w +\Endmarker w* +\Name w...w* - Peripheral Ref - Wordlist Entry +\Description A wordlist text item +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 +#!\Attributes ?lemma ?strong ?srcloc + +\Marker wh +\Endmarker wh* +\Name wh...wh* - Peripheral Ref - Hebrew Wordlist Entry +\Description A Hebrew wordlist text item +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker wg +\Endmarker wg* +\Name wg...wg* - Peripheral Ref - Greek Wordlist Entry +\Description A Greek Wordlist text item +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker wa +\Endmarker wa* +\Name wa...wa* - Peripheral Ref - Aramaic Wordlist Entry +\Description An Aramaic Wordlist text item +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker ndx +\Endmarker ndx* +\Name ndx...ndx* - Peripheral Ref - Subject Index Entry +\Description A subject index text item +\OccursUnder ip im ipi imi ipq imq ipr iq iq1 iq2 iq3 io io1 io2 io3 io4 ms ms1 ms2 s s1 s2 s3 s4 cd sp d lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr pmo pm pmc pmr po q q1 q2 q3 q4 qc qr qd qm qm1 qm2 qm3 tr th1 th2 th3 th4 thr1 thr2 thr3 thr4 tc1 tc2 tc3 tc4 tcr1 tcr2 tcr3 tcr4 f fe x NEST +\TextType VerseText +\TextProperties publishable vernacular +\StyleType Character +\FontSize 12 + +# Peripheral Materials +# Content Division Marker + +\Marker periph +\Name periph - Peripherals - Content Division Marker +\Description Peripheral content division marker which should be followed by an additional division argument/title. +\TextType Section +\TextProperties paragraph nonpublishable vernacular +\StyleType Paragraph +\FontSize 14 +\Bold +\SpaceBefore 16 +\SpaceAfter 4 +\Color 33023 +#!\ColorName orange + +# Additional peripheral material extensions to existing USFM markup. + +\Marker p1 +\Name p1 - Periph - Front/Back Matter Paragraph Level 1 +\Description Front or back matter text paragraph, level 1 (if multiple levels) +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent + +\Marker p2 +\Name p2 - Periph - Front/Back Matter Paragraph Level 2 +\Description Front or back matter text paragraph, level 2 (if multiple levels) +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/4 inch first line indent +\LeftMargin .125 + +\Marker k1 +\Name k1 - Periph - Concordance Keyword Level 1 +\Description Concordance main entry text or keyword, level 1 +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker k2 +\Name k2 - Periph - Concordance Keyword Level 2 +\Description Concordance main entry text or keyword, level 2 +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 + +\Marker xtSee +\Endmarker xtSee* +\Name xtSee - Concordance and Names Index - Alternate Entry Target Reference +\Description Concordance and Names Index markup for an alternate entry target reference. +\OccursUnder p +\TextProperties publishable vernacular +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic +\Color 16711680 +#!\ColorName highcon blue + +\Marker xtSeeAlso +\Endmarker xtSeeAlso* +\Name xtSeeAlso - Concordance and Names Index - Additional Entry Target Reference +\Description Concordance and Names Index markup for an additional entry target reference. +\OccursUnder p +\TextProperties publishable vernacular +\TextType Other +\StyleType Character +\FontSize 12 +\Italic +\Color 16711680 +#!\ColorName highcon blue + +# Milestones - these are not compatible with USFM2, so whole entries are preceded with #! + +#!\Marker qt-s +#!\Endmarker qt-e +#!\Name Quotation start/end milestone +#!\Description Quotation start/end milestone, level 1 (if single level) +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker qt1-s +#!\Endmarker qt1-e +#!\Name Quotation start/end milestone - Level 1 +#!\Description Quotation start/end milestone, level 1 (if multiple levels) +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker qt2-s +#!\Endmarker qt2-e +#!\Name Quotation start/end milestone - Level 2 +#!\Description Quotation start/end milestone, level 2 +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker qt3-s +#!\Endmarker qt3-e +#!\Name Quotation start/end milestone - Level 3 +#!\Description Quotation start/end milestone, level 3 +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker qt4-s +#!\Endmarker qt4-e +#!\Name Quotation start/end milestone - Level 4 +#!\Description Quotation start/end milestone, level 4 +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker qt5-s +#!\Endmarker qt5-e +#!\Name Quotation start/end milestone - Level 5 +#!\Description Quotation start/end milestone, level 5 +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?who ?sid ?eid + +#!\Marker ts-s +#!\Endmarker ts-e +#!\Name Translator's section start/end milestone +#!\Description Translator's section start/end milestone +#!\OccursUnder id +#!\StyleType Milestone +#!\Attributes ?sid ?eid + +# Other special text elements specified in USFM +# ~ = fixed (no-break) space +# // = discretionary line break + +# Obsolete, deprecated, or no longer officially part of USFM. +# These markers may have existed in earlier resource and stylesheet revisions. + +\Marker ph +\Name DEPRECATED ph - Paragraph - Hanging Indent - Level 1 +\Description Paragraph text, with level 1 hanging indent (if single level) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\LeftMargin .5 +\FirstLineIndent -.25 # 1/4 inch indent, 1/2 inch wrap +\FontSize 12 + +\Marker ph1 +\Name DEPRECATED ph1 - Paragraph - Hanging Indent - Level 1 +\Description Paragraph text, with level 1 hanging indent (if multiple levels) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\LeftMargin .5 +\FirstLineIndent -.25 # 1/4 inch indent, 1/2 inch wrap +\FontSize 12 + +\Marker ph2 +\Name DEPRECATED ph2 - Paragraph - Hanging Indent - Level 2 +\Description Paragraph text, with level 2 hanging indent +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\LeftMargin .75 +\FirstLineIndent -.25 # 1/2 inch indent, 3/4 inch wrap +\FontSize 12 + +\Marker ph3 +\Name DEPRECATED ph3 - Paragraph - Hanging Indent - Level 3 +\Description Paragraph text, with level 3 hanging indent +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\LeftMargin 1 +\FirstLineIndent -.25 # 3/4 inch indent, 1 inch wrap +\FontSize 12 + +\Marker phi +\Name DEPRECATED phi - Paragraph - Indented - Hanging Indent +\Description Paragraph text, indented with hanging indent +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\LeftMargin 1 + +\Marker tr1 +\Name OBSOLETE tr1 - Table - Row - Level 1 +\Description A table Row +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .5 +\FirstLineIndent -.25 # 6/16 inch + +\Marker tr2 +\Name OBSOLETE tr2 - Table - Row - Level 2 +\Description A table Row +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\LeftMargin .75 +\FirstLineIndent -.25 # 6/16 inch + +\Marker ps +\Name OBSOLETE ps - Paragraph - No Break with Next Paragraph +\Description Paragraph text, no break with next paragraph text at chapter boundary +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FontSize 12 +\FirstLineIndent .125 # 1/8 inch first line indent + +\Marker psi +\Name OBSOLETE psi - Paragraph - Indented - No Break with Next +\Description Paragraph text, indented, with no break with next paragraph text (at chapter boundary) +\OccursUnder c +\Rank 4 +\TextType VerseText +\TextProperties paragraph publishable vernacular +\StyleType Paragraph +\FirstLineIndent .125 # 1/8 inch first line indent +\LeftMargin .25 +\RightMargin .25 +\FontSize 12 + +\Marker fs +\Endmarker fs* +\Name DEPRECATED fs - Footnote - Footnote Summary +\Description A summary text for the concept/idea/quotation from the scripture translation for which the note is being provided. +\OccursUnder f fe +\TextProperties publishable vernacular note +\TextType NoteText +\StyleType Character +\FontSize 12 +\Italic + +\Marker wr +\Endmarker wr* +\Name OBSOLETE wr...wr* - Auxiliary - Wordlist/Glossary Reference +\Description A Wordlist text item +\OccursUnder ms s lh li li1 li2 li3 li4 lf lim lim1 lim2 lim3 lim4 m mi nb p pc ph phi pi pi1 pi2 pi3 pr po q q1 q2 q3 q4 qc qr qd tc1 tc2 tc3 tc4 f fe NEST +\TextProperties publishable vernacular +\TextType VerseText +\StyleType Character +\FontSize 12 +\Italic + +# 2.0x peripheral markup (replaced with \periph + Content Division Title/Argument) + +\Marker pub +\Name OBSOLETE pub Peripherals - Front Matter Publication Data +\Description Front matter publication data +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker toc +\Name OBSOLETE toc Peripherals - Front Matter Table of Contents +\Description Front matter table of contents +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker pref +\Name OBSOLETE pref Peripherals - Front Matter Preface +\Description Front matter preface +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker intro +\Name OBSOLETE intro Peripherals - Front Matter Introduction +\Description Front matter introduction +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker conc +\Name OBSOLETE conc Peripherals - Back Matter Concordance +\Description Back matter concordance +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker glo +\Name OBSOLETE glo Peripherals - Back Matter Glossary +\Description Back matter glossary +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker idx +\Name OBSOLETE idx Peripherals - Back Matter Index +\Description Back matter index +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker maps +\Name OBSOLETE maps Peripherals - Back Matter Map Index +\Description Back matter map index +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker cov +\Name OBSOLETE cov Peripherals - Other - Cover +\Description Other peripheral materials - cover +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker spine +\Name OBSOLETE spine Peripherals - Other - Spine +\Description Other peripheral materials - spine +\OccursUnder id +\Rank 4 +\TextProperties paragraph publishable vernacular poetic +\TextType VerseText +\FontSize 10 +\StyleType paragraph + +\Marker pubinfo +\Name OBSOLETE pubinfo - Publication - Information +\Description Publication information - Lang,Credit,Version,Copies,Publisher,Id,Logo +\OccursUnder id ide +\TextType Other +\TextProperties paragraph nonpublishable nonvernacular +\StyleType Paragraph +\FontSize 12 +\Color 16711680 +#!\ColorName highcon blue + +# Concordance/Names Index Tools - special sfms for use in Publishing Assistant + +\Marker zpa-xb +\Endmarker zpa-xb* +\Name zpa-xb - Periph - Book +\Description Book Ref +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker zpa-xc +\Endmarker zpa-xc* +\Name zpa-xc - Periph - Chapter +\Description Chapter Ref +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 +\Bold + +\Marker zpa-xv +\Endmarker zpa-xv* +\Name zpa-xv - Periph - Verse +\Description Verse Ref +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 + +\Marker zpa-d +\Endmarker zpa-d* +\Name zpa-d - Periph - Description +\Description Description +\OccursUnder id +\Rank 1 +\TextType Other +\TextProperties paragraph publishable vernacular +\StyleType Character +\FontSize 12 diff --git a/c-sharp/icon.ico b/c-sharp/icon.ico new file mode 100644 index 0000000000..623cea58da Binary files /dev/null and b/c-sharp/icon.ico differ diff --git a/cspell.json b/cspell.json index e65b0a364e..20fc568fc3 100644 --- a/cspell.json +++ b/cspell.json @@ -10,41 +10,79 @@ "package-lock.json", "vscode-extension" ], + "overrides": [ + { + "filename": "**/fr.json", + "language": "fr", + "ignoreRegExpList": [ + "\"%?[a-zA-Z0-9_]+%?\"\\s*:" // Do not spell-check JSON keys + ] + }, + { + "filename": "**/es.json", + "language": "es", + "ignoreRegExpList": [ + "\"%?[a-zA-Z0-9_]+%?\"\\s*:" // Do not spell-check JSON keys + ] + } + ], "dictionaryDefinitions": [], "dictionaries": [], "words": [ + "altnumber", "appdata", "asyncs", "autodocs", + "BBBCCCVVV", + "biblionexus", + "camelcase", + "consts", + "deuterocanon", "dockbox", "electronmon", "endregion", "finalizer", - "Fragmenter", + "fragmenter", "guids", "hopkinson", "iframes", + "iife", + "interprocess", + "iusfm", + "iusj", + "iusx", + "localizable", "localstorage", "maximizable", "networkable", - "Newtonsoft", + "newtonsoft", "nodebuffer", "nums", "papi", "papis", "paranext", "paratext", + "pdpe", + "pdpef", "pdpf", "pdps", "plusplus", "proxied", + "pubnumber", "reinitializing", "reserialized", + "shadcn", "sillsdev", + "sonner", "steenwyk", "stringifiable", - "Stylesheet", + "stringz", + "stylelint", + "stylesheet", + "tailwindcss", + "testid", "typedefs", + "unlocalized", "unregistering", "unregisters", "unsub", @@ -53,7 +91,8 @@ "unsubscribers", "usfm", "verseref", - "versification" + "versification", + "vref" ], "ignoreWords": [], "import": [] diff --git a/doc-meta/doc-icon.png b/doc-meta/doc-icon.png new file mode 100644 index 0000000000..33fab1354f Binary files /dev/null and b/doc-meta/doc-icon.png differ diff --git a/doc-meta/mac-arm-damaged-warning.png b/doc-meta/mac-arm-damaged-warning.png new file mode 100644 index 0000000000..c5ce97f21f Binary files /dev/null and b/doc-meta/mac-arm-damaged-warning.png differ diff --git a/electron-builder.json5 b/electron-builder.json5 new file mode 100644 index 0000000000..d9aaf32201 --- /dev/null +++ b/electron-builder.json5 @@ -0,0 +1,338 @@ +/** + * @see https://www.electron.build/configuration/configuration + */ +{ + productName: 'Platform.Bible', + appId: 'org.paranext.PlatformBible', + copyright: 'Copyright © 2022-2024 SIL International', + asar: true, + asarUnpack: '**\\*.{node,dll}', + files: ['dist', 'node_modules', 'package.json'], + afterSign: '.erb/scripts/notarize.js', + mac: { + target: { + target: 'default', + arch: ['arm64', 'x64'], + }, + extraResources: [ + { + from: './c-sharp/bin/Release/net8.0/publish/osx-${arch}/', + to: './dotnet/', + }, + ], + type: 'distribution', + hardenedRuntime: true, + entitlements: 'assets/entitlements.mac.plist', + entitlementsInherit: 'assets/entitlements.mac.plist', + gatekeeperAssess: false, + }, + dmg: { + contents: [ + { + x: 130, + y: 220, + }, + { + x: 410, + y: 220, + type: 'link', + path: '/Applications', + }, + ], + }, + win: { + target: ['nsis', 'nsis-web', 'portable'], + extraResources: [ + { + from: './c-sharp/bin/Release/net8.0/publish/win-x64/', + to: './dotnet/', + }, + ], + }, + linux: { + target: ['AppImage'], + category: 'Development', + extraResources: [ + { + from: './c-sharp/bin/Release/net8.0/publish/linux-x64/', + to: './dotnet/', + }, + ], + extraFiles: [ + // Package SO files are listed below and grouped according to packages as: libnss3 libasound2 libgbm1 libgl1 libgtk-3-0 + + // libnss3 package + { + from: '/usr/lib/x86_64-linux-gnu/libnss3.so', + to: 'usr/lib/libnss3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libnssutil3.so', + to: 'usr/lib/libnssutil3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libsmime3.so', + to: 'usr/lib/libsmime3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libssl3.so', + to: 'usr/lib/libssl3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/nss/libfreebl3.so', + to: 'usr/lib/nss/libfreebl3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/nss/libfreeblpriv3.so', + to: 'usr/lib/nss/libfreeblpriv3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/nss/libnssckbi.so', + to: 'usr/lib/nss/libnssckbi.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/nss/libnssdbm3.so', + to: 'usr/lib/nss/libnssdbm3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/nss/libsoftokn3.so', + to: 'usr/lib/nss/libsoftokn3.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libnspr4.so', + to: 'usr/lib/libnspr4.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libplc4.so', + to: 'usr/lib/libplc4.so', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libplds4.so', + to: 'usr/lib/libplds4.so', + }, + // libasound2 package + { + from: '/usr/lib/x86_64-linux-gnu/libasound.so.2', + to: 'usr/lib/libasound.so.2', + }, + // libgbm1 package + { + from: '/usr/lib/x86_64-linux-gnu/libgbm.so.1', + to: 'usr/lib/libgbm.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libwayland-server.so.0', + to: 'usr/lib/libwayland-server.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libexpat.so.1', + to: 'usr/lib/libexpat.so.1', + }, + // libgl1 package + { + from: '/usr/lib/x86_64-linux-gnu/libGL.so.1', + to: 'usr/lib/libGL.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0', + to: 'usr/lib/libGLdispatch.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libGLX.so.0', + to: 'usr/lib/libGLX.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0', + to: 'usr/lib/libGLX_mesa.so.0', + }, + // libgtk-3-0 package + { + from: '/usr/lib/x86_64-linux-gnu/libgtk-3.so.0', + to: 'usr/lib/libgtk-3.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libatk-1.0.so.0', + to: 'usr/lib/libatk-1.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0', + to: 'usr/lib/libatk-bridge-2.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libatspi.so.0', + to: 'usr/lib/libatspi.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libcups.so.2', + to: 'usr/lib/libcups.so.2', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libavahi-common.so.3', + to: 'usr/lib/libavahi-common.so.3', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libavahi-client.so.3', + to: 'usr/lib/libavahi-client.so.3', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libpango-1.0.so.0', + to: 'usr/lib/libpango-1.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libcairo.so.2', + to: 'usr/lib/libcairo.so.2', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXcomposite.so.1', + to: 'usr/lib/libXcomposite.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXdamage.so.1', + to: 'usr/lib/libXdamage.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXfixes.so.3', + to: 'usr/lib/libXfixes.so.3', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXrandr.so.2', + to: 'usr/lib/libXrandr.so.2', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libxkbcommon.so.0', + to: 'usr/lib/libxkbcommon.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libgdk-3.so.0', + to: 'usr/lib/libgdk-3.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0', + to: 'usr/lib/libpangocairo-1.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXi.so.6', + to: 'usr/lib/libXi.so.6', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libcairo-gobject.so.2', + to: 'usr/lib/libcairo-gobject.so.2', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0', + to: 'usr/lib/libgdk_pixbuf-2.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libepoxy.so.0', + to: 'usr/lib/libepoxy.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0', + to: 'usr/lib/libpangoft2-1.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0', + to: 'usr/lib/libharfbuzz.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libfontconfig.so.1', + to: 'usr/lib/libfontconfig.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libthai.so.0', + to: 'usr/lib/libthai.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libpixman-1.so.0', + to: 'usr/lib/libpixman-1.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libfreetype.so.6', + to: 'usr/lib/libfreetype.so.6', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libxcb.so.1', + to: 'usr/lib/libxcb.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0', + to: 'usr/lib/libxcb-shm.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libxcb-render.so.0', + to: 'usr/lib/libxcb-render.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXrender.so.1', + to: 'usr/lib/libXrender.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXinerama.so.1', + to: 'usr/lib/libXinerama.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libXcursor.so.1', + to: 'usr/lib/libXcursor.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0', + to: 'usr/lib/libwayland-cursor.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libwayland-egl.so.1', + to: 'usr/lib/libwayland-egl.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libwayland-client.so.0', + to: 'usr/lib/libwayland-client.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libjpeg.so.8', + to: 'usr/lib/libjpeg.so.8', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libgraphite2.so.3', + to: 'usr/lib/libgraphite2.so.3', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libdatrie.so.1', + to: 'usr/lib/libdatrie.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libX11-xcb.so.1', + to: 'usr/lib/libX11-xcb.so.1', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libdl.so.2', + to: 'usr/lib/libdl.so.2', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libpthread.so.0', + to: 'usr/lib/libpthread.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0', + to: 'usr/lib/libglib-2.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0', + to: 'usr/lib/libgobject-2.0.so.0', + }, + { + from: '/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0', + to: 'usr/lib/libgio-2.0.so.0', + }, + ], + }, + directories: { + app: 'release/app', + buildResources: 'assets', + output: 'release/build', + }, + extraResources: ['./assets/**', { from: './extensions/dist/', to: './extensions' }], + publish: { + provider: 'github', + owner: 'paranext', + repo: 'paranext-core', + }, +} diff --git a/extensions/.editorconfig b/extensions/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/.eslintignore b/extensions/.eslintignore new file mode 100644 index 0000000000..60a1507b5c --- /dev/null +++ b/extensions/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/.eslintrc.cjs b/extensions/.eslintrc.cjs new file mode 100644 index 0000000000..6a28e5eaaf --- /dev/null +++ b/extensions/.eslintrc.cjs @@ -0,0 +1,171 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/.eslintrc.js + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + // Note: this folder's package.json does not contain these plugins or any other eslint packages + // because eslint was finding multiple copies of plugins and failing. So we use the packages from + // repo root instead + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below + node: {}, + // Disable webpack eslint import resolver from parent since we are in a different directory + // TODO: make an eslint webpack resolver for this extensions folder + webpack: { config: { resolve: { extensions: [] } } }, + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/.gitignore b/extensions/.gitignore new file mode 100644 index 0000000000..1e7e94f3f0 --- /dev/null +++ b/extensions/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/.prettierignore b/extensions/.prettierignore new file mode 100644 index 0000000000..cdae15fa47 --- /dev/null +++ b/extensions/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/.prettierrc.js b/extensions/.prettierrc.js new file mode 100644 index 0000000000..0fc7df40ac --- /dev/null +++ b/extensions/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/.stylelintignore b/extensions/.stylelintignore new file mode 100644 index 0000000000..4102db2ad1 --- /dev/null +++ b/extensions/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/.stylelintrc.cjs b/extensions/.stylelintrc.cjs new file mode 100644 index 0000000000..1c386816f5 --- /dev/null +++ b/extensions/.stylelintrc.cjs @@ -0,0 +1,20 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.stylelintrc.js + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + }, +}; + +// #endregion diff --git a/extensions/.vscode/extensions.json b/extensions/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/.vscode/launch.json b/extensions/.vscode/launch.json new file mode 100644 index 0000000000..d40ac6824d --- /dev/null +++ b/extensions/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extensions", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extensions", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extensions", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/.vscode/settings.json b/extensions/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/LICENSE b/extensions/LICENSE new file mode 100644 index 0000000000..f50e3d31a7 --- /dev/null +++ b/extensions/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2022-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/README.md b/extensions/README.md new file mode 100644 index 0000000000..f52a337a4a --- /dev/null +++ b/extensions/README.md @@ -0,0 +1,205 @@ +# paranext-core/extensions + +Official extensions provided by Paranext + +## Summary + +This is a webpack project configured to build Paranext's official extensions included in the product. The general file structure is as follows: + +- `src/` contains the source code for all extensions + - Each sub-folder in `src/` with a `manifest.json` in it is an extension + - `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder + - `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder + - `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi` + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) + - `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder + - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file + - `assets/descriptions/` contains textual descriptions of the extension in various languages + - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` + - `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest + - `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing zips of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In `paranext-core/extensions`, run `npm install` to install local and published dependencies + +Note: running `npm install` automatically adds remotes that help with [updating from the templates](#to-update-this-repo-and-extensions-from-the-templates). + +
+ [Optional] Adding remotes manually + +#### Adding remotes manually + +To add these remotes manually, run the following commands: + +```bash +git remote add paranext-multi-extension-template https://github.com/paranext/paranext-multi-extension-template + +git remote add paranext-extension-template https://github.com/paranext/paranext-extension-template +``` + +
+ +## To run + +### Running Platform.Bible with these extensions + +To run Platform.Bible with these extensions (these extensions are automatically included when running `paranext-core`): + +`npm start` + +Note: The built extensions will be the `dist` folder. These extension files will be watched automatically for changes if you run `npm start` in `paranext-core` or `npm start` from this folder. There is no need to run `npm start` in both directories. + +### Building these extensions independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extensions once: + +`npm run build` + +## To package for distribution + +To package these extensions into a zip file for distribution: + +`npm run package` + +## To create a new extension in this repo + +To create a new extension in this repo, make sure your repo has no working changes, then run the following command (replace `` with the preferred extension name. This will also be the extension's folder name in the `src` folder): + +```bash +npm run create-extension -- +``` + +Then follow [the instructions for customizing the new extension](https://github.com/paranext/paranext-extension-template#customize-extension-details). + +**Note:** The merge/squash commits created when creating a new extension are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +
+ [Optional] Creating a new extension manually + +#### Manually create a new extension + +Alternatively, you can create a new extension manually: + +```bash +git fetch paranext-extension-template main + +git subtree add --prefix extensions/src/ paranext-extension-template main --squash +``` + +After running these commands, run a regex find and replace inside the new extension folder to fix +the file paths pointing to `paranext-core`: + +- Find: `([^/])\.\.\/paranext-core` +- Replace with: `$1../../../paranext-core` + +You can ignore occurrences from many files. Please see [`./lib/git.util.ts`](./lib/git.util.ts) -> `formatExtensionFolder` for more +information. + +
+ +## To update this folder and extensions from the templates + +This folder is forked from [`paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template), and its extensions are derived from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template). Both are updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update this folder and extensions by merging the latest template updates into them. + +To update this folder including all extensions to have the latest updates and upgrades from the templates, make sure this repo has no working changes, then run the following `npm` script: + +```bash +npm run update-from-templates +``` + +If you encounter errors from merge conflicts, please resolve the merge conflicts, finish the commit, and run the script above again. + +**Note:** The merge/squash commits created when updating this repo and its extensions from the templates are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +
+ [Optional] Update from the templates manually + +### Update from the templates manually + +Alternatively, you can update from the templates manually. + +#### Manually update this repo from `paranext-multi-extension-template` + +```bash +git fetch paranext-multi-extension-template main + +git subtree pull --prefix extensions paranext-multi-extension-template main --squash +``` + +#### Manually update extensions from `paranext-extension-template` + +```bash +git fetch paranext-extension-template main +``` + +For each extension, run the following (replace `` with each extension's folder name): + +```bash +git subtree pull --prefix src/ paranext-extension-template main --squash +``` + +
+ +## Special features in this project + +This project has special features and specific configuration to make building extensions for Platform.Bible easier. In the following expandable section are a few important notes: + +
+ Expand to read about special features in this project + +### React WebView files - `.web-view.tsx` + +Platform.Bible WebViews must be treated differently than other code, so this project makes doing that simpler: + +- WebView code must be bundled and can only import specific packages provided by Platform.Bible (see `externals` in `webpack.config.base.ts`), so this project bundles React WebViews before bundling the main extension file to support this requirement. The project discovers and bundles files that end with `.web-view.tsx` in this way. + - Note: while watching for changes, if you add a new `.web-view.tsx` file, you must either restart webpack or make a nominal change and save in an existing `.web-view.tsx` file for webpack to discover and bundle this new file. +- WebView code and styles must be provided to the `papi` as strings, so you can import WebView files with [`?inline`](#special-imports) after the file path to import the file as a string. + +### Special imports + +- Adding `?inline` to the end of a file import causes that file to be imported as a string after being transformed by webpack loaders but before bundling dependencies (except if that file is a React WebView file, in which case dependencies will be bundled). The contents of the file will be on the file's default export. + - Ex: `import myFile from './file-path?inline` +- Adding `?raw` to the end of a file import treats a file the same way as `?inline` except that it will be imported directly without being transformed by webpack. + +### Misc features + +- Platform.Bible extensions' code must be bundled all together in one file, so webpack bundles all the code together into one main file per extension. +- Platform.Bible extensions can interact with other extensions, but they cannot import and export like in a normal Node environment. Instead, they interact through the `papi`. As such, each extension's `src/types` folder contains its declarations file that tells other extensions how to interact with it through the `papi`. + +### Two-step webpack build + +These extensions are built by webpack (`webpack.config.ts`) in two steps: a WebView bundling step and a main bundling step: + +#### Build 1: TypeScript WebView bundling + +Webpack (`./webpack/webpack.config.web-view.ts`) prepares TypeScript WebViews for use and outputs them into temporary build folders adjacent to the WebView files: + +- Formats WebViews to match how they should look to work in Platform.Bible +- Transpiles React/TypeScript WebViews into JavaScript +- Bundles dependencies into the WebViews +- Embeds Sourcemaps into the WebViews inline + +#### Build 2: Main and final bundling + +Webpack (`./webpack/webpack.config.main.ts`) prepares the main extension files and bundles each extension together into the `dist` folder: + +- Transpiles the main TypeScript file and its imported modules into JavaScript +- Injects the bundled WebViews into the main file +- Bundles dependencies into the main file +- Embeds Sourcemaps into the file inline +- Packages everything up into an extension folder `dist` + +
diff --git a/extensions/cspell.json b/extensions/cspell.json new file mode 100644 index 0000000000..37c13f1477 --- /dev/null +++ b/extensions/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../cspell.json" +} diff --git a/extensions/lib/add-remotes.ts b/extensions/lib/add-remotes.ts new file mode 100644 index 0000000000..769ff092b9 --- /dev/null +++ b/extensions/lib/add-remotes.ts @@ -0,0 +1,38 @@ +import { includes } from 'platform-bible-utils'; +import { + ERROR_STRINGS, + MULTI_TEMPLATE_NAME, + MULTI_TEMPLATE_URL, + SINGLE_TEMPLATE_NAME, + SINGLE_TEMPLATE_URL, + execGitCommand, +} from './git.util'; + +(async () => { + let exitCode = 0; + // Try adding MULTI_TEMPLATE_REMOTE_NAME + try { + await execGitCommand(`git remote add ${MULTI_TEMPLATE_NAME} ${MULTI_TEMPLATE_URL}`); + } catch (e) { + if (includes(e.toString().toLowerCase(), ERROR_STRINGS.multiRemoteExists.toLowerCase())) + console.log(`Remote ${MULTI_TEMPLATE_NAME} already exists. This is likely not a problem.`); + else { + console.error(`Error on adding remote ${MULTI_TEMPLATE_NAME}: ${e}`); + exitCode = 1; + } + } + + // Try adding SINGLE_TEMPLATE_REMOTE_NAME + try { + await execGitCommand(`git remote add ${SINGLE_TEMPLATE_NAME} ${SINGLE_TEMPLATE_URL}`); + } catch (e) { + if (includes(e.toString().toLowerCase(), ERROR_STRINGS.singleRemoteExists.toLowerCase())) + console.log(`Remote ${SINGLE_TEMPLATE_NAME} already exists. This is likely not a problem.`); + else { + console.error(`Error on adding remote ${SINGLE_TEMPLATE_NAME}: ${e}`); + exitCode = 1; + } + } + + return exitCode; +})(); diff --git a/extensions/lib/create-extension.ts b/extensions/lib/create-extension.ts new file mode 100644 index 0000000000..f309182f94 --- /dev/null +++ b/extensions/lib/create-extension.ts @@ -0,0 +1,50 @@ +import { + SINGLE_TEMPLATE_BRANCH, + SINGLE_TEMPLATE_NAME, + checkForWorkingChanges, + execGitCommand, + fetchFromSingleTemplate, + formatExtensionFolder, +} from './git.util'; +import { getExtensionPathOSIndependent } from '../webpack/webpack.util'; + +const newExtensionName = process.argv[2]; + +(async () => { + // Make sure there are not working changes as this will not work with working changes + if (await checkForWorkingChanges()) return 1; + + // Fetch latest on SINGLE_TEMPLATE_REMOTE_NAME to make sure we're up to date + if (!(await fetchFromSingleTemplate())) return 1; + + /** + * Path to the extension to format relative to root + * + * WARNING: This does not use the operating system's path separator because it needs to be + * consistent for use in git commands. If you need an OS-dependent path separator, make a new + * path + */ + const extensionPathOSIndependent = getExtensionPathOSIndependent(newExtensionName); + + // Try putting SINGLE_TEMPLATE_REMOTE_NAME into a new extension folder + try { + await execGitCommand( + `git subtree add --prefix ${extensionPathOSIndependent} ${SINGLE_TEMPLATE_NAME} ${SINGLE_TEMPLATE_BRANCH} --squash`, + ); + } catch (e) { + console.error(`Error on adding extension ${newExtensionName}: ${e}`); + return 1; + } + + // Format the new extension folder to make sure it works properly as a subfolder of this repo + await formatExtensionFolder(extensionPathOSIndependent); + + // Check for working changes to see if formatting the extension changed anything + // Don't commit for them so they know what is going on + if (await checkForWorkingChanges(true)) + console.log( + `After creating the extension at ${extensionPathOSIndependent} from ${SINGLE_TEMPLATE_NAME} and formatting it, there are working changes.\nThis is likely expected. Please commit the result.`, + ); + + return 0; +})(); diff --git a/extensions/lib/git.util.ts b/extensions/lib/git.util.ts new file mode 100644 index 0000000000..116667ddfc --- /dev/null +++ b/extensions/lib/git.util.ts @@ -0,0 +1,218 @@ +import { exec, ExecOptions } from 'child_process'; +import { promisify } from 'util'; +import path from 'path'; +import replaceInFile from 'replace-in-file'; +import { subtreeRootFolder } from '../webpack/webpack.util'; + +const execAsync = promisify(exec); + +/** The name for the multi-extension template remote as used in the git scripts */ +export const MULTI_TEMPLATE_NAME = 'paranext-multi-extension-template'; +/** The url for the multi-extension template remote as used in the git scripts */ +export const MULTI_TEMPLATE_URL = 'https://github.com/paranext/paranext-multi-extension-template'; +/** The branch to use in pulling changes from `MULTI_TEMPLATE_REMOTE_NAME` in the git scripts */ +export const MULTI_TEMPLATE_BRANCH = 'main'; +/** The name for the single extension template remote as used in the git scripts */ +export const SINGLE_TEMPLATE_NAME = 'paranext-extension-template'; +/** The url for the single extension template remote as used in the git scripts */ +export const SINGLE_TEMPLATE_URL = 'https://github.com/paranext/paranext-extension-template'; +/** The branch to use in pulling changes from `SINGLE_TEMPLATE_REMOTE_NAME` in the git scripts */ +export const SINGLE_TEMPLATE_BRANCH = 'main'; + +// #region localization + +/** + * Error strings to be checked for in git output for various reasons + * + * `{key}` is replaced where applicable with the equivalent value from `GIT_CONSTANTS[key]` + */ +const errorStringTemplates = { + multiRemoteExists: 'remote {MULTI_TEMPLATE_NAME} already exists', + singleRemoteExists: 'remote {SINGLE_TEMPLATE_NAME} already exists', + /** `{0} is the subtree name aka the OS-independent extension directory path */ + subtreeNeverAdded: "can't squash-merge: '{0}' was never added.\n", +}; + +/** Object mapping const names for template replacing */ +const GIT_CONSTANTS = Object.freeze({ + MULTI_TEMPLATE_NAME, + MULTI_TEMPLATE_URL, + MULTI_TEMPLATE_BRANCH, + SINGLE_TEMPLATE_NAME, + SINGLE_TEMPLATE_URL, + SINGLE_TEMPLATE_BRANCH, +}); + +/** + * Formats a string, replacing `GIT_CONSTANTS` values in brackets like `{MULTI_TEMPLATE_NAME}` and + * such with their equivalent actual values + * + * @param str String to format + * @param args Rest args of strings to replace `{x}` with, where x is the arg index - 1 + * @returns Formatted string + */ +function formatGitErrorTemplate(str: string): string { + return str.replace(/{([^}]+)}/g, function replaceTemplateNumber(match) { + const matchingGitConstant = GIT_CONSTANTS[match.slice(1, -1)]; + return matchingGitConstant !== undefined ? matchingGitConstant : match; + }); +} + +/** Error strings to be checked for in git output for various reasons */ +// We are just mapping an object with strings to an object with strings. wah +// eslint-disable-next-line no-type-assertion/no-type-assertion +export const ERROR_STRINGS = Object.fromEntries( + Object.entries(errorStringTemplates).map(([key, value]) => [key, formatGitErrorTemplate(value)]), +) as typeof errorStringTemplates; + +// #endregion + +/** + * Executes a git command from the repo root directory, logging both the command and the results. + * + * For some reason, git likes to use stderr to return things that are not errors, so we only throw + * if the command throws + * + * @param command + * @param options The options for the exec command. Add quiet to not log anything + */ +export async function execGitCommand( + command: string, + options: ExecOptions & { quiet?: boolean } = {}, +): Promise<{ stdout: string; stderr: string }> { + const { quiet, ...execOptions } = options; + if (!quiet) console.log(`\n> ${command}`); + try { + const result = await execAsync(command, { + cwd: path.resolve(path.join(__dirname, '..', '..')), + ...execOptions, + }); + if (!quiet && result.stdout) console.log(result.stdout); + if (!quiet && result.stderr) console.log(result.stderr); + return result; + } catch (e) { + throw new Error( + `code ${e.code}!${e.stderr ? `\n${e.stderr}` : ''}${e.stdout ? `\n${e.stdout}` : ''}`, + ); + } +} + +/** + * Check the repo for working changes + * + * @param quiet Whether to log an error if there are working changes + * @returns True if there were working changes, false otherwise + */ +export async function checkForWorkingChanges(quiet = false) { + // Check the git status to make sure there are no working changes + const status = await execGitCommand('git status --porcelain=v2', { + quiet: true, + }); + + if (status.stderr || status.stdout) { + if (!quiet) + console.error( + `Working changes detected! Please stash or commit your changes. git status output: ${JSON.stringify( + status, + )}`, + ); + return true; + } + return false; +} + +/** + * Fetch latest from SINGLE_TEMPLATE_REMOTE_NAME + * + * @returns True if successful, false otherwise + */ +export async function fetchFromSingleTemplate() { + // Fetch latest SINGLE_TEMPLATE_REMOTE_NAME branch + try { + await execGitCommand(`git fetch ${SINGLE_TEMPLATE_NAME} ${SINGLE_TEMPLATE_BRANCH}`); + } catch (e) { + console.error(`Error on git fetch on ${SINGLE_TEMPLATE_NAME}: ${e}`); + return false; + } + return true; +} + +/** Globs to ignore when replacing stuff while formatting extensions */ +const replaceInFileIgnoreGlobs = [ + '**/node_modules/**/*', + '**/temp-build/**/*', + '**/logs/**/*', + '**/*.log', + '**/.eslintcache', + '**/dist/**/*', + '**/release/**/*', + // With npm workspaces, child workspace package-lock.json files are not used. Let's not format + // them so they can stay the same as how they were in the template to avoid merge conflicts + '**/package-lock.json', +]; + +/** + * Format an extension folder to make the extension template folder work as a subfolder of this repo + * + * This function may be called many times for one extension folder, so make sure all operations work + * properly no matter how many times this function is called + * + * @param extensionFolderPath Path to the extension to format relative to root + */ +export async function formatExtensionFolder(extensionFolderPath: string) { + /** + * Path to the extension to format relative to the extensions folder (where the npm script is + * running). + * + * We need to take out the path from root to where npm is running its script because replaceInFile + * works relative to the npm folder. Setting `cwd` and `glob.cwd` did not work because + * replaceInFile was not properly offsetting the path before passing to fs + */ + const extensionFolderPathFromExtensions = extensionFolderPath.replace( + `${subtreeRootFolder}/`, + '', + ); + const results = + // Replace ../paranext-core with ../../../paranext-core to fix ts-config and package.json and such + ( + await replaceInFile({ + files: `${extensionFolderPathFromExtensions}/**/*`, + ignore: replaceInFileIgnoreGlobs, + from: /([^/])\.\.\/paranext-core/g, + to: '$1../../..', + countMatches: true, + allowEmptyPaths: true, + }) + ).concat( + // Remove the type reference to external extensions since bundled extensions shouldn't use them + await replaceInFile({ + files: `${extensionFolderPathFromExtensions}/tsconfig.json`, + ignore: replaceInFileIgnoreGlobs, + from: /("src\/types"),\n\n[\w\W]+dev-appdata\/cache\/extension-types"/g, + to: '$1', + countMatches: true, + allowEmptyPaths: true, + }), + ); + + const replaceStats = results.reduce( + (replacements, replaceResult) => ({ + totalReplacements: replacements.totalReplacements + (replaceResult.numReplacements ?? 0), + filesChanged: replaceResult.hasChanged + ? [...replacements.filesChanged, replaceResult.file] + : [...replacements.filesChanged], + }), + // filesChanged starts as an empty array, so it can't tell it should contain strings without + // type assertion + // eslint-disable-next-line no-type-assertion/no-type-assertion + { totalReplacements: 0, filesChanged: [] as string[] }, + ); + if (replaceStats.totalReplacements > 0) + console.log( + `Formatting ${extensionFolderPath}: Successfully updated relative path to paranext-core ${ + replaceStats.totalReplacements + } times in ${replaceStats.filesChanged.length} files:\n\t${replaceStats.filesChanged.join( + '\n\t', + )}\n`, + ); +} diff --git a/extensions/lib/update-from-templates.ts b/extensions/lib/update-from-templates.ts new file mode 100644 index 0000000000..49983019b6 --- /dev/null +++ b/extensions/lib/update-from-templates.ts @@ -0,0 +1,99 @@ +import { includes } from 'platform-bible-utils'; +import { + ERROR_STRINGS, + MULTI_TEMPLATE_BRANCH, + MULTI_TEMPLATE_NAME, + SINGLE_TEMPLATE_BRANCH, + SINGLE_TEMPLATE_NAME, + checkForWorkingChanges, + execGitCommand, + fetchFromSingleTemplate, + formatExtensionFolder, +} from './git.util'; +import { ExtensionInfo, getExtensions, subtreeRootFolder } from '../webpack/webpack.util'; + +(async () => { + // Make sure there are not working changes as this will not work with working changes + if (await checkForWorkingChanges()) return 1; + + // Fetch latest MULTI_TEMPLATE_REMOTE_NAME branch + try { + await execGitCommand(`git fetch ${MULTI_TEMPLATE_NAME} ${MULTI_TEMPLATE_BRANCH}`); + } catch (e) { + console.error(`Error on git fetch on ${MULTI_TEMPLATE_NAME}: ${e}`); + return 1; + } + + // Merge changes from MULTI_TEMPLATE_REMOTE_NAME into this repo + try { + await execGitCommand( + `git subtree pull --prefix ${subtreeRootFolder} ${MULTI_TEMPLATE_NAME} ${MULTI_TEMPLATE_BRANCH} --squash`, + ); + } catch (e) { + console.error(`Error merging from ${MULTI_TEMPLATE_NAME}: ${e}`); + return 1; + } + + // Fetch latest on SINGLE_TEMPLATE_REMOTE_NAME to make sure we're up to date + if (!(await fetchFromSingleTemplate())) return 1; + + // Get list of extensions to update + /** All extension folders in this repo */ + const extensions = await getExtensions(); + /** + * Extensions in this repo that are git subtrees of SINGLE_TEMPLATE_REMOTE_NAME + * + * We will perform various updates on these extensions but not on ones that are not based on the + * template. + */ + const extensionsBasedOnTemplate: ExtensionInfo[] = []; + + // Merge changes from SINGLE_TEMPLATE_REMOTE_NAME into each extension one at a time + // We intend to run these one at a time, so for/of works well here + // eslint-disable-next-line no-restricted-syntax + for (const ext of extensions) { + try { + // We intend to run these one at a time, so awaiting inside the loop works well here + // eslint-disable-next-line no-await-in-loop + await execGitCommand( + `git subtree pull --prefix ${ext.dirPathOSIndependent} ${SINGLE_TEMPLATE_NAME} ${SINGLE_TEMPLATE_BRANCH} --squash`, + ); + + // We successfully pulled this subtree, so it is based on the template + extensionsBasedOnTemplate.push(ext); + } catch (e) { + if ( + includes( + e.toString().toLowerCase(), + ERROR_STRINGS.subtreeNeverAdded.replace('{0}', ext.dirPathOSIndependent).toLowerCase(), + ) + ) + // If this folder isn't a subtree, it may be intentionally not based on the template. Continue + console.warn( + `${ext.dirName} was never added as a subtree of ${SINGLE_TEMPLATE_NAME}. Feel free to ignore this if this folder is not supposed to be based on ${SINGLE_TEMPLATE_NAME}.\nIf this folder is supposed to be based on ${SINGLE_TEMPLATE_NAME}, move the folder elsewhere, run \`npm run create-extension -- ${ext.dirName}\`, drop the folder back in, and evaluate all working changes before committing.\n`, + ); + else { + console.error(`Error pulling from ${SINGLE_TEMPLATE_NAME} to ${ext.dirName}: ${e}`); + // You can only fix merge conflicts on one subtree at a time, so stop + // if we hit an error like merge conflicts + return 1; + } + } + } + + // Now that pulling all subtrees is finished and we can have working changes, format all the + // SINGLE_TEMPLATE_REMOTE_NAME-based extension folders to make sure they work properly as subfolders of this + // repo + await Promise.all( + extensionsBasedOnTemplate.map((ext) => formatExtensionFolder(ext.dirPathOSIndependent)), + ); + + // Check for working changes to see if formatting the extensions changed anything + // Don't commit for them so they know what is going on + if (await checkForWorkingChanges(true)) + console.log( + `After updating extensions from ${SINGLE_TEMPLATE_NAME} and formatting them, there are working changes.\nThis is likely expected. Please commit the result.`, + ); + + return 0; +})(); diff --git a/extensions/lib/zip-extensions.ts b/extensions/lib/zip-extensions.ts new file mode 100644 index 0000000000..0b02e39b16 --- /dev/null +++ b/extensions/lib/zip-extensions.ts @@ -0,0 +1,41 @@ +import path from 'path'; +import fs from 'fs'; +import zipFolder from 'zip-folder-promise'; +import { getExtensions, outputFolder } from '../webpack/webpack.util'; +import { rootDir } from '../webpack/webpack.config.base'; + +/** Folder for where the zipped files should be placed */ +const releaseFolder = path.join(rootDir, 'release'); + +/** Creates a zip for each extension and puts them in the release folder */ +async function zipExtensions() { + // Get all the extensions (this is technically based on source files, not on the output files) + const extensions = await getExtensions(); + + // Delete the release folder if it exists + await fs.promises.rm(releaseFolder, { recursive: true, force: true }); + // Create the release folder as zipFolder doesn't work unless that folder exists + await fs.promises.mkdir(releaseFolder, { recursive: true }); + + const zipPromises = extensions.map(async (extension) => { + try { + /** Directory to zip. The output extension folder */ + const dirToZip = path.join(rootDir, outputFolder, extension.dirName); + /** + * The file to output. Into release folder. + * `_.zip` + */ + const outputFile = path.join(releaseFolder, `${extension.dirName}_${extension.version}.zip`); + + return zipFolder(dirToZip, outputFile); + } catch (e) { + const error = `Error on zipping ${extension.dirName}: ${e}`; + console.error(error); + throw new Error(error); + } + }); + + return Promise.all(zipPromises); +} + +zipExtensions(); diff --git a/extensions/package.json b/extensions/package.json new file mode 100644 index 0000000000..e38a63e132 --- /dev/null +++ b/extensions/package.json @@ -0,0 +1,85 @@ +{ + "name": "paranext-extensions", + "private": true, + "version": "0.0.1", + "author": "Paranext", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "tsx ./lib/zip-extensions.ts", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "build:types": "cd .. && npm run build:types", + "start:core": "cd .. && npm run start", + "start": "npm run start:core", + "lint": "npm run lint:scripts --max-old-space-size=4096 && npm run lint:styles", + "lint:scripts": "cross-env NODE_OPTIONS=\"--max-old-space-size=4096\" NODE_ENV=development eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts", + "lint:staged": "lint-staged -q", + "postinstall": "tsx ./lib/add-remotes.ts", + "create-extension": "tsx ./lib/create-extension.ts", + "update-from-templates": "tsx ./lib/update-from-templates.ts" + }, + "lint-staged": { + "*.{cjs,js,jsx,ts,tsx}": ["prettier --write", "cross-env NODE_ENV=development eslint --cache"], + "*.json": ["prettier --parser json --write"], + "*.{css,scss}": ["stylelint --fix"], + "*.{html,md,yml}": ["prettier --single-quote --write"] + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../lib/platform-bible-utils" + }, + "devDependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.10", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "glob": "^10.3.12", + "papi-dts": "file:../lib/papi-dts", + "platform-bible-react": "file:../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "replace-in-file": "^7.1.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.7.1", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-folder-promise": "^1.2.0" + }, + "volta": { + "extends": "../package.json" + } +} diff --git a/extensions/src/c-sharp-provider-test/index.d.ts b/extensions/src/c-sharp-provider-test/index.d.ts new file mode 100644 index 0000000000..a98f1025e4 --- /dev/null +++ b/extensions/src/c-sharp-provider-test/index.d.ts @@ -0,0 +1,21 @@ +declare module 'c-sharp-provider-test' { + import { IDataProvider, DataProviderDataType } from '@papi/core'; + + type TimeDataTypes = { + Time: DataProviderDataType; + }; + + export type TimeDataProvider = IDataProvider; +} + +declare module 'papi-shared-types' { + import type { TimeDataProvider } from 'c-sharp-provider-test'; + + export interface CommandHandlers { + 'test.addOne': (num: number) => number; + } + + export interface DataProviders { + 'current-time': TimeDataProvider; + } +} diff --git a/extensions/src/c-sharp-provider-test/manifest.json b/extensions/src/c-sharp-provider-test/manifest.json new file mode 100644 index 0000000000..a1e81eebf9 --- /dev/null +++ b/extensions/src/c-sharp-provider-test/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "c-sharp-provider-test", + "version": "0.0.1", + "description": "C# Data Provider Test Types for Paranext - provided by C# data provider", + "author": "Paranext", + "license": "MIT", + "main": "", + "activationEvents": [] +} diff --git a/extensions/src/evil/assets/evil.web-view.html b/extensions/src/evil/assets/evil.web-view.html new file mode 100644 index 0000000000..c8d010dfd2 --- /dev/null +++ b/extensions/src/evil/assets/evil.web-view.html @@ -0,0 +1,51 @@ + + + + + +
+ This evil webview comes from a file! It is served at + `papi-extension:evil/assets/evil.web-view.html`. It is trying to do bad things. If you see an + error in the console like '<<BAD>> EVIL WEB VIEW FILE...', it did bad things. But if + you see this message without seeing errors like that, it probably wasn't able to do bad things! + :) +
+ diff --git a/extensions/src/evil/evil.d.ts b/extensions/src/evil/evil.d.ts new file mode 100644 index 0000000000..6c409d4aca --- /dev/null +++ b/extensions/src/evil/evil.d.ts @@ -0,0 +1 @@ +declare module 'evil' {} diff --git a/extensions/src/evil/evil.js b/extensions/src/evil/evil.js new file mode 100644 index 0000000000..4772e23c8d --- /dev/null +++ b/extensions/src/evil/evil.js @@ -0,0 +1,335 @@ +/* eslint-disable global-require */ + +'use strict'; + +const papi = require('@papi/backend'); + +const { logger } = papi; + +// This is here because we can't bundle a webview in due to webpack not bundling the evil extension +const EVIL_WEBVIEW = ` + + + + +
+ This evil webview is trying to do bad things. If you see a new iframe or link on the side of + the screen or see modals about evil, it did bad things. But if you see this message without + seeing modals, it probably wasn't able to do bad things! 🎉 +
+
+ Below, you should see an iframe with another evil webview code that also should fail to do bad + things: +
+ + + + +`; + +const evilWebViewProvider = { + webViewType: 'evil.evil', + async getWebView(savedWebView) { + return { + ...savedWebView, + title: 'Evil', + contentType: 'html', + content: EVIL_WEBVIEW, + allowedFrameSources: ['papi-extension:'], + }; + }, +}; + +const evilFileWebViewProvider = { + webViewType: 'evil.evilFile', + async getWebView(savedWebView) { + return { + ...savedWebView, + title: 'Evil File', + contentType: 'url', + content: 'papi-extension://evil/assets/evil.web-view.html', + allowScripts: true, + allowedFrameSources: ['papi-extension://evil/.+'], + }; + }, +}; + +async function tryImports() { + logger.info('Evil is importing! Mwahahaha'); + + try { + // This will be blocked and will suggest the papi.storage api. + const fs = require('fs'); + logger.error(`Evil: <> Successfully imported fs! fs.readFileSync = ${fs.readFileSync}`); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Evil: Good error on require fs: ${e.message}`); + } + + try { + // This will be blocked and will suggest the papi.fetch api. + const https = require('https'); + logger.error(`Evil: <> Successfully imported https! ${JSON.stringify(https)}`); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Evil: Good error on require https: ${e.message}`); + } + + try { + // This should always work because `fetch` is replaced with `papi.fetch`. + await fetch('https://www.example.com'); + // No need to log good stuff unless we're testing + // logger.info('Evil: Good - fetch is working.'); + } catch (e) { + logger.error(`Evil: <> error on fetch! ${e}`); + } + + try { + // This is just for testing and will throw an exception. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const xhr = new XMLHttpRequest(); + logger.error(`Evil: <> Successfully created an XMLHttpRequest!`); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Evil: Good error on XMLHttpRequest! ${e}`); + } + + try { + // This is just for testing and will throw an exception. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const webSocket = new WebSocket(); + logger.error(`Evil: <> Successfully created a WebSocket!`); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Evil: Good error on WebSocket! ${e}`); + } + + try { + // This will be blocked and will suggest the papi.storage api. + const fs = await import('fs'); + logger.error( + `Evil: <> Successfully dynamically imported fs! fs.readFileSync = ${fs.readFileSync}`, + ); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Evil: Good error on dynamic import! ${e.message}`); + } + + try { + // This should always work. + /* const genericFetch = */ await (await papi.fetch('https://www.example.com')).text(); + // No need to log good stuff unless we're testing + /* logger.info( + `Evil: Good success - could papi.fetch example.com "${genericFetch.substring(0, 100)}"`, + ); */ + } catch (e) { + logger.error(`Evil: <> error on papi.fetch! ${e}`); + } +} + +tryImports(); + +async function activate(context) { + logger.info('Evil is activating...'); + tryImports(); + // 3 secs is timed to be after the extension service has finished initializing. + setTimeout(tryImports, 3000); + + const evilWebViewProviderPromise = papi.webViewProviders.register( + evilWebViewProvider.webViewType, + evilWebViewProvider, + ); + papi.webViews.getWebView(evilWebViewProvider.webViewType, undefined, { existingId: '?' }); + + const evilFileWebViewProviderPromise = papi.webViewProviders.register( + evilFileWebViewProvider.webViewType, + evilFileWebViewProvider, + ); + papi.webViews.getWebView(evilFileWebViewProvider.webViewType, undefined, { existingId: '?' }); + + context.registrations.add(await evilWebViewProviderPromise); + context.registrations.add(await evilFileWebViewProviderPromise); + + logger.info('Evil is finished activating!'); +} + +function deactivate() { + logger.info('Evil is deactivated.'); + logger.error( + 'Evil is purposely failing to deactivate as a test! You should see one more error soon after this. Only these two errors are expected.', + ); +} + +exports.activate = activate; +exports.deactivate = deactivate; diff --git a/extensions/src/evil/manifest.json b/extensions/src/evil/manifest.json new file mode 100644 index 0000000000..4488e1d983 --- /dev/null +++ b/extensions/src/evil/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "evil", + "version": "0.0.1", + "description": "Paranext extension that tries to break things!!1!!", + "author": "TJ Couch", + "license": "MIT", + "main": "evil.js", + "activationEvents": [] +} diff --git a/extensions/src/evil/package.json b/extensions/src/evil/package.json new file mode 100644 index 0000000000..8fdd65e530 --- /dev/null +++ b/extensions/src/evil/package.json @@ -0,0 +1,15 @@ +{ + "name": "evil", + "version": "0.0.1", + "description": "Paranext extension that tries to break things!!1!!", + "main": "evil.js", + "types": "evil.d.ts", + "author": "Paranext", + "license": "MIT", + "volta": { + "extends": "../../package.json" + }, + "devDependencies": { + "typescript": "^5.4.5" + } +} diff --git a/extensions/src/hello-someone/.editorconfig b/extensions/src/hello-someone/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/src/hello-someone/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/src/hello-someone/.eslintignore b/extensions/src/hello-someone/.eslintignore new file mode 100644 index 0000000000..bdb2e12c0b --- /dev/null +++ b/extensions/src/hello-someone/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-someone/.eslintrc.js b/extensions/src/hello-someone/.eslintrc.js new file mode 100644 index 0000000000..279bb37dcd --- /dev/null +++ b/extensions/src/hello-someone/.eslintrc.js @@ -0,0 +1,163 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/src/hello-someone/.gitignore b/extensions/src/hello-someone/.gitignore new file mode 100644 index 0000000000..cb00ea28d2 --- /dev/null +++ b/extensions/src/hello-someone/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/src/hello-someone/.prettierignore b/extensions/src/hello-someone/.prettierignore new file mode 100644 index 0000000000..69fb5a8ab5 --- /dev/null +++ b/extensions/src/hello-someone/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-someone/.prettierrc.js b/extensions/src/hello-someone/.prettierrc.js new file mode 100644 index 0000000000..01e5ca241c --- /dev/null +++ b/extensions/src/hello-someone/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/src/hello-someone/.stylelintignore b/extensions/src/hello-someone/.stylelintignore new file mode 100644 index 0000000000..6d59d79515 --- /dev/null +++ b/extensions/src/hello-someone/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-someone/.stylelintrc.js b/extensions/src/hello-someone/.stylelintrc.js new file mode 100644 index 0000000000..70f5dd2d0e --- /dev/null +++ b/extensions/src/hello-someone/.stylelintrc.js @@ -0,0 +1,20 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + }, +}; + +// #endregion diff --git a/extensions/src/hello-someone/.vscode/extensions.json b/extensions/src/hello-someone/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/src/hello-someone/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/src/hello-someone/.vscode/launch.json b/extensions/src/hello-someone/.vscode/launch.json new file mode 100644 index 0000000000..fb0f3a08c0 --- /dev/null +++ b/extensions/src/hello-someone/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/src/hello-someone/.vscode/settings.json b/extensions/src/hello-someone/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/src/hello-someone/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/src/hello-someone/LICENSE b/extensions/src/hello-someone/LICENSE new file mode 100644 index 0000000000..851ff3e8d1 --- /dev/null +++ b/extensions/src/hello-someone/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/src/hello-someone/README.md b/extensions/src/hello-someone/README.md new file mode 100644 index 0000000000..a936efc7d8 --- /dev/null +++ b/extensions/src/hello-someone/README.md @@ -0,0 +1,88 @@ +# hello-someone + +Simple hello someone extension for Platform.Bible + +## Summary + +The general file structure is as follows: + +- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder +- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder +- `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/paranext-extension-template.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) +- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder + - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file + - `assets/descriptions/` contains textual descriptions of the extension in various languages + - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` +- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest +- `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing a zip of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In this repo, run `npm install` to install local and published dependencies + +### Configure paths to `paranext-core` repo + +In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. +2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. + +## To run + +### Running Platform.Bible with this extension + +To run Platform.Bible with this extension: + +`npm start` + +Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. + +### Building this extension independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extension once: + +`npm run build` + +## To package for distribution + +To package this extension into a zip file for distribution: + +`npm run package` + +## To update this extension from the template + +This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. + +To set up this extension to be updated from the template, run the following command once after cloning this repo: + +```bash +git remote add template https://github.com/paranext/paranext-extension-template +``` + +To update this extension from the template, make sure your repo has no working changes. Then run the following commands: + +```bash +git fetch template +git merge template/main --allow-unrelated-histories +``` + +For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). + +**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +## Special features in this project + +This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. diff --git a/extensions/src/hello-someone/assets/descriptions/description-en.md b/extensions/src/hello-someone/assets/descriptions/description-en.md new file mode 100644 index 0000000000..9490002d50 --- /dev/null +++ b/extensions/src/hello-someone/assets/descriptions/description-en.md @@ -0,0 +1 @@ +Simple hello someone extension for Platform.Bible. diff --git a/extensions/src/hello-someone/assets/displayData.json b/extensions/src/hello-someone/assets/displayData.json new file mode 100644 index 0000000000..1072573014 --- /dev/null +++ b/extensions/src/hello-someone/assets/displayData.json @@ -0,0 +1,12 @@ +{ + "icon": "", + "moreInfoUrl": "", + "supportUrl": "", + "localizedDisplayInfo": { + "en": { + "displayName": "Hello Someone Extension", + "shortSummary": "Simple hello someone extension", + "description": "assets/descriptions/description-en.md" + } + } +} diff --git a/contributions/localizedStrings.json b/extensions/src/hello-someone/contributions/localizedStrings.json similarity index 100% rename from contributions/localizedStrings.json rename to extensions/src/hello-someone/contributions/localizedStrings.json diff --git a/contributions/menus.json b/extensions/src/hello-someone/contributions/menus.json similarity index 100% rename from contributions/menus.json rename to extensions/src/hello-someone/contributions/menus.json diff --git a/contributions/projectSettings.json b/extensions/src/hello-someone/contributions/projectSettings.json similarity index 100% rename from contributions/projectSettings.json rename to extensions/src/hello-someone/contributions/projectSettings.json diff --git a/contributions/settings.json b/extensions/src/hello-someone/contributions/settings.json similarity index 100% rename from contributions/settings.json rename to extensions/src/hello-someone/contributions/settings.json diff --git a/extensions/src/hello-someone/cspell.json b/extensions/src/hello-someone/cspell.json new file mode 100644 index 0000000000..d78da5aafa --- /dev/null +++ b/extensions/src/hello-someone/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../../cspell.json" +} diff --git a/extensions/src/hello-someone/manifest.json b/extensions/src/hello-someone/manifest.json new file mode 100644 index 0000000000..2a90972cfa --- /dev/null +++ b/extensions/src/hello-someone/manifest.json @@ -0,0 +1,16 @@ +{ + "name": "helloSomeone", + "version": "0.0.1", + "displayData": "assets/displayData.json", + "author": "Paranext", + "license": "MIT", + "main": "src/main.ts", + "extensionDependencies": {}, + "elevatedPrivileges": [], + "types": "src/types/hello-someone.d.ts", + "menus": "contributions/menus.json", + "settings": "contributions/settings.json", + "projectSettings": "contributions/projectSettings.json", + "localizedStrings": "contributions/localizedStrings.json", + "activationEvents": ["onCommand:helloSomeone.helloSomeone"] +} diff --git a/extensions/src/hello-someone/package.json b/extensions/src/hello-someone/package.json new file mode 100644 index 0000000000..1a67000cbb --- /dev/null +++ b/extensions/src/hello-someone/package.json @@ -0,0 +1,86 @@ +{ + "name": "hello-someone", + "version": "0.0.1", + "description": "Simple hello someone extension for Platform.Bible", + "main": "src/main.js", + "types": "src/types/hello-someone.d.ts", + "author": "Paranext", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "start:core": "cd ../../.. && npm run start", + "start": "npm run start:core", + "start:production": "echo unimplemented", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/extensions/src/hello-someone/src/emotion-test.web-view.tsx b/extensions/src/hello-someone/src/emotion-test.web-view.tsx new file mode 100644 index 0000000000..ddc7b79aa3 --- /dev/null +++ b/extensions/src/hello-someone/src/emotion-test.web-view.tsx @@ -0,0 +1,24 @@ +import { logger } from '@papi/frontend'; +import { Button } from 'platform-bible-react'; +import { Button as MuiButton } from '@mui/material'; + +/** + * This web view exists to test if importing `platform-bible-react` and `@mui/material` at once will + * successfully deduplicate `@emotion/react`. If it fails, there will be a console warning in the + * renderer indicating `@emotion/react` was loaded twice. + */ + +globalThis.webViewComponent = function EmotionTestWebView() { + return ( +
+
+ @emotion/react test - you should not see a console warning about @emotion/react being loaded + twice +
+ + logger.info('mui button')}>mui button +
+ ); +}; diff --git a/extensions/src/hello-someone/src/hello-someone.web-view.html b/extensions/src/hello-someone/src/hello-someone.web-view.html new file mode 100644 index 0000000000..7df2e8bdfb --- /dev/null +++ b/extensions/src/hello-someone/src/hello-someone.web-view.html @@ -0,0 +1,206 @@ + + + + +
Hello Someone!!
+
+ + + +
+
+
+ +
+
+ +
+
+
People Updates: 0
+
Any Greetings Updates (via Bill): 0
+
Bill Greetings Updates: 0
+
Any Age Updates (via Bill): 0
+
Bill Age Updates: 0
+
+
+ + + diff --git a/extensions/src/hello-someone/src/main.ts b/extensions/src/hello-someone/src/main.ts new file mode 100644 index 0000000000..21950762f6 --- /dev/null +++ b/extensions/src/hello-someone/src/main.ts @@ -0,0 +1,358 @@ +import papi, { logger } from '@papi/backend'; +import { + DataProviderUpdateInstructions, + ExecutionActivationContext, + IWebViewProvider, + SavedWebViewDefinition, + WebViewContentType, + WebViewDefinition, + WithNotifyUpdate, + IDataProviderEngine, +} from '@papi/core'; +import type { PeopleData, PeopleDataMethods, PeopleDataTypes, Person } from 'hello-someone'; +import helloSomeoneHtmlWebView from './hello-someone.web-view.html?inline'; +import emotionTestWebView from './emotion-test.web-view?inline'; + +logger.info('Hello Someone is importing!'); + +/** + * Example data provider engine that provides information about people. + * + * It has three data types: + * + * - Greeting: a person's greeting + * - Age: a person's age + * - People: information about all the people associated with this engine + * + * For each data type, an engine needs a `get` and a `set`. + * + * `papi` will create a data provider that internally uses this engine. The data provider layers + * over this engine and adds functionality like `subscribe` functions with automatic + * updates. + * + * This data provider engine is defined by an object, which we recommend starting with to get + * comfortable with the data provider api because of the following pros and cons: + * + * - Pros + * + * - Intellisense works better (Ctrl+Space lists methods you need to implement) + * - Function parameter and return types are inferred - no need to specify types + * - Cons + * + * - Must specify all properties and methods in the object type + * - `@papi.dataProviders.decorators.ignore` is difficult to apply to tell papi to ignore methods + * - When using `this.notifyUpdate`, you must include the `WithNotifyUpdate` type and provide a + * placeholder `notifyUpdate` method + * + * If you would like more advanced functionality, you can alternatively define a data provider + * engine with a class. An example of this is found in `quick-verse.ts`. + */ +const peopleDataProviderEngine: IDataProviderEngine & + WithNotifyUpdate & + PeopleDataMethods & { + people: PeopleData; + getPerson( + name: string, + createIfDoesNotExist?: T, + ): T extends true ? Person : Person | undefined; + } = { + /** People that are the data this engine serves */ + people: { + bill: { greeting: 'Hi, my name is Bill!', age: 43 }, + kathy: { greeting: 'Hello. My name is Kathy.', age: 35 }, + }, + + /** + * Get a person by name. By default, creates that person if they don't exist yet + * + * @param name Name of person + * @param createIfDoesNotExist Whether to create the person if they don't exist. Defaults to true + * @returns Person according to the provided name or undefined if they don't exist and were not + * set to be created in this method. + * + * Note: this method is named `getPerson`, which would normally mean papi would consider it to be + * a data type method and would fail to use this engine because it would expect a `setPerson` as + * well. However, we added the `ignore` decorator (the line immediately after defining this + * peopleDataProviderEngine object), so papi will not pick it up. Alternatively, you can name it + * anything that doesn't start with `get` like `_getPerson` or `internalGetPerson`. + */ + getPerson( + name: string, + // Assert the conditional type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + createIfDoesNotExist: T = true as T, + ): T extends true ? Person : Person | undefined { + const nameLower = name.toLowerCase(); + if (createIfDoesNotExist && !this.people[nameLower]) this.people[nameLower] = {}; + // Type assert because we know this person exists + // eslint-disable-next-line no-type-assertion/no-type-assertion + return this.people[nameLower] as T extends true ? Person : Person | undefined; + }, + + /** + * Sets a person's greeting, creating the person if they do not exist. + * + * @param name Name of person + * @param greeting Person's new greeting + * @returns Update instructions for updating the Greeting and People data types because we want + * subscribers to either of these data types to update based on this change. + * + * Note: this method gets layered over so that you can run `this.setGreeting` inside this data + * provider engine, and it will send updates after returning. + * + * Note: this method is used when someone uses the `useData('helloSomeone.people').Greeting` hook + * on the data provider papi creates for this engine. + */ + async setGreeting( + name: string, + greeting: string, + ): Promise> { + const person = this.getPerson(name); + // If there is no change in the greeting, don't update + if (greeting === person.greeting) return false; + + // Update the greeting and send an update + person.greeting = greeting; + // Update greetings and People because People needs to know about all changes to people + return ['Greeting', 'People']; + }, + + /** + * Get a person's greeting + * + * @param name Name of person + * @returns Person's greeting or undefined + * + * Note: this method is used when someone uses the `useData('helloSomeone.people').Greeting` hook + * or the `subscribeGreeting` method on the data provider papi creates for this engine. + */ + async getGreeting(name: string) { + return this.getPerson(name, false)?.greeting; + }, + + /** + * Set's a person's age, creating the person if they do not exist. + * + * @param name Name of person + * @param age Person's new age + * @returns Update instructions for updating the Age and People data types because we want + * subscribers to either of these data types to update based on this change. + * + * Note: this method gets layered over so that you can run `this.setAge` inside this data provider + * engine, and it will send updates after returning. + * + * Note: this method is used when someone uses the `useData('helloSomeone.people').Age` hook on + * the data provider papi creates for this engine. + */ + async setAge( + name: string, + age: number, + ): Promise> { + const person = this.getPerson(name); + // If there is no change in the age, don't update + if (age === person.age) return false; + + // Update the age and send an update + person.age = age; + // Update age and People because People needs to know about all changes to people + return ['Age', 'People']; + }, + + /** + * Get a person's age + * + * @param name Name of person + * @returns Person's age or undefined + * + * Note: this method is used when someone uses the `useData('helloSomeone.people').Age` hook or + * the `subscribeAge` method on the data provider papi creates for this engine. + */ + async getAge(name: string) { + return this.getPerson(name, false)?.age; + }, + + /** + * Function used to notify subscribers that data updated. papi layers over this method so that you + * can run `this.notifyUpdate` inside this data provider engine, and it will send updates after + * running. + * + * @param updateInstructions Information that papi uses to interpret whether to send out updates. + * papi passes the interpreted update value into this function. For example, running + * `this.notifyUpdate()` will call this `notifyUpdate` with `updateInstructions` of `'*'`. + * + * Note: this method does not have to be provided here for it to work properly because it is + * layered over on the papi. The only thing you can do here that will affect the update is to + * throw an error. + */ + notifyUpdate(updateInstructions) { + logger.info(`people data provider engine ran notifyUpdate! ${updateInstructions}`); + }, + + /** + * Does nothing (meaning the People data type is read-only). This method is provided to match with + * `getPeople`. + * + * @returns False meaning do not update anything + */ + async setPeople() { + // Don't change everyone's greeting, you heathen! + return false; + }, + + /** + * Gets information about all people in this data provider. + * + * @returns Information about all people in this data provider + */ + async getPeople() { + // WARNING: returning the object reference itself allows in-process consumers to edit this + // object directly. Please do not do this in a real extension (deep clone it or something) + return this.people; + }, + + /** + * Deletes a person from this data provider. + * + * @param name Name of person + * @returns True if deleted, false if did not exist + * + * Note: this is an example of a data provider engine custom method. It uses `notifyUpdateAll` to + * inform subscribers that the data has changed because it is not in a `set` + * function. + */ + async deletePerson(name: string) { + const person = this.getPerson(name, false); + if (person) { + logger.info(`RIP ${name}, who died tragically young at age ${person.age}. ;(`); + delete this.people[name.toLowerCase()]; + this.notifyUpdate(); + return true; + } + return false; + }, + + /** Test method to make sure people can use data provider engines' custom methods */ + testRandomMethod: async (things: string) => { + const result = `People data provider got testRandomMethod! ${things}`; + logger.info(result); + return result; + }, +}; +papi.dataProviders.decorators.ignore(peopleDataProviderEngine.getPerson); + +const peopleWebViewType = 'helloSomeone.peopleViewer'; +const peopleWebViewIdKey = 'peopleWebViewId'; + +/** Simple web view provider that provides People web views when papi requests them */ +const peopleWebViewProvider: IWebViewProvider = { + async getWebView(savedWebView: SavedWebViewDefinition): Promise { + if (savedWebView.webViewType !== peopleWebViewType) + throw new Error( + `${peopleWebViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + return { + ...savedWebView, + title: 'People', + // Can't use the enum value from a definition file so assert the type from the string literal. + // eslint-disable-next-line no-type-assertion/no-type-assertion + contentType: 'html' as WebViewContentType.HTML, + content: helloSomeoneHtmlWebView, + }; + }, +}; + +const emotionTestWebViewType = 'helloSomeone.emotionTest'; + +/** Simple web view provider that provides `@emotion/react` test web views when papi requests them */ +const emotionTestWebViewProvider: IWebViewProvider = { + async getWebView(savedWebView: SavedWebViewDefinition): Promise { + if (savedWebView.webViewType !== emotionTestWebViewType) + throw new Error( + `${emotionTestWebViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + return { + ...savedWebView, + title: 'Emotion Test', + content: emotionTestWebView, + }; + }, +}; + +export async function activate(context: ExecutionActivationContext): Promise { + logger.info('Hello Someone is activating!'); + + const peopleDataProviderPromise = papi.dataProviders.registerEngine( + 'helloSomeone.people', + peopleDataProviderEngine, + ); + + const peopleWebViewProviderPromise = papi.webViewProviders.register( + peopleWebViewType, + peopleWebViewProvider, + ); + + const emotionTestWebViewProviderPromise = papi.webViewProviders.register( + emotionTestWebViewType, + emotionTestWebViewProvider, + ); + + const helloSomeoneCommandPromise = papi.commands.registerCommand( + 'helloSomeone.helloSomeone', + (name: string) => { + return `Hello ${name}!`; + }, + ); + + // Create a webview or get the existing webview if ours already exists + // Note: here, we are storing a created webview's id when we create it, and using that id on + // `existingId` to look specifically for the webview that we previously created if we have ever + // created one in a previous session. This means that, if someone else creates a people web view, + // it will be distinct from this one. We are creating our own web view here. See `hello-world.ts` + // for an example of getting any webview with the specified `webViewType` + + // Get existing webview id if we previously created a webview for this type + let existingPeopleWebViewId: string | undefined; + try { + existingPeopleWebViewId = await papi.storage.readUserData( + context.executionToken, + peopleWebViewIdKey, + ); + } catch (e) { + existingPeopleWebViewId = undefined; + } + + // Don't block on the web view to keep going + setTimeout(async () => { + // Get the existing web view if one exists or create a new one + const peopleWebViewId = await papi.webViews.getWebView( + peopleWebViewType, + { type: 'panel', direction: 'top' }, + { existingId: existingPeopleWebViewId }, + ); + + // Save newly acquired webview id + await papi.storage.writeUserData( + context.executionToken, + peopleWebViewIdKey, + peopleWebViewId || '', + ); + }, 1000); + + papi.webViews.getWebView(emotionTestWebViewType, undefined, { existingId: '?' }); + + // Await the registration promises at the end so we don't hold everything else up + context.registrations.add( + await peopleDataProviderPromise, + await peopleWebViewProviderPromise, + await emotionTestWebViewProviderPromise, + await helloSomeoneCommandPromise, + papi.webViews.onDidAddWebView((addWebViewEvent) => { + if (addWebViewEvent.webView.webViewType === peopleWebViewType) + logger.info( + `We noticed a ${peopleWebViewType} webView was added with id ${addWebViewEvent.webView.id}`, + ); + }), + ); + + logger.info('Hello Someone is finished activating!'); +} diff --git a/extensions/src/hello-someone/src/types/hello-someone.d.ts b/extensions/src/hello-someone/src/types/hello-someone.d.ts new file mode 100644 index 0000000000..e96fb9a93e --- /dev/null +++ b/extensions/src/hello-someone/src/types/hello-someone.d.ts @@ -0,0 +1,37 @@ +declare module 'hello-someone' { + import { IDataProvider, DataProviderDataType } from '@papi/core'; + + export type Person = { + greeting?: string; + age?: number; + }; + + export type PeopleData = { + [name: string]: Person | undefined; + }; + + export type PeopleDataTypes = { + Greeting: DataProviderDataType; + Age: DataProviderDataType; + People: DataProviderDataType; + }; + + export type PeopleDataMethods = { + deletePerson(name: string): Promise; + testRandomMethod(things: string): Promise; + }; + + export type PeopleDataProvider = IDataProvider & PeopleDataMethods; +} + +declare module 'papi-shared-types' { + import type { PeopleDataProvider } from 'hello-someone'; + + export interface CommandHandlers { + 'helloSomeone.helloSomeone': (name: string) => string; + } + + export interface DataProviders { + 'helloSomeone.people': PeopleDataProvider; + } +} diff --git a/src/webpack-env.d.ts b/extensions/src/hello-someone/src/webpack-env.d.ts similarity index 100% rename from src/webpack-env.d.ts rename to extensions/src/hello-someone/src/webpack-env.d.ts diff --git a/extensions/src/hello-someone/tsconfig.json b/extensions/src/hello-someone/tsconfig.json new file mode 100644 index 0000000000..29f4025b9c --- /dev/null +++ b/extensions/src/hello-someone/tsconfig.json @@ -0,0 +1,54 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../../../lib", + // Include core extensions' type declarations + "../../../extensions/src", + // Include this extension's type declarations. It's in this location so there aren't any + // unexpected files there for typeRoots to include + "src/types" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/src/hello-someone/tsconfig.lint.json b/extensions/src/hello-someone/tsconfig.lint.json new file mode 100644 index 0000000000..2a82a6c426 --- /dev/null +++ b/extensions/src/hello-someone/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.js", "*.cjs", "*.js", "*.ts", "src", "webpack"] +} diff --git a/webpack.config.ts b/extensions/src/hello-someone/webpack.config.ts similarity index 100% rename from webpack.config.ts rename to extensions/src/hello-someone/webpack.config.ts diff --git a/webpack/web-view-resolve-webpack-plugin.ts b/extensions/src/hello-someone/webpack/web-view-resolve-webpack-plugin.ts similarity index 100% rename from webpack/web-view-resolve-webpack-plugin.ts rename to extensions/src/hello-someone/webpack/web-view-resolve-webpack-plugin.ts diff --git a/webpack/webpack.config.base.ts b/extensions/src/hello-someone/webpack/webpack.config.base.ts similarity index 92% rename from webpack/webpack.config.base.ts rename to extensions/src/hello-someone/webpack/webpack.config.base.ts index 18b6579228..3eafc61c32 100644 --- a/webpack/webpack.config.base.ts +++ b/extensions/src/hello-someone/webpack/webpack.config.base.ts @@ -146,22 +146,10 @@ const configBase: webpack.Configuration = { // https://webpack.js.org/configuration/resolve/#resolvealias // TODO: Remove this when `platform-bible-react` is published to npm alias: { - '@emotion/react': path.resolve( - __dirname, - '..', - '../paranext-core/node_modules/@emotion/react', - ), - '@emotion/styled': path.resolve( - __dirname, - '..', - '../paranext-core/node_modules/@emotion/styled', - ), - '@mui/material': path.resolve(__dirname, '..', '../paranext-core/node_modules/@mui/material'), - 'react-data-grid': path.resolve( - __dirname, - '..', - '../paranext-core/node_modules/react-data-grid', - ), + '@emotion/react': path.resolve(__dirname, '..', '../../../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../../../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../../../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../../../node_modules/react-data-grid'), }, }, }; diff --git a/webpack/webpack.config.main.ts b/extensions/src/hello-someone/webpack/webpack.config.main.ts similarity index 100% rename from webpack/webpack.config.main.ts rename to extensions/src/hello-someone/webpack/webpack.config.main.ts diff --git a/webpack/webpack.config.web-view.ts b/extensions/src/hello-someone/webpack/webpack.config.web-view.ts similarity index 100% rename from webpack/webpack.config.web-view.ts rename to extensions/src/hello-someone/webpack/webpack.config.web-view.ts diff --git a/webpack/webpack.util.ts b/extensions/src/hello-someone/webpack/webpack.util.ts similarity index 100% rename from webpack/webpack.util.ts rename to extensions/src/hello-someone/webpack/webpack.util.ts diff --git a/extensions/src/hello-world/.editorconfig b/extensions/src/hello-world/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/src/hello-world/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/src/hello-world/.eslintignore b/extensions/src/hello-world/.eslintignore new file mode 100644 index 0000000000..bdb2e12c0b --- /dev/null +++ b/extensions/src/hello-world/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-world/.eslintrc.js b/extensions/src/hello-world/.eslintrc.js new file mode 100644 index 0000000000..279bb37dcd --- /dev/null +++ b/extensions/src/hello-world/.eslintrc.js @@ -0,0 +1,163 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/src/hello-world/.gitignore b/extensions/src/hello-world/.gitignore new file mode 100644 index 0000000000..cb00ea28d2 --- /dev/null +++ b/extensions/src/hello-world/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/src/hello-world/.prettierignore b/extensions/src/hello-world/.prettierignore new file mode 100644 index 0000000000..69fb5a8ab5 --- /dev/null +++ b/extensions/src/hello-world/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-world/.prettierrc.js b/extensions/src/hello-world/.prettierrc.js new file mode 100644 index 0000000000..01e5ca241c --- /dev/null +++ b/extensions/src/hello-world/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/src/hello-world/.stylelintignore b/extensions/src/hello-world/.stylelintignore new file mode 100644 index 0000000000..6d59d79515 --- /dev/null +++ b/extensions/src/hello-world/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/hello-world/.stylelintrc.js b/extensions/src/hello-world/.stylelintrc.js new file mode 100644 index 0000000000..70f5dd2d0e --- /dev/null +++ b/extensions/src/hello-world/.stylelintrc.js @@ -0,0 +1,20 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + }, +}; + +// #endregion diff --git a/extensions/src/hello-world/.vscode/extensions.json b/extensions/src/hello-world/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/src/hello-world/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/src/hello-world/.vscode/launch.json b/extensions/src/hello-world/.vscode/launch.json new file mode 100644 index 0000000000..fb0f3a08c0 --- /dev/null +++ b/extensions/src/hello-world/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/src/hello-world/.vscode/settings.json b/extensions/src/hello-world/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/src/hello-world/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/src/hello-world/LICENSE b/extensions/src/hello-world/LICENSE new file mode 100644 index 0000000000..851ff3e8d1 --- /dev/null +++ b/extensions/src/hello-world/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/src/hello-world/README.md b/extensions/src/hello-world/README.md new file mode 100644 index 0000000000..6c30dfe102 --- /dev/null +++ b/extensions/src/hello-world/README.md @@ -0,0 +1,88 @@ +# hello-world + +Simple hello world extension for Platform.Bible + +## Summary + +The general file structure is as follows: + +- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder +- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder +- `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/paranext-extension-template.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) +- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder + - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file + - `assets/descriptions/` contains textual descriptions of the extension in various languages + - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` +- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest +- `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing a zip of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In this repo, run `npm install` to install local and published dependencies + +### Configure paths to `paranext-core` repo + +In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. +2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. + +## To run + +### Running Platform.Bible with this extension + +To run Platform.Bible with this extension: + +`npm start` + +Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. + +### Building this extension independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extension once: + +`npm run build` + +## To package for distribution + +To package this extension into a zip file for distribution: + +`npm run package` + +## To update this extension from the template + +This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. + +To set up this extension to be updated from the template, run the following command once after cloning this repo: + +```bash +git remote add template https://github.com/paranext/paranext-extension-template +``` + +To update this extension from the template, make sure your repo has no working changes. Then run the following commands: + +```bash +git fetch template +git merge template/main --allow-unrelated-histories +``` + +For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). + +**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +## Special features in this project + +This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. diff --git a/extensions/src/hello-world/assets/descriptions/description-en.md b/extensions/src/hello-world/assets/descriptions/description-en.md new file mode 100644 index 0000000000..5e55e8d551 --- /dev/null +++ b/extensions/src/hello-world/assets/descriptions/description-en.md @@ -0,0 +1 @@ +Simple hello world extension for Platform.Bible. diff --git a/extensions/src/hello-world/assets/displayData.json b/extensions/src/hello-world/assets/displayData.json new file mode 100644 index 0000000000..592f722335 --- /dev/null +++ b/extensions/src/hello-world/assets/displayData.json @@ -0,0 +1,12 @@ +{ + "icon": "", + "moreInfoUrl": "", + "supportUrl": "", + "localizedDisplayInfo": { + "en": { + "displayName": "Hello World Extension", + "shortSummary": "Simple hello world extension", + "description": "assets/descriptions/description-en.md" + } + } +} diff --git a/extensions/src/hello-world/assets/offline.svg b/extensions/src/hello-world/assets/offline.svg new file mode 100644 index 0000000000..a16275fc8b --- /dev/null +++ b/extensions/src/hello-world/assets/offline.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/src/hello-world/contributions/localizedStrings.json b/extensions/src/hello-world/contributions/localizedStrings.json new file mode 100644 index 0000000000..2e907918ab --- /dev/null +++ b/extensions/src/hello-world/contributions/localizedStrings.json @@ -0,0 +1,29 @@ +{ + "metadata": { + "%helloWorld_webViewMenu_project%": { + "fallbackKey": "%mainMenu_project%" + }, + "%mainMenu_openHelloWorldProject%": { + "fallbackKey": "%mainMenu_openProject%" + } + }, + "localizedStrings": { + "en": { + "%mainMenu_helloWorldSubmenu%": "Hello World Projects", + "%mainMenu_openHelloWorldProject%": "Open Hello World Project", + "%mainMenu_createNewHelloWorldProject%": "Create New Hello World Project", + "%mainMenu_deleteHelloWorldProject%": "Delete Hello World Project", + "%helloWorld_webViewMenu_project%": "Project", + "%helloWorld_webViewMenu_view%": "View", + "%helloWorld_webViewMenu_deleteProject%": "Delete this Project", + "%helloWorld_webViewMenu_openViewer%": "Open Viewer", + "%settings_hello_world_group1_label%": "Hello World Settings", + "%settings_hello_world_personName_label%": "Selected Person's Name on Hello World Web View", + "%project_settings_helloWorld_group1_label%": "Hello World Project Settings", + "%project_settings_helloWorld_headerSize_label%": "Header Size", + "%project_settings_helloWorld_headerSize_description%": "Size of the header font in `em`", + "%project_settings_helloWorld_headerColor_label%": "Header Color", + "%project_settings_helloWorld_headerColor_description%": "Color of the headers (must be a valid [HTML color name](https://htmlcolorcodes.com/color-names/))" + } + } +} diff --git a/extensions/src/hello-world/contributions/menus.json b/extensions/src/hello-world/contributions/menus.json new file mode 100644 index 0000000000..a24114cef5 --- /dev/null +++ b/extensions/src/hello-world/contributions/menus.json @@ -0,0 +1,97 @@ +{ + "mainMenu": { + "columns": {}, + "groups": { + "helloWorld.helloWorldProjects": { + "order": 1.5, + "isExtensible": true, + "menuItem": "helloWorld.projectSubmenu" + } + }, + "items": [ + { + "id": "helloWorld.projectSubmenu", + "label": "%mainMenu_helloWorldSubmenu%", + "localizeNotes": "Application main menu > Project > Hello World Projects", + "group": "platform.projectProjects", + "order": 1000.1 + }, + { + "label": "%mainMenu_openHelloWorldProject%", + "localizeNotes": "Application main menu > Project > Hello World Projects > Open Hello World Project", + "group": "helloWorld.helloWorldProjects", + "order": 1, + "command": "helloWorld.openProject" + }, + { + "label": "%mainMenu_createNewHelloWorldProject%", + "localizeNotes": "Application main menu > Project > Hello World Projects > Create New Hello World Project", + "group": "helloWorld.helloWorldProjects", + "order": 2, + "command": "helloWorld.createNewProject" + }, + { + "label": "%mainMenu_deleteHelloWorldProject%", + "localizeNotes": "Application main menu > Project > Hello World Projects > Delete Hello World Project", + "group": "helloWorld.helloWorldProjects", + "order": 3, + "command": "helloWorld.deleteProject" + } + ] + }, + "defaultWebViewTopMenu": { + "columns": {}, + "groups": {}, + "items": [] + }, + "defaultWebViewContextMenu": { + "groups": {}, + "items": [] + }, + "webViewMenus": { + "helloWorld.projectWebView": { + "topMenu": { + "columns": { + "helloWorld.project": { + "label": "%helloWorld_webViewMenu_project%", + "order": 1 + }, + "helloWorld.view": { + "label": "%helloWorld_webViewMenu_view%", + "order": 2 + } + }, + "groups": { + "helloWorld.projectGroup": { + "column": "helloWorld.project", + "order": 1 + }, + "helloWorld.viewGroup": { + "column": "helloWorld.view", + "order": 1 + } + }, + "items": [ + { + "label": "%helloWorld_webViewMenu_deleteProject%", + "group": "helloWorld.projectGroup", + "order": 1, + "command": "helloWorld.deleteProjectByWebViewId" + }, + { + "label": "%helloWorld_webViewMenu_openViewer%", + "group": "helloWorld.viewGroup", + "order": 1, + "command": "helloWorld.openViewerByWebViewId" + }, + { + "label": "%webView_openProjectSettings%", + "group": "helloWorld.projectGroup", + "order": 3, + "command": "platform.openProjectSettings" + } + ] + } + } + } +} diff --git a/extensions/src/hello-world/contributions/projectSettings.json b/extensions/src/hello-world/contributions/projectSettings.json new file mode 100644 index 0000000000..110533f9dc --- /dev/null +++ b/extensions/src/hello-world/contributions/projectSettings.json @@ -0,0 +1,19 @@ +[ + { + "label": "%project_settings_helloWorld_group1_label%", + "properties": { + "helloWorld.headerSize": { + "label": "%project_settings_helloWorld_headerSize_label%", + "description": "%project_settings_helloWorld_headerSize_description%", + "default": 15, + "includeProjectInterfaces": ["^helloWorld$"] + }, + "helloWorld.headerColor": { + "label": "%project_settings_helloWorld_headerColor_label%", + "description": "%project_settings_helloWorld_headerColor_description%", + "default": "Black", + "includeProjectInterfaces": ["^helloWorld$"] + } + } + } +] diff --git a/extensions/src/hello-world/contributions/settings.json b/extensions/src/hello-world/contributions/settings.json new file mode 100644 index 0000000000..650f08338f --- /dev/null +++ b/extensions/src/hello-world/contributions/settings.json @@ -0,0 +1,11 @@ +[ + { + "label": "%settings_hello_world_group1_label%", + "properties": { + "helloWorld.personName": { + "label": "%settings_hello_world_personName_label%", + "default": "Bill" + } + } + } +] diff --git a/extensions/src/hello-world/cspell.json b/extensions/src/hello-world/cspell.json new file mode 100644 index 0000000000..d78da5aafa --- /dev/null +++ b/extensions/src/hello-world/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../../cspell.json" +} diff --git a/extensions/src/hello-world/manifest.json b/extensions/src/hello-world/manifest.json new file mode 100644 index 0000000000..4a430ed298 --- /dev/null +++ b/extensions/src/hello-world/manifest.json @@ -0,0 +1,16 @@ +{ + "name": "helloWorld", + "version": "0.0.1", + "displayData": "assets/displayData.json", + "author": "Paranext", + "license": "MIT", + "main": "src/main.ts", + "extensionDependencies": {}, + "elevatedPrivileges": [], + "types": "src/types/hello-world.d.ts", + "menus": "contributions/menus.json", + "settings": "contributions/settings.json", + "projectSettings": "contributions/projectSettings.json", + "localizedStrings": "contributions/localizedStrings.json", + "activationEvents": ["onCommand:helloWorld.helloWorld", "onCommand:helloWorld.helloException"] +} diff --git a/extensions/src/hello-world/package.json b/extensions/src/hello-world/package.json new file mode 100644 index 0000000000..dc5ceccc19 --- /dev/null +++ b/extensions/src/hello-world/package.json @@ -0,0 +1,86 @@ +{ + "name": "hello-world", + "version": "0.0.1", + "description": "Simple hello world extension for Platform.Bible", + "main": "src/main.js", + "types": "src/types/hello-world.d.ts", + "author": "Paranext", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "start:core": "cd ../../.. && npm run start", + "start": "npm run start:core", + "start:production": "echo unimplemented", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/extensions/src/hello-world/src/checks.ts b/extensions/src/hello-world/src/checks.ts new file mode 100644 index 0000000000..7ac219f46d --- /dev/null +++ b/extensions/src/hello-world/src/checks.ts @@ -0,0 +1,100 @@ +import { logger, projectDataProviders } from '@papi/backend'; +import { VerseRef } from '@sillsdev/scripture'; +import { + Check, + CheckCreatorFunction, + CheckDetails, + CheckRunResult, + IUSFMBookProjectDataProvider, + ScriptureRange, +} from 'platform-scripture'; + +export const checkDetails: CheckDetails = Object.freeze({ + checkName: 'helloWordSimpleCheck', + checkDescription: 'find the word "sheep"', +}); + +class HelloCheck implements Check { + targetProjectId: string | undefined; + pdp: IUSFMBookProjectDataProvider | undefined; + + async initialize(projectId: string): Promise { + try { + this.targetProjectId = projectId; + this.pdp = await projectDataProviders.get('platformScripture.USFM_Book', projectId); + this.pdp.onDidDispose(this.dispose); + } catch (error) { + return [JSON.stringify(error)]; + } + return []; + } + + async dispose(): Promise { + this.targetProjectId = undefined; + this.pdp = undefined; + return true; + } + + // eslint-disable-next-line class-methods-use-this + getCheckDetails(): CheckDetails { + return checkDetails; + } + + async getCheckResults(range: ScriptureRange): Promise { + if (range.end && range.end.bookNum !== range.start.bookNum) + throw new Error('This only supports checks within a single book right now'); + + const usfm = await this.pdp?.getBookUSFM(range.start); + if (!usfm) + throw new Error(`Could not load ${range.start.toString()} from ${this.targetProjectId}`); + + logger.debug( + `Getting test check results for ${JSON.stringify(range)} on ${this.targetProjectId}`, + ); + + let results: CheckRunResult[] = []; + let startingPoint = 0; + startingPoint = usfm.indexOf(`\\c ${range.start.chapterNum.toString()}`, startingPoint); + startingPoint = usfm.indexOf(`\\v ${range.start.verseNum.toString()}`, startingPoint); + let stoppingPoint = 0; + if (!range.end) stoppingPoint = usfm.length - 1; + else { + stoppingPoint = usfm.indexOf(`\\c ${range.end.chapterNum.toString()}`, startingPoint); + stoppingPoint = usfm.indexOf(`\\v ${range.end.verseNum.toString()}`, stoppingPoint); + let nextChapter = usfm.indexOf('\\c ', stoppingPoint); + nextChapter = nextChapter > 0 ? nextChapter : 0; + let nextVerse = usfm.indexOf('\\v ', stoppingPoint); + nextVerse = nextVerse > 0 ? nextVerse : 0; + stoppingPoint = Math.max(stoppingPoint, nextChapter, nextVerse); + } + let cursor = startingPoint; + while (cursor <= stoppingPoint) { + cursor = usfm.indexOf('sheep', cursor); + if (cursor < 0 || cursor > stoppingPoint) break; + const chapterIndex = usfm.lastIndexOf('\\c ', cursor) + 3; + const inChapter = parseInt(usfm.slice(chapterIndex, chapterIndex + 4), 10); + const verseIndex = usfm.lastIndexOf('\\v ', cursor) + 3; + const inVerse = parseInt(usfm.slice(verseIndex, verseIndex + 4), 10); + const offset = cursor - verseIndex - inVerse.toString().length - 1; + const newResult: CheckRunResult = { + projectId: this.targetProjectId ?? '', + messageFormatString: 'Found the word "sheep"', + start: { + verseRef: new VerseRef(range.start.book, inChapter.toString(), inVerse.toString()), + offset, + }, + end: { + verseRef: new VerseRef(range.start.book, inChapter.toString(), inVerse.toString()), + offset: offset + 5, + }, + }; + results = results.concat([newResult]); + cursor += 1; + } + return results; + } +} + +export const createHelloCheck: CheckCreatorFunction = async () => { + return new HelloCheck(); +}; diff --git a/extensions/src/hello-world/src/main.ts b/extensions/src/hello-world/src/main.ts new file mode 100644 index 0000000000..4d0fa013c7 --- /dev/null +++ b/extensions/src/hello-world/src/main.ts @@ -0,0 +1,421 @@ +import papi, { logger } from '@papi/backend'; +import type { + ExecutionActivationContext, + WebViewContentType, + WebViewDefinition, + SavedWebViewDefinition, + IWebViewProvider, + GetWebViewOptions, +} from '@papi/core'; +import { PlatformEventEmitter } from 'platform-bible-utils'; +import type { HelloWorldEvent } from 'hello-world'; +import helloWorldReactWebView from './web-views/hello-world.web-view?inline'; +import helloWorldReactWebViewStyles from './web-views/hello-world.web-view.scss?inline'; +import helloWorldReactWebView2 from './web-views/hello-world-2.web-view?inline'; +import helloWorldReactWebView2Styles from './web-views/hello-world-2.web-view.scss?inline'; +import helloWorldHtmlWebView from './web-views/hello-world.web-view.html?inline'; +import HelloWorldProjectDataProviderEngineFactory from './models/hello-world-project-data-provider-engine-factory.model'; +import helloWorldProjectWebView from './web-views/hello-world-project/hello-world-project.web-view?inline'; +import helloWorldProjectWebViewStyles from './web-views/hello-world-project/hello-world-project.web-view.scss?inline'; +import helloWorldProjectViewerWebView from './web-views/hello-world-project/hello-world-project-viewer.web-view?inline'; +import { HTML_COLOR_NAMES } from './util'; +import { HELLO_WORLD_PROJECT_INTERFACES } from './models/hello-world-project-data-provider-engine.model'; +import { checkDetails, createHelloCheck } from './checks'; + +/** User data storage key for all hello world project data */ +const allProjectDataStorageKey = 'allHelloWorldProjectData'; + +type IWebViewProviderWithType = IWebViewProvider & { webViewType: string }; + +logger.info('Hello world is importing!'); + +// #region Hello World General Web Views + +/** Simple web view provider that provides sample html web views when papi requests them */ +const htmlWebViewProvider: IWebViewProviderWithType = { + webViewType: 'helloWorld.html', + async getWebView(savedWebView: SavedWebViewDefinition): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + return { + ...savedWebView, + title: 'Hello World HTML', + // Can't use the enum value from a definition file so assert the type from the string literal. + // eslint-disable-next-line no-type-assertion/no-type-assertion + contentType: 'html' as WebViewContentType.HTML, + content: helloWorldHtmlWebView, + }; + }, +}; + +/** Simple web view provider that provides React web views when papi requests them */ +const reactWebViewProvider: IWebViewProviderWithType = { + webViewType: 'helloWorld.react', + async getWebView(savedWebView: SavedWebViewDefinition): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + return { + iconUrl: 'papi-extension://helloWorld/assets/offline.svg', + title: 'Hello World React', + ...savedWebView, + content: helloWorldReactWebView, + styles: helloWorldReactWebViewStyles, + state: { + ...savedWebView.state, + clicks: Math.floor(Math.random() * 100), + }, + }; + }, +}; + +/** Simple web view provider that provides other React web views when papi requests them */ +const reactWebView2Provider: IWebViewProviderWithType = { + webViewType: 'helloWorld.react2', + async getWebView(savedWebView: SavedWebViewDefinition): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + return { + ...savedWebView, + title: 'Hello World React 2', + content: helloWorldReactWebView2, + styles: helloWorldReactWebView2Styles, + }; + }, +}; + +// #endregion + +// #region Hello World Project Web View, Command, etc. + +/** Simple web view provider that provides helloWorld project web views when papi requests them */ +const helloWorldProjectWebViewProvider: IWebViewProviderWithType = { + webViewType: 'helloWorld.projectWebView', + async getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: HelloWorldProjectViewerOptions, + ): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + + const projectId = getWebViewOptions.projectId || savedWebView.projectId || undefined; + return { + title: projectId + ? `Hello World Project: ${ + (await ( + await papi.projectDataProviders.get('platform.base', projectId) + ).getSetting('platform.name')) ?? projectId + }` + : 'Hello World Project', + ...savedWebView, + content: helloWorldProjectWebView, + styles: helloWorldProjectWebViewStyles, + projectId, + }; + }, +}; + +interface HelloWorldProjectViewerOptions extends GetWebViewOptions { + projectId: string | undefined; +} + +/** + * Function to prompt for a project and open it in the hello world project web view. Registered as a + * command handler. + */ +async function openHelloWorldProjectWebView( + projectId: string | undefined, +): Promise { + let projectIdForWebView = projectId; + if (!projectIdForWebView) { + projectIdForWebView = await papi.dialogs.selectProject({ + title: 'Open Hello World Project', + prompt: 'Choose the Hello World project to view:', + includeProjectInterfaces: '^helloWorld$', + }); + } + if (!projectIdForWebView) return undefined; + + const options: HelloWorldProjectViewerOptions = { projectId: projectIdForWebView }; + return papi.webViews.getWebView(helloWorldProjectWebViewProvider.webViewType, undefined, options); +} + +// #endregion + +function selectProjectToDelete(): Promise { + return papi.dialogs.selectProject({ + includeProjectInterfaces: 'helloWorld', + title: 'Delete Hello World Project', + prompt: 'Please choose a project to delete:', + }); +} + +/** + * Simple web view provider that provides helloWorld project viewer web views when papi requests + * them + */ +const helloWorldProjectViewerProvider: IWebViewProviderWithType = { + webViewType: 'helloWorld.projectViewer', + async getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: HelloWorldProjectViewerOptions, + ): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + + // We know that the projectId (if present in the state) will be a string. + const projectId = getWebViewOptions.projectId || savedWebView.projectId || undefined; + return { + title: projectId + ? `Hello World Project Viewer: ${ + (await ( + await papi.projectDataProviders.get('platform.base', projectId) + ).getSetting('platform.name')) ?? projectId + }` + : 'Hello World Project Viewer', + ...savedWebView, + content: helloWorldProjectViewerWebView, + styles: helloWorldProjectWebViewStyles, + projectId, + }; + }, +}; + +/** Number of times the `helloWorld` function has been called */ +let helloWorldCount = 0; +/** Emitter to inform subscribers when `helloWorld` is called */ +let onHelloWorldEmitter: PlatformEventEmitter; +const onHelloWorldEventType = 'helloWorld.onHelloWorld'; + +/** + * Simple function to return hello world. Registered as a command handler. + * + * Also counts up how many times anyone has called this function and sends events notifying + * subscribers when someone has called this function. + */ +function helloWorld() { + helloWorldCount += 1; + onHelloWorldEmitter?.emit({ times: helloWorldCount }); + return 'Hello world!'; +} + +/** Simple function to throw a customized exception. Registered as a command handler */ +function helloException(message: string) { + throw new Error(`Hello World Exception! ${message}`); +} + +export async function activate(context: ExecutionActivationContext): Promise { + logger.info('Hello world is activating!'); + + async function readRawDataForAllProjects(): Promise { + try { + return await papi.storage.readUserData(context.executionToken, allProjectDataStorageKey); + } catch { + // No project data found or some other issue. With more important project data, we would be + // more careful not to do something that would overwrite project data if there were an error + return '{}'; + } + } + + async function writeRawDataForAllProjects(data: string): Promise { + return papi.storage.writeUserData(context.executionToken, allProjectDataStorageKey, data); + } + + const helloWorldProjectDataProviderEngineFactory = new HelloWorldProjectDataProviderEngineFactory( + readRawDataForAllProjects, + writeRawDataForAllProjects, + ); + + const helloWorldPdpefPromise = papi.projectDataProviders.registerProjectDataProviderEngineFactory( + 'helloWorld.helloWorldPdpf', + HELLO_WORLD_PROJECT_INTERFACES, + helloWorldProjectDataProviderEngineFactory, + ); + + const openHelloWorldProjectPromise = papi.commands.registerCommand( + 'helloWorld.openProject', + openHelloWorldProjectWebView, + ); + + const createNewHelloWorldProjectPromise = papi.commands.registerCommand( + 'helloWorld.createNewProject', + async (openWebView = true) => { + const projectId = await helloWorldProjectDataProviderEngineFactory.createNewProject(); + + if (openWebView) papi.commands.sendCommand('helloWorld.openProject', projectId); + + return projectId; + }, + ); + + const deleteHelloWorldProjectPromise = papi.commands.registerCommand( + 'helloWorld.deleteProject', + async (projectId) => { + const projectIdToDelete = projectId ?? (await selectProjectToDelete()); + + if (!projectIdToDelete) return false; + + // TODO: close web views if this is successful (we don't currently have a way to close them or + // to query for open ones) + return helloWorldProjectDataProviderEngineFactory.deleteProject(projectIdToDelete); + }, + ); + + const deleteHelloWorldProjectByWebViewIdPromise = papi.commands.registerCommand( + 'helloWorld.deleteProjectByWebViewId', + async (webViewId) => { + let projectId: string | undefined; + if (webViewId) { + const webViewDefinition = await papi.webViews.getSavedWebViewDefinition(webViewId); + projectId = webViewDefinition?.projectId; + } + const projectIdToDelete = projectId ?? (await selectProjectToDelete()); + + if (!projectIdToDelete) return false; + + // TODO: close web views if this is successful (we don't currently have a way to close them or + // to query for open ones) + return helloWorldProjectDataProviderEngineFactory.deleteProject(projectIdToDelete); + }, + ); + + const openHelloWorldProjectViewerByWebViewIdPromise = papi.commands.registerCommand( + 'helloWorld.openViewerByWebViewId', + async (webViewId) => { + let projectId: string | undefined; + if (webViewId) { + const webViewDefinition = await papi.webViews.getSavedWebViewDefinition(webViewId); + projectId = webViewDefinition?.projectId; + } + const projectIdForWebView = + projectId ?? + (await papi.dialogs.selectProject({ + includeProjectInterfaces: 'helloWorld', + title: 'Open Hello World Project Viewer', + prompt: 'Please choose a project for which to open the viewer:', + })); + + if (!projectIdForWebView) return undefined; + + const options: HelloWorldProjectViewerOptions = { projectId: projectIdForWebView }; + return papi.webViews.getWebView( + helloWorldProjectViewerProvider.webViewType, + { type: 'float', position: 'center' }, + options, + ); + }, + ); + + const helloWorldPersonNamePromise = papi.settings.registerValidator( + 'helloWorld.personName', + async (newValue) => typeof newValue === 'string', + ); + + const helloWorldHeaderSizePromise = papi.projectSettings.registerValidator( + 'helloWorld.headerSize', + async (newValue) => typeof newValue === 'number' && Number.isInteger(newValue) && newValue > 0, + ); + + const helloWorldHeaderColorPromise = papi.projectSettings.registerValidator( + 'helloWorld.headerColor', + async (newValue) => HTML_COLOR_NAMES.includes(newValue), + ); + + const helloWorldProjectWebViewProviderPromise = papi.webViewProviders.register( + helloWorldProjectWebViewProvider.webViewType, + helloWorldProjectWebViewProvider, + ); + + const helloWorldProjectViewerProviderPromise = papi.webViewProviders.register( + helloWorldProjectViewerProvider.webViewType, + helloWorldProjectViewerProvider, + ); + + const htmlWebViewProviderPromise = papi.webViewProviders.register( + htmlWebViewProvider.webViewType, + htmlWebViewProvider, + ); + + const reactWebViewProviderPromise = papi.webViewProviders.register( + reactWebViewProvider.webViewType, + reactWebViewProvider, + ); + + const reactWebView2ProviderPromise = papi.webViewProviders.register( + reactWebView2Provider.webViewType, + reactWebView2Provider, + ); + + onHelloWorldEmitter = + papi.network.createNetworkEventEmitter(onHelloWorldEventType); + + const helloWorldPromise = papi.commands.registerCommand('helloWorld.helloWorld', helloWorld); + + const helloExceptionPromise = papi.commands.registerCommand( + 'helloWorld.helloException', + helloException, + ); + + papi + .fetch('https://www.example.com') + .catch((e) => logger.error(`Could not get data from example.com! Reason: ${e}`)); + + const peopleDataProvider = await papi.dataProviders.get('helloSomeone.people'); + if (peopleDataProvider) { + // Test subscribing to a data provider + const unsubGreetings = await peopleDataProvider.subscribeGreeting( + 'Bill', + (billGreeting: string | undefined) => logger.debug(`Bill's greeting: ${billGreeting}`), + ); + + context.registrations.add(unsubGreetings); + } + + const checkPromise = papi.commands.sendCommand( + 'platformScripture.registerCheck', + checkDetails, + createHelloCheck, + ); + + // Await the registration promises at the end so we don't hold everything else up + context.registrations.add( + await helloWorldPdpefPromise, + await helloWorldProjectWebViewProviderPromise, + await helloWorldProjectViewerProviderPromise, + await openHelloWorldProjectPromise, + await createNewHelloWorldProjectPromise, + await deleteHelloWorldProjectPromise, + await deleteHelloWorldProjectByWebViewIdPromise, + await openHelloWorldProjectViewerByWebViewIdPromise, + await helloWorldPersonNamePromise, + await helloWorldHeaderSizePromise, + await helloWorldHeaderColorPromise, + await htmlWebViewProviderPromise, + await reactWebViewProviderPromise, + await reactWebView2ProviderPromise, + onHelloWorldEmitter, + await helloWorldPromise, + await helloExceptionPromise, + await checkPromise, + ); + + // Create webviews or get an existing webview if one already exists for this type + // Note: here, we are using `existingId: '?'` to indicate we do not want to create a new webview + // if one already exists. The webview that already exists could have been created by anyone + // anywhere; it just has to match `webViewType`. See `hello-someone.ts` for an example of keeping + // an existing webview that was specifically created by `hello-someone`. + papi.webViews.getWebView(htmlWebViewProvider.webViewType, undefined, { existingId: '?' }); + papi.webViews.getWebView(reactWebViewProvider.webViewType, undefined, { existingId: '?' }); + papi.webViews.getWebView(reactWebView2Provider.webViewType, undefined, { existingId: '?' }); + + logger.info('Hello World is finished activating!'); +} diff --git a/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine-factory.model.ts b/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine-factory.model.ts new file mode 100644 index 0000000000..77308c17d8 --- /dev/null +++ b/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine-factory.model.ts @@ -0,0 +1,166 @@ +import { + IProjectDataProviderEngine, + IProjectDataProviderEngineFactory, + ProjectMetadataWithoutFactoryInfo, +} from '@papi/core'; +import { newGuid } from 'platform-bible-utils'; +import HelloWorldProjectDataProviderEngine, { + HELLO_WORLD_PROJECT_INTERFACES, + HelloWorldProjectData, +} from './hello-world-project-data-provider-engine.model'; +import { ELIGIBLE_NEW_NAMES } from '../util'; + +export type AllHelloWorldProjectData = { [projectId: string]: HelloWorldProjectData | undefined }; + +function createEmptyHelloWorldProjectData(projectName: string): HelloWorldProjectData { + return { + names: new Set(), + numbers: {}, + settings: {}, + extensionData: {}, + projectName, + }; +} + +class HelloWorldProjectDataProviderEngineFactory + implements IProjectDataProviderEngineFactory +{ + /** Do not use directly as it may not have a value. Use `getAllProjectData` */ + private allProjectDataCached: AllHelloWorldProjectData | undefined; + private saveAllProjectData: () => Promise; + + constructor( + private readRawDataForAllProjects: () => Promise, + writeRawDataForAllProjects: (data: string) => Promise, + ) { + this.saveAllProjectData = async () => { + const allProjectData = await this.getAllProjectData(); + + // Serialize by making the 'names' Set into an array + const allProjectDataRaw = JSON.stringify(allProjectData, (key, value) => + key === 'names' ? [...value] : value, + ); + + return writeRawDataForAllProjects(allProjectDataRaw); + }; + } + + async getAllProjectData(): Promise { + if (this.allProjectDataCached) return this.allProjectDataCached; + + // We don't have the data, so we need to go get it + const allProjectDataRaw = await this.readRawDataForAllProjects(); + + // Deserialize by putting the 'names' array back into a Set + const allProjectData: AllHelloWorldProjectData = JSON.parse(allProjectDataRaw, (key, value) => + key === 'names' ? new Set(value) : value, + ); + + this.allProjectDataCached = allProjectData; + return allProjectData; + } + + async setAndSaveProjectData(projectId: string, projectData: HelloWorldProjectData) { + const allProjectData = await this.getAllProjectData(); + allProjectData[projectId] = projectData; + this.allProjectDataCached = allProjectData; + await this.saveAllProjectData(); + } + + async getAvailableProjects(): Promise { + const allAvailableProjects = Object.entries(await this.getAllProjectData()); + return allAvailableProjects.map(([projectId, projectData]) => ({ + projectInterfaces: HELLO_WORLD_PROJECT_INTERFACES, + id: projectId, + name: projectData?.projectName ?? projectId, + })); + } + + async createProjectDataProviderEngine( + projectId: string, + ): Promise> { + const allProjectData = await this.getAllProjectData(); + const projectData: HelloWorldProjectData = + allProjectData[projectId] ?? createEmptyHelloWorldProjectData(projectId); + return new HelloWorldProjectDataProviderEngine(projectData, (data) => { + return this.setAndSaveProjectData(projectId, data); + }); + } + + /** + * Creates a new project with a random name + * + * @returns Project id of the new hello world project + */ + async createNewProject(): Promise { + const allProjectData = await this.getAllProjectData(); + + let newProjectId = newGuid(); + // In production code, please ensure uniqueness better than this + while (allProjectData[newProjectId]) { + newProjectId = newGuid(); + } + const newProjectData = createEmptyHelloWorldProjectData(await this.#getUniqueProjectName()); + + await this.setAndSaveProjectData(newProjectId, newProjectData); + + return newProjectId; + } + + /** + * Deletes a Hello World project + * + * @param projectId Optional project ID of the project to delete. Prompts the user to select a + * project if not provided + * @returns `true` if successfully deleted + */ + async deleteProject(projectId: string): Promise { + const allProjectData = await this.getAllProjectData(); + + if (!allProjectData[projectId]) return false; + + delete allProjectData[projectId]; + this.allProjectDataCached = allProjectData; + await this.saveAllProjectData(); + return true; + } + + async #getUniqueProjectName(): Promise { + const projectName = ELIGIBLE_NEW_NAMES[Math.floor(ELIGIBLE_NEW_NAMES.length * Math.random())]; + + const allProjectData = await this.getAllProjectData(); + + // Look for all projects with the same name and a number after their name, and find the first number missing + const projectNameRegex = new RegExp(`${projectName} ?(?\\d*)`); + + const nameNumbers = new Set(); + Object.entries(allProjectData).forEach(([, projectData]) => { + if (!projectData?.projectName) return; + const matches = projectNameRegex.exec(projectData.projectName); + if (!matches) return; + + if (matches.groups?.number) { + const nameNumber = parseInt(matches.groups.number, 10); + if (typeof nameNumber === 'number') nameNumbers.add(nameNumber); + } + // There was no number, so consider that to be 0 + else nameNumbers.add(0); + }); + + let projectNameCount = 0; + + if (nameNumbers.size > 0) { + const nameNumbersArray = [...nameNumbers]; + nameNumbersArray.sort((a, b) => (a > b ? 1 : -1)); + const nameNumberMissingIndex = nameNumbersArray.findIndex( + (nameNumber, i) => nameNumber !== i, + ); + projectNameCount = + nameNumberMissingIndex === -1 ? nameNumbersArray.length : nameNumberMissingIndex; + } + + return `${projectName}${projectNameCount !== 0 ? ` ${projectNameCount}` : ''}`; + } +} + +export default HelloWorldProjectDataProviderEngineFactory; diff --git a/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine.model.ts b/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine.model.ts new file mode 100644 index 0000000000..e32ca9ad8f --- /dev/null +++ b/extensions/src/hello-world/src/models/hello-world-project-data-provider-engine.model.ts @@ -0,0 +1,163 @@ +import papi, { BaseProjectDataProviderEngine } from '@papi/backend'; +import { + DataProviderUpdateInstructions, + ExtensionDataScope, + IBaseProjectDataProviderEngine, +} from '@papi/core'; +import type { + ProjectInterfaceDataTypes, + ProjectSettingNames, + ProjectSettingTypes, +} from 'papi-shared-types'; + +/** The `projectInterface`s the hello world pdpf serves */ +// TypeScript is upset without `satisfies` here because `as const` makes the array readonly but it +// needs to be used in ProjectMetadata as not readonly :p +export const HELLO_WORLD_PROJECT_INTERFACES = ['platform.base', 'helloWorld'] as const satisfies [ + 'platform.base', + 'helloWorld', +]; + +export type HelloWorldProjectData = { + projectName: string; + numbers: { [max: string]: number | undefined }; + names: Set; + settings: { + [ProjectSettingName in ProjectSettingNames]?: ProjectSettingTypes[ProjectSettingName]; + }; + extensionData: { [key: string]: string | undefined }; +}; + +function getExtensionDataKey(scope: ExtensionDataScope): string { + return `${scope.extensionName}/${scope.dataQualifier}`; +} + +class HelloWorldProjectDataProviderEngine + extends BaseProjectDataProviderEngine + implements IBaseProjectDataProviderEngine +{ + private saveProjectData: () => Promise; + + constructor( + private projectData: HelloWorldProjectData, + saveProjectDataWithData: (data: HelloWorldProjectData) => Promise, + ) { + super(); + + this.saveProjectData = () => saveProjectDataWithData(this.projectData); + } + + @papi.dataProviders.decorators.ignore + async getAnyRandomNumber() { + const keys = Object.keys(this.projectData.numbers); + return keys[Math.random() * keys.length] ?? Math.random(); + } + + async getSetting( + key: ProjectSettingName, + ): Promise { + if (key === 'platform.name') + // TypeScript doesn't realize ProjectSettingName is 'platform.name' in this case for some reason + // eslint-disable-next-line no-type-assertion/no-type-assertion + return this.projectData.projectName as ProjectSettingTypes[ProjectSettingName]; + // We are checking in this same line that it is there. TypeScript :/ + // eslint-disable-next-line no-type-assertion/no-type-assertion + if (key in this.projectData.settings) return this.projectData.settings[key]!; + + return papi.projectSettings.getDefault(key); + } + + async setSetting( + key: ProjectSettingName, + newSetting: ProjectSettingTypes[ProjectSettingName], + ): Promise> { + if (!(await papi.projectSettings.isValid(key, newSetting, await this.getSetting(key)))) + return false; + + if (key === 'platform.name') + // TypeScript doesn't realize ProjectSettingName is 'platform.name' in this case for some reason + // eslint-disable-next-line no-type-assertion/no-type-assertion + this.projectData.projectName = newSetting as ProjectSettingTypes['platform.name']; + + this.projectData.settings[key] = newSetting; + await this.saveProjectData(); + return true; + } + + async resetSetting( + key: ProjectSettingName, + ): Promise { + if (!(key in this.projectData.settings)) return false; + + delete this.projectData.settings[key]; + await this.saveProjectData(); + this.notifyUpdate('Setting'); + return true; + } + + async getExtensionData(scope: ExtensionDataScope): Promise { + return this.projectData.extensionData[getExtensionDataKey(scope)]; + } + + async setExtensionData( + scope: ExtensionDataScope, + data: string, + ): Promise> { + this.projectData.extensionData[getExtensionDataKey(scope)] = data; + await this.saveProjectData(); + return true; + } + + async setRandomNumber(max: number, newNum: number) { + if (newNum === this.projectData.numbers[max] || newNum > max) return false; + + this.projectData.numbers[max] = newNum; + await this.saveProjectData(); + return true; + } + + async getRandomNumber(max: number) { + const currentNumber = this.projectData.numbers[max]; + if (currentNumber !== undefined) return currentNumber; + + const newNumber = Math.random() * max; + // We want to send an update because, even though no one has gotten this max before, some may + // be subscribed to updates on this max without having gotten it + await this.setRandomNumber(max, newNumber); + + return newNumber; + } + + // eslint-disable-next-line class-methods-use-this + async setNames(): Promise< + DataProviderUpdateInstructions + > { + throw new Error(`Cannot use setNames! Use addName and removeName`); + } + + async getNames() { + return Array.from(this.projectData.names); + } + + async addName(name: string) { + if (!this.projectData.names.has(name)) { + this.projectData.names.add(name); + await this.saveProjectData(); + this.notifyUpdate('Names'); + return true; + } + return false; + } + + async removeName(name: string) { + if (this.projectData.names.has(name)) { + this.projectData.names.delete(name); + await this.saveProjectData(); + this.notifyUpdate('Names'); + return true; + } + return false; + } +} + +export default HelloWorldProjectDataProviderEngine; diff --git a/extensions/src/hello-world/src/types/hello-world.d.ts b/extensions/src/hello-world/src/types/hello-world.d.ts new file mode 100644 index 0000000000..412ee19c3a --- /dev/null +++ b/extensions/src/hello-world/src/types/hello-world.d.ts @@ -0,0 +1,254 @@ +declare module 'hello-world' { + import type { DataProviderDataType, MandatoryProjectDataTypes } from '@papi/core'; + import type { IBaseProjectDataProvider } from 'papi-shared-types'; + + export type HelloWorldProjectDataTypes = MandatoryProjectDataTypes & { + /** + * A random number (or set to a specific number) generated with the selector being the max + * possible value for the number + */ + RandomNumber: DataProviderDataType; + /** One list of names for the project. No meaningful selector information. */ + Names: DataProviderDataType; + }; + + export type HelloWorldProjectDataProviderMethods = { + /** + * Get one of the random numbers that has been generated up to this point. If there have not + * been any random numbers generated yet, returns a random number between 0 and 1 + */ + getAnyRandomNumber(): Promise; + /** Add a name to the list of names for this project */ + addName(name: string): Promise; + /** Remove a name from the list of names for this project */ + removeName(name: string): Promise; + }; + + export type IHelloWorldProjectDataProvider = + IBaseProjectDataProvider & HelloWorldProjectDataProviderMethods; + + /** Event containing information about `helloWorld` */ + type HelloWorldEvent = { + /** + * How many times the `helloWorld` function has been run (called by `helloWorld.helloWorld` + * command) + */ + times: number; + }; + + /** All html color names according to https://htmlcolorcodes.com/color-names/ */ + type HTMLColorNames = + | 'IndianRed' + | 'LightCoral' + | 'Salmon' + | 'DarkSalmon' + | 'LightSalmon' + | 'Crimson' + | 'Red' + | 'FireBrick' + | 'DarkRed' + | 'Pink' + | 'LightPink' + | 'HotPink' + | 'DeepPink' + | 'MediumVioletRed' + | 'PaleVioletRed' + | 'Coral' + | 'Tomato' + | 'OrangeRed' + | 'DarkOrange' + | 'Orange' + | 'Gold' + | 'Yellow' + | 'LightYellow' + | 'LemonChiffon' + | 'LightGoldenrodYellow' + | 'PapayaWhip' + | 'Moccasin' + | 'PeachPuff' + | 'PaleGoldenrod' + | 'Khaki' + | 'DarkKhaki' + | 'Lavender' + | 'Thistle' + | 'Plum' + | 'Violet' + | 'Orchid' + | 'Fuchsia' + | 'Magenta' + | 'MediumOrchid' + | 'MediumPurple' + | 'RebeccaPurple' + | 'BlueViolet' + | 'DarkViolet' + | 'DarkOrchid' + | 'DarkMagenta' + | 'Purple' + | 'Indigo' + | 'SlateBlue' + | 'DarkSlateBlue' + | 'MediumSlateBlue' + | 'GreenYellow' + | 'Chartreuse' + | 'LawnGreen' + | 'Lime' + | 'LimeGreen' + | 'PaleGreen' + | 'LightGreen' + | 'MediumSpringGreen' + | 'SpringGreen' + | 'MediumSeaGreen' + | 'SeaGreen' + | 'ForestGreen' + | 'Green' + | 'DarkGreen' + | 'YellowGreen' + | 'OliveDrab' + | 'Olive' + | 'DarkOliveGreen' + | 'MediumAquamarine' + | 'DarkSeaGreen' + | 'LightSeaGreen' + | 'DarkCyan' + | 'Teal' + | 'Aqua' + | 'Cyan' + | 'LightCyan' + | 'PaleTurquoise' + | 'Aquamarine' + | 'Turquoise' + | 'MediumTurquoise' + | 'DarkTurquoise' + | 'CadetBlue' + | 'SteelBlue' + | 'LightSteelBlue' + | 'PowderBlue' + | 'LightBlue' + | 'SkyBlue' + | 'LightSkyBlue' + | 'DeepSkyBlue' + | 'DodgerBlue' + | 'CornflowerBlue' + | 'RoyalBlue' + | 'Blue' + | 'MediumBlue' + | 'DarkBlue' + | 'Navy' + | 'MidnightBlue' + | 'Cornsilk' + | 'BlanchedAlmond' + | 'Bisque' + | 'NavajoWhite' + | 'Wheat' + | 'BurlyWood' + | 'Tan' + | 'RosyBrown' + | 'SandyBrown' + | 'Goldenrod' + | 'DarkGoldenrod' + | 'Peru' + | 'Chocolate' + | 'SaddleBrown' + | 'Sienna' + | 'Brown' + | 'Maroon' + | 'White' + | 'Snow' + | 'HoneyDew' + | 'MintCream' + | 'Azure' + | 'AliceBlue' + | 'GhostWhite' + | 'WhiteSmoke' + | 'SeaShell' + | 'Beige' + | 'OldLace' + | 'FloralWhite' + | 'Ivory' + | 'AntiqueWhite' + | 'Linen' + | 'LavenderBlush' + | 'MistyRose' + | 'Gainsboro' + | 'LightGray' + | 'Silver' + | 'DarkGray' + | 'Gray' + | 'DimGray' + | 'LightSlateGray' + | 'SlateGray' + | 'DarkSlateGray' + | 'Black'; +} + +declare module 'papi-shared-types' { + import type { IHelloWorldProjectDataProvider, HTMLColorNames } from 'hello-world'; + + export interface CommandHandlers { + 'helloWorld.helloWorld': () => string; + 'helloWorld.helloException': (message: string) => void; + /** + * Opens a new Hello World Project WebView and returns the WebView id + * + * @param projectId Optional project ID of the project to open. Prompts the user to select a + * project if not provided + * @returns WebView id for new Hello World Project WebView or `undefined` if the user canceled + * the dialog + */ + 'helloWorld.openProject': (projectId?: string) => Promise; + /** + * Creates a new Hello World project with a random name + * + * @param openWebView Whether to open a web view for the new project. Defaults to true + * @returns Project id of the new hello world project + */ + 'helloWorld.createNewProject': (openWebView?: boolean) => Promise; + /** + * Deletes a Hello World project + * + * @param projectId Optional project ID of the project to delete. Prompts the user to select a + * project if not provided + * @returns `true` if successfully deleted + */ + 'helloWorld.deleteProject': (projectId?: string) => Promise; + /** + * Deletes a Hello World project + * + * Note: this command is intended to work from the web view menu + * + * @param webViewId Optional web view ID of a hello world project web view associated with the + * project to delete. Prompts the user to select a project if not provided + * @returns `true` if successfully deleted + */ + 'helloWorld.deleteProjectByWebViewId': (webViewId?: string) => Promise; + /** + * Opens the viewer for a Hello World project + * + * Note: this command is intended to work from the web view menu + * + * @param webViewId Optional web view ID of a hello world project web view associated with the + * project to open the viewer for. Prompts the user to select a project if not provided + * @returns WebView id for new viewer or `undefined` if the user canceled the dialog + */ + 'helloWorld.openViewerByWebViewId': (webViewId?: string) => Promise; + } + + export interface ProjectDataProviderInterfaces { + helloWorld: IHelloWorldProjectDataProvider; + } + + export interface SettingTypes { + /** Selected Person's Name on Hello World Web View */ + 'helloWorld.personName': string; + } + + export interface ProjectSettingTypes { + /** Size of the header font in `em`. Must be an integer */ + 'helloWorld.headerSize': number; + /** + * Color of the headers (must be a valid [HTML color + * name](https://htmlcolorcodes.com/color-names/)) + */ + 'helloWorld.headerColor': HTMLColorNames; + } +} diff --git a/extensions/src/hello-world/src/util.ts b/extensions/src/hello-world/src/util.ts new file mode 100644 index 0000000000..c7ef0e0830 --- /dev/null +++ b/extensions/src/hello-world/src/util.ts @@ -0,0 +1,202 @@ +/** + * Supposedly the top 25 most popular girl and top 25 most popular boy baby names in 1900. No + * mention of in what part of the world + * https://www.babycenter.com/baby-names/most-popular/top-baby-names-1900 + */ +export const ELIGIBLE_NEW_NAMES = [ + 'Emma', + 'Noah', + 'Olivia', + 'Jacob', + 'Isabella', + 'Logan', + 'Ava', + 'Michael', + 'Sophia', + 'Matthew', + 'Emily', + 'Jack', + 'Madison', + 'Mason', + 'Hannah', + 'Joshua', + 'Abigail', + 'James', + 'Chloe', + 'Jackson', + 'Ella', + 'Elijah', + 'Lily', + 'Tyler', + 'Amelia', + 'Andrew', + 'Grace', + 'Alexander', + 'Charlotte', + 'Benjamin', + 'Elizabeth', + 'Daniel', + 'Avery', + 'William', + 'Sarah', + 'Nathan', + 'Samantha', + 'Nicholas', + 'Taylor', + 'Gabriel', + 'Natalie', + 'Luke', + 'Addison', + 'Caleb', + 'Sofia', + 'Anthony', + 'Zoe', + 'Joseph', + 'Anna', + 'David', +]; + +/** All html color names according to https://htmlcolorcodes.com/color-names/ */ +export const HTML_COLOR_NAMES = [ + 'IndianRed', + 'LightCoral', + 'Salmon', + 'DarkSalmon', + 'LightSalmon', + 'Crimson', + 'Red', + 'FireBrick', + 'DarkRed', + 'Pink', + 'LightPink', + 'HotPink', + 'DeepPink', + 'MediumVioletRed', + 'PaleVioletRed', + 'Coral', + 'Tomato', + 'OrangeRed', + 'DarkOrange', + 'Orange', + 'Gold', + 'Yellow', + 'LightYellow', + 'LemonChiffon', + 'LightGoldenrodYellow', + 'PapayaWhip', + 'Moccasin', + 'PeachPuff', + 'PaleGoldenrod', + 'Khaki', + 'DarkKhaki', + 'Lavender', + 'Thistle', + 'Plum', + 'Violet', + 'Orchid', + 'Fuchsia', + 'Magenta', + 'MediumOrchid', + 'MediumPurple', + 'RebeccaPurple', + 'BlueViolet', + 'DarkViolet', + 'DarkOrchid', + 'DarkMagenta', + 'Purple', + 'Indigo', + 'SlateBlue', + 'DarkSlateBlue', + 'MediumSlateBlue', + 'GreenYellow', + 'Chartreuse', + 'LawnGreen', + 'Lime', + 'LimeGreen', + 'PaleGreen', + 'LightGreen', + 'MediumSpringGreen', + 'SpringGreen', + 'MediumSeaGreen', + 'SeaGreen', + 'ForestGreen', + 'Green', + 'DarkGreen', + 'YellowGreen', + 'OliveDrab', + 'Olive', + 'DarkOliveGreen', + 'MediumAquamarine', + 'DarkSeaGreen', + 'LightSeaGreen', + 'DarkCyan', + 'Teal', + 'Aqua', + 'Cyan', + 'LightCyan', + 'PaleTurquoise', + 'Aquamarine', + 'Turquoise', + 'MediumTurquoise', + 'DarkTurquoise', + 'CadetBlue', + 'SteelBlue', + 'LightSteelBlue', + 'PowderBlue', + 'LightBlue', + 'SkyBlue', + 'LightSkyBlue', + 'DeepSkyBlue', + 'DodgerBlue', + 'CornflowerBlue', + 'RoyalBlue', + 'Blue', + 'MediumBlue', + 'DarkBlue', + 'Navy', + 'MidnightBlue', + 'Cornsilk', + 'BlanchedAlmond', + 'Bisque', + 'NavajoWhite', + 'Wheat', + 'BurlyWood', + 'Tan', + 'RosyBrown', + 'SandyBrown', + 'Goldenrod', + 'DarkGoldenrod', + 'Peru', + 'Chocolate', + 'SaddleBrown', + 'Sienna', + 'Brown', + 'Maroon', + 'White', + 'Snow', + 'HoneyDew', + 'MintCream', + 'Azure', + 'AliceBlue', + 'GhostWhite', + 'WhiteSmoke', + 'SeaShell', + 'Beige', + 'OldLace', + 'FloralWhite', + 'Ivory', + 'AntiqueWhite', + 'Linen', + 'LavenderBlush', + 'MistyRose', + 'Gainsboro', + 'LightGray', + 'Silver', + 'DarkGray', + 'Gray', + 'DimGray', + 'LightSlateGray', + 'SlateGray', + 'DarkSlateGray', + 'Black', +]; diff --git a/extensions/src/hello-world/src/web-views/components/clock.component.tsx b/extensions/src/hello-world/src/web-views/components/clock.component.tsx new file mode 100644 index 0000000000..9f5253e595 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/components/clock.component.tsx @@ -0,0 +1,7 @@ +import { useData } from '@papi/frontend/react'; + +export default function Clock() { + const [currentTime] = useData('current-time').Time(undefined, 'Loading current time'); + + return
{currentTime}
; +} diff --git a/extensions/src/hello-world/src/web-views/hello-world-2.web-view.scss b/extensions/src/hello-world/src/web-views/hello-world-2.web-view.scss new file mode 100644 index 0000000000..3a4fca5916 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-2.web-view.scss @@ -0,0 +1,8 @@ +@import './hello-world.web-view.base'; + +.title { + .framework { + font-weight: 900; + background-color: darkslategray; + } +} diff --git a/extensions/src/hello-world/src/web-views/hello-world-2.web-view.tsx b/extensions/src/hello-world/src/web-views/hello-world-2.web-view.tsx new file mode 100644 index 0000000000..b9a3fafd88 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-2.web-view.tsx @@ -0,0 +1,56 @@ +import papi from '@papi/frontend'; +import { useEvent, Button } from 'platform-bible-react'; +import { useCallback, useState } from 'react'; +import type { HelloWorldEvent } from 'hello-world'; +import { WebViewProps } from '@papi/core'; + +const randomInt = () => { + return Math.floor(Math.random() * 100); +}; + +globalThis.webViewComponent = function HelloWorld2({ useWebViewState }: WebViewProps) { + const [clicks, setClicks] = useState(0); + const [defaultClicks, setDefaultClicks] = useState(randomInt()); + const [webViewStateClicks, setWebViewStateClicks, resetWebViewStateClicks] = useWebViewState( + 'webViewStateClicks', + defaultClicks, + ); + + // Update the clicks when we are informed helloWorld has been run + useEvent( + papi.network.getNetworkEvent('helloWorld.onHelloWorld'), + useCallback(({ times }: HelloWorldEvent) => setClicks(times), []), + ); + + return ( + <> +
+ Hello World React 2 +
+
+ +
+
+
+ + + +
+ + ); +}; diff --git a/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project-viewer.web-view.tsx b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project-viewer.web-view.tsx new file mode 100644 index 0000000000..c2b8bc1cc8 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project-viewer.web-view.tsx @@ -0,0 +1,26 @@ +import { WebViewProps } from '@papi/core'; +import { useProjectData, useProjectSetting } from '@papi/frontend/react'; +import { CSSProperties, useMemo } from 'react'; + +const namesDefault: string[] = []; + +globalThis.webViewComponent = function HelloWorldProjectViewer({ projectId }: WebViewProps) { + const [names] = useProjectData('helloWorld', projectId).Names(undefined, namesDefault); + + const [headerSize] = useProjectSetting(projectId, 'helloWorld.headerSize', 15); + + const [headerColor] = useProjectSetting(projectId, 'helloWorld.headerColor', 'Black'); + + const headerStyle = useMemo( + () => ({ fontSize: `${headerSize}pt`, color: headerColor }), + [headerSize, headerColor], + ); + + return ( +
+ {names.map((name) => ( +
Hello, {name}!
+ ))} +
+ ); +}; diff --git a/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.scss b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.scss new file mode 100644 index 0000000000..3d15874440 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.scss @@ -0,0 +1,12 @@ +.top > div { + margin-bottom: 1em; +} + +.color-selector-container { + display: flex; + align-items: center; +} + +.remove-name-button { + margin-right: 10px; +} diff --git a/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.tsx b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.tsx new file mode 100644 index 0000000000..6fe7be7bb2 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-project/hello-world-project.web-view.tsx @@ -0,0 +1,99 @@ +import { WebViewProps } from '@papi/core'; +import { logger } from '@papi/frontend'; +import { useProjectData, useProjectDataProvider } from '@papi/frontend/react'; +import { useCallback } from 'react'; +import useHelloWorldProjectSettings from './use-hello-world-project-settings.hook'; +import ProjectSettingsEditor from './project-settings-editor.component'; + +const namesDefault: string[] = []; + +const testExtensionDataScope = { + extensionName: 'helloWorld', + dataQualifier: 'webViewTestExtensionData', +}; + +globalThis.webViewComponent = function HelloWorldProjectWebView({ + projectId, + useWebViewState, +}: WebViewProps) { + const [max, setMax] = useWebViewState('max', 1); + + const pdp = useProjectDataProvider('helloWorld', projectId); + + const [num, setNum] = useProjectData('helloWorld', pdp).RandomNumber(max, -1); + + const [names] = useProjectData('helloWorld', pdp).Names(undefined, namesDefault); + + const [extensionData, setExtensionData] = useProjectData('helloWorld', pdp).ExtensionData( + testExtensionDataScope, + '', + ); + + const [currentName, setCurrentName] = useWebViewState('currentName', ''); + + const addCurrentName = useCallback(() => { + if (!pdp) return; + + pdp.addName(currentName); + setCurrentName(''); + }, [pdp, currentName, setCurrentName]); + + const helloWorldProjectSettings = useHelloWorldProjectSettings(pdp); + const { headerStyle } = helloWorldProjectSettings; + + return ( +
+

Project Data

+
+ Max:{' '} + setMax(parseInt(e.target.value, 10))} /> +
+
+ Random Number:{' '} + { + if (!setNum) { + logger.log('setNum is not available'); + return; + } + const newNum = parseInt(e.target.value, 10); + + if (Number.isNaN(newNum)) return; + + setNum(newNum); + }} + /> +
+
+ Names:{' '} + {names.map((name) => ( + + {name} + + + ))} +
+ setCurrentName(e.target.value)} + onSubmit={addCurrentName} + /> + +
+

Extension Data

+ setExtensionData?.(e.target.value)} /> +
+

Project Settings

+ +
+ ); +}; diff --git a/extensions/src/hello-world/src/web-views/hello-world-project/project-settings-editor.component.tsx b/extensions/src/hello-world/src/web-views/hello-world-project/project-settings-editor.component.tsx new file mode 100644 index 0000000000..e85c47f4df --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-project/project-settings-editor.component.tsx @@ -0,0 +1,48 @@ +import { ComboBox } from 'platform-bible-react'; +import { HTMLColorNames } from 'hello-world'; +import useHelloWorldProjectSettings from './use-hello-world-project-settings.hook'; +import { HTML_COLOR_NAMES } from '../../util'; + +function ProjectSettingsEditor({ + headerSize, + setHeaderSize, + resetHeaderSize, + headerColor, + setHeaderColor, + resetHeaderColor, +}: ReturnType) { + return ( + <> +
+ Header Size:{' '} + setHeaderSize?.(parseInt(e.target.value, 10))} + /> + +
+
+ Header Color:{' '} + setHeaderColor?.(value as HTMLColorNames)} + /> + +
+ + ); +} + +export default ProjectSettingsEditor; diff --git a/extensions/src/hello-world/src/web-views/hello-world-project/use-hello-world-project-settings.hook.ts b/extensions/src/hello-world/src/web-views/hello-world-project/use-hello-world-project-settings.hook.ts new file mode 100644 index 0000000000..6017523300 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world-project/use-hello-world-project-settings.hook.ts @@ -0,0 +1,38 @@ +import { useProjectSetting } from '@papi/frontend/react'; +import type { IBaseProjectDataProvider } from 'papi-shared-types'; +import { CSSProperties, useMemo } from 'react'; + +function useHelloWorldProjectSettings( + // Any Base PDP type works. Without `any`, the DataProviderUpdateInstructions types are incompatible + // eslint-disable-next-line @typescript-eslint/no-explicit-any + projectDataProviderSource: string | IBaseProjectDataProvider | undefined, +) { + const [headerSize, setHeaderSize, resetHeaderSize] = useProjectSetting( + projectDataProviderSource, + 'helloWorld.headerSize', + 15, + ); + + const [headerColor, setHeaderColor, resetHeaderColor] = useProjectSetting( + projectDataProviderSource, + 'helloWorld.headerColor', + 'Black', + ); + + const headerStyle = useMemo( + () => ({ fontSize: `${headerSize}pt`, color: headerColor }), + [headerSize, headerColor], + ); + + return { + headerSize, + setHeaderSize, + resetHeaderSize, + headerColor, + setHeaderColor, + resetHeaderColor, + headerStyle, + }; +} + +export default useHelloWorldProjectSettings; diff --git a/extensions/src/hello-world/src/web-views/hello-world.web-view.base.scss b/extensions/src/hello-world/src/web-views/hello-world.web-view.base.scss new file mode 100644 index 0000000000..ae8df1ab70 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world.web-view.base.scss @@ -0,0 +1,7 @@ +.title { + color: chartreuse; + + .framework { + color: coral; + } +} diff --git a/extensions/src/hello-world/src/web-views/hello-world.web-view.html b/extensions/src/hello-world/src/web-views/hello-world.web-view.html new file mode 100644 index 0000000000..4b475b06c6 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world.web-view.html @@ -0,0 +1,131 @@ + + + + + + +
Hello World!!
+
+
+
+
+ + Q icon + + + diff --git a/extensions/src/hello-world/src/web-views/hello-world.web-view.scss b/extensions/src/hello-world/src/web-views/hello-world.web-view.scss new file mode 100644 index 0000000000..ca8ef91be8 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world.web-view.scss @@ -0,0 +1,9 @@ +@import './hello-world.web-view.base'; + +.title { + color: rebeccapurple; + + .framework { + font-weight: 900; + } +} diff --git a/extensions/src/hello-world/src/web-views/hello-world.web-view.tsx b/extensions/src/hello-world/src/web-views/hello-world.web-view.tsx new file mode 100644 index 0000000000..1082d966d8 --- /dev/null +++ b/extensions/src/hello-world/src/web-views/hello-world.web-view.tsx @@ -0,0 +1,269 @@ +import { VerseRef } from '@sillsdev/scripture'; +import papi, { logger } from '@papi/frontend'; +import { + useData, + useProjectData, + useSetting, + useDialogCallback, + useDataProvider, + useLocalizedStrings, +} from '@papi/frontend/react'; +import { + BookChapterControl, + Button, + Checkbox, + ComboBox, + Slider, + Switch, + TextField, + useEvent, +} from 'platform-bible-react'; +import type { WebViewProps } from '@papi/core'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import type { HelloWorldEvent } from 'hello-world'; +import { debounce } from 'platform-bible-utils'; +import Clock from './components/clock.component'; +import Logo from '../../assets/offline.svg'; +import ProjectSettingsEditor from './hello-world-project/project-settings-editor.component'; +import useHelloWorldProjectSettings from './hello-world-project/use-hello-world-project-settings.hook'; + +const NAME = 'Hello World React WebView'; + +// Test fetching +papi + .fetch('https://www.example.com', { mode: 'no-cors' }) + .catch((e) => logger.error(`Could not get data from example.com! Reason: ${e}`)); + +globalThis.webViewComponent = function HelloWorld({ + title, + projectId, + useWebViewState, + updateWebViewDefinition, + useWebViewScrollGroupScrRef, +}: WebViewProps) { + const [clicks, setClicks] = useWebViewState('clicks', 0); + const [scrRef, setScrRef] = useWebViewScrollGroupScrRef(); + const verseRef = useMemo( + () => new VerseRef(scrRef.bookNum, scrRef.chapterNum, scrRef.verseNum), + [scrRef], + ); + + // Update the clicks when we are informed helloWorld has been run + useEvent( + papi.network.getNetworkEvent('helloWorld.onHelloWorld'), + useCallback( + ({ times }: HelloWorldEvent) => { + if (times > clicks) setClicks(times); + }, + [clicks, setClicks], + ), + ); + + useEffect(() => { + logger.debug(`Hello World WebView previous title: ${title}`); + updateWebViewDefinition({ title: `Hello World ${clicks}` }); + }, [title, updateWebViewDefinition, clicks]); + + const currentRender = useRef(-1); + currentRender.current += 1; + + const showProjectDialog = useDialogCallback( + 'platform.selectProject', + // This is intentionally not a stable reference like `useMemo` or something because we are + // testing below to make sure `useDialogCallback` returns the same callback every time + { + prompt: `Please select a Scripture project for Hello World WebView: (Render ${currentRender.current})`, + iconUrl: 'papi-extension://helloWorld/assets/offline.svg', + title: 'Select Hello World Project', + maximumOpenDialogs: 2, + // Test ref parameter properly getting latest value + currentRender: currentRender.current, + optionsSource: 'hook', + includeProjectInterfaces: ['platformScripture.USFM_Verse'], + }, + useCallback( + (selectedProject, _dialogType, { currentRender: dialogRender, optionsSource }) => { + if (selectedProject) updateWebViewDefinition({ projectId: selectedProject }); + + logger.info( + `Show project dialog resolved to ${selectedProject}. Dialog was shown at render ${dialogRender} with options from ${optionsSource}`, + ); + }, + [updateWebViewDefinition], + ), + ); + + const selectProject = useCallback(() => { + showProjectDialog({ + // Testing having options provided in show dialog function overwrite options in hook + optionsSource: 'showDialogCallback', + }); + }, [showProjectDialog]); + + // Test to make sure useDialogCallback is properly returning the same callback every time even + // though `options` parameter is not a stable reference + useEffect(() => { + if (currentRender.current > 0) + logger.error( + "showProjectDialog updated! This should not have happened. Maybe useDialogCallback's parameters are improperly being listed in dependency arrays", + ); + }, [showProjectDialog]); + + const [latestVerseText] = useData('quickVerse.quickVerse').Verse( + 'latest', + 'Loading latest Scripture text...', + ); + + const [projects, setProjects] = useWebViewState('projects', []); + + const selectProjects = useDialogCallback( + 'platform.selectMultipleProjects', + useMemo( + () => ({ + prompt: 'Please select one or more Scripture projects for Hello World WebView:', + iconUrl: 'papi-extension://helloWorld/assets/offline.svg', + title: 'Select List of Hello World Projects', + selectedProjectIds: projects, + includeProjectInterfaces: ['platformScripture.USFM_Verse'], + }), + [projects], + ), + useCallback( + (selectedProjects) => { + if (selectedProjects) setProjects(selectedProjects); + }, + [setProjects], + ), + ); + + const [name, setNameInternal] = useSetting('helloWorld.personName', 'Kathy'); + + // Name used for display and editing in the input field while debouncing the actual setting change + const [nameTemp, setNameTemp] = useState(name); + + useEffect(() => { + setNameTemp(name); + }, [name]); + + const debouncedSetName = useMemo( + () => + debounce((newName) => { + setNameInternal(newName); + }, 300), + [setNameInternal], + ); + + const setName = useCallback( + (newName: string) => { + setNameTemp(newName); + debouncedSetName(newName); + }, + [debouncedSetName], + ); + + const peopleDataProvider = useDataProvider('helloSomeone.people'); + + const [personGreeting] = useData('helloSomeone.people').Greeting(name, 'Greeting loading'); + + const [personAge] = useData('helloSomeone.people').Age(name, -1); + + const [currentProjectVerse] = useProjectData( + 'platformScripture.USFM_Verse', + projectId ?? undefined, + ).VerseUSFM(verseRef, 'Loading Verse'); + + const helloWorldProjectSettings = useHelloWorldProjectSettings(projectId); + const { headerStyle } = helloWorldProjectSettings; + const [localizedStrings] = useLocalizedStrings( + useMemo(() => ['%submitButton%'], []), + useMemo(() => ['fr', 'en'], []), + ); + + const localizedString = localizedStrings['%submitButton%']; + + return ( +
+
+ Hello World React + {/** + * Note: `Logo` here is inlined into this code as a `data:` url. This is here simply for + * demonstration purposes. Inlining as a `data:` url is generally not recommended. Rather, it is + * generally better to use `papi-extension:` to avoid unnecessary bloat + */} + Hello World Logo +
+
+ +
+
+ +
+
{latestVerseText}
+ +
+ setName(e.target.value)} /> + +
+
{personGreeting}
+
{personAge}
+
+
Selected Project: {projectId ?? 'None'}
+
+ +
+
+ + +
+

{verseRef.toString()}

+
{currentProjectVerse}
+ +

List of Selected Project Id(s):

+
{(projects.length > 0 ? projects : ['None']).join(', ')}
+
+ +
+
+
+ + {/* no label available */} + {/* no label available */} + + {/* no label available */} + setScrRef(newScrRef)} /> +
+
+

French localization of Submit Button:

+
{localizedString}
+
+
+ ); +}; diff --git a/extensions/src/hello-world/src/webpack-env.d.ts b/extensions/src/hello-world/src/webpack-env.d.ts new file mode 100644 index 0000000000..97c42ef39f --- /dev/null +++ b/extensions/src/hello-world/src/webpack-env.d.ts @@ -0,0 +1,157 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/src/webpack-env.d.ts + +/** + * Modules provided by our webpack configuration + * + * Please keep these JSDocs up-to-date with their counterparts in `webpack.config.base.ts` + */ + +// #region code and things + +/** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView files + * are an exception as they are fully bundled. + */ +declare module '*?inline' { + const content: string; + export default content; +} + +/** Import files with no transformation as strings with "./file?raw" */ +declare module '*?raw' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.scss' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.sass' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.css' { + const content: string; + export default content; +} + +// #endregion + +// #region images + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.png' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.svg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpeg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.gif' { + const content: string; + export default content; +} + +// #endregion + +// #region fonts + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff2' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.eot' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.ttf' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.otf' { + const content: string; + export default content; +} + +// #endregion + +// #endregion diff --git a/extensions/src/hello-world/tsconfig.json b/extensions/src/hello-world/tsconfig.json new file mode 100644 index 0000000000..29f4025b9c --- /dev/null +++ b/extensions/src/hello-world/tsconfig.json @@ -0,0 +1,54 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../../../lib", + // Include core extensions' type declarations + "../../../extensions/src", + // Include this extension's type declarations. It's in this location so there aren't any + // unexpected files there for typeRoots to include + "src/types" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/src/hello-world/tsconfig.lint.json b/extensions/src/hello-world/tsconfig.lint.json new file mode 100644 index 0000000000..2a82a6c426 --- /dev/null +++ b/extensions/src/hello-world/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.js", "*.cjs", "*.js", "*.ts", "src", "webpack"] +} diff --git a/extensions/src/hello-world/webpack.config.ts b/extensions/src/hello-world/webpack.config.ts new file mode 100644 index 0000000000..64f328446c --- /dev/null +++ b/extensions/src/hello-world/webpack.config.ts @@ -0,0 +1,15 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack.config.ts + +import webpack from 'webpack'; +import configWebView from './webpack/webpack.config.web-view'; +import configMain from './webpack/webpack.config.main'; + +// Note: Using a .ts file as the webpack config requires not having "type": "module" in package.json +// https://stackoverflow.com/a/76005614 + +// We want to build web views and then build main +const config: webpack.Configuration[] = [configWebView, configMain]; + +export default config; + +// #endregion diff --git a/extensions/src/hello-world/webpack/web-view-resolve-webpack-plugin.ts b/extensions/src/hello-world/webpack/web-view-resolve-webpack-plugin.ts new file mode 100644 index 0000000000..ad28003bab --- /dev/null +++ b/extensions/src/hello-world/webpack/web-view-resolve-webpack-plugin.ts @@ -0,0 +1,116 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/web-view-resolve-webpack-plugin.ts + +import { Resolver } from 'webpack'; +import { getWebViewTempPath, webViewTempDir, webViewTsxRegex } from './webpack.util'; + +// Webpack resolve plugins are enhanced-resolve plugins, which use tapable under the hood. +// Unfortunately, most of this api is very scantly documented, so I pretty much went off of examples +// and trial-and-error. I added lots of documentation here so there is at least some documentation. +// enhanced-resolve https://github.com/webpack/enhanced-resolve +// tapable https://github.com/webpack/tapable +// enhanced-resolve plugin examples https://github.com/webpack/enhanced-resolve/blob/main/lib/ExtensionAliasPlugin.js +// DirectoryNamedWebpackPlugin https://github.com/shaketbaby/directory-named-webpack-plugin/blob/master/index.js +/** Webpack resolution plugin that redirects WebView imports to their compiled version */ +export default class WebViewResolveWebpackPlugin { + // I didn't find much on what the hooks are called, but maybe at least some of them are the keys + // of KnownHooks: https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/types.d.ts#L240 + // Also https://github.com/webpack/webpack/issues/6817#issuecomment-542448438 shows how to add + // path alias functionality with this plugin syntax. + // However, it seems the mystery of available hooks is not solved as DirectoryNamedWebpackPlugin + // uses hook names that are not in KnownHooks. + /** Tap into the enhanced-resolve "resolve" hook with our resolve logic. */ + readonly source = 'resolve'; + /** Feed into the enhanced-resolve "resolve" hook from our resolve logic */ + readonly target = 'resolve'; + + /** + * Function that applies this plugin to webpack resolving. Use the resolver to "tap into" webpack + * resolving with our own logic + * + * @param resolver + */ + apply(resolver: Resolver) { + // Get the resolve hook for performing a new resolve for some reason. + // Just following what is in examples - not sure why do this instead of using the same hook + // in both places and why use `ensureHook` here and `getHook` below. + const target = resolver.ensureHook(this.target); + resolver + // Get the resolve hook + .getHook(this.source) + // Add our plugin to the list of resolvers to run + .tapAsync( + // Internally note that this is our plugin + 'WebViewResolveWebpackPlugin', + /** + * The logic to add to webpack resolving so it will look in the temp dir for built code. + * + * @param request Information about the resolve request + * @param resolveContext Information about the process the hook has taken to get here + * @param callback Function to run to continue the resolution process + * + * - Call with no parameters to continue resolving like this plugin did nothing + * - Call with first parameter null and second parameter a fully resolved `{ path, + * relativePath }` (including file extension) to conclude resolving at that file + * - Call with first parameter `string` or `Error` or something (not sure) to indicate error + * - Note: another option is to call `resolver.doResolve` to start the resolution process over + * with a new `path` and `relativePath` that do not need to be fully resolved. Just + * make sure that second call can't come into your hook again and cause another + * `resolver.doResolve`, or you will have an infinite loop. We pass this `callback` + * param into `resolver.doResolve`, and it calls it automatically + * + * @returns Seems it doesn't matter if or what you return. Just return to quit early + */ + (request, resolveContext, callback) => { + // If the request is somehow not defined (not sure how - just part of the type definition) + // or already has the temp dir in the path (meaning we have already modified the path), + // continue resolving without this plugin so we do not edit the request a second time + if ( + // If somehow it isn't a request, do not edit it. Not sure when this would happen + !request.request || + request.request.includes(`/${webViewTempDir}/`) + ) + // Continue resolving without changing anything with this plugin + return callback(); + + // Get the ?stuff aka the resource query on the request path (includes the ?) + let resourceQuery = request.query; + let requestPath = request.request; + // request.query sometimes doesn't have the ?stuff in it for some reason, so get it + // manually from the request path if it isn't already in request.query + if (!request.query) { + const queryInd = requestPath.lastIndexOf('?'); + // If there is a ? and something after it in the request path, use that as the resource + // query + if (queryInd >= 0 && queryInd < requestPath.length - 1) { + resourceQuery = requestPath.substring(queryInd); + requestPath = requestPath.substring(0, queryInd); + } + } + + // If it isn't calling for a webView, continue resolving without changing anything here + if (!webViewTsxRegex.test(requestPath)) return callback(); + + // Get the path to the relevant file in the temp dir + // Note: this path must keep the ./ at the start, or webpack won't resolve it correctly + let tempViewPath = getWebViewTempPath(requestPath, resolver.join); + // Add the query back onto the request path if it was originally there + if (!request.query) tempViewPath += resourceQuery; + + // Resolve this file but in the temp dir + resolver.doResolve( + target, + { + ...request, + request: tempViewPath, + }, + `Added temp dir to resolve request path: ${tempViewPath}`, + resolveContext, + callback, + ); + return undefined; + }, + ); + } +} + +// #endregion diff --git a/extensions/src/hello-world/webpack/webpack.config.base.ts b/extensions/src/hello-world/webpack/webpack.config.base.ts new file mode 100644 index 0000000000..3eafc61c32 --- /dev/null +++ b/extensions/src/hello-world/webpack/webpack.config.base.ts @@ -0,0 +1,159 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts + +import path from 'path'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import webpack from 'webpack'; + +const isDev = process.env.NODE_ENV !== 'production'; +const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; + +/** The base directory from which webpack should operate (should be the root repo folder) */ +export const rootDir = path.resolve(__dirname, '..'); + +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + +// Note: we do not want to do any chunking because neither webViews nor main can import dependencies +// other than those listed in configBase.externals. Each webView must contain all its dependency +// code, and main must contain all its dependency code. +/** Webpack configuration shared by webView building and main building */ +const configBase: webpack.Configuration = { + // The operating directory for webpack instead of current working directory + context: rootDir, + mode: isDev ? 'development' : 'production', + // Bundle the sourcemap into the file since webviews are injected as strings into the main file + devtool: shouldGenerateSourceMaps ? 'inline-source-map' : false, + watchOptions: { + ignored: ['**/node_modules'], + }, + // Use require for externals as it is the only type of importing that Platform.Bible supports + // https://webpack.js.org/configuration/externals/#externalstypecommonjs + externalsType: LIBRARY_TYPE, + // Modules that Platform.Bible supplies to extensions https://webpack.js.org/configuration/externals/ + // All other dependencies must be bundled into the extension + externals: [ + 'react', + 'react/jsx-runtime', + 'react-dom', + 'react-dom/client', + '@papi/backend', + '@papi/core', + '@papi/frontend', + '@papi/frontend/react', + '@sillsdev/scripture', + 'platform-bible-utils', + ], + module: { + // Please keep these JSDocs up-to-date with their counterparts in `webpack-env.d.ts` + rules: [ + /** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView + * files are an exception as they are fully bundled. + */ + // This must be the first rule in order to be applied after all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /inline/, + type: 'asset/source', + }, + // Load TypeScript with SWC https://swc.rs/docs/usage/swc-loader + // If this seems to cause problems, you can try switching to ts-loader for more compatibility + // https://github.com/TypeStrong/ts-loader#options + { + test: /\.tsx?$/, + use: { + loader: 'swc-loader', + options: { + // Lots of configuration at https://swc.rs/docs/configuration/compilation - if building + // isn't working because of some error that looks like normal code, it may be something + // in swc isn't enabled. + // Found how to configure at https://stackoverflow.com/questions/76671009/how-to-properly-configure-swc-loader-with-webpack-when-switching-from-ts-loader + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + }, + }, + }, + exclude: /node_modules/, + }, + /** Import scss, sass, and css files as strings */ + // https://webpack.js.org/loaders/sass-loader/#getting-started + { + test: /\.(sa|sc|c)ss$/, + use: [ + // We are not using style-loader since we are passing styles to papi, not inserting them + // into dom. style-loader would add html style elements for our styles if we used it + // We are not using css-loader since we are getting style files using ?inline. css-loader + // would allow us to import CSS into CommonJS + // Compiles Sass to CSS + 'sass-loader', + ], + }, + /** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-images + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/inline', + }, + /** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/inline', + }, + /** Import files with no transformation as strings with "./file?raw" */ + // This must be the last rule in order to be applied before all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /raw/, + type: 'asset/source', + }, + ], + }, + resolve: { + // If no file extension is provided on file path imports, use these extensions left-to-right + // https://webpack.js.org/guides/typescript/#basic-setup + extensions: ['.tsx', '.ts', '.js'], + plugins: [ + // use tsconfig.json paths https://www.npmjs.com/package/tsconfig-paths-webpack-plugin + new TsconfigPathsPlugin(), + ], + // Load `platform-bible-react`' `dependencies` from `paranext-core` so the extension will share + // these dependencies with the bundled copy of `platform-bible-react` and avoid duplicate + // packages. These paths are broken up like this so multi-extension folder can format the path + // properly + // https://webpack.js.org/configuration/resolve/#resolvealias + // TODO: Remove this when `platform-bible-react` is published to npm + alias: { + '@emotion/react': path.resolve(__dirname, '..', '../../../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../../../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../../../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../../../node_modules/react-data-grid'), + }, + }, +}; + +export default configBase; + +// #endregion diff --git a/extensions/src/hello-world/webpack/webpack.config.main.ts b/extensions/src/hello-world/webpack/webpack.config.main.ts new file mode 100644 index 0000000000..5a25bc6dde --- /dev/null +++ b/extensions/src/hello-world/webpack/webpack.config.main.ts @@ -0,0 +1,69 @@ +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import CopyPlugin from 'copy-webpack-plugin'; +import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; +import { outputFolder } from './webpack.util'; + +/** Webpack configuration for building main */ +const configMain: webpack.Configuration = merge(configBase, { + // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.main.ts + + // Build for node since Platform.Bible loads this in node https://webpack.js.org/concepts/targets/ + target: 'node', + // configuration name + name: 'main', + // wait until webView bundling finishes - webpack.config.web-view.ts + dependencies: ['webView'], + // Instructions on what output to create + output: { + // extension output directory + path: path.resolve(rootDir, outputFolder), + // Exporting the library https://webpack.js.org/guides/author-libraries/#expose-the-library + library: { + type: LIBRARY_TYPE, + }, + // Empty the output folder before building + clean: true, + }, + resolve: { + plugins: [ + // Get web view files from the temp dir where they are built + new WebViewResolveWebpackPlugin(), + ], + }, + + // #endregion + + // extension main source file to build + // Note: this could have just been the import string if we put the filename in `output`, but + // splitting it out like this allows us to share `output` with `paranext-core`. + entry: { + main: { + import: './src/main.ts', + filename: './src/main.js', + }, + }, + plugins: [ + // Copy static files to the output folder https://webpack.js.org/plugins/copy-webpack-plugin/ + new CopyPlugin({ + patterns: [ + // We want all files from the public folder copied into the output folder + { from: 'public', to: './', noErrorOnMissing: true }, + // We want all files from the assets folder copied into the output folder under assets + { from: 'assets', to: './assets/', noErrorOnMissing: true }, + // We want all files from the contributions folder copied into the output folder under contributions + { from: 'contributions', to: './contributions/', noErrorOnMissing: true }, + // Copy this extension's type declaration file into the output folder under src/types + { from: 'src/types', to: './src/types', noErrorOnMissing: true }, + // We need to distribute the package.json for Platform.Bible to read the extension properly + { from: 'package.json', to: './', noErrorOnMissing: true }, + // We need to distribute the manifest.json to inform Platform.Bible about the extension + { from: 'manifest.json', to: './' }, + ], + }), + ], +}); + +export default configMain; diff --git a/extensions/src/hello-world/webpack/webpack.config.web-view.ts b/extensions/src/hello-world/webpack/webpack.config.web-view.ts new file mode 100644 index 0000000000..ef53636caf --- /dev/null +++ b/extensions/src/hello-world/webpack/webpack.config.web-view.ts @@ -0,0 +1,24 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.web-view.ts + +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import configBase, { rootDir } from './webpack.config.base'; +import { getWebViewEntries } from './webpack.util'; + +/** Webpack configuration for building webViews */ +const configWebView: webpack.Configuration = merge(configBase, { + // Build for web since Platform.Bible loads WebViews in browser https://webpack.js.org/concepts/targets/ + target: 'web', + // configuration name so we can depend on it in main + name: 'webView', + // instructions to build each extension webview source file + entry: getWebViewEntries, + output: { + // Build all the web views in the folders where they are with the temp dir appended + path: rootDir, + }, +}); + +export default configWebView; + +// #endregion diff --git a/extensions/src/hello-world/webpack/webpack.util.ts b/extensions/src/hello-world/webpack/webpack.util.ts new file mode 100644 index 0000000000..cf465e3832 --- /dev/null +++ b/extensions/src/hello-world/webpack/webpack.util.ts @@ -0,0 +1,77 @@ +import webpack from 'webpack'; +import path from 'path'; +import { glob } from 'glob'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.util.ts + +/** + * String of what a web view needs to have in its name before the file extension to be considered a + * web-view + * + * Web Views should be named .web-view. + */ +const webViewTag = '.web-view'; +/** Glob filename matcher for React web views. React Web Views should be named .web-view.tsx */ +const webViewTsxGlob = '**/*.web-view.tsx'; +/** + * Regex file name matcher for React web views. React Web Views should be named .web-view.tsx + * + * Note: this regex allows the extension to be optional. + */ +export const webViewTsxRegex = /.+\.web-view(\.[tj]sx)?$/; +/** Name of adjacent folder used to store bundled WebView files */ +export const webViewTempDir = 'temp-build'; + +/** Folder containing the built extension files */ +export const outputFolder = 'dist'; + +/** Get a list of TypeScript WebView files to bundle. Path relative to project root */ +function getWebViewTsxPaths() { + return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); +} + +/** + * Gets the bundled WebView path for a WebView file path + * + * @param webViewPath Relative path to webView e.g. './src/extension-template.web-view.tsx' + * @param join Function to use to join the paths together + * @returns WebView path with temporary WebView directory inserted into the module path + */ +export function getWebViewTempPath( + webViewPath: string, + join: (path: string, request: string) => string = path.join, +) { + const webViewInfo = path.parse(webViewPath); + + // If the web view doesn't have a file extension, parsing makes it think the extension is + // '.web-view', so we need to add it back + const webViewName = webViewInfo.ext === webViewTag ? webViewInfo.base : webViewInfo.name; + // Put transpiled WebViews in a temp folder in the same directory as the original WebView + // Make sure to preserve the ./ to indicate it is a relative path + return `${webViewPath.startsWith('./') ? './' : ''}${join( + webViewInfo.dir, + join(webViewTempDir, `${webViewName}.js`), + )}`; +} + +/** + * Get webpack entry configuration to build each web-view source file and put it in a temporary + * folder in the same directory + * + * @returns Promise that resolves to the webView entry config + */ +export async function getWebViewEntries(): Promise { + const tsxWebViews = await getWebViewTsxPaths(); + const webViewEntries = Object.fromEntries( + tsxWebViews.map((webViewPath): [string, webpack.EntryObject[string]] => [ + webViewPath, + { + import: webViewPath, + filename: getWebViewTempPath(webViewPath), + }, + ]), + ); + return webViewEntries; +} + +// #endregion diff --git a/extensions/src/legacy-comment-manager/.editorconfig b/extensions/src/legacy-comment-manager/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/src/legacy-comment-manager/.eslintignore b/extensions/src/legacy-comment-manager/.eslintignore new file mode 100644 index 0000000000..bdb2e12c0b --- /dev/null +++ b/extensions/src/legacy-comment-manager/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/legacy-comment-manager/.eslintrc.js b/extensions/src/legacy-comment-manager/.eslintrc.js new file mode 100644 index 0000000000..279bb37dcd --- /dev/null +++ b/extensions/src/legacy-comment-manager/.eslintrc.js @@ -0,0 +1,163 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/.gitignore b/extensions/src/legacy-comment-manager/.gitignore new file mode 100644 index 0000000000..cb00ea28d2 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/src/legacy-comment-manager/.prettierignore b/extensions/src/legacy-comment-manager/.prettierignore new file mode 100644 index 0000000000..69fb5a8ab5 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/legacy-comment-manager/.prettierrc.js b/extensions/src/legacy-comment-manager/.prettierrc.js new file mode 100644 index 0000000000..01e5ca241c --- /dev/null +++ b/extensions/src/legacy-comment-manager/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/.stylelintignore b/extensions/src/legacy-comment-manager/.stylelintignore new file mode 100644 index 0000000000..6d59d79515 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/legacy-comment-manager/.stylelintrc.js b/extensions/src/legacy-comment-manager/.stylelintrc.js new file mode 100644 index 0000000000..70f5dd2d0e --- /dev/null +++ b/extensions/src/legacy-comment-manager/.stylelintrc.js @@ -0,0 +1,20 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + }, +}; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/.vscode/extensions.json b/extensions/src/legacy-comment-manager/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/src/legacy-comment-manager/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/src/legacy-comment-manager/.vscode/launch.json b/extensions/src/legacy-comment-manager/.vscode/launch.json new file mode 100644 index 0000000000..fb0f3a08c0 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/src/legacy-comment-manager/.vscode/settings.json b/extensions/src/legacy-comment-manager/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/src/legacy-comment-manager/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/src/legacy-comment-manager/LICENSE b/extensions/src/legacy-comment-manager/LICENSE new file mode 100644 index 0000000000..5e2e9ffdd7 --- /dev/null +++ b/extensions/src/legacy-comment-manager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 SIL Global + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/src/legacy-comment-manager/README.md b/extensions/src/legacy-comment-manager/README.md new file mode 100644 index 0000000000..0256823a91 --- /dev/null +++ b/extensions/src/legacy-comment-manager/README.md @@ -0,0 +1,163 @@ +# legacy-comment-manager + +Manage comments from Paratext 9 projects + + + +## Template Info + +This is a webpack project template pre-configured to build a Platform.Bible extension. It contains the bare minimum of what an extension needs. Note that the `*.web-view.*` files and the `public/assets` folder mentioned in [Summary](#summary) are not present in this template. For inspiration on what these could look like, refer to any extension that is built using this template. An example would be the [Text Collection extension](https://github.com/paranext/paranext-extension-text-collection). + +There is also [a template pre-configured to build an arbitrary number of Platform.Bible extensions in one repo](https://github.com/paranext/paranext-multi-extension-template). + +### Customize extension details + +Follow these instructions to customize the template to be your own Platform.Bible extension. This section is a more compact version of the [`Your first extension` guide](https://github.com/paranext/paranext-extension-template/wiki/Your-First-Extension). + +#### Install and hook up to the template + +Note: please skip this section and continue with [Replace placeholders](#replace-placeholders) if you are following these instructions as part of [creating an extension within `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#to-create-a-new-extension-in-this-repo). + +To make the process of customizing from the template as smooth as possible, we recommend you do the following before anything else: + +- [Install and set up this repo](#to-install) +- [Update this extension from the template](#to-update-this-extension-from-the-template) + +#### Replace placeholders + +- At the top of this `README.md`: + + - Replace the first line `# paranext-extension-template` with `# your-extension-name` + - Below the first line, replace the extension description with your own description + - In the [Summary](#summary) section, replace `src/types/paranext-extension-template.d.ts` with `src/types/.d.ts` + +- In `manifest.json`: + + - Replace `paranext-extension-template` with `your-extension-name` (2 occurrences) + - Update ownership information and other relevant fields as desired + +- In `package.json`: + + - Replace `paranext-extension-template` with `your-extension-name` (2 occurrences) + - Update ownership information and other relevant fields as desired + +- In `assets/displayData.json`: + + - If your extension has an icon, update the `icon` value to point towards the icon file (for example: `assets/icon.svg`) + - Update the `moreInfoUrl` field to web URL to a page where users can find out more information about you / your organization / your extension. + - Update the `supportUrl` field to web URL to a support page where users can request help and report issues with your extension. + - Update the `en` entry of `localizedDisplayInfo` so that: + + - `displayName` contains a human-readable name for your extension (i.e. `Your Extension Name`). + - `shortSummary` contains a short, few sentence summary of what your extension does. + - `description` points to a Markdown (`.md`) file containing the full description of your extension (similar to what you would put in a `README`). + + - If your extension supports multiple languages, add another entry to `localizedDisplayInfo` by copying and pasting the `en` entry, changing `en` to the [BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) of the language you want to support, and translating the `displayName`, `shortSummary`, and `description` fields appropriately. We recommend naming your description files `description-.md`. + +- In `LICENSE`: + + - Adjust as desired (feel free to choose a different license) + - If you choose to stay with the current license, update the copyright statement + +- Rename `src/types/paranext-extension-template.d.ts` to `src/types/.d.ts` + + - In this renamed file, replace `paranext-extension-template` with `your-extension-name` + +- In `src/main.ts`, replace `Extension template` with `Your Extension Name` (2 occurrences) + +#### Customize the extension manifest and package information + +The `manifest.json` and `package.json` files contain information specific to your extension. Add your extension's details in these two files as needed. See more information on the `manifest.json` and `package.json` files in [Extension Anatomy](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#extension-manifest). + +#### Hide Template Info + +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. + +Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. + + + +## Summary + +The general file structure is as follows: + +- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder +- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder +- `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/legacy-comment-manager.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) +- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder + - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file + - `assets/descriptions/` contains textual descriptions of the extension in various languages + - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` +- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest +- `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing a zip of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In this repo, run `npm install` to install local and published dependencies + +### Configure paths to `paranext-core` repo + +In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. +2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. + +## To run + +### Running Platform.Bible with this extension + +To run Platform.Bible with this extension: + +`npm start` + +Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. + +### Building this extension independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extension once: + +`npm run build` + +## To package for distribution + +To package this extension into a zip file for distribution: + +`npm run package` + +## To update this extension from the template + +This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. + +To set up this extension to be updated from the template, run the following command once after cloning this repo: + +```bash +git remote add template https://github.com/paranext/paranext-extension-template +``` + +To update this extension from the template, make sure your repo has no working changes. Then run the following commands: + +```bash +git fetch template +git merge template/main --allow-unrelated-histories +``` + +For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). + +**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +## Special features in this project + +This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. diff --git a/assets/descriptions/description-en.md b/extensions/src/legacy-comment-manager/assets/descriptions/description-en.md similarity index 100% rename from assets/descriptions/description-en.md rename to extensions/src/legacy-comment-manager/assets/descriptions/description-en.md diff --git a/assets/displayData.json b/extensions/src/legacy-comment-manager/assets/displayData.json similarity index 100% rename from assets/displayData.json rename to extensions/src/legacy-comment-manager/assets/displayData.json diff --git a/extensions/src/legacy-comment-manager/contributions/localizedStrings.json b/extensions/src/legacy-comment-manager/contributions/localizedStrings.json new file mode 100644 index 0000000000..56de66efd0 --- /dev/null +++ b/extensions/src/legacy-comment-manager/contributions/localizedStrings.json @@ -0,0 +1,6 @@ +{ + "metadata": {}, + "localizedStrings": { + "en": {} + } +} diff --git a/extensions/src/legacy-comment-manager/contributions/menus.json b/extensions/src/legacy-comment-manager/contributions/menus.json new file mode 100644 index 0000000000..f68441dcd6 --- /dev/null +++ b/extensions/src/legacy-comment-manager/contributions/menus.json @@ -0,0 +1,17 @@ +{ + "mainMenu": { + "columns": {}, + "groups": {}, + "items": [] + }, + "defaultWebViewTopMenu": { + "columns": {}, + "groups": {}, + "items": [] + }, + "defaultWebViewContextMenu": { + "groups": {}, + "items": [] + }, + "webViewMenus": {} +} diff --git a/extensions/src/legacy-comment-manager/contributions/projectSettings.json b/extensions/src/legacy-comment-manager/contributions/projectSettings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/legacy-comment-manager/contributions/projectSettings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/legacy-comment-manager/contributions/settings.json b/extensions/src/legacy-comment-manager/contributions/settings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/legacy-comment-manager/contributions/settings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/legacy-comment-manager/cspell.json b/extensions/src/legacy-comment-manager/cspell.json new file mode 100644 index 0000000000..d78da5aafa --- /dev/null +++ b/extensions/src/legacy-comment-manager/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../../cspell.json" +} diff --git a/manifest.json b/extensions/src/legacy-comment-manager/manifest.json similarity index 81% rename from manifest.json rename to extensions/src/legacy-comment-manager/manifest.json index 5db7442924..c4ec7ada34 100644 --- a/manifest.json +++ b/extensions/src/legacy-comment-manager/manifest.json @@ -1,5 +1,5 @@ { - "name": "paranext-extension-template", + "name": "legacy-comment-manager", "version": "0.0.1", "displayData": "assets/displayData.json", "author": "Paranext", @@ -7,7 +7,7 @@ "main": "src/main.ts", "extensionDependencies": {}, "elevatedPrivileges": [], - "types": "src/types/paranext-extension-template.d.ts", + "types": "src/types/legacy-comment-manager.d.ts", "menus": "contributions/menus.json", "settings": "contributions/settings.json", "projectSettings": "contributions/projectSettings.json", diff --git a/extensions/src/legacy-comment-manager/package.json b/extensions/src/legacy-comment-manager/package.json new file mode 100644 index 0000000000..9e1c39aa56 --- /dev/null +++ b/extensions/src/legacy-comment-manager/package.json @@ -0,0 +1,86 @@ +{ + "name": "legacy-comment-manager", + "private": true, + "version": "0.0.1", + "main": "src/main.js", + "types": "src/types/legacy-comment-manager.d.ts", + "author": "Paranext", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "start:core": "cd ../../.. && npm run start", + "start": "cross-env MAIN_ARGS=\"--extensions $INIT_CWD/dist\" concurrently \"npm:watch\" \"npm:start:core\"", + "start:production": "cross-env MAIN_ARGS=\"--extensions $INIT_CWD/dist\" concurrently \"npm:watch:production\" \"npm:start:core\"", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.3.3", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/src/main.ts b/extensions/src/legacy-comment-manager/src/main.ts similarity index 53% rename from src/main.ts rename to extensions/src/legacy-comment-manager/src/main.ts index 08b5a55f8b..a5e59ea867 100644 --- a/src/main.ts +++ b/extensions/src/legacy-comment-manager/src/main.ts @@ -1,10 +1,10 @@ import { logger } from '@papi/backend'; export async function activate() { - logger.info('Extension template is activating!'); + logger.info('Legacy comment manager is activating!'); } export async function deactivate() { - logger.info('Extension template is deactivating!'); + logger.info('Legacy comment manager is deactivating!'); return true; } diff --git a/src/types/paranext-extension-template.d.ts b/extensions/src/legacy-comment-manager/src/types/legacy-comment-manager.d.ts similarity index 73% rename from src/types/paranext-extension-template.d.ts rename to extensions/src/legacy-comment-manager/src/types/legacy-comment-manager.d.ts index 73f948a3f3..aa77694143 100644 --- a/src/types/paranext-extension-template.d.ts +++ b/extensions/src/legacy-comment-manager/src/types/legacy-comment-manager.d.ts @@ -1,4 +1,4 @@ -declare module 'paranext-extension-template' { +declare module 'legacy-comment-manager' { // Add extension types exposed on the papi for other extensions to use here // More instructions can be found in the README } diff --git a/extensions/src/legacy-comment-manager/src/webpack-env.d.ts b/extensions/src/legacy-comment-manager/src/webpack-env.d.ts new file mode 100644 index 0000000000..97c42ef39f --- /dev/null +++ b/extensions/src/legacy-comment-manager/src/webpack-env.d.ts @@ -0,0 +1,157 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/src/webpack-env.d.ts + +/** + * Modules provided by our webpack configuration + * + * Please keep these JSDocs up-to-date with their counterparts in `webpack.config.base.ts` + */ + +// #region code and things + +/** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView files + * are an exception as they are fully bundled. + */ +declare module '*?inline' { + const content: string; + export default content; +} + +/** Import files with no transformation as strings with "./file?raw" */ +declare module '*?raw' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.scss' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.sass' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.css' { + const content: string; + export default content; +} + +// #endregion + +// #region images + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.png' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.svg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpeg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.gif' { + const content: string; + export default content; +} + +// #endregion + +// #region fonts + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff2' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.eot' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.ttf' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.otf' { + const content: string; + export default content; +} + +// #endregion + +// #endregion diff --git a/extensions/src/legacy-comment-manager/tsconfig.json b/extensions/src/legacy-comment-manager/tsconfig.json new file mode 100644 index 0000000000..29f4025b9c --- /dev/null +++ b/extensions/src/legacy-comment-manager/tsconfig.json @@ -0,0 +1,54 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../../../lib", + // Include core extensions' type declarations + "../../../extensions/src", + // Include this extension's type declarations. It's in this location so there aren't any + // unexpected files there for typeRoots to include + "src/types" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/src/legacy-comment-manager/tsconfig.lint.json b/extensions/src/legacy-comment-manager/tsconfig.lint.json new file mode 100644 index 0000000000..a6ce9eea47 --- /dev/null +++ b/extensions/src/legacy-comment-manager/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.js", "*.ts", "*.js", "lib", "src", "webpack"] +} diff --git a/extensions/src/legacy-comment-manager/webpack.config.ts b/extensions/src/legacy-comment-manager/webpack.config.ts new file mode 100644 index 0000000000..64f328446c --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack.config.ts @@ -0,0 +1,15 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack.config.ts + +import webpack from 'webpack'; +import configWebView from './webpack/webpack.config.web-view'; +import configMain from './webpack/webpack.config.main'; + +// Note: Using a .ts file as the webpack config requires not having "type": "module" in package.json +// https://stackoverflow.com/a/76005614 + +// We want to build web views and then build main +const config: webpack.Configuration[] = [configWebView, configMain]; + +export default config; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/webpack/web-view-resolve-webpack-plugin.ts b/extensions/src/legacy-comment-manager/webpack/web-view-resolve-webpack-plugin.ts new file mode 100644 index 0000000000..ad28003bab --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack/web-view-resolve-webpack-plugin.ts @@ -0,0 +1,116 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/web-view-resolve-webpack-plugin.ts + +import { Resolver } from 'webpack'; +import { getWebViewTempPath, webViewTempDir, webViewTsxRegex } from './webpack.util'; + +// Webpack resolve plugins are enhanced-resolve plugins, which use tapable under the hood. +// Unfortunately, most of this api is very scantly documented, so I pretty much went off of examples +// and trial-and-error. I added lots of documentation here so there is at least some documentation. +// enhanced-resolve https://github.com/webpack/enhanced-resolve +// tapable https://github.com/webpack/tapable +// enhanced-resolve plugin examples https://github.com/webpack/enhanced-resolve/blob/main/lib/ExtensionAliasPlugin.js +// DirectoryNamedWebpackPlugin https://github.com/shaketbaby/directory-named-webpack-plugin/blob/master/index.js +/** Webpack resolution plugin that redirects WebView imports to their compiled version */ +export default class WebViewResolveWebpackPlugin { + // I didn't find much on what the hooks are called, but maybe at least some of them are the keys + // of KnownHooks: https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/types.d.ts#L240 + // Also https://github.com/webpack/webpack/issues/6817#issuecomment-542448438 shows how to add + // path alias functionality with this plugin syntax. + // However, it seems the mystery of available hooks is not solved as DirectoryNamedWebpackPlugin + // uses hook names that are not in KnownHooks. + /** Tap into the enhanced-resolve "resolve" hook with our resolve logic. */ + readonly source = 'resolve'; + /** Feed into the enhanced-resolve "resolve" hook from our resolve logic */ + readonly target = 'resolve'; + + /** + * Function that applies this plugin to webpack resolving. Use the resolver to "tap into" webpack + * resolving with our own logic + * + * @param resolver + */ + apply(resolver: Resolver) { + // Get the resolve hook for performing a new resolve for some reason. + // Just following what is in examples - not sure why do this instead of using the same hook + // in both places and why use `ensureHook` here and `getHook` below. + const target = resolver.ensureHook(this.target); + resolver + // Get the resolve hook + .getHook(this.source) + // Add our plugin to the list of resolvers to run + .tapAsync( + // Internally note that this is our plugin + 'WebViewResolveWebpackPlugin', + /** + * The logic to add to webpack resolving so it will look in the temp dir for built code. + * + * @param request Information about the resolve request + * @param resolveContext Information about the process the hook has taken to get here + * @param callback Function to run to continue the resolution process + * + * - Call with no parameters to continue resolving like this plugin did nothing + * - Call with first parameter null and second parameter a fully resolved `{ path, + * relativePath }` (including file extension) to conclude resolving at that file + * - Call with first parameter `string` or `Error` or something (not sure) to indicate error + * - Note: another option is to call `resolver.doResolve` to start the resolution process over + * with a new `path` and `relativePath` that do not need to be fully resolved. Just + * make sure that second call can't come into your hook again and cause another + * `resolver.doResolve`, or you will have an infinite loop. We pass this `callback` + * param into `resolver.doResolve`, and it calls it automatically + * + * @returns Seems it doesn't matter if or what you return. Just return to quit early + */ + (request, resolveContext, callback) => { + // If the request is somehow not defined (not sure how - just part of the type definition) + // or already has the temp dir in the path (meaning we have already modified the path), + // continue resolving without this plugin so we do not edit the request a second time + if ( + // If somehow it isn't a request, do not edit it. Not sure when this would happen + !request.request || + request.request.includes(`/${webViewTempDir}/`) + ) + // Continue resolving without changing anything with this plugin + return callback(); + + // Get the ?stuff aka the resource query on the request path (includes the ?) + let resourceQuery = request.query; + let requestPath = request.request; + // request.query sometimes doesn't have the ?stuff in it for some reason, so get it + // manually from the request path if it isn't already in request.query + if (!request.query) { + const queryInd = requestPath.lastIndexOf('?'); + // If there is a ? and something after it in the request path, use that as the resource + // query + if (queryInd >= 0 && queryInd < requestPath.length - 1) { + resourceQuery = requestPath.substring(queryInd); + requestPath = requestPath.substring(0, queryInd); + } + } + + // If it isn't calling for a webView, continue resolving without changing anything here + if (!webViewTsxRegex.test(requestPath)) return callback(); + + // Get the path to the relevant file in the temp dir + // Note: this path must keep the ./ at the start, or webpack won't resolve it correctly + let tempViewPath = getWebViewTempPath(requestPath, resolver.join); + // Add the query back onto the request path if it was originally there + if (!request.query) tempViewPath += resourceQuery; + + // Resolve this file but in the temp dir + resolver.doResolve( + target, + { + ...request, + request: tempViewPath, + }, + `Added temp dir to resolve request path: ${tempViewPath}`, + resolveContext, + callback, + ); + return undefined; + }, + ); + } +} + +// #endregion diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts b/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts new file mode 100644 index 0000000000..3eafc61c32 --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts @@ -0,0 +1,159 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts + +import path from 'path'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import webpack from 'webpack'; + +const isDev = process.env.NODE_ENV !== 'production'; +const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; + +/** The base directory from which webpack should operate (should be the root repo folder) */ +export const rootDir = path.resolve(__dirname, '..'); + +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + +// Note: we do not want to do any chunking because neither webViews nor main can import dependencies +// other than those listed in configBase.externals. Each webView must contain all its dependency +// code, and main must contain all its dependency code. +/** Webpack configuration shared by webView building and main building */ +const configBase: webpack.Configuration = { + // The operating directory for webpack instead of current working directory + context: rootDir, + mode: isDev ? 'development' : 'production', + // Bundle the sourcemap into the file since webviews are injected as strings into the main file + devtool: shouldGenerateSourceMaps ? 'inline-source-map' : false, + watchOptions: { + ignored: ['**/node_modules'], + }, + // Use require for externals as it is the only type of importing that Platform.Bible supports + // https://webpack.js.org/configuration/externals/#externalstypecommonjs + externalsType: LIBRARY_TYPE, + // Modules that Platform.Bible supplies to extensions https://webpack.js.org/configuration/externals/ + // All other dependencies must be bundled into the extension + externals: [ + 'react', + 'react/jsx-runtime', + 'react-dom', + 'react-dom/client', + '@papi/backend', + '@papi/core', + '@papi/frontend', + '@papi/frontend/react', + '@sillsdev/scripture', + 'platform-bible-utils', + ], + module: { + // Please keep these JSDocs up-to-date with their counterparts in `webpack-env.d.ts` + rules: [ + /** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView + * files are an exception as they are fully bundled. + */ + // This must be the first rule in order to be applied after all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /inline/, + type: 'asset/source', + }, + // Load TypeScript with SWC https://swc.rs/docs/usage/swc-loader + // If this seems to cause problems, you can try switching to ts-loader for more compatibility + // https://github.com/TypeStrong/ts-loader#options + { + test: /\.tsx?$/, + use: { + loader: 'swc-loader', + options: { + // Lots of configuration at https://swc.rs/docs/configuration/compilation - if building + // isn't working because of some error that looks like normal code, it may be something + // in swc isn't enabled. + // Found how to configure at https://stackoverflow.com/questions/76671009/how-to-properly-configure-swc-loader-with-webpack-when-switching-from-ts-loader + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + }, + }, + }, + exclude: /node_modules/, + }, + /** Import scss, sass, and css files as strings */ + // https://webpack.js.org/loaders/sass-loader/#getting-started + { + test: /\.(sa|sc|c)ss$/, + use: [ + // We are not using style-loader since we are passing styles to papi, not inserting them + // into dom. style-loader would add html style elements for our styles if we used it + // We are not using css-loader since we are getting style files using ?inline. css-loader + // would allow us to import CSS into CommonJS + // Compiles Sass to CSS + 'sass-loader', + ], + }, + /** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-images + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/inline', + }, + /** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/inline', + }, + /** Import files with no transformation as strings with "./file?raw" */ + // This must be the last rule in order to be applied before all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /raw/, + type: 'asset/source', + }, + ], + }, + resolve: { + // If no file extension is provided on file path imports, use these extensions left-to-right + // https://webpack.js.org/guides/typescript/#basic-setup + extensions: ['.tsx', '.ts', '.js'], + plugins: [ + // use tsconfig.json paths https://www.npmjs.com/package/tsconfig-paths-webpack-plugin + new TsconfigPathsPlugin(), + ], + // Load `platform-bible-react`' `dependencies` from `paranext-core` so the extension will share + // these dependencies with the bundled copy of `platform-bible-react` and avoid duplicate + // packages. These paths are broken up like this so multi-extension folder can format the path + // properly + // https://webpack.js.org/configuration/resolve/#resolvealias + // TODO: Remove this when `platform-bible-react` is published to npm + alias: { + '@emotion/react': path.resolve(__dirname, '..', '../../../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../../../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../../../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../../../node_modules/react-data-grid'), + }, + }, +}; + +export default configBase; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts b/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts new file mode 100644 index 0000000000..5a25bc6dde --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts @@ -0,0 +1,69 @@ +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import CopyPlugin from 'copy-webpack-plugin'; +import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; +import { outputFolder } from './webpack.util'; + +/** Webpack configuration for building main */ +const configMain: webpack.Configuration = merge(configBase, { + // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.main.ts + + // Build for node since Platform.Bible loads this in node https://webpack.js.org/concepts/targets/ + target: 'node', + // configuration name + name: 'main', + // wait until webView bundling finishes - webpack.config.web-view.ts + dependencies: ['webView'], + // Instructions on what output to create + output: { + // extension output directory + path: path.resolve(rootDir, outputFolder), + // Exporting the library https://webpack.js.org/guides/author-libraries/#expose-the-library + library: { + type: LIBRARY_TYPE, + }, + // Empty the output folder before building + clean: true, + }, + resolve: { + plugins: [ + // Get web view files from the temp dir where they are built + new WebViewResolveWebpackPlugin(), + ], + }, + + // #endregion + + // extension main source file to build + // Note: this could have just been the import string if we put the filename in `output`, but + // splitting it out like this allows us to share `output` with `paranext-core`. + entry: { + main: { + import: './src/main.ts', + filename: './src/main.js', + }, + }, + plugins: [ + // Copy static files to the output folder https://webpack.js.org/plugins/copy-webpack-plugin/ + new CopyPlugin({ + patterns: [ + // We want all files from the public folder copied into the output folder + { from: 'public', to: './', noErrorOnMissing: true }, + // We want all files from the assets folder copied into the output folder under assets + { from: 'assets', to: './assets/', noErrorOnMissing: true }, + // We want all files from the contributions folder copied into the output folder under contributions + { from: 'contributions', to: './contributions/', noErrorOnMissing: true }, + // Copy this extension's type declaration file into the output folder under src/types + { from: 'src/types', to: './src/types', noErrorOnMissing: true }, + // We need to distribute the package.json for Platform.Bible to read the extension properly + { from: 'package.json', to: './', noErrorOnMissing: true }, + // We need to distribute the manifest.json to inform Platform.Bible about the extension + { from: 'manifest.json', to: './' }, + ], + }), + ], +}); + +export default configMain; diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.config.web-view.ts b/extensions/src/legacy-comment-manager/webpack/webpack.config.web-view.ts new file mode 100644 index 0000000000..ef53636caf --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack/webpack.config.web-view.ts @@ -0,0 +1,24 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.web-view.ts + +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import configBase, { rootDir } from './webpack.config.base'; +import { getWebViewEntries } from './webpack.util'; + +/** Webpack configuration for building webViews */ +const configWebView: webpack.Configuration = merge(configBase, { + // Build for web since Platform.Bible loads WebViews in browser https://webpack.js.org/concepts/targets/ + target: 'web', + // configuration name so we can depend on it in main + name: 'webView', + // instructions to build each extension webview source file + entry: getWebViewEntries, + output: { + // Build all the web views in the folders where they are with the temp dir appended + path: rootDir, + }, +}); + +export default configWebView; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.util.ts b/extensions/src/legacy-comment-manager/webpack/webpack.util.ts new file mode 100644 index 0000000000..cf465e3832 --- /dev/null +++ b/extensions/src/legacy-comment-manager/webpack/webpack.util.ts @@ -0,0 +1,77 @@ +import webpack from 'webpack'; +import path from 'path'; +import { glob } from 'glob'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.util.ts + +/** + * String of what a web view needs to have in its name before the file extension to be considered a + * web-view + * + * Web Views should be named .web-view. + */ +const webViewTag = '.web-view'; +/** Glob filename matcher for React web views. React Web Views should be named .web-view.tsx */ +const webViewTsxGlob = '**/*.web-view.tsx'; +/** + * Regex file name matcher for React web views. React Web Views should be named .web-view.tsx + * + * Note: this regex allows the extension to be optional. + */ +export const webViewTsxRegex = /.+\.web-view(\.[tj]sx)?$/; +/** Name of adjacent folder used to store bundled WebView files */ +export const webViewTempDir = 'temp-build'; + +/** Folder containing the built extension files */ +export const outputFolder = 'dist'; + +/** Get a list of TypeScript WebView files to bundle. Path relative to project root */ +function getWebViewTsxPaths() { + return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); +} + +/** + * Gets the bundled WebView path for a WebView file path + * + * @param webViewPath Relative path to webView e.g. './src/extension-template.web-view.tsx' + * @param join Function to use to join the paths together + * @returns WebView path with temporary WebView directory inserted into the module path + */ +export function getWebViewTempPath( + webViewPath: string, + join: (path: string, request: string) => string = path.join, +) { + const webViewInfo = path.parse(webViewPath); + + // If the web view doesn't have a file extension, parsing makes it think the extension is + // '.web-view', so we need to add it back + const webViewName = webViewInfo.ext === webViewTag ? webViewInfo.base : webViewInfo.name; + // Put transpiled WebViews in a temp folder in the same directory as the original WebView + // Make sure to preserve the ./ to indicate it is a relative path + return `${webViewPath.startsWith('./') ? './' : ''}${join( + webViewInfo.dir, + join(webViewTempDir, `${webViewName}.js`), + )}`; +} + +/** + * Get webpack entry configuration to build each web-view source file and put it in a temporary + * folder in the same directory + * + * @returns Promise that resolves to the webView entry config + */ +export async function getWebViewEntries(): Promise { + const tsxWebViews = await getWebViewTsxPaths(); + const webViewEntries = Object.fromEntries( + tsxWebViews.map((webViewPath): [string, webpack.EntryObject[string]] => [ + webViewPath, + { + import: webViewPath, + filename: getWebViewTempPath(webViewPath), + }, + ]), + ); + return webViewEntries; +} + +// #endregion diff --git a/extensions/src/platform-scripture-editor/.editorconfig b/extensions/src/platform-scripture-editor/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/src/platform-scripture-editor/.eslintignore b/extensions/src/platform-scripture-editor/.eslintignore new file mode 100644 index 0000000000..bdb2e12c0b --- /dev/null +++ b/extensions/src/platform-scripture-editor/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/platform-scripture-editor/.eslintrc.js b/extensions/src/platform-scripture-editor/.eslintrc.js new file mode 100644 index 0000000000..279bb37dcd --- /dev/null +++ b/extensions/src/platform-scripture-editor/.eslintrc.js @@ -0,0 +1,163 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/src/platform-scripture-editor/.gitignore b/extensions/src/platform-scripture-editor/.gitignore new file mode 100644 index 0000000000..cb00ea28d2 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/src/platform-scripture-editor/.prettierignore b/extensions/src/platform-scripture-editor/.prettierignore new file mode 100644 index 0000000000..69fb5a8ab5 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/platform-scripture-editor/.prettierrc.js b/extensions/src/platform-scripture-editor/.prettierrc.js new file mode 100644 index 0000000000..01e5ca241c --- /dev/null +++ b/extensions/src/platform-scripture-editor/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/src/platform-scripture-editor/.stylelintignore b/extensions/src/platform-scripture-editor/.stylelintignore new file mode 100644 index 0000000000..6d59d79515 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/platform-scripture-editor/.stylelintrc.js b/extensions/src/platform-scripture-editor/.stylelintrc.js new file mode 100644 index 0000000000..c6349f79ef --- /dev/null +++ b/extensions/src/platform-scripture-editor/.stylelintrc.js @@ -0,0 +1,22 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + // only -webkit-mask-... rules are working, not the ones without -webkit + 'property-no-vendor-prefix': [true, { ignoreProperties: [/mask-.*/] }], + }, +}; + +// #endregion diff --git a/extensions/src/platform-scripture-editor/.vscode/extensions.json b/extensions/src/platform-scripture-editor/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/src/platform-scripture-editor/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/src/platform-scripture-editor/.vscode/launch.json b/extensions/src/platform-scripture-editor/.vscode/launch.json new file mode 100644 index 0000000000..fb0f3a08c0 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/src/platform-scripture-editor/.vscode/settings.json b/extensions/src/platform-scripture-editor/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/src/platform-scripture-editor/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/src/platform-scripture-editor/LICENSE b/extensions/src/platform-scripture-editor/LICENSE new file mode 100644 index 0000000000..851ff3e8d1 --- /dev/null +++ b/extensions/src/platform-scripture-editor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/src/platform-scripture-editor/README.md b/extensions/src/platform-scripture-editor/README.md new file mode 100644 index 0000000000..d092616a2c --- /dev/null +++ b/extensions/src/platform-scripture-editor/README.md @@ -0,0 +1,85 @@ +# platform-scripture-editor + +Editor extension for Platform.Bible, that can also be used in read-only mode + +## Summary + +The general file structure is as follows: + +- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder +- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder +- `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/paranext-extension-template.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) +- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol. It is copied into the build folder +- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest +- `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing a zip of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In this repo, run `npm install` to install local and published dependencies + +### Configure paths to `paranext-core` repo + +In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. +2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. + +## To run + +### Running Platform.Bible with this extension + +To run Platform.Bible with this extension: + +`npm start` + +Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. + +### Building this extension independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extension once: + +`npm run build` + +## To package for distribution + +To package this extension into a zip file for distribution: + +`npm run package` + +## To update this extension from the template + +This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. + +To set up this extension to be updated from the template, run the following command once after cloning this repo: + +```bash +git remote add template https://github.com/paranext/paranext-extension-template +``` + +To update this extension from the template, make sure your repo has no working changes. Then run the following commands: + +```bash +git fetch template +git merge template/main --allow-unrelated-histories +``` + +For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). + +**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +## Special features in this project + +This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/1-square.svg b/extensions/src/platform-scripture-editor/assets/images/icons/1-square.svg new file mode 100644 index 0000000000..655862a048 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/1-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/2-square.svg b/extensions/src/platform-scripture-editor/assets/images/icons/2-square.svg new file mode 100644 index 0000000000..776e9f4af0 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/2-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/3-square.svg b/extensions/src/platform-scripture-editor/assets/images/icons/3-square.svg new file mode 100644 index 0000000000..6146ea0d9e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/3-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/4-square.svg b/extensions/src/platform-scripture-editor/assets/images/icons/4-square.svg new file mode 100644 index 0000000000..6d6b9662ab --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/4-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/LICENSE.md b/extensions/src/platform-scripture-editor/assets/images/icons/LICENSE.md new file mode 100644 index 0000000000..5a61bf2cbb --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/LICENSE.md @@ -0,0 +1,5 @@ +Bootstrap Icons +https://icons.getbootstrap.com + +Licensed under MIT license +https://github.com/twbs/icons/blob/main/LICENSE diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/arrow-clockwise.svg b/extensions/src/platform-scripture-editor/assets/images/icons/arrow-clockwise.svg new file mode 100644 index 0000000000..80b3ad066e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/arrow-clockwise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/arrow-counterclockwise.svg b/extensions/src/platform-scripture-editor/assets/images/icons/arrow-counterclockwise.svg new file mode 100644 index 0000000000..46d3581d8e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/arrow-counterclockwise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/ban.svg b/extensions/src/platform-scripture-editor/assets/images/icons/ban.svg new file mode 100644 index 0000000000..4582536d53 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/ban.svg @@ -0,0 +1,3 @@ + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/bookmark.svg b/extensions/src/platform-scripture-editor/assets/images/icons/bookmark.svg new file mode 100644 index 0000000000..45cc0f944b --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/bookmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/chat-left-text.svg b/extensions/src/platform-scripture-editor/assets/images/icons/chat-left-text.svg new file mode 100644 index 0000000000..7c7acc2397 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/chat-left-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/chat-square-quote.svg b/extensions/src/platform-scripture-editor/assets/images/icons/chat-square-quote.svg new file mode 100644 index 0000000000..5501848a57 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/chat-square-quote.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/chevron-down.svg b/extensions/src/platform-scripture-editor/assets/images/icons/chevron-down.svg new file mode 100644 index 0000000000..ef1a6ba3b7 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/code.svg b/extensions/src/platform-scripture-editor/assets/images/icons/code.svg new file mode 100644 index 0000000000..c9070bf06e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/comments.svg b/extensions/src/platform-scripture-editor/assets/images/icons/comments.svg new file mode 100644 index 0000000000..6a23ac5463 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/comments.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/file-earmark.svg b/extensions/src/platform-scripture-editor/assets/images/icons/file-earmark.svg new file mode 100644 index 0000000000..5e791d43ec --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/file-earmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/justify.svg b/extensions/src/platform-scripture-editor/assets/images/icons/justify.svg new file mode 100644 index 0000000000..6c5f8d0f7e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/justify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/link.svg b/extensions/src/platform-scripture-editor/assets/images/icons/link.svg new file mode 100644 index 0000000000..bc38ff5d4b --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/list-ol.svg b/extensions/src/platform-scripture-editor/assets/images/icons/list-ol.svg new file mode 100644 index 0000000000..ad288e8ea4 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/list-ol.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/list-ul.svg b/extensions/src/platform-scripture-editor/assets/images/icons/list-ul.svg new file mode 100644 index 0000000000..6d7aae75d7 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/list-ul.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/pencil-fill.svg b/extensions/src/platform-scripture-editor/assets/images/icons/pencil-fill.svg new file mode 100644 index 0000000000..eb01fb2a41 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/pencil-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/send.svg b/extensions/src/platform-scripture-editor/assets/images/icons/send.svg new file mode 100644 index 0000000000..04e9f29836 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/text-center.svg b/extensions/src/platform-scripture-editor/assets/images/icons/text-center.svg new file mode 100644 index 0000000000..97ced49e63 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/text-center.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/text-left.svg b/extensions/src/platform-scripture-editor/assets/images/icons/text-left.svg new file mode 100644 index 0000000000..5fe4cc4452 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/text-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/text-paragraph.svg b/extensions/src/platform-scripture-editor/assets/images/icons/text-paragraph.svg new file mode 100644 index 0000000000..1b943ab44e --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/text-paragraph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/text-right.svg b/extensions/src/platform-scripture-editor/assets/images/icons/text-right.svg new file mode 100644 index 0000000000..de984517f9 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/text-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/trash3.svg b/extensions/src/platform-scripture-editor/assets/images/icons/trash3.svg new file mode 100644 index 0000000000..5c38b387e6 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/trash3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-bold.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-bold.svg new file mode 100644 index 0000000000..ec0dc2ec0d --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-bold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-h1.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-h1.svg new file mode 100644 index 0000000000..379da930d8 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-h1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-h2.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-h2.svg new file mode 100644 index 0000000000..e724a0be39 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-h2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-h3.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-h3.svg new file mode 100644 index 0000000000..5ddf8149bf --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-h3.svg @@ -0,0 +1,3 @@ + + + diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-italic.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-italic.svg new file mode 100644 index 0000000000..ac139f3cc9 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-strikethrough.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-strikethrough.svg new file mode 100644 index 0000000000..a0d7e17e2d --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/assets/images/icons/type-underline.svg b/extensions/src/platform-scripture-editor/assets/images/icons/type-underline.svg new file mode 100644 index 0000000000..d5c7046ee3 --- /dev/null +++ b/extensions/src/platform-scripture-editor/assets/images/icons/type-underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/src/platform-scripture-editor/contributions/localizedStrings.json b/extensions/src/platform-scripture-editor/contributions/localizedStrings.json new file mode 100644 index 0000000000..9112c0f336 --- /dev/null +++ b/extensions/src/platform-scripture-editor/contributions/localizedStrings.json @@ -0,0 +1,25 @@ +{ + "metadata": {}, + "localizedStrings": { + "en": { + "%mainMenu_openPlatformScriptureEditor%": "Open Scripture Editor", + "%mainMenu_openPlatformResourceViewer%": "Open Resource Viewer", + "%webView_platformScriptureEditor_options%": "Options", + "%webView_platformScriptureEditor_tools%": "Tools", + "%webView_platformScriptureEditor_info%": "Info", + "%webView_platformScriptureEditor_backgroundColor%": "Background Color", + "%webView_platformScriptureEditor_textColor%": "Text Color", + "%webView_platformScriptureEditor_thickBorders%": "Thick Borders", + "%webView_platformScriptureEditor_charactersInventory%": "Inventory: Characters...", + "%webView_platformScriptureEditor_repeatedWordsInventory%": "Inventory: Repeated Words...", + "%webView_platformScriptureEditor_configureChecks%": "Configure Checks...", + "%webView_platformScriptureEditor_showCheckResults%": "Show Check Results...", + "%webView_platformScriptureEditor_publisherInfo%": "Publisher Info", + "%webView_platformScriptureEditor_copyrightInfo%": "Copyright Info", + "%platformScriptureEditor_dialog_openResourceViewer_title%": "Open Resource Viewer", + "%platformScriptureEditor_dialog_openResourceViewer_prompt%": "Choose a resource to open:", + "%platformScriptureEditor_dialog_openScriptureEditor_title%": "Open Scripture Editor", + "%platformScriptureEditor_dialog_openScriptureEditor_prompt%": "Choose a project to open:" + } + } +} diff --git a/extensions/src/platform-scripture-editor/contributions/menus.json b/extensions/src/platform-scripture-editor/contributions/menus.json new file mode 100644 index 0000000000..160c043670 --- /dev/null +++ b/extensions/src/platform-scripture-editor/contributions/menus.json @@ -0,0 +1,125 @@ +{ + "mainMenu": { + "columns": {}, + "groups": {}, + "items": [ + { + "label": "%mainMenu_openPlatformScriptureEditor%", + "localizeNotes": "Application main menu > Project > Open Scripture Editor", + "group": "platform.projectResources", + "order": -100, + "command": "platformScriptureEditor.openScriptureEditor" + }, + { + "label": "%mainMenu_openPlatformResourceViewer%", + "localizeNotes": "Application main menu > Project > Open Resource Viewer", + "group": "platform.projectResources", + "order": -99, + "command": "platformScriptureEditor.openResourceViewer" + } + ] + }, + "webViewMenus": { + "platformScriptureEditor.react": { + "includeDefaults": true, + "topMenu": { + "columns": { + "platformScriptureEditor.options": { + "label": "%webView_platformScriptureEditor_options%", + "order": 3 + }, + "platformScriptureEditor.tools": { + "label": "%webView_platformScriptureEditor_tools%", + "order": 4 + }, + "platformScriptureEditor.info": { + "label": "%webView_platformScriptureEditor_info%", + "order": 5 + } + }, + "groups": { + "platformScriptureEditor.colors": { + "column": "platformScriptureEditor.options", + "order": 1 + }, + "platformScriptureEditor.layout": { + "column": "platformScriptureEditor.options", + "order": 2 + }, + "platformScriptureEditor.general": { + "column": "platformScriptureEditor.info", + "order": 2 + }, + "platformScriptureEditor.inventory": { + "column": "platformScriptureEditor.tools", + "order": 2 + }, + "platformScriptureEditor.checks": { + "column": "platformScriptureEditor.tools", + "order": 3 + } + }, + "items": [ + { + "label": "%webView_platformScriptureEditor_backgroundColor%", + "group": "platformScriptureEditor.colors", + "order": 2, + "command": "platformScriptureEditor.changeBackgroundColor" + }, + { + "label": "%webView_platformScriptureEditor_textColor%", + "group": "platformScriptureEditor.colors", + "order": 1, + "command": "platformScriptureEditor.changeTextColor" + }, + { + "label": "%webView_platformScriptureEditor_charactersInventory%", + "group": "platformScriptureEditor.inventory", + "order": 1, + "command": "platformScripture.openCharactersInventory" + }, + { + "label": "%webView_platformScriptureEditor_repeatedWordsInventory%", + "group": "platformScriptureEditor.inventory", + "order": 2, + "command": "platformScripture.openRepeatedWordsInventory" + }, + { + "label": "%webView_platformScriptureEditor_configureChecks%", + "group": "platformScriptureEditor.checks", + "order": 1, + "command": "platformScripture.openConfigureChecks" + }, + { + "label": "%webView_platformScriptureEditor_showCheckResults%", + "group": "platformScriptureEditor.checks", + "order": 2, + "command": "platformScripture.showCheckResults" + }, + { + "label": "%webView_platformScriptureEditor_thickBorders%", + "group": "platformScriptureEditor.layout", + "order": 1, + "command": "platformScriptureEditor.showThickBorders" + }, + { + "label": "%webView_platformScriptureEditor_publisherInfo%", + "group": "platformScriptureEditor.general", + "order": 1, + "command": "platformScriptureEditor.showPublisherInfo" + }, + { + "label": "%webView_platformScriptureEditor_copyrightInfo%", + "group": "platformScriptureEditor.general", + "order": 2, + "command": "platformScriptureEditor.showCopyrightInfo" + } + ] + }, + "contextMenu": { + "groups": {}, + "items": [] + } + } + } +} diff --git a/extensions/src/platform-scripture-editor/contributions/projectSettings.json b/extensions/src/platform-scripture-editor/contributions/projectSettings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/platform-scripture-editor/contributions/projectSettings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/platform-scripture-editor/contributions/settings.json b/extensions/src/platform-scripture-editor/contributions/settings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/platform-scripture-editor/contributions/settings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/platform-scripture-editor/cspell.json b/extensions/src/platform-scripture-editor/cspell.json new file mode 100644 index 0000000000..d78da5aafa --- /dev/null +++ b/extensions/src/platform-scripture-editor/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../../cspell.json" +} diff --git a/extensions/src/platform-scripture-editor/manifest.json b/extensions/src/platform-scripture-editor/manifest.json new file mode 100644 index 0000000000..d5672d7ed9 --- /dev/null +++ b/extensions/src/platform-scripture-editor/manifest.json @@ -0,0 +1,14 @@ +{ + "name": "platformScriptureEditor", + "version": "0.0.1", + "description": "Editor extension for Platform.Bible", + "author": "Paranext", + "license": "MIT", + "main": "src/main.ts", + "types": "src/types/platform-scripture-editor.d.ts", + "menus": "contributions/menus.json", + "settings": "contributions/settings.json", + "projectSettings": "contributions/projectSettings.json", + "localizedStrings": "contributions/localizedStrings.json", + "activationEvents": [] +} diff --git a/extensions/src/platform-scripture-editor/package.json b/extensions/src/platform-scripture-editor/package.json new file mode 100644 index 0000000000..91eec8bfa5 --- /dev/null +++ b/extensions/src/platform-scripture-editor/package.json @@ -0,0 +1,88 @@ +{ + "name": "platform-scripture-editor", + "version": "0.0.2", + "description": "Editor extension for Platform.Bible", + "main": "src/main.js", + "types": "src/types/platform-scripture-editor.d.ts", + "author": "Katherine Jensen", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "start:core": "cd ../../.. && npm run start", + "start": "npm run start:core", + "start:production": "echo unimplemented", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@biblionexus-foundation/platform-editor": "^0.6.3", + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/extensions/src/platform-scripture-editor/src/_commenting.scss b/extensions/src/platform-scripture-editor/src/_commenting.scss new file mode 100644 index 0000000000..b8bdd66644 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/_commenting.scss @@ -0,0 +1,560 @@ +/* stylelint-disable selector-class-pattern */ + +.Button__root { + padding-top: 10px; + padding-bottom: 10px; + padding-left: 15px; + padding-right: 15px; + border: 0; + background-color: #eee; + border-radius: 5px; + cursor: pointer; + font-size: 14px; +} + +.Button__root:hover { + background-color: #ddd; +} + +.Button__small { + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + font-size: 13px; +} + +.Button__disabled { + cursor: not-allowed; +} + +.Button__disabled:hover { + background-color: #eee; +} + +.ContentEditable__root { + border: 0; + font-size: 15px; + display: block; + position: relative; + outline: 0; + padding: 8px 28px 40px; + min-height: 150px; +} + +@media (max-width: 1025px) { + .ContentEditable__root { + padding-left: 8px; + padding-right: 8px; + } +} + +.Modal__overlay { + display: flex; + justify-content: center; + align-items: center; + position: fixed; + flex-direction: column; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(40, 40, 40, 0.6); + flex-grow: 0; + flex-shrink: 1px; + z-index: 100; +} + +.Modal__modal { + padding: 20px; + min-height: 100px; + min-width: 300px; + display: flex; + flex-grow: 0; + background-color: #fff; + flex-direction: column; + position: relative; + box-shadow: 0 0 20px 0 #444; + border-radius: 10px; +} + +.Modal__title { + color: #444; + margin: 0; + padding-bottom: 10px; + border-bottom: 1px solid #ccc; +} + +.Modal__closeButton { + border: 0; + position: absolute; + right: 20px; + border-radius: 20px; + justify-content: center; + align-items: center; + display: flex; + width: 30px; + height: 30px; + text-align: center; + cursor: pointer; + background-color: #eee; +} + +.Modal__closeButton:hover { + background-color: #ddd; +} + +.Modal__content { + padding-top: 20px; +} + +.Placeholder__root { + font-size: 15px; + color: #999; + overflow: hidden; + position: absolute; + text-overflow: ellipsis; + top: 8px; + left: 28px; + right: 28px; + user-select: none; + white-space: nowrap; + display: inline-block; + pointer-events: none; +} + +@media (max-width: 1025px) { + .Placeholder__root { + left: 8px; + } +} + +.CommentEditorTheme__paragraph { + margin: 0; + position: "relative"; +} + +.CommentPlugin_AddCommentBox { + display: block; + position: fixed; + border-radius: 20px; + background-color: white; + width: 40px; + height: 60px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + z-index: 10; +} + +.CommentPlugin_AddCommentBox_button { + border-radius: 20px; + border: 0; + background: none; + width: 40px; + height: 60px; + position: absolute; + top: 0; + left: 0; + cursor: pointer; +} + +.CommentPlugin_AddCommentBox_button:hover { + background-color: #f6f6f6; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +i.add-comment { + background-size: contain; + display: inline-block; + height: 20px; + width: 20px; + vertical-align: -10px; + background-image: url("/assets/images/icons/chat-left-text.svg"); +} + +.CommentPlugin_CommentInputBox { + display: block; + position: absolute; + width: 250px; + min-height: 80px; + background-color: #fff; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + border-radius: 5px; + z-index: 24; + animation: show-input-box 0.4s ease; +} + +.CommentPlugin_CommentInputBox::before { + content: ""; + position: absolute; + width: 0; + height: 0; + margin-left: 0.5em; + right: -1em; + top: 0; + left: calc(50% + 0.25em); + box-sizing: border-box; + border: 0.5em solid black; + border-color: transparent transparent #fff #fff; + transform-origin: 0 0; + transform: rotate(135deg); + box-shadow: -3px 3px 3px 0 rgba(0, 0, 0, 0.05); +} + +@keyframes show-input-box { + 0% { + opacity: 0; + transform: translateY(50px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.CommentPlugin_CommentInputBox_Buttons { + display: flex; + flex-direction: row; + padding: 0 10px 10px; + gap: 10px; +} + +.CommentPlugin_CommentInputBox_Button { + flex: 1; +} + +.CommentPlugin_CommentInputBox_Button.primary { + background-color: rgb(66, 135, 245); + font-weight: bold; + color: #fff; +} + +.CommentPlugin_CommentInputBox_Button.primary:hover { + background-color: rgb(53, 114, 211); +} + +.CommentPlugin_CommentInputBox_Button[disabled] { + background-color: #eee; + opacity: 0.5; + cursor: not-allowed; + font-weight: normal; + color: #444; +} + +.CommentPlugin_CommentInputBox_Button[disabled]:hover { + opacity: 0.5; + background-color: #eee; +} + +.CommentPlugin_CommentInputBox_EditorContainer { + position: relative; + margin: 10px; + border-radius: 5px; +} + +.CommentPlugin_CommentInputBox_Editor { + position: relative; + border: 1px solid #ccc; + background-color: #fff; + border-radius: 5px; + font-size: 15px; + caret-color: rgb(5, 5, 5); + display: block; + padding: 9px 10px 10px 9px; + min-height: 80px; +} + +.CommentPlugin_CommentInputBox_Editor:focus { + outline: 1px solid rgb(66, 135, 245); +} + +.CommentPlugin_ShowCommentsButton { + padding-top: 6px; + padding-bottom: 7px; + padding-left: 13px; + padding-right: 13px; + background-color: inherit; + border-radius: 10px; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +i.comments { + background-size: contain; + display: inline-block; + height: 20px; + width: 20px; + vertical-align: -10px; + background-image: url("/assets/images/icons/comments.svg"); + opacity: 0.5; + transition: opacity 0.2s linear; +} + +.CommentPlugin_ShowCommentsButton.Button__root:hover:not([disabled]) { + background-color: #eee; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +.CommentPlugin_ShowCommentsButton:hover i.comments { + opacity: 1; +} + +.CommentPlugin_ShowCommentsButton.active { + background-color: #ccc; +} + +.CommentPlugin_CommentsPanel { + width: 300px; + height: 100%; + background-color: #fff; + border-top-left-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + animation: show-comments 0.2s ease; +} + +@keyframes show-comments { + 0% { + opacity: 0; + transform: translateX(300px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.CommentPlugin_CommentsPanel_Heading { + padding: 16px; + margin: 0; + line-height: 16px; + border-bottom: 1px solid #eee; + font-size: 20px; + display: block; + color: #444; + text-overflow: ellipsis; + overflow: hidden; +} + +.CommentPlugin_CommentsPanel_Editor { + position: relative; + border: 1px solid #ccc; + background-color: #fff; + border-radius: 5px; + font-size: 15px; + caret-color: rgb(5, 5, 5); + display: block; + padding: 9px 10px 10px 9px; + min-height: 20px; +} + +.CommentPlugin_CommentsPanel_Editor::before { + content: ""; + width: 30px; + height: 20px; + float: right; +} + +.CommentPlugin_CommentsPanel_SendButton { + position: absolute; + right: 10px; + top: 8px; + background: none; +} + +.CommentPlugin_CommentsPanel_SendButton:hover { + background: none; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +i.send { + background-size: contain; + display: inline-block; + height: 20px; + width: 20px; + vertical-align: -10px; + background-image: url("/assets/images/icons/send.svg"); + opacity: 0.5; + transition: opacity 0.2s linear; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +.CommentPlugin_CommentsPanel_SendButton:hover i.send { + opacity: 1; + filter: invert(45%) sepia(98%) saturate(2299%) hue-rotate(201deg) brightness(100%) contrast(92%); +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +.CommentPlugin_CommentsPanel_SendButton[disabled] i.send { + opacity: 0.3; +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +.CommentPlugin_CommentsPanel_SendButton:hover[disabled] i.send { + opacity: 0.3; + filter: none; +} + +.CommentPlugin_CommentsPanel_Empty { + color: #777; + font-size: 15px; + text-align: center; + top: calc(50% - 15px); + margin: 0; + padding: 0; + width: inherit; +} + +.CommentPlugin_CommentsPanel_List { + padding: 0; + list-style-type: none; + margin: 0; + width: inherit; + overflow-y: auto; + height: calc(100% - 45px); +} + +.CommentPlugin_CommentsPanel_List_Comment { + padding: 15px 0 15px 15px; + margin: 0; + font-size: 14px; + position: relative; + transition: all 0.2s linear; +} + +.CommentPlugin_CommentsPanel_List_Thread.active .CommentPlugin_CommentsPanel_List_Comment:hover { + background-color: inherit; +} + +.CommentPlugin_CommentsPanel_List_Comment p { + margin: 0; + color: #444; +} + +.CommentPlugin_CommentsPanel_List_Details { + color: #444; + padding-bottom: 5px; + vertical-align: top; +} + +.CommentPlugin_CommentsPanel_List_Comment_Author { + font-weight: bold; + padding-right: 5px; +} + +.CommentPlugin_CommentsPanel_List_Comment_Time { + color: #999; +} + +.CommentPlugin_CommentsPanel_List_Thread { + padding: 0; + margin: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + position: relative; + transition: all 0.2s linear; + border-left: 0 solid #eee; +} + +.CommentPlugin_CommentsPanel_List_Thread:first-child, +.CommentPlugin_CommentsPanel_List_Thread + .CommentPlugin_CommentsPanel_List_Thread { + /* stylelint-disable-next-line declaration-property-value-disallowed-list */ + border-top: none; +} + +.CommentPlugin_CommentsPanel_List_Thread.interactive { + cursor: pointer; +} + +.CommentPlugin_CommentsPanel_List_Thread.interactive:hover { + background-color: #fafafa; +} + +.CommentPlugin_CommentsPanel_List_Thread.active { + background-color: #fafafa; + border-left: 15px solid #eee; + cursor: inherit; +} + +.CommentPlugin_CommentsPanel_List_Thread_QuoteBox { + padding-top: 10px; + color: #ccc; + display: block; +} + +.CommentPlugin_CommentsPanel_List_Thread_Quote { + margin: 0 10px; +} + +.CommentPlugin_CommentsPanel_List_Thread_Quote span { + color: #222; + background-color: rgba(255, 212, 0, 0.4); + padding: 1px; + line-height: 1.4; + display: inline; + font-weight: bold; +} + +.CommentPlugin_CommentsPanel_List_Thread_Comments { + padding-left: 10px; + list-style-type: none; +} + +.CommentPlugin_CommentsPanel_List_Thread_Comments + .CommentPlugin_CommentsPanel_List_Comment:first-child { + /* stylelint-disable-next-line declaration-property-value-disallowed-list */ + border: none; + margin-left: 0; + padding-left: 5px; +} + +.CommentPlugin_CommentsPanel_List_Thread_Comments + .CommentPlugin_CommentsPanel_List_Comment:first-child.CommentPlugin_CommentsPanel_List_Comment:last-child { + padding-bottom: 5px; +} + +.CommentPlugin_CommentsPanel_List_Thread_Comments .CommentPlugin_CommentsPanel_List_Comment { + padding-left: 10px; + border-left: 5px solid #eee; + margin-left: 5px; +} + +.CommentPlugin_CommentsPanel_List_Thread_Editor { + position: relative; + padding-top: 1px; +} + +.CommentPlugin_CommentsPanel_List_DeleteButton { + position: absolute; + top: 10px; + right: 10px; + width: 30px; + height: 30px; + background-color: transparent; + opacity: 0; +} + +.CommentPlugin_CommentsPanel_DeletedComment, +.CommentPlugin_CommentsPanel_List_Comment:hover .CommentPlugin_CommentsPanel_List_DeleteButton, +.CommentPlugin_CommentsPanel_List_Thread_QuoteBox:hover + .CommentPlugin_CommentsPanel_List_DeleteButton { + opacity: 0.5; +} + +.CommentPlugin_CommentsPanel_List_DeleteButton:hover { + background-color: transparent; + opacity: 1; + filter: invert(45%) sepia(98%) saturate(2299%) hue-rotate(201deg) brightness(100%) contrast(92%); +} + +/* stylelint-disable-next-line selector-no-qualifying-type */ +.CommentPlugin_CommentsPanel_List_DeleteButton i.delete { + background-size: contain; + position: absolute; + left: 5px; + top: 5px; + height: 15px; + width: 15px; + vertical-align: -10px; + background-image: url("/assets/images/icons/trash3.svg"); + transition: opacity 0.2s linear; +} diff --git a/extensions/src/platform-scripture-editor/src/_editor-overrides.scss b/extensions/src/platform-scripture-editor/src/_editor-overrides.scss new file mode 100644 index 0000000000..016c2e4ca1 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/_editor-overrides.scss @@ -0,0 +1,447 @@ +/* Platform.Bible image protocol overrides */ +/* stylelint-disable selector-no-qualifying-type */ +// this is required for many overwrites +/* stylelint-disable selector-class-pattern */ + +// Platform.Bible modifications + +.editor-container { + max-width: none; + color: hsl(var(--foreground)); + + // remove rounded top corners to look better in tabs + .toolbar { + border-bottom: 1px solid hsl(var(--border)); + border-top-left-radius: 0; + border-top-right-radius: 0; + + background-color: hsl(var(--background)); + color: hsl(var(--color)); + } +} + +// text selection +:focus ::selection { + color: hsl(var(--primary-foreground)); + background-color: hsl(var(--primary)); +} + +::selection { + color: hsl(var(--secondary-foreground)); + background-color: hsl(var(--secondary)); +} + +// focus ring +:focus-visible, +.CommentPlugin_CommentInputBox_Editor:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-width: 2px; + --tw-ring-color: hsl(var(--ring)); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) + var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) + var(--tw-ring-color); + --tw-ring-offset-color: hsl(var(--background)); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +// buttons + +// icon button variant "ghost" +.Button__root, +button.toolbar-item { + color: hsl(var(--foreground)); + + i, + i.format { + opacity: unset; + } + + &:disabled i, + &:disabled i.format { + opacity: 0.5; + } +} + +// hover button, input button +.CommentPlugin_CommentsPanel_SendButton, +.CommentPlugin_CommentsPanel_List_DeleteButton { + color: hsl(var(--accent-foreground)); +} + +// text button variant "ghost" on popover +.Modal__closeButton { + color: hsl(var(--popover-foreground)); + background-color: hsl(var(--popover)); +} + +// toggle button +.CommentPlugin_ShowCommentsButton.active { + background-color: hsl(var(--accent)); +} + +// hover and active states +.toolbar-item:hover:not([disabled]), +.toolbar-item:active:not([disabled]), +.CommentPlugin_ShowCommentsButton.Button__root:hover:not([disabled]), +.CommentPlugin_AddCommentBox_button.Button__root:hover:not([disabled]), // needs to be overwritten +.CommentPlugin_AddCommentBox:hover:not([disabled]), // fills until the border +.CommentPlugin_CommentsPanel_SendButton:hover:not([disabled]), +.CommentPlugin_CommentsPanel_SendButton:active:not([disabled]), +.CommentPlugin_CommentsPanel_List_DeleteButton:hover:not([disabled]), +.CommentPlugin_CommentsPanel_List_DeleteButton:active:not([disabled]), +.Modal__closeButton:hover:not([disabled]) { + color: hsl(var(--accent-foreground)); + background-color: hsl(var(--accent)); +} + +.CommentPlugin_CommentsPanel_List_DeleteButton:hover, +.CommentPlugin_CommentsPanel_SendButton:hover i.send, +.CommentPlugin_CommentsPanel_DeletedComment, +.CommentPlugin_CommentsPanel_List_Comment:hover .CommentPlugin_CommentsPanel_List_DeleteButton, +.CommentPlugin_CommentsPanel_List_Thread_QuoteBox:hover + .CommentPlugin_CommentsPanel_List_DeleteButton { + filter: unset; + opacity: unset; +} + +// toolbar + +.toolbar .toolbar-item .text { + color: hsl(var(--foreground)); +} + +.toolbar .divider { + background-color: hsl(var(--border)); +} + +.dropdown { + background-color: hsl(var(--popover)); + + .item { + color: hsl(var(--popover-foreground)); + background-color: hsl(var(--popover)); + } + + .item:hover { + background-color: hsl(var(--accent)); + color: hsl(var(--accent-foreground)); + } + + .divider { + background-color: hsl(var(--muted)); + } +} + +// make the toolbar shrink and grow dynamically +// work around https://github.com/BiblioNexus-Foundation/scripture-editors/issues/126 +.toolbar-item.block-controls { + max-width: calc(100% - 140px); + + .icon.block-marker.nb { + min-width: 20px; + } + + .chevron-down { + min-width: 16px; + } +} + +.toolbar .toolbar-item .icon { + min-width: 20px; +} + +// _commenting.scss + +.CommentPlugin_CommentInputBox, +.Modal__modal { + background-color: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); + + &::before { + background-color: hsl(var(--popover)); + border-color: transparent transparent hsl(var(--popover)) hsl(var(--popover)); + } + + .Button__root { + background-color: hsl(var(--secondary)); + color: hsl(var(--secondary-foreground)); + } + + .Button__root.primary { + background-color: hsl(var(--primary)); + color: hsl(var(--primary-foreground)); + } + + .Button__root:hover:not([disabled]) { + opacity: 0.8; + } +} + +.typeahead-popover, +.typeahead-popover li { + background-color: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); +} + +.typeahead-popover ul li.selected, +.typeahead-popover li:hover { + background-color: hsl(var(--accent)); + color: hsl(var(--accent-foreground)); +} + +.CommentPlugin_CommentInputBox_Editor, +.CommentPlugin_CommentsPanel_Editor { + background-color: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); + border-color: hsl(var(--border)); + caret-color: hsl(var(--foreground)); +} + +.CommentPlugin_CommentsPanel_Heading, +.CommentPlugin_CommentsPanel_List_Thread { + border-color: hsl(var(--border)); +} + +.CommentPlugin_ShowCommentsButton { + z-index: 10; + right: 26px; +} + +// work around https://github.com/BiblioNexus-Foundation/scripture-editors/issues/127 +.CommentPlugin_AddCommentBox { + left: unset !important; + right: 0 !important; + + background-color: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); + border: 1px solid hsl(var(--border)); +} + +.CommentPlugin_AddCommentBox_button { + color: hsl(var(--popover-foreground)); + + &:hover { + background-color: hsl(var(--accent)); + color: hsl(var(--accent-foreground)); + } +} + +.CommentPlugin_CommentsPanel { + background-color: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); +} + +.CommentPlugin_CommentsPanel_SendButton { + margin: 10px; + top: 0; + right: 0; +} + +// inside the editor + +.editor-inner { + background: hsl(var(--background)); +} + +.formatted-font .verse { + background-color: hsl(var(--secondary)); +} + +// icons + +button { + i, + i.chevron-down, + .icon { + -webkit-mask-size: contain; + -webkit-mask-position: center; + background-color: currentColor; + } +} + +i.add-comment { + // could be replaced with lucid icon message-square-text + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/chat-left-text.svg'); + background-image: none; +} + +i.comments { + // could be replaced with lucid icon messages-square + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/comments.svg'); + background-image: none; +} + +i.send { + // could be replaced with lucid icon send + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/send.svg'); + background-image: none; +} + +.CommentPlugin_CommentsPanel_List_DeleteButton i.delete { + // could be replaced with lucid icon trash-2 + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/trash3.svg'); + background-image: none; + // linting does not like a duplicate rule, therefore putting it in here. + // overwriting requires this exact selector (or a more specific one) + left: 8px; + top: 8px; +} + +// _editor.scss + +.link-editor div.link-edit { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/pencil-fill.svg'); + background-image: none; +} + +i.undo { + // could be replaced with lucid icon rotate-ccw + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/arrow-counterclockwise.svg'); + background-image: none; +} + +i.redo { + // could be replaced with lucid icon rotate-cw + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/arrow-clockwise.svg'); + background-image: none; +} + +%paragraph { + // could be replaced with lucid icon text + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/text-paragraph.svg'); + background-image: none; +} + +%h-one { + // could be replaced with lucid icon heading-1 + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h1.svg'); + background-image: none; +} + +%h-two { + // could be replaced with lucid icon heading-2 + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h2.svg'); + background-image: none; +} + +%h-three { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h3.svg'); + background-image: none; +} + +%square-one { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/1-square.svg'); + background-image: none; +} + +%square-two { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/2-square.svg'); + background-image: none; +} + +%square-three { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/3-square.svg'); + background-image: none; +} + +%square-four { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/4-square.svg'); + background-image: none; +} + +%bookmark { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/bookmark.svg'); + background-image: none; +} + +%file-earmark { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/file-earmark.svg'); + background-image: none; +} + +.icon.bullet-list, +.icon.ul { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/list-ul.svg'); + background-image: none; +} + +.icon.numbered-list, +.icon.ol { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/list-ol.svg'); + background-image: none; +} + +%quote { + // could be replaced with lucid icon message-square-quote + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/chat-square-quote.svg'); + background-image: none; +} + +.icon.ban { + // could be replaced with lucid icon lucide-ban + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/ban.svg'); + background-image: none; +} + +.icon.code { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/code.svg'); + background-image: none; +} + +i.bold { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-bold.svg'); + background-image: none; +} + +i.italic { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-italic.svg'); + background-image: none; +} + +i.underline { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-underline.svg'); + background-image: none; +} + +i.strikethrough { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-strikethrough.svg'); + background-image: none; +} + +i.code { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/code.svg'); + background-image: none; +} + +i.link { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/link.svg'); + background-image: none; +} + +i.left-align { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/text-left.svg'); + background-image: none; +} + +i.center-align { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/text-center.svg'); + background-image: none; +} + +i.right-align { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/text-right.svg'); + background-image: none; +} + +i.justify-align { + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/justify.svg'); + background-image: none; +} + +i.chevron-down { + // could be replaced with lucid icon chevron-down + -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/chevron-down.svg'); + background-image: none; +} diff --git a/extensions/src/platform-scripture-editor/src/_editor.scss b/extensions/src/platform-scripture-editor/src/_editor.scss new file mode 100644 index 0000000000..fee33708c4 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/_editor.scss @@ -0,0 +1,858 @@ +/* stylelint-disable selector-no-qualifying-type */ + +/* Lexical */ + +.editor-container { + margin: 0 auto 20px; + border-radius: 2px; + max-width: 600px; + color: #000; + position: relative; + line-height: 20px; + font-weight: 400; + text-align: start; + border-top-left-radius: 10px; + border-top-right-radius: 10px; +} + +.editor-inner { + background: #fff; + position: relative; + display: flex; +} + +.editor-input { + min-height: 150px; + resize: none; + font-size: 15px; + position: relative; + tab-size: 1; + outline: 0; + padding: 15px 10px; + caret-color: #444; + flex: auto; +} + +.editor-input > p { + direction: inherit; + margin-top: 0; + margin-bottom: 0; + line-height: 1.5; +} + +.editor-placeholder { + color: #999; + overflow: hidden; + position: absolute; + text-overflow: ellipsis; + top: 15px; + font-size: 15px; + user-select: none; + display: inline-block; + pointer-events: none; + margin-block-start: 1em; + margin-inline-start: calc(10px + 2.5vw); + width: fill-available; +} + +.editor-text-bold { + font-weight: bold; +} + +.editor-text-italic { + font-style: italic; +} + +.editor-text-underline { + text-decoration: underline; +} + +.editor-text-strikethrough { + text-decoration: line-through; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-text-underlineStrikethrough { + text-decoration: underline line-through; +} + +.editor-text-code { + background-color: rgb(240, 242, 245); + padding: 1px 0.25rem; + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 94%; +} + +.editor-link { + color: rgb(33, 111, 219); + text-decoration: none; +} + +.tree-view-output { + display: block; + background: #222; + color: #fff; + padding: 5px; + font-size: 12px; + white-space: pre-wrap; + margin: 1px auto 10px; + max-height: 250px; + position: relative; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + overflow: auto; + line-height: 14px; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenComment { + color: slategray; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenPunctuation { + color: #999; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenProperty { + color: #905; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenSelector { + color: #690; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenOperator { + color: #9a6e3a; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenAttr { + color: #07a; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenVariable { + color: #e90; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-tokenFunction { + color: #dd4a68; +} + +.editor-typed-mark-spelling { + background: inherit; + text-decoration: underline wavy red; +} + +.editor-typed-mark-grammar { + background: inherit; + text-decoration: underline wavy grey; +} + +.editor-typed-mark-other { + background: inherit; + text-decoration: underline wavy green; +} + +.editor-typed-mark-spelling.editor-typed-mark-grammar { + text-decoration-color: rgb(192, 64, 64); +} + +.editor-typed-mark-spelling.editor-typed-mark-grammar.editor-typed-mark-other { + text-decoration-color: rgb(128, 85, 43); +} + +.editor-typed-mark-comment { + background: rgba(255, 212, 0, 0.14); + border-bottom: 2px solid rgba(255, 212, 0, 0.3); + padding-bottom: 2px; +} + +.editor-typed-mark-comment.selected { + background: rgba(255, 212, 0, 0.5); + border-bottom: 2px solid rgba(255, 212, 0, 1); +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-typed-markOverlap-comment { + background: rgba(255, 212, 0, 0.3); + border-bottom: 2px solid rgba(255, 212, 0, 0.7); +} + +/* stylelint-disable-next-line selector-class-pattern */ +.editor-typed-markOverlap-comment.selected { + background: rgba(255, 212, 0, 0.7); + border-bottom: 2px solid rgba(255, 212, 0, 0.7); +} + +.editor-paragraph { + margin: 0; + margin-bottom: 8px; + position: relative; +} + +.editor-paragraph:last-child { + margin-bottom: 0; +} + +pre::-webkit-scrollbar { + background: transparent; + width: 10px; +} + +pre::-webkit-scrollbar-thumb { + background: #999; +} + +.link-editor { + position: absolute; + z-index: 100; + top: -10000px; + left: -10000px; + margin-top: -6px; + max-width: 300px; + width: 100%; + opacity: 0; + background-color: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); + border-radius: 8px; + transition: opacity 0.5s; +} + +.link-editor .link-input { + display: block; + width: calc(100% - 24px); + box-sizing: border-box; + margin: 8px 12px; + padding: 8px 12px; + border-radius: 15px; + background-color: #eee; + font-size: 15px; + color: rgb(5, 5, 5); + border: 0; + outline: 0; + position: relative; + font-family: inherit; +} + +.link-editor div.link-edit { + background-image: url("/assets/images/icons/pencil-fill.svg"); + background-size: 16px; + background-position: center; + background-repeat: no-repeat; + width: 35px; + vertical-align: -0.25em; + position: absolute; + top: 0; + bottom: 0; + cursor: pointer; +} + +.link-editor[dir="ltr"] div.link-edit { + right: 0; +} + +.link-editor[dir="rtl"] div.link-edit { + left: 0; +} + +.link-editor .link-input a { + color: rgb(33, 111, 219); + text-decoration: none; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.link-editor[dir="ltr"] .link-input a { + margin-right: 30px; +} + +.link-editor[dir="rtl"] .link-input a { + margin-left: 30px; +} + +.link-editor .link-input a:hover { + text-decoration: underline; +} + +.link-editor .button { + width: 20px; + height: 20px; + display: inline-block; + padding: 6px; + border-radius: 8px; + cursor: pointer; + margin: 0 2px; +} + +.link-editor .button.hovered { + width: 20px; + height: 20px; + display: inline-block; + background-color: #eee; +} + +.dropdown { + z-index: 100; + display: block; + position: fixed; + box-shadow: + 0 12px 28px 0 rgba(0, 0, 0, 0.2), + 0 2px 4px 0 rgba(0, 0, 0, 0.1), + inset 0 0 0 1px rgba(255, 255, 255, 0.5); + border-radius: 8px; + min-height: 40px; + background-color: #fff; +} + +.dropdown .item { + margin: 0 8px; + padding: 8px; + color: #050505; + cursor: pointer; + line-height: 16px; + font-size: 15px; + display: flex; + align-content: center; + flex-direction: row; + flex-shrink: 0; + justify-content: space-between; + background-color: #fff; + border-radius: 8px; + border: 0; + max-width: 250px; +} + +.dropdown .item.block-marker { + min-width: 420px; +} + +.dropdown .item.fontsize-item, +.dropdown .item.fontsize-item .text { + min-width: unset; +} + +.dropdown .item .active { + display: flex; + width: 20px; + height: 20px; + background-size: contain; +} + +.dropdown .item:first-child { + margin-top: 8px; +} + +.dropdown .item:last-child { + margin-bottom: 8px; +} + +.dropdown .item:hover { + background-color: #eee; +} + +.dropdown .item .text { + display: flex; + line-height: 20px; + flex-grow: 1; + min-width: 150px; + margin: 0; + text-indent: 0; +} + +.dropdown .item .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 12px; + line-height: 16px; + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} + +.dropdown .divider { + width: auto; + background-color: #eee; + margin: 4px 8px; + height: 1px; +} + +button.item.dropdown-item-active { + background-color: rgba(223, 232, 250, 0.3); +} + +button.item.dropdown-item-active i { + opacity: 1; +} + +i.undo { + background-image: url('/assets/images/icons/arrow-counterclockwise.svg'); +} + +i.redo { + background-image: url('/assets/images/icons/arrow-clockwise.svg'); +} + +%paragraph { + background-image: url('/assets/images/icons/text-paragraph.svg'); +} + +.icon.m, +.icon.nb, +.icon.p, +.icon.pi, +.icon.paragraph { + @extend %paragraph; +} + +%h-one { + background-image: url('/assets/images/icons/type-h1.svg'); +} + +.icon.ms, +.icon.ms1, +.icon.r, +.icon.s, +.icon.large-heading, +.icon.h1 { + @extend %h-one; +} + +%h-two { + background-image: url('/assets/images/icons/type-h2.svg'); +} + +.icon.ms2, +.icon.small-heading, +.icon.h2 { + @extend %h-two; +} + +%h-three { + background-image: url('/assets/images/icons/type-h3.svg'); +} + +.icon.ms3, +.icon.h3 { + @extend %h-three; +} + + +%square-one { + background-image: url("/assets/images/icons/1-square.svg"); +} + +.icon.mt, +.icon.mt1, +.icon.square-1 { + @extend %square-one; +} + +%square-two { + background-image: url("/assets/images/icons/2-square.svg"); +} + +.icon.mt2, +.icon.square-2 { + @extend %square-two; +} + +%square-three { + background-image: url("/assets/images/icons/3-square.svg"); +} + +.icon.mt3, +.icon.square-3 { + @extend %square-three; +} + +%square-four { + background-image: url("/assets/images/icons/4-square.svg"); +} + +.icon.mt4, +.icon.square-4 { + @extend %square-four; +} + +%bookmark { + background-image: url("/assets/images/icons/bookmark.svg"); +} + +.icon.cl, +.icon.bookmark { + @extend %bookmark; +} + +%file-earmark { + background-image: url("/assets/images/icons/file-earmark.svg"); +} + +.icon.ide, +.icon.h, +.icon.h1, +.icon.h2, +.icon.h3, +.icon.toc1, +.icon.toc2, +.icon.toc3, +.icon.file-earmark { + @extend %file-earmark; +} + +.icon.bullet-list, +.icon.ul { + background-image: url('/assets/images/icons/list-ul.svg'); +} + +.icon.numbered-list, +.icon.ol { + background-image: url('/assets/images/icons/list-ol.svg'); +} + +%quote { + background-image: url('/assets/images/icons/chat-square-quote.svg'); +} + +.icon.b, +.icon.q1, +.icon.q2, +.icon.quote { + @extend %quote; +} + +.icon.ban { + background-image: url('/assets/images/icons/ban.svg'); +} + +.icon.code { + background-image: url('/assets/images/icons/code.svg'); +} + +i.bold { + background-image: url('/assets/images/icons/type-bold.svg'); +} + +i.italic { + background-image: url('/assets/images/icons/type-italic.svg'); +} + +i.underline { + background-image: url('/assets/images/icons/type-underline.svg'); +} + +i.strikethrough { + background-image: url('/assets/images/icons/type-strikethrough.svg'); +} + +i.code { + background-image: url('/assets/images/icons/code.svg'); +} + +i.link { + background-image: url('/assets/images/icons/link.svg'); +} + +i.left-align { + background-image: url('/assets/images/icons/text-left.svg'); +} + +i.center-align { + background-image: url('/assets/images/icons/text-center.svg'); +} + +i.right-align { + background-image: url('/assets/images/icons/text-right.svg'); +} + +i.justify-align { + background-image: url('/assets/images/icons/justify.svg'); +} + +.actions i { + background-size: contain; + display: inline-block; + height: 15px; + width: 5px; + vertical-align: -0.25em; +} + +i.chevron-down { + background-color: transparent; + background-size: contain; + display: inline-block; + height: 8px; + width: 8px; + background-image: url("/assets/images/icons/chevron-down.svg"); +} + +.debug-timetravel-panel { + overflow: hidden; + padding: 0 0 10px; + margin: auto; + display: flex; +} + +.debug-timetravel-panel-slider { + padding: 0; + flex: 8; +} + +.debug-timetravel-panel-button { + padding: 0; + border: 0; + background: none; + flex: 1; + color: #fff; + font-size: 12px; +} + +.debug-timetravel-panel-button:hover { + text-decoration: underline; +} + +.debug-timetravel-button { + border: 0; + padding: 0; + font-size: 12px; + top: 10px; + right: 15px; + position: absolute; + background: none; + color: #fff; +} + +.debug-timetravel-button:hover { + text-decoration: underline; +} + +.toolbar { + display: flex; + margin-bottom: 1px; + background: #fff; + padding: 4px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + vertical-align: middle; + overflow: auto; + height: 36px; + position: sticky; + top: 0; + z-index: 2; +} + +button.toolbar-item { + border: 0; + display: flex; + background: none; + border-radius: 10px; + padding: 8px; + cursor: pointer; + vertical-align: middle; + flex-shrink: 0; + align-items: center; + justify-content: space-between; +} + +button.toolbar-item:disabled { + cursor: not-allowed; +} + +button.toolbar-item.spaced { + margin-right: 2px; +} + +button.toolbar-item i.format { + background-size: contain; + height: 18px; + width: 18px; + vertical-align: -0.25em; + display: flex; + opacity: 0.6; +} + +button.toolbar-item:disabled .icon, +button.toolbar-item:disabled .text, +button.toolbar-item:disabled i.format, +button.toolbar-item:disabled .chevron-down { + opacity: 0.2; +} + +button.toolbar-item.active { + background-color: rgba(223, 232, 250, 0.3); +} + +button.toolbar-item.active i { + opacity: 1; +} + +.toolbar-item:hover:not([disabled]) { + background-color: #eee; +} + +.toolbar-item.font-family .text { + display: block; + max-width: 40px; +} + +.toolbar .code-language { + width: 150px; +} + +.toolbar .toolbar-item .text { + line-height: 20px; + vertical-align: middle; + font-size: 14px; + color: #777; + text-overflow: ellipsis; + overflow: hidden; + width: 170px; + white-space: nowrap; + display: inline-block; + height: 20px; + text-align: start; + padding-right: 10px; +} + +.toolbar .toolbar-item .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 8px; + line-height: 16px; + background-size: contain; +} + +.toolbar i.chevron-down, +.toolbar-item i.chevron-down { + margin-top: 3px; + width: 16px; + height: 16px; + display: flex; + user-select: none; +} + +.toolbar i.chevron-down.inside { + width: 16px; + height: 16px; + display: flex; + margin-left: -25px; + margin-top: 11px; + margin-right: 10px; + pointer-events: none; +} + +.toolbar .divider { + width: 1px; + background-color: #eee; + margin: 0 4px; +} + +/* ContextMenuPlugin */ + +.auto-embed-menu { + width: 150px; +} + +.typeahead-popover { + background: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); + border-radius: 8px; +} + +.typeahead-popover ul { + padding: 0; + list-style: none; + margin: 0; + border-radius: 8px; + max-height: 200px; + overflow-y: scroll; + -ms-overflow-style: none; + scrollbar-width: none; +} + +.typeahead-popover ul::-webkit-scrollbar { + display: none; +} + +.typeahead-popover ul li { + margin: 0; + min-width: 180px; + font-size: 14px; + outline: none; + cursor: pointer; + border-radius: 8px; +} + +.typeahead-popover ul li.selected { + background: #eee; +} + +.typeahead-popover ul li.disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.typeahead-popover li { + margin: 0 8px; + padding: 8px; + color: #050505; + cursor: pointer; + line-height: 16px; + font-size: 15px; + display: flex; + align-content: center; + flex-direction: row; + flex-shrink: 0; + background-color: #fff; + border-radius: 8px; + border: 0; +} + +.typeahead-popover li.active { + display: flex; + width: 20px; + height: 20px; + background-size: contain; +} + +.typeahead-popover li:first-child { + border-radius: 8px 8px 0 0; +} + +.typeahead-popover li:last-child { + border-radius: 0 0 8px 8px; +} + +.typeahead-popover li:hover { + background-color: #eee; +} + +.typeahead-popover li .text { + display: flex; + line-height: 20px; + flex-grow: 1; + min-width: 150px; +} + +.typeahead-popover li .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 8px; + line-height: 16px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} diff --git a/extensions/src/platform-scripture-editor/src/_usj-nodes.scss b/extensions/src/platform-scripture-editor/src/_usj-nodes.scss new file mode 100644 index 0000000000..a1b4d206d2 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/_usj-nodes.scss @@ -0,0 +1,2316 @@ +/* stylelint-disable */ + +/* Sample styles for USJ Nodes */ + +.leadingFloat { + float: start; +} +.clearFloat { + clear: both; +} +.align_start { + text-align: start; +} +.align_center { + text-align: center; +} +.align_end { + text-align: end; +} +@font-face { + font-family: "Charis SIL"; + src: local("Charis SIL"), local("Charis SIL Bold"), local("Charis SIL Bold Italic"), + local("Charis SIL Italic"), url("file:///C:/Windows/Fonts/CharisSIL-B.ttf"); + font-weight: normal; +} +@font-face { + font-family: "Charis SIL"; + src: local("Charis SIL Bold"); + font-weight: bold; +} +@font-face { + font-family: "Charis SIL"; + src: local("Charis SIL Italic"); + font-style: italic; +} +@font-face { + font-family: "Charis SIL"; + src: local("Charis SIL Bold Italic"); + font-weight: bold; + font-style: italic; +} +.formatted-font .usfm { + font-family: "Charis SIL"; + font-size: 12pt; +} + +/* BookNode */ + +.formatted-font .usfm_id { + font-size: 100%; +} + +.book[data-code]::before { + content: attr(data-code) " "; +} + +/* ChapterNode, ImmutableChapterNode */ + +.formatted-font .usfm_c { + display: block; + font-weight: bold; + font-size: 150%; +} +.text-spacing .usfm_c { + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_ca { + color: #007306; + font-size: 133%; + font-style: italic; +} + +.formatted-font .usfm_cp { + font-weight: bold; + color: #003380; + font-size: 150%; +} +.text-spacing .usfm_cp { + margin-bottom: 4pt; + margin-top: 8pt; +} + +/* VerseNode, ImmutableVerseNode */ + +.formatted-font .usfm_v { + font-size: 100%; + vertical-align: text-top; + font-size: 66%; +} +.text-spacing .usfm_v { + white-space: nowrap; + unicode-bidi: embed; +} + +.formatted-font .usfm_va { + color: #007306; + font-size: 100%; + vertical-align: text-top; + font-size: 66%; +} + +.formatted-font .usfm_vp { + color: #003380; + font-size: 100%; + vertical-align: text-top; + font-size: 66%; +} + +/* ParaNode */ + +.formatted-font .usfm_usfm { + font-size: 100%; +} + +.formatted-font .usfm_ide { + font-size: 100%; +} + +.formatted-font .usfm_h { + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_h1 { + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_h2 { + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_h3 { + font-size: 100%; +} + +.formatted-font .usfm_toc1 { + font-weight: bold; + color: #004c00; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_toc2 { + color: #004c00; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_toc3 { + font-weight: bold; + color: #e05858; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_toca1 { + color: #8c8c8c; + font-size: 83%; + font-style: italic; +} + +.formatted-font .usfm_toca2 { + color: #8c8c8c; + font-size: 83%; + font-style: italic; +} + +.formatted-font .usfm_toca3 { + color: #8c8c8c; + font-size: 83%; + font-style: italic; +} + +.formatted-font .usfm_rem { + color: #003380; + font-size: 100%; +} + +.formatted-font .usfm_sts { + color: #003380; + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_restore { + color: #003380; + font-size: 100%; +} + +.formatted-font .usfm_imt { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_imt { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_imt1 { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_imt1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_imt2 { + font-size: 108%; + font-style: italic; +} +.text-spacing .usfm_imt2 { + text-align: center; + margin-bottom: 3pt; + margin-top: 6pt; +} + +.formatted-font .usfm_imt3 { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_imt3 { + text-align: center; + margin-bottom: 2pt; + margin-top: 2pt; +} + +.formatted-font .usfm_imt4 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_imt4 { + text-align: center; + margin-bottom: 2pt; + margin-top: 2pt; +} + +.formatted-font .usfm_imte { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_imte { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +/* check if deprecated */ +.formatted-font .usfm_imte1 { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_imte1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +/* check if deprecated */ +.formatted-font .usfm_imte2 { + font-size: 133%; + font-style: italic; +} +.text-spacing .usfm_imte2 { + text-align: center; + margin-bottom: 2pt; +} + +.formatted-font .usfm_is { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_is { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_is1 { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_is1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_is2 { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_is2 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_iot { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_iot { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_io { + font-size: 100%; +} +.text-spacing[dir="ltr"] .usfm_io { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_io { + margin-right: 10vw; +} + +.formatted-font .usfm_io1 { + font-size: 100%; +} +.text-spacing[dir="ltr"] .usfm_io1 { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_io1 { + margin-right: 10vw; +} + +.formatted-font .usfm_io2 { + font-size: 100%; +} +.text-spacing[dir="ltr"] .usfm_io2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_io2 { + margin-right: 15vw; +} + +.formatted-font .usfm_io3 { + font-size: 100%; +} +.text-spacing[dir="ltr"] .usfm_io3 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_io3 { + margin-right: 20vw; +} + +.formatted-font .usfm_io4 { + font-size: 100%; +} +.text-spacing[dir="ltr"] .usfm_io4 { + margin-left: 25vw; +} +.text-spacing[dir="rtl"] .usfm_io4 { + margin-right: 25vw; +} + +.formatted-font .usfm_ior { + font-size: 100%; +} + +.formatted-font .usfm_ip { + font-size: 100%; +} +.text-spacing .usfm_ip { + text-indent: 2.5vw; +} + +/* check if deprecated */ +.formatted-font .usfm_im { + font-size: 100%; +} + +.formatted-font .usfm_ipi { + font-size: 100%; +} +.text-spacing .usfm_ipi { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +/* check if deprecated */ +.formatted-font .usfm_imi { + font-size: 100%; +} +.text-spacing .usfm_imi { + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_ili { + font-size: 100%; +} +.text-spacing .usfm_ili { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_ili { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_ili { + margin-right: 10vw; +} + +.formatted-font .usfm_ili1 { + font-size: 100%; +} +.text-spacing .usfm_ili1 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_ili1 { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_ili1 { + margin-right: 10vw; +} + +.formatted-font .usfm_ili2 { + font-size: 100%; +} +.text-spacing .usfm_ili2 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_ili2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_ili2 { + margin-right: 15vw; +} + +.formatted-font .usfm_ipq { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_ipq { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_imq { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_imq { + margin-left: 5vw; + margin-right: 5vw; +} + +.usfm_ipr { + text-align: end; +} +.formatted-font .usfm_ipr { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_ipr { + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_ib { + font-size: 83%; +} + +/* check if deprecated */ +.formatted-font .usfm_iq { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_iq { + text-indent: -15vw; +} +.text-spacing[dir="ltr"] .usfm_iq { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_iq { + margin-right: 20vw; +} + +/* check if deprecated */ +.formatted-font .usfm_iq1 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_iq1 { + text-indent: -15vw; +} +.text-spacing[dir="ltr"] .usfm_iq1 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_iq1 { + margin-right: 20vw; +} + +/* check if deprecated */ +.formatted-font .usfm_iq2 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_iq2 { + text-indent: -10vw; +} +.text-spacing[dir="ltr"] .usfm_iq2 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_iq2 { + margin-right: 20vw; +} + +/* check if deprecated */ +.formatted-font .usfm_iq3 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_iq3 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_iq3 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_iq3 { + margin-right: 20vw; +} + +.formatted-font .usfm_iex { + font-size: 100%; +} +.text-spacing .usfm_iex { + text-indent: 2.5vw; + margin-bottom: 4pt; + margin-top: 4pt; +} + +/* check if deprecated */ +.formatted-font .usfm_iqt { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_ie { + font-size: 83%; +} + +.formatted-font .usfm_cl { + font-weight: bold; + font-size: 150%; +} +.text-spacing .usfm_cl { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_cd { + font-size: 91%; +} +.text-spacing .usfm_cd { + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_p { + font-size: 100%; +} +.text-spacing .usfm_p { + text-indent: 2.5vw; +} + +.formatted-font .usfm_m { + font-size: 100%; +} + +.formatted-font .usfm_po { + font-size: 100%; +} +.text-spacing .usfm_po { + text-indent: 2.5vw; + margin-bottom: 4pt; + margin-top: 4pt; +} + +.usfm_pr { + text-align: end; +} +.formatted-font .usfm_pr { + font-size: 100%; +} + +.usfm_cls { + text-align: end; +} +.formatted-font .usfm_cls { + font-size: 100%; +} + +.formatted-font .usfm_pmo { + font-size: 100%; +} +.text-spacing .usfm_pmo { + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_pm { + font-size: 100%; +} +.text-spacing .usfm_pm { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_pmc { + font-size: 100%; +} +.text-spacing .usfm_pmc { + margin-left: 5vw; + margin-right: 5vw; +} + +.usfm_pmr { + text-align: end; +} +.formatted-font .usfm_pmr { + font-size: 100%; +} +.text-spacing .usfm_pmr { + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_pi { + font-size: 100%; +} +.text-spacing .usfm_pi { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_pi1 { + font-size: 100%; +} +.text-spacing .usfm_pi1 { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_pi2 { + font-size: 100%; +} +.text-spacing .usfm_pi2 { + text-indent: 2.5vw; +} +.text-spacing[dir="ltr"] .usfm_pi2 { + margin-left: 10vw; + margin-right: 5vw; +} +.text-spacing[dir="rtl"] .usfm_pi2 { + margin-left: 5vw; + margin-right: 10vw; +} + +.formatted-font .usfm_pi3 { + font-size: 100%; +} +.text-spacing .usfm_pi3 { + text-indent: 2.5vw; +} +.text-spacing[dir="ltr"] .usfm_pi3 { + margin-left: 15vw; + margin-right: 5vw; +} +.text-spacing[dir="rtl"] .usfm_pi3 { + margin-left: 5vw; + margin-right: 15vw; +} + +.formatted-font .usfm_pc { + font-size: 100%; +} +.text-spacing .usfm_pc { + text-align: center; +} + +.formatted-font .usfm_mi { + font-size: 100%; +} +.text-spacing .usfm_mi { + margin-left: 5vw; + margin-right: 5vw; +} + +/* check if deprecated */ +.formatted-font .usfm_nb { + font-size: 100%; +} + +.formatted-font .usfm_q { + font-size: 100%; +} +.text-spacing .usfm_q { + text-indent: -10vw; +} +.text-spacing[dir="ltr"] .usfm_q { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_q { + margin-right: 15vw; +} + +.formatted-font .usfm_q1 { + font-size: 100%; +} +.text-spacing .usfm_q1 { + text-indent: -10vw; +} +.text-spacing[dir="ltr"] .usfm_q1 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_q1 { + margin-right: 15vw; +} + +.formatted-font .usfm_q2 { + font-size: 100%; +} +.text-spacing .usfm_q2 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_q2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_q2 { + margin-right: 15vw; +} + +.formatted-font .usfm_q3 { + font-size: 100%; +} +.text-spacing .usfm_q3 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_q3 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_q3 { + margin-right: 15vw; +} + +.formatted-font .usfm_q4 { + font-size: 100%; +} +.text-spacing .usfm_q4 { + text-indent: -2.5vw; +} +.text-spacing[dir="ltr"] .usfm_q4 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_q4 { + margin-right: 15vw; +} + +.formatted-font .usfm_qc { + font-size: 100%; +} +.text-spacing .usfm_qc { + text-align: center; +} + +.usfm_qr { + text-align: end; +} +.formatted-font .usfm_qr { + font-size: 100%; +} + +.formatted-font .usfm_qa { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_qm { + font-size: 100%; +} +.text-spacing .usfm_qm { + text-indent: -15vw; +} +.text-spacing[dir="ltr"] .usfm_qm { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_qm { + margin-right: 20vw; +} + +.formatted-font .usfm_qm1 { + font-size: 100%; +} +.text-spacing .usfm_qm1 { + text-indent: -15vw; +} +.text-spacing[dir="ltr"] .usfm_qm1 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_qm1 { + margin-right: 20vw; +} + +.formatted-font .usfm_qm2 { + font-size: 100%; +} +.text-spacing .usfm_qm2 { + text-indent: -10vw; +} +.text-spacing[dir="ltr"] .usfm_qm2 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_qm2 { + margin-right: 20vw; +} + +.formatted-font .usfm_qm3 { + font-size: 100%; +} +.text-spacing .usfm_qm3 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_qm3 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_qm3 { + margin-right: 20vw; +} + +.formatted-font .usfm_qd { + font-size: 100%; + font-style: italic; +} +.text-spacing[dir="ltr"] .usfm_qd { + margin-left: 5vw; +} +.text-spacing[dir="rtl"] .usfm_qd { + margin-right: 5vw; +} + +.formatted-font .usfm_b { + font-size: 83%; +} + +.formatted-font .usfm_mt { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_mt { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_mt1 { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_mt1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 2pt; +} + +.formatted-font .usfm_mt2 { + font-size: 133%; + font-style: italic; +} +.text-spacing .usfm_mt2 { + text-align: center; + margin-bottom: 2pt; +} + +.formatted-font .usfm_mt3 { + font-weight: bold; + font-size: 133%; +} +.text-spacing .usfm_mt3 { + text-align: center; + margin-bottom: 2pt; + margin-top: 2pt; +} + +.formatted-font .usfm_mt4 { + font-size: 100%; +} +.text-spacing .usfm_mt4 { + text-align: center; + margin-bottom: 2pt; + margin-top: 2pt; +} + +.formatted-font .usfm_mte { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_mte { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_mte1 { + font-weight: bold; + font-size: 166%; +} +.text-spacing .usfm_mte1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_mte2 { + font-size: 133%; + font-style: italic; +} +.text-spacing .usfm_mte2 { + text-align: center; + margin-bottom: 2pt; +} + +.formatted-font .usfm_ms { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_ms { + text-align: center; + margin-bottom: 4pt; + margin-top: 16pt; +} + +.formatted-font .usfm_ms1 { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_ms1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 16pt; +} + +.formatted-font .usfm_ms2 { + font-weight: bold; + font-size: 116%; +} +.text-spacing .usfm_ms2 { + text-align: center; + margin-bottom: 4pt; + margin-top: 16pt; +} + +.formatted-font .usfm_ms3 { + font-size: 116%; + font-style: italic; +} +.text-spacing .usfm_ms3 { + text-align: center; + margin-bottom: 4pt; + margin-top: 16pt; +} + +.formatted-font .usfm_mr { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_mr { + text-align: center; + margin-bottom: 4pt; +} + +.formatted-font .usfm_s { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_s { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_s1 { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_s1 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_s2 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_s2 { + text-align: center; + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_s3 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_s3 { + margin-bottom: 3pt; + margin-top: 6pt; +} + +.formatted-font .usfm_s4 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_s4 { + margin-bottom: 3pt; + margin-top: 6pt; +} + +.formatted-font .usfm_sr { + font-weight: bold; + font-size: 100%; +} +.text-spacing .usfm_sr { + text-align: center; + margin-bottom: 4pt; +} + +.formatted-font .usfm_r { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_r { + text-align: center; + margin-bottom: 4pt; +} + +.formatted-font .usfm_sp { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_sp { + margin-bottom: 4pt; + margin-top: 8pt; +} + +.formatted-font .usfm_d { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_d { + text-align: center; + margin-bottom: 4pt; + margin-top: 4pt; +} + +.text-spacing .usfm_sd { + margin-bottom: 24pt; + margin-top: 24pt; +} + +.text-spacing .usfm_sd1 { + margin-bottom: 24pt; + margin-top: 24pt; +} + +.text-spacing .usfm_sd2 { + margin-bottom: 18pt; + margin-top: 18pt; +} + +.text-spacing .usfm_sd3 { + margin-bottom: 12pt; + margin-top: 12pt; +} + +.text-spacing .usfm_sd4 { + margin-bottom: 8pt; + margin-top: 8pt; +} + +.formatted-font .usfm_lh { + font-size: 100%; +} +.text-spacing .usfm_lh { + text-indent: 2.5vw; +} + +.formatted-font .usfm_li { + font-size: 100%; +} +.text-spacing .usfm_li { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_li { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_li { + margin-right: 10vw; +} + +.formatted-font .usfm_li1 { + font-size: 100%; +} +.text-spacing .usfm_li1 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_li1 { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_li1 { + margin-right: 10vw; +} + +.formatted-font .usfm_li2 { + font-size: 100%; +} +.text-spacing .usfm_li2 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_li2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_li2 { + margin-right: 15vw; +} + +.formatted-font .usfm_li3 { + font-size: 100%; +} +.text-spacing .usfm_li3 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_li3 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_li3 { + margin-right: 20vw; +} + +.formatted-font .usfm_li4 { + font-size: 100%; +} +.text-spacing .usfm_li4 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_li4 { + margin-left: 25vw; +} +.text-spacing[dir="rtl"] .usfm_li4 { + margin-right: 25vw; +} + +.formatted-font .usfm_lf { + font-size: 100%; +} + +.formatted-font .usfm_lim { + font-size: 100%; +} +.text-spacing .usfm_lim { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_lim { + margin-left: 15vw; + margin-right: 5vw; +} +.text-spacing[dir="rtl"] .usfm_lim { + margin-left: 5vw; + margin-right: 15vw; +} + +.formatted-font .usfm_lim1 { + font-size: 100%; +} +.text-spacing .usfm_lim1 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_lim1 { + margin-left: 15vw; + margin-right: 5vw; +} +.text-spacing[dir="rtl"] .usfm_lim1 { + margin-left: 5vw; + margin-right: 15vw; +} + +.formatted-font .usfm_lim2 { + font-size: 100%; +} +.text-spacing .usfm_lim2 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_lim2 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_lim2 { + margin-right: 20vw; +} + +.formatted-font .usfm_lim3 { + font-size: 100%; +} +.text-spacing .usfm_lim3 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_lim3 { + margin-left: 25vw; +} +.text-spacing[dir="rtl"] .usfm_lim3 { + margin-right: 25vw; +} + +.formatted-font .usfm_lim4 { + font-size: 100%; +} +.text-spacing .usfm_lim4 { + text-indent: -7.5vw; +} +.text-spacing[dir="ltr"] .usfm_lim4 { + margin-left: 30vw; +} +.text-spacing[dir="rtl"] .usfm_lim4 { + margin-right: 30vw; +} + +.usfm_lit { + text-align: end; +} +.formatted-font .usfm_lit { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_ph { + font-size: 100%; +} +.text-spacing .usfm_ph { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_ph { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_ph { + margin-right: 10vw; +} + +.formatted-font .usfm_ph1 { + font-size: 100%; +} +.text-spacing .usfm_ph1 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_ph1 { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_ph1 { + margin-right: 10vw; +} + +.formatted-font .usfm_ph2 { + font-size: 100%; +} +.text-spacing .usfm_ph2 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_ph2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_ph2 { + margin-right: 15vw; +} + +.formatted-font .usfm_ph3 { + font-size: 100%; +} +.text-spacing .usfm_ph3 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_ph3 { + margin-left: 20vw; +} +.text-spacing[dir="rtl"] .usfm_ph3 { + margin-right: 20vw; +} + +/* CharNode */ + +.formatted-font .usfm_qs { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_qac { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_litl { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_lik { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_liv { + font-size: 100%; +} + +.formatted-font .usfm_liv1 { + font-size: 100%; +} + +.formatted-font .usfm_liv2 { + font-size: 100%; +} + +.formatted-font .usfm_liv3 { + font-size: 100%; +} + +.formatted-font .usfm_liv4 { + font-size: 100%; +} + +.formatted-font .usfm_liv5 { + font-size: 100%; +} + +.formatted-font .usfm_rq { + font-size: 83%; + font-style: italic; +} + +.formatted-font .usfm_qt { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_nd { + font-size: 100%; + text-decoration: underline; +} + +.formatted-font .usfm_tl { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_dc { + font-style: italic; +} + +.formatted-font .usfm_bk { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_sig { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_pn { + font-weight: bold; + font-size: 100%; + text-decoration: underline; +} + +.formatted-font .usfm_png { + font-size: 100%; + text-decoration: underline; +} + +/* check if deprecated */ +.formatted-font .usfm_addpn { + font-weight: bold; + font-size: 100%; + font-style: italic; + text-decoration: underline; +} + +.formatted-font .usfm_wj { + color: #d43128; + font-size: 100%; +} + +.formatted-font .usfm_k { + font-weight: bold; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_sls { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_ord { + vertical-align: text-top; + font-size: 66%; +} + +.formatted-font .usfm_add { + font-weight: bold; + font-style: italic; +} + +.formatted-font .usfm_no { + font-size: 100%; +} + +.formatted-font .usfm_it { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_bd { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_bdit { + font-weight: bold; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_em { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_sc { + font-size: 100%; + font-variant: small-caps; +} + +.formatted-font .usfm_sup { + vertical-align: text-top; + font-size: 66%; +} + +/* check if deprecated */ +.formatted-font .usfm_pb { + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_fig { + font-size: 100%; +} + +.formatted-font .usfm_jmp { + color: #003380; + text-decoration: underline; +} + +.formatted-font .usfm_pro { + font-size: 83%; +} + +.formatted-font .usfm_rb { + font-size: 100%; +} + +.formatted-font .usfm_w { + font-size: 100%; +} + +.formatted-font .usfm_wh { + font-size: 100%; +} + +.formatted-font .usfm_wg { + font-size: 100%; +} + +.formatted-font .usfm_wa { + font-size: 100%; +} + +/* check if deprecated */ +.formatted-font .usfm_ndx { + font-size: 100%; +} + +/* Footnote NoteNode */ + +.formatted-font .usfm_f { + font-size: 100%; +} + +.formatted-font .usfm_fe { + font-size: 100%; +} + +/* Footnote CharNode */ + +.formatted-font .usfm_fr { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_ft { + font-size: 100%; +} + +.formatted-font .usfm_fk { + font-weight: bold; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_fq { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_fqa { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_fl { + font-weight: bold; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_fw { + font-size: 100%; +} + +.formatted-font .usfm_fp { + font-size: 100%; +} + +.formatted-font .usfm_fv { + vertical-align: text-top; + font-size: 66%; +} + +.formatted-font .usfm_fdc { + font-size: 100%; +} + +.formatted-font .usfm_fm { + vertical-align: text-top; + font-size: 66%; +} + +/* Cross-reference NoteNode */ + +.formatted-font .usfm_x { + font-size: 100%; +} + +/* Cross-reference CharNode */ + +.formatted-font .usfm_xo { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_xop { + font-size: 100%; +} + +.formatted-font .usfm_xt { + font-size: 100%; + unicode-bidi: embed; +} + +.formatted-font .usfm_xta { + font-size: 100%; +} + +.formatted-font .usfm_xk { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_xq { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_xot { + font-size: 100%; +} + +.formatted-font .usfm_xnt { + font-size: 100%; +} + +.formatted-font .usfm_xdc { + font-size: 100%; +} + +/* periph */ + +.formatted-font .usfm_periph { + font-weight: bold; + color: #e87217; + font-size: 116%; +} +.text-spacing .usfm_periph { + margin-bottom: 4pt; + margin-top: 16pt; +} + +.formatted-font .usfm_p1 { + font-size: 100%; +} +.text-spacing .usfm_p1 { + text-indent: 2.5vw; +} + +.formatted-font .usfm_p2 { + font-size: 100%; +} +.text-spacing .usfm_p2 { + text-indent: 2.5vw; +} +.text-spacing[dir="ltr"] .usfm_p2 { + margin-left: 2.5vw; +} +.text-spacing[dir="rtl"] .usfm_p2 { + margin-right: 2.5vw; +} + +.formatted-font .usfm_k1 { + font-size: 100%; +} + +.formatted-font .usfm_k2 { + font-size: 100%; +} + +.formatted-font .usfm_xtSee { + color: #003380; + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_xtSeeAlso { + color: #003380; + font-size: 100%; + font-style: italic; +} + +/* MilestoneNode */ + +.formatted-font .usfm_qt-s { + font-size: 100%; +} + +.formatted-font .usfm_qt-e { + font-size: 100%; +} + +.formatted-font .usfm_qt1-s { + font-size: 100%; +} + +.formatted-font .usfm_qt1-e { + font-size: 100%; +} + +.formatted-font .usfm_qt2-s { + font-size: 100%; +} + +.formatted-font .usfm_qt2-e { + font-size: 100%; +} + +.formatted-font .usfm_qt3-s { + font-size: 100%; +} + +.formatted-font .usfm_qt3-e { + font-size: 100%; +} + +.formatted-font .usfm_qt4-s { + font-size: 100%; +} + +.formatted-font .usfm_qt4-e { + font-size: 100%; +} + +.formatted-font .usfm_qt5-s { + font-size: 100%; +} + +.formatted-font .usfm_qt5-e { + font-size: 100%; +} + +.formatted-font .usfm_ts-s { + font-size: 100%; +} + +.formatted-font .usfm_ts-e { + font-size: 100%; +} + +/* table */ + +.formatted-font .usfm_tr { + font-size: 100%; +} +.text-spacing .usfm_tr { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_tr { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_tr { + margin-right: 10vw; +} + +.formatted-font .usfm_th1 { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_th2 { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_th3 { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_th4 { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_th5 { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_tc1 { + font-size: 100%; +} + +.formatted-font .usfm_tc2 { + font-size: 100%; +} + +.formatted-font .usfm_tc3 { + font-size: 100%; +} + +.formatted-font .usfm_tc4 { + font-size: 100%; +} + +.formatted-font .usfm_tc5 { + font-size: 100%; +} + +.formatted-font .usfm_thc1 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thc1 { + text-align: center; +} + +.formatted-font .usfm_thc2 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thc2 { + text-align: center; +} + +.formatted-font .usfm_thc3 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thc3 { + text-align: center; +} + +.formatted-font .usfm_thc4 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thc4 { + text-align: center; +} + +.formatted-font .usfm_thc5 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thc5 { + text-align: center; +} + +.formatted-font .usfm_tcc1 { + font-size: 100%; +} +.text-spacing .usfm_tcc1 { + text-align: center; +} + +.formatted-font .usfm_tcc2 { + font-size: 100%; +} +.text-spacing .usfm_tcc2 { + text-align: center; +} + +.formatted-font .usfm_tcc3 { + font-size: 100%; +} +.text-spacing .usfm_tcc3 { + text-align: center; +} + +.formatted-font .usfm_tcc4 { + font-size: 100%; +} +.text-spacing .usfm_tcc4 { + text-align: center; +} + +.formatted-font .usfm_tcc5 { + font-size: 100%; +} +.text-spacing .usfm_tcc5 { + text-align: center; +} + +.formatted-font .usfm_thr1 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thr1 { + text-align: end; +} + +.formatted-font .usfm_thr2 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thr2 { + text-align: end; +} + +.formatted-font .usfm_thr3 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thr3 { + text-align: end; +} + +.formatted-font .usfm_thr4 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thr4 { + text-align: end; +} + +.formatted-font .usfm_thr5 { + font-size: 100%; + font-style: italic; +} +.text-spacing .usfm_thr5 { + text-align: end; +} + +.formatted-font .usfm_tcr1 { + font-size: 100%; +} +.text-spacing .usfm_tcr1 { + text-align: end; +} + +.formatted-font .usfm_tcr2 { + font-size: 100%; +} +.text-spacing .usfm_tcr2 { + text-align: end; +} + +.formatted-font .usfm_tcr3 { + font-size: 100%; +} +.text-spacing .usfm_tcr3 { + text-align: end; +} + +.formatted-font .usfm_tcr4 { + font-size: 100%; +} +.text-spacing .usfm_tcr4 { + text-align: end; +} + +.formatted-font .usfm_tcr5 { + font-size: 100%; +} +.text-spacing .usfm_tcr5 { + text-align: end; +} + +/* table/unknown */ + +.formatted-font .usfm_tr1 { + font-size: 100%; +} +.text-spacing .usfm_tr1 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_tr1 { + margin-left: 10vw; +} +.text-spacing[dir="rtl"] .usfm_tr1 { + margin-right: 10vw; +} + +.formatted-font .usfm_tr2 { + font-size: 100%; +} +.text-spacing .usfm_tr2 { + text-indent: -5vw; +} +.text-spacing[dir="ltr"] .usfm_tr2 { + margin-left: 15vw; +} +.text-spacing[dir="rtl"] .usfm_tr2 { + margin-right: 15vw; +} + +.formatted-font .usfm_ps { + font-size: 100%; +} +.text-spacing .usfm_ps { + text-indent: 2.5vw; +} + +.formatted-font .usfm_psi { + font-size: 100%; +} +.text-spacing .usfm_psi { + text-indent: 2.5vw; + margin-left: 5vw; + margin-right: 5vw; +} + +.formatted-font .usfm_fs { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_wr { + font-size: 100%; + font-style: italic; +} + +.formatted-font .usfm_pub { + font-size: 83%; +} + +.formatted-font .usfm_toc { + font-size: 83%; +} + +.formatted-font .usfm_pref { + font-size: 83%; +} + +.formatted-font .usfm_intro { + font-size: 83%; +} + +.formatted-font .usfm_conc { + font-size: 83%; +} + +.formatted-font .usfm_glo { + font-size: 83%; +} + +.formatted-font .usfm_idx { + font-size: 83%; +} + +.formatted-font .usfm_maps { + font-size: 83%; +} + +.formatted-font .usfm_cov { + font-size: 83%; +} + +.formatted-font .usfm_spine { + font-size: 83%; +} + +.formatted-font .usfm_pubinfo { + color: #003380; + font-size: 100%; +} + +.formatted-font .usfm_zpa-xb { + font-size: 100%; +} + +.formatted-font .usfm_zpa-xc { + font-weight: bold; + font-size: 100%; +} + +.formatted-font .usfm_zpa-xv { + font-size: 100%; +} + +.formatted-font .usfm_zpa-d { + font-size: 100%; +} + +body { + background-color: rgba(252, 252, 252, 1); + color: rgba(25, 25, 25, 1); +} + +.marker { + unicode-bidi: isolate; +} +.formatted-font .marker { + color: rgba(140, 140, 140, 1); + font-size: 0.7em; +} + +.notetext { + unicode-bidi: embed; +} + +.attribute { + color: rgba(170, 170, 170, 1); +} + +.attribute:hover { + color: rgba(25, 25, 25, 1); +} + +.invalid { + color: rgba(204, 30, 20, 1); + font-weight: bold; +} + +/* NoteNode, ImmutableNoteCallerNode */ + +.immutable-note-caller > button, +/* Styles for Preview (and Ruby) views */ +.caller_preview, +.previewcallee { + color: rgba(18, 82, 179, 1); + font-weight: bold; + line-height: 1; + vertical-align: super; + font-size: 0.66em; +} + +.immutable-note-caller > button { + cursor: pointer; + text-decoration: none; + border: 0; + padding: 0; + background-color: inherit; +} + +.immutable-note-caller[data-caller="-"] { + display: none; +} + +.caller_big { + unicode-bidi: normal; + color: rgba(18, 82, 179, 1); + font-weight: bold; + text-indent: 0pt; + vertical-align: text-top; + font-size: 0.66em; +} + +.caller_small { + unicode-bidi: normal; + color: rgba(18, 82, 179, 1); + font-family: Times New Roman; + vertical-align: text-top; + text-indent: 0pt; + font-size: 0.66em; +} + +.caller_highlight { + background-color: #ffffb5; + border-top: solid 1px #0000ff; + border-bottom: solid 1px #0000ff; +} + +.opennote { + color: #7777ff; +} + +table { + border-collapse: collapse; +} + +td { + border: 1px solid #000000; + page-break-inside: avoid; + /* FB27281 adding padding based on font size*/ + padding-right: 0.28em; + padding-left: 0.28em; +} + +td.markercell { + border-style: none; +} + +rt { + cursor: pointer; +} + +/* Style statues */ +.status_unknown { + color: rgba(204, 30, 20, 1); + font-weight: bold; +} + +.status_invalid { + border-bottom: 1px solid rgba(204, 30, 20, 1); + color: rgba(204, 30, 20, 1); +} + +.caption { + text-align: center; + font-style: italic; + font-weight: bold; +} + +.figure { + text-align: center; +} + +.sidebar { + border: solid 1px rgba(18, 82, 179, 1); + margin-left: 10px; +} + +/* VerseNode, ImmutableVerseNode */ + +.formatted-font .verse { + background-color: rgba(222, 222, 222, 1); + vertical-align: super; + font-size: 0.66em; +} +.text-spacing .verse { + margin: 0px 2px 0px 2px; + padding: 0px 1px 0px 1px; + text-indent: 0in; + white-space: nowrap; +} + +.annot_comment_todo { + border-bottom: 1px dashed #888888; +} +.annot_comment_todo { + border-bottom: 1px dashed #888888; +} +span.unread img { + background-color: #ffff99; + position: relative; + bottom: -1px; /* negative of border-width to align baseline */ + border-width: 1px; + border-style: solid; + border-color: #808080; +} +span.read img { + background-color: transparent; + position: relative; + bottom: 0px; + border-width: 0px; + border-style: none; +} + +.annot_comment_todo { + border-bottom: 1px dashed #888888; +} + +.annot_comment_done { + border-bottom: 1px dashed #888888; +} + +.annot_greencursor { + background-color: rgba(152, 235, 157, 1); +} +.annot_goldcursor { + background-color: rgba(255, 255, 163, 1); +} +.annot_bluecursor { + background-color: rgba(204, 224, 255, 1); +} +.annot_greycursor { + background-color: rgba(222, 222, 222, 1); +} +.annot_violetcursor { + background-color: rgba(233, 212, 255, 1); +} + +.annot_spellingerror { + background-repeat: repeat-x; + background-position: left bottom; + padding-bottom: 0px; + vertical-align: text-top; +} + +.annot_spellingunknown { + background-repeat: repeat-x; + background-position: left bottom; + padding-bottom: 0px; + vertical-align: text-top; +} + +.found_term { + background-color: rgba(222, 222, 222, 1); + text-indent: 0; + margin-left: 0; + display: inline-block; + border-bottom-style: solid; + border-bottom-width: medium medium thick medium; + border-bottom-color: rgba(252, 252, 252, 1); + text-decoration: inherit; +} +.guessed_term { + background-color: rgba(255, 191, 143, 1); + text-indent: 0; + margin-left: 0; + display: inline-block; + border-bottom-style: solid; + border-bottom-width: medium medium thick medium; + border-bottom-color: rgba(252, 252, 252, 1); + text-decoration: inherit; +} +.found_term.unselected_term { + background-color: rgba(222, 222, 222, 0.6); + text-indent: 0; + margin-left: 0; + display: inline-block; + border-bottom-style: solid; + border-bottom-width: medium medium thick medium; + border-bottom-color: rgba(252, 252, 252, 1); + text-decoration: inherit; +} +.guessed_term.unselected_term { + background-color: rgba(255, 191, 143, 0.3); + text-indent: 0; + margin-left: 0; + display: inline-block; + border-bottom-style: solid; + border-bottom-width: medium medium thick medium; + border-bottom-color: rgba(252, 252, 252, 1); + text-decoration: inherit; +} +.selected_term { + border-style: none none solid none; + text-indent: 0; + margin-left: 0; + display: inline-block; + border-bottom-style: solid; + border-bottom-width: medium medium thick medium; + border-bottom-color: rgba(252, 252, 252, 1); + text-decoration: inherit; +} +.annot_reference_link { + border-bottom: 1px solid #93c4ff; +} +.annot_invalid_reference { + border-bottom: 1px solid #ff8080; +} +.annot_checkError { + border-top: 1px solid #ff0000; + border-bottom: 1px solid #ff0000; + background-color: rgba(255, 204, 204, 0.5); +} diff --git a/extensions/src/platform-scripture-editor/src/main.ts b/extensions/src/platform-scripture-editor/src/main.ts new file mode 100644 index 0000000000..930e57450d --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/main.ts @@ -0,0 +1,157 @@ +import papi, { logger } from '@papi/backend'; +import type { + ExecutionActivationContext, + GetWebViewOptions, + IWebViewProvider, + SavedWebViewDefinition, + WebViewDefinition, +} from '@papi/core'; +import platformScriptureEditorWebView from './platform-scripture-editor.web-view?inline'; +import platformScriptureEditorWebViewStyles from './platform-scripture-editor.web-view.scss?inline'; + +logger.info('Scripture Editor is importing!'); + +const scriptureEditorWebViewType = 'platformScriptureEditor.react'; + +interface PlatformScriptureEditorOptions extends GetWebViewOptions { + projectId: string | undefined; + isReadOnly: boolean; +} + +/** Temporary function to manually control `isReadOnly`. Registered as a command handler. */ +async function openPlatformScriptureEditor( + projectId: string | undefined, +): Promise { + // The second argument (isReadOnly) is hardcoded for now, but should be a parameter in the future + return open(projectId, false); +} + +/** Temporary function to manually control `isReadOnly`. Registered as a command handler. */ +async function openPlatformResourceViewer( + projectId: string | undefined, +): Promise { + // The second argument (isReadOnly) is hardcoded for now, but should be a parameter in the future + return open(projectId, true); +} + +/** Function to prompt for a project and open it in the editor */ +async function open( + projectId: string | undefined, + isReadOnly: boolean, +): Promise { + const projectForWebView = { projectId, isEditable: !isReadOnly }; + if (!projectForWebView.projectId) { + // Get a list of projects that are editable or not editable to show in the select project dialog + const projectMetadatas = await papi.projectLookup.getMetadataForAllProjects({ + includeProjectInterfaces: ['platformScripture.USJ_Chapter'], + }); + const projectsWithEditable = await Promise.all( + projectMetadatas.map(async (projectMetadata) => { + const pdp = await papi.projectDataProviders.get('platform.base', projectMetadata.id); + return { + projectId: projectMetadata.id, + isEditable: await pdp.getSetting('platform.isEditable'), + }; + }), + ); + + const projectIdsMatchingReadonly = projectsWithEditable + .filter(({ isEditable }) => isEditable !== isReadOnly) + .map(({ projectId: pId }) => pId); + + if (projectIdsMatchingReadonly.length > 0) { + projectForWebView.projectId = await papi.dialogs.selectProject({ + title: isReadOnly + ? '%platformScriptureEditor_dialog_openResourceViewer_title%' + : '%platformScriptureEditor_dialog_openScriptureEditor_title%', + prompt: isReadOnly + ? '%platformScriptureEditor_dialog_openResourceViewer_prompt%' + : '%platformScriptureEditor_dialog_openScriptureEditor_prompt%', + // Include projects whose editable matches readonly + includeProjectIds: projectIdsMatchingReadonly, + }); + } else { + logger.warn( + `Open ${isReadOnly ? 'Resource Viewer' : 'Scripture Editor'} did not find any projects with matching isEditable! Would show a prompt or something if there were a dialog available to do so`, + ); + } + } else { + // Get whether the provided project is editable + const pdp = await papi.projectDataProviders.get('platform.base', projectForWebView.projectId); + projectForWebView.isEditable = await pdp.getSetting('platform.isEditable'); + } + if (projectForWebView.projectId) { + const options: PlatformScriptureEditorOptions = { + projectId: projectForWebView.projectId, + isReadOnly: !projectForWebView.isEditable, + }; + // REVIEW: If an editor is already open for the selected project, we open another. + // This matches the current behavior in P9, though it might not be what we want long-term. + return papi.webViews.getWebView(scriptureEditorWebViewType, undefined, options); + } + return undefined; +} + +/** Simple web view provider that provides Resource web views when papi requests them */ +const scriptureEditorWebViewProvider: IWebViewProvider = { + async getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: PlatformScriptureEditorOptions, + ): Promise { + if (savedWebView.webViewType !== scriptureEditorWebViewType) + throw new Error( + `${scriptureEditorWebViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + + // We know that the projectId (if present in the state) will be a string. + const projectId = getWebViewOptions.projectId || savedWebView.projectId || undefined; + const isReadOnly = getWebViewOptions.isReadOnly || savedWebView.state?.isReadOnly; + let title = ''; + if (projectId) { + const pdp = await papi.projectDataProviders.get('platform.base', projectId); + title = `${ + (await pdp.getSetting('platform.name')) ?? projectId + }${isReadOnly ? '' : ' (Editable)'}`; + } else title = isReadOnly ? 'Resource Viewer' : 'Scripture Editor'; + + return { + title, + ...savedWebView, + content: platformScriptureEditorWebView, + styles: platformScriptureEditorWebViewStyles, + state: { + ...savedWebView.state, + isReadOnly, + }, + projectId, + }; + }, +}; + +export async function activate(context: ExecutionActivationContext): Promise { + logger.info('Scripture editor is activating!'); + + const openPlatformScriptureEditorPromise = papi.commands.registerCommand( + 'platformScriptureEditor.openScriptureEditor', + openPlatformScriptureEditor, + ); + + const openPlatformResourceViewerPromise = papi.commands.registerCommand( + 'platformScriptureEditor.openResourceViewer', + openPlatformResourceViewer, + ); + + const scriptureEditorWebViewProviderPromise = papi.webViewProviders.register( + scriptureEditorWebViewType, + scriptureEditorWebViewProvider, + ); + + // Await the registration promises at the end so we don't hold everything else up + context.registrations.add( + await scriptureEditorWebViewProviderPromise, + await openPlatformScriptureEditorPromise, + await openPlatformResourceViewerPromise, + ); + + logger.info('Scripture editor is finished activating!'); +} diff --git a/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.scss b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.scss new file mode 100644 index 0000000000..62f8557506 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.scss @@ -0,0 +1,38 @@ +@import './usj-nodes'; +@import './commenting'; +@import './editor'; +@import './editor-overrides'; + +body { + background-color: hsl(var(--background)); +// remove margins added by the electron browser user-agent style sheet + margin: 0; +} + +// #region verse number highlight + +// Highlight keyframes thanks to chazsolo at https://stackoverflow.com/a/55835473 +@keyframes highlight { + from { + background-color: yellow; + } +} + +.editor-container .highlighted { + position: relative; +} + +.editor-container .highlighted::before { + content: ''; + position: absolute; + width: 25px; + height: 25px; + border-radius: 50%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: 0.8; + animation: highlight 2s; +} + +// #endregion diff --git a/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx new file mode 100644 index 0000000000..b89f546847 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx @@ -0,0 +1,195 @@ +import { + EditorOptions, + Editorial, + EditorRef, + Marginal, + MarginalRef, +} from '@biblionexus-foundation/platform-editor'; +import { Usj } from '@biblionexus-foundation/scripture-utilities'; +import { Canon, VerseRef } from '@sillsdev/scripture'; +import { JSX, useCallback, useEffect, useMemo, useRef } from 'react'; +import type { WebViewProps } from '@papi/core'; +import { logger } from '@papi/frontend'; +import { useProjectData, useProjectSetting } from '@papi/frontend/react'; +import { ScriptureReference, debounce } from 'platform-bible-utils'; +import { Button } from 'platform-bible-react'; + +/** The offset in pixels from the top of the window to scroll to show the verse number */ +const VERSE_NUMBER_SCROLL_OFFSET = 80; + +/** + * Time in ms to delay taking action to wait for the editor to load. Hope to be obsoleted by a way + * to listen for the editor to finish loading + */ +const EDITOR_LOAD_DELAY_TIME = 100; + +const usjDocumentDefault: Usj = { type: 'USJ', version: '0.2.1', content: [] }; + +/** + * Check deep equality of two values such that two equal objects or arrays created in two different + * iframes successfully test as equal + * + * @param a + * @param b + * @returns + */ +function deepEqualAcrossIframes(a: unknown, b: unknown) { + return JSON.stringify(a) === JSON.stringify(b); +} + +function scrollToScrRef(scrRef: ScriptureReference): HTMLElement | undefined { + const verseElement = + document.querySelector( + `.editor-container span[data-marker="v"][data-number="${scrRef.verseNum}"]`, + ) ?? undefined; + + // Scroll if we find the verse or we're at the start of the chapter + if (verseElement || scrRef.verseNum === 1) { + // If we're at the first verse, scroll to the top so we can see intro material + let scrollTop = 0; + if (verseElement && scrRef.verseNum > 1) + scrollTop = + verseElement.getBoundingClientRect().top + window.scrollY - VERSE_NUMBER_SCROLL_OFFSET; + + window.scrollTo({ + top: scrollTop, + behavior: 'smooth', + }); + } + return verseElement; +} + +globalThis.webViewComponent = function PlatformScriptureEditor({ + projectId, + useWebViewState, + useWebViewScrollGroupScrRef, +}: WebViewProps): JSX.Element { + const [isReadOnly] = useWebViewState('isReadOnly', true); + const Editor = isReadOnly ? Editorial : Marginal; + + // Using react's ref api which uses null, so we must use null + // eslint-disable-next-line no-null/no-null + const editorRef = useRef(null); + const [scrRef, setScrRefInternal] = useWebViewScrollGroupScrRef(); + + /** + * Scripture reference we set most recently. Used so we don't scroll on updates to scrRef that + * come from us + */ + const internallySetScrRefRef = useRef(undefined); + + const setScrRef = useCallback( + (newScrRef: ScriptureReference) => { + internallySetScrRefRef.current = newScrRef; + return setScrRefInternal(newScrRef); + }, + [setScrRefInternal], + ); + + /** + * Whether we have gotten the Scripture data for the very first time. Used to scroll to the + * current scrRef on startup + */ + const hasFirstRetrievedScripture = useRef(false); + + const [usj, setUsj] = useProjectData('platformScripture.USJ_Chapter', projectId).ChapterUSJ( + useMemo(() => new VerseRef(scrRef.bookNum, scrRef.chapterNum, scrRef.verseNum), [scrRef]), + usjDocumentDefault, + ); + + const debouncedSetUsj = useMemo(() => debounce((newUsj: Usj) => setUsj?.(newUsj), 300), [setUsj]); + + // Editor's current usj state + const editorUsj = useRef(usj); + + // TODO: remove debounce when issue #826 is done. + const onUsjChange = useCallback( + (newUsj: Usj) => { + editorUsj.current = newUsj; + debouncedSetUsj(newUsj); + }, + [debouncedSetUsj], + ); + + // Update the editor if a change comes in + useEffect(() => { + // Deep compare the old and current state of the usj to make sure we don't change the editor's + // state without a need. Note that it already does that internally using a different algorithm, + // but we need to compare in such a way that the same object across iframes works fine + if (usj && !deepEqualAcrossIframes(usj, editorUsj.current)) { + editorUsj.current = usj; + editorRef.current?.setUsj(usj); + } + }, [usj]); + + // On loading the first time, scroll the selected verse into view + useEffect(() => { + if (usj && !hasFirstRetrievedScripture.current) { + hasFirstRetrievedScripture.current = true; + // Wait before scrolling to make sure there is time for the editor to load + // TODO: hook into the editor and detect when it has loaded somehow + setTimeout(() => scrollToScrRef(scrRef), EDITOR_LOAD_DELAY_TIME); + } + }, [usj, scrRef]); + + // Scroll the selected verse into view + useEffect(() => { + // If we made this latest scrRef change, don't scroll + if ( + internallySetScrRefRef.current && + internallySetScrRefRef.current.bookNum === scrRef.bookNum && + internallySetScrRefRef.current.chapterNum === scrRef.chapterNum && + internallySetScrRefRef.current.verseNum === scrRef.verseNum + ) { + internallySetScrRefRef.current = undefined; + return () => {}; + } + + let highlightedVerseElement: HTMLElement | undefined; + + // Wait before scrolling to make sure there is time for the editor to load + // TODO: hook into the editor and detect when it has loaded somehow + const scrollTimeout = setTimeout(() => { + // Scroll to and add a highlight to the current verse element + highlightedVerseElement = scrollToScrRef(scrRef); + highlightedVerseElement?.classList.add('highlighted'); + + internallySetScrRefRef.current = undefined; + }, EDITOR_LOAD_DELAY_TIME); + + return () => { + // Cancel this timeout to scroll if it is running because the scrRef changed and we need to + // scroll somewhere else + clearTimeout(scrollTimeout); + + // Remove highlight from the current verse element + highlightedVerseElement?.classList.remove('highlighted'); + }; + }, [scrRef]); + + const [projectName] = useProjectSetting(projectId, 'platform.name', ''); + + const options = useMemo( + () => ({ + isReadonly: isReadOnly, + hasSpellCheck: false, + textDirection: projectName === 'OHEBGRK' && Canon.isBookOT(scrRef.bookNum) ? 'rtl' : 'ltr', + }), + [isReadOnly, projectName, scrRef], + ); + + return ( + <> + {/* Workaround to pull in platform-bible-react styles into the editor */} + , + cell: ({ row }) => { + const item: string = row.getValue('item'); + return item.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0'); + }, + }, + inventoryCountColumn(countLabel), + inventoryStatusColumn(statusLabel, statusChangeHandler), +]; + +type CharacterInventoryProps = { + scriptureReference: ScriptureReference; + setScriptureReference: (scriptureReference: ScriptureReference) => void; + localizedStrings: LanguageStrings; + approvedItems: string[]; + onApprovedItemsChange: (items: string[]) => void; + unapprovedItems: string[]; + onUnapprovedItemsChange: (items: string[]) => void; + text: string | undefined; + scope: Scope; + onScopeChange: (scope: Scope) => void; +}; + +function CharacterInventory({ + scriptureReference, + setScriptureReference, + localizedStrings, + approvedItems, + onApprovedItemsChange, + unapprovedItems, + onUnapprovedItemsChange, + text, + scope, + onScopeChange, +}: CharacterInventoryProps) { + const [characterInventoryStrings] = useLocalizedStrings(CHARACTER_INVENTORY_STRING_KEYS); + const itemLabel = useMemo( + () => characterInventoryStrings['%webView_inventory_table_header_character%'], + [characterInventoryStrings], + ); + const unicodeValueLabel = useMemo( + () => characterInventoryStrings['%webView_inventory_table_header_unicode_value%'], + [characterInventoryStrings], + ); + const countLabel = useMemo( + () => characterInventoryStrings['%webView_inventory_table_header_count%'], + [characterInventoryStrings], + ); + const statusLabel = useMemo( + () => characterInventoryStrings['%webView_inventory_table_header_status%'], + [characterInventoryStrings], + ); + + const getColumns = useCallback( + (onStatusChange: (changedItems: string[], status: Status) => void) => + createColumns(itemLabel, unicodeValueLabel, countLabel, statusLabel, onStatusChange), + [itemLabel, unicodeValueLabel, countLabel, statusLabel], + ); + + return ( + + ); +} + +export default CharacterInventory; diff --git a/extensions/src/platform-scripture/src/checks/inventories/inventory-utils.ts b/extensions/src/platform-scripture/src/checks/inventories/inventory-utils.ts new file mode 100644 index 0000000000..1cceb83539 --- /dev/null +++ b/extensions/src/platform-scripture/src/checks/inventories/inventory-utils.ts @@ -0,0 +1,38 @@ +import { split } from 'platform-bible-utils'; + +/** + * Extracts characters from scripture text. If a target is provided, only extracts occurrences of + * the provided target + * + * @param text The scripture text from which the characters will be extracted + * @param target (Optional) If provided, the function only extracts exact matches of this character + * @returns An array of characters extracted from the provided scripture text + */ +export const extractCharacters = ( + text: string, + target: string | undefined = undefined, +): string[] => { + let characters: string[] = split(text, ''); + if (target) characters = characters.filter((character) => character === target); + return characters; +}; + +/** + * Extracts repeated words from scripture text. If a target is provided, only extracts occurences of + * the provided target + * + * @param text The scripture text from which the characters will be extracted + * @param target (Optional) If provided, the function only extracts exact matches of this words + * @returns An array of repeated words extracted from the provided scripture text + */ +export const extractRepeatedWords = ( + text: string, + target: string | undefined = undefined, +): string[] => { + // Finds repeated words, and captures the first occurrence of the word + const repeatedWords = text.match(/\b(\p{L}+)\b(?= \b\1\b)/gu) || []; + + if (target) return repeatedWords?.filter((word) => word === target); + + return repeatedWords; +}; diff --git a/extensions/src/platform-scripture/src/checks/inventories/repeated-words-inventory.component.tsx b/extensions/src/platform-scripture/src/checks/inventories/repeated-words-inventory.component.tsx new file mode 100644 index 0000000000..bfa3dd9b38 --- /dev/null +++ b/extensions/src/platform-scripture/src/checks/inventories/repeated-words-inventory.component.tsx @@ -0,0 +1,105 @@ +import { LanguageStrings, LocalizeKey, ScriptureReference } from 'platform-bible-utils'; +import { + ColumnDef, + Inventory, + ItemData, + Scope, + Status, + inventoryCountColumn, + inventoryItemColumn, + inventoryStatusColumn, +} from 'platform-bible-react'; +import { useLocalizedStrings } from '@papi/frontend/react'; +import { useCallback, useMemo } from 'react'; +import { extractRepeatedWords } from './inventory-utils'; + +const REPEATED_WORDS_INVENTORY_STRING_KEYS: LocalizeKey[] = [ + '%webView_inventory_table_header_repeated_words%', + '%webView_inventory_table_header_count%', + '%webView_inventory_table_header_status%', +]; + +/** + * Function that constructs the column for the inventory component + * + * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.) + * @param countLabel Localized label for the count column + * @param statusLabel Localized label for the status column + * @param statusChangeHandler Callback function that handles status updates to selected item(s) + * @returns An array of columns that can be passed into the inventory component + */ +const createColumns = ( + itemLabel: string, + countLabel: string, + statusLabel: string, + statusChangeHandler: (items: string[], status: Status) => void, +): ColumnDef[] => [ + inventoryItemColumn(itemLabel), + inventoryCountColumn(countLabel), + inventoryStatusColumn(statusLabel, statusChangeHandler), +]; + +interface RepeatedWordsInventoryProps { + scriptureReference: ScriptureReference; + setScriptureReference: (scriptureReference: ScriptureReference) => void; + localizedStrings: LanguageStrings; + approvedItems: string[]; + onApprovedItemsChange: (items: string[]) => void; + unapprovedItems: string[]; + onUnapprovedItemsChange: (items: string[]) => void; + text: string | undefined; + scope: Scope; + onScopeChange: (scope: Scope) => void; +} + +function RepeatedWordsInventory({ + scriptureReference, + setScriptureReference, + localizedStrings, + approvedItems, + onApprovedItemsChange, + unapprovedItems, + onUnapprovedItemsChange, + text, + scope, + onScopeChange, +}: RepeatedWordsInventoryProps) { + const [repeatedWordsInventoryStrings] = useLocalizedStrings(REPEATED_WORDS_INVENTORY_STRING_KEYS); + const itemLabel = useMemo( + () => repeatedWordsInventoryStrings['%webView_inventory_table_header_repeated_words%'], + [repeatedWordsInventoryStrings], + ); + const countLabel = useMemo( + () => repeatedWordsInventoryStrings['%webView_inventory_table_header_count%'], + [repeatedWordsInventoryStrings], + ); + const statusLabel = useMemo( + () => repeatedWordsInventoryStrings['%webView_inventory_table_header_status%'], + [repeatedWordsInventoryStrings], + ); + + const getColumns = useCallback( + (onStatusChange: (changedItems: string[], status: Status) => void) => + createColumns(itemLabel, countLabel, statusLabel, onStatusChange), + [itemLabel, countLabel, statusLabel], + ); + + return ( + + ); +} + +export default RepeatedWordsInventory; diff --git a/extensions/src/platform-scripture/src/configure-checks.web-view-provider.ts b/extensions/src/platform-scripture/src/configure-checks.web-view-provider.ts new file mode 100644 index 0000000000..6736fe11d2 --- /dev/null +++ b/extensions/src/platform-scripture/src/configure-checks.web-view-provider.ts @@ -0,0 +1,54 @@ +import papi from '@papi/backend'; +import { + GetWebViewOptions, + IWebViewProvider, + SavedWebViewDefinition, + WebViewDefinition, +} from '@papi/core'; +import { formatReplacementString, LocalizeKey } from 'platform-bible-utils'; +import configureChecksWebView from './configure-checks.web-view?inline'; +import configureChecksWebViewStyles from './configure-checks.web-view.scss?inline'; + +export const configureChecksWebViewType = 'platformScripture.configureChecks'; + +export interface ConfigureChecksWebViewOptions extends GetWebViewOptions { + projectId: string | undefined; +} + +export default class ConfigureChecksWebViewProvider implements IWebViewProvider { + constructor(public titleKey: LocalizeKey) {} + + async getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: ConfigureChecksWebViewOptions, + ): Promise { + const projectId = getWebViewOptions.projectId || savedWebView.projectId || undefined; + + let projectName: string | undefined; + + if (projectId) { + const pdp = await papi.projectDataProviders.get('platform.base', projectId); + projectName = (await pdp.getSetting('platform.name')) ?? projectId; + } + + const title = formatReplacementString( + await papi.localization.getLocalizedString({ + localizeKey: this.titleKey, + }), + { + projectName, + }, + ); + + return { + ...savedWebView, + title, + projectId, + content: configureChecksWebView, + styles: configureChecksWebViewStyles, + state: { + ...savedWebView.state, + }, + }; + } +} diff --git a/extensions/src/platform-scripture/src/configure-checks.web-view.scss b/extensions/src/platform-scripture/src/configure-checks.web-view.scss new file mode 100644 index 0000000000..284b2373cd --- /dev/null +++ b/extensions/src/platform-scripture/src/configure-checks.web-view.scss @@ -0,0 +1 @@ +@import './checks/configure-checks/configure-checks.component'; diff --git a/extensions/src/platform-scripture/src/configure-checks.web-view.tsx b/extensions/src/platform-scripture/src/configure-checks.web-view.tsx new file mode 100644 index 0000000000..bc4cae8c98 --- /dev/null +++ b/extensions/src/platform-scripture/src/configure-checks.web-view.tsx @@ -0,0 +1,125 @@ +import { WebViewProps } from '@papi/core'; +import { useData, useDataProvider } from '@papi/frontend/react'; +import { CheckInputRange, CheckRunnerCheckDetails } from 'platform-scripture'; +import { Canon, VerseRef } from '@sillsdev/scripture'; +import { useCallback, useEffect, useMemo } from 'react'; +import { Sonner, sonner } from 'platform-bible-react'; +import ConfigureChecks from './checks/configure-checks/configure-checks.component'; + +const defaultCheckRunnerCheckDetails: CheckRunnerCheckDetails = { + checkDescription: '', + checkId: '', + checkName: '', + enabledProjectIds: [''], +}; + +const findCheckIdFromDescription = ( + availableChecks: CheckRunnerCheckDetails[], + checkLabel: string, +): string | undefined => { + const checksWithMatchingLabel: CheckRunnerCheckDetails[] = availableChecks.filter( + (check) => check.checkDescription === checkLabel, + ); + if (checksWithMatchingLabel.length === 1) { + const [check] = checksWithMatchingLabel; + return check.checkId; + } + return undefined; +}; + +const prettyPrintVerseRef = (verseRef: VerseRef): string => { + return `${verseRef.book ? Canon.bookIdToEnglishName(verseRef.book) : Canon.bookNumberToEnglishName(verseRef.bookNum)} ${verseRef.chapterNum}:${verseRef.verseNum}`; +}; + +global.webViewComponent = function ConfigureChecksWebView({ projectId }: WebViewProps) { + const checkRunner = useDataProvider('platformScripture.checkAggregator'); + + const [availableChecks, , availableChecksIsLoading] = useData( + 'platformScripture.checkAggregator', + ).AvailableChecks(undefined, [defaultCheckRunnerCheckDetails]); + + const selectedChecks = useMemo((): string[] => { + if (!projectId) return []; + const enabledChecks = availableChecks.filter((check) => + check.enabledProjectIds.includes(projectId), + ); + return enabledChecks.map((check) => check.checkDescription); + }, [availableChecks, projectId]); + + const defaultScriptureRange: CheckInputRange = useMemo(() => { + return { + projectId: projectId ?? '', + start: new VerseRef(1, 1, 1), + }; + }, [projectId]); + + const [activeRanges, setActiveRanges] = useData('platformScripture.checkAggregator').ActiveRanges( + undefined, + useMemo(() => [defaultScriptureRange], [defaultScriptureRange]), + ); + + const updateSelectedChecks = useCallback( + async (checkDescription: string, selected: boolean) => { + if (!checkRunner || !projectId) return; + if (availableChecksIsLoading) { + sonner.warning(`${selected ? 'Enabling' : 'Disabling'} check failed.`, { + description: 'Please try again later.', + }); + } + const checkId = findCheckIdFromDescription(availableChecks, checkDescription); + if (!checkId) throw new Error(`No available check found with checkLabel ${checkDescription}`); + + if (selected) { + const newCheckFeedback = await checkRunner.enableCheck(checkId, projectId); + if (newCheckFeedback) { + sonner.warning( + `Warnings/errors occurred when trying to enable the ${checkDescription} check. + Enabling may or may not have been successful. + The following warning/errors have been encountered:`, + { + description: `${newCheckFeedback.map((feedback) => ` ${feedback}`)}`, + }, + ); + } else { + sonner.success(`Successfully enabled ${checkDescription} check`); + } + } else { + checkRunner.disableCheck(checkId, projectId); + sonner.success(`Successfully disabled ${checkDescription} check`); + } + }, + [availableChecks, availableChecksIsLoading, checkRunner, projectId], + ); + + const updateActiveRanges = useCallback( + (newActiveRanges: CheckInputRange[]) => { + if (setActiveRanges) setActiveRanges(newActiveRanges); + }, + [setActiveRanges], + ); + + useEffect(() => { + sonner(`Active range${activeRanges.length > 1 ? 's' : ''} updated.`, { + description: `${activeRanges + .filter((activeRange) => activeRange.projectId === projectId) + .map( + (range) => + `${range.end ? `${prettyPrintVerseRef(range.start)} - ${prettyPrintVerseRef(range.end)}` : ` ${Canon.bookIdToEnglishName(range.start.book)}`}`, + )}`, + }); + }, [activeRanges, projectId]); + + return ( + <> + + + + ); +}; diff --git a/extensions/src/platform-scripture/src/inventory.web-view-provider.ts b/extensions/src/platform-scripture/src/inventory.web-view-provider.ts new file mode 100644 index 0000000000..ebf6aa1480 --- /dev/null +++ b/extensions/src/platform-scripture/src/inventory.web-view-provider.ts @@ -0,0 +1,50 @@ +import papi from '@papi/backend'; +import { + GetWebViewOptions, + IWebViewProvider, + SavedWebViewDefinition, + WebViewDefinition, +} from '@papi/core'; +import { LocalizeKey } from 'platform-bible-utils'; +import inventoryWebView from './inventory.web-view?inline'; +import inventoryWebViewStyles from './inventory.web-view.scss?inline'; + +export interface InventoryWebViewOptions extends GetWebViewOptions { + projectId: string | undefined; +} + +export default class InventoryWebViewProvider implements IWebViewProvider { + constructor( + public titleKey: LocalizeKey, + public webViewType: string, + ) {} + + async getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: InventoryWebViewOptions, + ): Promise { + if (savedWebView.webViewType !== this.webViewType) + throw new Error( + `${this.webViewType} provider received request to provide a ${savedWebView.webViewType} web view`, + ); + + // We know that the projectId (if present in the state) will be a string. + const projectId = getWebViewOptions.projectId || savedWebView.projectId || undefined; + + const title: string = await papi.localization.getLocalizedString({ + localizeKey: this.titleKey, + }); + + return { + ...savedWebView, + title, + projectId, + content: inventoryWebView, + styles: inventoryWebViewStyles, + state: { + ...savedWebView.state, + webViewType: this.webViewType, + }, + }; + } +} diff --git a/extensions/src/platform-scripture/src/inventory.web-view.scss b/extensions/src/platform-scripture/src/inventory.web-view.scss new file mode 100644 index 0000000000..29178068b3 --- /dev/null +++ b/extensions/src/platform-scripture/src/inventory.web-view.scss @@ -0,0 +1,12 @@ +html { + height: 100%; +} + +body { + height: 100%; + margin: 0; +} + +#root { + height: 100%; +} diff --git a/extensions/src/platform-scripture/src/inventory.web-view.tsx b/extensions/src/platform-scripture/src/inventory.web-view.tsx new file mode 100644 index 0000000000..a35fa9f197 --- /dev/null +++ b/extensions/src/platform-scripture/src/inventory.web-view.tsx @@ -0,0 +1,107 @@ +import { WebViewProps } from '@papi/core'; +import { useLocalizedStrings, useProjectSetting } from '@papi/frontend/react'; +import { Scope, usePromise, INVENTORY_STRING_KEYS } from 'platform-bible-react'; +import { ScriptureReference } from 'platform-bible-utils'; +import { useCallback, useMemo, useState } from 'react'; +import type { ProjectSettingTypes } from 'papi-shared-types'; +import { VerseRef } from '@sillsdev/scripture'; +import papi from '@papi/frontend'; +import CharacterInventory from './checks/inventories/character-inventory.component'; +import RepeatedWordsInventory from './checks/inventories/repeated-words-inventory.component'; + +/** + * Get scripture text for the provided scope and reference for the specified projectId + * + * @param scope Scope of text. Can be 'book', 'chapter' or 'verse'. + * @param scriptureRef Reference to requested part of scripture + * @param projectId Id of the project from which the scripture is requested + * @returns Promise of scripture text, that can either resolve to a string or undefined + * @throws If the provided scope does not match any of the allowed values + */ +const getText = async ( + scope: Scope, + scriptureRef: ScriptureReference, + projectId: string, +): Promise => { + const verseRef = new VerseRef( + scriptureRef.bookNum, + scriptureRef.chapterNum, + scriptureRef.verseNum, + ); + + if (scope === 'book') { + const PDP = await papi.projectDataProviders.get('platformScripture.USFM_Book', projectId); + return PDP.getBookUSFM(verseRef); + } + if (scope === 'chapter') { + const PDP = await papi.projectDataProviders.get('platformScripture.USFM_Chapter', projectId); + return PDP.getChapterUSFM(verseRef); + } + if (scope === 'verse') { + const PDP = await papi.projectDataProviders.get('platformScripture.USFM_Verse', projectId); + return PDP.getVerseUSFM(verseRef); + } + + throw new Error('Cannot get scripture for unknown scope'); +}; + +global.webViewComponent = function InventoryWebView({ + projectId, + useWebViewState, + useWebViewScrollGroupScrRef, +}: WebViewProps) { + const [localizedStrings] = useLocalizedStrings( + useMemo(() => { + return Array.from(INVENTORY_STRING_KEYS); + }, []), + ); + const [webViewType] = useWebViewState('webViewType', ''); + const [scriptureRef, setScriptureRef] = useWebViewScrollGroupScrRef(); + + let InventoryVariant; + let validItemsSetting: keyof ProjectSettingTypes; + let invalidItemsSetting: keyof ProjectSettingTypes; + switch (webViewType) { + case 'platformScripture.characterInventory': + InventoryVariant = CharacterInventory; + validItemsSetting = 'platformScripture.validCharacters'; + invalidItemsSetting = 'platformScripture.invalidCharacters'; + break; + case 'platformScripture.repeatedWordsInventory': + InventoryVariant = RepeatedWordsInventory; + validItemsSetting = 'platformScripture.repeatableWords'; + invalidItemsSetting = 'platformScripture.nonRepeatableWords'; + break; + default: + throw new Error(`${webViewType} is not a valid inventory type`); + } + + const [validItems, setValidItems] = useProjectSetting(projectId, validItemsSetting, ''); + const [invalidItems, setInvalidItems] = useProjectSetting(projectId, invalidItemsSetting, ''); + const [scope, setScope] = useState('book'); + const [text] = usePromise( + useCallback( + async () => (projectId ? getText(scope, scriptureRef, projectId) : ''), + [scope, scriptureRef, projectId], + ), + useMemo(() => '', []), + ); + + const validItemsArray = useMemo(() => validItems.split(' '), [validItems]); + const invalidItemsArray = useMemo(() => invalidItems.split(' '), [invalidItems]); + + return ( + setValidItems?.(items.join(' '))} + unapprovedItems={invalidItemsArray} + onUnapprovedItemsChange={(items: string[]) => setInvalidItems?.(items.join(' '))} + text={text} + scope={scope} + onScopeChange={(newScope: Scope) => setScope(newScope)} + /> + ); +}; diff --git a/extensions/src/platform-scripture/src/main.ts b/extensions/src/platform-scripture/src/main.ts new file mode 100644 index 0000000000..66014ad8e4 --- /dev/null +++ b/extensions/src/platform-scripture/src/main.ts @@ -0,0 +1,250 @@ +import papi, { logger } from '@papi/backend'; +import { ExecutionActivationContext, ProjectSettingValidator } from '@papi/core'; +import ScriptureExtenderProjectDataProviderEngineFactory, { + SCRIPTURE_EXTENDER_PDPF_ID, +} from './project-data-provider/platform-scripture-extender-pdpef.model'; +import { SCRIPTURE_EXTENDER_PROJECT_INTERFACES } from './project-data-provider/platform-scripture-extender-pdpe.model'; +import checkHostingService from './checks/extension-host-check-runner.service'; +import checkAggregatorService from './checks/check-aggregator.service'; +import InventoryWebViewProvider, { InventoryWebViewOptions } from './inventory.web-view-provider'; +import ConfigureChecksWebViewProvider, { + configureChecksWebViewType, + ConfigureChecksWebViewOptions, +} from './configure-checks.web-view-provider'; +import CheckResultsWebViewProvider, { + checkResultsListWebViewType, + CheckResultsWebViewOptions, +} from './checking-results-list.web-view-provider'; + +const characterInventoryWebViewType = 'platformScripture.characterInventory'; +const repeatedWordsInventoryWebViewType = 'platformScripture.repeatedWordsInventory'; + +// #region Project Setting Validators + +// Should be 123 characters long +const booksPresentValidator: ProjectSettingValidator<'platformScripture.booksPresent'> = async ( + newValue, +) => newValue.length === 123 && newValue.replace(/[01]/g, '').length === 0; + +// There are 7 options in the enum +const versificationValidator: ProjectSettingValidator<'platformScripture.versification'> = async ( + newValue, +) => typeof newValue === 'number' && newValue >= 0 && newValue <= 6 && Number.isInteger(newValue); + +// A character can be any string value +const charactersValidator: ProjectSettingValidator< + 'platformScripture.validCharacters' | 'platformScripture.invalidCharacters' +> = async (newValue) => typeof newValue === 'string'; + +// A word can be any string value +const repeatableWordsValidator: ProjectSettingValidator< + 'platformScripture.repeatableWords' | 'platformScripture.nonRepeatableWords' +> = async (newValue) => typeof newValue === 'string'; + +// #endregion + +async function openPlatformCharactersInventory( + webViewId: string | undefined, +): Promise { + return openInventory(webViewId, characterInventoryWebViewType); +} + +async function openPlatformRepeatedWordsInventory( + webViewId: string | undefined, +): Promise { + return openInventory(webViewId, repeatedWordsInventoryWebViewType); +} + +async function openInventory( + webViewId: string | undefined, + webViewType: string, +): Promise { + let projectId: string | undefined; + + if (webViewId) { + const webViewDefinition = await papi.webViews.getSavedWebViewDefinition(webViewId); + projectId = webViewDefinition?.projectId; + } + + if (!projectId) { + return undefined; + } + + const options: InventoryWebViewOptions = { projectId }; + return papi.webViews.getWebView( + webViewType, + { type: 'float', floatSize: { width: 700, height: 800 } }, + options, + ); +} + +async function configureChecks(webViewId: string | undefined): Promise { + let projectId: string | undefined; + + logger.debug('Configuring checks'); + + if (webViewId) { + const webViewDefinition = await papi.webViews.getSavedWebViewDefinition(webViewId); + projectId = webViewDefinition?.projectId; + } + + if (!projectId) { + logger.debug('No project!'); + return undefined; + } + + const options: ConfigureChecksWebViewOptions = { projectId }; + return papi.webViews.getWebView( + configureChecksWebViewType, + { type: 'float', floatSize: { width: 700, height: 800 } }, + options, + ); +} + +async function showCheckResults(webViewId: string | undefined): Promise { + let projectId: string | undefined; + + logger.debug('Running checks'); + + if (webViewId) { + const webViewDefinition = await papi.webViews.getSavedWebViewDefinition(webViewId); + projectId = webViewDefinition?.projectId; + } + + if (!projectId) { + logger.debug('No project!'); + return undefined; + } + + const options: CheckResultsWebViewOptions = { projectId }; + return papi.webViews.getWebView(checkResultsListWebViewType, { type: 'tab' }, options); +} + +export async function activate(context: ExecutionActivationContext) { + logger.info('platformScripture is activating!'); + + const scriptureExtenderPdpefPromise = + papi.projectDataProviders.registerProjectDataProviderEngineFactory( + SCRIPTURE_EXTENDER_PDPF_ID, + SCRIPTURE_EXTENDER_PROJECT_INTERFACES, + new ScriptureExtenderProjectDataProviderEngineFactory(SCRIPTURE_EXTENDER_PDPF_ID), + ); + + const characterInventoryWebViewProvider = new InventoryWebViewProvider( + '%webView_characterInventory_title%', + characterInventoryWebViewType, + ); + const repeatedWordsInventoryWebViewProvider = new InventoryWebViewProvider( + '%webView_repeatedWordsInventory_title%', + repeatedWordsInventoryWebViewType, + ); + const checkResultsWebViewProvider = new CheckResultsWebViewProvider(); + const configureChecksWebViewProvider = new ConfigureChecksWebViewProvider( + '%webView_configureChecks_title%', + ); + + const includeProjectsCommandPromise = papi.commands.registerCommand( + 'platformScripture.toggleIncludeMyParatext9Projects', + async (shouldInclude) => { + const currentSettingValue = + shouldInclude !== undefined + ? !shouldInclude + : await papi.settings.get('platformScripture.includeMyParatext9Projects'); + const newSettingValue = !currentSettingValue; + await papi.settings.set('platformScripture.includeMyParatext9Projects', newSettingValue); + return newSettingValue; + }, + ); + const includeProjectsValidatorPromise = papi.settings.registerValidator( + 'platformScripture.includeMyParatext9Projects', + async (newValue) => typeof newValue === 'boolean', + ); + const booksPresentPromise = papi.projectSettings.registerValidator( + 'platformScripture.booksPresent', + booksPresentValidator, + ); + const versificationPromise = papi.projectSettings.registerValidator( + 'platformScripture.versification', + versificationValidator, + ); + const validCharactersPromise = papi.projectSettings.registerValidator( + 'platformScripture.validCharacters', + charactersValidator, + ); + const invalidCharactersPromise = papi.projectSettings.registerValidator( + 'platformScripture.invalidCharacters', + charactersValidator, + ); + const openCharactersInventoryPromise = papi.commands.registerCommand( + 'platformScripture.openCharactersInventory', + openPlatformCharactersInventory, + ); + const characterInventoryWebViewProviderPromise = papi.webViewProviders.register( + characterInventoryWebViewType, + characterInventoryWebViewProvider, + ); + const repeatableWordsPromise = papi.projectSettings.registerValidator( + 'platformScripture.repeatableWords', + repeatableWordsValidator, + ); + const nonRepeatableWordsPromise = papi.projectSettings.registerValidator( + 'platformScripture.nonRepeatableWords', + repeatableWordsValidator, + ); + const openRepeatedWordsInventoryPromise = papi.commands.registerCommand( + 'platformScripture.openRepeatedWordsInventory', + openPlatformRepeatedWordsInventory, + ); + const repeatableWordsInventoryWebViewProviderPromise = papi.webViewProviders.register( + repeatedWordsInventoryWebViewType, + repeatedWordsInventoryWebViewProvider, + ); + const configureChecksPromise = papi.commands.registerCommand( + 'platformScripture.openConfigureChecks', + configureChecks, + ); + const configureChecksWebViewProviderPromise = papi.webViewProviders.register( + configureChecksWebViewType, + configureChecksWebViewProvider, + ); + const showCheckResultsPromise = papi.commands.registerCommand( + 'platformScripture.showCheckResults', + showCheckResults, + ); + const showCheckResultsWebViewProviderPromise = papi.webViewProviders.register( + checkResultsListWebViewType, + checkResultsWebViewProvider, + ); + + await checkHostingService.initialize(); + await checkAggregatorService.initialize(); + + context.registrations.add( + await scriptureExtenderPdpefPromise, + await includeProjectsCommandPromise, + await includeProjectsValidatorPromise, + await booksPresentPromise, + await versificationPromise, + await validCharactersPromise, + await invalidCharactersPromise, + await openCharactersInventoryPromise, + await characterInventoryWebViewProviderPromise, + await repeatableWordsPromise, + await nonRepeatableWordsPromise, + await openRepeatedWordsInventoryPromise, + await repeatableWordsInventoryWebViewProviderPromise, + await configureChecksPromise, + await configureChecksWebViewProviderPromise, + await showCheckResultsPromise, + await showCheckResultsWebViewProviderPromise, + checkHostingService.dispose, + checkAggregatorService.dispose, + ); + + logger.info('platformScripture is finished activating!'); +} + +export async function deactivate() { + logger.info('platformScripture is deactivating!'); + return true; +} diff --git a/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpe.model.ts b/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpe.model.ts new file mode 100644 index 0000000000..ab12187a84 --- /dev/null +++ b/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpe.model.ts @@ -0,0 +1,199 @@ +/** The `projectInterface`s the pdpf serves */ +// TypeScript is upset without `satisfies` here because `as const` makes the array readonly but it + +import papi, { ProjectDataProviderEngine, logger } from '@papi/backend'; +import { DataProviderUpdateInstructions, IProjectDataProviderEngine } from '@papi/core'; +import { VerseRef } from '@sillsdev/scripture'; +import type { ProjectDataProviderInterfaces } from 'papi-shared-types'; +import { UnsubscriberAsync, UnsubscriberAsyncList } from 'platform-bible-utils'; +import { + USJBookProjectInterfaceDataTypes, + USJChapterProjectInterfaceDataTypes, + USJVerseProjectInterfaceDataTypes, +} from 'platform-scripture'; +import { Usj, usjToUsxString, usxStringToUsj } from '@biblionexus-foundation/scripture-utilities'; + +/** The `projectInterface`s the Scripture Extender PDPF serves */ +// TypeScript is upset without `satisfies` here because `as const` makes the array readonly but it +// needs to be used in ProjectMetadata as not readonly :p +export const SCRIPTURE_EXTENDER_PROJECT_INTERFACES = [ + 'platformScripture.USJ_Book', + 'platformScripture.USJ_Chapter', + 'platformScripture.USJ_Verse', +] as const satisfies [ + 'platformScripture.USJ_Book', + 'platformScripture.USJ_Chapter', + 'platformScripture.USJ_Verse', +]; + +/** The project interfaces the Scripture Extender Layering PDPF layers over */ +// TypeScript is upset without `satisfies` here because `as const` makes the array readonly but it +// needs to be used in ProjectMetadata as not readonly :p +export const SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES = [ + 'platformScripture.USX_Book', + 'platformScripture.USX_Chapter', + 'platformScripture.USX_Verse', +] as const satisfies [ + 'platformScripture.USX_Book', + 'platformScripture.USX_Chapter', + 'platformScripture.USX_Verse', +]; + +export type ScriptureExtenderOverlayPDPs = { + [ProjectInterface in (typeof SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES)[number]]: ProjectDataProviderInterfaces[ProjectInterface]; +}; + +class ScriptureExtenderProjectDataProviderEngine + extends ProjectDataProviderEngine + implements IProjectDataProviderEngine +{ + /** The PDPs this layering PDP needs to function */ + private readonly pdps: ScriptureExtenderOverlayPDPs; + + private bookUSXUnsubscriberPromise: Promise; + private chapterUSXUnsubscriberPromise: Promise; + private verseUSXUnsubscriberPromise: Promise; + + constructor( + private readonly projectId: string, + pdpsToOverlay: ScriptureExtenderOverlayPDPs, + ) { + super(); + this.pdps = pdpsToOverlay; + + this.bookUSXUnsubscriberPromise = this.pdps['platformScripture.USX_Book'].subscribeBookUSX( + // Just picked a key for no reason in particular because we don't need anything in particular + // here because we're listening for all updates + new VerseRef(1, 1, 1), + () => { + this.notifyUpdate('BookUSJ'); + }, + { whichUpdates: '*', retrieveDataImmediately: false }, + ); + + // Synchronously set up an error logger because an IIFE says this.bookUSXUnsubscriberPromise + // is being used before it is defined (most likely because it's a separate function running + // inside the constructor) + // code-review-disable-next-line complain-about-promise-chains ;) + this.bookUSXUnsubscriberPromise.catch((e) => { + logger.error( + `Scripture Extender PDP for project ${this.projectId} failed to subscribe to BookUSX! ${e}`, + ); + }); + + // Set up subscriptions to listen for changes to the project data to overlay and update + // our own subscribers + this.chapterUSXUnsubscriberPromise = this.pdps[ + 'platformScripture.USX_Chapter' + ].subscribeChapterUSX( + // Just picked a key for no reason in particular because we don't need anything in particular + // here because we're listening for all updates + new VerseRef(1, 1, 1), + () => { + this.notifyUpdate('ChapterUSJ'); + }, + { whichUpdates: '*', retrieveDataImmediately: false }, + ); + + // Synchronously set up an error logger because an IIFE says this.chapterUSXUnsubscriberPromise + // is being used before it is defined (most likely because it's a separate function running + // inside the constructor) + // code-review-disable-next-line complain-about-promise-chains ;) + this.chapterUSXUnsubscriberPromise.catch((e) => { + logger.error( + `Scripture Extender PDP for project ${this.projectId} failed to subscribe to ChapterUSX! ${e}`, + ); + }); + + this.verseUSXUnsubscriberPromise = this.pdps['platformScripture.USX_Verse'].subscribeVerseUSX( + // Just picked a key for no reason in particular because we don't need anything in particular + // here because we're listening for all updates + new VerseRef(1, 1, 1), + () => { + this.notifyUpdate('VerseUSJ'); + }, + { whichUpdates: '*', retrieveDataImmediately: false }, + ); + + // Synchronously set up an error logger because an IIFE says this.verseUSXUnsubscriberPromise + // is being used before it is defined (most likely because it's a separate function running + // inside the constructor) + // code-review-disable-next-line complain-about-promise-chains ;) + this.verseUSXUnsubscriberPromise.catch((e) => { + logger.error( + `Scripture Extender PDP for project ${this.projectId} failed to subscribe to VerseUSX! ${e}`, + ); + }); + } + + // Do not emit update events when running this method because we are subscribing to data updates + // and sending out update events in the constructor + @papi.dataProviders.decorators.doNotNotify + async setBookUSJ( + verseRef: VerseRef, + bookUsj: Usj, + ): Promise> { + const didSucceed = await this.pdps['platformScripture.USX_Book'].setBookUSX( + verseRef, + usjToUsxString(bookUsj), + ); + if (didSucceed) return true; + return false; + } + + // Do not emit update events when running this method because we are subscribing to data updates + // and sending out update events in the constructor + @papi.dataProviders.decorators.doNotNotify + async setChapterUSJ( + verseRef: VerseRef, + chapterUsj: Usj, + ): Promise> { + const didSucceed = await this.pdps['platformScripture.USX_Chapter'].setChapterUSX( + verseRef, + usjToUsxString(chapterUsj), + ); + if (didSucceed) return true; + return false; + } + + // eslint-disable-next-line class-methods-use-this + async setVerseUSJ(): Promise> { + throw new Error('Cannot call setVerseUSJ, use setChapterUSJ or setBookUSJ instead'); + } + + async getBookUSJ(verseRef: VerseRef): Promise { + const usx = await this.pdps['platformScripture.USX_Book'].getBookUSX(verseRef); + return usx ? usxStringToUsj(usx) : undefined; + } + + async getChapterUSJ(verseRef: VerseRef): Promise { + const usx = await this.pdps['platformScripture.USX_Chapter'].getChapterUSX(verseRef); + return usx ? usxStringToUsj(usx) : undefined; + } + + async getVerseUSJ(verseRef: VerseRef): Promise { + const usx = await this.pdps['platformScripture.USX_Verse'].getVerseUSX(verseRef); + return usx ? usxStringToUsj(usx) : undefined; + } + + /** + * Disposes of this Project Data Provider Engine. Unsubscribes from listening to overlaid PDPs + * + * @returns `true` if successfully unsubscribed + */ + async dispose(): Promise { + const unsubscriberList = new UnsubscriberAsyncList( + `Scripture Extender PDP Engine ${this.projectId} Overlaid PDP Unsubscribers`, + ); + + unsubscriberList.add( + await this.bookUSXUnsubscriberPromise, + await this.chapterUSXUnsubscriberPromise, + await this.verseUSXUnsubscriberPromise, + ); + + return unsubscriberList.runAllUnsubscribers(); + } +} + +export default ScriptureExtenderProjectDataProviderEngine; diff --git a/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpef.model.ts b/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpef.model.ts new file mode 100644 index 0000000000..c5b6ebd44b --- /dev/null +++ b/extensions/src/platform-scripture/src/project-data-provider/platform-scripture-extender-pdpef.model.ts @@ -0,0 +1,54 @@ +import { IProjectDataProviderEngine, IProjectDataProviderEngineFactory } from '@papi/core'; +import papi, { LayeringProjectDataProviderEngineFactory } from '@papi/backend'; +import { escapeStringRegexp } from 'platform-bible-utils'; +import ScriptureExtenderProjectDataProviderEngine, { + SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES, + SCRIPTURE_EXTENDER_PROJECT_INTERFACES, + ScriptureExtenderOverlayPDPs, +} from './platform-scripture-extender-pdpe.model'; + +/** PDP Factory ID for the Scripture Extender PDPF */ +export const SCRIPTURE_EXTENDER_PDPF_ID = 'platformScripture.scriptureExtenderPdpf'; + +/** + * Regex strings for the project interfaces the Scripture Extender Layering PDPF layers over + * + * Need to wrap in an array to AND the interfaces together since this Layering PDPF only supports + * projects that have all three interfaces available + */ +const SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES_REGEX_STRINGS = [ + SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES.map((projectInterface) => + escapeStringRegexp(projectInterface), + ), +]; + +class ScriptureExtenderProjectDataProviderEngineFactory + extends LayeringProjectDataProviderEngineFactory + implements IProjectDataProviderEngineFactory +{ + projectInterfacesToLayerOver = SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES_REGEX_STRINGS; + + providedProjectInterfaces = SCRIPTURE_EXTENDER_PROJECT_INTERFACES; + + // Implementing an interface method, so can't be static + // eslint-disable-next-line class-methods-use-this + async createProjectDataProviderEngine( + projectId: string, + ): Promise> { + // We're creating a ScriptureExtenderOverlayPDPs. Seems Object.fromEntries doesn't support + // mapped types very well + // eslint-disable-next-line no-type-assertion/no-type-assertion + const pdpsToOverlay = Object.fromEntries( + await Promise.all( + SCRIPTURE_EXTENDER_OVERLAY_PROJECT_INTERFACES.map(async (projectInterface) => { + const pdp = await papi.projectDataProviders.get(projectInterface, projectId); + return [projectInterface, pdp] as const; + }), + ), + ) as ScriptureExtenderOverlayPDPs; + + return new ScriptureExtenderProjectDataProviderEngine(projectId, pdpsToOverlay); + } +} + +export default ScriptureExtenderProjectDataProviderEngineFactory; diff --git a/extensions/src/platform-scripture/src/types/platform-scripture.d.ts b/extensions/src/platform-scripture/src/types/platform-scripture.d.ts new file mode 100644 index 0000000000..a850036762 --- /dev/null +++ b/extensions/src/platform-scripture/src/types/platform-scripture.d.ts @@ -0,0 +1,783 @@ +declare module 'platform-scripture' { + import { VerseRef } from '@sillsdev/scripture'; + import type { + DataProviderDataType, + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + ExtensionDataScope, + IDataProvider, + } from '@papi/core'; + import type { IProjectDataProvider } from 'papi-shared-types'; + import { Dispose, LocalizeKey, UnsubscriberAsync } from 'platform-bible-utils'; + import type { Usj } from '@biblionexus-foundation/scripture-utilities'; + + // #region Project Interface Data Types + + /** Provides Scripture data in USFM format by book */ + export type USFMBookProjectInterfaceDataTypes = { + /** Gets/sets the "raw" USFM data for the specified book */ + BookUSFM: DataProviderDataType; + }; + + /** Provides Scripture data in USFM format by chapter */ + export type USFMChapterProjectInterfaceDataTypes = { + /** Gets/sets the "raw" USFM data for the specified chapter */ + ChapterUSFM: DataProviderDataType; + }; + + /** Provides Scripture data in USFM format by verse */ + export type USFMVerseProjectInterfaceDataTypes = { + /** Gets the "raw" USFM data for the specified verse */ + VerseUSFM: DataProviderDataType; + }; + + /** Provides Scripture data in USX format by book */ + export type USXBookProjectInterfaceDataTypes = { + /** Gets/sets the data in USX form for the specified book */ + BookUSX: DataProviderDataType; + }; + + /** Provides Scripture data in USX format by chapter */ + export type USXChapterProjectInterfaceDataTypes = { + /** Gets/sets the data in USX form for the specified chapter */ + ChapterUSX: DataProviderDataType; + }; + + /** Provides Scripture data in USX format by verse */ + export type USXVerseProjectInterfaceDataTypes = { + /** Gets the "raw" data in USX form for the specified verse */ + VerseUSX: DataProviderDataType; + }; + + /** Provides Scripture data in USJ format by book */ + export type USJBookProjectInterfaceDataTypes = { + /** + * Gets/sets the data in USJ form for the specified book + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + */ + BookUSJ: DataProviderDataType; + }; + + /** Provides Scripture data in USJ format by chapter */ + export type USJChapterProjectInterfaceDataTypes = { + /** + * Gets/sets the data in USJ form for the specified chapter + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + */ + ChapterUSJ: DataProviderDataType; + }; + + /** Provides Scripture data in USJ format by verse */ + export type USJVerseProjectInterfaceDataTypes = { + /** + * Gets the data in USJ form for the specified verse + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + */ + VerseUSJ: DataProviderDataType; + }; + + /** + * Provides Scripture data in plain text format by verse. Plain text does not include notes, + * figures, and other things that are not considered "verse text" + */ + export type PlainTextVerseProjectInterfaceDataTypes = { + /** + * Gets the data in plain text form for the specified verse. Plain text does not include notes, + * figures, and other things that are not considered "verse text". + */ + VersePlainText: DataProviderDataType; + }; + + /** + * Provides project data for Scripture projects. + * + * WARNING: there are many possible Scripture-related data types. We have only implemented some of + * them. Following are a number of others that may be implemented at some point. This is not yet a + * complete list of the data types available from Scripture projects. + */ + type UnfinishedScriptureProjectDataTypes = {}; + + /** + * Provides project data for Scripture projects. + * + * WARNING: there are many possible Scripture-related data types. We have only implemented some of + * them. Following are a number of others that may be implemented at some point. This is not yet a + * complete list of the data types available from Scripture projects. + */ + type UnfinishedProjectDataProviderExpanded = { + /** + * Gets an extension's serialized project data (so the extension can provide and manipulate its + * project data) + * + * @example `{ extensionName: 'biblicalTerms', dataQualifier: 'renderings' }` + * + * @param dataScope Contains the name of the extension requesting the data and which data it is + * requesting + * @returns Promise that resolves to the requested extension project data + */ + getExtensionData(dataScope: ExtensionDataScope): Promise; + /** + * Sets an extension's serialized project data (so the extension can provide and manipulate its + * project data) + * + * @example `{ extensionName: 'biblicalTerms', dataQualifier: 'renderings' }` + * + * @param dataScope Contains the name of the extension requesting the data and which data it is + * requesting + * @param extensionData The new project data for this extension + * @returns Promise that resolves indicating which data types received updates + */ + setExtensionData( + dataScope: ExtensionDataScope, + extensionData: string | undefined, + ): Promise>; + /** + * Subscribe to run a callback function when an extension's serialized project data is changed + * + * @example `{ extensionName: 'biblicalTerms', dataQualifier: 'renderings' }` + * + * @param dataScope Contains the name of the extension requesting the data and which data it is + * requesting + * @param callback Function to run with the updated extension data for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeExtensionData( + dataScope: ExtensionDataScope, + callback: (extensionData: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + // #endregion + + // #region Project Data Provider Types + + /** Provides Scripture data in USFM format by book */ + export type IUSFMBookProjectDataProvider = + IProjectDataProvider & { + /** Gets the "raw" USFM data for the specified book */ + getBookUSFM(verseRef: VerseRef): Promise; + /** Sets the "raw" USFM data for the specified book */ + setBookUSFM( + verseRef: VerseRef, + usfm: string, + ): Promise>; + /** + * Subscribe to run a callback function when the "raw" USFM data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USFM for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeBookUSFM( + verseRef: VerseRef, + callback: (usfm: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USFM format by chapter */ + export type IUSFMChapterProjectDataProvider = + IProjectDataProvider & { + /** Gets the "raw" USFM data for the specified chapter */ + getChapterUSFM(verseRef: VerseRef): Promise; + /** Sets the "raw" USFM data for the specified chapter */ + setChapterUSFM( + verseRef: VerseRef, + usfm: string, + ): Promise>; + /** + * Subscribe to run a callback function when the "raw" USFM data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USFM for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeChapterUSFM( + verseRef: VerseRef, + callback: (usfm: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USFM format by verse */ + export type IUSFMVerseProjectDataProvider = + IProjectDataProvider & { + /** Gets the "raw" USFM data for the specified verse */ + getVerseUSFM(verseRef: VerseRef): Promise; + /** Sets the "raw" USFM data for the specified verse */ + setVerseUSFM( + verseRef: VerseRef, + usfm: string, + ): Promise>; + /** + * Subscribe to run a callback function when the "raw" USFM data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USFM for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeVerseUSFM( + verseRef: VerseRef, + callback: (usfm: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USX format by book */ + export type IUSXBookProjectDataProvider = + IProjectDataProvider & { + /** Gets the "raw" USX data for the specified book */ + getBookUSX(verseRef: VerseRef): Promise; + /** Sets the "raw" USX data for the specified book */ + setBookUSX( + verseRef: VerseRef, + usx: string, + ): Promise>; + /** + * Subscribe to run a callback function when the "raw" USX data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USX for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeBookUSX( + verseRef: VerseRef, + callback: (usx: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USX format by chapter */ + export type IUSXChapterProjectDataProvider = + IProjectDataProvider & { + /** Gets the Scripture text in USX format for the specified chapter */ + getChapterUSX(verseRef: VerseRef): Promise; + /** Sets the Scripture text in USX format for the specified chapter */ + setChapterUSX( + verseRef: VerseRef, + usx: string, + ): Promise>; + /** + * Subscribe to run a callback function when the USX data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USX for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeChapterUSX( + verseRef: VerseRef, + callback: (usx: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USX format by verse */ + export type IUSXVerseProjectDataProvider = + IProjectDataProvider & { + /** Gets the "raw" USX data for the specified verse */ + getVerseUSX(verseRef: VerseRef): Promise; + /** Sets the "raw" USX data for the specified verse */ + setVerseUSX( + verseRef: VerseRef, + usx: string, + ): Promise>; + /** + * Subscribe to run a callback function when the "raw" USX data is changed + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USX for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeVerseUSX( + verseRef: VerseRef, + callback: (usx: string | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USJ format by book */ + export type IUSJBookProjectDataProvider = + IProjectDataProvider & { + /** + * Gets the tokenized USJ data for the specified book + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + */ + getBookUSJ(verseRef: VerseRef): Promise; + /** + * Sets the tokenized USJ data for the specified book + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + */ + setBookUSJ( + verseRef: VerseRef, + usj: Usj, + ): Promise>; + /** + * Subscribe to run a callback function when the tokenized USJ data is changed + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USJ for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeBookUSJ( + verseRef: VerseRef, + callback: (usj: Usj | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USJ format by chapter */ + export type IUSJChapterProjectDataProvider = + IProjectDataProvider & { + /** + * Gets the tokenized USJ data for the specified chapter + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + */ + getChapterUSJ(verseRef: VerseRef): Promise; + /** + * Sets the tokenized USJ data for the specified chapter + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + */ + setChapterUSJ( + verseRef: VerseRef, + usj: Usj, + ): Promise>; + /** + * Subscribe to run a callback function when the tokenized USJ data is changed + * + * WARNING: USJ is in very early stages of proposal, so it will likely change over time. + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USJ for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeChapterUSJ( + verseRef: VerseRef, + callback: (usj: Usj | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** Provides Scripture data in USJ format by verse */ + export type IUSJVerseProjectDataProvider = + IProjectDataProvider & { + /** + * Gets the tokenized USJ data for the specified verse + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + */ + getVerseUSJ(verseRef: VerseRef): Promise; + /** + * Sets the tokenized USJ data for the specified verse + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + */ + setVerseUSJ( + verseRef: VerseRef, + usj: Usj, + ): Promise>; + /** + * Subscribe to run a callback function when the tokenized USJ data is changed + * + * WARNING: USJ is one of many possible tokenized formats that we may use, so this may change + * over time. Additionally, USJ is in very early stages of proposal, so it will likely also + * change over time. + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USJ for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeVerseUSJ( + verseRef: VerseRef, + callback: (usj: Usj | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + /** + * Provides Scripture data in plain text format by verse. Plain text does not include notes, + * figures, and other things that are not considered "verse text" + */ + export type IPlainTextVerseProjectDataProvider = + IProjectDataProvider & { + /** + * Gets the data in plain text form for the specified verse. Plain text does not include + * notes, figures, and other things that are not considered "verse text" + */ + getVersePlainText(verseRef: VerseRef): Promise; + /** + * Sets the data in plain text form for the specified verse. Plain text does not include + * notes, figures, and other things that are not considered "verse text" + */ + setVersePlainText( + verseRef: VerseRef, + data: string, + ): Promise>; + /** + * Subscribe to run a callback function when the plain text data is changed. Plain text does + * not include notes, figures, and other things that are not considered "verse text" + * + * @param verseRef Tells the provider what changes to listen for + * @param callback Function to run with the updated USJ for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeVersePlainText( + verseRef: VerseRef, + callback: (usj: Usj | undefined) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + }; + + // #endregion + + // #region Check Data Types + + /** Details about a check provided by the check itself */ + export type CheckDetails = { + /** Name or {@link LocalizeKey} of the name of the check to display in UI */ + checkName: string | LocalizeKey; + /** Description or {@link LocalizeKey} of the description of the check to display in UI */ + checkDescription: string | LocalizeKey; + }; + + /** Details about a check that include an ID assigned to the check */ + export type CheckDetailsWithCheckId = CheckDetails & { + /** Unique ID of the check within the set of all possible checks */ + checkId: string; + }; + + /** Defines the functions that all checks registered within the extension host must implement. */ + export type Check = Dispose & { + /** + * Prepare a check to generate results + * + * @param projectId ID of the project that the check will target + * @returns Warnings generated by the check while initializing + */ + initialize: (projectId: string) => Promise<(LocalizeKey | string)[]>; + /** Returns detailed information about this check */ + getCheckDetails: () => CheckDetails; + /** + * Run a check on project data and return any results generated. + * + * @param range Section of the project text to evaluate using the check + * @returns All results, if any, that the check found within the indicated range of the project + */ + getCheckResults: (range: ScriptureRange) => Promise; + }; + + /** Function that creates and returns a new instance of a check */ + export type CheckCreatorFunction = () => Promise; + + /** Represents a selection of scripture text */ + export type ScriptureRange = { + /** Location within a project that is the start of the range */ + start: VerseRef; + /** + * Location within a project that is the end of the range. If not provided, then the end of the + * book mentioned in `start` should be assumed. + */ + end?: VerseRef; + }; + + /** Represents a selection of scripture text to feed into a check */ + export type CheckInputRange = ScriptureRange & { + /** ID of the project to evaluate using checks */ + projectId: string; + }; + + /** + * Represents a location within a project document. The `JSONPath` location type is preferred + * since the data visualization code works with USJ. If the `VerseRef` location type is provided, + * then the platform will convert it into a `JSONPath` location type which takes extra + * processing. + * + * Practically speaking, this means if a check consumes USJ scripture data, then it should produce + * `JSONPath`-style locations since it already has the data in USJ form. If a check is processing + * USFM or USX data (or some other data type), then it probably doesn't have access to the USJ and + * can just return a `VerseRef`-style location. + */ + export type CheckLocation = + | { + /** JSONPath expression pointing to a location within USJ data */ + jsonPath: string; + /** + * Offset to apply to the content inside of the property indicated by `jsonPath` to + * determine the start of the range. + * + * @example Given the following USJ, if the offset is 1, then this is pointing to the "a" in + * Matthew. If no offset is provided, then the entire object with type "para" is being + * pointed to. + * + * { "type": "para", "marker": "h", "content": [ "Matthew" ] } + */ + offset?: number; + } + | { + /** Verse reference to a location with the document */ + verseRef: VerseRef; + /** Offset to apply to start of the verse indicated by `verseRef` */ + offset?: number; + }; + + /** One distinct result reported by a check */ + export type CheckRunResult = { + /** ID of the check that produced this result */ + checkId?: string; + /** ID of the project evaluated by the check */ + projectId: string; + /** + * Format string or {@link LocalizeKey} of the format string to display regarding the range of + * text referenced in this result. A format string should be of the form "... {arg1} ... {arg2} + * ...", where `arg1` and `arg2` are provided in the `formatStringArguments` parameter. + * + * @example Not a known name "{name}" + * + * @example %extensionName.unknownName% + */ + messageFormatString: LocalizeKey | string; + /** + * Arguments to use with the format string to determine the final string to display in the UI. + * All properties of the provided object should be represented by text of the form + * `{propertyName}` within the `messageFormatString` parameter + * + * @example {name: Layla} + */ + formatStringArguments?: { [key: string]: string }; + /** Starting point where the check result applies in the document */ + start: CheckLocation; + /** Ending point where the check result applies in the document */ + end: CheckLocation; + }; + + // #endregion + + // #region Check Runner Data Types + + /** Details about a check provided by a {@link ICheckRunner} */ + export type CheckRunnerCheckDetails = CheckDetailsWithCheckId & { + /** List of project IDs that one particular check is enabled to evaluate */ + enabledProjectIds: string[]; + }; + + /** Data types provided by a service that runs checks */ + export type CheckRunnerDataTypes = { + AvailableChecks: DataProviderDataType; + ActiveRanges: DataProviderDataType; + CheckResults: DataProviderDataType; + }; + + /** + * All processes that can run checks are expected to implement this type in a data provider + * registered with object type 'checkRunner' + */ + export type ICheckRunner = IDataProvider & { + /** + * Enable the check with the given checkId to run on the given project. Note that no results + * will be returned unless `getCheckResults` is run before or after the check has been enabled. + * `getCheckResults` is used to indicate what project content should be checked within each + * project. `enableCheck` is used to indicate which checks should be enabled on which projects. + * + * @returns Warnings from the check that indicate results might not be what the user desires + */ + enableCheck: (checkId: string, projectId: string) => Promise; + + /** Disable the check with the given checkId from producing results for the given project. */ + disableCheck: (checkId: string, projectId?: string) => Promise; + }; + + // #endregion + + // #region Check Hosting (in the Extension Host) Data Types + + /** + * Service for hosting TS/JS checks inside the extension host that are registered using the + * command "platformScripture.registerCheck". It eliminates the need for writing an entire + * {@link ICheckRunner} data provider for a check written in TS/JS, instead providing the ability + * to create an object of type {@link Check} which is almost entirely just code that implements the + * logic of taking project data and finding the intended problems. The "hosting service" is itself + * an {@link ICheckRunner} data provider. + * + * Note that checks written in any other language cannot use this service and instead must + * implement {@link ICheckRunner}s to do what they need. + */ + export type ICheckHostingService = { + /** Prepare the service to run checks */ + initialize: () => Promise; + /** Dispose of the service */ + dispose: () => Promise; + /** Get the actual check runner which can be used to enable/disable checks */ + getCheckRunner: () => Promise; + }; + + // #endregion + + // #region Check Aggregator Data Types + + /** + * Service that multiplexes/demultiplexes calls across all {@link ICheckRunner} data providers so + * things like UI only have to talk to a single service to communicate with all + * {@link ICheckRunner}s. + * + * Use the "platformScripture.checkAggregator" data provider name to access the service. + */ + export type ICheckAggregatorService = ICheckRunner & { + dataProviderName: string; + }; + + // #endregion +} + +declare module 'papi-shared-types' { + import { UnsubscriberAsync } from 'platform-bible-utils'; + + import type { + IUSFMBookProjectDataProvider, + IUSFMChapterProjectDataProvider, + IUSFMVerseProjectDataProvider, + IUSXBookProjectDataProvider, + IUSXChapterProjectDataProvider, + IUSXVerseProjectDataProvider, + IUSJBookProjectDataProvider, + IUSJChapterProjectDataProvider, + IUSJVerseProjectDataProvider, + IPlainTextVerseProjectDataProvider, + ICheckAggregatorService, + ICheckRunner, + CheckDetails, + CheckCreatorFunction, + } from 'platform-scripture'; + + export interface ProjectDataProviderInterfaces { + 'platformScripture.USFM_Book': IUSFMBookProjectDataProvider; + 'platformScripture.USFM_Chapter': IUSFMChapterProjectDataProvider; + 'platformScripture.USFM_Verse': IUSFMVerseProjectDataProvider; + 'platformScripture.USX_Book': IUSXBookProjectDataProvider; + 'platformScripture.USX_Chapter': IUSXChapterProjectDataProvider; + 'platformScripture.USX_Verse': IUSXVerseProjectDataProvider; + 'platformScripture.USJ_Book': IUSJBookProjectDataProvider; + 'platformScripture.USJ_Chapter': IUSJChapterProjectDataProvider; + 'platformScripture.USJ_Verse': IUSJVerseProjectDataProvider; + 'platformScripture.PlainText_Verse': IPlainTextVerseProjectDataProvider; + } + + export interface DataProviders { + /** Use this to work with checks that are running in any process */ + 'platformScripture.checkAggregator': ICheckAggregatorService; + /** Use this to work with checks that are explicitly hosted in the extension host */ + 'platformScripture.extensionHostCheckRunner': ICheckRunner; + } + + export interface CommandHandlers { + /** + * Toggle the `platformScripture.includeMyParatext9Projects` setting on or off + * + * @param shouldIncludeMyParatext9Projects Provide this parameter to set it to `true` or `false` + * instead of toggling + * @returns New value of the setting + */ + 'platformScripture.toggleIncludeMyParatext9Projects': ( + shouldIncludeMyParatext9Projects?: boolean, + ) => Promise; + /** + * Register a new check so it is runnable. It will not produce any check results until + * {@link ICheckRunner.enableCheck} is run by something else. + * + * Note this only works for checks that run inside the extension host. Checks that run in other + * processes should implement a {@link ICheckRunner} data provider to be discovered. + * + * @param checkDetails Details that will apply to all checks created by `createCheck` + * @param createCheck Function for creating a new check object + * @returns Function to run to remove the check registration + */ + 'platformScripture.registerCheck': ( + checkDetails: CheckDetails, + createCheck: CheckCreatorFunction, + ) => Promise; + + 'platformScripture.openCharactersInventory': ( + projectId?: string | undefined, + ) => Promise; + + 'platformScripture.openRepeatedWordsInventory': ( + projectId?: string | undefined, + ) => Promise; + + 'platformScripture.openConfigureChecks': ( + projectId?: string | undefined, + ) => Promise; + + 'platformScripture.showCheckResults': ( + projectId?: string | undefined, + ) => Promise; + } + + export interface SettingTypes { + /** + * Whether to look in the Paratext 9 project storage folder for Paratext projects to load + * (Windows only). + * + * Located at "C:\My Paratext 9 Projects" + */ + 'platformScripture.includeMyParatext9Projects': boolean; + } + export interface ProjectSettingTypes { + /** + * Which versification scheme this Scripture project uses + * + * WARNING: This setting is an example and needs to be updated to support proper versification + * specification! For the moment, it simply corresponds to + * [`ScrVersType`](https://github.com/sillsdev/libpalaso/blob/master/SIL.Scripture/Versification.cs#L1340), + * but this is not correct and full design. + */ + 'platformScripture.versification': number; + /** + * Which books are present in this Scripture project. Represented as a string with 0 or 1 for + * each possible book by [standardized book + * code](https://github.com/sillsdev/libpalaso/blob/master/SIL.Scripture/Canon.cs#L226) (123 + * characters long) + * + * @example + * '100111000000000000110000001000000000010111111111111111111111111111000000000000000000000000000000000000000000100000000000000' + */ + 'platformScripture.booksPresent': string; + + 'platformScripture.validCharacters': string; + + 'platformScripture.invalidCharacters': string; + + 'platformScripture.repeatableWords': string; + + 'platformScripture.nonRepeatableWords': string; + } +} diff --git a/extensions/src/platform-scripture/src/webpack-env.d.ts b/extensions/src/platform-scripture/src/webpack-env.d.ts new file mode 100644 index 0000000000..97c42ef39f --- /dev/null +++ b/extensions/src/platform-scripture/src/webpack-env.d.ts @@ -0,0 +1,157 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/src/webpack-env.d.ts + +/** + * Modules provided by our webpack configuration + * + * Please keep these JSDocs up-to-date with their counterparts in `webpack.config.base.ts` + */ + +// #region code and things + +/** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView files + * are an exception as they are fully bundled. + */ +declare module '*?inline' { + const content: string; + export default content; +} + +/** Import files with no transformation as strings with "./file?raw" */ +declare module '*?raw' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.scss' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.sass' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.css' { + const content: string; + export default content; +} + +// #endregion + +// #region images + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.png' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.svg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpeg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.gif' { + const content: string; + export default content; +} + +// #endregion + +// #region fonts + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff2' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.eot' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.ttf' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.otf' { + const content: string; + export default content; +} + +// #endregion + +// #endregion diff --git a/extensions/src/platform-scripture/tsconfig.json b/extensions/src/platform-scripture/tsconfig.json new file mode 100644 index 0000000000..29f4025b9c --- /dev/null +++ b/extensions/src/platform-scripture/tsconfig.json @@ -0,0 +1,54 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../../../lib", + // Include core extensions' type declarations + "../../../extensions/src", + // Include this extension's type declarations. It's in this location so there aren't any + // unexpected files there for typeRoots to include + "src/types" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/src/platform-scripture/tsconfig.lint.json b/extensions/src/platform-scripture/tsconfig.lint.json new file mode 100644 index 0000000000..a6ce9eea47 --- /dev/null +++ b/extensions/src/platform-scripture/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.js", "*.ts", "*.js", "lib", "src", "webpack"] +} diff --git a/extensions/src/platform-scripture/webpack.config.ts b/extensions/src/platform-scripture/webpack.config.ts new file mode 100644 index 0000000000..64f328446c --- /dev/null +++ b/extensions/src/platform-scripture/webpack.config.ts @@ -0,0 +1,15 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack.config.ts + +import webpack from 'webpack'; +import configWebView from './webpack/webpack.config.web-view'; +import configMain from './webpack/webpack.config.main'; + +// Note: Using a .ts file as the webpack config requires not having "type": "module" in package.json +// https://stackoverflow.com/a/76005614 + +// We want to build web views and then build main +const config: webpack.Configuration[] = [configWebView, configMain]; + +export default config; + +// #endregion diff --git a/extensions/src/platform-scripture/webpack/web-view-resolve-webpack-plugin.ts b/extensions/src/platform-scripture/webpack/web-view-resolve-webpack-plugin.ts new file mode 100644 index 0000000000..ad28003bab --- /dev/null +++ b/extensions/src/platform-scripture/webpack/web-view-resolve-webpack-plugin.ts @@ -0,0 +1,116 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/web-view-resolve-webpack-plugin.ts + +import { Resolver } from 'webpack'; +import { getWebViewTempPath, webViewTempDir, webViewTsxRegex } from './webpack.util'; + +// Webpack resolve plugins are enhanced-resolve plugins, which use tapable under the hood. +// Unfortunately, most of this api is very scantly documented, so I pretty much went off of examples +// and trial-and-error. I added lots of documentation here so there is at least some documentation. +// enhanced-resolve https://github.com/webpack/enhanced-resolve +// tapable https://github.com/webpack/tapable +// enhanced-resolve plugin examples https://github.com/webpack/enhanced-resolve/blob/main/lib/ExtensionAliasPlugin.js +// DirectoryNamedWebpackPlugin https://github.com/shaketbaby/directory-named-webpack-plugin/blob/master/index.js +/** Webpack resolution plugin that redirects WebView imports to their compiled version */ +export default class WebViewResolveWebpackPlugin { + // I didn't find much on what the hooks are called, but maybe at least some of them are the keys + // of KnownHooks: https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/types.d.ts#L240 + // Also https://github.com/webpack/webpack/issues/6817#issuecomment-542448438 shows how to add + // path alias functionality with this plugin syntax. + // However, it seems the mystery of available hooks is not solved as DirectoryNamedWebpackPlugin + // uses hook names that are not in KnownHooks. + /** Tap into the enhanced-resolve "resolve" hook with our resolve logic. */ + readonly source = 'resolve'; + /** Feed into the enhanced-resolve "resolve" hook from our resolve logic */ + readonly target = 'resolve'; + + /** + * Function that applies this plugin to webpack resolving. Use the resolver to "tap into" webpack + * resolving with our own logic + * + * @param resolver + */ + apply(resolver: Resolver) { + // Get the resolve hook for performing a new resolve for some reason. + // Just following what is in examples - not sure why do this instead of using the same hook + // in both places and why use `ensureHook` here and `getHook` below. + const target = resolver.ensureHook(this.target); + resolver + // Get the resolve hook + .getHook(this.source) + // Add our plugin to the list of resolvers to run + .tapAsync( + // Internally note that this is our plugin + 'WebViewResolveWebpackPlugin', + /** + * The logic to add to webpack resolving so it will look in the temp dir for built code. + * + * @param request Information about the resolve request + * @param resolveContext Information about the process the hook has taken to get here + * @param callback Function to run to continue the resolution process + * + * - Call with no parameters to continue resolving like this plugin did nothing + * - Call with first parameter null and second parameter a fully resolved `{ path, + * relativePath }` (including file extension) to conclude resolving at that file + * - Call with first parameter `string` or `Error` or something (not sure) to indicate error + * - Note: another option is to call `resolver.doResolve` to start the resolution process over + * with a new `path` and `relativePath` that do not need to be fully resolved. Just + * make sure that second call can't come into your hook again and cause another + * `resolver.doResolve`, or you will have an infinite loop. We pass this `callback` + * param into `resolver.doResolve`, and it calls it automatically + * + * @returns Seems it doesn't matter if or what you return. Just return to quit early + */ + (request, resolveContext, callback) => { + // If the request is somehow not defined (not sure how - just part of the type definition) + // or already has the temp dir in the path (meaning we have already modified the path), + // continue resolving without this plugin so we do not edit the request a second time + if ( + // If somehow it isn't a request, do not edit it. Not sure when this would happen + !request.request || + request.request.includes(`/${webViewTempDir}/`) + ) + // Continue resolving without changing anything with this plugin + return callback(); + + // Get the ?stuff aka the resource query on the request path (includes the ?) + let resourceQuery = request.query; + let requestPath = request.request; + // request.query sometimes doesn't have the ?stuff in it for some reason, so get it + // manually from the request path if it isn't already in request.query + if (!request.query) { + const queryInd = requestPath.lastIndexOf('?'); + // If there is a ? and something after it in the request path, use that as the resource + // query + if (queryInd >= 0 && queryInd < requestPath.length - 1) { + resourceQuery = requestPath.substring(queryInd); + requestPath = requestPath.substring(0, queryInd); + } + } + + // If it isn't calling for a webView, continue resolving without changing anything here + if (!webViewTsxRegex.test(requestPath)) return callback(); + + // Get the path to the relevant file in the temp dir + // Note: this path must keep the ./ at the start, or webpack won't resolve it correctly + let tempViewPath = getWebViewTempPath(requestPath, resolver.join); + // Add the query back onto the request path if it was originally there + if (!request.query) tempViewPath += resourceQuery; + + // Resolve this file but in the temp dir + resolver.doResolve( + target, + { + ...request, + request: tempViewPath, + }, + `Added temp dir to resolve request path: ${tempViewPath}`, + resolveContext, + callback, + ); + return undefined; + }, + ); + } +} + +// #endregion diff --git a/extensions/src/platform-scripture/webpack/webpack.config.base.ts b/extensions/src/platform-scripture/webpack/webpack.config.base.ts new file mode 100644 index 0000000000..3eafc61c32 --- /dev/null +++ b/extensions/src/platform-scripture/webpack/webpack.config.base.ts @@ -0,0 +1,159 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts + +import path from 'path'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import webpack from 'webpack'; + +const isDev = process.env.NODE_ENV !== 'production'; +const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; + +/** The base directory from which webpack should operate (should be the root repo folder) */ +export const rootDir = path.resolve(__dirname, '..'); + +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + +// Note: we do not want to do any chunking because neither webViews nor main can import dependencies +// other than those listed in configBase.externals. Each webView must contain all its dependency +// code, and main must contain all its dependency code. +/** Webpack configuration shared by webView building and main building */ +const configBase: webpack.Configuration = { + // The operating directory for webpack instead of current working directory + context: rootDir, + mode: isDev ? 'development' : 'production', + // Bundle the sourcemap into the file since webviews are injected as strings into the main file + devtool: shouldGenerateSourceMaps ? 'inline-source-map' : false, + watchOptions: { + ignored: ['**/node_modules'], + }, + // Use require for externals as it is the only type of importing that Platform.Bible supports + // https://webpack.js.org/configuration/externals/#externalstypecommonjs + externalsType: LIBRARY_TYPE, + // Modules that Platform.Bible supplies to extensions https://webpack.js.org/configuration/externals/ + // All other dependencies must be bundled into the extension + externals: [ + 'react', + 'react/jsx-runtime', + 'react-dom', + 'react-dom/client', + '@papi/backend', + '@papi/core', + '@papi/frontend', + '@papi/frontend/react', + '@sillsdev/scripture', + 'platform-bible-utils', + ], + module: { + // Please keep these JSDocs up-to-date with their counterparts in `webpack-env.d.ts` + rules: [ + /** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView + * files are an exception as they are fully bundled. + */ + // This must be the first rule in order to be applied after all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /inline/, + type: 'asset/source', + }, + // Load TypeScript with SWC https://swc.rs/docs/usage/swc-loader + // If this seems to cause problems, you can try switching to ts-loader for more compatibility + // https://github.com/TypeStrong/ts-loader#options + { + test: /\.tsx?$/, + use: { + loader: 'swc-loader', + options: { + // Lots of configuration at https://swc.rs/docs/configuration/compilation - if building + // isn't working because of some error that looks like normal code, it may be something + // in swc isn't enabled. + // Found how to configure at https://stackoverflow.com/questions/76671009/how-to-properly-configure-swc-loader-with-webpack-when-switching-from-ts-loader + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + }, + }, + }, + exclude: /node_modules/, + }, + /** Import scss, sass, and css files as strings */ + // https://webpack.js.org/loaders/sass-loader/#getting-started + { + test: /\.(sa|sc|c)ss$/, + use: [ + // We are not using style-loader since we are passing styles to papi, not inserting them + // into dom. style-loader would add html style elements for our styles if we used it + // We are not using css-loader since we are getting style files using ?inline. css-loader + // would allow us to import CSS into CommonJS + // Compiles Sass to CSS + 'sass-loader', + ], + }, + /** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-images + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/inline', + }, + /** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/inline', + }, + /** Import files with no transformation as strings with "./file?raw" */ + // This must be the last rule in order to be applied before all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /raw/, + type: 'asset/source', + }, + ], + }, + resolve: { + // If no file extension is provided on file path imports, use these extensions left-to-right + // https://webpack.js.org/guides/typescript/#basic-setup + extensions: ['.tsx', '.ts', '.js'], + plugins: [ + // use tsconfig.json paths https://www.npmjs.com/package/tsconfig-paths-webpack-plugin + new TsconfigPathsPlugin(), + ], + // Load `platform-bible-react`' `dependencies` from `paranext-core` so the extension will share + // these dependencies with the bundled copy of `platform-bible-react` and avoid duplicate + // packages. These paths are broken up like this so multi-extension folder can format the path + // properly + // https://webpack.js.org/configuration/resolve/#resolvealias + // TODO: Remove this when `platform-bible-react` is published to npm + alias: { + '@emotion/react': path.resolve(__dirname, '..', '../../../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../../../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../../../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../../../node_modules/react-data-grid'), + }, + }, +}; + +export default configBase; + +// #endregion diff --git a/extensions/src/platform-scripture/webpack/webpack.config.main.ts b/extensions/src/platform-scripture/webpack/webpack.config.main.ts new file mode 100644 index 0000000000..5a25bc6dde --- /dev/null +++ b/extensions/src/platform-scripture/webpack/webpack.config.main.ts @@ -0,0 +1,69 @@ +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import CopyPlugin from 'copy-webpack-plugin'; +import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; +import { outputFolder } from './webpack.util'; + +/** Webpack configuration for building main */ +const configMain: webpack.Configuration = merge(configBase, { + // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.main.ts + + // Build for node since Platform.Bible loads this in node https://webpack.js.org/concepts/targets/ + target: 'node', + // configuration name + name: 'main', + // wait until webView bundling finishes - webpack.config.web-view.ts + dependencies: ['webView'], + // Instructions on what output to create + output: { + // extension output directory + path: path.resolve(rootDir, outputFolder), + // Exporting the library https://webpack.js.org/guides/author-libraries/#expose-the-library + library: { + type: LIBRARY_TYPE, + }, + // Empty the output folder before building + clean: true, + }, + resolve: { + plugins: [ + // Get web view files from the temp dir where they are built + new WebViewResolveWebpackPlugin(), + ], + }, + + // #endregion + + // extension main source file to build + // Note: this could have just been the import string if we put the filename in `output`, but + // splitting it out like this allows us to share `output` with `paranext-core`. + entry: { + main: { + import: './src/main.ts', + filename: './src/main.js', + }, + }, + plugins: [ + // Copy static files to the output folder https://webpack.js.org/plugins/copy-webpack-plugin/ + new CopyPlugin({ + patterns: [ + // We want all files from the public folder copied into the output folder + { from: 'public', to: './', noErrorOnMissing: true }, + // We want all files from the assets folder copied into the output folder under assets + { from: 'assets', to: './assets/', noErrorOnMissing: true }, + // We want all files from the contributions folder copied into the output folder under contributions + { from: 'contributions', to: './contributions/', noErrorOnMissing: true }, + // Copy this extension's type declaration file into the output folder under src/types + { from: 'src/types', to: './src/types', noErrorOnMissing: true }, + // We need to distribute the package.json for Platform.Bible to read the extension properly + { from: 'package.json', to: './', noErrorOnMissing: true }, + // We need to distribute the manifest.json to inform Platform.Bible about the extension + { from: 'manifest.json', to: './' }, + ], + }), + ], +}); + +export default configMain; diff --git a/extensions/src/platform-scripture/webpack/webpack.config.web-view.ts b/extensions/src/platform-scripture/webpack/webpack.config.web-view.ts new file mode 100644 index 0000000000..ef53636caf --- /dev/null +++ b/extensions/src/platform-scripture/webpack/webpack.config.web-view.ts @@ -0,0 +1,24 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.web-view.ts + +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import configBase, { rootDir } from './webpack.config.base'; +import { getWebViewEntries } from './webpack.util'; + +/** Webpack configuration for building webViews */ +const configWebView: webpack.Configuration = merge(configBase, { + // Build for web since Platform.Bible loads WebViews in browser https://webpack.js.org/concepts/targets/ + target: 'web', + // configuration name so we can depend on it in main + name: 'webView', + // instructions to build each extension webview source file + entry: getWebViewEntries, + output: { + // Build all the web views in the folders where they are with the temp dir appended + path: rootDir, + }, +}); + +export default configWebView; + +// #endregion diff --git a/extensions/src/platform-scripture/webpack/webpack.util.ts b/extensions/src/platform-scripture/webpack/webpack.util.ts new file mode 100644 index 0000000000..cf465e3832 --- /dev/null +++ b/extensions/src/platform-scripture/webpack/webpack.util.ts @@ -0,0 +1,77 @@ +import webpack from 'webpack'; +import path from 'path'; +import { glob } from 'glob'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.util.ts + +/** + * String of what a web view needs to have in its name before the file extension to be considered a + * web-view + * + * Web Views should be named .web-view. + */ +const webViewTag = '.web-view'; +/** Glob filename matcher for React web views. React Web Views should be named .web-view.tsx */ +const webViewTsxGlob = '**/*.web-view.tsx'; +/** + * Regex file name matcher for React web views. React Web Views should be named .web-view.tsx + * + * Note: this regex allows the extension to be optional. + */ +export const webViewTsxRegex = /.+\.web-view(\.[tj]sx)?$/; +/** Name of adjacent folder used to store bundled WebView files */ +export const webViewTempDir = 'temp-build'; + +/** Folder containing the built extension files */ +export const outputFolder = 'dist'; + +/** Get a list of TypeScript WebView files to bundle. Path relative to project root */ +function getWebViewTsxPaths() { + return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); +} + +/** + * Gets the bundled WebView path for a WebView file path + * + * @param webViewPath Relative path to webView e.g. './src/extension-template.web-view.tsx' + * @param join Function to use to join the paths together + * @returns WebView path with temporary WebView directory inserted into the module path + */ +export function getWebViewTempPath( + webViewPath: string, + join: (path: string, request: string) => string = path.join, +) { + const webViewInfo = path.parse(webViewPath); + + // If the web view doesn't have a file extension, parsing makes it think the extension is + // '.web-view', so we need to add it back + const webViewName = webViewInfo.ext === webViewTag ? webViewInfo.base : webViewInfo.name; + // Put transpiled WebViews in a temp folder in the same directory as the original WebView + // Make sure to preserve the ./ to indicate it is a relative path + return `${webViewPath.startsWith('./') ? './' : ''}${join( + webViewInfo.dir, + join(webViewTempDir, `${webViewName}.js`), + )}`; +} + +/** + * Get webpack entry configuration to build each web-view source file and put it in a temporary + * folder in the same directory + * + * @returns Promise that resolves to the webView entry config + */ +export async function getWebViewEntries(): Promise { + const tsxWebViews = await getWebViewTsxPaths(); + const webViewEntries = Object.fromEntries( + tsxWebViews.map((webViewPath): [string, webpack.EntryObject[string]] => [ + webViewPath, + { + import: webViewPath, + filename: getWebViewTempPath(webViewPath), + }, + ]), + ); + return webViewEntries; +} + +// #endregion diff --git a/extensions/src/project-notes-data-provider/index.d.ts b/extensions/src/project-notes-data-provider/index.d.ts new file mode 100644 index 0000000000..b1b1a174ad --- /dev/null +++ b/extensions/src/project-notes-data-provider/index.d.ts @@ -0,0 +1,264 @@ +import { VerseRef } from '@sillsdev/scripture'; +import type { + DataProviderDataType, + DataProviderSubscriberOptions, + IDataProvider, +} from '@papi/core'; +import { PlatformEvent, Unsubscriber } from 'platform-bible-utils'; + +declare module 'project-notes-data-provider' { + export type ProjectNotesProviderDataTypes = { + /** Get notes from the provider. `setNotes` is not available; please use `addNote` */ + Notes: DataProviderDataType; + }; + + /** + * Data provider for manipulating project notes + * + * Modeled from Paratext 9 Plugin API's + * [GetNotes](https://github.com/ubsicap/paratext_demo_plugins/wiki/IProject#getnotes) and + * [AddNote](https://github.com/ubsicap/paratext_demo_plugins/wiki/IProject#addnote) + * + * WARNING: This is currently designed to match closely with Paratext 9's Notes API. Any changes + * must maintain backwards compatibility for the time being. + */ + export type ProjectNotesDataProvider = IDataProvider & { + /** + * Adds a project note + * + * @param anchor A selection in the Scripture text representing the "anchor" location of the + * note. Note that the `ScriptureTextSelection.SelectedText` is expected to begin and end at a + * word break; We will attempt to expand the selection if it is not. + * @param contentParagraphs One or more paragraphs of formatted text + * @param language The default language used in `contentParagraphs` (except where specified + * explicitly in a `FormattedString`). + * @param assignedUser User (if any) to whom the new note is to be assigned. + * @returns `ProjectNote` the newly added note + */ + addNote( + anchor: ScriptureTextSelection, + contentParagraphs: CommentParagraph[], + language?: Language, + assignedUser?: UserInfo, + ): Promise; + }; + + /** An object representing a project note */ + type ProjectNote = { + /** A selection in the Scripture text representing the "anchor" location of the note. */ + anchor: ScriptureTextSelection; + /** Present in a note when it has been assigned to a particular user. */ + assignedUser?: UserInfo; + /** The comments that comprise the note */ + comments: Comment[]; + /** Flag indicating whether all the comments of the note have been read by the current user. */ + isRead: boolean; + /** Flag indicating whether this note is resolved. */ + isResolved: boolean; + /** Present in a note when it has been assigned to reply-to a particular user. */ + replyToUser?: UserInfo; + }; + + /** A selection in the Scripture text */ + type ScriptureTextSelection = { + /** + * The raw USFM text following the SelectedText (typically the remainder of the verse + * represented by VerseRefEnd). + */ + afterContext: string; + /** + * The raw USFM text preceding the SelectedText (typically the entirety of the verse represented + * by VerseRefStart up to Offset). + */ + beforeContext: string; + /** + * The character offset (in the raw USFM data) starting from the point before the \v (i.e., the + * slash is the 0th character). + */ + offset: number; + /** + * The selected text represented by this object. Can be an empty string (representing an + * insertion point). + */ + selectedText: string; + /** The verse where the selection ends. */ + verseRefEnd: VerseRef; + /** The verse where the selection starts. */ + verseRefStart: VerseRef; + }; + + /** An object representing information about a user */ + type UserInfo = { + /** + * Gets the registration name of the current user or an empty string if there is no registration + * information + */ + name: string; + }; + + /** An object representing a comment in a project note */ + type Comment = { + /** User to whom a comment is/was assigned. */ + assignedUser?: UserInfo; + /** User who authored this comment */ + author: UserInfo; + /** The list of paragraphs making up the contents of this comment. */ + contents: CommentParagraph[]; + /** Date/time this comment was created */ + created: Date; + /** The language used in the comment (except where specified explicitly in a FormattedString). */ + language?: Language; + }; + + /** + * An object representing a language definition + * + * WARNING: SUBJECT TO CHANGE + */ + type Language = { + /** Gets the default font. */ + font?: Font; + /** Gets the IETF BCP-47 language tag. */ + id: string; + /** Gets whether the language is displayed right-to-left. */ + isRtoL: boolean; + }; + + /** + * Object representing a font + * + * WARNING: SUBJECT TO CHANGE + */ + type Font = { + /** + * A comma-separated list of selected feature options for a Graphite font. REVIEW: Although + * Paratext does not seem to support selection of features for Open Type fonts, it's possible + * that existing LDML files may have this information and it could be used by Paratext (and + * therefore maybe passed on here). + */ + features?: string; + /** Name of the font family, which represents a group of fonts that have a similar font face. */ + fontFamily?: string; + /** The language tag needed to tell a Graphite font which set of customized rules to use. */ + language?: string; + /** The em-size measured in in points */ + size?: number; + }; + + /** + * Object representing a paragraph in a comment + * + * WARNING: SUBJECT TO CHANGE DEPENDING ON HOW WE WANT TO MAKE RICH TEXT EDITING + */ + type CommentParagraph = { + /** List of formatted text spans that make up the paragraph */ + spans: FormattedString[]; + }; + + /** + * A span of text that has formatting specified + * + * WARNING: SUBJECT TO CHANGE DEPENDING ON HOW WE WANT TO MAKE RICH TEXT EDITING + */ + type FormattedString = { + /** + * The language in which the text is written. If null, the language is the Comment.Language of + * the owning comment. + */ + language?: Language; + /** Flags indicating the style */ + style: Style; + /** The text of the string. Cannot be null or empty. */ + text: string; + }; + + /** + * Indicates which styles are applied on a FormattedString. + * + * WARNING: SUBJECT TO CHANGE DEPENDING ON HOW WE WANT TO MAKE RICH TEXT EDITING + */ + enum Style { + /** Includes bold formatting */ + Bold = 0, + /** Includes italics formatting */ + Italic = 1, + /** No special formatting */ + Plain = 2, + } + + /** Specifies which notes to retrieve from `ProjectNotesDataProvider.GetNotes` */ + type ProjectNotesSelector = { + /** The project from which to get notes */ + projectId: string; + /** + * Book number from which to retrieve notes. If not provided or 0, get notes from the entire + * project + * + * @default 0 + */ + bookNum?: number; + /** + * Chapter number from which to retrieve notes. If not provided or 0, get notes from the whole + * book + * + * @default 0 + */ + chapterNum?: number; + /** + * Whether or not to return only unresolved notes. + * + * @default false + */ + shouldRetrieveOnlyUnresolved?: boolean; + }; + + /** + * Data provider for manipulating project notes + * + * Modeled from Paratext 9 Plugin API's + * [GetNotes](https://github.com/ubsicap/paratext_demo_plugins/wiki/IProject#getnotes) and + * [AddNote](https://github.com/ubsicap/paratext_demo_plugins/wiki/IProject#addnote) + * + * WARNING: This is currently designed to match closely with Paratext 9's Notes API. Any changes + * must maintain backwards compatibility for the time being. + * + * This is a hand-written baked-out version of `ProjectNotesDataProvider` for ease of reading + */ + type ProjectNotesDataProviderExpanded = { + /** Event emitted when this provider is disposed */ + onDidDispose: PlatformEvent; + /** Get notes from the provider. `setNotes` is not available; please use `addNote` */ + getNotes(notesSelector: ProjectNotesSelector): Promise; + /** + * Subscribe to run a callback function when notes are added + * + * @param notesSelector Tells the provider what notes to listen for + * @param callback Function to run with the updated notes for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeNotes( + notesSelector: ProjectNotesSelector, + callback: (notes: ProjectNote[]) => void, + options?: DataProviderSubscriberOptions, + ): Unsubscriber; + /** + * Adds a project note + * + * @param anchor A selection in the Scripture text representing the "anchor" location of the + * note. Note that the `ScriptureTextSelection.SelectedText` is expected to begin and end at a + * word break; We will attempt to expand the selection if it is not. + * @param contentParagraphs One or more paragraphs of formatted text + * @param language The default language used in `contentParagraphs` (except where specified + * explicitly in a `FormattedString`). + * @param assignedUser User (if any) to whom the new note is to be assigned. + * @returns `ProjectNote` the newly added note + */ + addNote( + anchor: ScriptureTextSelection, + contentParagraphs: CommentParagraph[], + language?: Language, + assignedUser?: UserInfo, + ): Promise; + }; +} diff --git a/extensions/src/project-notes-data-provider/manifest.json b/extensions/src/project-notes-data-provider/manifest.json new file mode 100644 index 0000000000..9f25efdb2c --- /dev/null +++ b/extensions/src/project-notes-data-provider/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "projectNotesDataProvider", + "version": "0.0.1", + "description": "Project Notes Data Provider for Paranext - provided by C# data provider", + "author": "Paranext", + "license": "MIT", + "main": "", + "activationEvents": [] +} diff --git a/extensions/src/quick-verse/.editorconfig b/extensions/src/quick-verse/.editorconfig new file mode 100644 index 0000000000..f4575f84f2 --- /dev/null +++ b/extensions/src/quick-verse/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 + +[*.md] +trim_trailing_whitespace = false + +[*.cs] +indent_size = 4 diff --git a/extensions/src/quick-verse/.eslintignore b/extensions/src/quick-verse/.eslintignore new file mode 100644 index 0000000000..bdb2e12c0b --- /dev/null +++ b/extensions/src/quick-verse/.eslintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintignore + +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/quick-verse/.eslintrc.js b/extensions/src/quick-verse/.eslintrc.js new file mode 100644 index 0000000000..279bb37dcd --- /dev/null +++ b/extensions/src/quick-verse/.eslintrc.js @@ -0,0 +1,163 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.eslintrc.cjs + +module.exports = { + extends: [ + // https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/index.js + // airbnb rules are embedded in erb https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb + 'erb', + // Make sure this is last so it gets the chance to override other configs. + // See https://github.com/prettier/eslint-config-prettier and https://github.com/prettier/eslint-plugin-prettier + 'plugin:prettier/recommended', + ], + + rules: { + // Some rules in this following shared region are not applied since they are overridden in subsequent regions + // #region shared with https://github.com/paranext/paranext-core/blob/main/.eslintrc.js except certain overrides + + // #region ERB rules + + 'import/extensions': 'off', + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'import/no-import-module-exports': 'off', + 'import/no-unresolved': 'error', + 'react/jsx-filename-extension': 'off', + 'react/react-in-jsx-scope': 'off', + + // #endregion + + // #region Platform.Bible rules + + // Rules in each section are generally in alphabetical order. However, several + // `@typescript-eslint` rules require disabling the equivalent ESLint rule. So in these cases + // each ESLint rule is turned off immediately above the corresponding `@typescript-eslint` rule. + 'import/no-anonymous-default-export': ['error', { allowCallExpression: false }], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + 'lines-between-class-members': 'off', + '@typescript-eslint/lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true, exceptAfterOverload: true }, + ], + '@typescript-eslint/member-ordering': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['shared/*', 'renderer/*', 'extension-host/*', 'node/*', 'client/*', 'main/*'], + message: `Importing from this path is not allowed. Try importing from @papi/core. Imports from paths like 'shared', 'renderer', 'node', 'client' and 'main' are not allowed to prevent unnecessary import break.`, + }, + ], + }, + ], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { functions: false, allowNamedExports: true, typedefs: false, ignoreTypeReferences: true }, + ], + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'comma-dangle': ['error', 'always-multiline'], + indent: 'off', + 'jsx-a11y/label-has-associated-control': [ + 'error', + { + assert: 'either', + }, + ], + // Should use our logger anytime you want logs that persist. Otherwise use console only in testing + 'no-console': 'warn', + 'no-null/no-null': 2, + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-type-assertion/no-type-assertion': 'error', + 'prettier/prettier': ['warn', { tabWidth: 2, trailingComma: 'all' }], + 'react/jsx-indent-props': ['warn', 2], + 'react/jsx-props-no-spreading': ['error', { custom: 'ignore' }], + 'react/require-default-props': 'off', + + // #endregion + + // #endregion + + // #region Overrides to rules from paranext-core + + 'import/no-unresolved': ['error', { ignore: ['@papi'] }], + + // #endregion + }, + globals: { + globalThis: 'readonly', + }, + overrides: [ + { + // Allow this file to have overrides to rules from paranext-core + files: ['.eslintrc.*js'], + rules: { + 'no-dupe-keys': 'off', + }, + }, + { + files: ['*.js'], + rules: { + strict: 'off', + }, + }, + { + // Don't require extensions to have a default export for "activate()" + files: ['*.ts'], + rules: { + 'import/prefer-default-export': 'off', + }, + }, + { + files: ['./lib/*', './webpack/*'], + rules: { + // These files are scripts not running in Platform.Bible, so they can't use the logger + 'no-console': 'off', + }, + }, + { + files: ['*.d.ts'], + rules: { + // Allow .d.ts files to self import so they can refer to their types in `papi-shared-types` + 'import/no-self-import': 'off', + }, + }, + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, + }, + plugins: ['@typescript-eslint', 'no-type-assertion', 'no-null'], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; + +// #endregion diff --git a/extensions/src/quick-verse/.gitignore b/extensions/src/quick-verse/.gitignore new file mode 100644 index 0000000000..cb00ea28d2 --- /dev/null +++ b/extensions/src/quick-verse/.gitignore @@ -0,0 +1,33 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +release +dist-ssr +*.local + +# formatting and linting +.eslintcache + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Temporary intermediate build files +temp-build + +# #endregion diff --git a/extensions/src/quick-verse/.prettierignore b/extensions/src/quick-verse/.prettierignore new file mode 100644 index 0000000000..69fb5a8ab5 --- /dev/null +++ b/extensions/src/quick-verse/.prettierignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierignore + +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/quick-verse/.prettierrc.js b/extensions/src/quick-verse/.prettierrc.js new file mode 100644 index 0000000000..01e5ca241c --- /dev/null +++ b/extensions/src/quick-verse/.prettierrc.js @@ -0,0 +1,19 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.prettierrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.prettierrc.js + +module.exports = { + tabWidth: 2, + trailingComma: 'all', + endOfLine: 'lf', + singleQuote: true, + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.json', + options: { parser: 'json' }, + }, + ], +}; + +// #endregion diff --git a/extensions/src/quick-verse/.stylelintignore b/extensions/src/quick-verse/.stylelintignore new file mode 100644 index 0000000000..6d59d79515 --- /dev/null +++ b/extensions/src/quick-verse/.stylelintignore @@ -0,0 +1,35 @@ +# #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintignore + +# Please keep this file in sync with .eslintignore and .prettierignore + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# Built files +dist +release +temp-build + +# generated files +package-lock.json + +# #endregion diff --git a/extensions/src/quick-verse/.stylelintrc.js b/extensions/src/quick-verse/.stylelintrc.js new file mode 100644 index 0000000000..70f5dd2d0e --- /dev/null +++ b/extensions/src/quick-verse/.stylelintrc.js @@ -0,0 +1,20 @@ +// #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs + +module.exports = { + extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + overrides: [ + { + files: ['**/*.scss'], + customSyntax: 'postcss-scss', + }, + ], + rules: { + 'color-named': null, + 'max-nesting-depth': 2, + 'no-descending-specificity': null, + 'selector-max-compound-selectors': 4, + 'selector-max-id': 1, + }, +}; + +// #endregion diff --git a/extensions/src/quick-verse/.vscode/extensions.json b/extensions/src/quick-verse/.vscode/extensions.json new file mode 100644 index 0000000000..798b80874a --- /dev/null +++ b/extensions/src/quick-verse/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "stylelint.vscode-stylelint" + ] +} diff --git a/extensions/src/quick-verse/.vscode/launch.json b/extensions/src/quick-verse/.vscode/launch.json new file mode 100644 index 0000000000..fb0f3a08c0 --- /dev/null +++ b/extensions/src/quick-verse/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Watch and Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "watch"] + }, + { + "name": "Build WebViews", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:web-view"] + }, + { + "name": "Build Main", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build:main"] + }, + { + "name": "Build Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "skipFiles": ["/**"], + "runtimeArgs": ["run", "build"] + }, + { + "name": "Debug Platform with Extension", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223", + "IN_VSCODE": "true" + }, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } + }, + { + "name": "Attach to Platform app", + "type": "node", + "request": "attach", + "port": 5858, + "timeout": 15000 + }, + { + "name": "Attach to Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ] +} diff --git a/extensions/src/quick-verse/.vscode/settings.json b/extensions/src/quick-verse/.vscode/settings.json new file mode 100644 index 0000000000..cefc6be5ed --- /dev/null +++ b/extensions/src/quick-verse/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ] +} diff --git a/extensions/src/quick-verse/LICENSE b/extensions/src/quick-verse/LICENSE new file mode 100644 index 0000000000..851ff3e8d1 --- /dev/null +++ b/extensions/src/quick-verse/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/src/quick-verse/README.md b/extensions/src/quick-verse/README.md new file mode 100644 index 0000000000..a908bf5f88 --- /dev/null +++ b/extensions/src/quick-verse/README.md @@ -0,0 +1,88 @@ +# quick-verse + +Simple quick verse extension for Platform.Bible + +## Summary + +The general file structure is as follows: + +- `package.json` contains information about this extension's npm package. It is required for Platform.Bible to use the extension properly. It is copied into the build folder +- `manifest.json` is the manifest file that defines the extension and important properties for Platform.Bible. It is copied into the build folder +- `src/` contains the source code for the extension + - `src/main.ts` is the main entry file for the extension + - `src/types/paranext-extension-template.d.ts` is this extension's types file that defines how other extensions can use this extension through the `papi`. It is copied into the build folder + - `*.web-view.tsx` files will be treated as React WebViews + - `*.web-view.html` files are a conventional way to provide HTML WebViews (no special functionality) +- `assets/` contains asset files the extension and its WebViews can retrieve using the `papi-extension:` protocol, as well as textual descriptions in various languages. It is copied into the build folder + - `assets/displayData.json` contains (optionally) a path to the extension's icon file as well as text for the extension's display name, short summary, and path to the full description file + - `assets/descriptions/` contains textual descriptions of the extension in various languages + - `assets/descriptions/description-.md` contains a brief description of the extension in the language specified by `` +- `contributions/` contains JSON files the platform uses to extend data structures for things like menus and settings. The JSON files are referenced from the manifest +- `public/` contains other static files that are copied into the build folder +- `dist/` is a generated folder containing the built extension files +- `release/` is a generated folder containing a zip of the built extension files + +## To install + +### Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. In this repo, run `npm install` to install local and published dependencies + +### Configure paths to `paranext-core` repo + +In order to interact with `paranext-core`, you must point `package.json` to your installed `paranext-core` repository: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). We recommend you clone `paranext-core` in the same parent directory in which you cloned this repository so you do not have to reconfigure paths to `paranext-core`. +2. If you cloned `paranext-core` anywhere other than in the same parent directory in which you cloned this repository, update the paths to `paranext-core` in this repository's `package.json` to point to the correct `paranext-core` directory. + +## To run + +### Running Platform.Bible with this extension + +To run Platform.Bible with this extension: + +`npm start` + +Note: The built extension will be in the `dist` folder. In order for Platform.Bible to run this extension, you must provide the directory to this built extension to Platform.Bible via a command-line argument. This command-line argument is already provided in this `package.json`'s `start` script. If you want to start Platform.Bible and use this extension any other way, you must provide this command-line argument or put the `dist` folder into Platform.Bible's `extensions` folder. + +### Building this extension independently + +To watch extension files (in `src`) for changes: + +`npm run watch` + +To build the extension once: + +`npm run build` + +## To package for distribution + +To package this extension into a zip file for distribution: + +`npm run package` + +## To update this extension from the template + +This extension project is forked from [`paranext-extension-template`](https://github.com/paranext/paranext-extension-template), which is updated periodically and will sometimes receive updates that help with breaking changes on [`paranext-core`](https://github.com/paranext/paranext-core). We recommend you periodically update your extension by merging the latest template updates into your extension. + +To set up this extension to be updated from the template, run the following command once after cloning this repo: + +```bash +git remote add template https://github.com/paranext/paranext-extension-template +``` + +To update this extension from the template, make sure your repo has no working changes. Then run the following commands: + +```bash +git fetch template +git merge template/main --allow-unrelated-histories +``` + +For more information, read [the instructions on the wiki](https://github.com/paranext/paranext-extension-template/wiki/Merging-Template-Changes-into-Your-Extension). + +**Note:** The merge/squash commits created when updating this repo from the template are important; Git uses them to compare the files for future updates. If you edit this repo's Git history, please preserve these commits (do not squash them, for example) to avoid duplicated merge conflicts in the future. + +## Special features in this project + +This project has special features and specific configuration to make building an extension for Platform.Bible easier. See [Special features of `paranext-multi-extension-template`](https://github.com/paranext/paranext-multi-extension-template#special-features-of-the-template) for information on these special features. diff --git a/extensions/src/quick-verse/assets/ATTRIBUTION.md b/extensions/src/quick-verse/assets/ATTRIBUTION.md new file mode 100644 index 0000000000..c3f6639bf5 --- /dev/null +++ b/extensions/src/quick-verse/assets/ATTRIBUTION.md @@ -0,0 +1,8 @@ +# Attribution + +letter-q.png was obtained from [veryicon.com](https://www.veryicon.com/icons/emoticon/creative-gradient-alphanumeric-icon-cool/letter-q-6.html) which has the following comments: + +```text +Author: Vizovanver +License: Free for personal and commercial purpose. +``` diff --git a/extensions/src/quick-verse/assets/descriptions/description-en.md b/extensions/src/quick-verse/assets/descriptions/description-en.md new file mode 100644 index 0000000000..a75ca8ce5b --- /dev/null +++ b/extensions/src/quick-verse/assets/descriptions/description-en.md @@ -0,0 +1 @@ +Simple quick verse extension for Platform.Bible. diff --git a/extensions/src/quick-verse/assets/displayData.json b/extensions/src/quick-verse/assets/displayData.json new file mode 100644 index 0000000000..aa65b4e4a4 --- /dev/null +++ b/extensions/src/quick-verse/assets/displayData.json @@ -0,0 +1,12 @@ +{ + "icon": "", + "moreInfoUrl": "", + "supportUrl": "", + "localizedDisplayInfo": { + "en": { + "displayName": "Quick Verse Extension", + "shortSummary": "Simple quick verse extension", + "description": "assets/descriptions/description-en.md" + } + } +} diff --git a/extensions/src/quick-verse/assets/heresy-warning.txt b/extensions/src/quick-verse/assets/heresy-warning.txt new file mode 100644 index 0000000000..107f3e20fd --- /dev/null +++ b/extensions/src/quick-verse/assets/heresy-warning.txt @@ -0,0 +1 @@ +Heresy count: diff --git a/extensions/src/quick-verse/assets/letter-q.png b/extensions/src/quick-verse/assets/letter-q.png new file mode 100644 index 0000000000..9e01804607 Binary files /dev/null and b/extensions/src/quick-verse/assets/letter-q.png differ diff --git a/extensions/src/quick-verse/contributions/localizedStrings.json b/extensions/src/quick-verse/contributions/localizedStrings.json new file mode 100644 index 0000000000..56de66efd0 --- /dev/null +++ b/extensions/src/quick-verse/contributions/localizedStrings.json @@ -0,0 +1,6 @@ +{ + "metadata": {}, + "localizedStrings": { + "en": {} + } +} diff --git a/extensions/src/quick-verse/contributions/menus.json b/extensions/src/quick-verse/contributions/menus.json new file mode 100644 index 0000000000..f68441dcd6 --- /dev/null +++ b/extensions/src/quick-verse/contributions/menus.json @@ -0,0 +1,17 @@ +{ + "mainMenu": { + "columns": {}, + "groups": {}, + "items": [] + }, + "defaultWebViewTopMenu": { + "columns": {}, + "groups": {}, + "items": [] + }, + "defaultWebViewContextMenu": { + "groups": {}, + "items": [] + }, + "webViewMenus": {} +} diff --git a/extensions/src/quick-verse/contributions/projectSettings.json b/extensions/src/quick-verse/contributions/projectSettings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/quick-verse/contributions/projectSettings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/quick-verse/contributions/settings.json b/extensions/src/quick-verse/contributions/settings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/extensions/src/quick-verse/contributions/settings.json @@ -0,0 +1 @@ +[] diff --git a/extensions/src/quick-verse/cspell.json b/extensions/src/quick-verse/cspell.json new file mode 100644 index 0000000000..d78da5aafa --- /dev/null +++ b/extensions/src/quick-verse/cspell.json @@ -0,0 +1,3 @@ +{ + "import": "../../cspell.json" +} diff --git a/extensions/src/quick-verse/manifest.json b/extensions/src/quick-verse/manifest.json new file mode 100644 index 0000000000..41b5c09bd6 --- /dev/null +++ b/extensions/src/quick-verse/manifest.json @@ -0,0 +1,16 @@ +{ + "name": "quickVerse", + "version": "0.0.1", + "displayData": "assets/displayData.json", + "author": "Paranext", + "license": "MIT", + "main": "src/main.ts", + "extensionDependencies": {}, + "elevatedPrivileges": [], + "types": "src/types/quick-verse.d.ts", + "menus": "contributions/menus.json", + "settings": "contributions/settings.json", + "projectSettings": "contributions/projectSettings.json", + "localizedStrings": "contributions/localizedStrings.json", + "activationEvents": [] +} diff --git a/extensions/src/quick-verse/package.json b/extensions/src/quick-verse/package.json new file mode 100644 index 0000000000..f35cac0b75 --- /dev/null +++ b/extensions/src/quick-verse/package.json @@ -0,0 +1,87 @@ +{ + "name": "quick-verse", + "private": true, + "version": "0.0.1", + "description": "Simple quick verse extension for Platform.Bible", + "main": "src/main.js", + "types": "src/types/quick-verse.d.ts", + "author": "Paranext", + "license": "MIT", + "scripts": { + "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", + "build:main": "webpack --config ./webpack/webpack.config.main.ts", + "build": "webpack", + "watch": "npm run build -- --watch", + "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", + "watch:production": "npm run build:production -- --watch", + "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", + "package": "npm run build:production && npm run zip", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "start:core": "cd ../../.. && npm run start", + "start": "npm run start:core", + "start:production": "echo unimplemented", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + }, + "browserslist": [], + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + }, + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/extensions/src/quick-verse/src/main.ts b/extensions/src/quick-verse/src/main.ts new file mode 100644 index 0000000000..daa5fa4359 --- /dev/null +++ b/extensions/src/quick-verse/src/main.ts @@ -0,0 +1,315 @@ +import { VerseRef } from '@sillsdev/scripture'; +import papi, { logger, DataProviderEngine } from '@papi/backend'; +import type { + ExecutionActivationContext, + ExecutionToken, + DataProviderUpdateInstructions, + IDataProviderEngine, +} from '@papi/core'; +import type { QuickVerseDataTypes, QuickVerseSetData } from 'quick-verse'; + +logger.info('Quick Verse is importing!'); + +/** + * Example data provider engine that provides easy access to Scripture from an internet API. + * + * It has three data types: + * + * - Verse: get a portion of Scripture by its reference. You can also change the Scripture at a + * reference, but you have to clarify that you are heretical because you really shouldn't change + * published Scriptures like this ;) + * - Heresy: get or set Scripture freely. It automatically marks the verse as heretical if changed + * - Chapter: get a whole chapter of Scripture by book name and chapter number. Read-only + * + * - This data type is provided to demonstrate a more complex selector - an array of typed values. + * This is one way to make a `get` function that feels more like a normal function + * that has "multiple" parameters in its selector. + * + * For each data type, an engine needs a `get` and a `set`. + * + * Papi will create a data provider that internally uses this engine. The data provider layers over + * this engine and adds functionality like `subscribe` functions with automatic updates. + * + * This data provider engine is defined by a class, which we recommend trying once you get + * comfortable with the data provider api because of the following pros and cons: + * + * - Pros + * + * - Can freely add properties and methods without specifying them in an extra type + * - Can use private methods (prefix with `#`) that are automatically ignored by papi + * - Can use `@papi.dataProviders.decorators.ignore` to tell papi to ignore methods + * - Can extend `DataProviderEngine` so TypeScript will understand you can call `this.notifyUpdate` + * without specifying a `notifyUpdate` function + * - Can easily create multiple data providers from the same engine if you have two independent sets + * of data or something + * - Cons + * + * - Intellisense does not tell you all the `set` and `get` methods you need to + * provide, so it is slightly more challenging to use. However, TypeScript still shows an + * error unless you have the right methods. + * - You must specify parameter and return types. They are not inferred + * + * If you would like better Intellisense support to get familiar with the api, you can alternatively + * define a data provider engine with an object. An example of this is found in `hello-someone.ts`. + */ +class QuickVerseDataProviderEngine + extends DataProviderEngine + implements IDataProviderEngine +{ + /** + * Verses stored by the Data Provider. + * + * - Keys are Scripture References. + * - Values are { text: '', isChanged?: boolean } + */ + verses: { [scrRef: string]: { text: string; isChanged?: boolean } } = {}; + + /** Latest updated verse reference */ + latestVerseRef = 'JHN 11:35'; + + usfmDataProviderPromise = papi.projectDataProviders.get( + 'platformScripture.USFM_Verse', + '32664dc3288a28df2e2bb75ded887fc8f17a15fb', + ); + + /** Number of times any verse has been modified by a user this session */ + heresyCount = 0; + + /** @param heresyWarning String to prefix heretical data */ + constructor(public heresyWarning: string) { + // `DataProviderEngine`'s constructor currently does nothing, but TypeScript requires that we + // call it. + super(); + + this.heresyWarning = this.heresyWarning ?? 'heresyCount ='; + } + + /** + * Internal set method that doesn't send updates so we can update how we want from setVerse and + * setHeresy + * + * @param selector String Scripture reference + * @param data Verse string, and you must inform us that you are a heretic + * @returns '*' - update instructions for updating all data types because we want subscribers to + * Verse and Heresy data types to update based on this change. + * + * Note: this method is named `setInternal`, which would normally mean papi would consider it to + * be a data type method and would fail to use this engine because it would expect a + * `getInternal` as well. However, we added the `ignore` decorator, so papi will not pick it up. + * Alternatively, you can name it anything that doesn't start with `set` like `_setInternal` or + * `internalSet`. + */ + @papi.dataProviders.decorators.ignore + async setInternal( + selector: string, + data: QuickVerseSetData, + ): Promise> { + // Just get notifications of updates with the 'notify' selector. Nothing to change + if (selector === 'notify') return false; + + // You can't change scripture from just a string. You have to tell us you're a heretic + if (typeof data === 'string' || data instanceof String) return false; + + // Only heretics change Scripture, so you have to tell us you're a heretic + if (!data.isHeresy) return false; + + // If there is no change in the verse text, don't update + if (data.text === this.verses[this.#getSelector(selector)].text) return false; + + // Update the verse text, track the latest change, and send an update + this.verses[this.#getSelector(selector)] = { + text: data.text, + isChanged: true, + }; + if (selector !== 'latest') this.latestVerseRef = this.#getSelector(selector); + this.heresyCount += 1; + // Update all data types, so Verse and Heresy in this case + return '*'; + } + + /** + * Set a verse's text. You must manually specify that the verse contains heresy, or you cannot + * set. + * + * @param verseRef Verse reference to change + * @param data Verse string, and you must inform us that you are a heretic + * @returns '*' - update instructions for updating all data types because we want subscribers to + * Verse and Heresy data types to update based on this change. + * + * Note: this method gets layered over so that you can run `this.setVerse` inside this data + * provider engine, and it will send updates after returning. + * + * Note: this method is used when someone uses the `useData('quickVerse.quickVerse').Verse` hook + * on the data provider papi creates for this engine. + */ + async setVerse(verseRef: string, data: QuickVerseSetData) { + return this.setInternal(verseRef, data); + } + + /** + * Set a verse's text. Using this function implies that you identify as heresy, so you do not have + * to identify as heresy in any special way + * + * @param verseRef Verse reference to change + * @param verseText Text to update the verse to, you heretic + * @returns '*' - update instructions for updating all data types because we want subscribers to + * Verse and Heresy data types to update based on this change. + * + * Note: this method gets layered over so that you can run `this.setHeresy` inside this data + * provider engine, and it will send updates after returning. + * + * Note: this method is used when someone uses the `useData('quickVerse.quickVerse').Heresy` hook + * on the data provider papi creates for this engine. + */ + async setHeresy(verseRef: string, verseText: string) { + return this.setInternal(verseRef, { text: verseText, isHeresy: true }); + } + + /** + * Get a verse by its reference + * + * @param verseRef Verse reference to get + * @returns Verse contents at this reference + * + * Note: this method is used when someone uses the `useData('quickVerse.quickVerse').Verse` hook + * or the `subscribeVerse` method on the data provider papi creates for this engine. + */ + getVerse = async (verseRef: string) => { + // Just get notifications of updates with the 'notify' selector + if (verseRef === 'notify') return undefined; + const selector = this.#getSelector(verseRef); + + // Lookup the cached data first + let responseVerse = this.verses[selector]; + + // If we don't already have the verse cached, cache it + if (!responseVerse) { + // Fetch the verse, cache it, and return it + try { + const usfmDataProvider = await this.usfmDataProviderPromise; + if (!usfmDataProvider) throw Error('Unable to get USFM data provider'); + const verseData = usfmDataProvider.getVerseUSFM(new VerseRef(selector)); + responseVerse = { text: (await verseData) ?? `${selector} not found` }; + // Cache the verse text, track the latest cached verse, and send an update + this.verses[selector] = responseVerse; + this.latestVerseRef = selector; + this.notifyUpdate(); + } catch (e) { + responseVerse = { + text: `Failed to fetch ${selector} from USFM data provider! Reason: ${e}`, + }; + } + } + + if (responseVerse.isChanged) { + // Remove any previous heresy warning from the beginning of the text so they don't stack + responseVerse.text = responseVerse.text.replace(/^\[.* \d*\] /, ''); + return `[${this.heresyWarning} ${this.heresyCount}] ${responseVerse.text}`; + } + return responseVerse.text; + }; + + /** + * Get a verse by its reference. Need to provide a get for every set, so we specify getHeresy here + * which does the same thing as getVerse. + * + * @param verseRef Verse reference to get + * @returns Verse contents at this reference + * + * Note: this method is used when someone uses the `useData('quickVerse.quickVerse').Heresy` hook + * or the `subscribeHeresy` method on the data provider papi creates for this engine. + */ + async getHeresy(verseRef: string) { + return this.getVerse(verseRef); + } + + /** + * Does nothing (meaning the Chapter data type is read-only). This method is provided to match + * with `getChapter`. + * + * @returns False meaning do not update anything + */ + // Does nothing, so we don't need to use `this` + // eslint-disable-next-line class-methods-use-this + async setChapter() { + // We are not supporting setting chapters now, so don't update anything + return false; + } + + /** + * Get a chapter by its book name and chapter number. + * + * @example To get the contents of John 3, you can use `getChapter(['John', 3])`. + * + * Note: this method is used when someone uses the `useData('quickVerse.quickVerse').Chapter` hook + * or the `subscribeChapter` method on the data provider papi creates for this engine. + * + * @param chapterInfo Parameters for getting the chapter + * + * - `book` - the name of the book like 'John' + * - `chapter` - the chapter number + * + * @returns Full contents of the chapter + * + * This function demonstrates one way to make a `get` function that feels more like a + * normal function in that it has "multiple" parameters in its selector, which is an array of + * parameters. To use it, you have to wrap the parameters in an array. + */ + async getChapter(chapterInfo: [book: string, chapter: number]) { + const [book, chapter] = chapterInfo; + return this.getVerse(`${book} ${chapter}`); + } + + /** + * Private method that cannot be called on the network. Valid selectors: + * + * - `'notify'` - informs the listener of any changes in quick verse text but does not carry data + * - `'latest'` - the latest-updated quick verse text including pulling a verse from the server and + * a heretic changing the verse + * - Scripture Reference strings. Ex: `'Romans 1:16'` + * + * @param selector Selector provided by user + * @returns Selector for use internally + */ + #getSelector(selector: string) { + const selectorL = selector.toLowerCase().trim(); + return selectorL === 'latest' ? this.latestVerseRef : selectorL; + } +} + +export async function activate(context: ExecutionActivationContext): Promise { + logger.info('Quick Verse is activating!'); + + const token: ExecutionToken = context.executionToken; + const warning = await papi.storage.readTextFileFromInstallDirectory( + token, + 'assets/heresy-warning.txt', + ); + const engine = new QuickVerseDataProviderEngine(warning.trim()); + + let storedHeresyCount: number = 0; + try { + // If a user has never been a heretic, there is nothing to read + const loadedData = await papi.storage.readUserData(token, 'heresy-count'); + if (loadedData) storedHeresyCount = Number(loadedData); + } catch (error) { + logger.error(error); + } + engine.heresyCount = storedHeresyCount; + + const quickVerseDataProvider = await papi.dataProviders.registerEngine( + 'quickVerse.quickVerse', + engine, + ); + + quickVerseDataProvider.subscribeVerse('latest', () => { + if (storedHeresyCount === engine.heresyCount) return; + storedHeresyCount = engine.heresyCount; + papi.storage.writeUserData(token, 'heresy-count', String(storedHeresyCount)); + }); + + // Await the registration promises at the end so we don't hold everything else up + context.registrations.add(quickVerseDataProvider); + + logger.info('Quick Verse is finished activating!'); +} diff --git a/extensions/src/quick-verse/src/types/quick-verse.d.ts b/extensions/src/quick-verse/src/types/quick-verse.d.ts new file mode 100644 index 0000000000..451747d5c3 --- /dev/null +++ b/extensions/src/quick-verse/src/types/quick-verse.d.ts @@ -0,0 +1,21 @@ +declare module 'quick-verse' { + import { DataProviderDataType, IDataProvider } from '@papi/core'; + + export type QuickVerseSetData = string | { text: string; isHeresy: boolean }; + + export type QuickVerseDataTypes = { + Verse: DataProviderDataType; + Heresy: DataProviderDataType; + Chapter: DataProviderDataType<[book: string, chapter: number], string | undefined, never>; + }; + + export type QuickVerseDataProvider = IDataProvider; +} + +declare module 'papi-shared-types' { + import type { QuickVerseDataProvider } from 'quick-verse'; + + export interface DataProviders { + 'quickVerse.quickVerse': QuickVerseDataProvider; + } +} diff --git a/extensions/src/quick-verse/src/webpack-env.d.ts b/extensions/src/quick-verse/src/webpack-env.d.ts new file mode 100644 index 0000000000..97c42ef39f --- /dev/null +++ b/extensions/src/quick-verse/src/webpack-env.d.ts @@ -0,0 +1,157 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/src/webpack-env.d.ts + +/** + * Modules provided by our webpack configuration + * + * Please keep these JSDocs up-to-date with their counterparts in `webpack.config.base.ts` + */ + +// #region code and things + +/** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView files + * are an exception as they are fully bundled. + */ +declare module '*?inline' { + const content: string; + export default content; +} + +/** Import files with no transformation as strings with "./file?raw" */ +declare module '*?raw' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.scss' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.sass' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.css' { + const content: string; + export default content; +} + +// #endregion + +// #region images + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.png' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.svg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpeg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.gif' { + const content: string; + export default content; +} + +// #endregion + +// #region fonts + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff2' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.eot' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.ttf' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.otf' { + const content: string; + export default content; +} + +// #endregion + +// #endregion diff --git a/extensions/src/quick-verse/tsconfig.json b/extensions/src/quick-verse/tsconfig.json new file mode 100644 index 0000000000..29f4025b9c --- /dev/null +++ b/extensions/src/quick-verse/tsconfig.json @@ -0,0 +1,54 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../../../lib", + // Include core extensions' type declarations + "../../../extensions/src", + // Include this extension's type declarations. It's in this location so there aren't any + // unexpected files there for typeRoots to include + "src/types" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/src/quick-verse/tsconfig.lint.json b/extensions/src/quick-verse/tsconfig.lint.json new file mode 100644 index 0000000000..2a82a6c426 --- /dev/null +++ b/extensions/src/quick-verse/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.js", "*.cjs", "*.js", "*.ts", "src", "webpack"] +} diff --git a/extensions/src/quick-verse/webpack.config.ts b/extensions/src/quick-verse/webpack.config.ts new file mode 100644 index 0000000000..64f328446c --- /dev/null +++ b/extensions/src/quick-verse/webpack.config.ts @@ -0,0 +1,15 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack.config.ts + +import webpack from 'webpack'; +import configWebView from './webpack/webpack.config.web-view'; +import configMain from './webpack/webpack.config.main'; + +// Note: Using a .ts file as the webpack config requires not having "type": "module" in package.json +// https://stackoverflow.com/a/76005614 + +// We want to build web views and then build main +const config: webpack.Configuration[] = [configWebView, configMain]; + +export default config; + +// #endregion diff --git a/extensions/src/quick-verse/webpack/web-view-resolve-webpack-plugin.ts b/extensions/src/quick-verse/webpack/web-view-resolve-webpack-plugin.ts new file mode 100644 index 0000000000..ad28003bab --- /dev/null +++ b/extensions/src/quick-verse/webpack/web-view-resolve-webpack-plugin.ts @@ -0,0 +1,116 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/web-view-resolve-webpack-plugin.ts + +import { Resolver } from 'webpack'; +import { getWebViewTempPath, webViewTempDir, webViewTsxRegex } from './webpack.util'; + +// Webpack resolve plugins are enhanced-resolve plugins, which use tapable under the hood. +// Unfortunately, most of this api is very scantly documented, so I pretty much went off of examples +// and trial-and-error. I added lots of documentation here so there is at least some documentation. +// enhanced-resolve https://github.com/webpack/enhanced-resolve +// tapable https://github.com/webpack/tapable +// enhanced-resolve plugin examples https://github.com/webpack/enhanced-resolve/blob/main/lib/ExtensionAliasPlugin.js +// DirectoryNamedWebpackPlugin https://github.com/shaketbaby/directory-named-webpack-plugin/blob/master/index.js +/** Webpack resolution plugin that redirects WebView imports to their compiled version */ +export default class WebViewResolveWebpackPlugin { + // I didn't find much on what the hooks are called, but maybe at least some of them are the keys + // of KnownHooks: https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/types.d.ts#L240 + // Also https://github.com/webpack/webpack/issues/6817#issuecomment-542448438 shows how to add + // path alias functionality with this plugin syntax. + // However, it seems the mystery of available hooks is not solved as DirectoryNamedWebpackPlugin + // uses hook names that are not in KnownHooks. + /** Tap into the enhanced-resolve "resolve" hook with our resolve logic. */ + readonly source = 'resolve'; + /** Feed into the enhanced-resolve "resolve" hook from our resolve logic */ + readonly target = 'resolve'; + + /** + * Function that applies this plugin to webpack resolving. Use the resolver to "tap into" webpack + * resolving with our own logic + * + * @param resolver + */ + apply(resolver: Resolver) { + // Get the resolve hook for performing a new resolve for some reason. + // Just following what is in examples - not sure why do this instead of using the same hook + // in both places and why use `ensureHook` here and `getHook` below. + const target = resolver.ensureHook(this.target); + resolver + // Get the resolve hook + .getHook(this.source) + // Add our plugin to the list of resolvers to run + .tapAsync( + // Internally note that this is our plugin + 'WebViewResolveWebpackPlugin', + /** + * The logic to add to webpack resolving so it will look in the temp dir for built code. + * + * @param request Information about the resolve request + * @param resolveContext Information about the process the hook has taken to get here + * @param callback Function to run to continue the resolution process + * + * - Call with no parameters to continue resolving like this plugin did nothing + * - Call with first parameter null and second parameter a fully resolved `{ path, + * relativePath }` (including file extension) to conclude resolving at that file + * - Call with first parameter `string` or `Error` or something (not sure) to indicate error + * - Note: another option is to call `resolver.doResolve` to start the resolution process over + * with a new `path` and `relativePath` that do not need to be fully resolved. Just + * make sure that second call can't come into your hook again and cause another + * `resolver.doResolve`, or you will have an infinite loop. We pass this `callback` + * param into `resolver.doResolve`, and it calls it automatically + * + * @returns Seems it doesn't matter if or what you return. Just return to quit early + */ + (request, resolveContext, callback) => { + // If the request is somehow not defined (not sure how - just part of the type definition) + // or already has the temp dir in the path (meaning we have already modified the path), + // continue resolving without this plugin so we do not edit the request a second time + if ( + // If somehow it isn't a request, do not edit it. Not sure when this would happen + !request.request || + request.request.includes(`/${webViewTempDir}/`) + ) + // Continue resolving without changing anything with this plugin + return callback(); + + // Get the ?stuff aka the resource query on the request path (includes the ?) + let resourceQuery = request.query; + let requestPath = request.request; + // request.query sometimes doesn't have the ?stuff in it for some reason, so get it + // manually from the request path if it isn't already in request.query + if (!request.query) { + const queryInd = requestPath.lastIndexOf('?'); + // If there is a ? and something after it in the request path, use that as the resource + // query + if (queryInd >= 0 && queryInd < requestPath.length - 1) { + resourceQuery = requestPath.substring(queryInd); + requestPath = requestPath.substring(0, queryInd); + } + } + + // If it isn't calling for a webView, continue resolving without changing anything here + if (!webViewTsxRegex.test(requestPath)) return callback(); + + // Get the path to the relevant file in the temp dir + // Note: this path must keep the ./ at the start, or webpack won't resolve it correctly + let tempViewPath = getWebViewTempPath(requestPath, resolver.join); + // Add the query back onto the request path if it was originally there + if (!request.query) tempViewPath += resourceQuery; + + // Resolve this file but in the temp dir + resolver.doResolve( + target, + { + ...request, + request: tempViewPath, + }, + `Added temp dir to resolve request path: ${tempViewPath}`, + resolveContext, + callback, + ); + return undefined; + }, + ); + } +} + +// #endregion diff --git a/extensions/src/quick-verse/webpack/webpack.config.base.ts b/extensions/src/quick-verse/webpack/webpack.config.base.ts new file mode 100644 index 0000000000..3eafc61c32 --- /dev/null +++ b/extensions/src/quick-verse/webpack/webpack.config.base.ts @@ -0,0 +1,159 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts + +import path from 'path'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import webpack from 'webpack'; + +const isDev = process.env.NODE_ENV !== 'production'; +const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; + +/** The base directory from which webpack should operate (should be the root repo folder) */ +export const rootDir = path.resolve(__dirname, '..'); + +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + +// Note: we do not want to do any chunking because neither webViews nor main can import dependencies +// other than those listed in configBase.externals. Each webView must contain all its dependency +// code, and main must contain all its dependency code. +/** Webpack configuration shared by webView building and main building */ +const configBase: webpack.Configuration = { + // The operating directory for webpack instead of current working directory + context: rootDir, + mode: isDev ? 'development' : 'production', + // Bundle the sourcemap into the file since webviews are injected as strings into the main file + devtool: shouldGenerateSourceMaps ? 'inline-source-map' : false, + watchOptions: { + ignored: ['**/node_modules'], + }, + // Use require for externals as it is the only type of importing that Platform.Bible supports + // https://webpack.js.org/configuration/externals/#externalstypecommonjs + externalsType: LIBRARY_TYPE, + // Modules that Platform.Bible supplies to extensions https://webpack.js.org/configuration/externals/ + // All other dependencies must be bundled into the extension + externals: [ + 'react', + 'react/jsx-runtime', + 'react-dom', + 'react-dom/client', + '@papi/backend', + '@papi/core', + '@papi/frontend', + '@papi/frontend/react', + '@sillsdev/scripture', + 'platform-bible-utils', + ], + module: { + // Please keep these JSDocs up-to-date with their counterparts in `webpack-env.d.ts` + rules: [ + /** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView + * files are an exception as they are fully bundled. + */ + // This must be the first rule in order to be applied after all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /inline/, + type: 'asset/source', + }, + // Load TypeScript with SWC https://swc.rs/docs/usage/swc-loader + // If this seems to cause problems, you can try switching to ts-loader for more compatibility + // https://github.com/TypeStrong/ts-loader#options + { + test: /\.tsx?$/, + use: { + loader: 'swc-loader', + options: { + // Lots of configuration at https://swc.rs/docs/configuration/compilation - if building + // isn't working because of some error that looks like normal code, it may be something + // in swc isn't enabled. + // Found how to configure at https://stackoverflow.com/questions/76671009/how-to-properly-configure-swc-loader-with-webpack-when-switching-from-ts-loader + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + }, + }, + }, + exclude: /node_modules/, + }, + /** Import scss, sass, and css files as strings */ + // https://webpack.js.org/loaders/sass-loader/#getting-started + { + test: /\.(sa|sc|c)ss$/, + use: [ + // We are not using style-loader since we are passing styles to papi, not inserting them + // into dom. style-loader would add html style elements for our styles if we used it + // We are not using css-loader since we are getting style files using ?inline. css-loader + // would allow us to import CSS into CommonJS + // Compiles Sass to CSS + 'sass-loader', + ], + }, + /** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-images + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/inline', + }, + /** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/inline', + }, + /** Import files with no transformation as strings with "./file?raw" */ + // This must be the last rule in order to be applied before all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /raw/, + type: 'asset/source', + }, + ], + }, + resolve: { + // If no file extension is provided on file path imports, use these extensions left-to-right + // https://webpack.js.org/guides/typescript/#basic-setup + extensions: ['.tsx', '.ts', '.js'], + plugins: [ + // use tsconfig.json paths https://www.npmjs.com/package/tsconfig-paths-webpack-plugin + new TsconfigPathsPlugin(), + ], + // Load `platform-bible-react`' `dependencies` from `paranext-core` so the extension will share + // these dependencies with the bundled copy of `platform-bible-react` and avoid duplicate + // packages. These paths are broken up like this so multi-extension folder can format the path + // properly + // https://webpack.js.org/configuration/resolve/#resolvealias + // TODO: Remove this when `platform-bible-react` is published to npm + alias: { + '@emotion/react': path.resolve(__dirname, '..', '../../../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../../../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../../../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../../../node_modules/react-data-grid'), + }, + }, +}; + +export default configBase; + +// #endregion diff --git a/extensions/src/quick-verse/webpack/webpack.config.main.ts b/extensions/src/quick-verse/webpack/webpack.config.main.ts new file mode 100644 index 0000000000..5a25bc6dde --- /dev/null +++ b/extensions/src/quick-verse/webpack/webpack.config.main.ts @@ -0,0 +1,69 @@ +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import CopyPlugin from 'copy-webpack-plugin'; +import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; +import { outputFolder } from './webpack.util'; + +/** Webpack configuration for building main */ +const configMain: webpack.Configuration = merge(configBase, { + // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.main.ts + + // Build for node since Platform.Bible loads this in node https://webpack.js.org/concepts/targets/ + target: 'node', + // configuration name + name: 'main', + // wait until webView bundling finishes - webpack.config.web-view.ts + dependencies: ['webView'], + // Instructions on what output to create + output: { + // extension output directory + path: path.resolve(rootDir, outputFolder), + // Exporting the library https://webpack.js.org/guides/author-libraries/#expose-the-library + library: { + type: LIBRARY_TYPE, + }, + // Empty the output folder before building + clean: true, + }, + resolve: { + plugins: [ + // Get web view files from the temp dir where they are built + new WebViewResolveWebpackPlugin(), + ], + }, + + // #endregion + + // extension main source file to build + // Note: this could have just been the import string if we put the filename in `output`, but + // splitting it out like this allows us to share `output` with `paranext-core`. + entry: { + main: { + import: './src/main.ts', + filename: './src/main.js', + }, + }, + plugins: [ + // Copy static files to the output folder https://webpack.js.org/plugins/copy-webpack-plugin/ + new CopyPlugin({ + patterns: [ + // We want all files from the public folder copied into the output folder + { from: 'public', to: './', noErrorOnMissing: true }, + // We want all files from the assets folder copied into the output folder under assets + { from: 'assets', to: './assets/', noErrorOnMissing: true }, + // We want all files from the contributions folder copied into the output folder under contributions + { from: 'contributions', to: './contributions/', noErrorOnMissing: true }, + // Copy this extension's type declaration file into the output folder under src/types + { from: 'src/types', to: './src/types', noErrorOnMissing: true }, + // We need to distribute the package.json for Platform.Bible to read the extension properly + { from: 'package.json', to: './', noErrorOnMissing: true }, + // We need to distribute the manifest.json to inform Platform.Bible about the extension + { from: 'manifest.json', to: './' }, + ], + }), + ], +}); + +export default configMain; diff --git a/extensions/src/quick-verse/webpack/webpack.config.web-view.ts b/extensions/src/quick-verse/webpack/webpack.config.web-view.ts new file mode 100644 index 0000000000..ef53636caf --- /dev/null +++ b/extensions/src/quick-verse/webpack/webpack.config.web-view.ts @@ -0,0 +1,24 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.web-view.ts + +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import configBase, { rootDir } from './webpack.config.base'; +import { getWebViewEntries } from './webpack.util'; + +/** Webpack configuration for building webViews */ +const configWebView: webpack.Configuration = merge(configBase, { + // Build for web since Platform.Bible loads WebViews in browser https://webpack.js.org/concepts/targets/ + target: 'web', + // configuration name so we can depend on it in main + name: 'webView', + // instructions to build each extension webview source file + entry: getWebViewEntries, + output: { + // Build all the web views in the folders where they are with the temp dir appended + path: rootDir, + }, +}); + +export default configWebView; + +// #endregion diff --git a/extensions/src/quick-verse/webpack/webpack.util.ts b/extensions/src/quick-verse/webpack/webpack.util.ts new file mode 100644 index 0000000000..cf465e3832 --- /dev/null +++ b/extensions/src/quick-verse/webpack/webpack.util.ts @@ -0,0 +1,77 @@ +import webpack from 'webpack'; +import path from 'path'; +import { glob } from 'glob'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.util.ts + +/** + * String of what a web view needs to have in its name before the file extension to be considered a + * web-view + * + * Web Views should be named .web-view. + */ +const webViewTag = '.web-view'; +/** Glob filename matcher for React web views. React Web Views should be named .web-view.tsx */ +const webViewTsxGlob = '**/*.web-view.tsx'; +/** + * Regex file name matcher for React web views. React Web Views should be named .web-view.tsx + * + * Note: this regex allows the extension to be optional. + */ +export const webViewTsxRegex = /.+\.web-view(\.[tj]sx)?$/; +/** Name of adjacent folder used to store bundled WebView files */ +export const webViewTempDir = 'temp-build'; + +/** Folder containing the built extension files */ +export const outputFolder = 'dist'; + +/** Get a list of TypeScript WebView files to bundle. Path relative to project root */ +function getWebViewTsxPaths() { + return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); +} + +/** + * Gets the bundled WebView path for a WebView file path + * + * @param webViewPath Relative path to webView e.g. './src/extension-template.web-view.tsx' + * @param join Function to use to join the paths together + * @returns WebView path with temporary WebView directory inserted into the module path + */ +export function getWebViewTempPath( + webViewPath: string, + join: (path: string, request: string) => string = path.join, +) { + const webViewInfo = path.parse(webViewPath); + + // If the web view doesn't have a file extension, parsing makes it think the extension is + // '.web-view', so we need to add it back + const webViewName = webViewInfo.ext === webViewTag ? webViewInfo.base : webViewInfo.name; + // Put transpiled WebViews in a temp folder in the same directory as the original WebView + // Make sure to preserve the ./ to indicate it is a relative path + return `${webViewPath.startsWith('./') ? './' : ''}${join( + webViewInfo.dir, + join(webViewTempDir, `${webViewName}.js`), + )}`; +} + +/** + * Get webpack entry configuration to build each web-view source file and put it in a temporary + * folder in the same directory + * + * @returns Promise that resolves to the webView entry config + */ +export async function getWebViewEntries(): Promise { + const tsxWebViews = await getWebViewTsxPaths(); + const webViewEntries = Object.fromEntries( + tsxWebViews.map((webViewPath): [string, webpack.EntryObject[string]] => [ + webViewPath, + { + import: webViewPath, + filename: getWebViewTempPath(webViewPath), + }, + ]), + ); + return webViewEntries; +} + +// #endregion diff --git a/extensions/src/webpack-env.d.ts b/extensions/src/webpack-env.d.ts new file mode 100644 index 0000000000..5c9edcc042 --- /dev/null +++ b/extensions/src/webpack-env.d.ts @@ -0,0 +1,157 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/src/webpack-env.d.ts + +/** + * Modules provided by our webpack configuration + * + * Please keep these JSDocs up-to-date with their counterparts in `webpack.config.base.ts` + */ + +// #region code and things + +/** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView files + * are an exception as they are fully bundled. + */ +declare module '*?inline' { + const content: string; + export default content; +} + +/** Import files with no transformation as strings with "./file?raw" */ +declare module '*?raw' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.scss' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.sass' { + const content: string; + export default content; +} + +/** Import scss, sass, and css files as strings */ +declare module '*.css' { + const content: string; + export default content; +} + +// #endregion + +// #region images + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.png' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.svg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.jpeg' { + const content: string; + export default content; +} + +/** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.gif' { + const content: string; + export default content; +} + +// #endregion + +// #region fonts + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.woff2' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.eot' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.ttf' { + const content: string; + export default content; +} + +/** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ +declare module '*.otf' { + const content: string; + export default content; +} + +// #endregion + +// #endregion diff --git a/extensions/tsconfig.json b/extensions/tsconfig.json new file mode 100644 index 0000000000..f2cdd36969 --- /dev/null +++ b/extensions/tsconfig.json @@ -0,0 +1,51 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + // ts-node needs this to load webpack.config.ts for some reason. Errs otherwise + // https://webpack.js.org/configuration/configuration-languages/#typescript + // Using a separate config file just for webpack.config.ts by using environment variable + // TS_NODE_PROJECT was making tsconfig-paths-webpack-plugin use the other config, not this + // original tsconfig.json, so these path aliases wouldn't work + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + // Platform.Bible requires modules to be CommonJS + // Running webpack.config.ts also requires CommonJS + // https://webpack.js.org/configuration/configuration-languages/#typescript + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx", + "typeRoots": [ + // Include default type declarations + "./node_modules/@types", + // Include papi-dts type declarations (for papi.d.ts) + "../lib", + // Include these bundled extensions' type declarations + "./src" + ], + // Papi exposes decorators for use in classes + "experimentalDecorators": true, + // We want sourcemaps so we can bundle them with webpack + "sourceMap": true, + // We need a baseurl for webpack's tsconfig path aliases plugin + "baseUrl": "./", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "ts-node": { + // This allows us to use path aliases in ts-node + "require": ["tsconfig-paths/register"], + // This allows us to run webpack even if there are type errors in the webpack configs. Optional + "transpileOnly": true + } +} diff --git a/extensions/tsconfig.lint.json b/extensions/tsconfig.lint.json new file mode 100644 index 0000000000..8f1fa8e9de --- /dev/null +++ b/extensions/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.cjs", "*.cjs", "*.js", "*.ts", "lib", "src", "webpack"] +} diff --git a/extensions/webpack.config.ts b/extensions/webpack.config.ts new file mode 100644 index 0000000000..815804cd83 --- /dev/null +++ b/extensions/webpack.config.ts @@ -0,0 +1,18 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack.config.ts + +import webpack from 'webpack'; +import configWebView from './webpack/webpack.config.web-view'; +import configMain from './webpack/webpack.config.main'; + +// Note: Using a .ts file as the webpack config requires not having "type": "module" in package.json +// https://stackoverflow.com/a/76005614 + +// We want to build web views and then build main +const config: (webpack.Configuration | (() => Promise))[] = [ + configWebView, + configMain, +]; + +export default config; + +// #endregion diff --git a/extensions/webpack/web-view-resolve-webpack-plugin.ts b/extensions/webpack/web-view-resolve-webpack-plugin.ts new file mode 100644 index 0000000000..c9aa94e663 --- /dev/null +++ b/extensions/webpack/web-view-resolve-webpack-plugin.ts @@ -0,0 +1,116 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/web-view-resolve-webpack-plugin.ts + +import { Resolver } from 'webpack'; +import { getWebViewTempPath, webViewTempDir, webViewTsxRegex } from './webpack.util'; + +// Webpack resolve plugins are enhanced-resolve plugins, which use tapable under the hood. +// Unfortunately, most of this api is very scantly documented, so I pretty much went off of examples +// and trial-and-error. I added lots of documentation here so there is at least some documentation. +// enhanced-resolve https://github.com/webpack/enhanced-resolve +// tapable https://github.com/webpack/tapable +// enhanced-resolve plugin examples https://github.com/webpack/enhanced-resolve/blob/main/lib/ExtensionAliasPlugin.js +// DirectoryNamedWebpackPlugin https://github.com/shaketbaby/directory-named-webpack-plugin/blob/master/index.js +/** Webpack resolution plugin that redirects WebView imports to their compiled version */ +export default class WebViewResolveWebpackPlugin { + // I didn't find much on what the hooks are called, but maybe at least some of them are the keys + // of KnownHooks: https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/types.d.ts#L240 + // Also https://github.com/webpack/webpack/issues/6817#issuecomment-542448438 shows how to add + // path alias functionality with this plugin syntax. + // However, it seems the mystery of available hooks is not solved as DirectoryNamedWebpackPlugin + // uses hook names that are not in KnownHooks. + /** Tap into the enhanced-resolve "resolve" hook with our resolve logic. */ + readonly source = 'resolve'; + /** Feed into the enhanced-resolve "resolve" hook from our resolve logic */ + readonly target = 'resolve'; + + /** + * Function that applies this plugin to webpack resolving. Use the resolver to "tap into" webpack + * resolving with our own logic + * + * @param resolver + */ + apply(resolver: Resolver) { + // Get the resolve hook for performing a new resolve for some reason. + // Just following what is in examples - not sure why do this instead of using the same hook + // in both places and why use `ensureHook` here and `getHook` below. + const target = resolver.ensureHook(this.target); + resolver + // Get the resolve hook + .getHook(this.source) + // Add our plugin to the list of resolvers to run + .tapAsync( + // Internally note that this is our plugin + 'WebViewResolveWebpackPlugin', + /** + * The logic to add to webpack resolving so it will look in the temp dir for built code. + * + * @param request Information about the resolve request + * @param resolveContext Information about the process the hook has taken to get here + * @param callback Function to run to continue the resolution process + * + * - Call with no parameters to continue resolving like this plugin did nothing + * - Call with first parameter null and second parameter a fully resolved `{ path, + * relativePath }` (including file extension) to conclude resolving at that file + * - Call with first parameter `string` or `Error` or something (not sure) to indicate error + * - Note: another option is to call `resolver.doResolve` to start the resolution process over + * with a new `path` and `relativePath` that do not need to be fully resolved. Just + * make sure that second call can't come into your hook again and cause another + * `resolver.doResolve`, or you will have an infinite loop. We pass this `callback` + * param into `resolver.doResolve`, and it calls it automatically + * + * @returns Seems it doesn't matter if or what you return. Just return to quit early + */ + (request, resolveContext, callback) => { + // If the request is somehow not defined (not sure how - just part of the type definition) + // or already has the temp dir in the path (meaning we have already modified the path), + // continue resolving without this plugin so we do not edit the request a second time + if ( + // If somehow it isn't a request, do not edit it. Not sure when this would happen + !request.request || + request.request.includes(`/${webViewTempDir}/`) + ) + // Continue resolving without changing anything with this plugin + return callback(); + + // Get the ?stuff aka the resource query on the request path (includes the ?) + let resourceQuery = request.query; + let requestPath = request.request; + // request.query sometimes doesn't have the ?stuff in it for some reason, so get it + // manually from the request path if it isn't already in request.query + if (!request.query) { + const queryInd = requestPath.lastIndexOf('?'); + // If there is a ? and something after it in the request path, use that as the resource + // query + if (queryInd >= 0 && queryInd < requestPath.length - 1) { + resourceQuery = requestPath.substring(queryInd); + requestPath = requestPath.substring(0, queryInd); + } + } + + // If it isn't calling for a webView, continue resolving without changing anything here + if (!webViewTsxRegex.test(requestPath)) return callback(); + + // Get the path to the relevant file in the temp dir + // Note: this path must keep the ./ at the start, or webpack won't resolve it correctly + let tempViewPath = getWebViewTempPath(requestPath, resolver.join); + // Add the query back onto the request path if it was originally there + if (!request.query) tempViewPath += resourceQuery; + + // Resolve this file but in the temp dir + resolver.doResolve( + target, + { + ...request, + request: tempViewPath, + }, + `Added temp dir to resolve request path: ${tempViewPath}`, + resolveContext, + callback, + ); + return undefined; + }, + ); + } +} + +// #endregion diff --git a/extensions/webpack/webpack.config.base.ts b/extensions/webpack/webpack.config.base.ts new file mode 100644 index 0000000000..5f579faf71 --- /dev/null +++ b/extensions/webpack/webpack.config.base.ts @@ -0,0 +1,159 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.config.base.ts + +import path from 'path'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import webpack from 'webpack'; + +const isDev = process.env.NODE_ENV !== 'production'; +const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; + +/** The base directory from which webpack should operate (should be the root repo folder) */ +export const rootDir = path.resolve(__dirname, '..'); + +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + +// Note: we do not want to do any chunking because neither webViews nor main can import dependencies +// other than those listed in configBase.externals. Each webView must contain all its dependency +// code, and main must contain all its dependency code. +/** Webpack configuration shared by webView building and main building */ +const configBase: webpack.Configuration = { + // The operating directory for webpack instead of current working directory + context: rootDir, + mode: isDev ? 'development' : 'production', + // Bundle the sourcemap into the file since webviews are injected as strings into the main file + devtool: shouldGenerateSourceMaps ? 'inline-source-map' : false, + watchOptions: { + ignored: ['**/node_modules'], + }, + // Use require for externals as it is the only type of importing that Platform.Bible supports + // https://webpack.js.org/configuration/externals/#externalstypecommonjs + externalsType: LIBRARY_TYPE, + // Modules that Platform.Bible supplies to extensions https://webpack.js.org/configuration/externals/ + // All other dependencies must be bundled into the extension + externals: [ + 'react', + 'react/jsx-runtime', + 'react-dom', + 'react-dom/client', + '@papi/backend', + '@papi/core', + '@papi/frontend', + '@papi/frontend/react', + '@sillsdev/scripture', + 'platform-bible-utils', + ], + module: { + // Please keep these JSDocs up-to-date with their counterparts in `webpack-env.d.ts` + rules: [ + /** + * Import fully loaded and transformed files as strings with "./file?inline" + * + * WARNING: These files are NOT bundled. The rules are applied, but webpack does not bundle + * dependencies into these files before providing them, unfortunately. However, React WebView + * files are an exception as they are fully bundled. + */ + // This must be the first rule in order to be applied after all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /inline/, + type: 'asset/source', + }, + // Load TypeScript with SWC https://swc.rs/docs/usage/swc-loader + // If this seems to cause problems, you can try switching to ts-loader for more compatibility + // https://github.com/TypeStrong/ts-loader#options + { + test: /\.tsx?$/, + use: { + loader: 'swc-loader', + options: { + // Lots of configuration at https://swc.rs/docs/configuration/compilation - if building + // isn't working because of some error that looks like normal code, it may be something + // in swc isn't enabled. + // Found how to configure at https://stackoverflow.com/questions/76671009/how-to-properly-configure-swc-loader-with-webpack-when-switching-from-ts-loader + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + }, + }, + }, + exclude: /node_modules/, + }, + /** Import scss, sass, and css files as strings */ + // https://webpack.js.org/loaders/sass-loader/#getting-started + { + test: /\.(sa|sc|c)ss$/, + use: [ + // We are not using style-loader since we are passing styles to papi, not inserting them + // into dom. style-loader would add html style elements for our styles if we used it + // We are not using css-loader since we are getting style files using ?inline. css-loader + // would allow us to import CSS into CommonJS + // Compiles Sass to CSS + 'sass-loader', + ], + }, + /** + * Load images as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-images + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/inline', + }, + /** + * Load fonts as data uris + * + * Note: it is generally advised to use the `papi-extension:` protocol to load assets + */ + // https://webpack.js.org/guides/asset-management/#loading-fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/inline', + }, + /** Import files with no transformation as strings with "./file?raw" */ + // This must be the last rule in order to be applied before all other transformations + // https://webpack.js.org/guides/asset-modules/#replacing-inline-loader-syntax + { + resourceQuery: /raw/, + type: 'asset/source', + }, + ], + }, + resolve: { + // If no file extension is provided on file path imports, use these extensions left-to-right + // https://webpack.js.org/guides/typescript/#basic-setup + extensions: ['.tsx', '.ts', '.js'], + plugins: [ + // use tsconfig.json paths https://www.npmjs.com/package/tsconfig-paths-webpack-plugin + new TsconfigPathsPlugin(), + ], + // Load `platform-bible-react`' `dependencies` from `paranext-core` so the extension will share + // these dependencies with the bundled copy of `platform-bible-react` and avoid duplicate + // packages. These paths are broken up like this so multi-extension folder can format the path + // properly + // https://webpack.js.org/configuration/resolve/#resolvealias + // TODO: Remove this when `platform-bible-react` is published to npm + alias: { + '@emotion/react': path.resolve(__dirname, '..', '../node_modules/@emotion/react'), + '@emotion/styled': path.resolve(__dirname, '..', '../node_modules/@emotion/styled'), + '@mui/material': path.resolve(__dirname, '..', '../node_modules/@mui/material'), + 'react-data-grid': path.resolve(__dirname, '..', '../node_modules/react-data-grid'), + }, + }, +}; + +export default configBase; + +// #endregion diff --git a/extensions/webpack/webpack.config.main.ts b/extensions/webpack/webpack.config.main.ts new file mode 100644 index 0000000000..2258c1c307 --- /dev/null +++ b/extensions/webpack/webpack.config.main.ts @@ -0,0 +1,58 @@ +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import CopyPlugin from 'copy-webpack-plugin'; +import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; +import { + outputFolder, + getExtensions, + getMainCopyFilePatterns, + getMainEntries, +} from './webpack.util'; + +/** Webpack configuration for building main */ +const configMain: () => Promise = async () => { + const extensions = await getExtensions(); + + return merge(configBase, { + // #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.config.main.ts + + // Build for node since Platform.Bible loads this in node https://webpack.js.org/concepts/targets/ + target: 'node', + // configuration name + name: 'main', + // wait until webView bundling finishes - webpack.config.web-view.ts + dependencies: ['webView'], + // Instructions on what output to create + output: { + // extension output directory + path: path.resolve(rootDir, outputFolder), + // Exporting the library https://webpack.js.org/guides/author-libraries/#expose-the-library + library: { + type: LIBRARY_TYPE, + }, + // Empty the output folder before building + clean: true, + }, + resolve: { + plugins: [ + // Get web view files from the temp dir where they are built + new WebViewResolveWebpackPlugin(), + ], + }, + + // #endregion + + // instructions to build each extension main source file + entry: () => getMainEntries(extensions), + plugins: [ + // Copy static files to the output folder https://webpack.js.org/plugins/copy-webpack-plugin/ + new CopyPlugin({ + patterns: getMainCopyFilePatterns(extensions), + }), + ], + }); +}; + +export default configMain; diff --git a/extensions/webpack/webpack.config.web-view.ts b/extensions/webpack/webpack.config.web-view.ts new file mode 100644 index 0000000000..6fe6631c29 --- /dev/null +++ b/extensions/webpack/webpack.config.web-view.ts @@ -0,0 +1,24 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.config.web-view.ts + +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import configBase, { rootDir } from './webpack.config.base'; +import { getWebViewEntries } from './webpack.util'; + +/** Webpack configuration for building webViews */ +const configWebView: webpack.Configuration = merge(configBase, { + // Build for web since Platform.Bible loads WebViews in browser https://webpack.js.org/concepts/targets/ + target: 'web', + // configuration name so we can depend on it in main + name: 'webView', + // instructions to build each extension webview source file + entry: getWebViewEntries, + output: { + // Build all the web views in the folders where they are with the temp dir appended + path: rootDir, + }, +}); + +export default configWebView; + +// #endregion diff --git a/extensions/webpack/webpack.util.ts b/extensions/webpack/webpack.util.ts new file mode 100644 index 0000000000..022e37e1c0 --- /dev/null +++ b/extensions/webpack/webpack.util.ts @@ -0,0 +1,404 @@ +import webpack from 'webpack'; +import path from 'path'; +import { glob } from 'glob'; +import fs from 'fs'; +import { Pattern } from 'copy-webpack-plugin'; +import { LIBRARY_TYPE } from './webpack.config.base'; + +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.util.ts + +/** + * String of what a web view needs to have in its name before the file extension to be considered a + * web-view + * + * Web Views should be named .web-view. + */ +const webViewTag = '.web-view'; +/** Glob filename matcher for React web views. React Web Views should be named .web-view.tsx */ +const webViewTsxGlob = '**/*.web-view.tsx'; +/** + * Regex file name matcher for React web views. React Web Views should be named .web-view.tsx + * + * Note: this regex allows the extension to be optional. + */ +export const webViewTsxRegex = /.+\.web-view(\.[tj]sx)?$/; +/** Name of adjacent folder used to store bundled WebView files */ +export const webViewTempDir = 'temp-build'; + +/** Folder containing the built extension files */ +export const outputFolder = 'dist'; + +/** Get a list of TypeScript WebView files to bundle. Path relative to project root */ +function getWebViewTsxPaths() { + return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); +} + +/** + * Gets the bundled WebView path for a WebView file path + * + * @param webViewPath Relative path to webView e.g. './src/extension-template.web-view.tsx' + * @param join Function to use to join the paths together + * @returns WebView path with temporary WebView directory inserted into the module path + */ +export function getWebViewTempPath( + webViewPath: string, + join: (path: string, request: string) => string = path.join, +) { + const webViewInfo = path.parse(webViewPath); + + // If the web view doesn't have a file extension, parsing makes it think the extension is + // '.web-view', so we need to add it back + const webViewName = webViewInfo.ext === webViewTag ? webViewInfo.base : webViewInfo.name; + // Put transpiled WebViews in a temp folder in the same directory as the original WebView + // Make sure to preserve the ./ to indicate it is a relative path + return `${webViewPath.startsWith('./') ? './' : ''}${join( + webViewInfo.dir, + join(webViewTempDir, `${webViewName}.js`), + )}`; +} + +/** + * Get webpack entry configuration to build each web-view source file and put it in a temporary + * folder in the same directory + * + * @returns Promise that resolves to the webView entry config + */ +export async function getWebViewEntries(): Promise { + const tsxWebViews = await getWebViewTsxPaths(); + const webViewEntries: webpack.EntryObject = Object.fromEntries( + tsxWebViews.map((webViewPath): [string, webpack.EntryObject[string]] => [ + webViewPath, + { + import: webViewPath, + filename: getWebViewTempPath(webViewPath), + }, + ]), + ); + return webViewEntries; +} + +// #endregion + +// #region not shared with others + +/** Folder containing the source files for the extensions */ +export const sourceFolder = 'src'; +/** Folder from repo root to this extensions folder git subtree */ +export const subtreeRootFolder = 'extensions'; +/** + * Folder containing the source files for the extensions. Directory from repo root and independent + * of OS. + * + * WARNING: This does not use the operating system's path separator because it needs to be + * consistent for use in git commands. If you need an OS-dependent path separator, make a new path + */ +const subtreeSourceFolder = `${subtreeRootFolder}/${sourceFolder}`; + +/** + * `dirNames` of extensions that should be copied to the output folder but not bundled + * + * Sometimes, you may want to make straight CommonJS JavaScript extensions without any webpack + * involvement. Put those here to have them copied straight over. + * + * Webpack wouldn't leave the requires alone even with webpackIgnore: true. Apparently webpack + * catches errors and returns {} when it can't find a module :( + */ +const extensionsNotBundled: string[] = ['evil']; + +/** List of static files to copy from each extension's source directory */ +const staticFiles: { + /** Path to static file source relative to the extension's folder */ + from: string; + /** + * Path to static file destination relative to the extension's folder. + * + * If not provided, this will be the same as `from` + */ + to?: string; + /* If true, don't throw an error when you miss the file (not all of these files are always present) */ + noErrorOnMissing?: boolean; +}[] = [ + // Distribute the extension's public folder contents + { from: 'public', to: './', noErrorOnMissing: true }, + // Distribute the extension's assets + { from: 'assets', noErrorOnMissing: true }, + // Distribute the extension's contributions + { from: 'contributions', noErrorOnMissing: true }, + // Distribute the extension manifest + { from: 'manifest.json' }, + // We need to distribute the package.json for Platform.Bible to read the extension properly + { from: 'package.json', noErrorOnMissing: true }, + // If the extension declares its types as an index.d.ts, copy that into the output + { from: 'index.d.ts', noErrorOnMissing: true }, + // Copy the extension's type declaration file into the output folder if it's called the same as + // the extension's name + { from: '.d.ts', noErrorOnMissing: true }, + // Copy the type declaration file into the output folder based on its listing in `manifest.types` + { from: '', noErrorOnMissing: true }, + // Copy the menu JSON file into the output folder based on its listing in `manifest.menus` + { from: '', noErrorOnMissing: true }, + // Copy the settings JSON file into the output folder based on its listing in `manifest.settings` + { from: '', noErrorOnMissing: true }, + // Copy the project settings JSON file into the output folder based on its listing in `manifest.projectSettings` + { from: '', noErrorOnMissing: true }, + // Copy the localized strings JSON file into the output folder based on its listing in `manifest.localizedStrings` + { from: '', noErrorOnMissing: true }, + // Copy the display data JSON file into the output folder based on its listing in `manifest.localizedStrings` + { from: '', noErrorOnMissing: true }, +]; + +/** Get the actual static file name from the template static file name */ +function getStaticFileName(staticFile: string, extensionInfo: ExtensionInfo) { + return staticFile + .replace(//g, extensionInfo.name) + .replace(//g, extensionInfo.types ?? '') + .replace(//g, extensionInfo.menus ?? '') + .replace(//g, extensionInfo.settings ?? '') + .replace(//g, extensionInfo.projectSettings ?? '') + .replace(//g, extensionInfo.localizedStrings ?? '') + .replace(//g, extensionInfo.displayData ?? ''); +} + +/** Get CopyFile plugin patterns for copying static files for an extension */ +function getCopyFilePatternsForExtension(extension: ExtensionInfo) { + // If the extension should just be copied over, not bundled, copy the whole folder + if (extensionsNotBundled.includes(extension.dirName)) { + return [ + { + from: path.join(sourceFolder, extension.dirName), + to: extension.dirName, + }, + ]; + } + + // The extension should be bundled normally + // Remove 'undefined' from the return value because the filter takes them out + // eslint-disable-next-line no-type-assertion/no-type-assertion + return staticFiles + .map((staticFile): Pattern | undefined => { + const staticFileFrom = getStaticFileName(staticFile.from, extension); + if (!staticFileFrom) return undefined; + // The input path to the file to copy but without the source or the output folder + const internalFilePathFrom = path.join(extension.dirName, staticFileFrom); + // The output path to the file to copy but without the source or the output folder + const internalFilePathTo = staticFile.to + ? path.join(extension.dirName, getStaticFileName(staticFile.to, extension)) + : internalFilePathFrom; + return { + from: path.join(sourceFolder, internalFilePathFrom), + to: internalFilePathTo, + noErrorOnMissing: staticFile.noErrorOnMissing, + }; + }) + .filter((value) => !!value) as Pattern[]; +} + +/** + * Get CopyFile plugin patterns for copying static files for each extension + * + * These patterns are used to copy files in each extension in the main build step + */ +export function getMainCopyFilePatterns(extensions: ExtensionInfo[]): Pattern[] { + const mainCopyFilePatterns = extensions.flatMap((extension) => + getCopyFilePatternsForExtension(extension), + ); + return mainCopyFilePatterns; +} + +/** + * Replace the file extension on a file on a path + * + * @param filePath Path to file including the file name and extension + * @param newExtension Extension to replace the existing extension with + * @returns File path with new extension + */ +function replaceExtension(filePath: string, newExtension: string): string { + const fileInfo = path.parse(filePath); + return path.join(fileInfo.dir, `${fileInfo.name}.${newExtension}`); +} + +/** + * Get webpack entry configuration to build each extension main source file + * + * @returns Promise that resolves to the main entry config + */ +export function getMainEntries(extensions: ExtensionInfo[]): webpack.EntryObject { + const mainEntries: webpack.EntryObject = Object.fromEntries( + extensions + // Don't bundle extensions with no main and and extensions that should just be copied over + .filter( + (extension) => + !extension.shouldCopyOnly && !extensionsNotBundled.includes(extension.dirName), + ) + .map((extension) => [ + extension.entryFilePath, + { + import: extension.entryFilePath, + // Output to the extension output folder as .js + filename: replaceExtension(path.join(extension.dirName, extension.main), 'js'), + // Exposing multiple libraries https://webpack.js.org/concepts/entry-points/#entrydescription-object + library: { + type: LIBRARY_TYPE, + }, + }, + ]), + ); + return mainEntries; +} + +/** + * Get the path to the extension directory relative to root + * + * @param extensionDirName The name of the directory that this extension is in + * @returns Path to the extension to format relative to root + * + * WARNING: This does not use the operating system's path separator because it needs to be + * consistent for use in git commands. If you need an OS-dependent path separator, make a new + * path + */ +export function getExtensionPathOSIndependent(extensionDirName: string) { + return `${subtreeSourceFolder}/${extensionDirName}`; +} + +// #endregion + +// #region sort-of shared with extension.service.ts + +/** + * Information about an extension provided by the extension developer. This will be transformed and + * frozen into an ExtensionInfo before use + */ +type ExtensionManifest = { + /** The extension's name from the manifest */ + name: string; + /** The extension's version from the manifest */ + version: string; + /** + * Path to the JavaScript file to run in the extension host. Relative to the extension's root + * folder. + * + * Must be specified. Can be an empty string ('') if the extension does not have any JavaScript to + * run. + */ + main: string; + /** + * Path to the TypeScript type declaration file that describes this extension and its interactions + * on the PAPI. Relative to the extension's root folder. + * + * If not provided, Platform.Bible will look in the following locations: + * + * 1. `.d.ts` + * 2. `.d.ts` + * 3. `index.d.ts` + * + * See [Extension Anatomy - Type Declaration + * Files](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#type-declaration-files-dts) + * for more information about extension type declaration files. + */ + types?: string; + /** Path to the JSON file that defines the menu items this extension is adding. */ + menus?: string; + /** Path to the JSON file that defines the settings this extension is adding. */ + settings?: string; + /** Path to the JSON file that defines the project settings this extension is adding. */ + projectSettings?: string; + /** Path to the JSON file that defines the localized strings this extension is adding. */ + localizedStrings?: string; + /** Path to the JSON file that defines the localized display data this extension is adding. */ + displayData?: string; + activationEvents: string[]; +}; + +/** Build-related info for each extension */ +export type ExtensionInfo = ExtensionManifest & { + /** The name of the directory that this extension is in */ + dirName: string; + /** + * Path to the extension directory relative to root + * + * WARNING: This does not use the operating system's path separator because it needs to be + * consistent for use in git commands. If you need an OS-dependent path separator, make a new + * path + */ + dirPathOSIndependent: string; + /** The name of the manifest.main file without the file extension */ + entryFileName: string; + /** The path to the manifest.main file relative to root */ + entryFilePath: string; + /** + * Whether to skip this extension when building and just copy all of its contents into the dist + * folder. If the manifest main is an empty string or if the extension is listed as not bundled, + * do not build anything but just copy the folder + */ + shouldCopyOnly?: boolean; +}; + +/** + * Gets a list of the extension folders and their respective entry files + * + * Note that this does not transform the main file .ts into .js unlike extension.service + */ +export async function getExtensions(): Promise { + // Get names of each folder in the source folder + const extensionFolderNames = ( + await fs.promises.readdir(sourceFolder, { + withFileTypes: true, + }) + ) + .filter((dirEntry) => dirEntry.isDirectory()) + .map((dirEntry) => dirEntry.name); + + // Return extension info for each extension folder + // We're filtering out the `undefined` entries, so assert that there is no `undefined` + // eslint-disable-next-line no-type-assertion/no-type-assertion + return ( + await Promise.all( + extensionFolderNames.map(async (extensionFolderName): Promise => { + let extensionManifestJson: string; + try { + extensionManifestJson = await fs.promises.readFile( + path.join(sourceFolder, extensionFolderName, 'manifest.json'), + 'utf8', + ); + } catch { + // This folder doesn't have a manifest.json, so it must not be an extension. Skip it + return undefined; + } + let extensionManifest: Readonly; + try { + extensionManifest = Object.freeze({ + // Note that this does not transform the main file .ts into .js unlike extension.service + ...JSON.parse(extensionManifestJson), + }); + } catch (e) { + console.error( + `manifest.json for extension folder ${extensionFolderName} failed to parse. Error: ${e}`, + ); + return undefined; + } + + // Get main file path from the manifest and return extension info + return extensionManifest.main !== '' + ? { + ...extensionManifest, + dirName: extensionFolderName, + dirPathOSIndependent: getExtensionPathOSIndependent(extensionFolderName), + entryFileName: path.parse(extensionManifest.main).name, + entryFilePath: path.join(sourceFolder, extensionFolderName, extensionManifest.main), + version: extensionManifest.version, + } + : { + ...extensionManifest, + dirName: extensionFolderName, + dirPathOSIndependent: getExtensionPathOSIndependent(extensionFolderName), + entryFileName: '', + entryFilePath: '', + version: extensionManifest.version, + shouldCopyOnly: true, + }; + }), + ) + ).filter((extensionInfo) => extensionInfo) as ExtensionInfo[]; +} + +// #endregion diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000000..5173c4b5d6 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,42 @@ +import type { Config } from 'jest'; +import { pathsToModuleNameMapper } from 'ts-jest'; +import fs from 'fs'; +import typescript from 'typescript'; +import packageInfo from './package.json'; + +// Get this tsconfig +const { + config: { compilerOptions }, +} = typescript.parseConfigFileTextToJson('tsconfig.json', fs.readFileSync('tsconfig.json', 'utf8')); + +const config: Config = { + moduleDirectories: ['node_modules', 'release/app/node_modules', 'src'], + moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json'], + modulePathIgnorePatterns: ['/extensions/dist', '/release'], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/.erb/mocks/file.mock.js', + '\\.(css|less|sass|scss)$': 'identity-obj-proxy', + ...pathsToModuleNameMapper(compilerOptions.paths, { + prefix: '/src', + }), + '^platform-bible-react$': '/node_modules/platform-bible-react/dist/index.js', + '^platform-bible-utils$': '/node_modules/platform-bible-utils/dist/index.js', + }, + setupFiles: ['./.erb/scripts/check-build-exists.ts'], + testEnvironment: 'jsdom', + testEnvironmentOptions: { + url: 'http://localhost/', + }, + testPathIgnorePatterns: [ + 'release/app/dist', + '.erb/dll', + /* We are running the tests of all workspaces separately */ + ...packageInfo.workspaces.map((w) => `/${w}`), + ], + transform: { + '\\.(ts|tsx|js|jsx)$': 'ts-jest', + }, +}; + +export default config; diff --git a/lib/papi-dts/.eslintignore b/lib/papi-dts/.eslintignore new file mode 100644 index 0000000000..a51f4f4c8e --- /dev/null +++ b/lib/papi-dts/.eslintignore @@ -0,0 +1,4 @@ +# Please keep this file in sync with .prettierignore + +# Dependency directory +node_modules diff --git a/lib/papi-dts/.eslintrc.cjs b/lib/papi-dts/.eslintrc.cjs new file mode 100644 index 0000000000..3064eda9f4 --- /dev/null +++ b/lib/papi-dts/.eslintrc.cjs @@ -0,0 +1,50 @@ +module.exports = { + extends: '../../.eslintrc.js', + rules: { + // Allow console because command-line tools are fine to use the console + 'no-console': 'off', + }, + ignorePatterns: ['docs/**/*'], // Add this line to ignore the docs folder + overrides: [ + { + files: ['papi.d.ts'], + rules: { + // Turn off formatting rules that tsc and prettier don't fix for us on this auto-generated + // type definitions file + '@typescript-eslint/member-ordering': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/lines-between-class-members': 'off', + 'max-classes-per-file': 'off', + 'import/newline-after-import': 'off', + // Ignore problems with pseudomodules provided in the src/declarations folder + // For example, papi-shared-types. If this causes problems, we can improve it + 'import/no-unresolved': ['error', { ignore: ['papi-*', '@papi*'] }], + 'vars-on-top': 'off', + 'no-restricted-imports': 'off', + 'no-var': 'off', + 'no-undef': 'off', + // Stop warnings from JSDocs not being formatted with 'prettier-plugin-jsdoc' since it is + // turned off here. + 'prettier/prettier': 'off', + }, + }, + ], + parserOptions: { + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + }, + settings: { + 'import/resolver': { + // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below + node: {}, + // Disable webpack eslint import resolver since we are using tsc + webpack: { config: { resolve: { extensions: [] } } }, + typescript: { + alwaysTryTypes: true, + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; diff --git a/lib/papi-dts/.gitignore b/lib/papi-dts/.gitignore new file mode 100644 index 0000000000..b9088633dd --- /dev/null +++ b/lib/papi-dts/.gitignore @@ -0,0 +1,2 @@ +papi.tsbuildinfo +docs diff --git a/lib/papi-dts/.prettierignore b/lib/papi-dts/.prettierignore new file mode 100644 index 0000000000..a5198f9186 --- /dev/null +++ b/lib/papi-dts/.prettierignore @@ -0,0 +1,4 @@ +# Please keep this file in sync with .eslintignore + +# Dependency directory +node_modules diff --git a/lib/papi-dts/.prettierrc.cjs b/lib/papi-dts/.prettierrc.cjs new file mode 100644 index 0000000000..cdf573d080 --- /dev/null +++ b/lib/papi-dts/.prettierrc.cjs @@ -0,0 +1,7 @@ +const rootConfig = require('../../.prettierrc.js'); + +const config = { ...rootConfig }; +// Remove plugin formatting with 'prettier-plugin-jsdoc'. +delete config.plugins; + +module.exports = config; diff --git a/lib/papi-dts/LICENSE b/lib/papi-dts/LICENSE new file mode 100644 index 0000000000..f50e3d31a7 --- /dev/null +++ b/lib/papi-dts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2022-2024 SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/papi-dts/README.md b/lib/papi-dts/README.md new file mode 100644 index 0000000000..b01bc48853 --- /dev/null +++ b/lib/papi-dts/README.md @@ -0,0 +1,26 @@ +# paranext-core/lib/papi-dts + +Type declarations provided for use in Platform.Bible extensions + +## Summary + +This is a types package that provides type declarations for `papi` and other important interfaces through which extensions interact with Platform.Bible. + +## Included Types in Documentation + +The documentation includes a variety of types to support different aspects of the project. For extension development, the most crucial sections to focus on are: + +- `@papi/backend`: PAPI objects that can be accessed in the backend of the extension. +- `@papi/core`: Types for use when interacting with the PAPI. +- `@papi/frontend`: PAPI objects that can be accessed in the frontend of the extension. +- `@papi/frontend/react`: React hooks to help interaction between React components and the PAPI. +- `papi-shared-types`: Extensible interface declarations shared between core and extensions to expose extension API types on the PAPI + +Feel free to explore other sections based on your specific needs and context. + +## To install + +Install dependencies: + +1. Follow the instructions to install [`paranext-core`](https://github.com/paranext/paranext-core#developer-install). +2. (This step is automatically performed on running `npm install` in `paranext-core`) In `paranext-core/lib/papi-dts`, run `npm install` to install published dependencies. diff --git a/lib/papi-dts/edit-papi-d-ts.ts b/lib/papi-dts/edit-papi-d-ts.ts new file mode 100644 index 0000000000..38fed2a74c --- /dev/null +++ b/lib/papi-dts/edit-papi-d-ts.ts @@ -0,0 +1,160 @@ +/** Runs after generating types for papi.d.ts. This file adjusts papi.d.ts for use externally */ + +import fs from 'fs'; +import typescript from 'typescript'; +import escapeStringRegexp from 'escape-string-regexp'; +import { exit } from 'process'; + +const start = performance.now(); + +/** Path to the papi.d.ts file to edit */ +const PAPI_DTS_PATH = 'papi.d.ts'; + +// Load the papi.d.ts file for editing +let papiDTS = fs.readFileSync(PAPI_DTS_PATH, 'utf8'); + +// Rename papi modules to '@papi/whatever' so extensions can import just '@papi/whatever' +papiDTS = papiDTS + .replace( + new RegExp(escapeStringRegexp("'shared/services/papi-core.service'"), 'g'), + "'@papi/core'", + ) + .replace( + new RegExp(escapeStringRegexp("'renderer/services/papi-frontend.service'"), 'g'), + "'@papi/frontend'", + ) + .replace( + new RegExp(escapeStringRegexp("'renderer/services/papi-frontend-react.service'"), 'g'), + "'@papi/frontend/react'", + ) + .replace( + new RegExp(escapeStringRegexp("'extension-host/services/papi-backend.service'"), 'g'), + "'@papi/backend'", + ); + +// #region Copy "JSDOC DESTINATION" blocks to "JSDOC SOURCE" blocks + +type Source = { + name: string; + block: string; + used: boolean; +}; + +type Destination = { + name: string; + block: string; +}; + +const jsdocSources = new Map(); +const jsdocDestinations = new Set(); + +// Find all sources and destinations in one pass through the file +const jsdocRegex = /\/\*\*(?: *\n[\s]*?\*)*?[\s]*?JSDOC (SOURCE|DESTINATION) (\w+)[\s\S]*?\*\//g; +let hitFatalError = false; +let match = jsdocRegex.exec(papiDTS); +// When no regex match is found, null is returned +// eslint-disable-next-line no-null/no-null +while (match !== null) { + const [block, sourceOrDestination, name] = match; + if (sourceOrDestination === 'SOURCE') { + if (jsdocSources.has(name)) { + console.error(`JSDOC SOURCE for ${name} was defined more than once`); + hitFatalError = true; + } + jsdocSources.set(name, { name, block, used: false }); + } else if (sourceOrDestination === 'DESTINATION') jsdocDestinations.add({ name, block }); + else { + console.error('BAD REGEX!'); + hitFatalError = true; + } + match = jsdocRegex.exec(papiDTS); +} + +// Replace destinations with sources +jsdocDestinations.forEach((destinationItem) => { + const { name, block } = destinationItem; + const source = jsdocSources.get(name); + if (source) { + papiDTS = papiDTS.replace(block, source.block); + source.used = true; + } else { + console.error(`No JSDOC SOURCE found for ${name}`); + hitFatalError = true; + } +}); + +// Make sure all sources were used +jsdocSources.forEach((sourceValueItem) => { + if (!sourceValueItem.used) { + console.error(`No JSDOC DESTINATION found for ${sourceValueItem.name}`); + hitFatalError = true; + } +}); + +if (hitFatalError) exit(-1); + +// Remove all the "JSDOC SOURCE targetName" portions of the comments as a final clean up +papiDTS = papiDTS.replace( + /\/\*\*(?: *\n[\s]*?\*)*?[\s]*JSDOC SOURCE \w+(?:\n \*(?! ))?(\n?)/g, + '/**$1', +); + +// #endregion + +// Add ignore error messages to the `useData` and `useProjectData` signatures where TS pretends like +// it doesn't know how to index the types but it works just fine +papiDTS = papiDTS.replace( + /(? = tsconfig; + +// Replace all dynamic imports for @ path aliases with the path alias without @ +if (paths) { + Object.keys(paths).forEach((path) => { + if (!path.startsWith('@')) return; + + const asteriskIndex = path.indexOf('*'); + // Get the path alias without the * at the end but with the @ + const pathAlias = path.substring(0, asteriskIndex); + // Get the path alias without the @ at the start + const pathAliasNoAt = pathAlias.substring(1); + // Regex-escaped path alias without @ to be used in a regex string + const pathAliasNoAtRegex = escapeStringRegexp(pathAliasNoAt); + + // Remove @ to the beginning of all the dynamic import path aliases that left it in + papiDTS = papiDTS.replace(new RegExp(`(import\\(["'])@(${pathAliasNoAtRegex})`, 'g'), '$1$2'); + }); +} + +// Save the papi.d.ts file with edits +fs.writeFileSync(PAPI_DTS_PATH, papiDTS); + +console.log(`Finished editing papi.d.ts in ${performance.now() - start} ms`); diff --git a/lib/papi-dts/package.json b/lib/papi-dts/package.json new file mode 100644 index 0000000000..0f89f9a773 --- /dev/null +++ b/lib/papi-dts/package.json @@ -0,0 +1,54 @@ +{ + "name": "papi-dts", + "version": "0.0.1", + "type": "module", + "description": "TypeScript definitions for Paranext's PAPI", + "homepage": "https://github.com/paranext/paranext-core/tree/main/lib/papi-dts", + "bugs": { + "url": "https://github.com/paranext/paranext-core/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/paranext/paranext-core.git" + }, + "license": "MIT", + "author": { + "name": "Paranext", + "url": "https://github.com/paranext/" + }, + "contributors": [ + { + "name": "TJ Couch", + "email": "tj_couch@sil.org", + "url": "https://github.com/tjcouch-sil" + } + ], + "main": "", + "types": "papi.d.ts", + "scripts": { + "build:docs": "typedoc", + "build": "tsc && prettier --write papi.d.ts && tsx edit-papi-d-ts.ts && prettier --write papi.d.ts", + "build:clean": "npm run clean && npm run build", + "clean": "rimraf papi.tsbuildinfo", + "lint": "cross-env NODE_ENV=development eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint-fix": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint", + "lint:staged": "lint-staged -q" + }, + "lint-staged": { + "*.{cjs,js,jsx,ts,tsx}": ["prettier --write", "cross-env NODE_ENV=development eslint --cache"], + "*.json": ["prettier --parser json --write"], + "*.{html,md,yml}": ["prettier --single-quote --write"] + }, + "dependencies": { + "platform-bible-utils": "file:../platform-bible-utils" + }, + "devDependencies": { + "escape-string-regexp": "^5.0.0", + "rimraf": "^6.0.1", + "typedoc": "^0.26.7", + "typescript": "^5.4.5" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/lib/papi-dts/papi.d.ts b/lib/papi-dts/papi.d.ts new file mode 100644 index 0000000000..da6c409f6e --- /dev/null +++ b/lib/papi-dts/papi.d.ts @@ -0,0 +1,7470 @@ +/// +/// +/// +/// +/// +/// +declare module 'shared/services/scroll-group.service-model' { + import { PlatformEvent, ScriptureReference, ScrollGroupId } from 'platform-bible-utils'; + export const NETWORK_OBJECT_NAME_SCROLL_GROUP_SERVICE = 'ScrollGroupService'; + /** Name to use when creating a network event that is fired when webViews are updated */ + export const EVENT_NAME_ON_DID_UPDATE_SCR_REF: `${string}:${string}`; + /** + * Combination of a {@link ScrollGroupId} and a {@link ScriptureReference}. If this value is a number, + * that means this should be synced with the scroll group sharing that number. If this value is an + * object, that means it is an independent Scripture reference and should not be synced with any + * scroll group. + */ + export type ScrollGroupScrRef = ScrollGroupId | ScriptureReference; + /** + * Information about an update to a scroll group. Informs about the new {@link ScriptureReference} at + * a {@link ScrollGroupId} + */ + export type ScrollGroupUpdateInfo = { + scrRef: ScriptureReference; + scrollGroupId: ScrollGroupId; + }; + /** Parts of the Scroll Group Service that are exposed through the network object */ + export interface IScrollGroupRemoteService { + /** + * Get the {@link ScriptureReference} associated with the provided scroll group + * + * @param scrollGroupId Scroll group whose Scripture reference to get. Defaults to 0 + * @returns Scripture reference associated with the provided scroll group + */ + getScrRef(scrollGroupId?: ScrollGroupId): Promise; + /** + * Sets the {@link ScriptureReference} associated with the provided scroll group + * + * @param scrollGroupId Scroll group whose Scripture reference to get. If `undefined`, defaults to + * 0 + * @param scrRef Scripture reference to which to set the scroll group + * @returns `true` if the Scripture reference changed. `false` otherwise + */ + setScrRef( + scrollGroupId: ScrollGroupId | undefined, + scrRef: ScriptureReference, + ): Promise; + } + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + export interface IScrollGroupService extends IScrollGroupRemoteService { + /** Event that emits with information about a changed Scripture Reference for a scroll group */ + onDidUpdateScrRef: PlatformEvent; + } +} +declare module 'shared/models/web-view.model' { + import type { ScrollGroupScrRef } from 'shared/services/scroll-group.service-model'; + import { ScriptureReference, ScrollGroupId } from 'platform-bible-utils'; + /** The type of code that defines a webview's content */ + export enum WebViewContentType { + /** + * This webview is a React webview. It must specify its component by setting it to + * `globalThis.webViewComponent` + */ + React = 'react', + /** This webview is a raw HTML/JS/CSS webview. */ + HTML = 'html', + /** + * This webview's content is fetched from the url specified (iframe `src` attribute). Note that + * webViews of this type cannot access the `papi` because they cannot be on the same origin as the + * parent window. + */ + URL = 'url', + } + /** What type a WebView is. Each WebView definition must have a unique type. */ + export type WebViewType = string; + /** ID for a specific WebView. Each WebView has a unique ID */ + export type WebViewId = string; + /** Base WebView properties that all WebViews share */ + type WebViewDefinitionBase = { + /** What type of WebView this is. Unique to all other WebView definitions */ + webViewType: WebViewType; + /** Unique ID among webviews specific to this webview instance. */ + id: WebViewId; + /** The code for the WebView that papi puts into an iframe */ + content: string; + /** + * Url of image to show on the title bar of the tab + * + * Defaults to the software's standard logo. + */ + iconUrl?: string; + /** Name of the tab for the WebView */ + title?: string; + /** Tooltip that is shown when hovering over the webview title */ + tooltip?: string; + /** + * Project id associated with this web view. + * + * Note: This field may be used in other contexts (like menu commands) for project-specific + * operations related to this web view. + */ + projectId?: string; + /** + * With which scroll group this web view is synced or the {@link ScriptureReference} this web view + * is focusing independently of a scroll group + */ + scrollGroupScrRef?: ScrollGroupScrRef; + /** + * General object to store unique state for this webview. + * + * WARNING: This storage is not private; other extensions can access this data. Do not store + * secrets in here + */ + state?: Record; + /** + * Whether to allow the WebView iframe to interact with its parent as a same-origin website. + * Setting this to true adds `allow-same-origin` to the WebView iframe's [sandbox attribute] + * (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox). Defaults to + * `true`. + * + * Setting this to false on an HTML or React WebView prevents the iframe from importing the `papi` + * and such and also prevents others from accessing its document. This could be useful when you + * need secure input from the user because other WebViews may be able to attach event listeners to + * your inputs if you are on the same origin. Setting this to `false` on HTML or React WebViews is + * a big security win, but it makes interacting with the platform more challenging in some ways. + * + * Setting this to false on a URL WebView prevents the iframe from accessing same-origin features + * on its host website like storage APIs (localstorage, cookies, etc) and such. This will likely + * break many websites. + * + * It is best practice to set this to `false` where possible. + * + * Note: Until we have a message-passing API for WebViews, there is currently no way to interact + * with the platform via a WebView with `allowSameOrigin: false`. + * + * WARNING: If your WebView accepts secure user input like passwords on HTML or React WebViews, + * you MUST set this to `false` or you will risk exposing that secure input to other extensions + * who could be phishing for it. + */ + allowSameOrigin?: boolean; + /** + * Whether to allow scripts to run in this iframe. Setting this to true adds `allow-scripts` to + * the WebView iframe's [sandbox attribute] + * (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox). Defaults to `true` + * for HTML and React WebViews and `false` for URL WebViews + * + * WARNING: Setting this to `true` increases the possibility of a security threat occurring. If it + * is not necessary to run scripts in your WebView, you should set this to `false` to reduce + * risk. + */ + allowScripts?: boolean; + /** + * **For HTML and React WebViews:** List of [Host or scheme + * values](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy#hosts_values) + * to include in the [`frame-src` + * directive](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-src) + * for this WebView's iframe content-security-policy. This allows iframes with `src` attributes + * matching these host values to be loaded in your WebView. You can only specify values starting + * with `papi-extension:` and `https:`; any others are ignored. Specifying urls in this array + * whitelists those urls so you can embed iframes with those urls as the `src` attribute. By + * default, no urls are available to be iframes. If you want to embed iframes with the `src` + * attribute in your webview, you must include them in this property. + * + * For example, if you specify `allowFrameSources: ['https://example.com/']`, you will be able to + * embed iframes with urls starting with `papi-extension:` and on the same host as + * `https://example.com/` + * + * If you plan on embedding any iframes in your WebView, it is best practice to list only the host + * values you need to function. The more you list, the higher the theoretical security risks. + * + * --- + * + * **For URL WebViews:** List of strings representing RegExp patterns (passed into [the RegExp + * constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp)) + * to match against the `content` url specified (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine whether this iframe will be allowed to load. Specifying urls in this + * array is essentially a security check to make sure the url you pass is one of the urls you + * intend it to be. By default, the url you specify in `content` will be accepted (you do not have + * to specify this unless you want to, but it is recommended in some scenarios). + * + * Note: URL WebViews must have `papi-extension:` or `https:` urls. This property does not + * override that requirement. + * + * For example, if you specify `allowFrameSources: ['^papi-extension:', + * '^https://example\\.com.*']`, only `papi-extension:` and `https://example.com` urls will be + * accepted. + * + * If your WebView url is a `const` string and cannot change for any reason, you do not need to + * specify this property. However, if your WebView url is dynamic and can change in any way, it is + * best practice to specify this property and to list only the urls you need for your URL WebView + * to function. The more you list, the higher the theoretical security risks. + */ + allowedFrameSources?: string[]; + /** + * Whether to allow this iframe to open separate windows with window.open and anchor tags with + * `target="_blank"`. Setting this to true adds `allow-popups` to the WebView iframe's [sandbox + * attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox). Defaults + * to `false` + */ + allowPopups?: boolean; + }; + /** WebView representation using React */ + export type WebViewDefinitionReact = WebViewDefinitionBase & { + /** Indicates this WebView uses React */ + contentType?: WebViewContentType.React; + /** String of styles to be loaded into the iframe for this WebView */ + styles?: string; + }; + /** WebView representation using HTML */ + export type WebViewDefinitionHtml = WebViewDefinitionBase & { + /** Indicates this WebView uses HTML */ + contentType: WebViewContentType.HTML; + }; + /** + * WebView representation using a URL. + * + * Note: you can only use `papi-extension:` and `https:` urls + */ + export type WebViewDefinitionURL = WebViewDefinitionBase & { + /** Indicates this WebView uses a URL */ + contentType: WebViewContentType.URL; + }; + /** Properties defining a type of WebView created by extensions to show web content */ + export type WebViewDefinition = + | WebViewDefinitionReact + | WebViewDefinitionHtml + | WebViewDefinitionURL; + /** + * The keys of properties on a WebViewDefinition that are omitted when converting to a + * {@link SavedWebViewDefinition} + */ + export const SAVED_WEBVIEW_DEFINITION_OMITTED_KEYS: readonly [ + 'content', + 'styles', + 'allowScripts', + 'allowSameOrigin', + 'allowedFrameSources', + 'allowPopups', + ]; + /** + * The keys of properties on a WebViewDefinition that are omitted when converting to a + * {@link SavedWebViewDefinition} + */ + export type SavedWebViewDefinitionOmittedKeys = + (typeof SAVED_WEBVIEW_DEFINITION_OMITTED_KEYS)[number]; + /** + * Saved WebView information that does not contain the actual content of the WebView. Saved into + * layouts. Could have as little as the type and ID. WebView providers load these into actual + * {@link WebViewDefinition}s and verify any existing properties on the WebViews. + */ + export type SavedWebViewDefinition = ( + | Partial> + | Partial> + | Partial> + ) & + Pick; + /** + * The keys of properties on a WebViewDefinition that may be updated when that webview is already + * displayed + */ + export const WEBVIEW_DEFINITION_UPDATABLE_PROPERTY_KEYS: readonly [ + 'iconUrl', + 'title', + 'tooltip', + 'projectId', + 'scrollGroupScrRef', + ]; + /** The properties on a WebViewDefinition that may be updated when that webview is already displayed */ + export type WebViewDefinitionUpdatableProperties = Pick< + WebViewDefinitionBase, + (typeof WEBVIEW_DEFINITION_UPDATABLE_PROPERTY_KEYS)[number] + >; + /** + * WebViewDefinition properties for updating a WebView that is already displayed. Any unspecified + * properties will stay the same + */ + export type WebViewDefinitionUpdateInfo = Partial; + /** + * + * A React hook for working with a state object tied to a webview. Returns a WebView state value and + * a function to set it. Use similarly to `useState`. + * + * Only used in WebView iframes. + * + * _@param_ `stateKey` Key of the state value to use. The webview state holds a unique value per + * key. + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * + * _@param_ `defaultStateValue` Value to use if the web view state didn't contain a value for the + * given 'stateKey' + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. Running `resetWebViewState()` will always update the state value + * returned to the latest `defaultStateValue`, and changing the `stateKey` will use the latest + * `defaultStateValue`. However, if `defaultStateValue` is changed while a state is + * `defaultStateValue` (meaning it is reset and has no value), the returned state value will not be + * updated to the new `defaultStateValue`. + * + * _@returns_ `[stateValue, setStateValue, resetWebViewState]` + * + * - `webViewStateValue`: The current value for the web view state at the key specified or + * `defaultStateValue` if a state was not found + * - `setWebViewState`: Function to use to update the web view state value at the key specified + * - `resetWebViewState`: Function that removes the web view state and resets the value to + * `defaultStateValue` + * + * _@example_ + * + * ```typescript + * const [lastPersonSeen, setLastPersonSeen] = useWebViewState('lastSeen', 'No one'); + * ``` + */ + export type UseWebViewStateHook = ( + stateKey: string, + defaultStateValue: T, + ) => [ + webViewStateValue: T, + setWebViewState: (stateValue: T) => void, + resetWebViewState: () => void, + ]; + /** + * + * A React hook for working with this web view's scroll group and Scripture Reference. Returns a + * value and a function to set the value for both the {@link ScriptureReference} and the + * {@link ScrollGroupId} with which this web view is synced (using this web view's + * `scrollGroupScrRef` property). Use similarly to `useState`. + * + * Only used in WebView iframes. Please use `useScrollGroupScrRef` outside of WebViews. + * + * _@returns_ `[scrRef, setScrRef, scrollGroupId, setScrollGroupId]` + * + * - `scrRef`: The current value for the Scripture reference this web view is on + * - `setScrRef`: Function to use to update the Scripture reference this web view is on. If it is + * synced to a scroll group, sets the scroll group's Scripture reference + * - `scrollGroupId`: The current value for the scroll group this web view is synced with. If not + * synced to a scroll group, this is `undefined` + * - `setScrollGroupId`: Function to use to update the scroll group with which this web view is synced + * + * _@example_ + * + * ```typescript + * const [scrRef, setScrRef, scrollGroupId, setScrollGroupId] = useWebViewScrollGroupScrRef(); + * ``` + */ + export type UseWebViewScrollGroupScrRefHook = () => [ + scrRef: ScriptureReference, + setScrRef: (newScrRef: ScriptureReference) => void, + scrollGroupId: ScrollGroupId | undefined, + setScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void, + ]; + /** + * + * Gets the saved properties on this WebView's WebView definition + * + * _@returns_ saved properties this WebView's WebView definition or undefined if not found for some + * reason + */ + export type GetSavedWebViewDefinition = () => SavedWebViewDefinition | undefined; + /** + * + * Updates this WebView with the specified properties + * + * _@param_ `updateInfo` properties to update on the WebView. Any unspecified properties will stay + * the same + * + * _@returns_ true if successfully found the WebView to update and actually updated any properties; + * false otherwise + * + * _@example_ + * + * ```typescript + * updateWebViewDefinition({ title: `Hello ${name}` }); + * ``` + */ + export type UpdateWebViewDefinition = (updateInfo: WebViewDefinitionUpdateInfo) => boolean; + /** Props that are passed into the web view itself inside the iframe in the web view tab component */ + export type WebViewProps = SavedWebViewDefinition & { + /** + * + * A React hook for working with a state object tied to a webview. Returns a WebView state value and + * a function to set it. Use similarly to `useState`. + * + * Only used in WebView iframes. + * + * _@param_ `stateKey` Key of the state value to use. The webview state holds a unique value per + * key. + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * + * _@param_ `defaultStateValue` Value to use if the web view state didn't contain a value for the + * given 'stateKey' + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. Running `resetWebViewState()` will always update the state value + * returned to the latest `defaultStateValue`, and changing the `stateKey` will use the latest + * `defaultStateValue`. However, if `defaultStateValue` is changed while a state is + * `defaultStateValue` (meaning it is reset and has no value), the returned state value will not be + * updated to the new `defaultStateValue`. + * + * _@returns_ `[stateValue, setStateValue, resetWebViewState]` + * + * - `webViewStateValue`: The current value for the web view state at the key specified or + * `defaultStateValue` if a state was not found + * - `setWebViewState`: Function to use to update the web view state value at the key specified + * - `resetWebViewState`: Function that removes the web view state and resets the value to + * `defaultStateValue` + * + * _@example_ + * + * ```typescript + * const [lastPersonSeen, setLastPersonSeen] = useWebViewState('lastSeen', 'No one'); + * ``` + */ + useWebViewState: UseWebViewStateHook; + /** + * + * A React hook for working with this web view's scroll group and Scripture Reference. Returns a + * value and a function to set the value for both the {@link ScriptureReference} and the + * {@link ScrollGroupId} with which this web view is synced (using this web view's + * `scrollGroupScrRef` property). Use similarly to `useState`. + * + * Only used in WebView iframes. Please use `useScrollGroupScrRef` outside of WebViews. + * + * _@returns_ `[scrRef, setScrRef, scrollGroupId, setScrollGroupId]` + * + * - `scrRef`: The current value for the Scripture reference this web view is on + * - `setScrRef`: Function to use to update the Scripture reference this web view is on. If it is + * synced to a scroll group, sets the scroll group's Scripture reference + * - `scrollGroupId`: The current value for the scroll group this web view is synced with. If not + * synced to a scroll group, this is `undefined` + * - `setScrollGroupId`: Function to use to update the scroll group with which this web view is synced + * + * _@example_ + * + * ```typescript + * const [scrRef, setScrRef, scrollGroupId, setScrollGroupId] = useWebViewScrollGroupScrRef(); + * ``` + */ + useWebViewScrollGroupScrRef: UseWebViewScrollGroupScrRefHook; + /** + * + * Updates this WebView with the specified properties + * + * _@param_ `updateInfo` properties to update on the WebView. Any unspecified properties will stay + * the same + * + * _@returns_ true if successfully found the WebView to update and actually updated any properties; + * false otherwise + * + * _@example_ + * + * ```typescript + * updateWebViewDefinition({ title: `Hello ${name}` }); + * ``` + */ + updateWebViewDefinition: UpdateWebViewDefinition; + }; + /** Options that affect what `webViews.getWebView` does */ + export type GetWebViewOptions = { + /** + * If provided and if a web view with this ID exists, requests from the web view provider an + * existing WebView with this ID if one exists. The web view provider can deny the request if it + * chooses to do so. + * + * Alternatively, set this to '?' to attempt to find any existing web view with the specified + * webViewType. + * + * Note: setting `existingId` to `undefined` counts as providing in this case (providing is tested + * with `'existingId' in options`, not just testing if `existingId` is truthy). Not providing an + * `existingId` at all is the only way to specify we are not looking for an existing webView + */ + existingId?: string | '?' | undefined; + /** + * Whether to create a webview with a new ID and a webview with ID `existingId` was not found. + * Only relevant if `existingId` is provided. If `existingId` is not provided, this property is + * ignored. + * + * Defaults to true + */ + createNewIfNotFound?: boolean; + }; +} +declare module 'shared/global-this.model' { + import { LogLevel } from 'electron-log'; + import { FunctionComponent } from 'react'; + import { + GetSavedWebViewDefinition, + SavedWebViewDefinition, + UpdateWebViewDefinition, + UseWebViewScrollGroupScrRefHook, + UseWebViewStateHook, + WebViewDefinitionUpdateInfo, + WebViewProps, + } from 'shared/models/web-view.model'; + /** + * Variables that are defined in global scope. These must be defined in main.ts (main), index.ts + * (renderer), and extension-host.ts (extension host) + */ + global { + /** Type of process this is. Helps with running specific code based on which process you're in */ + var processType: ProcessType; + /** Whether this process is packaged or running from sources */ + var isPackaged: boolean; + /** + * Path to the app's resources directory. This is a string representation of the resources uri on + * frontend + */ + var resourcesPath: string; + /** How much logging should be recorded. Defaults to 'debug' if not packaged, 'info' if packaged */ + var logLevel: LogLevel; + /** + * A function that each React WebView extension must provide for Paranext to display it. Only used + * in WebView iframes. + */ + var webViewComponent: FunctionComponent; + /** + * + * A React hook for working with a state object tied to a webview. Returns a WebView state value and + * a function to set it. Use similarly to `useState`. + * + * Only used in WebView iframes. + * + * _@param_ `stateKey` Key of the state value to use. The webview state holds a unique value per + * key. + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * + * _@param_ `defaultStateValue` Value to use if the web view state didn't contain a value for the + * given 'stateKey' + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. Running `resetWebViewState()` will always update the state value + * returned to the latest `defaultStateValue`, and changing the `stateKey` will use the latest + * `defaultStateValue`. However, if `defaultStateValue` is changed while a state is + * `defaultStateValue` (meaning it is reset and has no value), the returned state value will not be + * updated to the new `defaultStateValue`. + * + * _@returns_ `[stateValue, setStateValue, resetWebViewState]` + * + * - `webViewStateValue`: The current value for the web view state at the key specified or + * `defaultStateValue` if a state was not found + * - `setWebViewState`: Function to use to update the web view state value at the key specified + * - `resetWebViewState`: Function that removes the web view state and resets the value to + * `defaultStateValue` + * + * _@example_ + * + * ```typescript + * const [lastPersonSeen, setLastPersonSeen] = useWebViewState('lastSeen', 'No one'); + * ``` + */ + var useWebViewState: UseWebViewStateHook; + /** + * + * A React hook for working with this web view's scroll group and Scripture Reference. Returns a + * value and a function to set the value for both the {@link ScriptureReference} and the + * {@link ScrollGroupId} with which this web view is synced (using this web view's + * `scrollGroupScrRef` property). Use similarly to `useState`. + * + * Only used in WebView iframes. Please use `useScrollGroupScrRef` outside of WebViews. + * + * _@returns_ `[scrRef, setScrRef, scrollGroupId, setScrollGroupId]` + * + * - `scrRef`: The current value for the Scripture reference this web view is on + * - `setScrRef`: Function to use to update the Scripture reference this web view is on. If it is + * synced to a scroll group, sets the scroll group's Scripture reference + * - `scrollGroupId`: The current value for the scroll group this web view is synced with. If not + * synced to a scroll group, this is `undefined` + * - `setScrollGroupId`: Function to use to update the scroll group with which this web view is synced + * + * _@example_ + * + * ```typescript + * const [scrRef, setScrRef, scrollGroupId, setScrollGroupId] = useWebViewScrollGroupScrRef(); + * ``` + */ + var useWebViewScrollGroupScrRef: UseWebViewScrollGroupScrRefHook; + /** + * Retrieve the value from web view state with the given 'stateKey', if it exists. Otherwise + * return default value + */ + var getWebViewState: (stateKey: string, defaultValue: T) => T; + /** Set the value for a given key in the web view state. */ + var setWebViewState: (stateKey: string, stateValue: T) => void; + /** Remove the value for a given key in the web view state */ + var resetWebViewState: (stateKey: string) => void; + var getSavedWebViewDefinitionById: (webViewId: string) => SavedWebViewDefinition | undefined; + var updateWebViewDefinitionById: ( + webViewId: string, + webViewDefinitionUpdateInfo: WebViewDefinitionUpdateInfo, + ) => boolean; + /** + * + * Gets the saved properties on this WebView's WebView definition + * + * _@returns_ saved properties this WebView's WebView definition or undefined if not found for some + * reason + */ + var getSavedWebViewDefinition: GetSavedWebViewDefinition; + /** + * + * Updates this WebView with the specified properties + * + * _@param_ `updateInfo` properties to update on the WebView. Any unspecified properties will stay + * the same + * + * _@returns_ true if successfully found the WebView to update and actually updated any properties; + * false otherwise + * + * _@example_ + * + * ```typescript + * updateWebViewDefinition({ title: `Hello ${name}` }); + * ``` + */ + var updateWebViewDefinition: UpdateWebViewDefinition; + /** Indicates whether test code meant just for developers to see should be run */ + var isNoisyDevModeEnabled: boolean; + } + /** Type of Paranext process */ + export enum ProcessType { + Main = 'main', + Renderer = 'renderer', + ExtensionHost = 'extension-host', + } +} +declare module 'shared/utils/util' { + import { ProcessType } from 'shared/global-this.model'; + import { UnsubscriberAsync } from 'platform-bible-utils'; + /** + * Create a nonce that is at least 128 bits long and should be (is not currently) cryptographically + * random. See nonce spec at https://w3c.github.io/webappsec-csp/#security-nonces + * + * WARNING: THIS IS NOT CURRENTLY CRYPTOGRAPHICALLY SECURE! TODO: Make this cryptographically + * random! Use some polymorphic library that works in all contexts? + * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues only works in browser + */ + export function newNonce(): string; + /** + * Creates a safe version of a register function that returns a Promise. + * + * @param unsafeRegisterFn Function that does some kind of async registration and returns an + * unsubscriber and a promise that resolves when the registration is finished + * @param isInitialized Whether the service associated with this safe UnsubscriberAsync function is + * initialized + * @param initialize Promise that resolves when the service is finished initializing + * @returns Safe version of an unsafe function that returns a promise to an UnsubscriberAsync + * (meaning it will wait to register until the service is initialized) + */ + export const createSafeRegisterFn: ( + unsafeRegisterFn: (...args: TParam) => Promise, + isInitialized: boolean, + initialize: () => Promise, + ) => (...args: TParam) => Promise; + /** + * Type of object passed to a complex request handler that provides information about the request. + * This type is used as the public-facing interface for requests + */ + export type ComplexRequest = { + /** The one who sent the request */ + senderId: number; + contents: TParam; + }; + type ComplexResponseSuccess = { + /** Whether the handler that created this response was successful in handling the request */ + success: true; + /** + * Content with which to respond to the request. Must be provided unless the response failed or + * TReturn is undefined + */ + contents: TReturn; + }; + type ComplexResponseFailure = { + /** Whether the handler that created this response was successful in handling the request */ + success: false; + /** + * Content with which to respond to the request. Must be provided unless the response failed or + * TReturn is undefined Removed from failure so we do not change the type of contents for type + * safety. We could add errorContents one day if we really need it + */ + /** Error explaining the problem that is only populated if success is false */ + errorMessage: string; + }; + /** + * Type of object to create when handling a complex request where you desire to provide additional + * information beyond the contents of the response This type is used as the public-facing interface + * for responses + */ + export type ComplexResponse = + | ComplexResponseSuccess + | ComplexResponseFailure; + /** Type of request handler - indicates what type of parameters and what return type the handler has */ + export enum RequestHandlerType { + Args = 'args', + Contents = 'contents', + Complex = 'complex', + } + /** + * Modules that someone might try to require in their extensions that we have similar apis for. When + * an extension requires these modules, an error throws that lets them know about our similar api. + */ + export const MODULE_SIMILAR_APIS: Readonly<{ + [moduleName: string]: + | string + | { + [process in ProcessType | 'default']?: string; + } + | undefined; + }>; + /** + * Get a message that says the module import was rejected and to try a similar api if available. + * + * @param moduleName Name of `require`d module that was rejected + * @returns String that says the import was rejected and a similar api to try + */ + export function getModuleSimilarApiMessage(moduleName: string): string; + /** Separator between parts of a serialized request */ + const REQUEST_TYPE_SEPARATOR = ':'; + /** Information about a request that tells us what to do with it */ + export type RequestType = { + /** The general category of request */ + category: string; + /** Specific identifier for this type of request */ + directive: string; + }; + /** + * String version of a request type that tells us what to do with a request. + * + * Consists of two strings concatenated by a colon + */ + export type SerializedRequestType = `${string}${typeof REQUEST_TYPE_SEPARATOR}${string}`; + /** + * Create a request message requestType string from a category and a directive + * + * @param category The general category of request + * @param directive Specific identifier for this type of request + * @returns Full requestType for use in network calls + */ + export function serializeRequestType(category: string, directive: string): SerializedRequestType; + /** Split a request message requestType string into its parts */ + export function deserializeRequestType(requestType: SerializedRequestType): RequestType; +} +declare module 'shared/data/internal-connection.model' { + /** + * Types that are internal to the communication we do through WebSocket. These types should not need + * to be used outside of NetworkConnectors and ConnectionService.ts + */ + import { ComplexRequest, ComplexResponse, SerializedRequestType } from 'shared/utils/util'; + /** + * Represents when the request router does not know to which client id the request belongs. Server + * should try to determine the correct client id through other means, and client should just send to + * server + */ + export const CLIENT_ID_UNKNOWN = -2; + /** Represents when the client id has not been assigned by the server */ + export const CLIENT_ID_UNASSIGNED = -1; + /** "Client id" for the server */ + export const CLIENT_ID_SERVER = 0; + /** Represents when the connector info has not been populated by the server */ + export const CONNECTOR_INFO_DISCONNECTED: Readonly<{ + clientId: -1; + }>; + /** Prefix on requests that indicates that the request is a command */ + export const CATEGORY_COMMAND = 'command'; + /** Information about the network connector */ + export type NetworkConnectorInfo = Readonly<{ + clientId: number; + }>; + /** Event emitted when client connections are established */ + export type ClientConnectEvent = { + clientId: number; + didReconnect: boolean; + }; + /** Event emitted when client connections are lost */ + export type ClientDisconnectEvent = { + clientId: number; + }; + /** + * Functions that run when network connector events occur. These should likely be emit functions + * from NetworkEventEmitters so the events inform all interested connections + */ + export type NetworkConnectorEventHandlers = { + /** Handles when a new connection is established */ + didClientConnectHandler?: (event: ClientConnectEvent) => void; + /** Handles when a client disconnects */ + didClientDisconnectHandler?: (event: ClientDisconnectEvent) => void; + }; + /** + * Whether this connector is setting up or has finished setting up its connection and is ready to + * communicate on the network + */ + export enum ConnectionStatus { + /** This connector is not connected to the network */ + Disconnected = 0, + /** This connector is attempting to connect to the network and retrieve connectorInfo */ + Connecting = 1, + /** This connector has finished setting up its connection - has connectorInfo and such */ + Connected = 2, + } + /** Request to do something and to respond */ + export type InternalRequest = { + requestId: number; + } & ComplexRequest; + /** Response to a request */ + export type InternalResponse = { + /** The process that sent this Response */ + senderId: number; + requestId: number; + /** The process that originally sent the Request that matches to this response */ + requesterId: number; + } & ComplexResponse; + /** + * Handler for requests from the server. Used internally between network connector and Connection + * Service + */ + export type InternalRequestHandler = ( + requestType: string, + request: InternalRequest, + ) => Promise>; + /** Handler for requests from the server */ + export type RequestHandler = ( + requestType: SerializedRequestType, + request: ComplexRequest, + ) => Promise>; + /** Function that returns a clientId to which to send the request based on the requestType */ + export type RequestRouter = (requestType: string) => number; + /** Event to be sent out throughout all processes */ + export type InternalEvent = { + /** The process that emitted this Event */ + senderId: number; + /** Contents of the event */ + event: T; + }; + /** + * Handler for events from on the network. Used internally between network connector and Connection + * Service + */ + export type InternalNetworkEventHandler = ( + eventType: string, + incomingEvent: InternalEvent, + ) => void; + /** Handler for events from on the network */ + export type NetworkEventHandler = (eventType: string, event: T) => void; +} +declare module 'shared/services/network-connector.interface' { + import { + ConnectionStatus, + InternalEvent, + InternalNetworkEventHandler, + InternalRequestHandler, + NetworkConnectorEventHandlers, + NetworkConnectorInfo, + RequestRouter, + } from 'shared/data/internal-connection.model'; + /** + * Interface that defines the network connection functionality the server and the client must + * implement. Used by NetworkConnectorFactory to supply the right kind of NetworkConnector to + * ConnectionService + */ + export default interface INetworkConnector { + /** Information about the connector. Populated by the server while connecting */ + connectorInfo: NetworkConnectorInfo; + /** + * Whether this connector is setting up or has finished setting up its connection and is ready to + * communicate on the network + */ + connectionStatus: ConnectionStatus; + /** + * Sets up the NetworkConnector by populating connector info, setting up event handlers, and doing + * one of the following: + * + * - On Client: connecting to the server. + * - On Server: opening an endpoint for clients to connect. + * + * MUST ALSO RUN notifyClientConnected() WHEN PROMISE RESOLVES + * + * @param localRequestHandler Function that handles requests from the connection. Only called when + * this connector can handle the request + * @param requestRouter Function that returns a clientId to which to send the request based on the + * requestType. If requestRouter returns this connector's clientId, localRequestHandler is used + * @param localEventHandler Function that handles events from the server by accepting an eventType + * and an event and emitting the event locally + * @param networkConnectorEventHandlers Functions that run when network connector events occur + * like when clients are disconnected + * @returns Promise that resolves with connector info when finished connecting + */ + connect: ( + localRequestHandler: InternalRequestHandler, + requestRouter: RequestRouter, + localEventHandler: InternalNetworkEventHandler, + networkConnectorEventHandlers: NetworkConnectorEventHandlers, + ) => Promise; + /** + * Notify the server that this client has received its connectorInfo and is ready to go. + * + * MUST RUN AFTER connect() WHEN ITS PROMISE RESOLVES + * + * TODO: Is this necessary? + */ + notifyClientConnected: () => Promise; + /** + * Disconnects from the connection: + * + * - On Client: disconnects from the server + * - On Server: disconnects from clients and closes its connection endpoint + */ + disconnect: () => void; + /** + * Send a request to the server/a client and resolve after receiving a response + * + * @param requestType The type of request + * @param contents Contents to send in the request + * @returns Promise that resolves with the response message + */ + request: InternalRequestHandler; + /** + * Sends an event to other processes. Does NOT run the local event subscriptions as they should be + * run by NetworkEventEmitter after sending on network. + * + * @param eventType Unique network event type for coordinating between processes + * @param event Event to emit on the network + */ + emitEventOnNetwork: (eventType: string, event: InternalEvent) => Promise; + } +} +declare module 'shared/utils/internal-util' { + /** Utility functions specific to the internal technologies we are using. */ + import { ProcessType } from 'shared/global-this.model'; + /** + * Determine if running on a client process (renderer, extension-host) or on the server. + * + * @returns Returns true if running on a client, false otherwise + */ + export const isClient: () => boolean; + /** + * Determine if running on the server process (main) + * + * @returns Returns true if running on the server, false otherwise + */ + export const isServer: () => boolean; + /** + * Determine if running on the renderer process + * + * @returns Returns true if running on the renderer, false otherwise + */ + export const isRenderer: () => boolean; + /** + * Determine if running on the extension host + * + * @returns Returns true if running on the extension host, false otherwise + */ + export const isExtensionHost: () => boolean; + /** + * Gets which kind of process this is (main, renderer, extension-host) + * + * @returns ProcessType for this process + */ + export const getProcessType: () => ProcessType; +} +declare module 'shared/data/network-connector.model' { + /** + * Types that are relevant particularly to the implementation of communication on + * NetworkConnector.ts files Do not use these types outside of ClientNetworkConnector.ts and + * ServerNetworkConnector.ts + */ + import { + InternalEvent, + InternalRequest, + InternalResponse, + NetworkConnectorInfo, + } from 'shared/data/internal-connection.model'; + /** Port to use for the webSocket */ + export const WEBSOCKET_PORT = 8876; + /** Number of attempts a client will make to connect to the WebSocket server before failing */ + export const WEBSOCKET_ATTEMPTS_MAX = 5; + /** + * Time in ms for the client to wait before attempting to connect to the WebSocket server again + * after a failure + */ + export const WEBSOCKET_ATTEMPTS_WAIT = 1000; + /** WebSocket message type that indicates how to handle it */ + export enum MessageType { + InitClient = 'init-client', + ClientConnect = 'client-connect', + Request = 'request', + Response = 'response', + Event = 'event', + } + /** Message sent to the client to give it NetworkConnectorInfo */ + export type InitClient = { + type: MessageType.InitClient; + senderId: number; + connectorInfo: NetworkConnectorInfo; + /** Guid unique to this connection. Used to verify important messages like reconnecting */ + clientGuid: string; + }; + /** Message responding to the server to let it know this connection is ready to receive messages */ + export type ClientConnect = { + type: MessageType.ClientConnect; + senderId: number; + /** + * ClientGuid for this client the last time it was connected to the server. Used when reconnecting + * (like if the browser refreshes): if the server has a connection with this clientGuid, it will + * unregister all requests on that client so the reconnecting client can register its request + * handlers again. + */ + reconnectingClientGuid?: string; + }; + /** Request to do something and to respond */ + export type WebSocketRequest = { + type: MessageType.Request; + /** What kind of request this is. Certain command, etc */ + requestType: string; + } & InternalRequest; + /** Response to a request */ + export type WebSocketResponse = { + type: MessageType.Response; + /** What kind of request this is. Certain command, etc */ + requestType: string; + } & InternalResponse; + /** Event to be sent out throughout all processes */ + export type WebSocketEvent = { + type: MessageType.Event; + /** What kind of event this is */ + eventType: string; + } & InternalEvent; + /** Messages send by the WebSocket */ + export type Message = + | InitClient + | ClientConnect + | WebSocketRequest + | WebSocketResponse + | WebSocketEvent; +} +declare module 'shared/services/logger.service' { + import log from 'electron-log'; + export const WARN_TAG = ''; + /** + * Format a string of a service message + * + * @param message Message from the service + * @param serviceName Name of the service to show in the log + * @param tag Optional tag at the end of the service name + * @returns Formatted string of a service message + */ + export function formatLog(message: string, serviceName: string, tag?: string): string; + /** + * + * All extensions and services should use this logger to provide a unified output of logs + */ + const logger: log.MainLogger & { + default: log.MainLogger; + }; + export default logger; +} +declare module 'client/services/web-socket.interface' { + /** + * Interface that defines the webSocket functionality the extension host and the renderer must + * implement. Used by WebSocketFactory to supply the right kind of WebSocket to + * ClientNetworkConnector. For now, we are just using the browser WebSocket type. We may need + * specific functionality that don't line up between the ws library's implementation and the browser + * implementation. We can adjust as needed at that point. + */ + export type IWebSocket = WebSocket; +} +declare module 'renderer/services/renderer-web-socket.service' { + /** Once our network is running, run this to stop extensions from connecting to it directly */ + export const blockWebSocketsToPapiNetwork: () => void; + /** This wraps the browser's WebSocket implementation to provide + * better control over internet access. It is isomorphic with the standard WebSocket, so it should + * act as a drop-in replacement. + * + * Note that the Node WebSocket implementation is different and not wrapped here. + */ + export default class PapiRendererWebSocket implements WebSocket { + readonly CONNECTING: 0; + readonly OPEN: 1; + readonly CLOSING: 2; + readonly CLOSED: 3; + addEventListener: ( + type: K, + listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, + options?: boolean | AddEventListenerOptions, + ) => void; + binaryType: BinaryType; + bufferedAmount: number; + close: (code?: number, reason?: string) => void; + dispatchEvent: (event: Event) => boolean; + extensions: string; + onclose: ((this: WebSocket, ev: CloseEvent) => any) | null; + onerror: ((this: WebSocket, ev: Event) => any) | null; + onmessage: ((this: WebSocket, ev: MessageEvent) => any) | null; + onopen: ((this: WebSocket, ev: Event) => any) | null; + protocol: string; + readyState: number; + removeEventListener: ( + type: K, + listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, + options?: boolean | EventListenerOptions, + ) => void; + send: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void; + url: string; + constructor(url: string | URL, protocols?: string | string[]); + } +} +declare module 'extension-host/services/extension-host-web-socket.model' { + import ws from 'ws'; + /** + * Extension-host client uses ws as its WebSocket client, but the renderer can't use it. So we need + * to exclude it from the renderer webpack bundle like this. + */ + export default ws; +} +declare module 'client/services/web-socket.factory' { + import { IWebSocket } from 'client/services/web-socket.interface'; + /** + * Creates a WebSocket for the renderer or extension host depending on where you're running + * + * @returns WebSocket + */ + export const createWebSocket: (url: string) => Promise; +} +declare module 'client/services/client-network-connector.service' { + import { + ConnectionStatus, + InternalEvent, + InternalNetworkEventHandler, + InternalRequest, + InternalRequestHandler, + InternalResponse, + NetworkConnectorInfo, + RequestRouter, + } from 'shared/data/internal-connection.model'; + import INetworkConnector from 'shared/services/network-connector.interface'; + /** Handles the connection from the client to the server */ + export default class ClientNetworkConnector implements INetworkConnector { + connectorInfo: NetworkConnectorInfo; + connectionStatus: ConnectionStatus; + /** The webSocket connected to the server */ + private webSocket?; + /** + * All message subscriptions - emitters that emit an event each time a message with a specific + * message type comes in + */ + private messageEmitters; + /** + * Promise that resolves when the connection is finished or rejects if disconnected before the + * connection finishes + */ + private connectPromise?; + /** Function that removes this initClient handler from the connection */ + private unsubscribeHandleInitClientMessage?; + /** Function that removes this response handler from the connection */ + private unsubscribeHandleResponseMessage?; + /** Function that removes this handleRequest from the connection */ + private unsubscribeHandleRequestMessage?; + /** Function that removes this handleEvent from the connection */ + private unsubscribeHandleEventMessage?; + /** + * Function to call when we receive a request that is registered on this connector. Handles + * requests from the connection and returns a response to send back + */ + private localRequestHandler?; + /** + * Function to call when we are sending a request. Returns a clientId to which to send the request + * based on the requestType + */ + private requestRouter?; + /** + * Function to call when we receive an event. Handles events from the connection by emitting the + * event locally + */ + private localEventHandler?; + /** All requests that are waiting for a response */ + private requests; + /** Unique Guid associated with this connection. Used to verify certain things with server */ + private clientGuid; + connect: ( + localRequestHandler: InternalRequestHandler, + requestRouter: RequestRouter, + localEventHandler: InternalNetworkEventHandler, + ) => Promise< + Readonly<{ + clientId: number; + }> + >; + notifyClientConnected: () => Promise; + disconnect: () => void; + request: ( + requestType: string, + request: InternalRequest, + ) => Promise>; + emitEventOnNetwork: (eventType: string, event: InternalEvent) => Promise; + /** + * Send a message to the server via webSocket. Throws if not connected + * + * @param message Message to send + */ + private sendMessage; + /** + * Receives and appropriately publishes server webSocket messages + * + * @param event WebSocket message information + * @param fromSelf Whether this message is from this connector instead of from someone else + */ + private onMessage; + /** + * Subscribes a function to run on webSocket messages of a particular type + * + * @param messageType The type of message on which to subscribe the function + * @param callback Function to run with the contents of the webSocket message + * @returns Unsubscriber function to run to stop calling the passed-in function on webSocket + * messages + */ + private subscribe; + /** + * Function that handles webSocket messages of type Response. Resolves the request associated with + * the received response message + * + * @param response Response message to resolve + */ + private handleResponseMessage; + /** + * Function that handles incoming webSocket messages and locally sent messages of type Request. + * Runs the requestHandler provided in connect() and sends a message with the response + * + * @param requestMessage Request message to handle + * @param isIncoming Whether this message is coming from the server and we should definitely + * handle it locally or if it is a locally sent request and we should send to the server if we + * don't have a local handler + */ + private handleRequestMessage; + /** + * Function that handles incoming webSocket messages of type Event. Runs the eventHandler provided + * in connect() + * + * @param eventMessage Event message to handle + */ + private handleEventMessage; + } +} +declare module 'main/services/server-network-connector.service' { + import { + ConnectionStatus, + InternalEvent, + InternalNetworkEventHandler, + InternalRequest, + InternalRequestHandler, + InternalResponse, + NetworkConnectorEventHandlers, + NetworkConnectorInfo, + RequestRouter, + } from 'shared/data/internal-connection.model'; + import INetworkConnector from 'shared/services/network-connector.interface'; + /** Handles the endpoint and connections from the server to the clients */ + export default class ServerNetworkConnector implements INetworkConnector { + connectorInfo: NetworkConnectorInfo; + connectionStatus: ConnectionStatus; + /** The webSocket connected to the server */ + private webSocketServer?; + /** The next client id to use for a new connection. Starts at 1 because the server is 0 */ + private nextClientId; + /** The webSocket clients that are connected and information about them */ + private clientSockets; + /** + * All message subscriptions - emitters that emit an event each time a message with a specific + * message type comes in + */ + private messageEmitters; + /** + * Promise that resolves when finished starting the server or rejects if disconnected before the + * server finishes + */ + private connectPromise?; + /** Function that removes this clientConnect handler from connections */ + private unsubscribeHandleClientConnectMessage?; + /** Function that removes this response handler from connections */ + private unsubscribeHandleResponseMessage?; + /** Function that removes this handleRequest from connections */ + private unsubscribeHandleRequestMessage?; + /** Function that removes this handleEvent from the connection */ + private unsubscribeHandleEventMessage?; + /** + * Function to call when we receive a request that is registered on this connector. Handles + * requests from connections and returns a response to send back + */ + private localRequestHandler?; + /** + * Function to call when we are sending a request. Returns a clientId to which to send the request + * based on the requestType + */ + private requestRouter?; + /** + * Function to call when we receive an event. Handles events from connections and emits the event + * locally + */ + private localEventHandler?; + /** Functions to run when network connector events occur like when clients are disconnected */ + private networkConnectorEventHandlers?; + /** All requests that are waiting for a response */ + private requests; + connect: ( + localRequestHandler: InternalRequestHandler, + requestRouter: RequestRouter, + localEventHandler: InternalNetworkEventHandler, + networkConnectorEventHandlers: NetworkConnectorEventHandlers, + ) => Promise< + Readonly<{ + clientId: number; + }> + >; + notifyClientConnected: () => Promise; + disconnect: () => void; + request: ( + requestType: string, + request: InternalRequest, + ) => Promise>; + emitEventOnNetwork: (eventType: string, event: InternalEvent) => Promise; + /** Get the client socket for a certain clientId. Throws if not found */ + private getClientSocket; + /** + * Attempts to get the client socket for a certain clientGuid. Returns undefined if not found. + * This does not throw because it will likely be very common that we do not have a clientId for a + * certain clientGuid as connecting clients will often supply old clientGuids. + */ + private getClientSocketFromGuid; + /** Get the clientId for a certain webSocket. Throws if not found */ + private getClientIdFromSocket; + /** + * Send a message to a client via webSocket. Throws if not connected + * + * @param message Message to send + * @param recipientId The client to which to send the message. TODO: determine if we can intuit + * this instead + */ + private sendMessage; + /** + * Receives and appropriately publishes webSocket messages + * + * @param event WebSocket message information + * @param fromSelf Whether this message is from this connector instead of from someone else + */ + private onMessage; + /** + * Subscribes a function to run on webSocket messages of a particular type + * + * @param messageType The type of message on which to subscribe the function + * @param callback Function to run with the contents of the webSocket message + * @returns Unsubscriber function to run to stop calling the passed-in function on webSocket + * messages + */ + private subscribe; + /** + * Registers an incoming webSocket connection and sends connection info with InitClient. Does not + * consider the client fully connected yet until they respond and tell us they connected with + * ClientConnect + */ + private onClientConnect; + /** Handles when client connection disconnects. Unregisters and such */ + private onClientDisconnect; + /** Closes connection and unregisters a client webSocket when it has disconnected */ + private disconnectClient; + /** + * Function that handles webSocket messages of type ClientConnect. Mark the connection fully + * connected and notify that a client connected or reconnected + * + * @param clientConnect Message from the client about the connection + * @param connectorId ClientId of the client who is sending this ClientConnect message + */ + private handleClientConnectMessage; + /** + * Function that handles webSocket messages of type Response. Resolves the request associated with + * the received response message or forwards to appropriate client + * + * @param response Response message to resolve + * @param responderId Responding client + */ + private handleResponseMessage; + /** + * Function that handles incoming webSocket messages and locally sent messages of type Request. + * Handles the request and sends a response if we have a handler or forwards to the appropriate + * client + * + * @param requestMessage Request to handle + * @param requesterId Who sent this message + */ + private handleRequestMessage; + /** + * Function that handles incoming webSocket messages of type Event. Runs the eventHandler provided + * in connect() and forwards the event to other clients + * + * @param eventMessage Event message to handle + */ + private handleEventMessage; + } +} +declare module 'shared/services/network-connector.factory' { + import INetworkConnector from 'shared/services/network-connector.interface'; + /** + * Creates a NetworkConnector for the client or the server depending on where you're running + * + * @returns NetworkConnector + */ + export const createNetworkConnector: () => Promise; +} +declare module 'shared/services/connection.service' { + /** + * Handles setting up a connection to the electron backend and exchanging simple messages. Do not + * use outside NetworkService.ts. For communication, use NetworkService.ts as it is an abstraction + * over this. + */ + import { + NetworkConnectorEventHandlers, + NetworkEventHandler, + RequestHandler, + RequestRouter, + } from 'shared/data/internal-connection.model'; + import { ComplexResponse } from 'shared/utils/util'; + /** + * Send a request to the server and resolve after receiving a response + * + * @param requestType The type of request + * @param contents Contents to send in the request + * @returns Promise that resolves with the response message + */ + export const request: ( + requestType: string, + contents: TParam, + ) => Promise>; + /** + * Sends an event to other processes. Does NOT run the local event subscriptions as they should be + * run by NetworkEventEmitter after sending on network. + * + * @param eventType Unique network event type for coordinating between processes + * @param event Event to emit on the network + */ + export const emitEventOnNetwork: (eventType: string, event: T) => Promise; + /** Disconnects from the server */ + export const disconnect: () => void; + /** + * Sets up the ConnectionService by connecting to the server and setting up event handlers + * + * @param localRequestHandler Function that handles requests from the server by accepting a + * requestType and a ComplexRequest and returning a Promise of a Complex Response + * @param networkRequestRouter Function that determines the appropriate clientId to which to send + * requests of the given type + * @param localEventHandler Function that handles events from the server by accepting an eventType + * and an event and emitting the event locally + * @param connectorEventHandlers Functions that run when network connector events occur like when + * clients are disconnected + * @returns Promise that resolves when finished connecting + */ + export const connect: ( + localRequestHandler: RequestHandler, + networkRequestRouter: RequestRouter, + localEventHandler: NetworkEventHandler, + connectorEventHandlers: NetworkConnectorEventHandlers, + ) => Promise; + /** Gets this connection's clientId */ + export const getClientId: () => number; +} +declare module 'shared/models/papi-network-event-emitter.model' { + import { PlatformEventHandler, PlatformEventEmitter } from 'platform-bible-utils'; + /** + * Networked version of EventEmitter - accepts subscriptions to an event and runs the subscription + * callbacks when the event is emitted. Events on NetworkEventEmitters can be emitted across + * processes. They are coordinated between processes by their type. Use eventEmitter.event(callback) + * to subscribe to the event. Use eventEmitter.emit(event) to run the subscriptions. Generally, this + * EventEmitter should be private, and its event should be public. That way, the emitter is not + * publicized, but anyone can subscribe to the event. + * + * WARNING: Do not use this class directly outside of NetworkService, or it will not do what you + * expect. Use NetworkService.createNetworkEventEmitter. + * + * WARNING: You cannot emit events with complex types on the network. + */ + export default class PapiNetworkEventEmitter extends PlatformEventEmitter { + /** Callback that sends the event to other processes on the network when it is emitted */ + private networkSubscriber; + /** Callback that runs when the emitter is disposed - should handle unlinking from the network */ + private networkDisposer; + /** + * Creates a NetworkEventEmitter + * + * @param networkSubscriber Callback that accepts the event and emits it to other processes + * @param networkDisposer Callback that unlinks this emitter from the network + */ + constructor( + /** Callback that sends the event to other processes on the network when it is emitted */ + networkSubscriber: PlatformEventHandler, + /** Callback that runs when the emitter is disposed - should handle unlinking from the network */ + networkDisposer: () => void, + ); + emit: (event: T) => void; + /** + * Runs only the subscriptions for the event that are on this process. Does not send over network + * + * @param event Event data to provide to subscribed callbacks + */ + emitLocal(event: T): void; + dispose: () => Promise; + } +} +declare module 'shared/services/network.service' { + /** + * Handles requests, responses, subscriptions, etc. to the backend. Likely shouldn't need/want to + * expose this whole service on papi, but there are a few things that are exposed via + * papiNetworkService + */ + import { ClientConnectEvent, ClientDisconnectEvent } from 'shared/data/internal-connection.model'; + import { UnsubscriberAsync, PlatformEventEmitter, PlatformEvent } from 'platform-bible-utils'; + import { + ComplexRequest, + ComplexResponse, + RequestHandlerType, + SerializedRequestType, + } from 'shared/utils/util'; + /** + * Args handler function for a request. Called when a request is handled. The function should accept + * the spread of the contents array of the request as its parameters. The function should return an + * object that becomes the contents object of the response. This type of handler is a normal + * function. + */ + type ArgsRequestHandler = any[], TReturn = any> = ( + ...args: TParam + ) => Promise | TReturn; + /** + * Contents handler function for a request. Called when a request is handled. The function should + * accept the contents object of the request as its single parameter. The function should return an + * object that becomes the contents object of the response. + */ + type ContentsRequestHandler = (contents: TParam) => Promise; + /** + * Complex handler function for a request. Called when a request is handled. The function should + * accept a ComplexRequest object as its single parameter. The function should return a + * ComplexResponse object that becomes the response.. This type of handler is the most flexible of + * the request handlers. + */ + type ComplexRequestHandler = ( + request: ComplexRequest, + ) => Promise>; + /** Event that emits with clientId when a client connects */ + export const onDidClientConnect: PlatformEvent; + /** Event that emits with clientId when a client disconnects */ + export const onDidClientDisconnect: PlatformEvent; + /** Closes the network services gracefully */ + export const shutdown: () => void; + /** Sets up the NetworkService. Runs only once */ + export const initialize: () => Promise; + /** + * Send a request on the network and resolve the response contents. + * + * @param requestType The type of request + * @param args Arguments to send in the request (put in request.contents) + * @returns Promise that resolves with the response message + */ + export const request: ( + requestType: SerializedRequestType, + ...args: TParam + ) => Promise; + /** + * Register a local request handler to run on requests. + * + * @param requestType The type of request on which to register the handler + * @param handler Function to register to run on requests + * @param handlerType Type of handler function - indicates what type of parameters and what return + * type the handler has + * @returns Promise that resolves if the request successfully registered and unsubscriber function + * to run to stop the passed-in function from handling requests + */ + export function registerRequestHandler( + requestType: SerializedRequestType, + handler: ArgsRequestHandler, + handlerType?: RequestHandlerType, + ): Promise; + export function registerRequestHandler( + requestType: SerializedRequestType, + handler: ContentsRequestHandler, + handlerType?: RequestHandlerType, + ): Promise; + export function registerRequestHandler( + requestType: SerializedRequestType, + handler: ComplexRequestHandler, + handlerType?: RequestHandlerType, + ): Promise; + /** + * Creates an event emitter that works properly over the network. Other connections receive this + * event when it is emitted. + * + * WARNING: You can only create a network event emitter once per eventType to prevent hijacked event + * emitters. + * + * WARNING: You cannot emit events with complex types on the network. + * + * @param eventType Unique network event type for coordinating between connections + * @returns Event emitter whose event works between connections + */ + export const createNetworkEventEmitter: (eventType: string) => PlatformEventEmitter; + /** + * Gets the network event with the specified type. Creates the emitter if it does not exist + * + * @param eventType Unique network event type for coordinating between connections + * @returns Event for the event type that runs the callback provided when the event is emitted + */ + export const getNetworkEvent: (eventType: string) => PlatformEvent; + /** + * Creates a function that is a request function with a baked requestType. This is also nice because + * you get TypeScript type support using this function. + * + * @param requestType RequestType for request function + * @returns Function to call with arguments of request that performs the request and resolves with + * the response contents + */ + export const createRequestFunction: ( + requestType: SerializedRequestType, + ) => (...args: TParam) => Promise; + export interface PapiNetworkService { + onDidClientConnect: typeof onDidClientConnect; + onDidClientDisconnect: typeof onDidClientDisconnect; + createNetworkEventEmitter: typeof createNetworkEventEmitter; + getNetworkEvent: typeof getNetworkEvent; + } + /** + * + * Service that provides a way to send and receive network events + */ + export const papiNetworkService: PapiNetworkService; +} +declare module 'shared/services/network-object.service' { + import { PlatformEvent, UnsubscriberAsync } from 'platform-bible-utils'; + import { + NetworkObject, + DisposableNetworkObject, + NetworkableObject, + LocalObjectToProxyCreator, + NetworkObjectDetails, + } from 'shared/models/network-object.model'; + /** Sets up the service. Only runs once and always returns the same promise after that */ + const initialize: () => Promise; + /** + * Search locally known network objects for the given ID. Don't look on the network for more + * objects. + * + * @returns Whether we know of an existing network object with the provided ID already on the + * network + */ + const hasKnown: (id: string) => boolean; + /** + * Event that fires when a new object has been created on the network (locally or remotely). The + * event contains information about the new network object. + */ + export const onDidCreateNetworkObject: PlatformEvent; + /** Event that fires with a network object ID when that object is disposed locally or remotely */ + export const onDidDisposeNetworkObject: PlatformEvent; + interface IDisposableObject { + dispose?: UnsubscriberAsync; + } + /** If `dispose` already exists on `objectToMutate`, we will call it in addition to `newDispose` */ + export function overrideDispose( + objectToMutate: IDisposableObject, + newDispose: UnsubscriberAsync, + ): void; + /** + * Get a network object that has previously been set up to be shared on the network. A network + * object is a proxy to an object living somewhere else that local code can use. + * + * Running this function twice with the same inputs yields the same network object. + * + * @param id ID of the network object - all processes must use this ID to look up this network + * object + * @param createLocalObjectToProxy Function that creates an object that the network object proxy + * will be based upon. The object this function creates cannot have an `onDidDispose` property. + * This function is useful for setting up network events on a network object. + * @returns A promise for the network object with specified ID if one exists, undefined otherwise + */ + const get: ( + id: string, + createLocalObjectToProxy?: LocalObjectToProxyCreator, + ) => Promise | undefined>; + /** + * Set up an object to be shared on the network. + * + * @param id ID of the object to share on the network. All processes must use this ID to look it up. + * @param objectToShare The object to set up as a network object. It will have an event named + * `onDidDispose` added to its properties. An error will be thrown if the object already had an + * `onDidDispose` property on it. If the object already contained a `dispose` function, a new + * `dispose` function will be set that calls the existing function (amongst other things). If the + * object did not already define a `dispose` function, one will be added. + * + * WARNING: setting a network object mutates the provided object. + * @returns `objectToShare` modified to be a network object + */ + const set: ( + id: string, + objectToShare: T, + objectType?: string, + objectAttributes?: + | { + [property: string]: unknown; + } + | undefined, + ) => Promise>; + export interface MinimalNetworkObjectService { + get: typeof get; + set: typeof set; + onDidCreateNetworkObject: typeof onDidCreateNetworkObject; + } + export interface NetworkObjectService extends MinimalNetworkObjectService { + initialize: typeof initialize; + hasKnown: typeof hasKnown; + } + /** + * + * Network objects are distributed objects within PAPI for TS/JS objects. @see + * https://en.wikipedia.org/wiki/Distributed_object + * + * Objects registered via {@link networkObjectService.set} are retrievable using + * {@link networkObjectService.get}. + * + * Function calls made on network objects retrieved via {@link networkObjectService.get} are proxied + * and sent to the original objects registered via {@link networkObjectService.set}. All functions on + * the registered object are proxied except for constructors, `dispose`, and functions starting with + * `on` since those should be events (which are not intended to be proxied) based on our naming + * convention. If you don't want a function to be proxied, don't make it a property of the + * registered object. + * + * Functions on a network object will be called asynchronously by other processes regardless of + * whether the functions are synchronous or asynchronous, so it is best to make them all + * asynchronous. All shared functions' arguments and return values must be serializable to be called + * across processes. + * + * When a service registers an object via {@link networkObjectService.set}, it is the responsibility + * of that service, and only that service, to call `dispose` on that object when it is no longer + * intended to be shared with other services. + * + * When an object is disposed by calling `dispose`, all functions registered with the `onDidDispose` + * event handler will be called. After an object is disposed, calls to its functions will no longer + * be proxied to the original object. + */ + const networkObjectService: NetworkObjectService; + export default networkObjectService; + /** + * + * Network objects are distributed objects within PAPI for TS/JS objects. @see + * https://en.wikipedia.org/wiki/Distributed_object + * + * Objects registered via {@link networkObjectService.set} are retrievable using + * {@link networkObjectService.get}. + * + * Function calls made on network objects retrieved via {@link networkObjectService.get} are proxied + * and sent to the original objects registered via {@link networkObjectService.set}. All functions on + * the registered object are proxied except for constructors, `dispose`, and functions starting with + * `on` since those should be events (which are not intended to be proxied) based on our naming + * convention. If you don't want a function to be proxied, don't make it a property of the + * registered object. + * + * Functions on a network object will be called asynchronously by other processes regardless of + * whether the functions are synchronous or asynchronous, so it is best to make them all + * asynchronous. All shared functions' arguments and return values must be serializable to be called + * across processes. + * + * When a service registers an object via {@link networkObjectService.set}, it is the responsibility + * of that service, and only that service, to call `dispose` on that object when it is no longer + * intended to be shared with other services. + * + * When an object is disposed by calling `dispose`, all functions registered with the `onDidDispose` + * event handler will be called. After an object is disposed, calls to its functions will no longer + * be proxied to the original object. + */ + export const minimalNetworkObjectService: MinimalNetworkObjectService; +} +declare module 'shared/models/network-object.model' { + import { + Dispose, + OnDidDispose, + CannotHaveOnDidDispose, + CanHaveOnDidDispose, + } from 'platform-bible-utils'; + /** + * An object of this type is returned from {@link networkObjectService.get}. + * + * Override the NetworkableObject type's force-undefined onDidDispose to NetworkObject's + * onDidDispose type because it will have an onDidDispose added. + * + * If an object of type T had `dispose` on it, `networkObjectService.get` will remove the ability to + * call that method. This is because we don't want users of network objects to dispose of them. Only + * the caller of `networkObjectService.set` should be able to dispose of the network object. + * + * @see {@link networkObjectService} + */ + export type NetworkObject = Omit, 'dispose'> & + OnDidDispose; + /** + * An object of this type is returned from {@link networkObjectService.set}. + * + * @see {@link networkObjectService} + */ + export type DisposableNetworkObject = NetworkObject & Dispose; + /** + * An object of this type is passed into {@link networkObjectService.set}. + * + * @see {@link networkObjectService} + */ + export type NetworkableObject = T & CannotHaveOnDidDispose; + /** + * If a network object with the provided ID exists remotely but has not been set up to use inside + * this process, this function is run in {@link networkObjectService.get}, and the returned object is + * used as a base on which to set up a NetworkObject for use on this process. All properties that + * are exposed in the base object will be used as-is, and all other properties will be assumed to + * exist on the remote network object. + * + * @param id ID of the network object to get + * @param networkObjectContainer Holds a reference to the NetworkObject that will be setup within + * {@link networkObjectService.get}. It is passed in to allow the return value to call functions on + * the NetworkObject. NOTE: networkObjectContainer.contents does not point to a real NetworkObject + * while this function is running. The real reference is assigned later, but before the + * NetworkObject will be used. The return value should always reference the NetworkObject as + * `networkObjectContainer.contents` to avoid acting upon an undefined NetworkObject. + * @returns The local object to proxy into a network object. + * + * Note: This function should return Partial. For some reason, TypeScript can't infer the type + * (probably has to do with that it's a wrapped and layered type). Functions that implement this + * type should return Partial + * @see {@link networkObjectService} + */ + export type LocalObjectToProxyCreator = ( + id: string, + networkObjectPromise: Promise>, + ) => Partial; + /** Data about an object shared on the network */ + export type NetworkObjectDetails = { + /** ID of the network object that processes use to reference it */ + id: string; + /** + * Name of the type of this network object. Note this isn't about TypeScript types, but instead + * focused on the platform data model. Names of types for the same logical thing (e.g., Project + * Data Providers => `pdp`) should be the same across all process on the network regardless of + * what programming language they use. For generic network objects, `networkObject` is + * appropriate. + */ + objectType: string; + /** Array of strings with the function names exposed on this network object */ + functionNames: string[]; + /** + * Optional object containing properties that describe this network object. The properties + * associated with this network object depend on the `objectType`. + */ + attributes?: Record; + }; +} +declare module 'shared/models/data-provider.model' { + import { UnsubscriberAsync, PlatformEventHandler } from 'platform-bible-utils'; + import { NetworkableObject } from 'shared/models/network-object.model'; + /** Various options to adjust how the data provider subscriber emits updates */ + export type DataProviderSubscriberOptions = { + /** + * Whether to immediately retrieve the data for this subscriber and run the callback as soon as + * possible. + * + * This allows a subscriber to simply subscribe and provide a callback instead of subscribing, + * running `get`, and managing the race condition of an event coming in to update the data and the + * initial `get` coming back in. + * + * @default true + */ + retrieveDataImmediately?: boolean; + /** + * Under which conditions to run the callback when we receive updates to the data. + * + * - `'deeply-equal'` - only run the update callback when the data at this selector has changed. + * + * For example, suppose your selector is targeting John 3:5, and the data provider updates its + * data for Luke 5:3. Your data at John 3:5 does not change, and your callback will not run. + * - `'*'` - run the update callback every time the data has been updated whether or not the data at + * this selector has changed. + * + * For example, suppose your selector is targeting John 3:5, and the data provider updates its + * data for Luke 5:3. Your data at John 3:5 does not change, but your callback will run again + * with the same data anyway. + * + * @default 'deeply-equal' + */ + whichUpdates?: 'deeply-equal' | '*'; + }; + /** + * Information that papi uses to interpret whether to send out updates on a data provider when the + * engine runs `set` or `notifyUpdate`. + * + * - `'*'` update subscriptions for all data types on this data provider + * - `string` name of data type - update subscriptions for this data type + * - `string[]` names of data types - update subscriptions for the data types in the array + * - `true` (or other truthy values other than strings and arrays) + * + * - In `set` - update subscriptions for this data type + * - In `notifyUpdate` - same as '*' + * - `false` (or falsy) do not update subscriptions + */ + export type DataProviderUpdateInstructions = + | '*' + | DataTypeNames + | DataTypeNames[] + | boolean; + /** + * Set a subset of data according to the selector. + * + * Note: if a data provider engine does not provide `set` (possibly indicating it is read-only), + * this will throw an exception. + * + * @param selector Tells the provider what subset of data is being set + * @param data The data that determines what to set at the selector + * @returns Information that papi uses to interpret whether to send out updates. Defaults to `true` + * (meaning send updates only for this data type). + * @see {@link DataProviderUpdateInstructions} for more info on what to return + */ + export type DataProviderSetter< + TDataTypes extends DataProviderDataTypes, + DataType extends keyof TDataTypes, + > = ( + selector: TDataTypes[DataType]['selector'], + data: TDataTypes[DataType]['setData'], + ) => Promise>; + /** + * Get a subset of data from the provider according to the selector. + * + * Note: This is good for retrieving data from a provider once. If you want to keep the data + * up-to-date, use `subscribe` instead, which can immediately give you the data and keep it + * up-to-date. + * + * @param selector Tells the provider what subset of data to get + * @returns The subset of data represented by the selector + */ + export type DataProviderGetter = ( + selector: TDataType['selector'], + ) => Promise; + /** + * Subscribe to receive updates relevant to the provided selector from this data provider for a + * specific data type. + * + * Note: By default, this `subscribe` function automatically retrieves the current state + * of the data and runs the provided callback as soon as possible. That way, if you want to keep + * your data up-to-date, you do not also have to run `get`. You can turn this + * functionality off in the `options` parameter. + * + * @param selector Tells the provider what data this listener is listening for + * @param callback Function to run with the updated data for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber to stop listening for updates + */ + export type DataProviderSubscriber = ( + selector: TDataType['selector'], + callback: PlatformEventHandler, + options?: DataProviderSubscriberOptions, + ) => Promise; + /** + * A helper type describing the types associated with a data provider's methods for a specific data + * type it handles. + * + * @type `TSelector` - The type of selector used to get some data from this provider at this data + * type. A selector is an object a caller provides to the data provider to tell the provider what + * subset of data it wants at this data type. + * @type `TGetData` - The type of data provided by this data provider when you run `get` + * based on a provided selector + * @type `TSetData` - The type of data ingested by this data provider when you run `set` + * based on a provided selector + */ + export type DataProviderDataType< + TSelector = unknown, + TGetData = TSelector, + TSetData = TGetData, + > = { + /** + * The type of selector used to get some data from this provider at this data type. A selector is + * an object a caller provides to the data provider to tell the provider what subset of data it + * wants at this data type. + */ + selector: TSelector; + /** + * The type of data provided by this data provider when you run `get` based on a + * provided selector + */ + getData: TGetData; + /** + * The type of data ingested by this data provider when you run `set` based on a + * provided selector + */ + setData: TSetData; + }; + /** + * A helper type describing all the data types a data provider handles. Each property on this type + * (consisting of a DataProviderDataType, which describes the types that correspond to that data + * type) describes a data type that the data provider handles. The data provider has a + * `set`, `get`, and `subscribe` for each property (aka data type) + * listed in this type. + * + * @example A data provider that handles greeting strings and age numbers (as well as an All data + * type that just provides all the data) could have a DataProviderDataTypes that looks like the + * following: + * + * ```typescript + * { + * Greeting: DataProviderDataType; + * Age: DataProviderDataType; + * All: DataProviderDataType; + * } + * ``` + */ + export type DataProviderDataTypes = { + [dataType: string]: DataProviderDataType; + }; + /** + * Names of data types in a DataProviderDataTypes type. Indicates the data types that a data + * provider can handle (so it will have methods with these names like `set`) + * + * @see {@link DataProviderDataTypes} for more information + */ + export type DataTypeNames = + keyof TDataTypes & string; + /** + * Set of all `set` methods that a data provider provides according to its data types. + * + * @see {@link DataProviderSetter} for more information + */ + export type DataProviderSetters = { + [DataType in keyof TDataTypes as `set${DataType & string}`]: DataProviderSetter< + TDataTypes, + DataType + >; + }; + /** + * Set of all `get` methods that a data provider provides according to its data types. + * + * @see {@link DataProviderGetter} for more information + */ + export type DataProviderGetters = { + [DataType in keyof TDataTypes as `get${DataType & string}`]: DataProviderGetter< + TDataTypes[DataType] + >; + }; + /** + * Set of all `subscribe` methods that a data provider provides according to its data + * types. + * + * @see {@link DataProviderSubscriber} for more information + */ + export type DataProviderSubscribers = { + [DataType in keyof TDataTypes as `subscribe${DataType & string}`]: DataProviderSubscriber< + TDataTypes[DataType] + >; + }; + /** + * An internal object created locally when someone runs dataProviderService.registerEngine. This + * object layers over the data provider engine and runs its methods along with other methods. This + * object is transformed into an IDataProvider by networkObjectService.set. + * + * @see {@link IDataProvider} + */ + type DataProviderInternal = + NetworkableObject< + DataProviderSetters & + DataProviderGetters & + DataProviderSubscribers + >; + /** + * Get the data type for a data provider function based on its name + * + * @param fnName Name of data provider function e.g. `getVerse` + * @returns Data type for that data provider function e.g. `Verse` + */ + export function getDataProviderDataTypeFromFunctionName< + TDataTypes extends DataProviderDataTypes = DataProviderDataTypes, + >(fnName: string): DataTypeNames; + export default DataProviderInternal; +} +declare module 'shared/models/project-data-provider.model' { + import type { + DataProviderDataType, + DataProviderDataTypes, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + /** + * The name of the `projectInterface` representing the essential methods every Base Project Data + * Provider must implement + */ + export const PROJECT_INTERFACE_PLATFORM_BASE = 'platform.base'; + /** Indicates to a PDP what extension data is being referenced */ + export type ExtensionDataScope = { + /** Name of an extension as provided in its manifest */ + extensionName: string; + /** + * Name of a unique partition or segment of data within the extension. Some examples include (but + * are not limited to): + * + * - Name of an important data structure that is maintained in a project + * - Name of a downloaded data set that is being cached + * - Name of a resource created by a user that should be maintained in a project + * + * This is the smallest level of granularity provided by a PDP for accessing extension data. There + * is no way to get or set just a portion of data identified by a single `dataQualifier` value. + */ + dataQualifier: string; + }; + /** + * `DataProviderDataTypes` that each project data provider **must** implement. They are assumed to + * exist and are used by other data providers. + * + * --- + * + * ### Setting + * + * The `Setting` data type handles getting and setting project settings. All Project Data Providers + * must implement these methods `getSetting` and `setSetting` as well as `resetSetting` in order to + * properly support project settings. + * + * Note: the `Setting` data type is not actually part of {@link MandatoryProjectDataTypes} because + * the methods would not be able to create a generic type extending from `ProjectSettingNames` in + * order to return the specific setting type being requested. As such, `getSetting`, `setSetting`, + * and `subscribeSetting` are all specified on {@link IProjectDataProvider} instead. Unfortunately, + * as a result, using Intellisense with `useProjectData` will not show `Setting` as a data type + * option, but you can use `useProjectSetting` instead. However, do note that the `Setting` data + * type is fully functional. + * + * The closest possible representation of the `Setting` data type follows: + * + * ```typescript + * Setting: DataProviderDataType< + * ProjectSettingNames, + * ProjectSettingTypes[ProjectSettingNames], + * ProjectSettingTypes[ProjectSettingNames] + * >; + * ``` + * + * WARNING: Each Project Data Provider **must** fulfill the following requirements for its + * settings-related methods: + * + * - `getSetting`: if a project setting value is present for the key requested, return it. Otherwise, + * you must call `papi.projectSettings.getDefault` to get the default value or throw if that call + * throws. This functionality preserves the intended type of the setting and avoids returning + * `undefined` unexpectedly. + * - `setSetting`: must call `papi.projectSettings.isValid` before setting the value and should return + * false if the call returns `false` and throw if the call throws. This functionality preserves + * the intended intended type of the setting and avoids allowing the setting to be set to the + * wrong type. + * - `resetSetting`: deletes the value at the key and sends a setting update event. After this, + * `getSetting` should again see the setting value is not present, call + * `papi.projectSettings.getDefault`, and return the default value. + * - Note: see {@link WithProjectDataProviderEngineSettingMethods} for method signatures for these + * three methods. + * + * .--- + * + * ### ExtensionData + * + * All Project Data Provider data types must have an `ExtensionData` type. We strongly recommend all + * Project Data Provider data types extend from this type in order to standardize the + * `ExtensionData` types. + * + * Benefits of following this standard: + * + * - If an extension uses the `ExtensionData` endpoint for any project, it will likely use this + * standardized interface, so using this interface on your Project Data Provider data types + * enables your PDP to support generic extension data + * - In the future, we may enforce that callers to `ExtensionData` endpoints include `extensionName`, + * so following this interface ensures your PDP will not break if such a requirement is + * implemented. + */ + export type MandatoryProjectDataTypes = { + ExtensionData: DataProviderDataType; + }; + /** + * The `ExtensionData` methods required for a Project Data Provider Engine to fulfill the + * requirements of {@link MandatoryProjectDataTypes}'s `ExtensionData` data type. + * + * Note: These methods are already covered by {@link MandatoryProjectDataTypes}, but this type adds + * JSDocs for them. + */ + export type WithProjectDataProviderEngineExtensionDataMethods< + TProjectDataTypes extends DataProviderDataTypes, + > = { + /** + * Gets an extension's project data identified by `dataScope` in this project + * + * @param dataScope Information about what data is being referenced by the calling extension given + * to this Project Data Provider + * @returns Extension project data in this project for an extension to use in serving its + * extension project data + */ + getExtensionData(dataScope: ExtensionDataScope): Promise; + /** + * Sets an extension's project data identified by `dataScope` in this project + * + * @param dataScope Information about what data is being referenced by the calling extension given + * to this Project Data Provider + * @param data Updated value of extension project data in this project to set + * @returns Information that papi uses to interpret whether to send out updates. Defaults to + * `true` (meaning send updates only for this data type). + * @see {@link DataProviderUpdateInstructions} for more info on what to return + */ + setExtensionData( + dataScope: ExtensionDataScope, + data: string, + ): Promise>; + }; +} +declare module 'shared/models/data-provider.interface' { + import { + DataProviderDataTypes, + DataProviderGetters, + DataProviderSetters, + DataProviderSubscribers, + } from 'shared/models/data-provider.model'; + import { Dispose, OnDidDispose } from 'platform-bible-utils'; + /** + * An object on the papi that manages data and has methods for interacting with that data. Created + * by the papi and layers over an {@link IDataProviderEngine} provided by an extension. Returned from + * getting a data provider with `papi.dataProviders.get`. + * + * Note: each `set` method has a corresponding `get` and + * `subscribe` method. + */ + type IDataProvider = + DataProviderSetters & + DataProviderGetters & + DataProviderSubscribers & + OnDidDispose; + export default IDataProvider; + /** + * A data provider that has control over disposing of it with dispose. Returned from registering a + * data provider (only the service that set it up should dispose of it) with + * dataProviderService.registerEngine + * + * @see {@link IDataProvider} + */ + export type IDisposableDataProvider> = TDataProvider & + Dispose; +} +declare module 'shared/models/data-provider-engine.model' { + import { + DataProviderDataTypes, + DataProviderGetters, + DataProviderUpdateInstructions, + DataProviderSetters, + } from 'shared/models/data-provider.model'; + import { NetworkableObject } from 'shared/models/network-object.model'; + /** + * + * Method to run to send clients updates for a specific data type outside of the `set` + * method. papi overwrites this function on the DataProviderEngine itself to emit an update based on + * the `updateInstructions` and then run the original `notifyUpdateMethod` from the + * `DataProviderEngine`. + * + * _@example_ To run `notifyUpdate` function so it updates the Verse and Heresy data types (in a + * data provider engine): + * + * ```typescript + * this.notifyUpdate(['Verse', 'Heresy']); + * ``` + * + * _@example_ You can log the manual updates in your data provider engine by specifying the + * following `notifyUpdate` function in the data provider engine: + * + * ```typescript + * notifyUpdate(updateInstructions) { + * papi.logger.info(updateInstructions); + * } + * ``` + * + * Note: This function's return is treated the same as the return from `set` + * + * _@param_ `updateInstructions` Information that papi uses to interpret whether to send out + * updates. Defaults to `'*'` (meaning send updates for all data types) if parameter + * `updateInstructions` is not provided or is undefined. Otherwise returns `updateInstructions`. + * papi passes the interpreted update value into this `notifyUpdate` function. For example, running + * `this.notifyUpdate()` will call the data provider engine's `notifyUpdate` with + * `updateInstructions` of `'*'`. + * + * _@see_ {@link DataProviderUpdateInstructions} for more info on the `updateInstructions` parameter + * + * WARNING: Do not update a data type in its `get` method (unless you make a base case)! + * It will create a destructive infinite loop. + */ + export type DataProviderEngineNotifyUpdate = ( + updateInstructions?: DataProviderUpdateInstructions, + ) => void; + /** + * Addon type for IDataProviderEngine to specify that there is a `notifyUpdate` method on the data + * provider engine. You do not need to specify this type unless you are creating an object that is + * to be registered as a data provider engine and you need to use `notifyUpdate`. + * + * @see {@link DataProviderEngineNotifyUpdate} for more information on `notifyUpdate`. + * @see {@link IDataProviderEngine} for more information on using this type. + */ + export type WithNotifyUpdate = { + /** + * + * Method to run to send clients updates for a specific data type outside of the `set` + * method. papi overwrites this function on the DataProviderEngine itself to emit an update based on + * the `updateInstructions` and then run the original `notifyUpdateMethod` from the + * `DataProviderEngine`. + * + * _@example_ To run `notifyUpdate` function so it updates the Verse and Heresy data types (in a + * data provider engine): + * + * ```typescript + * this.notifyUpdate(['Verse', 'Heresy']); + * ``` + * + * _@example_ You can log the manual updates in your data provider engine by specifying the + * following `notifyUpdate` function in the data provider engine: + * + * ```typescript + * notifyUpdate(updateInstructions) { + * papi.logger.info(updateInstructions); + * } + * ``` + * + * Note: This function's return is treated the same as the return from `set` + * + * _@param_ `updateInstructions` Information that papi uses to interpret whether to send out + * updates. Defaults to `'*'` (meaning send updates for all data types) if parameter + * `updateInstructions` is not provided or is undefined. Otherwise returns `updateInstructions`. + * papi passes the interpreted update value into this `notifyUpdate` function. For example, running + * `this.notifyUpdate()` will call the data provider engine's `notifyUpdate` with + * `updateInstructions` of `'*'`. + * + * _@see_ {@link DataProviderUpdateInstructions} for more info on the `updateInstructions` parameter + * + * WARNING: Do not update a data type in its `get` method (unless you make a base case)! + * It will create a destructive infinite loop. + */ + notifyUpdate: DataProviderEngineNotifyUpdate; + }; + /** + * The object to register with the DataProviderService to create a data provider. The + * DataProviderService creates an {@link IDataProvider} on the papi that layers over this engine, + * providing special functionality. + * + * See {@link DataProviderDataTypes} for information on how to make powerful types that work well + * with Intellisense. + * + * Note: papi creates a `notifyUpdate` function on the data provider engine if one is not provided, + * so it is not necessary to provide one in order to call `this.notifyUpdate`. However, TypeScript + * does not understand that papi will create one as you are writing your data provider engine, so + * you can avoid type errors with one of the following options: + * + * 1. If you are using a class to create a data provider engine, you can extend the + * {@link DataProviderEngine} class, and it will provide `notifyUpdate` for you: + * + * ```typescript + * class MyDPE extends DataProviderEngine implements IDataProviderEngine { + * ... + * } + * ``` + * + * 2. If you are using an object or class not extending {@link DataProviderEngine} to create a data + * provider engine, you can add a `notifyUpdate` function (and, with an object, add the + * {@link WithNotifyUpdate} type) to your data provider engine like so: + * + * ```typescript + * const myDPE: IDataProviderEngine & WithNotifyUpdate = { + * notifyUpdate(updateInstructions) {}, + * ... + * } + * ``` + * + * OR + * + * ```typescript + * class MyDPE implements IDataProviderEngine { + * notifyUpdate(updateInstructions?: DataProviderEngineNotifyUpdate) {} + * ... + * } + * ``` + * + * @type `TDataTypes` - The data types that this data provider engine serves. For each data type + * defined, the engine must have corresponding `get` and `set function` + * functions. + */ + type IDataProviderEngine = + NetworkableObject & + /** + * Set of all `set` methods that a data provider engine must provide according to its + * data types. papi overwrites this function on the DataProviderEngine itself to emit an update + * after running the defined `set` method in the DataProviderEngine. + * + * Note: papi requires that each `set` method has a corresponding `get` + * method. + * + * Note: to make a data type read-only, you can always return false or throw from + * `set`. + * + * WARNING: Do not run this recursively in its own `set` method! It will create as + * many updates as you run `set` methods. + * + * @see {@link DataProviderSetter} for more information + */ + DataProviderSetters & + /** + * Set of all `get` methods that a data provider engine must provide according to its + * data types. Run by the data provider on `get` + * + * Note: papi requires that each `set` method has a corresponding `get` + * method. + * + * @see {@link DataProviderGetter} for more information + */ + DataProviderGetters & + Partial>; + export default IDataProviderEngine; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for data provider engine classes. If a + * data provider engine class extends this class, it doesn't have to specify its own `notifyUpdate` + * function in order to use `notifyUpdate`. + * + * @see {@link IDataProviderEngine} for more information on extending this class. + */ + export abstract class DataProviderEngine + implements WithNotifyUpdate + { + notifyUpdate(updateInstructions?: DataProviderUpdateInstructions): void; + } +} +declare module 'shared/models/extract-data-provider-data-types.model' { + import IDataProviderEngine from 'shared/models/data-provider-engine.model'; + import IDataProvider, { IDisposableDataProvider } from 'shared/models/data-provider.interface'; + import DataProviderInternal from 'shared/models/data-provider.model'; + /** + * Get the `DataProviderDataTypes` associated with the `IDataProvider` - essentially, returns + * `TDataTypes` from `IDataProvider`. + * + * Works with generic types `IDataProvider`, `DataProviderInternal`, `IDisposableDataProvider`, and + * `IDataProviderEngine` along with the `papi-shared-types` extensible interfaces `DataProviders` + * and `DisposableDataProviders` + */ + type ExtractDataProviderDataTypes = + TDataProvider extends IDataProvider + ? TDataProviderDataTypes + : TDataProvider extends DataProviderInternal + ? TDataProviderDataTypes + : TDataProvider extends IDisposableDataProvider + ? TDataProviderDataTypes + : TDataProvider extends IDataProviderEngine + ? TDataProviderDataTypes + : never; + export default ExtractDataProviderDataTypes; +} +declare module 'papi-shared-types' { + import type { ScriptureReference, UnsubscriberAsync } from 'platform-bible-utils'; + import type { + DataProviderDataType, + DataProviderDataTypes, + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import type { + MandatoryProjectDataTypes, + PROJECT_INTERFACE_PLATFORM_BASE, + WithProjectDataProviderEngineExtensionDataMethods, + } from 'shared/models/project-data-provider.model'; + import type { IDisposableDataProvider } from 'shared/models/data-provider.interface'; + import type IDataProvider from 'shared/models/data-provider.interface'; + import type ExtractDataProviderDataTypes from 'shared/models/extract-data-provider-data-types.model'; + /** + * Function types for each command available on the papi. Each extension can extend this interface + * to add commands that it registers on the papi with `papi.commands.registerCommand`. + * + * Note: Command names must consist of two strings separated by at least one period. We recommend + * one period and lower camel case in case we expand the api in the future to allow dot notation. + * + * An extension can extend this interface to add types for the commands it registers by adding the + * following to its `.d.ts` file: + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface CommandHandlers { + * 'myExtension.myCommand1': (foo: string, bar: number) => string; + * 'myExtension.myCommand2': (foo: string) => Promise; + * } + * } + * ``` + */ + interface CommandHandlers { + 'test.echo': (message: string) => string; + 'test.echoExtensionHost': (message: string) => Promise; + 'test.throwError': (message: string) => void; + 'platform.restartExtensionHost': () => Promise; + 'platform.quit': () => Promise; + 'platform.openProjectSettings': (webViewId: string) => Promise; + 'platform.openUserSettings': () => Promise; + 'test.addMany': (...nums: number[]) => number; + 'test.throwErrorExtensionHost': (message: string) => void; + } + /** + * Names for each command available on the papi. + * + * Automatically includes all extensions' commands that are added to {@link CommandHandlers}. + * + * @example 'platform.quit'; + */ + type CommandNames = keyof CommandHandlers; + /** + * Types corresponding to each user setting available in Platform.Bible. Keys are setting names, + * and values are setting data types. Extensions can add more user setting types with + * corresponding user setting IDs by adding details to their `.d.ts` file. + * + * Note: Setting names must consist of two strings separated by at least one period. We recommend + * one period and lower camel case in case we expand the api in the future to allow dot notation. + * + * An extension can extend this interface to add types for the user settings it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `myExtension.highlightColor` setting): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface SettingTypes { + * 'myExtension.highlightColor': string | { r: number; g: number; b: number }; + * } + * } + * ``` + */ + interface SettingTypes { + /** + * Current Verse Reference for Scroll Group A. Deprecated - please use `papi.scrollGroups` and + * `useWebViewScrollGroupScrRef` + */ + 'platform.verseRef': ScriptureReference; + /** + * List of locales to use when localizing the interface. First in the list receives highest + * priority. Please always add 'en' (English) at the end when using this setting so everything + * localizes to English if it does not have a localization in a higher-priority locale. + */ + 'platform.interfaceLanguage': string[]; + /** + * Mementos managed in the dotnet process and used for interacting with PtxUtils. Mementos are + * persisted objects containing some data. They are stored as xml strings. + */ + 'platform.ptxUtilsMementoData': { + [key: string]: string; + }; + /** + * Tracking last S/R registry data cache time managed in the dotnet process and used for + * interacting with ParatextData. + */ + 'platform.paratextDataLastRegistryDataCachedTimes': { + [key: string]: string; + }; + } + /** + * Names for each user setting available on the papi. + * + * Automatically includes all extensions' user settings that are added to {@link SettingTypes}. + * + * @example 'platform.verseRef' + */ + type SettingNames = keyof SettingTypes; + /** + * Types corresponding to each project setting available in Platform.Bible. Keys are project + * setting names, and values are project setting data types. Extensions can add more project + * setting types with corresponding project setting IDs by adding details to their `.d.ts` file. + * + * Note: Project setting names must consist of two strings separated by at least one period. We + * recommend one period and lower camel case in case we expand the api in the future to allow dot + * notation. + * + * An extension can extend this interface to add types for the project settings it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `myExtension.highlightColor` project setting): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface ProjectSettingTypes { + * 'myExtension.highlightColor': string | { r: number; g: number; b: number }; + * } + * } + * ``` + */ + interface ProjectSettingTypes { + /** + * Localized name of the language in which this project is written. This will be displayed + * directly in the UI. + * + * @example 'English' + */ + 'platform.language': string; + /** + * Short name of the project (not necessarily unique). This will be displayed directly in the + * UI. + * + * @example 'WEB' + */ + 'platform.name': string; + /** + * Localized full name of the project. This will be displayed directly in the UI. + * + * @example 'World English Bible' + */ + 'platform.fullName': string; + /** + * Whether or not the project is editable. This is a general "editable", not necessarily that it + * is editable by the current user. + * + * Projects that are not editable are sometimes called "resources". + */ + 'platform.isEditable': boolean; + } + /** + * Names for each user setting available on the papi. + * + * Automatically includes all extensions' user settings that are added to + * {@link ProjectSettingTypes}. + * + * @example 'platform.fullName' + */ + type ProjectSettingNames = keyof ProjectSettingTypes; + /** + * The `Setting` methods required for a Project Data Provider Engine to fulfill the requirements + * of {@link MandatoryProjectDataTypes}'s `Setting` data type. + */ + type WithProjectDataProviderEngineSettingMethods< + TProjectDataTypes extends DataProviderDataTypes, + > = { + /** + * Set the value of the specified project setting on this project. + * + * Note for implementing: `setSetting` must call `papi.projectSettings.isValid` before allowing + * the setting change. + * + * @param key The string id of the project setting to change + * @param newSetting The value that is to be set to the project setting. + * @returns Information that papi uses to interpret whether to send out updates. Defaults to + * `true` (meaning send updates only for this data type). + * @throws If the setting validator failed. + * @see {@link DataProviderUpdateInstructions} for more info on what to return + */ + setSetting: ( + key: ProjectSettingName, + newSetting: ProjectSettingTypes[ProjectSettingName], + ) => Promise>; + /** + * Get the value of the specified project setting. + * + * Note: This is good for retrieving a project setting once. If you want to keep the value + * up-to-date, use `subscribeSetting` instead, which can immediately give you the value and keep + * it up-to-date. + * + * Note for implementing: `getSetting` must call `papi.projectSettings.getDefault` if this + * project does not have a value for this setting + * + * @param key The string id of the project setting to get + * @returns The value of the specified project setting. Returns default setting value if the + * project setting does not exist on the project. + * @throws If no default value is available for the setting. + */ + getSetting: ( + key: ProjectSettingName, + ) => Promise; + /** + * Deletes the specified project setting, setting it back to its default value. + * + * Note for implementing: `resetSetting` should remove the value for this setting for this + * project such that calling `getSetting` later would cause it to call + * `papi.projectSettings.getDefault` and return the default value. + * + * @param key The string id of the project setting to reset + * @returns `true` if successfully reset the project setting, `false` otherwise + */ + resetSetting: ( + key: ProjectSettingName, + ) => Promise; + }; + /** + * An object on the papi for interacting with that project data. Created by the papi and layers + * over an {@link IProjectDataProviderEngine} provided by an extension. Returned from getting a + * project data provider with `papi.projectDataProviders.get`. + * + * Project Data Providers are a specialized version of {@link IDataProvider} that work with + * projects by exposing methods according to a set of `projectInterface`s. For each project + * available, a Project Data Provider Factory that supports that project with some set of + * `projectInterface`s creates a new instance of a PDP with the supported `projectInterface`s. + * + * Often, these objects are Layering PDPs, meaning they manipulate data provided by Base PDPs + * which actually control the saving and loading of the data. Base PDPs must implement + * {@link IBaseProjectDataProvider}, which imposes additional requirements. + * + * See more information, including the difference between Base and Layering PDPs, at + * {@link ProjectDataProviderInterfaces}. + */ + type IProjectDataProvider = + IDataProvider; + /** + * An object on the papi for interacting with that project data. Created by the papi and layers + * over an {@link IBaseProjectDataProviderEngine} provided by an extension. Sometimes returned from + * getting a project data provider with `papi.projectDataProviders.get` (depending on if the PDP + * supports the `platform.base` `projectInterface`). + * + * Project Data Providers are a specialized version of {@link IDataProvider} that work with + * projects by exposing methods according to a set of `projectInterface`s. For each project + * available, a Project Data Provider Factory that supports that project with some set of + * `projectInterface`s creates a new instance of a PDP with the supported `projectInterface`s. + * + * Every Base PDP **must** fulfill the requirements of this interface in order to support the + * methods the PAPI requires for interacting with project data. + * + * See more information, including the difference between Base and Layering PDPs, at + * {@link ProjectDataProviderInterfaces}. + */ + type IBaseProjectDataProvider = + IProjectDataProvider & + WithProjectDataProviderEngineSettingMethods & + WithProjectDataProviderEngineExtensionDataMethods & { + /** + * Subscribe to receive updates to the specified project setting. + * + * Note: By default, this `subscribeSetting` function automatically retrieves the current + * project setting value and runs the provided callback as soon as possible. That way, if + * you want to keep your data up-to-date, you do not also have to run `getSetting`. You can + * turn this functionality off in the `options` parameter. + * + * @param key The string id of the project setting for which to listen to changes + * @param callback Function to run with the updated project setting value + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber to stop listening for updates + */ + subscribeSetting: ( + key: ProjectSettingName, + callback: (value: ProjectSettingTypes[ProjectSettingName]) => void, + options: DataProviderSubscriberOptions, + ) => Promise; + }; + /** This is just a simple example so we have more than one. It's not intended to be real. */ + type NotesOnlyProjectDataTypes = MandatoryProjectDataTypes & { + Notes: DataProviderDataType; + }; + /** + * {@link IProjectDataProvider} types for each `projectInterface` supported by PAPI. Extensions can + * add more Project Data Providers with corresponding `projectInterface`s by adding details to + * their `.d.ts` file and registering a Project Data Provider factory with the corresponding + * `projectInterface`. + * + * There are two types of Project Data Providers (and Project Data Provider Factories that serve + * them): + * + * 1. Base Project Data Provider - provides project data via some `projectInterface`s for its own + * projects with **its own unique project ids**. These PDPs **must support the `platform.base` + * `projectInterface` by implementing {@link IBaseProjectDataProvider}**. More information + * below. + * 2. Layering Project Data Provider - layers over other PDPs and provides additional + * `projectInterface`s for projects on other PDPs. Likely **does not provide its own unique + * project ids** but rather layers over base PDPs' project ids. These PDPs **do not need to + * support the `platform.base` `projectInterface` and should instead implement + * {@link IProjectDataProvider}**. Instead of providing projects themselves, they likely use the + * `ExtensionData` data type exposed via the `platform.base` `projectInterface` on Base PDPs to + * provide additional project data on top of Base PDPs. + * + * All Base Project Data Provider Interfaces' data types **must** implement + * {@link IBaseProjectDataProvider} (which extends {@link MandatoryProjectDataTypes}) like in the + * following example. Please see its documentation for information on how Project Data Providers + * can implement this interface. + * + * Note: The keys of this interface are the `projectInterface`s for the associated Project Data + * Provider Interfaces. `projectInterface`s represent standardized sets of methods on a PDP. + * + * WARNING: Each Base Project Data Provider **must** fulfill certain requirements for its + * `getSetting`, `setSetting`, `resetSetting`, `getExtensionData`, and `setExtensionData` methods. + * See {@link IBaseProjectDataProvider} and {@link MandatoryProjectDataTypes} for more information. + * + * An extension can extend this interface to add types for the Project Data Provider Interfaces + * its registered factory provides by adding the following to its `.d.ts` file (in this example, + * we are adding a Base Project Data Provider interface for the `MyExtensionBaseProjectInterface` + * `projectInterface` and a Layering Project Data Provider interface for the + * `MyExtensionLayeringProjectInterface` `projectInterface`): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export type MyBaseProjectDataTypes = { + * MyProjectData: DataProviderDataType; + * }; + * + * export type MyLayeringProjectDataTypes = { + * MyOtherProjectData: DataProviderDataType; + * }; + * + * export interface ProjectDataProviderInterfaces { + * // Note that the base PDP implements `I**Base**ProjectDataProvider` + * MyExtensionBaseProjectInterface: IBaseProjectDataProvider; + * // Note that the layering PDP only implements `IProjectDataProvider` because the base PDP already + * // provides the `platform.base` data types + * MyExtensionLayeringProjectInterface: IProjectDataProvider; + * } + * } + * ``` + */ + interface ProjectDataProviderInterfaces { + /** + * Base `projectInterface` that all PDPs that expose their own unique project ids must + * implement. + * + * There should be a PDP that provides `platform.base` for all available project ids. + */ + [PROJECT_INTERFACE_PLATFORM_BASE]: IBaseProjectDataProvider; + 'platform.notesOnly': IProjectDataProvider; + 'platform.placeholder': IProjectDataProvider; + } + /** + * Names for each `projectInterface` available on the papi. `projectInterface`s represent + * standardized sets of methods on a PDP. Extensions can register a Project Data Provider Factory + * with one or more `projectInterface`s to indicate that factory provides Project Data Providers + * that have the methods associated with those `projectInterface`s. + * + * Automatically includes all extensions' `projectInterface`s that are added to + * {@link ProjectDataProviderInterfaces}. + * + * @example 'platform.notesOnly' + */ + type ProjectInterfaces = keyof ProjectDataProviderInterfaces; + /** + * `DataProviderDataTypes` for each Project Data Provider Interface supported by PAPI. These are + * the data types served by Project Data Providers for each `projectInterface`. + * + * Automatically includes all extensions' `projectInterface`s that are added to + * {@link ProjectDataProviderInterfaces}. + * + * Note: The keys of this interface are the `projectInterface`s for the associated project data + * provider interface data types. `projectInterface`s represent standardized sets of methods on a + * PDP. + * + * @example + * + * ```typescript + * ProjectInterfaceDataTypes['MyExtensionProjectInterfaceName'] => MandatoryProjectDataTypes & { + * MyProjectData: DataProviderDataType; + * } + * ``` + */ + type ProjectInterfaceDataTypes = { + [ProjectInterface in ProjectInterfaces]: ExtractDataProviderDataTypes< + ProjectDataProviderInterfaces[ProjectInterface] + >; + }; + type StuffDataTypes = { + Stuff: DataProviderDataType; + }; + type PlaceholderDataTypes = { + Placeholder: DataProviderDataType< + { + thing: number; + }, + string[], + number + >; + }; + /** + * {@link IDataProvider} types for each data provider supported by PAPI. Extensions can add more + * data providers with corresponding data provider IDs by adding details to their `.d.ts` file and + * registering a data provider engine in their `activate` function with + * `papi.dataProviders.registerEngine`. + * + * Note: Data Provider names must consist of two strings separated by at least one period. We + * recommend one period and lower camel case in case we expand the api in the future to allow dot + * notation. + * + * An extension can extend this interface to add types for the data provider it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `'helloSomeone.people'` data provider types): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export type PeopleDataTypes = { + * Greeting: DataProviderDataType; + * Age: DataProviderDataType; + * People: DataProviderDataType; + * }; + * + * export type PeopleDataMethods = { + * deletePerson(name: string): Promise; + * testRandomMethod(things: string): Promise; + * }; + * + * export type PeopleDataProvider = IDataProvider & PeopleDataMethods; + * + * export interface DataProviders { + * 'helloSomeone.people': PeopleDataProvider; + * } + * } + * ``` + */ + interface DataProviders { + 'platform.stuff': IDataProvider; + 'platform.placeholder': IDataProvider; + } + /** + * Names for each data provider available on the papi. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + * + * @example 'platform.placeholder' + */ + type DataProviderNames = keyof DataProviders; + /** + * `DataProviderDataTypes` for each data provider supported by PAPI. These are the data types + * served by each data provider. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + * + * @example + * + * ```typescript + * DataProviderTypes['helloSomeone.people'] => { + * Greeting: DataProviderDataType; + * Age: DataProviderDataType; + * People: DataProviderDataType; + * } + * ``` + */ + type DataProviderTypes = { + [DataProviderName in DataProviderNames]: ExtractDataProviderDataTypes< + DataProviders[DataProviderName] + >; + }; + /** + * Disposable version of each data provider type supported by PAPI. These objects are only + * returned from `papi.dataProviders.registerEngine` - only the one who registers a data provider + * engine is allowed to dispose of the data provider. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + */ + type DisposableDataProviders = { + [DataProviderName in DataProviderNames]: IDisposableDataProvider< + DataProviders[DataProviderName] + >; + }; +} +declare module 'shared/services/command.service' { + import { UnsubscriberAsync } from 'platform-bible-utils'; + import { CommandHandlers, CommandNames } from 'papi-shared-types'; + /** Sets up the CommandService. Only runs once and always returns the same promise after that */ + export const initialize: () => Promise; + /** Send a command to the backend. */ + export const sendCommand: ( + commandName: CommandName, + ...args: Parameters + ) => Promise>>; + /** + * Creates a function that is a command function with a baked commandName. This is also nice because + * you get TypeScript type support using this function. + * + * @param commandName Command name for command function + * @returns Function to call with arguments of command that sends the command and resolves with the + * result of the command + */ + export const createSendCommandFunction: ( + commandName: CommandName, + ) => ( + ...args: Parameters + ) => Promise>>; + /** + * Register a command on the papi to be handled here + * + * @param commandName Command name to register for handling here + * + * - Note: Command names must consist of two string separated by at least one period. We recommend one + * period and lower camel case in case we expand the api in the future to allow dot notation. + * + * @param handler Function to run when the command is invoked + * @returns True if successfully registered, throws with error message if not + */ + export const registerCommand: ( + commandName: CommandName, + handler: CommandHandlers[CommandName], + ) => Promise; + /** + * + * The command service allows you to exchange messages with other components in the platform. You + * can register a command that other services and extensions can send you. You can send commands to + * other services and extensions that have registered commands. + */ + export type moduleSummaryComments = {}; +} +declare module 'shared/models/docking-framework.model' { + import { MutableRefObject, ReactNode } from 'react'; + import { DockLayout, DropDirection, LayoutBase } from 'rc-dock'; + import { WebViewDefinition, WebViewDefinitionUpdateInfo } from 'shared/models/web-view.model'; + /** + * Saved information used to recreate a tab. + * + * - {@link TabLoader} loads this into {@link TabInfo} + * - {@link TabSaver} saves {@link TabInfo} into this + */ + export type SavedTabInfo = { + /** + * Tab ID - a unique identifier that identifies this tab. If this tab is a WebView, this ID will + * match the `WebViewDefinition.id` + */ + id: string; + /** Type of tab - indicates what kind of built-in tab this info represents */ + tabType: string; + /** Data needed to load the tab */ + data?: unknown; + }; + /** + * Information that Paranext uses to create a tab in the dock layout. + * + * - {@link TabLoader} loads {@link SavedTabInfo} into this + * - {@link TabSaver} saves this into {@link SavedTabInfo} + */ + export type TabInfo = SavedTabInfo & { + /** + * Url of image to show on the title bar of the tab + * + * Defaults to the software's standard logo. + */ + tabIconUrl?: string; + /** Text to show on the title bar of the tab */ + tabTitle: string; + /** Text to show when hovering over the title bar of the tab */ + tabTooltip?: string; + /** Content to show inside the tab. */ + content: ReactNode; + /** (optional) Minimum width that the tab can become in CSS `px` units */ + minWidth?: number; + /** (optional) Minimum height that the tab can become in CSS `px` units */ + minHeight?: number; + }; + /** + * Function that takes a {@link SavedTabInfo} and creates a Paranext tab out of it. Each type of tab + * must provide a {@link TabLoader}. + * + * For now all tab creators must do their own data type verification + */ + export type TabLoader = (savedTabInfo: SavedTabInfo) => TabInfo; + /** + * Function that takes a Paranext tab and creates a saved tab out of it. Each type of tab can + * provide a {@link TabSaver}. If they do not provide one, the properties added by `TabInfo` are + * stripped from TabInfo by `saveTabInfoBase` before saving (so it is just a {@link SavedTabInfo}). + * + * @param tabInfo The Paranext tab to save + * @returns The saved tab info for Paranext to persist. If `undefined`, does not save the tab + */ + export type TabSaver = (tabInfo: TabInfo) => SavedTabInfo | undefined; + /** Information about a tab in a panel */ + interface TabLayout { + type: 'tab'; + } + /** + * Indicates where to display a floating window + * + * - `cascade` - place the window a bit below and to the right of the previously created floating + * window + * - `center` - center the window in the dock layout + */ + type FloatPosition = 'cascade' | 'center'; + /** The dimensions for a floating tab in CSS `px` units */ + export type FloatSize = { + width: number; + height: number; + }; + /** Information about a floating window */ + export interface FloatLayout { + type: 'float'; + floatSize?: FloatSize; + /** Where to display the floating window. Defaults to `cascade` */ + position?: FloatPosition; + } + export type PanelDirection = + | 'left' + | 'right' + | 'bottom' + | 'top' + | 'before-tab' + | 'after-tab' + | 'maximize' + | 'move' + | 'active' + | 'update'; + /** Information about a panel */ + interface PanelLayout { + type: 'panel'; + direction?: PanelDirection; + /** If undefined, it will add in the `direction` relative to the previously added tab. */ + targetTabId?: string; + } + /** Information about how a Paranext tab fits into the dock layout */ + export type Layout = TabLayout | FloatLayout | PanelLayout; + /** Props that are passed to the web view tab component */ + export type WebViewTabProps = WebViewDefinition; + /** Rc-dock's onLayoutChange prop made asynchronous - resolves */ + export type OnLayoutChangeRCDock = ( + newLayout: LayoutBase, + currentTabId?: string, + direction?: DropDirection, + ) => Promise; + /** Properties related to the dock layout */ + export type PapiDockLayout = { + /** The rc-dock dock layout React element ref. Used to perform operations on the layout */ + dockLayout: DockLayout; + /** + * A ref to a function that runs when the layout changes. We set this ref to our + * {@link onLayoutChange} function + */ + onLayoutChangeRef: MutableRefObject; + /** + * Add or update a tab in the layout + * + * @param savedTabInfo Info for tab to add or update + * @param layout Information about where to put a new tab + * @returns If tab added, final layout used to display the new tab. If existing tab updated, + * `undefined` + */ + addTabToDock: (savedTabInfo: SavedTabInfo, layout: Layout) => Layout | undefined; + /** + * Add or update a webview in the layout + * + * @param webView Web view to add or update + * @param layout Information about where to put a new webview + * @returns If WebView added, final layout used to display the new webView. If existing webView + * updated, `undefined` + */ + addWebViewToDock: (webView: WebViewTabProps, layout: Layout) => Layout | undefined; + /** + * Remove a tab in the layout + * + * @param tabId ID of the tab to remove + */ + removeTabFromDock: (tabId: string) => boolean; + /** + * Gets the WebView definition for the web view with the specified ID + * + * @param webViewId The ID of the WebView whose web view definition to get + * @returns WebView definition with the specified ID or undefined if not found + */ + getWebViewDefinition: (webViewId: string) => WebViewDefinition | undefined; + /** + * Updates the WebView with the specified ID with the specified properties + * + * @param webViewId The ID of the WebView to update + * @param updateInfo Properties to update on the WebView. Any unspecified properties will stay the + * same + * @returns True if successfully found the WebView to update; false otherwise + */ + updateWebViewDefinition: ( + webViewId: string, + updateInfo: WebViewDefinitionUpdateInfo, + ) => boolean; + /** + * The layout to use as the default layout if the dockLayout doesn't have a layout loaded. + * + * TODO: This should be removed and the `testLayout` imported directly in this file once this + * service is refactored to split the code between processes. The only reason this is passed from + * `platform-dock-layout.component.tsx` is that we cannot import `testLayout` here since this + * service is currently all shared code. Refactor should happen in #203 + */ + testLayout: LayoutBase; + }; +} +declare module 'shared/services/web-view.service-model' { + import { + GetWebViewOptions, + SavedWebViewDefinition, + WebViewId, + WebViewType, + } from 'shared/models/web-view.model'; + import { Layout } from 'shared/models/docking-framework.model'; + import { PlatformEvent } from 'platform-bible-utils'; + /** + * + * Service exposing various functions related to using webViews + * + * WebViews are iframes in the Platform.Bible UI into which extensions load frontend code, either + * HTML or React components. + */ + export interface WebViewServiceType { + /** Event that emits with webView info when a webView is added */ + onDidAddWebView: PlatformEvent; + /** Event that emits with webView info when a webView is updated */ + onDidUpdateWebView: PlatformEvent; + /** + * Creates a new web view or gets an existing one depending on if you request an existing one and + * if the web view provider decides to give that existing one to you (it is up to the provider). + * + * @param webViewType Type of WebView to create + * @param layout Information about where you want the web view to go. Defaults to adding as a tab + * @param options Options that affect what this function does. For example, you can provide an + * existing web view ID to request an existing web view with that ID. + * @returns Promise that resolves to the ID of the webview we got or undefined if the provider did + * not create a WebView for this request. + * @throws If something went wrong like the provider for the webViewType was not found + */ + getWebView: ( + webViewType: WebViewType, + layout?: Layout, + options?: GetWebViewOptions, + ) => Promise; + /** + * Gets the saved properties on the WebView definition with the specified ID + * + * Note: this only returns a representation of the current web view definition, not the actual web + * view definition itself. Changing properties on the returned definition does not affect the + * actual web view definition. You can possibly change the actual web view definition by calling + * {@link WebViewServiceType.getWebView} with certain `options`, depending on what options the web + * view provider has made available. + * + * @param webViewId The ID of the WebView whose saved properties to get + * @returns Saved properties of the WebView definition with the specified ID or undefined if not + * found + */ + getSavedWebViewDefinition(webViewId: string): Promise; + } + /** Name to use when creating a network event that is fired when webViews are created */ + export const EVENT_NAME_ON_DID_ADD_WEB_VIEW: `${string}:${string}`; + /** Event emitted when webViews are created */ + export type AddWebViewEvent = { + webView: SavedWebViewDefinition; + layout: Layout; + }; + /** Name to use when creating a network event that is fired when webViews are updated */ + export const EVENT_NAME_ON_DID_UPDATE_WEB_VIEW: `${string}:${string}`; + /** Event emitted when webViews are updated */ + export type UpdateWebViewEvent = { + webView: SavedWebViewDefinition; + }; + export const NETWORK_OBJECT_NAME_WEB_VIEW_SERVICE = 'WebViewService'; +} +declare module 'shared/models/network-object-status.service-model' { + import { NetworkObjectDetails } from 'shared/models/network-object.model'; + export interface NetworkObjectStatusRemoteServiceType { + /** + * Get details about all available network objects + * + * @returns Object whose keys are the names of the network objects and whose values are the + * {@link NetworkObjectDetails} for each network object + */ + getAllNetworkObjectDetails: () => Promise>; + } + /** + * + * Provides functions related to the set of available network objects + */ + export interface NetworkObjectStatusServiceType extends NetworkObjectStatusRemoteServiceType { + /** + * Get a promise that resolves when a network object is registered or rejects if a timeout is hit + * + * @param objectDetailsToMatch Subset of object details on the network object to wait for. + * Compared to object details using {@link isSubset} + * @param timeoutInMS Max duration to wait for the network object. If not provided, it will wait + * indefinitely + * @returns Promise that either resolves to the {@link NetworkObjectDetails} for a network object + * once the network object is registered, or rejects if a timeout is provided and the timeout is + * reached before the network object is registered + */ + waitForNetworkObject: ( + objectDetailsToMatch: Partial, + timeoutInMS?: number, + ) => Promise; + } + export const networkObjectStatusServiceNetworkObjectName = 'NetworkObjectStatusService'; +} +declare module 'shared/services/network-object-status.service' { + import { NetworkObjectStatusServiceType } from 'shared/models/network-object-status.service-model'; + /** + * + * Provides functions related to the set of available network objects + */ + const networkObjectStatusService: NetworkObjectStatusServiceType; + export default networkObjectStatusService; +} +declare module 'shared/services/web-view.service' { + import { WebViewServiceType } from 'shared/services/web-view.service-model'; + const webViewService: WebViewServiceType; + export default webViewService; +} +declare module 'shared/models/web-view-provider.model' { + import { + GetWebViewOptions, + WebViewDefinition, + SavedWebViewDefinition, + } from 'shared/models/web-view.model'; + import { + DisposableNetworkObject, + NetworkObject, + NetworkableObject, + } from 'shared/models/network-object.model'; + import { CanHaveOnDidDispose } from 'platform-bible-utils'; + export interface IWebViewProvider extends NetworkableObject { + /** + * @param savedWebView Filled out if an existing webview is being called for (matched by ID). Just + * ID if this is a new request or if the web view with the existing ID was not found + * @param getWebViewOptions + */ + getWebView( + savedWebView: SavedWebViewDefinition, + getWebViewOptions: GetWebViewOptions, + ): Promise; + } + export interface WebViewProvider + extends NetworkObject, + CanHaveOnDidDispose {} + export interface DisposableWebViewProvider + extends DisposableNetworkObject, + Omit {} +} +declare module 'shared/services/web-view-provider.service' { + /** + * Handles registering web view providers and serving web views around the papi. Exposed on the + * papi. + */ + import { + DisposableWebViewProvider, + IWebViewProvider, + WebViewProvider, + } from 'shared/models/web-view-provider.model'; + /** Sets up the service. Only runs once and always returns the same promise after that */ + const initialize: () => Promise; + /** + * Indicate if we are aware of an existing web view provider with the given type. If a web view + * provider with the given type is somewhere else on the network, this function won't tell you about + * it unless something else in the existing process is subscribed to it. + * + * @param webViewType Type of webView to check for + */ + function hasKnown(webViewType: string): boolean; + /** + * Register a web view provider to serve webViews for a specified type of webViews + * + * @param webViewType Type of web view to provide + * @param webViewProvider Object to register as a webView provider including control over disposing + * of it. + * + * WARNING: setting a webView provider mutates the provided object. + * @returns `webViewProvider` modified to be a network object + */ + function register( + webViewType: string, + webViewProvider: IWebViewProvider, + ): Promise; + /** + * Get a web view provider that has previously been set up + * + * @param webViewType Type of webview provider to get + * @returns Web view provider with the given name if one exists, undefined otherwise + */ + function get(webViewType: string): Promise; + export interface WebViewProviderService { + initialize: typeof initialize; + hasKnown: typeof hasKnown; + register: typeof register; + get: typeof get; + } + export interface PapiWebViewProviderService { + register: typeof register; + } + const webViewProviderService: WebViewProviderService; + /** + * + * Interface for registering webView providers + */ + export const papiWebViewProviderService: PapiWebViewProviderService; + export default webViewProviderService; +} +declare module 'shared/services/internet.service' { + /** Our shim over fetch. Allows us to control internet access. */ + const papiFetch: typeof fetch; + export interface InternetService { + fetch: typeof papiFetch; + } + /** + * + * Service that provides a way to call `fetch` since the original function is not available + */ + const internetService: InternetService; + export default internetService; +} +declare module 'shared/services/data-provider.service' { + /** Handles registering data providers and serving data around the papi. Exposed on the papi. */ + import { DataProviderDataTypes } from 'shared/models/data-provider.model'; + import IDataProviderEngine, { + DataProviderEngine, + } from 'shared/models/data-provider-engine.model'; + import { + DataProviderNames, + DataProviderTypes, + DataProviders, + DisposableDataProviders, + } from 'papi-shared-types'; + import IDataProvider, { IDisposableDataProvider } from 'shared/models/data-provider.interface'; + /** + * + * Indicate if we are aware of an existing data provider with the given name. If a data provider + * with the given name is somewhere else on the network, this function won't tell you about it + * unless something else in the existing process is subscribed to it. + */ + function hasKnown(providerName: string): boolean; + /** + * + * Decorator function that marks a data provider engine `set___` or `get___` method to be ignored. + * papi will not layer over these methods or consider them to be data type methods + * + * @example Use this as a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.ignore + * async getInternal() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + * + * OR + * + * @example Call this function signature on an object's method: + * + * ```typescript + * const myDataProviderEngine = { + * async getInternal() {}, + * }; + * papi.dataProviders.decorators.ignore(dataProviderEngine.getInternal); + * ``` + * + * @param method The method to ignore + */ + function ignore( + method: Function & { + isIgnored?: boolean; + }, + ): void; + /** + * Decorator function that marks a data provider engine `set___` or `get___` method to be ignored. + * papi will not layer over these methods or consider them to be data type methods + * + * @param target The class that has the method to ignore + * @param member The name of the method to ignore + * + * Note: this is the signature that provides the actual decorator functionality. However, since + * users will not be using this signature, the example usage is provided in the signature above. + */ + function ignore(target: object, member: string): void; + /** + * + * Decorator function that marks a data provider engine `set` method not to automatically + * emit an update and notify subscribers of a change to the data. papi will still consider the + * `set` method to be a data type method, but it will not layer over it to emit updates. + * + * @example Use this as a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.doNotNotify + * async setVerse() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + * + * OR + * + * @example Call this function signature on an object's method: + * + * ```typescript + * const myDataProviderEngine = { + * async setVerse() {}, + * }; + * papi.dataProviders.decorators.ignore(dataProviderEngine.setVerse); + * ``` + * + * @param method The method not to layer over to send an automatic update + */ + function doNotNotify( + method: Function & { + doNotNotify?: boolean; + }, + ): void; + /** + * Decorator function that marks a data provider engine `set` method not to automatically + * emit an update and notify subscribers of a change to the data. papi will still consider the + * `set` method to be a data type method, but it will not layer over it to emit updates. + * + * @param target The class that has the method not to layer over to send an automatic update + * @param member The name of the method not to layer over to send an automatic update + * + * Note: this is the signature that provides the actual decorator functionality. However, since + * users will not be using this signature, the example usage is provided in the signature above. + */ + function doNotNotify(target: object, member: string): void; + /** + * + * A collection of decorators to be used with the data provider service + * + * @example To use the `ignore` a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.ignore + * async getInternal() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + */ + const decorators: { + /** + * + * Decorator function that marks a data provider engine `set___` or `get___` method to be ignored. + * papi will not layer over these methods or consider them to be data type methods + * + * @example Use this as a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.ignore + * async getInternal() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + * + * OR + * + * @example Call this function signature on an object's method: + * + * ```typescript + * const myDataProviderEngine = { + * async getInternal() {}, + * }; + * papi.dataProviders.decorators.ignore(dataProviderEngine.getInternal); + * ``` + * + * @param method The method to ignore + */ + ignore: typeof ignore; + /** + * + * Decorator function that marks a data provider engine `set` method not to automatically + * emit an update and notify subscribers of a change to the data. papi will still consider the + * `set` method to be a data type method, but it will not layer over it to emit updates. + * + * @example Use this as a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.doNotNotify + * async setVerse() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + * + * OR + * + * @example Call this function signature on an object's method: + * + * ```typescript + * const myDataProviderEngine = { + * async setVerse() {}, + * }; + * papi.dataProviders.decorators.ignore(dataProviderEngine.setVerse); + * ``` + * + * @param method The method not to layer over to send an automatic update + */ + doNotNotify: typeof doNotNotify; + }; + /** + * + * Creates a data provider to be shared on the network layering over the provided data provider + * engine. + * + * @param providerName Name this data provider should be called on the network + * @param dataProviderEngine The object to layer over with a new data provider object + * @param dataProviderType String to send in a network event to clarify what type of data provider + * is represented by this engine. For generic data providers, the default value of `dataProvider` + * can be used. For data provider types that have multiple instances (e.g., project data + * providers), a unique type name should be used to distinguish from generic data providers. + * @param dataProviderAttributes Optional object that will be sent in a network event to provide + * additional metadata about the data provider represented by this engine. + * + * WARNING: registering a dataProviderEngine mutates the provided object. Its `notifyUpdate` and + * `set` methods are layered over to facilitate data provider subscriptions. + * @returns The data provider including control over disposing of it. Note that this data provider + * is a new object distinct from the data provider engine passed in. + */ + function registerEngine( + providerName: DataProviderName, + dataProviderEngine: IDataProviderEngine, + dataProviderType?: string, + dataProviderAttributes?: + | { + [property: string]: unknown; + } + | undefined, + ): Promise; + /** + * Creates a data provider to be shared on the network layering over the provided data provider + * engine. + * + * @type `TDataTypes` - The data provider data types served by the data provider to create. + * + * This is not exposed on the papi as it is a helper function to enable other services to layer over + * this service and create their own subsets of data providers with other types than + * `DataProviders` types using this function and {@link getByType} + * @param providerName Name this data provider should be called on the network + * @param dataProviderEngine The object to layer over with a new data provider object + * @param dataProviderType String to send in a network event to clarify what type of data provider + * is represented by this engine. For generic data providers, the default value of `dataProvider` + * can be used. For data provider types that have multiple instances (e.g., project data + * providers), a unique type name should be used to distinguish from generic data providers. + * @param dataProviderAttributes Optional object that will be sent in a network event to provide + * additional metadata about the data provider represented by this engine. + * + * WARNING: registering a dataProviderEngine mutates the provided object. Its `notifyUpdate` and + * `set` methods are layered over to facilitate data provider subscriptions. + * @returns The data provider including control over disposing of it. Note that this data provider + * is a new object distinct from the data provider engine passed in. + */ + export function registerEngineByType( + providerName: string, + dataProviderEngine: IDataProviderEngine, + dataProviderType?: string, + dataProviderAttributes?: + | { + [property: string]: unknown; + } + | undefined, + ): Promise>>; + /** + * + * Get a data provider that has previously been set up + * + * @param providerName Name of the desired data provider + * @returns The data provider with the given name if one exists, undefined otherwise + */ + function get( + providerName: DataProviderName, + ): Promise; + /** + * Get a data provider that has previously been set up + * + * @type `T` - The type of data provider to get. Use `IDataProvider`, + * specifying your own types, or provide a custom data provider type + * + * This is not exposed on the papi as it is a helper function to enable other services to layer over + * this service and create their own subsets of data providers with other types than + * `DataProviders` types using this function and {@link registerEngineByType} + * @param providerName Name of the desired data provider + * @returns The data provider with the given name if one exists, undefined otherwise + */ + export function getByType>( + providerName: string, + ): Promise; + export interface DataProviderService { + /** + * + * Indicate if we are aware of an existing data provider with the given name. If a data provider + * with the given name is somewhere else on the network, this function won't tell you about it + * unless something else in the existing process is subscribed to it. + */ + hasKnown: typeof hasKnown; + /** + * + * Creates a data provider to be shared on the network layering over the provided data provider + * engine. + * + * @param providerName Name this data provider should be called on the network + * @param dataProviderEngine The object to layer over with a new data provider object + * @param dataProviderType String to send in a network event to clarify what type of data provider + * is represented by this engine. For generic data providers, the default value of `dataProvider` + * can be used. For data provider types that have multiple instances (e.g., project data + * providers), a unique type name should be used to distinguish from generic data providers. + * @param dataProviderAttributes Optional object that will be sent in a network event to provide + * additional metadata about the data provider represented by this engine. + * + * WARNING: registering a dataProviderEngine mutates the provided object. Its `notifyUpdate` and + * `set` methods are layered over to facilitate data provider subscriptions. + * @returns The data provider including control over disposing of it. Note that this data provider + * is a new object distinct from the data provider engine passed in. + */ + registerEngine: typeof registerEngine; + /** + * + * Get a data provider that has previously been set up + * + * @param providerName Name of the desired data provider + * @returns The data provider with the given name if one exists, undefined otherwise + */ + get: typeof get; + /** + * + * A collection of decorators to be used with the data provider service + * + * @example To use the `ignore` a decorator on a class's method: + * + * ```typescript + * class MyDataProviderEngine { + * @papi.dataProviders.decorators.ignore + * async getInternal() {} + * } + * ``` + * + * WARNING: Do not copy and paste this example. The `@` symbol does not render correctly in JSDoc + * code blocks, so a different unicode character was used. Please use a normal `@` when using a + * decorator. + */ + decorators: typeof decorators; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for data provider engine classes. If a + * data provider engine class extends this class, it doesn't have to specify its own `notifyUpdate` + * function in order to use `notifyUpdate`. + * + * @see {@link IDataProviderEngine} for more information on extending this class. + */ + DataProviderEngine: typeof DataProviderEngine; + } + /** + * + * Service that allows extensions to send and receive data to/from other extensions + */ + const dataProviderService: DataProviderService; + export default dataProviderService; +} +declare module 'shared/models/project-metadata.model' { + import { ProjectInterfaces } from 'papi-shared-types'; + /** + * Low-level information describing a project that Platform.Bible directly manages and uses to load + * project data + * + * Returned from Project Data Provider Factories in order to inform others about what projects they + * support in what form. Layered over to create {@link ProjectMetadata} + */ + export type ProjectMetadataWithoutFactoryInfo = { + /** ID of the project (must be unique and case insensitive) */ + id: string; + /** + * All `projectInterface`s (aka standardized sets of methods on a PDP) that Project Data Providers + * for this project support. Indicates what sort of project data should be available on this + * project. + */ + projectInterfaces: ProjectInterfaces[]; + }; + export type ProjectDataProviderFactoryMetadataInfo = { + /** + * Which `projectInterface`s (aka standardized sets of methods on a PDP) the Project Data Provider + * for this project created by this Project Data Provider Factory supports. Indicates what sort of + * project data should be available on this project from this PDP Factory. + */ + projectInterfaces: ProjectInterfaces[]; + }; + /** + * Low-level information describing a project that Platform.Bible directly manages and uses to load + * project data + * + * `papi.projectLookup` retrieves, aggregates, and augments + * {@link ProjectMetadataWithoutFactoryInfo}s from Project Data Provider Factories to create these in + * order to inform others about what projects are available and in what forms. This metadata may be + * merged from metadata provided by multiple PDPFs. + */ + export type ProjectMetadata = ProjectMetadataWithoutFactoryInfo & { + /** + * Specifics regarding which Project Data Provider Factories provide which `projectInterface`s. + * This is additional metadata in addition to the `projectInterfaces` property that may be useful + * in a few specific situations. All `projectInterfaces` contained in this data are already listed + * in `projectInterfaces`, so you can use that unless you have a specific need to use this extra + * information. + * + * The keys of this object are ids of the PDP Factories that provide the metadata, namely the + * `projectInterface`s for this project (meaning this PDPF can provide a Project Data Provider for + * this project with these `projectInterfaces`) + */ + pdpFactoryInfo: { + [pdpFactoryId: string]: ProjectDataProviderFactoryMetadataInfo | undefined; + }; + }; +} +declare module 'shared/models/project-data-provider-factory.interface' { + import { Dispose, ModifierProject } from 'platform-bible-utils'; + import { ProjectMetadataWithoutFactoryInfo } from 'shared/models/project-metadata.model'; + export const PDP_FACTORY_OBJECT_TYPE: string; + export type ProjectMetadataFilterOptions = ModifierProject & { + /** Project IDs to include */ + includeProjectIds?: string | string[]; + /** Project IDs to exclude */ + excludeProjectIds?: string | string[]; + }; + /** + * Network object that creates Project Data Providers of a specific set of `projectInterface`s as + * requested on the `papi`. These are created internally within the platform to layer over + * TypeScript-extension-provided {@link IProjectDataProviderEngineFactory} or are created by + * independent processes on the `papi`. + * + * A PDP Factory can provide its own unique project ids (Base PDP Factory) or layer over other PDPFs + * and provide additional `projectInterface`s on those projects (Layering PDP Factory). Base PDP + * Factories must create PDPs that support the `platform.base` `projectInterface`. See + * {@link IBaseProjectDataProvider} and {@link ProjectDataProviderInterfaces} for more information. + */ + interface IProjectDataProviderFactory extends Dispose { + /** + * + * Get metadata about all projects that can be served by PDPs created by this PDP factory. + * + * If this is a Base PDP Factory, this method should return this PDP Factory's own unique project + * IDs. + * + * If this is a Layering PDP Factory, this method should call + * `papi.projectLookup.getMetadataForAllProjects` with some set of metadata filters in order to + * determine which projects it can layer over. The set of metadata filters relevant to this PDP + * Factory **absolutely must** be merged with the `layeringFilters` provided using + * `papi.projectLookup.mergeMetadataFilters`, or it will get into an infinite loop of calling + * other layering PDPs. + * + * WARNING: If this is a Layering PDP Factory, it **absolutely must** merge its metadata filters + * with `layeringFilters` provided using `papi.projectLookup.mergeMetadataFilters`! Otherwise you + * will cause an infinite loop that will break things. + * + * @param layeringFilters If applicable, filters used to prevent this Layering PDP Factory from + * entering an infinite loop with another Layering PDP Factory. You **absolutely must** merge + * these filters with your own filters using `papi.projectLookup.mergeMetadataFilters` when + * calling `papi.projectLookup.getMetadataForAllProjects` inside this method. If you are not + * calling `getMetadataForAllProjects` inside this method (likely if this is a Base PDPF), you + * can safely ignore this parameter. + */ + getAvailableProjects( + layeringFilters?: ProjectMetadataFilterOptions, + ): Promise; + /** + * Returns the registered network object name of a PDP for the given project ID. Called by the + * platform when someone uses the project data provider service to access a project's data. + * + * @param projectId Id of the project for which to return a project data provider. + * @returns Id of the project data provider this `IProjectDataProviderFactory` created for this + * project id. It should return the same project data provider for the same combination of + * parameters throughout one session (in other words, in general, there should just be one + * project data provider for one project id). + */ + getProjectDataProviderId(projectId: string): Promise; + } + export default IProjectDataProviderFactory; +} +declare module 'shared/models/project-lookup.service-model' { + import { + ProjectDataProviderFactoryMetadataInfo, + ProjectMetadata, + } from 'shared/models/project-metadata.model'; + import { ProjectInterfaces } from 'papi-shared-types'; + import { ProjectMetadataFilterOptions } from 'shared/models/project-data-provider-factory.interface'; + export const NETWORK_OBJECT_NAME_PROJECT_LOOKUP_SERVICE = 'ProjectLookupService'; + /** + * Transform the well-known pdp factory id into an id for its network object to use + * + * @param pdpFactoryId Id extensions use to identify this pdp factory + * @returns Id for then network object for this pdp factory + */ + export function getPDPFactoryNetworkObjectNameFromId(pdpFactoryId: string): string; + /** + * Transform a network object id for a pdp factory into its well-known pdp factory id + * + * @param pdpFactoryNetworkObjectName Id for then network object for this pdp factory + * @returns Id extensions use to identify this pdp factory + */ + export function getPDPFactoryIdFromNetworkObjectName(pdpFactoryNetworkObjectName: string): string; + /** + * + * Provides metadata for projects known by the platform + * + * Note: this service runs locally everywhere in the TypeScript processes. It is also exposed on the + * PAPI websocket. Note these functions are all asynchronous on the PAPI websocket regardless of if + * their types are synchronous locally. + */ + export type ProjectLookupServiceType = { + /** + * Provide metadata for all projects that have PDP factories + * + * Note: If there are multiple PDPs available whose metadata matches the conditions provided by + * the parameters, their project metadata will all be combined, so all available + * `projectInterface`s provided by the PDP Factory with the matching id (or all PDP Factories if + * no id is specified) for the project will be returned. If you need `projectInterface`s supported + * by specific PDP Factories, you can access it at {@link ProjectMetadata.pdpFactoryInfo}. + * + * @param options Options for specifying filters for the project metadata retrieved. If a PDP + * Factory Id does not match the filter, it will not be contacted at all for this function call. + * As a result, a PDP factory that intends to layer over other PDP factories **must** specify + * its id in `options.excludePdpFactoryIds` to avoid an infinite loop of calling this function. + * @returns ProjectMetadata for all projects stored on the local system + */ + getMetadataForAllProjects(options?: ProjectMetadataFilterOptions): Promise; + /** + * Look up metadata for a specific project ID + * + * Note: If there are multiple PDPs available whose metadata matches the conditions provided by + * the parameters, their project metadata will all be combined, so all available + * `projectInterface`s provided by the PDP Factory with the matching id (or all PDP Factories if + * no id is specified) for the project will be returned. If you need `projectInterface`s supported + * by specific PDP Factories, you can access it at {@link ProjectMetadata.pdpFactoryInfo}. + * + * @param projectId ID of the project to load + * @param projectInterface Optional `projectInterface` of the project to load. If not provided, + * then look at all `projectInterface`s for the given project ID. + * @param pdpFactoryId Optional ID of the PDP factory where the project ID should be loaded. If + * not provided, then look in all available PDP factories for the given project ID. + * @returns ProjectMetadata for the given project + */ + getMetadataForProject( + projectId: string, + projectInterface?: ProjectInterfaces, + pdpFactoryId?: string, + ): Promise; + /** + * Compare two project ids to determine if they are equal + * + * We're treating project IDs as case insensitive strings. + * + * From + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator/Collator: + * + * Only strings that differ in base letters or accents and other diacritic marks compare as + * unequal. Examples: a ≠ b, a ≠ á, a = A. + */ + areProjectIdsEqual(projectIdA: string, projectIdB: string): boolean; + /** Filter an array of {@link ProjectMetadata} in various ways */ + filterProjectsMetadata( + projectsMetadata: ProjectMetadata[], + options: ProjectMetadataFilterOptions, + ): ProjectMetadata[]; + /** Combines two project metadata filters, removing duplicate items */ + mergeMetadataFilters( + metadataFilter1: ProjectMetadataFilterOptions | undefined, + metadataFilter2: ProjectMetadataFilterOptions | undefined, + ): ProjectMetadataFilterOptions; + /** + * Get the PDP Factory info whose `projectInterface`s are most minimally matching to the provided + * `projectInterface` + * + * Hopefully this will allow us to get the PDP that most closely matches the `projectInterface`s + * to avoid unnecessary redirects through layered PDPs + * + * @param projectMetadata Metadata for project for which to get minimally matching PDPF + * @param projectInterface Which `projectInterface` to minimally match for + * @returns PDP Factory id whose `projectInterface`s minimally match the provided + * `projectInterface` if at least one PDP Factory was found that supports the `projectInterface` + * provided + */ + getMinimalMatchPdpFactoryId( + projectMetadata: ProjectMetadata, + projectInterface: ProjectInterfaces, + ): string | undefined; + }; + /** Local object of functions to run locally on each process as part of the project lookup service */ + export const projectLookupServiceBase: ProjectLookupServiceType; + /** + * Note: If there are multiple PDPs available whose metadata matches the conditions provided by the + * parameters, their project metadata will all be combined, so all available `projectInterface`s + * provided by the PDP Factory with the matching id (or all PDP Factories if no id is specified) for + * the project will be returned. If you need `projectInterface`s supported by specific PDP + * Factories, you can access it at {@link ProjectMetadata.pdpFactoryInfo}. + */ + function internalGetMetadata(options?: ProjectMetadataFilterOptions): Promise; + function transformGetMetadataForProjectParametersToFilter( + projectId?: string, + projectInterface?: ProjectInterfaces, + pdpFactoryId?: string, + ): { + includeProjectIds: string | undefined; + includeProjectInterfaces: string | undefined; + includePdpFactoryIds: string | undefined; + }; + /** + * Determines whether the given project interfaces are included based on specified inclusion and + * exclusion rules. + * + * This function checks if a set of project interfaces meets the criteria defined by regular + * expressions for inclusion and exclusion. + * + * - A project interface is excluded if it matches any of the provided exclusion patterns. + * - A project interface is included only if it matches at least one of the provided inclusion + * patterns. + * + * @param projectInterfaces - An array of project interfaces to evaluate against the inclusion and + * exclusion patterns. + * @param includeProjectInterfaces - An array of regular expressions or arrays of regular + * expressions defining which interfaces should be included. + * @param excludeProjectInterfaces - An array of regular expressions or arrays of regular + * expressions defining which interfaces should be excluded. + * @returns A boolean value indicating whether the project interfaces satisfy the inclusion and + * exclusion criteria. + */ + export function areProjectInterfacesIncluded( + projectInterfaces: ProjectInterfaces[], + includeProjectInterfaces: (RegExp | RegExp[])[], + excludeProjectInterfaces: (RegExp | RegExp[])[], + ): boolean; + /** + * Compare function (for array sorting and such) that compares two PDPF Metadata infos by most + * minimal match to the `projectInterface` in question. + * + * Hopefully this will allow us to get the PDP that most closely matches the `projectInterface`s to + * avoid unnecessary redirects through layered PDPs + * + * @param pdpFMetadataInfoA First ProjectDataProviderFactoryMetadataInfo to compare + * @param pdpFMetadataInfoB Second ProjectDataProviderFactoryMetadataInfo to compare + * @returns -1 if a is less than b, 0 if equal, and 1 otherwise + */ + function compareProjectDataProviderFactoryMetadataInfoMinimalMatch( + pdpFMetadataInfoA: ProjectDataProviderFactoryMetadataInfo | undefined, + pdpFMetadataInfoB: ProjectDataProviderFactoryMetadataInfo | undefined, + ): -1 | 0 | 1; + /** This is an internal-only export for testing purposes and should not be used in development */ + export const testingProjectLookupService: { + internalGetMetadata: typeof internalGetMetadata; + compareProjectDataProviderFactoryMetadataInfoMinimalMatch: typeof compareProjectDataProviderFactoryMetadataInfoMinimalMatch; + transformGetMetadataForProjectParametersToFilter: typeof transformGetMetadataForProjectParametersToFilter; + }; +} +declare module 'shared/services/project-lookup.service' { + const projectLookupService: import('shared/models/project-lookup.service-model').ProjectLookupServiceType; + export default projectLookupService; +} +declare module 'shared/models/project-data-provider-engine-factory.model' { + import { ProjectInterfaces } from 'papi-shared-types'; + import { ProjectMetadataFilterOptions } from 'shared/models/project-data-provider-factory.interface'; + import { ProjectMetadataWithoutFactoryInfo } from 'shared/models/project-metadata.model'; + import { IProjectDataProviderEngine } from 'shared/models/project-data-provider-engine.model'; + /** + * A factory object registered with the papi that creates a Project Data Provider Engine for each + * project with the factory's specified `projectInterface`s when the papi requests. Used by the papi + * to create {@link IProjectDataProviderEngine}s for a specific project and `projectInterface` when + * someone gets a project data provider with `papi.projectDataProviders.get`. When this factory + * object is registered with `papi.projectDataProviders.registerProjectDataProviderEngineFactory`, + * the papi creates a {@link ProjectDataProviderFactory} that layers over this engine to create + * {@link IProjectDataProvider}s. + * + * Project Data Provider Engine Factories create Project Data Provider Engines for specific + * `projectInterface`s. For each project id available on a Project Data Provider Factory, the + * factory that supports that project with some set of `projectInterface`s creates a new instance of + * a PDP with the supported `projectInterface`s. + * + * A PDP Factory can provide its own unique project ids (Base PDP Factory) or layer over other PDPFs + * and provide additional `projectInterface`s on those projects (Layering PDP Factory). Base PDP + * Factories must create PDPs that support the `platform.base` `projectInterface`. See + * {@link IBaseProjectDataProvider} and {@link ProjectDataProviderInterfaces} for more information. + * + * WARNING: For Layering PDPFs, `getAvailableProjects` has very specific requirements that + * **absolutely must** be met. Please see + * {@link IProjectDataProviderEngineFactory.getAvailableProjects} for more information on the + * requirements. + * + * To make creating a Layering PDPF easier, you can extend + * {@link LayeringProjectDataProviderEngineFactory}, which automatically fulfills the special + * requirements for Layering PDPFs. We highly recommend using it. + */ + export interface IProjectDataProviderEngineFactory< + SupportedProjectInterfaces extends ProjectInterfaces[], + > { + /** + * + * Get metadata about all projects that can be served by PDPs created by this PDP factory. + * + * If this is a Base PDP Factory, this method should return this PDP Factory's own unique project + * IDs. + * + * If this is a Layering PDP Factory, this method should call + * `papi.projectLookup.getMetadataForAllProjects` with some set of metadata filters in order to + * determine which projects it can layer over. The set of metadata filters relevant to this PDP + * Factory **absolutely must** be merged with the `layeringFilters` provided using + * `papi.projectLookup.mergeMetadataFilters`, or it will get into an infinite loop of calling + * other layering PDPs. + * + * WARNING: If this is a Layering PDP Factory, it **absolutely must** merge its metadata filters + * with `layeringFilters` provided using `papi.projectLookup.mergeMetadataFilters`! Otherwise you + * will cause an infinite loop that will break things. + * + * @param layeringFilters If applicable, filters used to prevent this Layering PDP Factory from + * entering an infinite loop with another Layering PDP Factory. You **absolutely must** merge + * these filters with your own filters using `papi.projectLookup.mergeMetadataFilters` when + * calling `papi.projectLookup.getMetadataForAllProjects` inside this method. If you are not + * calling `getMetadataForAllProjects` inside this method (likely if this is a Base PDPF), you + * can safely ignore this parameter. + */ + getAvailableProjects( + layeringFilters?: ProjectMetadataFilterOptions, + ): Promise; + /** + * Create a {@link IProjectDataProviderEngine} for the project requested so the papi can create an + * {@link IProjectDataProvider} for the project. This project will have the same + * `projectInterface`s as this Project Data Provider Engine Factory + * + * @param projectId Id of the project for which to create a {@link IProjectDataProviderEngine} + * @returns A promise that resolves to a {@link IProjectDataProviderEngine} for the project passed + * in + */ + createProjectDataProviderEngine( + projectId: string, + ): Promise>; + } + /** + * + * Abstract class with partial implementation of {@link IProjectDataProviderEngineFactory} + * specifically for Layering PDPFs. You can extend this class to make creating a Layering PDPF + * easier. + * + * Extending this class automatically fulfills the special requirements for Layering PDPfs, so we + * highly recommend extending this class. Please see + * {@link IProjectDataProviderEngineFactory.getAvailableProjects} for more information on the + * requirements. + */ + export abstract class LayeringProjectDataProviderEngineFactory< + SupportedProjectInterfaces extends ProjectInterfaces[], + > { + pdpfId: string; + /** Regex-escaped string of this `pdpfId`. */ + protected pdpfIdRegexString: string; + /** + * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s + * (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if they should be included in the available projects this Layering PDPF + * provides. This is used as {@link ProjectMetadataFilterOptions.includeProjectInterfaces} when + * determining what available projects this layering PDPF supports. You should list here all + * combinations of `projectInterface`s your Layering PDPs require to make sure this layering PDPF + * announces that it supports the right projects. + * + * See {@link ProjectMetadataFilterOptions.includeProjectInterfaces} for more information on how to + * use this field. + * + * @example + * + * ```typescript + * projectInterfacesToLayerOver: ['one', ['two', 'three']]; + * ``` + * + * This layering PDPF will announce that it supports projects whose `projectInterface`s fulfill at + * least one of the following conditions (At least one entry in the array must match) and will + * provide `providedProjectInterfaces` for those projects: + * + * - Include `one` + * - Include both `two` and `three`. + */ + abstract projectInterfacesToLayerOver: undefined | string | (string | string[])[]; + /** + * The list of `projectInterface`s that this layering PDPF provides on top of existing projects. + * + * @example + * + * ```typescript + * providedProjectInterfaces: ['four', 'five']; + * ``` + * + * This layering PDPF will announce that its provides the `projectInterface`s `four` and `five` + * for projects that match `projectInterfacesToLayerOver`. + */ + abstract providedProjectInterfaces: SupportedProjectInterfaces; + /** @param pdpfId The id of this Project Data Provider Factory */ + constructor(pdpfId: string); + /** + * Implementation of {@link IProjectDataProviderEngineFactory.getAvailableProjects} that properly + * fulfills the requirements of the method for Layering PDPFs. Announces that this Layering PDPF + * provides the `providedProjectInterfaces` for projects that match + * `projectInterfacesToLayerOver`. + */ + getAvailableProjects( + layeringFilters?: ProjectMetadataFilterOptions, + ): Promise; + } +} +declare module 'shared/models/project-data-provider-engine.model' { + import { ProjectInterfaces, ProjectInterfaceDataTypes } from 'papi-shared-types'; + import IDataProviderEngine, { + DataProviderEngine, + } from 'shared/models/data-provider-engine.model'; + import { DataProviderDataTypes } from 'shared/models/data-provider.model'; + import { UnionToIntersection } from 'platform-bible-utils'; + /** + * The object to return from + * {@link IProjectDataProviderEngineFactory.createProjectDataProviderEngine} that the PAPI registers + * to create a Project Data Provider for a specific project. The ProjectDataProviderService creates + * an {@link IProjectDataProvider} on the papi that layers over this engine, providing special + * functionality. + * + * See {@link DataProviderDataTypes} for information on how to make powerful types that work well + * with Intellisense. + * + * Note: papi creates a `notifyUpdate` function on the Project Data Provider Engine if one is not + * provided, so it is not necessary to provide one in order to call `this.notifyUpdate`. However, + * TypeScript does not understand that papi will create one as you are writing your Project Data + * Provider Engine, so you can avoid type errors with one of the following options: + * + * 1. If you are using a class to create a Project Data Provider Engine, you can extend the + * {@link ProjectDataProviderEngine} class, and it will provide `notifyUpdate` as well as inform + * Intellisense that you can run `notifyUpdate` with the `Setting` data type for you: + * + * ```typescript + * class MyPDPE extends ProjectDataProviderEngine<['MyProjectData']> implements IProjectDataProviderEngine<['MyProjectData']> { + * ... + * } + * ``` + * + * 2. If you are using an object or class not extending {@link ProjectDataProviderEngine} to create a + * Project Data Provider Engine, you can add a `notifyUpdate` function (and, with an object, add + * the {@link WithNotifyUpdate} type) to your Project Data Provider Engine like so: + * + * ```typescript + * const myPDPE: IProjectDataProviderEngine<['MyProjectData']> & WithNotifyUpdate = { + * notifyUpdate(updateInstructions) {}, + * ... + * } + * ``` + * + * OR + * + * ```typescript + * class MyPDPE implements IProjectDataProviderEngine<['MyProjectData']> { + * notifyUpdate(updateInstructions?: DataProviderEngineNotifyUpdate) {} + * ... + * } + * ``` + */ + export type IProjectDataProviderEngine = + IDataProviderEngine< + UnionToIntersection & {} + >; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Project Data Provider Engine + * classes. If a Project Data Provider Engine class extends this class, it doesn't have to specify + * its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IProjectDataProviderEngine} for more information on extending this class. + */ + export abstract class ProjectDataProviderEngine< + SupportedProjectInterfaces extends ProjectInterfaces[], + AdditionalDataTypes extends DataProviderDataTypes = {}, + > extends DataProviderEngine< + UnionToIntersection & + AdditionalDataTypes + > {} +} +declare module 'shared/models/base-project-data-provider-engine.model' { + import { + ProjectInterfaces, + ProjectInterfaceDataTypes, + WithProjectDataProviderEngineSettingMethods, + ProjectSettingNames, + ProjectSettingTypes, + } from 'papi-shared-types'; + import { + PROJECT_INTERFACE_PLATFORM_BASE, + WithProjectDataProviderEngineExtensionDataMethods, + } from 'shared/models/project-data-provider.model'; + import { DataProviderDataType } from 'shared/models/data-provider.model'; + import { UnionToIntersection } from 'platform-bible-utils'; + import { + IProjectDataProviderEngine, + ProjectDataProviderEngine, + } from 'shared/models/project-data-provider-engine.model'; + /** + * The object to return from + * {@link IProjectDataProviderEngineFactory.createProjectDataProviderEngine} that the PAPI registers + * to create a Base Project Data Provider for a specific project. The ProjectDataProviderService + * creates an {@link IBaseProjectDataProvider} on the papi that layers over this engine, providing + * special functionality. + * + * See {@link DataProviderDataTypes} for information on how to make powerful types that work well + * with Intellisense. + * + * Note: papi creates a `notifyUpdate` function on the Project Data Provider Engine if one is not + * provided, so it is not necessary to provide one in order to call `this.notifyUpdate`. However, + * TypeScript does not understand that papi will create one as you are writing your Base Project + * Data Provider Engine, so you can avoid type errors with one of the following options: + * + * 1. If you are using a class to create a Base Project Data Provider Engine, you can extend the + * {@link BaseProjectDataProviderEngine} class, and it will provide `notifyUpdate` as well as + * inform Intellisense that you can run `notifyUpdate` with the `Setting` data type for you: + * + * ```typescript + * class MyPDPE extends BaseProjectDataProviderEngine<['MyProjectData']> implements IBaseProjectDataProviderEngine<['MyProjectData']> { + * ... + * } + * ``` + * + * 2. If you are using an object or class not extending {@link BaseProjectDataProviderEngine} to create + * a Base Project Data Provider Engine, you can add a `notifyUpdate` function (and, with an + * object, add the {@link WithNotifyUpdate} type) to your Base Project Data Provider Engine like + * so: + * + * ```typescript + * const myPDPE: IBaseProjectDataProviderEngine<['MyProjectData']> & WithNotifyUpdate = { + * notifyUpdate(updateInstructions) {}, + * ... + * } + * ``` + * + * OR + * + * ```typescript + * class MyPDPE implements IBaseProjectDataProviderEngine<['MyProjectData']> { + * notifyUpdate(updateInstructions?: DataProviderEngineNotifyUpdate) {} + * ... + * } + * ``` + */ + export type IBaseProjectDataProviderEngine< + SupportedProjectInterfaces extends ProjectInterfaces[], + > = IProjectDataProviderEngine< + [typeof PROJECT_INTERFACE_PLATFORM_BASE, ...SupportedProjectInterfaces] + > & + WithProjectDataProviderEngineSettingMethods< + UnionToIntersection & {} + > & + WithProjectDataProviderEngineExtensionDataMethods< + UnionToIntersection & {} + >; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Base Project Data Provider Engine + * classes. If a Base Project Data Provider Engine class extends this class, it doesn't have to + * specify its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IBaseProjectDataProviderEngine} for more information on extending this class. + */ + export abstract class BaseProjectDataProviderEngine< + SupportedProjectInterfaces extends ProjectInterfaces[], + > extends ProjectDataProviderEngine< + [typeof PROJECT_INTERFACE_PLATFORM_BASE, ...SupportedProjectInterfaces], + { + Setting: DataProviderDataType< + ProjectSettingNames, + ProjectSettingTypes[ProjectSettingNames], + ProjectSettingTypes[ProjectSettingNames] + >; + } + > {} +} +declare module 'shared/services/project-data-provider.service' { + import { ProjectInterfaces, ProjectDataProviderInterfaces } from 'papi-shared-types'; + import { Dispose } from 'platform-bible-utils'; + import { IProjectDataProviderEngineFactory } from 'shared/models/project-data-provider-engine-factory.model'; + /** + * Add a new Project Data Provider Factory to PAPI that uses the given engine. + * + * @param pdpFactoryId Unique id for this PDP factory + * @param projectInterfaces The standardized sets of methods (`projectInterface`s) supported by the + * Project Data Provider Engines produced by this factory. Indicates what sort of project data + * should be available on the PDPEs created by this factory. + * @param pdpEngineFactory Used in a ProjectDataProviderFactory to create ProjectDataProviders + * @returns Promise that resolves to a disposable object when the registration operation completes + */ + export function registerProjectDataProviderEngineFactory< + SupportedProjectInterfaces extends ProjectInterfaces[], + >( + pdpFactoryId: string, + projectInterfaces: SupportedProjectInterfaces, + pdpEngineFactory: IProjectDataProviderEngineFactory, + ): Promise; + /** + * Get a Project Data Provider for the given project ID. + * + * @example + * + * ```typescript + * const pdp = await get('platformScripture.USFM_Verse', 'ProjectID12345'); + * pdp.getVerseUSFM(new VerseRef('JHN', '1', '1')); + * ``` + * + * @param projectInterface `projectInterface` that the project to load must support. The TypeScript + * type for the returned project data provider will have the project data provider interface type + * associated with this `projectInterface`. If the project does not implement this + * `projectInterface` (according to its metadata), an error will be thrown. + * @param projectId ID for the project to load + * @param pdpFactoryId Optional ID of the PDP factory from which to get the project data provider if + * the PDP factory supports this project id and project interface. If not provided, then look in + * all available PDP factories for the given project ID. + * @returns Project data provider with types that are associated with the given `projectInterface` + * @throws If did not find a project data provider for the project id that supports the requested + * `projectInterface` (and from the requested PDP factory if specified) + */ + export function get( + projectInterface: ProjectInterface, + projectId: string, + pdpFactoryId?: string, + ): Promise; + export interface PapiBackendProjectDataProviderService { + registerProjectDataProviderEngineFactory: typeof registerProjectDataProviderEngineFactory; + get: typeof get; + } + /** + * + * Service that registers and gets project data providers + */ + export const papiBackendProjectDataProviderService: PapiBackendProjectDataProviderService; + export interface PapiFrontendProjectDataProviderService { + get: typeof get; + } + /** + * + * Service that gets project data providers + */ + export const papiFrontendProjectDataProviderService: { + get: typeof get; + }; +} +declare module 'shared/data/file-system.model' { + /** Types to use with file system operations */ + /** + * Represents a path in file system or other. Has a scheme followed by :// followed by a relative + * path. If no scheme is provided, the app scheme is used. Available schemes are as follows: + * + * - `app://` - goes to the `.platform.bible` directory inside the user's home directory. + * + * - On Linux and Mac, this is `$HOME/.platform.bible` + * - On Windows, this is `%USERPROFILE%/.platform.bible` + * - Note: In development, `app://` always goes to `paranext-core/dev-appdata` + * - `cache://` - goes to the app's temporary file cache at `app://cache` + * - `data://` - goes to the app's data storage location at `app://data` + * - `resources://` - goes to the `resources` directory inside the install directory + * + * - Note: In development, `resources://` always goes to the repo root, `paranext-core`. Not all files + * are copied into the production `resources` folder, though. See `electron-builder.json5`'s + * `extraResources` for some that are copied. + * - `file://` - an absolute file path from drive root + * + * Note: projects are stored in the production version of `app://projects` regardless of whether you + * are in production or development + */ + export type Uri = string; +} +declare module 'node/utils/util' { + import { Uri } from 'shared/data/file-system.model'; + export const FILE_PROTOCOL = 'file://'; + export const RESOURCES_PROTOCOL = 'resources://'; + export function resolveHtmlPath(htmlFileName: string): string; + /** + * Gets the platform-specific user Platform.Bible folder for this application + * + * When running in development: `/dev-appdata` + * + * When packaged: `/.platform.bible` + */ + export const getAppDir: import('memoize-one').MemoizedFn<() => string>; + /** + * Resolves the uri to a path + * + * @param uri The uri to resolve + * @returns Real path to the uri supplied + */ + export function getPathFromUri(uri: Uri): string; + /** + * Combines the uri passed in with the paths passed in to make one uri + * + * @param uri Uri to start from + * @param paths Paths to combine into the uri + * @returns One uri that combines the uri and the paths in left-to-right order + */ + export function joinUriPaths(uri: Uri, ...paths: string[]): Uri; + /** + * Determines if running in noisy dev mode + * + * @returns True if the process is running in noisy dev mode, false otherwise + */ + export const isNoisyDevModeEnvVariableSet: () => boolean; +} +declare module 'node/services/node-file-system.service' { + /** File system calls from Node */ + import fs, { BigIntStats } from 'fs'; + import { Uri } from 'shared/data/file-system.model'; + /** + * Read a text file + * + * @param uri URI of file + * @returns Promise that resolves to the contents of the file + */ + export function readFileText(uri: Uri): Promise; + /** + * Read a binary file + * + * @param uri URI of file + * @returns Promise that resolves to the contents of the file + */ + export function readFileBinary(uri: Uri): Promise; + /** + * Write data to a file + * + * @param uri URI of file + * @param fileContents String or Buffer to write into the file + * @returns Promise that resolves after writing the file + */ + export function writeFile(uri: Uri, fileContents: string | Buffer): Promise; + /** + * Copies a file from one location to another. Creates the path to the destination if it does not + * exist + * + * @param sourceUri The location of the file to copy + * @param destinationUri The uri to the file to create as a copy of the source file + * @param mode Bitwise modifiers that affect how the copy works. See + * [`fsPromises.copyFile`](https://nodejs.org/api/fs.html#fspromisescopyfilesrc-dest-mode) for + * more information + */ + export function copyFile( + sourceUri: Uri, + destinationUri: Uri, + mode?: Parameters[2], + ): Promise; + /** + * Moves a file from one location to another + * + * @param sourceUri The location of the file to move + * @param destinationUri The uri where the file should be moved + */ + export function moveFile(sourceUri: Uri, destinationUri: Uri): Promise; + /** + * Delete a file if it exists + * + * @param uri URI of file + * @returns Promise that resolves when the file is deleted or determined to not exist + */ + export function deleteFile(uri: Uri): Promise; + /** + * Get stats about the file or directory. Note that BigInts are used instead of ints to avoid. + * https://en.wikipedia.org/wiki/Year_2038_problem + * + * @param uri URI of file or directory + * @returns Promise that resolves to object of type https://nodejs.org/api/fs.html#class-fsstats if + * file or directory exists, undefined if it doesn't + */ + export function getStats(uri: Uri): Promise; + /** + * Set the last modified and accessed times for the file or directory + * + * @param uri URI of file or directory + * @returns Promise that resolves once the touch operation finishes + */ + export function touch(uri: Uri, date: Date): Promise; + /** Type of file system item in a directory */ + export enum EntryType { + File = 'file', + Directory = 'directory', + Unknown = 'unknown', + } + /** All entries in a directory, mapped from entry type to array of uris for the entries */ + export type DirectoryEntries = Readonly<{ + [entryType in EntryType]: Uri[]; + }>; + /** + * Reads a directory and returns lists of entries in the directory by entry type. + * + * @param uri - URI of directory. + * @param entryFilter - Function to filter out entries in the directory based on their names. + * @returns Map of entry type to list of uris for each entry in the directory with that type. + */ + export function readDir( + uri: Uri, + entryFilter?: (entryName: string) => boolean, + ): Promise; + /** + * Create a directory in the file system if it does not exist. Does not throw if it already exists. + * + * @param uri URI of directory + * @returns Promise that resolves once the directory has been created + */ + export function createDir(uri: Uri): Promise; + /** + * Remove a directory and all its contents recursively from the file system + * + * @param uri URI of directory + * @returns Promise that resolves when the delete operation finishes + */ + export function deleteDir(uri: Uri): Promise; +} +declare module 'node/utils/crypto-util' { + export function createUuid(): string; + /** + * Create a cryptographically secure nonce that is at least 128 bits long. See nonce spec at + * https://w3c.github.io/webappsec-csp/#security-nonces + * + * @param encoding: "base64url" (HTML safe, shorter string) or "hex" (longer string) From + * https://base64.guru/standards/base64url, the purpose of this encoding is "the ability to use + * the encoding result as filename or URL address" + * @param numberOfBytes: Number of bytes the resulting nonce should contain + * @returns Cryptographically secure, pseudo-randomly generated value encoded as a string + */ + export function createNonce(encoding: 'base64url' | 'hex', numberOfBytes?: number): string; + /** + * Calculates the hash of a given data buffer + * + * @param hashAlgorithm Name of the hash algorithm to use, such as "sha512" + * @param encodingType String encoding to use for returning the binary hash value that is calculated + * @param buffer Raw data to be fed into the hash algorithm + * @returns String encoded value of the digest (https://csrc.nist.gov/glossary/term/hash_digest) + */ + export function generateHashFromBuffer( + hashAlgorithm: string, + encodingType: 'base64' | 'base64url' | 'hex' | 'binary', + buffer: Buffer, + ): string; +} +declare module 'shared/models/extension-basic-data.model' { + /** Represents an object that contains the most basic information about an extension */ + export type ExtensionBasicData = { + /** Name of an extension */ + name: string; + }; +} +declare module 'node/models/execution-token.model' { + import { ExtensionBasicData } from 'shared/models/extension-basic-data.model'; + /** For now this is just for extensions, but maybe we will want to expand this in the future */ + export type ExecutionTokenType = 'extension'; + /** Execution tokens can be passed into API calls to provide context about their identity */ + export class ExecutionToken implements ExtensionBasicData { + readonly type: ExecutionTokenType; + readonly name: string; + readonly nonce: string; + constructor(tokenType: ExecutionTokenType, name: string); + getHash(): string; + } +} +declare module 'node/services/execution-token.service' { + import { ExecutionToken } from 'node/models/execution-token.model'; + /** + * This should be called when extensions are being loaded + * + * @param extensionName Name of the extension to register + * @returns Token that can be passed to `tokenIsValid` to authenticate or authorize API callers. It + * is important that the token is not shared to avoid impersonation of API callers. + */ + function registerExtension(extensionName: string): ExecutionToken; + /** + * Remove a registered token. Note that a hash of a token is what is needed to unregister, not the + * full token itself (notably not the nonce), so something can be delegated the ability to + * unregister a token without having been given the full token itself. + * + * @param extensionName Name of the extension that was originally registered + * @param tokenHash Value of `getHash()` of the token that was originally registered. + * @returns `true` if the token was successfully unregistered, `false` otherwise + */ + function unregisterExtension(extensionName: string, tokenHash: string): boolean; + /** + * This should only be needed by services that need to contextualize the response for the caller + * + * @param executionToken Token that was previously registered. + * @returns `true` if the token matches a token that was previous registered, `false` otherwise. + */ + function tokenIsValid(executionToken: ExecutionToken): boolean; + const executionTokenService: { + registerExtension: typeof registerExtension; + unregisterExtension: typeof unregisterExtension; + tokenIsValid: typeof tokenIsValid; + }; + export default executionTokenService; +} +declare module 'extension-host/services/extension-storage.service' { + import { ExecutionToken } from 'node/models/execution-token.model'; + import { Buffer } from 'buffer'; + /** + * This is only intended to be called by the extension service. This service cannot call into the + * extension service or it causes a circular dependency. + */ + export function setExtensionUris(urisPerExtension: Map): void; + /** Return a path to the specified file within the extension's installation directory */ + export function buildExtensionPathFromName(extensionName: string, fileName: string): string; + /** + * Read a text file from the the extension's installation directory + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param fileName Name of the file to be read + * @returns Promise for a string with the contents of the file + */ + function readTextFileFromInstallDirectory( + token: ExecutionToken, + fileName: string, + ): Promise; + /** + * Read a binary file from the the extension's installation directory + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param fileName Name of the file to be read + * @returns Promise for a Buffer with the contents of the file + */ + function readBinaryFileFromInstallDirectory( + token: ExecutionToken, + fileName: string, + ): Promise; + /** + * Read data specific to the user (as identified by the OS) and extension (as identified by the + * ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @returns Promise for a string containing the data + */ + function readUserData(token: ExecutionToken, key: string): Promise; + /** + * Write data specific to the user (as identified by the OS) and extension (as identified by the + * ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @param data Data to be written + * @returns Promise that will resolve if the data is written successfully + */ + function writeUserData(token: ExecutionToken, key: string, data: string): Promise; + /** + * Delete data previously written that is specific to the user (as identified by the OS) and + * extension (as identified by the ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @returns Promise that will resolve if the data is deleted successfully + */ + function deleteUserData(token: ExecutionToken, key: string): Promise; + export interface ExtensionStorageService { + readTextFileFromInstallDirectory: typeof readTextFileFromInstallDirectory; + readBinaryFileFromInstallDirectory: typeof readBinaryFileFromInstallDirectory; + readUserData: typeof readUserData; + writeUserData: typeof writeUserData; + deleteUserData: typeof deleteUserData; + } + /** + * + * This service provides extensions in the extension host the ability to read/write data based on + * the extension identity and current user (as identified by the OS). This service will not work + * within the renderer. + */ + const extensionStorageService: ExtensionStorageService; + export default extensionStorageService; +} +declare module 'shared/models/dialog-options.model' { + import { LocalizeKey } from 'platform-bible-utils'; + /** General options to adjust dialogs (created from `papi.dialogs`) */ + export type DialogOptions = { + /** + * Dialog title to display in the header. If you provide a {@link LocalizeKey}, it will be + * localized before displaying. + * + * Default depends on the dialog + */ + title?: string | LocalizeKey; + /** Url of dialog icon to display in the header. Default is Platform.Bible logo */ + iconUrl?: string; + /** + * The message to show the user in the dialog. If you provide a {@link LocalizeKey}, it will be + * localized before displaying. + * + * Default depends on the dialog + */ + prompt?: string | LocalizeKey; + }; + /** Keys of properties on {@link DialogOptions} that should be localized if they are LocalizeKeys */ + export const DIALOG_OPTIONS_LOCALIZABLE_PROPERTY_KEYS: readonly ['title', 'prompt']; + /** Data in each tab that is a dialog. Added to DialogOptions in `dialog.service-host.ts` */ + export type DialogData = DialogOptions & { + isDialog: true; + }; +} +declare module 'renderer/components/dialogs/dialog-base.data' { + import { FloatSize, TabLoader, TabSaver } from 'shared/models/docking-framework.model'; + import { DialogData } from 'shared/models/dialog-options.model'; + import { ReactElement } from 'react'; + /** Base type for DialogDefinition. Contains reasonable defaults for dialogs */ + export type DialogDefinitionBase = Readonly<{ + /** Overwritten in {@link DialogDefinition}. Must be specified by all DialogDefinitions */ + tabType?: string; + /** Overwritten in {@link DialogDefinition}. Must be specified by all DialogDefinitions */ + Component?: (props: DialogProps) => ReactElement; + /** + * The default icon for this dialog. This may be overridden by the `DialogOptions.iconUrl` + * + * Defaults to the Platform.Bible logo + */ + defaultIconUrl?: string; + /** + * The default title for this dialog. This may be overridden by the `DialogOptions.title` + * + * Defaults to the DialogDefinition's `tabType` + */ + defaultTitle?: string; + /** The width and height at which the dialog will be loaded in CSS `px` units */ + initialSize: FloatSize; + /** The minimum width to which the dialog can be set in CSS `px` units */ + minWidth?: number; + /** The minimum height to which the dialog can be set in CSS `px` units */ + minHeight?: number; + /** + * The function used to load the dialog into the dock layout. Default uses the `Component` field + * and passes in the `DialogProps` + */ + loadDialog: TabLoader; + /** + * The function used to save the dialog into the dock layout + * + * Default does not save the dialog as they cannot properly be restored yet. + * + * TODO: preserve requests between refreshes - save the dialog info in such a way that it works + * when loading again after refresh + */ + saveDialog: TabSaver; + }>; + /** Props provided to the dialog component */ + export type DialogProps = DialogData & { + /** + * Sends the data as a resolved response to the dialog request and closes the dialog + * + * @param data Data with which to resolve the request + */ + submitDialog(data: TData): void; + /** Cancels the dialog request (resolves the response with `undefined`) and closes the dialog */ + cancelDialog(): void; + /** + * Rejects the dialog request with the specified message and closes the dialog + * + * @param errorMessage Message to explain why the dialog request was rejected + */ + rejectDialog(errorMessage: string): void; + }; + /** + * Set the functionality of submitting and canceling dialogs. This should be called specifically by + * `dialog.service-host.ts` immediately on startup and by nothing else. This is only here to + * mitigate a dependency cycle + * + * @param dialogServiceFunctions Functions from the dialog service host for resolving and rejecting + * dialogs + */ + export function hookUpDialogService({ + resolveDialogRequest: resolve, + rejectDialogRequest: reject, + }: { + resolveDialogRequest: (id: string, data: unknown | undefined) => void; + rejectDialogRequest: (id: string, message: string) => void; + }): void; + /** + * Static definition of a dialog that can be shown in Platform.Bible + * + * For good defaults, dialogs can include all the properties of this dialog. Dialogs must then + * specify `tabType` and `Component` in order to comply with `DialogDefinition` + * + * Note: this is not a class that can be inherited because all properties would be static but then + * we would not be able to use the default `loadDialog` because it would be using a static reference + * to a nonexistent `Component`. Instead of inheriting this as a class, any dialog definition can + * spread this `{ ...DIALOG_BASE }` + */ + const DIALOG_BASE: DialogDefinitionBase; + export default DIALOG_BASE; +} +declare module 'renderer/components/dialogs/dialog-definition.model' { + import { DialogOptions } from 'shared/models/dialog-options.model'; + import { DialogDefinitionBase, DialogProps } from 'renderer/components/dialogs/dialog-base.data'; + import { ReactElement } from 'react'; + import { ProjectMetadataFilterOptions } from 'shared/models/project-data-provider-factory.interface'; + /** The tabType for the select project dialog in `select-project.dialog.tsx` */ + export const SELECT_PROJECT_DIALOG_TYPE = 'platform.selectProject'; + /** The tabType for the select multiple projects dialog in `select-multiple-projects.dialog.tsx` */ + export const SELECT_MULTIPLE_PROJECTS_DIALOG_TYPE = 'platform.selectMultipleProjects'; + /** The tabType for the select books dialog in `select-books.dialog.tsx` */ + export const SELECT_BOOKS_DIALOG_TYPE = 'platform.selectBooks'; + type ProjectDialogOptionsBase = DialogOptions & ProjectMetadataFilterOptions; + /** Options to provide when showing the Select Project dialog */ + export type SelectProjectDialogOptions = ProjectDialogOptionsBase; + /** Options to provide when showing the Select Multiple Project dialog */ + export type SelectMultipleProjectsDialogOptions = ProjectDialogOptionsBase & { + /** Project IDs that should start selected in the dialog */ + selectedProjectIds?: string[]; + }; + /** Options to provide when showing the Select Books dialog */ + export type SelectBooksDialogOptions = DialogOptions & { + /** Books IDs that should start selected in the dialog */ + selectedBookIds?: string[]; + }; + /** + * Mapped type for dialog functions to use in getting various types for dialogs + * + * Keys should be dialog names, and values should be {@link DialogDataTypes} + * + * If you add a dialog here, you must also add it on {@link DIALOGS} + */ + export interface DialogTypes { + [SELECT_PROJECT_DIALOG_TYPE]: DialogDataTypes; + [SELECT_MULTIPLE_PROJECTS_DIALOG_TYPE]: DialogDataTypes< + SelectMultipleProjectsDialogOptions, + string[] + >; + [SELECT_BOOKS_DIALOG_TYPE]: DialogDataTypes; + } + /** Each type of dialog. These are the tab types used in the dock layout */ + export type DialogTabTypes = keyof DialogTypes; + /** Types related to a specific dialog */ + export type DialogDataTypes = { + /** + * The dialog options to specify when calling the dialog. Passed into `loadDialog` as + * SavedTabInfo.data + * + * The default implementation of `loadDialog` passes all the options down to the dialog component + * as props + */ + options: TOptions; + /** The type of the response to the dialog request */ + responseType: TReturnType; + /** Props provided to the dialog component */ + props: DialogProps & TOptions; + }; + export type DialogDefinition = Readonly< + DialogDefinitionBase & { + /** + * Type of tab - indicates what kind of built-in dock layout tab this dialog definition + * represents + */ + tabType: DialogTabType; + /** + * React component to render for this dialog + * + * This must be specified only if you do not overwrite the default `loadDialog` + * + * @param props Props that will be passed through from the dialog tab's data + * @returns React element to render + */ + Component: ( + props: DialogProps & + DialogTypes[DialogTabType]['options'], + ) => ReactElement; + } + >; +} +declare module 'shared/services/dialog.service-model' { + import { + DialogTabTypes, + DialogTypes, + SelectProjectDialogOptions, + } from 'renderer/components/dialogs/dialog-definition.model'; + /** + * + * Prompt the user for responses with dialogs + */ + export interface DialogService { + /** + * Shows a dialog to the user and prompts the user to respond + * + * @type `TReturn` - The type of data the dialog responds with + * @param dialogType The type of dialog to show the user + * @param options Various options for configuring the dialog that shows + * @returns Returns the user's response or `undefined` if the user cancels + */ + showDialog( + dialogType: DialogTabType, + options?: DialogTypes[DialogTabType]['options'], + ): Promise; + /** + * Shows a select project dialog to the user and prompts the user to select a dialog + * + * @param options Various options for configuring the dialog that shows + * @returns Returns the user's selected project id or `undefined` if the user cancels + */ + selectProject(options?: SelectProjectDialogOptions): Promise; + } + /** Prefix on requests that indicates that the request is related to dialog operations */ + export const CATEGORY_DIALOG = 'dialog'; +} +declare module 'shared/services/dialog.service' { + import { DialogService } from 'shared/services/dialog.service-model'; + const dialogService: DialogService; + export default dialogService; +} +declare module 'shared/models/create-process-privilege.model' { + import { + ChildProcess, + ChildProcessByStdio, + ForkOptions, + SpawnOptionsWithStdioTuple, + StdioPipe, + } from 'child_process'; + import { Readable, Writable } from 'stream'; + import { ExtensionBasicData } from 'shared/models/extension-basic-data.model'; + /** + * Run {@link spawn} to create a child process. The platform will automatically kill all child + * processes created this way in packaged builds. Child processes are not killed when running in + * development. + * + * This method is essentially a layer over the [`spawn` + * method](https://nodejs.org/api/child_process.html#child_processspawncommand-args-options) from + * the Node `child_process` module. Please see its documentation for more information. + * + * @example The following example assumes there are subdirectories in the extension's files for + * win32, linux, and macOS that include appropriate executables. + * + * ```@typescript + * export async function activate(context: ExecutionActivationContext) { + * const { executionToken } = context; + * const { createProcess } = context.elevatedPrivileges; + * if (!createProcess) + * throw new Error('Forgot to add "createProcess" to "elevatedPrivileges" in manifest.json'); + * switch (createProcess.osData.platform) { + * case 'win32': + * createProcess.spawn(executionToken, 'win32/RunMe.exe', [], { stdio: [null, null, null] }); + * break; + * case 'linux': + * createProcess.spawn(executionToken, 'linux/runMe', [], { stdio: [null, null, null] }); + * break; + * case 'darwin': + * createProcess.spawn(executionToken, 'macOS/runMe', [], { stdio: [null, null, null] }); + * break; + * default: + * throw new Error(`Unsupported platform: ${createProcess.osData.platform}`); + * } + * ``` + * + * @param executionToken ExecutionToken object provided when an extension was activated + * @param command Command to run to start the process + * @param args Arguments to pass to the command + * @param options Options to pass to `spawn`. The `cwd` option will be overridden to the extension's + * root directory. + * @returns A {@link ChildProcessByStdio} object representing the command + */ + export type PlatformSpawn = ( + executionToken: ExtensionBasicData, + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ) => ChildProcessByStdio; + /** + * Run {@link fork} to create a child process. The platform will automatically kill all child + * processes created this way in packaged builds. Child processes are not killed when running in + * development. + * + * This method is essentially a layer over the [`fork` + * method](https://nodejs.org/api/child_process.html#child_processforkmodulepath-args-options) from + * the Node `child_process` module. Please see its documentation for more information. + * + * @example The following example assumes there is a file named `childProcess.js` in the extension's + * `assets` subdirectory + * + * ```@typescript + * export async function activate(context: ExecutionActivationContext) { + * const { executionToken } = context; + * const { createProcess } = context.elevatedPrivileges; + * if (!createProcess) + * throw new Error('Forgot to add "createProcess" to "elevatedPrivileges" in manifest.json'); + * createProcess.fork(executionToken, 'assets/childProcess.js'); + * ``` + * + * @param executionToken ExecutionToken object provided when an extension was activated + * @param modulePath The module to run in the child + * @param args Arguments to pass when creating the node process + * @param options Options to pass to `fork`. The `cwd` option will be overridden to the extension's + * root directory. + * @returns A {@link ChildProcess} object representing the process running the module + */ + export type PlatformFork = ( + executionToken: ExtensionBasicData, + modulePath: string, + args?: readonly string[], + options?: ForkOptions, + ) => ChildProcess; + /** Data about the operating system on which this process is running */ + export type OperatingSystemData = { + /** Value of `os.platform()` in Node */ + platform: string; + /** Value of `os.type()` in Node */ + type: string; + /** Value of `os.release()` in Node */ + release: string; + }; + export type CreateProcess = { + spawn: PlatformSpawn; + fork: PlatformFork; + osData: OperatingSystemData; + }; +} +declare module 'shared/models/manage-extensions-privilege.model' { + /** Base64 encoded hash values */ + export type HashValues = Partial<{ + sha256: string; + sha512: string; + }>; + /** Represents an extension that can be enabled or disabled */ + export type ExtensionIdentifier = { + extensionName: string; + extensionVersion: string; + }; + /** + * Represents all extensions that are installed. Note that packaged extensions cannot be disabled, + * so they are implied to always be enabled. + */ + export type InstalledExtensions = { + /** + * Extensions that are explicitly bundled to be part of the application. They cannot be disabled. + * At runtime no extensions can be added or removed from the set of packaged extensions. + */ + packaged: ExtensionIdentifier[]; + /** + * Extensions that are running but can be dynamically disabled. At runtime extensions can be added + * or removed from the set of enabled extensions. + */ + enabled: ExtensionIdentifier[]; + /** + * Extensions that are not running but can be dynamically enabled. At runtime extensions can be + * added or removed from the set of disabled extensions. + * + * The only difference between a disabled extension and an extension that isn't installed is that + * disabled extensions do not need to be downloaded again to run them. + */ + disabled: ExtensionIdentifier[]; + }; + /** + * Download an extension from a given URL and enable it + * + * @param extensionUrlToDownload URL to the extension ZIP file to download + * @param fileSize Expected size of the file + * @param fileHashes Hash value(s) of the file to download. Note that only one hash value may be + * validated, but multiple hash values may be provided so the installer can choose any of them for + * validation. For example, if you provide a sha256 hash value and a sha512 hash value, the + * installer may only use the sha512 hash value for validation. + * @returns Promise that resolves when the extension has been installed + */ + export type InstallExtensionFunction = ( + extensionUrlToDownload: string, + fileSize: number, + fileHashes: HashValues, + ) => Promise; + /** + * Start running an extension that had been previously downloaded and disabled + * + * @param extensionIdentifier Details of the extension to enable + * @returns Promise that resolves when the extension has been enabled, throws if enabling fails + */ + export type EnableExtensionFunction = (extensionIdentifier: ExtensionIdentifier) => Promise; + /** + * Stop running an extension that had been previously downloaded and enabled + * + * @param extensionIdentifier Details of the extension to disable + * @returns Promise that resolves when the extension has been enabled, throws if enabling fails + */ + export type DisableExtensionFunction = ( + extensionIdentifier: ExtensionIdentifier, + ) => Promise; + /** Get extension identifiers of all extensions on the system */ + export type GetInstalledExtensionsFunction = () => Promise; + /** Functions needed to manage extensions */ + export type ManageExtensions = { + /** Function to download an extension and enable it */ + installExtension: InstallExtensionFunction; + /** Function to start running an extension that had been previously downloaded and disabled */ + enableExtension: EnableExtensionFunction; + /** Function to stop running an extension that had been previously downloaded and enabled */ + disableExtension: DisableExtensionFunction; + /** Function to retrieve details about all installed extensions */ + getInstalledExtensions: GetInstalledExtensionsFunction; + }; +} +declare module 'shared/models/elevated-privileges.model' { + import { CreateProcess } from 'shared/models/create-process-privilege.model'; + import { ManageExtensions } from 'shared/models/manage-extensions-privilege.model'; + /** String constants that are listed in an extension's manifest.json to state needed privileges */ + export enum ElevatedPrivilegeNames { + createProcess = 'createProcess', + manageExtensions = 'manageExtensions', + } + /** Object that contains properties with special capabilities for extensions that required them */ + export type ElevatedPrivileges = { + /** Functions that can be run to start new processes */ + createProcess: CreateProcess | undefined; + /** Functions that can be run to manage what extensions are running */ + manageExtensions: ManageExtensions | undefined; + }; +} +declare module 'extension-host/extension-types/extension-activation-context.model' { + import { ExecutionToken } from 'node/models/execution-token.model'; + import { UnsubscriberAsyncList } from 'platform-bible-utils'; + import { ElevatedPrivileges } from 'shared/models/elevated-privileges.model'; + /** An object of this type is passed into `activate()` for each extension during initialization */ + export type ExecutionActivationContext = { + /** Canonical name of the extension */ + name: string; + /** Used to save and load data by the storage service. */ + executionToken: ExecutionToken; + /** + * Objects that provide special capabilities required by an extension based on the + * `elevatedPrivileges` values listed in its manifest. For example, if an extension needs to be + * able to manage other extensions, then it should include `manageExtensions` in the + * `elevatedPrivileges` array in `manifest.json`. Then when the extension is activated this + * {@link ElevatedPrivileges} object will have the `manageExtensions` property set to an object + * with functions used to manage extensions. + * + * See {@link ElevatedPrivilegeNames} for the full list of elevated privileges available. + */ + elevatedPrivileges: ElevatedPrivileges; + /** Tracks all registrations made by an extension so they can be cleaned up when it is unloaded */ + registrations: UnsubscriberAsyncList; + }; +} +declare module 'renderer/hooks/papi-hooks/use-dialog-callback.hook' { + import { DialogTabTypes, DialogTypes } from 'renderer/components/dialogs/dialog-definition.model'; + export type UseDialogCallbackOptions = { + /** + * How many dialogs are allowed to be open at once from this dialog callback. Calling the callback + * when this number of maximum open dialogs has been reached does nothing. Set to -1 for + * unlimited. Defaults to 1. + */ + maximumOpenDialogs?: number; + }; + /** + * + * Enables using `papi.dialogs.showDialog` in React more easily. Returns a callback to run that will + * open a dialog with the provided `dialogType` and `options` then run the `resolveCallback` with + * the dialog response or `rejectCallback` if there is an error. By default, only one dialog can be + * open at a time. + * + * If you need to open multiple dialogs and track which dialog is which, you can set + * `options.shouldOpenMultipleDialogs` to `true` and add a counter to the `options` when calling the + * callback. Then `resolveCallback` will be resolved with that options object including your + * counter. + * + * @type `DialogTabType` The dialog type you are using. Should be inferred by parameters + * @param dialogType Dialog type you want to show on the screen + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. Calling the callback will always use the latest + * `dialogType`. + * @param options Various options for configuring the dialog that shows and this hook. If an + * `options` parameter is also provided to the returned `showDialog` callback, those + * callback-provided `options` merge over these hook-provided `options` + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. Calling the callback will always use the latest + * `options`. + * @param resolveCallback `(response, dialogType, options)` The function that will be called if the + * dialog request resolves properly + * + * - `response` - the resolved value of the dialog call. Either the user's response or `undefined` if + * the user cancels + * - `dialogType` - the value of `dialogType` at the time that this dialog was called + * - `options` the `options` provided to the dialog at the time that this dialog was called. This + * consists of the `options` provided to the returned `showDialog` callback merged over the + * `options` provided to the hook and additionally contains {@link UseDialogCallbackOptions} + * properties + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. When the dialog resolves, it will always call the + * latest `resolveCallback`. + * @param rejectCallback `(error, dialogType, options)` The function that will be called if the + * dialog request throws an error + * + * - `error` - the error thrown while calling the dialog + * - `dialogType` - the value of `dialogType` at the time that this dialog was called + * - `options` the `options` provided to the dialog at the time that this dialog was called. This + * consists of the `options` provided to the returned `showDialog` callback merged over the + * `options` provided to the hook and additionally contains {@link UseDialogCallbackOptions} + * properties + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. If the dialog throws an error, it will always call + * the latest `rejectCallback`. + * @returns `showDialog(options?)` - callback to run to show the dialog to prompt the user for a + * response + * + * - `optionsOverrides?` - `options` object you may specify that will merge over the `options` you + * provide to the hook before passing to the dialog. All properties are optional, so you may + * specify as many or as few properties here as you want to overwrite the properties in the + * `options` you provide to the hook + */ + function useDialogCallback< + DialogTabType extends DialogTabTypes, + DialogOptions extends DialogTypes[DialogTabType]['options'], + >( + dialogType: DialogTabType, + options: DialogOptions & UseDialogCallbackOptions, + resolveCallback: ( + response: DialogTypes[DialogTabType]['responseType'] | undefined, + dialogType: DialogTabType, + options: DialogOptions, + ) => void, + rejectCallback: (error: unknown, dialogType: DialogTabType, options: DialogOptions) => void, + ): (optionOverrides?: Partial) => Promise; + /** + * + * Enables using `papi.dialogs.showDialog` in React more easily. Returns a callback to run that will + * open a dialog with the provided `dialogType` and `options` then run the `resolveCallback` with + * the dialog response or `rejectCallback` if there is an error. By default, only one dialog can be + * open at a time. + * + * If you need to open multiple dialogs and track which dialog is which, you can set + * `options.shouldOpenMultipleDialogs` to `true` and add a counter to the `options` when calling the + * callback. Then `resolveCallback` will be resolved with that options object including your + * counter. + * + * @type `DialogTabType` The dialog type you are using. Should be inferred by parameters + * @param dialogType Dialog type you want to show on the screen + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. Calling the callback will always use the latest + * `dialogType`. + * @param options Various options for configuring the dialog that shows and this hook. If an + * `options` parameter is also provided to the returned `showDialog` callback, those + * callback-provided `options` merge over these hook-provided `options` + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. Calling the callback will always use the latest + * `options`. + * @param resolveCallback `(response, dialogType, options)` The function that will be called if the + * dialog request resolves properly + * + * - `response` - the resolved value of the dialog call. Either the user's response or `undefined` if + * the user cancels + * - `dialogType` - the value of `dialogType` at the time that this dialog was called + * - `options` the `options` provided to the dialog at the time that this dialog was called. This + * consists of the `options` provided to the returned `showDialog` callback merged over the + * `options` provided to the hook and additionally contains {@link UseDialogCallbackOptions} + * properties + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. When the dialog resolves, it will always call the + * latest `resolveCallback`. + * @param rejectCallback `(error, dialogType, options)` The function that will be called if the + * dialog request throws an error + * + * - `error` - the error thrown while calling the dialog + * - `dialogType` - the value of `dialogType` at the time that this dialog was called + * - `options` the `options` provided to the dialog at the time that this dialog was called. This + * consists of the `options` provided to the returned `showDialog` callback merged over the + * `options` provided to the hook and additionally contains {@link UseDialogCallbackOptions} + * properties + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because of the nature of calling dialogs, this has no adverse + * effect on the functionality of this hook. If the dialog throws an error, it will always call + * the latest `rejectCallback`. + * @returns `showDialog(options?)` - callback to run to show the dialog to prompt the user for a + * response + * + * - `optionsOverrides?` - `options` object you may specify that will merge over the `options` you + * provide to the hook before passing to the dialog. All properties are optional, so you may + * specify as many or as few properties here as you want to overwrite the properties in the + * `options` you provide to the hook + */ + function useDialogCallback< + DialogTabType extends DialogTabTypes, + DialogOptions extends DialogTypes[DialogTabType]['options'], + >( + dialogType: DialogTabType, + options: DialogOptions & UseDialogCallbackOptions, + resolveCallback: ( + response: DialogTypes[DialogTabType]['responseType'] | undefined, + dialogType: DialogTabType, + options: DialogOptions, + ) => void, + ): (optionOverrides?: Partial) => Promise; + export default useDialogCallback; +} +declare module 'shared/services/localization.service-model' { + import IDataProvider from 'shared/models/data-provider.interface'; + import { + DataProviderDataType, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { LanguageStrings, LocalizeKey, OnDidDispose } from 'platform-bible-utils'; + export type LocalizationData = LanguageStrings; + export type LocalizationSelector = { + localizeKey: LocalizeKey; + locales?: string[]; + }; + export type LocalizationSelectors = { + localizeKeys: LocalizeKey[]; + locales?: string[]; + }; + /** + * + * This name is used to register the localization data provider on the papi. You can use this name + * to find the data provider when accessing it using the useData hook + */ + export const localizationServiceProviderName = 'platform.localizationDataServiceDataProvider'; + export const localizationServiceObjectToProxy: Readonly<{ + /** + * + * This name is used to register the localization data provider on the papi. You can use this name + * to find the data provider when accessing it using the useData hook + */ + dataProviderName: 'platform.localizationDataServiceDataProvider'; + }>; + export type LocalizationDataDataTypes = { + LocalizedString: DataProviderDataType; + LocalizedStrings: DataProviderDataType; + }; + module 'papi-shared-types' { + interface DataProviders { + [localizationServiceProviderName]: ILocalizationService; + } + } + /** + * + * Service that allows to get and store localizations + */ + export type ILocalizationService = { + /** + * Look up localized string for specific localizeKey + * + * @param selector Made up of a string key that corresponds to a localized value and an array of + * BCP 47 language codes + * @returns Localized string + */ + getLocalizedString: (selector: LocalizationSelector) => Promise; + /** + * Look up localized strings for all localizeKeys provided + * + * @param selectors An array of LocalizationSelectors. A LocalizationSelector is made up of a + * string key that corresponds to a localized value and an array of BCP 47 language codes + * @returns Object whose keys are localizeKeys and values are localized strings + */ + getLocalizedStrings: (selectors: LocalizationSelectors) => Promise; + /** + * This data cannot be changed. Trying to use this setter this will always throw + * + * @returns Unsubscriber function + */ + setLocalizedString(): Promise>; + /** + * This data cannot be changed. Trying to use this setter this will always throw + * + * @returns Unsubscriber function + */ + setLocalizedStrings(): Promise>; + } & OnDidDispose & + typeof localizationServiceObjectToProxy & { + /** + * This function is used to take a book number from a verse ref and return the localized name of + * the book so that the book name can be displayed in the UI language within the UI + */ + getLocalizedIdFromBookNumber(bookNum: number, localizationLanguage: string): Promise; + } & IDataProvider; +} +declare module 'shared/data/platform.data' { + /** + * Namespace to use for features like commands, settings, etc. on the PAPI that are provided by + * Platform.Bible core + */ + export const PLATFORM_NAMESPACE = 'platform'; + /** Query string passed to the renderer when starting if it should enable noisy dev mode */ + export const DEV_MODE_RENDERER_INDICATOR = '?noisyDevMode'; +} +declare module 'shared/log-error.model' { + /** Error that force logs the error message before throwing. Useful for debugging in some situations. */ + export default class LogError extends Error { + constructor(message?: string); + } +} +declare module 'shared/services/localization.service' { + import { ILocalizationService } from 'shared/services/localization.service-model'; + const localizationService: ILocalizationService; + export default localizationService; +} +declare module 'shared/utils/settings-document-combiner-base' { + import { SettingNames, SettingTypes } from 'papi-shared-types'; + import { + DocumentCombiner, + JsonDocumentLike, + Localized, + Setting, + SettingsGroup, + } from 'platform-bible-utils'; + /** + * Information about one specific setting. Basically just {@link Setting} but with specific default + * type info + */ + type SettingInfo = Setting & { + default: SettingTypes[SettingName]; + }; + /** Information about all settings. Keys are setting keys, values are information for that setting */ + type AllSettingsInfo = { + [SettingName in SettingNames]: SettingInfo; + }; + export type SettingsContributionInfo = { + /** Map of extension name to that extension's provided settings groups if provided */ + contributions: { + [extensionName: string]: SettingsGroup[] | undefined; + }; + /** + * Map of setting name to setting definition. For type specificity and ease of accessing settings + * since they're a bit hard to find in `contributions` + */ + settings: Partial; + }; + export type LocalizedSettingsContributionInfo = Localized; + export default abstract class SettingsDocumentCombinerBase extends DocumentCombiner { + /** Name for type of setting to use in error messages */ + protected readonly settingTypeName: string; + /** Cached promise for getting the localized output */ + private localizedOutputPromise; + constructor(baseDocument: JsonDocumentLike); + /** + * This method is intended to be layered over by a child class to expose the localized setting + * info. + * + * Get the current set of settings contribution info given all the input documents with all + * localized string keys localized properly. + * + * NOTE: If the input documents might have changed since the last time the settings contributions + * were retrieved, you can call `rebuild` to incorporate those document changes before calling + * this getter. For example, if one of the input document objects changed and + * `addOrUpdateContribution` wasn't called explicitly, those document changes will not be seen in + * the current set of settings contributions. If all the input documents are static, then there is + * no need to ever rebuild once all the documents have been contributed to this combiner. + */ + protected getLocalizedOutput(): Promise; + protected validateBaseDocument(baseDocument: JsonDocumentLike): void; + protected transformBaseDocumentAfterValidation( + baseDocument: JsonDocumentLike, + ): JsonDocumentLike; + protected validateContribution(documentName: string, document: JsonDocumentLike): void; + protected transformContributionAfterValidation( + documentName: string, + document: JsonDocumentLike, + ): JsonDocumentLike; + protected validateOutput(): void; + /** Validate the base and contribution documents against the JSON schema */ + protected abstract performSchemaValidation(document: JsonDocumentLike, docType: string): void; + } +} +declare module 'shared/services/settings.service-model' { + import { SettingNames, SettingTypes } from 'papi-shared-types'; + import { OnDidDispose, UnsubscriberAsync } from 'platform-bible-utils'; + import IDataProvider from 'shared/models/data-provider.interface'; + import { + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { LocalizedSettingsContributionInfo } from 'shared/utils/settings-document-combiner-base'; + /** Name prefix for registered commands that call settings validators */ + export const CATEGORY_EXTENSION_SETTING_VALIDATOR = 'extensionSettingValidator'; + /** + * + * This name is used to register the settings service data provider on the papi. You can use this + * name to find the data provider when accessing it using the useData hook + */ + export const settingsServiceDataProviderName = 'platform.settingsServiceDataProvider'; + export const settingsServiceObjectToProxy: Readonly<{ + /** + * + * This name is used to register the settings service data provider on the papi. You can use this + * name to find the data provider when accessing it using the useData hook + */ + dataProviderName: 'platform.settingsServiceDataProvider'; + /** + * + * Registers a function that validates whether a new setting value is allowed to be set. + * + * @param key The string id of the setting to validate + * @param validator Function to call to validate the new setting value + * @returns Unsubscriber that should be called whenever the providing extension is deactivated + */ + registerValidator: ( + key: SettingName, + validator: SettingValidator, + ) => Promise; + }>; + /** + * SettingDataTypes handles getting and setting Platform.Bible core application and extension + * settings. + * + * Note: the unnamed (`''`) data type is not actually part of `SettingDataTypes` because the methods + * would not be able to create a generic type extending from `SettingNames` in order to return the + * specific setting type being requested. As such, `get`, `set`, `reset` and `subscribe` are all + * specified on {@link ISettingsService} instead. Unfortunately, as a result, using Intellisense with + * `useData` will not show the unnamed data type (`''`) as an option, but you can use `useSetting` + * instead. However, do note that the unnamed data type (`''`) is fully functional. + * + * The closest possible representation of the unnamed (````) data type follows: + * + * ```typescript + * '': DataProviderDataType; + * ``` + */ + export type SettingDataTypes = {}; + export type AllSettingsData = { + [SettingName in SettingNames]: SettingTypes[SettingName]; + }; + /** Function that validates whether a new setting value should be allowed to be set */ + export type SettingValidator = ( + newValue: SettingTypes[SettingName], + currentValue: SettingTypes[SettingName], + allChanges: Partial, + ) => Promise; + /** Validators for all settings. Keys are setting keys, values are functions to validate new settings */ + export type AllSettingsValidators = { + [SettingName in SettingNames]: SettingValidator; + }; + module 'papi-shared-types' { + interface DataProviders { + [settingsServiceDataProviderName]: ISettingsService; + } + } + /** */ + export type ISettingsService = { + /** + * Retrieves the value of the specified setting + * + * @param key The string id of the setting for which the value is being retrieved + * @returns The value of the specified setting, parsed to an object. Returns default setting if + * setting does not exist + * @throws If no default value is available for the setting. + */ + get(key: SettingName): Promise; + /** + * Validates the setting at the given key with the new value provided + * + * @param key The string id of the setting to validate + * @param newValue The value to validate + * @param currentValue The value already set to the setting + * @param allChanges + */ + validateSetting( + key: SettingName, + newValue: SettingTypes[SettingName], + currentValue: SettingTypes[SettingName], + allChanges?: Partial, + ): Promise; + /** + * Sets the value of the specified setting + * + * @param key The string id of the setting for which the value is being set + * @param newSetting The value that is to be set for the specified key + * @returns Information that papi uses to interpret whether to send out updates. Defaults to + * `true` (meaning send updates only for this data type). + * @see {@link DataProviderUpdateInstructions} for more info on what to return + */ + set( + key: SettingName, + newSetting: SettingTypes[SettingName], + ): Promise>; + /** + * Removes the setting from memory and resets it to its default value + * + * @param key The string id of the setting for which the value is being removed + * @returns `true` if successfully reset the project setting. `false` otherwise + */ + reset(key: SettingName): Promise; + /** + * Subscribes to updates of the specified setting. Whenever the value of the setting changes, the + * callback function is executed. + * + * @param key The string id of the setting for which the value is being subscribed to + * @param callback The function that will be called whenever the specified setting is updated + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber that should be called whenever the subscription should be deleted + */ + subscribe( + key: SettingName, + callback: (newSetting: SettingTypes[SettingName]) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + /** + * + * Registers a function that validates whether a new setting value is allowed to be set. + * + * @param key The string id of the setting to validate + * @param validator Function to call to validate the new setting value + * @returns Unsubscriber that should be called whenever the providing extension is deactivated + */ + registerValidator( + key: SettingName, + validator: SettingValidator, + ): Promise; + /** + * Get the current set of settings contribution info given all the input documents with all + * localized string keys localized properly. + * + * @returns Localized project settings contribution info or undefined + */ + getLocalizedSettingsContributionInfo(): Promise; + } & OnDidDispose & + IDataProvider & + typeof settingsServiceObjectToProxy; +} +declare module 'shared/utils/project-settings-document-combiner' { + import { ProjectSettingNames, ProjectSettingTypes } from 'papi-shared-types'; + import { + JsonDocumentLike, + Localized, + ProjectSetting, + ProjectSettingsGroup, + } from 'platform-bible-utils'; + import SettingsDocumentCombinerBase from 'shared/utils/settings-document-combiner-base'; + /** + * Information about one specific setting. Basically just {@link Setting} but with specific default + * type info + */ + type ProjectSettingInfo = ProjectSetting & { + default: ProjectSettingTypes[ProjectSettingName]; + }; + /** Information about all settings. Keys are setting keys, values are information for that setting */ + type AllProjectSettingsInfo = { + [ProjectSettingName in ProjectSettingNames]: ProjectSettingInfo; + }; + export type ProjectSettingsContributionInfo = { + /** Map of extension name to that extension's provided settings groups if provided */ + contributions: { + [extensionName: string]: ProjectSettingsGroup[] | undefined; + }; + /** + * Map of setting name to setting definition. For type specificity and ease of accessing settings + * since they're a bit hard to find in `contributions` + */ + settings: Partial; + }; + export type LocalizedProjectSettingsContributionInfo = Localized; + export default class ProjectSettingsDocumentCombiner extends SettingsDocumentCombinerBase { + protected readonly settingTypeName = 'Project Setting'; + /** + * Get the current set of project settings contribution info given all the input documents. + * Localized string keys have not been localized to corresponding strings. + * + * NOTE: If the input documents might have changed since the last time the project settings + * contributions were retrieved, you can call `rebuild` to incorporate those document changes + * before calling this getter. For example, if one of the input document objects changed and + * `addOrUpdateContribution` wasn't called explicitly, those document changes will not be seen in + * the current set of project settings contributions. If all the input documents are static, then + * there is no need to ever rebuild once all the documents have been contributed to this + * combiner. + */ + getProjectSettingsContributionInfo(): ProjectSettingsContributionInfo | undefined; + /** + * Get the current set of settings contribution info given all the input documents with all + * localized string keys localized properly. + * + * NOTE: If the input documents might have changed since the last time the settings contributions + * were retrieved, you can call `rebuild` to incorporate those document changes before calling + * this getter. For example, if one of the input document objects changed and + * `addOrUpdateContribution` wasn't called explicitly, those document changes will not be seen in + * the current set of settings contributions. If all the input documents are static, then there is + * no need to ever rebuild once all the documents have been contributed to this combiner. + */ + getLocalizedProjectSettingsContributionInfo(): Promise< + LocalizedProjectSettingsContributionInfo | undefined + >; + protected performSchemaValidation(document: JsonDocumentLike, docType: string): void; + } +} +declare module 'shared/services/project-settings.service-model' { + import { ProjectSettingNames, ProjectSettingTypes } from 'papi-shared-types'; + import { UnsubscriberAsync } from 'platform-bible-utils'; + import { LocalizedProjectSettingsContributionInfo } from 'shared/utils/project-settings-document-combiner'; + /** Name prefix for registered commands that call project settings validators */ + export const CATEGORY_EXTENSION_PROJECT_SETTING_VALIDATOR = 'extensionProjectSettingValidator'; + export const projectSettingsServiceNetworkObjectName = 'ProjectSettingsService'; + export const projectSettingsServiceObjectToProxy: Readonly<{ + /** + * + * Registers a function that validates whether a new project setting value is allowed to be set. + * + * @param key The string id of the setting to validate + * @param validator Function to call to validate the new setting value + * @returns Unsubscriber that should be called whenever the providing extension is deactivated + */ + registerValidator: ( + key: ProjectSettingName, + validator: ProjectSettingValidator, + ) => Promise; + }>; + /** + * + * Provides utility functions that project data providers should call when handling project settings + */ + export interface IProjectSettingsService { + /** + * Calls registered project settings validators to determine whether or not a project setting + * change is valid. + * + * Every Project Data Provider **must** run this function when it receives a request to set a + * project setting before changing the value of the setting. + * + * @param newValue The new value requested to set the project setting value to + * @param currentValue The current project setting value + * @param key The project setting key being set + * @param projectInterfaces The `projectInterface`s supported by the calling PDP for the project + * whose setting is being changed + * @param allChanges All project settings changes being set in one batch + * @returns `true` if change is valid, `false` otherwise + */ + isValid( + key: ProjectSettingName, + newValue: ProjectSettingTypes[ProjectSettingName], + currentValue: ProjectSettingTypes[ProjectSettingName], + allChanges?: SimultaneousProjectSettingsChanges, + ): Promise; + /** + * Gets default value for a project setting + * + * Every Project Data Providers **must** run this function when it receives a request to get a + * project setting if the project does not have a value for the project setting requested. It + * should return the response from this function directly, either the returned default value or + * throw. + * + * @param key The project setting key for which to get the default value + * @returns The default value for the setting if a default value is registered + * @throws If a default value is not registered for the setting + */ + getDefault( + key: ProjectSettingName, + ): Promise; + /** + * + * Registers a function that validates whether a new project setting value is allowed to be set. + * + * @param key The string id of the setting to validate + * @param validator Function to call to validate the new setting value + * @returns Unsubscriber that should be called whenever the providing extension is deactivated + */ + registerValidator( + key: ProjectSettingName, + validatorCallback: ProjectSettingValidator, + ): Promise; + /** + * Get the current set of project settings contribution info given all the input documents with + * all localized string keys localized properly. + * + * @returns Localized project settings contribution info or undefined + */ + getLocalizedContributionInfo(): Promise; + } + /** + * All project settings changes being set in one batch + * + * Project settings may be circularly dependent on one another, so multiple project settings may + * need to be changed at once in some cases + */ + export type SimultaneousProjectSettingsChanges = { + [ProjectSettingName in ProjectSettingNames]?: { + /** The new value requested to set the project setting value to */ + newValue: ProjectSettingTypes[ProjectSettingName]; + /** The current project setting value */ + currentValue: ProjectSettingTypes[ProjectSettingName]; + }; + }; + /** + * Function that validates whether a new project setting value should be allowed to be set + * + * @param newValue The new value requested to set the project setting value to + * @param currentValue The current project setting value + * @param allChanges All project settings changes being set in one batch + */ + export type ProjectSettingValidator = ( + newValue: ProjectSettingTypes[ProjectSettingName], + currentValue: ProjectSettingTypes[ProjectSettingName], + allChanges: SimultaneousProjectSettingsChanges, + ) => Promise; + /** + * Validators for all project settings. Keys are setting keys, values are functions to validate new + * settings + */ + export type AllProjectSettingsValidators = { + [ProjectSettingName in ProjectSettingNames]: ProjectSettingValidator; + }; +} +declare module '@papi/core' { + /** Exporting empty object so people don't have to put 'type' in their import statements */ + const core: {}; + export default core; + export type { ExecutionActivationContext } from 'extension-host/extension-types/extension-activation-context.model'; + export type { ExecutionToken } from 'node/models/execution-token.model'; + export type { ElevatedPrivileges } from 'shared/models/elevated-privileges.model'; + export type { ManageExtensions } from 'shared/models/manage-extensions-privilege.model'; + export type { DialogTypes } from 'renderer/components/dialogs/dialog-definition.model'; + export type { UseDialogCallbackOptions } from 'renderer/hooks/papi-hooks/use-dialog-callback.hook'; + export type { + default as IDataProvider, + IDisposableDataProvider, + } from 'shared/models/data-provider.interface'; + export type { + DataProviderUpdateInstructions, + DataProviderDataType, + DataProviderSubscriberOptions, + } from 'shared/models/data-provider.model'; + export type { WithNotifyUpdate } from 'shared/models/data-provider-engine.model'; + export type { default as IDataProviderEngine } from 'shared/models/data-provider-engine.model'; + export type { DialogOptions } from 'shared/models/dialog-options.model'; + export type { + ExtensionDataScope, + MandatoryProjectDataTypes, + } from 'shared/models/project-data-provider.model'; + export type { IProjectDataProviderEngine } from 'shared/models/project-data-provider-engine.model'; + export type { IProjectDataProviderEngineFactory } from 'shared/models/project-data-provider-engine-factory.model'; + export type { IBaseProjectDataProviderEngine } from 'shared/models/base-project-data-provider-engine.model'; + export type { + default as IProjectDataProviderFactory, + ProjectMetadataFilterOptions, + } from 'shared/models/project-data-provider-factory.interface'; + export type { + ProjectDataProviderFactoryMetadataInfo, + ProjectMetadata, + ProjectMetadataWithoutFactoryInfo, + } from 'shared/models/project-metadata.model'; + export type { + LocalizationData, + LocalizationSelector, + LocalizationSelectors, + } from 'shared/services/localization.service-model'; + export type { NetworkObjectDetails } from 'shared/models/network-object.model'; + export type { SettingValidator } from 'shared/services/settings.service-model'; + export type { ScrollGroupScrRef } from 'shared/services/scroll-group.service-model'; + export type { + GetWebViewOptions, + SavedWebViewDefinition, + UseWebViewStateHook, + UseWebViewScrollGroupScrRefHook, + WebViewContentType, + WebViewDefinition, + WebViewProps, + } from 'shared/models/web-view.model'; + export type { IWebViewProvider } from 'shared/models/web-view-provider.model'; + export type { + SimultaneousProjectSettingsChanges, + ProjectSettingValidator, + } from 'shared/services/project-settings.service-model'; +} +declare module 'shared/services/menu-data.service-model' { + import { + OnDidDispose, + UnsubscriberAsync, + MultiColumnMenu, + ReferencedItem, + WebViewMenu, + Localized, + } from 'platform-bible-utils'; + import { + DataProviderDataType, + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { IDataProvider } from '@papi/core'; + /** + * + * This name is used to register the menu data data provider on the papi. You can use this name to + * find the data provider when accessing it using the useData hook + */ + export const menuDataServiceProviderName = 'platform.menuDataServiceDataProvider'; + export const menuDataServiceObjectToProxy: Readonly<{ + /** + * + * This name is used to register the menu data data provider on the papi. You can use this name to + * find the data provider when accessing it using the useData hook + */ + dataProviderName: 'platform.menuDataServiceDataProvider'; + }>; + export type MenuDataDataTypes = { + MainMenu: DataProviderDataType, never>; + WebViewMenu: DataProviderDataType, never>; + }; + module 'papi-shared-types' { + interface DataProviders { + [menuDataServiceProviderName]: IMenuDataService; + } + } + /** + * + * Service that allows to get and store menu data + */ + export type IMenuDataService = { + /** Rebuild the menus with the latest inputs from all extensions. */ + rebuildMenus(): Promise; + /** + * + * Get menu content for the main menu + * + * @param mainMenuType Does not have to be defined + * @returns MultiColumnMenu object of main menu content + */ + getMainMenu(mainMenuType: undefined): Promise; + /** + * + * Get menu content for the main menu + * + * @param mainMenuType Does not have to be defined + * @returns MultiColumnMenu object of main menu content + */ + getMainMenu(): Promise; + /** + * This data cannot be changed. Trying to use this setter this will always throw + * + * @param mainMenuType Does not have to be defined + * @param value MultiColumnMenu object to set as the main menu + * @returns Unsubscriber function + */ + setMainMenu( + mainMenuType: undefined, + value: never, + ): Promise>; + /** + * Subscribe to run a callback function when the main menu data is changed + * + * @param mainMenuType Does not have to be defined + * @param callback Function to run with the updated menuContent for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeMainMenu( + mainMenuType: undefined, + callback: (menuContent: Localized) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + /** + * Get menu content for a web view + * + * @param webViewType The type of webview for which a menu should be retrieved + * @returns WebViewMenu object of web view menu content + */ + getWebViewMenu(webViewType: ReferencedItem): Promise; + /** + * This data cannot be changed. Trying to use this setter this will always throw + * + * @param webViewType The type of webview for which a menu should be set + * @param value Menu of specified webViewType + * @returns Unsubscriber function + */ + setWebViewMenu( + webViewType: ReferencedItem, + value: never, + ): Promise>; + /** + * Subscribe to run a callback function when the web view menu data is changed + * + * @param webViewType The type of webview for which a menu should be subscribed + * @param callback Function to run with the updated menuContent for this selector + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber function (run to unsubscribe from listening for updates) + */ + subscribeWebViewMenu( + webViewType: ReferencedItem, + callback: (menuContent: Localized) => void, + options?: DataProviderSubscriberOptions, + ): Promise; + } & OnDidDispose & + typeof menuDataServiceObjectToProxy & + IDataProvider; +} +declare module 'shared/services/menu-data.service' { + import { IMenuDataService } from 'shared/services/menu-data.service-model'; + const menuDataService: IMenuDataService; + export default menuDataService; +} +declare module 'shared/services/scroll-group.service' { + import { IScrollGroupService } from 'shared/services/scroll-group.service-model'; + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + const scrollGroupService: IScrollGroupService; + export default scrollGroupService; +} +declare module 'shared/services/settings.service' { + import { ISettingsService } from 'shared/services/settings.service-model'; + const settingsService: ISettingsService; + export default settingsService; +} +declare module 'shared/services/project-settings.service' { + import { IProjectSettingsService } from 'shared/services/project-settings.service-model'; + import { Localized } from 'platform-bible-utils'; + import { ProjectSettingsContributionInfo } from 'shared/utils/project-settings-document-combiner'; + import { ProjectDataProviderInterfaces } from 'papi-shared-types'; + /** + * Filters project settings contributions based on the provided project interfaces. + * + * This function iterates over a set of project settings contributions and filters their properties + * based on whether the project's interfaces match the specified inclusion and exclusion criteria. + * + * @param contributions - An object containing project settings contributions, which may be + * localized. + * @param projectInterfaces - An array of keys representing the project interfaces to filter the + * contributions by. + * @returns A filtered set of contributions, or `undefined` if no contributions match the project + * interfaces. + */ + export function filterProjectSettingsContributionsByProjectInterfaces( + contributions: Localized | undefined, + projectInterfaces: (keyof ProjectDataProviderInterfaces)[], + ): Localized | undefined; + const projectSettingsService: IProjectSettingsService; + export default projectSettingsService; +} +declare module '@papi/backend' { + /** + * Unified module for accessing API features in the extension host. + * + * WARNING: DO NOT IMPORT papi IN ANY FILE THAT papi IMPORTS AND EXPOSES. + */ + import * as commandService from 'shared/services/command.service'; + import { PapiNetworkService } from 'shared/services/network.service'; + import { WebViewServiceType } from 'shared/services/web-view.service-model'; + import { PapiWebViewProviderService } from 'shared/services/web-view-provider.service'; + import { InternetService } from 'shared/services/internet.service'; + import { DataProviderService } from 'shared/services/data-provider.service'; + import { DataProviderEngine as PapiDataProviderEngine } from 'shared/models/data-provider-engine.model'; + import { ProjectDataProviderEngine as PapiProjectDataProviderEngine } from 'shared/models/project-data-provider-engine.model'; + import { BaseProjectDataProviderEngine as PapiBaseProjectDataProviderEngine } from 'shared/models/base-project-data-provider-engine.model'; + import { LayeringProjectDataProviderEngineFactory as PapiLayeringProjectDataProviderEngineFactory } from 'shared/models/project-data-provider-engine-factory.model'; + import { PapiBackendProjectDataProviderService } from 'shared/services/project-data-provider.service'; + import { ExtensionStorageService } from 'extension-host/services/extension-storage.service'; + import { ProjectLookupServiceType } from 'shared/models/project-lookup.service-model'; + import { DialogService } from 'shared/services/dialog.service-model'; + import { IMenuDataService } from 'shared/services/menu-data.service-model'; + import { IScrollGroupService } from 'shared/services/scroll-group.service-model'; + import { ILocalizationService } from 'shared/services/localization.service-model'; + import { MinimalNetworkObjectService } from 'shared/services/network-object.service'; + import { NetworkObjectStatusServiceType } from 'shared/models/network-object-status.service-model'; + import { ISettingsService } from 'shared/services/settings.service-model'; + import { IProjectSettingsService } from 'shared/services/project-settings.service-model'; + const papi: { + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for data provider engine classes. If a + * data provider engine class extends this class, it doesn't have to specify its own `notifyUpdate` + * function in order to use `notifyUpdate`. + * + * @see {@link IDataProviderEngine} for more information on extending this class. + */ + DataProviderEngine: typeof PapiDataProviderEngine; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Project Data Provider Engine + * classes. If a Project Data Provider Engine class extends this class, it doesn't have to specify + * its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IProjectDataProviderEngine} for more information on extending this class. + */ + ProjectDataProviderEngine: typeof PapiProjectDataProviderEngine; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Base Project Data Provider Engine + * classes. If a Base Project Data Provider Engine class extends this class, it doesn't have to + * specify its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IBaseProjectDataProviderEngine} for more information on extending this class. + */ + BaseProjectDataProviderEngine: typeof PapiBaseProjectDataProviderEngine; + /** + * + * Abstract class with partial implementation of {@link IProjectDataProviderEngineFactory} + * specifically for Layering PDPFs. You can extend this class to make creating a Layering PDPF + * easier. + * + * Extending this class automatically fulfills the special requirements for Layering PDPfs, so we + * highly recommend extending this class. Please see + * {@link IProjectDataProviderEngineFactory.getAvailableProjects} for more information on the + * requirements. + */ + LayeringProjectDataProviderEngineFactory: typeof PapiLayeringProjectDataProviderEngineFactory; + /** This is just an alias for internet.fetch */ + fetch: typeof globalThis.fetch; + /** + * + * The command service allows you to exchange messages with other components in the platform. You + * can register a command that other services and extensions can send you. You can send commands to + * other services and extensions that have registered commands. + */ + commands: typeof commandService; + /** + * + * Service exposing various functions related to using webViews + * + * WebViews are iframes in the Platform.Bible UI into which extensions load frontend code, either + * HTML or React components. + */ + webViews: WebViewServiceType; + /** + * + * Interface for registering webView providers + */ + webViewProviders: PapiWebViewProviderService; + /** + * + * Prompt the user for responses with dialogs + */ + dialogs: DialogService; + /** + * + * Service that provides a way to send and receive network events + */ + network: PapiNetworkService; + /** + * + * Network objects are distributed objects within PAPI for TS/JS objects. @see + * https://en.wikipedia.org/wiki/Distributed_object + * + * Objects registered via {@link networkObjectService.set} are retrievable using + * {@link networkObjectService.get}. + * + * Function calls made on network objects retrieved via {@link networkObjectService.get} are proxied + * and sent to the original objects registered via {@link networkObjectService.set}. All functions on + * the registered object are proxied except for constructors, `dispose`, and functions starting with + * `on` since those should be events (which are not intended to be proxied) based on our naming + * convention. If you don't want a function to be proxied, don't make it a property of the + * registered object. + * + * Functions on a network object will be called asynchronously by other processes regardless of + * whether the functions are synchronous or asynchronous, so it is best to make them all + * asynchronous. All shared functions' arguments and return values must be serializable to be called + * across processes. + * + * When a service registers an object via {@link networkObjectService.set}, it is the responsibility + * of that service, and only that service, to call `dispose` on that object when it is no longer + * intended to be shared with other services. + * + * When an object is disposed by calling `dispose`, all functions registered with the `onDidDispose` + * event handler will be called. After an object is disposed, calls to its functions will no longer + * be proxied to the original object. + */ + networkObjects: MinimalNetworkObjectService; + /** + * + * Provides functions related to the set of available network objects + */ + networkObjectStatus: NetworkObjectStatusServiceType; + /** + * + * All extensions and services should use this logger to provide a unified output of logs + */ + logger: import('electron-log').MainLogger & { + default: import('electron-log').MainLogger; + }; + /** + * + * Service that provides a way to call `fetch` since the original function is not available + */ + internet: InternetService; + /** + * + * Service that allows extensions to send and receive data to/from other extensions + */ + dataProviders: DataProviderService; + /** + * + * Service that registers and gets project data providers + */ + projectDataProviders: PapiBackendProjectDataProviderService; + /** + * + * Provides metadata for projects known by the platform + * + * Note: this service runs locally everywhere in the TypeScript processes. It is also exposed on the + * PAPI websocket. Note these functions are all asynchronous on the PAPI websocket regardless of if + * their types are synchronous locally. + */ + projectLookup: ProjectLookupServiceType; + /** + * + * Provides utility functions that project data providers should call when handling project settings + */ + projectSettings: IProjectSettingsService; + /** + * + * This service provides extensions in the extension host the ability to read/write data based on + * the extension identity and current user (as identified by the OS). This service will not work + * within the renderer. + */ + storage: ExtensionStorageService; + /** */ + settings: ISettingsService; + /** + * + * Service that allows to get and store menu data + */ + menuData: IMenuDataService; + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + scrollGroups: IScrollGroupService; + /** + * + * Service that allows to get and store localizations + */ + localization: ILocalizationService; + }; + export default papi; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for data provider engine classes. If a + * data provider engine class extends this class, it doesn't have to specify its own `notifyUpdate` + * function in order to use `notifyUpdate`. + * + * @see {@link IDataProviderEngine} for more information on extending this class. + */ + export const DataProviderEngine: typeof PapiDataProviderEngine; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Project Data Provider Engine + * classes. If a Project Data Provider Engine class extends this class, it doesn't have to specify + * its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IProjectDataProviderEngine} for more information on extending this class. + */ + export const ProjectDataProviderEngine: typeof PapiProjectDataProviderEngine; + /** + * + * Abstract class that provides a placeholder `notifyUpdate` for Base Project Data Provider Engine + * classes. If a Base Project Data Provider Engine class extends this class, it doesn't have to + * specify its own `notifyUpdate` function in order to use `notifyUpdate`. + * + * Additionally, extending this class informs Intellisense that you can run `notifyUpdate` with the + * `Setting` data type if needed like so: + * + * ```typescript + * this.notifyUpdate('Setting'); + * ``` + * + * @see {@link IBaseProjectDataProviderEngine} for more information on extending this class. + */ + export const BaseProjectDataProviderEngine: typeof PapiBaseProjectDataProviderEngine; + /** + * + * Abstract class with partial implementation of {@link IProjectDataProviderEngineFactory} + * specifically for Layering PDPFs. You can extend this class to make creating a Layering PDPF + * easier. + * + * Extending this class automatically fulfills the special requirements for Layering PDPfs, so we + * highly recommend extending this class. Please see + * {@link IProjectDataProviderEngineFactory.getAvailableProjects} for more information on the + * requirements. + */ + export const LayeringProjectDataProviderEngineFactory: typeof PapiLayeringProjectDataProviderEngineFactory; + /** This is just an alias for internet.fetch */ + export const fetch: typeof globalThis.fetch; + /** + * + * The command service allows you to exchange messages with other components in the platform. You + * can register a command that other services and extensions can send you. You can send commands to + * other services and extensions that have registered commands. + */ + export const commands: typeof commandService; + /** + * + * Service exposing various functions related to using webViews + * + * WebViews are iframes in the Platform.Bible UI into which extensions load frontend code, either + * HTML or React components. + */ + export const webViews: WebViewServiceType; + /** + * + * Interface for registering webView providers + */ + export const webViewProviders: PapiWebViewProviderService; + /** + * + * Prompt the user for responses with dialogs + */ + export const dialogs: DialogService; + /** + * + * Service that provides a way to send and receive network events + */ + export const network: PapiNetworkService; + /** + * + * Network objects are distributed objects within PAPI for TS/JS objects. @see + * https://en.wikipedia.org/wiki/Distributed_object + * + * Objects registered via {@link networkObjectService.set} are retrievable using + * {@link networkObjectService.get}. + * + * Function calls made on network objects retrieved via {@link networkObjectService.get} are proxied + * and sent to the original objects registered via {@link networkObjectService.set}. All functions on + * the registered object are proxied except for constructors, `dispose`, and functions starting with + * `on` since those should be events (which are not intended to be proxied) based on our naming + * convention. If you don't want a function to be proxied, don't make it a property of the + * registered object. + * + * Functions on a network object will be called asynchronously by other processes regardless of + * whether the functions are synchronous or asynchronous, so it is best to make them all + * asynchronous. All shared functions' arguments and return values must be serializable to be called + * across processes. + * + * When a service registers an object via {@link networkObjectService.set}, it is the responsibility + * of that service, and only that service, to call `dispose` on that object when it is no longer + * intended to be shared with other services. + * + * When an object is disposed by calling `dispose`, all functions registered with the `onDidDispose` + * event handler will be called. After an object is disposed, calls to its functions will no longer + * be proxied to the original object. + */ + export const networkObjects: MinimalNetworkObjectService; + /** + * + * Provides functions related to the set of available network objects + */ + export const networkObjectStatus: NetworkObjectStatusServiceType; + /** + * + * All extensions and services should use this logger to provide a unified output of logs + */ + export const logger: import('electron-log').MainLogger & { + default: import('electron-log').MainLogger; + }; + /** + * + * Service that provides a way to call `fetch` since the original function is not available + */ + export const internet: InternetService; + /** + * + * Service that allows extensions to send and receive data to/from other extensions + */ + export const dataProviders: DataProviderService; + /** + * + * Service that registers and gets project data providers + */ + export const projectDataProviders: PapiBackendProjectDataProviderService; + /** + * + * Provides metadata for projects known by the platform + * + * Note: this service runs locally everywhere in the TypeScript processes. It is also exposed on the + * PAPI websocket. Note these functions are all asynchronous on the PAPI websocket regardless of if + * their types are synchronous locally. + */ + export const projectLookup: ProjectLookupServiceType; + /** + * + * Provides utility functions that project data providers should call when handling project settings + */ + export const projectSettings: IProjectSettingsService; + /** + * + * This service provides extensions in the extension host the ability to read/write data based on + * the extension identity and current user (as identified by the OS). This service will not work + * within the renderer. + */ + export const storage: ExtensionStorageService; + /** */ + export const settings: ISettingsService; + /** + * + * Service that allows to get and store menu data + */ + export const menuData: IMenuDataService; + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + export const scrollGroups: IScrollGroupService; + /** + * + * Service that allows to get and store localizations + */ + export const localization: ILocalizationService; +} +declare module 'extension-host/extension-types/extension.interface' { + import { UnsubscriberAsync } from 'platform-bible-utils'; + import { ExecutionActivationContext } from 'extension-host/extension-types/extension-activation-context.model'; + /** Interface for all extensions to implement */ + export interface IExtension { + /** + * Sets up this extension! Runs when paranext wants this extension to activate. For example, + * activate() should register commands for this extension + * + * @param context Data and utilities that are specific to this particular extension + */ + activate: (context: ExecutionActivationContext) => Promise; + /** + * Deactivate anything in this extension that is not covered by the registrations in the context + * object given to activate(). + * + * @returns Promise that resolves to true if successfully deactivated + */ + deactivate?: UnsubscriberAsync; + } +} +declare module 'extension-host/extension-types/extension-manifest.model' { + import { ElevatedPrivilegeNames } from 'shared/models/elevated-privileges.model'; + /** Information about an extension provided by the extension developer. */ + export type ExtensionManifest = { + /** Name of the extension */ + name: string; + /** + * Extension version - expected to be [semver](https://semver.org/) like `"0.1.3"`. + * + * Note: semver may become a hard requirement in the future, so we recommend using it now. + */ + version: string; + /** + * Path to the JavaScript file to run in the extension host. Relative to the extension's root + * folder. + * + * Must be specified. Can be an empty string if the extension does not have any JavaScript to run. + */ + main: string; + /** List of special permissions required by the extension to work as intended */ + elevatedPrivileges: `${ElevatedPrivilegeNames}`[]; + /** + * Path to the TypeScript type declaration file that describes this extension and its interactions + * on the PAPI. Relative to the extension's root folder. + * + * If not provided, Platform.Bible will look in the following locations: + * + * 1. `.d.ts` + * 2. `.d.ts` + * 3. `index.d.ts` + * + * See [Extension Anatomy - Type Declaration + * Files](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#type-declaration-files-dts) + * for more information about extension type declaration files. + */ + types?: string; + /** Path to the JSON file that defines the menu items this extension is adding. */ + menus?: string; + /** Path to the JSON file that defines the settings this extension is adding. */ + settings?: string; + /** Path to the JSON file that defines the project settings this extension is adding. */ + projectSettings?: string; + /** Path to the JSON file that defines the localized strings this extension is adding. */ + localizedStrings?: string; + /** + * List of events that occur that should cause this extension to be activated. Not yet + * implemented. + */ + activationEvents: string[]; + }; +} +declare module 'renderer/hooks/hook-generators/create-use-network-object-hook.util' { + import { NetworkObject } from 'shared/models/network-object.model'; + /** + * This function takes in a getNetworkObject function and creates a hook with that function in it + * which will return a network object + * + * @param getNetworkObject A function that takes in an id string and returns a network object + * @param mapParametersToNetworkObjectSource Function that takes the parameters passed into the hook + * and returns the `networkObjectSource` associated with those parameters. Defaults to taking the + * first parameter passed into the hook and using that as the `networkObjectSource`. + * + * - Note: `networkObjectSource` is string name of the network object to get OR `networkObject` + * (result of this hook, if you want this hook to just return the network object again) + * + * @returns A function that takes in a networkObjectSource and returns a NetworkObject + */ + function createUseNetworkObjectHook( + getNetworkObject: (...args: THookParams) => Promise | undefined>, + mapParametersToNetworkObjectSource?: ( + ...args: THookParams + ) => string | NetworkObject | undefined, + ): (...args: THookParams) => NetworkObject | undefined; + export default createUseNetworkObjectHook; +} +declare module 'renderer/hooks/papi-hooks/use-data-provider.hook' { + import { DataProviders } from 'papi-shared-types'; + /** + * Gets a data provider with specified provider name + * + * @type `T` - The type of data provider to return. Use `IDataProvider`, + * specifying your own types, or provide a custom data provider type + * @param dataProviderSource String name of the data provider to get OR dataProvider (result of + * useDataProvider, if you want this hook to just return the data provider again) + * @returns Undefined if the data provider has not been retrieved, data provider if it has been + * retrieved and is not disposed, and undefined again if the data provider is disposed + */ + const useDataProvider: ( + dataProviderSource: DataProviderName | DataProviders[DataProviderName] | undefined, + ) => DataProviders[DataProviderName] | undefined; + export default useDataProvider; +} +declare module 'renderer/hooks/hook-generators/create-use-data-hook.util' { + import { + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import IDataProvider from 'shared/models/data-provider.interface'; + import ExtractDataProviderDataTypes from 'shared/models/extract-data-provider-data-types.model'; + /** + * The final function called as part of the `useData` hook that is the actual React hook + * + * This is the `.Greeting(...)` part of `useData('helloSomeone.people').Greeting(...)` + */ + type UseDataFunctionWithProviderType< + TDataProvider extends IDataProvider, + TDataType extends keyof ExtractDataProviderDataTypes, + > = ( + selector: ExtractDataProviderDataTypes[TDataType]['selector'], + defaultValue: ExtractDataProviderDataTypes[TDataType]['getData'], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [ + ExtractDataProviderDataTypes[TDataType]['getData'], + ( + | (( + newData: ExtractDataProviderDataTypes[TDataType]['setData'], + ) => Promise>>) + | undefined + ), + boolean, + ]; + /** + * A proxy that serves the actual hooks for a single data provider + * + * This is the `useData('helloSomeone.people')` part of + * `useData('helloSomeone.people').Greeting(...)` + */ + type UseDataProxy> = { + [TDataType in keyof ExtractDataProviderDataTypes]: UseDataFunctionWithProviderType< + TDataProvider, + TDataType + >; + }; + /** + * React hook to use data provider data with various data types + * + * @example `useData('helloSomeone.people').Greeting('Bill', 'Greeting loading')` + * + * @type `TDataProvider` - The type of data provider to get. Use + * `IDataProvider`, specifying your own types, or provide a custom data + * provider type + */ + type UseDataHookGeneric = { + >( + ...args: TUseDataProviderParams + ): UseDataProxy; + }; + /** + * Create a `useData(...).DataType(selector, defaultValue, options)` hook for a specific subset of + * data providers as supported by `useDataProviderHook` + * + * @param useDataProviderHook Hook that gets a data provider from a specific subset of data + * providers + * @returns `useData` hook for getting data from a data provider + */ + function createUseDataHook( + useDataProviderHook: (...args: TUseDataProviderParams) => IDataProvider | undefined, + ): UseDataHookGeneric; + export default createUseDataHook; +} +declare module 'renderer/hooks/papi-hooks/use-data.hook' { + import { + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { DataProviderNames, DataProviderTypes, DataProviders } from 'papi-shared-types'; + /** + * React hook to use data from a data provider + * + * @example `useData('helloSomeone.people').Greeting('Bill', 'Greeting loading')` + */ + type UseDataHook = { + ( + dataProviderSource: DataProviderName | DataProviders[DataProviderName] | undefined, + ): { + [TDataType in keyof DataProviderTypes[DataProviderName]]: ( + // @ts-ignore TypeScript pretends it can't find `selector`, but it works just fine + selector: DataProviderTypes[DataProviderName][TDataType]['selector'], + // @ts-ignore TypeScript pretends it can't find `getData`, but it works just fine + defaultValue: DataProviderTypes[DataProviderName][TDataType]['getData'], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [ + // @ts-ignore TypeScript pretends it can't find `getData`, but it works just fine + DataProviderTypes[DataProviderName][TDataType]['getData'], + ( + | (( + // @ts-ignore TypeScript pretends it can't find `setData`, but it works just fine + newData: DataProviderTypes[DataProviderName][TDataType]['setData'], + ) => Promise>) + | undefined + ), + boolean, + ]; + }; + }; + /** + * ```typescript + * useData( + * dataProviderSource: DataProviderName | DataProviders[DataProviderName] | undefined, + * ).DataType( + * selector: DataProviderTypes[DataProviderName][DataType]['selector'], + * defaultValue: DataProviderTypes[DataProviderName][DataType]['getData'], + * subscriberOptions?: DataProviderSubscriberOptions, + * ) => [ + * DataProviderTypes[DataProviderName][DataType]['getData'], + * ( + * | (( + * newData: DataProviderTypes[DataProviderName][DataType]['setData'], + * ) => Promise>) + * | undefined + * ), + * boolean, + * ] + * ``` + * + * React hook to use data from a data provider. Subscribes to run a callback on a data provider's + * data with specified selector on the specified data type that data provider serves. + * + * Usage: Specify the data provider and the data type on the data provider with + * `useData('').` and use like any other React hook. + * + * _@example_ Subscribing to Verse data at JHN 11:35 on the `'quickVerse.quickVerse'` data provider: + * + * ```typescript + * const [verseText, setVerseText, verseTextIsLoading] = useData('quickVerse.quickVerse').Verse( + * 'JHN 11:35', + * 'Verse text goes here', + * ); + * ``` + * + * _@param_ `dataProviderSource` string name of data provider to get OR dataProvider (result of + * useDataProvider if you want to consolidate and only get the data provider once) + * + * _@param_ `selector` tells the provider what data this listener is listening for + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * + * _@param_ `defaultValue` the initial value to return while first awaiting the data + * + * _@param_ `subscriberOptions` various options to adjust how the subscriber emits updates + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that `subscriberOptions` will be passed to the data + * provider's `subscribe` method as soon as possible and will not be updated again until + * `dataProviderSource` or `selector` changes. + * + * _@returns_ `[data, setData, isLoading]` + * + * - `data`: the current value for the data from the data provider with the specified data type and + * selector, either the `defaultValue` or the resolved data + * - `setData`: asynchronous function to request that the data provider update the data at this data + * type and selector. Returns `true` if successful. Note that this function does not update the + * data. The data provider sends out an update to this subscription if it successfully updates + * data. + * - `isLoading`: whether the data with the data type and selector is awaiting retrieval from the data + * provider + */ + const useData: UseDataHook; + export default useData; +} +declare module 'renderer/services/scroll-group.service-host' { + import { ScrollGroupUpdateInfo } from 'shared/services/scroll-group.service-model'; + import { ScriptureReference, ScrollGroupId } from 'platform-bible-utils'; + /** + * All Scroll Group IDs that are intended to be shown in scroll group selectors. This is a + * placeholder and will be refactored significantly in + * https://github.com/paranext/paranext-core/issues/788 + */ + export const availableScrollGroupIds: (number | undefined)[]; + /** Event that emits with information about a changed Scripture Reference for a scroll group */ + export const onDidUpdateScrRef: import('platform-bible-utils').PlatformEvent; + /** See {@link IScrollGroupRemoteService.getScrRef} */ + export function getScrRefSync(scrollGroupId?: ScrollGroupId): ScriptureReference; + /** + * See {@link IScrollGroupRemoteService.setScrRef} + * + * @param shouldSetVerseRefSetting If `true`: if scroll group 0's reference changes, update the + * `platform.verseRef` setting to keep it in sync for backwards compatibility. Defaults to `true`. + * Only set to `false` when running this from subscription to updates to the setting + */ + export function setScrRefSync( + scrollGroupId: ScrollGroupId | undefined, + scrRef: ScriptureReference, + shouldSetVerseRefSetting?: boolean, + ): boolean; + /** Register the network object that backs the scroll group service */ + export function startScrollGroupService(): Promise; +} +declare module 'renderer/hooks/papi-hooks/use-scroll-group-scr-ref.hook' { + import { ScrollGroupScrRef } from 'shared/services/scroll-group.service-model'; + import { ScriptureReference, ScrollGroupId } from 'platform-bible-utils'; + /** + * React hook for working with a {@link ScrollGroupScrRef}. Returns a value and a function to set the + * value for both the {@link ScriptureReference} and the {@link ScrollGroupId} for the provided + * `scrollGroupScrRef`. Use similarly to `useState`. + * + * @param scrollGroupScrRef {@link ScrollGroupScrRef} representing a scroll group and/or Scripture + * reference. Defaults to 0 meaning synced with scroll group 0 (A in English) + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * @param setScrollGroupScrRef Function to run to set `scrollGroupScrRef`. Should return `true` if + * actually updated any properties; `false` otherwise + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that updating this parameter will not cause a new + * callback to be returned. However, because this is just used when needed and doesn't have any + * reason to render changes, this has no adverse effect on the functionality of this hook. It will + * always set using the latest value of this callback + * @returns `[scrRef, setScrRef, scrollGroupId, setScrollGroupId]` + * + * - `scrRef`: The current value for the Scripture reference this `scrollGroupScrRef` represents + * - `setScrRef`: Function to use to update the Scripture reference this `scrollGroupScrRef` + * represents. If it is synced to a scroll group, sets the scroll group's Scripture reference + * - `scrollGroupId`: The current value for the scroll group this `scrollGroupScrRef` is synced with. + * If not synced to a scroll group, this is `undefined` + * - `setScrollGroupId`: Function to use to update the scroll group with which this + * `scrollGroupScrRef` is synced + */ + export default function useScrollGroupScrRef( + scrollGroupScrRef: ScrollGroupScrRef | undefined, + setScrollGroupScrRef: (scrollGroupScrRef: ScrollGroupScrRef) => boolean, + ): [ + scrRef: ScriptureReference, + setScrRef: (newScrRef: ScriptureReference) => void, + scrollGroupId: ScrollGroupId | undefined, + setScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void, + ]; +} +declare module 'renderer/hooks/papi-hooks/use-setting.hook' { + import { SettingTypes } from 'papi-shared-types'; + import { + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { SettingDataTypes } from 'shared/services/settings.service-model'; + /** + * Gets, sets and resets a setting on the papi. Also notifies subscribers when the setting changes + * and gets updated when the setting is changed by others. + * + * @param key The string id that is used to identify the setting that will be stored on the papi + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * @param defaultState The initial value to return while first awaiting the setting value + * @param subscriberOptions Various options to adjust how the subscriber emits updates + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that `subscriberOptions` will be passed to the data + * provider's `subscribe` method as soon as possible and will not be updated again + * until `dataProviderSource` or `selector` changes. + * @returns `[setting, setSetting, resetSetting]` + * + * - `setting`: The current state of the setting, either `defaultState` or the stored state on the + * papi, if any + * - `setSetting`: Function that updates the setting to a new value + * - `resetSetting`: Function that removes the setting and resets the value to `defaultState` + * + * @throws When subscription callback function is called with an update that has an unexpected + * message type + */ + const useSetting: ( + key: SettingName, + defaultState: SettingTypes[SettingName], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [ + setting: SettingTypes[SettingName], + setSetting: ( + newData: SettingTypes[SettingName], + ) => Promise>, + resetSetting: () => void, + isLoading: boolean, + ]; + export default useSetting; +} +declare module 'renderer/hooks/papi-hooks/use-project-data-provider.hook' { + import { ProjectDataProviderInterfaces } from 'papi-shared-types'; + /** + * Gets a project data provider with specified provider name + * + * @param projectInterface `projectInterface` that the project to load must support. The TypeScript + * type for the returned project data provider will have the project data provider interface type + * associated with this `projectInterface`. If the project does not implement this + * `projectInterface` (according to its metadata), an error will be thrown. + * @param projectDataProviderSource String name of the id of the project to get OR + * projectDataProvider (result of useProjectDataProvider, if you want this hook to just return the + * data provider again) + * @param pdpFactoryId Optional ID of the PDP factory from which to get the project data provider if + * the PDP factory supports this project id and project interface. If not provided, then look in + * all available PDP factories for the given project ID. + * @returns `undefined` if the Project Data Provider has not been retrieved, the requested Project + * Data Provider if it has been retrieved and is not disposed, and undefined again if the Project + * Data Provider is disposed + */ + const useProjectDataProvider: ( + projectInterface: ProjectInterface, + projectDataProviderSource: string | ProjectDataProviderInterfaces[ProjectInterface] | undefined, + pdpFactoryId?: string, + ) => ProjectDataProviderInterfaces[ProjectInterface] | undefined; + export default useProjectDataProvider; +} +declare module 'renderer/hooks/papi-hooks/use-project-data.hook' { + import { + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from 'shared/models/data-provider.model'; + import { + ProjectDataProviderInterfaces, + ProjectInterfaceDataTypes, + ProjectInterfaces, + } from 'papi-shared-types'; + /** + * React hook to use data from a Project Data Provider + * + * @example `useProjectData('platformScripture.USFM_Verse', 'project id').VerseUSFM(...);` + */ + type UseProjectDataHook = { + ( + projectInterface: ProjectInterface, + projectDataProviderSource: + | string + | ProjectDataProviderInterfaces[ProjectInterface] + | undefined, + ): { + [TDataType in keyof ProjectInterfaceDataTypes[ProjectInterface]]: ( + // @ts-ignore TypeScript pretends it can't find `selector`, but it works just fine + selector: ProjectInterfaceDataTypes[ProjectInterface][TDataType]['selector'], + // @ts-ignore TypeScript pretends it can't find `getData`, but it works just fine + defaultValue: ProjectInterfaceDataTypes[ProjectInterface][TDataType]['getData'], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [ + // @ts-ignore TypeScript pretends it can't find `getData`, but it works just fine + ProjectInterfaceDataTypes[ProjectInterface][TDataType]['getData'], + ( + | (( + // @ts-ignore TypeScript pretends it can't find `setData`, but it works just fine + newData: ProjectInterfaceDataTypes[ProjectInterface][TDataType]['setData'], + ) => Promise< + DataProviderUpdateInstructions + >) + | undefined + ), + boolean, + ]; + }; + }; + /** + * ```typescript + * useProjectData( + * projectInterface: ProjectInterface, + * projectDataProviderSource: string | ProjectDataProviderInterfaces[ProjectInterface] | undefined, + * ).DataType( + * selector: ProjectInterfaceDataTypes[ProjectInterface][DataType]['selector'], + * defaultValue: ProjectInterfaceDataTypes[ProjectInterface][DataType]['getData'], + * subscriberOptions?: DataProviderSubscriberOptions, + * ) => [ + * ProjectInterfaceDataTypes[ProjectInterface][DataType]['getData'], + * ( + * | (( + * newData: ProjectInterfaceDataTypes[ProjectInterface][DataType]['setData'], + * ) => Promise>) + * | undefined + * ), + * boolean, + * ] + * ``` + * + * React hook to use data from a Project Data Provider. Subscribes to run a callback on a Project + * Data Provider's data with specified selector on the specified data type that the Project Data + * Provider serves according to its supported `projectInterface`s. + * + * Usage: Specify the `projectInterface`, the project id, and the data type on the Project Data + * Provider with `useProjectData('', '').` and use like any + * other React hook. + * + * _@example_ Subscribing to Verse USFM info at JHN 11:35 on a `platformScripture.USFM_Verse` + * project with projectId `32664dc3288a28df2e2bb75ded887fc8f17a15fb`: + * + * ```typescript + * const [verse, setVerse, verseIsLoading] = useProjectData( + * 'platformScripture.USFM_Verse', + * '32664dc3288a28df2e2bb75ded887fc8f17a15fb', + * ).VerseUSFM( + * useMemo(() => new VerseRef('JHN', '11', '35', ScrVers.English), []), + * 'Loading verse ', + * ); + * ``` + * + * _@param_ `projectInterface` `projectInterface` that the project to load must support. The + * TypeScript type for the returned project data provider will have the project data provider + * interface type associated with this `projectInterface`. If the project does not implement this + * `projectInterface` (according to its metadata), an error will be thrown. + * + * _@param_ `projectDataProviderSource` String name of the id of the project to get OR + * projectDataProvider (result of useProjectDataProvider if you want to consolidate and only get the + * Project Data Provider once) + * + * _@param_ `selector` tells the provider what data this listener is listening for + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * + * _@param_ `defaultValue` the initial value to return while first awaiting the data + * + * _@param_ `subscriberOptions` various options to adjust how the subscriber emits updates + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that `subscriberOptions` will be passed to the Project + * Data Provider's `subscribe` method as soon as possible and will not be updated again + * until `projectDataProviderSource` or `selector` changes. + * + * _@returns_ `[data, setData, isLoading]` + * + * - `data`: the current value for the data from the Project Data Provider with the specified data + * type and selector, either the `defaultValue` or the resolved data + * - `setData`: asynchronous function to request that the Project Data Provider update the data at + * this data type and selector. Returns `true` if successful. Note that this function does not + * update the data. The Project Data Provider sends out an update to this subscription if it + * successfully updates data. + * - `isLoading`: whether the data with the data type and selector is awaiting retrieval from the data + * provider + */ + const useProjectData: UseProjectDataHook; + export default useProjectData; +} +declare module 'renderer/hooks/papi-hooks/use-project-setting.hook' { + import { IBaseProjectDataProvider, ProjectSettingTypes } from 'papi-shared-types'; + import { DataProviderSubscriberOptions } from 'shared/models/data-provider.model'; + /** + * Gets, sets and resets a project setting on the papi for a specified project. Also notifies + * subscribers when the project setting changes and gets updated when the project setting is changed + * by others. + * + * @param projectDataProviderSource `projectDataProviderSource` String name of the id of the project + * to get OR projectDataProvider (result of `useProjectDataProvider` if you want to consolidate + * and only get the Project Data Provider once). If you provide a project id, this hook will use a + * PDP for this project that supports the `platform.base` `projectInterface`. + * + * Note: If you provide a projectDataProvider directly, it must be an + * {@link IBaseProjectDataProvider} + * @param key The string id of the project setting to interact with + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * @param defaultValue The initial value to return while first awaiting the project setting value + * @param subscriberOptions Various options to adjust how the subscriber emits updates + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that `subscriberOptions` will be passed to the data + * provider's `subscribe` method as soon as possible and will not be updated again + * until `dataProviderSource` or `selector` changes. + * @returns `[setting, setSetting, resetSetting]` + * + * - `setting`: the current value for the project setting from the Project Data Provider with the + * specified key, either the `defaultValue` or the resolved setting value + * - `setSetting`: asynchronous function to request that the Project Data Provider update the project + * setting with the specified key. Returns `true` if successful. Note that this function does + * not update the data. The Project Data Provider sends out an update to this subscription if + * it successfully updates data. + * - `resetSetting`: asynchronous function to request that the Project Data Provider reset the project + * setting + * - `isLoading`: whether the setting value is awaiting retrieval from the Project Data Provider + * + * @throws When subscription callback function is called with an update that has an unexpected + * message type + */ + const useProjectSetting: ( + projectDataProviderSource: string | IBaseProjectDataProvider | undefined, + key: ProjectSettingName, + defaultValue: ProjectSettingTypes[ProjectSettingName], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [ + setting: ProjectSettingTypes[ProjectSettingName], + setSetting: ((newSetting: ProjectSettingTypes[ProjectSettingName]) => void) | undefined, + resetSetting: (() => void) | undefined, + isLoading: boolean, + ]; + export default useProjectSetting; +} +declare module 'renderer/hooks/papi-hooks/use-data-provider-multi.hook' { + import { DataProviderNames, DataProviders } from 'papi-shared-types'; + /** + * Gets an array of data providers based on an array of input sources + * + * @type `T` - The types of data providers to return. Use `IDataProvider`, + * specifying your own types, or provide a custom data provider type for each item in the array. + * Note that if you provide more than one data type, each item in the returned array will be + * considered to be any of those types. For example, if you call `useDataProviderMulti`, all items in the returned array will be considered to be of type `Type1 | Type2 | + * undefined`. Although you can determine the actual type based on the array index, TypeScript + * will not know, so you will need to type assert the array items for later type checking to + * work. + * @param dataProviderSources Array containing string names of the data providers to get OR data + * providers themselves (i.e., the results of useDataProvider/useDataProviderMulti) if you want + * this hook to return the data providers again. It is fine to have a mix of strings and data + * providers in the array. + * + * WARNING: THE ARRAY MUST BE STABLE - const or wrapped in useState, useMemo, etc. It must not be + * updated every render. + * @returns An array of data providers that correspond by index to the values in + * `dataProviderSources`. Each item in the array will be (a) undefined if the data provider has + * not been retrieved or has been disposed, or (b) a data provider if it has been retrieved and is + * not disposed. + */ + function useDataProviderMulti( + dataProviderSources: ( + | EachDataProviderName[number] + | DataProviders[EachDataProviderName[number]] + | undefined + )[], + ): (DataProviders[EachDataProviderName[number]] | undefined)[]; + export default useDataProviderMulti; +} +declare module 'renderer/hooks/papi-hooks/use-localized-strings-hook' { + import { LocalizationData } from 'shared/services/localization.service-model'; + import { DataProviderSubscriberOptions } from 'shared/models/data-provider.model'; + import { LocalizeKey } from 'platform-bible-utils'; + /** + * Gets localizations on the papi. + * + * @param localizationKeys Array of keys to get localizations of + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * @param localizationLocales Array of localization languages to look up the keys in + * + * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be + * updated every render + * @param subscriberOptions Various options to adjust how the subscriber emits updates + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that `subscriberOptions` will be passed to the data + * provider's `subscribe` method as soon as possible and will not be updated again + * until `dataProviderSource` or `selector` changes. + * @returns `[localizedStrings]` + * + * - `localizedStrings`: The current state of the localizations, either `defaultState` or the stored + * state on the papi, if any + */ + const useLocalizedStrings: ( + localizationKeys: LocalizeKey[], + localizationLocales?: string[], + subscriberOptions?: DataProviderSubscriberOptions, + ) => [localizedStrings: LocalizationData, isLoading: boolean]; + export default useLocalizedStrings; +} +declare module 'renderer/hooks/papi-hooks/index' { + export { default as useDataProvider } from 'renderer/hooks/papi-hooks/use-data-provider.hook'; + export { default as useData } from 'renderer/hooks/papi-hooks/use-data.hook'; + export { default as useScrollGroupScrRef } from 'renderer/hooks/papi-hooks/use-scroll-group-scr-ref.hook'; + export { default as useSetting } from 'renderer/hooks/papi-hooks/use-setting.hook'; + export { default as useProjectData } from 'renderer/hooks/papi-hooks/use-project-data.hook'; + export { default as useProjectDataProvider } from 'renderer/hooks/papi-hooks/use-project-data-provider.hook'; + export { default as useProjectSetting } from 'renderer/hooks/papi-hooks/use-project-setting.hook'; + export { default as useDialogCallback } from 'renderer/hooks/papi-hooks/use-dialog-callback.hook'; + export { default as useDataProviderMulti } from 'renderer/hooks/papi-hooks/use-data-provider-multi.hook'; + export { default as useLocalizedStrings } from 'renderer/hooks/papi-hooks/use-localized-strings-hook'; +} +declare module '@papi/frontend/react' { + export * from 'renderer/hooks/papi-hooks/index'; +} +declare module 'renderer/services/renderer-xml-http-request.service' { + /** This wraps the browser's XMLHttpRequest implementation to + * provide better control over internet access. It is isomorphic with the standard XMLHttpRequest, + * so it should act as a drop-in replacement. + * + * Note that Node doesn't have a native implementation, so this is only for the renderer. + */ + export default class PapiRendererXMLHttpRequest implements XMLHttpRequest { + readonly DONE: 4; + readonly HEADERS_RECEIVED: 2; + readonly LOADING: 3; + readonly OPENED: 1; + readonly UNSENT: 0; + abort: () => void; + addEventListener: ( + type: K, + listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, + options?: boolean | AddEventListenerOptions, + ) => void; + dispatchEvent: (event: Event) => boolean; + getAllResponseHeaders: () => string; + getResponseHeader: (name: string) => string | null; + open: ( + method: string, + url: string, + async?: boolean, + username?: string | null, + password?: string | null, + ) => void; + onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null; + ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + overrideMimeType: (mime: string) => void; + readyState: number; + removeEventListener: ( + type: K, + listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, + options?: boolean | EventListenerOptions, + ) => void; + response: any; + responseText: string; + responseType: XMLHttpRequestResponseType; + responseURL: string; + responseXML: Document | null; + send: (body?: Document | XMLHttpRequestBodyInit | null) => void; + setRequestHeader: (name: string, value: string) => void; + status: number; + statusText: string; + timeout: number; + upload: XMLHttpRequestUpload; + withCredentials: boolean; + constructor(); + } +} +declare module '@papi/frontend' { + /** + * Unified module for accessing API features in the renderer. + * + * WARNING: DO NOT IMPORT papi IN ANY FILE THAT papi IMPORTS AND EXPOSES. + */ + import * as commandService from 'shared/services/command.service'; + import { PapiNetworkService } from 'shared/services/network.service'; + import { WebViewServiceType } from 'shared/services/web-view.service-model'; + import { InternetService } from 'shared/services/internet.service'; + import { DataProviderService } from 'shared/services/data-provider.service'; + import { ProjectLookupServiceType } from 'shared/models/project-lookup.service-model'; + import { PapiFrontendProjectDataProviderService } from 'shared/services/project-data-provider.service'; + import { ISettingsService } from 'shared/services/settings.service-model'; + import { DialogService } from 'shared/services/dialog.service-model'; + import * as papiReact from '@papi/frontend/react'; + import PapiRendererWebSocket from 'renderer/services/renderer-web-socket.service'; + import { IMenuDataService } from 'shared/services/menu-data.service-model'; + import { IScrollGroupService } from 'shared/services/scroll-group.service-model'; + import { ILocalizationService } from 'shared/services/localization.service-model'; + import PapiRendererXMLHttpRequest from 'renderer/services/renderer-xml-http-request.service'; + const papi: { + /** This is just an alias for internet.fetch */ + fetch: typeof globalThis.fetch; + /** This wraps the browser's WebSocket implementation to provide + * better control over internet access. It is isomorphic with the standard WebSocket, so it should + * act as a drop-in replacement. + * + * Note that the Node WebSocket implementation is different and not wrapped here. + */ + WebSocket: typeof PapiRendererWebSocket; + /** This wraps the browser's XMLHttpRequest implementation to + * provide better control over internet access. It is isomorphic with the standard XMLHttpRequest, + * so it should act as a drop-in replacement. + * + * Note that Node doesn't have a native implementation, so this is only for the renderer. + */ + XMLHttpRequest: typeof PapiRendererXMLHttpRequest; + /** + * + * The command service allows you to exchange messages with other components in the platform. You + * can register a command that other services and extensions can send you. You can send commands to + * other services and extensions that have registered commands. + */ + commands: typeof commandService; + /** + * + * Service exposing various functions related to using webViews + * + * WebViews are iframes in the Platform.Bible UI into which extensions load frontend code, either + * HTML or React components. + */ + webViews: WebViewServiceType; + /** + * + * Prompt the user for responses with dialogs + */ + dialogs: DialogService; + /** + * + * Service that provides a way to send and receive network events + */ + network: PapiNetworkService; + /** + * + * All extensions and services should use this logger to provide a unified output of logs + */ + logger: import('electron-log').MainLogger & { + default: import('electron-log').MainLogger; + }; + /** + * + * Service that provides a way to call `fetch` since the original function is not available + */ + internet: InternetService; + /** + * + * Service that allows extensions to send and receive data to/from other extensions + */ + dataProviders: DataProviderService; + /** + * + * Service that gets project data providers + */ + projectDataProviders: PapiFrontendProjectDataProviderService; + /** + * + * Provides metadata for projects known by the platform + * + * Note: this service runs locally everywhere in the TypeScript processes. It is also exposed on the + * PAPI websocket. Note these functions are all asynchronous on the PAPI websocket regardless of if + * their types are synchronous locally. + */ + projectLookup: ProjectLookupServiceType; + /** + * + * React hooks that enable interacting with the `papi` in React components more easily. + */ + react: typeof papiReact; + /** */ + settings: ISettingsService; + /** + * + * Service that allows to get and store menu data + */ + menuData: IMenuDataService; + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + scrollGroups: IScrollGroupService; + /** + * + * Service that allows to get and store localizations + */ + localization: ILocalizationService; + }; + export default papi; + /** This is just an alias for internet.fetch */ + export const fetch: typeof globalThis.fetch; + /** This wraps the browser's WebSocket implementation to provide + * better control over internet access. It is isomorphic with the standard WebSocket, so it should + * act as a drop-in replacement. + * + * Note that the Node WebSocket implementation is different and not wrapped here. + */ + export const WebSocket: typeof PapiRendererWebSocket; + /** This wraps the browser's XMLHttpRequest implementation to + * provide better control over internet access. It is isomorphic with the standard XMLHttpRequest, + * so it should act as a drop-in replacement. + * + * Note that Node doesn't have a native implementation, so this is only for the renderer. + */ + export const XMLHttpRequest: typeof PapiRendererXMLHttpRequest; + /** + * + * The command service allows you to exchange messages with other components in the platform. You + * can register a command that other services and extensions can send you. You can send commands to + * other services and extensions that have registered commands. + */ + export const commands: typeof commandService; + /** + * + * Service exposing various functions related to using webViews + * + * WebViews are iframes in the Platform.Bible UI into which extensions load frontend code, either + * HTML or React components. + */ + export const webViews: WebViewServiceType; + /** + * + * Prompt the user for responses with dialogs + */ + export const dialogs: DialogService; + /** + * + * Service that provides a way to send and receive network events + */ + export const network: PapiNetworkService; + /** + * + * All extensions and services should use this logger to provide a unified output of logs + */ + export const logger: import('electron-log').MainLogger & { + default: import('electron-log').MainLogger; + }; + /** + * + * Service that provides a way to call `fetch` since the original function is not available + */ + export const internet: InternetService; + /** + * + * Service that allows extensions to send and receive data to/from other extensions + */ + export const dataProviders: DataProviderService; + /** + * + * Service that registers and gets project data providers + */ + export const projectDataProviders: PapiFrontendProjectDataProviderService; + /** + * + * Provides metadata for projects known by the platform + * + * Note: this service runs locally everywhere in the TypeScript processes. It is also exposed on the + * PAPI websocket. Note these functions are all asynchronous on the PAPI websocket regardless of if + * their types are synchronous locally. + */ + export const projectLookup: ProjectLookupServiceType; + /** + * + * React hooks that enable interacting with the `papi` in React components more easily. + */ + export const react: typeof papiReact; + /** */ + export const settings: ISettingsService; + /** + * + * Service that allows to get and store menu data + */ + export const menuData: IMenuDataService; + /** + * + * Provides functions related to scroll groups and Scripture references at those scroll groups + */ + export const scrollGroups: IScrollGroupService; + /** + * + * Service that allows to get and store localizations + */ + export const localization: ILocalizationService; + export type Papi = typeof papi; +} diff --git a/lib/papi-dts/tsconfig.docs.json b/lib/papi-dts/tsconfig.docs.json new file mode 100644 index 0000000000..34e3c6ae8c --- /dev/null +++ b/lib/papi-dts/tsconfig.docs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "include": ["./papi.d.ts"], + "compilerOptions": { + // Clearing outFile from the tsconfig we are extending to avoid module error + "outFile": null + }, + "exclude": ["node_modules"] +} diff --git a/lib/papi-dts/tsconfig.json b/lib/papi-dts/tsconfig.json new file mode 100644 index 0000000000..cc80054e42 --- /dev/null +++ b/lib/papi-dts/tsconfig.json @@ -0,0 +1,35 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": "../../src", + "module": "ESNext", + "declaration": true, + "emitDeclarationOnly": true, + "outFile": "papi.d.ts", + // typeRoots should be all of root tsconfig.json's typeRoots but without extensions + // plus the src/declarations folder because these modules for some reason do not get picked up + "typeRoots": [ + // Include default type declarations + "./node_modules/@types", + // Include root default type declarations + "../../node_modules/@types", + // Include additions and overrides + "../../src/@types", + // Include type declarations shared between core and extensions + "../../src/declarations" + ] + }, + "include": [ + "../../src/declarations/*", + "../../src/extension-host/services/papi-backend.service.ts", + "../../src/extension-host/extension-types/extension.interface.ts", + "../../src/extension-host/extension-types/extension-manifest.model.ts", + "../../src/renderer/services/papi-frontend.service.ts", + "../../src/renderer/services/papi-frontend-react.service.ts", + "../../src/shared/services/papi-core.service.ts" + ], + "exclude": ["node_modules"], + "ts-node": { + "esm": true + } +} diff --git a/lib/papi-dts/tsconfig.lint.json b/lib/papi-dts/tsconfig.lint.json new file mode 100644 index 0000000000..0d9138dbbf --- /dev/null +++ b/lib/papi-dts/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "files": [".eslintrc.cjs", "edit-papi-d-ts.ts", "papi.d.ts"] +} diff --git a/lib/papi-dts/typedoc.json b/lib/papi-dts/typedoc.json new file mode 100644 index 0000000000..083cda5359 --- /dev/null +++ b/lib/papi-dts/typedoc.json @@ -0,0 +1,8 @@ +{ + "entryPoints": ["papi.d.ts"], + "tsconfig": "tsconfig.docs.json", + "out": "docs", + "readme": "README.md", + "logLevel": "Verbose", + "sort": ["kind", "alphabetical"] +} diff --git a/lib/platform-bible-react/.babelrc.json b/lib/platform-bible-react/.babelrc.json new file mode 100644 index 0000000000..6347f8e18f --- /dev/null +++ b/lib/platform-bible-react/.babelrc.json @@ -0,0 +1,18 @@ +{ + "sourceType": "unambiguous", + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "chrome": 100 + } + } + ], + "@babel/preset-typescript", + ["@babel/preset-react", { + "runtime": "automatic" + }] + ], + "plugins": [] +} diff --git a/lib/platform-bible-react/.editorconfig b/lib/platform-bible-react/.editorconfig new file mode 100644 index 0000000000..bd59ac6a31 --- /dev/null +++ b/lib/platform-bible-react/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 diff --git a/lib/platform-bible-react/.eslintignore b/lib/platform-bible-react/.eslintignore new file mode 100644 index 0000000000..2aa8552e24 --- /dev/null +++ b/lib/platform-bible-react/.eslintignore @@ -0,0 +1,10 @@ +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Dependency directory +node_modules + +# Built files +dist + +# Doc files +docs diff --git a/lib/platform-bible-react/.eslintrc.cjs b/lib/platform-bible-react/.eslintrc.cjs new file mode 100644 index 0000000000..f32a4d2d54 --- /dev/null +++ b/lib/platform-bible-react/.eslintrc.cjs @@ -0,0 +1,38 @@ +module.exports = { + extends: '../../.eslintrc.js', + root: true, + parserOptions: { + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + }, + rules: { + 'no-console': 'off', + }, + overrides: [ + { + files: ['./src/components/shadcn-ui/*'], + rules: { + // These files are copy/pasted boilerplate, so we want to avoid changing them where + // appropriate by disabling certain rules + 'import/prefer-default-export': 'off', + 'react/prop-types': 'off', + 'react/jsx-props-no-spreading': 'off', + }, + }, + { + files: ['./src/preview/**'], + rules: { + // Dropping some rules for the preview app + 'no-alert': 'off', // alert is fine here + 'jsx-a11y/control-has-associated-label': 'off', // no need for a11y + }, + }, + ], + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + }, +}; diff --git a/lib/platform-bible-react/.gitignore b/lib/platform-bible-react/.gitignore new file mode 100644 index 0000000000..7946c9e76c --- /dev/null +++ b/lib/platform-bible-react/.gitignore @@ -0,0 +1,27 @@ +# dependencies +node_modules + +# production +build +# dist # We want these commited so developers don't need to build the package. +dist-ssr +*.local +docs + +# logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/lib/platform-bible-react/.prettierignore b/lib/platform-bible-react/.prettierignore new file mode 100644 index 0000000000..c50824b13a --- /dev/null +++ b/lib/platform-bible-react/.prettierignore @@ -0,0 +1,10 @@ +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Dependency directory +node_modules + +# Built files +dist + +# Doc files +docs diff --git a/lib/platform-bible-react/.prettierrc.js b/lib/platform-bible-react/.prettierrc.js new file mode 100644 index 0000000000..f7f1e84393 --- /dev/null +++ b/lib/platform-bible-react/.prettierrc.js @@ -0,0 +1,6 @@ +import prettierConfig from '../../.prettierrc.js'; + +export default { + ...prettierConfig, + plugins: [...prettierConfig.plugins, 'prettier-plugin-tailwindcss'], +}; diff --git a/lib/platform-bible-react/.stylelintignore b/lib/platform-bible-react/.stylelintignore new file mode 100644 index 0000000000..539007b874 --- /dev/null +++ b/lib/platform-bible-react/.stylelintignore @@ -0,0 +1,10 @@ +# Please keep this file in sync with .eslintignore and .prettierignore + +# Dependency directory +node_modules + +# Built files +dist + +# Doc files +docs diff --git a/lib/platform-bible-react/.stylelintrc.cjs b/lib/platform-bible-react/.stylelintrc.cjs new file mode 100644 index 0000000000..5d4dcf01f8 --- /dev/null +++ b/lib/platform-bible-react/.stylelintrc.cjs @@ -0,0 +1,7 @@ +module.exports = { + extends: [ + '../../.stylelintrc.js', + 'stylelint-config-tailwindcss', + 'stylelint-config-tailwindcss/scss', + ], +}; diff --git a/lib/platform-bible-react/.vscode/launch.json b/lib/platform-bible-react/.vscode/launch.json new file mode 100644 index 0000000000..348cdb3e72 --- /dev/null +++ b/lib/platform-bible-react/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Preview platform-bible-react", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "skipFiles": ["/**"] + } + ] +} diff --git a/lib/platform-bible-react/.vscode/settings.json b/lib/platform-bible-react/.vscode/settings.json new file mode 100644 index 0000000000..0ff0da3fc8 --- /dev/null +++ b/lib/platform-bible-react/.vscode/settings.json @@ -0,0 +1,58 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ], + "jestrunner.jestPath": "../../node_modules/jest/bin/jest.js" +} diff --git a/lib/platform-bible-react/README.md b/lib/platform-bible-react/README.md new file mode 100644 index 0000000000..4d8d66ab74 --- /dev/null +++ b/lib/platform-bible-react/README.md @@ -0,0 +1,54 @@ +# Platform.Bible React + +A set of React hooks and components that allow developers of Platform.Bible extensions to have the same look and feel as the main application. + +## Development + +Inspired by https://github.com/jasonsturges/vite-typescript-npm-package + +When we publish this npm package, then in the root `package.json`, a version can be given to `platform-bible-react` instead of the existing file link. At that time we will likely need to use `npm link` and `npm unlink` to develop the components ([see here](https://github.com/jasonsturges/vite-typescript-npm-package#development)). + +TODO: + +- [ ] Decide if this package will be public, if not it will probably need an NPM organization setup to publish it to privately. +- [ ] What NPM user login will we use to publish it (each developer or an app-wide user)? + +### Building + +#### Setting up + +To set up the dev environment to build, you must run the following from `paranext-core`: + +```bash +npm i +``` + +#### Previewing `platform-bible-react` + +Once you have set up your environment, you can run the following command in this folder to preview `platform-bible-react` components (`src\preview\app.component.tsx`): + +```bash +npm start +``` + +#### Building `platform-bible-react` + +Once you have set up your environment, you can run the build command in this folder to build `platform-bible-react`: + +```bash +npm run build +``` + +Or you can build from `paranext-core`: + +```bash +npm run build:platform-bible-react +``` + +If you want a quick build that doesn't lint, run the following: + +```bash +npm run build:basic +``` + +Do not commit changes after running this basic build. Before committing, always run a full build. diff --git a/lib/platform-bible-react/components.json b/lib/platform-bible-react/components.json new file mode 100644 index 0000000000..3b874aeeb5 --- /dev/null +++ b/lib/platform-bible-react/components.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "pr-" + }, + "aliases": { + "components": "@/components/shadcn-ui", + "utils": "@/utils/shadcn-ui.util", + "ui": "@/components/shadcn-ui" + } +} diff --git a/lib/platform-bible-react/dist/index.cjs b/lib/platform-bible-react/dist/index.cjs new file mode 100644 index 0000000000..94906a94e7 --- /dev/null +++ b/lib/platform-bible-react/dist/index.cjs @@ -0,0 +1,2602 @@ +"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),y=require("react"),ne=require("lucide-react"),lr=require("clsx"),Dl=require("tailwind-merge"),ms=require("@radix-ui/react-dropdown-menu"),ee=require("platform-bible-utils"),Al=require("@radix-ui/react-slot"),sn=require("class-variance-authority"),Bl=require("@radix-ui/react-label"),Ll=require("@radix-ui/react-radio-group"),Vl=require("@radix-ui/react-popover"),Oe=require("cmdk"),Fl=require("@radix-ui/react-dialog"),Ne=require("@tanstack/react-table"),zl=require("@radix-ui/react-select"),Gl=require("@radix-ui/react-toggle-group"),Ul=require("@radix-ui/react-toggle"),Hl=require("@radix-ui/react-tabs"),ql=require("@radix-ui/react-separator"),Xl=require("@radix-ui/react-checkbox"),Wn=require("@mui/styled-engine"),Ie=require("@mui/material"),dt=require("react-dom"),hs=require("sonner"),Wl=require("@radix-ui/react-slider"),Yl=require("@radix-ui/react-switch");function Ee(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const M=Ee(y),fe=Ee(ms),gs=Ee(Bl),xt=Ee(Ll),kt=Ee(Vl),We=Ee(Fl),be=Ee(zl),ln=Ee(Gl),bs=Ee(Ul),Re=Ee(Hl),vs=Ee(ql),Yn=Ee(Xl),Kl=Ee(dt),ut=Ee(Wl),Kn=Ee(Yl);const Jl=Dl.extendTailwindMerge({prefix:"pr-"});function O(...e){return Jl(lr.clsx(e))}const Kr=y.forwardRef(({className:e,type:r,...t},n)=>s.jsx("input",{type:r,className:O("pr-twp pr-flex pr-h-10 pr-rounded-md pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background file:pr-border-0 file:pr-bg-transparent file:pr-text-sm file:pr-font-medium placeholder:pr-text-muted-foreground disabled:pr-cursor-not-allowed disabled:pr-opacity-50",e),ref:n,...t}));Kr.displayName="Input";const Zl=y.forwardRef(({handleSearch:e,handleKeyDown:r,handleOnClick:t,handleSubmit:n,...o},a)=>s.jsxs("div",{className:"pr-relative",children:[s.jsx(Kr,{...o,type:"text",className:"pr-box-border pr-gap-2.5 pr-rounded-lg pr-border pr-border-solid pr-bg-background pr-py-2 pr-pl-4 pr-pr-3 pr-font-medium pr-shadow-none pr-outline-none",onChange:i=>e(i.target.value),onKeyDown:i=>{i.key==="Enter"&&n(),r(i)},onClick:t,ref:a}),s.jsx(ne.History,{className:"pr-absolute pr-right-3 pr-top-1/2 pr-h-4 pr-w-4 pr--translate-y-1/2 pr-transform pr-cursor-pointer pr-text-muted-foreground",onClick:()=>{console.log("back in history")}})]}));var Ql=Object.defineProperty,ep=(e,r,t)=>r in e?Ql(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,oe=(e,r,t)=>ep(e,typeof r!="symbol"?r+"":r,t);const kr=["GEN","EXO","LEV","NUM","DEU","JOS","JDG","RUT","1SA","2SA","1KI","2KI","1CH","2CH","EZR","NEH","EST","JOB","PSA","PRO","ECC","SNG","ISA","JER","LAM","EZK","DAN","HOS","JOL","AMO","OBA","JON","MIC","NAM","HAB","ZEP","HAG","ZEC","MAL","MAT","MRK","LUK","JHN","ACT","ROM","1CO","2CO","GAL","EPH","PHP","COL","1TH","2TH","1TI","2TI","TIT","PHM","HEB","JAS","1PE","2PE","1JN","2JN","3JN","JUD","REV","TOB","JDT","ESG","WIS","SIR","BAR","LJE","S3Y","SUS","BEL","1MA","2MA","3MA","4MA","1ES","2ES","MAN","PS2","ODA","PSS","JSA","JDB","TBS","SST","DNT","BLT","XXA","XXB","XXC","XXD","XXE","XXF","XXG","FRT","BAK","OTH","3ES","EZA","5EZ","6EZ","INT","CNC","GLO","TDX","NDX","DAG","PS3","2BA","LBA","JUB","ENO","1MQ","2MQ","3MQ","REP","4BA","LAO"],po=["XXA","XXB","XXC","XXD","XXE","XXF","XXG","FRT","BAK","OTH","INT","CNC","GLO","TDX","NDX"],ws=["Genesis","Exodus","Leviticus","Numbers","Deuteronomy","Joshua","Judges","Ruth","1 Samuel","2 Samuel","1 Kings","2 Kings","1 Chronicles","2 Chronicles","Ezra","Nehemiah","Esther (Hebrew)","Job","Psalms","Proverbs","Ecclesiastes","Song of Songs","Isaiah","Jeremiah","Lamentations","Ezekiel","Daniel (Hebrew)","Hosea","Joel","Amos","Obadiah","Jonah","Micah","Nahum","Habakkuk","Zephaniah","Haggai","Zechariah","Malachi","Matthew","Mark","Luke","John","Acts","Romans","1 Corinthians","2 Corinthians","Galatians","Ephesians","Philippians","Colossians","1 Thessalonians","2 Thessalonians","1 Timothy","2 Timothy","Titus","Philemon","Hebrews","James","1 Peter","2 Peter","1 John","2 John","3 John","Jude","Revelation","Tobit","Judith","Esther Greek","Wisdom of Solomon","Sirach (Ecclesiasticus)","Baruch","Letter of Jeremiah","Song of 3 Young Men","Susanna","Bel and the Dragon","1 Maccabees","2 Maccabees","3 Maccabees","4 Maccabees","1 Esdras (Greek)","2 Esdras (Latin)","Prayer of Manasseh","Psalm 151","Odes","Psalms of Solomon","Joshua A. *obsolete*","Judges B. *obsolete*","Tobit S. *obsolete*","Susanna Th. *obsolete*","Daniel Th. *obsolete*","Bel Th. *obsolete*","Extra A","Extra B","Extra C","Extra D","Extra E","Extra F","Extra G","Front Matter","Back Matter","Other Matter","3 Ezra *obsolete*","Apocalypse of Ezra","5 Ezra (Latin Prologue)","6 Ezra (Latin Epilogue)","Introduction","Concordance ","Glossary ","Topical Index","Names Index","Daniel Greek","Psalms 152-155","2 Baruch (Apocalypse)","Letter of Baruch","Jubilees","Enoch","1 Meqabyan","2 Meqabyan","3 Meqabyan","Reproof (Proverbs 25-31)","4 Baruch (Rest of Baruch)","Laodiceans"],ca=cp();function Jr(e,r=!0){return r&&(e=e.toUpperCase()),e in ca?ca[e]:0}function co(e){return Jr(e)>0}function rp(e){const r=typeof e=="string"?Jr(e):e;return r>=40&&r<=66}function tp(e){return(typeof e=="string"?Jr(e):e)<=39}function ys(e){return e<=66}function np(e){const r=typeof e=="string"?Jr(e):e;return Ns(r)&&!ys(r)}function*op(){for(let e=1;e<=kr.length;e++)yield e}const ap=1,xs=kr.length;function sp(){return["XXA","XXB","XXC","XXD","XXE","XXF","XXG"]}function uo(e,r="***"){const t=e-1;return t<0||t>=kr.length?r:kr[t]}function ks(e){return e<=0||e>xs?"******":ws[e-1]}function ip(e){return ks(Jr(e))}function Ns(e){const r=typeof e=="number"?uo(e):e;return co(r)&&!po.includes(r)}function lp(e){const r=typeof e=="number"?uo(e):e;return co(r)&&po.includes(r)}function pp(e){return ws[e-1].includes("*obsolete*")}function cp(){const e={};for(let r=0;r(e[e.Unknown=0]="Unknown",e[e.Original=1]="Original",e[e.Septuagint=2]="Septuagint",e[e.Vulgate=3]="Vulgate",e[e.English=4]="English",e[e.RussianProtestant=5]="RussianProtestant",e[e.RussianOrthodox=6]="RussianOrthodox",e))(He||{});const _e=class{constructor(r){if(oe(this,"name"),oe(this,"fullPath"),oe(this,"isPresent"),oe(this,"hasVerseSegments"),oe(this,"isCustomized"),oe(this,"baseVersification"),oe(this,"scriptureBooks"),oe(this,"_type"),r==null)throw new Error("Argument undefined");typeof r=="string"?(this.name=r,this._type=He[r]):(this._type=r,this.name=He[r])}get type(){return this._type}equals(r){return!r.type||!this.type?!1:r.type===this.type}};oe(_e,"Original",new _e(He.Original)),oe(_e,"Septuagint",new _e(He.Septuagint)),oe(_e,"Vulgate",new _e(He.Vulgate)),oe(_e,"English",new _e(He.English)),oe(_e,"RussianProtestant",new _e(He.RussianProtestant)),oe(_e,"RussianOrthodox",new _e(He.RussianOrthodox));let hr=_e;function da(e,r){const t=r[0];for(let n=1;n(e[e.Valid=0]="Valid",e[e.UnknownVersification=1]="UnknownVersification",e[e.OutOfRange=2]="OutOfRange",e[e.VerseOutOfOrder=3]="VerseOutOfOrder",e[e.VerseRepeated=4]="VerseRepeated",e))(Es||{});const Te=class ae{constructor(r,t,n,o){if(oe(this,"firstChapter"),oe(this,"lastChapter"),oe(this,"lastVerse"),oe(this,"hasSegmentsDefined"),oe(this,"text"),oe(this,"BBBCCCVVVS"),oe(this,"longHashCode"),oe(this,"versification"),oe(this,"rtlMark","‏"),oe(this,"_bookNum",0),oe(this,"_chapterNum",0),oe(this,"_verseNum",0),oe(this,"_verse"),n==null&&o==null)if(r!=null&&typeof r=="string"){const a=r,i=t!=null&&t instanceof hr?t:void 0;this.setEmpty(i),this.parse(a)}else if(r!=null&&typeof r=="number"){const a=t!=null&&t instanceof hr?t:void 0;this.setEmpty(a),this._verseNum=r%ae.chapterDigitShifter,this._chapterNum=Math.floor(r%ae.bookDigitShifter/ae.chapterDigitShifter),this._bookNum=Math.floor(r/ae.bookDigitShifter)}else if(t==null)if(r!=null&&r instanceof ae){const a=r;this._bookNum=a.bookNum,this._chapterNum=a.chapterNum,this._verseNum=a.verseNum,this._verse=a.verse,this.versification=a.versification}else{if(r==null)return;const a=r instanceof hr?r:ae.defaultVersification;this.setEmpty(a)}else throw new Error("VerseRef constructor not supported.");else if(r!=null&&t!=null&&n!=null)if(typeof r=="string"&&typeof t=="string"&&typeof n=="string")this.setEmpty(o),this.updateInternal(r,t,n);else if(typeof r=="number"&&typeof t=="number"&&typeof n=="number")this._bookNum=r,this._chapterNum=t,this._verseNum=n,this.versification=o??ae.defaultVersification;else throw new Error("VerseRef constructor not supported.");else throw new Error("VerseRef constructor not supported.")}static isVerseParseable(r){return r.length>0&&"0123456789".includes(r[0])&&!r.endsWith(this.verseRangeSeparator)&&!r.endsWith(this.verseSequenceIndicator)}static tryParse(r){let t;try{return t=new ae(r),{success:!0,verseRef:t}}catch(n){if(n instanceof at)return t=new ae,{success:!1,verseRef:t};throw n}}static getBBBCCCVVV(r,t,n){return r%ae.bcvMaxValue*ae.bookDigitShifter+(t>=0?t%ae.bcvMaxValue*ae.chapterDigitShifter:0)+(n>=0?n%ae.bcvMaxValue:0)}static fromJSON(r){const{book:t,chapterNum:n,verseNum:o,verse:a,versificationStr:i}=r,l=a||o.toString();let c;return i&&(c=new hr(i)),t?new ae(t,n.toString(),l,c):new ae}static tryGetVerseNum(r){let t;if(!r)return t=-1,{success:!0,vNum:t};t=0;let n;for(let o=0;o"9")return o===0&&(t=-1),{success:!1,vNum:t};if(t=t*10+ +n-0,t>ae.bcvMaxValue)return t=-1,{success:!1,vNum:t}}return{success:!0,vNum:t}}get isDefault(){return this.bookNum===0&&this.chapterNum===0&&this.verseNum===0&&this.versification==null}get hasMultiple(){return this._verse!=null&&(this._verse.includes(ae.verseRangeSeparator)||this._verse.includes(ae.verseSequenceIndicator))}get book(){return de.bookNumberToId(this.bookNum,"")}set book(r){this.bookNum=de.bookIdToNumber(r)}get chapter(){return this.isDefault||this._chapterNum<0?"":this._chapterNum.toString()}set chapter(r){const t=+r;this._chapterNum=Number.isInteger(t)?t:-1}get verse(){return this._verse!=null?this._verse:this.isDefault||this._verseNum<0?"":this._verseNum.toString()}set verse(r){const{success:t,vNum:n}=ae.tryGetVerseNum(r);this._verse=t?void 0:r.replace(this.rtlMark,""),this._verseNum=n,!(this._verseNum>=0)&&({vNum:this._verseNum}=ae.tryGetVerseNum(this._verse))}get bookNum(){return this._bookNum}set bookNum(r){if(r<=0||r>de.lastBook)throw new at("BookNum must be greater than zero and less than or equal to last book");this._bookNum=r}get chapterNum(){return this._chapterNum}set chapterNum(r){this.chapterNum=r}get verseNum(){return this._verseNum}set verseNum(r){this._verseNum=r}get versificationStr(){var r;return(r=this.versification)==null?void 0:r.name}set versificationStr(r){this.versification=this.versification!=null?new hr(r):void 0}get valid(){return this.validStatus===0}get validStatus(){return this.validateVerse(ae.verseRangeSeparators,ae.verseSequenceIndicators)}get BBBCCC(){return ae.getBBBCCCVVV(this._bookNum,this._chapterNum,0)}get BBBCCCVVV(){return ae.getBBBCCCVVV(this._bookNum,this._chapterNum,this._verseNum)}get isExcluded(){return!1}parse(r){if(r=r.replace(this.rtlMark,""),r.includes("/")){const a=r.split("/");if(r=a[0],a.length>1)try{const i=+a[1].trim();this.versification=new hr(He[i])}catch{throw new at("Invalid reference : "+r)}}const t=r.trim().split(" ");if(t.length!==2)throw new at("Invalid reference : "+r);const n=t[1].split(":"),o=+n[0];if(n.length!==2||de.bookIdToNumber(t[0])===0||!Number.isInteger(o)||o<0||!ae.isVerseParseable(n[1]))throw new at("Invalid reference : "+r);this.updateInternal(t[0],n[0],n[1])}simplify(){this._verse=void 0}clone(){return new ae(this)}toString(){const r=this.book;return r===""?"":`${r} ${this.chapter}:${this.verse}`}toJSON(){let r=this.verse;(r===""||r===this.verseNum.toString())&&(r=void 0);const t={book:this.book,chapterNum:this.chapterNum,verseNum:this.verseNum,verse:r,versificationStr:this.versificationStr};return r||delete t.verse,t}equals(r){return r instanceof ae?r._bookNum===this._bookNum&&r._chapterNum===this._chapterNum&&r._verseNum===this._verseNum&&r.verse===this.verse&&(r.versification==null&&this.versification==null||r.versification!=null&&this.versification!=null&&r.versification.equals(this.versification)):!1}allVerses(r=!1,t=ae.verseRangeSeparators,n=ae.verseSequenceIndicators){if(this._verse==null||this.chapterNum<=0)return[this.clone()];const o=[],a=da(this._verse,n);for(const i of a.map(l=>da(l,t))){const l=this.clone();l.verse=i[0];const c=l.verseNum;if(o.push(l),i.length>1){const d=this.clone();if(d.verse=i[1],!r)for(let u=c+1;ui)return 3;if(n===i)return 4;n=i}return 0}get internalValid(){return this.versification==null?1:this._bookNum<=0||this._bookNum>de.lastBook?2:(de.isCanonical(this._bookNum),0)}setEmpty(r=ae.defaultVersification){this._bookNum=0,this._chapterNum=-1,this._verse=void 0,this.versification=r}updateInternal(r,t,n){this.bookNum=de.bookIdToNumber(r),this.chapter=t,this.verse=n}};oe(Te,"defaultVersification",hr.English),oe(Te,"verseRangeSeparator","-"),oe(Te,"verseSequenceIndicator",","),oe(Te,"verseRangeSeparators",[Te.verseRangeSeparator]),oe(Te,"verseSequenceIndicators",[Te.verseSequenceIndicator]),oe(Te,"chapterDigitShifter",1e3),oe(Te,"bookDigitShifter",Te.chapterDigitShifter*Te.chapterDigitShifter),oe(Te,"bcvMaxValue",Te.chapterDigitShifter-1),oe(Te,"ValidStatusType",Es);let at=class extends Error{};const pn=fe.Root,fo=fe.Trigger,Ss=fe.Group,dp=fe.Portal,up=fe.Sub,fp=fe.RadioGroup,Ts=y.forwardRef(({className:e,inset:r,children:t,...n},o)=>s.jsxs(fe.SubTrigger,{ref:o,className:O("pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none focus:pr-bg-accent data-[state=open]:pr-bg-accent",r&&"pr-pl-8",e),...n,children:[t,s.jsx(ne.ChevronRight,{className:"pr-ml-auto pr-h-4 pr-w-4"})]}));Ts.displayName=fe.SubTrigger.displayName;const Cs=y.forwardRef(({className:e,...r},t)=>s.jsx(fe.SubContent,{ref:t,className:O("pr-z-50 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-p-1 pr-text-popover-foreground pr-shadow-lg data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2",e),...r}));Cs.displayName=fe.SubContent.displayName;const Ct=y.forwardRef(({className:e,sideOffset:r=4,...t},n)=>s.jsx(fe.Portal,{children:s.jsx(fe.Content,{ref:n,sideOffset:r,className:O("pr-twp pr-z-50 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-p-1 pr-text-popover-foreground pr-shadow-md data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2",e),...t})}));Ct.displayName=fe.Content.displayName;const mo=y.forwardRef(({className:e,inset:r,...t},n)=>s.jsx(fe.Item,{ref:n,className:O("pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50",r&&"pr-pl-8",e),...t}));mo.displayName=fe.Item.displayName;const cn=y.forwardRef(({className:e,children:r,checked:t,...n},o)=>s.jsxs(fe.CheckboxItem,{ref:o,className:O("pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50",e),checked:t,...n,children:[s.jsx("span",{className:"pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center",children:s.jsx(fe.ItemIndicator,{children:s.jsx(ne.Check,{className:"pr-h-4 pr-w-4"})})}),r]}));cn.displayName=fe.CheckboxItem.displayName;const ho=y.forwardRef(({className:e,children:r,...t},n)=>s.jsxs(fe.RadioItem,{ref:n,className:O("pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50",e),...t,children:[s.jsx("span",{className:"pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center",children:s.jsx(fe.ItemIndicator,{children:s.jsx(ne.Circle,{className:"pr-h-2 pr-w-2 pr-fill-current"})})}),r]}));ho.displayName=fe.RadioItem.displayName;const Zr=y.forwardRef(({className:e,inset:r,...t},n)=>s.jsx(fe.Label,{ref:n,className:O("pr-px-2 pr-py-1.5 pr-text-sm pr-font-semibold",r&&"pr-pl-8",e),...t}));Zr.displayName=fe.Label.displayName;const jt=y.forwardRef(({className:e,...r},t)=>s.jsx(fe.Separator,{ref:t,className:O("pr--mx-1 pr-my-1 pr-h-px pr-bg-muted",e),...r}));jt.displayName=fe.Separator.displayName;function js({className:e,...r}){return s.jsx("span",{className:O("pr-ml-auto pr-text-xs pr-tracking-widest pr-opacity-60",e),...r})}js.displayName="DropdownMenuShortcut";const mp=y.forwardRef(({bookId:e,handleSelectBook:r,isSelected:t,handleHighlightBook:n,handleKeyDown:o,bookType:a,children:i},l)=>s.jsxs(mo,{ref:l,textValue:e,className:O("pr-mx-1 pr-px-1 pr-font-normal pr-text-foreground/80",{"pr-bg-amber-50 pr-text-yellow-900 data-[highlighted]:pr-bg-amber-100":t}),onSelect:c=>{c.preventDefault(),r()},onKeyDown:c=>{o(c)},onFocus:n,onMouseMove:n,children:[s.jsx("span",{className:O("pr-border-b-0 pr-border-l-2 pr-border-r-0 pr-border-t-0 pr-border-solid pr-px-2",{"pr-font-bold":t,"pr-border-l-red-200":a.toLowerCase()==="ot","pr-border-l-purple-200":a.toLowerCase()==="nt","pr-border-l-indigo-200":a.toLowerCase()==="dc"}),children:de.bookIdToEnglishName(e)}),t&&s.jsx("div",{children:i})]},e));function hp({handleSelectChapter:e,endChapter:r,activeChapter:t,highlightedChapter:n,handleHighlightedChapter:o}){const a=Array.from({length:r},(l,c)=>c+1),i=y.useCallback(l=>{o(l)},[o]);return s.jsx("div",{className:O("pr-flex pr-flex-wrap pr-items-start pr-justify-start pr-self-stretch"),children:a.map(l=>s.jsx("div",{className:O("pr-box-content pr-flex pr-h-4 pr-w-4 pr-cursor-pointer pr-items-center pr-justify-end pr-rounded-md pr-p-2 pr-text-amber-800",{"pr-font-semibold pr-text-amber-900":l===t,"pr-bg-amber-200":l===n}),onClick:c=>{c.preventDefault(),c.stopPropagation(),e(l)},role:"button",onKeyDown:c=>{c.key==="Enter"&&e(l)},tabIndex:0,onMouseMove:()=>i(l),children:l},l))})}function gp({handleSort:e,handleLocationHistory:r,handleBookmarks:t}){return s.jsxs(Zr,{className:"pr-flex pr-justify-between",children:[s.jsx("p",{className:"pr-inline-block pr-align-middle",children:"Go To"}),s.jsxs("div",{className:"pr-flex pr-items-center",children:[s.jsx(ne.ArrowDownWideNarrow,{onClick:e,className:"pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2"}),s.jsx(ne.Clock,{onClick:r,className:"pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2"}),s.jsx(ne.Bookmark,{onClick:t,className:"pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2"})]})]})}const gt=de.allBookIds,bp={OT:"Old Testament",NT:"New Testament",DC:"Deuterocanon"},ua=["OT","NT","DC"],vp=32+32+32,wp=[/^(\w+)$/i,/^(\w+)(?:\s(\d+))$/i,/^(\w+)(?:\s(\d+):(\d+))$/i],yp=e=>({OT:gt.filter(t=>de.isBookOT(t)),NT:gt.filter(t=>de.isBookNT(t)),DC:gt.filter(t=>de.isBookDC(t))})[e],st=e=>ee.getChaptersForBook(de.bookIdToNumber(e));function xp(){return gt.map(r=>de.bookIdToEnglishName(r))}function kp(e){return xp().includes(e)}function Np(e){const r=e.toLowerCase().replace(/^\w/,t=>t.toUpperCase());if(kp(r))return gt.find(n=>de.bookIdToEnglishName(n)===r)}function Ep({scrRef:e,handleSubmit:r}){const[t,n]=y.useState(""),[o,a]=y.useState(de.bookNumberToId(e.bookNum)),[i,l]=y.useState(e.chapterNum??0),[c,d]=y.useState(de.bookNumberToId(e.bookNum)),[u,v]=y.useState(!1),[p,h]=y.useState(u),f=y.useRef(void 0),g=y.useRef(void 0),b=y.useRef(void 0),x=y.useCallback(N=>yp(N).filter(A=>{const D=de.bookIdToEnglishName(A).toLowerCase(),J=t.replace(/[^a-zA-Z]/g,"").toLowerCase();return D.includes(J)||A.toLowerCase().includes(J)}),[t]),C=N=>{n(N)},S=y.useRef(!1),k=y.useCallback(N=>{if(S.current){S.current=!1;return}v(N)},[]),w=y.useCallback((N,A,D,J)=>{if(l(de.bookNumberToId(e.bookNum)!==N?1:e.chapterNum),A||st(N)===-1){r({bookNum:de.bookIdToNumber(N),chapterNum:D||1,verseNum:J||1}),v(!1),n("");return}a(o!==N?N:""),v(!A)},[r,e.bookNum,e.chapterNum,o]),j=N=>{N<=0||N>st(o)||w(o,!0,N)},R=y.useCallback(()=>{wp.forEach(N=>{const A=t.match(N);if(A){const[D,J=void 0,K=void 0]=A.slice(1),H=Np(D);(de.isBookIdValid(D)||H)&&w(H??D,!0,J?parseInt(J,10):1,K?parseInt(K,10):1)}})},[w,t]),B=y.useCallback(N=>{u?(N.key==="ArrowDown"||N.key==="ArrowUp")&&(typeof b<"u"&&b.current!==null?b.current.focus():typeof g<"u"&&g.current!==null&&g.current.focus(),N.preventDefault()):v(!0)},[u]),T=N=>{const{key:A}=N;A==="ArrowRight"||A==="ArrowLeft"||A==="ArrowDown"||A==="ArrowUp"||A==="Enter"||(f.current.dispatchEvent(new KeyboardEvent("keydown",{key:A})),f.current.focus())},P=N=>{const{key:A}=N;if(c===o){if(A==="Enter"){N.preventDefault(),w(o,!0,i);return}let D=0;if(A==="ArrowRight")if(i1)D=-1;else{N.preventDefault();return}else A==="ArrowDown"?D=6:A==="ArrowUp"&&(D=-6);i+D<=0||i+D>st(c)?l(0):D!==0&&(l(i+D),N.preventDefault())}};return y.useEffect(()=>{o===c?o===de.bookNumberToId(e.bookNum)?l(e.chapterNum):l(1):l(0)},[c,e.bookNum,e.chapterNum,o]),y.useLayoutEffect(()=>{h(u)},[u]),y.useLayoutEffect(()=>{const N=setTimeout(()=>{if(p&&g.current&&b.current){const D=b.current.offsetTop-vp;g.current.scrollTo({top:D,behavior:"instant"})}},10);return()=>{clearTimeout(N)}},[p]),s.jsx("div",{className:"pr-twp pr-flex",children:s.jsxs(pn,{modal:!1,open:u,onOpenChange:k,children:[s.jsx(fo,{asChild:!0,children:s.jsx(Zl,{ref:f,value:t,handleSearch:C,handleKeyDown:B,handleOnClick:()=>{a(de.bookNumberToId(e.bookNum)),d(de.bookNumberToId(e.bookNum)),l(e.chapterNum>0?e.chapterNum:0),v(!0),f.current.focus()},onFocus:()=>{S.current=!0},handleSubmit:R,placeholder:`${de.bookNumberToEnglishName(e.bookNum)} ${e.chapterNum}:${e.verseNum}`})}),s.jsxs(Ct,{className:"pr-m-1 pr-overflow-y-auto pr-p-0 pr-font-normal pr-text-foreground/80",style:{width:"233px",maxHeight:"500px",zIndex:"250"},onKeyDown:T,align:"start",ref:g,children:[s.jsx(gp,{handleSort:()=>console.log("sorting"),handleLocationHistory:()=>console.log("location history"),handleBookmarks:()=>console.log("bookmarks")}),ua.map((N,A)=>x(N).length>0&&s.jsxs("div",{children:[s.jsx(Zr,{className:"pr-font-semibold pr-text-foreground/80",children:bp[N]}),x(N).map(D=>s.jsx("div",{children:s.jsx(mp,{bookId:D,handleSelectBook:()=>w(D,!1),isSelected:o===D,handleHighlightBook:()=>d(D),handleKeyDown:P,bookType:N,ref:J=>{o===D&&(b.current=J)},children:s.jsx(hp,{handleSelectChapter:j,endChapter:st(D),activeChapter:e.bookNum===de.bookIdToNumber(D)?e.chapterNum:0,highlightedChapter:i,handleHighlightedChapter:J=>{l(J)}})})},D)),ua.length-1!==A?s.jsx(jt,{}):void 0]},N))]})]})})}const Os=sn.cva("pr-twp pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50",{variants:{variant:{default:"pr-bg-primary pr-text-primary-foreground hover:pr-bg-primary/90",destructive:"pr-bg-destructive pr-text-destructive-foreground hover:pr-bg-destructive/90",outline:"pr-border pr-border-input pr-bg-background hover:pr-bg-accent hover:pr-text-accent-foreground",secondary:"pr-bg-secondary pr-text-secondary-foreground hover:pr-bg-secondary/80",ghost:"hover:pr-bg-accent hover:pr-text-accent-foreground",link:"pr-text-primary pr-underline-offset-4 hover:pr-underline"},size:{default:"pr-h-10 pr-px-4 pr-py-2",sm:"pr-h-9 pr-rounded-md pr-px-3",lg:"pr-h-11 pr-rounded-md pr-px-8",icon:"pr-h-10 pr-w-10"}},defaultVariants:{variant:"default",size:"default"}}),ve=y.forwardRef(({className:e,variant:r,size:t,asChild:n=!1,...o},a)=>{const i=n?Al.Slot:"button";return s.jsx(i,{className:O(Os({variant:r,size:t,className:e})),ref:a,...o})});ve.displayName="Button";const Sp=sn.cva("pr-text-sm pr-font-medium pr-leading-none peer-disabled:pr-cursor-not-allowed peer-disabled:pr-opacity-70"),qe=y.forwardRef(({className:e,...r},t)=>s.jsx(gs.Root,{ref:t,className:O("pr-twp",Sp(),e),...r}));qe.displayName=gs.Root.displayName;const go=y.forwardRef(({className:e,...r},t)=>s.jsx(xt.Root,{className:O("pr-twp pr-grid pr-gap-2",e),...r,ref:t}));go.displayName=xt.Root.displayName;const Zt=y.forwardRef(({className:e,...r},t)=>s.jsx(xt.Item,{ref:t,className:O("pr-twp pr-aspect-square pr-h-4 pr-w-4 pr-rounded-full pr-border pr-border-primary pr-text-primary pr-ring-offset-background focus:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50",e),...r,children:s.jsx(xt.Indicator,{className:"pr-flex pr-items-center pr-justify-center",children:s.jsx(ne.Circle,{className:"pr-h-2.5 pr-w-2.5 pr-fill-current pr-text-current"})})}));Zt.displayName=xt.Item.displayName;const Tp=kt.Root,Cp=kt.Trigger,Rs=y.forwardRef(({className:e,align:r="center",sideOffset:t=4,...n},o)=>s.jsx(kt.Portal,{children:s.jsx(kt.Content,{ref:o,align:r,sideOffset:t,className:O("pr-twp pr-z-50 pr-w-72 pr-rounded-md pr-border pr-bg-popover pr-p-4 pr-text-popover-foreground pr-shadow-md pr-outline-none data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2",e),...n})}));Rs.displayName=kt.Content.displayName;const jp=We.Portal,Ps=y.forwardRef(({className:e,...r},t)=>s.jsx(We.Overlay,{ref:t,className:O("pr- pr-fixed pr-inset-0 pr-z-50 pr-bg-black/80 data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0",e),...r}));Ps.displayName=We.Overlay.displayName;const Op=y.forwardRef(({className:e,children:r,...t},n)=>s.jsxs(jp,{children:[s.jsx(Ps,{}),s.jsxs(We.Content,{ref:n,className:O("pr-fixed pr-left-[50%] pr-top-[50%] pr-z-50 pr-grid pr-w-full pr-max-w-lg pr-translate-x-[-50%] pr-translate-y-[-50%] pr-gap-4 pr-border pr-bg-background pr-p-6 pr-shadow-lg pr-duration-200 data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[state=closed]:pr-slide-out-to-left-1/2 data-[state=closed]:pr-slide-out-to-top-[48%] data-[state=open]:pr-slide-in-from-left-1/2 data-[state=open]:pr-slide-in-from-top-[48%] sm:pr-rounded-lg",e),...t,children:[r,s.jsxs(We.Close,{className:"pr-absolute pr-right-4 pr-top-4 pr-rounded-sm pr-opacity-70 pr-ring-offset-background pr-transition-opacity hover:pr-opacity-100 focus:pr-outline-none focus:pr-ring-2 focus:pr-ring-ring focus:pr-ring-offset-2 disabled:pr-pointer-events-none data-[state=open]:pr-bg-accent data-[state=open]:pr-text-muted-foreground",children:[s.jsx(ne.X,{className:"pr-h-4 pr-w-4"}),s.jsx("span",{className:"pr-sr-only",children:"Close"})]})]})]}));Op.displayName=We.Content.displayName;const Rp=y.forwardRef(({className:e,...r},t)=>s.jsx(We.Title,{ref:t,className:O("pr-text-lg pr-font-semibold pr-leading-none pr-tracking-tight",e),...r}));Rp.displayName=We.Title.displayName;const Pp=y.forwardRef(({className:e,...r},t)=>s.jsx(We.Description,{ref:t,className:O("pr-text-sm pr-text-muted-foreground",e),...r}));Pp.displayName=We.Description.displayName;const _s=y.forwardRef(({className:e,...r},t)=>s.jsx(Oe.Command,{ref:t,className:O("pr-flex pr-h-full pr-w-full pr-flex-col pr-overflow-hidden pr-rounded-md pr-bg-popover pr-text-popover-foreground",e),...r}));_s.displayName=Oe.Command.displayName;const $s=y.forwardRef(({className:e,...r},t)=>s.jsxs("div",{className:"pr-flex pr-items-center pr-border-b pr-px-3",children:[s.jsx(ne.Search,{className:"pr-me-2 pr-h-4 pr-w-4 pr-shrink-0 pr-opacity-50"}),s.jsx(Oe.Command.Input,{ref:t,className:O("pr-flex pr-h-11 pr-w-full pr-rounded-md pr-bg-transparent pr-py-3 pr-text-sm pr-outline-none placeholder:pr-text-muted-foreground disabled:pr-cursor-not-allowed disabled:pr-opacity-50",e),...r})]}));$s.displayName=Oe.Command.Input.displayName;const Is=y.forwardRef(({className:e,...r},t)=>s.jsx(Oe.Command.List,{ref:t,className:O("pr-max-h-[300px] pr-overflow-y-auto pr-overflow-x-hidden",e),...r}));Is.displayName=Oe.Command.List.displayName;const Ms=y.forwardRef((e,r)=>s.jsx(Oe.Command.Empty,{ref:r,className:"pr-py-6 pr-text-center pr-text-sm",...e}));Ms.displayName=Oe.Command.Empty.displayName;const _p=y.forwardRef(({className:e,...r},t)=>s.jsx(Oe.Command.Group,{ref:t,className:O("pr-overflow-hidden pr-p-1 pr-text-foreground [&_[cmdk-group-heading]]:pr-px-2 [&_[cmdk-group-heading]]:pr-py-1.5 [&_[cmdk-group-heading]]:pr-text-xs [&_[cmdk-group-heading]]:pr-font-medium [&_[cmdk-group-heading]]:pr-text-muted-foreground",e),...r}));_p.displayName=Oe.Command.Group.displayName;const $p=y.forwardRef(({className:e,...r},t)=>s.jsx(Oe.Command.Separator,{ref:t,className:O("pr--mx-1 pr-h-px pr-bg-border",e),...r}));$p.displayName=Oe.Command.Separator.displayName;const Ds=y.forwardRef(({className:e,...r},t)=>s.jsx(Oe.Command.Item,{ref:t,className:O("pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none data-[disabled=true]:pr-pointer-events-none data-[selected=true]:pr-bg-accent data-[selected=true]:pr-text-accent-foreground data-[disabled=true]:pr-opacity-50",e),...r}));Ds.displayName=Oe.Command.Item.displayName;function Ip(e){return typeof e=="string"?e:typeof e=="number"?e.toString():e.label}function Jn({id:e,options:r=[],className:t,value:n,onChange:o=()=>{},getOptionLabel:a=Ip,buttonPlaceholder:i="",textPlaceholder:l="",commandEmptyMessage:c="No option found",buttonVariant:d="outline",dir:u="ltr",isDisabled:v=!1,...p}){const[h,f]=y.useState(!1);return s.jsxs(Tp,{open:h,onOpenChange:f,...p,children:[s.jsx(Cp,{asChild:!0,children:s.jsxs(ve,{variant:d,role:"combobox","aria-expanded":h,id:e,className:O("pr-w-[200px] pr-justify-between",t),disabled:v,children:[s.jsx("span",{className:"pr-overflow-hidden pr-text-ellipsis pr-whitespace-nowrap",children:n?a(n):i}),s.jsx(ne.ChevronsUpDown,{className:"pr-ms-2 pr-h-4 pr-w-4 pr-shrink-0 pr-opacity-50"})]})}),s.jsx(Rs,{className:"pr-w-[200px] pr-p-0",dir:u,children:s.jsxs(_s,{children:[s.jsx($s,{dir:u,placeholder:l,className:"pr-text-inherit"}),s.jsx(Ms,{children:c}),s.jsx(Is,{children:r.map(g=>s.jsxs(Ds,{value:a(g),onSelect:()=>{o(g),f(!1)},children:[s.jsx(ne.Check,{className:O("pr-me-2 pr-h-4 pr-w-4",{"pr-opacity-0":!n||a(n)!==a(g)})}),a(g)]},a(g)))})]})})]})}function As({startChapter:e,endChapter:r,handleSelectStartChapter:t,handleSelectEndChapter:n,isDisabled:o=!1,chapterCount:a}){const i=y.useMemo(()=>Array.from({length:a},(d,u)=>u+1),[a]),l=d=>{t(d),d>r&&n(d)},c=d=>{n(d),dd.toString(),value:e},"start chapter"),s.jsx(qe,{htmlFor:"end-chapters-combobox",children:"to"}),s.jsx(Jn,{isDisabled:o,onChange:c,className:"pr-ml-2 pr-w-20",options:i,getOptionLabel:d=>d.toString(),value:r},"end chapter")]})}var Bs=(e=>(e.CURRENT_BOOK="current book",e.CHOOSE_BOOKS="choose books",e))(Bs||{});const Mp=Object.freeze(["%webView_bookSelector_currentBook%","%webView_bookSelector_choose%","%webView_bookSelector_chooseBooks%"]),Pn=(e,r)=>e[r]??r;function Dp({handleBookSelectionModeChange:e,currentBookName:r,onSelectBooks:t,selectedBookIds:n,chapterCount:o,endChapter:a,handleSelectEndChapter:i,startChapter:l,handleSelectStartChapter:c,localizedStrings:d}){const u=Pn(d,"%webView_bookSelector_currentBook%"),v=Pn(d,"%webView_bookSelector_choose%"),p=Pn(d,"%webView_bookSelector_chooseBooks%"),[h,f]=y.useState("current book"),g=b=>{f(b),e(b)};return s.jsx(go,{className:"pr-twp pr-flex",value:h,onValueChange:b=>g(b),children:s.jsxs("div",{className:"pr-flex pr-w-full pr-flex-col pr-gap-4",children:[s.jsxs("div",{className:"pr-grid pr-grid-cols-[25%,25%,50%]",children:[s.jsxs("div",{className:"pr-flex pr-items-center",children:[s.jsx(Zt,{value:"current book"}),s.jsx(qe,{className:"pr-ml-1",children:u})]}),s.jsx(qe,{className:"pr-flex pr-items-center",children:r}),s.jsx("div",{className:"pr-flex pr-items-center pr-justify-end",children:s.jsx(As,{isDisabled:h==="choose books",handleSelectStartChapter:c,handleSelectEndChapter:i,chapterCount:o,startChapter:l,endChapter:a})})]}),s.jsxs("div",{className:"pr-grid pr-grid-cols-[25%,50%,25%]",children:[s.jsxs("div",{className:"pr-flex pr-items-center",children:[s.jsx(Zt,{value:"choose books"}),s.jsx(qe,{className:"pr-ml-1",children:p})]}),s.jsx(qe,{className:"pr-flex pr-items-center",children:n.map(b=>de.bookIdToEnglishName(b)).join(", ")}),s.jsx(ve,{disabled:h==="current book",onClick:()=>t(),children:v})]})]})})}function Ap({table:e}){return s.jsxs(pn,{children:[s.jsx(ms.DropdownMenuTrigger,{asChild:!0,children:s.jsxs(ve,{variant:"outline",size:"sm",className:"pr-ml-auto pr-hidden pr-h-8 lg:pr-flex",children:[s.jsx(ne.FilterIcon,{className:"pr-mr-2 pr-h-4 pr-w-4"}),"View"]})}),s.jsxs(Ct,{align:"end",className:"pr-w-[150px]",children:[s.jsx(Zr,{children:"Toggle columns"}),s.jsx(jt,{}),e.getAllColumns().filter(r=>r.getCanHide()).map(r=>s.jsx(cn,{className:"pr-capitalize",checked:r.getIsVisible(),onCheckedChange:t=>r.toggleVisibility(!!t),children:r.id},r.id))]})]})}const Fr=be.Root,Ls=be.Group,zr=be.Value,Nr=y.forwardRef(({className:e,children:r,...t},n)=>s.jsxs(be.Trigger,{ref:n,className:O("pr-flex pr-h-10 pr-w-full pr-items-center pr-justify-between pr-rounded-md pr-border pr-border-input pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background placeholder:pr-text-muted-foreground focus:pr-outline-none focus:pr-ring-2 focus:pr-ring-ring focus:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50 [&>span]:pr-line-clamp-1",e),...t,children:[r,s.jsx(be.Icon,{asChild:!0,children:s.jsx(ne.ChevronDown,{className:"pr-h-4 pr-w-4 pr-opacity-50"})})]}));Nr.displayName=be.Trigger.displayName;const bo=y.forwardRef(({className:e,...r},t)=>s.jsx(be.ScrollUpButton,{ref:t,className:O("pr-flex pr-cursor-default pr-items-center pr-justify-center pr-py-1",e),...r,children:s.jsx(ne.ChevronUp,{className:"pr-h-4 pr-w-4"})}));bo.displayName=be.ScrollUpButton.displayName;const vo=y.forwardRef(({className:e,...r},t)=>s.jsx(be.ScrollDownButton,{ref:t,className:O("pr-flex pr-cursor-default pr-items-center pr-justify-center pr-py-1",e),...r,children:s.jsx(ne.ChevronDown,{className:"pr-h-4 pr-w-4"})}));vo.displayName=be.ScrollDownButton.displayName;const Er=y.forwardRef(({className:e,children:r,position:t="popper",...n},o)=>s.jsx(be.Portal,{children:s.jsxs(be.Content,{ref:o,className:O("pr-twp pr-relative pr-z-50 pr-max-h-96 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-text-popover-foreground pr-shadow-md data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2",t==="popper"&&"data-[side=bottom]:pr-translate-y-1 data-[side=left]:pr--translate-x-1 data-[side=right]:pr-translate-x-1 data-[side=top]:pr--translate-y-1",e),position:t,...n,children:[s.jsx(bo,{}),s.jsx(be.Viewport,{className:O("pr-p-1",t==="popper"&&"pr-h-[var(--radix-select-trigger-height)] pr-w-full pr-min-w-[var(--radix-select-trigger-width)]"),children:r}),s.jsx(vo,{})]})}));Er.displayName=be.Content.displayName;const Vs=y.forwardRef(({className:e,...r},t)=>s.jsx(be.Label,{ref:t,className:O("pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-font-semibold",e),...r}));Vs.displayName=be.Label.displayName;const Ae=y.forwardRef(({className:e,children:r,...t},n)=>s.jsxs(be.Item,{ref:n,className:O("pr-relative pr-flex pr-w-full pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50",e),...t,children:[s.jsx("span",{className:"pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center",children:s.jsx(be.ItemIndicator,{children:s.jsx(ne.Check,{className:"pr-h-4 pr-w-4"})})}),s.jsx(be.ItemText,{children:r})]}));Ae.displayName=be.Item.displayName;const Fs=y.forwardRef(({className:e,...r},t)=>s.jsx(be.Separator,{ref:t,className:O("pr--mx-1 pr-my-1 pr-h-px pr-bg-muted",e),...r}));Fs.displayName=be.Separator.displayName;function Bp({table:e}){return s.jsx("div",{className:"pr-flex pr-items-center pr-justify-between pr-px-2 pr-pb-3 pr-pt-3",children:s.jsxs("div",{className:"pr-flex pr-items-center pr-space-x-6 lg:pr-space-x-8",children:[s.jsxs("div",{className:"pr-flex-1 pr-text-sm pr-text-muted-foreground",children:[e.getFilteredSelectedRowModel().rows.length," of"," ",e.getFilteredRowModel().rows.length," row(s) selected"]}),s.jsxs("div",{className:"pr-flex pr-items-center pr-space-x-2",children:[s.jsx("p",{className:"pr-text-nowrap pr-text-sm pr-font-medium",children:"Rows per page"}),s.jsxs(Fr,{value:`${e.getState().pagination.pageSize}`,onValueChange:r=>{e.setPageSize(Number(r))},children:[s.jsx(Nr,{className:"pr-h-8 pr-w-[70px]",children:s.jsx(zr,{placeholder:e.getState().pagination.pageSize})}),s.jsx(Er,{side:"top",children:[10,20,30,40,50].map(r=>s.jsx(Ae,{value:`${r}`,children:r},r))})]})]}),s.jsxs("div",{className:"pr-flex pr-w-[100px] pr-items-center pr-justify-center pr-text-sm pr-font-medium",children:["Page ",e.getState().pagination.pageIndex+1," of ",e.getPageCount()]}),s.jsxs("div",{className:"pr-flex pr-items-center pr-space-x-2",children:[s.jsxs(ve,{variant:"outline",size:"icon",className:"pr-hidden pr-h-8 pr-w-8 pr-p-0 lg:pr-flex",onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:[s.jsx("span",{className:"pr-sr-only",children:"Go to first page"}),s.jsx(ne.ArrowLeftIcon,{className:"pr-h-4 pr-w-4"})]}),s.jsxs(ve,{variant:"outline",size:"icon",className:"pr-h-8 pr-w-8 pr-p-0",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:[s.jsx("span",{className:"pr-sr-only",children:"Go to previous page"}),s.jsx(ne.ChevronLeftIcon,{className:"pr-h-4 pr-w-4"})]}),s.jsxs(ve,{variant:"outline",size:"icon",className:"pr-h-8 pr-w-8 pr-p-0",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:[s.jsx("span",{className:"pr-sr-only",children:"Go to next page"}),s.jsx(ne.ChevronRightIcon,{className:"pr-h-4 pr-w-4"})]}),s.jsxs(ve,{variant:"outline",size:"icon",className:"pr-hidden pr-h-8 pr-w-8 pr-p-0 lg:pr-flex",onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:[s.jsx("span",{className:"pr-sr-only",children:"Go to last page"}),s.jsx(ne.ArrowRightIcon,{className:"pr-h-4 pr-w-4"})]})]})]})})}const Ot=y.forwardRef(({className:e,stickyHeader:r,...t},n)=>s.jsx("div",{className:O("pr-twp pr-relative pr-w-full",{"pr-overflow-auto":!r}),children:s.jsx("table",{ref:n,className:O("pr-w-full pr-caption-bottom pr-text-sm",e),...t})}));Ot.displayName="Table";const Rt=y.forwardRef(({className:e,stickyHeader:r,...t},n)=>s.jsx("thead",{ref:n,className:O({"pr-sticky pr-top-0 pr-bg-muted":r},"[&_tr]:pr-border-b",e),...t}));Rt.displayName="TableHeader";const Pt=y.forwardRef(({className:e,...r},t)=>s.jsx("tbody",{ref:t,className:O("[&_tr:last-child]:pr-border-0",e),...r}));Pt.displayName="TableBody";const zs=y.forwardRef(({className:e,...r},t)=>s.jsx("tfoot",{ref:t,className:O("pr-border-t pr-bg-muted/50 pr-font-medium [&>tr]:last:pr-border-b-0",e),...r}));zs.displayName="TableFooter";const Qe=y.forwardRef(({className:e,...r},t)=>s.jsx("tr",{ref:t,className:O("pr-border-b pr-transition-colors hover:pr-bg-muted/50 data-[state=selected]:pr-bg-muted",e),...r}));Qe.displayName="TableRow";const Gr=y.forwardRef(({className:e,...r},t)=>s.jsx("th",{ref:t,className:O("pr-h-12 pr-px-4 pr-text-start pr-align-middle pr-font-medium pr-text-muted-foreground [&:has([role=checkbox])]:pr-pe-0",e),...r}));Gr.displayName="TableHead";const Sr=y.forwardRef(({className:e,...r},t)=>s.jsx("td",{ref:t,className:O("pr-p-4 pr-align-middle [&:has([role=checkbox])]:pr-pe-0",e),...r}));Sr.displayName="TableCell";const Gs=y.forwardRef(({className:e,...r},t)=>s.jsx("caption",{ref:t,className:O("pr-mt-4 pr-text-sm pr-text-muted-foreground",e),...r}));Gs.displayName="TableCaption";function Us({columns:e,data:r,enablePagination:t=!1,showPaginationControls:n=!1,showColumnVisibilityControls:o=!1,stickyHeader:a=!1,onRowClickHandler:i=()=>{}}){var b;const[l,c]=y.useState([]),[d,u]=y.useState([]),[v,p]=y.useState({}),[h,f]=y.useState({}),g=Ne.useReactTable({data:r,columns:e,getCoreRowModel:Ne.getCoreRowModel(),...t&&{getPaginationRowModel:Ne.getPaginationRowModel()},onSortingChange:c,getSortedRowModel:Ne.getSortedRowModel(),onColumnFiltersChange:u,getFilteredRowModel:Ne.getFilteredRowModel(),onColumnVisibilityChange:p,onRowSelectionChange:f,state:{sorting:l,columnFilters:d,columnVisibility:v,rowSelection:h}});return s.jsxs("div",{className:"pr-twp",children:[o&&s.jsx(Ap,{table:g}),s.jsxs(Ot,{stickyHeader:a,children:[s.jsx(Rt,{stickyHeader:a,children:g.getHeaderGroups().map(x=>s.jsx(Qe,{children:x.headers.map(C=>s.jsx(Gr,{children:C.isPlaceholder?void 0:Ne.flexRender(C.column.columnDef.header,C.getContext())},C.id))},x.id))}),s.jsx(Pt,{children:(b=g.getRowModel().rows)!=null&&b.length?g.getRowModel().rows.map(x=>s.jsx(Qe,{onClick:()=>i(x,g),"data-state":x.getIsSelected()&&"selected",children:x.getVisibleCells().map(C=>s.jsx(Sr,{children:Ne.flexRender(C.column.columnDef.cell,C.getContext())},C.id))},x.id)):s.jsx(Qe,{children:s.jsx(Sr,{colSpan:e.length,className:"pr-h-24 pr-text-center",children:"No results."})})})]}),t&&s.jsxs("div",{className:"pr-flex pr-items-center pr-justify-end pr-space-x-2 pr-py-4",children:[s.jsx(ve,{variant:"outline",size:"sm",onClick:()=>g.previousPage(),disabled:!g.getCanPreviousPage(),children:"Previous"}),s.jsx(ve,{variant:"outline",size:"sm",onClick:()=>g.nextPage(),disabled:!g.getCanNextPage(),children:"Next"})]}),t&&n&&s.jsx(Bp,{table:g})]})}const Lp=e=>e.split(/(?:\r?\n|\r)|(?=(?:\\(?:v|c|id)))/g),fa=e=>{const r=/^\\[vc]\s+(\d+)/,t=e.match(r);if(t)return+t[1]},ma=(e,r,t,n)=>{if(!e||e===""||r==="")return[];const o=[],a=Lp(e);let i=n.chapterNum,l=n.verseNum,c=0;return a.forEach(d=>{d.startsWith("\\id")&&(i=0,l=0),d.startsWith("\\c")&&(i=fa(d),l=0),d.startsWith("\\v")&&(l=fa(d),i===0&&(i=n.chapterNum));const u=t(d,r);for(let v=0;vd(ma(r,e,t,n)),[r,e,n,t]),s.jsxs(Ot,{stickyHeader:!0,children:[s.jsx(Rt,{stickyHeader:!0,children:s.jsxs(Qe,{children:[s.jsx(Gr,{children:i}),s.jsx(Gr,{children:l})]})}),s.jsx(Pt,{children:c.map(u=>s.jsxs(Qe,{onClick:()=>{o(u.reference)},children:[s.jsx(Sr,{children:`${de.bookNumberToEnglishName(u.reference.bookNum)} ${u.reference.chapterNum}:${u.reference.verseNum}`}),s.jsx(Sr,{children:u.snippet})]},u.key))})]})}const Fp=Object.freeze(["%webView_inventory_all%","%webView_inventory_approved%","%webView_inventory_unapproved%","%webView_inventory_unknown%","%webView_inventory_scope_currentBook%","%webView_inventory_scope_chapter%","%webView_inventory_scope_verse%","%webView_inventory_filter_text%","%webView_inventory_occurrences_table_header_reference%","%webView_inventory_occurrences_table_header_occurrence%"]),dn=e=>e==="asc"?s.jsx(ne.ArrowUpIcon,{className:"pr-ms-2 pr-h-4 pr-w-4"}):e==="desc"?s.jsx(ne.ArrowDownIcon,{className:"pr-ms-2 pr-h-4 pr-w-4"}):s.jsx(ne.ArrowUpDownIcon,{className:"pr-ms-2 pr-h-4 pr-w-4"}),zp=(e,r,t)=>{let n=e;return r!=="all"&&(n=n.filter(o=>r==="approved"&&o.status==="approved"||r==="unapproved"&&o.status==="unapproved"||r==="unknown"&&o.status==="unknown")),t!==""&&(n=n.filter(o=>o.item.includes(t))),n},Gp=(e,r,t)=>{const n=[],o=r(e);for(let a=0;ac.item===i);if(l)l.count+=1;else{const c={item:i,count:1,status:t(i)};n.push(c)}}return n},or=(e,r)=>e[r]??r;function Up({scriptureReference:e,setScriptureReference:r,localizedStrings:t,extractItems:n,approvedItems:o,onApprovedItemsChange:a,unapprovedItems:i,onUnapprovedItemsChange:l,text:c,scope:d,onScopeChange:u,getColumns:v}){const p=or(t,"%webView_inventory_all%"),h=or(t,"%webView_inventory_approved%"),f=or(t,"%webView_inventory_unapproved%"),g=or(t,"%webView_inventory_unknown%"),b=or(t,"%webView_inventory_scope_currentBook%"),x=or(t,"%webView_inventory_scope_chapter%"),C=or(t,"%webView_inventory_scope_verse%"),S=or(t,"%webView_inventory_filter_text%"),[k,w]=y.useState([]),[j,R]=y.useState("all"),[B,T]=y.useState(""),[P,N]=y.useState(""),A=y.useCallback((V,E)=>{w(z=>{let F=[];return V.forEach(W=>{F=z.map(G=>G.item===W&&G.status!==E?{...G,status:E}:G)}),F});let $=[...o];V.forEach(z=>{E==="approved"?$.includes(z)||$.push(z):$=$.filter(F=>F!==z)}),a($);let q=[...i];V.forEach(z=>{E==="unapproved"?q.includes(z)||q.push(z):q=q.filter(F=>F!==z)}),l(q)},[o,a,i,l]),D=y.useCallback(V=>o.includes(V)?"approved":i.includes(V)?"unapproved":"unknown",[o,i]);y.useEffect(()=>{c&&w(Gp(c,n,D))},[n,c,D]);const J=y.useMemo(()=>zp(k,j,B),[k,j,B]);y.useEffect(()=>{N("")},[J]);const K=(V,E)=>{E.toggleAllRowsSelected(!1),V.toggleSelected(void 0),N(V.getValue("item"))},H=y.useMemo(()=>v(A),[v,A]),te=V=>{if(V==="book"||V==="chapter"||V==="verse")u(V);else throw new Error(`Invalid scope value: ${V}`)},se=V=>{if(V==="all"||V==="approved"||V==="unapproved"||V==="unknown")R(V);else throw new Error(`Invalid status filter value: ${V}`)};return s.jsxs("div",{className:"pr-twp pr-flex pr-h-full pr-flex-col",children:[s.jsxs("div",{className:"pr-flex",children:[s.jsxs(Fr,{onValueChange:V=>se(V),defaultValue:j,children:[s.jsx(Nr,{className:"pr-m-1",children:s.jsx(zr,{placeholder:"Select filter"})}),s.jsxs(Er,{children:[s.jsx(Ae,{value:"all",children:p}),s.jsx(Ae,{value:"approved",children:h}),s.jsx(Ae,{value:"unapproved",children:f}),s.jsx(Ae,{value:"unknown",children:g})]})]}),s.jsxs(Fr,{onValueChange:V=>te(V),defaultValue:d,children:[s.jsx(Nr,{className:"pr-m-1",children:s.jsx(zr,{placeholder:"Select scope"})}),s.jsxs(Er,{children:[s.jsx(Ae,{value:"book",children:b}),s.jsx(Ae,{value:"chapter",children:x}),s.jsx(Ae,{value:"verse",children:C})]})]}),s.jsx(Kr,{className:"pr-m-1 pr-rounded-md pr-border",placeholder:S,value:B,onChange:V=>{T(V.target.value)}})]}),s.jsx("div",{className:"pr-m-1 pr-flex-1 pr-overflow-auto pr-rounded-md pr-border",children:s.jsx(Us,{columns:H,data:J,onRowClickHandler:K,stickyHeader:!0})}),P!==""&&s.jsx("div",{className:"pr-m-1 pr-flex-1 pr-overflow-auto pr-rounded-md pr-border",children:s.jsx(Vp,{selectedItem:P,text:c,extractItems:n,scriptureReference:e,setScriptureReference:V=>r(V),localizedStrings:t})})]})}const Hs=sn.cva("pr-twp pr-inline-flex pr-items-center pr-justify-center pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors hover:pr-bg-muted hover:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=on]:pr-bg-accent data-[state=on]:pr-text-accent-foreground",{variants:{variant:{default:"pr-bg-transparent",outline:"pr-border pr-border-input pr-bg-transparent hover:pr-bg-accent hover:pr-text-accent-foreground"},size:{default:"pr-h-10 pr-px-3",sm:"pr-h-9 pr-px-2.5",lg:"pr-h-11 pr-px-5"}},defaultVariants:{variant:"default",size:"default"}}),Hp=y.forwardRef(({className:e,variant:r,size:t,...n},o)=>s.jsx(bs.Root,{ref:o,className:O(Hs({variant:r,size:t,className:e})),...n}));Hp.displayName=bs.Root.displayName;const qs=y.createContext({size:"default",variant:"default"}),wo=y.forwardRef(({className:e,variant:r,size:t,children:n,...o},a)=>s.jsx(ln.Root,{ref:a,className:O("pr-twp pr-flex pr-items-center pr-justify-center pr-gap-1",e),...o,children:s.jsx(qs.Provider,{value:{variant:r,size:t},children:n})}));wo.displayName=ln.Root.displayName;const bt=y.forwardRef(({className:e,children:r,variant:t,size:n,...o},a)=>{const i=y.useContext(qs);return s.jsx(ln.Item,{ref:a,className:O(Hs({variant:i.variant||t,size:i.size||n}),e),...o,children:r})});bt.displayName=ln.Item.displayName;const qp=e=>({accessorKey:"item",header:({column:r})=>s.jsxs(ve,{variant:"ghost",onClick:()=>r.toggleSorting(void 0),children:[e,dn(r.getIsSorted())]})}),Xp=e=>({accessorKey:"count",header:({column:r})=>s.jsx("div",{className:"pr-flex pr-justify-end pr-tabular-nums",children:s.jsxs(ve,{variant:"ghost",onClick:()=>r.toggleSorting(void 0),children:[e,dn(r.getIsSorted())]})}),cell:({row:r})=>s.jsx("div",{className:"pr-flex pr-justify-end",children:r.getValue("count")})}),Wp=(e,r)=>({accessorKey:"status",header:({column:t})=>s.jsx("div",{className:"pr-flex pr-justify-center",children:s.jsxs(ve,{variant:"ghost",onClick:()=>t.toggleSorting(void 0),children:[e,dn(t.getIsSorted())]})}),cell:({row:t})=>{const n=t.getValue("status"),o=t.getValue("item");return s.jsxs(wo,{value:n,variant:"outline",type:"single",children:[s.jsx(bt,{onClick:()=>r([o],"approved"),value:"approved",children:s.jsx(ne.CircleCheckIcon,{})}),s.jsx(bt,{onClick:()=>r([o],"unapproved"),value:"unapproved",children:s.jsx(ne.CircleXIcon,{})}),s.jsx(bt,{onClick:()=>r([o],"unknown"),value:"unknown",children:s.jsx(ne.CircleHelpIcon,{})})]})}});function Xs({onSearch:e,placeholder:r,isFullWidth:t}){const[n,o]=y.useState(""),a=i=>{o(i),e(i)};return s.jsx(Kr,{className:O("pr-flex pr-h-10 pr-rounded-md pr-border pr-border-input pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background file:pr-border-0 file:pr-bg-transparent file:pr-text-sm file:pr-font-medium placeholder:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-[color:hsl(240,5%,64.9%)] focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50",{"pr-w-full":t}),placeholder:r,value:n,onChange:i=>a(i.target.value)})}const yo=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.Root,{orientation:"vertical",ref:t,className:O("pr-flex pr-gap-1 pr-rounded-md pr-text-muted-foreground",e),...r}));yo.displayName=Re.List.displayName;const xo=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.List,{ref:t,className:O("pr-flex-fit pr-mlk-items-center pr-w-[124px] pr-justify-center pr-rounded-md pr-bg-muted pr-p-1 pr-text-muted-foreground",e),...r}));xo.displayName=Re.List.displayName;const Ws=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.Trigger,{ref:t,...r,className:O("overflow-clip pr-inline-flex pr-w-[116px] pr-cursor-pointer pr-items-center pr-justify-center pr-break-words pr-rounded-sm pr-border-0 pr-bg-muted pr-px-3 pr-py-1.5 pr-text-sm pr-font-medium pr-text-inherit pr-ring-offset-background pr-transition-all hover:pr-text-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=active]:pr-bg-background data-[state=active]:pr-text-foreground data-[state=active]:pr-shadow-sm",e)})),ko=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.Content,{ref:t,className:O("mt-2 pr-ms-5 pr-flex-grow pr-text-foreground pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2",e),...r}));ko.displayName=Re.Content.displayName;function Yp({tabList:e,onSearch:r,searchPlaceholder:t,headerTitle:n,isSearchBarFullWidth:o=!1,direction:a="ltr"}){return s.jsxs("div",{className:"pr-twp",children:[s.jsxs("div",{className:"pr-sticky pr-top-0 pr-space-y-2 pr-pb-2",children:[n?s.jsx("h1",{children:n}):"",s.jsx(Xs,{isFullWidth:o,onSearch:r,placeholder:t})]}),s.jsxs(yo,{dir:a,children:[s.jsx(xo,{children:e.map(i=>s.jsx(Ws,{value:i.value,children:i.value},i.key))}),e.map(i=>s.jsx(ko,{value:i.value,children:i.content},i.key))]})]})}const ir="scrBook",Kp="scrRef",gr="source",Jp="details",Zp="Scripture Reference",Qp="Scripture Book",Ys="Type",ec="Details";function rc(e,r){const t=r??!1;return[{accessorFn:n=>`${de.bookNumberToId(n.start.bookNum)} ${n.start.chapterNum}:${n.start.verseNum}`,id:ir,header:(e==null?void 0:e.scriptureReferenceColumnName)??Zp,cell:n=>{const o=n.row.original;return n.row.getIsGrouped()?de.bookNumberToEnglishName(o.start.bookNum):n.row.groupingColumnId===ir?ee.formatScrRef(o.start):void 0},getGroupingValue:n=>n.start.bookNum,sortingFn:(n,o)=>ee.compareScrRefs(n.original.start,o.original.start),enableGrouping:!0},{accessorFn:n=>ee.formatScrRef(n.start),id:Kp,header:void 0,cell:n=>{const o=n.row.original;return n.row.getIsGrouped()?void 0:ee.formatScrRef(o.start)},sortingFn:(n,o)=>ee.compareScrRefs(n.original.start,o.original.start),enableGrouping:!1},{accessorFn:n=>n.source.displayName,id:gr,header:t?(e==null?void 0:e.typeColumnName)??Ys:void 0,cell:n=>t||n.row.getIsGrouped()?n.getValue():void 0,getGroupingValue:n=>n.source.id,sortingFn:(n,o)=>n.original.source.displayName.localeCompare(o.original.source.displayName),enableGrouping:!0},{accessorFn:n=>n.detail,id:Jp,header:(e==null?void 0:e.detailsColumnName)??ec,cell:n=>n.getValue(),enableGrouping:!1}]}const tc=e=>{if(!("offset"in e.start))throw new Error("No offset available in range start");if(e.end&&!("offset"in e.end))throw new Error("No offset available in range end");const{offset:r}=e.start;let t=0;return e.end&&({offset:t}=e.end),!e.end||ee.compareScrRefs(e.start,e.end)===0?`${ee.scrRefToBBBCCCVVV(e.start)}+${r}`:`${ee.scrRefToBBBCCCVVV(e.start)}+${r}-${ee.scrRefToBBBCCCVVV(e.end)}+${t}`},ha=e=>`${tc({start:e.start,end:e.end})} ${e.source.displayName} ${e.detail}`;function nc({sources:e,showColumnHeaders:r=!1,showSourceColumn:t=!1,scriptureReferenceColumnName:n,scriptureBookGroupName:o,typeColumnName:a,detailsColumnName:i,onRowSelected:l,direction:c="ltr"}){const[d,u]=y.useState([]),[v,p]=y.useState([{id:ir,desc:!1}]),[h,f]=y.useState({}),g=y.useMemo(()=>e.flatMap(T=>T.data.map(P=>({...P,source:T.source}))),[e]),b=y.useMemo(()=>rc({scriptureReferenceColumnName:n,typeColumnName:a,detailsColumnName:i},t),[n,a,i,t]);y.useEffect(()=>{d.includes(gr)?p([{id:gr,desc:!1},{id:ir,desc:!1}]):p([{id:ir,desc:!1}])},[d]);const x=Ne.useReactTable({data:g,columns:b,state:{grouping:d,sorting:v,rowSelection:h},onGroupingChange:u,onSortingChange:p,onRowSelectionChange:f,getExpandedRowModel:Ne.getExpandedRowModel(),getGroupedRowModel:Ne.getGroupedRowModel(),getCoreRowModel:Ne.getCoreRowModel(),getSortedRowModel:Ne.getSortedRowModel(),getRowId:ha,autoResetExpanded:!1,enableMultiRowSelection:!1,enableSubRowSelection:!1});y.useEffect(()=>{if(l){const T=x.getSelectedRowModel().rowsById,P=Object.keys(T);if(P.length===1){const N=g.find(A=>ha(A)===P[0])||void 0;N&&l(N)}}},[h,g,l,x]);const C=o??Qp,S=a??Ys,k=[{label:"No Grouping",value:[]},{label:`Group by ${C}`,value:[ir]},{label:`Group by ${S}`,value:[gr]},{label:`Group by ${C} and ${S}`,value:[ir,gr]},{label:`Group by ${S} and ${C}`,value:[gr,ir]}],w=T=>{u(JSON.parse(T))},j=(T,P)=>{!T.getIsGrouped()&&!T.getIsSelected()&&T.getToggleSelectedHandler()(P)},R=(T,P)=>T.getIsGrouped()?"":O("banded-row",P%2===0?"even":"odd"),B=(T,P,N)=>{if(!((T==null?void 0:T.length)===0||P.depth{w(T)},children:[s.jsx(Nr,{className:"pr-mb-1 pr-mt-2",children:s.jsx(zr,{})}),s.jsx(Er,{position:"item-aligned",children:s.jsx(Ls,{children:k.map(T=>s.jsx(Ae,{value:JSON.stringify(T.value),children:T.label},T.label))})})]}),s.jsxs(Ot,{className:"pr-relative pr-flex pr-flex-col pr-overflow-y-auto pr-p-0",children:[r&&s.jsx(Rt,{children:x.getHeaderGroups().map(T=>s.jsx(Qe,{children:T.headers.filter(P=>P.column.columnDef.header).map(P=>s.jsx(Gr,{colSpan:P.colSpan,className:"top-0 pr-sticky",children:P.isPlaceholder?void 0:s.jsxs("div",{children:[P.column.getCanGroup()?s.jsx(ve,{variant:"ghost",title:`Toggle grouping by ${P.column.columnDef.header}`,onClick:P.column.getToggleGroupingHandler(),type:"button",children:P.column.getIsGrouped()?"🛑":"👊 "}):void 0," ",Ne.flexRender(P.column.columnDef.header,P.getContext())]})},P.id))},T.id))}),s.jsx(Pt,{children:x.getRowModel().rows.map((T,P)=>s.jsx(Qe,{"data-state":T.getIsSelected()?"selected":"",className:O(R(T,P)),onClick:N=>j(T,N),children:T.getVisibleCells().map(N=>{if(!(N.getIsPlaceholder()||N.column.columnDef.enableGrouping&&!N.getIsGrouped()&&(N.column.columnDef.id!==gr||!t)))return s.jsx(Sr,{className:O(N.column.columnDef.id,"pr-p-[1px]",B(d,T,N)),children:(()=>N.getIsGrouped()?s.jsxs(ve,{variant:"link",onClick:T.getToggleExpandedHandler(),type:"button",children:[T.getIsExpanded()&&s.jsx(ne.ChevronDown,{}),!T.getIsExpanded()&&(c==="ltr"?s.jsx(ne.ChevronRight,{}):s.jsx(ne.ChevronLeft,{}))," ",Ne.flexRender(N.column.columnDef.cell,N.getContext())," (",T.subRows.length,")"]}):Ne.flexRender(N.column.columnDef.cell,N.getContext()))()},N.id)})},T.id))})]})]})}const _n={[ee.getLocalizeKeyForScrollGroupId("undefined")]:"Ø",[ee.getLocalizeKeyForScrollGroupId(0)]:"A",[ee.getLocalizeKeyForScrollGroupId(1)]:"B",[ee.getLocalizeKeyForScrollGroupId(2)]:"C",[ee.getLocalizeKeyForScrollGroupId(3)]:"D",[ee.getLocalizeKeyForScrollGroupId(4)]:"E",[ee.getLocalizeKeyForScrollGroupId(5)]:"F",[ee.getLocalizeKeyForScrollGroupId(6)]:"G",[ee.getLocalizeKeyForScrollGroupId(7)]:"H",[ee.getLocalizeKeyForScrollGroupId(8)]:"I",[ee.getLocalizeKeyForScrollGroupId(9)]:"J",[ee.getLocalizeKeyForScrollGroupId(10)]:"K",[ee.getLocalizeKeyForScrollGroupId(11)]:"L",[ee.getLocalizeKeyForScrollGroupId(12)]:"M",[ee.getLocalizeKeyForScrollGroupId(13)]:"N",[ee.getLocalizeKeyForScrollGroupId(14)]:"O",[ee.getLocalizeKeyForScrollGroupId(15)]:"P",[ee.getLocalizeKeyForScrollGroupId(16)]:"Q",[ee.getLocalizeKeyForScrollGroupId(17)]:"R",[ee.getLocalizeKeyForScrollGroupId(18)]:"S",[ee.getLocalizeKeyForScrollGroupId(19)]:"T",[ee.getLocalizeKeyForScrollGroupId(20)]:"U",[ee.getLocalizeKeyForScrollGroupId(21)]:"V",[ee.getLocalizeKeyForScrollGroupId(22)]:"W",[ee.getLocalizeKeyForScrollGroupId(23)]:"X",[ee.getLocalizeKeyForScrollGroupId(24)]:"Y",[ee.getLocalizeKeyForScrollGroupId(25)]:"Z"};function oc({availableScrollGroupIds:e,scrollGroupId:r,onChangeScrollGroupId:t,localizedStrings:n={}}){const o={..._n,...Object.fromEntries(Object.entries(n).map(([a,i])=>[a,a===i&&a in _n?_n[a]:i]))};return s.jsxs(Fr,{value:`${r}`,onValueChange:a=>t(a==="undefined"?void 0:parseInt(a,10)),children:[s.jsx(Nr,{className:"pr-twp pr-w-auto",children:s.jsx(zr,{placeholder:o[ee.getLocalizeKeyForScrollGroupId(r)]??r})}),s.jsx(Er,{style:{zIndex:250},children:e.map(a=>s.jsx(Ae,{value:`${a}`,children:o[ee.getLocalizeKeyForScrollGroupId(a)]},`${a}`))})]})}const No=y.forwardRef(({className:e,orientation:r="horizontal",decorative:t=!0,...n},o)=>s.jsx(vs.Root,{ref:o,decorative:t,orientation:r,className:O("pr-twp pr-shrink-0 pr-bg-border",r==="horizontal"?"pr-h-[1px] pr-w-full":"pr-h-full pr-w-[1px]",e),...n}));No.displayName=vs.Root.displayName;function ac({children:e}){return s.jsx("div",{className:"pr-twp pr-grid",children:e})}function sc({primary:e,secondary:r,children:t,isLoading:n=!1,loadingMessage:o}){return s.jsxs("div",{className:"pr-flex pr-items-center pr-justify-between pr-space-x-4 pr-py-2",children:[s.jsxs("div",{children:[s.jsx("p",{className:"pr-text-sm pr-font-medium pr-leading-none",children:e}),s.jsx("p",{className:"pr-whitespace-normal pr-break-words pr-text-sm pr-text-muted-foreground",children:r})]}),n?s.jsx("p",{className:"pr-text-sm pr-text-muted-foreground",children:o}):s.jsx("div",{children:t})]})}function ic({primary:e,secondary:r,includeSeparator:t=!1}){return s.jsxs("div",{className:"pr-space-y-4 pr-py-2",children:[s.jsxs("div",{children:[s.jsx("h3",{className:"pr-text-lg pr-font-medium",children:e}),s.jsx("p",{className:"pr-text-sm pr-text-muted-foreground",children:r})]}),t?s.jsx(No,{}):""]})}const Eo=y.forwardRef(({className:e,...r},t)=>s.jsx(Yn.Root,{ref:t,className:O("pr-peer pr-twp pr-h-4 pr-w-4 pr-shrink-0 pr-rounded-sm pr-border pr-border-primary pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50 data-[state=checked]:pr-bg-primary data-[state=checked]:pr-text-primary-foreground",e),...r,children:s.jsx(Yn.Indicator,{className:O("pr-flex pr-items-center pr-justify-center pr-text-current"),children:s.jsx(ne.Check,{className:"pr-h-4 pr-w-4"})})}));Eo.displayName=Yn.Root.displayName;function lc({id:e,className:r,listItems:t,selectedListItems:n,handleSelectListItem:o,createLabel:a}){return s.jsx("div",{id:e,className:r,children:t.map(i=>s.jsxs("div",{className:"pr-m-2 pr-flex pr-items-center",children:[s.jsx(Eo,{className:"pr-mr-2 pr-align-middle",checked:n.includes(i),onCheckedChange:l=>o(i,l)}),s.jsx(qe,{children:a?a(i):i})]},i))})}function pc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function cc(e){if(e.__esModule)return e;var r=e.default;if(typeof r=="function"){var t=function n(){return this instanceof n?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}),t}var So={},Ks={exports:{}};(function(e){function r(t){return t&&t.__esModule?t:{default:t}}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports})(Ks);var dc=Ks.exports,$n={};function To(e,r){return process.env.NODE_ENV==="production"?()=>null:function(...n){return e(...n)||r(...n)}}function _(){return _=Object.assign?Object.assign.bind():function(e){for(var r=1;r{r[t]=Js(e[t])}),r}function er(e,r,t={clone:!0}){const n=t.clone?_({},e):e;return wr(e)&&wr(r)&&Object.keys(r).forEach(o=>{o!=="__proto__"&&(wr(r[o])&&o in e&&wr(e[o])?n[o]=er(e[o],r[o],t):t.clone?n[o]=wr(r[o])?Js(r[o]):r[o]:n[o]=r[o])}),n}var Zn={exports:{}},zt={exports:{}},ie={};/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ga;function uc(){if(ga)return ie;ga=1;var e=typeof Symbol=="function"&&Symbol.for,r=e?Symbol.for("react.element"):60103,t=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,a=e?Symbol.for("react.profiler"):60114,i=e?Symbol.for("react.provider"):60109,l=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,d=e?Symbol.for("react.concurrent_mode"):60111,u=e?Symbol.for("react.forward_ref"):60112,v=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,h=e?Symbol.for("react.memo"):60115,f=e?Symbol.for("react.lazy"):60116,g=e?Symbol.for("react.block"):60121,b=e?Symbol.for("react.fundamental"):60117,x=e?Symbol.for("react.responder"):60118,C=e?Symbol.for("react.scope"):60119;function S(w){if(typeof w=="object"&&w!==null){var j=w.$$typeof;switch(j){case r:switch(w=w.type,w){case c:case d:case n:case a:case o:case v:return w;default:switch(w=w&&w.$$typeof,w){case l:case u:case f:case h:case i:return w;default:return j}}case t:return j}}}function k(w){return S(w)===d}return ie.AsyncMode=c,ie.ConcurrentMode=d,ie.ContextConsumer=l,ie.ContextProvider=i,ie.Element=r,ie.ForwardRef=u,ie.Fragment=n,ie.Lazy=f,ie.Memo=h,ie.Portal=t,ie.Profiler=a,ie.StrictMode=o,ie.Suspense=v,ie.isAsyncMode=function(w){return k(w)||S(w)===c},ie.isConcurrentMode=k,ie.isContextConsumer=function(w){return S(w)===l},ie.isContextProvider=function(w){return S(w)===i},ie.isElement=function(w){return typeof w=="object"&&w!==null&&w.$$typeof===r},ie.isForwardRef=function(w){return S(w)===u},ie.isFragment=function(w){return S(w)===n},ie.isLazy=function(w){return S(w)===f},ie.isMemo=function(w){return S(w)===h},ie.isPortal=function(w){return S(w)===t},ie.isProfiler=function(w){return S(w)===a},ie.isStrictMode=function(w){return S(w)===o},ie.isSuspense=function(w){return S(w)===v},ie.isValidElementType=function(w){return typeof w=="string"||typeof w=="function"||w===n||w===d||w===a||w===o||w===v||w===p||typeof w=="object"&&w!==null&&(w.$$typeof===f||w.$$typeof===h||w.$$typeof===i||w.$$typeof===l||w.$$typeof===u||w.$$typeof===b||w.$$typeof===x||w.$$typeof===C||w.$$typeof===g)},ie.typeOf=S,ie}var le={};/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ba;function fc(){return ba||(ba=1,process.env.NODE_ENV!=="production"&&function(){var e=typeof Symbol=="function"&&Symbol.for,r=e?Symbol.for("react.element"):60103,t=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,a=e?Symbol.for("react.profiler"):60114,i=e?Symbol.for("react.provider"):60109,l=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,d=e?Symbol.for("react.concurrent_mode"):60111,u=e?Symbol.for("react.forward_ref"):60112,v=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,h=e?Symbol.for("react.memo"):60115,f=e?Symbol.for("react.lazy"):60116,g=e?Symbol.for("react.block"):60121,b=e?Symbol.for("react.fundamental"):60117,x=e?Symbol.for("react.responder"):60118,C=e?Symbol.for("react.scope"):60119;function S(I){return typeof I=="string"||typeof I=="function"||I===n||I===d||I===a||I===o||I===v||I===p||typeof I=="object"&&I!==null&&(I.$$typeof===f||I.$$typeof===h||I.$$typeof===i||I.$$typeof===l||I.$$typeof===u||I.$$typeof===b||I.$$typeof===x||I.$$typeof===C||I.$$typeof===g)}function k(I){if(typeof I=="object"&&I!==null){var xe=I.$$typeof;switch(xe){case r:var L=I.type;switch(L){case c:case d:case n:case a:case o:case v:return L;default:var ye=L&&L.$$typeof;switch(ye){case l:case u:case f:case h:case i:return ye;default:return xe}}case t:return xe}}}var w=c,j=d,R=l,B=i,T=r,P=u,N=n,A=f,D=h,J=t,K=a,H=o,te=v,se=!1;function V(I){return se||(se=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.")),E(I)||k(I)===c}function E(I){return k(I)===d}function $(I){return k(I)===l}function q(I){return k(I)===i}function z(I){return typeof I=="object"&&I!==null&&I.$$typeof===r}function F(I){return k(I)===u}function W(I){return k(I)===n}function G(I){return k(I)===f}function Y(I){return k(I)===h}function X(I){return k(I)===t}function Z(I){return k(I)===a}function Q(I){return k(I)===o}function ue(I){return k(I)===v}le.AsyncMode=w,le.ConcurrentMode=j,le.ContextConsumer=R,le.ContextProvider=B,le.Element=T,le.ForwardRef=P,le.Fragment=N,le.Lazy=A,le.Memo=D,le.Portal=J,le.Profiler=K,le.StrictMode=H,le.Suspense=te,le.isAsyncMode=V,le.isConcurrentMode=E,le.isContextConsumer=$,le.isContextProvider=q,le.isElement=z,le.isForwardRef=F,le.isFragment=W,le.isLazy=G,le.isMemo=Y,le.isPortal=X,le.isProfiler=Z,le.isStrictMode=Q,le.isSuspense=ue,le.isValidElementType=S,le.typeOf=k}()),le}var va;function Zs(){return va||(va=1,process.env.NODE_ENV==="production"?zt.exports=uc():zt.exports=fc()),zt.exports}/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var In,wa;function mc(){if(wa)return In;wa=1;var e=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable;function n(a){if(a==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(a)}function o(){try{if(!Object.assign)return!1;var a=new String("abc");if(a[5]="de",Object.getOwnPropertyNames(a)[0]==="5")return!1;for(var i={},l=0;l<10;l++)i["_"+String.fromCharCode(l)]=l;var c=Object.getOwnPropertyNames(i).map(function(u){return i[u]});if(c.join("")!=="0123456789")return!1;var d={};return"abcdefghijklmnopqrst".split("").forEach(function(u){d[u]=u}),Object.keys(Object.assign({},d)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}return In=o()?Object.assign:function(a,i){for(var l,c=n(a),d,u=1;u1?a("Invalid arguments supplied to oneOf, expected an array, got "+arguments.length+" arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z])."):a("Invalid argument supplied to oneOf, expected an array.")),i;function $(q,z,F,W,G){for(var Y=q[z],X=0;X0?", expected one of type ["+Z.join(", ")+"]":"";return new g("Invalid "+Y+" `"+X+"` supplied to "+("`"+G+"`"+xe+"."))}return b(z)}function P(){function E($,q,z,F,W){return J($[q])?null:new g("Invalid "+F+" `"+W+"` supplied to "+("`"+z+"`, expected a ReactNode."))}return b(E)}function N(E,$,q,z,F){return new g((E||"React class")+": "+$+" type `"+q+"."+z+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+F+"`.")}function A(E){function $(q,z,F,W,G){var Y=q[z],X=H(Y);if(X!=="object")return new g("Invalid "+W+" `"+G+"` of type `"+X+"` "+("supplied to `"+F+"`, expected `object`."));for(var Z in E){var Q=E[Z];if(typeof Q!="function")return N(F,W,G,Z,te(Q));var ue=Q(Y,Z,F,W,G+"."+Z,t);if(ue)return ue}return null}return b($)}function D(E){function $(q,z,F,W,G){var Y=q[z],X=H(Y);if(X!=="object")return new g("Invalid "+W+" `"+G+"` of type `"+X+"` "+("supplied to `"+F+"`, expected `object`."));var Z=r({},q[z],E);for(var Q in Z){var ue=E[Q];if(n(E,Q)&&typeof ue!="function")return N(F,W,G,Q,te(ue));if(!ue)return new g("Invalid "+W+" `"+G+"` key `"+Q+"` supplied to `"+F+"`.\nBad object: "+JSON.stringify(q[z],null," ")+` +Valid keys: `+JSON.stringify(Object.keys(E),null," "));var I=ue(Y,Q,F,W,G+"."+Q,t);if(I)return I}return null}return b($)}function J(E){switch(typeof E){case"number":case"string":case"undefined":return!0;case"boolean":return!E;case"object":if(Array.isArray(E))return E.every(J);if(E===null||l(E))return!0;var $=v(E);if($){var q=$.call(E),z;if($!==E.entries){for(;!(z=q.next()).done;)if(!J(z.value))return!1}else for(;!(z=q.next()).done;){var F=z.value;if(F&&!J(F[1]))return!1}}else return!1;return!0;default:return!1}}function K(E,$){return E==="symbol"?!0:$?$["@@toStringTag"]==="Symbol"||typeof Symbol=="function"&&$ instanceof Symbol:!1}function H(E){var $=typeof E;return Array.isArray(E)?"array":E instanceof RegExp?"object":K($,E)?"symbol":$}function te(E){if(typeof E>"u"||E===null)return""+E;var $=H(E);if($==="object"){if(E instanceof Date)return"date";if(E instanceof RegExp)return"regexp"}return $}function se(E){var $=te(E);switch($){case"array":case"object":return"an "+$;case"boolean":case"date":case"regexp":return"a "+$;default:return $}}function V(E){return!E.constructor||!E.constructor.name?p:E.constructor.name}return h.checkPropTypes=o,h.resetWarningCache=o.resetWarningCache,h.PropTypes=h,h},Bn}var Ln,Ea;function bc(){if(Ea)return Ln;Ea=1;var e=Co();function r(){}function t(){}return t.resetWarningCache=r,Ln=function(){function n(i,l,c,d,u,v){if(v!==e){var p=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw p.name="Invariant Violation",p}}n.isRequired=n;function o(){return n}var a={array:n,bigint:n,bool:n,func:n,number:n,object:n,string:n,symbol:n,any:n,arrayOf:o,element:n,elementType:n,instanceOf:o,node:n,objectOf:o,oneOf:o,oneOfType:o,shape:o,exact:o,checkPropTypes:t,resetWarningCache:r};return a.PropTypes=a,a},Ln}if(process.env.NODE_ENV!=="production"){var vc=Zs(),wc=!0;Zn.exports=gc()(vc.isElement,wc)}else Zn.exports=bc()();var yc=Zn.exports;const m=pc(yc);function xc(e){const{prototype:r={}}=e;return!!r.isReactComponent}function ei(e,r,t,n,o){const a=e[r],i=o||r;if(a==null||typeof window>"u")return null;let l;const c=a.type;return typeof c=="function"&&!xc(c)&&(l="Did you accidentally use a plain function component for an element instead?"),l!==void 0?new Error(`Invalid ${n} \`${i}\` supplied to \`${t}\`. Expected an element that can hold a ref. ${l} For more information see https://mui.com/r/caveat-with-refs-guide`):null}const ri=To(m.element,ei);ri.isRequired=To(m.element.isRequired,ei);const ti=ri,kc="exact-prop: ​";function Nc(e){return process.env.NODE_ENV==="production"?e:_({},e,{[kc]:r=>{const t=Object.keys(r).filter(n=>!e.hasOwnProperty(n));return t.length>0?new Error(`The following props are not supported: ${t.map(n=>`\`${n}\``).join(", ")}. Please remove them.`):null}})}function Ur(e){let r="https://mui.com/production-error/?code="+e;for(let t=1;tt==null?r:function(...o){r.apply(this,o),t.apply(this,o)},()=>{})}function Pc(e,r=166){let t;function n(...o){const a=()=>{e.apply(this,o)};clearTimeout(t),t=setTimeout(a,r)}return n.clear=()=>{clearTimeout(t)},n}function _c(e,r){return process.env.NODE_ENV==="production"?()=>null:(t,n,o,a,i)=>{const l=o||"<>",c=i||n;return typeof t[n]<"u"?new Error(`The ${a} \`${c}\` of \`${l}\` is deprecated. ${r}`):null}}function $c(e,r){var t,n;return M.isValidElement(e)&&r.indexOf((t=e.type.muiName)!=null?t:(n=e.type)==null||(n=n._payload)==null||(n=n.value)==null?void 0:n.muiName)!==-1}function Qt(e){return e&&e.ownerDocument||document}function Ic(e){return Qt(e).defaultView||window}function Mc(e,r){if(process.env.NODE_ENV==="production")return()=>null;const t=r?_({},r.propTypes):null;return o=>(a,i,l,c,d,...u)=>{const v=d||i,p=t==null?void 0:t[v];if(p){const h=p(a,i,l,c,d,...u);if(h)return h}return typeof a[i]<"u"&&!a[o]?new Error(`The prop \`${v}\` of \`${e}\` can only be used together with the \`${o}\` prop.`):null}}function en(e,r){typeof e=="function"?e(r):e&&(e.current=r)}const Dc=typeof window<"u"?M.useLayoutEffect:M.useEffect,Hr=Dc;let Oa=0;function Ac(e){const[r,t]=M.useState(e),n=e||r;return M.useEffect(()=>{r==null&&(Oa+=1,t(`mui-${Oa}`))},[r]),n}const Ra=M["useId".toString()];function ai(e){if(Ra!==void 0){const r=Ra();return e??r}return Ac(e)}function Bc(e,r,t,n,o){if(process.env.NODE_ENV==="production")return null;const a=o||r;return typeof e[r]<"u"?new Error(`The prop \`${a}\` is not supported. Please remove it.`):null}function si({controlled:e,default:r,name:t,state:n="value"}){const{current:o}=M.useRef(e!==void 0),[a,i]=M.useState(r),l=o?e:a;if(process.env.NODE_ENV!=="production"){M.useEffect(()=>{o!==(e!==void 0)&&console.error([`MUI: A component is changing the ${o?"":"un"}controlled ${n} state of ${t} to be ${o?"un":""}controlled.`,"Elements should not switch from uncontrolled to controlled (or vice versa).",`Decide between using a controlled or uncontrolled ${t} element for the lifetime of the component.`,"The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.","More info: https://fb.me/react-controlled-components"].join(` +`))},[n,t,e]);const{current:d}=M.useRef(r);M.useEffect(()=>{!o&&d!==r&&console.error([`MUI: A component is changing the default ${n} state of an uncontrolled ${t} after being initialized. To suppress this warning opt to use a controlled ${t}.`].join(` +`))},[JSON.stringify(r)])}const c=M.useCallback(d=>{o||i(d)},[]);return[l,c]}function eo(e){const r=M.useRef(e);return Hr(()=>{r.current=e}),M.useRef((...t)=>(0,r.current)(...t)).current}function Tr(...e){return M.useMemo(()=>e.every(r=>r==null)?null:r=>{e.forEach(t=>{en(t,r)})},e)}const Pa={};function Lc(e,r){const t=M.useRef(Pa);return t.current===Pa&&(t.current=e(r)),t}const Vc=[];function Fc(e){M.useEffect(e,Vc)}class _t{constructor(){this.currentId=null,this.clear=()=>{this.currentId!==null&&(clearTimeout(this.currentId),this.currentId=null)},this.disposeEffect=()=>this.clear}static create(){return new _t}start(r,t){this.clear(),this.currentId=setTimeout(()=>{this.currentId=null,t()},r)}}function ft(){const e=Lc(_t.create).current;return Fc(e.disposeEffect),e}let un=!0,ro=!1;const zc=new _t,Gc={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function Uc(e){const{type:r,tagName:t}=e;return!!(t==="INPUT"&&Gc[r]&&!e.readOnly||t==="TEXTAREA"&&!e.readOnly||e.isContentEditable)}function Hc(e){e.metaKey||e.altKey||e.ctrlKey||(un=!0)}function Vn(){un=!1}function qc(){this.visibilityState==="hidden"&&ro&&(un=!0)}function Xc(e){e.addEventListener("keydown",Hc,!0),e.addEventListener("mousedown",Vn,!0),e.addEventListener("pointerdown",Vn,!0),e.addEventListener("touchstart",Vn,!0),e.addEventListener("visibilitychange",qc,!0)}function Wc(e){const{target:r}=e;try{return r.matches(":focus-visible")}catch{}return un||Uc(r)}function ii(){const e=M.useCallback(o=>{o!=null&&Xc(o.ownerDocument)},[]),r=M.useRef(!1);function t(){return r.current?(ro=!0,zc.start(100,()=>{ro=!1}),r.current=!1,!0):!1}function n(o){return Wc(o)?(r.current=!0,!0):!1}return{isFocusVisibleRef:r,onFocus:n,onBlur:t,ref:e}}function li(e,r){const t=_({},r);return Object.keys(e).forEach(n=>{if(n.toString().match(/^(components|slots)$/))t[n]=_({},e[n],t[n]);else if(n.toString().match(/^(componentsProps|slotProps)$/)){const o=e[n]||{},a=r[n];t[n]={},!a||!Object.keys(a)?t[n]=o:!o||!Object.keys(o)?t[n]=a:(t[n]=_({},a),Object.keys(o).forEach(i=>{t[n][i]=li(o[i],a[i])}))}else t[n]===void 0&&(t[n]=e[n])}),t}function jo(e,r,t=void 0){const n={};return Object.keys(e).forEach(o=>{n[o]=e[o].reduce((a,i)=>{if(i){const l=r(i);l!==""&&a.push(l),t&&t[i]&&a.push(t[i])}return a},[]).join(" ")}),n}const _a=e=>e,Yc=()=>{let e=_a;return{configure(r){e=r},generate(r){return e(r)},reset(){e=_a}}},Kc=Yc(),pi=Kc,ci={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function fn(e,r,t="Mui"){const n=ci[r];return n?`${t}-${n}`:`${pi.generate(e)}-${r}`}function di(e,r,t="Mui"){const n={};return r.forEach(o=>{n[o]=fn(e,o,t)}),n}function Jc(e,r=Number.MIN_SAFE_INTEGER,t=Number.MAX_SAFE_INTEGER){return Math.max(r,Math.min(e,t))}function ke(e,r){if(e==null)return{};var t={},n=Object.keys(e),o,a;for(a=0;a=0)&&(t[o]=e[o]);return t}const Zc=["values","unit","step"],Qc=e=>{const r=Object.keys(e).map(t=>({key:t,val:e[t]}))||[];return r.sort((t,n)=>t.val-n.val),r.reduce((t,n)=>_({},t,{[n.key]:n.val}),{})};function ed(e){const{values:r={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:t="px",step:n=5}=e,o=ke(e,Zc),a=Qc(r),i=Object.keys(a);function l(p){return`@media (min-width:${typeof r[p]=="number"?r[p]:p}${t})`}function c(p){return`@media (max-width:${(typeof r[p]=="number"?r[p]:p)-n/100}${t})`}function d(p,h){const f=i.indexOf(h);return`@media (min-width:${typeof r[p]=="number"?r[p]:p}${t}) and (max-width:${(f!==-1&&typeof r[i[f]]=="number"?r[i[f]]:h)-n/100}${t})`}function u(p){return i.indexOf(p)+1`@media (min-width:${Oo[e]}px)`};function rr(e,r,t){const n=e.theme||{};if(Array.isArray(r)){const a=n.breakpoints||$a;return r.reduce((i,l,c)=>(i[a.up(a.keys[c])]=t(r[c]),i),{})}if(typeof r=="object"){const a=n.breakpoints||$a;return Object.keys(r).reduce((i,l)=>{if(Object.keys(a.values||Oo).indexOf(l)!==-1){const c=a.up(l);i[c]=t(r[l],l)}else{const c=l;i[c]=r[c]}return i},{})}return t(r)}function od(e={}){var r;return((r=e.keys)==null?void 0:r.reduce((n,o)=>{const a=e.up(o);return n[a]={},n},{}))||{}}function ad(e,r){return e.reduce((t,n)=>{const o=t[n];return(!o||Object.keys(o).length===0)&&delete t[n],t},r)}function mn(e,r,t=!0){if(!r||typeof r!="string")return null;if(e&&e.vars&&t){const n=`vars.${r}`.split(".").reduce((o,a)=>o&&o[a]?o[a]:null,e);if(n!=null)return n}return r.split(".").reduce((n,o)=>n&&n[o]!=null?n[o]:null,e)}function rn(e,r,t,n=t){let o;return typeof e=="function"?o=e(t):Array.isArray(e)?o=e[t]||n:o=mn(e,t)||n,r&&(o=r(o,n,e)),o}function we(e){const{prop:r,cssProperty:t=e.prop,themeKey:n,transform:o}=e,a=i=>{if(i[r]==null)return null;const l=i[r],c=i.theme,d=mn(c,n)||{};return rr(i,l,v=>{let p=rn(d,o,v);return v===p&&typeof v=="string"&&(p=rn(d,o,`${r}${v==="default"?"":Ye(v)}`,v)),t===!1?p:{[t]:p}})};return a.propTypes=process.env.NODE_ENV!=="production"?{[r]:cr}:{},a.filterProps=[r],a}function sd(e){const r={};return t=>(r[t]===void 0&&(r[t]=e(t)),r[t])}const id={m:"margin",p:"padding"},ld={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},Ia={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},pd=sd(e=>{if(e.length>2)if(Ia[e])e=Ia[e];else return[e];const[r,t]=e.split(""),n=id[r],o=ld[t]||"";return Array.isArray(o)?o.map(a=>n+a):[n+o]}),hn=["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"],gn=["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"],cd=[...hn,...gn];function $t(e,r,t,n){var o;const a=(o=mn(e,r,!1))!=null?o:t;return typeof a=="number"?i=>typeof i=="string"?i:(process.env.NODE_ENV!=="production"&&typeof i!="number"&&console.error(`MUI: Expected ${n} argument to be a number or a string, got ${i}.`),a*i):Array.isArray(a)?i=>typeof i=="string"?i:(process.env.NODE_ENV!=="production"&&(Number.isInteger(i)?i>a.length-1&&console.error([`MUI: The value provided (${i}) overflows.`,`The supported values are: ${JSON.stringify(a)}.`,`${i} > ${a.length-1}, you need to add the missing values.`].join(` +`)):console.error([`MUI: The \`theme.${r}\` array type cannot be combined with non integer values.You should either use an integer value that can be used as index, or define the \`theme.${r}\` as a number.`].join(` +`))),a[i]):typeof a=="function"?a:(process.env.NODE_ENV!=="production"&&console.error([`MUI: The \`theme.${r}\` value (${a}) is invalid.`,"It should be a number, an array or a function."].join(` +`)),()=>{})}function ui(e){return $t(e,"spacing",8,"spacing")}function It(e,r){if(typeof r=="string"||r==null)return r;const t=Math.abs(r),n=e(t);return r>=0?n:typeof n=="number"?-n:`-${n}`}function dd(e,r){return t=>e.reduce((n,o)=>(n[o]=It(r,t),n),{})}function ud(e,r,t,n){if(r.indexOf(t)===-1)return null;const o=pd(t),a=dd(o,n),i=e[t];return rr(e,i,a)}function fi(e,r){const t=ui(e.theme);return Object.keys(e).map(n=>ud(e,r,n,t)).reduce(vt,{})}function he(e){return fi(e,hn)}he.propTypes=process.env.NODE_ENV!=="production"?hn.reduce((e,r)=>(e[r]=cr,e),{}):{};he.filterProps=hn;function ge(e){return fi(e,gn)}ge.propTypes=process.env.NODE_ENV!=="production"?gn.reduce((e,r)=>(e[r]=cr,e),{}):{};ge.filterProps=gn;process.env.NODE_ENV!=="production"&&cd.reduce((e,r)=>(e[r]=cr,e),{});function fd(e=8){if(e.mui)return e;const r=ui({spacing:e}),t=(...n)=>(process.env.NODE_ENV!=="production"&&(n.length<=4||console.error(`MUI: Too many arguments provided, expected between 0 and 4, got ${n.length}`)),(n.length===0?[1]:n).map(a=>{const i=r(a);return typeof i=="number"?`${i}px`:i}).join(" "));return t.mui=!0,t}function bn(...e){const r=e.reduce((n,o)=>(o.filterProps.forEach(a=>{n[a]=o}),n),{}),t=n=>Object.keys(n).reduce((o,a)=>r[a]?vt(o,r[a](n)):o,{});return t.propTypes=process.env.NODE_ENV!=="production"?e.reduce((n,o)=>Object.assign(n,o.propTypes),{}):{},t.filterProps=e.reduce((n,o)=>n.concat(o.filterProps),[]),t}function Be(e){return typeof e!="number"?e:`${e}px solid`}function ze(e,r){return we({prop:e,themeKey:"borders",transform:r})}const md=ze("border",Be),hd=ze("borderTop",Be),gd=ze("borderRight",Be),bd=ze("borderBottom",Be),vd=ze("borderLeft",Be),wd=ze("borderColor"),yd=ze("borderTopColor"),xd=ze("borderRightColor"),kd=ze("borderBottomColor"),Nd=ze("borderLeftColor"),Ed=ze("outline",Be),Sd=ze("outlineColor"),vn=e=>{if(e.borderRadius!==void 0&&e.borderRadius!==null){const r=$t(e.theme,"shape.borderRadius",4,"borderRadius"),t=n=>({borderRadius:It(r,n)});return rr(e,e.borderRadius,t)}return null};vn.propTypes=process.env.NODE_ENV!=="production"?{borderRadius:cr}:{};vn.filterProps=["borderRadius"];bn(md,hd,gd,bd,vd,wd,yd,xd,kd,Nd,vn,Ed,Sd);const wn=e=>{if(e.gap!==void 0&&e.gap!==null){const r=$t(e.theme,"spacing",8,"gap"),t=n=>({gap:It(r,n)});return rr(e,e.gap,t)}return null};wn.propTypes=process.env.NODE_ENV!=="production"?{gap:cr}:{};wn.filterProps=["gap"];const yn=e=>{if(e.columnGap!==void 0&&e.columnGap!==null){const r=$t(e.theme,"spacing",8,"columnGap"),t=n=>({columnGap:It(r,n)});return rr(e,e.columnGap,t)}return null};yn.propTypes=process.env.NODE_ENV!=="production"?{columnGap:cr}:{};yn.filterProps=["columnGap"];const xn=e=>{if(e.rowGap!==void 0&&e.rowGap!==null){const r=$t(e.theme,"spacing",8,"rowGap"),t=n=>({rowGap:It(r,n)});return rr(e,e.rowGap,t)}return null};xn.propTypes=process.env.NODE_ENV!=="production"?{rowGap:cr}:{};xn.filterProps=["rowGap"];const Td=we({prop:"gridColumn"}),Cd=we({prop:"gridRow"}),jd=we({prop:"gridAutoFlow"}),Od=we({prop:"gridAutoColumns"}),Rd=we({prop:"gridAutoRows"}),Pd=we({prop:"gridTemplateColumns"}),_d=we({prop:"gridTemplateRows"}),$d=we({prop:"gridTemplateAreas"}),Id=we({prop:"gridArea"});bn(wn,yn,xn,Td,Cd,jd,Od,Rd,Pd,_d,$d,Id);function Vr(e,r){return r==="grey"?r:e}const Md=we({prop:"color",themeKey:"palette",transform:Vr}),Dd=we({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:Vr}),Ad=we({prop:"backgroundColor",themeKey:"palette",transform:Vr});bn(Md,Dd,Ad);function $e(e){return e<=1&&e!==0?`${e*100}%`:e}const Bd=we({prop:"width",transform:$e}),Ro=e=>{if(e.maxWidth!==void 0&&e.maxWidth!==null){const r=t=>{var n,o;const a=((n=e.theme)==null||(n=n.breakpoints)==null||(n=n.values)==null?void 0:n[t])||Oo[t];return a?((o=e.theme)==null||(o=o.breakpoints)==null?void 0:o.unit)!=="px"?{maxWidth:`${a}${e.theme.breakpoints.unit}`}:{maxWidth:a}:{maxWidth:$e(t)}};return rr(e,e.maxWidth,r)}return null};Ro.filterProps=["maxWidth"];const Ld=we({prop:"minWidth",transform:$e}),Vd=we({prop:"height",transform:$e}),Fd=we({prop:"maxHeight",transform:$e}),zd=we({prop:"minHeight",transform:$e});we({prop:"size",cssProperty:"width",transform:$e});we({prop:"size",cssProperty:"height",transform:$e});const Gd=we({prop:"boxSizing"});bn(Bd,Ro,Ld,Vd,Fd,zd,Gd);const Ud={border:{themeKey:"borders",transform:Be},borderTop:{themeKey:"borders",transform:Be},borderRight:{themeKey:"borders",transform:Be},borderBottom:{themeKey:"borders",transform:Be},borderLeft:{themeKey:"borders",transform:Be},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:Be},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:vn},color:{themeKey:"palette",transform:Vr},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:Vr},backgroundColor:{themeKey:"palette",transform:Vr},p:{style:ge},pt:{style:ge},pr:{style:ge},pb:{style:ge},pl:{style:ge},px:{style:ge},py:{style:ge},padding:{style:ge},paddingTop:{style:ge},paddingRight:{style:ge},paddingBottom:{style:ge},paddingLeft:{style:ge},paddingX:{style:ge},paddingY:{style:ge},paddingInline:{style:ge},paddingInlineStart:{style:ge},paddingInlineEnd:{style:ge},paddingBlock:{style:ge},paddingBlockStart:{style:ge},paddingBlockEnd:{style:ge},m:{style:he},mt:{style:he},mr:{style:he},mb:{style:he},ml:{style:he},mx:{style:he},my:{style:he},margin:{style:he},marginTop:{style:he},marginRight:{style:he},marginBottom:{style:he},marginLeft:{style:he},marginX:{style:he},marginY:{style:he},marginInline:{style:he},marginInlineStart:{style:he},marginInlineEnd:{style:he},marginBlock:{style:he},marginBlockStart:{style:he},marginBlockEnd:{style:he},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:wn},rowGap:{style:xn},columnGap:{style:yn},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:$e},maxWidth:{style:Ro},minWidth:{transform:$e},height:{transform:$e},maxHeight:{transform:$e},minHeight:{transform:$e},boxSizing:{},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}},Po=Ud;function Hd(...e){const r=e.reduce((n,o)=>n.concat(Object.keys(o)),[]),t=new Set(r);return e.every(n=>t.size===Object.keys(n).length)}function qd(e,r){return typeof e=="function"?e(r):e}function Xd(){function e(t,n,o,a){const i={[t]:n,theme:o},l=a[t];if(!l)return{[t]:n};const{cssProperty:c=t,themeKey:d,transform:u,style:v}=l;if(n==null)return null;if(d==="typography"&&n==="inherit")return{[t]:n};const p=mn(o,d)||{};return v?v(i):rr(i,n,f=>{let g=rn(p,u,f);return f===g&&typeof f=="string"&&(g=rn(p,u,`${t}${f==="default"?"":Ye(f)}`,f)),c===!1?g:{[c]:g}})}function r(t){var n;const{sx:o,theme:a={}}=t||{};if(!o)return null;const i=(n=a.unstable_sxConfig)!=null?n:Po;function l(c){let d=c;if(typeof c=="function")d=c(a);else if(typeof c!="object")return c;if(!d)return null;const u=od(a.breakpoints),v=Object.keys(u);let p=u;return Object.keys(d).forEach(h=>{const f=qd(d[h],a);if(f!=null)if(typeof f=="object")if(i[h])p=vt(p,e(h,f,a,i));else{const g=rr({theme:a},f,b=>({[h]:b}));Hd(g,f)?p[h]=r({sx:f,theme:a}):p=vt(p,g)}else p=vt(p,e(h,f,a,i))}),ad(v,p)}return Array.isArray(o)?o.map(l):l(o)}return r}const mi=Xd();mi.filterProps=["sx"];const _o=mi;function Wd(e,r){const t=this;return t.vars&&typeof t.getColorSchemeSelector=="function"?{[t.getColorSchemeSelector(e).replace(/(\[[^\]]+\])/,"*:where($1)")]:r}:t.palette.mode===e?r:{}}const Yd=["breakpoints","palette","spacing","shape"];function $o(e={},...r){const{breakpoints:t={},palette:n={},spacing:o,shape:a={}}=e,i=ke(e,Yd),l=ed(t),c=fd(o);let d=er({breakpoints:l,direction:"ltr",components:{},palette:_({mode:"light"},n),spacing:c,shape:_({},td,a)},i);return d.applyStyles=Wd,d=r.reduce((u,v)=>er(u,v),d),d.unstable_sxConfig=_({},Po,i==null?void 0:i.unstable_sxConfig),d.unstable_sx=function(v){return _o({sx:v,theme:this})},d}function Kd(e){return Object.keys(e).length===0}function hi(e=null){const r=M.useContext(Wn.ThemeContext);return!r||Kd(r)?e:r}const Jd=$o();function gi(e=Jd){return hi(e)}const Zd=["ownerState"],Qd=["variants"],eu=["name","slot","skipVariantsResolver","skipSx","overridesResolver"];function ru(e){return Object.keys(e).length===0}function tu(e){return typeof e=="string"&&e.charCodeAt(0)>96}function Wt(e){return e!=="ownerState"&&e!=="theme"&&e!=="sx"&&e!=="as"}const nu=$o(),Ma=e=>e&&e.charAt(0).toLowerCase()+e.slice(1);function Gt({defaultTheme:e,theme:r,themeId:t}){return ru(r)?e:r[t]||r}function ou(e){return e?(r,t)=>t[e]:null}function Yt(e,r){let{ownerState:t}=r,n=ke(r,Zd);const o=typeof e=="function"?e(_({ownerState:t},n)):e;if(Array.isArray(o))return o.flatMap(a=>Yt(a,_({ownerState:t},n)));if(o&&typeof o=="object"&&Array.isArray(o.variants)){const{variants:a=[]}=o;let l=ke(o,Qd);return a.forEach(c=>{let d=!0;typeof c.props=="function"?d=c.props(_({ownerState:t},n,t)):Object.keys(c.props).forEach(u=>{(t==null?void 0:t[u])!==c.props[u]&&n[u]!==c.props[u]&&(d=!1)}),d&&(Array.isArray(l)||(l=[l]),l.push(typeof c.style=="function"?c.style(_({ownerState:t},n,t)):c.style))}),l}return o}function au(e={}){const{themeId:r,defaultTheme:t=nu,rootShouldForwardProp:n=Wt,slotShouldForwardProp:o=Wt}=e,a=i=>_o(_({},i,{theme:Gt(_({},i,{defaultTheme:t,themeId:r}))}));return a.__mui_systemSx=!0,(i,l={})=>{Wn.internal_processStyles(i,w=>w.filter(j=>!(j!=null&&j.__mui_systemSx)));const{name:c,slot:d,skipVariantsResolver:u,skipSx:v,overridesResolver:p=ou(Ma(d))}=l,h=ke(l,eu),f=u!==void 0?u:d&&d!=="Root"&&d!=="root"||!1,g=v||!1;let b;process.env.NODE_ENV!=="production"&&c&&(b=`${c}-${Ma(d||"Root")}`);let x=Wt;d==="Root"||d==="root"?x=n:d?x=o:tu(i)&&(x=void 0);const C=Wn(i,_({shouldForwardProp:x,label:b},h)),S=w=>typeof w=="function"&&w.__emotion_real!==w||wr(w)?j=>Yt(w,_({},j,{theme:Gt({theme:j.theme,defaultTheme:t,themeId:r})})):w,k=(w,...j)=>{let R=S(w);const B=j?j.map(S):[];c&&p&&B.push(N=>{const A=Gt(_({},N,{defaultTheme:t,themeId:r}));if(!A.components||!A.components[c]||!A.components[c].styleOverrides)return null;const D=A.components[c].styleOverrides,J={};return Object.entries(D).forEach(([K,H])=>{J[K]=Yt(H,_({},N,{theme:A}))}),p(N,J)}),c&&!f&&B.push(N=>{var A;const D=Gt(_({},N,{defaultTheme:t,themeId:r})),J=D==null||(A=D.components)==null||(A=A[c])==null?void 0:A.variants;return Yt({variants:J},_({},N,{theme:D}))}),g||B.push(a);const T=B.length-j.length;if(Array.isArray(w)&&T>0){const N=new Array(T).fill("");R=[...w,...N],R.raw=[...w.raw,...N]}const P=C(R,...B);if(process.env.NODE_ENV!=="production"){let N;c&&(N=`${c}${Ye(d||"")}`),N===void 0&&(N=`Styled(${jc(i)})`),P.displayName=N}return i.muiName&&(P.muiName=i.muiName),P};return C.withConfig&&(k.withConfig=C.withConfig),k}}function su(e){const{theme:r,name:t,props:n}=e;return!r||!r.components||!r.components[t]||!r.components[t].defaultProps?n:li(r.components[t].defaultProps,n)}function iu({props:e,name:r,defaultTheme:t,themeId:n}){let o=gi(t);return n&&(o=o[n]||o),su({theme:o,name:r,props:e})}function Io(e,r=0,t=1){return process.env.NODE_ENV!=="production"&&(et)&&console.error(`MUI: The value provided ${e} is out of range [${r}, ${t}].`),Jc(e,r,t)}function lu(e){e=e.slice(1);const r=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let t=e.match(r);return t&&t[0].length===1&&(t=t.map(n=>n+n)),t?`rgb${t.length===4?"a":""}(${t.map((n,o)=>o<3?parseInt(n,16):Math.round(parseInt(n,16)/255*1e3)/1e3).join(", ")})`:""}function Cr(e){if(e.type)return e;if(e.charAt(0)==="#")return Cr(lu(e));const r=e.indexOf("("),t=e.substring(0,r);if(["rgb","rgba","hsl","hsla","color"].indexOf(t)===-1)throw new Error(process.env.NODE_ENV!=="production"?`MUI: Unsupported \`${e}\` color. +The following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().`:Ur(9,e));let n=e.substring(r+1,e.length-1),o;if(t==="color"){if(n=n.split(" "),o=n.shift(),n.length===4&&n[3].charAt(0)==="/"&&(n[3]=n[3].slice(1)),["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].indexOf(o)===-1)throw new Error(process.env.NODE_ENV!=="production"?`MUI: unsupported \`${o}\` color space. +The following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.`:Ur(10,o))}else n=n.split(",");return n=n.map(a=>parseFloat(a)),{type:t,values:n,colorSpace:o}}function kn(e){const{type:r,colorSpace:t}=e;let{values:n}=e;return r.indexOf("rgb")!==-1?n=n.map((o,a)=>a<3?parseInt(o,10):o):r.indexOf("hsl")!==-1&&(n[1]=`${n[1]}%`,n[2]=`${n[2]}%`),r.indexOf("color")!==-1?n=`${t} ${n.join(" ")}`:n=`${n.join(", ")}`,`${r}(${n})`}function pu(e){e=Cr(e);const{values:r}=e,t=r[0],n=r[1]/100,o=r[2]/100,a=n*Math.min(o,1-o),i=(d,u=(d+t/30)%12)=>o-a*Math.max(Math.min(u-3,9-u,1),-1);let l="rgb";const c=[Math.round(i(0)*255),Math.round(i(8)*255),Math.round(i(4)*255)];return e.type==="hsla"&&(l+="a",c.push(r[3])),kn({type:l,values:c})}function Da(e){e=Cr(e);let r=e.type==="hsl"||e.type==="hsla"?Cr(pu(e)).values:e.values;return r=r.map(t=>(e.type!=="color"&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4)),Number((.2126*r[0]+.7152*r[1]+.0722*r[2]).toFixed(3))}function Aa(e,r){const t=Da(e),n=Da(r);return(Math.max(t,n)+.05)/(Math.min(t,n)+.05)}function bi(e,r){return e=Cr(e),r=Io(r),(e.type==="rgb"||e.type==="hsl")&&(e.type+="a"),e.type==="color"?e.values[3]=`/${r}`:e.values[3]=r,kn(e)}function cu(e,r){if(e=Cr(e),r=Io(r),e.type.indexOf("hsl")!==-1)e.values[2]*=1-r;else if(e.type.indexOf("rgb")!==-1||e.type.indexOf("color")!==-1)for(let t=0;t<3;t+=1)e.values[t]*=1-r;return kn(e)}function du(e,r){if(e=Cr(e),r=Io(r),e.type.indexOf("hsl")!==-1)e.values[2]+=(100-e.values[2])*r;else if(e.type.indexOf("rgb")!==-1)for(let t=0;t<3;t+=1)e.values[t]+=(255-e.values[t])*r;else if(e.type.indexOf("color")!==-1)for(let t=0;t<3;t+=1)e.values[t]+=(1-e.values[t])*r;return kn(e)}function uu(e,r){return _({toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}}},r)}const fu={black:"#000",white:"#fff"},Et=fu,mu={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},hu=mu,gu={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},$r=gu,bu={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},Ir=bu,vu={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},it=vu,wu={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},Mr=wu,yu={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},Dr=yu,xu={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},Ar=xu,ku=["mode","contrastThreshold","tonalOffset"],Ba={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:Et.white,default:Et.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},Fn={text:{primary:Et.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:Et.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function La(e,r,t,n){const o=n.light||n,a=n.dark||n*1.5;e[r]||(e.hasOwnProperty(t)?e[r]=e[t]:r==="light"?e.light=du(e.main,o):r==="dark"&&(e.dark=cu(e.main,a)))}function Nu(e="light"){return e==="dark"?{main:Mr[200],light:Mr[50],dark:Mr[400]}:{main:Mr[700],light:Mr[400],dark:Mr[800]}}function Eu(e="light"){return e==="dark"?{main:$r[200],light:$r[50],dark:$r[400]}:{main:$r[500],light:$r[300],dark:$r[700]}}function Su(e="light"){return e==="dark"?{main:Ir[500],light:Ir[300],dark:Ir[700]}:{main:Ir[700],light:Ir[400],dark:Ir[800]}}function Tu(e="light"){return e==="dark"?{main:Dr[400],light:Dr[300],dark:Dr[700]}:{main:Dr[700],light:Dr[500],dark:Dr[900]}}function Cu(e="light"){return e==="dark"?{main:Ar[400],light:Ar[300],dark:Ar[700]}:{main:Ar[800],light:Ar[500],dark:Ar[900]}}function ju(e="light"){return e==="dark"?{main:it[400],light:it[300],dark:it[700]}:{main:"#ed6c02",light:it[500],dark:it[900]}}function Ou(e){const{mode:r="light",contrastThreshold:t=3,tonalOffset:n=.2}=e,o=ke(e,ku),a=e.primary||Nu(r),i=e.secondary||Eu(r),l=e.error||Su(r),c=e.info||Tu(r),d=e.success||Cu(r),u=e.warning||ju(r);function v(g){const b=Aa(g,Fn.text.primary)>=t?Fn.text.primary:Ba.text.primary;if(process.env.NODE_ENV!=="production"){const x=Aa(g,b);x<3&&console.error([`MUI: The contrast ratio of ${x}:1 for ${b} on ${g}`,"falls below the WCAG recommended absolute minimum contrast ratio of 3:1.","https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast"].join(` +`))}return b}const p=({color:g,name:b,mainShade:x=500,lightShade:C=300,darkShade:S=700})=>{if(g=_({},g),!g.main&&g[x]&&(g.main=g[x]),!g.hasOwnProperty("main"))throw new Error(process.env.NODE_ENV!=="production"?`MUI: The color${b?` (${b})`:""} provided to augmentColor(color) is invalid. +The color object needs to have a \`main\` property or a \`${x}\` property.`:Ur(11,b?` (${b})`:"",x));if(typeof g.main!="string")throw new Error(process.env.NODE_ENV!=="production"?`MUI: The color${b?` (${b})`:""} provided to augmentColor(color) is invalid. +\`color.main\` should be a string, but \`${JSON.stringify(g.main)}\` was provided instead. + +Did you intend to use one of the following approaches? + +import { green } from "@mui/material/colors"; + +const theme1 = createTheme({ palette: { + primary: green, +} }); + +const theme2 = createTheme({ palette: { + primary: { main: green[500] }, +} });`:Ur(12,b?` (${b})`:"",JSON.stringify(g.main)));return La(g,"light",C,n),La(g,"dark",S,n),g.contrastText||(g.contrastText=v(g.main)),g},h={dark:Fn,light:Ba};return process.env.NODE_ENV!=="production"&&(h[r]||console.error(`MUI: The palette mode \`${r}\` is not supported.`)),er(_({common:_({},Et),mode:r,primary:p({color:a,name:"primary"}),secondary:p({color:i,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:p({color:l,name:"error"}),warning:p({color:u,name:"warning"}),info:p({color:c,name:"info"}),success:p({color:d,name:"success"}),grey:hu,contrastThreshold:t,getContrastText:v,augmentColor:p,tonalOffset:n},h[r]),o)}const Ru=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"];function Pu(e){return Math.round(e*1e5)/1e5}const Va={textTransform:"uppercase"},Fa='"Roboto", "Helvetica", "Arial", sans-serif';function _u(e,r){const t=typeof r=="function"?r(e):r,{fontFamily:n=Fa,fontSize:o=14,fontWeightLight:a=300,fontWeightRegular:i=400,fontWeightMedium:l=500,fontWeightBold:c=700,htmlFontSize:d=16,allVariants:u,pxToRem:v}=t,p=ke(t,Ru);process.env.NODE_ENV!=="production"&&(typeof o!="number"&&console.error("MUI: `fontSize` is required to be a number."),typeof d!="number"&&console.error("MUI: `htmlFontSize` is required to be a number."));const h=o/14,f=v||(x=>`${x/d*h}rem`),g=(x,C,S,k,w)=>_({fontFamily:n,fontWeight:x,fontSize:f(C),lineHeight:S},n===Fa?{letterSpacing:`${Pu(k/C)}em`}:{},w,u),b={h1:g(a,96,1.167,-1.5),h2:g(a,60,1.2,-.5),h3:g(i,48,1.167,0),h4:g(i,34,1.235,.25),h5:g(i,24,1.334,0),h6:g(l,20,1.6,.15),subtitle1:g(i,16,1.75,.15),subtitle2:g(l,14,1.57,.1),body1:g(i,16,1.5,.15),body2:g(i,14,1.43,.15),button:g(l,14,1.75,.4,Va),caption:g(i,12,1.66,.4),overline:g(i,12,2.66,1,Va),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}};return er(_({htmlFontSize:d,pxToRem:f,fontFamily:n,fontSize:o,fontWeightLight:a,fontWeightRegular:i,fontWeightMedium:l,fontWeightBold:c},b),p,{clone:!1})}const $u=.2,Iu=.14,Mu=.12;function me(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${$u})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${Iu})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${Mu})`].join(",")}const Du=["none",me(0,2,1,-1,0,1,1,0,0,1,3,0),me(0,3,1,-2,0,2,2,0,0,1,5,0),me(0,3,3,-2,0,3,4,0,0,1,8,0),me(0,2,4,-1,0,4,5,0,0,1,10,0),me(0,3,5,-1,0,5,8,0,0,1,14,0),me(0,3,5,-1,0,6,10,0,0,1,18,0),me(0,4,5,-2,0,7,10,1,0,2,16,1),me(0,5,5,-3,0,8,10,1,0,3,14,2),me(0,5,6,-3,0,9,12,1,0,3,16,2),me(0,6,6,-3,0,10,14,1,0,4,18,3),me(0,6,7,-4,0,11,15,1,0,4,20,3),me(0,7,8,-4,0,12,17,2,0,5,22,4),me(0,7,8,-4,0,13,19,2,0,5,24,4),me(0,7,9,-4,0,14,21,2,0,5,26,4),me(0,8,9,-5,0,15,22,2,0,6,28,5),me(0,8,10,-5,0,16,24,2,0,6,30,5),me(0,8,11,-5,0,17,26,2,0,6,32,5),me(0,9,11,-5,0,18,28,2,0,7,34,6),me(0,9,12,-6,0,19,29,2,0,7,36,6),me(0,10,13,-6,0,20,31,3,0,8,38,7),me(0,10,13,-6,0,21,33,3,0,8,40,7),me(0,10,14,-6,0,22,35,3,0,8,42,7),me(0,11,14,-7,0,23,36,3,0,9,44,8),me(0,11,15,-7,0,24,38,3,0,9,46,8)],Au=Du,Bu=["duration","easing","delay"],Lu={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},Vu={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function za(e){return`${Math.round(e)}ms`}function Fu(e){if(!e)return 0;const r=e/36;return Math.round((4+15*r**.25+r/5)*10)}function zu(e){const r=_({},Lu,e.easing),t=_({},Vu,e.duration);return _({getAutoHeightDuration:Fu,create:(o=["all"],a={})=>{const{duration:i=t.standard,easing:l=r.easeInOut,delay:c=0}=a,d=ke(a,Bu);if(process.env.NODE_ENV!=="production"){const u=p=>typeof p=="string",v=p=>!isNaN(parseFloat(p));!u(o)&&!Array.isArray(o)&&console.error('MUI: Argument "props" must be a string or Array.'),!v(i)&&!u(i)&&console.error(`MUI: Argument "duration" must be a number or a string but found ${i}.`),u(l)||console.error('MUI: Argument "easing" must be a string.'),!v(c)&&!u(c)&&console.error('MUI: Argument "delay" must be a number or a string.'),typeof a!="object"&&console.error(["MUI: Secong argument of transition.create must be an object.","Arguments should be either `create('prop1', options)` or `create(['prop1', 'prop2'], options)`"].join(` +`)),Object.keys(d).length!==0&&console.error(`MUI: Unrecognized argument(s) [${Object.keys(d).join(",")}].`)}return(Array.isArray(o)?o:[o]).map(u=>`${u} ${typeof i=="string"?i:za(i)} ${l} ${typeof c=="string"?c:za(c)}`).join(",")}},e,{easing:r,duration:t})}const Gu={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500},Uu=Gu,Hu=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];function qu(e={},...r){const{mixins:t={},palette:n={},transitions:o={},typography:a={}}=e,i=ke(e,Hu);if(e.vars)throw new Error(process.env.NODE_ENV!=="production"?"MUI: `vars` is a private field used for CSS variables support.\nPlease use another name.":Ur(18));const l=Ou(n),c=$o(e);let d=er(c,{mixins:uu(c.breakpoints,t),palette:l,shadows:Au.slice(),typography:_u(l,a),transitions:zu(o),zIndex:_({},Uu)});if(d=er(d,i),d=r.reduce((u,v)=>er(u,v),d),process.env.NODE_ENV!=="production"){const u=["active","checked","completed","disabled","error","expanded","focused","focusVisible","required","selected"],v=(p,h)=>{let f;for(f in p){const g=p[f];if(u.indexOf(f)!==-1&&Object.keys(g).length>0){if(process.env.NODE_ENV!=="production"){const b=fn("",f);console.error([`MUI: The \`${h}\` component increases the CSS specificity of the \`${f}\` internal state.`,"You can not override it like this: ",JSON.stringify(p,null,2),"",`Instead, you need to use the '&.${b}' syntax:`,JSON.stringify({root:{[`&.${b}`]:g}},null,2),"","https://mui.com/r/state-classes-guide"].join(` +`))}p[f]={}}}};Object.keys(d.components).forEach(p=>{const h=d.components[p].styleOverrides;h&&p.indexOf("Mui")===0&&v(h,p)})}return d.unstable_sxConfig=_({},Po,i==null?void 0:i.unstable_sxConfig),d.unstable_sx=function(v){return _o({sx:v,theme:this})},d}const Xu=qu(),Mo=Xu,Do="$$material";function Ao({props:e,name:r}){return iu({props:e,name:r,defaultTheme:Mo,themeId:Do})}const Wu=e=>Wt(e)&&e!=="classes",Yu=au({themeId:Do,defaultTheme:Mo,rootShouldForwardProp:Wu}),Mt=Yu;function Ku(e){return fn("MuiSvgIcon",e)}di("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);const Ju=["children","className","color","component","fontSize","htmlColor","inheritViewBox","titleAccess","viewBox"],Zu=e=>{const{color:r,fontSize:t,classes:n}=e,o={root:["root",r!=="inherit"&&`color${Ye(r)}`,`fontSize${Ye(t)}`]};return jo(o,Ku,n)},Qu=Mt("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,r)=>{const{ownerState:t}=e;return[r.root,t.color!=="inherit"&&r[`color${Ye(t.color)}`],r[`fontSize${Ye(t.fontSize)}`]]}})(({theme:e,ownerState:r})=>{var t,n,o,a,i,l,c,d,u,v,p,h,f;return{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:r.hasSvgAsChild?void 0:"currentColor",flexShrink:0,transition:(t=e.transitions)==null||(n=t.create)==null?void 0:n.call(t,"fill",{duration:(o=e.transitions)==null||(o=o.duration)==null?void 0:o.shorter}),fontSize:{inherit:"inherit",small:((a=e.typography)==null||(i=a.pxToRem)==null?void 0:i.call(a,20))||"1.25rem",medium:((l=e.typography)==null||(c=l.pxToRem)==null?void 0:c.call(l,24))||"1.5rem",large:((d=e.typography)==null||(u=d.pxToRem)==null?void 0:u.call(d,35))||"2.1875rem"}[r.fontSize],color:(v=(p=(e.vars||e).palette)==null||(p=p[r.color])==null?void 0:p.main)!=null?v:{action:(h=(e.vars||e).palette)==null||(h=h.action)==null?void 0:h.active,disabled:(f=(e.vars||e).palette)==null||(f=f.action)==null?void 0:f.disabled,inherit:void 0}[r.color]}}),Bo=M.forwardRef(function(r,t){const n=Ao({props:r,name:"MuiSvgIcon"}),{children:o,className:a,color:i="inherit",component:l="svg",fontSize:c="medium",htmlColor:d,inheritViewBox:u=!1,titleAccess:v,viewBox:p="0 0 24 24"}=n,h=ke(n,Ju),f=M.isValidElement(o)&&o.type==="svg",g=_({},n,{color:i,component:l,fontSize:c,instanceFontSize:r.fontSize,inheritViewBox:u,viewBox:p,hasSvgAsChild:f}),b={};u||(b.viewBox=p);const x=Zu(g);return s.jsxs(Qu,_({as:l,className:lr(x.root,a),focusable:"false",color:d,"aria-hidden":v?void 0:!0,role:v?"img":void 0,ref:t},b,h,f&&o.props,{ownerState:g,children:[f?o.props.children:o,v?s.jsx("title",{children:v}):null]}))});process.env.NODE_ENV!=="production"&&(Bo.propTypes={children:m.node,classes:m.object,className:m.string,color:m.oneOfType([m.oneOf(["inherit","action","disabled","primary","secondary","error","info","success","warning"]),m.string]),component:m.elementType,fontSize:m.oneOfType([m.oneOf(["inherit","large","medium","small"]),m.string]),htmlColor:m.string,inheritViewBox:m.bool,shapeRendering:m.string,sx:m.oneOfType([m.arrayOf(m.oneOfType([m.func,m.object,m.bool])),m.func,m.object]),titleAccess:m.string,viewBox:m.string});Bo.muiName="SvgIcon";const Ga=Bo;function vi(e,r){function t(n,o){return s.jsx(Ga,_({"data-testid":`${r}Icon`,ref:o},n,{children:e}))}return process.env.NODE_ENV!=="production"&&(t.displayName=`${r}Icon`),t.muiName=Ga.muiName,M.memo(M.forwardRef(t))}const ef={configure:e=>{process.env.NODE_ENV!=="production"&&console.warn(["MUI: `ClassNameGenerator` import from `@mui/material/utils` is outdated and might cause unexpected issues.","","You should use `import { unstable_ClassNameGenerator } from '@mui/material/className'` instead","","The detail of the issue: https://github.com/mui/material-ui/issues/30011#issuecomment-1024993401","","The updated documentation: https://mui.com/guides/classname-generator/"].join(` +`)),pi.configure(e)}},rf=Object.freeze(Object.defineProperty({__proto__:null,capitalize:Ye,createChainedFunction:Rc,createSvgIcon:vi,debounce:Pc,deprecatedPropType:_c,isMuiElement:$c,ownerDocument:Qt,ownerWindow:Ic,requirePropFactory:Mc,setRef:en,unstable_ClassNameGenerator:ef,unstable_useEnhancedEffect:Hr,unstable_useId:ai,unsupportedProp:Bc,useControlled:si,useEventCallback:eo,useForkRef:Tr,useIsFocusVisible:ii},Symbol.toStringTag,{value:"Module"})),tf=cc(rf);var Ua;function nf(){return Ua||(Ua=1,function(e){"use client";Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return r.createSvgIcon}});var r=tf}($n)),$n}var of=dc;Object.defineProperty(So,"__esModule",{value:!0});var wi=So.default=void 0,af=of(nf()),sf=s;wi=So.default=(0,af.default)((0,sf.jsx)("path",{d:"m10 17 5-5-5-5z"}),"ArrowRight");function lf(e){return typeof e=="string"}function mt(e,r,t){return e===void 0||lf(e)?r:_({},r,{ownerState:_({},r.ownerState,t)})}const pf={disableDefaultClasses:!1},cf=M.createContext(pf);function df(e){const{disableDefaultClasses:r}=M.useContext(cf);return t=>r?"":e(t)}function uf(e,r=[]){if(e===void 0)return{};const t={};return Object.keys(e).filter(n=>n.match(/^on[A-Z]/)&&typeof e[n]=="function"&&!r.includes(n)).forEach(n=>{t[n]=e[n]}),t}function ff(e,r,t){return typeof e=="function"?e(r,t):e}function Ha(e){if(e===void 0)return{};const r={};return Object.keys(e).filter(t=>!(t.match(/^on[A-Z]/)&&typeof e[t]=="function")).forEach(t=>{r[t]=e[t]}),r}function mf(e){const{getSlotProps:r,additionalProps:t,externalSlotProps:n,externalForwardedProps:o,className:a}=e;if(!r){const h=lr(t==null?void 0:t.className,a,o==null?void 0:o.className,n==null?void 0:n.className),f=_({},t==null?void 0:t.style,o==null?void 0:o.style,n==null?void 0:n.style),g=_({},t,o,n);return h.length>0&&(g.className=h),Object.keys(f).length>0&&(g.style=f),{props:g,internalRef:void 0}}const i=uf(_({},o,n)),l=Ha(n),c=Ha(o),d=r(i),u=lr(d==null?void 0:d.className,t==null?void 0:t.className,a,o==null?void 0:o.className,n==null?void 0:n.className),v=_({},d==null?void 0:d.style,t==null?void 0:t.style,o==null?void 0:o.style,n==null?void 0:n.style),p=_({},d,t,c,l);return u.length>0&&(p.className=u),Object.keys(v).length>0&&(p.style=v),{props:p,internalRef:d.ref}}const hf=["elementType","externalSlotProps","ownerState","skipResolvingSlotProps"];function gf(e){var r;const{elementType:t,externalSlotProps:n,ownerState:o,skipResolvingSlotProps:a=!1}=e,i=ke(e,hf),l=a?{}:ff(n,o),{props:c,internalRef:d}=mf(_({},i,{externalSlotProps:l})),u=Tr(d,l==null?void 0:l.ref,(r=e.additionalProps)==null?void 0:r.ref);return mt(t,_({},c,{ref:u}),o)}const yi="base";function bf(e){return`${yi}--${e}`}function vf(e,r){return`${yi}-${e}-${r}`}function xi(e,r){const t=ci[r];return t?bf(t):vf(e,r)}function wf(e,r){const t={};return r.forEach(n=>{t[n]=xi(e,n)}),t}function yf(e){return typeof e=="function"?e():e}const tn=M.forwardRef(function(r,t){const{children:n,container:o,disablePortal:a=!1}=r,[i,l]=M.useState(null),c=Tr(M.isValidElement(n)?n.ref:null,t);if(Hr(()=>{a||l(yf(o)||document.body)},[o,a]),Hr(()=>{if(i&&!a)return en(t,i),()=>{en(t,null)}},[t,i,a]),a){if(M.isValidElement(n)){const d={ref:c};return M.cloneElement(n,d)}return s.jsx(M.Fragment,{children:n})}return s.jsx(M.Fragment,{children:i&&Kl.createPortal(n,i)})});process.env.NODE_ENV!=="production"&&(tn.propTypes={children:m.node,container:m.oneOfType([Nt,m.func]),disablePortal:m.bool});process.env.NODE_ENV!=="production"&&(tn["propTypes"]=Nc(tn.propTypes));var Ce="top",Ve="bottom",Fe="right",je="left",Lo="auto",Dt=[Ce,Ve,Fe,je],qr="start",St="end",xf="clippingParents",ki="viewport",lt="popper",kf="reference",qa=Dt.reduce(function(e,r){return e.concat([r+"-"+qr,r+"-"+St])},[]),Ni=[].concat(Dt,[Lo]).reduce(function(e,r){return e.concat([r,r+"-"+qr,r+"-"+St])},[]),Nf="beforeRead",Ef="read",Sf="afterRead",Tf="beforeMain",Cf="main",jf="afterMain",Of="beforeWrite",Rf="write",Pf="afterWrite",_f=[Nf,Ef,Sf,Tf,Cf,jf,Of,Rf,Pf];function Ke(e){return e?(e.nodeName||"").toLowerCase():null}function Me(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var r=e.ownerDocument;return r&&r.defaultView||window}return e}function jr(e){var r=Me(e).Element;return e instanceof r||e instanceof Element}function Le(e){var r=Me(e).HTMLElement;return e instanceof r||e instanceof HTMLElement}function Vo(e){if(typeof ShadowRoot>"u")return!1;var r=Me(e).ShadowRoot;return e instanceof r||e instanceof ShadowRoot}function $f(e){var r=e.state;Object.keys(r.elements).forEach(function(t){var n=r.styles[t]||{},o=r.attributes[t]||{},a=r.elements[t];!Le(a)||!Ke(a)||(Object.assign(a.style,n),Object.keys(o).forEach(function(i){var l=o[i];l===!1?a.removeAttribute(i):a.setAttribute(i,l===!0?"":l)}))})}function If(e){var r=e.state,t={popper:{position:r.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(r.elements.popper.style,t.popper),r.styles=t,r.elements.arrow&&Object.assign(r.elements.arrow.style,t.arrow),function(){Object.keys(r.elements).forEach(function(n){var o=r.elements[n],a=r.attributes[n]||{},i=Object.keys(r.styles.hasOwnProperty(n)?r.styles[n]:t[n]),l=i.reduce(function(c,d){return c[d]="",c},{});!Le(o)||!Ke(o)||(Object.assign(o.style,l),Object.keys(a).forEach(function(c){o.removeAttribute(c)}))})}}const Mf={name:"applyStyles",enabled:!0,phase:"write",fn:$f,effect:If,requires:["computeStyles"]};function Xe(e){return e.split("-")[0]}var xr=Math.max,nn=Math.min,Xr=Math.round;function to(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(r){return r.brand+"/"+r.version}).join(" "):navigator.userAgent}function Ei(){return!/^((?!chrome|android).)*safari/i.test(to())}function Wr(e,r,t){r===void 0&&(r=!1),t===void 0&&(t=!1);var n=e.getBoundingClientRect(),o=1,a=1;r&&Le(e)&&(o=e.offsetWidth>0&&Xr(n.width)/e.offsetWidth||1,a=e.offsetHeight>0&&Xr(n.height)/e.offsetHeight||1);var i=jr(e)?Me(e):window,l=i.visualViewport,c=!Ei()&&t,d=(n.left+(c&&l?l.offsetLeft:0))/o,u=(n.top+(c&&l?l.offsetTop:0))/a,v=n.width/o,p=n.height/a;return{width:v,height:p,top:u,right:d+v,bottom:u+p,left:d,x:d,y:u}}function Fo(e){var r=Wr(e),t=e.offsetWidth,n=e.offsetHeight;return Math.abs(r.width-t)<=1&&(t=r.width),Math.abs(r.height-n)<=1&&(n=r.height),{x:e.offsetLeft,y:e.offsetTop,width:t,height:n}}function Si(e,r){var t=r.getRootNode&&r.getRootNode();if(e.contains(r))return!0;if(t&&Vo(t)){var n=r;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function tr(e){return Me(e).getComputedStyle(e)}function Df(e){return["table","td","th"].indexOf(Ke(e))>=0}function dr(e){return((jr(e)?e.ownerDocument:e.document)||window.document).documentElement}function Nn(e){return Ke(e)==="html"?e:e.assignedSlot||e.parentNode||(Vo(e)?e.host:null)||dr(e)}function Xa(e){return!Le(e)||tr(e).position==="fixed"?null:e.offsetParent}function Af(e){var r=/firefox/i.test(to()),t=/Trident/i.test(to());if(t&&Le(e)){var n=tr(e);if(n.position==="fixed")return null}var o=Nn(e);for(Vo(o)&&(o=o.host);Le(o)&&["html","body"].indexOf(Ke(o))<0;){var a=tr(o);if(a.transform!=="none"||a.perspective!=="none"||a.contain==="paint"||["transform","perspective"].indexOf(a.willChange)!==-1||r&&a.willChange==="filter"||r&&a.filter&&a.filter!=="none")return o;o=o.parentNode}return null}function At(e){for(var r=Me(e),t=Xa(e);t&&Df(t)&&tr(t).position==="static";)t=Xa(t);return t&&(Ke(t)==="html"||Ke(t)==="body"&&tr(t).position==="static")?r:t||Af(e)||r}function zo(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function wt(e,r,t){return xr(e,nn(r,t))}function Bf(e,r,t){var n=wt(e,r,t);return n>t?t:n}function Ti(){return{top:0,right:0,bottom:0,left:0}}function Ci(e){return Object.assign({},Ti(),e)}function ji(e,r){return r.reduce(function(t,n){return t[n]=e,t},{})}var Lf=function(r,t){return r=typeof r=="function"?r(Object.assign({},t.rects,{placement:t.placement})):r,Ci(typeof r!="number"?r:ji(r,Dt))};function Vf(e){var r,t=e.state,n=e.name,o=e.options,a=t.elements.arrow,i=t.modifiersData.popperOffsets,l=Xe(t.placement),c=zo(l),d=[je,Fe].indexOf(l)>=0,u=d?"height":"width";if(!(!a||!i)){var v=Lf(o.padding,t),p=Fo(a),h=c==="y"?Ce:je,f=c==="y"?Ve:Fe,g=t.rects.reference[u]+t.rects.reference[c]-i[c]-t.rects.popper[u],b=i[c]-t.rects.reference[c],x=At(a),C=x?c==="y"?x.clientHeight||0:x.clientWidth||0:0,S=g/2-b/2,k=v[h],w=C-p[u]-v[f],j=C/2-p[u]/2+S,R=wt(k,j,w),B=c;t.modifiersData[n]=(r={},r[B]=R,r.centerOffset=R-j,r)}}function Ff(e){var r=e.state,t=e.options,n=t.element,o=n===void 0?"[data-popper-arrow]":n;o!=null&&(typeof o=="string"&&(o=r.elements.popper.querySelector(o),!o)||Si(r.elements.popper,o)&&(r.elements.arrow=o))}const zf={name:"arrow",enabled:!0,phase:"main",fn:Vf,effect:Ff,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Yr(e){return e.split("-")[1]}var Gf={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Uf(e,r){var t=e.x,n=e.y,o=r.devicePixelRatio||1;return{x:Xr(t*o)/o||0,y:Xr(n*o)/o||0}}function Wa(e){var r,t=e.popper,n=e.popperRect,o=e.placement,a=e.variation,i=e.offsets,l=e.position,c=e.gpuAcceleration,d=e.adaptive,u=e.roundOffsets,v=e.isFixed,p=i.x,h=p===void 0?0:p,f=i.y,g=f===void 0?0:f,b=typeof u=="function"?u({x:h,y:g}):{x:h,y:g};h=b.x,g=b.y;var x=i.hasOwnProperty("x"),C=i.hasOwnProperty("y"),S=je,k=Ce,w=window;if(d){var j=At(t),R="clientHeight",B="clientWidth";if(j===Me(t)&&(j=dr(t),tr(j).position!=="static"&&l==="absolute"&&(R="scrollHeight",B="scrollWidth")),j=j,o===Ce||(o===je||o===Fe)&&a===St){k=Ve;var T=v&&j===w&&w.visualViewport?w.visualViewport.height:j[R];g-=T-n.height,g*=c?1:-1}if(o===je||(o===Ce||o===Ve)&&a===St){S=Fe;var P=v&&j===w&&w.visualViewport?w.visualViewport.width:j[B];h-=P-n.width,h*=c?1:-1}}var N=Object.assign({position:l},d&&Gf),A=u===!0?Uf({x:h,y:g},Me(t)):{x:h,y:g};if(h=A.x,g=A.y,c){var D;return Object.assign({},N,(D={},D[k]=C?"0":"",D[S]=x?"0":"",D.transform=(w.devicePixelRatio||1)<=1?"translate("+h+"px, "+g+"px)":"translate3d("+h+"px, "+g+"px, 0)",D))}return Object.assign({},N,(r={},r[k]=C?g+"px":"",r[S]=x?h+"px":"",r.transform="",r))}function Hf(e){var r=e.state,t=e.options,n=t.gpuAcceleration,o=n===void 0?!0:n,a=t.adaptive,i=a===void 0?!0:a,l=t.roundOffsets,c=l===void 0?!0:l,d={placement:Xe(r.placement),variation:Yr(r.placement),popper:r.elements.popper,popperRect:r.rects.popper,gpuAcceleration:o,isFixed:r.options.strategy==="fixed"};r.modifiersData.popperOffsets!=null&&(r.styles.popper=Object.assign({},r.styles.popper,Wa(Object.assign({},d,{offsets:r.modifiersData.popperOffsets,position:r.options.strategy,adaptive:i,roundOffsets:c})))),r.modifiersData.arrow!=null&&(r.styles.arrow=Object.assign({},r.styles.arrow,Wa(Object.assign({},d,{offsets:r.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),r.attributes.popper=Object.assign({},r.attributes.popper,{"data-popper-placement":r.placement})}const qf={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Hf,data:{}};var Ut={passive:!0};function Xf(e){var r=e.state,t=e.instance,n=e.options,o=n.scroll,a=o===void 0?!0:o,i=n.resize,l=i===void 0?!0:i,c=Me(r.elements.popper),d=[].concat(r.scrollParents.reference,r.scrollParents.popper);return a&&d.forEach(function(u){u.addEventListener("scroll",t.update,Ut)}),l&&c.addEventListener("resize",t.update,Ut),function(){a&&d.forEach(function(u){u.removeEventListener("scroll",t.update,Ut)}),l&&c.removeEventListener("resize",t.update,Ut)}}const Wf={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Xf,data:{}};var Yf={left:"right",right:"left",bottom:"top",top:"bottom"};function Kt(e){return e.replace(/left|right|bottom|top/g,function(r){return Yf[r]})}var Kf={start:"end",end:"start"};function Ya(e){return e.replace(/start|end/g,function(r){return Kf[r]})}function Go(e){var r=Me(e),t=r.pageXOffset,n=r.pageYOffset;return{scrollLeft:t,scrollTop:n}}function Uo(e){return Wr(dr(e)).left+Go(e).scrollLeft}function Jf(e,r){var t=Me(e),n=dr(e),o=t.visualViewport,a=n.clientWidth,i=n.clientHeight,l=0,c=0;if(o){a=o.width,i=o.height;var d=Ei();(d||!d&&r==="fixed")&&(l=o.offsetLeft,c=o.offsetTop)}return{width:a,height:i,x:l+Uo(e),y:c}}function Zf(e){var r,t=dr(e),n=Go(e),o=(r=e.ownerDocument)==null?void 0:r.body,a=xr(t.scrollWidth,t.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),i=xr(t.scrollHeight,t.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),l=-n.scrollLeft+Uo(e),c=-n.scrollTop;return tr(o||t).direction==="rtl"&&(l+=xr(t.clientWidth,o?o.clientWidth:0)-a),{width:a,height:i,x:l,y:c}}function Ho(e){var r=tr(e),t=r.overflow,n=r.overflowX,o=r.overflowY;return/auto|scroll|overlay|hidden/.test(t+o+n)}function Oi(e){return["html","body","#document"].indexOf(Ke(e))>=0?e.ownerDocument.body:Le(e)&&Ho(e)?e:Oi(Nn(e))}function yt(e,r){var t;r===void 0&&(r=[]);var n=Oi(e),o=n===((t=e.ownerDocument)==null?void 0:t.body),a=Me(n),i=o?[a].concat(a.visualViewport||[],Ho(n)?n:[]):n,l=r.concat(i);return o?l:l.concat(yt(Nn(i)))}function no(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Qf(e,r){var t=Wr(e,!1,r==="fixed");return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function Ka(e,r,t){return r===ki?no(Jf(e,t)):jr(r)?Qf(r,t):no(Zf(dr(e)))}function em(e){var r=yt(Nn(e)),t=["absolute","fixed"].indexOf(tr(e).position)>=0,n=t&&Le(e)?At(e):e;return jr(n)?r.filter(function(o){return jr(o)&&Si(o,n)&&Ke(o)!=="body"}):[]}function rm(e,r,t,n){var o=r==="clippingParents"?em(e):[].concat(r),a=[].concat(o,[t]),i=a[0],l=a.reduce(function(c,d){var u=Ka(e,d,n);return c.top=xr(u.top,c.top),c.right=nn(u.right,c.right),c.bottom=nn(u.bottom,c.bottom),c.left=xr(u.left,c.left),c},Ka(e,i,n));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l}function Ri(e){var r=e.reference,t=e.element,n=e.placement,o=n?Xe(n):null,a=n?Yr(n):null,i=r.x+r.width/2-t.width/2,l=r.y+r.height/2-t.height/2,c;switch(o){case Ce:c={x:i,y:r.y-t.height};break;case Ve:c={x:i,y:r.y+r.height};break;case Fe:c={x:r.x+r.width,y:l};break;case je:c={x:r.x-t.width,y:l};break;default:c={x:r.x,y:r.y}}var d=o?zo(o):null;if(d!=null){var u=d==="y"?"height":"width";switch(a){case qr:c[d]=c[d]-(r[u]/2-t[u]/2);break;case St:c[d]=c[d]+(r[u]/2-t[u]/2);break}}return c}function Tt(e,r){r===void 0&&(r={});var t=r,n=t.placement,o=n===void 0?e.placement:n,a=t.strategy,i=a===void 0?e.strategy:a,l=t.boundary,c=l===void 0?xf:l,d=t.rootBoundary,u=d===void 0?ki:d,v=t.elementContext,p=v===void 0?lt:v,h=t.altBoundary,f=h===void 0?!1:h,g=t.padding,b=g===void 0?0:g,x=Ci(typeof b!="number"?b:ji(b,Dt)),C=p===lt?kf:lt,S=e.rects.popper,k=e.elements[f?C:p],w=rm(jr(k)?k:k.contextElement||dr(e.elements.popper),c,u,i),j=Wr(e.elements.reference),R=Ri({reference:j,element:S,strategy:"absolute",placement:o}),B=no(Object.assign({},S,R)),T=p===lt?B:j,P={top:w.top-T.top+x.top,bottom:T.bottom-w.bottom+x.bottom,left:w.left-T.left+x.left,right:T.right-w.right+x.right},N=e.modifiersData.offset;if(p===lt&&N){var A=N[o];Object.keys(P).forEach(function(D){var J=[Fe,Ve].indexOf(D)>=0?1:-1,K=[Ce,Ve].indexOf(D)>=0?"y":"x";P[D]+=A[K]*J})}return P}function tm(e,r){r===void 0&&(r={});var t=r,n=t.placement,o=t.boundary,a=t.rootBoundary,i=t.padding,l=t.flipVariations,c=t.allowedAutoPlacements,d=c===void 0?Ni:c,u=Yr(n),v=u?l?qa:qa.filter(function(f){return Yr(f)===u}):Dt,p=v.filter(function(f){return d.indexOf(f)>=0});p.length===0&&(p=v);var h=p.reduce(function(f,g){return f[g]=Tt(e,{placement:g,boundary:o,rootBoundary:a,padding:i})[Xe(g)],f},{});return Object.keys(h).sort(function(f,g){return h[f]-h[g]})}function nm(e){if(Xe(e)===Lo)return[];var r=Kt(e);return[Ya(e),r,Ya(r)]}function om(e){var r=e.state,t=e.options,n=e.name;if(!r.modifiersData[n]._skip){for(var o=t.mainAxis,a=o===void 0?!0:o,i=t.altAxis,l=i===void 0?!0:i,c=t.fallbackPlacements,d=t.padding,u=t.boundary,v=t.rootBoundary,p=t.altBoundary,h=t.flipVariations,f=h===void 0?!0:h,g=t.allowedAutoPlacements,b=r.options.placement,x=Xe(b),C=x===b,S=c||(C||!f?[Kt(b)]:nm(b)),k=[b].concat(S).reduce(function(F,W){return F.concat(Xe(W)===Lo?tm(r,{placement:W,boundary:u,rootBoundary:v,padding:d,flipVariations:f,allowedAutoPlacements:g}):W)},[]),w=r.rects.reference,j=r.rects.popper,R=new Map,B=!0,T=k[0],P=0;P=0,K=J?"width":"height",H=Tt(r,{placement:N,boundary:u,rootBoundary:v,altBoundary:p,padding:d}),te=J?D?Fe:je:D?Ve:Ce;w[K]>j[K]&&(te=Kt(te));var se=Kt(te),V=[];if(a&&V.push(H[A]<=0),l&&V.push(H[te]<=0,H[se]<=0),V.every(function(F){return F})){T=N,B=!1;break}R.set(N,V)}if(B)for(var E=f?3:1,$=function(W){var G=k.find(function(Y){var X=R.get(Y);if(X)return X.slice(0,W).every(function(Z){return Z})});if(G)return T=G,"break"},q=E;q>0;q--){var z=$(q);if(z==="break")break}r.placement!==T&&(r.modifiersData[n]._skip=!0,r.placement=T,r.reset=!0)}}const am={name:"flip",enabled:!0,phase:"main",fn:om,requiresIfExists:["offset"],data:{_skip:!1}};function Ja(e,r,t){return t===void 0&&(t={x:0,y:0}),{top:e.top-r.height-t.y,right:e.right-r.width+t.x,bottom:e.bottom-r.height+t.y,left:e.left-r.width-t.x}}function Za(e){return[Ce,Fe,Ve,je].some(function(r){return e[r]>=0})}function sm(e){var r=e.state,t=e.name,n=r.rects.reference,o=r.rects.popper,a=r.modifiersData.preventOverflow,i=Tt(r,{elementContext:"reference"}),l=Tt(r,{altBoundary:!0}),c=Ja(i,n),d=Ja(l,o,a),u=Za(c),v=Za(d);r.modifiersData[t]={referenceClippingOffsets:c,popperEscapeOffsets:d,isReferenceHidden:u,hasPopperEscaped:v},r.attributes.popper=Object.assign({},r.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":v})}const im={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:sm};function lm(e,r,t){var n=Xe(e),o=[je,Ce].indexOf(n)>=0?-1:1,a=typeof t=="function"?t(Object.assign({},r,{placement:e})):t,i=a[0],l=a[1];return i=i||0,l=(l||0)*o,[je,Fe].indexOf(n)>=0?{x:l,y:i}:{x:i,y:l}}function pm(e){var r=e.state,t=e.options,n=e.name,o=t.offset,a=o===void 0?[0,0]:o,i=Ni.reduce(function(u,v){return u[v]=lm(v,r.rects,a),u},{}),l=i[r.placement],c=l.x,d=l.y;r.modifiersData.popperOffsets!=null&&(r.modifiersData.popperOffsets.x+=c,r.modifiersData.popperOffsets.y+=d),r.modifiersData[n]=i}const cm={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:pm};function dm(e){var r=e.state,t=e.name;r.modifiersData[t]=Ri({reference:r.rects.reference,element:r.rects.popper,strategy:"absolute",placement:r.placement})}const um={name:"popperOffsets",enabled:!0,phase:"read",fn:dm,data:{}};function fm(e){return e==="x"?"y":"x"}function mm(e){var r=e.state,t=e.options,n=e.name,o=t.mainAxis,a=o===void 0?!0:o,i=t.altAxis,l=i===void 0?!1:i,c=t.boundary,d=t.rootBoundary,u=t.altBoundary,v=t.padding,p=t.tether,h=p===void 0?!0:p,f=t.tetherOffset,g=f===void 0?0:f,b=Tt(r,{boundary:c,rootBoundary:d,padding:v,altBoundary:u}),x=Xe(r.placement),C=Yr(r.placement),S=!C,k=zo(x),w=fm(k),j=r.modifiersData.popperOffsets,R=r.rects.reference,B=r.rects.popper,T=typeof g=="function"?g(Object.assign({},r.rects,{placement:r.placement})):g,P=typeof T=="number"?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),N=r.modifiersData.offset?r.modifiersData.offset[r.placement]:null,A={x:0,y:0};if(j){if(a){var D,J=k==="y"?Ce:je,K=k==="y"?Ve:Fe,H=k==="y"?"height":"width",te=j[k],se=te+b[J],V=te-b[K],E=h?-B[H]/2:0,$=C===qr?R[H]:B[H],q=C===qr?-B[H]:-R[H],z=r.elements.arrow,F=h&&z?Fo(z):{width:0,height:0},W=r.modifiersData["arrow#persistent"]?r.modifiersData["arrow#persistent"].padding:Ti(),G=W[J],Y=W[K],X=wt(0,R[H],F[H]),Z=S?R[H]/2-E-X-G-P.mainAxis:$-X-G-P.mainAxis,Q=S?-R[H]/2+E+X+Y+P.mainAxis:q+X+Y+P.mainAxis,ue=r.elements.arrow&&At(r.elements.arrow),I=ue?k==="y"?ue.clientTop||0:ue.clientLeft||0:0,xe=(D=N==null?void 0:N[k])!=null?D:0,L=te+Z-xe-I,ye=te+Q-xe,Ge=wt(h?nn(se,L):se,te,h?xr(V,ye):V);j[k]=Ge,A[k]=Ge-te}if(l){var ur,Se=k==="x"?Ce:je,Bt=k==="x"?Ve:Fe,Ue=j[w],Or=w==="y"?"height":"width",fr=Ue+b[Se],Rr=Ue-b[Bt],Pr=[Ce,je].indexOf(x)!==-1,_r=(ur=N==null?void 0:N[w])!=null?ur:0,mr=Pr?fr:Ue-R[Or]-B[Or]-_r+P.altAxis,et=Pr?Ue+R[Or]+B[Or]-_r-P.altAxis:Rr,Lt=h&&Pr?Bf(mr,Ue,et):wt(h?mr:fr,Ue,h?et:Rr);j[w]=Lt,A[w]=Lt-Ue}r.modifiersData[n]=A}}const hm={name:"preventOverflow",enabled:!0,phase:"main",fn:mm,requiresIfExists:["offset"]};function gm(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function bm(e){return e===Me(e)||!Le(e)?Go(e):gm(e)}function vm(e){var r=e.getBoundingClientRect(),t=Xr(r.width)/e.offsetWidth||1,n=Xr(r.height)/e.offsetHeight||1;return t!==1||n!==1}function wm(e,r,t){t===void 0&&(t=!1);var n=Le(r),o=Le(r)&&vm(r),a=dr(r),i=Wr(e,o,t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!t)&&((Ke(r)!=="body"||Ho(a))&&(l=bm(r)),Le(r)?(c=Wr(r,!0),c.x+=r.clientLeft,c.y+=r.clientTop):a&&(c.x=Uo(a))),{x:i.left+l.scrollLeft-c.x,y:i.top+l.scrollTop-c.y,width:i.width,height:i.height}}function ym(e){var r=new Map,t=new Set,n=[];e.forEach(function(a){r.set(a.name,a)});function o(a){t.add(a.name);var i=[].concat(a.requires||[],a.requiresIfExists||[]);i.forEach(function(l){if(!t.has(l)){var c=r.get(l);c&&o(c)}}),n.push(a)}return e.forEach(function(a){t.has(a.name)||o(a)}),n}function xm(e){var r=ym(e);return _f.reduce(function(t,n){return t.concat(r.filter(function(o){return o.phase===n}))},[])}function km(e){var r;return function(){return r||(r=new Promise(function(t){Promise.resolve().then(function(){r=void 0,t(e())})})),r}}function Nm(e){var r=e.reduce(function(t,n){var o=t[n.name];return t[n.name]=o?Object.assign({},o,n,{options:Object.assign({},o.options,n.options),data:Object.assign({},o.data,n.data)}):n,t},{});return Object.keys(r).map(function(t){return r[t]})}var Qa={placement:"bottom",modifiers:[],strategy:"absolute"};function es(){for(var e=arguments.length,r=new Array(e),t=0;tjo({root:["root"]},df(Cm)),$m={},Im=M.forwardRef(function(r,t){var n;const{anchorEl:o,children:a,direction:i,disablePortal:l,modifiers:c,open:d,placement:u,popperOptions:v,popperRef:p,slotProps:h={},slots:f={},TransitionProps:g}=r,b=ke(r,jm),x=M.useRef(null),C=Tr(x,t),S=M.useRef(null),k=Tr(S,p),w=M.useRef(k);Hr(()=>{w.current=k},[k]),M.useImperativeHandle(p,()=>S.current,[]);const j=Rm(u,i),[R,B]=M.useState(j),[T,P]=M.useState(on(o));M.useEffect(()=>{S.current&&S.current.forceUpdate()}),M.useEffect(()=>{o&&P(on(o))},[o]),Hr(()=>{if(!T||!d)return;const K=se=>{B(se.placement)};if(process.env.NODE_ENV!=="production"&&T&&En(T)&&T.nodeType===1){const se=T.getBoundingClientRect();process.env.NODE_ENV!=="test"&&se.top===0&&se.left===0&&se.right===0&&se.bottom===0&&console.warn(["MUI: The `anchorEl` prop provided to the component is invalid.","The anchor element should be part of the document layout.","Make sure the element is present in the document or that it's not display none."].join(` +`))}let H=[{name:"preventOverflow",options:{altBoundary:l}},{name:"flip",options:{altBoundary:l}},{name:"onUpdate",enabled:!0,phase:"afterWrite",fn:({state:se})=>{K(se)}}];c!=null&&(H=H.concat(c)),v&&v.modifiers!=null&&(H=H.concat(v.modifiers));const te=Tm(T,x.current,_({placement:j},v,{modifiers:H}));return w.current(te),()=>{te.destroy(),w.current(null)}},[T,l,c,d,v,j]);const N={placement:R};g!==null&&(N.TransitionProps=g);const A=_m(),D=(n=f.root)!=null?n:"div",J=gf({elementType:D,externalSlotProps:h.root,externalForwardedProps:b,additionalProps:{role:"tooltip",ref:C},ownerState:r,className:A.root});return s.jsx(D,_({},J,{children:typeof a=="function"?a(N):a}))}),_i=M.forwardRef(function(r,t){const{anchorEl:n,children:o,container:a,direction:i="ltr",disablePortal:l=!1,keepMounted:c=!1,modifiers:d,open:u,placement:v="bottom",popperOptions:p=$m,popperRef:h,style:f,transition:g=!1,slotProps:b={},slots:x={}}=r,C=ke(r,Om),[S,k]=M.useState(!0),w=()=>{k(!1)},j=()=>{k(!0)};if(!c&&!u&&(!g||S))return null;let R;if(a)R=a;else if(n){const P=on(n);R=P&&En(P)?Qt(P).body:Qt(null).body}const B=!u&&c&&(!g||S)?"none":void 0,T=g?{in:u,onEnter:w,onExited:j}:void 0;return s.jsx(tn,{disablePortal:l,container:R,children:s.jsx(Im,_({anchorEl:n,direction:i,disablePortal:l,modifiers:d,ref:t,open:g?!S:u,placement:v,popperOptions:p,popperRef:h,slotProps:b,slots:x},C,{style:_({position:"fixed",top:0,left:0,display:B},f),TransitionProps:T,children:o}))})});process.env.NODE_ENV!=="production"&&(_i.propTypes={anchorEl:To(m.oneOfType([Nt,m.object,m.func]),e=>{if(e.open){const r=on(e.anchorEl);if(r&&En(r)&&r.nodeType===1){const t=r.getBoundingClientRect();if(process.env.NODE_ENV!=="test"&&t.top===0&&t.left===0&&t.right===0&&t.bottom===0)return new Error(["MUI: The `anchorEl` prop provided to the component is invalid.","The anchor element should be part of the document layout.","Make sure the element is present in the document or that it's not display none."].join(` +`))}else if(!r||typeof r.getBoundingClientRect!="function"||Pm(r)&&r.contextElement!=null&&r.contextElement.nodeType!==1)return new Error(["MUI: The `anchorEl` prop provided to the component is invalid.","It should be an HTML element instance or a virtualElement ","(https://popper.js.org/docs/v2/virtual-elements/)."].join(` +`))}return null}),children:m.oneOfType([m.node,m.func]),container:m.oneOfType([Nt,m.func]),direction:m.oneOf(["ltr","rtl"]),disablePortal:m.bool,keepMounted:m.bool,modifiers:m.arrayOf(m.shape({data:m.object,effect:m.func,enabled:m.bool,fn:m.func,name:m.any,options:m.object,phase:m.oneOf(["afterMain","afterRead","afterWrite","beforeMain","beforeRead","beforeWrite","main","read","write"]),requires:m.arrayOf(m.string),requiresIfExists:m.arrayOf(m.string)})),open:m.bool.isRequired,placement:m.oneOf(["auto-end","auto-start","auto","bottom-end","bottom-start","bottom","left-end","left-start","left","right-end","right-start","right","top-end","top-start","top"]),popperOptions:m.shape({modifiers:m.array,onFirstUpdate:m.func,placement:m.oneOf(["auto-end","auto-start","auto","bottom-end","bottom-start","bottom","left-end","left-start","left","right-end","right-start","right","top-end","top-start","top"]),strategy:m.oneOf(["absolute","fixed"])}),popperRef:oi,slotProps:m.shape({root:m.oneOfType([m.func,m.object])}),slots:m.shape({root:m.elementType}),transition:m.bool});function $i(){const e=gi(Mo);return process.env.NODE_ENV!=="production"&&M.useDebugValue(e),e[Do]||e}function oo(e,r){return oo=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,o){return n.__proto__=o,n},oo(e,r)}function Mm(e,r){e.prototype=Object.create(r.prototype),e.prototype.constructor=e,oo(e,r)}const rs={disabled:!1};var Dm=process.env.NODE_ENV!=="production"?m.oneOfType([m.number,m.shape({enter:m.number,exit:m.number,appear:m.number}).isRequired]):null;process.env.NODE_ENV!=="production"&&m.oneOfType([m.string,m.shape({enter:m.string,exit:m.string,active:m.string}),m.shape({enter:m.string,enterDone:m.string,enterActive:m.string,exit:m.string,exitDone:m.string,exitActive:m.string})]);const Ii=y.createContext(null);var Am=function(r){return r.scrollTop},ht="unmounted",br="exited",vr="entering",Lr="entered",ao="exiting",nr=function(e){Mm(r,e);function r(n,o){var a;a=e.call(this,n,o)||this;var i=o,l=i&&!i.isMounting?n.enter:n.appear,c;return a.appearStatus=null,n.in?l?(c=br,a.appearStatus=vr):c=Lr:n.unmountOnExit||n.mountOnEnter?c=ht:c=br,a.state={status:c},a.nextCallback=null,a}r.getDerivedStateFromProps=function(o,a){var i=o.in;return i&&a.status===ht?{status:br}:null};var t=r.prototype;return t.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},t.componentDidUpdate=function(o){var a=null;if(o!==this.props){var i=this.state.status;this.props.in?i!==vr&&i!==Lr&&(a=vr):(i===vr||i===Lr)&&(a=ao)}this.updateStatus(!1,a)},t.componentWillUnmount=function(){this.cancelNextCallback()},t.getTimeouts=function(){var o=this.props.timeout,a,i,l;return a=i=l=o,o!=null&&typeof o!="number"&&(a=o.exit,i=o.enter,l=o.appear!==void 0?o.appear:i),{exit:a,enter:i,appear:l}},t.updateStatus=function(o,a){if(o===void 0&&(o=!1),a!==null)if(this.cancelNextCallback(),a===vr){if(this.props.unmountOnExit||this.props.mountOnEnter){var i=this.props.nodeRef?this.props.nodeRef.current:dt.findDOMNode(this);i&&Am(i)}this.performEnter(o)}else this.performExit();else this.props.unmountOnExit&&this.state.status===br&&this.setState({status:ht})},t.performEnter=function(o){var a=this,i=this.props.enter,l=this.context?this.context.isMounting:o,c=this.props.nodeRef?[l]:[dt.findDOMNode(this),l],d=c[0],u=c[1],v=this.getTimeouts(),p=l?v.appear:v.enter;if(!o&&!i||rs.disabled){this.safeSetState({status:Lr},function(){a.props.onEntered(d)});return}this.props.onEnter(d,u),this.safeSetState({status:vr},function(){a.props.onEntering(d,u),a.onTransitionEnd(p,function(){a.safeSetState({status:Lr},function(){a.props.onEntered(d,u)})})})},t.performExit=function(){var o=this,a=this.props.exit,i=this.getTimeouts(),l=this.props.nodeRef?void 0:dt.findDOMNode(this);if(!a||rs.disabled){this.safeSetState({status:br},function(){o.props.onExited(l)});return}this.props.onExit(l),this.safeSetState({status:ao},function(){o.props.onExiting(l),o.onTransitionEnd(i.exit,function(){o.safeSetState({status:br},function(){o.props.onExited(l)})})})},t.cancelNextCallback=function(){this.nextCallback!==null&&(this.nextCallback.cancel(),this.nextCallback=null)},t.safeSetState=function(o,a){a=this.setNextCallback(a),this.setState(o,a)},t.setNextCallback=function(o){var a=this,i=!0;return this.nextCallback=function(l){i&&(i=!1,a.nextCallback=null,o(l))},this.nextCallback.cancel=function(){i=!1},this.nextCallback},t.onTransitionEnd=function(o,a){this.setNextCallback(a);var i=this.props.nodeRef?this.props.nodeRef.current:dt.findDOMNode(this),l=o==null&&!this.props.addEndListener;if(!i||l){setTimeout(this.nextCallback,0);return}if(this.props.addEndListener){var c=this.props.nodeRef?[this.nextCallback]:[i,this.nextCallback],d=c[0],u=c[1];this.props.addEndListener(d,u)}o!=null&&setTimeout(this.nextCallback,o)},t.render=function(){var o=this.state.status;if(o===ht)return null;var a=this.props,i=a.children;a.in,a.mountOnEnter,a.unmountOnExit,a.appear,a.enter,a.exit,a.timeout,a.addEndListener,a.onEnter,a.onEntering,a.onEntered,a.onExit,a.onExiting,a.onExited,a.nodeRef;var l=ke(a,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]);return y.createElement(Ii.Provider,{value:null},typeof i=="function"?i(o,l):y.cloneElement(y.Children.only(i),l))},r}(y.Component);nr.contextType=Ii;nr.propTypes=process.env.NODE_ENV!=="production"?{nodeRef:m.shape({current:typeof Element>"u"?m.any:function(e,r,t,n,o,a){var i=e[r];return m.instanceOf(i&&"ownerDocument"in i?i.ownerDocument.defaultView.Element:Element)(e,r,t,n,o,a)}}),children:m.oneOfType([m.func.isRequired,m.element.isRequired]).isRequired,in:m.bool,mountOnEnter:m.bool,unmountOnExit:m.bool,appear:m.bool,enter:m.bool,exit:m.bool,timeout:function(r){var t=Dm;r.addEndListener||(t=t.isRequired);for(var n=arguments.length,o=new Array(n>1?n-1:0),a=1;ae.scrollTop;function ts(e,r){var t,n;const{timeout:o,easing:a,style:i={}}=e;return{duration:(t=i.transitionDuration)!=null?t:typeof o=="number"?o:o[r.mode]||0,easing:(n=i.transitionTimingFunction)!=null?n:typeof a=="object"?a[r.mode]:a,delay:i.transitionDelay}}const Vm=["addEndListener","appear","children","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"];function so(e){return`scale(${e}, ${e**2})`}const Fm={entering:{opacity:1,transform:so(1)},entered:{opacity:1,transform:"none"}},zn=typeof navigator<"u"&&/^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent)&&/(os |version\/)15(.|_)4/i.test(navigator.userAgent),qo=M.forwardRef(function(r,t){const{addEndListener:n,appear:o=!0,children:a,easing:i,in:l,onEnter:c,onEntered:d,onEntering:u,onExit:v,onExited:p,onExiting:h,style:f,timeout:g="auto",TransitionComponent:b=Bm}=r,x=ke(r,Vm),C=ft(),S=M.useRef(),k=$i(),w=M.useRef(null),j=Tr(w,a.ref,t),R=K=>H=>{if(K){const te=w.current;H===void 0?K(te):K(te,H)}},B=R(u),T=R((K,H)=>{Lm(K);const{duration:te,delay:se,easing:V}=ts({style:f,timeout:g,easing:i},{mode:"enter"});let E;g==="auto"?(E=k.transitions.getAutoHeightDuration(K.clientHeight),S.current=E):E=te,K.style.transition=[k.transitions.create("opacity",{duration:E,delay:se}),k.transitions.create("transform",{duration:zn?E:E*.666,delay:se,easing:V})].join(","),c&&c(K,H)}),P=R(d),N=R(h),A=R(K=>{const{duration:H,delay:te,easing:se}=ts({style:f,timeout:g,easing:i},{mode:"exit"});let V;g==="auto"?(V=k.transitions.getAutoHeightDuration(K.clientHeight),S.current=V):V=H,K.style.transition=[k.transitions.create("opacity",{duration:V,delay:te}),k.transitions.create("transform",{duration:zn?V:V*.666,delay:zn?te:te||V*.333,easing:se})].join(","),K.style.opacity=0,K.style.transform=so(.75),v&&v(K)}),D=R(p),J=K=>{g==="auto"&&C.start(S.current||0,K),n&&n(w.current,K)};return s.jsx(b,_({appear:o,in:l,nodeRef:w,onEnter:T,onEntered:P,onEntering:B,onExit:A,onExited:D,onExiting:N,addEndListener:J,timeout:g==="auto"?null:g},x,{children:(K,H)=>M.cloneElement(a,_({style:_({opacity:0,transform:so(.75),visibility:K==="exited"&&!l?"hidden":void 0},Fm[K],f,a.props.style),ref:j},H))}))});process.env.NODE_ENV!=="production"&&(qo.propTypes={addEndListener:m.func,appear:m.bool,children:ti.isRequired,easing:m.oneOfType([m.shape({enter:m.string,exit:m.string}),m.string]),in:m.bool,onEnter:m.func,onEntered:m.func,onEntering:m.func,onExit:m.func,onExited:m.func,onExiting:m.func,style:m.object,timeout:m.oneOfType([m.oneOf(["auto"]),m.number,m.shape({appear:m.number,enter:m.number,exit:m.number})])});qo.muiSupportAuto=!0;const ns=qo,zm=["anchorEl","component","components","componentsProps","container","disablePortal","keepMounted","modifiers","open","placement","popperOptions","popperRef","transition","slots","slotProps"],Gm=Mt(_i,{name:"MuiPopper",slot:"Root",overridesResolver:(e,r)=>r.root})({}),Mi=M.forwardRef(function(r,t){var n;const o=hi(),a=Ao({props:r,name:"MuiPopper"}),{anchorEl:i,component:l,components:c,componentsProps:d,container:u,disablePortal:v,keepMounted:p,modifiers:h,open:f,placement:g,popperOptions:b,popperRef:x,transition:C,slots:S,slotProps:k}=a,w=ke(a,zm),j=(n=S==null?void 0:S.root)!=null?n:c==null?void 0:c.Root,R=_({anchorEl:i,container:u,disablePortal:v,keepMounted:p,modifiers:h,open:f,placement:g,popperOptions:b,popperRef:x,transition:C},w);return s.jsx(Gm,_({as:l,direction:o==null?void 0:o.direction,slots:{root:j},slotProps:k??d},R,{ref:t}))});process.env.NODE_ENV!=="production"&&(Mi.propTypes={anchorEl:m.oneOfType([Nt,m.object,m.func]),children:m.oneOfType([m.node,m.func]),component:m.elementType,components:m.shape({Root:m.elementType}),componentsProps:m.shape({root:m.oneOfType([m.func,m.object])}),container:m.oneOfType([Nt,m.func]),disablePortal:m.bool,keepMounted:m.bool,modifiers:m.arrayOf(m.shape({data:m.object,effect:m.func,enabled:m.bool,fn:m.func,name:m.any,options:m.object,phase:m.oneOf(["afterMain","afterRead","afterWrite","beforeMain","beforeRead","beforeWrite","main","read","write"]),requires:m.arrayOf(m.string),requiresIfExists:m.arrayOf(m.string)})),open:m.bool.isRequired,placement:m.oneOf(["auto-end","auto-start","auto","bottom-end","bottom-start","bottom","left-end","left-start","left","right-end","right-start","right","top-end","top-start","top"]),popperOptions:m.shape({modifiers:m.array,onFirstUpdate:m.func,placement:m.oneOf(["auto-end","auto-start","auto","bottom-end","bottom-start","bottom","left-end","left-start","left","right-end","right-start","right","top-end","top-start","top"]),strategy:m.oneOf(["absolute","fixed"])}),popperRef:oi,slotProps:m.shape({root:m.oneOfType([m.func,m.object])}),slots:m.shape({root:m.elementType}),sx:m.oneOfType([m.arrayOf(m.oneOfType([m.func,m.object,m.bool])),m.func,m.object]),transition:m.bool});const Di=Mi;function Um(e){return fn("MuiTooltip",e)}const Hm=di("MuiTooltip",["popper","popperInteractive","popperArrow","popperClose","tooltip","tooltipArrow","touch","tooltipPlacementLeft","tooltipPlacementRight","tooltipPlacementTop","tooltipPlacementBottom","arrow"]),pr=Hm,qm=["arrow","children","classes","components","componentsProps","describeChild","disableFocusListener","disableHoverListener","disableInteractive","disableTouchListener","enterDelay","enterNextDelay","enterTouchDelay","followCursor","id","leaveDelay","leaveTouchDelay","onClose","onOpen","open","placement","PopperComponent","PopperProps","slotProps","slots","title","TransitionComponent","TransitionProps"];function Xm(e){return Math.round(e*1e5)/1e5}const Wm=e=>{const{classes:r,disableInteractive:t,arrow:n,touch:o,placement:a}=e,i={popper:["popper",!t&&"popperInteractive",n&&"popperArrow"],tooltip:["tooltip",n&&"tooltipArrow",o&&"touch",`tooltipPlacement${Ye(a.split("-")[0])}`],arrow:["arrow"]};return jo(i,Um,r)},Ym=Mt(Di,{name:"MuiTooltip",slot:"Popper",overridesResolver:(e,r)=>{const{ownerState:t}=e;return[r.popper,!t.disableInteractive&&r.popperInteractive,t.arrow&&r.popperArrow,!t.open&&r.popperClose]}})(({theme:e,ownerState:r,open:t})=>_({zIndex:(e.vars||e).zIndex.tooltip,pointerEvents:"none"},!r.disableInteractive&&{pointerEvents:"auto"},!t&&{pointerEvents:"none"},r.arrow&&{[`&[data-popper-placement*="bottom"] .${pr.arrow}`]:{top:0,marginTop:"-0.71em","&::before":{transformOrigin:"0 100%"}},[`&[data-popper-placement*="top"] .${pr.arrow}`]:{bottom:0,marginBottom:"-0.71em","&::before":{transformOrigin:"100% 0"}},[`&[data-popper-placement*="right"] .${pr.arrow}`]:_({},r.isRtl?{right:0,marginRight:"-0.71em"}:{left:0,marginLeft:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"100% 100%"}}),[`&[data-popper-placement*="left"] .${pr.arrow}`]:_({},r.isRtl?{left:0,marginLeft:"-0.71em"}:{right:0,marginRight:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"0 0"}})})),Km=Mt("div",{name:"MuiTooltip",slot:"Tooltip",overridesResolver:(e,r)=>{const{ownerState:t}=e;return[r.tooltip,t.touch&&r.touch,t.arrow&&r.tooltipArrow,r[`tooltipPlacement${Ye(t.placement.split("-")[0])}`]]}})(({theme:e,ownerState:r})=>_({backgroundColor:e.vars?e.vars.palette.Tooltip.bg:bi(e.palette.grey[700],.92),borderRadius:(e.vars||e).shape.borderRadius,color:(e.vars||e).palette.common.white,fontFamily:e.typography.fontFamily,padding:"4px 8px",fontSize:e.typography.pxToRem(11),maxWidth:300,margin:2,wordWrap:"break-word",fontWeight:e.typography.fontWeightMedium},r.arrow&&{position:"relative",margin:0},r.touch&&{padding:"8px 16px",fontSize:e.typography.pxToRem(14),lineHeight:`${Xm(16/14)}em`,fontWeight:e.typography.fontWeightRegular},{[`.${pr.popper}[data-popper-placement*="left"] &`]:_({transformOrigin:"right center"},r.isRtl?_({marginLeft:"14px"},r.touch&&{marginLeft:"24px"}):_({marginRight:"14px"},r.touch&&{marginRight:"24px"})),[`.${pr.popper}[data-popper-placement*="right"] &`]:_({transformOrigin:"left center"},r.isRtl?_({marginRight:"14px"},r.touch&&{marginRight:"24px"}):_({marginLeft:"14px"},r.touch&&{marginLeft:"24px"})),[`.${pr.popper}[data-popper-placement*="top"] &`]:_({transformOrigin:"center bottom",marginBottom:"14px"},r.touch&&{marginBottom:"24px"}),[`.${pr.popper}[data-popper-placement*="bottom"] &`]:_({transformOrigin:"center top",marginTop:"14px"},r.touch&&{marginTop:"24px"})})),Jm=Mt("span",{name:"MuiTooltip",slot:"Arrow",overridesResolver:(e,r)=>r.arrow})(({theme:e})=>({overflow:"hidden",position:"absolute",width:"1em",height:"0.71em",boxSizing:"border-box",color:e.vars?e.vars.palette.Tooltip.bg:bi(e.palette.grey[700],.9),"&::before":{content:'""',margin:"auto",display:"block",width:"100%",height:"100%",backgroundColor:"currentColor",transform:"rotate(45deg)"}}));let Ht=!1;const os=new _t;let pt={x:0,y:0};function qt(e,r){return t=>{r&&r(t),e(t)}}const Ai=M.forwardRef(function(r,t){var n,o,a,i,l,c,d,u,v,p,h,f,g,b,x,C,S,k,w;const j=Ao({props:r,name:"MuiTooltip"}),{arrow:R=!1,children:B,components:T={},componentsProps:P={},describeChild:N=!1,disableFocusListener:A=!1,disableHoverListener:D=!1,disableInteractive:J=!1,disableTouchListener:K=!1,enterDelay:H=100,enterNextDelay:te=0,enterTouchDelay:se=700,followCursor:V=!1,id:E,leaveDelay:$=0,leaveTouchDelay:q=1500,onClose:z,onOpen:F,open:W,placement:G="bottom",PopperComponent:Y,PopperProps:X={},slotProps:Z={},slots:Q={},title:ue,TransitionComponent:I=ns,TransitionProps:xe}=j,L=ke(j,qm),ye=M.isValidElement(B)?B:s.jsx("span",{children:B}),Ge=$i(),ur=Ge.direction==="rtl",[Se,Bt]=M.useState(),[Ue,Or]=M.useState(null),fr=M.useRef(!1),Rr=J||V,Pr=ft(),_r=ft(),mr=ft(),et=ft(),[Lt,Ko]=si({controlled:W,default:!1,name:"Tooltip",state:"open"});let Je=Lt;if(process.env.NODE_ENV!=="production"){const{current:re}=M.useRef(W!==void 0);M.useEffect(()=>{Se&&Se.disabled&&!re&&ue!==""&&Se.tagName.toLowerCase()==="button"&&console.error(["MUI: You are providing a disabled `button` child to the Tooltip component.","A disabled element does not fire events.","Tooltip needs to listen to the child element's events to display the title.","","Add a simple wrapper element, such as a `span`."].join(` +`))},[ue,Se,re])}const Tn=ai(E),rt=M.useRef(),Vt=eo(()=>{rt.current!==void 0&&(document.body.style.WebkitUserSelect=rt.current,rt.current=void 0),et.clear()});M.useEffect(()=>Vt,[Vt]);const Jo=re=>{os.clear(),Ht=!0,Ko(!0),F&&!Je&&F(re)},Ft=eo(re=>{os.start(800+$,()=>{Ht=!1}),Ko(!1),z&&Je&&z(re),Pr.start(Ge.transitions.duration.shortest,()=>{fr.current=!1})}),Cn=re=>{fr.current&&re.type!=="touchstart"||(Se&&Se.removeAttribute("title"),_r.clear(),mr.clear(),H||Ht&&te?_r.start(Ht?te:H,()=>{Jo(re)}):Jo(re))},Zo=re=>{_r.clear(),mr.start($,()=>{Ft(re)})},{isFocusVisibleRef:Qo,onBlur:El,onFocus:Sl,ref:Tl}=ii(),[,ea]=M.useState(!1),ra=re=>{El(re),Qo.current===!1&&(ea(!1),Zo(re))},ta=re=>{Se||Bt(re.currentTarget),Sl(re),Qo.current===!0&&(ea(!0),Cn(re))},na=re=>{fr.current=!0;const Pe=ye.props;Pe.onTouchStart&&Pe.onTouchStart(re)},oa=Cn,aa=Zo,Cl=re=>{na(re),mr.clear(),Pr.clear(),Vt(),rt.current=document.body.style.WebkitUserSelect,document.body.style.WebkitUserSelect="none",et.start(se,()=>{document.body.style.WebkitUserSelect=rt.current,Cn(re)})},jl=re=>{ye.props.onTouchEnd&&ye.props.onTouchEnd(re),Vt(),mr.start(q,()=>{Ft(re)})};M.useEffect(()=>{if(!Je)return;function re(Pe){(Pe.key==="Escape"||Pe.key==="Esc")&&Ft(Pe)}return document.addEventListener("keydown",re),()=>{document.removeEventListener("keydown",re)}},[Ft,Je]);const Ol=Tr(ye.ref,Tl,Bt,t);!ue&&ue!==0&&(Je=!1);const jn=M.useRef(),Rl=re=>{const Pe=ye.props;Pe.onMouseMove&&Pe.onMouseMove(re),pt={x:re.clientX,y:re.clientY},jn.current&&jn.current.update()},tt={},On=typeof ue=="string";N?(tt.title=!Je&&On&&!D?ue:null,tt["aria-describedby"]=Je?Tn:null):(tt["aria-label"]=On?ue:null,tt["aria-labelledby"]=Je&&!On?Tn:null);const De=_({},tt,L,ye.props,{className:lr(L.className,ye.props.className),onTouchStart:na,ref:Ol},V?{onMouseMove:Rl}:{});process.env.NODE_ENV!=="production"&&(De["data-mui-internal-clone-element"]=!0,M.useEffect(()=>{Se&&!Se.getAttribute("data-mui-internal-clone-element")&&console.error(["MUI: The `children` component of the Tooltip is not forwarding its props correctly.","Please make sure that props are spread on the same element that the ref is applied to."].join(` +`))},[Se]));const nt={};K||(De.onTouchStart=Cl,De.onTouchEnd=jl),D||(De.onMouseOver=qt(oa,De.onMouseOver),De.onMouseLeave=qt(aa,De.onMouseLeave),Rr||(nt.onMouseOver=oa,nt.onMouseLeave=aa)),A||(De.onFocus=qt(ta,De.onFocus),De.onBlur=qt(ra,De.onBlur),Rr||(nt.onFocus=ta,nt.onBlur=ra)),process.env.NODE_ENV!=="production"&&ye.props.title&&console.error(["MUI: You have provided a `title` prop to the child of .",`Remove this title prop \`${ye.props.title}\` or the Tooltip component.`].join(` +`));const Pl=M.useMemo(()=>{var re;let Pe=[{name:"arrow",enabled:!!Ue,options:{element:Ue,padding:4}}];return(re=X.popperOptions)!=null&&re.modifiers&&(Pe=Pe.concat(X.popperOptions.modifiers)),_({},X.popperOptions,{modifiers:Pe})},[Ue,X]),ot=_({},j,{isRtl:ur,arrow:R,disableInteractive:Rr,placement:G,PopperComponentProp:Y,touch:fr.current}),Rn=Wm(ot),sa=(n=(o=Q.popper)!=null?o:T.Popper)!=null?n:Ym,ia=(a=(i=(l=Q.transition)!=null?l:T.Transition)!=null?i:I)!=null?a:ns,la=(c=(d=Q.tooltip)!=null?d:T.Tooltip)!=null?c:Km,pa=(u=(v=Q.arrow)!=null?v:T.Arrow)!=null?u:Jm,_l=mt(sa,_({},X,(p=Z.popper)!=null?p:P.popper,{className:lr(Rn.popper,X==null?void 0:X.className,(h=(f=Z.popper)!=null?f:P.popper)==null?void 0:h.className)}),ot),$l=mt(ia,_({},xe,(g=Z.transition)!=null?g:P.transition),ot),Il=mt(la,_({},(b=Z.tooltip)!=null?b:P.tooltip,{className:lr(Rn.tooltip,(x=(C=Z.tooltip)!=null?C:P.tooltip)==null?void 0:x.className)}),ot),Ml=mt(pa,_({},(S=Z.arrow)!=null?S:P.arrow,{className:lr(Rn.arrow,(k=(w=Z.arrow)!=null?w:P.arrow)==null?void 0:k.className)}),ot);return s.jsxs(M.Fragment,{children:[M.cloneElement(ye,De),s.jsx(sa,_({as:Y??Di,placement:G,anchorEl:V?{getBoundingClientRect:()=>({top:pt.y,left:pt.x,right:pt.x,bottom:pt.y,width:0,height:0})}:Se,popperRef:jn,open:Se?Je:!1,id:Tn,transition:!0},nt,_l,{popperOptions:Pl,children:({TransitionProps:re})=>s.jsx(ia,_({timeout:Ge.transitions.duration.shorter},re,$l,{children:s.jsxs(la,_({},Il,{children:[ue,R?s.jsx(pa,_({},Ml,{ref:Or})):null]}))}))}))]})});process.env.NODE_ENV!=="production"&&(Ai.propTypes={arrow:m.bool,children:ti.isRequired,classes:m.object,className:m.string,components:m.shape({Arrow:m.elementType,Popper:m.elementType,Tooltip:m.elementType,Transition:m.elementType}),componentsProps:m.shape({arrow:m.object,popper:m.object,tooltip:m.object,transition:m.object}),describeChild:m.bool,disableFocusListener:m.bool,disableHoverListener:m.bool,disableInteractive:m.bool,disableTouchListener:m.bool,enterDelay:m.number,enterNextDelay:m.number,enterTouchDelay:m.number,followCursor:m.bool,id:m.string,leaveDelay:m.number,leaveTouchDelay:m.number,onClose:m.func,onOpen:m.func,open:m.bool,placement:m.oneOf(["bottom-end","bottom-start","bottom","left-end","left-start","left","right-end","right-start","right","top-end","top-start","top"]),PopperComponent:m.elementType,PopperProps:m.object,slotProps:m.shape({arrow:m.object,popper:m.object,tooltip:m.object,transition:m.object}),slots:m.shape({arrow:m.elementType,popper:m.elementType,tooltip:m.elementType,transition:m.elementType}),sx:m.oneOfType([m.arrayOf(m.oneOfType([m.func,m.object,m.bool])),m.func,m.object]),title:m.node,TransitionComponent:m.elementType,TransitionProps:m.object});const Zm=Ai;function as(e,r,t){return e?s.jsx(Ie.ListItemIcon,{className:`papi-menu-icon-${t?"leading":"trailing"}`,children:s.jsx("img",{src:e,alt:`${t?"Leading":"Trailing"} icon for ${r}`})}):void 0}function Xo(e){const{onClick:r,label:t,tooltip:n,allowForLeadingIcons:o=!0,iconPathBefore:a=void 0,iconPathAfter:i=void 0,hasAutoFocus:l=!1,className:c,isDisabled:d=!1,isDense:u=!0,isSubMenuParent:v=!1,hasDisabledGutters:p=!1,hasDivider:h=!1,focusVisibleClassName:f,id:g,children:b}=e,x=s.jsx(Ie.MenuItem,{sx:{lineHeight:.8},autoFocus:l,className:c,disabled:d,dense:u,disableGutters:p,divider:h,focusVisibleClassName:f,onClick:r,id:g,children:t?s.jsxs(s.Fragment,{children:[as(a,t,!0),s.jsx(Ie.ListItemText,{primary:t,inset:!a&&o}),v?s.jsx(Ie.ListItemIcon,{className:"papi-menu-icon-trailing",children:s.jsx(wi,{})}):as(i,t,!1)]}):b});return n?s.jsx(Zm,{title:n,placement:"right",children:s.jsx("div",{children:x})}):x}function Bi(e){return Object.entries(e.groups).map(([t,n])=>({id:t,group:n}))}function Qm(e){const[r,t]=y.useState(void 0),{parentMenuItem:n,parentItemProps:o,menuDefinition:a}=e,i=d=>{t(d.currentTarget)},l=()=>{t(void 0)},c=()=>{let d=Bi(a).filter(u=>"menuItem"in u.group);if(!(n!=null&&n.id))throw new Error("A valid parent menu item is required for submenus.");return d=d.filter(u=>"menuItem"in u.group&&u.group.menuItem===n.id),s.jsx(Li,{...e,includedGroups:d})};return s.jsxs(s.Fragment,{children:[s.jsx(Xo,{onClick:i,...o,isSubMenuParent:!0}),s.jsx(Ie.Menu,{anchorEl:r,open:!!r,onClose:l,anchorOrigin:{vertical:"top",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"left"},children:c()},n.id)]})}const eh=(e,r)=>r.filter(o=>o.group===e).sort((o,a)=>(o.order||0)-(a.order||0));function Li(e){const{menuDefinition:r,onClick:t,commandHandler:n,includedGroups:o}=e,{items:a,allowForLeadingIcons:i}=y.useMemo(()=>{const u=o&&o.length>0?o:Bi(r).filter(f=>!("menuItem"in f.group)),v=Object.values(u).sort((f,g)=>(f.group.order||0)-(g.group.order||0)),p=[];v.forEach(f=>{eh(f.id,r.items).forEach(g=>p.push({item:g,isLastItemInGroup:!1})),p.length>0&&(p[p.length-1].isLastItemInGroup=!0)}),p.length>0&&(p[p.length-1].isLastItemInGroup=!1);const h=p.some(f=>"iconPathBefore"in f.item&&f.item.iconPathBefore);return{items:p,allowForLeadingIcons:h}},[o,r]),l=({item:u,isLastItemInGroup:v})=>({className:"papi-menu-item",label:u.label,tooltip:u.tooltip,iconPathBefore:"iconPathBefore"in u?u.iconPathBefore:void 0,iconPathAfter:"iconPathAfter"in u?u.iconPathAfter:void 0,hasDivider:v,allowForLeadingIcons:i}),[c]=a;if(!c)return s.jsx("div",{});const d=c.item.group;return s.jsx("div",{role:"menu","aria-label":d,children:a.map((u,v)=>{const{item:p}=u,h=l(u);if("command"in p){const f=p.group+v;return s.jsx(Xo,{onClick:g=>{t==null||t(g),n(p)},...h},f)}return s.jsx(Qm,{parentMenuItem:p,parentItemProps:h,...e},d+p.id)})},d)}function rh(e){const{menuDefinition:r,columnId:t}=e;let a=Object.entries(r.groups).map(([i,l])=>({id:i,group:l})).filter(i=>"column"in i.group);return t&&"columns"in r&&r.columns[t]&&(a=a.filter(i=>"column"in i.group&&i.group.column===t)),s.jsx(Li,{...e,includedGroups:a})}function th({commandHandler:e,menuDefinition:r,id:t,metadata:n,onClick:o,className:a}){return s.jsxs(Ie.Grid,{id:t,item:!0,xs:"auto",role:"menu","aria-label":t,className:`papi-menu-column ${a??""}`,children:[s.jsx("h3",{"aria-label":n.label,className:`papi-menu-column-header ${a??""}`,children:n.label}),s.jsx(Ie.List,{id:t,dense:!0,className:a??"",children:s.jsx(rh,{commandHandler:e,menuDefinition:r,columnId:t,onClick:o})})]})}function Vi({commandHandler:e,className:r,multiColumnMenu:t,id:n}){const{columns:o}=t,a=y.useMemo(()=>{const i=new Map;return Object.getOwnPropertyNames(o).forEach(l=>{if(l==="isExtensible")return;const c=l,d=o[c];typeof d=="object"&&typeof d.order=="number"&&!Number.isNaN(d.order)?i.set(d.order,{id:c,metadata:d}):console.warn(`Property ${l} (${typeof d}) on menu ${n} is not a valid column and is being ignored. This might indicate data corruption`)}),Array.from(i.values()).sort((l,c)=>(l.metadata.order||0)-(c.metadata.order||0))},[o,n]);return s.jsx(Ie.Grid,{container:!0,spacing:0,className:`papi-multi-column-menu ${r??""}`,columns:a.length,role:"menu","aria-label":"GridMenu",id:n,children:a.map((i,l)=>s.jsx(th,{commandHandler:e,menuDefinition:t,...i,className:r},l))})}function nh(e){return{preserveValue:!0,...e}}const an=(e,r,t={})=>{const n=y.useRef(r);n.current=r;const o=y.useRef(t);o.current=nh(o.current);const[a,i]=y.useState(()=>n.current),[l,c]=y.useState(!0);return y.useEffect(()=>{let d=!0;return c(!!e),(async()=>{if(e){const u=await e();d&&(i(()=>u),c(!1))}})(),()=>{d=!1,o.current.preserveValue||i(()=>n.current)}},[e]),[a,l]},oh=vi(s.jsx("path",{d:"M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z"}),"Menu");function Fi({menuProvider:e,normalMenu:r,fullMenu:t,commandHandler:n,containerRef:o,className:a,ariaLabelPrefix:i,children:l}){const[c,d]=y.useState(!1),[u,v]=y.useState(!1),p=y.useCallback(()=>{c&&d(!1),v(!1)},[c]),h=y.useCallback(k=>{k.stopPropagation(),d(w=>{const j=!w;return j&&k.shiftKey?v(!0):j||v(!1),j})},[]),f=y.useCallback(k=>(p(),n(k)),[n,p]),[g,b]=y.useState({top:1,left:1});y.useEffect(()=>{if(c){const k=o==null?void 0:o.current;if(k){const w=k.getBoundingClientRect(),j=window.scrollY,R=window.scrollX,B=w.top+j+k.clientHeight,T=w.left+R;b({top:B,left:T})}}},[c,o]);const[x]=an(y.useCallback(async()=>(e==null?void 0:e(!1))??r,[e,r,c]),r),[C]=an(y.useCallback(async()=>(e==null?void 0:e(!0))??t??x,[e,t,x,c]),t??x),S=u&&C?C:x;return s.jsxs(s.Fragment,{children:[s.jsx(Ie.IconButton,{sx:{paddingTop:0,paddingBottom:0},edge:"start",className:`papi-menuButton ${a??""}`,color:"inherit","aria-label":`${i??""} menu button`,onClick:h,children:l??s.jsx(oh,{})}),s.jsx(Ie.Drawer,{className:`papi-menu-drawer ${a??""}`,anchor:"left",variant:"temporary",open:c,onClose:p,PaperProps:{className:"papi-menu-drawer-paper",style:{top:g.top,left:g.left}},children:S?s.jsx(Vi,{className:a,id:`${i??""} main menu`,commandHandler:f,multiColumnMenu:S}):void 0})]})}function ah({id:e,label:r,isDisabled:t=!1,tooltip:n,isTooltipSuppressed:o=!1,adjustMarginToAlignToEdge:a=!1,size:i="medium",className:l,onClick:c,children:d}){return s.jsx(Ie.IconButton,{id:e,disabled:t,edge:a,size:i,"aria-label":r,title:o?void 0:n??r,className:`papi-icon-button ${l??""}`,onClick:c,children:d})}const Qr=y.forwardRef(({className:e,...r},t)=>s.jsx(ne.LoaderCircle,{size:35,className:O("pr-animate-spin",e),...r,ref:t}));Qr.displayName="Spinner";function sh({id:e,isDisabled:r=!1,hasError:t=!1,isFullWidth:n=!1,helperText:o,label:a,placeholder:i,isRequired:l=!1,className:c,defaultValue:d,value:u,onChange:v,onFocus:p,onBlur:h}){return s.jsxs("div",{className:O("pr-inline-grid pr-items-center pr-gap-1.5",{"pr-w-full":n}),children:[s.jsx(qe,{htmlFor:e,className:O({"pr-text-red-600":t,"pr-hidden":!a}),children:`${a}${l?"*":""}`}),s.jsx(Kr,{id:e,disabled:r,placeholder:i,required:l,className:O(c,{"pr-border-red-600":t}),defaultValue:d,value:u,onChange:v,onFocus:p,onBlur:h}),s.jsx("p",{className:O({"pr-hidden":!o}),children:o})]})}function ih({menuProvider:e,commandHandler:r,className:t,id:n,children:o}){const a=y.useRef(void 0);return s.jsx("div",{ref:a,style:{position:"relative"},children:s.jsx(Ie.AppBar,{position:"static",id:n,children:s.jsxs(Ie.Toolbar,{className:O("pr-bg-muted pr-text-muted-foreground",t),variant:"dense",children:[e?s.jsx(Fi,{commandHandler:r,containerRef:a,menuProvider:e}):void 0,o?s.jsx("div",{className:"papi-toolbar-children",children:o}):void 0]})})})}const lh=sn.cva("pr-relative pr-w-full pr-rounded-lg pr-border pr-p-4 [&>svg~*]:pr-pl-7 [&>svg+div]:pr-translate-y-[-3px] [&>svg]:pr-absolute [&>svg]:pr-left-4 [&>svg]:pr-top-4 [&>svg]:pr-text-foreground",{variants:{variant:{default:"pr-bg-background pr-text-foreground",destructive:"pr-border-destructive/50 pr-text-destructive dark:pr-border-destructive [&>svg]:pr-text-destructive"}},defaultVariants:{variant:"default"}}),zi=y.forwardRef(({className:e,variant:r,...t},n)=>s.jsx("div",{ref:n,role:"alert",className:O(lh({variant:r}),e),...t}));zi.displayName="Alert";const Gi=y.forwardRef(({className:e,...r},t)=>s.jsxs("h5",{ref:t,className:O("pr-mb-1 pr-font-medium pr-leading-none pr-tracking-tight",e),...r,children:[r.children," "]}));Gi.displayName="AlertTitle";const Ui=y.forwardRef(({className:e,...r},t)=>s.jsx("div",{ref:t,className:O("pr-text-sm [&_p]:pr-leading-relaxed",e),...r}));Ui.displayName="AlertDescription";const Hi=y.forwardRef(({className:e,...r},t)=>s.jsx("div",{ref:t,className:O("pr-twp pr-rounded-lg pr-border pr-bg-card pr-text-card-foreground pr-shadow-sm",e),...r}));Hi.displayName="Card";const qi=y.forwardRef(({className:e,...r},t)=>s.jsx("div",{ref:t,className:O("pr-twp pr-flex pr-flex-col pr-space-y-1.5 pr-p-6",e),...r}));qi.displayName="CardHeader";const Xi=y.forwardRef(({className:e,...r},t)=>s.jsx("h3",{ref:t,className:O("pr-twp pr-text-2xl pr-font-semibold pr-leading-none pr-tracking-tight",e),...r,children:r.children}));Xi.displayName="CardTitle";const Wi=y.forwardRef(({className:e,...r},t)=>s.jsx("p",{ref:t,className:O("pr-twp pr-text-sm pr-text-muted-foreground",e),...r}));Wi.displayName="CardDescription";const Yi=y.forwardRef(({className:e,...r},t)=>s.jsx("div",{ref:t,className:O("pr-twp pr-p-6 pr-pt-0",e),...r}));Yi.displayName="CardContent";const Ki=y.forwardRef(({className:e,...r},t)=>s.jsx("div",{ref:t,className:O("pr-twp pr-flex pr-items-center pr-p-6 pr-pt-0",e),...r}));Ki.displayName="CardFooter";function ph({...e}){return s.jsx(hs.Toaster,{className:"pr-toaster pr-group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e})}const Ji=y.forwardRef(({className:e,...r},t)=>s.jsxs(ut.Root,{ref:t,className:O("pr-twp pr-relative pr-flex pr-w-full pr-touch-none pr-select-none pr-items-center",e),...r,children:[s.jsx(ut.Track,{className:"pr-relative pr-h-2 pr-w-full pr-grow pr-overflow-hidden pr-rounded-full pr-bg-secondary",children:s.jsx(ut.Range,{className:"pr-absolute pr-h-full pr-bg-primary"})}),s.jsx(ut.Thumb,{className:"pr-block pr-h-5 pr-w-5 pr-rounded-full pr-border-2 pr-border-primary pr-bg-background pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50"})]}));Ji.displayName=ut.Root.displayName;const Zi=y.forwardRef(({className:e,...r},t)=>s.jsx(Kn.Root,{className:O("pr-peer pr-twp pr-inline-flex pr-h-6 pr-w-11 pr-shrink-0 pr-cursor-pointer pr-items-center pr-rounded-full pr-border-2 pr-border-transparent pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 focus-visible:pr-ring-offset-background disabled:pr-cursor-not-allowed disabled:pr-opacity-50 data-[state=checked]:pr-bg-primary data-[state=unchecked]:pr-bg-input",e),...r,ref:t,children:s.jsx(Kn.Thumb,{className:O("pr-twp pr-pointer-events-none pr-block pr-h-5 pr-w-5 pr-rounded-full pr-bg-background pr-shadow-lg pr-ring-0 pr-transition-transform data-[state=checked]:pr-translate-x-5 data-[state=unchecked]:pr-translate-x-0")})}));Zi.displayName=Kn.Root.displayName;const ch=Re.Root,Qi=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.List,{ref:t,className:O("pr-inline-flex pr-h-10 pr-items-center pr-justify-center pr-rounded-md pr-bg-muted pr-p-1 pr-text-muted-foreground",e),...r}));Qi.displayName=Re.List.displayName;const el=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.Trigger,{ref:t,className:O("pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-sm pr-px-3 pr-py-1.5 pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-all hover:pr-text-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=active]:pr-bg-background data-[state=active]:pr-text-foreground data-[state=active]:pr-shadow-sm",e),...r}));el.displayName=Re.Trigger.displayName;const rl=y.forwardRef(({className:e,...r},t)=>s.jsx(Re.Content,{ref:t,className:O("pr-mt-2 pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2",e),...r}));rl.displayName=Re.Content.displayName;function dh({isInstalling:e,handleClick:r,buttonText:t,className:n,...o}){return s.jsx(ve,{className:O("pr-h-8 pr-rounded-md pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700",{"pr-cursor-not-allowed pr-bg-blue-700":e,"pr-bg-blue-600":!e,"pr-bg-white pr-text-blue-600 hover:pr-text-white":!t,"pr-w-20":t},n),onClick:r,...o,children:e?s.jsx(Qr,{size:15}):s.jsxs(s.Fragment,{children:[s.jsx(ne.Download,{size:25,className:O("pr-h-4 pr-w-4",{"pr-mr-1":t})}),t]})})}function uh({isEnabling:e,handleClick:r,className:t,...n}){return s.jsx(ve,{className:O("pr-h-8 pr-rounded-md pr-bg-blue-600 pr-px-4 pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700",{"pr-cursor-not-allowed pr-bg-blue-700":e},t),onClick:r,...n,children:e?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{size:15,className:"pr-mr-1 pr-text-white"}),"Enabling..."]}):"Enable"})}function fh({isDisabling:e,handleClick:r,className:t,...n}){return s.jsx(ve,{className:O("pr-h-8 pr-rounded-md pr-bg-gray-300 pr-text-black pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-gray-400",{"pr-cursor-not-allowed pr-bg-gray-400":e},t),onClick:r,...n,children:e?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{size:15,className:"pr-mr-1 pr-text-black"}),"Disabling..."]}):"Disable"})}function mh({isUpdating:e,handleClick:r,className:t,...n}){return s.jsx(ve,{className:O("pr-h-8 pr-rounded-md pr-bg-blue-600 pr-px-4 pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700 hover:pr-text-white",{"pr-cursor-not-allowed pr-bg-blue-700":e},t),onClick:r,...n,children:e?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{size:15,className:"pr-mr-1 pr-text-white"}),"Updating..."]}):"Update"})}function yr(){return yr=Object.assign?Object.assign.bind():function(e){for(var r=1;r(e[r.toLowerCase()]=r,e),{for:"htmlFor"}),ls={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:"“"},gh=["style","script"],bh=/([-A-Z0-9_:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|(?:\{((?:\\.|{[^}]*?}|[^}])*)\})))?/gi,vh=/mailto:/i,wh=/\n{2,}$/,tl=/^(\s*>[\s\S]*?)(?=\n{2,})/,yh=/^ *> ?/gm,xh=/^ {2,}\n/,kh=/^(?:( *[-*_])){3,} *(?:\n *)+\n/,nl=/^\s*(`{3,}|~{3,}) *(\S+)?([^\n]*?)?\n([\s\S]+?)\s*\1 *(?:\n *)*\n?/,ol=/^(?: {4}[^\n]+\n*)+(?:\n *)+\n?/,Nh=/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,Eh=/^(?:\n *)*\n/,Sh=/\r\n?/g,Th=/^\[\^([^\]]+)](:(.*)((\n+ {4,}.*)|(\n(?!\[\^).+))*)/,Ch=/^\[\^([^\]]+)]/,jh=/\f/g,Oh=/^---[ \t]*\n(.|\n)*\n---[ \t]*\n/,Rh=/^\s*?\[(x|\s)\]/,al=/^ *(#{1,6}) *([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,sl=/^ *(#{1,6}) +([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,il=/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/,io=/^ *(?!<[a-z][^ >/]* ?\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\n?(\s*(?:<\1[^>]*?>[\s\S]*?<\/\1>|(?!<\1\b)[\s\S])*?)<\/\1>(?!<\/\1>)\n*/i,Ph=/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi,ll=/^)/,_h=/^(data|aria|x)-[a-z_][a-z\d_.-]*$/,lo=/^ *<([a-z][a-z0-9:]*)(?:\s+((?:<.*?>|[^>])*))?\/?>(?!<\/\1>)(\s*\n)?/i,$h=/^\{.*\}$/,Ih=/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,Mh=/^<([^ >]+@[^ >]+)>/,Dh=/^<([^ >]+:\/[^ >]+)>/,Ah=/-([a-z])?/gi,pl=/^(.*\|.*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:.*\|.*\n)*))?\n?/,Bh=/^\[([^\]]*)\]:\s+]+)>?\s*("([^"]*)")?/,Lh=/^!\[([^\]]*)\] ?\[([^\]]*)\]/,Vh=/^\[([^\]]*)\] ?\[([^\]]*)\]/,Fh=/(\[|\])/g,zh=/(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/,Gh=/\t/g,Uh=/(^ *\||\| *$)/g,Hh=/^ *:-+: *$/,qh=/^ *:-+ *$/,Xh=/^ *-+: *$/,Sn="((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~~.*?~~|==.*?==|.|\\n)*?)",Wh=new RegExp(`^([*_])\\1${Sn}\\1\\1(?!\\1)`),Yh=new RegExp(`^([*_])${Sn}\\1(?!\\1|\\w)`),Kh=new RegExp(`^==${Sn}==`),Jh=new RegExp(`^~~${Sn}~~`),Zh=/^\\([^0-9A-Za-z\s])/,Qh=/^[\s\S]+?(?=[^0-9A-Z\s\u00c0-\uffff&#;.()'"]|\d+\.|\n\n| {2,}\n|\w+:\S|$)/i,eg=/^\n+/,rg=/^([ \t]*)/,tg=/\\([^\\])/g,ps=/ *\n+$/,ng=/(?:^|\n)( *)$/,Wo="(?:\\d+\\.)",Yo="(?:[*+-])";function cl(e){return"( *)("+(e===1?Wo:Yo)+") +"}const dl=cl(1),ul=cl(2);function fl(e){return new RegExp("^"+(e===1?dl:ul))}const og=fl(1),ag=fl(2);function ml(e){return new RegExp("^"+(e===1?dl:ul)+"[^\\n]*(?:\\n(?!\\1"+(e===1?Wo:Yo)+" )[^\\n]*)*(\\n|$)","gm")}const hl=ml(1),gl=ml(2);function bl(e){const r=e===1?Wo:Yo;return new RegExp("^( *)("+r+") [\\s\\S]+?(?:\\n{2,}(?! )(?!\\1"+r+" (?!"+r+" ))\\n*|\\s*\\n*$)")}const vl=bl(1),wl=bl(2);function cs(e,r){const t=r===1,n=t?vl:wl,o=t?hl:gl,a=t?og:ag;return{match(i,l,c){const d=ng.exec(c);return d&&(l.list||!l.inline&&!l.simple)?n.exec(i=d[1]+i):null},order:1,parse(i,l,c){const d=t?+i[2]:void 0,u=i[0].replace(wh,` +`).match(o);let v=!1;return{items:u.map(function(p,h){const f=a.exec(p)[0].length,g=new RegExp("^ {1,"+f+"}","gm"),b=p.replace(g,"").replace(a,""),x=h===u.length-1,C=b.indexOf(` + +`)!==-1||x&&v;v=C;const S=c.inline,k=c.list;let w;c.list=!0,C?(c.inline=!1,w=b.replace(ps,` + +`)):(c.inline=!0,w=b.replace(ps,""));const j=l(w,c);return c.inline=S,c.list=k,j}),ordered:t,start:d}},render:(i,l,c)=>e(i.ordered?"ol":"ul",{key:c.key,start:i.type===U.orderedList?i.start:void 0},i.items.map(function(d,u){return e("li",{key:u},l(d,c))}))}}const sg=new RegExp(`^\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\]\\(\\s*?(?:\\s+['"]([\\s\\S]*?)['"])?\\s*\\)`),ig=/^!\[(.*?)\]\( *((?:\([^)]*\)|[^() ])*) *"?([^)"]*)?"?\)/,yl=[tl,nl,ol,al,il,sl,ll,pl,hl,vl,gl,wl],lg=[...yl,/^[^\n]+(?: \n|\n{2,})/,io,lo];function Xt(e){return e.replace(/[ÀÁÂÃÄÅàáâãäåæÆ]/g,"a").replace(/[çÇ]/g,"c").replace(/[ðÐ]/g,"d").replace(/[ÈÉÊËéèêë]/g,"e").replace(/[ÏïÎîÍíÌì]/g,"i").replace(/[Ññ]/g,"n").replace(/[øØœŒÕõÔôÓóÒò]/g,"o").replace(/[ÜüÛûÚúÙù]/g,"u").replace(/[ŸÿÝý]/g,"y").replace(/[^a-z0-9- ]/gi,"").replace(/ /gi,"-").toLowerCase()}function pg(e){return Xh.test(e)?"right":Hh.test(e)?"center":qh.test(e)?"left":null}function ds(e,r,t,n){const o=t.inTable;t.inTable=!0;let a=e.trim().split(/( *(?:`[^`]*`|<.*?>.*?<\/.*?>(?!<\/.*?>)|\\\||\|) *)/).reduce((l,c)=>(c.trim()==="|"?l.push(n?{type:U.tableSeparator}:{type:U.text,text:c}):c!==""&&l.push.apply(l,r(c,t)),l),[]);t.inTable=o;let i=[[]];return a.forEach(function(l,c){l.type===U.tableSeparator?c!==0&&c!==a.length-1&&i.push([]):(l.type!==U.text||a[c+1]!=null&&a[c+1].type!==U.tableSeparator||(l.text=l.text.trimEnd()),i[i.length-1].push(l))}),i}function cg(e,r,t){t.inline=!0;const n=e[2]?e[2].replace(Uh,"").split("|").map(pg):[],o=e[3]?function(i,l,c){return i.trim().split(` +`).map(function(d){return ds(d,l,c,!0)})}(e[3],r,t):[],a=ds(e[1],r,t,!!o.length);return t.inline=!1,o.length?{align:n,cells:o,header:a,type:U.table}:{children:a,type:U.paragraph}}function us(e,r){return e.align[r]==null?{}:{textAlign:e.align[r]}}function ar(e){return function(r,t){return t.inline?e.exec(r):null}}function sr(e){return function(r,t){return t.inline||t.simple?e.exec(r):null}}function Ze(e){return function(r,t){return t.inline||t.simple?null:e.exec(r)}}function ct(e){return function(r){return e.exec(r)}}function dg(e,r,t){if(r.inline||r.simple||t&&!t.endsWith(` +`))return null;let n="";e.split(` +`).every(a=>!yl.some(i=>i.test(a))&&(n+=a+` +`,a.trim()));const o=n.trimEnd();return o==""?null:[n,o]}function ug(e){try{if(decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,"").match(/^\s*(javascript|vbscript|data(?!:image)):/i))return null}catch{return null}return e}function fs(e){return e.replace(tg,"$1")}function Jt(e,r,t){const n=t.inline||!1,o=t.simple||!1;t.inline=!0,t.simple=!0;const a=e(r,t);return t.inline=n,t.simple=o,a}function fg(e,r,t){const n=t.inline||!1,o=t.simple||!1;t.inline=!1,t.simple=!0;const a=e(r,t);return t.inline=n,t.simple=o,a}function mg(e,r,t){const n=t.inline||!1;t.inline=!1;const o=e(r,t);return t.inline=n,o}const Gn=(e,r,t)=>({children:Jt(r,e[1],t)});function Un(){return{}}function Hn(){return null}function hg(...e){return e.filter(Boolean).join(" ")}function qn(e,r,t){let n=e;const o=r.split(".");for(;o.length&&(n=n[o[0]],n!==void 0);)o.shift();return n||t}function gg(e="",r={}){function t(p,h,...f){const g=qn(r.overrides,`${p}.props`,{});return r.createElement(function(b,x){const C=qn(x,b);return C?typeof C=="function"||typeof C=="object"&&"render"in C?C:qn(x,`${b}.component`,b):b}(p,r.overrides),yr({},h,g,{className:hg(h==null?void 0:h.className,g.className)||void 0}),...f)}function n(p){p=p.replace(Oh,"");let h=!1;r.forceInline?h=!0:r.forceBlock||(h=zh.test(p)===!1);const f=d(c(h?p:`${p.trimEnd().replace(eg,"")} + +`,{inline:h}));for(;typeof f[f.length-1]=="string"&&!f[f.length-1].trim();)f.pop();if(r.wrapper===null)return f;const g=r.wrapper||(h?"span":"div");let b;if(f.length>1||r.forceWrapper)b=f;else{if(f.length===1)return b=f[0],typeof b=="string"?t("span",{key:"outer"},b):b;b=null}return M.createElement(g,{key:"outer"},b)}function o(p,h){const f=h.match(bh);return f?f.reduce(function(g,b,x){const C=b.indexOf("=");if(C!==-1){const S=function(R){return R.indexOf("-")!==-1&&R.match(_h)===null&&(R=R.replace(Ah,function(B,T){return T.toUpperCase()})),R}(b.slice(0,C)).trim(),k=function(R){const B=R[0];return(B==='"'||B==="'")&&R.length>=2&&R[R.length-1]===B?R.slice(1,-1):R}(b.slice(C+1).trim()),w=is[S]||S,j=g[w]=function(R,B,T,P){return B==="style"?T.split(/;\s?/).reduce(function(N,A){const D=A.slice(0,A.indexOf(":"));return N[D.trim().replace(/(-[a-z])/g,J=>J[1].toUpperCase())]=A.slice(D.length+1).trim(),N},{}):B==="href"||B==="src"?P(T,R,B):(T.match($h)&&(T=T.slice(1,T.length-1)),T==="true"||T!=="false"&&T)}(p,S,k,r.sanitizer);typeof j=="string"&&(io.test(j)||lo.test(j))&&(g[w]=M.cloneElement(n(j.trim()),{key:x}))}else b!=="style"&&(g[is[b]||b]=!0);return g},{}):null}r.overrides=r.overrides||{},r.sanitizer=r.sanitizer||ug,r.slugify=r.slugify||Xt,r.namedCodesToUnicode=r.namedCodesToUnicode?yr({},ls,r.namedCodesToUnicode):ls,r.createElement=r.createElement||M.createElement;const a=[],i={},l={[U.blockQuote]:{match:Ze(tl),order:1,parse:(p,h,f)=>({children:h(p[0].replace(yh,""),f)}),render:(p,h,f)=>t("blockquote",{key:f.key},h(p.children,f))},[U.breakLine]:{match:ct(xh),order:1,parse:Un,render:(p,h,f)=>t("br",{key:f.key})},[U.breakThematic]:{match:Ze(kh),order:1,parse:Un,render:(p,h,f)=>t("hr",{key:f.key})},[U.codeBlock]:{match:Ze(ol),order:0,parse:p=>({lang:void 0,text:p[0].replace(/^ {4}/gm,"").replace(/\n+$/,"")}),render:(p,h,f)=>t("pre",{key:f.key},t("code",yr({},p.attrs,{className:p.lang?`lang-${p.lang}`:""}),p.text))},[U.codeFenced]:{match:Ze(nl),order:0,parse:p=>({attrs:o("code",p[3]||""),lang:p[2]||void 0,text:p[4],type:U.codeBlock})},[U.codeInline]:{match:sr(Nh),order:3,parse:p=>({text:p[2]}),render:(p,h,f)=>t("code",{key:f.key},p.text)},[U.footnote]:{match:Ze(Th),order:0,parse:p=>(a.push({footnote:p[2],identifier:p[1]}),{}),render:Hn},[U.footnoteReference]:{match:ar(Ch),order:1,parse:p=>({target:`#${r.slugify(p[1],Xt)}`,text:p[1]}),render:(p,h,f)=>t("a",{key:f.key,href:r.sanitizer(p.target,"a","href")},t("sup",{key:f.key},p.text))},[U.gfmTask]:{match:ar(Rh),order:1,parse:p=>({completed:p[1].toLowerCase()==="x"}),render:(p,h,f)=>t("input",{checked:p.completed,key:f.key,readOnly:!0,type:"checkbox"})},[U.heading]:{match:Ze(r.enforceAtxHeadings?sl:al),order:1,parse:(p,h,f)=>({children:Jt(h,p[2],f),id:r.slugify(p[2],Xt),level:p[1].length}),render:(p,h,f)=>t(`h${p.level}`,{id:p.id,key:f.key},h(p.children,f))},[U.headingSetext]:{match:Ze(il),order:0,parse:(p,h,f)=>({children:Jt(h,p[1],f),level:p[2]==="="?1:2,type:U.heading})},[U.htmlBlock]:{match:ct(io),order:1,parse(p,h,f){const[,g]=p[3].match(rg),b=new RegExp(`^${g}`,"gm"),x=p[3].replace(b,""),C=(S=x,lg.some(B=>B.test(S))?mg:Jt);var S;const k=p[1].toLowerCase(),w=gh.indexOf(k)!==-1,j=(w?k:p[1]).trim(),R={attrs:o(j,p[2]),noInnerParse:w,tag:j};return f.inAnchor=f.inAnchor||k==="a",w?R.text=p[3]:R.children=C(h,x,f),f.inAnchor=!1,R},render:(p,h,f)=>t(p.tag,yr({key:f.key},p.attrs),p.text||h(p.children,f))},[U.htmlSelfClosing]:{match:ct(lo),order:1,parse(p){const h=p[1].trim();return{attrs:o(h,p[2]||""),tag:h}},render:(p,h,f)=>t(p.tag,yr({},p.attrs,{key:f.key}))},[U.htmlComment]:{match:ct(ll),order:1,parse:()=>({}),render:Hn},[U.image]:{match:sr(ig),order:1,parse:p=>({alt:p[1],target:fs(p[2]),title:p[3]}),render:(p,h,f)=>t("img",{key:f.key,alt:p.alt||void 0,title:p.title||void 0,src:r.sanitizer(p.target,"img","src")})},[U.link]:{match:ar(sg),order:3,parse:(p,h,f)=>({children:fg(h,p[1],f),target:fs(p[2]),title:p[3]}),render:(p,h,f)=>t("a",{key:f.key,href:r.sanitizer(p.target,"a","href"),title:p.title},h(p.children,f))},[U.linkAngleBraceStyleDetector]:{match:ar(Dh),order:0,parse:p=>({children:[{text:p[1],type:U.text}],target:p[1],type:U.link})},[U.linkBareUrlDetector]:{match:(p,h)=>h.inAnchor?null:ar(Ih)(p,h),order:0,parse:p=>({children:[{text:p[1],type:U.text}],target:p[1],title:void 0,type:U.link})},[U.linkMailtoDetector]:{match:ar(Mh),order:0,parse(p){let h=p[1],f=p[1];return vh.test(f)||(f="mailto:"+f),{children:[{text:h.replace("mailto:",""),type:U.text}],target:f,type:U.link}}},[U.orderedList]:cs(t,1),[U.unorderedList]:cs(t,2),[U.newlineCoalescer]:{match:Ze(Eh),order:3,parse:Un,render:()=>` +`},[U.paragraph]:{match:dg,order:3,parse:Gn,render:(p,h,f)=>t("p",{key:f.key},h(p.children,f))},[U.ref]:{match:ar(Bh),order:0,parse:p=>(i[p[1]]={target:p[2],title:p[4]},{}),render:Hn},[U.refImage]:{match:sr(Lh),order:0,parse:p=>({alt:p[1]||void 0,ref:p[2]}),render:(p,h,f)=>i[p.ref]?t("img",{key:f.key,alt:p.alt,src:r.sanitizer(i[p.ref].target,"img","src"),title:i[p.ref].title}):null},[U.refLink]:{match:ar(Vh),order:0,parse:(p,h,f)=>({children:h(p[1],f),fallbackChildren:h(p[0].replace(Fh,"\\$1"),f),ref:p[2]}),render:(p,h,f)=>i[p.ref]?t("a",{key:f.key,href:r.sanitizer(i[p.ref].target,"a","href"),title:i[p.ref].title},h(p.children,f)):t("span",{key:f.key},h(p.fallbackChildren,f))},[U.table]:{match:Ze(pl),order:1,parse:cg,render(p,h,f){const g=p;return t("table",{key:f.key},t("thead",null,t("tr",null,g.header.map(function(b,x){return t("th",{key:x,style:us(g,x)},h(b,f))}))),t("tbody",null,g.cells.map(function(b,x){return t("tr",{key:x},b.map(function(C,S){return t("td",{key:S,style:us(g,S)},h(C,f))}))})))}},[U.text]:{match:ct(Qh),order:4,parse:p=>({text:p[0].replace(Ph,(h,f)=>r.namedCodesToUnicode[f]?r.namedCodesToUnicode[f]:h)}),render:p=>p.text},[U.textBolded]:{match:sr(Wh),order:2,parse:(p,h,f)=>({children:h(p[2],f)}),render:(p,h,f)=>t("strong",{key:f.key},h(p.children,f))},[U.textEmphasized]:{match:sr(Yh),order:3,parse:(p,h,f)=>({children:h(p[2],f)}),render:(p,h,f)=>t("em",{key:f.key},h(p.children,f))},[U.textEscaped]:{match:sr(Zh),order:1,parse:p=>({text:p[1],type:U.text})},[U.textMarked]:{match:sr(Kh),order:3,parse:Gn,render:(p,h,f)=>t("mark",{key:f.key},h(p.children,f))},[U.textStrikethroughed]:{match:sr(Jh),order:3,parse:Gn,render:(p,h,f)=>t("del",{key:f.key},h(p.children,f))}};r.disableParsingRawHTML===!0&&(delete l[U.htmlBlock],delete l[U.htmlSelfClosing]);const c=function(p){let h=Object.keys(p);function f(g,b){let x=[],C="";for(;g;){let S=0;for(;Sx(f,g,b),f,g,b):x(f,g,b)}}(l,r.renderRule),function p(h,f={}){if(Array.isArray(h)){const g=f.key,b=[];let x=!1;for(let C=0;C{let{children:r="",options:t}=e,n=function(o,a){if(o==null)return{};var i,l,c={},d=Object.keys(o);for(l=0;l=0||(c[i]=o[i]);return c}(e,hh);return M.cloneElement(gg(r,t),n)};function vg({id:e,markdown:r}){return s.jsx("div",{id:e,className:"pr-prose",children:s.jsx(bg,{children:r})})}const xl=y.forwardRef((e,r)=>s.jsxs(ve,{ref:r,className:"pr-rounded-md pr-border pr-border-dashed pr-border-gray-400 pr-bg-white pr-px-4 pr-py-2 pr-text-black pr-transition pr-duration-300 pr-ease-in-out hover:pr-border-blue-600 hover:pr-bg-white hover:pr-text-blue-600",...e,children:[s.jsx(ne.Filter,{size:16,className:"pr-mr-2 pr-h-4 pr-w-4 pr-text-gray-700 hover:pr-text-blue-600"}),"Filter",s.jsx(ne.ChevronDown,{size:16,className:"pr-ml-2 pr-h-4 pr-w-4 pr-text-gray-700 hover:pr-text-blue-600"})]}));var kl=(e=>(e[e.Check=0]="Check",e[e.Radio=1]="Radio",e))(kl||{});function wg({id:e,groups:r}){return s.jsx("div",{id:e,children:s.jsxs(pn,{children:[s.jsx(fo,{asChild:!0,children:s.jsx(xl,{})}),s.jsx(Ct,{children:r.map(t=>s.jsxs("div",{children:[s.jsx(Zr,{children:t.label}),s.jsx(Ss,{children:t.items.map(n=>s.jsx("div",{children:n.itemType===0?s.jsx(cn,{onClick:n.onClick,children:n.label}):s.jsx(ho,{onClick:n.onClick,value:n.label,children:n.label})},n.label))}),s.jsx(jt,{})]},t.label))})]})})}function yg({id:e,message:r}){return s.jsx("div",{id:e,className:"pr-mb-20 pr-mt-20 pr-flex pr-items-center pr-justify-center",children:s.jsx("div",{className:"pr-w-3/4 pr-rounded-lg pr-bg-gray-100 pr-p-8 pr-text-center",children:s.jsx("p",{className:"pr-text-lg pr-text-gray-800",children:r})})})}function xg({id:e,category:r,downloads:t,languages:n,moreInfoUrl:o}){const a=new ee.NumberFormat("en",{notation:"compact",compactDisplay:"short"}).format(Object.values(t).reduce((l,c)=>l+c,0)),i=()=>{window.scrollTo(0,document.body.scrollHeight)};return s.jsxs("div",{id:e,className:"pr-flex pr-flex-wrap pr-items-start pr-space-x-4 pr-border-b pr-border-t pr-bg-white pr-pb-4 pr-pt-4",children:[s.jsxs("div",{className:"pr-flex pr-flex-col pr-items-center",children:[s.jsx("div",{className:"pr-flex pr-items-center pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1",children:s.jsx("span",{className:"pr-text-xs pr-font-semibold pr-text-gray-700",children:r})}),s.jsx("span",{className:"pr-text-xs pr-text-gray-500",children:"CATEGORY"})]}),s.jsx("div",{className:"pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300"}),s.jsxs("div",{className:"pr-flex pr-flex-col pr-items-center",children:[s.jsxs("div",{className:"pr-flex pr-items-center pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1",children:[s.jsx(ne.User,{className:"pr-mr-1 pr-h-4 pr-w-4"}),s.jsx("span",{className:"pr-text-xs pr-font-semibold pr-text-gray-700",children:a})]}),s.jsx("span",{className:"pr-text-xs pr-text-gray-500",children:"USERS"})]}),s.jsx("div",{className:"pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300"}),s.jsxs("div",{className:"pr-flex pr-flex-col pr-items-center",children:[s.jsx("div",{className:"pr-flex pr-items-center",children:n.slice(0,3).map(l=>s.jsx("span",{className:"pr-ml-1 pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1 pr-text-xs pr-font-semibold pr-text-gray-700",children:l.toUpperCase()},l))}),n.length>3&&s.jsxs("button",{type:"button",onClick:()=>i(),className:"pr-text-xs pr-text-gray-500 pr-underline",children:["+",n.length-3," more languages"]})]}),s.jsx("div",{className:"pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300"}),s.jsxs("div",{className:"pr-ml-auto pr-flex pr-flex-col pr-space-y-2",children:[s.jsxs("a",{href:o,target:"_blank",rel:"noreferrer",className:"pr-flex pr-items-center pr-text-xs pr-font-semibold pr-text-gray-500 pr-underline",children:["Website",s.jsx(ne.Link,{className:"pr-ml-1 pr-inline pr-h-4 pr-w-4"})]}),s.jsxs("a",{href:"https://example.com",target:"_blank",rel:"noreferrer",className:"pr-flex pr-items-center pr-text-xs pr-font-semibold pr-text-gray-500 pr-underline",children:["Support",s.jsx(ne.CircleHelp,{className:"pr-ml-1 pr-inline pr-h-4 pr-w-4"})]})]})]})}function Nl({id:e,versionHistory:r}){const[t,n]=y.useState(!1),o=new Date;function a(l){const c=new Date(l),d=new Date(o.getTime()-c.getTime()),u=d.getUTCFullYear()-1970,v=d.getUTCMonth(),p=d.getUTCDate()-1;let h="";return u>0?h=`${u.toString()} year${u===1?"":"s"} ago`:v>0?h=`${v.toString()} month${v===1?"":"s"} ago`:p===0?h="today":h=`${p.toString()} day${p===1?"":"s"} ago`,h}const i=Object.entries(r).sort((l,c)=>c[0].localeCompare(l[0]));return s.jsxs("div",{id:e,children:[s.jsx("h3",{className:"pr-text-md pr-font-semibold",children:"What`s New"}),s.jsx("ul",{className:"pr-list-disc pr-pl-5 pr-pr-4 pr-text-xs pr-text-gray-600",children:(t?i:i.slice(0,5)).map(l=>s.jsxs("div",{className:"pr-mt-3 pr-flex pr-justify-between",children:[s.jsx("div",{className:"pr-text-gray-600",children:s.jsx("li",{className:"pr-prose pr-text-xs",children:s.jsx("span",{children:l[1].description})})}),s.jsxs("div",{className:"pr-justify-end pr-text-right",children:[s.jsxs("div",{children:["Version ",l[0]]}),s.jsx("div",{children:a(l[1].date)})]})]},l[0]))}),i.length>5&&s.jsx("button",{type:"button",onClick:()=>n(!t),className:"pr-text-xs pr-text-gray-500 pr-underline",children:t?"Show Less Version History":"Show All Version History"})]})}function kg({id:e,publisherDisplayName:r,fileSize:t,locales:n,versionHistory:o}){const a=y.useMemo(()=>ee.formatBytes(t),[t]),l=(c=>{const d=new Intl.DisplayNames(navigator.language,{type:"language"});return c.map(u=>d.of(u))})(n);return s.jsx("div",{id:e,className:"pr-border-t pr-pb-4 pr-pt-4",children:s.jsxs("div",{className:"pr-md:flex-row pr-md:space-x-8 pr-flex pr-flex-col pr-space-x-0",children:[s.jsx(Nl,{versionHistory:o}),s.jsx("div",{className:"pr-md:border-t-0 pr-md:border-l pr-md-h-auto pr-md-ml-8 pr-mt-4 pr-border-t pr-border-gray-300"}),s.jsxs("div",{className:"pr-md:mt-0 pr-mt-4 pr-flex-1 pr-space-y-3",children:[s.jsx("h2",{className:"pr-text-md pr-font-semibold",children:"Information"}),s.jsxs("div",{className:"pr-flex pr-items-start pr-justify-between pr-pr-4 pr-text-xs pr-text-gray-600",children:[s.jsxs("p",{className:"pr-flex pr-flex-col pr-justify-start",children:[s.jsx("span",{className:"pr-mb-2",children:"Publisher"}),s.jsx("span",{className:"pr-font-semibold",children:r}),s.jsx("span",{className:"pr-mb-2 pr-mt-4",children:"Size"}),s.jsx("span",{className:"pr-font-semibold",children:a})]}),s.jsx("div",{className:"pr-flex pr-w-3/4 pr-items-center pr-justify-between pr-text-xs pr-text-gray-600",children:s.jsxs("p",{className:"pr-flex pr-flex-col pr-justify-start",children:[s.jsx("span",{className:"pr-mb-2",children:"Languages"}),s.jsx("span",{className:"pr-font-semibold",children:l.join(", ")})]})})]})]})]})})}const Ng=(e,r)=>{y.useEffect(()=>{if(!e)return()=>{};const t=e(r);return()=>{t()}},[e,r])},Xn=()=>!1,Eg=(e,r)=>{const[t]=an(y.useCallback(async()=>{if(!e)return Xn;const n=await Promise.resolve(e(r));return async()=>n()},[r,e]),Xn,{preserveValue:!1});y.useEffect(()=>()=>{t!==Xn&&t()},[t])};Object.defineProperty(exports,"sonner",{enumerable:!0,get:()=>hs.toast});exports.Alert=zi;exports.AlertDescription=Ui;exports.AlertTitle=Gi;exports.BOOK_SELECTOR_STRING_KEYS=Mp;exports.BookChapterControl=Ep;exports.BookSelectionMode=Bs;exports.BookSelector=Dp;exports.Button=ve;exports.Card=Hi;exports.CardContent=Yi;exports.CardDescription=Wi;exports.CardFooter=Ki;exports.CardHeader=qi;exports.CardTitle=Xi;exports.ChapterRangeSelector=As;exports.Checkbox=Eo;exports.Checklist=lc;exports.ComboBox=Jn;exports.DataTable=Us;exports.DisableButton=fh;exports.DropdownMenu=pn;exports.DropdownMenuCheckboxItem=cn;exports.DropdownMenuContent=Ct;exports.DropdownMenuGroup=Ss;exports.DropdownMenuItem=mo;exports.DropdownMenuItemType=kl;exports.DropdownMenuLabel=Zr;exports.DropdownMenuPortal=dp;exports.DropdownMenuRadioGroup=fp;exports.DropdownMenuRadioItem=ho;exports.DropdownMenuSeparator=jt;exports.DropdownMenuShortcut=js;exports.DropdownMenuSub=up;exports.DropdownMenuSubContent=Cs;exports.DropdownMenuSubTrigger=Ts;exports.DropdownMenuTrigger=fo;exports.EnableButton=uh;exports.FilterButton=xl;exports.FilterDropdown=wg;exports.Footer=kg;exports.GridMenu=Vi;exports.HamburgerMenuButton=Fi;exports.INVENTORY_STRING_KEYS=Fp;exports.IconButton=ah;exports.Input=Kr;exports.InstallButton=dh;exports.Inventory=Up;exports.Label=qe;exports.MarkdownRenderer=vg;exports.MenuItem=Xo;exports.MoreInfo=xg;exports.NavigationContentSearch=Yp;exports.NoExtensionsFound=yg;exports.RadioGroup=go;exports.RadioGroupItem=Zt;exports.ScriptureResultsViewer=nc;exports.ScrollGroupSelector=oc;exports.SearchBar=Xs;exports.Select=Fr;exports.SelectContent=Er;exports.SelectGroup=Ls;exports.SelectItem=Ae;exports.SelectLabel=Vs;exports.SelectScrollDownButton=vo;exports.SelectScrollUpButton=bo;exports.SelectSeparator=Fs;exports.SelectTrigger=Nr;exports.SelectValue=zr;exports.Separator=No;exports.SettingsList=ac;exports.SettingsListHeader=ic;exports.SettingsListItem=sc;exports.Slider=Ji;exports.Sonner=ph;exports.Spinner=Qr;exports.Switch=Zi;exports.Table=Ot;exports.TableBody=Pt;exports.TableCaption=Gs;exports.TableCell=Sr;exports.TableFooter=zs;exports.TableHead=Gr;exports.TableHeader=Rt;exports.TableRow=Qe;exports.Tabs=ch;exports.TabsContent=rl;exports.TabsList=Qi;exports.TabsTrigger=el;exports.TextField=sh;exports.ToggleGroup=wo;exports.ToggleGroupItem=bt;exports.Toolbar=ih;exports.UpdateButton=mh;exports.VersionHistory=Nl;exports.VerticalTabs=yo;exports.VerticalTabsContent=ko;exports.VerticalTabsList=xo;exports.VerticalTabsTrigger=Ws;exports.buttonVariants=Os;exports.getSortingIcon=dn;exports.inventoryCountColumn=Xp;exports.inventoryItemColumn=qp;exports.inventoryStatusColumn=Wp;exports.useEvent=Ng;exports.useEventAsync=Eg;exports.usePromise=an;function Sg(e,r="top"){if(!e||typeof document>"u")return;const t=document.head||document.querySelector("head"),n=t.querySelector(":first-child"),o=document.createElement("style");o.appendChild(document.createTextNode(e)),r==="top"&&n?t.insertBefore(o,n):t.appendChild(o)}Sg(`/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*:where(.pr-twp,.pr-twp *), +::before:where(.pr-twp,.pr-twp *), +::after:where(.pr-twp,.pr-twp *) { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e5e7eb; /* 2 */ +} + +::before:where(.pr-twp,.pr-twp *), +::after:where(.pr-twp,.pr-twp *) { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured \`sans\` font-family by default. +5. Use the user's configured \`sans\` font-feature-settings by default. +6. Use the user's configured \`sans\` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html:where(.pr-twp,.pr-twp *), +:host:where(.pr-twp,.pr-twp *) { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ /* 3 */ + tab-size: 4; /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element. +*/ + +body:where(.pr-twp,.pr-twp *) { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr:where(.pr-twp,.pr-twp *) { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]):where(.pr-twp,.pr-twp *) { + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1:where(.pr-twp,.pr-twp *), +h2:where(.pr-twp,.pr-twp *), +h3:where(.pr-twp,.pr-twp *), +h4:where(.pr-twp,.pr-twp *), +h5:where(.pr-twp,.pr-twp *), +h6:where(.pr-twp,.pr-twp *) { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a:where(.pr-twp,.pr-twp *) { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b:where(.pr-twp,.pr-twp *), +strong:where(.pr-twp,.pr-twp *) { + font-weight: bolder; +} + +/* +1. Use the user's configured \`mono\` font-family by default. +2. Use the user's configured \`mono\` font-feature-settings by default. +3. Use the user's configured \`mono\` font-variation-settings by default. +4. Correct the odd \`em\` font sizing in all browsers. +*/ + +code:where(.pr-twp,.pr-twp *), +kbd:where(.pr-twp,.pr-twp *), +samp:where(.pr-twp,.pr-twp *), +pre:where(.pr-twp,.pr-twp *) { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small:where(.pr-twp,.pr-twp *) { + font-size: 80%; +} + +/* +Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers. +*/ + +sub:where(.pr-twp,.pr-twp *), +sup:where(.pr-twp,.pr-twp *) { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub:where(.pr-twp,.pr-twp *) { + bottom: -0.25em; +} + +sup:where(.pr-twp,.pr-twp *) { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table:where(.pr-twp,.pr-twp *) { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button:where(.pr-twp,.pr-twp *), +input:where(.pr-twp,.pr-twp *), +optgroup:where(.pr-twp,.pr-twp *), +select:where(.pr-twp,.pr-twp *), +textarea:where(.pr-twp,.pr-twp *) { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button:where(.pr-twp,.pr-twp *), +select:where(.pr-twp,.pr-twp *) { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button:where(.pr-twp,.pr-twp *), +input:where([type='button']):where(.pr-twp,.pr-twp *), +input:where([type='reset']):where(.pr-twp,.pr-twp *), +input:where([type='submit']):where(.pr-twp,.pr-twp *) { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring:where(.pr-twp,.pr-twp *) { + outline: auto; +} + +/* +Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid:where(.pr-twp,.pr-twp *) { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress:where(.pr-twp,.pr-twp *) { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button:where(.pr-twp,.pr-twp *), +::-webkit-outer-spin-button:where(.pr-twp,.pr-twp *) { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search']:where(.pr-twp,.pr-twp *) { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration:where(.pr-twp,.pr-twp *) { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to \`inherit\` in Safari. +*/ + +::-webkit-file-upload-button:where(.pr-twp,.pr-twp *) { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary:where(.pr-twp,.pr-twp *) { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote:where(.pr-twp,.pr-twp *), +dl:where(.pr-twp,.pr-twp *), +dd:where(.pr-twp,.pr-twp *), +h1:where(.pr-twp,.pr-twp *), +h2:where(.pr-twp,.pr-twp *), +h3:where(.pr-twp,.pr-twp *), +h4:where(.pr-twp,.pr-twp *), +h5:where(.pr-twp,.pr-twp *), +h6:where(.pr-twp,.pr-twp *), +hr:where(.pr-twp,.pr-twp *), +figure:where(.pr-twp,.pr-twp *), +p:where(.pr-twp,.pr-twp *), +pre:where(.pr-twp,.pr-twp *) { + margin: 0; +} + +fieldset:where(.pr-twp,.pr-twp *) { + margin: 0; + padding: 0; +} + +legend:where(.pr-twp,.pr-twp *) { + padding: 0; +} + +ol:where(.pr-twp,.pr-twp *), +ul:where(.pr-twp,.pr-twp *), +menu:where(.pr-twp,.pr-twp *) { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ +dialog:where(.pr-twp,.pr-twp *) { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea:where(.pr-twp,.pr-twp *) { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::placeholder:where(.pr-twp,.pr-twp *), +textarea::placeholder:where(.pr-twp,.pr-twp *) { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button:where(.pr-twp,.pr-twp *), +[role="button"]:where(.pr-twp,.pr-twp *) { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled:where(.pr-twp,.pr-twp *) { + cursor: default; +} + +/* +1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img:where(.pr-twp,.pr-twp *), +svg:where(.pr-twp,.pr-twp *), +video:where(.pr-twp,.pr-twp *), +canvas:where(.pr-twp,.pr-twp *), +audio:where(.pr-twp,.pr-twp *), +iframe:where(.pr-twp,.pr-twp *), +embed:where(.pr-twp,.pr-twp *), +object:where(.pr-twp,.pr-twp *) { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img:where(.pr-twp,.pr-twp *), +video:where(.pr-twp,.pr-twp *) { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden]:where(.pr-twp,.pr-twp *) { + display: none; +} + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* Adding the preflight selector (pr-twp) to components was not changing the font as desired. + So this piece of code adds pr-font-sans everywhere we include preflight. */ + .pr-twp { + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + * { + border-color: hsl(var(--border)); +} + + body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +.pr-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} +.pr-pointer-events-none { + pointer-events: none; +} +.pr-fixed { + position: fixed; +} +.pr-absolute { + position: absolute; +} +.pr-relative { + position: relative; +} +.pr-sticky { + position: sticky; +} +.pr-inset-0 { + inset: 0px; +} +.pr-inset-y-0 { + top: 0px; + bottom: 0px; +} +.pr-bottom-2 { + bottom: 0.5rem; +} +.pr-left-2 { + left: 0.5rem; +} +.pr-left-2\\.5 { + left: 0.625rem; +} +.pr-left-\\[50\\%\\] { + left: 50%; +} +.pr-right-3 { + right: 0.75rem; +} +.pr-right-4 { + right: 1rem; +} +.pr-top-0 { + top: 0px; +} +.pr-top-1\\/2 { + top: 50%; +} +.pr-top-2 { + top: 0.5rem; +} +.pr-top-2\\.5 { + top: 0.625rem; +} +.pr-top-4 { + top: 1rem; +} +.pr-top-\\[50\\%\\] { + top: 50%; +} +.pr-z-10 { + z-index: 10; +} +.pr-z-30 { + z-index: 30; +} +.pr-z-50 { + z-index: 50; +} +.pr-col-span-2 { + grid-column: span 2 / span 2; +} +.pr-m-1 { + margin: 0.25rem; +} +.pr-m-2 { + margin: 0.5rem; +} +.pr--mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +.pr-mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.pr-mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} +.pr-my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.pr-my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.pr-my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.pr-mb-1 { + margin-bottom: 0.25rem; +} +.pr-mb-2 { + margin-bottom: 0.5rem; +} +.pr-mb-20 { + margin-bottom: 5rem; +} +.pr-me-2 { + margin-inline-end: 0.5rem; +} +.pr-ml-1 { + margin-left: 0.25rem; +} +.pr-ml-2 { + margin-left: 0.5rem; +} +.pr-ml-auto { + margin-left: auto; +} +.pr-mr-1 { + margin-right: 0.25rem; +} +.pr-mr-2 { + margin-right: 0.5rem; +} +.pr-ms-2 { + margin-inline-start: 0.5rem; +} +.pr-ms-5 { + margin-inline-start: 1.25rem; +} +.pr-ms-auto { + margin-inline-start: auto; +} +.pr-mt-2 { + margin-top: 0.5rem; +} +.pr-mt-20 { + margin-top: 5rem; +} +.pr-mt-3 { + margin-top: 0.75rem; +} +.pr-mt-4 { + margin-top: 1rem; +} +.pr-mt-auto { + margin-top: auto; +} +.pr-box-border { + box-sizing: border-box; +} +.pr-box-content { + box-sizing: content-box; +} +.pr-block { + display: block; +} +.pr-inline-block { + display: inline-block; +} +.pr-inline { + display: inline; +} +.pr-flex { + display: flex; +} +.pr-inline-flex { + display: inline-flex; +} +.pr-grid { + display: grid; +} +.pr-inline-grid { + display: inline-grid; +} +.pr-hidden { + display: none; +} +.pr-aspect-square { + aspect-ratio: 1 / 1; +} +.pr-h-1\\/2 { + height: 50%; +} +.pr-h-10 { + height: 2.5rem; +} +.pr-h-11 { + height: 2.75rem; +} +.pr-h-12 { + height: 3rem; +} +.pr-h-14 { + height: 3.5rem; +} +.pr-h-2 { + height: 0.5rem; +} +.pr-h-2\\.5 { + height: 0.625rem; +} +.pr-h-24 { + height: 6rem; +} +.pr-h-3 { + height: 0.75rem; +} +.pr-h-3\\.5 { + height: 0.875rem; +} +.pr-h-4 { + height: 1rem; +} +.pr-h-5 { + height: 1.25rem; +} +.pr-h-6 { + height: 1.5rem; +} +.pr-h-7 { + height: 1.75rem; +} +.pr-h-8 { + height: 2rem; +} +.pr-h-9 { + height: 2.25rem; +} +.pr-h-96 { + height: 24rem; +} +.pr-h-\\[1\\.2rem\\] { + height: 1.2rem; +} +.pr-h-\\[100\\%\\] { + height: 100%; +} +.pr-h-\\[1px\\] { + height: 1px; +} +.pr-h-\\[405px\\] { + height: 405px; +} +.pr-h-\\[var\\(--radix-select-trigger-height\\)\\] { + height: var(--radix-select-trigger-height); +} +.pr-h-full { + height: 100%; +} +.pr-h-px { + height: 1px; +} +.pr-max-h-96 { + max-height: 24rem; +} +.pr-max-h-\\[300px\\] { + max-height: 300px; +} +.pr-w-0 { + width: 0px; +} +.pr-w-1\\/3 { + width: 33.333333%; +} +.pr-w-10 { + width: 2.5rem; +} +.pr-w-11 { + width: 2.75rem; +} +.pr-w-14 { + width: 3.5rem; +} +.pr-w-2 { + width: 0.5rem; +} +.pr-w-2\\.5 { + width: 0.625rem; +} +.pr-w-20 { + width: 5rem; +} +.pr-w-3 { + width: 0.75rem; +} +.pr-w-3\\.5 { + width: 0.875rem; +} +.pr-w-3\\/4 { + width: 75%; +} +.pr-w-4 { + width: 1rem; +} +.pr-w-5 { + width: 1.25rem; +} +.pr-w-6 { + width: 1.5rem; +} +.pr-w-72 { + width: 18rem; +} +.pr-w-8 { + width: 2rem; +} +.pr-w-9 { + width: 2.25rem; +} +.pr-w-\\[1\\.2rem\\] { + width: 1.2rem; +} +.pr-w-\\[100px\\] { + width: 100px; +} +.pr-w-\\[116px\\] { + width: 116px; +} +.pr-w-\\[124px\\] { + width: 124px; +} +.pr-w-\\[150px\\] { + width: 150px; +} +.pr-w-\\[1px\\] { + width: 1px; +} +.pr-w-\\[200px\\] { + width: 200px; +} +.pr-w-\\[350px\\] { + width: 350px; +} +.pr-w-\\[70px\\] { + width: 70px; +} +.pr-w-auto { + width: auto; +} +.pr-w-full { + width: 100%; +} +.pr-min-w-\\[8rem\\] { + min-width: 8rem; +} +.pr-min-w-\\[var\\(--radix-select-trigger-width\\)\\] { + min-width: var(--radix-select-trigger-width); +} +.pr-max-w-64 { + max-width: 16rem; +} +.pr-max-w-lg { + max-width: 32rem; +} +.pr-flex-1 { + flex: 1 1 0%; +} +.pr-shrink-0 { + flex-shrink: 0; +} +.pr-flex-grow { + flex-grow: 1; +} +.pr-grow { + flex-grow: 1; +} +.pr-caption-bottom { + caption-side: bottom; +} +.pr--translate-y-1\\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-translate-x-\\[-50\\%\\] { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-translate-y-\\[-50\\%\\] { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-rotate-0 { + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-scale-0 { + --tw-scale-x: 0; + --tw-scale-y: 0; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +@keyframes pr-spin { + + to { + transform: rotate(360deg); + } +} +.pr-animate-spin { + animation: pr-spin 1s linear infinite; +} +.pr-cursor-default { + cursor: default; +} +.pr-cursor-not-allowed { + cursor: not-allowed; +} +.pr-cursor-pointer { + cursor: pointer; +} +.pr-touch-none { + touch-action: none; +} +.pr-select-none { + user-select: none; +} +.pr-list-disc { + list-style-type: disc; +} +.pr-columns-2 { + columns: 2; +} +.pr-auto-rows-max { + grid-auto-rows: max-content; +} +.pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.pr-grid-cols-\\[25\\%\\,25\\%\\,50\\%\\] { + grid-template-columns: 25% 25% 50%; +} +.pr-grid-cols-\\[25\\%\\,50\\%\\,25\\%\\] { + grid-template-columns: 25% 50% 25%; +} +.pr-flex-row { + flex-direction: row; +} +.pr-flex-col { + flex-direction: column; +} +.pr-flex-col-reverse { + flex-direction: column-reverse; +} +.pr-flex-wrap { + flex-wrap: wrap; +} +.pr-items-start { + align-items: flex-start; +} +.pr-items-center { + align-items: center; +} +.pr-justify-start { + justify-content: flex-start; +} +.pr-justify-end { + justify-content: flex-end; +} +.pr-justify-center { + justify-content: center; +} +.pr-justify-between { + justify-content: space-between; +} +.pr-gap-0 { + gap: 0px; +} +.pr-gap-0\\.5 { + gap: 0.125rem; +} +.pr-gap-1 { + gap: 0.25rem; +} +.pr-gap-1\\.5 { + gap: 0.375rem; +} +.pr-gap-2 { + gap: 0.5rem; +} +.pr-gap-2\\.5 { + gap: 0.625rem; +} +.pr-gap-3 { + gap: 0.75rem; +} +.pr-gap-4 { + gap: 1rem; +} +.pr-gap-6 { + gap: 1.5rem; +} +.pr-gap-x-4 { + column-gap: 1rem; +} +.pr-space-x-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0px * var(--tw-space-x-reverse)); + margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1.5rem * var(--tw-space-x-reverse)); + margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} +.pr-space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} +.pr-space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} +.pr-space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} +.pr-space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} +.pr-self-stretch { + align-self: stretch; +} +.pr-overflow-auto { + overflow: auto; +} +.pr-overflow-hidden { + overflow: hidden; +} +.pr-overflow-y-auto { + overflow-y: auto; +} +.pr-overflow-x-hidden { + overflow-x: hidden; +} +.pr-overflow-y-hidden { + overflow-y: hidden; +} +.pr-text-ellipsis { + text-overflow: ellipsis; +} +.pr-whitespace-normal { + white-space: normal; +} +.pr-whitespace-nowrap { + white-space: nowrap; +} +.pr-text-nowrap { + text-wrap: nowrap; +} +.pr-text-balance { + text-wrap: balance; +} +.pr-break-words { + overflow-wrap: break-word; +} +.pr-rounded-full { + border-radius: 9999px; +} +.pr-rounded-lg { + border-radius: var(--radius); +} +.pr-rounded-md { + border-radius: calc(var(--radius) - 2px); +} +.pr-rounded-sm { + border-radius: calc(var(--radius) - 4px); +} +.pr-rounded-s-md { + border-start-start-radius: calc(var(--radius) - 2px); + border-end-start-radius: calc(var(--radius) - 2px); +} +.pr-rounded-ee-none { + border-end-end-radius: 0px; +} +.pr-rounded-se-md { + border-start-end-radius: calc(var(--radius) - 2px); +} +.pr-rounded-ss-none { + border-start-start-radius: 0px; +} +.pr-border { + border-width: 1px; +} +.pr-border-0 { + border-width: 0px; +} +.pr-border-2 { + border-width: 2px; +} +.pr-border-b { + border-bottom-width: 1px; +} +.pr-border-b-0 { + border-bottom-width: 0px; +} +.pr-border-e { + border-inline-end-width: 1px; +} +.pr-border-l { + border-left-width: 1px; +} +.pr-border-l-2 { + border-left-width: 2px; +} +.pr-border-r-0 { + border-right-width: 0px; +} +.pr-border-t { + border-top-width: 1px; +} +.pr-border-t-0 { + border-top-width: 0px; +} +.pr-border-solid { + border-style: solid; +} +.pr-border-dashed { + border-style: dashed; +} +.pr-border-black { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity)); +} +.pr-border-destructive\\/50 { + border-color: hsl(var(--destructive) / 0.5); +} +.pr-border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} +.pr-border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} +.pr-border-input { + border-color: hsl(var(--input)); +} +.pr-border-primary { + border-color: hsl(var(--primary)); +} +.pr-border-red-600 { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity)); +} +.pr-border-transparent { + border-color: transparent; +} +.pr-border-l-indigo-200 { + --tw-border-opacity: 1; + border-left-color: rgb(199 210 254 / var(--tw-border-opacity)); +} +.pr-border-l-purple-200 { + --tw-border-opacity: 1; + border-left-color: rgb(233 213 255 / var(--tw-border-opacity)); +} +.pr-border-l-red-200 { + --tw-border-opacity: 1; + border-left-color: rgb(254 202 202 / var(--tw-border-opacity)); +} +.pr-bg-accent { + background-color: hsl(var(--accent)); +} +.pr-bg-accent-foreground { + background-color: hsl(var(--accent-foreground)); +} +.pr-bg-amber-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity)); +} +.pr-bg-amber-200 { + --tw-bg-opacity: 1; + background-color: rgb(253 230 138 / var(--tw-bg-opacity)); +} +.pr-bg-amber-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity)); +} +.pr-bg-background { + background-color: hsl(var(--background)); +} +.pr-bg-black\\/80 { + background-color: rgb(0 0 0 / 0.8); +} +.pr-bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} +.pr-bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} +.pr-bg-border { + background-color: hsl(var(--border)); +} +.pr-bg-card { + background-color: hsl(var(--card)); +} +.pr-bg-card-foreground { + background-color: hsl(var(--card-foreground)); +} +.pr-bg-destructive { + background-color: hsl(var(--destructive)); +} +.pr-bg-destructive-foreground { + background-color: hsl(var(--destructive-foreground)); +} +.pr-bg-foreground { + background-color: hsl(var(--foreground)); +} +.pr-bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} +.pr-bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} +.pr-bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} +.pr-bg-input { + background-color: hsl(var(--input)); +} +.pr-bg-muted { + background-color: hsl(var(--muted)); +} +.pr-bg-muted-foreground { + background-color: hsl(var(--muted-foreground)); +} +.pr-bg-muted\\/40 { + background-color: hsl(var(--muted) / 0.4); +} +.pr-bg-muted\\/50 { + background-color: hsl(var(--muted) / 0.5); +} +.pr-bg-neutral-300 { + --tw-bg-opacity: 1; + background-color: rgb(212 212 212 / var(--tw-bg-opacity)); +} +.pr-bg-popover { + background-color: hsl(var(--popover)); +} +.pr-bg-popover-foreground { + background-color: hsl(var(--popover-foreground)); +} +.pr-bg-primary { + background-color: hsl(var(--primary)); +} +.pr-bg-primary-foreground { + background-color: hsl(var(--primary-foreground)); +} +.pr-bg-ring { + background-color: hsl(var(--ring)); +} +.pr-bg-secondary { + background-color: hsl(var(--secondary)); +} +.pr-bg-secondary-foreground { + background-color: hsl(var(--secondary-foreground)); +} +.pr-bg-transparent { + background-color: transparent; +} +.pr-bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.pr-fill-current { + fill: currentColor; +} +.pr-p-0 { + padding: 0px; +} +.pr-p-1 { + padding: 0.25rem; +} +.pr-p-2 { + padding: 0.5rem; +} +.pr-p-4 { + padding: 1rem; +} +.pr-p-6 { + padding: 1.5rem; +} +.pr-p-8 { + padding: 2rem; +} +.pr-p-\\[1px\\] { + padding: 1px; +} +.pr-px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.pr-px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.pr-px-2\\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} +.pr-px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.pr-px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.pr-px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} +.pr-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.pr-px-7 { + padding-left: 1.75rem; + padding-right: 1.75rem; +} +.pr-px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.pr-py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.pr-py-1\\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} +.pr-py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.pr-py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.pr-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.pr-py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.pr-pb-2 { + padding-bottom: 0.5rem; +} +.pr-pb-3 { + padding-bottom: 0.75rem; +} +.pr-pb-4 { + padding-bottom: 1rem; +} +.pr-pe-2 { + padding-inline-end: 0.5rem; +} +.pr-pl-4 { + padding-left: 1rem; +} +.pr-pl-5 { + padding-left: 1.25rem; +} +.pr-pl-8 { + padding-left: 2rem; +} +.pr-pr-2 { + padding-right: 0.5rem; +} +.pr-pr-3 { + padding-right: 0.75rem; +} +.pr-pr-4 { + padding-right: 1rem; +} +.pr-ps-12 { + padding-inline-start: 3rem; +} +.pr-ps-4 { + padding-inline-start: 1rem; +} +.pr-ps-8 { + padding-inline-start: 2rem; +} +.pr-pt-0 { + padding-top: 0px; +} +.pr-pt-3 { + padding-top: 0.75rem; +} +.pr-pt-4 { + padding-top: 1rem; +} +.pr-text-center { + text-align: center; +} +.pr-text-right { + text-align: right; +} +.pr-text-start { + text-align: start; +} +.pr-text-end { + text-align: end; +} +.pr-align-middle { + vertical-align: middle; +} +.pr-text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} +.pr-text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} +.pr-text-5xl { + font-size: 3rem; + line-height: 1; +} +.pr-text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} +.pr-text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} +.pr-text-xs { + font-size: 0.75rem; + line-height: 1rem; +} +.pr-font-bold { + font-weight: 700; +} +.pr-font-medium { + font-weight: 500; +} +.pr-font-normal { + font-weight: 400; +} +.pr-font-semibold { + font-weight: 600; +} +.pr-uppercase { + text-transform: uppercase; +} +.pr-capitalize { + text-transform: capitalize; +} +.pr-not-italic { + font-style: normal; +} +.pr-tabular-nums { + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} +.pr-leading-9 { + line-height: 2.25rem; +} +.pr-leading-none { + line-height: 1; +} +.pr-leading-relaxed { + line-height: 1.625; +} +.pr-tracking-tight { + letter-spacing: -0.025em; +} +.pr-tracking-widest { + letter-spacing: 0.1em; +} +.pr-text-accent-foreground { + color: hsl(var(--accent-foreground)); +} +.pr-text-amber-800 { + --tw-text-opacity: 1; + color: rgb(146 64 14 / var(--tw-text-opacity)); +} +.pr-text-amber-900 { + --tw-text-opacity: 1; + color: rgb(120 53 15 / var(--tw-text-opacity)); +} +.pr-text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} +.pr-text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} +.pr-text-card-foreground { + color: hsl(var(--card-foreground)); +} +.pr-text-current { + color: currentColor; +} +.pr-text-destructive { + color: hsl(var(--destructive)); +} +.pr-text-destructive-foreground { + color: hsl(var(--destructive-foreground)); +} +.pr-text-foreground { + color: hsl(var(--foreground)); +} +.pr-text-foreground\\/80 { + color: hsl(var(--foreground) / 0.8); +} +.pr-text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} +.pr-text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} +.pr-text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} +.pr-text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} +.pr-text-inherit { + color: inherit; +} +.pr-text-muted-foreground { + color: hsl(var(--muted-foreground)); +} +.pr-text-popover-foreground { + color: hsl(var(--popover-foreground)); +} +.pr-text-primary { + color: hsl(var(--primary)); +} +.pr-text-primary-foreground { + color: hsl(var(--primary-foreground)); +} +.pr-text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} +.pr-text-secondary-foreground { + color: hsl(var(--secondary-foreground)); +} +.pr-text-slate-900 { + --tw-text-opacity: 1; + color: rgb(15 23 42 / var(--tw-text-opacity)); +} +.pr-text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.pr-text-yellow-900 { + --tw-text-opacity: 1; + color: rgb(113 63 18 / var(--tw-text-opacity)); +} +.pr-underline { + text-decoration-line: underline; +} +.pr-underline-offset-4 { + text-underline-offset: 4px; +} +.pr-opacity-0 { + opacity: 0; +} +.pr-opacity-50 { + opacity: 0.5; +} +.pr-opacity-60 { + opacity: 0.6; +} +.pr-opacity-70 { + opacity: 0.7; +} +.pr-shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} +.pr-ring-0 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.pr-ring-offset-background { + --tw-ring-offset-color: hsl(var(--background)); +} +.pr-transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-duration-200 { + transition-duration: 200ms; +} +.pr-duration-300 { + transition-duration: 300ms; +} +.pr-ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +@keyframes enter { + + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0)); + } +} +@keyframes exit { + + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0)); + } +} +.pr-duration-200 { + animation-duration: 200ms; +} +.pr-duration-300 { + animation-duration: 300ms; +} +.pr-ease-in-out { + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.\\*\\:pr-m-4 > * { + margin: 1rem; +} +.file\\:pr-border-0::file-selector-button { + border-width: 0px; +} +.file\\:pr-bg-transparent::file-selector-button { + background-color: transparent; +} +.file\\:pr-text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.25rem; +} +.file\\:pr-font-medium::file-selector-button { + font-weight: 500; +} +.placeholder\\:pr-text-muted-foreground::placeholder { + color: hsl(var(--muted-foreground)); +} +.hover\\:pr-border-blue-600:hover { + --tw-border-opacity: 1; + border-color: rgb(37 99 235 / var(--tw-border-opacity)); +} +.hover\\:pr-bg-accent:hover { + background-color: hsl(var(--accent)); +} +.hover\\:pr-bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} +.hover\\:pr-bg-destructive\\/90:hover { + background-color: hsl(var(--destructive) / 0.9); +} +.hover\\:pr-bg-gray-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} +.hover\\:pr-bg-muted:hover { + background-color: hsl(var(--muted)); +} +.hover\\:pr-bg-muted\\/50:hover { + background-color: hsl(var(--muted) / 0.5); +} +.hover\\:pr-bg-primary\\/90:hover { + background-color: hsl(var(--primary) / 0.9); +} +.hover\\:pr-bg-secondary\\/80:hover { + background-color: hsl(var(--secondary) / 0.8); +} +.hover\\:pr-bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.hover\\:pr-text-accent-foreground:hover { + color: hsl(var(--accent-foreground)); +} +.hover\\:pr-text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} +.hover\\:pr-text-foreground:hover { + color: hsl(var(--foreground)); +} +.hover\\:pr-text-muted-foreground:hover { + color: hsl(var(--muted-foreground)); +} +.hover\\:pr-text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.hover\\:pr-underline:hover { + text-decoration-line: underline; +} +.hover\\:pr-opacity-100:hover { + opacity: 1; +} +.focus\\:pr-bg-accent:focus { + background-color: hsl(var(--accent)); +} +.focus\\:pr-text-accent-foreground:focus { + color: hsl(var(--accent-foreground)); +} +.focus\\:pr-outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} +.focus\\:pr-ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.focus\\:pr-ring-ring:focus { + --tw-ring-color: hsl(var(--ring)); +} +.focus\\:pr-ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} +.focus-visible\\:pr-outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} +.focus-visible\\:pr-ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.focus-visible\\:pr-ring-\\[color\\:hsl\\(2400o2c 5\\%0o2c 64\\.9\\%\\)\\]:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: hsl(240 5% 64.9% / var(--tw-ring-opacity)); +} +.focus-visible\\:pr-ring-ring:focus-visible { + --tw-ring-color: hsl(var(--ring)); +} +.focus-visible\\:pr-ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} +.focus-visible\\:pr-ring-offset-background:focus-visible { + --tw-ring-offset-color: hsl(var(--background)); +} +.disabled\\:pr-pointer-events-none:disabled { + pointer-events: none; +} +.disabled\\:pr-cursor-not-allowed:disabled { + cursor: not-allowed; +} +.disabled\\:pr-opacity-50:disabled { + opacity: 0.5; +} +.pr-group:hover .group-hover\\:pr-opacity-100 { + opacity: 1; +} +.pr-peer:disabled ~ .peer-disabled\\:pr-cursor-not-allowed { + cursor: not-allowed; +} +.pr-peer:disabled ~ .peer-disabled\\:pr-opacity-70 { + opacity: 0.7; +} +.data-\\[disabled\\=true\\]\\:pr-pointer-events-none[data-disabled=true] { + pointer-events: none; +} +.data-\\[disabled\\]\\:pr-pointer-events-none[data-disabled] { + pointer-events: none; +} +.data-\\[side\\=bottom\\]\\:pr-translate-y-1[data-side=bottom] { + --tw-translate-y: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=left\\]\\:pr--translate-x-1[data-side=left] { + --tw-translate-x: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=right\\]\\:pr-translate-x-1[data-side=right] { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=top\\]\\:pr--translate-y-1[data-side=top] { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[state\\=checked\\]\\:pr-translate-x-5[data-state=checked] { + --tw-translate-x: 1.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[state\\=unchecked\\]\\:pr-translate-x-0[data-state=unchecked] { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[highlighted\\]\\:pr-bg-amber-100[data-highlighted] { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity)); +} +.data-\\[selected\\=true\\]\\:pr-bg-accent[data-selected=true] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=active\\]\\:pr-bg-background[data-state=active] { + background-color: hsl(var(--background)); +} +.data-\\[state\\=checked\\]\\:pr-bg-primary[data-state=checked] { + background-color: hsl(var(--primary)); +} +.data-\\[state\\=on\\]\\:pr-bg-accent[data-state=on] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=open\\]\\:pr-bg-accent[data-state=open] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=selected\\]\\:pr-bg-muted[data-state=selected] { + background-color: hsl(var(--muted)); +} +.data-\\[state\\=unchecked\\]\\:pr-bg-input[data-state=unchecked] { + background-color: hsl(var(--input)); +} +.data-\\[selected\\=true\\]\\:pr-text-accent-foreground[data-selected=true] { + color: hsl(var(--accent-foreground)); +} +.data-\\[state\\=active\\]\\:pr-text-foreground[data-state=active] { + color: hsl(var(--foreground)); +} +.data-\\[state\\=checked\\]\\:pr-text-primary-foreground[data-state=checked] { + color: hsl(var(--primary-foreground)); +} +.data-\\[state\\=on\\]\\:pr-text-accent-foreground[data-state=on] { + color: hsl(var(--accent-foreground)); +} +.data-\\[state\\=open\\]\\:pr-text-muted-foreground[data-state=open] { + color: hsl(var(--muted-foreground)); +} +.data-\\[disabled\\=true\\]\\:pr-opacity-50[data-disabled=true] { + opacity: 0.5; +} +.data-\\[disabled\\]\\:pr-opacity-50[data-disabled] { + opacity: 0.5; +} +.data-\\[state\\=active\\]\\:pr-shadow-sm[data-state=active] { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.data-\\[state\\=open\\]\\:pr-animate-in[data-state=open] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} +.data-\\[state\\=closed\\]\\:pr-animate-out[data-state=closed] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} +.data-\\[state\\=closed\\]\\:pr-fade-out-0[data-state=closed] { + --tw-exit-opacity: 0; +} +.data-\\[state\\=open\\]\\:pr-fade-in-0[data-state=open] { + --tw-enter-opacity: 0; +} +.data-\\[state\\=closed\\]\\:pr-zoom-out-95[data-state=closed] { + --tw-exit-scale: .95; +} +.data-\\[state\\=open\\]\\:pr-zoom-in-95[data-state=open] { + --tw-enter-scale: .95; +} +.data-\\[side\\=bottom\\]\\:pr-slide-in-from-top-2[data-side=bottom] { + --tw-enter-translate-y: -0.5rem; +} +.data-\\[side\\=left\\]\\:pr-slide-in-from-right-2[data-side=left] { + --tw-enter-translate-x: 0.5rem; +} +.data-\\[side\\=right\\]\\:pr-slide-in-from-left-2[data-side=right] { + --tw-enter-translate-x: -0.5rem; +} +.data-\\[side\\=top\\]\\:pr-slide-in-from-bottom-2[data-side=top] { + --tw-enter-translate-y: 0.5rem; +} +.data-\\[state\\=closed\\]\\:pr-slide-out-to-left-1\\/2[data-state=closed] { + --tw-exit-translate-x: -50%; +} +.data-\\[state\\=closed\\]\\:pr-slide-out-to-top-\\[48\\%\\][data-state=closed] { + --tw-exit-translate-y: -48%; +} +.data-\\[state\\=open\\]\\:pr-slide-in-from-left-1\\/2[data-state=open] { + --tw-enter-translate-x: -50%; +} +.data-\\[state\\=open\\]\\:pr-slide-in-from-top-\\[48\\%\\][data-state=open] { + --tw-enter-translate-y: -48%; +} +@media (min-width: 640px) { + + .sm\\:pr-not-sr-only { + position: static; + width: auto; + height: auto; + padding: 0; + margin: 0; + overflow: visible; + clip: auto; + white-space: normal; + } + + .sm\\:pr-static { + position: static; + } + + .sm\\:pr-col-span-2 { + grid-column: span 2 / span 2; + } + + .sm\\:pr-flex { + display: flex; + } + + .sm\\:pr-table-cell { + display: table-cell; + } + + .sm\\:pr-hidden { + display: none; + } + + .sm\\:pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\\:pr-flex-row { + flex-direction: row; + } + + .sm\\:pr-justify-end { + justify-content: flex-end; + } + + .sm\\:pr-gap-4 { + gap: 1rem; + } + + .sm\\:pr-space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\\:pr-rounded-lg { + border-radius: var(--radius); + } + + .sm\\:pr-border-0 { + border-width: 0px; + } + + .sm\\:pr-bg-transparent { + background-color: transparent; + } + + .sm\\:pr-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\\:pr-py-0 { + padding-top: 0px; + padding-bottom: 0px; + } + + .sm\\:pr-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; + } + + .sm\\:pr-py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } + + .sm\\:pr-pl-14 { + padding-left: 3.5rem; + } + + .sm\\:pr-text-left { + text-align: left; + } +} +@media (min-width: 768px) { + + .md\\:pr-inline { + display: inline; + } + + .md\\:pr-flex { + display: flex; + } + + .md\\:pr-table-cell { + display: table-cell; + } + + .md\\:pr-h-8 { + height: 2rem; + } + + .md\\:pr-w-8 { + width: 2rem; + } + + .md\\:pr-w-\\[200px\\] { + width: 200px; + } + + .md\\:pr-grow-0 { + flex-grow: 0; + } + + .md\\:pr-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .md\\:pr-gap-8 { + gap: 2rem; + } + + .md\\:pr-text-base { + font-size: 1rem; + line-height: 1.5rem; + } +} +@media (min-width: 1024px) { + + .lg\\:pr-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; + } + + .lg\\:pr-col-span-2 { + grid-column: span 2 / span 2; + } + + .lg\\:pr-flex { + display: flex; + } + + .lg\\:pr-w-\\[336px\\] { + width: 336px; + } + + .lg\\:pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .lg\\:pr-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\\:pr-space-x-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2rem * var(--tw-space-x-reverse)); + margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); + } +} +@media (min-width: 1280px) { + + .xl\\:pr-not-sr-only { + position: static; + width: auto; + height: auto; + padding: 0; + margin: 0; + overflow: visible; + clip: auto; + white-space: normal; + } + + .xl\\:pr-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\\:pr-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .xl\\:pr-whitespace-nowrap { + white-space: nowrap; + } +} +@media (prefers-color-scheme: dark) { + + .dark\\:pr--rotate-90 { + --tw-rotate: -90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-rotate-0 { + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-scale-0 { + --tw-scale-x: 0; + --tw-scale-y: 0; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-border-destructive { + border-color: hsl(var(--destructive)); + } +} +.\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-pe-0:has([role=checkbox]) { + padding-inline-end: 0px; +} +.\\[\\&\\>span\\]\\:pr-line-clamp-1>span { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.\\[\\&\\>svg\\+div\\]\\:pr-translate-y-\\[-3px\\]>svg+div { + --tw-translate-y: -3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.\\[\\&\\>svg\\]\\:pr-absolute>svg { + position: absolute; +} +.\\[\\&\\>svg\\]\\:pr-left-4>svg { + left: 1rem; +} +.\\[\\&\\>svg\\]\\:pr-top-4>svg { + top: 1rem; +} +.\\[\\&\\>svg\\]\\:pr-text-destructive>svg { + color: hsl(var(--destructive)); +} +.\\[\\&\\>svg\\]\\:pr-text-foreground>svg { + color: hsl(var(--foreground)); +} +.\\[\\&\\>svg\\~\\*\\]\\:pr-pl-7>svg~* { + padding-left: 1.75rem; +} +.\\[\\&\\>tr\\]\\:last\\:pr-border-b-0:last-child>tr { + border-bottom-width: 0px; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-px-2 [cmdk-group-heading] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-py-1\\.5 [cmdk-group-heading] { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-text-xs [cmdk-group-heading] { + font-size: 0.75rem; + line-height: 1rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-font-medium [cmdk-group-heading] { + font-weight: 500; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-text-muted-foreground [cmdk-group-heading] { + color: hsl(var(--muted-foreground)); +} +.\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pr-pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] { + padding-top: 0px; +} +.\\[\\&_\\[cmdk-group\\]\\]\\:pr-px-2 [cmdk-group] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:pr-h-5 [cmdk-input-wrapper] svg { + height: 1.25rem; +} +.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:pr-w-5 [cmdk-input-wrapper] svg { + width: 1.25rem; +} +.\\[\\&_\\[cmdk-input\\]\\]\\:pr-h-12 [cmdk-input] { + height: 3rem; +} +.\\[\\&_\\[cmdk-item\\]\\]\\:pr-px-2 [cmdk-item] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-item\\]\\]\\:pr-py-3 [cmdk-item] { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.\\[\\&_\\[cmdk-item\\]_svg\\]\\:pr-h-5 [cmdk-item] svg { + height: 1.25rem; +} +.\\[\\&_\\[cmdk-item\\]_svg\\]\\:pr-w-5 [cmdk-item] svg { + width: 1.25rem; +} +.\\[\\&_p\\]\\:pr-leading-relaxed p { + line-height: 1.625; +} +.\\[\\&_tr\\:last-child\\]\\:pr-border-0 tr:last-child { + border-width: 0px; +} +.\\[\\&_tr\\]\\:pr-border-b tr { + border-bottom-width: 1px; +} +.papi-icon-button { + border: 0; + border-radius: 3em; + cursor: pointer; + display: inline-block; +} + +.papi-icon-button.primary { + background-color: #1ea7fd; + color: white; +} + +.papi-icon-button.secondary { + background-color: transparent; + color: #333; +} + +.papi-icon-button.paratext { + background-color: darkgreen; + color: greenyellow; +} + +.papi-icon-button.paratext.bright { + background-color: greenyellow; + color: darkgreen; +} +.papi-multi-column-menu { + background-color: rgb(222, 222, 222); + display: flex; + flex-direction: column; + padding-left: 3px; + padding-right: 3px; +} + +.papi-menu-column { + font-size: 11pt; + font-weight: 600; + padding-bottom: 2px; +} + +.papi-menu-column ul { + padding-top: 0; +} + +.papi-menu-column-header { + background-color: rgb(181, 181, 181); + padding-left: 24px; + margin-top: 0; + margin-bottom: 0; +} + +.papi-multi-column-menu.paratext { + background-color: rgb(76, 106, 76); + color: rgb(214, 255, 152); +} + +.papi-multi-column-menu.paratext.bright { + color: rgb(76, 106, 76); + background-color: rgb(214, 255, 152); +} +.banded-row:hover { + cursor: pointer; +} + +.banded-row[data-state="selected"]:hover { + cursor: default; +} +.papi-menu-item { + background-color: transparent; +} + +.papi-menu-icon-trailing { + margin-left: 10px; + place-content: flex-end; +} + +.papi-menu-item img { + max-width: 24px; + max-height: 24px; +} +.papi-menu-drawer-paper { + height: fit-content !important; + position: absolute !important; +} + +.papi-toolbar-children { + padding: 10px; + display: flex; + gap: 8px; +} +`,"top"); +//# sourceMappingURL=index.cjs.map diff --git a/lib/platform-bible-react/dist/index.cjs.map b/lib/platform-bible-react/dist/index.cjs.map new file mode 100644 index 0000000000..e68ad40de8 --- /dev/null +++ b/lib/platform-bible-react/dist/index.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.cjs","sources":["../src/utils/shadcn-ui.util.ts","../src/components/shadcn-ui/input.tsx","../src/components/advanced/book-chapter-control/book-chapter-input.component.tsx","../../../node_modules/@sillsdev/scripture/dist/index.es.js","../src/components/shadcn-ui/dropdown-menu.tsx","../src/components/advanced/book-chapter-control/book-menu-item.component.tsx","../src/components/advanced/book-chapter-control/chapter-select.component.tsx","../src/components/advanced/book-chapter-control/go-to-menu-item.component.tsx","../src/components/advanced/book-chapter-control/book-chapter-control.component.tsx","../src/components/shadcn-ui/button.tsx","../src/components/shadcn-ui/label.tsx","../src/components/shadcn-ui/radio-group.tsx","../src/components/shadcn-ui/popover.tsx","../src/components/shadcn-ui/dialog.tsx","../src/components/shadcn-ui/command.tsx","../src/components/basics/combo-box.component.tsx","../src/components/basics/chapter-range-selector.component.tsx","../src/components/advanced/book-selector.component.tsx","../src/components/advanced/data-table/data-table-column-toggle.component.tsx","../src/components/shadcn-ui/select.tsx","../src/components/advanced/data-table/data-table-pagination.component.tsx","../src/components/shadcn-ui/table.tsx","../src/components/advanced/data-table/data-table.component.tsx","../src/components/advanced/inventory/inventory-utils.ts","../src/components/advanced/inventory/occurrences-table.component.tsx","../src/components/advanced/inventory/inventory.component.tsx","../src/components/shadcn-ui/toggle.tsx","../src/components/shadcn-ui/toggle-group.tsx","../src/components/advanced/inventory/inventory-columns.tsx","../src/components/basics/search-bar.component.tsx","../src/components/basics/tabs-vertical.tsx","../src/components/advanced/navigation-content-search.component.tsx","../src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx","../src/components/advanced/scroll-group-selector.component.tsx","../src/components/shadcn-ui/separator.tsx","../src/components/advanced/settings-components/settings-list.component.tsx","../src/components/shadcn-ui/checkbox.tsx","../src/components/basics/checklist.component.tsx","../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js","../../../node_modules/@mui/utils/chainPropTypes/chainPropTypes.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@mui/utils/deepmerge/deepmerge.js","../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js","../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js","../../../node_modules/prop-types/node_modules/react-is/index.js","../../../node_modules/object-assign/index.js","../../../node_modules/prop-types/lib/ReactPropTypesSecret.js","../../../node_modules/prop-types/lib/has.js","../../../node_modules/prop-types/checkPropTypes.js","../../../node_modules/prop-types/factoryWithTypeCheckers.js","../../../node_modules/prop-types/factoryWithThrowingShims.js","../../../node_modules/prop-types/index.js","../../../node_modules/@mui/utils/elementAcceptingRef/elementAcceptingRef.js","../../../node_modules/@mui/utils/exactProp/exactProp.js","../../../node_modules/@mui/utils/formatMuiErrorMessage/formatMuiErrorMessage.js","../../../node_modules/react-is/cjs/react-is.production.min.js","../../../node_modules/react-is/cjs/react-is.development.js","../../../node_modules/react-is/index.js","../../../node_modules/@mui/utils/getDisplayName/getDisplayName.js","../../../node_modules/@mui/utils/HTMLElementType/HTMLElementType.js","../../../node_modules/@mui/utils/refType/refType.js","../../../node_modules/@mui/utils/capitalize/capitalize.js","../../../node_modules/@mui/utils/createChainedFunction/createChainedFunction.js","../../../node_modules/@mui/utils/debounce/debounce.js","../../../node_modules/@mui/utils/deprecatedPropType/deprecatedPropType.js","../../../node_modules/@mui/utils/isMuiElement/isMuiElement.js","../../../node_modules/@mui/utils/ownerDocument/ownerDocument.js","../../../node_modules/@mui/utils/ownerWindow/ownerWindow.js","../../../node_modules/@mui/utils/requirePropFactory/requirePropFactory.js","../../../node_modules/@mui/utils/setRef/setRef.js","../../../node_modules/@mui/utils/useEnhancedEffect/useEnhancedEffect.js","../../../node_modules/@mui/utils/useId/useId.js","../../../node_modules/@mui/utils/unsupportedProp/unsupportedProp.js","../../../node_modules/@mui/utils/useControlled/useControlled.js","../../../node_modules/@mui/utils/useEventCallback/useEventCallback.js","../../../node_modules/@mui/utils/useForkRef/useForkRef.js","../../../node_modules/@mui/utils/useLazyRef/useLazyRef.js","../../../node_modules/@mui/utils/useOnMount/useOnMount.js","../../../node_modules/@mui/utils/useTimeout/useTimeout.js","../../../node_modules/@mui/utils/useIsFocusVisible/useIsFocusVisible.js","../../../node_modules/@mui/utils/resolveProps/resolveProps.js","../../../node_modules/@mui/utils/composeClasses/composeClasses.js","../../../node_modules/@mui/utils/ClassNameGenerator/ClassNameGenerator.js","../../../node_modules/@mui/utils/generateUtilityClass/generateUtilityClass.js","../../../node_modules/@mui/utils/generateUtilityClasses/generateUtilityClasses.js","../../../node_modules/@mui/utils/clamp/clamp.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/@mui/system/esm/createTheme/createBreakpoints.js","../../../node_modules/@mui/system/esm/createTheme/shape.js","../../../node_modules/@mui/system/esm/responsivePropType.js","../../../node_modules/@mui/system/esm/merge.js","../../../node_modules/@mui/system/esm/breakpoints.js","../../../node_modules/@mui/system/esm/style.js","../../../node_modules/@mui/system/esm/memoize.js","../../../node_modules/@mui/system/esm/spacing.js","../../../node_modules/@mui/system/esm/createTheme/createSpacing.js","../../../node_modules/@mui/system/esm/compose.js","../../../node_modules/@mui/system/esm/borders.js","../../../node_modules/@mui/system/esm/cssGrid.js","../../../node_modules/@mui/system/esm/palette.js","../../../node_modules/@mui/system/esm/sizing.js","../../../node_modules/@mui/system/esm/styleFunctionSx/defaultSxConfig.js","../../../node_modules/@mui/system/esm/styleFunctionSx/styleFunctionSx.js","../../../node_modules/@mui/system/esm/createTheme/applyStyles.js","../../../node_modules/@mui/system/esm/createTheme/createTheme.js","../../../node_modules/@mui/system/esm/useThemeWithoutDefault.js","../../../node_modules/@mui/system/esm/useTheme.js","../../../node_modules/@mui/system/esm/createStyled.js","../../../node_modules/@mui/system/esm/useThemeProps/getThemeProps.js","../../../node_modules/@mui/system/esm/useThemeProps/useThemeProps.js","../../../node_modules/@mui/system/esm/colorManipulator.js","../../../node_modules/@mui/material/styles/createMixins.js","../../../node_modules/@mui/material/colors/common.js","../../../node_modules/@mui/material/colors/grey.js","../../../node_modules/@mui/material/colors/purple.js","../../../node_modules/@mui/material/colors/red.js","../../../node_modules/@mui/material/colors/orange.js","../../../node_modules/@mui/material/colors/blue.js","../../../node_modules/@mui/material/colors/lightBlue.js","../../../node_modules/@mui/material/colors/green.js","../../../node_modules/@mui/material/styles/createPalette.js","../../../node_modules/@mui/material/styles/createTypography.js","../../../node_modules/@mui/material/styles/shadows.js","../../../node_modules/@mui/material/styles/createTransitions.js","../../../node_modules/@mui/material/styles/zIndex.js","../../../node_modules/@mui/material/styles/createTheme.js","../../../node_modules/@mui/material/styles/defaultTheme.js","../../../node_modules/@mui/material/styles/identifier.js","../../../node_modules/@mui/material/styles/useThemeProps.js","../../../node_modules/@mui/material/styles/styled.js","../../../node_modules/@mui/material/SvgIcon/svgIconClasses.js","../../../node_modules/@mui/material/SvgIcon/SvgIcon.js","../../../node_modules/@mui/material/utils/createSvgIcon.js","../../../node_modules/@mui/material/utils/index.js","../../../node_modules/@mui/icons-material/utils/createSvgIcon.js","../../../node_modules/@mui/icons-material/ArrowRight.js","../../../node_modules/@mui/base/utils/isHostComponent.js","../../../node_modules/@mui/base/utils/appendOwnerState.js","../../../node_modules/@mui/base/utils/ClassNameConfigurator.js","../../../node_modules/@mui/base/utils/extractEventHandlers.js","../../../node_modules/@mui/base/utils/resolveComponentProps.js","../../../node_modules/@mui/base/utils/omitEventHandlers.js","../../../node_modules/@mui/base/utils/mergeSlotProps.js","../../../node_modules/@mui/base/utils/useSlotProps.js","../../../node_modules/@mui/base/generateUtilityClass/index.js","../../../node_modules/@mui/base/generateUtilityClasses/index.js","../../../node_modules/@mui/base/Portal/Portal.js","../../../node_modules/@popperjs/core/lib/enums.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../../node_modules/@popperjs/core/lib/utils/math.js","../../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../../node_modules/@popperjs/core/lib/utils/within.js","../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../../node_modules/@popperjs/core/lib/utils/debounce.js","../../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../../node_modules/@popperjs/core/lib/createPopper.js","../../../node_modules/@popperjs/core/lib/popper.js","../../../node_modules/@mui/base/Popper/popperClasses.js","../../../node_modules/@mui/base/Popper/Popper.js","../../../node_modules/@mui/material/styles/useTheme.js","../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../../../node_modules/react-transition-group/esm/config.js","../../../node_modules/react-transition-group/esm/utils/PropTypes.js","../../../node_modules/react-transition-group/esm/TransitionGroupContext.js","../../../node_modules/react-transition-group/esm/utils/reflow.js","../../../node_modules/react-transition-group/esm/Transition.js","../../../node_modules/@mui/material/transitions/utils.js","../../../node_modules/@mui/material/Grow/Grow.js","../../../node_modules/@mui/material/Popper/Popper.js","../../../node_modules/@mui/material/Tooltip/tooltipClasses.js","../../../node_modules/@mui/material/Tooltip/Tooltip.js","../src/components/mui/menu-item.component.tsx","../src/components/mui/grouped-menu-item-list.component.tsx","../src/components/mui/top-level-menu.component.tsx","../src/components/mui/grid-menu.component.tsx","../src/hooks/use-promise.hook.ts","../../../node_modules/@mui/icons-material/esm/Menu.js","../src/components/mui/hamburger-menu-button.component.tsx","../src/components/mui/icon-button.component.tsx","../src/components/basics/spinner.component.tsx","../src/components/basics/text-field.component.tsx","../src/components/mui/toolbar.component.tsx","../src/components/shadcn-ui/alert.tsx","../src/components/shadcn-ui/card.tsx","../src/components/shadcn-ui/sonner.tsx","../src/components/shadcn-ui/slider.tsx","../src/components/shadcn-ui/switch.tsx","../src/components/shadcn-ui/tabs.tsx","../src/components/advanced/extension-marketplace/buttons/install-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/enable-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/disable-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/update-button.component.tsx","../../../node_modules/markdown-to-jsx/dist/index.modern.js","../src/components/advanced/extension-marketplace/markdown-renderer.component.tsx","../src/components/advanced/extension-marketplace/buttons/filter-button.component.tsx","../src/components/advanced/extension-marketplace/filter-dropdown.component.tsx","../src/components/advanced/extension-marketplace/no-extensions-found.component.tsx","../src/components/advanced/extension-marketplace/more-info.component.tsx","../src/components/advanced/extension-marketplace/version-history.component.tsx","../src/components/advanced/extension-marketplace/footer.component.tsx","../src/hooks/use-event.hook.ts","../src/hooks/use-event-async.hook.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMergeCustom = extendTailwindMerge({ prefix: 'pr-' });\n\n// shadcn/ui uses this export in its boilerplate code\n// eslint-disable-next-line import/prefer-default-export\nexport function cn(...inputs: ClassValue[]) {\n return twMergeCustom(clsx(inputs));\n}\n","import React from 'react';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport interface InputProps extends React.InputHTMLAttributes {}\n\nexport const Input = React.forwardRef(\n ({ className, type, ...props }, ref) => {\n return (\n \n );\n },\n);\nInput.displayName = 'Input';\n","import { FocusEventHandler, forwardRef, KeyboardEvent, MouseEventHandler } from 'react';\nimport { History } from 'lucide-react';\nimport { Input as ShadInput } from '@/components/shadcn-ui/input';\n\nexport type BookChapterInputProps = {\n handleSearch: (searchString: string) => void;\n handleKeyDown: (event: KeyboardEvent) => void;\n handleOnClick: MouseEventHandler;\n handleSubmit: () => void;\n onFocus?: FocusEventHandler;\n value: string;\n placeholder: string;\n};\n\n// Shadcn Input sets type to \"button\"- HAVE to prop spread before setting type\nconst BookChapterInput = forwardRef(\n (\n { handleSearch, handleKeyDown, handleOnClick, handleSubmit, ...props }: BookChapterInputProps,\n ref,\n ) => {\n return (\n
\n handleSearch(event.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleSubmit();\n }\n handleKeyDown(e);\n }}\n onClick={handleOnClick}\n ref={ref}\n />\n {\n // eslint-disable-next-line no-console\n console.log('back in history');\n }}\n />\n
\n );\n },\n);\n\nexport default BookChapterInput;\n","var P = Object.defineProperty;\nvar R = (t, e, s) => e in t ? P(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;\nvar n = (t, e, s) => R(t, typeof e != \"symbol\" ? e + \"\" : e, s);\nclass _ {\n constructor() {\n n(this, \"books\");\n n(this, \"firstSelectedBookNum\");\n n(this, \"lastSelectedBookNum\");\n n(this, \"count\");\n n(this, \"selectedBookNumbers\");\n n(this, \"selectedBookIds\");\n }\n}\nconst N = [\n \"GEN\",\n \"EXO\",\n \"LEV\",\n \"NUM\",\n \"DEU\",\n \"JOS\",\n \"JDG\",\n \"RUT\",\n \"1SA\",\n \"2SA\",\n // 10\n \"1KI\",\n \"2KI\",\n \"1CH\",\n \"2CH\",\n \"EZR\",\n \"NEH\",\n \"EST\",\n \"JOB\",\n \"PSA\",\n \"PRO\",\n // 20\n \"ECC\",\n \"SNG\",\n \"ISA\",\n \"JER\",\n \"LAM\",\n \"EZK\",\n \"DAN\",\n \"HOS\",\n \"JOL\",\n \"AMO\",\n // 30\n \"OBA\",\n \"JON\",\n \"MIC\",\n \"NAM\",\n \"HAB\",\n \"ZEP\",\n \"HAG\",\n \"ZEC\",\n \"MAL\",\n \"MAT\",\n // 40\n \"MRK\",\n \"LUK\",\n \"JHN\",\n \"ACT\",\n \"ROM\",\n \"1CO\",\n \"2CO\",\n \"GAL\",\n \"EPH\",\n \"PHP\",\n // 50\n \"COL\",\n \"1TH\",\n \"2TH\",\n \"1TI\",\n \"2TI\",\n \"TIT\",\n \"PHM\",\n \"HEB\",\n \"JAS\",\n \"1PE\",\n // 60\n \"2PE\",\n \"1JN\",\n \"2JN\",\n \"3JN\",\n \"JUD\",\n \"REV\",\n \"TOB\",\n \"JDT\",\n \"ESG\",\n \"WIS\",\n // 70\n \"SIR\",\n \"BAR\",\n \"LJE\",\n \"S3Y\",\n \"SUS\",\n \"BEL\",\n \"1MA\",\n \"2MA\",\n \"3MA\",\n \"4MA\",\n // 80\n \"1ES\",\n \"2ES\",\n \"MAN\",\n \"PS2\",\n \"ODA\",\n \"PSS\",\n \"JSA\",\n // actual variant text for JOS, now in LXA text\n \"JDB\",\n // actual variant text for JDG, now in LXA text\n \"TBS\",\n // actual variant text for TOB, now in LXA text\n \"SST\",\n // actual variant text for SUS, now in LXA text // 90\n \"DNT\",\n // actual variant text for DAN, now in LXA text\n \"BLT\",\n // actual variant text for BEL, now in LXA text\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n // 100\n \"BAK\",\n \"OTH\",\n \"3ES\",\n // Used previously but really should be 2ES\n \"EZA\",\n // Used to be called 4ES, but not actually in any known project\n \"5EZ\",\n // Used to be called 5ES, but not actually in any known project\n \"6EZ\",\n // Used to be called 6ES, but not actually in any known project\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n // 110\n \"NDX\",\n \"DAG\",\n \"PS3\",\n \"2BA\",\n \"LBA\",\n \"JUB\",\n \"ENO\",\n \"1MQ\",\n \"2MQ\",\n \"3MQ\",\n // 120\n \"REP\",\n \"4BA\",\n \"LAO\"\n], B = [\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n \"BAK\",\n \"OTH\",\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n \"NDX\"\n], O = [\n \"Genesis\",\n \"Exodus\",\n \"Leviticus\",\n \"Numbers\",\n \"Deuteronomy\",\n \"Joshua\",\n \"Judges\",\n \"Ruth\",\n \"1 Samuel\",\n \"2 Samuel\",\n \"1 Kings\",\n \"2 Kings\",\n \"1 Chronicles\",\n \"2 Chronicles\",\n \"Ezra\",\n \"Nehemiah\",\n \"Esther (Hebrew)\",\n \"Job\",\n \"Psalms\",\n \"Proverbs\",\n \"Ecclesiastes\",\n \"Song of Songs\",\n \"Isaiah\",\n \"Jeremiah\",\n \"Lamentations\",\n \"Ezekiel\",\n \"Daniel (Hebrew)\",\n \"Hosea\",\n \"Joel\",\n \"Amos\",\n \"Obadiah\",\n \"Jonah\",\n \"Micah\",\n \"Nahum\",\n \"Habakkuk\",\n \"Zephaniah\",\n \"Haggai\",\n \"Zechariah\",\n \"Malachi\",\n \"Matthew\",\n \"Mark\",\n \"Luke\",\n \"John\",\n \"Acts\",\n \"Romans\",\n \"1 Corinthians\",\n \"2 Corinthians\",\n \"Galatians\",\n \"Ephesians\",\n \"Philippians\",\n \"Colossians\",\n \"1 Thessalonians\",\n \"2 Thessalonians\",\n \"1 Timothy\",\n \"2 Timothy\",\n \"Titus\",\n \"Philemon\",\n \"Hebrews\",\n \"James\",\n \"1 Peter\",\n \"2 Peter\",\n \"1 John\",\n \"2 John\",\n \"3 John\",\n \"Jude\",\n \"Revelation\",\n \"Tobit\",\n \"Judith\",\n \"Esther Greek\",\n \"Wisdom of Solomon\",\n \"Sirach (Ecclesiasticus)\",\n \"Baruch\",\n \"Letter of Jeremiah\",\n \"Song of 3 Young Men\",\n \"Susanna\",\n \"Bel and the Dragon\",\n \"1 Maccabees\",\n \"2 Maccabees\",\n \"3 Maccabees\",\n \"4 Maccabees\",\n \"1 Esdras (Greek)\",\n \"2 Esdras (Latin)\",\n \"Prayer of Manasseh\",\n \"Psalm 151\",\n \"Odes\",\n \"Psalms of Solomon\",\n // WARNING, if you change the spelling of the *obsolete* tag be sure to update\n // IsObsolete routine\n \"Joshua A. *obsolete*\",\n \"Judges B. *obsolete*\",\n \"Tobit S. *obsolete*\",\n \"Susanna Th. *obsolete*\",\n \"Daniel Th. *obsolete*\",\n \"Bel Th. *obsolete*\",\n \"Extra A\",\n \"Extra B\",\n \"Extra C\",\n \"Extra D\",\n \"Extra E\",\n \"Extra F\",\n \"Extra G\",\n \"Front Matter\",\n \"Back Matter\",\n \"Other Matter\",\n \"3 Ezra *obsolete*\",\n \"Apocalypse of Ezra\",\n \"5 Ezra (Latin Prologue)\",\n \"6 Ezra (Latin Epilogue)\",\n \"Introduction\",\n \"Concordance \",\n \"Glossary \",\n \"Topical Index\",\n \"Names Index\",\n \"Daniel Greek\",\n \"Psalms 152-155\",\n \"2 Baruch (Apocalypse)\",\n \"Letter of Baruch\",\n \"Jubilees\",\n \"Enoch\",\n \"1 Meqabyan\",\n \"2 Meqabyan\",\n \"3 Meqabyan\",\n \"Reproof (Proverbs 25-31)\",\n \"4 Baruch (Rest of Baruch)\",\n \"Laodiceans\"\n], S = K();\nfunction g(t, e = !0) {\n return e && (t = t.toUpperCase()), t in S ? S[t] : 0;\n}\nfunction k(t) {\n return g(t) > 0;\n}\nfunction x(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return e >= 40 && e <= 66;\n}\nfunction T(t) {\n return (typeof t == \"string\" ? g(t) : t) <= 39;\n}\nfunction X(t) {\n return t <= 66;\n}\nfunction V(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return w(e) && !X(e);\n}\nfunction* L() {\n for (let t = 1; t <= N.length; t++) yield t;\n}\nconst G = 1, A = N.length;\nfunction H() {\n return [\"XXA\", \"XXB\", \"XXC\", \"XXD\", \"XXE\", \"XXF\", \"XXG\"];\n}\nfunction C(t, e = \"***\") {\n const s = t - 1;\n return s < 0 || s >= N.length ? e : N[s];\n}\nfunction I(t) {\n return t <= 0 || t > A ? \"******\" : O[t - 1];\n}\nfunction y(t) {\n return I(g(t));\n}\nfunction w(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && !B.includes(e);\n}\nfunction q(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && B.includes(e);\n}\nfunction U(t) {\n return O[t - 1].includes(\"*obsolete*\");\n}\nfunction K() {\n const t = {};\n for (let e = 0; e < N.length; e++)\n t[N[e]] = e + 1;\n return t;\n}\nconst m = {\n allBookIds: N,\n nonCanonicalIds: B,\n bookIdToNumber: g,\n isBookIdValid: k,\n isBookNT: x,\n isBookOT: T,\n isBookOTNT: X,\n isBookDC: V,\n allBookNumbers: L,\n firstBook: G,\n lastBook: A,\n extraBooks: H,\n bookNumberToId: C,\n bookNumberToEnglishName: I,\n bookIdToEnglishName: y,\n isCanonical: w,\n isExtraMaterial: q,\n isObsolete: U\n};\nvar l = /* @__PURE__ */ ((t) => (t[t.Unknown = 0] = \"Unknown\", t[t.Original = 1] = \"Original\", t[t.Septuagint = 2] = \"Septuagint\", t[t.Vulgate = 3] = \"Vulgate\", t[t.English = 4] = \"English\", t[t.RussianProtestant = 5] = \"RussianProtestant\", t[t.RussianOrthodox = 6] = \"RussianOrthodox\", t))(l || {});\nconst h = class h {\n // private versInfo: Versification;\n constructor(e) {\n n(this, \"name\");\n n(this, \"fullPath\");\n n(this, \"isPresent\");\n n(this, \"hasVerseSegments\");\n n(this, \"isCustomized\");\n n(this, \"baseVersification\");\n n(this, \"scriptureBooks\");\n n(this, \"_type\");\n if (e == null)\n throw new Error(\"Argument undefined\");\n typeof e == \"string\" ? (this.name = e, this._type = l[e]) : (this._type = e, this.name = l[e]);\n }\n get type() {\n return this._type;\n }\n equals(e) {\n return !e.type || !this.type ? !1 : e.type === this.type;\n }\n};\nn(h, \"Original\", new h(l.Original)), n(h, \"Septuagint\", new h(l.Septuagint)), n(h, \"Vulgate\", new h(l.Vulgate)), n(h, \"English\", new h(l.English)), n(h, \"RussianProtestant\", new h(l.RussianProtestant)), n(h, \"RussianOrthodox\", new h(l.RussianOrthodox));\nlet c = h;\nfunction E(t, e) {\n const s = e[0];\n for (let r = 1; r < e.length; r++)\n t = t.split(e[r]).join(s);\n return t.split(s);\n}\nvar D = /* @__PURE__ */ ((t) => (t[t.Valid = 0] = \"Valid\", t[t.UnknownVersification = 1] = \"UnknownVersification\", t[t.OutOfRange = 2] = \"OutOfRange\", t[t.VerseOutOfOrder = 3] = \"VerseOutOfOrder\", t[t.VerseRepeated = 4] = \"VerseRepeated\", t))(D || {});\nconst i = class i {\n constructor(e, s, r, a) {\n /** Not yet implemented. */\n n(this, \"firstChapter\");\n /** Not yet implemented. */\n n(this, \"lastChapter\");\n /** Not yet implemented. */\n n(this, \"lastVerse\");\n /** Not yet implemented. */\n n(this, \"hasSegmentsDefined\");\n /** Not yet implemented. */\n n(this, \"text\");\n /** Not yet implemented. */\n n(this, \"BBBCCCVVVS\");\n /** Not yet implemented. */\n n(this, \"longHashCode\");\n /** The versification of the reference. */\n n(this, \"versification\");\n n(this, \"rtlMark\", \"‏\");\n n(this, \"_bookNum\", 0);\n n(this, \"_chapterNum\", 0);\n n(this, \"_verseNum\", 0);\n n(this, \"_verse\");\n if (r == null && a == null)\n if (e != null && typeof e == \"string\") {\n const o = e, u = s != null && s instanceof c ? s : void 0;\n this.setEmpty(u), this.parse(o);\n } else if (e != null && typeof e == \"number\") {\n const o = s != null && s instanceof c ? s : void 0;\n this.setEmpty(o), this._verseNum = e % i.chapterDigitShifter, this._chapterNum = Math.floor(\n e % i.bookDigitShifter / i.chapterDigitShifter\n ), this._bookNum = Math.floor(e / i.bookDigitShifter);\n } else if (s == null)\n if (e != null && e instanceof i) {\n const o = e;\n this._bookNum = o.bookNum, this._chapterNum = o.chapterNum, this._verseNum = o.verseNum, this._verse = o.verse, this.versification = o.versification;\n } else {\n if (e == null) return;\n const o = e instanceof c ? e : i.defaultVersification;\n this.setEmpty(o);\n }\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else if (e != null && s != null && r != null)\n if (typeof e == \"string\" && typeof s == \"string\" && typeof r == \"string\")\n this.setEmpty(a), this.updateInternal(e, s, r);\n else if (typeof e == \"number\" && typeof s == \"number\" && typeof r == \"number\")\n this._bookNum = e, this._chapterNum = s, this._verseNum = r, this.versification = a ?? i.defaultVersification;\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else\n throw new Error(\"VerseRef constructor not supported.\");\n }\n /**\n * Determines if the verse string is in a valid format (does not consider versification).\n */\n static isVerseParseable(e) {\n return e.length > 0 && \"0123456789\".includes(e[0]) && !e.endsWith(this.verseRangeSeparator) && !e.endsWith(this.verseSequenceIndicator);\n }\n /**\n * Tries to parse the specified string into a verse reference.\n * @param str - The string to attempt to parse.\n * @returns success: `true` if the specified string was successfully parsed, `false` otherwise.\n * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed\n */\n static tryParse(e) {\n let s;\n try {\n return s = new i(e), { success: !0, verseRef: s };\n } catch (r) {\n if (r instanceof v)\n return s = new i(), { success: !1, verseRef: s };\n throw r;\n }\n }\n /**\n * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n * @param bookNum - Book number (this is 1-based, not an index).\n * @param chapterNum - Chapter number.\n * @param verseNum - Verse number.\n * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n */\n static getBBBCCCVVV(e, s, r) {\n return e % i.bcvMaxValue * i.bookDigitShifter + (s >= 0 ? s % i.bcvMaxValue * i.chapterDigitShifter : 0) + (r >= 0 ? r % i.bcvMaxValue : 0);\n }\n /**\n * Deserializes a serialized VerseRef.\n * @param serializedVerseRef - Serialized VerseRef to create from.\n * @returns the deserialized VerseRef.\n */\n static fromJSON(e) {\n const { book: s, chapterNum: r, verseNum: a, verse: o, versificationStr: u } = e, f = o || a.toString();\n let d;\n return u && (d = new c(u)), s ? new i(s, r.toString(), f, d) : new i();\n }\n /**\n * Parses a verse string and gets the leading numeric portion as a number.\n * @param verseStr - verse string to parse\n * @returns true if the entire string could be parsed as a single, simple verse number (1-999);\n * false if the verse string represented a verse bridge, contained segment letters, or was invalid\n */\n static tryGetVerseNum(e) {\n let s;\n if (!e)\n return s = -1, { success: !0, vNum: s };\n s = 0;\n let r;\n for (let a = 0; a < e.length; a++) {\n if (r = e[a], r < \"0\" || r > \"9\")\n return a === 0 && (s = -1), { success: !1, vNum: s };\n if (s = s * 10 + +r - 0, s > i.bcvMaxValue)\n return s = -1, { success: !1, vNum: s };\n }\n return { success: !0, vNum: s };\n }\n /**\n * Checks to see if a VerseRef hasn't been set - all values are the default.\n */\n get isDefault() {\n return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null;\n }\n /**\n * Gets whether the verse contains multiple verses.\n */\n get hasMultiple() {\n return this._verse != null && (this._verse.includes(i.verseRangeSeparator) || this._verse.includes(i.verseSequenceIndicator));\n }\n /**\n * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters,\n * e.g. `'MAT'`.\n */\n get book() {\n return m.bookNumberToId(this.bookNum, \"\");\n }\n set book(e) {\n this.bookNum = m.bookIdToNumber(e);\n }\n /**\n * Gets or sets the chapter of the reference,. e.g. `'3'`.\n */\n get chapter() {\n return this.isDefault || this._chapterNum < 0 ? \"\" : this._chapterNum.toString();\n }\n set chapter(e) {\n const s = +e;\n this._chapterNum = Number.isInteger(s) ? s : -1;\n }\n /**\n * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`,\n * or `'4b-5a, 7'`.\n */\n get verse() {\n return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? \"\" : this._verseNum.toString();\n }\n set verse(e) {\n const { success: s, vNum: r } = i.tryGetVerseNum(e);\n this._verse = s ? void 0 : e.replace(this.rtlMark, \"\"), this._verseNum = r, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = i.tryGetVerseNum(this._verse));\n }\n /**\n * Get or set Book based on book number, e.g. `42`.\n */\n get bookNum() {\n return this._bookNum;\n }\n set bookNum(e) {\n if (e <= 0 || e > m.lastBook)\n throw new v(\n \"BookNum must be greater than zero and less than or equal to last book\"\n );\n this._bookNum = e;\n }\n /**\n * Gets or sets the chapter number, e.g. `3`. `-1` if not valid.\n */\n get chapterNum() {\n return this._chapterNum;\n }\n set chapterNum(e) {\n this.chapterNum = e;\n }\n /**\n * Gets or sets verse start number, e.g. `4`. `-1` if not valid.\n */\n get verseNum() {\n return this._verseNum;\n }\n set verseNum(e) {\n this._verseNum = e;\n }\n /**\n * String representing the versification (should ONLY be used for serialization/deserialization).\n *\n * @remarks This is for backwards compatibility when ScrVers was an enumeration.\n */\n get versificationStr() {\n var e;\n return (e = this.versification) == null ? void 0 : e.name;\n }\n set versificationStr(e) {\n this.versification = this.versification != null ? new c(e) : void 0;\n }\n /**\n * Determines if the reference is valid.\n */\n get valid() {\n return this.validStatus === 0;\n }\n /**\n * Get the valid status for this reference.\n */\n get validStatus() {\n return this.validateVerse(i.verseRangeSeparators, i.verseSequenceIndicators);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits and the verse is 0.\n */\n get BBBCCC() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, 0);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits. If verse is not null\n * (i.e., this reference represents a complex reference with verse\n * segments or bridge) this cannot be used for an exact comparison.\n */\n get BBBCCCVVV() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum);\n }\n /**\n * Gets whether the verse is defined as an excluded verse in the versification.\n * Does not handle verse ranges.\n */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n get isExcluded() {\n return !1;\n }\n /**\n * Parses the reference in the specified string.\n * Optionally versification can follow reference as in GEN 3:11/4\n * Throw an exception if\n * - invalid book name\n * - chapter number is missing or not a number\n * - verse number is missing or does not start with a number\n * - versification is invalid\n * @param verseStr - string to parse e.g. 'MAT 3:11'\n */\n parse(e) {\n if (e = e.replace(this.rtlMark, \"\"), e.includes(\"/\")) {\n const o = e.split(\"/\");\n if (e = o[0], o.length > 1)\n try {\n const u = +o[1].trim();\n this.versification = new c(l[u]);\n } catch {\n throw new v(\"Invalid reference : \" + e);\n }\n }\n const s = e.trim().split(\" \");\n if (s.length !== 2)\n throw new v(\"Invalid reference : \" + e);\n const r = s[1].split(\":\"), a = +r[0];\n if (r.length !== 2 || m.bookIdToNumber(s[0]) === 0 || !Number.isInteger(a) || a < 0 || !i.isVerseParseable(r[1]))\n throw new v(\"Invalid reference : \" + e);\n this.updateInternal(s[0], r[0], r[1]);\n }\n /**\n * Simplifies this verse ref so that it has no bridging of verses or\n * verse segments like `'1a'`.\n */\n simplify() {\n this._verse = void 0;\n }\n /**\n * Makes a clone of the reference.\n *\n * @returns The cloned VerseRef.\n */\n clone() {\n return new i(this);\n }\n toString() {\n const e = this.book;\n return e === \"\" ? \"\" : `${e} ${this.chapter}:${this.verse}`;\n }\n toJSON() {\n let e = this.verse;\n (e === \"\" || e === this.verseNum.toString()) && (e = void 0);\n const s = {\n book: this.book,\n chapterNum: this.chapterNum,\n verseNum: this.verseNum,\n verse: e,\n versificationStr: this.versificationStr\n };\n return e || delete s.verse, s;\n }\n /**\n * Compares this `VerseRef` with supplied one.\n * @param verseRef - object to compare this one to.\n * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise.\n */\n equals(e) {\n return e instanceof i ? e._bookNum === this._bookNum && e._chapterNum === this._chapterNum && e._verseNum === this._verseNum && e.verse === this.verse && (e.versification == null && this.versification == null || e.versification != null && this.versification != null && e.versification.equals(this.versification)) : !1;\n }\n /**\n * Enumerate all individual verses contained in a VerseRef.\n * Verse ranges are indicated by \"-\" and consecutive verses by \",\"s.\n * Examples:\n * GEN 1:2 returns GEN 1:2\n * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5\n * GEN 1:2a-2c returns //! ??????\n *\n * @param specifiedVersesOnly - if set to true return only verses that are\n * explicitly specified only, not verses within a range. Defaults to `false`.\n * @param verseRangeSeparators - Verse range separators.\n * Defaults to `VerseRef.verseRangeSeparators`.\n * @param verseSequenceSeparators - Verse sequence separators.\n * Defaults to `VerseRef.verseSequenceIndicators`.\n * @returns An array of all single verse references in this VerseRef.\n */\n allVerses(e = !1, s = i.verseRangeSeparators, r = i.verseSequenceIndicators) {\n if (this._verse == null || this.chapterNum <= 0)\n return [this.clone()];\n const a = [], o = E(this._verse, r);\n for (const u of o.map((f) => E(f, s))) {\n const f = this.clone();\n f.verse = u[0];\n const d = f.verseNum;\n if (a.push(f), u.length > 1) {\n const b = this.clone();\n if (b.verse = u[1], !e)\n for (let p = d + 1; p < b.verseNum; p++) {\n const J = new i(\n this._bookNum,\n this._chapterNum,\n p,\n this.versification\n );\n this.isExcluded || a.push(J);\n }\n a.push(b);\n }\n }\n return a;\n }\n /**\n * Validates a verse number using the supplied separators rather than the defaults.\n */\n validateVerse(e, s) {\n if (!this.verse)\n return this.internalValid;\n let r = 0;\n for (const a of this.allVerses(!0, e, s)) {\n const o = a.internalValid;\n if (o !== 0)\n return o;\n const u = a.BBBCCCVVV;\n if (r > u)\n return 3;\n if (r === u)\n return 4;\n r = u;\n }\n return 0;\n }\n /**\n * Gets whether a single verse reference is valid.\n */\n get internalValid() {\n return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > m.lastBook ? 2 : (m.isCanonical(this._bookNum), 0);\n }\n setEmpty(e = i.defaultVersification) {\n this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = e;\n }\n updateInternal(e, s, r) {\n this.bookNum = m.bookIdToNumber(e), this.chapter = s, this.verse = r;\n }\n};\nn(i, \"defaultVersification\", c.English), n(i, \"verseRangeSeparator\", \"-\"), n(i, \"verseSequenceIndicator\", \",\"), n(i, \"verseRangeSeparators\", [i.verseRangeSeparator]), n(i, \"verseSequenceIndicators\", [i.verseSequenceIndicator]), n(i, \"chapterDigitShifter\", 1e3), n(i, \"bookDigitShifter\", i.chapterDigitShifter * i.chapterDigitShifter), n(i, \"bcvMaxValue\", i.chapterDigitShifter - 1), /**\n * The valid status of the VerseRef.\n */\nn(i, \"ValidStatusType\", D);\nlet M = i;\nclass v extends Error {\n}\nexport {\n _ as BookSet,\n m as Canon,\n c as ScrVers,\n l as ScrVersType,\n M as VerseRef,\n v as VerseRefException\n};\n//# sourceMappingURL=index.es.js.map\n","import React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\n\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nexport type DropdownMenuSubTriggerProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.SubTrigger\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuSubContentProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.SubContent\n> & {\n className?: string;\n};\n\nexport type DropdownMenuContentProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Content\n> & {\n className?: string;\n sideOffset?: number;\n};\n\nexport type DropdownMenuItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Item\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuCheckboxItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.CheckboxItem\n> & {\n className?: string;\n checked?: boolean;\n};\n\nexport type DropdownMenuRadioItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.RadioItem\n> & {\n className?: string;\n};\n\nexport type DropdownMenuLabelProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Label\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuSeparatorProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Separator\n> & {\n className?: string;\n};\n\nexport type DropdownMenuShortcutProps = React.HTMLAttributes & {\n className?: string;\n};\n\nexport const DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef,\n DropdownMenuSubTriggerProps\n>(({ className, inset, children, ...props }, ref) => (\n \n {children}\n \n \n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nexport const DropdownMenuSubContent = React.forwardRef<\n React.ElementRef,\n DropdownMenuSubContentProps\n>(({ className, ...props }, ref) => (\n \n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nexport const DropdownMenuContent = React.forwardRef<\n React.ElementRef,\n DropdownMenuContentProps\n>(({ className, sideOffset = 4, ...props }, ref) => (\n \n \n \n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\n/**\n * TODO: fix: direction is not automatically handled by this component, so that shortcuts are\n * display always to the right\n */\nexport const DropdownMenuItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuItemProps\n>(({ className, inset, ...props }, ref) => (\n \n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nexport const DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuCheckboxItemProps\n>(({ className, children, checked, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nexport const DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuRadioItemProps\n>(({ className, children, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nexport const DropdownMenuLabel = React.forwardRef<\n React.ElementRef,\n DropdownMenuLabelProps\n>(({ className, inset, ...props }, ref) => (\n \n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nexport const DropdownMenuSeparator = React.forwardRef<\n React.ElementRef,\n DropdownMenuSeparatorProps\n>(({ className, ...props }, ref) => (\n \n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nexport function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps) {\n return (\n \n );\n}\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n","import { Canon } from '@sillsdev/scripture';\nimport { PropsWithChildren, KeyboardEvent, forwardRef } from 'react';\nimport { DropdownMenuItem as ShadDropdownMenuItem } from '@/components/shadcn-ui/dropdown-menu';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport type BookType = 'OT' | 'NT' | 'DC';\n\ntype BookMenuItemProps = PropsWithChildren<{\n /** String id of book */\n bookId: string;\n /** Callback to run when a book menu item is selected */\n handleSelectBook: () => void;\n /** Indicates if this menu item is currently selected */\n isSelected: boolean;\n /** Function that is called upon highlighting a book in the dropdown menu */\n handleHighlightBook: () => void;\n /**\n * Function that is called on pressing a key\n *\n * @param event Event that contains information about the key stroke\n */\n handleKeyDown: (event: KeyboardEvent) => void;\n /**\n * Type of book associated with this menu item, coordinates color labels ? Mock up has the labels\n * coordinated to genre\n */\n bookType: BookType;\n}>;\n\nconst BookMenuItem = forwardRef(\n (\n {\n bookId,\n handleSelectBook,\n isSelected,\n handleHighlightBook,\n handleKeyDown,\n bookType,\n children,\n }: BookMenuItemProps,\n ref,\n ) => {\n return (\n {\n // preventDefault() here prevents the entire dropdown menu from closing when selecting this item\n event.preventDefault();\n handleSelectBook();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n handleKeyDown(event);\n }}\n onFocus={handleHighlightBook}\n onMouseMove={handleHighlightBook}\n >\n \n {Canon.bookIdToEnglishName(bookId)}\n \n {isSelected &&
{children}
}\n \n );\n },\n);\n\nexport default BookMenuItem;\n","import { cn } from '@/utils/shadcn-ui.util';\nimport { useCallback } from 'react';\n\nexport type ChapterSelectProps = {\n /**\n * Callback to run when a chapter div is selected\n *\n * @param chapterNumber Number of the chapter that has been selected\n */\n handleSelectChapter: (chapterNumber: number) => void;\n /** The highest chapter number in the book (of course equal to number of chapters in the book) */\n endChapter: number;\n /** The chapter number that is currently selected */\n activeChapter: number;\n /** The chapter number that is currently highlighted using keyboard or mouse navigation */\n highlightedChapter: number;\n /**\n * Callback to run when a chapter is highlighted by the user\n *\n * @param chapterNumber The chapter that is highlighted\n */\n handleHighlightedChapter: (chapterNumber: number) => void;\n};\n\nfunction ChapterSelect({\n handleSelectChapter,\n endChapter,\n activeChapter,\n highlightedChapter,\n handleHighlightedChapter,\n}: ChapterSelectProps) {\n const chapters = Array.from({ length: endChapter }, (_, i) => i + 1);\n\n const handleMouse = useCallback(\n (chapterNumber: number) => {\n handleHighlightedChapter(chapterNumber);\n },\n [handleHighlightedChapter],\n );\n\n return (\n
\n {chapters.map((chapter) => (\n {\n event.preventDefault();\n event.stopPropagation();\n handleSelectChapter(chapter);\n }}\n role=\"button\"\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n handleSelectChapter(chapter);\n }\n }}\n tabIndex={0}\n onMouseMove={() => handleMouse(chapter)}\n >\n {chapter}\n
\n ))}\n \n );\n}\n\nexport default ChapterSelect;\n","import { DropdownMenuLabel as ShadDropdownMenuLabel } from '@/components/shadcn-ui/dropdown-menu';\nimport { Bookmark, Clock, ArrowDownWideNarrow } from 'lucide-react';\n\nexport type GoToMenuItemProps = {\n handleSort: () => void;\n handleLocationHistory: () => void;\n handleBookmarks: () => void;\n};\n\nfunction GoToMenuItem({ handleSort, handleLocationHistory, handleBookmarks }: GoToMenuItemProps) {\n return (\n \n

Go To

\n
\n \n \n \n
\n
\n );\n}\n\nexport default GoToMenuItem;\n","import BookChapterInput from '@/components/advanced/book-chapter-control/book-chapter-input.component';\nimport BookMenuItem, {\n BookType,\n} from '@/components/advanced/book-chapter-control/book-menu-item.component';\nimport ChapterSelect from '@/components/advanced/book-chapter-control/chapter-select.component';\nimport GoToMenuItem from '@/components/advanced/book-chapter-control/go-to-menu-item.component';\nimport {\n DropdownMenu as ShadDropdownMenu,\n DropdownMenuContent as ShadDropdownMenuContent,\n DropdownMenuLabel as ShadDropdownMenuLabel,\n DropdownMenuSeparator as ShadDropdownMenuSeparator,\n DropdownMenuTrigger as ShadDropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport { Canon } from '@sillsdev/scripture';\nimport { ScriptureReference, getChaptersForBook } from 'platform-bible-utils';\nimport {\n KeyboardEvent as ReactKeyboardEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\ntype BookTypeLabels = {\n [bookType in BookType]: string;\n};\ntype BookChapterControlProps = {\n scrRef: ScriptureReference;\n handleSubmit: (scrRef: ScriptureReference) => void;\n};\n\nconst ALL_BOOK_IDS = Canon.allBookIds;\nconst BOOK_TYPE_LABELS: BookTypeLabels = {\n OT: 'Old Testament',\n NT: 'New Testament',\n DC: 'Deuterocanon',\n};\nconst BOOK_TYPE_ARRAY: BookType[] = ['OT', 'NT', 'DC'];\n// This is the height of three menu items to offset scrolling to the selected menu item\n// If you use menuItemRef.clientHeight- includes height of chapter div which is too big\nconst SCROLL_OFFSET = 32 + 32 + 32;\nconst SEARCH_QUERY_FORMATS = [\n /^(\\w+)$/i, // Matches a single word (book name or id)\n /^(\\w+)(?:\\s(\\d+))$/i, // Matches a word followed by a chapter number\n /^(\\w+)(?:\\s(\\d+):(\\d+))$/i, // Matches a word followed by a chapter and verse number\n];\nconst fetchGroupedBooks = (bookType: BookType) => {\n const groupedBooks = {\n OT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookOT(bookId)),\n NT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookNT(bookId)),\n DC: ALL_BOOK_IDS.filter((bookId) => Canon.isBookDC(bookId)),\n };\n return groupedBooks[bookType];\n};\nconst fetchEndChapter = (bookId: string) => {\n // getChaptersForBook returns -1 if not found in scrBookData\n // scrBookData only includes OT and NT, so all DC will return -1\n return getChaptersForBook(Canon.bookIdToNumber(bookId));\n};\n\n/**\n * Gets all of the English names from book ids\n *\n * @returns String[]\n */\nfunction getAllEnglishNames(): string[] {\n const allEnglishNames = ALL_BOOK_IDS.map((bookId) => {\n return Canon.bookIdToEnglishName(bookId);\n });\n return allEnglishNames;\n}\n\n/**\n * Determines if bookName is in allEnglishNames\n *\n * @param bookName Book English name\n * @returns True if bookName is included, false otherwise\n */\nfunction isValidBookEnglishName(bookName: string): boolean {\n return getAllEnglishNames().includes(bookName);\n}\n\n/**\n * Gets a bookId from given English name\n *\n * @param bookName Book English name\n * @returns BookId of provided bookName, undefined otherwise\n */\nfunction getBookIdFromEnglishName(bookName: string): string | undefined {\n // Convert bookName to lowercase and then capitalize the first letter\n const formattedBookName = bookName.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase());\n\n if (isValidBookEnglishName(formattedBookName)) {\n const matchingBookId = ALL_BOOK_IDS.find((bookId) => {\n return Canon.bookIdToEnglishName(bookId) === formattedBookName;\n });\n return matchingBookId;\n }\n\n return undefined;\n}\n\nfunction BookChapterControl({ scrRef, handleSubmit }: BookChapterControlProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedBookId, setSelectedBookId] = useState(\n Canon.bookNumberToId(scrRef.bookNum),\n );\n const [highlightedChapter, setHighlightedChapter] = useState(scrRef.chapterNum ?? 0);\n const [highlightedBookId, setHighlightedBookId] = useState(\n Canon.bookNumberToId(scrRef.bookNum),\n );\n const [isContentOpen, setIsContentOpen] = useState(false);\n const [isContentOpenDelayed, setIsContentOpenDelayed] = useState(isContentOpen);\n\n // This ref will always be defined\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const inputRef = useRef(undefined!);\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const contentRef = useRef(undefined!);\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const menuItemRef = useRef(undefined!);\n\n const fetchFilteredBooks = useCallback(\n (bookType: BookType) => {\n return fetchGroupedBooks(bookType).filter((bookId: string) => {\n const englishNameLowerCase = Canon.bookIdToEnglishName(bookId).toLowerCase();\n const normalizedQuery = searchQuery.replace(/[^a-zA-Z]/g, '').toLowerCase();\n return (\n englishNameLowerCase.includes(normalizedQuery) || // Match book name\n bookId.toLowerCase().includes(normalizedQuery) // Match book ID\n );\n });\n },\n [searchQuery],\n );\n\n const handleSearchInput = (searchString: string) => {\n setSearchQuery(searchString);\n };\n\n /**\n * Whether to prevent radix's logic from closing the dropdown. This is important because radix\n * tries to close the dropdown when the input first focuses, and we don't want it to do that. But\n * we don't want to prevent the dropdown from closing when we click away from the input, so we\n * don't want to just keep it open if the input is focused\n */\n const shouldPreventAutoClosing = useRef(false);\n\n const controlMenuState = useCallback((open: boolean) => {\n if (shouldPreventAutoClosing.current) {\n shouldPreventAutoClosing.current = false;\n return;\n }\n setIsContentOpen(open);\n }, []);\n\n const updateReference = useCallback(\n (bookId: string, shouldClose: boolean, chapter?: number, verse?: number) => {\n setHighlightedChapter(\n Canon.bookNumberToId(scrRef.bookNum) !== bookId ? 1 : scrRef.chapterNum,\n );\n\n if (shouldClose || fetchEndChapter(bookId) === -1) {\n handleSubmit({\n bookNum: Canon.bookIdToNumber(bookId),\n chapterNum: chapter || 1,\n verseNum: verse || 1,\n });\n\n setIsContentOpen(false);\n setSearchQuery('');\n return;\n }\n\n setSelectedBookId(selectedBookId !== bookId ? bookId : '');\n setIsContentOpen(!shouldClose);\n },\n [handleSubmit, scrRef.bookNum, scrRef.chapterNum, selectedBookId],\n );\n\n const handleSelectChapter = (chapterNumber: number) => {\n if (chapterNumber <= 0 || chapterNumber > fetchEndChapter(selectedBookId)) {\n return;\n }\n updateReference(selectedBookId, true, chapterNumber);\n };\n\n const handleInputSubmit = useCallback(() => {\n SEARCH_QUERY_FORMATS.forEach((format) => {\n const matches = searchQuery.match(format);\n if (matches) {\n // Book should be a bookId or an english name\n const [book, chapter = undefined, verse = undefined] = matches.slice(1);\n const englishName = getBookIdFromEnglishName(book);\n\n if (Canon.isBookIdValid(book) || englishName) {\n updateReference(\n englishName ?? book,\n true,\n chapter ? parseInt(chapter, 10) : 1,\n verse ? parseInt(verse, 10) : 1,\n );\n }\n }\n });\n }, [updateReference, searchQuery]);\n\n const handleKeyDownInput = useCallback(\n (event: ReactKeyboardEvent) => {\n if (!isContentOpen) {\n setIsContentOpen(true);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (\n typeof menuItemRef !== 'undefined' &&\n // Ref uses null\n // eslint-disable-next-line no-null/no-null\n menuItemRef.current !== null\n ) {\n menuItemRef.current.focus();\n } else if (\n typeof contentRef !== 'undefined' &&\n // Ref uses null\n // eslint-disable-next-line no-null/no-null\n contentRef.current !== null\n ) {\n contentRef.current.focus();\n }\n event.preventDefault();\n }\n },\n [isContentOpen],\n );\n\n const handleKeyDownContent = (event: ReactKeyboardEvent) => {\n // When the dropdown menu has focus, key strokes should give focus to the input component,\n // unless they're navigation keys (arrows and enter)\n const { key } = event;\n if (\n key === 'ArrowRight' ||\n key === 'ArrowLeft' ||\n key === 'ArrowDown' ||\n key === 'ArrowUp' ||\n key === 'Enter'\n ) {\n return;\n }\n\n inputRef.current.dispatchEvent(new KeyboardEvent('keydown', { key }));\n inputRef.current.focus();\n };\n\n const handleKeyDownMenuItem = (event: ReactKeyboardEvent) => {\n const { key } = event;\n if (highlightedBookId === selectedBookId) {\n if (key === 'Enter') {\n event.preventDefault();\n updateReference(selectedBookId, true, highlightedChapter);\n return;\n }\n\n let chapterOffSet = 0;\n if (key === 'ArrowRight') {\n if (highlightedChapter < fetchEndChapter(highlightedBookId)) {\n chapterOffSet = 1;\n } else {\n event.preventDefault();\n return;\n }\n } else if (key === 'ArrowLeft') {\n if (highlightedChapter > 1) {\n chapterOffSet = -1;\n } else {\n event.preventDefault();\n return;\n }\n } else if (key === 'ArrowDown') {\n chapterOffSet = 6;\n } else if (key === 'ArrowUp') {\n chapterOffSet = -6;\n }\n if (\n highlightedChapter + chapterOffSet <= 0 ||\n highlightedChapter + chapterOffSet > fetchEndChapter(highlightedBookId)\n ) {\n setHighlightedChapter(0);\n } else if (chapterOffSet !== 0) {\n setHighlightedChapter(highlightedChapter + chapterOffSet);\n event.preventDefault();\n }\n }\n };\n\n useEffect(() => {\n if (selectedBookId === highlightedBookId) {\n if (selectedBookId === Canon.bookNumberToId(scrRef.bookNum)) {\n setHighlightedChapter(scrRef.chapterNum);\n } else {\n setHighlightedChapter(1);\n }\n } else {\n setHighlightedChapter(0);\n }\n }, [highlightedBookId, scrRef.bookNum, scrRef.chapterNum, selectedBookId]);\n\n // The purpose of these useLayoutEffects and timeout is to delay the scroll just\n // enough so that the refs are defined and available when they are used after the timeout\n useLayoutEffect(() => {\n setIsContentOpenDelayed(isContentOpen);\n }, [isContentOpen]);\n\n useLayoutEffect(() => {\n const scrollTimeout = setTimeout(() => {\n if (isContentOpenDelayed && contentRef.current && menuItemRef.current) {\n const menuItemOffsetTop = menuItemRef.current.offsetTop;\n const scrollPosition = menuItemOffsetTop - SCROLL_OFFSET;\n contentRef.current.scrollTo({ top: scrollPosition, behavior: 'instant' });\n }\n }, 10);\n return () => {\n clearTimeout(scrollTimeout);\n };\n }, [isContentOpenDelayed]);\n\n return (\n
\n \n \n {\n setSelectedBookId(Canon.bookNumberToId(scrRef.bookNum));\n setHighlightedBookId(Canon.bookNumberToId(scrRef.bookNum));\n setHighlightedChapter(scrRef.chapterNum > 0 ? scrRef.chapterNum : 0);\n setIsContentOpen(true);\n inputRef.current.focus();\n }}\n onFocus={() => {\n // Radix thinks we want to close because the input is being focused. Prevent that\n shouldPreventAutoClosing.current = true;\n }}\n handleSubmit={handleInputSubmit}\n placeholder={`${Canon.bookNumberToEnglishName(scrRef.bookNum)} ${scrRef.chapterNum}:${scrRef.verseNum}`}\n />\n \n \n console.log('sorting')}\n handleLocationHistory={() => console.log('location history')}\n handleBookmarks={() => console.log('bookmarks')}\n />\n {BOOK_TYPE_ARRAY.map(\n (bookType, bookTypeIndex) =>\n fetchFilteredBooks(bookType).length > 0 && (\n
\n \n {BOOK_TYPE_LABELS[bookType]}\n \n\n {fetchFilteredBooks(bookType).map((bookId) => (\n
\n updateReference(bookId, false)}\n isSelected={selectedBookId === bookId}\n handleHighlightBook={() => setHighlightedBookId(bookId)}\n handleKeyDown={handleKeyDownMenuItem}\n bookType={bookType}\n ref={(element: HTMLDivElement) => {\n if (selectedBookId === bookId) menuItemRef.current = element;\n }}\n >\n {\n setHighlightedChapter(chapterNumber);\n }}\n />\n \n
\n ))}\n {BOOK_TYPE_ARRAY.length - 1 !== bookTypeIndex ? (\n \n ) : undefined}\n
\n ),\n )}\n \n
\n
\n );\n}\n\nexport default BookChapterControl;\n","import React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const buttonVariants = cva(\n 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50',\n {\n variants: {\n variant: {\n default: 'pr-bg-primary pr-text-primary-foreground hover:pr-bg-primary/90',\n destructive: 'pr-bg-destructive pr-text-destructive-foreground hover:pr-bg-destructive/90',\n outline:\n 'pr-border pr-border-input pr-bg-background hover:pr-bg-accent hover:pr-text-accent-foreground',\n secondary: 'pr-bg-secondary pr-text-secondary-foreground hover:pr-bg-secondary/80',\n ghost: 'hover:pr-bg-accent hover:pr-text-accent-foreground',\n link: 'pr-text-primary pr-underline-offset-4 hover:pr-underline',\n },\n size: {\n default: 'pr-h-10 pr-px-4 pr-py-2',\n sm: 'pr-h-9 pr-rounded-md pr-px-3',\n lg: 'pr-h-11 pr-rounded-md pr-px-8',\n icon: 'pr-h-10 pr-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes,\n VariantProps {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n \n );\n },\n);\nButton.displayName = 'Button';\n","import React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst labelVariants = cva(\n 'pr-text-sm pr-font-medium pr-leading-none peer-disabled:pr-cursor-not-allowed peer-disabled:pr-opacity-70',\n);\n\nexport const Label = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & VariantProps\n>(({ className, ...props }, ref) => (\n \n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n","import React from 'react';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport { Circle } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => {\n return (\n \n );\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => {\n return (\n \n \n \n \n \n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n \n \n \n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n \n \n {children}\n \n \n Close\n \n \n \n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import React from 'react';\nimport { type DialogProps } from '@radix-ui/react-dialog';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Search } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Dialog, DialogContent } from '@/components/shadcn-ui/dialog';\n\nconst Command = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nCommand.displayName = CommandPrimitive.displayName;\n\ninterface CommandDialogProps extends DialogProps {}\n\nfunction CommandDialog({ children, ...props }: CommandDialogProps) {\n return (\n \n \n \n {children}\n \n \n \n );\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n
\n \n \n
\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>((props, ref) => (\n \n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nfunction CommandShortcut({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nCommandShortcut.displayName = 'CommandShortcut';\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import { useState } from 'react';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover';\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/shadcn-ui/command';\nimport { PopoverProps } from '@radix-ui/react-popover';\n\nexport type ComboBoxLabelOption = { label: string };\nexport type ComboBoxOption = string | number | ComboBoxLabelOption;\n\nexport type ComboBoxProps = {\n /** Optional unique identifier */\n id?: string;\n /** Text label title for combobox */\n /** List of available options for the dropdown menu */\n options?: readonly T[];\n /** Additional css classes to help with unique styling of the combo box */\n className?: string;\n /**\n * The selected value that the combo box currently holds. Must be shallow equal to one of the\n * options entries.\n */\n value?: T;\n /** Triggers when content of textfield is changed */\n onChange?: (newValue: T) => void;\n /** Used to determine the string value for a given option. */\n getOptionLabel?: (option: ComboBoxOption) => string;\n /** Text displayed on button if `value` is undefined */\n buttonPlaceholder?: string;\n /** Placeholder text for text field */\n textPlaceholder?: string;\n /** Text to display when no options match input */\n commandEmptyMessage?: string;\n /** Variant of button */\n buttonVariant?: ButtonProps['variant'];\n /** Text direction ltr or rtl */\n dir?: Direction;\n /** Optional boolean to set if trigger should be disabled */\n isDisabled?: boolean;\n} & PopoverProps;\n\ntype Direction = 'ltr' | 'rtl';\n\nfunction getOptionLabelDefault(option: ComboBoxOption): string {\n if (typeof option === 'string') {\n return option;\n }\n if (typeof option === 'number') {\n return option.toString();\n }\n return option.label;\n}\n\n/**\n * Autocomplete input and command palette with a list of suggestions.\n *\n * Thanks to Shadcn for heavy inspiration and documentation\n * https://ui.shadcn.com/docs/components/combobox\n */\nfunction ComboBox({\n id,\n options = [],\n className,\n value,\n onChange = () => {},\n getOptionLabel = getOptionLabelDefault,\n buttonPlaceholder = '',\n textPlaceholder = '',\n commandEmptyMessage = 'No option found',\n buttonVariant = 'outline',\n dir = 'ltr',\n isDisabled = false,\n ...props\n}: ComboBoxProps) {\n const [open, setOpen] = useState(false);\n\n return (\n \n \n \n \n {value ? getOptionLabel(value) : buttonPlaceholder}\n \n \n \n \n \n \n \n {commandEmptyMessage}\n \n {options.map((option) => (\n {\n onChange(option);\n setOpen(false);\n }}\n >\n \n {getOptionLabel(option)}\n \n ))}\n \n \n \n \n );\n}\n\nexport default ComboBox;\n","import { useMemo } from 'react';\nimport ComboBox from '@/components/basics/combo-box.component';\nimport { Label } from '@/components/shadcn-ui/label';\n\nexport type ChapterRangeSelectorProps = {\n startChapter: number;\n endChapter: number;\n handleSelectStartChapter: (chapter: number) => void;\n handleSelectEndChapter: (chapter: number) => void;\n isDisabled?: boolean;\n chapterCount: number;\n};\n\nexport default function ChapterRangeSelector({\n startChapter,\n endChapter,\n handleSelectStartChapter,\n handleSelectEndChapter,\n isDisabled = false,\n chapterCount,\n}: ChapterRangeSelectorProps) {\n const chapterOptions = useMemo(\n () => Array.from({ length: chapterCount }, (_, index) => index + 1),\n [chapterCount],\n );\n\n const onChangeStartChapter = (value: number) => {\n handleSelectStartChapter(value);\n if (value > endChapter) {\n handleSelectEndChapter(value);\n }\n };\n\n const onChangeEndChapter = (value: number) => {\n handleSelectEndChapter(value);\n if (value < startChapter) {\n handleSelectStartChapter(value);\n }\n };\n\n return (\n <>\n \n option.toString()}\n value={startChapter}\n />\n\n \n option.toString()}\n value={endChapter}\n />\n \n );\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group';\nimport { Canon } from '@sillsdev/scripture';\nimport { LocalizedStringValue } from 'platform-bible-utils';\nimport { useState } from 'react';\nimport ChapterRangeSelector, {\n ChapterRangeSelectorProps,\n} from '../basics/chapter-range-selector.component';\n\nexport enum BookSelectionMode {\n CURRENT_BOOK = 'current book',\n CHOOSE_BOOKS = 'choose books',\n}\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const BOOK_SELECTOR_STRING_KEYS = Object.freeze([\n '%webView_bookSelector_currentBook%',\n '%webView_bookSelector_choose%',\n '%webView_bookSelector_chooseBooks%',\n] as const);\n\nexport type BookSelectorLocalizedStrings = {\n [localizedInventoryKey in (typeof BOOK_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: BookSelectorLocalizedStrings,\n key: keyof BookSelectorLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\ntype BookSelectorProps = ChapterRangeSelectorProps & {\n handleBookSelectionModeChange: (newMode: BookSelectionMode) => void;\n currentBookName: string;\n onSelectBooks: () => void;\n selectedBookIds: string[];\n localizedStrings: BookSelectorLocalizedStrings;\n};\n\nexport default function BookSelector({\n handleBookSelectionModeChange,\n currentBookName,\n onSelectBooks,\n selectedBookIds,\n chapterCount,\n endChapter,\n handleSelectEndChapter,\n startChapter,\n handleSelectStartChapter,\n localizedStrings,\n}: BookSelectorProps) {\n const currentBookText = localizeString(localizedStrings, '%webView_bookSelector_currentBook%');\n const chooseText = localizeString(localizedStrings, '%webView_bookSelector_choose%');\n const chooseBooksText = localizeString(localizedStrings, '%webView_bookSelector_chooseBooks%');\n\n const [bookSelectionMode, setBookSelectionMode] = useState(\n BookSelectionMode.CURRENT_BOOK,\n );\n\n const onSelectionModeChange = (newMode: BookSelectionMode) => {\n setBookSelectionMode(newMode);\n handleBookSelectionModeChange(newMode);\n };\n\n return (\n onSelectionModeChange(value as BookSelectionMode)}\n >\n
\n
\n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n
\n \n onSelectBooks()}\n >\n {chooseText}\n \n
\n
\n \n );\n}\n","import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu';\nimport { FilterIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/shadcn-ui/dropdown-menu';\n\ninterface DataTableViewOptionsProps {\n table: Table;\n}\n\nfunction DataTableViewOptions({ table }: DataTableViewOptionsProps) {\n return (\n \n \n \n \n \n Toggle columns\n \n {table\n .getAllColumns()\n .filter((column) => column.getCanHide())\n .map((column) => {\n return (\n column.toggleVisibility(!!value)}\n >\n {column.id}\n \n );\n })}\n \n \n );\n}\n\nexport default DataTableViewOptions;\n","import React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n span]:pr-line-clamp-1',\n className,\n )}\n {...props}\n >\n {children}\n \n \n \n \n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, position = 'popper', ...props }, ref) => (\n \n \n \n \n {children}\n \n \n \n \n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n \n \n \n \n \n\n {children}\n \n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","import { ChevronLeftIcon, ChevronRightIcon, ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\n\ninterface DataTablePaginationProps {\n table: Table;\n}\n\nfunction DataTablePagination({ table }: DataTablePaginationProps) {\n return (\n
\n
\n
\n {table.getFilteredSelectedRowModel().rows.length} of{' '}\n {table.getFilteredRowModel().rows.length} row(s) selected\n
\n
\n

Rows per page

\n {\n table.setPageSize(Number(value));\n }}\n >\n \n \n \n \n {[10, 20, 30, 40, 50].map((pageSize) => (\n \n {pageSize}\n \n ))}\n \n \n
\n
\n Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}\n
\n
\n table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n Go to first page\n \n \n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Go to previous page\n \n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Go to next page\n \n \n table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n Go to last page\n \n \n
\n
\n
\n );\n}\n\nexport default DataTablePagination;\n","import React from 'react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes & { stickyHeader?: boolean }\n>(({ className, stickyHeader, ...props }, ref) => (\n
\n \n
\n));\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes & { stickyHeader?: boolean }\n>(({ className, stickyHeader, ...props }, ref) => (\n \n));\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableBody.displayName = 'TableBody';\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n tr]:last:pr-border-b-0', className)}\n {...props}\n />\n));\nTableFooter.displayName = 'TableFooter';\n\nconst TableRow = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nTableRow.displayName = 'TableRow';\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableHead.displayName = 'TableHead';\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableCaption.displayName = 'TableCaption';\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import { useState } from 'react';\n\nimport {\n ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n SortingState,\n ColumnDef as TSColumnDef,\n Row as TSRow,\n SortDirection as TSSortDirection,\n Table as TSTable,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table';\n\nimport DataTableViewOptions from '@/components/advanced/data-table/data-table-column-toggle.component';\nimport DataTablePagination from '@/components/advanced/data-table/data-table-pagination.component';\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\n\nexport type ColumnDef = TSColumnDef;\nexport type RowContents = TSRow;\nexport type TableContents = TSTable;\nexport type SortDirection = TSSortDirection;\n\ninterface DataTableProps {\n columns: ColumnDef[];\n data: TData[];\n enablePagination?: boolean;\n showPaginationControls?: boolean;\n showColumnVisibilityControls?: boolean;\n stickyHeader?: boolean;\n onRowClickHandler?: (row: RowContents, table: TableContents) => void;\n}\n\n/**\n * Feature-rich table component that infuses our basic shadcn-based Table component with features\n * from TanStack's React Table library\n */\nfunction DataTable({\n columns,\n data,\n enablePagination = false,\n showPaginationControls = false,\n showColumnVisibilityControls = false,\n stickyHeader = false,\n onRowClickHandler = () => {},\n}: DataTableProps) {\n const [sorting, setSorting] = useState([]);\n const [columnFilters, setColumnFilters] = useState([]);\n const [columnVisibility, setColumnVisibility] = useState({});\n const [rowSelection, setRowSelection] = useState({});\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n ...(enablePagination && { getPaginationRowModel: getPaginationRowModel() }),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n onColumnFiltersChange: setColumnFilters,\n getFilteredRowModel: getFilteredRowModel(),\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n },\n });\n\n return (\n
\n {showColumnVisibilityControls && }\n \n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers.map((header) => {\n return (\n \n {header.isPlaceholder\n ? undefined\n : flexRender(header.column.columnDef.header, header.getContext())}\n \n );\n })}\n \n ))}\n \n \n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n onRowClickHandler(row, table)}\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n >\n {row.getVisibleCells().map((cell) => (\n \n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n \n ))}\n \n ))\n ) : (\n \n \n No results.\n \n \n )}\n \n
\n {enablePagination && (\n
\n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n \n
\n )}\n {enablePagination && showPaginationControls && }\n
\n );\n}\n\nexport default DataTable;\n","/**\n * Splits USFM string into shorter line-like segments\n *\n * @param text A single (likely very large) USFM string\n * @returns An array containing the input text, split into shorter segments\n */\nexport const getLinesFromUSFM = (text: string) => {\n // Splits on (CR)LF, CR, \\v, \\c and \\id\n return text.split(/(?:\\r?\\n|\\r)|(?=(?:\\\\(?:v|c|id)))/g);\n};\n\n/**\n * Extracts chapter or verse number from USFM strings that start with a chapter or verse marker\n *\n * @param text USFM string\n * @returns Chapter or verse number if one is found. Else returns 0.\n */\nexport const extractNumberFromUSFM = (text: string): number | undefined => {\n // Captures all digits that follow \\v or \\c markers followed by whitespace located at the start of a string\n const regex = /^\\\\[vc]\\s+(\\d+)/;\n const match = text.match(regex);\n if (match) {\n return +match[1];\n }\n return undefined;\n};\n","import {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { Canon } from '@sillsdev/scripture';\nimport { LanguageStrings, ScriptureReference } from 'platform-bible-utils';\nimport { useEffect, useState } from 'react';\nimport { extractNumberFromUSFM, getLinesFromUSFM } from './inventory-utils';\n\ntype SearchResult = {\n reference: ScriptureReference;\n snippet: string;\n key: number;\n};\n\nconst extractOccurrences = (\n text: string | undefined,\n item: string,\n extractItems: (text: string, item?: string | undefined) => string[],\n scriptureRef: ScriptureReference,\n): SearchResult[] => {\n if (!text || text === '' || item === '') return [];\n\n const results: SearchResult[] = [];\n const lines = getLinesFromUSFM(text);\n\n let currentChapter: number | undefined = scriptureRef.chapterNum;\n let currentVerse: number | undefined = scriptureRef.verseNum;\n let key: number = 0;\n\n lines.forEach((line) => {\n if (line.startsWith('\\\\id')) {\n currentChapter = 0;\n currentVerse = 0;\n }\n if (line.startsWith('\\\\c')) {\n currentChapter = extractNumberFromUSFM(line);\n currentVerse = 0;\n }\n if (line.startsWith('\\\\v')) {\n currentVerse = extractNumberFromUSFM(line);\n if (currentChapter === 0) {\n currentChapter = scriptureRef.chapterNum;\n }\n }\n\n const items: string[] = extractItems(line, item);\n\n for (let i = 0; i < items.length; i++) {\n const result: SearchResult = {\n reference: {\n ...scriptureRef,\n chapterNum: currentChapter !== undefined ? +currentChapter : -1,\n verseNum: currentVerse !== undefined ? +currentVerse : -1,\n },\n snippet: line,\n key,\n };\n key += 1;\n results.push(result);\n }\n });\n\n return results;\n};\n\ntype OccurrencesTableProps = {\n selectedItem: string;\n text: string | undefined;\n extractItems: (text: string, item?: string | undefined) => string[];\n scriptureReference: ScriptureReference;\n setScriptureReference: (scriptureReference: ScriptureReference) => void;\n localizedStrings: LanguageStrings;\n};\n\nfunction OccurrencesTable({\n selectedItem,\n text,\n extractItems,\n scriptureReference,\n setScriptureReference,\n localizedStrings,\n}: OccurrencesTableProps) {\n const reference = localizedStrings['%webView_inventory_occurrences_table_header_reference%'];\n const occurrence = localizedStrings['%webView_inventory_occurrences_table_header_occurrence%'];\n const [tableData, setTableData] = useState(\n extractOccurrences(text, selectedItem, extractItems, scriptureReference),\n );\n\n useEffect(\n () => setTableData(extractOccurrences(text, selectedItem, extractItems, scriptureReference)),\n [text, selectedItem, scriptureReference, extractItems],\n );\n\n return (\n \n \n \n {reference}\n {occurrence}\n \n \n \n {tableData.map((result) => (\n {\n setScriptureReference(result.reference);\n }}\n >\n {`${Canon.bookNumberToEnglishName(result.reference.bookNum)} ${result.reference.chapterNum}:${result.reference.verseNum}`}\n {result.snippet}\n \n ))}\n \n
\n );\n}\n\nexport default OccurrencesTable;\n","import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\nimport { LocalizedStringValue, ScriptureReference } from 'platform-bible-utils';\nimport { Input } from '@/components/shadcn-ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport DataTable, {\n ColumnDef,\n RowContents,\n SortDirection,\n TableContents,\n} from '@/components/advanced/data-table/data-table.component';\nimport OccurrencesTable from '@/components/advanced/inventory/occurrences-table.component';\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from 'lucide-react';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const INVENTORY_STRING_KEYS = Object.freeze([\n '%webView_inventory_all%',\n '%webView_inventory_approved%',\n '%webView_inventory_unapproved%',\n '%webView_inventory_unknown%',\n '%webView_inventory_scope_currentBook%',\n '%webView_inventory_scope_chapter%',\n '%webView_inventory_scope_verse%',\n '%webView_inventory_filter_text%',\n '%webView_inventory_occurrences_table_header_reference%',\n '%webView_inventory_occurrences_table_header_occurrence%',\n] as const);\n\nexport type InventoryLocalizedStrings = {\n [localizedInventoryKey in (typeof INVENTORY_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\nexport type Scope = 'book' | 'chapter' | 'verse';\n\nexport type Status = 'approved' | 'unapproved' | 'unknown';\n\nexport type StatusFilter = Status | 'all';\n\nexport type ItemData = {\n item: string;\n count: number;\n status: Status;\n};\n\n/**\n * Gets an icon that indicates the current sorting direction based on the provided input\n *\n * @param sortDirection Sorting direction. Can be ascending ('asc'), descending ('desc') or false (\n * i.e. not sorted)\n * @returns The appropriate sorting icon for the provided sorting direction\n */\nexport const getSortingIcon = (sortDirection: false | SortDirection): ReactNode => {\n if (sortDirection === 'asc') {\n return ;\n }\n if (sortDirection === 'desc') {\n return ;\n }\n return ;\n};\n\n/**\n * Filters data that is shown in the DataTable section of the inventory\n *\n * @param items All items and their related information\n * @param statusFilter Allows filtering by status (i.e. show all items, or only items that are\n * 'approved', 'unapproved' or 'unknown')\n * @param textFilter Allows filtering by text. All items that include the filter text will be\n * selected.\n * @returns Array of items and their related information that are matched by the specified filters\n */\nconst filterItemData = (\n items: ItemData[],\n statusFilter: StatusFilter,\n textFilter: string,\n): ItemData[] => {\n let filteredItemData: ItemData[] = items;\n\n if (statusFilter !== 'all') {\n filteredItemData = filteredItemData.filter(\n (item) =>\n (statusFilter === 'approved' && item.status === 'approved') ||\n (statusFilter === 'unapproved' && item.status === 'unapproved') ||\n (statusFilter === 'unknown' && item.status === 'unknown'),\n );\n }\n\n if (textFilter !== '')\n filteredItemData = filteredItemData.filter((item) => item.item.includes(textFilter));\n\n return filteredItemData;\n};\n\n/**\n * Turns scripture text into array of inventory items, along with their count and status\n *\n * @param text Scripture text from which the inventory items are extracted\n * @param getInventoryItems Function that provides logic for extracting inventory items from text\n * @param getStatusForItem Function that gets status for inventory item from related project\n * settings\n * @returns Array of inventory items, along with their count and status\n */\nconst convertTextToItemData = (\n text: string,\n getInventoryItems: (text: string) => string[],\n getStatusForItem: (item: string) => Status,\n): ItemData[] => {\n const itemData: ItemData[] = [];\n\n const items: string[] = getInventoryItems(text);\n\n for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n const item = items[itemIndex];\n const existingItem = itemData.find((entry) => {\n return entry.item === item;\n });\n if (existingItem) {\n existingItem.count += 1;\n } else {\n const newItem: ItemData = {\n item,\n count: 1,\n status: getStatusForItem(item),\n };\n itemData.push(newItem);\n }\n }\n\n return itemData;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: InventoryLocalizedStrings,\n key: keyof InventoryLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\ntype InventoryProps = {\n scriptureReference: ScriptureReference;\n setScriptureReference: (scriptureReference: ScriptureReference) => void;\n localizedStrings: InventoryLocalizedStrings;\n extractItems: (text: string, item?: string | undefined) => string[];\n approvedItems: string[];\n onApprovedItemsChange: (items: string[]) => void;\n unapprovedItems: string[];\n onUnapprovedItemsChange: (items: string[]) => void;\n text: string | undefined;\n scope: Scope;\n onScopeChange: (scope: Scope) => void;\n getColumns: (\n onStatusChange: (newItems: string[], status: Status) => void,\n ) => ColumnDef[];\n};\n\n/** Inventory component that is used to view and control the status of provided project settings */\nexport default function Inventory({\n scriptureReference,\n setScriptureReference,\n localizedStrings,\n extractItems,\n approvedItems,\n onApprovedItemsChange,\n unapprovedItems,\n onUnapprovedItemsChange,\n text,\n scope,\n onScopeChange,\n getColumns,\n}: InventoryProps) {\n const allItemsText = localizeString(localizedStrings, '%webView_inventory_all%');\n const approvedItemsText = localizeString(localizedStrings, '%webView_inventory_approved%');\n const unapprovedItemsText = localizeString(localizedStrings, '%webView_inventory_unapproved%');\n const unknownItemsText = localizeString(localizedStrings, '%webView_inventory_unknown%');\n const scopeBookText = localizeString(localizedStrings, '%webView_inventory_scope_currentBook%');\n const scopeChapterText = localizeString(localizedStrings, '%webView_inventory_scope_chapter%');\n const scopeVerseText = localizeString(localizedStrings, '%webView_inventory_scope_verse%');\n const filterText = localizeString(localizedStrings, '%webView_inventory_filter_text%');\n\n const [items, setItems] = useState([]);\n const [statusFilter, setStatusFilter] = useState('all');\n const [textFilter, setTextFilter] = useState('');\n const [selectedItem, setSelectedItem] = useState('');\n\n const statusChangeHandler = useCallback(\n (changedItems: string[], status: Status) => {\n setItems((prevTableData) => {\n let tableData: ItemData[] = [];\n changedItems.forEach((item) => {\n tableData = prevTableData.map((tableEntry) => {\n if (tableEntry.item === item && tableEntry.status !== status)\n return { ...tableEntry, status };\n return tableEntry;\n });\n });\n return tableData;\n });\n\n let newApprovedItems: string[] = [...approvedItems];\n changedItems.forEach((item) => {\n if (status === 'approved') {\n if (!newApprovedItems.includes(item)) {\n newApprovedItems.push(item);\n }\n } else {\n newApprovedItems = newApprovedItems.filter((validItem) => validItem !== item);\n }\n });\n onApprovedItemsChange(newApprovedItems);\n\n let newUnapprovedItems: string[] = [...unapprovedItems];\n changedItems.forEach((item) => {\n if (status === 'unapproved') {\n if (!newUnapprovedItems.includes(item)) {\n newUnapprovedItems.push(item);\n }\n } else {\n newUnapprovedItems = newUnapprovedItems.filter(\n (unapprovedItem) => unapprovedItem !== item,\n );\n }\n });\n onUnapprovedItemsChange(newUnapprovedItems);\n },\n [approvedItems, onApprovedItemsChange, unapprovedItems, onUnapprovedItemsChange],\n );\n\n const getStatusForItem = useCallback(\n (item: string): Status => {\n if (approvedItems.includes(item)) return 'approved';\n if (unapprovedItems.includes(item)) return 'unapproved';\n return 'unknown';\n },\n [approvedItems, unapprovedItems],\n );\n\n useEffect(() => {\n if (!text) return;\n setItems(convertTextToItemData(text, extractItems, getStatusForItem));\n }, [extractItems, text, getStatusForItem]);\n\n const filteredItemData = useMemo(() => {\n return filterItemData(items, statusFilter, textFilter);\n }, [items, statusFilter, textFilter]);\n\n useEffect(() => {\n setSelectedItem('');\n }, [filteredItemData]);\n\n const rowClickHandler = (row: RowContents, table: TableContents) => {\n table.toggleAllRowsSelected(false); // this is pretty hacky, and also prevents us from selecting multiple rows\n row.toggleSelected(undefined);\n\n setSelectedItem(row.getValue('item'));\n };\n\n const columns = useMemo(() => getColumns(statusChangeHandler), [getColumns, statusChangeHandler]);\n\n const handleScopeChange = (value: string) => {\n if (value === 'book' || value === 'chapter' || value === 'verse') {\n onScopeChange(value);\n } else {\n throw new Error(`Invalid scope value: ${value}`);\n }\n };\n\n const handleStatusFilterChange = (value: string) => {\n if (value === 'all' || value === 'approved' || value === 'unapproved' || value === 'unknown') {\n setStatusFilter(value);\n } else {\n throw new Error(`Invalid status filter value: ${value}`);\n }\n };\n\n return (\n
\n
\n handleStatusFilterChange(value)}\n defaultValue={statusFilter}\n >\n \n \n \n \n {allItemsText}\n {approvedItemsText}\n {unapprovedItemsText}\n {unknownItemsText}\n \n \n \n {\n setTextFilter(event.target.value);\n }}\n />\n
\n
\n \n
\n {selectedItem !== '' && (\n
\n \n setScriptureReference(newScriptureReference)\n }\n localizedStrings={localizedStrings}\n />\n
\n )}\n
\n );\n}\n","import React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst toggleVariants = cva(\n 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors hover:pr-bg-muted hover:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=on]:pr-bg-accent data-[state=on]:pr-text-accent-foreground',\n {\n variants: {\n variant: {\n default: 'pr-bg-transparent',\n outline:\n 'pr-border pr-border-input pr-bg-transparent hover:pr-bg-accent hover:pr-text-accent-foreground',\n },\n size: {\n default: 'pr-h-10 pr-px-3',\n sm: 'pr-h-9 pr-px-2.5',\n lg: 'pr-h-11 pr-px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & VariantProps\n>(({ className, variant, size, ...props }, ref) => (\n \n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","import React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport { type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { toggleVariants } from '@/components/shadcn-ui/toggle';\n\nconst ToggleGroupContext = React.createContext>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps\n>(({ className, variant, size, children, ...props }, ref) => (\n \n \n {children}\n \n \n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n \n {children}\n \n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","import { Button } from '@/components/shadcn-ui/button';\nimport { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group';\nimport { CircleCheckIcon, CircleHelpIcon, CircleXIcon } from 'lucide-react';\nimport { ColumnDef } from '../data-table/data-table.component';\nimport { getSortingIcon, ItemData, Status } from './inventory.component';\n\n/**\n * Function that creates the item column for inventories\n *\n * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.)\n * @returns Column that shows the inventory items. Should be used with the DataTable component\n */\nexport const inventoryItemColumn = (itemLabel: string): ColumnDef => {\n return {\n accessorKey: 'item',\n header: ({ column }) => (\n \n ),\n };\n};\n\n/**\n * Function that creates the count column for inventories. Should be used with the DataTable\n * component.\n *\n * @param itemLabel Localized label for the count column\n * @returns Column that shows the number of occurrences of the related inventory items\n */\nexport const inventoryCountColumn = (countLabel: string): ColumnDef => {\n return {\n accessorKey: 'count',\n header: ({ column }) => (\n
\n \n
\n ),\n cell: ({ row }) =>
{row.getValue('count')}
,\n };\n};\n\n/**\n * Function that creates the status column for inventories. Should be used with the DataTable\n * component.\n *\n * @param itemLabel Localized label for the status column\n * @param statusChangeHandler Callback function that handles status updates to selected item(s)\n * @returns Column that shows the status of the related inventory items.\n */\nexport const inventoryStatusColumn = (\n statusLabel: string,\n statusChangeHandler: (items: string[], status: Status) => void,\n): ColumnDef => {\n return {\n accessorKey: 'status',\n header: ({ column }) => {\n return (\n
\n \n
\n );\n },\n cell: ({ row }) => {\n const status: Status = row.getValue('status');\n const item: string = row.getValue('item');\n return (\n \n statusChangeHandler([item], 'approved')} value=\"approved\">\n \n \n statusChangeHandler([item], 'unapproved')}\n value=\"unapproved\"\n >\n \n \n statusChangeHandler([item], 'unknown')} value=\"unknown\">\n \n \n \n );\n },\n };\n};\n","import { Input } from '@/components/shadcn-ui/input';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { useState } from 'react';\n\nexport type SearchBarProps = {\n /**\n * Callback fired to handle the search query when button pressed\n *\n * @param searchQuery\n */\n onSearch: (searchQuery: string) => void;\n\n /** Optional string that appears in the search bar without a search string */\n placeholder?: string;\n\n /** Optional boolean to set the input base to full width */\n isFullWidth?: boolean;\n};\n\nexport default function SearchBar({ onSearch, placeholder, isFullWidth }: SearchBarProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleInputChange = (searchString: string) => {\n setSearchQuery(searchString);\n onSearch(searchString);\n };\n\n return (\n handleInputChange(e.target.value)}\n />\n );\n}\n","// adapted from: https://github.com/shadcn-ui/ui/discussions/752\n\n'use client';\n\nimport { TabsContentProps, TabsListProps, TabsTriggerProps } from '@/components/shadcn-ui/tabs';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport React from 'react';\n\nexport type VerticalTabsProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type LeftTabsTriggerProps = TabsTriggerProps & {\n value: string;\n ref?: React.Ref;\n};\n\nexport const VerticalTabs = React.forwardRef<\n React.ElementRef,\n VerticalTabsProps\n>(({ className, ...props }, ref) => (\n \n));\n\nVerticalTabs.displayName = TabsPrimitive.List.displayName;\n\nexport const VerticalTabsList = React.forwardRef<\n React.ElementRef,\n TabsListProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsList.displayName = TabsPrimitive.List.displayName;\n\nexport const VerticalTabsTrigger = React.forwardRef<\n React.ElementRef,\n LeftTabsTriggerProps\n>(({ className, ...props }, ref) => (\n \n));\n\nexport const VerticalTabsContent = React.forwardRef<\n React.ElementRef,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsContent.displayName = TabsPrimitive.Content.displayName;\n","import SearchBar from '@/components/basics/search-bar.component';\nimport {\n VerticalTabs,\n VerticalTabsContent,\n VerticalTabsList,\n VerticalTabsTrigger,\n} from '@/components/basics/tabs-vertical';\nimport { ReactNode } from 'react';\n\nexport type TabKeyValueContent = {\n key: string;\n value: string;\n content: ReactNode;\n};\n\nexport type NavigationContentSearchProps = {\n /** List of values and keys for each tab this component should provide */\n tabList: TabKeyValueContent[];\n\n /** Handler to run when the value of the search bar changes */\n onSearch: (searchQuery: string) => void;\n\n /** Optional placeholder for the search bar */\n searchPlaceholder?: string;\n\n /** Optional title to include in the header */\n headerTitle?: string;\n\n /** Optional flag to make the search bar appear full width */\n isSearchBarFullWidth?: boolean;\n\n /** Text direction ltr or rtl */\n direction?: 'ltr' | 'rtl';\n};\n\nexport default function NavigationContentSearch({\n tabList,\n onSearch,\n searchPlaceholder,\n headerTitle,\n isSearchBarFullWidth = false,\n direction = 'ltr',\n}: NavigationContentSearchProps) {\n return (\n
\n
\n {headerTitle ?

{headerTitle}

: ''}\n \n
\n \n \n {tabList.map((tab) => (\n \n {tab.value}\n \n ))}\n \n {tabList.map((tab) => (\n \n {tab.content}\n \n ))}\n \n
\n );\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Canon } from '@sillsdev/scripture';\nimport {\n Cell,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getExpandedRowModel,\n getGroupedRowModel,\n getSortedRowModel,\n GroupingState,\n Row,\n RowSelectionState,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table';\nimport '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css';\nimport {\n compareScrRefs,\n formatScrRef,\n ScriptureSelection,\n scrRefToBBBCCCVVV,\n} from 'platform-bible-utils';\nimport { MouseEvent, useEffect, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\n\n/**\n * Information (e.g., a checking error or some other type of \"transient\" annotation) about something\n * noteworthy at a specific place in an instance of the Scriptures.\n */\nexport type ScriptureItemDetail = ScriptureSelection & {\n /**\n * Text of the error, note, etc. In the future, we might want to support something more than just\n * text so that a JSX element could be provided with a link or some other controls related to the\n * issue being reported.\n */\n detail: string;\n};\n\n/**\n * A uniquely identifiable source of results that can be displayed in the ScriptureResultsViewer.\n * Generally, the source will be a particular Scripture check, but there may be other types of\n * sources.\n */\nexport type ResultsSource = {\n /**\n * Uniquely identifies the source.\n *\n * @type {string}\n */\n id: string;\n\n /**\n * Name (potentially localized) of the source, suitable for display in the UI.\n *\n * @type {string}\n */\n displayName: string;\n};\n\nexport type ScriptureSrcItemDetail = ScriptureItemDetail & {\n /** Source/type of detail. Can be used for grouping. */\n source: ResultsSource;\n};\n\n/**\n * Represents a set of results keyed by Scripture reference. Generally, the source will be a\n * particular Scripture check, but this type also allows for other types of uniquely identifiable\n * sources.\n */\nexport type ResultsSet = {\n /**\n * The backing source associated with this set of results.\n *\n * @type {ResultsSource}\n */\n source: ResultsSource;\n\n /**\n * Array of Scripture item details (messages keyed by Scripture reference).\n *\n * @type {ScriptureItemDetail[]}\n */\n data: ScriptureItemDetail[];\n};\n\nconst scrBookColId = 'scrBook';\nconst scrRefColId = 'scrRef';\nconst typeColId = 'source';\nconst detailsColId = 'details';\n\nconst defaultScrRefColumnName = 'Scripture Reference';\nconst defaultScrBookGroupName = 'Scripture Book';\nconst defaultTypeColumnName = 'Type';\nconst defaultDetailsColumnName = 'Details';\n\nexport type ScriptureResultsViewerColumnInfo = {\n /** Optional header to display for the Reference column. Default value: 'Scripture Reference'. */\n scriptureReferenceColumnName?: string;\n\n /** Optional text to display to refer to the Scripture book group. Default value: 'Scripture Book'. */\n scriptureBookGroupName?: string;\n\n /** Optional header to display for the Type column. Default value: 'Type'. */\n typeColumnName?: string;\n\n /** Optional header to display for the Details column. Default value: 'Details' */\n detailsColumnName?: string;\n};\n\nexport type ScriptureResultsViewerProps = ScriptureResultsViewerColumnInfo & {\n /** Groups of ScriptureItemDetail objects from particular sources (e.g., Scripture checks) */\n sources: ResultsSet[];\n\n /** Flag indicating whether to display column headers. Default is false. */\n showColumnHeaders?: boolean;\n\n /** Flag indicating whether to display source column. Default is false. */\n showSourceColumn?: boolean;\n\n /** Callback function to notify when a row is selected */\n onRowSelected?: (selectedRow: ScriptureSrcItemDetail | undefined) => void;\n\n /** Text direction ltr or rtl */\n direction?: 'ltr' | 'rtl';\n};\n\nfunction getColumns(\n colInfo?: ScriptureResultsViewerColumnInfo,\n showSourceColumn?: boolean,\n): ColumnDef[] {\n const showSrcCol = showSourceColumn ?? false;\n return [\n {\n accessorFn: (row) =>\n `${Canon.bookNumberToId(row.start.bookNum)} ${row.start.chapterNum}:${row.start.verseNum}`,\n id: scrBookColId,\n header: colInfo?.scriptureReferenceColumnName ?? defaultScrRefColumnName,\n cell: (info) => {\n const row = info.row.original;\n if (info.row.getIsGrouped()) {\n return Canon.bookNumberToEnglishName(row.start.bookNum);\n }\n return info.row.groupingColumnId === scrBookColId ? formatScrRef(row.start) : undefined;\n },\n getGroupingValue: (row) => row.start.bookNum,\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: true,\n },\n {\n accessorFn: (row) => formatScrRef(row.start),\n id: scrRefColId,\n header: undefined,\n cell: (info) => {\n const row = info.row.original;\n return info.row.getIsGrouped() ? undefined : formatScrRef(row.start);\n },\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: false,\n },\n {\n accessorFn: (row) => row.source.displayName,\n id: typeColId,\n header: showSrcCol ? (colInfo?.typeColumnName ?? defaultTypeColumnName) : undefined,\n cell: (info) => (showSrcCol || info.row.getIsGrouped() ? info.getValue() : undefined),\n getGroupingValue: (row) => row.source.id,\n sortingFn: (a, b) =>\n a.original.source.displayName.localeCompare(b.original.source.displayName),\n enableGrouping: true,\n },\n {\n accessorFn: (row) => row.detail,\n id: detailsColId,\n header: colInfo?.detailsColumnName ?? defaultDetailsColumnName,\n cell: (info) => info.getValue(),\n enableGrouping: false,\n },\n ];\n}\n\nconst toRefOrRange = (scriptureSelection: ScriptureSelection) => {\n if (!('offset' in scriptureSelection.start))\n throw new Error('No offset available in range start');\n if (scriptureSelection.end && !('offset' in scriptureSelection.end))\n throw new Error('No offset available in range end');\n const { offset: offsetStart } = scriptureSelection.start;\n let offsetEnd: number = 0;\n if (scriptureSelection.end) ({ offset: offsetEnd } = scriptureSelection.end);\n if (\n !scriptureSelection.end ||\n compareScrRefs(scriptureSelection.start, scriptureSelection.end) === 0\n )\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}`;\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}-${scrRefToBBBCCCVVV(scriptureSelection.end)}+${offsetEnd}`;\n};\n\nconst getRowKey = (row: ScriptureSrcItemDetail) =>\n `${toRefOrRange({ start: row.start, end: row.end })} ${row.source.displayName} ${row.detail}`;\n\n/**\n * Component to display a combined list of detailed items from one or more sources, where the items\n * are keyed primarily by Scripture reference. This is particularly useful for displaying a list of\n * results from Scripture checks, but more generally could be used to display any \"results\" from any\n * source(s). The component allows for grouping by Scripture book, source, or both. By default, it\n * displays somewhat \"tree-like\" which allows it to be more horizontally compact and intuitive. But\n * it also has the option of displaying as a traditional table with column headings (with or without\n * the source column showing).\n */\nexport default function ScriptureResultsViewer({\n sources,\n showColumnHeaders = false,\n showSourceColumn = false,\n scriptureReferenceColumnName,\n scriptureBookGroupName,\n typeColumnName,\n detailsColumnName,\n onRowSelected,\n direction = 'ltr',\n}: ScriptureResultsViewerProps) {\n const [grouping, setGrouping] = useState([]);\n const [sorting, setSorting] = useState([{ id: scrBookColId, desc: false }]);\n const [rowSelection, setRowSelection] = useState({});\n\n const scriptureResults = useMemo(\n () =>\n sources.flatMap((source) => {\n return source.data.map((item) => ({\n ...item,\n source: source.source,\n }));\n }),\n [sources],\n );\n\n const columns = useMemo(\n () =>\n getColumns(\n {\n scriptureReferenceColumnName,\n typeColumnName,\n detailsColumnName,\n },\n showSourceColumn,\n ),\n [scriptureReferenceColumnName, typeColumnName, detailsColumnName, showSourceColumn],\n );\n\n useEffect(() => {\n // Ensure sorting is applied correctly when grouped by type\n if (grouping.includes(typeColId)) {\n setSorting([\n { id: typeColId, desc: false },\n { id: scrBookColId, desc: false },\n ]);\n } else {\n setSorting([{ id: scrBookColId, desc: false }]);\n }\n }, [grouping]);\n\n const table = useReactTable({\n data: scriptureResults,\n columns,\n state: {\n grouping,\n sorting,\n rowSelection,\n },\n onGroupingChange: setGrouping,\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n getExpandedRowModel: getExpandedRowModel(),\n getGroupedRowModel: getGroupedRowModel(),\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: getRowKey,\n autoResetExpanded: false,\n enableMultiRowSelection: false,\n enableSubRowSelection: false,\n });\n\n useEffect(() => {\n if (onRowSelected) {\n const selectedRows = table.getSelectedRowModel().rowsById;\n const keys = Object.keys(selectedRows);\n if (keys.length === 1) {\n const selectedRow = scriptureResults.find((row) => getRowKey(row) === keys[0]) || undefined;\n if (selectedRow) onRowSelected(selectedRow);\n }\n }\n }, [rowSelection, scriptureResults, onRowSelected, table]);\n\n // Define possible grouping options\n const scrBookGroupName = scriptureBookGroupName ?? defaultScrBookGroupName;\n const typeGroupName = typeColumnName ?? defaultTypeColumnName;\n\n const groupingOptions = [\n { label: 'No Grouping', value: [] },\n { label: `Group by ${scrBookGroupName}`, value: [scrBookColId] },\n { label: `Group by ${typeGroupName}`, value: [typeColId] },\n {\n label: `Group by ${scrBookGroupName} and ${typeGroupName}`,\n value: [scrBookColId, typeColId],\n },\n {\n label: `Group by ${typeGroupName} and ${scrBookGroupName}`,\n value: [typeColId, scrBookColId],\n },\n ];\n\n const handleSelectChange = (selectedGrouping: string) => {\n setGrouping(JSON.parse(selectedGrouping));\n };\n\n const handleRowClick = (row: Row, event: MouseEvent) => {\n if (!row.getIsGrouped() && !row.getIsSelected()) {\n row.getToggleSelectedHandler()(event);\n }\n };\n\n const getEvenOrOddBandingStyle = (row: Row, index: number) => {\n if (row.getIsGrouped()) return '';\n // UX has now said they don't think they want banding. I'm leaving in the code to\n // set even and odd styles, but there's nothing in the CSS to style them differently.\n // The \"even\" style used to also have pr-bg-neutral-300 (along with even) to create\n // a visual banding effect. That could be added back in if UX changes the decision.\n return cn('banded-row', index % 2 === 0 ? 'even' : 'odd');\n };\n\n const getIndent = (\n groupingState: GroupingState,\n row: Row,\n cell: Cell,\n ) => {\n if (groupingState?.length === 0 || row.depth < cell.column.getGroupedIndex()) return undefined;\n if (row.getIsGrouped()) {\n switch (row.depth) {\n case 1:\n return 'pr-ps-4';\n default:\n return undefined;\n }\n }\n switch (row.depth) {\n case 1:\n return 'pr-ps-8';\n case 2:\n return 'pr-ps-12';\n default:\n return undefined;\n }\n };\n\n return (\n
\n {!showColumnHeaders && (\n {\n handleSelectChange(value);\n }}\n >\n \n \n \n \n \n {groupingOptions.map((option) => (\n \n {option.label}\n \n ))}\n \n \n \n )}\n \n {showColumnHeaders && (\n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers\n .filter((h) => h.column.columnDef.header)\n .map((header) => (\n /* For sticky column headers to work, we probably need to change the default definition of the shadcn Table component. See https://github.com/shadcn-ui/ui/issues/1151 */\n \n {header.isPlaceholder ? undefined : (\n
\n {header.column.getCanGroup() ? (\n \n {header.column.getIsGrouped() ? `🛑` : `👊 `}\n \n ) : undefined}{' '}\n {flexRender(header.column.columnDef.header, header.getContext())}\n
\n )}\n
\n ))}\n
\n ))}\n
\n )}\n \n {table.getRowModel().rows.map((row, rowIndex) => {\n return (\n handleRowClick(row, event)}\n >\n {row.getVisibleCells().map((cell) => {\n if (\n cell.getIsPlaceholder() ||\n (cell.column.columnDef.enableGrouping &&\n !cell.getIsGrouped() &&\n (cell.column.columnDef.id !== typeColId || !showSourceColumn))\n )\n return undefined;\n return (\n \n {(() => {\n if (cell.getIsGrouped()) {\n return (\n \n {row.getIsExpanded() && }\n {!row.getIsExpanded() &&\n (direction === 'ltr' ? : )}{' '}\n {flexRender(cell.column.columnDef.cell, cell.getContext())} (\n {row.subRows.length})\n \n );\n }\n\n // if (cell.getIsAggregated()) {\n // flexRender(\n // cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,\n // cell.getContext(),\n // );\n // }\n\n return flexRender(cell.column.columnDef.cell, cell.getContext());\n })()}\n \n );\n })}\n \n );\n })}\n \n
\n
\n );\n}\n","import {\n getLocalizeKeyForScrollGroupId,\n LanguageStrings,\n ScrollGroupId,\n} from 'platform-bible-utils';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\n\nconst DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS = {\n [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø',\n [getLocalizeKeyForScrollGroupId(0)]: 'A',\n [getLocalizeKeyForScrollGroupId(1)]: 'B',\n [getLocalizeKeyForScrollGroupId(2)]: 'C',\n [getLocalizeKeyForScrollGroupId(3)]: 'D',\n [getLocalizeKeyForScrollGroupId(4)]: 'E',\n [getLocalizeKeyForScrollGroupId(5)]: 'F',\n [getLocalizeKeyForScrollGroupId(6)]: 'G',\n [getLocalizeKeyForScrollGroupId(7)]: 'H',\n [getLocalizeKeyForScrollGroupId(8)]: 'I',\n [getLocalizeKeyForScrollGroupId(9)]: 'J',\n [getLocalizeKeyForScrollGroupId(10)]: 'K',\n [getLocalizeKeyForScrollGroupId(11)]: 'L',\n [getLocalizeKeyForScrollGroupId(12)]: 'M',\n [getLocalizeKeyForScrollGroupId(13)]: 'N',\n [getLocalizeKeyForScrollGroupId(14)]: 'O',\n [getLocalizeKeyForScrollGroupId(15)]: 'P',\n [getLocalizeKeyForScrollGroupId(16)]: 'Q',\n [getLocalizeKeyForScrollGroupId(17)]: 'R',\n [getLocalizeKeyForScrollGroupId(18)]: 'S',\n [getLocalizeKeyForScrollGroupId(19)]: 'T',\n [getLocalizeKeyForScrollGroupId(20)]: 'U',\n [getLocalizeKeyForScrollGroupId(21)]: 'V',\n [getLocalizeKeyForScrollGroupId(22)]: 'W',\n [getLocalizeKeyForScrollGroupId(23)]: 'X',\n [getLocalizeKeyForScrollGroupId(24)]: 'Y',\n [getLocalizeKeyForScrollGroupId(25)]: 'Z',\n};\n\nexport type ScrollGroupSelectorProps = {\n /**\n * List of scroll group ids to show to the user. Either a {@link ScrollGroupId} or `undefined` for\n * no scroll group\n */\n availableScrollGroupIds: (ScrollGroupId | undefined)[];\n /** Currently selected scroll group id. `undefined` for no scroll group */\n scrollGroupId: ScrollGroupId | undefined;\n /** Callback function run when the user tries to change the scroll group id */\n onChangeScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void;\n /**\n * Localized strings to use for displaying scroll group ids. Must be an object whose keys are\n * `getLocalizeKeyForScrollGroupId(scrollGroupId)` for all scroll group ids (and `undefined` if\n * included) in {@link ScrollGroupSelectorProps.availableScrollGroupIds} and whose values are the\n * localized strings to use for those scroll group ids.\n *\n * Defaults to English localizations of English alphabet for scroll groups 0-25 (e.g. 0 is A) and\n * Ø for `undefined`. Will fill in any that are not provided with these English localizations.\n * Also, if any values match the keys, the English localization will be used. This is useful in\n * case you want to pass in a temporary version of the localized strings while your localized\n * strings load.\n *\n * @example\n *\n * ```typescript\n * const myScrollGroupIdLocalizedStrings = {\n * [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø',\n * [getLocalizeKeyForScrollGroupId(0)]: 'A',\n * [getLocalizeKeyForScrollGroupId(1)]: 'B',\n * [getLocalizeKeyForScrollGroupId(2)]: 'C',\n * [getLocalizeKeyForScrollGroupId(3)]: 'D',\n * [getLocalizeKeyForScrollGroupId(4)]: 'E',\n * };\n * ```\n *\n * @example\n *\n * ```tsx\n * const availableScrollGroupIds = [undefined, 0, 1, 2, 3, 4];\n *\n * const localizeKeys = getLocalizeKeysForScrollGroupIds();\n *\n * const [localizedStrings] = useLocalizedStrings(localizeKeys);\n *\n * ...\n *\n * \n * ```\n */\n localizedStrings?: LanguageStrings;\n};\n\n/** Selector component for choosing a scroll group */\nexport default function ScrollGroupSelector({\n availableScrollGroupIds,\n scrollGroupId,\n onChangeScrollGroupId,\n localizedStrings = {},\n}: ScrollGroupSelectorProps) {\n const localizedStringsDefaulted = {\n ...DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS,\n ...Object.fromEntries(\n Object.entries(localizedStrings).map(\n ([localizedStringKey, localizedStringValue]: [string, string]) => [\n localizedStringKey,\n localizedStringKey === localizedStringValue &&\n localizedStringKey in DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS\n ? DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS[localizedStringKey]\n : localizedStringValue,\n ],\n ),\n ),\n };\n return (\n \n onChangeScrollGroupId(\n newScrollGroupString === 'undefined' ? undefined : parseInt(newScrollGroupString, 10),\n )\n }\n >\n \n \n \n \n {availableScrollGroupIds.map((scrollGroupOptionId) => (\n \n {localizedStringsDefaulted[getLocalizeKeyForScrollGroupId(scrollGroupOptionId)]}\n \n ))}\n \n \n );\n}\n","import React from 'react';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Separator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n \n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import { PropsWithChildren } from 'react';\nimport { Separator } from '@/components/shadcn-ui/separator';\n\n/** Props for the SettingsList component, currently just children */\ntype SettingsListProps = PropsWithChildren;\n\n/**\n * SettingsList component is a wrapper for list items. Rendered with a formatted div\n *\n * @param children To populate the list with\n * @returns Formatted div encompassing the children\n */\nexport function SettingsList({ children }: SettingsListProps) {\n return
{children}
;\n}\n\n/** Props for SettingsListItem component */\ntype SettingsListItemProps = PropsWithChildren & {\n /** Primary text of the list item */\n primary: string;\n\n /** Optional text of the list item */\n secondary?: string | undefined;\n\n /** Optional boolean to display a message if the children aren't loaded yet. Defaults to false */\n isLoading?: boolean;\n\n /** Optional message to display if isLoading */\n loadingMessage?: string;\n};\n\n/**\n * SettingsListItem component is a common list item. Rendered with a formatted div\n *\n * @param primary Primary text of the list item\n * @param secondary Optional secondary text of the list item\n * @param isLoading Optional, to display a message if the action component isn't generated yet,\n * defaults to false\n * @param children The action component(s) to provide for this item\n * @param loadingMessage Optional, message to display if isLoading\n * @returns Formatted div encompassing the list item content\n */\nexport function SettingsListItem({\n primary,\n secondary,\n children,\n isLoading = false,\n loadingMessage,\n}: SettingsListItemProps) {\n return (\n
\n
\n

{primary}

\n

\n {secondary}\n

\n
\n\n {isLoading ? (\n

{loadingMessage}

\n ) : (\n
{children}
\n )}\n
\n );\n}\n\n/** Props for SettingsListHeader component */\ntype SettingsListHeaderProps = {\n /** The primary text of the list header */\n primary: string;\n\n /** Optional secondary text of the list header */\n secondary?: string | undefined;\n\n /** Optional boolean to include a separator underneath the secondary text. Defaults to false */\n includeSeparator?: boolean;\n};\n\n/**\n * SettingsListHeader component displays text above the list\n *\n * @param primary The primary text of the list header\n * @param secondary Optional secondary text of the list header\n * @param includeSeparator Optional boolean to include a separator underneath the secondary text.\n * Defaults to false\n * @returns Formatted div with list header content\n */\nexport function SettingsListHeader({\n primary,\n secondary,\n includeSeparator = false,\n}: SettingsListHeaderProps) {\n return (\n
\n
\n

{primary}

\n

{secondary}

\n
\n {includeSeparator ? : ''}\n
\n );\n}\n","import React from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Checkbox = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n \n \n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport default Checkbox;\n","import Checkbox from '@/components/shadcn-ui/checkbox';\nimport { Label } from '@/components/shadcn-ui/label';\n\nexport type ChecklistProps = {\n /** Optional string representing the id attribute of the Checklist */\n id?: string;\n /** Optional string representing CSS class name(s) for styling */\n className?: string;\n /** Array of strings representing the checkable items */\n listItems: string[];\n /** Array of strings representing the checked items */\n selectedListItems: string[];\n /**\n * Function that is called when a checkbox item is selected or deselected\n *\n * @param item The string description for this item\n * @param selected True if selected, false if not selected\n */\n handleSelectListItem: (item: string, selected: boolean) => void;\n\n /**\n * Optional function creates a label for a provided checkable item\n *\n * @param item The item for which a label is to be created\n * @returns A string representing the label text for the checkbox associated with that item\n */\n createLabel?: (item: string) => string;\n};\n\n/** Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array. */\nexport default function Checklist({\n id,\n className,\n listItems,\n selectedListItems,\n handleSelectListItem,\n createLabel,\n}: ChecklistProps) {\n return (\n
\n {listItems.map((item) => (\n
\n handleSelectListItem(item, value)}\n />\n \n
\n ))}\n
\n );\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function chainPropTypes(propType1, propType2) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n return function validate(...args) {\n return propType1(...args) || propType2(...args);\n };\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\nexport function isPlainObject(item) {\n if (typeof item !== 'object' || item === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(item);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in item) && !(Symbol.iterator in item);\n}\nfunction deepClone(source) {\n if (!isPlainObject(source)) {\n return source;\n }\n const output = {};\n Object.keys(source).forEach(key => {\n output[key] = deepClone(source[key]);\n });\n return output;\n}\nexport default function deepmerge(target, source, options = {\n clone: true\n}) {\n const output = options.clone ? _extends({}, target) : target;\n if (isPlainObject(target) && isPlainObject(source)) {\n Object.keys(source).forEach(key => {\n // Avoid prototype pollution\n if (key === '__proto__') {\n return;\n }\n if (isPlainObject(source[key]) && key in target && isPlainObject(target[key])) {\n // Since `output` is a clone of `target` and we have narrowed `target` in this block we can cast to the same type.\n output[key] = deepmerge(target[key], source[key], options);\n } else if (options.clone) {\n output[key] = isPlainObject(source[key]) ? deepClone(source[key]) : source[key];\n } else {\n output[key] = source[key];\n }\n });\n }\n return output;\n}","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import PropTypes from 'prop-types';\nimport chainPropTypes from '../chainPropTypes';\nfunction isClassComponent(elementType) {\n // elementType.prototype?.isReactComponent\n const {\n prototype = {}\n } = elementType;\n return Boolean(prototype.isReactComponent);\n}\nfunction acceptingRef(props, propName, componentName, location, propFullName) {\n const element = props[propName];\n const safePropName = propFullName || propName;\n if (element == null ||\n // When server-side rendering React doesn't warn either.\n // This is not an accurate check for SSR.\n // This is only in place for Emotion compat.\n // TODO: Revisit once https://github.com/facebook/react/issues/20047 is resolved.\n typeof window === 'undefined') {\n return null;\n }\n let warningHint;\n const elementType = element.type;\n /**\n * Blacklisting instead of whitelisting\n *\n * Blacklisting will miss some components, such as React.Fragment. Those will at least\n * trigger a warning in React.\n * We can't whitelist because there is no safe way to detect React.forwardRef\n * or class components. \"Safe\" means there's no public API.\n *\n */\n if (typeof elementType === 'function' && !isClassComponent(elementType)) {\n warningHint = 'Did you accidentally use a plain function component for an element instead?';\n }\n if (warningHint !== undefined) {\n return new Error(`Invalid ${location} \\`${safePropName}\\` supplied to \\`${componentName}\\`. ` + `Expected an element that can hold a ref. ${warningHint} ` + 'For more information see https://mui.com/r/caveat-with-refs-guide');\n }\n return null;\n}\nconst elementAcceptingRef = chainPropTypes(PropTypes.element, acceptingRef);\nelementAcceptingRef.isRequired = chainPropTypes(PropTypes.element.isRequired, acceptingRef);\nexport default elementAcceptingRef;","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n\nconst specialProperty = 'exact-prop: \\u200b';\nexport default function exactProp(propTypes) {\n if (process.env.NODE_ENV === 'production') {\n return propTypes;\n }\n return _extends({}, propTypes, {\n [specialProperty]: props => {\n const unsupportedProps = Object.keys(props).filter(prop => !propTypes.hasOwnProperty(prop));\n if (unsupportedProps.length > 0) {\n return new Error(`The following props are not supported: ${unsupportedProps.map(prop => `\\`${prop}\\``).join(', ')}. Please remove them.`);\n }\n return null;\n }\n });\n}","/**\n * WARNING: Don't import this directly.\n * Use `MuiError` from `@mui/internal-babel-macros/MuiError.macro` instead.\n * @param {number} code\n */\nexport default function formatMuiErrorMessage(code) {\n // Apply babel-plugin-transform-template-literals in loose mode\n // loose mode is safe if we're concatenating primitives\n // see https://babeljs.io/docs/en/babel-plugin-transform-template-literals#loose\n /* eslint-disable prefer-template */\n let url = 'https://mui.com/production-error/?code=' + code;\n for (let i = 1; i < arguments.length; i += 1) {\n // rest params over-transpile for this case\n // eslint-disable-next-line prefer-rest-params\n url += '&args[]=' + encodeURIComponent(arguments[i]);\n }\n return 'Minified MUI error #' + code + '; visit ' + url + ' for the full message.';\n /* eslint-enable prefer-template */\n}","/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=Symbol.for(\"react.element\"),c=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),e=Symbol.for(\"react.strict_mode\"),f=Symbol.for(\"react.profiler\"),g=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),k=Symbol.for(\"react.server_context\"),l=Symbol.for(\"react.forward_ref\"),m=Symbol.for(\"react.suspense\"),n=Symbol.for(\"react.suspense_list\"),p=Symbol.for(\"react.memo\"),q=Symbol.for(\"react.lazy\"),t=Symbol.for(\"react.offscreen\"),u;u=Symbol.for(\"react.module.reference\");\nfunction v(a){if(\"object\"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m;\nexports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p};\nexports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||\"object\"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v;\n","/**\n * @license React\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n case REACT_SUSPENSE_LIST_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_SERVER_CONTEXT_TYPE:\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n}\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar SuspenseList = REACT_SUSPENSE_LIST_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false;\nvar hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isConcurrentMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsConcurrentMode) {\n hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\nfunction isSuspenseList(object) {\n return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;\n}\n\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.SuspenseList = SuspenseList;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isSuspenseList = isSuspenseList;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","import { ForwardRef, Memo } from 'react-is';\n\n// Simplified polyfill for IE11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\nconst fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\nexport function getFunctionName(fn) {\n const match = `${fn}`.match(fnNameMatchRegex);\n const name = match && match[1];\n return name || '';\n}\nfunction getFunctionComponentName(Component, fallback = '') {\n return Component.displayName || Component.name || getFunctionName(Component) || fallback;\n}\nfunction getWrappedName(outerType, innerType, wrapperName) {\n const functionName = getFunctionComponentName(innerType);\n return outerType.displayName || (functionName !== '' ? `${wrapperName}(${functionName})` : wrapperName);\n}\n\n/**\n * cherry-pick from\n * https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js\n * originally forked from recompose/getDisplayName with added IE11 support\n */\nexport default function getDisplayName(Component) {\n if (Component == null) {\n return undefined;\n }\n if (typeof Component === 'string') {\n return Component;\n }\n if (typeof Component === 'function') {\n return getFunctionComponentName(Component, 'Component');\n }\n\n // TypeScript can't have components as objects but they exist in the form of `memo` or `Suspense`\n if (typeof Component === 'object') {\n switch (Component.$$typeof) {\n case ForwardRef:\n return getWrappedName(Component, Component.render, 'ForwardRef');\n case Memo:\n return getWrappedName(Component, Component.type, 'memo');\n default:\n return undefined;\n }\n }\n return undefined;\n}","export default function HTMLElementType(props, propName, componentName, location, propFullName) {\n if (process.env.NODE_ENV === 'production') {\n return null;\n }\n const propValue = props[propName];\n const safePropName = propFullName || propName;\n if (propValue == null) {\n return null;\n }\n if (propValue && propValue.nodeType !== 1) {\n return new Error(`Invalid ${location} \\`${safePropName}\\` supplied to \\`${componentName}\\`. ` + `Expected an HTMLElement.`);\n }\n return null;\n}","import PropTypes from 'prop-types';\nconst refType = PropTypes.oneOfType([PropTypes.func, PropTypes.object]);\nexport default refType;","import _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word in the sentence.\n// We only handle the first word.\nexport default function capitalize(string) {\n if (typeof string !== 'string') {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: \\`capitalize(string)\\` expects a string argument.` : _formatMuiErrorMessage(7));\n }\n return string.charAt(0).toUpperCase() + string.slice(1);\n}","/**\n * Safe chained function.\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n */\nexport default function createChainedFunction(...funcs) {\n return funcs.reduce((acc, func) => {\n if (func == null) {\n return acc;\n }\n return function chainedFunction(...args) {\n acc.apply(this, args);\n func.apply(this, args);\n };\n }, () => {});\n}","// Corresponds to 10 frames at 60 Hz.\n// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\nexport default function debounce(func, wait = 166) {\n let timeout;\n function debounced(...args) {\n const later = () => {\n // @ts-ignore\n func.apply(this, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n }\n debounced.clear = () => {\n clearTimeout(timeout);\n };\n return debounced;\n}","export default function deprecatedPropType(validator, reason) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n return (props, propName, componentName, location, propFullName) => {\n const componentNameSafe = componentName || '<>';\n const propFullNameSafe = propFullName || propName;\n if (typeof props[propName] !== 'undefined') {\n return new Error(`The ${location} \\`${propFullNameSafe}\\` of ` + `\\`${componentNameSafe}\\` is deprecated. ${reason}`);\n }\n return null;\n };\n}","import * as React from 'react';\nexport default function isMuiElement(element, muiNames) {\n var _muiName, _element$type;\n return /*#__PURE__*/React.isValidElement(element) && muiNames.indexOf( // For server components `muiName` is avaialble in element.type._payload.value.muiName\n // relevant info - https://github.com/facebook/react/blob/2807d781a08db8e9873687fccc25c0f12b4fb3d4/packages/react/src/ReactLazy.js#L45\n // eslint-disable-next-line no-underscore-dangle\n (_muiName = element.type.muiName) != null ? _muiName : (_element$type = element.type) == null || (_element$type = _element$type._payload) == null || (_element$type = _element$type.value) == null ? void 0 : _element$type.muiName) !== -1;\n}","export default function ownerDocument(node) {\n return node && node.ownerDocument || document;\n}","import ownerDocument from '../ownerDocument';\nexport default function ownerWindow(node) {\n const doc = ownerDocument(node);\n return doc.defaultView || window;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nexport default function requirePropFactory(componentNameInError, Component) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n\n // eslint-disable-next-line react/forbid-foreign-prop-types\n const prevPropTypes = Component ? _extends({}, Component.propTypes) : null;\n const requireProp = requiredProp => (props, propName, componentName, location, propFullName, ...args) => {\n const propFullNameSafe = propFullName || propName;\n const defaultTypeChecker = prevPropTypes == null ? void 0 : prevPropTypes[propFullNameSafe];\n if (defaultTypeChecker) {\n const typeCheckerResult = defaultTypeChecker(props, propName, componentName, location, propFullName, ...args);\n if (typeCheckerResult) {\n return typeCheckerResult;\n }\n }\n if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n return new Error(`The prop \\`${propFullNameSafe}\\` of ` + `\\`${componentNameInError}\\` can only be used together with the \\`${requiredProp}\\` prop.`);\n }\n return null;\n };\n return requireProp;\n}","/**\n * TODO v5: consider making it private\n *\n * passes {value} to {ref}\n *\n * WARNING: Be sure to only call this inside a callback that is passed as a ref.\n * Otherwise, make sure to cleanup the previous {ref} if it changes. See\n * https://github.com/mui/material-ui/issues/13539\n *\n * Useful if you want to expose the ref of an inner component to the public API\n * while still using it inside the component.\n * @param ref A ref callback or ref object. If anything falsy, this is a no-op.\n */\nexport default function setRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}","'use client';\n\nimport * as React from 'react';\n\n/**\n * A version of `React.useLayoutEffect` that does not show a warning when server-side rendering.\n * This is useful for effects that are only needed for client-side rendering but not for SSR.\n *\n * Before you use this hook, make sure to read https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85\n * and confirm it doesn't apply to your use-case.\n */\nconst useEnhancedEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nexport default useEnhancedEffect;","'use client';\n\nimport * as React from 'react';\nlet globalId = 0;\nfunction useGlobalId(idOverride) {\n const [defaultId, setDefaultId] = React.useState(idOverride);\n const id = idOverride || defaultId;\n React.useEffect(() => {\n if (defaultId == null) {\n // Fallback to this default id when possible.\n // Use the incrementing value for client-side rendering only.\n // We can't use it server-side.\n // If you want to use random values please consider the Birthday Problem: https://en.wikipedia.org/wiki/Birthday_problem\n globalId += 1;\n setDefaultId(`mui-${globalId}`);\n }\n }, [defaultId]);\n return id;\n}\n\n// downstream bundlers may remove unnecessary concatenation, but won't remove toString call -- Workaround for https://github.com/webpack/webpack/issues/14814\nconst maybeReactUseId = React['useId'.toString()];\n/**\n *\n * @example
\n * @param idOverride\n * @returns {string}\n */\nexport default function useId(idOverride) {\n if (maybeReactUseId !== undefined) {\n const reactId = maybeReactUseId();\n return idOverride != null ? idOverride : reactId;\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks -- `React.useId` is invariant at runtime.\n return useGlobalId(idOverride);\n}","export default function unsupportedProp(props, propName, componentName, location, propFullName) {\n if (process.env.NODE_ENV === 'production') {\n return null;\n }\n const propFullNameSafe = propFullName || propName;\n if (typeof props[propName] !== 'undefined') {\n return new Error(`The prop \\`${propFullNameSafe}\\` is not supported. Please remove it.`);\n }\n return null;\n}","'use client';\n\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\nimport * as React from 'react';\nexport default function useControlled({\n controlled,\n default: defaultProp,\n name,\n state = 'value'\n}) {\n // isControlled is ignored in the hook dependency lists as it should never change.\n const {\n current: isControlled\n } = React.useRef(controlled !== undefined);\n const [valueState, setValue] = React.useState(defaultProp);\n const value = isControlled ? controlled : valueState;\n if (process.env.NODE_ENV !== 'production') {\n React.useEffect(() => {\n if (isControlled !== (controlled !== undefined)) {\n console.error([`MUI: A component is changing the ${isControlled ? '' : 'un'}controlled ${state} state of ${name} to be ${isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${name} ` + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n }\n }, [state, name, controlled]);\n const {\n current: defaultValue\n } = React.useRef(defaultProp);\n React.useEffect(() => {\n if (!isControlled && defaultValue !== defaultProp) {\n console.error([`MUI: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` + `To suppress this warning opt to use a controlled ${name}.`].join('\\n'));\n }\n }, [JSON.stringify(defaultProp)]);\n }\n const setValueIfUncontrolled = React.useCallback(newValue => {\n if (!isControlled) {\n setValue(newValue);\n }\n }, []);\n return [value, setValueIfUncontrolled];\n}","'use client';\n\nimport * as React from 'react';\nimport useEnhancedEffect from '../useEnhancedEffect';\n\n/**\n * Inspired by https://github.com/facebook/react/issues/14099#issuecomment-440013892\n * See RFC in https://github.com/reactjs/rfcs/pull/220\n */\n\nfunction useEventCallback(fn) {\n const ref = React.useRef(fn);\n useEnhancedEffect(() => {\n ref.current = fn;\n });\n return React.useRef((...args) =>\n // @ts-expect-error hide `this`\n (0, ref.current)(...args)).current;\n}\nexport default useEventCallback;","'use client';\n\nimport * as React from 'react';\nimport setRef from '../setRef';\nexport default function useForkRef(...refs) {\n /**\n * This will create a new function if the refs passed to this hook change and are all defined.\n * This means react will call the old forkRef with `null` and the new forkRef\n * with the ref. Cleanup naturally emerges from this behavior.\n */\n return React.useMemo(() => {\n if (refs.every(ref => ref == null)) {\n return null;\n }\n return instance => {\n refs.forEach(ref => {\n setRef(ref, instance);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}","'use client';\n\nimport * as React from 'react';\nconst UNINITIALIZED = {};\n\n/**\n * A React.useRef() that is initialized lazily with a function. Note that it accepts an optional\n * initialization argument, so the initialization function doesn't need to be an inline closure.\n *\n * @usage\n * const ref = useLazyRef(sortColumns, columns)\n */\nexport default function useLazyRef(init, initArg) {\n const ref = React.useRef(UNINITIALIZED);\n if (ref.current === UNINITIALIZED) {\n ref.current = init(initArg);\n }\n return ref;\n}","'use client';\n\nimport * as React from 'react';\nconst EMPTY = [];\n\n/**\n * A React.useEffect equivalent that runs once, when the component is mounted.\n */\nexport default function useOnMount(fn) {\n /* eslint-disable react-hooks/exhaustive-deps */\n React.useEffect(fn, EMPTY);\n /* eslint-enable react-hooks/exhaustive-deps */\n}","'use client';\n\nimport useLazyRef from '../useLazyRef/useLazyRef';\nimport useOnMount from '../useOnMount/useOnMount';\nexport class Timeout {\n constructor() {\n this.currentId = null;\n this.clear = () => {\n if (this.currentId !== null) {\n clearTimeout(this.currentId);\n this.currentId = null;\n }\n };\n this.disposeEffect = () => {\n return this.clear;\n };\n }\n static create() {\n return new Timeout();\n }\n /**\n * Executes `fn` after `delay`, clearing any previously scheduled call.\n */\n start(delay, fn) {\n this.clear();\n this.currentId = setTimeout(() => {\n this.currentId = null;\n fn();\n }, delay);\n }\n}\nexport default function useTimeout() {\n const timeout = useLazyRef(Timeout.create).current;\n useOnMount(timeout.disposeEffect);\n return timeout;\n}","'use client';\n\n// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js\nimport * as React from 'react';\nimport { Timeout } from '../useTimeout/useTimeout';\nlet hadKeyboardEvent = true;\nlet hadFocusVisibleRecently = false;\nconst hadFocusVisibleRecentlyTimeout = new Timeout();\nconst inputTypesWhitelist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n};\n\n/**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} node\n * @returns {boolean}\n */\nfunction focusTriggersKeyboardModality(node) {\n const {\n type,\n tagName\n } = node;\n if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {\n return true;\n }\n if (tagName === 'TEXTAREA' && !node.readOnly) {\n return true;\n }\n if (node.isContentEditable) {\n return true;\n }\n return false;\n}\n\n/**\n * Keep track of our keyboard modality state with `hadKeyboardEvent`.\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * @param {KeyboardEvent} event\n */\nfunction handleKeyDown(event) {\n if (event.metaKey || event.altKey || event.ctrlKey) {\n return;\n }\n hadKeyboardEvent = true;\n}\n\n/**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n */\nfunction handlePointerDown() {\n hadKeyboardEvent = false;\n}\nfunction handleVisibilityChange() {\n if (this.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n }\n}\nfunction prepare(doc) {\n doc.addEventListener('keydown', handleKeyDown, true);\n doc.addEventListener('mousedown', handlePointerDown, true);\n doc.addEventListener('pointerdown', handlePointerDown, true);\n doc.addEventListener('touchstart', handlePointerDown, true);\n doc.addEventListener('visibilitychange', handleVisibilityChange, true);\n}\nexport function teardown(doc) {\n doc.removeEventListener('keydown', handleKeyDown, true);\n doc.removeEventListener('mousedown', handlePointerDown, true);\n doc.removeEventListener('pointerdown', handlePointerDown, true);\n doc.removeEventListener('touchstart', handlePointerDown, true);\n doc.removeEventListener('visibilitychange', handleVisibilityChange, true);\n}\nfunction isFocusVisible(event) {\n const {\n target\n } = event;\n try {\n return target.matches(':focus-visible');\n } catch (error) {\n // Browsers not implementing :focus-visible will throw a SyntaxError.\n // We use our own heuristic for those browsers.\n // Rethrow might be better if it's not the expected error but do we really\n // want to crash if focus-visible malfunctioned?\n }\n\n // No need for validFocusTarget check. The user does that by attaching it to\n // focusable events only.\n return hadKeyboardEvent || focusTriggersKeyboardModality(target);\n}\nexport default function useIsFocusVisible() {\n const ref = React.useCallback(node => {\n if (node != null) {\n prepare(node.ownerDocument);\n }\n }, []);\n const isFocusVisibleRef = React.useRef(false);\n\n /**\n * Should be called if a blur event is fired\n */\n function handleBlurVisible() {\n // checking against potential state variable does not suffice if we focus and blur synchronously.\n // React wouldn't have time to trigger a re-render so `focusVisible` would be stale.\n // Ideally we would adjust `isFocusVisible(event)` to look at `relatedTarget` for blur events.\n // This doesn't work in IE11 due to https://github.com/facebook/react/issues/3751\n // TODO: check again if React releases their internal changes to focus event handling (https://github.com/facebook/react/pull/19186).\n if (isFocusVisibleRef.current) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n hadFocusVisibleRecentlyTimeout.start(100, () => {\n hadFocusVisibleRecently = false;\n });\n isFocusVisibleRef.current = false;\n return true;\n }\n return false;\n }\n\n /**\n * Should be called if a blur event is fired\n */\n function handleFocusVisible(event) {\n if (isFocusVisible(event)) {\n isFocusVisibleRef.current = true;\n return true;\n }\n return false;\n }\n return {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref\n };\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\n/**\n * Add keys, values of `defaultProps` that does not exist in `props`\n * @param {object} defaultProps\n * @param {object} props\n * @returns {object} resolved props\n */\nexport default function resolveProps(defaultProps, props) {\n const output = _extends({}, props);\n Object.keys(defaultProps).forEach(propName => {\n if (propName.toString().match(/^(components|slots)$/)) {\n output[propName] = _extends({}, defaultProps[propName], output[propName]);\n } else if (propName.toString().match(/^(componentsProps|slotProps)$/)) {\n const defaultSlotProps = defaultProps[propName] || {};\n const slotProps = props[propName];\n output[propName] = {};\n if (!slotProps || !Object.keys(slotProps)) {\n // Reduce the iteration if the slot props is empty\n output[propName] = defaultSlotProps;\n } else if (!defaultSlotProps || !Object.keys(defaultSlotProps)) {\n // Reduce the iteration if the default slot props is empty\n output[propName] = slotProps;\n } else {\n output[propName] = _extends({}, slotProps);\n Object.keys(defaultSlotProps).forEach(slotPropName => {\n output[propName][slotPropName] = resolveProps(defaultSlotProps[slotPropName], slotProps[slotPropName]);\n });\n }\n } else if (output[propName] === undefined) {\n output[propName] = defaultProps[propName];\n }\n });\n return output;\n}","export default function composeClasses(slots, getUtilityClass, classes = undefined) {\n const output = {};\n Object.keys(slots).forEach(\n // `Object.keys(slots)` can't be wider than `T` because we infer `T` from `slots`.\n // @ts-expect-error https://github.com/microsoft/TypeScript/pull/12253#issuecomment-263132208\n slot => {\n output[slot] = slots[slot].reduce((acc, key) => {\n if (key) {\n const utilityClass = getUtilityClass(key);\n if (utilityClass !== '') {\n acc.push(utilityClass);\n }\n if (classes && classes[key]) {\n acc.push(classes[key]);\n }\n }\n return acc;\n }, []).join(' ');\n });\n return output;\n}","const defaultGenerator = componentName => componentName;\nconst createClassNameGenerator = () => {\n let generate = defaultGenerator;\n return {\n configure(generator) {\n generate = generator;\n },\n generate(componentName) {\n return generate(componentName);\n },\n reset() {\n generate = defaultGenerator;\n }\n };\n};\nconst ClassNameGenerator = createClassNameGenerator();\nexport default ClassNameGenerator;","import ClassNameGenerator from '../ClassNameGenerator';\nexport const globalStateClasses = {\n active: 'active',\n checked: 'checked',\n completed: 'completed',\n disabled: 'disabled',\n error: 'error',\n expanded: 'expanded',\n focused: 'focused',\n focusVisible: 'focusVisible',\n open: 'open',\n readOnly: 'readOnly',\n required: 'required',\n selected: 'selected'\n};\nexport default function generateUtilityClass(componentName, slot, globalStatePrefix = 'Mui') {\n const globalStateClass = globalStateClasses[slot];\n return globalStateClass ? `${globalStatePrefix}-${globalStateClass}` : `${ClassNameGenerator.generate(componentName)}-${slot}`;\n}\nexport function isGlobalState(slot) {\n return globalStateClasses[slot] !== undefined;\n}","import generateUtilityClass from '../generateUtilityClass';\nexport default function generateUtilityClasses(componentName, slots, globalStatePrefix = 'Mui') {\n const result = {};\n slots.forEach(slot => {\n result[slot] = generateUtilityClass(componentName, slot, globalStatePrefix);\n });\n return result;\n}","function clamp(val, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {\n return Math.max(min, Math.min(val, max));\n}\nexport default clamp;","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"values\", \"unit\", \"step\"];\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nexport const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'];\nconst sortBreakpointsValues = values => {\n const breakpointsAsArray = Object.keys(values).map(key => ({\n key,\n val: values[key]\n })) || [];\n // Sort in ascending order\n breakpointsAsArray.sort((breakpoint1, breakpoint2) => breakpoint1.val - breakpoint2.val);\n return breakpointsAsArray.reduce((acc, obj) => {\n return _extends({}, acc, {\n [obj.key]: obj.val\n });\n }, {});\n};\n\n// Keep in mind that @media is inclusive by the CSS specification.\nexport default function createBreakpoints(breakpoints) {\n const {\n // The breakpoint **start** at this value.\n // For instance with the first breakpoint xs: [xs, sm).\n values = {\n xs: 0,\n // phone\n sm: 600,\n // tablet\n md: 900,\n // small laptop\n lg: 1200,\n // desktop\n xl: 1536 // large screen\n },\n unit = 'px',\n step = 5\n } = breakpoints,\n other = _objectWithoutPropertiesLoose(breakpoints, _excluded);\n const sortedValues = sortBreakpointsValues(values);\n const keys = Object.keys(sortedValues);\n function up(key) {\n const value = typeof values[key] === 'number' ? values[key] : key;\n return `@media (min-width:${value}${unit})`;\n }\n function down(key) {\n const value = typeof values[key] === 'number' ? values[key] : key;\n return `@media (max-width:${value - step / 100}${unit})`;\n }\n function between(start, end) {\n const endIndex = keys.indexOf(end);\n return `@media (min-width:${typeof values[start] === 'number' ? values[start] : start}${unit}) and ` + `(max-width:${(endIndex !== -1 && typeof values[keys[endIndex]] === 'number' ? values[keys[endIndex]] : end) - step / 100}${unit})`;\n }\n function only(key) {\n if (keys.indexOf(key) + 1 < keys.length) {\n return between(key, keys[keys.indexOf(key) + 1]);\n }\n return up(key);\n }\n function not(key) {\n // handle first and last key separately, for better readability\n const keyIndex = keys.indexOf(key);\n if (keyIndex === 0) {\n return up(keys[1]);\n }\n if (keyIndex === keys.length - 1) {\n return down(keys[keyIndex]);\n }\n return between(key, keys[keys.indexOf(key) + 1]).replace('@media', '@media not all and');\n }\n return _extends({\n keys,\n values: sortedValues,\n up,\n down,\n between,\n only,\n not,\n unit\n }, other);\n}","const shape = {\n borderRadius: 4\n};\nexport default shape;","import PropTypes from 'prop-types';\nconst responsivePropType = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.object, PropTypes.array]) : {};\nexport default responsivePropType;","import deepmerge from '@mui/utils/deepmerge';\nfunction merge(acc, item) {\n if (!item) {\n return acc;\n }\n return deepmerge(acc, item, {\n clone: false // No need to clone deep, it's way faster.\n });\n}\nexport default merge;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport PropTypes from 'prop-types';\nimport deepmerge from '@mui/utils/deepmerge';\nimport merge from './merge';\n\n// The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\nexport const values = {\n xs: 0,\n // phone\n sm: 600,\n // tablet\n md: 900,\n // small laptop\n lg: 1200,\n // desktop\n xl: 1536 // large screen\n};\nconst defaultBreakpoints = {\n // Sorted ASC by size. That's important.\n // It can't be configured as it's used statically for propTypes.\n keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n up: key => `@media (min-width:${values[key]}px)`\n};\nexport function handleBreakpoints(props, propValue, styleFromPropValue) {\n const theme = props.theme || {};\n if (Array.isArray(propValue)) {\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n return propValue.reduce((acc, item, index) => {\n acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n return acc;\n }, {});\n }\n if (typeof propValue === 'object') {\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n return Object.keys(propValue).reduce((acc, breakpoint) => {\n // key is breakpoint\n if (Object.keys(themeBreakpoints.values || values).indexOf(breakpoint) !== -1) {\n const mediaKey = themeBreakpoints.up(breakpoint);\n acc[mediaKey] = styleFromPropValue(propValue[breakpoint], breakpoint);\n } else {\n const cssKey = breakpoint;\n acc[cssKey] = propValue[cssKey];\n }\n return acc;\n }, {});\n }\n const output = styleFromPropValue(propValue);\n return output;\n}\nfunction breakpoints(styleFunction) {\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const newStyleFunction = props => {\n const theme = props.theme || {};\n const base = styleFunction(props);\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n const extended = themeBreakpoints.keys.reduce((acc, key) => {\n if (props[key]) {\n acc = acc || {};\n acc[themeBreakpoints.up(key)] = styleFunction(_extends({\n theme\n }, props[key]));\n }\n return acc;\n }, null);\n return merge(base, extended);\n };\n newStyleFunction.propTypes = process.env.NODE_ENV !== 'production' ? _extends({}, styleFunction.propTypes, {\n xs: PropTypes.object,\n sm: PropTypes.object,\n md: PropTypes.object,\n lg: PropTypes.object,\n xl: PropTypes.object\n }) : {};\n newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl', ...styleFunction.filterProps];\n return newStyleFunction;\n}\nexport function createEmptyBreakpointObject(breakpointsInput = {}) {\n var _breakpointsInput$key;\n const breakpointsInOrder = (_breakpointsInput$key = breakpointsInput.keys) == null ? void 0 : _breakpointsInput$key.reduce((acc, key) => {\n const breakpointStyleKey = breakpointsInput.up(key);\n acc[breakpointStyleKey] = {};\n return acc;\n }, {});\n return breakpointsInOrder || {};\n}\nexport function removeUnusedBreakpoints(breakpointKeys, style) {\n return breakpointKeys.reduce((acc, key) => {\n const breakpointOutput = acc[key];\n const isBreakpointUnused = !breakpointOutput || Object.keys(breakpointOutput).length === 0;\n if (isBreakpointUnused) {\n delete acc[key];\n }\n return acc;\n }, style);\n}\nexport function mergeBreakpointsInOrder(breakpointsInput, ...styles) {\n const emptyBreakpoints = createEmptyBreakpointObject(breakpointsInput);\n const mergedOutput = [emptyBreakpoints, ...styles].reduce((prev, next) => deepmerge(prev, next), {});\n return removeUnusedBreakpoints(Object.keys(emptyBreakpoints), mergedOutput);\n}\n\n// compute base for responsive values; e.g.,\n// [1,2,3] => {xs: true, sm: true, md: true}\n// {xs: 1, sm: 2, md: 3} => {xs: true, sm: true, md: true}\nexport function computeBreakpointsBase(breakpointValues, themeBreakpoints) {\n // fixed value\n if (typeof breakpointValues !== 'object') {\n return {};\n }\n const base = {};\n const breakpointsKeys = Object.keys(themeBreakpoints);\n if (Array.isArray(breakpointValues)) {\n breakpointsKeys.forEach((breakpoint, i) => {\n if (i < breakpointValues.length) {\n base[breakpoint] = true;\n }\n });\n } else {\n breakpointsKeys.forEach(breakpoint => {\n if (breakpointValues[breakpoint] != null) {\n base[breakpoint] = true;\n }\n });\n }\n return base;\n}\nexport function resolveBreakpointValues({\n values: breakpointValues,\n breakpoints: themeBreakpoints,\n base: customBase\n}) {\n const base = customBase || computeBreakpointsBase(breakpointValues, themeBreakpoints);\n const keys = Object.keys(base);\n if (keys.length === 0) {\n return breakpointValues;\n }\n let previous;\n return keys.reduce((acc, breakpoint, i) => {\n if (Array.isArray(breakpointValues)) {\n acc[breakpoint] = breakpointValues[i] != null ? breakpointValues[i] : breakpointValues[previous];\n previous = i;\n } else if (typeof breakpointValues === 'object') {\n acc[breakpoint] = breakpointValues[breakpoint] != null ? breakpointValues[breakpoint] : breakpointValues[previous];\n previous = breakpoint;\n } else {\n acc[breakpoint] = breakpointValues;\n }\n return acc;\n }, {});\n}\nexport default breakpoints;","import capitalize from '@mui/utils/capitalize';\nimport responsivePropType from './responsivePropType';\nimport { handleBreakpoints } from './breakpoints';\nexport function getPath(obj, path, checkVars = true) {\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Check if CSS variables are used\n if (obj && obj.vars && checkVars) {\n const val = `vars.${path}`.split('.').reduce((acc, item) => acc && acc[item] ? acc[item] : null, obj);\n if (val != null) {\n return val;\n }\n }\n return path.split('.').reduce((acc, item) => {\n if (acc && acc[item] != null) {\n return acc[item];\n }\n return null;\n }, obj);\n}\nexport function getStyleValue(themeMapping, transform, propValueFinal, userValue = propValueFinal) {\n let value;\n if (typeof themeMapping === 'function') {\n value = themeMapping(propValueFinal);\n } else if (Array.isArray(themeMapping)) {\n value = themeMapping[propValueFinal] || userValue;\n } else {\n value = getPath(themeMapping, propValueFinal) || userValue;\n }\n if (transform) {\n value = transform(value, userValue, themeMapping);\n }\n return value;\n}\nfunction style(options) {\n const {\n prop,\n cssProperty = options.prop,\n themeKey,\n transform\n } = options;\n\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const fn = props => {\n if (props[prop] == null) {\n return null;\n }\n const propValue = props[prop];\n const theme = props.theme;\n const themeMapping = getPath(theme, themeKey) || {};\n const styleFromPropValue = propValueFinal => {\n let value = getStyleValue(themeMapping, transform, propValueFinal);\n if (propValueFinal === value && typeof propValueFinal === 'string') {\n // Haven't found value\n value = getStyleValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize(propValueFinal)}`, propValueFinal);\n }\n if (cssProperty === false) {\n return value;\n }\n return {\n [cssProperty]: value\n };\n };\n return handleBreakpoints(props, propValue, styleFromPropValue);\n };\n fn.propTypes = process.env.NODE_ENV !== 'production' ? {\n [prop]: responsivePropType\n } : {};\n fn.filterProps = [prop];\n return fn;\n}\nexport default style;","export default function memoize(fn) {\n const cache = {};\n return arg => {\n if (cache[arg] === undefined) {\n cache[arg] = fn(arg);\n }\n return cache[arg];\n };\n}","import responsivePropType from './responsivePropType';\nimport { handleBreakpoints } from './breakpoints';\nimport { getPath } from './style';\nimport merge from './merge';\nimport memoize from './memoize';\nconst properties = {\n m: 'margin',\n p: 'padding'\n};\nconst directions = {\n t: 'Top',\n r: 'Right',\n b: 'Bottom',\n l: 'Left',\n x: ['Left', 'Right'],\n y: ['Top', 'Bottom']\n};\nconst aliases = {\n marginX: 'mx',\n marginY: 'my',\n paddingX: 'px',\n paddingY: 'py'\n};\n\n// memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\nconst getCssProperties = memoize(prop => {\n // It's not a shorthand notation.\n if (prop.length > 2) {\n if (aliases[prop]) {\n prop = aliases[prop];\n } else {\n return [prop];\n }\n }\n const [a, b] = prop.split('');\n const property = properties[a];\n const direction = directions[b] || '';\n return Array.isArray(direction) ? direction.map(dir => property + dir) : [property + direction];\n});\nexport const marginKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'marginInline', 'marginInlineStart', 'marginInlineEnd', 'marginBlock', 'marginBlockStart', 'marginBlockEnd'];\nexport const paddingKeys = ['p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY', 'paddingInline', 'paddingInlineStart', 'paddingInlineEnd', 'paddingBlock', 'paddingBlockStart', 'paddingBlockEnd'];\nconst spacingKeys = [...marginKeys, ...paddingKeys];\nexport function createUnaryUnit(theme, themeKey, defaultValue, propName) {\n var _getPath;\n const themeSpacing = (_getPath = getPath(theme, themeKey, false)) != null ? _getPath : defaultValue;\n if (typeof themeSpacing === 'number') {\n return abs => {\n if (typeof abs === 'string') {\n return abs;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (typeof abs !== 'number') {\n console.error(`MUI: Expected ${propName} argument to be a number or a string, got ${abs}.`);\n }\n }\n return themeSpacing * abs;\n };\n }\n if (Array.isArray(themeSpacing)) {\n return abs => {\n if (typeof abs === 'string') {\n return abs;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!Number.isInteger(abs)) {\n console.error([`MUI: The \\`theme.${themeKey}\\` array type cannot be combined with non integer values.` + `You should either use an integer value that can be used as index, or define the \\`theme.${themeKey}\\` as a number.`].join('\\n'));\n } else if (abs > themeSpacing.length - 1) {\n console.error([`MUI: The value provided (${abs}) overflows.`, `The supported values are: ${JSON.stringify(themeSpacing)}.`, `${abs} > ${themeSpacing.length - 1}, you need to add the missing values.`].join('\\n'));\n }\n }\n return themeSpacing[abs];\n };\n }\n if (typeof themeSpacing === 'function') {\n return themeSpacing;\n }\n if (process.env.NODE_ENV !== 'production') {\n console.error([`MUI: The \\`theme.${themeKey}\\` value (${themeSpacing}) is invalid.`, 'It should be a number, an array or a function.'].join('\\n'));\n }\n return () => undefined;\n}\nexport function createUnarySpacing(theme) {\n return createUnaryUnit(theme, 'spacing', 8, 'spacing');\n}\nexport function getValue(transformer, propValue) {\n if (typeof propValue === 'string' || propValue == null) {\n return propValue;\n }\n const abs = Math.abs(propValue);\n const transformed = transformer(abs);\n if (propValue >= 0) {\n return transformed;\n }\n if (typeof transformed === 'number') {\n return -transformed;\n }\n return `-${transformed}`;\n}\nexport function getStyleFromPropValue(cssProperties, transformer) {\n return propValue => cssProperties.reduce((acc, cssProperty) => {\n acc[cssProperty] = getValue(transformer, propValue);\n return acc;\n }, {});\n}\nfunction resolveCssProperty(props, keys, prop, transformer) {\n // Using a hash computation over an array iteration could be faster, but with only 28 items,\n // it's doesn't worth the bundle size.\n if (keys.indexOf(prop) === -1) {\n return null;\n }\n const cssProperties = getCssProperties(prop);\n const styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n const propValue = props[prop];\n return handleBreakpoints(props, propValue, styleFromPropValue);\n}\nfunction style(props, keys) {\n const transformer = createUnarySpacing(props.theme);\n return Object.keys(props).map(prop => resolveCssProperty(props, keys, prop, transformer)).reduce(merge, {});\n}\nexport function margin(props) {\n return style(props, marginKeys);\n}\nmargin.propTypes = process.env.NODE_ENV !== 'production' ? marginKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\nmargin.filterProps = marginKeys;\nexport function padding(props) {\n return style(props, paddingKeys);\n}\npadding.propTypes = process.env.NODE_ENV !== 'production' ? paddingKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\npadding.filterProps = paddingKeys;\nfunction spacing(props) {\n return style(props, spacingKeys);\n}\nspacing.propTypes = process.env.NODE_ENV !== 'production' ? spacingKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\nspacing.filterProps = spacingKeys;\nexport default spacing;","import { createUnarySpacing } from '../spacing';\n\n// The different signatures imply different meaning for their arguments that can't be expressed structurally.\n// We express the difference with variable names.\n\nexport default function createSpacing(spacingInput = 8) {\n // Already transformed.\n if (spacingInput.mui) {\n return spacingInput;\n }\n\n // Material Design layouts are visually balanced. Most measurements align to an 8dp grid, which aligns both spacing and the overall layout.\n // Smaller components, such as icons, can align to a 4dp grid.\n // https://m2.material.io/design/layout/understanding-layout.html\n const transform = createUnarySpacing({\n spacing: spacingInput\n });\n const spacing = (...argsInput) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(argsInput.length <= 4)) {\n console.error(`MUI: Too many arguments provided, expected between 0 and 4, got ${argsInput.length}`);\n }\n }\n const args = argsInput.length === 0 ? [1] : argsInput;\n return args.map(argument => {\n const output = transform(argument);\n return typeof output === 'number' ? `${output}px` : output;\n }).join(' ');\n };\n spacing.mui = true;\n return spacing;\n}","import merge from './merge';\nfunction compose(...styles) {\n const handlers = styles.reduce((acc, style) => {\n style.filterProps.forEach(prop => {\n acc[prop] = style;\n });\n return acc;\n }, {});\n\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const fn = props => {\n return Object.keys(props).reduce((acc, prop) => {\n if (handlers[prop]) {\n return merge(acc, handlers[prop](props));\n }\n return acc;\n }, {});\n };\n fn.propTypes = process.env.NODE_ENV !== 'production' ? styles.reduce((acc, style) => Object.assign(acc, style.propTypes), {}) : {};\n fn.filterProps = styles.reduce((acc, style) => acc.concat(style.filterProps), []);\n return fn;\n}\nexport default compose;","import responsivePropType from './responsivePropType';\nimport style from './style';\nimport compose from './compose';\nimport { createUnaryUnit, getValue } from './spacing';\nimport { handleBreakpoints } from './breakpoints';\nexport function borderTransform(value) {\n if (typeof value !== 'number') {\n return value;\n }\n return `${value}px solid`;\n}\nfunction createBorderStyle(prop, transform) {\n return style({\n prop,\n themeKey: 'borders',\n transform\n });\n}\nexport const border = createBorderStyle('border', borderTransform);\nexport const borderTop = createBorderStyle('borderTop', borderTransform);\nexport const borderRight = createBorderStyle('borderRight', borderTransform);\nexport const borderBottom = createBorderStyle('borderBottom', borderTransform);\nexport const borderLeft = createBorderStyle('borderLeft', borderTransform);\nexport const borderColor = createBorderStyle('borderColor');\nexport const borderTopColor = createBorderStyle('borderTopColor');\nexport const borderRightColor = createBorderStyle('borderRightColor');\nexport const borderBottomColor = createBorderStyle('borderBottomColor');\nexport const borderLeftColor = createBorderStyle('borderLeftColor');\nexport const outline = createBorderStyle('outline', borderTransform);\nexport const outlineColor = createBorderStyle('outlineColor');\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const borderRadius = props => {\n if (props.borderRadius !== undefined && props.borderRadius !== null) {\n const transformer = createUnaryUnit(props.theme, 'shape.borderRadius', 4, 'borderRadius');\n const styleFromPropValue = propValue => ({\n borderRadius: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.borderRadius, styleFromPropValue);\n }\n return null;\n};\nborderRadius.propTypes = process.env.NODE_ENV !== 'production' ? {\n borderRadius: responsivePropType\n} : {};\nborderRadius.filterProps = ['borderRadius'];\nconst borders = compose(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderTopColor, borderRightColor, borderBottomColor, borderLeftColor, borderRadius, outline, outlineColor);\nexport default borders;","import style from './style';\nimport compose from './compose';\nimport { createUnaryUnit, getValue } from './spacing';\nimport { handleBreakpoints } from './breakpoints';\nimport responsivePropType from './responsivePropType';\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const gap = props => {\n if (props.gap !== undefined && props.gap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap');\n const styleFromPropValue = propValue => ({\n gap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.gap, styleFromPropValue);\n }\n return null;\n};\ngap.propTypes = process.env.NODE_ENV !== 'production' ? {\n gap: responsivePropType\n} : {};\ngap.filterProps = ['gap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const columnGap = props => {\n if (props.columnGap !== undefined && props.columnGap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap');\n const styleFromPropValue = propValue => ({\n columnGap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.columnGap, styleFromPropValue);\n }\n return null;\n};\ncolumnGap.propTypes = process.env.NODE_ENV !== 'production' ? {\n columnGap: responsivePropType\n} : {};\ncolumnGap.filterProps = ['columnGap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const rowGap = props => {\n if (props.rowGap !== undefined && props.rowGap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap');\n const styleFromPropValue = propValue => ({\n rowGap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.rowGap, styleFromPropValue);\n }\n return null;\n};\nrowGap.propTypes = process.env.NODE_ENV !== 'production' ? {\n rowGap: responsivePropType\n} : {};\nrowGap.filterProps = ['rowGap'];\nexport const gridColumn = style({\n prop: 'gridColumn'\n});\nexport const gridRow = style({\n prop: 'gridRow'\n});\nexport const gridAutoFlow = style({\n prop: 'gridAutoFlow'\n});\nexport const gridAutoColumns = style({\n prop: 'gridAutoColumns'\n});\nexport const gridAutoRows = style({\n prop: 'gridAutoRows'\n});\nexport const gridTemplateColumns = style({\n prop: 'gridTemplateColumns'\n});\nexport const gridTemplateRows = style({\n prop: 'gridTemplateRows'\n});\nexport const gridTemplateAreas = style({\n prop: 'gridTemplateAreas'\n});\nexport const gridArea = style({\n prop: 'gridArea'\n});\nconst grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\nexport default grid;","import style from './style';\nimport compose from './compose';\nexport function paletteTransform(value, userValue) {\n if (userValue === 'grey') {\n return userValue;\n }\n return value;\n}\nexport const color = style({\n prop: 'color',\n themeKey: 'palette',\n transform: paletteTransform\n});\nexport const bgcolor = style({\n prop: 'bgcolor',\n cssProperty: 'backgroundColor',\n themeKey: 'palette',\n transform: paletteTransform\n});\nexport const backgroundColor = style({\n prop: 'backgroundColor',\n themeKey: 'palette',\n transform: paletteTransform\n});\nconst palette = compose(color, bgcolor, backgroundColor);\nexport default palette;","import style from './style';\nimport compose from './compose';\nimport { handleBreakpoints, values as breakpointsValues } from './breakpoints';\nexport function sizingTransform(value) {\n return value <= 1 && value !== 0 ? `${value * 100}%` : value;\n}\nexport const width = style({\n prop: 'width',\n transform: sizingTransform\n});\nexport const maxWidth = props => {\n if (props.maxWidth !== undefined && props.maxWidth !== null) {\n const styleFromPropValue = propValue => {\n var _props$theme, _props$theme2;\n const breakpoint = ((_props$theme = props.theme) == null || (_props$theme = _props$theme.breakpoints) == null || (_props$theme = _props$theme.values) == null ? void 0 : _props$theme[propValue]) || breakpointsValues[propValue];\n if (!breakpoint) {\n return {\n maxWidth: sizingTransform(propValue)\n };\n }\n if (((_props$theme2 = props.theme) == null || (_props$theme2 = _props$theme2.breakpoints) == null ? void 0 : _props$theme2.unit) !== 'px') {\n return {\n maxWidth: `${breakpoint}${props.theme.breakpoints.unit}`\n };\n }\n return {\n maxWidth: breakpoint\n };\n };\n return handleBreakpoints(props, props.maxWidth, styleFromPropValue);\n }\n return null;\n};\nmaxWidth.filterProps = ['maxWidth'];\nexport const minWidth = style({\n prop: 'minWidth',\n transform: sizingTransform\n});\nexport const height = style({\n prop: 'height',\n transform: sizingTransform\n});\nexport const maxHeight = style({\n prop: 'maxHeight',\n transform: sizingTransform\n});\nexport const minHeight = style({\n prop: 'minHeight',\n transform: sizingTransform\n});\nexport const sizeWidth = style({\n prop: 'size',\n cssProperty: 'width',\n transform: sizingTransform\n});\nexport const sizeHeight = style({\n prop: 'size',\n cssProperty: 'height',\n transform: sizingTransform\n});\nexport const boxSizing = style({\n prop: 'boxSizing'\n});\nconst sizing = compose(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\nexport default sizing;","import { padding, margin } from '../spacing';\nimport { borderRadius, borderTransform } from '../borders';\nimport { gap, rowGap, columnGap } from '../cssGrid';\nimport { paletteTransform } from '../palette';\nimport { maxWidth, sizingTransform } from '../sizing';\nconst defaultSxConfig = {\n // borders\n border: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderTop: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderRight: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderBottom: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderLeft: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderColor: {\n themeKey: 'palette'\n },\n borderTopColor: {\n themeKey: 'palette'\n },\n borderRightColor: {\n themeKey: 'palette'\n },\n borderBottomColor: {\n themeKey: 'palette'\n },\n borderLeftColor: {\n themeKey: 'palette'\n },\n outline: {\n themeKey: 'borders',\n transform: borderTransform\n },\n outlineColor: {\n themeKey: 'palette'\n },\n borderRadius: {\n themeKey: 'shape.borderRadius',\n style: borderRadius\n },\n // palette\n color: {\n themeKey: 'palette',\n transform: paletteTransform\n },\n bgcolor: {\n themeKey: 'palette',\n cssProperty: 'backgroundColor',\n transform: paletteTransform\n },\n backgroundColor: {\n themeKey: 'palette',\n transform: paletteTransform\n },\n // spacing\n p: {\n style: padding\n },\n pt: {\n style: padding\n },\n pr: {\n style: padding\n },\n pb: {\n style: padding\n },\n pl: {\n style: padding\n },\n px: {\n style: padding\n },\n py: {\n style: padding\n },\n padding: {\n style: padding\n },\n paddingTop: {\n style: padding\n },\n paddingRight: {\n style: padding\n },\n paddingBottom: {\n style: padding\n },\n paddingLeft: {\n style: padding\n },\n paddingX: {\n style: padding\n },\n paddingY: {\n style: padding\n },\n paddingInline: {\n style: padding\n },\n paddingInlineStart: {\n style: padding\n },\n paddingInlineEnd: {\n style: padding\n },\n paddingBlock: {\n style: padding\n },\n paddingBlockStart: {\n style: padding\n },\n paddingBlockEnd: {\n style: padding\n },\n m: {\n style: margin\n },\n mt: {\n style: margin\n },\n mr: {\n style: margin\n },\n mb: {\n style: margin\n },\n ml: {\n style: margin\n },\n mx: {\n style: margin\n },\n my: {\n style: margin\n },\n margin: {\n style: margin\n },\n marginTop: {\n style: margin\n },\n marginRight: {\n style: margin\n },\n marginBottom: {\n style: margin\n },\n marginLeft: {\n style: margin\n },\n marginX: {\n style: margin\n },\n marginY: {\n style: margin\n },\n marginInline: {\n style: margin\n },\n marginInlineStart: {\n style: margin\n },\n marginInlineEnd: {\n style: margin\n },\n marginBlock: {\n style: margin\n },\n marginBlockStart: {\n style: margin\n },\n marginBlockEnd: {\n style: margin\n },\n // display\n displayPrint: {\n cssProperty: false,\n transform: value => ({\n '@media print': {\n display: value\n }\n })\n },\n display: {},\n overflow: {},\n textOverflow: {},\n visibility: {},\n whiteSpace: {},\n // flexbox\n flexBasis: {},\n flexDirection: {},\n flexWrap: {},\n justifyContent: {},\n alignItems: {},\n alignContent: {},\n order: {},\n flex: {},\n flexGrow: {},\n flexShrink: {},\n alignSelf: {},\n justifyItems: {},\n justifySelf: {},\n // grid\n gap: {\n style: gap\n },\n rowGap: {\n style: rowGap\n },\n columnGap: {\n style: columnGap\n },\n gridColumn: {},\n gridRow: {},\n gridAutoFlow: {},\n gridAutoColumns: {},\n gridAutoRows: {},\n gridTemplateColumns: {},\n gridTemplateRows: {},\n gridTemplateAreas: {},\n gridArea: {},\n // positions\n position: {},\n zIndex: {\n themeKey: 'zIndex'\n },\n top: {},\n right: {},\n bottom: {},\n left: {},\n // shadows\n boxShadow: {\n themeKey: 'shadows'\n },\n // sizing\n width: {\n transform: sizingTransform\n },\n maxWidth: {\n style: maxWidth\n },\n minWidth: {\n transform: sizingTransform\n },\n height: {\n transform: sizingTransform\n },\n maxHeight: {\n transform: sizingTransform\n },\n minHeight: {\n transform: sizingTransform\n },\n boxSizing: {},\n // typography\n fontFamily: {\n themeKey: 'typography'\n },\n fontSize: {\n themeKey: 'typography'\n },\n fontStyle: {\n themeKey: 'typography'\n },\n fontWeight: {\n themeKey: 'typography'\n },\n letterSpacing: {},\n textTransform: {},\n lineHeight: {},\n textAlign: {},\n typography: {\n cssProperty: false,\n themeKey: 'typography'\n }\n};\nexport default defaultSxConfig;","import capitalize from '@mui/utils/capitalize';\nimport merge from '../merge';\nimport { getPath, getStyleValue as getValue } from '../style';\nimport { handleBreakpoints, createEmptyBreakpointObject, removeUnusedBreakpoints } from '../breakpoints';\nimport defaultSxConfig from './defaultSxConfig';\nfunction objectsHaveSameKeys(...objects) {\n const allKeys = objects.reduce((keys, object) => keys.concat(Object.keys(object)), []);\n const union = new Set(allKeys);\n return objects.every(object => union.size === Object.keys(object).length);\n}\nfunction callIfFn(maybeFn, arg) {\n return typeof maybeFn === 'function' ? maybeFn(arg) : maybeFn;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function unstable_createStyleFunctionSx() {\n function getThemeValue(prop, val, theme, config) {\n const props = {\n [prop]: val,\n theme\n };\n const options = config[prop];\n if (!options) {\n return {\n [prop]: val\n };\n }\n const {\n cssProperty = prop,\n themeKey,\n transform,\n style\n } = options;\n if (val == null) {\n return null;\n }\n\n // TODO v6: remove, see https://github.com/mui/material-ui/pull/38123\n if (themeKey === 'typography' && val === 'inherit') {\n return {\n [prop]: val\n };\n }\n const themeMapping = getPath(theme, themeKey) || {};\n if (style) {\n return style(props);\n }\n const styleFromPropValue = propValueFinal => {\n let value = getValue(themeMapping, transform, propValueFinal);\n if (propValueFinal === value && typeof propValueFinal === 'string') {\n // Haven't found value\n value = getValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize(propValueFinal)}`, propValueFinal);\n }\n if (cssProperty === false) {\n return value;\n }\n return {\n [cssProperty]: value\n };\n };\n return handleBreakpoints(props, val, styleFromPropValue);\n }\n function styleFunctionSx(props) {\n var _theme$unstable_sxCon;\n const {\n sx,\n theme = {}\n } = props || {};\n if (!sx) {\n return null; // Emotion & styled-components will neglect null\n }\n const config = (_theme$unstable_sxCon = theme.unstable_sxConfig) != null ? _theme$unstable_sxCon : defaultSxConfig;\n\n /*\n * Receive `sxInput` as object or callback\n * and then recursively check keys & values to create media query object styles.\n * (the result will be used in `styled`)\n */\n function traverse(sxInput) {\n let sxObject = sxInput;\n if (typeof sxInput === 'function') {\n sxObject = sxInput(theme);\n } else if (typeof sxInput !== 'object') {\n // value\n return sxInput;\n }\n if (!sxObject) {\n return null;\n }\n const emptyBreakpoints = createEmptyBreakpointObject(theme.breakpoints);\n const breakpointsKeys = Object.keys(emptyBreakpoints);\n let css = emptyBreakpoints;\n Object.keys(sxObject).forEach(styleKey => {\n const value = callIfFn(sxObject[styleKey], theme);\n if (value !== null && value !== undefined) {\n if (typeof value === 'object') {\n if (config[styleKey]) {\n css = merge(css, getThemeValue(styleKey, value, theme, config));\n } else {\n const breakpointsValues = handleBreakpoints({\n theme\n }, value, x => ({\n [styleKey]: x\n }));\n if (objectsHaveSameKeys(breakpointsValues, value)) {\n css[styleKey] = styleFunctionSx({\n sx: value,\n theme\n });\n } else {\n css = merge(css, breakpointsValues);\n }\n }\n } else {\n css = merge(css, getThemeValue(styleKey, value, theme, config));\n }\n }\n });\n return removeUnusedBreakpoints(breakpointsKeys, css);\n }\n return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);\n }\n return styleFunctionSx;\n}\nconst styleFunctionSx = unstable_createStyleFunctionSx();\nstyleFunctionSx.filterProps = ['sx'];\nexport default styleFunctionSx;","/**\n * A universal utility to style components with multiple color modes. Always use it from the theme object.\n * It works with:\n * - [Basic theme](https://mui.com/material-ui/customization/dark-mode/)\n * - [CSS theme variables](https://mui.com/material-ui/experimental-api/css-theme-variables/overview/)\n * - Zero-runtime engine\n *\n * Tips: Use an array over object spread and place `theme.applyStyles()` last.\n *\n * ✅ [{ background: '#e5e5e5' }, theme.applyStyles('dark', { background: '#1c1c1c' })]\n *\n * 🚫 { background: '#e5e5e5', ...theme.applyStyles('dark', { background: '#1c1c1c' })}\n *\n * @example\n * 1. using with `styled`:\n * ```jsx\n * const Component = styled('div')(({ theme }) => [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ]);\n * ```\n *\n * @example\n * 2. using with `sx` prop:\n * ```jsx\n * [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ]}\n * />\n * ```\n *\n * @example\n * 3. theming a component:\n * ```jsx\n * extendTheme({\n * components: {\n * MuiButton: {\n * styleOverrides: {\n * root: ({ theme }) => [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ],\n * },\n * }\n * }\n * })\n *```\n */\nexport default function applyStyles(key, styles) {\n // @ts-expect-error this is 'any' type\n const theme = this;\n if (theme.vars && typeof theme.getColorSchemeSelector === 'function') {\n // If CssVarsProvider is used as a provider,\n // returns '* :where([data-mui-color-scheme=\"light|dark\"]) &'\n const selector = theme.getColorSchemeSelector(key).replace(/(\\[[^\\]]+\\])/, '*:where($1)');\n return {\n [selector]: styles\n };\n }\n if (theme.palette.mode === key) {\n return styles;\n }\n return {};\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"breakpoints\", \"palette\", \"spacing\", \"shape\"];\nimport deepmerge from '@mui/utils/deepmerge';\nimport createBreakpoints from './createBreakpoints';\nimport shape from './shape';\nimport createSpacing from './createSpacing';\nimport styleFunctionSx from '../styleFunctionSx/styleFunctionSx';\nimport defaultSxConfig from '../styleFunctionSx/defaultSxConfig';\nimport applyStyles from './applyStyles';\nfunction createTheme(options = {}, ...args) {\n const {\n breakpoints: breakpointsInput = {},\n palette: paletteInput = {},\n spacing: spacingInput,\n shape: shapeInput = {}\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n const breakpoints = createBreakpoints(breakpointsInput);\n const spacing = createSpacing(spacingInput);\n let muiTheme = deepmerge({\n breakpoints,\n direction: 'ltr',\n components: {},\n // Inject component definitions.\n palette: _extends({\n mode: 'light'\n }, paletteInput),\n spacing,\n shape: _extends({}, shape, shapeInput)\n }, other);\n muiTheme.applyStyles = applyStyles;\n muiTheme = args.reduce((acc, argument) => deepmerge(acc, argument), muiTheme);\n muiTheme.unstable_sxConfig = _extends({}, defaultSxConfig, other == null ? void 0 : other.unstable_sxConfig);\n muiTheme.unstable_sx = function sx(props) {\n return styleFunctionSx({\n sx: props,\n theme: this\n });\n };\n return muiTheme;\n}\nexport default createTheme;","'use client';\n\nimport * as React from 'react';\nimport { ThemeContext } from '@mui/styled-engine';\nfunction isObjectEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction useTheme(defaultTheme = null) {\n const contextTheme = React.useContext(ThemeContext);\n return !contextTheme || isObjectEmpty(contextTheme) ? defaultTheme : contextTheme;\n}\nexport default useTheme;","'use client';\n\nimport createTheme from './createTheme';\nimport useThemeWithoutDefault from './useThemeWithoutDefault';\nexport const systemDefaultTheme = createTheme();\nfunction useTheme(defaultTheme = systemDefaultTheme) {\n return useThemeWithoutDefault(defaultTheme);\n}\nexport default useTheme;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"ownerState\"],\n _excluded2 = [\"variants\"],\n _excluded3 = [\"name\", \"slot\", \"skipVariantsResolver\", \"skipSx\", \"overridesResolver\"];\n/* eslint-disable no-underscore-dangle */\nimport styledEngineStyled, { internal_processStyles as processStyles } from '@mui/styled-engine';\nimport { isPlainObject } from '@mui/utils/deepmerge';\nimport capitalize from '@mui/utils/capitalize';\nimport getDisplayName from '@mui/utils/getDisplayName';\nimport createTheme from './createTheme';\nimport styleFunctionSx from './styleFunctionSx';\nfunction isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// https://github.com/emotion-js/emotion/blob/26ded6109fcd8ca9875cc2ce4564fee678a3f3c5/packages/styled/src/utils.js#L40\nfunction isStringTag(tag) {\n return typeof tag === 'string' &&\n // 96 is one less than the char code\n // for \"a\" so this is checking that\n // it's a lowercase character\n tag.charCodeAt(0) > 96;\n}\n\n// Update /system/styled/#api in case if this changes\nexport function shouldForwardProp(prop) {\n return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';\n}\nexport const systemDefaultTheme = createTheme();\nconst lowercaseFirstLetter = string => {\n if (!string) {\n return string;\n }\n return string.charAt(0).toLowerCase() + string.slice(1);\n};\nfunction resolveTheme({\n defaultTheme,\n theme,\n themeId\n}) {\n return isEmpty(theme) ? defaultTheme : theme[themeId] || theme;\n}\nfunction defaultOverridesResolver(slot) {\n if (!slot) {\n return null;\n }\n return (props, styles) => styles[slot];\n}\nfunction processStyleArg(callableStyle, _ref) {\n let {\n ownerState\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n const resolvedStylesArg = typeof callableStyle === 'function' ? callableStyle(_extends({\n ownerState\n }, props)) : callableStyle;\n if (Array.isArray(resolvedStylesArg)) {\n return resolvedStylesArg.flatMap(resolvedStyle => processStyleArg(resolvedStyle, _extends({\n ownerState\n }, props)));\n }\n if (!!resolvedStylesArg && typeof resolvedStylesArg === 'object' && Array.isArray(resolvedStylesArg.variants)) {\n const {\n variants = []\n } = resolvedStylesArg,\n otherStyles = _objectWithoutPropertiesLoose(resolvedStylesArg, _excluded2);\n let result = otherStyles;\n variants.forEach(variant => {\n let isMatch = true;\n if (typeof variant.props === 'function') {\n isMatch = variant.props(_extends({\n ownerState\n }, props, ownerState));\n } else {\n Object.keys(variant.props).forEach(key => {\n if ((ownerState == null ? void 0 : ownerState[key]) !== variant.props[key] && props[key] !== variant.props[key]) {\n isMatch = false;\n }\n });\n }\n if (isMatch) {\n if (!Array.isArray(result)) {\n result = [result];\n }\n result.push(typeof variant.style === 'function' ? variant.style(_extends({\n ownerState\n }, props, ownerState)) : variant.style);\n }\n });\n return result;\n }\n return resolvedStylesArg;\n}\nexport default function createStyled(input = {}) {\n const {\n themeId,\n defaultTheme = systemDefaultTheme,\n rootShouldForwardProp = shouldForwardProp,\n slotShouldForwardProp = shouldForwardProp\n } = input;\n const systemSx = props => {\n return styleFunctionSx(_extends({}, props, {\n theme: resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }))\n }));\n };\n systemSx.__mui_systemSx = true;\n return (tag, inputOptions = {}) => {\n // Filter out the `sx` style function from the previous styled component to prevent unnecessary styles generated by the composite components.\n processStyles(tag, styles => styles.filter(style => !(style != null && style.__mui_systemSx)));\n const {\n name: componentName,\n slot: componentSlot,\n skipVariantsResolver: inputSkipVariantsResolver,\n skipSx: inputSkipSx,\n // TODO v6: remove `lowercaseFirstLetter()` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot))\n } = inputOptions,\n options = _objectWithoutPropertiesLoose(inputOptions, _excluded3);\n\n // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.\n const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :\n // TODO v6: remove `Root` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n componentSlot && componentSlot !== 'Root' && componentSlot !== 'root' || false;\n const skipSx = inputSkipSx || false;\n let label;\n if (process.env.NODE_ENV !== 'production') {\n if (componentName) {\n // TODO v6: remove `lowercaseFirstLetter()` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n label = `${componentName}-${lowercaseFirstLetter(componentSlot || 'Root')}`;\n }\n }\n let shouldForwardPropOption = shouldForwardProp;\n\n // TODO v6: remove `Root` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n if (componentSlot === 'Root' || componentSlot === 'root') {\n shouldForwardPropOption = rootShouldForwardProp;\n } else if (componentSlot) {\n // any other slot specified\n shouldForwardPropOption = slotShouldForwardProp;\n } else if (isStringTag(tag)) {\n // for string (html) tag, preserve the behavior in emotion & styled-components.\n shouldForwardPropOption = undefined;\n }\n const defaultStyledResolver = styledEngineStyled(tag, _extends({\n shouldForwardProp: shouldForwardPropOption,\n label\n }, options));\n const transformStyleArg = stylesArg => {\n // On the server Emotion doesn't use React.forwardRef for creating components, so the created\n // component stays as a function. This condition makes sure that we do not interpolate functions\n // which are basically components used as a selectors.\n if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || isPlainObject(stylesArg)) {\n return props => processStyleArg(stylesArg, _extends({}, props, {\n theme: resolveTheme({\n theme: props.theme,\n defaultTheme,\n themeId\n })\n }));\n }\n return stylesArg;\n };\n const muiStyledResolver = (styleArg, ...expressions) => {\n let transformedStyleArg = transformStyleArg(styleArg);\n const expressionsWithDefaultTheme = expressions ? expressions.map(transformStyleArg) : [];\n if (componentName && overridesResolver) {\n expressionsWithDefaultTheme.push(props => {\n const theme = resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }));\n if (!theme.components || !theme.components[componentName] || !theme.components[componentName].styleOverrides) {\n return null;\n }\n const styleOverrides = theme.components[componentName].styleOverrides;\n const resolvedStyleOverrides = {};\n // TODO: v7 remove iteration and use `resolveStyleArg(styleOverrides[slot])` directly\n Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => {\n resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, _extends({}, props, {\n theme\n }));\n });\n return overridesResolver(props, resolvedStyleOverrides);\n });\n }\n if (componentName && !skipVariantsResolver) {\n expressionsWithDefaultTheme.push(props => {\n var _theme$components;\n const theme = resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }));\n const themeVariants = theme == null || (_theme$components = theme.components) == null || (_theme$components = _theme$components[componentName]) == null ? void 0 : _theme$components.variants;\n return processStyleArg({\n variants: themeVariants\n }, _extends({}, props, {\n theme\n }));\n });\n }\n if (!skipSx) {\n expressionsWithDefaultTheme.push(systemSx);\n }\n const numOfCustomFnsApplied = expressionsWithDefaultTheme.length - expressions.length;\n if (Array.isArray(styleArg) && numOfCustomFnsApplied > 0) {\n const placeholders = new Array(numOfCustomFnsApplied).fill('');\n // If the type is array, than we need to add placeholders in the template for the overrides, variants and the sx styles.\n transformedStyleArg = [...styleArg, ...placeholders];\n transformedStyleArg.raw = [...styleArg.raw, ...placeholders];\n }\n const Component = defaultStyledResolver(transformedStyleArg, ...expressionsWithDefaultTheme);\n if (process.env.NODE_ENV !== 'production') {\n let displayName;\n if (componentName) {\n displayName = `${componentName}${capitalize(componentSlot || '')}`;\n }\n if (displayName === undefined) {\n displayName = `Styled(${getDisplayName(tag)})`;\n }\n Component.displayName = displayName;\n }\n if (tag.muiName) {\n Component.muiName = tag.muiName;\n }\n return Component;\n };\n if (defaultStyledResolver.withConfig) {\n muiStyledResolver.withConfig = defaultStyledResolver.withConfig;\n }\n return muiStyledResolver;\n };\n}","import resolveProps from '@mui/utils/resolveProps';\nexport default function getThemeProps(params) {\n const {\n theme,\n name,\n props\n } = params;\n if (!theme || !theme.components || !theme.components[name] || !theme.components[name].defaultProps) {\n return props;\n }\n return resolveProps(theme.components[name].defaultProps, props);\n}","'use client';\n\nimport getThemeProps from './getThemeProps';\nimport useTheme from '../useTheme';\nexport default function useThemeProps({\n props,\n name,\n defaultTheme,\n themeId\n}) {\n let theme = useTheme(defaultTheme);\n if (themeId) {\n theme = theme[themeId] || theme;\n }\n const mergedProps = getThemeProps({\n theme,\n name,\n props\n });\n return mergedProps;\n}","import _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\n/* eslint-disable @typescript-eslint/naming-convention */\nimport clamp from '@mui/utils/clamp';\n/**\n * Returns a number whose value is limited to the given range.\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clampWrapper(value, min = 0, max = 1) {\n if (process.env.NODE_ENV !== 'production') {\n if (value < min || value > max) {\n console.error(`MUI: The value provided ${value} is out of range [${min}, ${max}].`);\n }\n }\n return clamp(value, min, max);\n}\n\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\nexport function hexToRgb(color) {\n color = color.slice(1);\n const re = new RegExp(`.{1,${color.length >= 6 ? 2 : 1}}`, 'g');\n let colors = color.match(re);\n if (colors && colors[0].length === 1) {\n colors = colors.map(n => n + n);\n }\n return colors ? `rgb${colors.length === 4 ? 'a' : ''}(${colors.map((n, index) => {\n return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n }).join(', ')})` : '';\n}\nfunction intToHex(int) {\n const hex = int.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n}\n\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\nexport function decomposeColor(color) {\n // Idempotent\n if (color.type) {\n return color;\n }\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n const marker = color.indexOf('(');\n const type = color.substring(0, marker);\n if (['rgb', 'rgba', 'hsl', 'hsla', 'color'].indexOf(type) === -1) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: Unsupported \\`${color}\\` color.\nThe following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().` : _formatMuiErrorMessage(9, color));\n }\n let values = color.substring(marker + 1, color.length - 1);\n let colorSpace;\n if (type === 'color') {\n values = values.split(' ');\n colorSpace = values.shift();\n if (values.length === 4 && values[3].charAt(0) === '/') {\n values[3] = values[3].slice(1);\n }\n if (['srgb', 'display-p3', 'a98-rgb', 'prophoto-rgb', 'rec-2020'].indexOf(colorSpace) === -1) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: unsupported \\`${colorSpace}\\` color space.\nThe following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.` : _formatMuiErrorMessage(10, colorSpace));\n }\n } else {\n values = values.split(',');\n }\n values = values.map(value => parseFloat(value));\n return {\n type,\n values,\n colorSpace\n };\n}\n\n/**\n * Returns a channel created from the input color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {string} - The channel for the color, that can be used in rgba or hsla colors\n */\nexport const colorChannel = color => {\n const decomposedColor = decomposeColor(color);\n return decomposedColor.values.slice(0, 3).map((val, idx) => decomposedColor.type.indexOf('hsl') !== -1 && idx !== 0 ? `${val}%` : val).join(' ');\n};\nexport const private_safeColorChannel = (color, warning) => {\n try {\n return colorChannel(color);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n};\n\n/**\n * Converts a color object with type and values to a string.\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla', 'color'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\nexport function recomposeColor(color) {\n const {\n type,\n colorSpace\n } = color;\n let {\n values\n } = color;\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map((n, i) => i < 3 ? parseInt(n, 10) : n);\n } else if (type.indexOf('hsl') !== -1) {\n values[1] = `${values[1]}%`;\n values[2] = `${values[2]}%`;\n }\n if (type.indexOf('color') !== -1) {\n values = `${colorSpace} ${values.join(' ')}`;\n } else {\n values = `${values.join(', ')}`;\n }\n return `${type}(${values})`;\n}\n\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\nexport function rgbToHex(color) {\n // Idempotent\n if (color.indexOf('#') === 0) {\n return color;\n }\n const {\n values\n } = decomposeColor(color);\n return `#${values.map((n, i) => intToHex(i === 3 ? Math.round(255 * n) : n)).join('')}`;\n}\n\n/**\n * Converts a color from hsl format to rgb format.\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\nexport function hslToRgb(color) {\n color = decomposeColor(color);\n const {\n values\n } = color;\n const h = values[0];\n const s = values[1] / 100;\n const l = values[2] / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n let type = 'rgb';\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n if (color.type === 'hsla') {\n type += 'a';\n rgb.push(values[3]);\n }\n return recomposeColor({\n type,\n values: rgb\n });\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\nexport function getLuminance(color) {\n color = decomposeColor(color);\n let rgb = color.type === 'hsl' || color.type === 'hsla' ? decomposeColor(hslToRgb(color)).values : color.values;\n rgb = rgb.map(val => {\n if (color.type !== 'color') {\n val /= 255; // normalized\n }\n return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4;\n });\n\n // Truncate at 3 digits\n return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\nexport function getContrastRatio(foreground, background) {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/**\n * Sets the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} value - value to set the alpha channel to in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function alpha(color, value) {\n color = decomposeColor(color);\n value = clampWrapper(value);\n if (color.type === 'rgb' || color.type === 'hsl') {\n color.type += 'a';\n }\n if (color.type === 'color') {\n color.values[3] = `/${value}`;\n } else {\n color.values[3] = value;\n }\n return recomposeColor(color);\n}\nexport function private_safeAlpha(color, value, warning) {\n try {\n return alpha(color, value);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Darkens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function darken(color, coefficient) {\n color = decomposeColor(color);\n coefficient = clampWrapper(coefficient);\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] *= 1 - coefficient;\n } else if (color.type.indexOf('rgb') !== -1 || color.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] *= 1 - coefficient;\n }\n }\n return recomposeColor(color);\n}\nexport function private_safeDarken(color, coefficient, warning) {\n try {\n return darken(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Lightens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function lighten(color, coefficient) {\n color = decomposeColor(color);\n coefficient = clampWrapper(coefficient);\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] += (100 - color.values[2]) * coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] += (255 - color.values[i]) * coefficient;\n }\n } else if (color.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] += (1 - color.values[i]) * coefficient;\n }\n }\n return recomposeColor(color);\n}\nexport function private_safeLighten(color, coefficient, warning) {\n try {\n return lighten(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function emphasize(color, coefficient = 0.15) {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\nexport function private_safeEmphasize(color, coefficient, warning) {\n try {\n return emphasize(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Blend a transparent overlay color with a background color, resulting in a single\n * RGB color.\n * @param {string} background - CSS color\n * @param {string} overlay - CSS color\n * @param {number} opacity - Opacity multiplier in the range 0 - 1\n * @param {number} [gamma=1.0] - Gamma correction factor. For gamma-correct blending, 2.2 is usual.\n */\nexport function blend(background, overlay, opacity, gamma = 1.0) {\n const blendChannel = (b, o) => Math.round((b ** (1 / gamma) * (1 - opacity) + o ** (1 / gamma) * opacity) ** gamma);\n const backgroundColor = decomposeColor(background);\n const overlayColor = decomposeColor(overlay);\n const rgb = [blendChannel(backgroundColor.values[0], overlayColor.values[0]), blendChannel(backgroundColor.values[1], overlayColor.values[1]), blendChannel(backgroundColor.values[2], overlayColor.values[2])];\n return recomposeColor({\n type: 'rgb',\n values: rgb\n });\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nexport default function createMixins(breakpoints, mixins) {\n return _extends({\n toolbar: {\n minHeight: 56,\n [breakpoints.up('xs')]: {\n '@media (orientation: landscape)': {\n minHeight: 48\n }\n },\n [breakpoints.up('sm')]: {\n minHeight: 64\n }\n }\n }, mixins);\n}","const common = {\n black: '#000',\n white: '#fff'\n};\nexport default common;","const grey = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n A100: '#f5f5f5',\n A200: '#eeeeee',\n A400: '#bdbdbd',\n A700: '#616161'\n};\nexport default grey;","const purple = {\n 50: '#f3e5f5',\n 100: '#e1bee7',\n 200: '#ce93d8',\n 300: '#ba68c8',\n 400: '#ab47bc',\n 500: '#9c27b0',\n 600: '#8e24aa',\n 700: '#7b1fa2',\n 800: '#6a1b9a',\n 900: '#4a148c',\n A100: '#ea80fc',\n A200: '#e040fb',\n A400: '#d500f9',\n A700: '#aa00ff'\n};\nexport default purple;","const red = {\n 50: '#ffebee',\n 100: '#ffcdd2',\n 200: '#ef9a9a',\n 300: '#e57373',\n 400: '#ef5350',\n 500: '#f44336',\n 600: '#e53935',\n 700: '#d32f2f',\n 800: '#c62828',\n 900: '#b71c1c',\n A100: '#ff8a80',\n A200: '#ff5252',\n A400: '#ff1744',\n A700: '#d50000'\n};\nexport default red;","const orange = {\n 50: '#fff3e0',\n 100: '#ffe0b2',\n 200: '#ffcc80',\n 300: '#ffb74d',\n 400: '#ffa726',\n 500: '#ff9800',\n 600: '#fb8c00',\n 700: '#f57c00',\n 800: '#ef6c00',\n 900: '#e65100',\n A100: '#ffd180',\n A200: '#ffab40',\n A400: '#ff9100',\n A700: '#ff6d00'\n};\nexport default orange;","const blue = {\n 50: '#e3f2fd',\n 100: '#bbdefb',\n 200: '#90caf9',\n 300: '#64b5f6',\n 400: '#42a5f5',\n 500: '#2196f3',\n 600: '#1e88e5',\n 700: '#1976d2',\n 800: '#1565c0',\n 900: '#0d47a1',\n A100: '#82b1ff',\n A200: '#448aff',\n A400: '#2979ff',\n A700: '#2962ff'\n};\nexport default blue;","const lightBlue = {\n 50: '#e1f5fe',\n 100: '#b3e5fc',\n 200: '#81d4fa',\n 300: '#4fc3f7',\n 400: '#29b6f6',\n 500: '#03a9f4',\n 600: '#039be5',\n 700: '#0288d1',\n 800: '#0277bd',\n 900: '#01579b',\n A100: '#80d8ff',\n A200: '#40c4ff',\n A400: '#00b0ff',\n A700: '#0091ea'\n};\nexport default lightBlue;","const green = {\n 50: '#e8f5e9',\n 100: '#c8e6c9',\n 200: '#a5d6a7',\n 300: '#81c784',\n 400: '#66bb6a',\n 500: '#4caf50',\n 600: '#43a047',\n 700: '#388e3c',\n 800: '#2e7d32',\n 900: '#1b5e20',\n A100: '#b9f6ca',\n A200: '#69f0ae',\n A400: '#00e676',\n A700: '#00c853'\n};\nexport default green;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\nconst _excluded = [\"mode\", \"contrastThreshold\", \"tonalOffset\"];\nimport { deepmerge } from '@mui/utils';\nimport { darken, getContrastRatio, lighten } from '@mui/system';\nimport common from '../colors/common';\nimport grey from '../colors/grey';\nimport purple from '../colors/purple';\nimport red from '../colors/red';\nimport orange from '../colors/orange';\nimport blue from '../colors/blue';\nimport lightBlue from '../colors/lightBlue';\nimport green from '../colors/green';\nexport const light = {\n // The colors used to style the text.\n text: {\n // The most important text.\n primary: 'rgba(0, 0, 0, 0.87)',\n // Secondary text.\n secondary: 'rgba(0, 0, 0, 0.6)',\n // Disabled text have even lower visual prominence.\n disabled: 'rgba(0, 0, 0, 0.38)'\n },\n // The color used to divide different elements.\n divider: 'rgba(0, 0, 0, 0.12)',\n // The background colors used to style the surfaces.\n // Consistency between these values is important.\n background: {\n paper: common.white,\n default: common.white\n },\n // The colors used to style the action elements.\n action: {\n // The color of an active action like an icon button.\n active: 'rgba(0, 0, 0, 0.54)',\n // The color of an hovered action.\n hover: 'rgba(0, 0, 0, 0.04)',\n hoverOpacity: 0.04,\n // The color of a selected action.\n selected: 'rgba(0, 0, 0, 0.08)',\n selectedOpacity: 0.08,\n // The color of a disabled action.\n disabled: 'rgba(0, 0, 0, 0.26)',\n // The background color of a disabled action.\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n disabledOpacity: 0.38,\n focus: 'rgba(0, 0, 0, 0.12)',\n focusOpacity: 0.12,\n activatedOpacity: 0.12\n }\n};\nexport const dark = {\n text: {\n primary: common.white,\n secondary: 'rgba(255, 255, 255, 0.7)',\n disabled: 'rgba(255, 255, 255, 0.5)',\n icon: 'rgba(255, 255, 255, 0.5)'\n },\n divider: 'rgba(255, 255, 255, 0.12)',\n background: {\n paper: '#121212',\n default: '#121212'\n },\n action: {\n active: common.white,\n hover: 'rgba(255, 255, 255, 0.08)',\n hoverOpacity: 0.08,\n selected: 'rgba(255, 255, 255, 0.16)',\n selectedOpacity: 0.16,\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n disabledOpacity: 0.38,\n focus: 'rgba(255, 255, 255, 0.12)',\n focusOpacity: 0.12,\n activatedOpacity: 0.24\n }\n};\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n const tonalOffsetLight = tonalOffset.light || tonalOffset;\n const tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n if (!intent[direction]) {\n if (intent.hasOwnProperty(shade)) {\n intent[direction] = intent[shade];\n } else if (direction === 'light') {\n intent.light = lighten(intent.main, tonalOffsetLight);\n } else if (direction === 'dark') {\n intent.dark = darken(intent.main, tonalOffsetDark);\n }\n }\n}\nfunction getDefaultPrimary(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: blue[200],\n light: blue[50],\n dark: blue[400]\n };\n }\n return {\n main: blue[700],\n light: blue[400],\n dark: blue[800]\n };\n}\nfunction getDefaultSecondary(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: purple[200],\n light: purple[50],\n dark: purple[400]\n };\n }\n return {\n main: purple[500],\n light: purple[300],\n dark: purple[700]\n };\n}\nfunction getDefaultError(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: red[500],\n light: red[300],\n dark: red[700]\n };\n }\n return {\n main: red[700],\n light: red[400],\n dark: red[800]\n };\n}\nfunction getDefaultInfo(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: lightBlue[400],\n light: lightBlue[300],\n dark: lightBlue[700]\n };\n }\n return {\n main: lightBlue[700],\n light: lightBlue[500],\n dark: lightBlue[900]\n };\n}\nfunction getDefaultSuccess(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: green[400],\n light: green[300],\n dark: green[700]\n };\n }\n return {\n main: green[800],\n light: green[500],\n dark: green[900]\n };\n}\nfunction getDefaultWarning(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: orange[400],\n light: orange[300],\n dark: orange[700]\n };\n }\n return {\n main: '#ed6c02',\n // closest to orange[800] that pass 3:1.\n light: orange[500],\n dark: orange[900]\n };\n}\nexport default function createPalette(palette) {\n const {\n mode = 'light',\n contrastThreshold = 3,\n tonalOffset = 0.2\n } = palette,\n other = _objectWithoutPropertiesLoose(palette, _excluded);\n const primary = palette.primary || getDefaultPrimary(mode);\n const secondary = palette.secondary || getDefaultSecondary(mode);\n const error = palette.error || getDefaultError(mode);\n const info = palette.info || getDefaultInfo(mode);\n const success = palette.success || getDefaultSuccess(mode);\n const warning = palette.warning || getDefaultWarning(mode);\n\n // Use the same logic as\n // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n function getContrastText(background) {\n const contrastText = getContrastRatio(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n if (process.env.NODE_ENV !== 'production') {\n const contrast = getContrastRatio(background, contrastText);\n if (contrast < 3) {\n console.error([`MUI: The contrast ratio of ${contrast}:1 for ${contrastText} on ${background}`, 'falls below the WCAG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n'));\n }\n }\n return contrastText;\n }\n const augmentColor = ({\n color,\n name,\n mainShade = 500,\n lightShade = 300,\n darkShade = 700\n }) => {\n color = _extends({}, color);\n if (!color.main && color[mainShade]) {\n color.main = color[mainShade];\n }\n if (!color.hasOwnProperty('main')) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: The color${name ? ` (${name})` : ''} provided to augmentColor(color) is invalid.\nThe color object needs to have a \\`main\\` property or a \\`${mainShade}\\` property.` : _formatMuiErrorMessage(11, name ? ` (${name})` : '', mainShade));\n }\n if (typeof color.main !== 'string') {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: The color${name ? ` (${name})` : ''} provided to augmentColor(color) is invalid.\n\\`color.main\\` should be a string, but \\`${JSON.stringify(color.main)}\\` was provided instead.\n\nDid you intend to use one of the following approaches?\n\nimport { green } from \"@mui/material/colors\";\n\nconst theme1 = createTheme({ palette: {\n primary: green,\n} });\n\nconst theme2 = createTheme({ palette: {\n primary: { main: green[500] },\n} });` : _formatMuiErrorMessage(12, name ? ` (${name})` : '', JSON.stringify(color.main)));\n }\n addLightOrDark(color, 'light', lightShade, tonalOffset);\n addLightOrDark(color, 'dark', darkShade, tonalOffset);\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n return color;\n };\n const modes = {\n dark,\n light\n };\n if (process.env.NODE_ENV !== 'production') {\n if (!modes[mode]) {\n console.error(`MUI: The palette mode \\`${mode}\\` is not supported.`);\n }\n }\n const paletteOutput = deepmerge(_extends({\n // A collection of common colors.\n common: _extends({}, common),\n // prevent mutable object.\n // The palette mode, can be light or dark.\n mode,\n // The colors used to represent primary interface elements for a user.\n primary: augmentColor({\n color: primary,\n name: 'primary'\n }),\n // The colors used to represent secondary interface elements for a user.\n secondary: augmentColor({\n color: secondary,\n name: 'secondary',\n mainShade: 'A400',\n lightShade: 'A200',\n darkShade: 'A700'\n }),\n // The colors used to represent interface elements that the user should be made aware of.\n error: augmentColor({\n color: error,\n name: 'error'\n }),\n // The colors used to represent potentially dangerous actions or important messages.\n warning: augmentColor({\n color: warning,\n name: 'warning'\n }),\n // The colors used to present information to the user that is neutral and not necessarily important.\n info: augmentColor({\n color: info,\n name: 'info'\n }),\n // The colors used to indicate the successful completion of an action that user triggered.\n success: augmentColor({\n color: success,\n name: 'success'\n }),\n // The grey colors.\n grey,\n // Used by `getContrastText()` to maximize the contrast between\n // the background and the text.\n contrastThreshold,\n // Takes a background color and returns the text color that maximizes the contrast.\n getContrastText,\n // Generate a rich color object.\n augmentColor,\n // Used by the functions below to shift a color's luminance by approximately\n // two indexes within its tonal palette.\n // E.g., shift from Red 500 to Red 300 or Red 700.\n tonalOffset\n }, modes[mode]), other);\n return paletteOutput;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"fontWeightBold\", \"htmlFontSize\", \"allVariants\", \"pxToRem\"];\nimport { deepmerge } from '@mui/utils';\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\nconst caseAllCaps = {\n textTransform: 'uppercase'\n};\nconst defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n\n/**\n * @see @link{https://m2.material.io/design/typography/the-type-system.html}\n * @see @link{https://m2.material.io/design/typography/understanding-typography.html}\n */\nexport default function createTypography(palette, typography) {\n const _ref = typeof typography === 'function' ? typography(palette) : typography,\n {\n fontFamily = defaultFontFamily,\n // The default font size of the Material Specification.\n fontSize = 14,\n // px\n fontWeightLight = 300,\n fontWeightRegular = 400,\n fontWeightMedium = 500,\n fontWeightBold = 700,\n // Tell MUI what's the font-size on the html element.\n // 16px is the default font-size used by browsers.\n htmlFontSize = 16,\n // Apply the CSS properties to all the variants.\n allVariants,\n pxToRem: pxToRem2\n } = _ref,\n other = _objectWithoutPropertiesLoose(_ref, _excluded);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof fontSize !== 'number') {\n console.error('MUI: `fontSize` is required to be a number.');\n }\n if (typeof htmlFontSize !== 'number') {\n console.error('MUI: `htmlFontSize` is required to be a number.');\n }\n }\n const coef = fontSize / 14;\n const pxToRem = pxToRem2 || (size => `${size / htmlFontSize * coef}rem`);\n const buildVariant = (fontWeight, size, lineHeight, letterSpacing, casing) => _extends({\n fontFamily,\n fontWeight,\n fontSize: pxToRem(size),\n // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n lineHeight\n }, fontFamily === defaultFontFamily ? {\n letterSpacing: `${round(letterSpacing / size)}em`\n } : {}, casing, allVariants);\n const variants = {\n h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps),\n // TODO v6: Remove handling of 'inherit' variant from the theme as it is already handled in Material UI's Typography component. Also, remember to remove the associated types.\n inherit: {\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n fontSize: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit'\n }\n };\n return deepmerge(_extends({\n htmlFontSize,\n pxToRem,\n fontFamily,\n fontSize,\n fontWeightLight,\n fontWeightRegular,\n fontWeightMedium,\n fontWeightBold\n }, variants), other, {\n clone: false // No need to clone deep\n });\n}","const shadowKeyUmbraOpacity = 0.2;\nconst shadowKeyPenumbraOpacity = 0.14;\nconst shadowAmbientShadowOpacity = 0.12;\nfunction createShadow(...px) {\n return [`${px[0]}px ${px[1]}px ${px[2]}px ${px[3]}px rgba(0,0,0,${shadowKeyUmbraOpacity})`, `${px[4]}px ${px[5]}px ${px[6]}px ${px[7]}px rgba(0,0,0,${shadowKeyPenumbraOpacity})`, `${px[8]}px ${px[9]}px ${px[10]}px ${px[11]}px rgba(0,0,0,${shadowAmbientShadowOpacity})`].join(',');\n}\n\n// Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\nconst shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\nexport default shadows;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"duration\", \"easing\", \"delay\"];\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nexport const easing = {\n // This is the most common easing curve.\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n // Objects enter the screen at full velocity from off-screen and\n // slowly decelerate to a resting point.\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n // The sharp curve is used by objects that may return to the screen at any time.\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n};\n\n// Follow https://m2.material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\nexport const duration = {\n shortest: 150,\n shorter: 200,\n short: 250,\n // most basic recommended timing\n standard: 300,\n // this is to be used in complex animations\n complex: 375,\n // recommended when something is entering screen\n enteringScreen: 225,\n // recommended when something is leaving screen\n leavingScreen: 195\n};\nfunction formatMs(milliseconds) {\n return `${Math.round(milliseconds)}ms`;\n}\nfunction getAutoHeightDuration(height) {\n if (!height) {\n return 0;\n }\n const constant = height / 36;\n\n // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10);\n}\nexport default function createTransitions(inputTransitions) {\n const mergedEasing = _extends({}, easing, inputTransitions.easing);\n const mergedDuration = _extends({}, duration, inputTransitions.duration);\n const create = (props = ['all'], options = {}) => {\n const {\n duration: durationOption = mergedDuration.standard,\n easing: easingOption = mergedEasing.easeInOut,\n delay = 0\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n if (process.env.NODE_ENV !== 'production') {\n const isString = value => typeof value === 'string';\n // IE11 support, replace with Number.isNaN\n // eslint-disable-next-line no-restricted-globals\n const isNumber = value => !isNaN(parseFloat(value));\n if (!isString(props) && !Array.isArray(props)) {\n console.error('MUI: Argument \"props\" must be a string or Array.');\n }\n if (!isNumber(durationOption) && !isString(durationOption)) {\n console.error(`MUI: Argument \"duration\" must be a number or a string but found ${durationOption}.`);\n }\n if (!isString(easingOption)) {\n console.error('MUI: Argument \"easing\" must be a string.');\n }\n if (!isNumber(delay) && !isString(delay)) {\n console.error('MUI: Argument \"delay\" must be a number or a string.');\n }\n if (typeof options !== 'object') {\n console.error(['MUI: Secong argument of transition.create must be an object.', \"Arguments should be either `create('prop1', options)` or `create(['prop1', 'prop2'], options)`\"].join('\\n'));\n }\n if (Object.keys(other).length !== 0) {\n console.error(`MUI: Unrecognized argument(s) [${Object.keys(other).join(',')}].`);\n }\n }\n return (Array.isArray(props) ? props : [props]).map(animatedProp => `${animatedProp} ${typeof durationOption === 'string' ? durationOption : formatMs(durationOption)} ${easingOption} ${typeof delay === 'string' ? delay : formatMs(delay)}`).join(',');\n };\n return _extends({\n getAutoHeightDuration,\n create\n }, inputTransitions, {\n easing: mergedEasing,\n duration: mergedDuration\n });\n}","// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nconst zIndex = {\n mobileStepper: 1000,\n fab: 1050,\n speedDial: 1050,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500\n};\nexport default zIndex;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\nconst _excluded = [\"breakpoints\", \"mixins\", \"spacing\", \"palette\", \"transitions\", \"typography\", \"shape\"];\nimport { deepmerge } from '@mui/utils';\nimport { createTheme as systemCreateTheme, unstable_defaultSxConfig as defaultSxConfig, unstable_styleFunctionSx as styleFunctionSx } from '@mui/system';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nimport createMixins from './createMixins';\nimport createPalette from './createPalette';\nimport createTypography from './createTypography';\nimport shadows from './shadows';\nimport createTransitions from './createTransitions';\nimport zIndex from './zIndex';\nfunction createTheme(options = {}, ...args) {\n const {\n mixins: mixinsInput = {},\n palette: paletteInput = {},\n transitions: transitionsInput = {},\n typography: typographyInput = {}\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n if (options.vars) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: \\`vars\\` is a private field used for CSS variables support.\nPlease use another name.` : _formatMuiErrorMessage(18));\n }\n const palette = createPalette(paletteInput);\n const systemTheme = systemCreateTheme(options);\n let muiTheme = deepmerge(systemTheme, {\n mixins: createMixins(systemTheme.breakpoints, mixinsInput),\n palette,\n // Don't use [...shadows] until you've verified its transpiled code is not invoking the iterator protocol.\n shadows: shadows.slice(),\n typography: createTypography(palette, typographyInput),\n transitions: createTransitions(transitionsInput),\n zIndex: _extends({}, zIndex)\n });\n muiTheme = deepmerge(muiTheme, other);\n muiTheme = args.reduce((acc, argument) => deepmerge(acc, argument), muiTheme);\n if (process.env.NODE_ENV !== 'production') {\n // TODO v6: Refactor to use globalStateClassesMapping from @mui/utils once `readOnly` state class is used in Rating component.\n const stateClasses = ['active', 'checked', 'completed', 'disabled', 'error', 'expanded', 'focused', 'focusVisible', 'required', 'selected'];\n const traverse = (node, component) => {\n let key;\n\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (key in node) {\n const child = node[key];\n if (stateClasses.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n if (process.env.NODE_ENV !== 'production') {\n const stateClass = generateUtilityClass('', key);\n console.error([`MUI: The \\`${component}\\` component increases ` + `the CSS specificity of the \\`${key}\\` internal state.`, 'You can not override it like this: ', JSON.stringify(node, null, 2), '', `Instead, you need to use the '&.${stateClass}' syntax:`, JSON.stringify({\n root: {\n [`&.${stateClass}`]: child\n }\n }, null, 2), '', 'https://mui.com/r/state-classes-guide'].join('\\n'));\n }\n // Remove the style to prevent global conflicts.\n node[key] = {};\n }\n }\n };\n Object.keys(muiTheme.components).forEach(component => {\n const styleOverrides = muiTheme.components[component].styleOverrides;\n if (styleOverrides && component.indexOf('Mui') === 0) {\n traverse(styleOverrides, component);\n }\n });\n }\n muiTheme.unstable_sxConfig = _extends({}, defaultSxConfig, other == null ? void 0 : other.unstable_sxConfig);\n muiTheme.unstable_sx = function sx(props) {\n return styleFunctionSx({\n sx: props,\n theme: this\n });\n };\n return muiTheme;\n}\nlet warnedOnce = false;\nexport function createMuiTheme(...args) {\n if (process.env.NODE_ENV !== 'production') {\n if (!warnedOnce) {\n warnedOnce = true;\n console.error(['MUI: the createMuiTheme function was renamed to createTheme.', '', \"You should use `import { createTheme } from '@mui/material/styles'`\"].join('\\n'));\n }\n }\n return createTheme(...args);\n}\nexport default createTheme;","'use client';\n\nimport createTheme from './createTheme';\nconst defaultTheme = createTheme();\nexport default defaultTheme;","export default '$$material';","'use client';\n\nimport { useThemeProps as systemUseThemeProps } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport default function useThemeProps({\n props,\n name\n}) {\n return systemUseThemeProps({\n props,\n name,\n defaultTheme,\n themeId: THEME_ID\n });\n}","'use client';\n\nimport { createStyled, shouldForwardProp } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport const rootShouldForwardProp = prop => shouldForwardProp(prop) && prop !== 'classes';\nexport const slotShouldForwardProp = shouldForwardProp;\nconst styled = createStyled({\n themeId: THEME_ID,\n defaultTheme,\n rootShouldForwardProp\n});\nexport default styled;","import generateUtilityClasses from '@mui/utils/generateUtilityClasses';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nexport function getSvgIconUtilityClass(slot) {\n return generateUtilityClass('MuiSvgIcon', slot);\n}\nconst svgIconClasses = generateUtilityClasses('MuiSvgIcon', ['root', 'colorPrimary', 'colorSecondary', 'colorAction', 'colorError', 'colorDisabled', 'fontSizeInherit', 'fontSizeSmall', 'fontSizeMedium', 'fontSizeLarge']);\nexport default svgIconClasses;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"children\", \"className\", \"color\", \"component\", \"fontSize\", \"htmlColor\", \"inheritViewBox\", \"titleAccess\", \"viewBox\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base/composeClasses';\nimport capitalize from '../utils/capitalize';\nimport useThemeProps from '../styles/useThemeProps';\nimport styled from '../styles/styled';\nimport { getSvgIconUtilityClass } from './svgIconClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst useUtilityClasses = ownerState => {\n const {\n color,\n fontSize,\n classes\n } = ownerState;\n const slots = {\n root: ['root', color !== 'inherit' && `color${capitalize(color)}`, `fontSize${capitalize(fontSize)}`]\n };\n return composeClasses(slots, getSvgIconUtilityClass, classes);\n};\nconst SvgIconRoot = styled('svg', {\n name: 'MuiSvgIcon',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.color !== 'inherit' && styles[`color${capitalize(ownerState.color)}`], styles[`fontSize${capitalize(ownerState.fontSize)}`]];\n }\n})(({\n theme,\n ownerState\n}) => {\n var _theme$transitions, _theme$transitions$cr, _theme$transitions2, _theme$typography, _theme$typography$pxT, _theme$typography2, _theme$typography2$px, _theme$typography3, _theme$typography3$px, _palette$ownerState$c, _palette, _palette2, _palette3;\n return {\n userSelect: 'none',\n width: '1em',\n height: '1em',\n display: 'inline-block',\n // the will define the property that has `currentColor`\n // e.g. heroicons uses fill=\"none\" and stroke=\"currentColor\"\n fill: ownerState.hasSvgAsChild ? undefined : 'currentColor',\n flexShrink: 0,\n transition: (_theme$transitions = theme.transitions) == null || (_theme$transitions$cr = _theme$transitions.create) == null ? void 0 : _theme$transitions$cr.call(_theme$transitions, 'fill', {\n duration: (_theme$transitions2 = theme.transitions) == null || (_theme$transitions2 = _theme$transitions2.duration) == null ? void 0 : _theme$transitions2.shorter\n }),\n fontSize: {\n inherit: 'inherit',\n small: ((_theme$typography = theme.typography) == null || (_theme$typography$pxT = _theme$typography.pxToRem) == null ? void 0 : _theme$typography$pxT.call(_theme$typography, 20)) || '1.25rem',\n medium: ((_theme$typography2 = theme.typography) == null || (_theme$typography2$px = _theme$typography2.pxToRem) == null ? void 0 : _theme$typography2$px.call(_theme$typography2, 24)) || '1.5rem',\n large: ((_theme$typography3 = theme.typography) == null || (_theme$typography3$px = _theme$typography3.pxToRem) == null ? void 0 : _theme$typography3$px.call(_theme$typography3, 35)) || '2.1875rem'\n }[ownerState.fontSize],\n // TODO v5 deprecate, v6 remove for sx\n color: (_palette$ownerState$c = (_palette = (theme.vars || theme).palette) == null || (_palette = _palette[ownerState.color]) == null ? void 0 : _palette.main) != null ? _palette$ownerState$c : {\n action: (_palette2 = (theme.vars || theme).palette) == null || (_palette2 = _palette2.action) == null ? void 0 : _palette2.active,\n disabled: (_palette3 = (theme.vars || theme).palette) == null || (_palette3 = _palette3.action) == null ? void 0 : _palette3.disabled,\n inherit: undefined\n }[ownerState.color]\n };\n});\nconst SvgIcon = /*#__PURE__*/React.forwardRef(function SvgIcon(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiSvgIcon'\n });\n const {\n children,\n className,\n color = 'inherit',\n component = 'svg',\n fontSize = 'medium',\n htmlColor,\n inheritViewBox = false,\n titleAccess,\n viewBox = '0 0 24 24'\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const hasSvgAsChild = /*#__PURE__*/React.isValidElement(children) && children.type === 'svg';\n const ownerState = _extends({}, props, {\n color,\n component,\n fontSize,\n instanceFontSize: inProps.fontSize,\n inheritViewBox,\n viewBox,\n hasSvgAsChild\n });\n const more = {};\n if (!inheritViewBox) {\n more.viewBox = viewBox;\n }\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/_jsxs(SvgIconRoot, _extends({\n as: component,\n className: clsx(classes.root, className),\n focusable: \"false\",\n color: htmlColor,\n \"aria-hidden\": titleAccess ? undefined : true,\n role: titleAccess ? 'img' : undefined,\n ref: ref\n }, more, other, hasSvgAsChild && children.props, {\n ownerState: ownerState,\n children: [hasSvgAsChild ? children.props.children : children, titleAccess ? /*#__PURE__*/_jsx(\"title\", {\n children: titleAccess\n }) : null]\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? SvgIcon.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * Node passed into the SVG element.\n */\n children: PropTypes.node,\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n /**\n * @ignore\n */\n className: PropTypes.string,\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).\n * You can use the `htmlColor` prop to apply a color attribute to the SVG element.\n * @default 'inherit'\n */\n color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['inherit', 'action', 'disabled', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n /**\n * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\n * @default 'medium'\n */\n fontSize: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['inherit', 'large', 'medium', 'small']), PropTypes.string]),\n /**\n * Applies a color attribute to the SVG element.\n */\n htmlColor: PropTypes.string,\n /**\n * If `true`, the root node will inherit the custom `component`'s viewBox and the `viewBox`\n * prop will be ignored.\n * Useful when you want to reference a custom `component` and have `SvgIcon` pass that\n * `component`'s viewBox to the root node.\n * @default false\n */\n inheritViewBox: PropTypes.bool,\n /**\n * The shape-rendering attribute. The behavior of the different options is described on the\n * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering).\n * If you are having issues with blurry icons you should investigate this prop.\n */\n shapeRendering: PropTypes.string,\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Provides a human-readable title for the element that contains it.\n * https://www.w3.org/TR/SVG-access/#Equivalent\n */\n titleAccess: PropTypes.string,\n /**\n * Allows you to redefine what the coordinates without units mean inside an SVG element.\n * For example, if the SVG element is 500 (width) by 200 (height),\n * and you pass viewBox=\"0 0 50 20\",\n * this means that the coordinates inside the SVG will go from the top left corner (0,0)\n * to bottom right (50,20) and each unit will be worth 10px.\n * @default '0 0 24 24'\n */\n viewBox: PropTypes.string\n} : void 0;\nSvgIcon.muiName = 'SvgIcon';\nexport default SvgIcon;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport SvgIcon from '../SvgIcon';\n\n/**\n * Private module reserved for @mui packages.\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default function createSvgIcon(path, displayName) {\n function Component(props, ref) {\n return /*#__PURE__*/_jsx(SvgIcon, _extends({\n \"data-testid\": `${displayName}Icon`,\n ref: ref\n }, props, {\n children: path\n }));\n }\n if (process.env.NODE_ENV !== 'production') {\n // Need to set `displayName` on the inner component for React.memo.\n // React prior to 16.14 ignores `displayName` on the wrapper.\n Component.displayName = `${displayName}Icon`;\n }\n Component.muiName = SvgIcon.muiName;\n return /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(Component));\n}","'use client';\n\nimport { unstable_ClassNameGenerator as ClassNameGenerator } from '@mui/base/ClassNameGenerator';\nexport { default as capitalize } from './capitalize';\nexport { default as createChainedFunction } from './createChainedFunction';\nexport { default as createSvgIcon } from './createSvgIcon';\nexport { default as debounce } from './debounce';\nexport { default as deprecatedPropType } from './deprecatedPropType';\nexport { default as isMuiElement } from './isMuiElement';\nexport { default as ownerDocument } from './ownerDocument';\nexport { default as ownerWindow } from './ownerWindow';\nexport { default as requirePropFactory } from './requirePropFactory';\nexport { default as setRef } from './setRef';\nexport { default as unstable_useEnhancedEffect } from './useEnhancedEffect';\nexport { default as unstable_useId } from './useId';\nexport { default as unsupportedProp } from './unsupportedProp';\nexport { default as useControlled } from './useControlled';\nexport { default as useEventCallback } from './useEventCallback';\nexport { default as useForkRef } from './useForkRef';\nexport { default as useIsFocusVisible } from './useIsFocusVisible';\n// TODO: remove this export once ClassNameGenerator is stable\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const unstable_ClassNameGenerator = {\n configure: generator => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(['MUI: `ClassNameGenerator` import from `@mui/material/utils` is outdated and might cause unexpected issues.', '', \"You should use `import { unstable_ClassNameGenerator } from '@mui/material/className'` instead\", '', 'The detail of the issue: https://github.com/mui/material-ui/issues/30011#issuecomment-1024993401', '', 'The updated documentation: https://mui.com/guides/classname-generator/'].join('\\n'));\n }\n ClassNameGenerator.configure(generator);\n }\n};","\"use strict\";\n'use client';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function () {\n return _utils.createSvgIcon;\n }\n});\nvar _utils = require(\"@mui/material/utils\");","\"use strict\";\n\"use client\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _default = exports.default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"m10 17 5-5-5-5z\"\n}), 'ArrowRight');","/**\n * Determines if a given element is a DOM element name (i.e. not a React component).\n */\nexport function isHostComponent(element) {\n return typeof element === 'string';\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport { isHostComponent } from './isHostComponent';\n\n/**\n * Type of the ownerState based on the type of an element it applies to.\n * This resolves to the provided OwnerState for React components and `undefined` for host components.\n * Falls back to `OwnerState | undefined` when the exact type can't be determined in development time.\n */\n\n/**\n * Appends the ownerState object to the props, merging with the existing one if necessary.\n *\n * @param elementType Type of the element that owns the `existingProps`. If the element is a DOM node or undefined, `ownerState` is not applied.\n * @param otherProps Props of the element.\n * @param ownerState\n */\nexport function appendOwnerState(elementType, otherProps, ownerState) {\n if (elementType === undefined || isHostComponent(elementType)) {\n return otherProps;\n }\n return _extends({}, otherProps, {\n ownerState: _extends({}, otherProps.ownerState, ownerState)\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst defaultContextValue = {\n disableDefaultClasses: false\n};\nconst ClassNameConfiguratorContext = /*#__PURE__*/React.createContext(defaultContextValue);\n/**\n * @ignore - internal hook.\n *\n * Wraps the `generateUtilityClass` function and controls how the classes are generated.\n * Currently it only affects whether the classes are applied or not.\n *\n * @returns Function to be called with the `generateUtilityClass` function specific to a component to generate the classes.\n */\nexport function useClassNamesOverride(generateUtilityClass) {\n const {\n disableDefaultClasses\n } = React.useContext(ClassNameConfiguratorContext);\n return slot => {\n if (disableDefaultClasses) {\n return '';\n }\n return generateUtilityClass(slot);\n };\n}\n\n/**\n * Allows to configure the components within to not apply any built-in classes.\n */\nexport function ClassNameConfigurator(props) {\n const {\n disableDefaultClasses,\n children\n } = props;\n const contextValue = React.useMemo(() => ({\n disableDefaultClasses: disableDefaultClasses != null ? disableDefaultClasses : false\n }), [disableDefaultClasses]);\n return /*#__PURE__*/_jsx(ClassNameConfiguratorContext.Provider, {\n value: contextValue,\n children: children\n });\n}","/**\n * Extracts event handlers from a given object.\n * A prop is considered an event handler if it is a function and its name starts with `on`.\n *\n * @param object An object to extract event handlers from.\n * @param excludeKeys An array of keys to exclude from the returned object.\n */\nexport function extractEventHandlers(object, excludeKeys = []) {\n if (object === undefined) {\n return {};\n }\n const result = {};\n Object.keys(object).filter(prop => prop.match(/^on[A-Z]/) && typeof object[prop] === 'function' && !excludeKeys.includes(prop)).forEach(prop => {\n result[prop] = object[prop];\n });\n return result;\n}","/**\n * If `componentProps` is a function, calls it with the provided `ownerState`.\n * Otherwise, just returns `componentProps`.\n */\nexport function resolveComponentProps(componentProps, ownerState, slotState) {\n if (typeof componentProps === 'function') {\n return componentProps(ownerState, slotState);\n }\n return componentProps;\n}","/**\n * Removes event handlers from the given object.\n * A field is considered an event handler if it is a function with a name beginning with `on`.\n *\n * @param object Object to remove event handlers from.\n * @returns Object with event handlers removed.\n */\nexport function omitEventHandlers(object) {\n if (object === undefined) {\n return {};\n }\n const result = {};\n Object.keys(object).filter(prop => !(prop.match(/^on[A-Z]/) && typeof object[prop] === 'function')).forEach(prop => {\n result[prop] = object[prop];\n });\n return result;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport clsx from 'clsx';\nimport { extractEventHandlers } from './extractEventHandlers';\nimport { omitEventHandlers } from './omitEventHandlers';\n/**\n * Merges the slot component internal props (usually coming from a hook)\n * with the externally provided ones.\n *\n * The merge order is (the latter overrides the former):\n * 1. The internal props (specified as a getter function to work with get*Props hook result)\n * 2. Additional props (specified internally on a Base UI component)\n * 3. External props specified on the owner component. These should only be used on a root slot.\n * 4. External props specified in the `slotProps.*` prop.\n * 5. The `className` prop - combined from all the above.\n * @param parameters\n * @returns\n */\nexport function mergeSlotProps(parameters) {\n const {\n getSlotProps,\n additionalProps,\n externalSlotProps,\n externalForwardedProps,\n className\n } = parameters;\n if (!getSlotProps) {\n // The simpler case - getSlotProps is not defined, so no internal event handlers are defined,\n // so we can simply merge all the props without having to worry about extracting event handlers.\n const joinedClasses = clsx(additionalProps == null ? void 0 : additionalProps.className, className, externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className);\n const mergedStyle = _extends({}, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);\n const props = _extends({}, additionalProps, externalForwardedProps, externalSlotProps);\n if (joinedClasses.length > 0) {\n props.className = joinedClasses;\n }\n if (Object.keys(mergedStyle).length > 0) {\n props.style = mergedStyle;\n }\n return {\n props,\n internalRef: undefined\n };\n }\n\n // In this case, getSlotProps is responsible for calling the external event handlers.\n // We don't need to include them in the merged props because of this.\n\n const eventHandlers = extractEventHandlers(_extends({}, externalForwardedProps, externalSlotProps));\n const componentsPropsWithoutEventHandlers = omitEventHandlers(externalSlotProps);\n const otherPropsWithoutEventHandlers = omitEventHandlers(externalForwardedProps);\n const internalSlotProps = getSlotProps(eventHandlers);\n\n // The order of classes is important here.\n // Emotion (that we use in libraries consuming Base UI) depends on this order\n // to properly override style. It requires the most important classes to be last\n // (see https://github.com/mui/material-ui/pull/33205) for the related discussion.\n const joinedClasses = clsx(internalSlotProps == null ? void 0 : internalSlotProps.className, additionalProps == null ? void 0 : additionalProps.className, className, externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className);\n const mergedStyle = _extends({}, internalSlotProps == null ? void 0 : internalSlotProps.style, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);\n const props = _extends({}, internalSlotProps, additionalProps, otherPropsWithoutEventHandlers, componentsPropsWithoutEventHandlers);\n if (joinedClasses.length > 0) {\n props.className = joinedClasses;\n }\n if (Object.keys(mergedStyle).length > 0) {\n props.style = mergedStyle;\n }\n return {\n props,\n internalRef: internalSlotProps.ref\n };\n}","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"elementType\", \"externalSlotProps\", \"ownerState\", \"skipResolvingSlotProps\"];\nimport { unstable_useForkRef as useForkRef } from '@mui/utils';\nimport { appendOwnerState } from './appendOwnerState';\nimport { mergeSlotProps } from './mergeSlotProps';\nimport { resolveComponentProps } from './resolveComponentProps';\n/**\n * @ignore - do not document.\n * Builds the props to be passed into the slot of an unstyled component.\n * It merges the internal props of the component with the ones supplied by the user, allowing to customize the behavior.\n * If the slot component is not a host component, it also merges in the `ownerState`.\n *\n * @param parameters.getSlotProps - A function that returns the props to be passed to the slot component.\n */\nexport function useSlotProps(parameters) {\n var _parameters$additiona;\n const {\n elementType,\n externalSlotProps,\n ownerState,\n skipResolvingSlotProps = false\n } = parameters,\n rest = _objectWithoutPropertiesLoose(parameters, _excluded);\n const resolvedComponentsProps = skipResolvingSlotProps ? {} : resolveComponentProps(externalSlotProps, ownerState);\n const {\n props: mergedProps,\n internalRef\n } = mergeSlotProps(_extends({}, rest, {\n externalSlotProps: resolvedComponentsProps\n }));\n const ref = useForkRef(internalRef, resolvedComponentsProps == null ? void 0 : resolvedComponentsProps.ref, (_parameters$additiona = parameters.additionalProps) == null ? void 0 : _parameters$additiona.ref);\n const props = appendOwnerState(elementType, _extends({}, mergedProps, {\n ref\n }), ownerState);\n return props;\n}","import { globalStateClasses } from '@mui/utils/generateUtilityClass';\nconst GLOBAL_CLASS_PREFIX = 'base';\nfunction buildStateClass(state) {\n return `${GLOBAL_CLASS_PREFIX}--${state}`;\n}\nfunction buildSlotClass(componentName, slot) {\n return `${GLOBAL_CLASS_PREFIX}-${componentName}-${slot}`;\n}\nexport function generateUtilityClass(componentName, slot) {\n const globalStateClass = globalStateClasses[slot];\n return globalStateClass ? buildStateClass(globalStateClass) : buildSlotClass(componentName, slot);\n}\nexport function isGlobalState(slot) {\n return globalStateClasses[slot] !== undefined;\n}","import { generateUtilityClass } from '../generateUtilityClass';\nexport function generateUtilityClasses(componentName, slots) {\n const result = {};\n slots.forEach(slot => {\n result[slot] = generateUtilityClass(componentName, slot);\n });\n return result;\n}","'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { exactProp, HTMLElementType, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useForkRef as useForkRef, unstable_setRef as setRef } from '@mui/utils';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction getContainer(container) {\n return typeof container === 'function' ? container() : container;\n}\n\n/**\n * Portals provide a first-class way to render children into a DOM node\n * that exists outside the DOM hierarchy of the parent component.\n *\n * Demos:\n *\n * - [Portal](https://mui.com/base-ui/react-portal/)\n *\n * API:\n *\n * - [Portal API](https://mui.com/base-ui/react-portal/components-api/#portal)\n */\nconst Portal = /*#__PURE__*/React.forwardRef(function Portal(props, forwardedRef) {\n const {\n children,\n container,\n disablePortal = false\n } = props;\n const [mountNode, setMountNode] = React.useState(null);\n // @ts-expect-error TODO upstream fix\n const handleRef = useForkRef( /*#__PURE__*/React.isValidElement(children) ? children.ref : null, forwardedRef);\n useEnhancedEffect(() => {\n if (!disablePortal) {\n setMountNode(getContainer(container) || document.body);\n }\n }, [container, disablePortal]);\n useEnhancedEffect(() => {\n if (mountNode && !disablePortal) {\n setRef(forwardedRef, mountNode);\n return () => {\n setRef(forwardedRef, null);\n };\n }\n return undefined;\n }, [forwardedRef, mountNode, disablePortal]);\n if (disablePortal) {\n if ( /*#__PURE__*/React.isValidElement(children)) {\n const newProps = {\n ref: handleRef\n };\n return /*#__PURE__*/React.cloneElement(children, newProps);\n }\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: children\n });\n }\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: mountNode ? /*#__PURE__*/ReactDOM.createPortal(children, mountNode) : mountNode\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Portal.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * The children to render into the `container`.\n */\n children: PropTypes.node,\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool\n} : void 0;\nif (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line\n Portal['propTypes' + ''] = exactProp(Portal.propTypes);\n}\nexport { Portal };","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { generateUtilityClass } from '../generateUtilityClass';\nimport { generateUtilityClasses } from '../generateUtilityClasses';\nconst COMPONENT_NAME = 'Popper';\nexport function getPopperUtilityClass(slot) {\n return generateUtilityClass(COMPONENT_NAME, slot);\n}\nexport const popperClasses = generateUtilityClasses(COMPONENT_NAME, ['root']);","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"anchorEl\", \"children\", \"direction\", \"disablePortal\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"slotProps\", \"slots\", \"TransitionProps\", \"ownerState\"],\n _excluded2 = [\"anchorEl\", \"children\", \"container\", \"direction\", \"disablePortal\", \"keepMounted\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"style\", \"transition\", \"slotProps\", \"slots\"];\nimport * as React from 'react';\nimport { chainPropTypes, HTMLElementType, refType, unstable_ownerDocument as ownerDocument, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useForkRef as useForkRef } from '@mui/utils';\nimport { createPopper } from '@popperjs/core';\nimport PropTypes from 'prop-types';\nimport { unstable_composeClasses as composeClasses } from '../composeClasses';\nimport { Portal } from '../Portal';\nimport { getPopperUtilityClass } from './popperClasses';\nimport { useSlotProps } from '../utils';\nimport { useClassNamesOverride } from '../utils/ClassNameConfigurator';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction flipPlacement(placement, direction) {\n if (direction === 'ltr') {\n return placement;\n }\n switch (placement) {\n case 'bottom-end':\n return 'bottom-start';\n case 'bottom-start':\n return 'bottom-end';\n case 'top-end':\n return 'top-start';\n case 'top-start':\n return 'top-end';\n default:\n return placement;\n }\n}\nfunction resolveAnchorEl(anchorEl) {\n return typeof anchorEl === 'function' ? anchorEl() : anchorEl;\n}\nfunction isHTMLElement(element) {\n return element.nodeType !== undefined;\n}\nfunction isVirtualElement(element) {\n return !isHTMLElement(element);\n}\nconst useUtilityClasses = () => {\n const slots = {\n root: ['root']\n };\n return composeClasses(slots, useClassNamesOverride(getPopperUtilityClass));\n};\nconst defaultPopperOptions = {};\nconst PopperTooltip = /*#__PURE__*/React.forwardRef(function PopperTooltip(props, forwardedRef) {\n var _slots$root;\n const {\n anchorEl,\n children,\n direction,\n disablePortal,\n modifiers,\n open,\n placement: initialPlacement,\n popperOptions,\n popperRef: popperRefProp,\n slotProps = {},\n slots = {},\n TransitionProps\n // @ts-ignore internal logic\n // prevent from spreading to DOM, it can come from the parent component e.g. Select.\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const tooltipRef = React.useRef(null);\n const ownRef = useForkRef(tooltipRef, forwardedRef);\n const popperRef = React.useRef(null);\n const handlePopperRef = useForkRef(popperRef, popperRefProp);\n const handlePopperRefRef = React.useRef(handlePopperRef);\n useEnhancedEffect(() => {\n handlePopperRefRef.current = handlePopperRef;\n }, [handlePopperRef]);\n React.useImperativeHandle(popperRefProp, () => popperRef.current, []);\n const rtlPlacement = flipPlacement(initialPlacement, direction);\n /**\n * placement initialized from prop but can change during lifetime if modifiers.flip.\n * modifiers.flip is essentially a flip for controlled/uncontrolled behavior\n */\n const [placement, setPlacement] = React.useState(rtlPlacement);\n const [resolvedAnchorElement, setResolvedAnchorElement] = React.useState(resolveAnchorEl(anchorEl));\n React.useEffect(() => {\n if (popperRef.current) {\n popperRef.current.forceUpdate();\n }\n });\n React.useEffect(() => {\n if (anchorEl) {\n setResolvedAnchorElement(resolveAnchorEl(anchorEl));\n }\n }, [anchorEl]);\n useEnhancedEffect(() => {\n if (!resolvedAnchorElement || !open) {\n return undefined;\n }\n const handlePopperUpdate = data => {\n setPlacement(data.placement);\n };\n if (process.env.NODE_ENV !== 'production') {\n if (resolvedAnchorElement && isHTMLElement(resolvedAnchorElement) && resolvedAnchorElement.nodeType === 1) {\n const box = resolvedAnchorElement.getBoundingClientRect();\n if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n }\n }\n }\n let popperModifiers = [{\n name: 'preventOverflow',\n options: {\n altBoundary: disablePortal\n }\n }, {\n name: 'flip',\n options: {\n altBoundary: disablePortal\n }\n }, {\n name: 'onUpdate',\n enabled: true,\n phase: 'afterWrite',\n fn: ({\n state\n }) => {\n handlePopperUpdate(state);\n }\n }];\n if (modifiers != null) {\n popperModifiers = popperModifiers.concat(modifiers);\n }\n if (popperOptions && popperOptions.modifiers != null) {\n popperModifiers = popperModifiers.concat(popperOptions.modifiers);\n }\n const popper = createPopper(resolvedAnchorElement, tooltipRef.current, _extends({\n placement: rtlPlacement\n }, popperOptions, {\n modifiers: popperModifiers\n }));\n handlePopperRefRef.current(popper);\n return () => {\n popper.destroy();\n handlePopperRefRef.current(null);\n };\n }, [resolvedAnchorElement, disablePortal, modifiers, open, popperOptions, rtlPlacement]);\n const childProps = {\n placement: placement\n };\n if (TransitionProps !== null) {\n childProps.TransitionProps = TransitionProps;\n }\n const classes = useUtilityClasses();\n const Root = (_slots$root = slots.root) != null ? _slots$root : 'div';\n const rootProps = useSlotProps({\n elementType: Root,\n externalSlotProps: slotProps.root,\n externalForwardedProps: other,\n additionalProps: {\n role: 'tooltip',\n ref: ownRef\n },\n ownerState: props,\n className: classes.root\n });\n return /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {\n children: typeof children === 'function' ? children(childProps) : children\n }));\n});\n\n/**\n * Poppers rely on the 3rd party library [Popper.js](https://popper.js.org/docs/v2/) for positioning.\n *\n * Demos:\n *\n * - [Popper](https://mui.com/base-ui/react-popper/)\n *\n * API:\n *\n * - [Popper API](https://mui.com/base-ui/react-popper/components-api/#popper)\n */\nconst Popper = /*#__PURE__*/React.forwardRef(function Popper(props, forwardedRef) {\n const {\n anchorEl,\n children,\n container: containerProp,\n direction = 'ltr',\n disablePortal = false,\n keepMounted = false,\n modifiers,\n open,\n placement = 'bottom',\n popperOptions = defaultPopperOptions,\n popperRef,\n style,\n transition = false,\n slotProps = {},\n slots = {}\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded2);\n const [exited, setExited] = React.useState(true);\n const handleEnter = () => {\n setExited(false);\n };\n const handleExited = () => {\n setExited(true);\n };\n if (!keepMounted && !open && (!transition || exited)) {\n return null;\n }\n\n // If the container prop is provided, use that\n // If the anchorEl prop is provided, use its parent body element as the container\n // If neither are provided let the Modal take care of choosing the container\n let container;\n if (containerProp) {\n container = containerProp;\n } else if (anchorEl) {\n const resolvedAnchorEl = resolveAnchorEl(anchorEl);\n container = resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) ? ownerDocument(resolvedAnchorEl).body : ownerDocument(null).body;\n }\n const display = !open && keepMounted && (!transition || exited) ? 'none' : undefined;\n const transitionProps = transition ? {\n in: open,\n onEnter: handleEnter,\n onExited: handleExited\n } : undefined;\n return /*#__PURE__*/_jsx(Portal, {\n disablePortal: disablePortal,\n container: container,\n children: /*#__PURE__*/_jsx(PopperTooltip, _extends({\n anchorEl: anchorEl,\n direction: direction,\n disablePortal: disablePortal,\n modifiers: modifiers,\n ref: forwardedRef,\n open: transition ? !exited : open,\n placement: placement,\n popperOptions: popperOptions,\n popperRef: popperRef,\n slotProps: slotProps,\n slots: slots\n }, other, {\n style: _extends({\n // Prevents scroll issue, waiting for Popper.js to add this style once initiated.\n position: 'fixed',\n // Fix Popper.js display issue\n top: 0,\n left: 0,\n display\n }, style),\n TransitionProps: transitionProps,\n children: children\n }))\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Popper.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/),\n * or a function that returns either.\n * It's used to set the position of the popper.\n * The return value will passed as the reference object of the Popper instance.\n */\n anchorEl: chainPropTypes(PropTypes.oneOfType([HTMLElementType, PropTypes.object, PropTypes.func]), props => {\n if (props.open) {\n const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);\n if (resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) && resolvedAnchorEl.nodeType === 1) {\n const box = resolvedAnchorEl.getBoundingClientRect();\n if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n }\n } else if (!resolvedAnchorEl || typeof resolvedAnchorEl.getBoundingClientRect !== 'function' || isVirtualElement(resolvedAnchorEl) && resolvedAnchorEl.contextElement != null && resolvedAnchorEl.contextElement.nodeType !== 1) {\n return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'It should be an HTML element instance or a virtualElement ', '(https://popper.js.org/docs/v2/virtual-elements/).'].join('\\n'));\n }\n }\n return null;\n }),\n /**\n * Popper render function or node.\n */\n children: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.node, PropTypes.func]),\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * Direction of the text.\n * @default 'ltr'\n */\n direction: PropTypes.oneOf(['ltr', 'rtl']),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool,\n /**\n * Always keep the children in the DOM.\n * This prop can be useful in SEO situation or\n * when you want to maximize the responsiveness of the Popper.\n * @default false\n */\n keepMounted: PropTypes.bool,\n /**\n * Popper.js is based on a \"plugin-like\" architecture,\n * most of its features are fully encapsulated \"modifiers\".\n *\n * A modifier is a function that is called each time Popper.js needs to\n * compute the position of the popper.\n * For this reason, modifiers should be very performant to avoid bottlenecks.\n * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/).\n */\n modifiers: PropTypes.arrayOf(PropTypes.shape({\n data: PropTypes.object,\n effect: PropTypes.func,\n enabled: PropTypes.bool,\n fn: PropTypes.func,\n name: PropTypes.any,\n options: PropTypes.object,\n phase: PropTypes.oneOf(['afterMain', 'afterRead', 'afterWrite', 'beforeMain', 'beforeRead', 'beforeWrite', 'main', 'read', 'write']),\n requires: PropTypes.arrayOf(PropTypes.string),\n requiresIfExists: PropTypes.arrayOf(PropTypes.string)\n })),\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool.isRequired,\n /**\n * Popper placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance.\n * @default {}\n */\n popperOptions: PropTypes.shape({\n modifiers: PropTypes.array,\n onFirstUpdate: PropTypes.func,\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n strategy: PropTypes.oneOf(['absolute', 'fixed'])\n }),\n /**\n * A ref that points to the used popper instance.\n */\n popperRef: refType,\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n slotProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n slots: PropTypes.shape({\n root: PropTypes.elementType\n }),\n /**\n * Help supporting a react-transition-group/Transition component.\n * @default false\n */\n transition: PropTypes.bool\n} : void 0;\nexport { Popper };","'use client';\n\nimport * as React from 'react';\nimport { useTheme as useThemeSystem } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport default function useTheme() {\n const theme = useThemeSystem(defaultTheme);\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useDebugValue(theme);\n }\n return theme[THEME_ID] || theme;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default {\n disabled: false\n};","import PropTypes from 'prop-types';\nexport var timeoutsShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.shape({\n enter: PropTypes.number,\n exit: PropTypes.number,\n appear: PropTypes.number\n}).isRequired]) : null;\nexport var classNamesShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.string, PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string,\n active: PropTypes.string\n}), PropTypes.shape({\n enter: PropTypes.string,\n enterDone: PropTypes.string,\n enterActive: PropTypes.string,\n exit: PropTypes.string,\n exitDone: PropTypes.string,\n exitActive: PropTypes.string\n})]) : null;","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * \n * {state => (\n * \n * )}\n * \n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","export const reflow = node => node.scrollTop;\nexport function getTransitionProps(props, options) {\n var _style$transitionDura, _style$transitionTimi;\n const {\n timeout,\n easing,\n style = {}\n } = props;\n return {\n duration: (_style$transitionDura = style.transitionDuration) != null ? _style$transitionDura : typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n easing: (_style$transitionTimi = style.transitionTimingFunction) != null ? _style$transitionTimi : typeof easing === 'object' ? easing[options.mode] : easing,\n delay: style.transitionDelay\n };\n}","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"addEndListener\", \"appear\", \"children\", \"easing\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"timeout\", \"TransitionComponent\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { elementAcceptingRef, unstable_useTimeout as useTimeout } from '@mui/utils';\nimport { Transition } from 'react-transition-group';\nimport useTheme from '../styles/useTheme';\nimport { getTransitionProps, reflow } from '../transitions/utils';\nimport useForkRef from '../utils/useForkRef';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction getScale(value) {\n return `scale(${value}, ${value ** 2})`;\n}\nconst styles = {\n entering: {\n opacity: 1,\n transform: getScale(1)\n },\n entered: {\n opacity: 1,\n transform: 'none'\n }\n};\n\n/*\n TODO v6: remove\n Conditionally apply a workaround for the CSS transition bug in Safari 15.4 / WebKit browsers.\n */\nconst isWebKit154 = typeof navigator !== 'undefined' && /^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent) && /(os |version\\/)15(.|_)4/i.test(navigator.userAgent);\n\n/**\n * The Grow transition is used by the [Tooltip](/material-ui/react-tooltip/) and\n * [Popover](/material-ui/react-popover/) components.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\nconst Grow = /*#__PURE__*/React.forwardRef(function Grow(props, ref) {\n const {\n addEndListener,\n appear = true,\n children,\n easing,\n in: inProp,\n onEnter,\n onEntered,\n onEntering,\n onExit,\n onExited,\n onExiting,\n style,\n timeout = 'auto',\n // eslint-disable-next-line react/prop-types\n TransitionComponent = Transition\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const timer = useTimeout();\n const autoTimeout = React.useRef();\n const theme = useTheme();\n const nodeRef = React.useRef(null);\n const handleRef = useForkRef(nodeRef, children.ref, ref);\n const normalizedTransitionCallback = callback => maybeIsAppearing => {\n if (callback) {\n const node = nodeRef.current;\n\n // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n if (maybeIsAppearing === undefined) {\n callback(node);\n } else {\n callback(node, maybeIsAppearing);\n }\n }\n };\n const handleEntering = normalizedTransitionCallback(onEntering);\n const handleEnter = normalizedTransitionCallback((node, isAppearing) => {\n reflow(node); // So the animation always start from the start.\n\n const {\n duration: transitionDuration,\n delay,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'enter'\n });\n let duration;\n if (timeout === 'auto') {\n duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n autoTimeout.current = duration;\n } else {\n duration = transitionDuration;\n }\n node.style.transition = [theme.transitions.create('opacity', {\n duration,\n delay\n }), theme.transitions.create('transform', {\n duration: isWebKit154 ? duration : duration * 0.666,\n delay,\n easing: transitionTimingFunction\n })].join(',');\n if (onEnter) {\n onEnter(node, isAppearing);\n }\n });\n const handleEntered = normalizedTransitionCallback(onEntered);\n const handleExiting = normalizedTransitionCallback(onExiting);\n const handleExit = normalizedTransitionCallback(node => {\n const {\n duration: transitionDuration,\n delay,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'exit'\n });\n let duration;\n if (timeout === 'auto') {\n duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n autoTimeout.current = duration;\n } else {\n duration = transitionDuration;\n }\n node.style.transition = [theme.transitions.create('opacity', {\n duration,\n delay\n }), theme.transitions.create('transform', {\n duration: isWebKit154 ? duration : duration * 0.666,\n delay: isWebKit154 ? delay : delay || duration * 0.333,\n easing: transitionTimingFunction\n })].join(',');\n node.style.opacity = 0;\n node.style.transform = getScale(0.75);\n if (onExit) {\n onExit(node);\n }\n });\n const handleExited = normalizedTransitionCallback(onExited);\n const handleAddEndListener = next => {\n if (timeout === 'auto') {\n timer.start(autoTimeout.current || 0, next);\n }\n if (addEndListener) {\n // Old call signature before `react-transition-group` implemented `nodeRef`\n addEndListener(nodeRef.current, next);\n }\n };\n return /*#__PURE__*/_jsx(TransitionComponent, _extends({\n appear: appear,\n in: inProp,\n nodeRef: nodeRef,\n onEnter: handleEnter,\n onEntered: handleEntered,\n onEntering: handleEntering,\n onExit: handleExit,\n onExited: handleExited,\n onExiting: handleExiting,\n addEndListener: handleAddEndListener,\n timeout: timeout === 'auto' ? null : timeout\n }, other, {\n children: (state, childProps) => {\n return /*#__PURE__*/React.cloneElement(children, _extends({\n style: _extends({\n opacity: 0,\n transform: getScale(0.75),\n visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n }, styles[state], style, children.props.style),\n ref: handleRef\n }, childProps));\n }\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Grow.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * Add a custom transition end trigger. Called with the transitioning DOM\n * node and a done callback. Allows for more fine grained transition end\n * logic. Note: Timeouts are still used as a fallback if provided.\n */\n addEndListener: PropTypes.func,\n /**\n * Perform the enter transition when it first mounts if `in` is also `true`.\n * Set this to `false` to disable this behavior.\n * @default true\n */\n appear: PropTypes.bool,\n /**\n * A single child content element.\n */\n children: elementAcceptingRef.isRequired,\n /**\n * The transition timing function.\n * You may specify a single easing or a object containing enter and exit values.\n */\n easing: PropTypes.oneOfType([PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string\n }), PropTypes.string]),\n /**\n * If `true`, the component will transition in.\n */\n in: PropTypes.bool,\n /**\n * @ignore\n */\n onEnter: PropTypes.func,\n /**\n * @ignore\n */\n onEntered: PropTypes.func,\n /**\n * @ignore\n */\n onEntering: PropTypes.func,\n /**\n * @ignore\n */\n onExit: PropTypes.func,\n /**\n * @ignore\n */\n onExited: PropTypes.func,\n /**\n * @ignore\n */\n onExiting: PropTypes.func,\n /**\n * @ignore\n */\n style: PropTypes.object,\n /**\n * The duration for the transition, in milliseconds.\n * You may specify a single timeout for all transitions, or individually with an object.\n *\n * Set to 'auto' to automatically calculate transition time based on height.\n * @default 'auto'\n */\n timeout: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number, PropTypes.shape({\n appear: PropTypes.number,\n enter: PropTypes.number,\n exit: PropTypes.number\n })])\n} : void 0;\nGrow.muiSupportAuto = true;\nexport default Grow;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"anchorEl\", \"component\", \"components\", \"componentsProps\", \"container\", \"disablePortal\", \"keepMounted\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"transition\", \"slots\", \"slotProps\"];\nimport { Popper as BasePopper } from '@mui/base/Popper';\nimport { useThemeWithoutDefault as useTheme } from '@mui/system';\nimport { HTMLElementType, refType } from '@mui/utils';\nimport PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { styled, useThemeProps } from '../styles';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst PopperRoot = styled(BasePopper, {\n name: 'MuiPopper',\n slot: 'Root',\n overridesResolver: (props, styles) => styles.root\n})({});\n\n/**\n *\n * Demos:\n *\n * - [Autocomplete](https://mui.com/material-ui/react-autocomplete/)\n * - [Menu](https://mui.com/material-ui/react-menu/)\n * - [Popper](https://mui.com/material-ui/react-popper/)\n *\n * API:\n *\n * - [Popper API](https://mui.com/material-ui/api/popper/)\n */\nconst Popper = /*#__PURE__*/React.forwardRef(function Popper(inProps, ref) {\n var _slots$root;\n const theme = useTheme();\n const props = useThemeProps({\n props: inProps,\n name: 'MuiPopper'\n });\n const {\n anchorEl,\n component,\n components,\n componentsProps,\n container,\n disablePortal,\n keepMounted,\n modifiers,\n open,\n placement,\n popperOptions,\n popperRef,\n transition,\n slots,\n slotProps\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const RootComponent = (_slots$root = slots == null ? void 0 : slots.root) != null ? _slots$root : components == null ? void 0 : components.Root;\n const otherProps = _extends({\n anchorEl,\n container,\n disablePortal,\n keepMounted,\n modifiers,\n open,\n placement,\n popperOptions,\n popperRef,\n transition\n }, other);\n return /*#__PURE__*/_jsx(PopperRoot, _extends({\n as: component,\n direction: theme == null ? void 0 : theme.direction,\n slots: {\n root: RootComponent\n },\n slotProps: slotProps != null ? slotProps : componentsProps\n }, otherProps, {\n ref: ref\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Popper.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/),\n * or a function that returns either.\n * It's used to set the position of the popper.\n * The return value will passed as the reference object of the Popper instance.\n */\n anchorEl: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.object, PropTypes.func]),\n /**\n * Popper render function or node.\n */\n children: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.node, PropTypes.func]),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n components: PropTypes.shape({\n Root: PropTypes.elementType\n }),\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n componentsProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool,\n /**\n * Always keep the children in the DOM.\n * This prop can be useful in SEO situation or\n * when you want to maximize the responsiveness of the Popper.\n * @default false\n */\n keepMounted: PropTypes.bool,\n /**\n * Popper.js is based on a \"plugin-like\" architecture,\n * most of its features are fully encapsulated \"modifiers\".\n *\n * A modifier is a function that is called each time Popper.js needs to\n * compute the position of the popper.\n * For this reason, modifiers should be very performant to avoid bottlenecks.\n * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/).\n */\n modifiers: PropTypes.arrayOf(PropTypes.shape({\n data: PropTypes.object,\n effect: PropTypes.func,\n enabled: PropTypes.bool,\n fn: PropTypes.func,\n name: PropTypes.any,\n options: PropTypes.object,\n phase: PropTypes.oneOf(['afterMain', 'afterRead', 'afterWrite', 'beforeMain', 'beforeRead', 'beforeWrite', 'main', 'read', 'write']),\n requires: PropTypes.arrayOf(PropTypes.string),\n requiresIfExists: PropTypes.arrayOf(PropTypes.string)\n })),\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool.isRequired,\n /**\n * Popper placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance.\n * @default {}\n */\n popperOptions: PropTypes.shape({\n modifiers: PropTypes.array,\n onFirstUpdate: PropTypes.func,\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n strategy: PropTypes.oneOf(['absolute', 'fixed'])\n }),\n /**\n * A ref that points to the used popper instance.\n */\n popperRef: refType,\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n slotProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n slots: PropTypes.shape({\n root: PropTypes.elementType\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Help supporting a react-transition-group/Transition component.\n * @default false\n */\n transition: PropTypes.bool\n} : void 0;\nexport default Popper;","import generateUtilityClasses from '@mui/utils/generateUtilityClasses';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nexport function getTooltipUtilityClass(slot) {\n return generateUtilityClass('MuiTooltip', slot);\n}\nconst tooltipClasses = generateUtilityClasses('MuiTooltip', ['popper', 'popperInteractive', 'popperArrow', 'popperClose', 'tooltip', 'tooltipArrow', 'touch', 'tooltipPlacementLeft', 'tooltipPlacementRight', 'tooltipPlacementTop', 'tooltipPlacementBottom', 'arrow']);\nexport default tooltipClasses;","'use client';\n\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"arrow\", \"children\", \"classes\", \"components\", \"componentsProps\", \"describeChild\", \"disableFocusListener\", \"disableHoverListener\", \"disableInteractive\", \"disableTouchListener\", \"enterDelay\", \"enterNextDelay\", \"enterTouchDelay\", \"followCursor\", \"id\", \"leaveDelay\", \"leaveTouchDelay\", \"onClose\", \"onOpen\", \"open\", \"placement\", \"PopperComponent\", \"PopperProps\", \"slotProps\", \"slots\", \"title\", \"TransitionComponent\", \"TransitionProps\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { elementAcceptingRef, unstable_useTimeout as useTimeout, unstable_Timeout as Timeout } from '@mui/utils';\nimport { unstable_composeClasses as composeClasses, appendOwnerState } from '@mui/base';\nimport { alpha } from '@mui/system';\nimport styled from '../styles/styled';\nimport useTheme from '../styles/useTheme';\nimport useThemeProps from '../styles/useThemeProps';\nimport capitalize from '../utils/capitalize';\nimport Grow from '../Grow';\nimport Popper from '../Popper';\nimport useEventCallback from '../utils/useEventCallback';\nimport useForkRef from '../utils/useForkRef';\nimport useId from '../utils/useId';\nimport useIsFocusVisible from '../utils/useIsFocusVisible';\nimport useControlled from '../utils/useControlled';\nimport tooltipClasses, { getTooltipUtilityClass } from './tooltipClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n disableInteractive,\n arrow,\n touch,\n placement\n } = ownerState;\n const slots = {\n popper: ['popper', !disableInteractive && 'popperInteractive', arrow && 'popperArrow'],\n tooltip: ['tooltip', arrow && 'tooltipArrow', touch && 'touch', `tooltipPlacement${capitalize(placement.split('-')[0])}`],\n arrow: ['arrow']\n };\n return composeClasses(slots, getTooltipUtilityClass, classes);\n};\nconst TooltipPopper = styled(Popper, {\n name: 'MuiTooltip',\n slot: 'Popper',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.popper, !ownerState.disableInteractive && styles.popperInteractive, ownerState.arrow && styles.popperArrow, !ownerState.open && styles.popperClose];\n }\n})(({\n theme,\n ownerState,\n open\n}) => _extends({\n zIndex: (theme.vars || theme).zIndex.tooltip,\n pointerEvents: 'none'\n}, !ownerState.disableInteractive && {\n pointerEvents: 'auto'\n}, !open && {\n pointerEvents: 'none'\n}, ownerState.arrow && {\n [`&[data-popper-placement*=\"bottom\"] .${tooltipClasses.arrow}`]: {\n top: 0,\n marginTop: '-0.71em',\n '&::before': {\n transformOrigin: '0 100%'\n }\n },\n [`&[data-popper-placement*=\"top\"] .${tooltipClasses.arrow}`]: {\n bottom: 0,\n marginBottom: '-0.71em',\n '&::before': {\n transformOrigin: '100% 0'\n }\n },\n [`&[data-popper-placement*=\"right\"] .${tooltipClasses.arrow}`]: _extends({}, !ownerState.isRtl ? {\n left: 0,\n marginLeft: '-0.71em'\n } : {\n right: 0,\n marginRight: '-0.71em'\n }, {\n height: '1em',\n width: '0.71em',\n '&::before': {\n transformOrigin: '100% 100%'\n }\n }),\n [`&[data-popper-placement*=\"left\"] .${tooltipClasses.arrow}`]: _extends({}, !ownerState.isRtl ? {\n right: 0,\n marginRight: '-0.71em'\n } : {\n left: 0,\n marginLeft: '-0.71em'\n }, {\n height: '1em',\n width: '0.71em',\n '&::before': {\n transformOrigin: '0 0'\n }\n })\n}));\nconst TooltipTooltip = styled('div', {\n name: 'MuiTooltip',\n slot: 'Tooltip',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.tooltip, ownerState.touch && styles.touch, ownerState.arrow && styles.tooltipArrow, styles[`tooltipPlacement${capitalize(ownerState.placement.split('-')[0])}`]];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n backgroundColor: theme.vars ? theme.vars.palette.Tooltip.bg : alpha(theme.palette.grey[700], 0.92),\n borderRadius: (theme.vars || theme).shape.borderRadius,\n color: (theme.vars || theme).palette.common.white,\n fontFamily: theme.typography.fontFamily,\n padding: '4px 8px',\n fontSize: theme.typography.pxToRem(11),\n maxWidth: 300,\n margin: 2,\n wordWrap: 'break-word',\n fontWeight: theme.typography.fontWeightMedium\n}, ownerState.arrow && {\n position: 'relative',\n margin: 0\n}, ownerState.touch && {\n padding: '8px 16px',\n fontSize: theme.typography.pxToRem(14),\n lineHeight: `${round(16 / 14)}em`,\n fontWeight: theme.typography.fontWeightRegular\n}, {\n [`.${tooltipClasses.popper}[data-popper-placement*=\"left\"] &`]: _extends({\n transformOrigin: 'right center'\n }, !ownerState.isRtl ? _extends({\n marginRight: '14px'\n }, ownerState.touch && {\n marginRight: '24px'\n }) : _extends({\n marginLeft: '14px'\n }, ownerState.touch && {\n marginLeft: '24px'\n })),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"right\"] &`]: _extends({\n transformOrigin: 'left center'\n }, !ownerState.isRtl ? _extends({\n marginLeft: '14px'\n }, ownerState.touch && {\n marginLeft: '24px'\n }) : _extends({\n marginRight: '14px'\n }, ownerState.touch && {\n marginRight: '24px'\n })),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"top\"] &`]: _extends({\n transformOrigin: 'center bottom',\n marginBottom: '14px'\n }, ownerState.touch && {\n marginBottom: '24px'\n }),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"bottom\"] &`]: _extends({\n transformOrigin: 'center top',\n marginTop: '14px'\n }, ownerState.touch && {\n marginTop: '24px'\n })\n}));\nconst TooltipArrow = styled('span', {\n name: 'MuiTooltip',\n slot: 'Arrow',\n overridesResolver: (props, styles) => styles.arrow\n})(({\n theme\n}) => ({\n overflow: 'hidden',\n position: 'absolute',\n width: '1em',\n height: '0.71em' /* = width / sqrt(2) = (length of the hypotenuse) */,\n boxSizing: 'border-box',\n color: theme.vars ? theme.vars.palette.Tooltip.bg : alpha(theme.palette.grey[700], 0.9),\n '&::before': {\n content: '\"\"',\n margin: 'auto',\n display: 'block',\n width: '100%',\n height: '100%',\n backgroundColor: 'currentColor',\n transform: 'rotate(45deg)'\n }\n}));\nlet hystersisOpen = false;\nconst hystersisTimer = new Timeout();\nlet cursorPosition = {\n x: 0,\n y: 0\n};\nexport function testReset() {\n hystersisOpen = false;\n hystersisTimer.clear();\n}\nfunction composeEventHandler(handler, eventHandler) {\n return event => {\n if (eventHandler) {\n eventHandler(event);\n }\n handler(event);\n };\n}\n\n// TODO v6: Remove PopperComponent, PopperProps, TransitionComponent and TransitionProps.\nconst Tooltip = /*#__PURE__*/React.forwardRef(function Tooltip(inProps, ref) {\n var _ref, _slots$popper, _ref2, _ref3, _slots$transition, _ref4, _slots$tooltip, _ref5, _slots$arrow, _slotProps$popper, _ref6, _slotProps$popper2, _slotProps$transition, _slotProps$tooltip, _ref7, _slotProps$tooltip2, _slotProps$arrow, _ref8, _slotProps$arrow2;\n const props = useThemeProps({\n props: inProps,\n name: 'MuiTooltip'\n });\n const {\n arrow = false,\n children: childrenProp,\n components = {},\n componentsProps = {},\n describeChild = false,\n disableFocusListener = false,\n disableHoverListener = false,\n disableInteractive: disableInteractiveProp = false,\n disableTouchListener = false,\n enterDelay = 100,\n enterNextDelay = 0,\n enterTouchDelay = 700,\n followCursor = false,\n id: idProp,\n leaveDelay = 0,\n leaveTouchDelay = 1500,\n onClose,\n onOpen,\n open: openProp,\n placement = 'bottom',\n PopperComponent: PopperComponentProp,\n PopperProps = {},\n slotProps = {},\n slots = {},\n title,\n TransitionComponent: TransitionComponentProp = Grow,\n TransitionProps\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n // to prevent runtime errors, developers will need to provide a child as a React element anyway.\n const children = /*#__PURE__*/React.isValidElement(childrenProp) ? childrenProp : /*#__PURE__*/_jsx(\"span\", {\n children: childrenProp\n });\n const theme = useTheme();\n const isRtl = theme.direction === 'rtl';\n const [childNode, setChildNode] = React.useState();\n const [arrowRef, setArrowRef] = React.useState(null);\n const ignoreNonTouchEvents = React.useRef(false);\n const disableInteractive = disableInteractiveProp || followCursor;\n const closeTimer = useTimeout();\n const enterTimer = useTimeout();\n const leaveTimer = useTimeout();\n const touchTimer = useTimeout();\n const [openState, setOpenState] = useControlled({\n controlled: openProp,\n default: false,\n name: 'Tooltip',\n state: 'open'\n });\n let open = openState;\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {\n current: isControlled\n } = React.useRef(openProp !== undefined);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (childNode && childNode.disabled && !isControlled && title !== '' && childNode.tagName.toLowerCase() === 'button') {\n console.error(['MUI: You are providing a disabled `button` child to the Tooltip component.', 'A disabled element does not fire events.', \"Tooltip needs to listen to the child element's events to display the title.\", '', 'Add a simple wrapper element, such as a `span`.'].join('\\n'));\n }\n }, [title, childNode, isControlled]);\n }\n const id = useId(idProp);\n const prevUserSelect = React.useRef();\n const stopTouchInteraction = useEventCallback(() => {\n if (prevUserSelect.current !== undefined) {\n document.body.style.WebkitUserSelect = prevUserSelect.current;\n prevUserSelect.current = undefined;\n }\n touchTimer.clear();\n });\n React.useEffect(() => stopTouchInteraction, [stopTouchInteraction]);\n const handleOpen = event => {\n hystersisTimer.clear();\n hystersisOpen = true;\n\n // The mouseover event will trigger for every nested element in the tooltip.\n // We can skip rerendering when the tooltip is already open.\n // We are using the mouseover event instead of the mouseenter event to fix a hide/show issue.\n setOpenState(true);\n if (onOpen && !open) {\n onOpen(event);\n }\n };\n const handleClose = useEventCallback(\n /**\n * @param {React.SyntheticEvent | Event} event\n */\n event => {\n hystersisTimer.start(800 + leaveDelay, () => {\n hystersisOpen = false;\n });\n setOpenState(false);\n if (onClose && open) {\n onClose(event);\n }\n closeTimer.start(theme.transitions.duration.shortest, () => {\n ignoreNonTouchEvents.current = false;\n });\n });\n const handleEnter = event => {\n if (ignoreNonTouchEvents.current && event.type !== 'touchstart') {\n return;\n }\n\n // Remove the title ahead of time.\n // We don't want to wait for the next render commit.\n // We would risk displaying two tooltips at the same time (native + this one).\n if (childNode) {\n childNode.removeAttribute('title');\n }\n enterTimer.clear();\n leaveTimer.clear();\n if (enterDelay || hystersisOpen && enterNextDelay) {\n enterTimer.start(hystersisOpen ? enterNextDelay : enterDelay, () => {\n handleOpen(event);\n });\n } else {\n handleOpen(event);\n }\n };\n const handleLeave = event => {\n enterTimer.clear();\n leaveTimer.start(leaveDelay, () => {\n handleClose(event);\n });\n };\n const {\n isFocusVisibleRef,\n onBlur: handleBlurVisible,\n onFocus: handleFocusVisible,\n ref: focusVisibleRef\n } = useIsFocusVisible();\n // We don't necessarily care about the focusVisible state (which is safe to access via ref anyway).\n // We just need to re-render the Tooltip if the focus-visible state changes.\n const [, setChildIsFocusVisible] = React.useState(false);\n const handleBlur = event => {\n handleBlurVisible(event);\n if (isFocusVisibleRef.current === false) {\n setChildIsFocusVisible(false);\n handleLeave(event);\n }\n };\n const handleFocus = event => {\n // Workaround for https://github.com/facebook/react/issues/7769\n // The autoFocus of React might trigger the event before the componentDidMount.\n // We need to account for this eventuality.\n if (!childNode) {\n setChildNode(event.currentTarget);\n }\n handleFocusVisible(event);\n if (isFocusVisibleRef.current === true) {\n setChildIsFocusVisible(true);\n handleEnter(event);\n }\n };\n const detectTouchStart = event => {\n ignoreNonTouchEvents.current = true;\n const childrenProps = children.props;\n if (childrenProps.onTouchStart) {\n childrenProps.onTouchStart(event);\n }\n };\n const handleMouseOver = handleEnter;\n const handleMouseLeave = handleLeave;\n const handleTouchStart = event => {\n detectTouchStart(event);\n leaveTimer.clear();\n closeTimer.clear();\n stopTouchInteraction();\n prevUserSelect.current = document.body.style.WebkitUserSelect;\n // Prevent iOS text selection on long-tap.\n document.body.style.WebkitUserSelect = 'none';\n touchTimer.start(enterTouchDelay, () => {\n document.body.style.WebkitUserSelect = prevUserSelect.current;\n handleEnter(event);\n });\n };\n const handleTouchEnd = event => {\n if (children.props.onTouchEnd) {\n children.props.onTouchEnd(event);\n }\n stopTouchInteraction();\n leaveTimer.start(leaveTouchDelay, () => {\n handleClose(event);\n });\n };\n React.useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n /**\n * @param {KeyboardEvent} nativeEvent\n */\n function handleKeyDown(nativeEvent) {\n // IE11, Edge (prior to using Bink?) use 'Esc'\n if (nativeEvent.key === 'Escape' || nativeEvent.key === 'Esc') {\n handleClose(nativeEvent);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleClose, open]);\n const handleRef = useForkRef(children.ref, focusVisibleRef, setChildNode, ref);\n\n // There is no point in displaying an empty tooltip.\n // So we exclude all falsy values, except 0, which is valid.\n if (!title && title !== 0) {\n open = false;\n }\n const popperRef = React.useRef();\n const handleMouseMove = event => {\n const childrenProps = children.props;\n if (childrenProps.onMouseMove) {\n childrenProps.onMouseMove(event);\n }\n cursorPosition = {\n x: event.clientX,\n y: event.clientY\n };\n if (popperRef.current) {\n popperRef.current.update();\n }\n };\n const nameOrDescProps = {};\n const titleIsString = typeof title === 'string';\n if (describeChild) {\n nameOrDescProps.title = !open && titleIsString && !disableHoverListener ? title : null;\n nameOrDescProps['aria-describedby'] = open ? id : null;\n } else {\n nameOrDescProps['aria-label'] = titleIsString ? title : null;\n nameOrDescProps['aria-labelledby'] = open && !titleIsString ? id : null;\n }\n const childrenProps = _extends({}, nameOrDescProps, other, children.props, {\n className: clsx(other.className, children.props.className),\n onTouchStart: detectTouchStart,\n ref: handleRef\n }, followCursor ? {\n onMouseMove: handleMouseMove\n } : {});\n if (process.env.NODE_ENV !== 'production') {\n childrenProps['data-mui-internal-clone-element'] = true;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (childNode && !childNode.getAttribute('data-mui-internal-clone-element')) {\n console.error(['MUI: The `children` component of the Tooltip is not forwarding its props correctly.', 'Please make sure that props are spread on the same element that the ref is applied to.'].join('\\n'));\n }\n }, [childNode]);\n }\n const interactiveWrapperListeners = {};\n if (!disableTouchListener) {\n childrenProps.onTouchStart = handleTouchStart;\n childrenProps.onTouchEnd = handleTouchEnd;\n }\n if (!disableHoverListener) {\n childrenProps.onMouseOver = composeEventHandler(handleMouseOver, childrenProps.onMouseOver);\n childrenProps.onMouseLeave = composeEventHandler(handleMouseLeave, childrenProps.onMouseLeave);\n if (!disableInteractive) {\n interactiveWrapperListeners.onMouseOver = handleMouseOver;\n interactiveWrapperListeners.onMouseLeave = handleMouseLeave;\n }\n }\n if (!disableFocusListener) {\n childrenProps.onFocus = composeEventHandler(handleFocus, childrenProps.onFocus);\n childrenProps.onBlur = composeEventHandler(handleBlur, childrenProps.onBlur);\n if (!disableInteractive) {\n interactiveWrapperListeners.onFocus = handleFocus;\n interactiveWrapperListeners.onBlur = handleBlur;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (children.props.title) {\n console.error(['MUI: You have provided a `title` prop to the child of .', `Remove this title prop \\`${children.props.title}\\` or the Tooltip component.`].join('\\n'));\n }\n }\n const popperOptions = React.useMemo(() => {\n var _PopperProps$popperOp;\n let tooltipModifiers = [{\n name: 'arrow',\n enabled: Boolean(arrowRef),\n options: {\n element: arrowRef,\n padding: 4\n }\n }];\n if ((_PopperProps$popperOp = PopperProps.popperOptions) != null && _PopperProps$popperOp.modifiers) {\n tooltipModifiers = tooltipModifiers.concat(PopperProps.popperOptions.modifiers);\n }\n return _extends({}, PopperProps.popperOptions, {\n modifiers: tooltipModifiers\n });\n }, [arrowRef, PopperProps]);\n const ownerState = _extends({}, props, {\n isRtl,\n arrow,\n disableInteractive,\n placement,\n PopperComponentProp,\n touch: ignoreNonTouchEvents.current\n });\n const classes = useUtilityClasses(ownerState);\n const PopperComponent = (_ref = (_slots$popper = slots.popper) != null ? _slots$popper : components.Popper) != null ? _ref : TooltipPopper;\n const TransitionComponent = (_ref2 = (_ref3 = (_slots$transition = slots.transition) != null ? _slots$transition : components.Transition) != null ? _ref3 : TransitionComponentProp) != null ? _ref2 : Grow;\n const TooltipComponent = (_ref4 = (_slots$tooltip = slots.tooltip) != null ? _slots$tooltip : components.Tooltip) != null ? _ref4 : TooltipTooltip;\n const ArrowComponent = (_ref5 = (_slots$arrow = slots.arrow) != null ? _slots$arrow : components.Arrow) != null ? _ref5 : TooltipArrow;\n const popperProps = appendOwnerState(PopperComponent, _extends({}, PopperProps, (_slotProps$popper = slotProps.popper) != null ? _slotProps$popper : componentsProps.popper, {\n className: clsx(classes.popper, PopperProps == null ? void 0 : PopperProps.className, (_ref6 = (_slotProps$popper2 = slotProps.popper) != null ? _slotProps$popper2 : componentsProps.popper) == null ? void 0 : _ref6.className)\n }), ownerState);\n const transitionProps = appendOwnerState(TransitionComponent, _extends({}, TransitionProps, (_slotProps$transition = slotProps.transition) != null ? _slotProps$transition : componentsProps.transition), ownerState);\n const tooltipProps = appendOwnerState(TooltipComponent, _extends({}, (_slotProps$tooltip = slotProps.tooltip) != null ? _slotProps$tooltip : componentsProps.tooltip, {\n className: clsx(classes.tooltip, (_ref7 = (_slotProps$tooltip2 = slotProps.tooltip) != null ? _slotProps$tooltip2 : componentsProps.tooltip) == null ? void 0 : _ref7.className)\n }), ownerState);\n const tooltipArrowProps = appendOwnerState(ArrowComponent, _extends({}, (_slotProps$arrow = slotProps.arrow) != null ? _slotProps$arrow : componentsProps.arrow, {\n className: clsx(classes.arrow, (_ref8 = (_slotProps$arrow2 = slotProps.arrow) != null ? _slotProps$arrow2 : componentsProps.arrow) == null ? void 0 : _ref8.className)\n }), ownerState);\n return /*#__PURE__*/_jsxs(React.Fragment, {\n children: [/*#__PURE__*/React.cloneElement(children, childrenProps), /*#__PURE__*/_jsx(PopperComponent, _extends({\n as: PopperComponentProp != null ? PopperComponentProp : Popper,\n placement: placement,\n anchorEl: followCursor ? {\n getBoundingClientRect: () => ({\n top: cursorPosition.y,\n left: cursorPosition.x,\n right: cursorPosition.x,\n bottom: cursorPosition.y,\n width: 0,\n height: 0\n })\n } : childNode,\n popperRef: popperRef,\n open: childNode ? open : false,\n id: id,\n transition: true\n }, interactiveWrapperListeners, popperProps, {\n popperOptions: popperOptions,\n children: ({\n TransitionProps: TransitionPropsInner\n }) => /*#__PURE__*/_jsx(TransitionComponent, _extends({\n timeout: theme.transitions.duration.shorter\n }, TransitionPropsInner, transitionProps, {\n children: /*#__PURE__*/_jsxs(TooltipComponent, _extends({}, tooltipProps, {\n children: [title, arrow ? /*#__PURE__*/_jsx(ArrowComponent, _extends({}, tooltipArrowProps, {\n ref: setArrowRef\n })) : null]\n }))\n }))\n }))]\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Tooltip.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * If `true`, adds an arrow to the tooltip.\n * @default false\n */\n arrow: PropTypes.bool,\n /**\n * Tooltip reference element.\n */\n children: elementAcceptingRef.isRequired,\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n /**\n * @ignore\n */\n className: PropTypes.string,\n /**\n * The components used for each slot inside.\n *\n * This prop is an alias for the `slots` prop.\n * It's recommended to use the `slots` prop instead.\n *\n * @default {}\n */\n components: PropTypes.shape({\n Arrow: PropTypes.elementType,\n Popper: PropTypes.elementType,\n Tooltip: PropTypes.elementType,\n Transition: PropTypes.elementType\n }),\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n *\n * This prop is an alias for the `slotProps` prop.\n * It's recommended to use the `slotProps` prop instead, as `componentsProps` will be deprecated in the future.\n *\n * @default {}\n */\n componentsProps: PropTypes.shape({\n arrow: PropTypes.object,\n popper: PropTypes.object,\n tooltip: PropTypes.object,\n transition: PropTypes.object\n }),\n /**\n * Set to `true` if the `title` acts as an accessible description.\n * By default the `title` acts as an accessible label for the child.\n * @default false\n */\n describeChild: PropTypes.bool,\n /**\n * Do not respond to focus-visible events.\n * @default false\n */\n disableFocusListener: PropTypes.bool,\n /**\n * Do not respond to hover events.\n * @default false\n */\n disableHoverListener: PropTypes.bool,\n /**\n * Makes a tooltip not interactive, i.e. it will close when the user\n * hovers over the tooltip before the `leaveDelay` is expired.\n * @default false\n */\n disableInteractive: PropTypes.bool,\n /**\n * Do not respond to long press touch events.\n * @default false\n */\n disableTouchListener: PropTypes.bool,\n /**\n * The number of milliseconds to wait before showing the tooltip.\n * This prop won't impact the enter touch delay (`enterTouchDelay`).\n * @default 100\n */\n enterDelay: PropTypes.number,\n /**\n * The number of milliseconds to wait before showing the tooltip when one was already recently opened.\n * @default 0\n */\n enterNextDelay: PropTypes.number,\n /**\n * The number of milliseconds a user must touch the element before showing the tooltip.\n * @default 700\n */\n enterTouchDelay: PropTypes.number,\n /**\n * If `true`, the tooltip follow the cursor over the wrapped element.\n * @default false\n */\n followCursor: PropTypes.bool,\n /**\n * This prop is used to help implement the accessibility logic.\n * If you don't provide this prop. It falls back to a randomly generated id.\n */\n id: PropTypes.string,\n /**\n * The number of milliseconds to wait before hiding the tooltip.\n * This prop won't impact the leave touch delay (`leaveTouchDelay`).\n * @default 0\n */\n leaveDelay: PropTypes.number,\n /**\n * The number of milliseconds after the user stops touching an element before hiding the tooltip.\n * @default 1500\n */\n leaveTouchDelay: PropTypes.number,\n /**\n * Callback fired when the component requests to be closed.\n *\n * @param {React.SyntheticEvent} event The event source of the callback.\n */\n onClose: PropTypes.func,\n /**\n * Callback fired when the component requests to be open.\n *\n * @param {React.SyntheticEvent} event The event source of the callback.\n */\n onOpen: PropTypes.func,\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool,\n /**\n * Tooltip placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * The component used for the popper.\n * @default Popper\n */\n PopperComponent: PropTypes.elementType,\n /**\n * Props applied to the [`Popper`](/material-ui/api/popper/) element.\n * @default {}\n */\n PopperProps: PropTypes.object,\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n *\n * This prop is an alias for the `componentsProps` prop, which will be deprecated in the future.\n *\n * @default {}\n */\n slotProps: PropTypes.shape({\n arrow: PropTypes.object,\n popper: PropTypes.object,\n tooltip: PropTypes.object,\n transition: PropTypes.object\n }),\n /**\n * The components used for each slot inside.\n *\n * This prop is an alias for the `components` prop, which will be deprecated in the future.\n *\n * @default {}\n */\n slots: PropTypes.shape({\n arrow: PropTypes.elementType,\n popper: PropTypes.elementType,\n tooltip: PropTypes.elementType,\n transition: PropTypes.elementType\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Tooltip title. Zero-length titles string, undefined, null and false are never displayed.\n */\n title: PropTypes.node,\n /**\n * The component used for the transition.\n * [Follow this guide](/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n * @default Grow\n */\n TransitionComponent: PropTypes.elementType,\n /**\n * Props applied to the transition element.\n * By default, the element is based on this [`Transition`](http://reactcommunity.org/react-transition-group/transition/) component.\n */\n TransitionProps: PropTypes.object\n} : void 0;\nexport default Tooltip;","import '@/components/mui/menu-item.component.css';\nimport ArrowRightIcon from '@mui/icons-material/ArrowRight';\nimport {\n ListItemIcon as MuiListItemIcon,\n ListItemText as MuiListItemText,\n MenuItem as MuiMenuItem,\n} from '@mui/material';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Localized, ReferencedItem, SingleColumnMenu } from 'platform-bible-utils';\nimport { MouseEvent, PropsWithChildren } from 'react';\n\ntype MenuItemInfoBase = {\n /** Text (displayable in the UI) as the name of the menu item */\n label: string;\n /** Text to display when the mouse hovers over the menu item */\n tooltip?: string;\n};\n\nexport type Command = MenuItemInfoBase & {\n /** Command to execute (string.string) */\n command: string;\n};\n\ntype SubMenu = MenuItemInfoBase & {\n /** Command to execute (string.string) */\n items: MenuItemInfo[];\n};\n\nexport interface CommandHandler {\n (command: Command): void;\n}\n\nexport type MenuPropsBase = {\n /*\n * The JSON defining the menu whose items are to be rendered. This will typically be one of the\n * menus in the \"defs\" in a Platform.Bible menu (see PlatformMenus). The schema for this is\n * menuDocumentSchema (at the end of menus.model.ts). Note that while this is a\n * \"SingleColumnMenu\", somewhat bizarrely, a MultiColumnMenu is a SingleColumnMenu, so it really\n * could be a MultiColumnMenu, in which case, column had better be defined so it can be used\n * to filter out the actual groups and items to display on the column.\n */\n menuDefinition: Localized;\n\n commandHandler: CommandHandler;\n\n /**\n * Additional action to perform when any menu item is clicked. Allows the caller to handle event\n * (e.g., to close the menu).\n */\n onClick?: (event: MouseEvent) => void;\n};\n\nexport type MenuItemListProps = MenuPropsBase & {\n /** Optional unique (column) identifier */\n columnId?: ReferencedItem;\n};\n\nexport type MenuItemProps = Omit &\n PropsWithChildren<{\n /** Optional unique identifier */\n id?: string;\n\n onClick: (event: MouseEvent) => void;\n }>;\n\ntype MenuItemInfo = (Command | SubMenu) & {\n /**\n * If specified, menu item will be inset if it does not have a leading icon.\n *\n * @default true\n */\n allowForLeadingIcons?: boolean;\n /**\n * If specified, the path to the icon image to display on the leading side of the menu text.\n *\n * @default undefined (no leading icon will be shown)\n */\n iconPathBefore?: string;\n /**\n * If specified, the path to the icon image to display on the trailing side of the menu text.\n *\n * @default undefined (no trailing icon will be shown)\n */\n iconPathAfter?: string;\n /**\n * If true, list item is focused during the first mount\n *\n * @default false\n */\n hasAutoFocus?: boolean;\n\n /** Additional css classes to help with unique styling of the menu item */\n className?: string;\n\n /**\n * If true, the menu item will appear disabled and it will not respond to clicks or mouse hovers.\n *\n * @default false\n */\n isDisabled?: boolean;\n\n /**\n * If true, compact vertical padding designed for keyboard and mouse input is used.\n *\n * @default true\n */\n isDense?: boolean;\n\n /**\n * If true, a right-arrow icon will be displayed (iconPathAfter, if specified, will be ignored).\n *\n * @default false\n */\n isSubMenuParent?: boolean;\n\n /**\n * If true, the left and right padding is removed\n *\n * @default false\n */\n hasDisabledGutters?: boolean;\n\n /**\n * If true, a 1px light border is added to bottom of menu item\n *\n * @default false\n */\n hasDivider?: boolean;\n\n /** Help identify which element has keyboard focus */\n focusVisibleClassName?: string;\n\n /** If it's a submenu, it should have the items property */\n items?: MenuItemInfo[];\n};\n\nfunction getIcon(icon: string | undefined, menuLabel: string, leading: boolean) {\n return icon ? (\n \n {`${leading\n \n ) : undefined;\n}\n\nexport default function MenuItem(props: MenuItemProps) {\n const {\n onClick,\n label,\n tooltip,\n allowForLeadingIcons = true,\n iconPathBefore = undefined,\n iconPathAfter = undefined,\n hasAutoFocus = false,\n className,\n isDisabled = false,\n isDense = true,\n isSubMenuParent = false,\n hasDisabledGutters = false,\n hasDivider = false,\n focusVisibleClassName,\n id,\n children,\n } = props;\n\n const menuItem = (\n \n {label ? (\n <>\n {getIcon(iconPathBefore, label, true)}\n \n {isSubMenuParent ? (\n \n \n \n ) : (\n getIcon(iconPathAfter, label, false)\n )}\n \n ) : (\n children\n )}\n \n );\n\n return tooltip ? (\n \n
{menuItem}
\n
\n ) : (\n menuItem\n );\n}\n","import MenuItem, {\n MenuItemListProps,\n MenuItemProps,\n MenuPropsBase,\n} from '@/components/mui/menu-item.component';\nimport { Menu } from '@mui/material';\nimport {\n Localized,\n MenuGroupDetailsInSubMenu,\n MenuItemContainingCommand,\n MenuItemContainingSubmenu,\n OrderedExtensibleContainer,\n ReferencedItem,\n SingleColumnMenu,\n} from 'platform-bible-utils';\nimport { MouseEvent, useMemo, useState } from 'react';\n\n/**\n * All the exported types in this file should be regarded as \"internal\" (i.e., they should not be\n * exposed via index.ts).\n */\n\nexport type GroupedMenuPropsBase = MenuPropsBase & {\n /** Optional unique (column) identifier */\n columnId?: ReferencedItem;\n};\n\nexport type GroupedMenuItemListProps = MenuItemListProps & {\n /**\n * If the menuDefinition includes \"top-level\" groups (i.e., those that belong to a column as\n * opposed to those that belong to a submenu) that should not be included in the list, then this\n * array specifies which groups to include. Likewise, for a submenu, this list indicates which\n * groups are pertinent for that submenu. So then for a context menu this property need not be\n * specified since it is a top-level menu based on a \"true\" SingleColumnMenu (i.e., one that is\n * not a MultiColumnMenu).\n */\n includedGroups?: {\n id: string;\n group: Localized;\n }[];\n};\n\ninterface ItemInfo {\n item: Localized;\n isLastItemInGroup: boolean;\n}\n\ntype SubMenuProps = MenuPropsBase & {\n parentMenuItem: Localized;\n parentItemProps: Omit, 'iconPathAfter'>;\n};\n\nfunction getAllGroups(menuDefinition: Localized) {\n const groupEntries = Object.entries(menuDefinition.groups);\n // Convert array of entries to array of objects with id and group properties\n return groupEntries.map(([key, value]) => ({ id: key, group: value }));\n}\n\nfunction SubMenu(props: SubMenuProps) {\n const [anchorEl, setAnchorEl] = useState(undefined);\n\n const { parentMenuItem, parentItemProps, menuDefinition } = props;\n\n const handleParentMenuItemClick = (event: MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(undefined);\n };\n\n const renderSubMenuItems = () => {\n let includedGroups = getAllGroups(menuDefinition).filter((g) => 'menuItem' in g.group);\n\n // Ensure valid parent menu was provided. (If not, submenu will contain all groups!)\n if (!parentMenuItem?.id) throw new Error('A valid parent menu item is required for submenus.');\n\n // When laying out a submenu, only include groups associated with the provided parent menu.\n // Note: without the (annoying) redundant check that the included groups\n // have the menuItem field, TS doesn't think it exists.\n includedGroups = includedGroups.filter(\n (group) => 'menuItem' in group.group && group.group.menuItem === parentMenuItem.id,\n );\n\n return ;\n };\n\n return (\n <>\n \n \n {renderSubMenuItems()}\n \n \n );\n}\n\nconst getOrderedGroupItems = (\n groupId: string,\n allItems: Localized[],\n) => {\n // Filter items that belong to the specified group\n const itemsForGroup = allItems.filter((item) => item.group === groupId);\n // Sort items based on order\n const sortedItems = itemsForGroup.sort((a, b) => (a.order || 0) - (b.order || 0));\n return sortedItems;\n};\n\n/**\n * This component is internal; it does not need to be exposed to the outside world since it is not\n * useful on its own. It is used to generate and lay out the MenuItems that appear either on a\n * top-level menu (in a GridMenu or ContextMenu) or in a submenu.\n */\nexport default function GroupedMenuItemList(menuProps: GroupedMenuItemListProps) {\n const { menuDefinition, onClick, commandHandler, includedGroups } = menuProps;\n\n const { items, allowForLeadingIcons } = useMemo(() => {\n const groupsToInclude =\n includedGroups && includedGroups.length > 0\n ? includedGroups\n : // We're apparently laying out a single-column menu (presumably a context menu). In this\n // case, all groups should be included except ones that belong to a submenu.\n getAllGroups(menuDefinition).filter((g) => !('menuItem' in g.group));\n\n const sortedGroups = Object.values(groupsToInclude).sort(\n (a, b) => (a.group.order || 0) - (b.group.order || 0),\n );\n\n const itemArray: ItemInfo[] = [];\n\n sortedGroups.forEach((group) => {\n getOrderedGroupItems(group.id, menuDefinition.items).forEach((item) =>\n itemArray.push({ item, isLastItemInGroup: false }),\n );\n if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = true;\n });\n\n // No divider after last item in final group.\n if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = false;\n\n const allowSpaceForLeadingIcons = itemArray.some(\n (i) => 'iconPathBefore' in i.item && i.item.iconPathBefore,\n );\n\n return { items: itemArray, allowForLeadingIcons: allowSpaceForLeadingIcons };\n }, [includedGroups, menuDefinition]);\n\n // Create props for MenuItem component including setting hasDivider for the last item in a group\n const createMenuItemProps = ({ item, isLastItemInGroup }: ItemInfo) => {\n const menuItemProps = {\n className: 'papi-menu-item',\n label: item.label,\n tooltip: item.tooltip,\n iconPathBefore: 'iconPathBefore' in item ? item.iconPathBefore : undefined,\n iconPathAfter: 'iconPathAfter' in item ? item.iconPathAfter : undefined,\n hasDivider: isLastItemInGroup, // Set hasDivider to true for the last item in a group\n allowForLeadingIcons,\n };\n\n return menuItemProps;\n };\n\n const [firstItem] = items;\n\n if (!firstItem) return
;\n\n const divKey = firstItem.item.group;\n\n return (\n
\n {items.map((itemInfo, index) => {\n const { item } = itemInfo;\n const menuItemProps = createMenuItemProps(itemInfo);\n if ('command' in item) {\n const key = item.group + index;\n return (\n ) => {\n onClick?.(event);\n commandHandler(item);\n }}\n {...menuItemProps}\n />\n );\n }\n return (\n \n );\n })}\n
\n );\n}\n","import GroupedMenuItemList from '@/components/mui/grouped-menu-item-list.component';\nimport { MenuItemListProps } from '@/components/mui/menu-item.component';\nimport { MultiColumnMenu } from 'platform-bible-utils';\n\n/**\n * This component is internal; it does not need to be exposed to the outside world since it is not\n * useful on its own. Use either GridMenu or ContextMenu.\n */\nexport default function TopLevelMenu(props: MenuItemListProps) {\n const { menuDefinition, columnId } = props;\n\n const groupEntries = Object.entries(menuDefinition.groups);\n // Convert array of entries to array of objects with id and group properties\n const groups = groupEntries.map(([key, value]) => ({ id: key, group: value }));\n let includedGroups = groups.filter((g) => 'column' in g.group);\n\n // Check if column is provided and menuDefinition is a MultiColumnMenu\n if (\n columnId &&\n 'columns' in menuDefinition &&\n // Without this type assertion, TS doesn't know what columns is.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n (menuDefinition as MultiColumnMenu).columns[columnId]\n ) {\n // When laying out a single column in a MultiColumnMenu, only include groups associated with\n // the provided column. Note: without the (annoying) redundant check that the included groups\n // have the colum field, TS doesn't think it exists.\n includedGroups = includedGroups.filter(\n (g) => 'column' in g.group && g.group.column === columnId,\n );\n }\n\n return ;\n}\n","import '@/components/mui/grid-menu.component.css';\nimport { GroupedMenuPropsBase } from '@/components/mui/grouped-menu-item-list.component';\nimport { CommandHandler } from '@/components/mui/menu-item.component';\nimport TopLevelMenu from '@/components/mui/top-level-menu.component';\nimport { Grid, List } from '@mui/material';\nimport {\n Localized,\n MenuColumnWithHeader,\n MultiColumnMenu,\n ReferencedItem,\n} from 'platform-bible-utils';\nimport { useMemo } from 'react';\n\ntype ColumnInfo = {\n /*\n * The ID (`${string}.${string}`) of a specific menu column.\n */\n id: ReferencedItem;\n\n /*\n * Metadata (label, order, etc.) for a specific menu column.\n */\n metadata: Localized;\n};\n\ntype MenuColumnProps = ColumnInfo &\n GroupedMenuPropsBase & {\n /** Additional css classes to help with unique styling of the menu column */\n className?: string;\n };\n\nexport type GridMenuInfo = {\n /** The menu object containing information about the columns, groups, and items to display. */\n multiColumnMenu: Localized;\n};\n\nexport type GridMenuProps = GridMenuInfo & {\n /** Optional unique identifier */\n id?: string;\n\n commandHandler: CommandHandler;\n\n /** Additional css classes to help with unique styling of the grid menu */\n className?: string;\n};\n\nfunction MenuColumn({\n commandHandler,\n menuDefinition,\n id,\n metadata,\n onClick,\n className,\n}: MenuColumnProps) {\n return (\n \n

\n {metadata.label}\n

\n {/* It would seem as though this List component were unnecessary, since it only contains one\n thing, but the \"dense\" property does affect the layout of the items (in a way I don't fully\n understand). There might be a better way. */}\n \n \n \n \n );\n}\n\nexport default function GridMenu({\n commandHandler,\n className,\n multiColumnMenu,\n id,\n}: GridMenuProps) {\n const { columns } = multiColumnMenu;\n\n const sortedColumns = useMemo(() => {\n const columnNumbers = new Map();\n Object.getOwnPropertyNames(columns).forEach((columnName: string) => {\n // We know for sure there is a (boolean) property 'isExtensible' that we are not interested in.\n if (columnName === 'isExtensible') return;\n // TS doesn't allow `columnName` above to be a ReferencedItem even though the type says it is\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const columnId = columnName as ReferencedItem;\n const column = columns[columnId];\n // As of right now (and hopefully forever after), all remaining properties of the\n // ColumnsWithHeaders object are columns whose property names are the IDs of the columns.\n // This is an additional (redundant) sanity check. Specifically we're interested in\n // MenuColumnWithHeader objects, which TypeScript now \"knows\" we have, but at runtime all we\n // can check for is that it's an object with a valid numeric order field. That's likely good\n // enough.\n if (\n typeof column === 'object' &&\n typeof column.order === 'number' &&\n !Number.isNaN(column.order)\n )\n columnNumbers.set(column.order, { id: columnId, metadata: column });\n else\n console.warn(\n `Property ${columnName} (${typeof column}) on menu ${id} is not a valid column and is being ignored. This might indicate data corruption`,\n );\n });\n\n // Extract values and sort them based on the 'order' property\n return Array.from(columnNumbers.values()).sort((a, b) => {\n return (a.metadata.order || 0) - (b.metadata.order || 0);\n });\n }, [columns, id]);\n\n // We might need something like this if we need to be able to prevent empty columns\n // sortedColumns.filter((c) => multiColumnMenu.groups.some((g) => 'column' in g && (g as .column)...\n\n return (\n \n {sortedColumns.map((col, index) => (\n \n ))}\n \n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type UsePromiseOptions = {\n /**\n * Whether to leave the value as the most recent resolved promise value or set it back to\n * defaultValue while running the promise again. Defaults to true\n */\n preserveValue?: boolean;\n};\n\n/** Set up defaults for options for usePromise hook */\nfunction getUsePromiseOptionsDefaults(options: UsePromiseOptions): UsePromiseOptions {\n return {\n preserveValue: true,\n ...options,\n };\n}\n\n/**\n * Awaits a promise and returns a loading value while the promise is unresolved\n *\n * @param promiseFactoryCallback A function that returns the promise to await. If this callback is\n * undefined, the current value will be returned (defaultValue unless it was previously changed\n * and `options.preserveValue` is true), and there will be no loading.\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n * @param defaultValue The initial value to return while first awaiting the promise. If\n * `options.preserveValue` is false, this value is also shown while awaiting the promise on\n * subsequent calls.\n *\n * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks\n * to re-run with its new value. This means that, if the `promiseFactoryCallback` changes and\n * `options.preserveValue` is `false`, the returned value will be set to the current\n * `defaultValue`. However, the returned value will not be updated if`defaultValue` changes.\n * @param options Various options for adjusting how this hook runs the `promiseFactoryCallback`\n *\n * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks\n * to re-run with its new value. However, the latest `options.preserveValue` will always be used\n * appropriately to determine whether to preserve the returned value when changing the\n * `promiseFactoryCallback`\n * @returns `[value, isLoading]`\n *\n * - `value`: the current value for the promise, either the defaultValue or the resolved promise value\n * - `isLoading`: whether the promise is waiting to be resolved\n */\nconst usePromise = (\n promiseFactoryCallback: (() => Promise) | undefined,\n defaultValue: T,\n options: UsePromiseOptions = {},\n): [value: T, isLoading: boolean] => {\n // Use defaultValue as a ref so it doesn't update dependency arrays\n const defaultValueRef = useRef(defaultValue);\n defaultValueRef.current = defaultValue;\n // Use options as a ref so it doesn't update dependency arrays\n const optionsDefaultedRef = useRef(options);\n optionsDefaultedRef.current = getUsePromiseOptionsDefaults(optionsDefaultedRef.current);\n\n const [value, setValue] = useState(() => defaultValueRef.current);\n const [isLoading, setIsLoading] = useState(true);\n useEffect(() => {\n let promiseIsCurrent = true;\n // If a promiseFactoryCallback was provided, we are loading. Otherwise, there is no loading to do\n setIsLoading(!!promiseFactoryCallback);\n (async () => {\n // If there is a callback to run, run it\n if (promiseFactoryCallback) {\n const result = await promiseFactoryCallback();\n // If the promise was not already replaced, update the value\n if (promiseIsCurrent) {\n setValue(() => result);\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n // Mark this promise as old and not to be used\n promiseIsCurrent = false;\n if (!optionsDefaultedRef.current.preserveValue) setValue(() => defaultValueRef.current);\n };\n }, [promiseFactoryCallback]);\n\n return [value, isLoading];\n};\nexport default usePromise;\n","\"use client\";\n\nimport createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z\"\n}), 'Menu');","import GridMenu from '@/components/mui/grid-menu.component';\nimport { Command, CommandHandler } from '@/components/mui/menu-item.component';\nimport usePromise from '@/hooks/use-promise.hook';\nimport { Menu as MenuIcon } from '@mui/icons-material';\nimport { Drawer, IconButton } from '@mui/material';\nimport { Localized, MultiColumnMenu } from 'platform-bible-utils';\nimport {\n MouseEvent,\n MutableRefObject,\n PropsWithChildren,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\nexport interface MultiColumnMenuProvider {\n (isSupportAndDevelopment: boolean): Promise>;\n}\n\nexport type HamburgerMenuButtonProps = PropsWithChildren & {\n /** The handler to use for menu commands (and eventually toolbar commands). */\n commandHandler: CommandHandler;\n\n /**\n * Optional reference to the \"div\" container that determines the where the menu should appear. If\n * not defined, then (1,1) used.\n */\n containerRef?: MutableRefObject;\n\n /**\n * The delegate to use to get the menu data. If not specified or if it returns undefined, the data\n * in normalMenu or fullMenu property will be used.\n */\n menuProvider?: MultiColumnMenuProvider;\n\n /**\n * The menu data to show when the menu is opened if the menuProvider property is not defined.\n * (This allows for a default or test-only static menu to be used.)\n */\n normalMenu?: Localized;\n\n /**\n * The menu data to show for \"full\" menu (when opened with the SHIFT key pressed) if the\n * menuProvider property is not defined. (This allows for a default or test-only static menu to be\n * used.)\n */\n fullMenu?: Localized;\n\n /** Additional css class(es) to help with unique styling of the sub-components */\n className?: string;\n\n /** Value to use as prefix for ARIA labels on interactive sub-components */\n ariaLabelPrefix?: string;\n};\n\nexport default function HamburgerMenuButton({\n menuProvider,\n normalMenu,\n fullMenu,\n commandHandler,\n containerRef,\n className,\n ariaLabelPrefix,\n children,\n}: HamburgerMenuButtonProps) {\n const [isMenuOpen, setMenuOpen] = useState(false);\n const [showFullMenu, setShowFullMenu] = useState(false);\n\n const handleMenuItemClick = useCallback(() => {\n if (isMenuOpen) setMenuOpen(false);\n setShowFullMenu(false);\n }, [isMenuOpen]);\n\n const handleMenuButtonClick = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n setMenuOpen((prevIsOpen) => {\n const isOpening = !prevIsOpen;\n if (isOpening && e.shiftKey) setShowFullMenu(true);\n else if (!isOpening) setShowFullMenu(false);\n return isOpening;\n });\n }, []);\n\n const menuCommandHandler = useCallback(\n (command: Command) => {\n handleMenuItemClick();\n return commandHandler(command);\n },\n [commandHandler, handleMenuItemClick],\n );\n\n const [offset, setOffset] = useState({ top: 1, left: 1 });\n\n useEffect(() => {\n if (isMenuOpen) {\n const node = containerRef?.current;\n if (node) {\n const rect = node.getBoundingClientRect();\n const scrollTop = window.scrollY;\n const scrollLeft = window.scrollX;\n const top = rect.top + scrollTop + node.clientHeight;\n const left = rect.left + scrollLeft;\n setOffset({ top, left });\n }\n }\n }, [isMenuOpen, containerRef]);\n\n const [normalMenuData] = usePromise(\n useCallback(async () => {\n return menuProvider?.(false) ?? normalMenu;\n // isMenuOpen needs to be included for the menu contents to reevaluate when reopened\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menuProvider, normalMenu, isMenuOpen]),\n normalMenu,\n );\n\n const [fullMenuData] = usePromise(\n useCallback(async () => {\n return menuProvider?.(true) ?? fullMenu ?? normalMenuData;\n // isMenuOpen needs to be included for the menu contents to reevaluate when reopened\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menuProvider, fullMenu, normalMenuData, isMenuOpen]),\n fullMenu ?? normalMenuData,\n );\n\n const menu = showFullMenu && fullMenuData ? fullMenuData : normalMenuData;\n\n return (\n <>\n \n {children ?? }\n \n \n {menu ? (\n \n ) : undefined}\n \n \n );\n}\n","import '@/components/mui/icon-button.component.css';\nimport { IconButton as MuiIconButton } from '@mui/material';\nimport { MouseEventHandler, PropsWithChildren } from 'react';\n\nexport type IconButtonProps = PropsWithChildren<{\n /** Optional unique identifier */\n id?: string;\n /**\n * Required. Used as both the tooltip (aka, title) and the aria-label (used for accessibility,\n * testing, etc.), unless a distinct tooltip is supplied.\n */\n label: string;\n /**\n * Enabled status of button\n *\n * @default false\n */\n isDisabled?: boolean;\n /** Optional tooltip to display if different from the aria-label. */\n tooltip?: string;\n /** If true, no tooltip will be displayed. */\n isTooltipSuppressed?: boolean;\n /**\n * If given, uses a negative margin to counteract the padding on one side (this is often helpful\n * for aligning the left or right side of the icon with content above or below, without ruining\n * the border size and shape).\n *\n * @default false\n */\n adjustMarginToAlignToEdge?: 'end' | 'start' | false;\n /**\n * The size of the component. small is equivalent to the dense button styling.\n *\n * @default false\n */\n size: 'small' | 'medium' | 'large';\n /** Additional css classes to help with unique styling of the button */\n className?: string;\n /** Optional click handler */\n onClick?: MouseEventHandler;\n}>;\n\n/**\n * Iconic button a user can click to do something\n *\n * Thanks to MUI for heavy inspiration and documentation\n * https://mui.com/material-ui/getting-started/overview/\n */\nfunction IconButton({\n id,\n label,\n isDisabled = false,\n tooltip,\n isTooltipSuppressed = false,\n adjustMarginToAlignToEdge = false,\n size = 'medium',\n className,\n onClick,\n children,\n}: IconButtonProps) {\n return (\n \n {children /* the icon to display */}\n \n );\n}\n\nexport default IconButton;\n","import { cn } from '@/utils/shadcn-ui.util';\nimport { LoaderCircle, LucideProps } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nexport type SpinnerProps = LucideProps;\n\nconst Spinner = forwardRef(({ className, ...props }, ref) => {\n return (\n \n );\n});\n\nSpinner.displayName = 'Spinner';\n\nexport default Spinner;\n","import { Input as ShadInput } from '@/components/shadcn-ui/input';\nimport { Label as ShadLabel } from '@/components/shadcn-ui/label';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { ChangeEventHandler, FocusEventHandler } from 'react';\n\nexport type TextFieldProps = {\n /** Optional unique identifier */\n id?: string;\n /**\n * If `true`, the component is disabled.\n *\n * @default false\n */\n isDisabled?: boolean;\n /**\n * If `true`, the label is displayed in an error state.\n *\n * @default false\n */\n hasError?: boolean;\n /**\n * If `true`, the input will take up the full width of its container.\n *\n * @default false\n */\n isFullWidth?: boolean;\n /** Text that gives the user instructions on what contents the TextField expects */\n helperText?: string;\n /** The title of the TextField */\n label?: string;\n /** The short hint displayed in the `input` before the user enters a value. */\n placeholder?: string;\n /**\n * If `true`, the label is displayed as required and the `input` element is required.\n *\n * @default false\n */\n isRequired?: boolean;\n /** Additional css classes to help with unique styling of the text field */\n className?: string;\n /** Starting value for the text field if it is not controlled */\n defaultValue?: string | number;\n /** Value of the text field if controlled */\n value?: string | number;\n /** Triggers when content of textfield is changed */\n onChange?: ChangeEventHandler;\n /** Triggers when textfield gets focus */\n onFocus?: FocusEventHandler;\n /** Triggers when textfield loses focus */\n onBlur?: FocusEventHandler;\n};\n\n/**\n * Text input field\n *\n * Thanks to Shadcn for heavy inspiration and documentation\n * https://ui.shadcn.com/docs/components/input#with-label\n */\nfunction TextField({\n id,\n isDisabled = false,\n hasError = false,\n isFullWidth = false,\n helperText,\n label,\n placeholder,\n isRequired = false,\n className,\n defaultValue,\n value,\n onChange,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n return (\n
\n {`${label}${isRequired ? '*' : ''}`}\n \n

{helperText}

\n
\n );\n}\n\nexport default TextField;\n","import HamburgerMenuButton, {\n MultiColumnMenuProvider,\n} from '@/components/mui/hamburger-menu-button.component';\nimport { CommandHandler } from '@/components/mui/menu-item.component';\nimport '@/components/mui/toolbar.component.css';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { AppBar, Toolbar as MuiToolbar } from '@mui/material';\nimport { PropsWithChildren, useRef } from 'react';\n\nexport type ToolbarProps = PropsWithChildren<{\n /** The handler to use for menu commands (and eventually toolbar commands). */\n commandHandler: CommandHandler;\n\n /**\n * The optional delegate to use to get the menu data. If not specified, the \"hamburger\" menu will\n * not display.\n */\n menuProvider?: MultiColumnMenuProvider;\n\n /** Optional unique identifier */\n id?: string;\n\n /** Additional css classes to help with unique styling of the toolbar */\n className?: string;\n}>;\n\nexport default function Toolbar({\n menuProvider,\n commandHandler,\n className,\n id,\n children,\n}: ToolbarProps) {\n // This ref will always be defined\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const containerRef = useRef(undefined!);\n\n return (\n
\n \n \n {menuProvider ? (\n \n ) : undefined}\n {children ?
{children}
: undefined}\n \n
\n
\n );\n}\n","import React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst alertVariants = cva(\n 'pr-relative pr-w-full pr-rounded-lg pr-border pr-p-4 [&>svg~*]:pr-pl-7 [&>svg+div]:pr-translate-y-[-3px] [&>svg]:pr-absolute [&>svg]:pr-left-4 [&>svg]:pr-top-4 [&>svg]:pr-text-foreground',\n {\n variants: {\n variant: {\n default: 'pr-bg-background pr-text-foreground',\n destructive:\n 'pr-border-destructive/50 pr-text-destructive dark:pr-border-destructive [&>svg]:pr-text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes & VariantProps\n>(({ className, variant, ...props }, ref) => (\n
\n));\nAlert.displayName = 'Alert';\n\nconst AlertTitle = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */}\n {props.children}{' '}\n \n ),\n);\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n
\n));\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription };\n","import React from 'react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Card = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */}\n {props.children}\n \n ),\n);\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n

\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef>(\n ({ className, ...props }, ref) => (\n

\n ),\n);\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","import { ComponentProps } from 'react';\nimport { toast as sonner, Toaster } from 'sonner';\n\ntype SonnerProps = ComponentProps;\n\nfunction Sonner({ ...props }: SonnerProps) {\n return (\n \n );\n}\n\n// The re-export of the sonner function was added manually\nexport { Sonner, sonner };\n","import React from 'react';\nimport * as SliderPrimitive from '@radix-ui/react-slider';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Slider = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n \n \n \n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import React from 'react';\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Switch = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const Tabs = TabsPrimitive.Root;\n\nexport type TabsListProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type TabsTriggerProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type TabsContentProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport const TabsList = React.forwardRef<\n React.ElementRef,\n TabsListProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef,\n TabsTriggerProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Download } from 'lucide-react';\n\ntype InstallButtonProps = {\n /** The installing boolean value determines the state of the button. */\n isInstalling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n /** Optional text for the button. */\n buttonText?: string;\n} & ButtonProps;\n\n/**\n * The InstallButton component is a button designed for initiating installs. It includes visuals for\n * active installing and idle states.\n *\n * @param isInstalling The installing boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @param buttonText Optional text for the button.\n * @returns A install button.\n */\nexport default function InstallButton({\n isInstalling,\n handleClick,\n buttonText,\n className,\n ...props\n}: InstallButtonProps) {\n return (\n \n {isInstalling ? (\n \n ) : (\n <>\n \n {buttonText}\n \n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype EnableButtonProps = {\n /** The enabling boolean value determines the state of the button. */\n isEnabling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The EnableButton component is a button designed for initiating enabling of downloads. It includes\n * visuals for active enabling and idle states.\n *\n * @param isEnabling The enabling boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to enable.\n */\nexport default function EnableButton({\n isEnabling,\n handleClick,\n className,\n ...props\n}: EnableButtonProps) {\n return (\n \n {isEnabling ? (\n <>\n \n Enabling...\n \n ) : (\n 'Enable'\n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype DisableButtonProps = {\n /** The disabling boolean value determines the state of the button. */\n isDisabling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The DisableButton component is a button designed for initiating disabling of downloads. It\n * includes visuals for active disabling and idle states.\n *\n * @param isDisabling The disabling boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to disable.\n */\nexport default function DisableButton({\n isDisabling,\n handleClick,\n className,\n ...props\n}: DisableButtonProps) {\n return (\n \n {isDisabling ? (\n <>\n \n Disabling...\n \n ) : (\n 'Disable'\n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype UpdateButtonProps = {\n /** The updating boolean value determines the state of the button. */\n isUpdating: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The UpdateButton component is a button designed for initiating updates for downloaded extensions.\n * It includes visuals for active updating and idle states.\n *\n * @param isUpdating The updating boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to update.\n */\nexport default function UpdateButton({\n isUpdating,\n handleClick,\n className,\n ...props\n}: UpdateButtonProps) {\n return (\n \n {isUpdating ? (\n <>\n \n Updating...\n \n ) : (\n 'Update'\n )}\n \n );\n}\n","import*as e from\"react\";function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t(e[t.toLowerCase()]=t,e),{for:\"htmlFor\"}),a={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",nbsp:\" \",quot:\"“\"},o=[\"style\",\"script\"],c=/([-A-Z0-9_:]+)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|(?:\\{((?:\\\\.|{[^}]*?}|[^}])*)\\})))?/gi,s=/mailto:/i,d=/\\n{2,}$/,u=/^(\\s*>[\\s\\S]*?)(?=\\n{2,})/,p=/^ *> ?/gm,f=/^ {2,}\\n/,h=/^(?:( *[-*_])){3,} *(?:\\n *)+\\n/,m=/^\\s*(`{3,}|~{3,}) *(\\S+)?([^\\n]*?)?\\n([\\s\\S]+?)\\s*\\1 *(?:\\n *)*\\n?/,g=/^(?: {4}[^\\n]+\\n*)+(?:\\n *)+\\n?/,y=/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,k=/^(?:\\n *)*\\n/,x=/\\r\\n?/g,b=/^\\[\\^([^\\]]+)](:(.*)((\\n+ {4,}.*)|(\\n(?!\\[\\^).+))*)/,v=/^\\[\\^([^\\]]+)]/,S=/\\f/g,E=/^---[ \\t]*\\n(.|\\n)*\\n---[ \\t]*\\n/,$=/^\\s*?\\[(x|\\s)\\]/,w=/^ *(#{1,6}) *([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/,C=/^ *(#{1,6}) +([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/,z=/^([^\\n]+)\\n *(=|-){3,} *(?:\\n *)+\\n/,L=/^ *(?!<[a-z][^ >/]* ?\\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\\n?(\\s*(?:<\\1[^>]*?>[\\s\\S]*?<\\/\\1>|(?!<\\1\\b)[\\s\\S])*?)<\\/\\1>(?!<\\/\\1>)\\n*/i,A=/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi,T=/^)/,O=/^(data|aria|x)-[a-z_][a-z\\d_.-]*$/,B=/^ *<([a-z][a-z0-9:]*)(?:\\s+((?:<.*?>|[^>])*))?\\/?>(?!<\\/\\1>)(\\s*\\n)?/i,M=/^\\{.*\\}$/,R=/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,I=/^<([^ >]+@[^ >]+)>/,U=/^<([^ >]+:\\/[^ >]+)>/,D=/-([a-z])?/gi,j=/^(.*\\|.*)\\n(?: *(\\|? *[-:]+ *\\|[-| :]*)\\n((?:.*\\|.*\\n)*))?\\n?/,N=/^\\[([^\\]]*)\\]:\\s+]+)>?\\s*(\"([^\"]*)\")?/,H=/^!\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/,F=/^\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/,P=/(\\[|\\])/g,_=/(\\n|^[-*]\\s|^#|^ {2,}|^-{2,}|^>\\s)/,W=/\\t/g,G=/(^ *\\||\\| *$)/g,Z=/^ *:-+: *$/,q=/^ *:-+ *$/,Q=/^ *-+: *$/,V=\"((?:\\\\[.*?\\\\][([].*?[)\\\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~~.*?~~|==.*?==|.|\\\\n)*?)\",X=new RegExp(`^([*_])\\\\1${V}\\\\1\\\\1(?!\\\\1)`),J=new RegExp(`^([*_])${V}\\\\1(?!\\\\1|\\\\w)`),K=new RegExp(`^==${V}==`),Y=new RegExp(`^~~${V}~~`),ee=/^\\\\([^0-9A-Za-z\\s])/,te=/^[\\s\\S]+?(?=[^0-9A-Z\\s\\u00c0-\\uffff&#;.()'\"]|\\d+\\.|\\n\\n| {2,}\\n|\\w+:\\S|$)/i,ne=/^\\n+/,re=/^([ \\t]*)/,ie=/\\\\([^\\\\])/g,le=/ *\\n+$/,ae=/(?:^|\\n)( *)$/,oe=\"(?:\\\\d+\\\\.)\",ce=\"(?:[*+-])\";function se(e){return\"( *)(\"+(1===e?oe:ce)+\") +\"}const de=se(1),ue=se(2);function pe(e){return new RegExp(\"^\"+(1===e?de:ue))}const fe=pe(1),he=pe(2);function me(e){return new RegExp(\"^\"+(1===e?de:ue)+\"[^\\\\n]*(?:\\\\n(?!\\\\1\"+(1===e?oe:ce)+\" )[^\\\\n]*)*(\\\\n|$)\",\"gm\")}const ge=me(1),ye=me(2);function ke(e){const t=1===e?oe:ce;return new RegExp(\"^( *)(\"+t+\") [\\\\s\\\\S]+?(?:\\\\n{2,}(?! )(?!\\\\1\"+t+\" (?!\"+t+\" ))\\\\n*|\\\\s*\\\\n*$)\")}const xe=ke(1),be=ke(2);function ve(e,t){const n=1===t,i=n?xe:be,l=n?ge:ye,a=n?fe:he;return{match(e,t,n){const r=ae.exec(n);return r&&(t.list||!t.inline&&!t.simple)?i.exec(e=r[1]+e):null},order:1,parse(e,t,r){const i=n?+e[2]:void 0,o=e[0].replace(d,\"\\n\").match(l);let c=!1;return{items:o.map(function(e,n){const i=a.exec(e)[0].length,l=new RegExp(\"^ {1,\"+i+\"}\",\"gm\"),s=e.replace(l,\"\").replace(a,\"\"),d=n===o.length-1,u=-1!==s.indexOf(\"\\n\\n\")||d&&c;c=u;const p=r.inline,f=r.list;let h;r.list=!0,u?(r.inline=!1,h=s.replace(le,\"\\n\\n\")):(r.inline=!0,h=s.replace(le,\"\"));const m=t(h,r);return r.inline=p,r.list=f,m}),ordered:n,start:i}},render:(t,n,i)=>e(t.ordered?\"ol\":\"ul\",{key:i.key,start:t.type===r.orderedList?t.start:void 0},t.items.map(function(t,r){return e(\"li\",{key:r},n(t,i))}))}}const Se=new RegExp(\"^\\\\[((?:\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]|\\\\](?=[^\\\\[]*\\\\]))*)\\\\]\\\\(\\\\s*?(?:\\\\s+['\\\"]([\\\\s\\\\S]*?)['\\\"])?\\\\s*\\\\)\"),Ee=/^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/,$e=[u,m,g,w,z,C,T,j,ge,xe,ye,be],we=[...$e,/^[^\\n]+(?: \\n|\\n{2,})/,L,B];function Ce(e){return e.replace(/[ÀÁÂÃÄÅàáâãäåæÆ]/g,\"a\").replace(/[çÇ]/g,\"c\").replace(/[ðÐ]/g,\"d\").replace(/[ÈÉÊËéèêë]/g,\"e\").replace(/[ÏïÎîÍíÌì]/g,\"i\").replace(/[Ññ]/g,\"n\").replace(/[øØœŒÕõÔôÓóÒò]/g,\"o\").replace(/[ÜüÛûÚúÙù]/g,\"u\").replace(/[ŸÿÝý]/g,\"y\").replace(/[^a-z0-9- ]/gi,\"\").replace(/ /gi,\"-\").toLowerCase()}function ze(e){return Q.test(e)?\"right\":Z.test(e)?\"center\":q.test(e)?\"left\":null}function Le(e,t,n,i){const l=n.inTable;n.inTable=!0;let a=e.trim().split(/( *(?:`[^`]*`|<.*?>.*?<\\/.*?>(?!<\\/.*?>)|\\\\\\||\\|) *)/).reduce((e,l)=>(\"|\"===l.trim()?e.push(i?{type:r.tableSeparator}:{type:r.text,text:l}):\"\"!==l&&e.push.apply(e,t(l,n)),e),[]);n.inTable=l;let o=[[]];return a.forEach(function(e,t){e.type===r.tableSeparator?0!==t&&t!==a.length-1&&o.push([]):(e.type!==r.text||null!=a[t+1]&&a[t+1].type!==r.tableSeparator||(e.text=e.text.trimEnd()),o[o.length-1].push(e))}),o}function Ae(e,t,n){n.inline=!0;const i=e[2]?e[2].replace(G,\"\").split(\"|\").map(ze):[],l=e[3]?function(e,t,n){return e.trim().split(\"\\n\").map(function(e){return Le(e,t,n,!0)})}(e[3],t,n):[],a=Le(e[1],t,n,!!l.length);return n.inline=!1,l.length?{align:i,cells:l,header:a,type:r.table}:{children:a,type:r.paragraph}}function Te(e,t){return null==e.align[t]?{}:{textAlign:e.align[t]}}function Oe(e){return function(t,n){return n.inline?e.exec(t):null}}function Be(e){return function(t,n){return n.inline||n.simple?e.exec(t):null}}function Me(e){return function(t,n){return n.inline||n.simple?null:e.exec(t)}}function Re(e){return function(t){return e.exec(t)}}function Ie(e,t,n){if(t.inline||t.simple)return null;if(n&&!n.endsWith(\"\\n\"))return null;let r=\"\";e.split(\"\\n\").every(e=>!$e.some(t=>t.test(e))&&(r+=e+\"\\n\",e.trim()));const i=r.trimEnd();return\"\"==i?null:[r,i]}function Ue(e){try{if(decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,\"\").match(/^\\s*(javascript|vbscript|data(?!:image)):/i))return null}catch(e){return null}return e}function De(e){return e.replace(ie,\"$1\")}function je(e,t,n){const r=n.inline||!1,i=n.simple||!1;n.inline=!0,n.simple=!0;const l=e(t,n);return n.inline=r,n.simple=i,l}function Ne(e,t,n){const r=n.inline||!1,i=n.simple||!1;n.inline=!1,n.simple=!0;const l=e(t,n);return n.inline=r,n.simple=i,l}function He(e,t,n){const r=n.inline||!1;n.inline=!1;const i=e(t,n);return n.inline=r,i}const Fe=(e,t,n)=>({children:je(t,e[1],n)});function Pe(){return{}}function _e(){return null}function We(...e){return e.filter(Boolean).join(\" \")}function Ge(e,t,n){let r=e;const i=t.split(\".\");for(;i.length&&(r=r[i[0]],void 0!==r);)i.shift();return r||n}function Ze(n=\"\",i={}){function d(e,n,...r){const l=Ge(i.overrides,`${e}.props`,{});return i.createElement(function(e,t){const n=Ge(t,e);return n?\"function\"==typeof n||\"object\"==typeof n&&\"render\"in n?n:Ge(t,`${e}.component`,e):e}(e,i.overrides),t({},n,l,{className:We(null==n?void 0:n.className,l.className)||void 0}),...r)}function G(t){t=t.replace(E,\"\");let n=!1;i.forceInline?n=!0:i.forceBlock||(n=!1===_.test(t));const r=le(ie(n?t:`${t.trimEnd().replace(ne,\"\")}\\n\\n`,{inline:n}));for(;\"string\"==typeof r[r.length-1]&&!r[r.length-1].trim();)r.pop();if(null===i.wrapper)return r;const l=i.wrapper||(n?\"span\":\"div\");let a;if(r.length>1||i.forceWrapper)a=r;else{if(1===r.length)return a=r[0],\"string\"==typeof a?d(\"span\",{key:\"outer\"},a):a;a=null}return e.createElement(l,{key:\"outer\"},a)}function Z(t,n){const r=n.match(c);return r?r.reduce(function(n,r,a){const o=r.indexOf(\"=\");if(-1!==o){const c=function(e){return-1!==e.indexOf(\"-\")&&null===e.match(O)&&(e=e.replace(D,function(e,t){return t.toUpperCase()})),e}(r.slice(0,o)).trim(),s=function(e){const t=e[0];return('\"'===t||\"'\"===t)&&e.length>=2&&e[e.length-1]===t?e.slice(1,-1):e}(r.slice(o+1).trim()),d=l[c]||c,u=n[d]=function(e,t,n,r){return\"style\"===t?n.split(/;\\s?/).reduce(function(e,t){const n=t.slice(0,t.indexOf(\":\"));return e[n.trim().replace(/(-[a-z])/g,e=>e[1].toUpperCase())]=t.slice(n.length+1).trim(),e},{}):\"href\"===t||\"src\"===t?r(n,e,t):(n.match(M)&&(n=n.slice(1,n.length-1)),\"true\"===n||\"false\"!==n&&n)}(t,c,s,i.sanitizer);\"string\"==typeof u&&(L.test(u)||B.test(u))&&(n[d]=e.cloneElement(G(u.trim()),{key:a}))}else\"style\"!==r&&(n[l[r]||r]=!0);return n},{}):null}i.overrides=i.overrides||{},i.sanitizer=i.sanitizer||Ue,i.slugify=i.slugify||Ce,i.namedCodesToUnicode=i.namedCodesToUnicode?t({},a,i.namedCodesToUnicode):a,i.createElement=i.createElement||e.createElement;const q=[],Q={},V={[r.blockQuote]:{match:Me(u),order:1,parse:(e,t,n)=>({children:t(e[0].replace(p,\"\"),n)}),render:(e,t,n)=>d(\"blockquote\",{key:n.key},t(e.children,n))},[r.breakLine]:{match:Re(f),order:1,parse:Pe,render:(e,t,n)=>d(\"br\",{key:n.key})},[r.breakThematic]:{match:Me(h),order:1,parse:Pe,render:(e,t,n)=>d(\"hr\",{key:n.key})},[r.codeBlock]:{match:Me(g),order:0,parse:e=>({lang:void 0,text:e[0].replace(/^ {4}/gm,\"\").replace(/\\n+$/,\"\")}),render:(e,n,r)=>d(\"pre\",{key:r.key},d(\"code\",t({},e.attrs,{className:e.lang?`lang-${e.lang}`:\"\"}),e.text))},[r.codeFenced]:{match:Me(m),order:0,parse:e=>({attrs:Z(\"code\",e[3]||\"\"),lang:e[2]||void 0,text:e[4],type:r.codeBlock})},[r.codeInline]:{match:Be(y),order:3,parse:e=>({text:e[2]}),render:(e,t,n)=>d(\"code\",{key:n.key},e.text)},[r.footnote]:{match:Me(b),order:0,parse:e=>(q.push({footnote:e[2],identifier:e[1]}),{}),render:_e},[r.footnoteReference]:{match:Oe(v),order:1,parse:e=>({target:`#${i.slugify(e[1],Ce)}`,text:e[1]}),render:(e,t,n)=>d(\"a\",{key:n.key,href:i.sanitizer(e.target,\"a\",\"href\")},d(\"sup\",{key:n.key},e.text))},[r.gfmTask]:{match:Oe($),order:1,parse:e=>({completed:\"x\"===e[1].toLowerCase()}),render:(e,t,n)=>d(\"input\",{checked:e.completed,key:n.key,readOnly:!0,type:\"checkbox\"})},[r.heading]:{match:Me(i.enforceAtxHeadings?C:w),order:1,parse:(e,t,n)=>({children:je(t,e[2],n),id:i.slugify(e[2],Ce),level:e[1].length}),render:(e,t,n)=>d(`h${e.level}`,{id:e.id,key:n.key},t(e.children,n))},[r.headingSetext]:{match:Me(z),order:0,parse:(e,t,n)=>({children:je(t,e[1],n),level:\"=\"===e[2]?1:2,type:r.heading})},[r.htmlBlock]:{match:Re(L),order:1,parse(e,t,n){const[,r]=e[3].match(re),i=new RegExp(`^${r}`,\"gm\"),l=e[3].replace(i,\"\"),a=(c=l,we.some(e=>e.test(c))?He:je);var c;const s=e[1].toLowerCase(),d=-1!==o.indexOf(s),u=(d?s:e[1]).trim(),p={attrs:Z(u,e[2]),noInnerParse:d,tag:u};return n.inAnchor=n.inAnchor||\"a\"===s,d?p.text=e[3]:p.children=a(t,l,n),n.inAnchor=!1,p},render:(e,n,r)=>d(e.tag,t({key:r.key},e.attrs),e.text||n(e.children,r))},[r.htmlSelfClosing]:{match:Re(B),order:1,parse(e){const t=e[1].trim();return{attrs:Z(t,e[2]||\"\"),tag:t}},render:(e,n,r)=>d(e.tag,t({},e.attrs,{key:r.key}))},[r.htmlComment]:{match:Re(T),order:1,parse:()=>({}),render:_e},[r.image]:{match:Be(Ee),order:1,parse:e=>({alt:e[1],target:De(e[2]),title:e[3]}),render:(e,t,n)=>d(\"img\",{key:n.key,alt:e.alt||void 0,title:e.title||void 0,src:i.sanitizer(e.target,\"img\",\"src\")})},[r.link]:{match:Oe(Se),order:3,parse:(e,t,n)=>({children:Ne(t,e[1],n),target:De(e[2]),title:e[3]}),render:(e,t,n)=>d(\"a\",{key:n.key,href:i.sanitizer(e.target,\"a\",\"href\"),title:e.title},t(e.children,n))},[r.linkAngleBraceStyleDetector]:{match:Oe(U),order:0,parse:e=>({children:[{text:e[1],type:r.text}],target:e[1],type:r.link})},[r.linkBareUrlDetector]:{match:(e,t)=>t.inAnchor?null:Oe(R)(e,t),order:0,parse:e=>({children:[{text:e[1],type:r.text}],target:e[1],title:void 0,type:r.link})},[r.linkMailtoDetector]:{match:Oe(I),order:0,parse(e){let t=e[1],n=e[1];return s.test(n)||(n=\"mailto:\"+n),{children:[{text:t.replace(\"mailto:\",\"\"),type:r.text}],target:n,type:r.link}}},[r.orderedList]:ve(d,1),[r.unorderedList]:ve(d,2),[r.newlineCoalescer]:{match:Me(k),order:3,parse:Pe,render:()=>\"\\n\"},[r.paragraph]:{match:Ie,order:3,parse:Fe,render:(e,t,n)=>d(\"p\",{key:n.key},t(e.children,n))},[r.ref]:{match:Oe(N),order:0,parse:e=>(Q[e[1]]={target:e[2],title:e[4]},{}),render:_e},[r.refImage]:{match:Be(H),order:0,parse:e=>({alt:e[1]||void 0,ref:e[2]}),render:(e,t,n)=>Q[e.ref]?d(\"img\",{key:n.key,alt:e.alt,src:i.sanitizer(Q[e.ref].target,\"img\",\"src\"),title:Q[e.ref].title}):null},[r.refLink]:{match:Oe(F),order:0,parse:(e,t,n)=>({children:t(e[1],n),fallbackChildren:t(e[0].replace(P,\"\\\\$1\"),n),ref:e[2]}),render:(e,t,n)=>Q[e.ref]?d(\"a\",{key:n.key,href:i.sanitizer(Q[e.ref].target,\"a\",\"href\"),title:Q[e.ref].title},t(e.children,n)):d(\"span\",{key:n.key},t(e.fallbackChildren,n))},[r.table]:{match:Me(j),order:1,parse:Ae,render(e,t,n){const r=e;return d(\"table\",{key:n.key},d(\"thead\",null,d(\"tr\",null,r.header.map(function(e,i){return d(\"th\",{key:i,style:Te(r,i)},t(e,n))}))),d(\"tbody\",null,r.cells.map(function(e,i){return d(\"tr\",{key:i},e.map(function(e,i){return d(\"td\",{key:i,style:Te(r,i)},t(e,n))}))})))}},[r.text]:{match:Re(te),order:4,parse:e=>({text:e[0].replace(A,(e,t)=>i.namedCodesToUnicode[t]?i.namedCodesToUnicode[t]:e)}),render:e=>e.text},[r.textBolded]:{match:Be(X),order:2,parse:(e,t,n)=>({children:t(e[2],n)}),render:(e,t,n)=>d(\"strong\",{key:n.key},t(e.children,n))},[r.textEmphasized]:{match:Be(J),order:3,parse:(e,t,n)=>({children:t(e[2],n)}),render:(e,t,n)=>d(\"em\",{key:n.key},t(e.children,n))},[r.textEscaped]:{match:Be(ee),order:1,parse:e=>({text:e[1],type:r.text})},[r.textMarked]:{match:Be(K),order:3,parse:Fe,render:(e,t,n)=>d(\"mark\",{key:n.key},t(e.children,n))},[r.textStrikethroughed]:{match:Be(Y),order:3,parse:Fe,render:(e,t,n)=>d(\"del\",{key:n.key},t(e.children,n))}};!0===i.disableParsingRawHTML&&(delete V[r.htmlBlock],delete V[r.htmlSelfClosing]);const ie=function(e){let t=Object.keys(e);function n(r,i){let l=[],a=\"\";for(;r;){let o=0;for(;ol(n,r,i),n,r,i):l(n,r,i)}}(V,i.renderRule),function e(t,n={}){if(Array.isArray(t)){const r=n.key,i=[];let l=!1;for(let r=0;r{let{children:r=\"\",options:i}=t,l=function(e,t){if(null==e)return{};var n,r,i={},l=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}(t,n);return e.cloneElement(Ze(r,i),l)};export{r as RuleType,Ze as compiler,Ue as sanitizer,Ce as slugify};\n//# sourceMappingURL=index.modern.js.map\n","import Markdown from 'markdown-to-jsx';\n\ninterface MarkdownRendererProps {\n /** Optional unique identifier */\n id?: string;\n /** The markdown string to render */\n markdown: string;\n}\n\n/**\n * This component renders markdown content given a markdown string. It uses typography styles from\n * the platform.\n *\n * @param markdown The markdown string to render.\n * @param id Optional unique identifier\n * @returns A div containing the rendered markdown content.\n */\nexport default function MarkdownRenderer({ id, markdown }: MarkdownRendererProps) {\n return (\n
\n {markdown}\n
\n );\n}\n","import { Filter, ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { Button } from '@/components/shadcn-ui/button';\n\n/**\n * The FilterButton component is a button designed for initiating filtering of data. It is designed\n * to be used with the dropdown menu. It uses forwardRef to pass the button to the dropdown trigger\n * asChild.\n *\n * @returns A button that can be used to filter.\n */\nconst FilterButton = forwardRef((props, ref) => {\n return (\n \n \n Filter\n \n \n );\n});\n\nexport default FilterButton;\n","import {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuGroup,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport FilterButton from './buttons/filter-button.component';\n\nexport enum DropdownMenuItemType {\n Check,\n Radio,\n}\n\nexport type DropdownItem = {\n /** The label is the text that will be displayed on the dropdown item. */\n label: string;\n /** The itemType determines the DropdownMenuItemType type as either Check or Radio. */\n itemType: DropdownMenuItemType;\n /** The onClick function is called when the item is clicked. */\n onClick: () => void;\n};\n\nexport type DropdownGroup = {\n /**\n * The label is the text that will be displayed on the dropdown group. It is used to categorize\n * the items in the group.\n */\n label: string;\n /** The items array contains the items that will be displayed in the dropdown group */\n items: DropdownItem[];\n};\n\nexport type FilterDropdownProps = {\n /** Object unique identifier */\n id?: string;\n /** The groups array contains the groups that will be displayed in the dropdown */\n groups: DropdownGroup[];\n}; // TODO: extend the props later\n\n/**\n * The FilterDropdown component is a dropdown designed for filtering content. It includes groups of\n * items that can be checkboxes or radio items.\n *\n * @param id Optional unique identifier\n * @param groups The groups array contains the groups that will be displayed in the dropdown\n * @returns A filter dropdown.\n */\nexport default function FilterDropdown({ id, groups }: FilterDropdownProps) {\n return (\n
\n {/* TODO: remove this once the DropDown Menu shadcn has an id prop */}\n \n \n \n \n \n {groups.map((group) => (\n
\n {group.label}\n \n {group.items.map((item) => (\n
\n {item.itemType === DropdownMenuItemType.Check ? (\n \n {item.label}\n \n ) : (\n \n {item.label}\n \n )}\n
\n ))}\n
\n \n
\n ))}\n
\n
\n
\n );\n}\n","interface NoExtensionsFoundProps {\n /** Optional unique identifier */\n id?: string;\n /** The message to display */\n message: string;\n}\n/**\n * This component displays a message to the user when no extensions are found in the marketplace.\n *\n * @param id Optional unique identifier\n * @param message The message to display.\n * @returns {JSX.Element} - Returns the message component that displays the message to the user.\n */\nexport default function NoExtensionsFound({ id, message }: NoExtensionsFoundProps) {\n return (\n
\n
\n

{message}

\n
\n
\n );\n}\n","import { CircleHelp, Link as LucideLink, User } from 'lucide-react';\nimport { NumberFormat } from 'platform-bible-utils';\n\n/** Interface that stores the parameters passed to the More Info component */\ninterface MoreInfoProps {\n /** Optional unique identifier */\n id?: string;\n /** The category of the extension */\n category: string;\n /** The number of downloads for the extension */\n downloads: Record;\n /** The languages supported by the extension */\n languages: string[];\n /** The URL to the more info page of the extension */\n moreInfoUrl: string;\n}\n/**\n * This component displays the more info section of the extension which includes the category,\n * number of downloads, languages, and links to the website and support\n *\n * @param id Optional unique identifier\n * @param category The category of the extension\n * @param downloads The number of downloads for the extension\n * @param languages The languages supported by the extension\n * @param moreInfoUrl The URL to the more info page of the extension\n * @returns {JSX.Element} - Returns the more info component that displays the category, number of\n * downloads, languages, and links to the website and support\n */\nexport default function MoreInfo({\n id,\n category,\n downloads,\n languages,\n moreInfoUrl,\n}: MoreInfoProps) {\n /**\n * This constant formats the number of downloads into a more readable format.\n *\n * @example 1000 -> 1K\n *\n * @example 1000000 -> 1M\n *\n * @returns The formatted number of downloads\n */\n const numberFormatted = new NumberFormat('en', {\n notation: 'compact',\n compactDisplay: 'short',\n }).format(Object.values(downloads).reduce((a: number, b: number) => a + b, 0));\n\n /** This function scrolls the window to the bottom of the page. */\n const handleScrollToBottom = () => {\n window.scrollTo(0, document.body.scrollHeight);\n };\n\n return (\n \n
\n
\n {category}\n
\n CATEGORY\n
\n
\n
\n
\n \n {numberFormatted}\n
\n USERS\n
\n
\n
\n
\n {languages.slice(0, 3).map((locale) => (\n \n {locale.toUpperCase()}\n \n ))}\n
\n {languages.length > 3 && (\n handleScrollToBottom()}\n className=\"pr-text-xs pr-text-gray-500 pr-underline\"\n >\n +{languages.length - 3} more languages\n \n )}\n
\n
\n
\n \n Website\n \n \n \n Support\n \n \n
\n
\n );\n}\n","import { useState } from 'react';\n\nexport type VersionInformation = {\n /** Date the version was published */\n date: string;\n /** Description of the changes in the version */\n description: string;\n};\n\n/** Type to store the version history information */\nexport type VersionHistoryType = Record;\n\n/** Interface that stores the parameters passed to the Version History component */\ninterface VersionHistoryProps {\n /** Optional unique identifier */\n id?: string;\n /** Object containing the versions mapped with their information */\n versionHistory: VersionHistoryType;\n}\n\n/**\n * Component to render the version history information shown in the footer component. Lists the 5\n * most recent versions, with the options to show all versions by pressing a button.\n *\n * @param versionHistory Object containing the versions mapped with their information\n * @param id Optional unique identifier\n * @returns Rendered version history for the Footer component\n */\nexport default function VersionHistory({ id, versionHistory }: VersionHistoryProps) {\n const [showAllVersions, setShowAllVersions] = useState(false);\n const currentDate = new Date();\n\n /**\n * Function to format the time string for the version history in the form of 'X year(s) ago'.\n *\n * @param dateString ISO Date string to determine the time string from\n * @returns Formatted time string\n */\n function formatTimeString(dateString: string) {\n const date = new Date(dateString);\n const dateDiff = new Date(currentDate.getTime() - date.getTime());\n const yearDiff = dateDiff.getUTCFullYear() - 1970;\n const monthDiff = dateDiff.getUTCMonth();\n const dayDiff = dateDiff.getUTCDate() - 1;\n\n // Determines how long ago the version was published\n let timeString = '';\n if (yearDiff > 0) {\n timeString = `${yearDiff.toString()} year${yearDiff === 1 ? '' : 's'} ago`;\n } else if (monthDiff > 0) {\n timeString = `${monthDiff.toString()} month${monthDiff === 1 ? '' : 's'} ago`;\n } else if (dayDiff === 0) {\n timeString = 'today';\n } else {\n timeString = `${dayDiff.toString()} day${dayDiff === 1 ? '' : 's'} ago`;\n }\n\n return timeString;\n }\n\n // Sorts the version history by version number\n const sortedEntries = Object.entries(versionHistory).sort((a, b) => b[0].localeCompare(a[0]));\n\n return (\n
\n

What`s New

\n
    \n {(showAllVersions ? sortedEntries : sortedEntries.slice(0, 5)).map((entry) => (\n
    \n
    \n
  • \n {entry[1].description}\n
  • \n
    \n
    \n
    Version {entry[0]}
    \n
    {formatTimeString(entry[1].date)}
    \n
    \n
    \n ))}\n
\n {sortedEntries.length > 5 && (\n setShowAllVersions(!showAllVersions)}\n className=\"pr-text-xs pr-text-gray-500 pr-underline\"\n >\n {showAllVersions ? 'Show Less Version History' : 'Show All Version History'}\n \n )}\n
\n );\n}\n","import { useMemo } from 'react';\nimport { formatBytes } from 'platform-bible-utils';\nimport VersionHistory, { VersionHistoryType } from './version-history.component';\n\n/** Interface to store the parameters passed to the Footer component */\ninterface FooterProps {\n /** Optional unique identifier */\n id?: string;\n /** Name of the publisher */\n publisherDisplayName: string;\n /** Size of the extension file in bytes */\n fileSize: number;\n /** List of language codes supported by the extension */\n locales: string[];\n /** Object containing the version history mapped with their information */\n versionHistory: VersionHistoryType;\n}\n\n/**\n * Component to render the footer for the extension details which contains information on the\n * publisher, version history, languages, and file size.\n *\n * @param id Optional unique identifier\n * @param publisherDisplayName Name of the publisher\n * @param fileSize Size of the extension file in bytes\n * @param locales List of language codes supported by the extension\n * @param versionHistory Object containing the version history mapped with their information\n * @returns The rendered Footer component\n */\nexport default function Footer({\n id,\n publisherDisplayName,\n fileSize,\n locales,\n versionHistory,\n}: FooterProps) {\n /** Formats the file size into a human-readable format */\n const formattedFileSize = useMemo(() => formatBytes(fileSize), [fileSize]);\n\n /**\n * This function gets the display names of the languages based on the language codes.\n *\n * @param codes The list of language codes\n * @returns The list of language names\n */\n const getLanguageNames = (codes: string[]) => {\n const displayNames = new Intl.DisplayNames(navigator.language, { type: 'language' });\n return codes.map((code) => displayNames.of(code));\n };\n\n const languageNames = getLanguageNames(locales);\n\n return (\n
\n
\n \n
\n
\n

Information

\n
\n

\n Publisher\n {publisherDisplayName}\n Size\n {formattedFileSize}\n

\n
\n

\n Languages\n {languageNames.join(', ')}\n

\n
\n
\n
\n
\n
\n );\n}\n","import { PlatformEvent, PlatformEventHandler } from 'platform-bible-utils';\nimport { useEffect } from 'react';\n\n/**\n * Adds an event handler to an event so the event handler runs when the event is emitted. Use\n * `papi.network.getNetworkEvent` to use a networked event with this hook.\n *\n * @param event The event to subscribe to.\n *\n * - If event is a `PlatformEvent`, that event will be used\n * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet\n * available for example\n *\n * @param eventHandler The callback to run when the event is emitted\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n */\nconst useEvent = (\n event: PlatformEvent | undefined,\n eventHandler: PlatformEventHandler,\n) => {\n useEffect(() => {\n // Do nothing if the event is not provided (in case the event is not yet available, for example)\n if (!event) return () => {};\n\n const unsubscriber = event(eventHandler);\n return () => {\n unsubscriber();\n };\n }, [event, eventHandler]);\n};\nexport default useEvent;\n","import { useCallback, useEffect } from 'react';\nimport { PlatformEvent, PlatformEventAsync, PlatformEventHandler } from 'platform-bible-utils';\nimport usePromise from './use-promise.hook';\n\nconst noopUnsubscriber = () => false;\n\n/**\n * Adds an event handler to an asynchronously subscribing/unsubscribing event so the event handler\n * runs when the event is emitted. Use `papi.network.getNetworkEvent` to use a networked event with\n * this hook.\n *\n * @param event The asynchronously (un)subscribing event to subscribe to.\n *\n * - If event is a `PlatformEvent` or `PlatformEventAsync`, that event will be used\n * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet\n * available for example\n *\n * @param eventHandler The callback to run when the event is emitted\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n */\nconst useEventAsync = (\n event: PlatformEvent | PlatformEventAsync | undefined,\n eventHandler: PlatformEventHandler,\n) => {\n // Subscribe to the event asynchronously\n const [unsubscribe] = usePromise(\n useCallback(async () => {\n // Do nothing if the event is not provided (in case the event is not yet available, for example)\n if (!event) return noopUnsubscriber;\n\n // Wrap subscribe and unsubscribe in promises to allow normal events to be used as well\n const unsub = await Promise.resolve(event(eventHandler));\n return async () => unsub();\n }, [eventHandler, event]),\n noopUnsubscriber,\n // We want the unsubscriber to return to default value immediately upon changing subscription\n // So the useEffect below will unsubscribe asap\n { preserveValue: false },\n );\n\n // Unsubscribe from the event asynchronously (but we aren't awaiting the unsub)\n useEffect(() => {\n return () => {\n if (unsubscribe !== noopUnsubscriber) {\n unsubscribe();\n }\n };\n }, [unsubscribe]);\n};\n\nexport default useEventAsync;\n"],"names":["twMergeCustom","extendTailwindMerge","cn","inputs","clsx","Input","React","className","type","props","ref","jsx","BookChapterInput","forwardRef","handleSearch","handleKeyDown","handleOnClick","handleSubmit","jsxs","ShadInput","event","e","History","P","R","t","s","n","N","B","O","S","K","g","k","x","T","X","V","w","L","G","A","H","C","I","y","q","U","m","l","h","c","E","r","D","i","a","o","u","v","f","d","b","p","J","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","inset","children","ChevronRight","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","Check","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","BookMenuItem","bookId","handleSelectBook","isSelected","handleHighlightBook","bookType","ShadDropdownMenuItem","Canon","ChapterSelect","handleSelectChapter","endChapter","activeChapter","highlightedChapter","handleHighlightedChapter","chapters","_","handleMouse","useCallback","chapterNumber","chapter","GoToMenuItem","handleSort","handleLocationHistory","handleBookmarks","ShadDropdownMenuLabel","ArrowDownWideNarrow","Clock","Bookmark","ALL_BOOK_IDS","BOOK_TYPE_LABELS","BOOK_TYPE_ARRAY","SCROLL_OFFSET","SEARCH_QUERY_FORMATS","fetchGroupedBooks","fetchEndChapter","getChaptersForBook","getAllEnglishNames","isValidBookEnglishName","bookName","getBookIdFromEnglishName","formattedBookName","BookChapterControl","scrRef","searchQuery","setSearchQuery","useState","selectedBookId","setSelectedBookId","setHighlightedChapter","highlightedBookId","setHighlightedBookId","isContentOpen","setIsContentOpen","isContentOpenDelayed","setIsContentOpenDelayed","inputRef","useRef","contentRef","menuItemRef","fetchFilteredBooks","englishNameLowerCase","normalizedQuery","handleSearchInput","searchString","shouldPreventAutoClosing","controlMenuState","open","updateReference","shouldClose","verse","handleInputSubmit","format","matches","book","englishName","handleKeyDownInput","handleKeyDownContent","key","handleKeyDownMenuItem","chapterOffSet","useEffect","useLayoutEffect","scrollTimeout","scrollPosition","ShadDropdownMenu","ShadDropdownMenuTrigger","ShadDropdownMenuContent","bookTypeIndex","element","ShadDropdownMenuSeparator","buttonVariants","cva","Button","variant","size","asChild","Comp","Slot","labelVariants","Label","LabelPrimitive","RadioGroup","RadioGroupPrimitive","RadioGroupItem","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","DialogPortal","DialogPrimitive","DialogOverlay","DialogContent","DialogTitle","DialogDescription","Command","CommandPrimitive","CommandInput","Search","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","getOptionLabelDefault","option","ComboBox","id","options","value","onChange","getOptionLabel","buttonPlaceholder","textPlaceholder","commandEmptyMessage","buttonVariant","dir","isDisabled","setOpen","ChevronsUpDown","ChapterRangeSelector","startChapter","handleSelectStartChapter","handleSelectEndChapter","chapterCount","chapterOptions","useMemo","index","onChangeStartChapter","onChangeEndChapter","Fragment","BookSelectionMode","BOOK_SELECTOR_STRING_KEYS","localizeString","strings","BookSelector","handleBookSelectionModeChange","currentBookName","onSelectBooks","selectedBookIds","localizedStrings","currentBookText","chooseText","chooseBooksText","bookSelectionMode","setBookSelectionMode","onSelectionModeChange","newMode","DataTableViewOptions","table","FilterIcon","column","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","DataTablePagination","pageSize","ArrowLeftIcon","ChevronLeftIcon","ChevronRightIcon","ArrowRightIcon","Table","stickyHeader","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","DataTable","columns","data","enablePagination","showPaginationControls","showColumnVisibilityControls","onRowClickHandler","sorting","setSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","useReactTable","getCoreRowModel","getPaginationRowModel","getSortedRowModel","getFilteredRowModel","headerGroup","header","flexRender","_a","row","cell","getLinesFromUSFM","text","extractNumberFromUSFM","regex","match","extractOccurrences","item","extractItems","scriptureRef","results","lines","currentChapter","currentVerse","line","items","result","OccurrencesTable","selectedItem","scriptureReference","setScriptureReference","reference","occurrence","tableData","setTableData","INVENTORY_STRING_KEYS","getSortingIcon","sortDirection","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","filterItemData","statusFilter","textFilter","filteredItemData","convertTextToItemData","getInventoryItems","getStatusForItem","itemData","itemIndex","existingItem","entry","newItem","Inventory","approvedItems","onApprovedItemsChange","unapprovedItems","onUnapprovedItemsChange","scope","onScopeChange","getColumns","allItemsText","approvedItemsText","unapprovedItemsText","unknownItemsText","scopeBookText","scopeChapterText","scopeVerseText","filterText","setItems","setStatusFilter","setTextFilter","setSelectedItem","statusChangeHandler","changedItems","status","prevTableData","tableEntry","newApprovedItems","validItem","newUnapprovedItems","unapprovedItem","rowClickHandler","handleScopeChange","handleStatusFilterChange","newScriptureReference","toggleVariants","Toggle","TogglePrimitive","ToggleGroupContext","ToggleGroup","ToggleGroupPrimitive","ToggleGroupItem","context","inventoryItemColumn","itemLabel","inventoryCountColumn","countLabel","inventoryStatusColumn","statusLabel","CircleCheckIcon","CircleXIcon","CircleHelpIcon","SearchBar","onSearch","placeholder","isFullWidth","handleInputChange","VerticalTabs","TabsPrimitive","VerticalTabsList","VerticalTabsTrigger","VerticalTabsContent","NavigationContentSearch","tabList","searchPlaceholder","headerTitle","isSearchBarFullWidth","direction","tab","scrBookColId","scrRefColId","typeColId","detailsColId","defaultScrRefColumnName","defaultScrBookGroupName","defaultTypeColumnName","defaultDetailsColumnName","colInfo","showSourceColumn","showSrcCol","info","formatScrRef","compareScrRefs","toRefOrRange","scriptureSelection","offsetStart","offsetEnd","scrRefToBBBCCCVVV","getRowKey","ScriptureResultsViewer","sources","showColumnHeaders","scriptureReferenceColumnName","scriptureBookGroupName","typeColumnName","detailsColumnName","onRowSelected","grouping","setGrouping","scriptureResults","source","getExpandedRowModel","getGroupedRowModel","selectedRows","keys","selectedRow","scrBookGroupName","typeGroupName","groupingOptions","handleSelectChange","selectedGrouping","handleRowClick","getEvenOrOddBandingStyle","getIndent","groupingState","rowIndex","ChevronLeft","DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS","getLocalizeKeyForScrollGroupId","ScrollGroupSelector","availableScrollGroupIds","scrollGroupId","onChangeScrollGroupId","localizedStringsDefaulted","localizedStringKey","localizedStringValue","newScrollGroupString","scrollGroupOptionId","Separator","orientation","decorative","SeparatorPrimitive","SettingsList","SettingsListItem","primary","secondary","isLoading","loadingMessage","SettingsListHeader","includeSeparator","Checkbox","CheckboxPrimitive","Checklist","listItems","selectedListItems","handleSelectListItem","createLabel","_interopRequireDefault","obj","module","chainPropTypes","propType1","propType2","args","_extends","target","isPlainObject","prototype","deepClone","output","deepmerge","z","reactIs_production_min","hasSymbol","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","isValidElementType","typeOf","object","$$typeof","$$typeofType","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","hasWarnedAboutDeprecatedIsAsyncMode","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","reactIs_development","reactIsModule","require$$0","require$$1","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","test3","letter","objectAssign","from","to","symbols","ReactPropTypesSecret","ReactPropTypesSecret_1","has","printWarning","loggedTypeFailures","message","checkPropTypes","typeSpecs","values","location","componentName","getStack","typeSpecName","error","err","ex","stack","checkPropTypes_1","ReactIs","assign","require$$2","require$$3","require$$4","emptyFunctionThatReturnsNull","factoryWithTypeCheckers","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","iteratorFn","ANONYMOUS","ReactPropTypes","createPrimitiveTypeChecker","createAnyTypeChecker","createArrayOfTypeChecker","createElementTypeChecker","createElementTypeTypeChecker","createInstanceTypeChecker","createNodeChecker","createObjectOfTypeChecker","createEnumTypeChecker","createUnionTypeChecker","createShapeTypeChecker","createStrictShapeTypeChecker","is","PropTypeError","createChainableTypeChecker","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","isRequired","propName","propFullName","secret","cacheKey","chainedCheckType","expectedType","propValue","propType","getPropType","preciseType","getPreciseType","typeChecker","expectedClass","expectedClassName","actualClassName","getClassName","expectedValues","valuesString","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","expectedTypes","checkerResult","expectedTypesMessage","isNode","invalidValidatorError","shapeTypes","allKeys","iterator","step","isSymbol","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","getShim","propTypesModule","isClassComponent","elementType","acceptingRef","safePropName","warningHint","elementAcceptingRef","PropTypes","elementAcceptingRef$1","specialProperty","exactProp","propTypes","unsupportedProps","prop","formatMuiErrorMessage","code","url","REACT_SERVER_CONTEXT_TYPE","REACT_OFFSCREEN_TYPE","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","SuspenseList","hasWarnedAboutDeprecatedIsConcurrentMode","isSuspenseList","fnNameMatchRegex","getFunctionName","fn","getFunctionComponentName","Component","fallback","getWrappedName","outerType","innerType","wrapperName","functionName","getDisplayName","HTMLElementType","refType","refType$1","capitalize","string","_formatMuiErrorMessage","createChainedFunction","funcs","acc","func","debounce","wait","timeout","debounced","later","deprecatedPropType","validator","reason","componentNameSafe","propFullNameSafe","isMuiElement","muiNames","_muiName","_element$type","ownerDocument","node","ownerWindow","requirePropFactory","componentNameInError","prevPropTypes","requiredProp","defaultTypeChecker","typeCheckerResult","setRef","useEnhancedEffect","useEnhancedEffect$1","globalId","useGlobalId","idOverride","defaultId","setDefaultId","maybeReactUseId","useId","reactId","unsupportedProp","useControlled","controlled","defaultProp","name","state","isControlled","valueState","setValue","defaultValue","setValueIfUncontrolled","newValue","useEventCallback","useForkRef","refs","instance","UNINITIALIZED","useLazyRef","init","initArg","EMPTY","useOnMount","Timeout","delay","useTimeout","hadKeyboardEvent","hadFocusVisibleRecently","hadFocusVisibleRecentlyTimeout","inputTypesWhitelist","focusTriggersKeyboardModality","tagName","handlePointerDown","handleVisibilityChange","prepare","doc","isFocusVisible","useIsFocusVisible","isFocusVisibleRef","handleBlurVisible","handleFocusVisible","resolveProps","defaultProps","defaultSlotProps","slotProps","slotPropName","composeClasses","slots","getUtilityClass","classes","slot","utilityClass","defaultGenerator","createClassNameGenerator","generate","generator","ClassNameGenerator","ClassNameGenerator$1","globalStateClasses","generateUtilityClass","globalStatePrefix","globalStateClass","generateUtilityClasses","clamp","min","max","_objectWithoutPropertiesLoose","excluded","sourceKeys","_excluded","sortBreakpointsValues","breakpointsAsArray","breakpoint1","breakpoint2","createBreakpoints","breakpoints","unit","other","sortedValues","up","down","between","start","end","endIndex","only","not","keyIndex","shape","shape$1","responsivePropType","responsivePropType$1","merge","defaultBreakpoints","handleBreakpoints","styleFromPropValue","theme","themeBreakpoints","breakpoint","mediaKey","cssKey","createEmptyBreakpointObject","breakpointsInput","_breakpointsInput$key","breakpointStyleKey","removeUnusedBreakpoints","breakpointKeys","style","breakpointOutput","getPath","path","checkVars","getStyleValue","themeMapping","transform","propValueFinal","userValue","cssProperty","themeKey","memoize","cache","arg","properties","directions","aliases","getCssProperties","property","marginKeys","paddingKeys","spacingKeys","createUnaryUnit","_getPath","themeSpacing","abs","createUnarySpacing","getValue","transformer","transformed","getStyleFromPropValue","cssProperties","resolveCssProperty","margin","padding","createSpacing","spacingInput","spacing","argsInput","argument","compose","styles","handlers","borderTransform","createBorderStyle","border","borderTop","borderRight","borderBottom","borderLeft","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outline","outlineColor","borderRadius","gap","columnGap","rowGap","gridColumn","gridRow","gridAutoFlow","gridAutoColumns","gridAutoRows","gridTemplateColumns","gridTemplateRows","gridTemplateAreas","gridArea","paletteTransform","color","bgcolor","backgroundColor","sizingTransform","width","maxWidth","_props$theme","_props$theme2","breakpointsValues","minWidth","height","maxHeight","minHeight","boxSizing","defaultSxConfig","defaultSxConfig$1","objectsHaveSameKeys","objects","union","callIfFn","maybeFn","unstable_createStyleFunctionSx","getThemeValue","config","styleFunctionSx","_theme$unstable_sxCon","sx","traverse","sxInput","sxObject","emptyBreakpoints","breakpointsKeys","css","styleKey","styleFunctionSx$1","applyStyles","createTheme","paletteInput","shapeInput","muiTheme","isObjectEmpty","useTheme","defaultTheme","contextTheme","ThemeContext","systemDefaultTheme","useThemeWithoutDefault","_excluded2","_excluded3","isEmpty","isStringTag","tag","shouldForwardProp","lowercaseFirstLetter","resolveTheme","themeId","defaultOverridesResolver","processStyleArg","callableStyle","_ref","ownerState","resolvedStylesArg","resolvedStyle","variants","isMatch","createStyled","input","rootShouldForwardProp","slotShouldForwardProp","systemSx","inputOptions","processStyles","componentSlot","inputSkipVariantsResolver","inputSkipSx","overridesResolver","skipVariantsResolver","skipSx","label","shouldForwardPropOption","defaultStyledResolver","styledEngineStyled","transformStyleArg","stylesArg","muiStyledResolver","styleArg","expressions","transformedStyleArg","expressionsWithDefaultTheme","styleOverrides","resolvedStyleOverrides","slotKey","slotStyle","_theme$components","themeVariants","numOfCustomFnsApplied","placeholders","displayName","getThemeProps","params","useThemeProps","clampWrapper","hexToRgb","re","colors","decomposeColor","marker","colorSpace","recomposeColor","hslToRgb","rgb","getLuminance","getContrastRatio","foreground","background","lumA","lumB","alpha","darken","coefficient","lighten","createMixins","mixins","common","common$1","grey","grey$1","purple","purple$1","red","red$1","orange","orange$1","blue","blue$1","lightBlue","lightBlue$1","green","green$1","light","dark","addLightOrDark","intent","shade","tonalOffset","tonalOffsetLight","tonalOffsetDark","getDefaultPrimary","mode","getDefaultSecondary","getDefaultError","getDefaultInfo","getDefaultSuccess","getDefaultWarning","createPalette","palette","contrastThreshold","success","warning","getContrastText","contrastText","contrast","augmentColor","mainShade","lightShade","darkShade","modes","round","caseAllCaps","defaultFontFamily","createTypography","typography","fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem2","coef","pxToRem","buildVariant","fontWeight","lineHeight","letterSpacing","casing","shadowKeyUmbraOpacity","shadowKeyPenumbraOpacity","shadowAmbientShadowOpacity","createShadow","px","shadows","shadows$1","easing","duration","formatMs","milliseconds","getAutoHeightDuration","constant","createTransitions","inputTransitions","mergedEasing","mergedDuration","durationOption","easingOption","isString","isNumber","animatedProp","zIndex","zIndex$1","mixinsInput","transitionsInput","typographyInput","systemTheme","systemCreateTheme","stateClasses","component","child","stateClass","defaultTheme$1","THEME_ID","systemUseThemeProps","styled","styled$1","getSvgIconUtilityClass","useUtilityClasses","SvgIconRoot","_theme$transitions","_theme$transitions$cr","_theme$transitions2","_theme$typography","_theme$typography$pxT","_theme$typography2","_theme$typography2$px","_theme$typography3","_theme$typography3$px","_palette$ownerState$c","_palette","_palette2","_palette3","SvgIcon","inProps","htmlColor","inheritViewBox","titleAccess","viewBox","hasSvgAsChild","more","_jsxs","_jsx","SvgIcon$1","createSvgIcon","unstable_ClassNameGenerator","exports","_utils","ArrowRight","default_1","_createSvgIcon","_jsxRuntime","isHostComponent","appendOwnerState","otherProps","defaultContextValue","ClassNameConfiguratorContext","useClassNamesOverride","disableDefaultClasses","extractEventHandlers","excludeKeys","resolveComponentProps","componentProps","slotState","omitEventHandlers","mergeSlotProps","parameters","getSlotProps","additionalProps","externalSlotProps","externalForwardedProps","joinedClasses","mergedStyle","eventHandlers","componentsPropsWithoutEventHandlers","otherPropsWithoutEventHandlers","internalSlotProps","useSlotProps","_parameters$additiona","skipResolvingSlotProps","rest","resolvedComponentsProps","mergedProps","internalRef","GLOBAL_CLASS_PREFIX","buildStateClass","buildSlotClass","getContainer","container","forwardedRef","disablePortal","mountNode","setMountNode","handleRef","newProps","ReactDOM","top","bottom","right","left","auto","basePlacements","clippingParents","viewport","popper","variationPlacements","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","getWindow","OwnElement","isHTMLElement","isShadowRoot","attributes","effect","_ref2","initialStyles","styleProperties","attribute","applyStyles$1","getBasePlacement","getUAString","uaData","isLayoutViewport","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","visualViewport","addVisualOffsets","getLayoutRect","contains","parent","rootNode","next","getComputedStyle","isTableElement","getDocumentElement","getParentNode","getTrueOffsetParent","getContainingBlock","isFirefox","isIE","elementCss","currentNode","getOffsetParent","window","offsetParent","getMainAxisFromPlacement","within","mathMax","mathMin","withinMaxClamp","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","toPaddingObject","arrow","_state$modifiersData$","arrowElement","popperOffsets","basePlacement","axis","isVertical","len","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","center","offset","axisProp","_options$element","arrow$1","getVariation","unsetSides","roundOffsetsByDPR","win","dpr","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","heightProp","widthProp","offsetY","offsetX","commonStyles","_ref4","_Object$assign","computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","computeStyles$1","passive","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","eventListeners","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","getViewportRect","strategy","html","layoutViewport","getDocumentRect","_element$ownerDocumen","winScroll","body","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","list","isBody","updatedList","rectToClientRect","rect","getInnerBoundingClientRect","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","getExpandedFallbackPlacements","oppositePlacement","flip","_options$mainAxis","checkMainAxis","_options$altAxis","checkAltAxis","specifiedFallbackPlacements","_options$flipVariatio","preferredPlacement","isBasePlacement","fallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","mainVariationSide","altVariationSide","checks","check","numberOfChecks","_loop","_i","fittingPlacement","_ret","flip$1","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","hide","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","hide$1","distanceAndSkiddingToXY","rects","invertDistance","skidding","distance","_options$offset","_data$state$placement","offset$1","popperOffsets$1","getAltAxis","preventOverflow","_options$tether","tether","_options$tetherOffset","tetherOffset","altAxis","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","preventOverflow$1","getHTMLElementScroll","getNodeScroll","isElementScaled","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","documentElement","order","modifiers","map","visited","modifier","sort","requires","dep","depModifier","orderModifiers","orderedModifiers","phase","pending","resolve","mergeByName","merged","current","existing","DEFAULT_OPTIONS","areValidElements","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","effectCleanupFns","isDestroyed","setOptionsAction","cleanupModifierEffects","runModifierEffects","_state$elements","_state$orderedModifie","_state$orderedModifie2","_ref$options","cleanupFn","noopFn","createPopper","COMPONENT_NAME","getPopperUtilityClass","flipPlacement","resolveAnchorEl","anchorEl","isVirtualElement","defaultPopperOptions","PopperTooltip","_slots$root","initialPlacement","popperOptions","popperRefProp","TransitionProps","tooltipRef","ownRef","popperRef","handlePopperRef","handlePopperRefRef","rtlPlacement","setPlacement","resolvedAnchorElement","setResolvedAnchorElement","handlePopperUpdate","box","popperModifiers","childProps","Root","rootProps","Popper","containerProp","keepMounted","transition","exited","setExited","handleEnter","handleExited","resolvedAnchorEl","display","transitionProps","useThemeSystem","_setPrototypeOf","_inheritsLoose","subClass","superClass","setPrototypeOf","timeoutsShape","TransitionGroupContext","forceReflow","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","parentGroup","appear","initialStatus","prevState","nextIn","_proto","prevProps","nextStatus","exit","enter","mounting","_this2","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","_this3","nextState","callback","_this4","active","handler","doesNotHaveTimeoutOrListener","maybeNextCallback","_this$props","pt","noop","Transition$1","reflow","getTransitionProps","_style$transitionDura","_style$transitionTimi","getScale","isWebKit154","Grow","addEndListener","inProp","onEnter","onEntered","onEntering","onExit","onExited","onExiting","TransitionComponent","timer","autoTimeout","nodeRef","normalizedTransitionCallback","maybeIsAppearing","handleEntering","isAppearing","transitionDuration","transitionTimingFunction","handleEntered","handleExiting","handleExit","handleAddEndListener","Grow$1","PopperRoot","BasePopper","components","componentsProps","RootComponent","Popper$1","getTooltipUtilityClass","tooltipClasses","tooltipClasses$1","disableInteractive","touch","TooltipPopper","TooltipTooltip","TooltipArrow","hystersisOpen","hystersisTimer","cursorPosition","composeEventHandler","eventHandler","Tooltip","_slots$popper","_slots$transition","_slots$tooltip","_slots$arrow","_slotProps$popper","_ref6","_slotProps$popper2","_slotProps$transition","_slotProps$tooltip","_ref7","_slotProps$tooltip2","_slotProps$arrow","_ref8","_slotProps$arrow2","childrenProp","describeChild","disableFocusListener","disableHoverListener","disableInteractiveProp","disableTouchListener","enterDelay","enterNextDelay","enterTouchDelay","followCursor","idProp","leaveDelay","leaveTouchDelay","onClose","onOpen","openProp","PopperComponentProp","PopperProps","title","TransitionComponentProp","isRtl","childNode","setChildNode","arrowRef","setArrowRef","ignoreNonTouchEvents","closeTimer","enterTimer","leaveTimer","touchTimer","openState","setOpenState","prevUserSelect","stopTouchInteraction","handleOpen","handleClose","handleLeave","focusVisibleRef","setChildIsFocusVisible","handleBlur","handleFocus","detectTouchStart","childrenProps","handleMouseOver","handleMouseLeave","handleTouchStart","handleTouchEnd","nativeEvent","handleMouseMove","nameOrDescProps","titleIsString","interactiveWrapperListeners","_PopperProps$popperOp","tooltipModifiers","PopperComponent","TooltipComponent","ArrowComponent","popperProps","tooltipProps","tooltipArrowProps","TransitionPropsInner","Tooltip$1","getIcon","icon","menuLabel","leading","MuiListItemIcon","MenuItem","onClick","tooltip","allowForLeadingIcons","iconPathBefore","iconPathAfter","hasAutoFocus","isDense","isSubMenuParent","hasDisabledGutters","hasDivider","focusVisibleClassName","menuItem","MuiMenuItem","MuiListItemText","getAllGroups","menuDefinition","SubMenu","setAnchorEl","parentMenuItem","parentItemProps","handleParentMenuItemClick","renderSubMenuItems","includedGroups","group","GroupedMenuItemList","Menu","getOrderedGroupItems","groupId","allItems","menuProps","commandHandler","groupsToInclude","sortedGroups","itemArray","allowSpaceForLeadingIcons","createMenuItemProps","isLastItemInGroup","firstItem","divKey","itemInfo","menuItemProps","TopLevelMenu","columnId","MenuColumn","metadata","Grid","List","GridMenu","multiColumnMenu","sortedColumns","columnNumbers","columnName","col","getUsePromiseOptionsDefaults","usePromise","promiseFactoryCallback","defaultValueRef","optionsDefaultedRef","setIsLoading","promiseIsCurrent","MenuIcon","HamburgerMenuButton","menuProvider","normalMenu","fullMenu","containerRef","ariaLabelPrefix","isMenuOpen","setMenuOpen","showFullMenu","setShowFullMenu","handleMenuItemClick","handleMenuButtonClick","prevIsOpen","isOpening","menuCommandHandler","command","setOffset","normalMenuData","fullMenuData","menu","IconButton","Drawer","isTooltipSuppressed","adjustMarginToAlignToEdge","MuiIconButton","Spinner","LoaderCircle","TextField","hasError","helperText","onFocus","onBlur","ShadLabel","Toolbar","AppBar","MuiToolbar","alertVariants","Alert","AlertTitle","AlertDescription","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Sonner","Toaster","Slider","SliderPrimitive","Switch","SwitchPrimitives","Tabs","TabsList","TabsTrigger","TabsContent","InstallButton","isInstalling","handleClick","buttonText","Download","EnableButton","isEnabling","DisableButton","isDisabling","UpdateButton","isUpdating","$","M","j","F","W","Z","Q","Y","ee","te","ne","ie","le","ae","oe","ce","se","de","ue","pe","fe","he","me","ge","ye","ke","xe","be","ve","Se","Ee","$e","we","Ce","ze","Le","Ae","Te","Oe","Be","Me","Re","Ie","Ue","De","je","Ne","He","Fe","Pe","_e","We","Ge","Ze","MarkdownRenderer","markdown","Markdown","FilterButton","Filter","DropdownMenuItemType","DropdownMenuItemType2","FilterDropdown","groups","NoExtensionsFound","MoreInfo","category","downloads","languages","moreInfoUrl","numberFormatted","NumberFormat","handleScrollToBottom","User","locale","LucideLink","CircleHelp","VersionHistory","versionHistory","showAllVersions","setShowAllVersions","currentDate","formatTimeString","dateString","date","dateDiff","yearDiff","monthDiff","dayDiff","timeString","sortedEntries","Footer","publisherDisplayName","fileSize","locales","formattedFileSize","formatBytes","languageNames","codes","displayNames","useEvent","unsubscriber","noopUnsubscriber","useEventAsync","unsubscribe","unsub"],"mappings":"+3CAGA,MAAMA,GAAgBC,GAAAA,oBAAoB,CAAE,OAAQ,KAAO,CAAA,EAIpD,SAASC,KAAMC,EAAsB,CACnC,OAAAH,GAAcI,GAAAA,KAAKD,CAAM,CAAC,CACnC,CCJO,MAAME,GAAQC,EAAM,WACzB,CAAC,CAAE,UAAAC,EAAW,KAAAC,EAAM,GAAGC,CAAA,EAASC,IAE5BC,EAAA,IAAC,QAAA,CACC,KAAAH,EACA,UAAWN,EACT,oRACAK,CACF,EACA,IAAAG,EAEC,GAAGD,CAAA,CAAA,CAIZ,EACAJ,GAAM,YAAc,QCNpB,MAAMO,GAAmBC,EAAA,WACvB,CACE,CAAE,aAAAC,EAAc,cAAAC,EAAe,cAAAC,EAAe,aAAAC,EAAc,GAAGR,CAAM,EACrEC,IAGEQ,EAAA,KAAC,MAAI,CAAA,UAAU,cACb,SAAA,CAAAP,EAAA,IAACQ,GAAA,CACE,GAAGV,EACJ,KAAK,OACL,UAAU,0JACV,SAAWW,GAAUN,EAAaM,EAAM,OAAO,KAAK,EACpD,UAAYC,GAAM,CACZA,EAAE,MAAQ,SACCJ,IAEfF,EAAcM,CAAC,CACjB,EACA,QAASL,EACT,IAAAN,CAAA,CACF,EACAC,EAAA,IAACW,GAAA,QAAA,CACC,UAAU,8HACV,QAAS,IAAM,CAEb,QAAQ,IAAI,iBAAiB,CAC/B,CAAA,CACF,CACF,CAAA,CAAA,CAGN,EC9CA,IAAIC,GAAI,OAAO,eACXC,GAAI,CAACC,EAAGJ,EAAGK,IAAML,KAAKI,EAAIF,GAAEE,EAAGJ,EAAG,CAAE,WAAY,GAAI,aAAc,GAAI,SAAU,GAAI,MAAOK,CAAC,CAAE,EAAID,EAAEJ,CAAC,EAAIK,EACzGC,GAAI,CAACF,EAAGJ,EAAGK,IAAMF,GAAEC,EAAG,OAAOJ,GAAK,SAAWA,EAAI,GAAKA,EAAGK,CAAC,EAW9D,MAAME,GAAI,CACR,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MAEA,MAEA,MAEA,MAEA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MAEA,MAEA,MAEA,MAEA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,KACF,EAAGC,GAAI,CACL,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EAAGC,GAAI,CACL,UACA,SACA,YACA,UACA,cACA,SACA,SACA,OACA,WACA,WACA,UACA,UACA,eACA,eACA,OACA,WACA,kBACA,MACA,SACA,WACA,eACA,gBACA,SACA,WACA,eACA,UACA,kBACA,QACA,OACA,OACA,UACA,QACA,QACA,QACA,WACA,YACA,SACA,YACA,UACA,UACA,OACA,OACA,OACA,OACA,SACA,gBACA,gBACA,YACA,YACA,cACA,aACA,kBACA,kBACA,YACA,YACA,QACA,WACA,UACA,QACA,UACA,UACA,SACA,SACA,SACA,OACA,aACA,QACA,SACA,eACA,oBACA,0BACA,SACA,qBACA,sBACA,UACA,qBACA,cACA,cACA,cACA,cACA,mBACA,mBACA,qBACA,YACA,OACA,oBAGA,uBACA,uBACA,sBACA,yBACA,wBACA,qBACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,eACA,cACA,eACA,oBACA,qBACA,0BACA,0BACA,eACA,eACA,YACA,gBACA,cACA,eACA,iBACA,wBACA,mBACA,WACA,QACA,aACA,aACA,aACA,2BACA,4BACA,YACF,EAAGC,GAA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U,SACX,EACD,QAAS,CACP,SAAU,UACV,UAAWA,EACZ,EACD,aAAc,CACZ,SAAU,SACX,EACD,aAAc,CACZ,SAAU,qBACV,MAAOc,EACR,EAED,MAAO,CACL,SAAU,UACV,UAAWa,EACZ,EACD,QAAS,CACP,SAAU,UACV,YAAa,kBACb,UAAWA,EACZ,EACD,gBAAiB,CACf,SAAU,UACV,UAAWA,EACZ,EAED,EAAG,CACD,MAAOpC,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,QAAS,CACP,MAAOA,EACR,EACD,WAAY,CACV,MAAOA,EACR,EACD,aAAc,CACZ,MAAOA,EACR,EACD,cAAe,CACb,MAAOA,EACR,EACD,YAAa,CACX,MAAOA,EACR,EACD,SAAU,CACR,MAAOA,EACR,EACD,SAAU,CACR,MAAOA,EACR,EACD,cAAe,CACb,MAAOA,EACR,EACD,mBAAoB,CAClB,MAAOA,EACR,EACD,iBAAkB,CAChB,MAAOA,EACR,EACD,aAAc,CACZ,MAAOA,EACR,EACD,kBAAmB,CACjB,MAAOA,EACR,EACD,gBAAiB,CACf,MAAOA,EACR,EACD,EAAG,CACD,MAAOD,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,GAAI,CACF,MAAOA,EACR,EACD,OAAQ,CACN,MAAOA,EACR,EACD,UAAW,CACT,MAAOA,EACR,EACD,YAAa,CACX,MAAOA,EACR,EACD,aAAc,CACZ,MAAOA,EACR,EACD,WAAY,CACV,MAAOA,EACR,EACD,QAAS,CACP,MAAOA,EACR,EACD,QAAS,CACP,MAAOA,EACR,EACD,aAAc,CACZ,MAAOA,EACR,EACD,kBAAmB,CACjB,MAAOA,EACR,EACD,gBAAiB,CACf,MAAOA,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EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,CAAC,EAAGA,GAAa,EAA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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[3,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,221,237]} \ No newline at end of file diff --git a/lib/platform-bible-react/dist/index.d.ts b/lib/platform-bible-react/dist/index.d.ts new file mode 100644 index 0000000000..b0d32256a9 --- /dev/null +++ b/lib/platform-bible-react/dist/index.d.ts @@ -0,0 +1,1324 @@ +// Generated by dts-bundle-generator v9.5.1 + +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import * as LabelPrimitive from '@radix-ui/react-label'; +import { PopoverProps } from '@radix-ui/react-popover'; +import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'; +import * as SelectPrimitive from '@radix-ui/react-select'; +import * as SeparatorPrimitive from '@radix-ui/react-separator'; +import * as SliderPrimitive from '@radix-ui/react-slider'; +import * as SwitchPrimitives from '@radix-ui/react-switch'; +import * as TabsPrimitive from '@radix-ui/react-tabs'; +import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'; +import { ColumnDef as TSColumnDef, Row as TSRow, SortDirection as TSSortDirection, Table as TSTable } from '@tanstack/react-table'; +import { VariantProps } from 'class-variance-authority'; +import { LucideProps } from 'lucide-react'; +import React$1 from 'react'; +import { ChangeEventHandler, ComponentProps, FocusEventHandler, MouseEvent as MouseEvent$1, MouseEventHandler, MutableRefObject, PropsWithChildren, ReactNode } from 'react'; +import { Toaster, toast as sonner } from 'sonner'; + +/** Function to run to dispose of something. Returns true if successfully unsubscribed */ +export type Unsubscriber = () => boolean; +/** + * Function to run to dispose of something that runs asynchronously. The promise resolves to true if + * successfully unsubscribed + */ +export type UnsubscriberAsync = () => Promise; +/** Callback function that accepts an event and should run when an event is emitted */ +export type PlatformEventHandler = (event: T) => void; +/** + * Function that subscribes the provided callback to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ +export type PlatformEvent = (callback: PlatformEventHandler) => Unsubscriber; +/** + * A PapiEvent that subscribes asynchronously and resolves an asynchronous unsubscriber. + * + * Note: The callback itself is not asynchronous. + */ +export type PlatformEventAsync = (callback: PlatformEventHandler) => Promise; +export interface ScriptureReference { + bookNum: number; + chapterNum: number; + verseNum: number; +} +/** + * Represents a "node" in the JSON used to present Scripture in the editor, with a path that is + * relative to the start of a verse. + */ +export type ScriptureNode = ScriptureReference & { + jsonPath: string; +}; +/** Represents a specific character offset in the text of a textual Scripture node (in the editor.) */ +export type ScriptureTextAnchor = ScriptureNode & { + offset: number; +}; +/** + * Represents a range of text in the Scripture editor. The start and end node are expected to be in + * the same book. + */ +export type ScriptureSelection = { + start: ScriptureNode | ScriptureTextAnchor; + end?: ScriptureNode | ScriptureTextAnchor; +}; +/** + * An identifier corresponding to a Scripture reference shared by a group of Scripture reference + * consumers. + * + * For example, a few web views that share a Scroll Group Id would all change Scripture Reference + * together. + * + * These are generally expected to be non-negative numbers (starting at 0). + */ +export type ScrollGroupId = number; +/** Within type T, recursively change properties that were of type A to be of type B */ +export type ReplaceType = T extends A ? B : T extends object ? { + [K in keyof T]: ReplaceType; +} : T; +/** Identifier for a string that will be localized in a menu based on the user's UI language */ +export type LocalizeKey = `%${string}%`; +/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */ +export type ReferencedItem = `${string}.${string}`; +export type OrderedItem = { + /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */ + order: number; +}; +export type OrderedExtensibleContainer = OrderedItem & { + /** Determines whether other items can be added to this after it has been defined */ + isExtensible?: boolean; +}; +/** Group of menu items that belongs in a column */ +export type MenuGroupDetailsInColumn = OrderedExtensibleContainer & { + /** ID of column in which this group resides */ + column: ReferencedItem; +}; +/** Group of menu items that belongs in a submenu */ +export type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & { + /** ID of menu item hosting the submenu in which this group resides */ + menuItem: ReferencedItem; +}; +/** Column that includes header text in a menu */ +export type MenuColumnWithHeader = OrderedExtensibleContainer & { + /** Key that represents the text of the header text of the column */ + label: LocalizeKey; +}; +export type MenuItemBase = OrderedItem & { + /** Menu group to which this menu item belongs */ + group: ReferencedItem; + /** Key that represents the text of this menu item to display */ + label: LocalizeKey; + /** Key that represents words the platform should reference when users are searching for menu items */ + searchTerms?: LocalizeKey; + /** Key that represents the text to display if a mouse pointer hovers over the menu item */ + tooltip?: LocalizeKey; + /** Additional information provided by developers to help people who perform localization */ + localizeNotes: string; +}; +/** Menu item that hosts a submenu */ +export type MenuItemContainingSubmenu = MenuItemBase & { + /** ID for this menu item that holds a submenu */ + id: ReferencedItem; +}; +/** Menu item that runs a command */ +export type MenuItemContainingCommand = MenuItemBase & { + /** Name of the PAPI command to run when this menu item is selected. */ + command: ReferencedItem; + /** + * Uri path to the icon to display after the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathAfter?: string; + /** + * Uri path to the icon to display before the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathBefore?: string; +}; +/** + * Group of menu items that can be combined with other groups to form a single context menu/submenu. + * Groups are separated using a line within the menu/submenu. + */ +export type GroupsInSingleColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: OrderedExtensibleContainer | MenuGroupDetailsInSubMenu; +}; +/** + * Group of menu items that can be combined with other groups to form a single menu/submenu within a + * multi-column menu. Groups are separated using a line within the menu/submenu. + */ +export type GroupsInMultiColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu; +}; +/** Group of columns that can be combined with other columns to form a multi-column menu */ +export type ColumnsWithHeaders = { + /** Named column of a menu */ + [property: ReferencedItem]: MenuColumnWithHeader; + /** Defines whether columns can be added to this multi-column menu */ + isExtensible?: boolean; +}; +/** Menu that contains a column without a header */ +export type SingleColumnMenu = { + /** Groups that belong in this menu */ + groups: GroupsInSingleColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; +/** Menu that contains multiple columns with headers */ +export type MultiColumnMenu = { + /** Columns that belong in this menu */ + columns: ColumnsWithHeaders; + /** Groups that belong in this menu */ + groups: GroupsInMultiColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; +/** + * Type that converts any menu type before it is localized to what it is after it is localized. This + * can be applied to any menu type as needed. + */ +export type Localized = ReplaceType, ReferencedItem, string>; +/** Localized string value associated with this key */ +export type LocalizedStringValue = string; +/** + * Map whose keys are localized string keys and whose values provide information about how to + * localize strings for the localized string key + */ +export interface LanguageStrings { + [k: LocalizeKey]: LocalizedStringValue; +} +export type BookChapterControlProps = { + scrRef: ScriptureReference; + handleSubmit: (scrRef: ScriptureReference) => void; +}; +export declare function BookChapterControl({ scrRef, handleSubmit }: BookChapterControlProps): import("react/jsx-runtime").JSX.Element; +export type ChapterRangeSelectorProps = { + startChapter: number; + endChapter: number; + handleSelectStartChapter: (chapter: number) => void; + handleSelectEndChapter: (chapter: number) => void; + isDisabled?: boolean; + chapterCount: number; +}; +export function ChapterRangeSelector({ startChapter, endChapter, handleSelectStartChapter, handleSelectEndChapter, isDisabled, chapterCount, }: ChapterRangeSelectorProps): import("react/jsx-runtime").JSX.Element; +export declare enum BookSelectionMode { + CURRENT_BOOK = "current book", + CHOOSE_BOOKS = "choose books" +} +/** + * Object containing all keys used for localization in this component. If you're using this + * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the + * localized strings and pass them into the localizedStrings prop of this component + */ +export declare const BOOK_SELECTOR_STRING_KEYS: readonly [ + "%webView_bookSelector_currentBook%", + "%webView_bookSelector_choose%", + "%webView_bookSelector_chooseBooks%" +]; +export type BookSelectorLocalizedStrings = { + [localizedInventoryKey in (typeof BOOK_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue; +}; +export type BookSelectorProps = ChapterRangeSelectorProps & { + handleBookSelectionModeChange: (newMode: BookSelectionMode) => void; + currentBookName: string; + onSelectBooks: () => void; + selectedBookIds: string[]; + localizedStrings: BookSelectorLocalizedStrings; +}; +export function BookSelector({ handleBookSelectionModeChange, currentBookName, onSelectBooks, selectedBookIds, chapterCount, endChapter, handleSelectEndChapter, startChapter, handleSelectStartChapter, localizedStrings, }: BookSelectorProps): import("react/jsx-runtime").JSX.Element; +export type ColumnDef = TSColumnDef; +export type RowContents = TSRow; +export type TableContents = TSTable; +export type SortDirection = TSSortDirection; +export interface DataTableProps { + columns: ColumnDef[]; + data: TData[]; + enablePagination?: boolean; + showPaginationControls?: boolean; + showColumnVisibilityControls?: boolean; + stickyHeader?: boolean; + onRowClickHandler?: (row: RowContents, table: TableContents) => void; +} +/** + * Feature-rich table component that infuses our basic shadcn-based Table component with features + * from TanStack's React Table library + */ +export declare function DataTable({ columns, data, enablePagination, showPaginationControls, showColumnVisibilityControls, stickyHeader, onRowClickHandler, }: DataTableProps): import("react/jsx-runtime").JSX.Element; +/** + * Object containing all keys used for localization in this component. If you're using this + * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the + * localized strings and pass them into the localizedStrings prop of this component + */ +export declare const INVENTORY_STRING_KEYS: readonly [ + "%webView_inventory_all%", + "%webView_inventory_approved%", + "%webView_inventory_unapproved%", + "%webView_inventory_unknown%", + "%webView_inventory_scope_currentBook%", + "%webView_inventory_scope_chapter%", + "%webView_inventory_scope_verse%", + "%webView_inventory_filter_text%", + "%webView_inventory_occurrences_table_header_reference%", + "%webView_inventory_occurrences_table_header_occurrence%" +]; +export type InventoryLocalizedStrings = { + [localizedInventoryKey in (typeof INVENTORY_STRING_KEYS)[number]]?: LocalizedStringValue; +}; +export type Scope = "book" | "chapter" | "verse"; +export type Status = "approved" | "unapproved" | "unknown"; +export type ItemData = { + item: string; + count: number; + status: Status; +}; +/** + * Gets an icon that indicates the current sorting direction based on the provided input + * + * @param sortDirection Sorting direction. Can be ascending ('asc'), descending ('desc') or false ( + * i.e. not sorted) + * @returns The appropriate sorting icon for the provided sorting direction + */ +export declare const getSortingIcon: (sortDirection: false | SortDirection) => React$1.ReactNode; +export type InventoryProps = { + scriptureReference: ScriptureReference; + setScriptureReference: (scriptureReference: ScriptureReference) => void; + localizedStrings: InventoryLocalizedStrings; + extractItems: (text: string, item?: string | undefined) => string[]; + approvedItems: string[]; + onApprovedItemsChange: (items: string[]) => void; + unapprovedItems: string[]; + onUnapprovedItemsChange: (items: string[]) => void; + text: string | undefined; + scope: Scope; + onScopeChange: (scope: Scope) => void; + getColumns: (onStatusChange: (newItems: string[], status: Status) => void) => ColumnDef[]; +}; +/** Inventory component that is used to view and control the status of provided project settings */ +export function Inventory({ scriptureReference, setScriptureReference, localizedStrings, extractItems, approvedItems, onApprovedItemsChange, unapprovedItems, onUnapprovedItemsChange, text, scope, onScopeChange, getColumns, }: InventoryProps): import("react/jsx-runtime").JSX.Element; +/** + * Function that creates the item column for inventories + * + * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.) + * @returns Column that shows the inventory items. Should be used with the DataTable component + */ +export declare const inventoryItemColumn: (itemLabel: string) => ColumnDef; +/** + * Function that creates the count column for inventories. Should be used with the DataTable + * component. + * + * @param itemLabel Localized label for the count column + * @returns Column that shows the number of occurrences of the related inventory items + */ +export declare const inventoryCountColumn: (countLabel: string) => ColumnDef; +/** + * Function that creates the status column for inventories. Should be used with the DataTable + * component. + * + * @param itemLabel Localized label for the status column + * @param statusChangeHandler Callback function that handles status updates to selected item(s) + * @returns Column that shows the status of the related inventory items. + */ +export declare const inventoryStatusColumn: (statusLabel: string, statusChangeHandler: (items: string[], status: Status) => void) => ColumnDef; +export type TabKeyValueContent = { + key: string; + value: string; + content: React$1.ReactNode; +}; +export type NavigationContentSearchProps = { + /** List of values and keys for each tab this component should provide */ + tabList: TabKeyValueContent[]; + /** Handler to run when the value of the search bar changes */ + onSearch: (searchQuery: string) => void; + /** Optional placeholder for the search bar */ + searchPlaceholder?: string; + /** Optional title to include in the header */ + headerTitle?: string; + /** Optional flag to make the search bar appear full width */ + isSearchBarFullWidth?: boolean; + /** Text direction ltr or rtl */ + direction?: "ltr" | "rtl"; +}; +export function NavigationContentSearch({ tabList, onSearch, searchPlaceholder, headerTitle, isSearchBarFullWidth, direction, }: NavigationContentSearchProps): import("react/jsx-runtime").JSX.Element; +/** + * Information (e.g., a checking error or some other type of "transient" annotation) about something + * noteworthy at a specific place in an instance of the Scriptures. + */ +export type ScriptureItemDetail = ScriptureSelection & { + /** + * Text of the error, note, etc. In the future, we might want to support something more than just + * text so that a JSX element could be provided with a link or some other controls related to the + * issue being reported. + */ + detail: string; +}; +/** + * A uniquely identifiable source of results that can be displayed in the ScriptureResultsViewer. + * Generally, the source will be a particular Scripture check, but there may be other types of + * sources. + */ +export type ResultsSource = { + /** + * Uniquely identifies the source. + * + * @type {string} + */ + id: string; + /** + * Name (potentially localized) of the source, suitable for display in the UI. + * + * @type {string} + */ + displayName: string; +}; +export type ScriptureSrcItemDetail = ScriptureItemDetail & { + /** Source/type of detail. Can be used for grouping. */ + source: ResultsSource; +}; +/** + * Represents a set of results keyed by Scripture reference. Generally, the source will be a + * particular Scripture check, but this type also allows for other types of uniquely identifiable + * sources. + */ +export type ResultsSet = { + /** + * The backing source associated with this set of results. + * + * @type {ResultsSource} + */ + source: ResultsSource; + /** + * Array of Scripture item details (messages keyed by Scripture reference). + * + * @type {ScriptureItemDetail[]} + */ + data: ScriptureItemDetail[]; +}; +export type ScriptureResultsViewerColumnInfo = { + /** Optional header to display for the Reference column. Default value: 'Scripture Reference'. */ + scriptureReferenceColumnName?: string; + /** Optional text to display to refer to the Scripture book group. Default value: 'Scripture Book'. */ + scriptureBookGroupName?: string; + /** Optional header to display for the Type column. Default value: 'Type'. */ + typeColumnName?: string; + /** Optional header to display for the Details column. Default value: 'Details' */ + detailsColumnName?: string; +}; +export type ScriptureResultsViewerProps = ScriptureResultsViewerColumnInfo & { + /** Groups of ScriptureItemDetail objects from particular sources (e.g., Scripture checks) */ + sources: ResultsSet[]; + /** Flag indicating whether to display column headers. Default is false. */ + showColumnHeaders?: boolean; + /** Flag indicating whether to display source column. Default is false. */ + showSourceColumn?: boolean; + /** Callback function to notify when a row is selected */ + onRowSelected?: (selectedRow: ScriptureSrcItemDetail | undefined) => void; + /** Text direction ltr or rtl */ + direction?: "ltr" | "rtl"; +}; +/** + * Component to display a combined list of detailed items from one or more sources, where the items + * are keyed primarily by Scripture reference. This is particularly useful for displaying a list of + * results from Scripture checks, but more generally could be used to display any "results" from any + * source(s). The component allows for grouping by Scripture book, source, or both. By default, it + * displays somewhat "tree-like" which allows it to be more horizontally compact and intuitive. But + * it also has the option of displaying as a traditional table with column headings (with or without + * the source column showing). + */ +export function ScriptureResultsViewer({ sources, showColumnHeaders, showSourceColumn, scriptureReferenceColumnName, scriptureBookGroupName, typeColumnName, detailsColumnName, onRowSelected, direction, }: ScriptureResultsViewerProps): import("react/jsx-runtime").JSX.Element; +export type ScrollGroupSelectorProps = { + /** + * List of scroll group ids to show to the user. Either a {@link ScrollGroupId} or `undefined` for + * no scroll group + */ + availableScrollGroupIds: (ScrollGroupId | undefined)[]; + /** Currently selected scroll group id. `undefined` for no scroll group */ + scrollGroupId: ScrollGroupId | undefined; + /** Callback function run when the user tries to change the scroll group id */ + onChangeScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void; + /** + * Localized strings to use for displaying scroll group ids. Must be an object whose keys are + * `getLocalizeKeyForScrollGroupId(scrollGroupId)` for all scroll group ids (and `undefined` if + * included) in {@link ScrollGroupSelectorProps.availableScrollGroupIds} and whose values are the + * localized strings to use for those scroll group ids. + * + * Defaults to English localizations of English alphabet for scroll groups 0-25 (e.g. 0 is A) and + * Ø for `undefined`. Will fill in any that are not provided with these English localizations. + * Also, if any values match the keys, the English localization will be used. This is useful in + * case you want to pass in a temporary version of the localized strings while your localized + * strings load. + * + * @example + * + * ```typescript + * const myScrollGroupIdLocalizedStrings = { + * [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø', + * [getLocalizeKeyForScrollGroupId(0)]: 'A', + * [getLocalizeKeyForScrollGroupId(1)]: 'B', + * [getLocalizeKeyForScrollGroupId(2)]: 'C', + * [getLocalizeKeyForScrollGroupId(3)]: 'D', + * [getLocalizeKeyForScrollGroupId(4)]: 'E', + * }; + * ``` + * + * @example + * + * ```tsx + * const availableScrollGroupIds = [undefined, 0, 1, 2, 3, 4]; + * + * const localizeKeys = getLocalizeKeysForScrollGroupIds(); + * + * const [localizedStrings] = useLocalizedStrings(localizeKeys); + * + * ... + * + * + * ``` + */ + localizedStrings?: LanguageStrings; +}; +/** Selector component for choosing a scroll group */ +export function ScrollGroupSelector({ availableScrollGroupIds, scrollGroupId, onChangeScrollGroupId, localizedStrings, }: ScrollGroupSelectorProps): import("react/jsx-runtime").JSX.Element; +/** Props for the SettingsList component, currently just children */ +export type SettingsListProps = React$1.PropsWithChildren; +/** + * SettingsList component is a wrapper for list items. Rendered with a formatted div + * + * @param children To populate the list with + * @returns Formatted div encompassing the children + */ +export declare function SettingsList({ children }: SettingsListProps): import("react/jsx-runtime").JSX.Element; +/** Props for SettingsListItem component */ +export type SettingsListItemProps = React$1.PropsWithChildren & { + /** Primary text of the list item */ + primary: string; + /** Optional text of the list item */ + secondary?: string | undefined; + /** Optional boolean to display a message if the children aren't loaded yet. Defaults to false */ + isLoading?: boolean; + /** Optional message to display if isLoading */ + loadingMessage?: string; +}; +/** + * SettingsListItem component is a common list item. Rendered with a formatted div + * + * @param primary Primary text of the list item + * @param secondary Optional secondary text of the list item + * @param isLoading Optional, to display a message if the action component isn't generated yet, + * defaults to false + * @param children The action component(s) to provide for this item + * @param loadingMessage Optional, message to display if isLoading + * @returns Formatted div encompassing the list item content + */ +export declare function SettingsListItem({ primary, secondary, children, isLoading, loadingMessage, }: SettingsListItemProps): import("react/jsx-runtime").JSX.Element; +/** Props for SettingsListHeader component */ +export type SettingsListHeaderProps = { + /** The primary text of the list header */ + primary: string; + /** Optional secondary text of the list header */ + secondary?: string | undefined; + /** Optional boolean to include a separator underneath the secondary text. Defaults to false */ + includeSeparator?: boolean; +}; +/** + * SettingsListHeader component displays text above the list + * + * @param primary The primary text of the list header + * @param secondary Optional secondary text of the list header + * @param includeSeparator Optional boolean to include a separator underneath the secondary text. + * Defaults to false + * @returns Formatted div with list header content + */ +export declare function SettingsListHeader({ primary, secondary, includeSeparator, }: SettingsListHeaderProps): import("react/jsx-runtime").JSX.Element; +export type ChecklistProps = { + /** Optional string representing the id attribute of the Checklist */ + id?: string; + /** Optional string representing CSS class name(s) for styling */ + className?: string; + /** Array of strings representing the checkable items */ + listItems: string[]; + /** Array of strings representing the checked items */ + selectedListItems: string[]; + /** + * Function that is called when a checkbox item is selected or deselected + * + * @param item The string description for this item + * @param selected True if selected, false if not selected + */ + handleSelectListItem: (item: string, selected: boolean) => void; + /** + * Optional function creates a label for a provided checkable item + * + * @param item The item for which a label is to be created + * @returns A string representing the label text for the checkbox associated with that item + */ + createLabel?: (item: string) => string; +}; +/** Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array. */ +export function Checklist({ id, className, listItems, selectedListItems, handleSelectListItem, createLabel, }: ChecklistProps): import("react/jsx-runtime").JSX.Element; +export declare const buttonVariants: (props?: ({ + variant?: "link" | "default" | "outline" | "destructive" | "secondary" | "ghost" | null | undefined; + size?: "default" | "icon" | "sm" | "lg" | null | undefined; +} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string; +export interface ButtonProps extends React$1.ButtonHTMLAttributes, VariantProps { + asChild?: boolean; +} +export declare const Button: React$1.ForwardRefExoticComponent>; +export type ComboBoxLabelOption = { + label: string; +}; +export type ComboBoxOption = string | number | ComboBoxLabelOption; +export type ComboBoxProps = { + /** Optional unique identifier */ + id?: string; + /** Text label title for combobox */ + /** List of available options for the dropdown menu */ + options?: readonly T[]; + /** Additional css classes to help with unique styling of the combo box */ + className?: string; + /** + * The selected value that the combo box currently holds. Must be shallow equal to one of the + * options entries. + */ + value?: T; + /** Triggers when content of textfield is changed */ + onChange?: (newValue: T) => void; + /** Used to determine the string value for a given option. */ + getOptionLabel?: (option: ComboBoxOption) => string; + /** Text displayed on button if `value` is undefined */ + buttonPlaceholder?: string; + /** Placeholder text for text field */ + textPlaceholder?: string; + /** Text to display when no options match input */ + commandEmptyMessage?: string; + /** Variant of button */ + buttonVariant?: ButtonProps["variant"]; + /** Text direction ltr or rtl */ + dir?: Direction; + /** Optional boolean to set if trigger should be disabled */ + isDisabled?: boolean; +} & PopoverProps; +export type Direction = "ltr" | "rtl"; +/** + * Autocomplete input and command palette with a list of suggestions. + * + * Thanks to Shadcn for heavy inspiration and documentation + * https://ui.shadcn.com/docs/components/combobox + */ +export declare function ComboBox({ id, options, className, value, onChange, getOptionLabel, buttonPlaceholder, textPlaceholder, commandEmptyMessage, buttonVariant, dir, isDisabled, ...props }: ComboBoxProps): import("react/jsx-runtime").JSX.Element; +export type MenuItemInfoBase = { + /** Text (displayable in the UI) as the name of the menu item */ + label: string; + /** Text to display when the mouse hovers over the menu item */ + tooltip?: string; +}; +export type Command = MenuItemInfoBase & { + /** Command to execute (string.string) */ + command: string; +}; +export type SubMenu = MenuItemInfoBase & { + /** Command to execute (string.string) */ + items: MenuItemInfo[]; +}; +export interface CommandHandler { + (command: Command): void; +} +export type MenuPropsBase = { + menuDefinition: Localized; + commandHandler: CommandHandler; + /** + * Additional action to perform when any menu item is clicked. Allows the caller to handle event + * (e.g., to close the menu). + */ + onClick?: (event: React$1.MouseEvent) => void; +}; +export type MenuItemListProps = MenuPropsBase & { + /** Optional unique (column) identifier */ + columnId?: ReferencedItem; +}; +export type MenuItemProps = Omit & React$1.PropsWithChildren<{ + /** Optional unique identifier */ + id?: string; + onClick: (event: React$1.MouseEvent) => void; +}>; +export type MenuItemInfo = (Command | SubMenu) & { + /** + * If specified, menu item will be inset if it does not have a leading icon. + * + * @default true + */ + allowForLeadingIcons?: boolean; + /** + * If specified, the path to the icon image to display on the leading side of the menu text. + * + * @default undefined (no leading icon will be shown) + */ + iconPathBefore?: string; + /** + * If specified, the path to the icon image to display on the trailing side of the menu text. + * + * @default undefined (no trailing icon will be shown) + */ + iconPathAfter?: string; + /** + * If true, list item is focused during the first mount + * + * @default false + */ + hasAutoFocus?: boolean; + /** Additional css classes to help with unique styling of the menu item */ + className?: string; + /** + * If true, the menu item will appear disabled and it will not respond to clicks or mouse hovers. + * + * @default false + */ + isDisabled?: boolean; + /** + * If true, compact vertical padding designed for keyboard and mouse input is used. + * + * @default true + */ + isDense?: boolean; + /** + * If true, a right-arrow icon will be displayed (iconPathAfter, if specified, will be ignored). + * + * @default false + */ + isSubMenuParent?: boolean; + /** + * If true, the left and right padding is removed + * + * @default false + */ + hasDisabledGutters?: boolean; + /** + * If true, a 1px light border is added to bottom of menu item + * + * @default false + */ + hasDivider?: boolean; + /** Help identify which element has keyboard focus */ + focusVisibleClassName?: string; + /** If it's a submenu, it should have the items property */ + items?: MenuItemInfo[]; +}; +export function MenuItem(props: MenuItemProps): import("react/jsx-runtime").JSX.Element; +export type GridMenuInfo = { + /** The menu object containing information about the columns, groups, and items to display. */ + multiColumnMenu: Localized; +}; +export type GridMenuProps = GridMenuInfo & { + /** Optional unique identifier */ + id?: string; + commandHandler: CommandHandler; + /** Additional css classes to help with unique styling of the grid menu */ + className?: string; +}; +export function GridMenu({ commandHandler, className, multiColumnMenu, id, }: GridMenuProps): import("react/jsx-runtime").JSX.Element; +export interface MultiColumnMenuProvider { + (isSupportAndDevelopment: boolean): Promise>; +} +export type HamburgerMenuButtonProps = React$1.PropsWithChildren & { + /** The handler to use for menu commands (and eventually toolbar commands). */ + commandHandler: CommandHandler; + /** + * Optional reference to the "div" container that determines the where the menu should appear. If + * not defined, then (1,1) used. + */ + containerRef?: React$1.MutableRefObject; + /** + * The delegate to use to get the menu data. If not specified or if it returns undefined, the data + * in normalMenu or fullMenu property will be used. + */ + menuProvider?: MultiColumnMenuProvider; + /** + * The menu data to show when the menu is opened if the menuProvider property is not defined. + * (This allows for a default or test-only static menu to be used.) + */ + normalMenu?: Localized; + /** + * The menu data to show for "full" menu (when opened with the SHIFT key pressed) if the + * menuProvider property is not defined. (This allows for a default or test-only static menu to be + * used.) + */ + fullMenu?: Localized; + /** Additional css class(es) to help with unique styling of the sub-components */ + className?: string; + /** Value to use as prefix for ARIA labels on interactive sub-components */ + ariaLabelPrefix?: string; +}; +export function HamburgerMenuButton({ menuProvider, normalMenu, fullMenu, commandHandler, containerRef, className, ariaLabelPrefix, children, }: HamburgerMenuButtonProps): import("react/jsx-runtime").JSX.Element; +export type IconButtonProps = React$1.PropsWithChildren<{ + /** Optional unique identifier */ + id?: string; + /** + * Required. Used as both the tooltip (aka, title) and the aria-label (used for accessibility, + * testing, etc.), unless a distinct tooltip is supplied. + */ + label: string; + /** + * Enabled status of button + * + * @default false + */ + isDisabled?: boolean; + /** Optional tooltip to display if different from the aria-label. */ + tooltip?: string; + /** If true, no tooltip will be displayed. */ + isTooltipSuppressed?: boolean; + /** + * If given, uses a negative margin to counteract the padding on one side (this is often helpful + * for aligning the left or right side of the icon with content above or below, without ruining + * the border size and shape). + * + * @default false + */ + adjustMarginToAlignToEdge?: "end" | "start" | false; + /** + * The size of the component. small is equivalent to the dense button styling. + * + * @default false + */ + size: "small" | "medium" | "large"; + /** Additional css classes to help with unique styling of the button */ + className?: string; + /** Optional click handler */ + onClick?: React$1.MouseEventHandler; +}>; +/** + * Iconic button a user can click to do something + * + * Thanks to MUI for heavy inspiration and documentation + * https://mui.com/material-ui/getting-started/overview/ + */ +export declare function IconButton({ id, label, isDisabled, tooltip, isTooltipSuppressed, adjustMarginToAlignToEdge, size, className, onClick, children, }: IconButtonProps): import("react/jsx-runtime").JSX.Element; +export type SearchBarProps = { + /** + * Callback fired to handle the search query when button pressed + * + * @param searchQuery + */ + onSearch: (searchQuery: string) => void; + /** Optional string that appears in the search bar without a search string */ + placeholder?: string; + /** Optional boolean to set the input base to full width */ + isFullWidth?: boolean; +}; +export function SearchBar({ onSearch, placeholder, isFullWidth }: SearchBarProps): import("react/jsx-runtime").JSX.Element; +export type SpinnerProps = LucideProps; +export declare const Spinner: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; +export type TextFieldProps = { + /** Optional unique identifier */ + id?: string; + /** + * If `true`, the component is disabled. + * + * @default false + */ + isDisabled?: boolean; + /** + * If `true`, the label is displayed in an error state. + * + * @default false + */ + hasError?: boolean; + /** + * If `true`, the input will take up the full width of its container. + * + * @default false + */ + isFullWidth?: boolean; + /** Text that gives the user instructions on what contents the TextField expects */ + helperText?: string; + /** The title of the TextField */ + label?: string; + /** The short hint displayed in the `input` before the user enters a value. */ + placeholder?: string; + /** + * If `true`, the label is displayed as required and the `input` element is required. + * + * @default false + */ + isRequired?: boolean; + /** Additional css classes to help with unique styling of the text field */ + className?: string; + /** Starting value for the text field if it is not controlled */ + defaultValue?: string | number; + /** Value of the text field if controlled */ + value?: string | number; + /** Triggers when content of textfield is changed */ + onChange?: React$1.ChangeEventHandler; + /** Triggers when textfield gets focus */ + onFocus?: React$1.FocusEventHandler; + /** Triggers when textfield loses focus */ + onBlur?: React$1.FocusEventHandler; +}; +/** + * Text input field + * + * Thanks to Shadcn for heavy inspiration and documentation + * https://ui.shadcn.com/docs/components/input#with-label + */ +export declare function TextField({ id, isDisabled, hasError, isFullWidth, helperText, label, placeholder, isRequired, className, defaultValue, value, onChange, onFocus, onBlur, }: TextFieldProps): import("react/jsx-runtime").JSX.Element; +export type ToolbarProps = React$1.PropsWithChildren<{ + /** The handler to use for menu commands (and eventually toolbar commands). */ + commandHandler: CommandHandler; + /** + * The optional delegate to use to get the menu data. If not specified, the "hamburger" menu will + * not display. + */ + menuProvider?: MultiColumnMenuProvider; + /** Optional unique identifier */ + id?: string; + /** Additional css classes to help with unique styling of the toolbar */ + className?: string; +}>; +export function Toolbar({ menuProvider, commandHandler, className, id, children, }: ToolbarProps): import("react/jsx-runtime").JSX.Element; +export declare const Alert: React$1.ForwardRefExoticComponent & VariantProps<(props?: ({ + variant?: "default" | "destructive" | null | undefined; +} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string> & React$1.RefAttributes>; +export declare const AlertTitle: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const AlertDescription: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const Card: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const CardHeader: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const CardTitle: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const CardDescription: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const CardContent: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const CardFooter: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const Checkbox: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const DropdownMenu: React$1.FC; +export declare const DropdownMenuTrigger: React$1.ForwardRefExoticComponent>; +export declare const DropdownMenuGroup: React$1.ForwardRefExoticComponent>; +export declare const DropdownMenuPortal: React$1.FC; +export declare const DropdownMenuSub: React$1.FC; +export declare const DropdownMenuRadioGroup: React$1.ForwardRefExoticComponent>; +export type DropdownMenuSubTriggerProps = React$1.ComponentPropsWithoutRef & { + className?: string; + inset?: boolean; +}; +export type DropdownMenuSubContentProps = React$1.ComponentPropsWithoutRef & { + className?: string; +}; +export type DropdownMenuContentProps = React$1.ComponentPropsWithoutRef & { + className?: string; + sideOffset?: number; +}; +export type DropdownMenuItemProps = React$1.ComponentPropsWithoutRef & { + className?: string; + inset?: boolean; +}; +export type DropdownMenuCheckboxItemProps = React$1.ComponentPropsWithoutRef & { + className?: string; + checked?: boolean; +}; +export type DropdownMenuRadioItemProps = React$1.ComponentPropsWithoutRef & { + className?: string; +}; +export type DropdownMenuLabelProps = React$1.ComponentPropsWithoutRef & { + className?: string; + inset?: boolean; +}; +export type DropdownMenuSeparatorProps = React$1.ComponentPropsWithoutRef & { + className?: string; +}; +export type DropdownMenuShortcutProps = React$1.HTMLAttributes & { + className?: string; +}; +export declare const DropdownMenuSubTrigger: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; + inset?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuSubContent: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuContent: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; + sideOffset?: number | undefined; +} & React$1.RefAttributes>; +/** + * TODO: fix: direction is not automatically handled by this component, so that shortcuts are + * display always to the right + */ +export declare const DropdownMenuItem: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; + inset?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuCheckboxItem: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; + checked?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuRadioItem: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuLabel: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; + inset?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const DropdownMenuSeparator: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps): import("react/jsx-runtime").JSX.Element; +export declare namespace DropdownMenuShortcut { + var displayName: string; +} +export interface InputProps extends React$1.InputHTMLAttributes { +} +export declare const Input: React$1.ForwardRefExoticComponent>; +export declare const Label: React$1.ForwardRefExoticComponent, "ref"> & VariantProps<(props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string> & React$1.RefAttributes>; +export declare const RadioGroup: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const RadioGroupItem: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const Select: React$1.FC; +export declare const SelectGroup: React$1.ForwardRefExoticComponent>; +export declare const SelectValue: React$1.ForwardRefExoticComponent>; +export declare const SelectTrigger: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectScrollUpButton: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectScrollDownButton: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectContent: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectLabel: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectItem: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const SelectSeparator: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const Separator: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export type SonnerProps = React$1.ComponentProps; +export declare function Sonner({ ...props }: SonnerProps): import("react/jsx-runtime").JSX.Element; +export declare const Slider: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const Switch: React$1.ForwardRefExoticComponent, "ref"> & React$1.RefAttributes>; +export declare const Table: React$1.ForwardRefExoticComponent & { + stickyHeader?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const TableHeader: React$1.ForwardRefExoticComponent & { + stickyHeader?: boolean | undefined; +} & React$1.RefAttributes>; +export declare const TableBody: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const TableFooter: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const TableRow: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const TableHead: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const TableCell: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const TableCaption: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const Tabs: React$1.ForwardRefExoticComponent>; +export type TabsTriggerProps = React$1.ComponentPropsWithoutRef & { + className?: string; +}; +export declare const TabsList: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const TabsTrigger: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const TabsContent: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export type LeftTabsTriggerProps = TabsTriggerProps & { + value: string; + ref?: React$1.Ref; +}; +export declare const VerticalTabs: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const VerticalTabsList: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const VerticalTabsTrigger: React$1.ForwardRefExoticComponent & React$1.RefAttributes>; +export declare const VerticalTabsContent: React$1.ForwardRefExoticComponent, "ref"> & { + className?: string | undefined; +} & React$1.RefAttributes>; +export declare const ToggleGroup: React$1.ForwardRefExoticComponent<((Omit, "ref"> | Omit, "ref">) & VariantProps<(props?: ({ + variant?: "default" | "outline" | null | undefined; + size?: "default" | "sm" | "lg" | null | undefined; +} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string>) & React$1.RefAttributes>; +export declare const ToggleGroupItem: React$1.ForwardRefExoticComponent, "ref"> & VariantProps<(props?: ({ + variant?: "default" | "outline" | null | undefined; + size?: "default" | "sm" | "lg" | null | undefined; +} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string> & React$1.RefAttributes>; +export type InstallButtonProps = { + /** The installing boolean value determines the state of the button. */ + isInstalling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; + /** Optional text for the button. */ + buttonText?: string; +} & ButtonProps; +/** + * The InstallButton component is a button designed for initiating installs. It includes visuals for + * active installing and idle states. + * + * @param isInstalling The installing boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @param buttonText Optional text for the button. + * @returns A install button. + */ +export function InstallButton({ isInstalling, handleClick, buttonText, className, ...props }: InstallButtonProps): import("react/jsx-runtime").JSX.Element; +export type EnableButtonProps = { + /** The enabling boolean value determines the state of the button. */ + isEnabling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; +/** + * The EnableButton component is a button designed for initiating enabling of downloads. It includes + * visuals for active enabling and idle states. + * + * @param isEnabling The enabling boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to enable. + */ +export function EnableButton({ isEnabling, handleClick, className, ...props }: EnableButtonProps): import("react/jsx-runtime").JSX.Element; +export type DisableButtonProps = { + /** The disabling boolean value determines the state of the button. */ + isDisabling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; +/** + * The DisableButton component is a button designed for initiating disabling of downloads. It + * includes visuals for active disabling and idle states. + * + * @param isDisabling The disabling boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to disable. + */ +export function DisableButton({ isDisabling, handleClick, className, ...props }: DisableButtonProps): import("react/jsx-runtime").JSX.Element; +export type UpdateButtonProps = { + /** The updating boolean value determines the state of the button. */ + isUpdating: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; +/** + * The UpdateButton component is a button designed for initiating updates for downloaded extensions. + * It includes visuals for active updating and idle states. + * + * @param isUpdating The updating boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to update. + */ +export function UpdateButton({ isUpdating, handleClick, className, ...props }: UpdateButtonProps): import("react/jsx-runtime").JSX.Element; +export interface MarkdownRendererProps { + /** Optional unique identifier */ + id?: string; + /** The markdown string to render */ + markdown: string; +} +/** + * This component renders markdown content given a markdown string. It uses typography styles from + * the platform. + * + * @param markdown The markdown string to render. + * @param id Optional unique identifier + * @returns A div containing the rendered markdown content. + */ +export function MarkdownRenderer({ id, markdown }: MarkdownRendererProps): import("react/jsx-runtime").JSX.Element; +export declare enum DropdownMenuItemType { + Check = 0, + Radio = 1 +} +export type DropdownItem = { + /** The label is the text that will be displayed on the dropdown item. */ + label: string; + /** The itemType determines the DropdownMenuItemType type as either Check or Radio. */ + itemType: DropdownMenuItemType; + /** The onClick function is called when the item is clicked. */ + onClick: () => void; +}; +export type DropdownGroup = { + /** + * The label is the text that will be displayed on the dropdown group. It is used to categorize + * the items in the group. + */ + label: string; + /** The items array contains the items that will be displayed in the dropdown group */ + items: DropdownItem[]; +}; +export type FilterDropdownProps = { + /** Object unique identifier */ + id?: string; + /** The groups array contains the groups that will be displayed in the dropdown */ + groups: DropdownGroup[]; +}; +/** + * The FilterDropdown component is a dropdown designed for filtering content. It includes groups of + * items that can be checkboxes or radio items. + * + * @param id Optional unique identifier + * @param groups The groups array contains the groups that will be displayed in the dropdown + * @returns A filter dropdown. + */ +export function FilterDropdown({ id, groups }: FilterDropdownProps): import("react/jsx-runtime").JSX.Element; +/** + * The FilterButton component is a button designed for initiating filtering of data. It is designed + * to be used with the dropdown menu. It uses forwardRef to pass the button to the dropdown trigger + * asChild. + * + * @returns A button that can be used to filter. + */ +export declare const FilterButton: import("react").ForwardRefExoticComponent>; +export interface NoExtensionsFoundProps { + /** Optional unique identifier */ + id?: string; + /** The message to display */ + message: string; +} +/** + * This component displays a message to the user when no extensions are found in the marketplace. + * + * @param id Optional unique identifier + * @param message The message to display. + * @returns {JSX.Element} - Returns the message component that displays the message to the user. + */ +export function NoExtensionsFound({ id, message }: NoExtensionsFoundProps): import("react/jsx-runtime").JSX.Element; +/** Interface that stores the parameters passed to the More Info component */ +export interface MoreInfoProps { + /** Optional unique identifier */ + id?: string; + /** The category of the extension */ + category: string; + /** The number of downloads for the extension */ + downloads: Record; + /** The languages supported by the extension */ + languages: string[]; + /** The URL to the more info page of the extension */ + moreInfoUrl: string; +} +/** + * This component displays the more info section of the extension which includes the category, + * number of downloads, languages, and links to the website and support + * + * @param id Optional unique identifier + * @param category The category of the extension + * @param downloads The number of downloads for the extension + * @param languages The languages supported by the extension + * @param moreInfoUrl The URL to the more info page of the extension + * @returns {JSX.Element} - Returns the more info component that displays the category, number of + * downloads, languages, and links to the website and support + */ +export function MoreInfo({ id, category, downloads, languages, moreInfoUrl, }: MoreInfoProps): import("react/jsx-runtime").JSX.Element; +export type VersionInformation = { + /** Date the version was published */ + date: string; + /** Description of the changes in the version */ + description: string; +}; +/** Type to store the version history information */ +export type VersionHistoryType = Record; +/** Interface that stores the parameters passed to the Version History component */ +export interface VersionHistoryProps { + /** Optional unique identifier */ + id?: string; + /** Object containing the versions mapped with their information */ + versionHistory: VersionHistoryType; +} +/** + * Component to render the version history information shown in the footer component. Lists the 5 + * most recent versions, with the options to show all versions by pressing a button. + * + * @param versionHistory Object containing the versions mapped with their information + * @param id Optional unique identifier + * @returns Rendered version history for the Footer component + */ +export function VersionHistory({ id, versionHistory }: VersionHistoryProps): import("react/jsx-runtime").JSX.Element; +/** Interface to store the parameters passed to the Footer component */ +export interface FooterProps { + /** Optional unique identifier */ + id?: string; + /** Name of the publisher */ + publisherDisplayName: string; + /** Size of the extension file in bytes */ + fileSize: number; + /** List of language codes supported by the extension */ + locales: string[]; + /** Object containing the version history mapped with their information */ + versionHistory: VersionHistoryType; +} +/** + * Component to render the footer for the extension details which contains information on the + * publisher, version history, languages, and file size. + * + * @param id Optional unique identifier + * @param publisherDisplayName Name of the publisher + * @param fileSize Size of the extension file in bytes + * @param locales List of language codes supported by the extension + * @param versionHistory Object containing the version history mapped with their information + * @returns The rendered Footer component + */ +export function Footer({ id, publisherDisplayName, fileSize, locales, versionHistory, }: FooterProps): import("react/jsx-runtime").JSX.Element; +/** + * Adds an event handler to an event so the event handler runs when the event is emitted. Use + * `papi.network.getNetworkEvent` to use a networked event with this hook. + * + * @param event The event to subscribe to. + * + * - If event is a `PlatformEvent`, that event will be used + * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet + * available for example + * + * @param eventHandler The callback to run when the event is emitted + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + */ +export declare const useEvent: (event: PlatformEvent | undefined, eventHandler: PlatformEventHandler) => void; +/** + * Adds an event handler to an asynchronously subscribing/unsubscribing event so the event handler + * runs when the event is emitted. Use `papi.network.getNetworkEvent` to use a networked event with + * this hook. + * + * @param event The asynchronously (un)subscribing event to subscribe to. + * + * - If event is a `PlatformEvent` or `PlatformEventAsync`, that event will be used + * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet + * available for example + * + * @param eventHandler The callback to run when the event is emitted + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + */ +export declare const useEventAsync: (event: PlatformEvent | PlatformEventAsync | undefined, eventHandler: PlatformEventHandler) => void; +export type UsePromiseOptions = { + /** + * Whether to leave the value as the most recent resolved promise value or set it back to + * defaultValue while running the promise again. Defaults to true + */ + preserveValue?: boolean; +}; +/** + * Awaits a promise and returns a loading value while the promise is unresolved + * + * @param promiseFactoryCallback A function that returns the promise to await. If this callback is + * undefined, the current value will be returned (defaultValue unless it was previously changed + * and `options.preserveValue` is true), and there will be no loading. + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + * @param defaultValue The initial value to return while first awaiting the promise. If + * `options.preserveValue` is false, this value is also shown while awaiting the promise on + * subsequent calls. + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that, if the `promiseFactoryCallback` changes and + * `options.preserveValue` is `false`, the returned value will be set to the current + * `defaultValue`. However, the returned value will not be updated if`defaultValue` changes. + * @param options Various options for adjusting how this hook runs the `promiseFactoryCallback` + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. However, the latest `options.preserveValue` will always be used + * appropriately to determine whether to preserve the returned value when changing the + * `promiseFactoryCallback` + * @returns `[value, isLoading]` + * + * - `value`: the current value for the promise, either the defaultValue or the resolved promise value + * - `isLoading`: whether the promise is waiting to be resolved + */ +export declare const usePromise: (promiseFactoryCallback: (() => Promise) | undefined, defaultValue: T, options?: UsePromiseOptions) => [ + value: T, + isLoading: boolean +]; + +export { + sonner, +}; + +export {}; diff --git a/lib/platform-bible-react/dist/index.js b/lib/platform-bible-react/dist/index.js new file mode 100644 index 0000000000..eebee27a17 --- /dev/null +++ b/lib/platform-bible-react/dist/index.js @@ -0,0 +1,12413 @@ +import bp, { jsx as l, jsxs as E, Fragment as cr } from "react/jsx-runtime"; +import * as D from "react"; +import M, { forwardRef as nn, useCallback as Se, useState as fe, useRef as kr, useEffect as Xe, useLayoutEffect as aa, useMemo as lr } from "react"; +import { History as wp, ChevronRight as di, Check as on, Circle as ui, ArrowDownWideNarrow as yp, Clock as xp, Bookmark as kp, X as Np, Search as Ep, ChevronsUpDown as Tp, FilterIcon as Sp, ChevronDown as an, ChevronUp as Cp, ArrowLeftIcon as Op, ChevronLeftIcon as Rp, ChevronRightIcon as Pp, ArrowRightIcon as $p, ArrowUpIcon as _p, ArrowDownIcon as Ip, ArrowUpDownIcon as Ap, CircleCheckIcon as Dp, CircleXIcon as Mp, CircleHelpIcon as Bp, ChevronLeft as jp, LoaderCircle as Vp, Download as Lp, Filter as zp, User as Fp, Link as Up, CircleHelp as Gp } from "lucide-react"; +import Nr, { clsx as Hp } from "clsx"; +import { extendTailwindMerge as Xp } from "tailwind-merge"; +import * as me from "@radix-ui/react-dropdown-menu"; +import { DropdownMenuTrigger as Wp } from "@radix-ui/react-dropdown-menu"; +import { getChaptersForBook as Yp, formatScrRef as In, compareScrRefs as Zn, scrRefToBBBCCCVVV as An, getLocalizeKeyForScrollGroupId as ue, NumberFormat as qp, formatBytes as Kp } from "platform-bible-utils"; +import { Slot as Jp } from "@radix-ui/react-slot"; +import { cva as sn } from "class-variance-authority"; +import * as fi from "@radix-ui/react-label"; +import * as vt from "@radix-ui/react-radio-group"; +import * as bt from "@radix-ui/react-popover"; +import { Command as Re } from "cmdk"; +import * as We from "@radix-ui/react-dialog"; +import { useReactTable as mi, getCoreRowModel as hi, getPaginationRowModel as Zp, getSortedRowModel as gi, getFilteredRowModel as Qp, flexRender as ut, getExpandedRowModel as el, getGroupedRowModel as rl } from "@tanstack/react-table"; +import * as be from "@radix-ui/react-select"; +import * as pn from "@radix-ui/react-toggle-group"; +import * as vi from "@radix-ui/react-toggle"; +import * as Pe from "@radix-ui/react-tabs"; +import * as bi from "@radix-ui/react-separator"; +import * as Qn from "@radix-ui/react-checkbox"; +import tl, { ThemeContext as nl, internal_processStyles as ol } from "@mui/styled-engine"; +import { MenuItem as al, ListItemText as il, ListItemIcon as wi, Menu as sl, Grid as yi, List as pl, IconButton as xi, Drawer as ll, AppBar as cl, Toolbar as dl } from "@mui/material"; +import * as ul from "react-dom"; +import Vt from "react-dom"; +import { Toaster as fl } from "sonner"; +import { toast as F0 } from "sonner"; +import * as pt from "@radix-ui/react-slider"; +import * as eo from "@radix-ui/react-switch"; +const ml = Xp({ prefix: "pr-" }); +function R(...e) { + return ml(Hp(e)); +} +const St = M.forwardRef( + ({ className: e, type: r, ...t }, n) => /* @__PURE__ */ l( + "input", + { + type: r, + className: R( + "pr-twp pr-flex pr-h-10 pr-rounded-md pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background file:pr-border-0 file:pr-bg-transparent file:pr-text-sm file:pr-font-medium placeholder:pr-text-muted-foreground disabled:pr-cursor-not-allowed disabled:pr-opacity-50", + e + ), + ref: n, + ...t + } + ) +); +St.displayName = "Input"; +const hl = nn( + ({ handleSearch: e, handleKeyDown: r, handleOnClick: t, handleSubmit: n, ...o }, a) => /* @__PURE__ */ E("div", { className: "pr-relative", children: [ + /* @__PURE__ */ l( + St, + { + ...o, + type: "text", + className: "pr-box-border pr-gap-2.5 pr-rounded-lg pr-border pr-border-solid pr-bg-background pr-py-2 pr-pl-4 pr-pr-3 pr-font-medium pr-shadow-none pr-outline-none", + onChange: (i) => e(i.target.value), + onKeyDown: (i) => { + i.key === "Enter" && n(), r(i); + }, + onClick: t, + ref: a + } + ), + /* @__PURE__ */ l( + wp, + { + className: "pr-absolute pr-right-3 pr-top-1/2 pr-h-4 pr-w-4 pr--translate-y-1/2 pr-transform pr-cursor-pointer pr-text-muted-foreground", + onClick: () => { + console.log("back in history"); + } + } + ) + ] }) +); +var gl = Object.defineProperty, vl = (e, r, t) => r in e ? gl(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, ne = (e, r, t) => vl(e, typeof r != "symbol" ? r + "" : r, t); +const Tr = [ + "GEN", + "EXO", + "LEV", + "NUM", + "DEU", + "JOS", + "JDG", + "RUT", + "1SA", + "2SA", + // 10 + "1KI", + "2KI", + "1CH", + "2CH", + "EZR", + "NEH", + "EST", + "JOB", + "PSA", + "PRO", + // 20 + "ECC", + "SNG", + "ISA", + "JER", + "LAM", + "EZK", + "DAN", + "HOS", + "JOL", + "AMO", + // 30 + "OBA", + "JON", + "MIC", + "NAM", + "HAB", + "ZEP", + "HAG", + "ZEC", + "MAL", + "MAT", + // 40 + "MRK", + "LUK", + "JHN", + "ACT", + "ROM", + "1CO", + "2CO", + "GAL", + "EPH", + "PHP", + // 50 + "COL", + "1TH", + "2TH", + "1TI", + "2TI", + "TIT", + "PHM", + "HEB", + "JAS", + "1PE", + // 60 + "2PE", + "1JN", + "2JN", + "3JN", + "JUD", + "REV", + "TOB", + "JDT", + "ESG", + "WIS", + // 70 + "SIR", + "BAR", + "LJE", + "S3Y", + "SUS", + "BEL", + "1MA", + "2MA", + "3MA", + "4MA", + // 80 + "1ES", + "2ES", + "MAN", + "PS2", + "ODA", + "PSS", + "JSA", + // actual variant text for JOS, now in LXA text + "JDB", + // actual variant text for JDG, now in LXA text + "TBS", + // actual variant text for TOB, now in LXA text + "SST", + // actual variant text for SUS, now in LXA text // 90 + "DNT", + // actual variant text for DAN, now in LXA text + "BLT", + // actual variant text for BEL, now in LXA text + "XXA", + "XXB", + "XXC", + "XXD", + "XXE", + "XXF", + "XXG", + "FRT", + // 100 + "BAK", + "OTH", + "3ES", + // Used previously but really should be 2ES + "EZA", + // Used to be called 4ES, but not actually in any known project + "5EZ", + // Used to be called 5ES, but not actually in any known project + "6EZ", + // Used to be called 6ES, but not actually in any known project + "INT", + "CNC", + "GLO", + "TDX", + // 110 + "NDX", + "DAG", + "PS3", + "2BA", + "LBA", + "JUB", + "ENO", + "1MQ", + "2MQ", + "3MQ", + // 120 + "REP", + "4BA", + "LAO" +], ho = [ + "XXA", + "XXB", + "XXC", + "XXD", + "XXE", + "XXF", + "XXG", + "FRT", + "BAK", + "OTH", + "INT", + "CNC", + "GLO", + "TDX", + "NDX" +], ki = [ + "Genesis", + "Exodus", + "Leviticus", + "Numbers", + "Deuteronomy", + "Joshua", + "Judges", + "Ruth", + "1 Samuel", + "2 Samuel", + "1 Kings", + "2 Kings", + "1 Chronicles", + "2 Chronicles", + "Ezra", + "Nehemiah", + "Esther (Hebrew)", + "Job", + "Psalms", + "Proverbs", + "Ecclesiastes", + "Song of Songs", + "Isaiah", + "Jeremiah", + "Lamentations", + "Ezekiel", + "Daniel (Hebrew)", + "Hosea", + "Joel", + "Amos", + "Obadiah", + "Jonah", + "Micah", + "Nahum", + "Habakkuk", + "Zephaniah", + "Haggai", + "Zechariah", + "Malachi", + "Matthew", + "Mark", + "Luke", + "John", + "Acts", + "Romans", + "1 Corinthians", + "2 Corinthians", + "Galatians", + "Ephesians", + "Philippians", + "Colossians", + "1 Thessalonians", + "2 Thessalonians", + "1 Timothy", + "2 Timothy", + "Titus", + "Philemon", + "Hebrews", + "James", + "1 Peter", + "2 Peter", + "1 John", + "2 John", + "3 John", + "Jude", + "Revelation", + "Tobit", + "Judith", + "Esther Greek", + "Wisdom of Solomon", + "Sirach (Ecclesiasticus)", + "Baruch", + "Letter of Jeremiah", + "Song of 3 Young Men", + "Susanna", + "Bel and the Dragon", + "1 Maccabees", + "2 Maccabees", + "3 Maccabees", + "4 Maccabees", + "1 Esdras (Greek)", + "2 Esdras (Latin)", + "Prayer of Manasseh", + "Psalm 151", + "Odes", + "Psalms of Solomon", + // WARNING, if you change the spelling of the *obsolete* tag be sure to update + // IsObsolete routine + "Joshua A. *obsolete*", + "Judges B. *obsolete*", + "Tobit S. *obsolete*", + "Susanna Th. *obsolete*", + "Daniel Th. *obsolete*", + "Bel Th. *obsolete*", + "Extra A", + "Extra B", + "Extra C", + "Extra D", + "Extra E", + "Extra F", + "Extra G", + "Front Matter", + "Back Matter", + "Other Matter", + "3 Ezra *obsolete*", + "Apocalypse of Ezra", + "5 Ezra (Latin Prologue)", + "6 Ezra (Latin Epilogue)", + "Introduction", + "Concordance ", + "Glossary ", + "Topical Index", + "Names Index", + "Daniel Greek", + "Psalms 152-155", + "2 Baruch (Apocalypse)", + "Letter of Baruch", + "Jubilees", + "Enoch", + "1 Meqabyan", + "2 Meqabyan", + "3 Meqabyan", + "Reproof (Proverbs 25-31)", + "4 Baruch (Rest of Baruch)", + "Laodiceans" +], ia = Cl(); +function Kr(e, r = !0) { + return r && (e = e.toUpperCase()), e in ia ? ia[e] : 0; +} +function go(e) { + return Kr(e) > 0; +} +function bl(e) { + const r = typeof e == "string" ? Kr(e) : e; + return r >= 40 && r <= 66; +} +function wl(e) { + return (typeof e == "string" ? Kr(e) : e) <= 39; +} +function Ni(e) { + return e <= 66; +} +function yl(e) { + const r = typeof e == "string" ? Kr(e) : e; + return Si(r) && !Ni(r); +} +function* xl() { + for (let e = 1; e <= Tr.length; e++) + yield e; +} +const kl = 1, Ei = Tr.length; +function Nl() { + return ["XXA", "XXB", "XXC", "XXD", "XXE", "XXF", "XXG"]; +} +function vo(e, r = "***") { + const t = e - 1; + return t < 0 || t >= Tr.length ? r : Tr[t]; +} +function Ti(e) { + return e <= 0 || e > Ei ? "******" : ki[e - 1]; +} +function El(e) { + return Ti(Kr(e)); +} +function Si(e) { + const r = typeof e == "number" ? vo(e) : e; + return go(r) && !ho.includes(r); +} +function Tl(e) { + const r = typeof e == "number" ? vo(e) : e; + return go(r) && ho.includes(r); +} +function Sl(e) { + return ki[e - 1].includes("*obsolete*"); +} +function Cl() { + const e = {}; + for (let r = 0; r < Tr.length; r++) + e[Tr[r]] = r + 1; + return e; +} +const ce = { + allBookIds: Tr, + nonCanonicalIds: ho, + bookIdToNumber: Kr, + isBookIdValid: go, + isBookNT: bl, + isBookOT: wl, + isBookOTNT: Ni, + isBookDC: yl, + allBookNumbers: xl, + firstBook: kl, + lastBook: Ei, + extraBooks: Nl, + bookNumberToId: vo, + bookNumberToEnglishName: Ti, + bookIdToEnglishName: El, + isCanonical: Si, + isExtraMaterial: Tl, + isObsolete: Sl +}; +var Ge = /* @__PURE__ */ ((e) => (e[e.Unknown = 0] = "Unknown", e[e.Original = 1] = "Original", e[e.Septuagint = 2] = "Septuagint", e[e.Vulgate = 3] = "Vulgate", e[e.English = 4] = "English", e[e.RussianProtestant = 5] = "RussianProtestant", e[e.RussianOrthodox = 6] = "RussianOrthodox", e))(Ge || {}); +const _e = class { + // private versInfo: Versification; + constructor(r) { + if (ne(this, "name"), ne(this, "fullPath"), ne(this, "isPresent"), ne(this, "hasVerseSegments"), ne(this, "isCustomized"), ne(this, "baseVersification"), ne(this, "scriptureBooks"), ne(this, "_type"), r == null) + throw new Error("Argument undefined"); + typeof r == "string" ? (this.name = r, this._type = Ge[r]) : (this._type = r, this.name = Ge[r]); + } + get type() { + return this._type; + } + equals(r) { + return !r.type || !this.type ? !1 : r.type === this.type; + } +}; +ne(_e, "Original", new _e(Ge.Original)), ne(_e, "Septuagint", new _e(Ge.Septuagint)), ne(_e, "Vulgate", new _e(Ge.Vulgate)), ne(_e, "English", new _e(Ge.English)), ne(_e, "RussianProtestant", new _e(Ge.RussianProtestant)), ne(_e, "RussianOrthodox", new _e(Ge.RussianOrthodox)); +let gr = _e; +function sa(e, r) { + const t = r[0]; + for (let n = 1; n < r.length; n++) + e = e.split(r[n]).join(t); + return e.split(t); +} +var Ci = /* @__PURE__ */ ((e) => (e[e.Valid = 0] = "Valid", e[e.UnknownVersification = 1] = "UnknownVersification", e[e.OutOfRange = 2] = "OutOfRange", e[e.VerseOutOfOrder = 3] = "VerseOutOfOrder", e[e.VerseRepeated = 4] = "VerseRepeated", e))(Ci || {}); +const Te = class oe { + constructor(r, t, n, o) { + if (ne(this, "firstChapter"), ne(this, "lastChapter"), ne(this, "lastVerse"), ne(this, "hasSegmentsDefined"), ne(this, "text"), ne(this, "BBBCCCVVVS"), ne(this, "longHashCode"), ne(this, "versification"), ne(this, "rtlMark", "‏"), ne(this, "_bookNum", 0), ne(this, "_chapterNum", 0), ne(this, "_verseNum", 0), ne(this, "_verse"), n == null && o == null) + if (r != null && typeof r == "string") { + const a = r, i = t != null && t instanceof gr ? t : void 0; + this.setEmpty(i), this.parse(a); + } else if (r != null && typeof r == "number") { + const a = t != null && t instanceof gr ? t : void 0; + this.setEmpty(a), this._verseNum = r % oe.chapterDigitShifter, this._chapterNum = Math.floor( + r % oe.bookDigitShifter / oe.chapterDigitShifter + ), this._bookNum = Math.floor(r / oe.bookDigitShifter); + } else if (t == null) + if (r != null && r instanceof oe) { + const a = r; + this._bookNum = a.bookNum, this._chapterNum = a.chapterNum, this._verseNum = a.verseNum, this._verse = a.verse, this.versification = a.versification; + } else { + if (r == null) + return; + const a = r instanceof gr ? r : oe.defaultVersification; + this.setEmpty(a); + } + else + throw new Error("VerseRef constructor not supported."); + else if (r != null && t != null && n != null) + if (typeof r == "string" && typeof t == "string" && typeof n == "string") + this.setEmpty(o), this.updateInternal(r, t, n); + else if (typeof r == "number" && typeof t == "number" && typeof n == "number") + this._bookNum = r, this._chapterNum = t, this._verseNum = n, this.versification = o ?? oe.defaultVersification; + else + throw new Error("VerseRef constructor not supported."); + else + throw new Error("VerseRef constructor not supported."); + } + /** + * Determines if the verse string is in a valid format (does not consider versification). + */ + static isVerseParseable(r) { + return r.length > 0 && "0123456789".includes(r[0]) && !r.endsWith(this.verseRangeSeparator) && !r.endsWith(this.verseSequenceIndicator); + } + /** + * Tries to parse the specified string into a verse reference. + * @param str - The string to attempt to parse. + * @returns success: `true` if the specified string was successfully parsed, `false` otherwise. + * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed + */ + static tryParse(r) { + let t; + try { + return t = new oe(r), { success: !0, verseRef: t }; + } catch (n) { + if (n instanceof tt) + return t = new oe(), { success: !1, verseRef: t }; + throw n; + } + } + /** + * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3 + * digits. + * @param bookNum - Book number (this is 1-based, not an index). + * @param chapterNum - Chapter number. + * @param verseNum - Verse number. + * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3 + * digits. + */ + static getBBBCCCVVV(r, t, n) { + return r % oe.bcvMaxValue * oe.bookDigitShifter + (t >= 0 ? t % oe.bcvMaxValue * oe.chapterDigitShifter : 0) + (n >= 0 ? n % oe.bcvMaxValue : 0); + } + /** + * Deserializes a serialized VerseRef. + * @param serializedVerseRef - Serialized VerseRef to create from. + * @returns the deserialized VerseRef. + */ + static fromJSON(r) { + const { book: t, chapterNum: n, verseNum: o, verse: a, versificationStr: i } = r, s = a || o.toString(); + let c; + return i && (c = new gr(i)), t ? new oe(t, n.toString(), s, c) : new oe(); + } + /** + * Parses a verse string and gets the leading numeric portion as a number. + * @param verseStr - verse string to parse + * @returns true if the entire string could be parsed as a single, simple verse number (1-999); + * false if the verse string represented a verse bridge, contained segment letters, or was invalid + */ + static tryGetVerseNum(r) { + let t; + if (!r) + return t = -1, { success: !0, vNum: t }; + t = 0; + let n; + for (let o = 0; o < r.length; o++) { + if (n = r[o], n < "0" || n > "9") + return o === 0 && (t = -1), { success: !1, vNum: t }; + if (t = t * 10 + +n - 0, t > oe.bcvMaxValue) + return t = -1, { success: !1, vNum: t }; + } + return { success: !0, vNum: t }; + } + /** + * Checks to see if a VerseRef hasn't been set - all values are the default. + */ + get isDefault() { + return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null; + } + /** + * Gets whether the verse contains multiple verses. + */ + get hasMultiple() { + return this._verse != null && (this._verse.includes(oe.verseRangeSeparator) || this._verse.includes(oe.verseSequenceIndicator)); + } + /** + * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters, + * e.g. `'MAT'`. + */ + get book() { + return ce.bookNumberToId(this.bookNum, ""); + } + set book(r) { + this.bookNum = ce.bookIdToNumber(r); + } + /** + * Gets or sets the chapter of the reference,. e.g. `'3'`. + */ + get chapter() { + return this.isDefault || this._chapterNum < 0 ? "" : this._chapterNum.toString(); + } + set chapter(r) { + const t = +r; + this._chapterNum = Number.isInteger(t) ? t : -1; + } + /** + * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`, + * or `'4b-5a, 7'`. + */ + get verse() { + return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? "" : this._verseNum.toString(); + } + set verse(r) { + const { success: t, vNum: n } = oe.tryGetVerseNum(r); + this._verse = t ? void 0 : r.replace(this.rtlMark, ""), this._verseNum = n, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = oe.tryGetVerseNum(this._verse)); + } + /** + * Get or set Book based on book number, e.g. `42`. + */ + get bookNum() { + return this._bookNum; + } + set bookNum(r) { + if (r <= 0 || r > ce.lastBook) + throw new tt( + "BookNum must be greater than zero and less than or equal to last book" + ); + this._bookNum = r; + } + /** + * Gets or sets the chapter number, e.g. `3`. `-1` if not valid. + */ + get chapterNum() { + return this._chapterNum; + } + set chapterNum(r) { + this.chapterNum = r; + } + /** + * Gets or sets verse start number, e.g. `4`. `-1` if not valid. + */ + get verseNum() { + return this._verseNum; + } + set verseNum(r) { + this._verseNum = r; + } + /** + * String representing the versification (should ONLY be used for serialization/deserialization). + * + * @remarks This is for backwards compatibility when ScrVers was an enumeration. + */ + get versificationStr() { + var r; + return (r = this.versification) == null ? void 0 : r.name; + } + set versificationStr(r) { + this.versification = this.versification != null ? new gr(r) : void 0; + } + /** + * Determines if the reference is valid. + */ + get valid() { + return this.validStatus === 0; + } + /** + * Get the valid status for this reference. + */ + get validStatus() { + return this.validateVerse(oe.verseRangeSeparators, oe.verseSequenceIndicators); + } + /** + * Gets the reference as a comparable integer where the book, + * chapter, and verse each occupy three digits and the verse is 0. + */ + get BBBCCC() { + return oe.getBBBCCCVVV(this._bookNum, this._chapterNum, 0); + } + /** + * Gets the reference as a comparable integer where the book, + * chapter, and verse each occupy three digits. If verse is not null + * (i.e., this reference represents a complex reference with verse + * segments or bridge) this cannot be used for an exact comparison. + */ + get BBBCCCVVV() { + return oe.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum); + } + /** + * Gets whether the verse is defined as an excluded verse in the versification. + * Does not handle verse ranges. + */ + // eslint-disable-next-line @typescript-eslint/class-literal-property-style + get isExcluded() { + return !1; + } + /** + * Parses the reference in the specified string. + * Optionally versification can follow reference as in GEN 3:11/4 + * Throw an exception if + * - invalid book name + * - chapter number is missing or not a number + * - verse number is missing or does not start with a number + * - versification is invalid + * @param verseStr - string to parse e.g. 'MAT 3:11' + */ + parse(r) { + if (r = r.replace(this.rtlMark, ""), r.includes("/")) { + const a = r.split("/"); + if (r = a[0], a.length > 1) + try { + const i = +a[1].trim(); + this.versification = new gr(Ge[i]); + } catch { + throw new tt("Invalid reference : " + r); + } + } + const t = r.trim().split(" "); + if (t.length !== 2) + throw new tt("Invalid reference : " + r); + const n = t[1].split(":"), o = +n[0]; + if (n.length !== 2 || ce.bookIdToNumber(t[0]) === 0 || !Number.isInteger(o) || o < 0 || !oe.isVerseParseable(n[1])) + throw new tt("Invalid reference : " + r); + this.updateInternal(t[0], n[0], n[1]); + } + /** + * Simplifies this verse ref so that it has no bridging of verses or + * verse segments like `'1a'`. + */ + simplify() { + this._verse = void 0; + } + /** + * Makes a clone of the reference. + * + * @returns The cloned VerseRef. + */ + clone() { + return new oe(this); + } + toString() { + const r = this.book; + return r === "" ? "" : `${r} ${this.chapter}:${this.verse}`; + } + toJSON() { + let r = this.verse; + (r === "" || r === this.verseNum.toString()) && (r = void 0); + const t = { + book: this.book, + chapterNum: this.chapterNum, + verseNum: this.verseNum, + verse: r, + versificationStr: this.versificationStr + }; + return r || delete t.verse, t; + } + /** + * Compares this `VerseRef` with supplied one. + * @param verseRef - object to compare this one to. + * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise. + */ + equals(r) { + return r instanceof oe ? r._bookNum === this._bookNum && r._chapterNum === this._chapterNum && r._verseNum === this._verseNum && r.verse === this.verse && (r.versification == null && this.versification == null || r.versification != null && this.versification != null && r.versification.equals(this.versification)) : !1; + } + /** + * Enumerate all individual verses contained in a VerseRef. + * Verse ranges are indicated by "-" and consecutive verses by ","s. + * Examples: + * GEN 1:2 returns GEN 1:2 + * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5 + * GEN 1:2a-2c returns //! ?????? + * + * @param specifiedVersesOnly - if set to true return only verses that are + * explicitly specified only, not verses within a range. Defaults to `false`. + * @param verseRangeSeparators - Verse range separators. + * Defaults to `VerseRef.verseRangeSeparators`. + * @param verseSequenceSeparators - Verse sequence separators. + * Defaults to `VerseRef.verseSequenceIndicators`. + * @returns An array of all single verse references in this VerseRef. + */ + allVerses(r = !1, t = oe.verseRangeSeparators, n = oe.verseSequenceIndicators) { + if (this._verse == null || this.chapterNum <= 0) + return [this.clone()]; + const o = [], a = sa(this._verse, n); + for (const i of a.map((s) => sa(s, t))) { + const s = this.clone(); + s.verse = i[0]; + const c = s.verseNum; + if (o.push(s), i.length > 1) { + const d = this.clone(); + if (d.verse = i[1], !r) + for (let u = c + 1; u < d.verseNum; u++) { + const b = new oe( + this._bookNum, + this._chapterNum, + u, + this.versification + ); + this.isExcluded || o.push(b); + } + o.push(d); + } + } + return o; + } + /** + * Validates a verse number using the supplied separators rather than the defaults. + */ + validateVerse(r, t) { + if (!this.verse) + return this.internalValid; + let n = 0; + for (const o of this.allVerses(!0, r, t)) { + const a = o.internalValid; + if (a !== 0) + return a; + const i = o.BBBCCCVVV; + if (n > i) + return 3; + if (n === i) + return 4; + n = i; + } + return 0; + } + /** + * Gets whether a single verse reference is valid. + */ + get internalValid() { + return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > ce.lastBook ? 2 : (ce.isCanonical(this._bookNum), 0); + } + setEmpty(r = oe.defaultVersification) { + this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = r; + } + updateInternal(r, t, n) { + this.bookNum = ce.bookIdToNumber(r), this.chapter = t, this.verse = n; + } +}; +ne(Te, "defaultVersification", gr.English), ne(Te, "verseRangeSeparator", "-"), ne(Te, "verseSequenceIndicator", ","), ne(Te, "verseRangeSeparators", [Te.verseRangeSeparator]), ne(Te, "verseSequenceIndicators", [Te.verseSequenceIndicator]), ne(Te, "chapterDigitShifter", 1e3), ne(Te, "bookDigitShifter", Te.chapterDigitShifter * Te.chapterDigitShifter), ne(Te, "bcvMaxValue", Te.chapterDigitShifter - 1), /** +* The valid status of the VerseRef. +*/ +ne(Te, "ValidStatusType", Ci); +let tt = class extends Error { +}; +const bo = me.Root, Oi = me.Trigger, Ol = me.Group, i0 = me.Portal, s0 = me.Sub, p0 = me.RadioGroup, Rl = M.forwardRef(({ className: e, inset: r, children: t, ...n }, o) => /* @__PURE__ */ E( + me.SubTrigger, + { + ref: o, + className: R( + "pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none focus:pr-bg-accent data-[state=open]:pr-bg-accent", + r && "pr-pl-8", + e + ), + ...n, + children: [ + t, + /* @__PURE__ */ l(di, { className: "pr-ml-auto pr-h-4 pr-w-4" }) + ] + } +)); +Rl.displayName = me.SubTrigger.displayName; +const Pl = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + me.SubContent, + { + ref: t, + className: R( + "pr-z-50 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-p-1 pr-text-popover-foreground pr-shadow-lg data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2", + e + ), + ...r + } +)); +Pl.displayName = me.SubContent.displayName; +const ln = M.forwardRef(({ className: e, sideOffset: r = 4, ...t }, n) => /* @__PURE__ */ l(me.Portal, { children: /* @__PURE__ */ l( + me.Content, + { + ref: n, + sideOffset: r, + className: R( + /* adding pr-twp because the dropdown content is added to the dom as a sibling to the app root */ + "pr-twp pr-z-50 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-p-1 pr-text-popover-foreground pr-shadow-md data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2", + e + ), + ...t + } +) })); +ln.displayName = me.Content.displayName; +const Ri = M.forwardRef(({ className: e, inset: r, ...t }, n) => /* @__PURE__ */ l( + me.Item, + { + ref: n, + className: R( + // removed: pr-relative pr-flex focus:pr-text-accent-foreground + "pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50", + r && "pr-pl-8", + e + ), + ...t + } +)); +Ri.displayName = me.Item.displayName; +const wo = M.forwardRef(({ className: e, children: r, checked: t, ...n }, o) => /* @__PURE__ */ E( + me.CheckboxItem, + { + ref: o, + className: R( + "pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50", + e + ), + checked: t, + ...n, + children: [ + /* @__PURE__ */ l("span", { className: "pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center", children: /* @__PURE__ */ l(me.ItemIndicator, { children: /* @__PURE__ */ l(on, { className: "pr-h-4 pr-w-4" }) }) }), + r + ] + } +)); +wo.displayName = me.CheckboxItem.displayName; +const Pi = M.forwardRef(({ className: e, children: r, ...t }, n) => /* @__PURE__ */ E( + me.RadioItem, + { + ref: n, + className: R( + "pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none pr-transition-colors focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50", + e + ), + ...t, + children: [ + /* @__PURE__ */ l("span", { className: "pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center", children: /* @__PURE__ */ l(me.ItemIndicator, { children: /* @__PURE__ */ l(ui, { className: "pr-h-2 pr-w-2 pr-fill-current" }) }) }), + r + ] + } +)); +Pi.displayName = me.RadioItem.displayName; +const Ct = M.forwardRef(({ className: e, inset: r, ...t }, n) => /* @__PURE__ */ l( + me.Label, + { + ref: n, + className: R("pr-px-2 pr-py-1.5 pr-text-sm pr-font-semibold", r && "pr-pl-8", e), + ...t + } +)); +Ct.displayName = me.Label.displayName; +const cn = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + me.Separator, + { + ref: t, + className: R("pr--mx-1 pr-my-1 pr-h-px pr-bg-muted", e), + ...r + } +)); +cn.displayName = me.Separator.displayName; +function $l({ className: e, ...r }) { + return /* @__PURE__ */ l( + "span", + { + className: R("pr-ml-auto pr-text-xs pr-tracking-widest pr-opacity-60", e), + ...r + } + ); +} +$l.displayName = "DropdownMenuShortcut"; +const _l = nn( + ({ + bookId: e, + handleSelectBook: r, + isSelected: t, + handleHighlightBook: n, + handleKeyDown: o, + bookType: a, + children: i + }, s) => /* @__PURE__ */ E( + Ri, + { + ref: s, + textValue: e, + className: R("pr-mx-1 pr-px-1 pr-font-normal pr-text-foreground/80", { + // Overriding `data-[highlighted]` changes the default gray background that is normally shown on hover + "pr-bg-amber-50 pr-text-yellow-900 data-[highlighted]:pr-bg-amber-100": t + }), + onSelect: (c) => { + c.preventDefault(), r(); + }, + onKeyDown: (c) => { + o(c); + }, + onFocus: n, + onMouseMove: n, + children: [ + /* @__PURE__ */ l( + "span", + { + className: R( + "pr-border-b-0 pr-border-l-2 pr-border-r-0 pr-border-t-0 pr-border-solid pr-px-2", + { + "pr-font-bold": t, + "pr-border-l-red-200": a.toLowerCase() === "ot", + "pr-border-l-purple-200": a.toLowerCase() === "nt", + "pr-border-l-indigo-200": a.toLowerCase() === "dc" + } + ), + children: ce.bookIdToEnglishName(e) + } + ), + t && /* @__PURE__ */ l("div", { children: i }) + ] + }, + e + ) +); +function Il({ + handleSelectChapter: e, + endChapter: r, + activeChapter: t, + highlightedChapter: n, + handleHighlightedChapter: o +}) { + const a = Array.from({ length: r }, (s, c) => c + 1), i = Se( + (s) => { + o(s); + }, + [o] + ); + return /* @__PURE__ */ l("div", { className: R("pr-flex pr-flex-wrap pr-items-start pr-justify-start pr-self-stretch"), children: a.map((s) => /* @__PURE__ */ l( + "div", + { + className: R( + "pr-box-content pr-flex pr-h-4 pr-w-4 pr-cursor-pointer pr-items-center pr-justify-end pr-rounded-md pr-p-2 pr-text-amber-800", + { + "pr-font-semibold pr-text-amber-900": s === t, + "pr-bg-amber-200": s === n + } + ), + onClick: (c) => { + c.preventDefault(), c.stopPropagation(), e(s); + }, + role: "button", + onKeyDown: (c) => { + c.key === "Enter" && e(s); + }, + tabIndex: 0, + onMouseMove: () => i(s), + children: s + }, + s + )) }); +} +function Al({ handleSort: e, handleLocationHistory: r, handleBookmarks: t }) { + return /* @__PURE__ */ E(Ct, { className: "pr-flex pr-justify-between", children: [ + /* @__PURE__ */ l("p", { className: "pr-inline-block pr-align-middle", children: "Go To" }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center", children: [ + /* @__PURE__ */ l( + yp, + { + onClick: e, + className: "pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2" + } + ), + /* @__PURE__ */ l( + xp, + { + onClick: r, + className: "pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2" + } + ), + /* @__PURE__ */ l( + kp, + { + onClick: t, + className: "pr-m-2 pr-h-4 pr-w-4 pr-cursor-pointer pr-gap-2" + } + ) + ] }) + ] }); +} +const ft = ce.allBookIds, Dl = { + OT: "Old Testament", + NT: "New Testament", + DC: "Deuterocanon" +}, pa = ["OT", "NT", "DC"], Ml = 32 + 32 + 32, Bl = [ + /^(\w+)$/i, + // Matches a single word (book name or id) + /^(\w+)(?:\s(\d+))$/i, + // Matches a word followed by a chapter number + /^(\w+)(?:\s(\d+):(\d+))$/i + // Matches a word followed by a chapter and verse number +], jl = (e) => ({ + OT: ft.filter((t) => ce.isBookOT(t)), + NT: ft.filter((t) => ce.isBookNT(t)), + DC: ft.filter((t) => ce.isBookDC(t)) +})[e], nt = (e) => Yp(ce.bookIdToNumber(e)); +function Vl() { + return ft.map((r) => ce.bookIdToEnglishName(r)); +} +function Ll(e) { + return Vl().includes(e); +} +function zl(e) { + const r = e.toLowerCase().replace(/^\w/, (t) => t.toUpperCase()); + if (Ll(r)) + return ft.find((n) => ce.bookIdToEnglishName(n) === r); +} +function l0({ scrRef: e, handleSubmit: r }) { + const [t, n] = fe(""), [o, a] = fe( + ce.bookNumberToId(e.bookNum) + ), [i, s] = fe(e.chapterNum ?? 0), [c, d] = fe( + ce.bookNumberToId(e.bookNum) + ), [u, b] = fe(!1), [p, h] = fe(u), f = kr(void 0), g = kr(void 0), v = kr(void 0), y = Se( + (k) => jl(k).filter((j) => { + const B = ce.bookIdToEnglishName(j).toLowerCase(), Z = t.replace(/[^a-zA-Z]/g, "").toLowerCase(); + return B.includes(Z) || // Match book name + j.toLowerCase().includes(Z); + }), + [t] + ), C = (k) => { + n(k); + }, T = kr(!1), x = Se((k) => { + if (T.current) { + T.current = !1; + return; + } + b(k); + }, []), w = Se( + (k, j, B, Z) => { + if (s( + ce.bookNumberToId(e.bookNum) !== k ? 1 : e.chapterNum + ), j || nt(k) === -1) { + r({ + bookNum: ce.bookIdToNumber(k), + chapterNum: B || 1, + verseNum: Z || 1 + }), b(!1), n(""); + return; + } + a(o !== k ? k : ""), b(!j); + }, + [r, e.bookNum, e.chapterNum, o] + ), O = (k) => { + k <= 0 || k > nt(o) || w(o, !0, k); + }, P = Se(() => { + Bl.forEach((k) => { + const j = t.match(k); + if (j) { + const [B, Z = void 0, J = void 0] = j.slice(1), X = zl(B); + (ce.isBookIdValid(B) || X) && w( + X ?? B, + !0, + Z ? parseInt(Z, 10) : 1, + J ? parseInt(J, 10) : 1 + ); + } + }); + }, [w, t]), V = Se( + (k) => { + u ? (k.key === "ArrowDown" || k.key === "ArrowUp") && (typeof v < "u" && // Ref uses null + // eslint-disable-next-line no-null/no-null + v.current !== null ? v.current.focus() : typeof g < "u" && // Ref uses null + // eslint-disable-next-line no-null/no-null + g.current !== null && g.current.focus(), k.preventDefault()) : b(!0); + }, + [u] + ), S = (k) => { + const { key: j } = k; + j === "ArrowRight" || j === "ArrowLeft" || j === "ArrowDown" || j === "ArrowUp" || j === "Enter" || (f.current.dispatchEvent(new KeyboardEvent("keydown", { key: j })), f.current.focus()); + }, $ = (k) => { + const { key: j } = k; + if (c === o) { + if (j === "Enter") { + k.preventDefault(), w(o, !0, i); + return; + } + let B = 0; + if (j === "ArrowRight") + if (i < nt(c)) + B = 1; + else { + k.preventDefault(); + return; + } + else if (j === "ArrowLeft") + if (i > 1) + B = -1; + else { + k.preventDefault(); + return; + } + else + j === "ArrowDown" ? B = 6 : j === "ArrowUp" && (B = -6); + i + B <= 0 || i + B > nt(c) ? s(0) : B !== 0 && (s(i + B), k.preventDefault()); + } + }; + return Xe(() => { + o === c ? o === ce.bookNumberToId(e.bookNum) ? s(e.chapterNum) : s(1) : s(0); + }, [c, e.bookNum, e.chapterNum, o]), aa(() => { + h(u); + }, [u]), aa(() => { + const k = setTimeout(() => { + if (p && g.current && v.current) { + const B = v.current.offsetTop - Ml; + g.current.scrollTo({ top: B, behavior: "instant" }); + } + }, 10); + return () => { + clearTimeout(k); + }; + }, [p]), /* @__PURE__ */ l("div", { className: "pr-twp pr-flex", children: /* @__PURE__ */ E(bo, { modal: !1, open: u, onOpenChange: x, children: [ + /* @__PURE__ */ l(Oi, { asChild: !0, children: /* @__PURE__ */ l( + hl, + { + ref: f, + value: t, + handleSearch: C, + handleKeyDown: V, + handleOnClick: () => { + a(ce.bookNumberToId(e.bookNum)), d(ce.bookNumberToId(e.bookNum)), s(e.chapterNum > 0 ? e.chapterNum : 0), b(!0), f.current.focus(); + }, + onFocus: () => { + T.current = !0; + }, + handleSubmit: P, + placeholder: `${ce.bookNumberToEnglishName(e.bookNum)} ${e.chapterNum}:${e.verseNum}` + } + ) }), + /* @__PURE__ */ E( + ln, + { + className: "pr-m-1 pr-overflow-y-auto pr-p-0 pr-font-normal pr-text-foreground/80", + style: { width: "233px", maxHeight: "500px", zIndex: "250" }, + onKeyDown: S, + align: "start", + ref: g, + children: [ + /* @__PURE__ */ l( + Al, + { + handleSort: () => console.log("sorting"), + handleLocationHistory: () => console.log("location history"), + handleBookmarks: () => console.log("bookmarks") + } + ), + pa.map( + (k, j) => y(k).length > 0 && /* @__PURE__ */ E("div", { children: [ + /* @__PURE__ */ l(Ct, { className: "pr-font-semibold pr-text-foreground/80", children: Dl[k] }), + y(k).map((B) => /* @__PURE__ */ l("div", { children: /* @__PURE__ */ l( + _l, + { + bookId: B, + handleSelectBook: () => w(B, !1), + isSelected: o === B, + handleHighlightBook: () => d(B), + handleKeyDown: $, + bookType: k, + ref: (Z) => { + o === B && (v.current = Z); + }, + children: /* @__PURE__ */ l( + Il, + { + handleSelectChapter: O, + endChapter: nt(B), + activeChapter: e.bookNum === ce.bookIdToNumber(B) ? e.chapterNum : 0, + highlightedChapter: i, + handleHighlightedChapter: (Z) => { + s(Z); + } + } + ) + } + ) }, B)), + pa.length - 1 !== j ? /* @__PURE__ */ l(cn, {}) : void 0 + ] }, k) + ) + ] + } + ) + ] }) }); +} +const Fl = sn( + "pr-twp pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50", + { + variants: { + variant: { + default: "pr-bg-primary pr-text-primary-foreground hover:pr-bg-primary/90", + destructive: "pr-bg-destructive pr-text-destructive-foreground hover:pr-bg-destructive/90", + outline: "pr-border pr-border-input pr-bg-background hover:pr-bg-accent hover:pr-text-accent-foreground", + secondary: "pr-bg-secondary pr-text-secondary-foreground hover:pr-bg-secondary/80", + ghost: "hover:pr-bg-accent hover:pr-text-accent-foreground", + link: "pr-text-primary pr-underline-offset-4 hover:pr-underline" + }, + size: { + default: "pr-h-10 pr-px-4 pr-py-2", + sm: "pr-h-9 pr-rounded-md pr-px-3", + lg: "pr-h-11 pr-rounded-md pr-px-8", + icon: "pr-h-10 pr-w-10" + } + }, + defaultVariants: { + variant: "default", + size: "default" + } + } +), ye = M.forwardRef( + ({ className: e, variant: r, size: t, asChild: n = !1, ...o }, a) => /* @__PURE__ */ l(n ? Jp : "button", { className: R(Fl({ variant: r, size: t, className: e })), ref: a, ...o }) +); +ye.displayName = "Button"; +const Ul = sn( + "pr-text-sm pr-font-medium pr-leading-none peer-disabled:pr-cursor-not-allowed peer-disabled:pr-opacity-70" +), Ze = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l(fi.Root, { ref: t, className: R("pr-twp", Ul(), e), ...r })); +Ze.displayName = fi.Root.displayName; +const $i = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + vt.Root, + { + className: R("pr-twp pr-grid pr-gap-2", e), + ...r, + ref: t + } +)); +$i.displayName = vt.Root.displayName; +const ro = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + vt.Item, + { + ref: t, + className: R( + "pr-twp pr-aspect-square pr-h-4 pr-w-4 pr-rounded-full pr-border pr-border-primary pr-text-primary pr-ring-offset-background focus:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50", + e + ), + ...r, + children: /* @__PURE__ */ l(vt.Indicator, { className: "pr-flex pr-items-center pr-justify-center", children: /* @__PURE__ */ l(ui, { className: "pr-h-2.5 pr-w-2.5 pr-fill-current pr-text-current" }) }) + } +)); +ro.displayName = vt.Item.displayName; +const Gl = bt.Root, Hl = bt.Trigger, _i = M.forwardRef(({ className: e, align: r = "center", sideOffset: t = 4, ...n }, o) => /* @__PURE__ */ l(bt.Portal, { children: /* @__PURE__ */ l( + bt.Content, + { + ref: o, + align: r, + sideOffset: t, + className: R( + "pr-twp pr-z-50 pr-w-72 pr-rounded-md pr-border pr-bg-popover pr-p-4 pr-text-popover-foreground pr-shadow-md pr-outline-none data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2", + e + ), + ...n + } +) })); +_i.displayName = bt.Content.displayName; +const Xl = We.Portal, Ii = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + We.Overlay, + { + ref: t, + className: R( + "pr- pr-fixed pr-inset-0 pr-z-50 pr-bg-black/80 data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0", + e + ), + ...r + } +)); +Ii.displayName = We.Overlay.displayName; +const Wl = M.forwardRef(({ className: e, children: r, ...t }, n) => /* @__PURE__ */ E(Xl, { children: [ + /* @__PURE__ */ l(Ii, {}), + /* @__PURE__ */ E( + We.Content, + { + ref: n, + className: R( + "pr-fixed pr-left-[50%] pr-top-[50%] pr-z-50 pr-grid pr-w-full pr-max-w-lg pr-translate-x-[-50%] pr-translate-y-[-50%] pr-gap-4 pr-border pr-bg-background pr-p-6 pr-shadow-lg pr-duration-200 data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[state=closed]:pr-slide-out-to-left-1/2 data-[state=closed]:pr-slide-out-to-top-[48%] data-[state=open]:pr-slide-in-from-left-1/2 data-[state=open]:pr-slide-in-from-top-[48%] sm:pr-rounded-lg", + e + ), + ...t, + children: [ + r, + /* @__PURE__ */ E(We.Close, { className: "pr-absolute pr-right-4 pr-top-4 pr-rounded-sm pr-opacity-70 pr-ring-offset-background pr-transition-opacity hover:pr-opacity-100 focus:pr-outline-none focus:pr-ring-2 focus:pr-ring-ring focus:pr-ring-offset-2 disabled:pr-pointer-events-none data-[state=open]:pr-bg-accent data-[state=open]:pr-text-muted-foreground", children: [ + /* @__PURE__ */ l(Np, { className: "pr-h-4 pr-w-4" }), + /* @__PURE__ */ l("span", { className: "pr-sr-only", children: "Close" }) + ] }) + ] + } + ) +] })); +Wl.displayName = We.Content.displayName; +const Yl = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + We.Title, + { + ref: t, + className: R("pr-text-lg pr-font-semibold pr-leading-none pr-tracking-tight", e), + ...r + } +)); +Yl.displayName = We.Title.displayName; +const ql = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + We.Description, + { + ref: t, + className: R("pr-text-sm pr-text-muted-foreground", e), + ...r + } +)); +ql.displayName = We.Description.displayName; +const Ai = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Re, + { + ref: t, + className: R( + "pr-flex pr-h-full pr-w-full pr-flex-col pr-overflow-hidden pr-rounded-md pr-bg-popover pr-text-popover-foreground", + e + ), + ...r + } +)); +Ai.displayName = Re.displayName; +const Di = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-border-b pr-px-3", children: [ + /* @__PURE__ */ l(Ep, { className: "pr-me-2 pr-h-4 pr-w-4 pr-shrink-0 pr-opacity-50" }), + /* @__PURE__ */ l( + Re.Input, + { + ref: t, + className: R( + "pr-flex pr-h-11 pr-w-full pr-rounded-md pr-bg-transparent pr-py-3 pr-text-sm pr-outline-none placeholder:pr-text-muted-foreground disabled:pr-cursor-not-allowed disabled:pr-opacity-50", + e + ), + ...r + } + ) +] })); +Di.displayName = Re.Input.displayName; +const Mi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Re.List, + { + ref: t, + className: R("pr-max-h-[300px] pr-overflow-y-auto pr-overflow-x-hidden", e), + ...r + } +)); +Mi.displayName = Re.List.displayName; +const Bi = M.forwardRef((e, r) => /* @__PURE__ */ l(Re.Empty, { ref: r, className: "pr-py-6 pr-text-center pr-text-sm", ...e })); +Bi.displayName = Re.Empty.displayName; +const Kl = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Re.Group, + { + ref: t, + className: R( + "pr-overflow-hidden pr-p-1 pr-text-foreground [&_[cmdk-group-heading]]:pr-px-2 [&_[cmdk-group-heading]]:pr-py-1.5 [&_[cmdk-group-heading]]:pr-text-xs [&_[cmdk-group-heading]]:pr-font-medium [&_[cmdk-group-heading]]:pr-text-muted-foreground", + e + ), + ...r + } +)); +Kl.displayName = Re.Group.displayName; +const Jl = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Re.Separator, + { + ref: t, + className: R("pr--mx-1 pr-h-px pr-bg-border", e), + ...r + } +)); +Jl.displayName = Re.Separator.displayName; +const ji = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Re.Item, + { + ref: t, + className: R( + "pr-relative pr-flex pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-px-2 pr-py-1.5 pr-text-sm pr-outline-none data-[disabled=true]:pr-pointer-events-none data-[selected=true]:pr-bg-accent data-[selected=true]:pr-text-accent-foreground data-[disabled=true]:pr-opacity-50", + e + ), + ...r + } +)); +ji.displayName = Re.Item.displayName; +function Zl(e) { + return typeof e == "string" ? e : typeof e == "number" ? e.toString() : e.label; +} +function la({ + id: e, + options: r = [], + className: t, + value: n, + onChange: o = () => { + }, + getOptionLabel: a = Zl, + buttonPlaceholder: i = "", + textPlaceholder: s = "", + commandEmptyMessage: c = "No option found", + buttonVariant: d = "outline", + dir: u = "ltr", + isDisabled: b = !1, + ...p +}) { + const [h, f] = fe(!1); + return /* @__PURE__ */ E(Gl, { open: h, onOpenChange: f, ...p, children: [ + /* @__PURE__ */ l(Hl, { asChild: !0, children: /* @__PURE__ */ E( + ye, + { + variant: d, + role: "combobox", + "aria-expanded": h, + id: e, + className: R("pr-w-[200px] pr-justify-between", t), + disabled: b, + children: [ + /* @__PURE__ */ l("span", { className: "pr-overflow-hidden pr-text-ellipsis pr-whitespace-nowrap", children: n ? a(n) : i }), + /* @__PURE__ */ l(Tp, { className: "pr-ms-2 pr-h-4 pr-w-4 pr-shrink-0 pr-opacity-50" }) + ] + } + ) }), + /* @__PURE__ */ l(_i, { className: "pr-w-[200px] pr-p-0", dir: u, children: /* @__PURE__ */ E(Ai, { children: [ + /* @__PURE__ */ l(Di, { dir: u, placeholder: s, className: "pr-text-inherit" }), + /* @__PURE__ */ l(Bi, { children: c }), + /* @__PURE__ */ l(Mi, { children: r.map((g) => /* @__PURE__ */ E( + ji, + { + value: a(g), + onSelect: () => { + o(g), f(!1); + }, + children: [ + /* @__PURE__ */ l( + on, + { + className: R("pr-me-2 pr-h-4 pr-w-4", { + "pr-opacity-0": !n || a(n) !== a(g) + }) + } + ), + a(g) + ] + }, + a(g) + )) }) + ] }) }) + ] }); +} +function Ql({ + startChapter: e, + endChapter: r, + handleSelectStartChapter: t, + handleSelectEndChapter: n, + isDisabled: o = !1, + chapterCount: a +}) { + const i = lr( + () => Array.from({ length: a }, (d, u) => u + 1), + [a] + ); + return /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(Ze, { htmlFor: "start-chapters-combobox", children: "Chapters" }), + /* @__PURE__ */ l( + la, + { + isDisabled: o, + onChange: (d) => { + t(d), d > r && n(d); + }, + className: "pr-ml-2 pr-mr-2 pr-w-20", + options: i, + getOptionLabel: (d) => d.toString(), + value: e + }, + "start chapter" + ), + /* @__PURE__ */ l(Ze, { htmlFor: "end-chapters-combobox", children: "to" }), + /* @__PURE__ */ l( + la, + { + isDisabled: o, + onChange: (d) => { + n(d), d < e && t(d); + }, + className: "pr-ml-2 pr-w-20", + options: i, + getOptionLabel: (d) => d.toString(), + value: r + }, + "end chapter" + ) + ] }); +} +var ec = /* @__PURE__ */ ((e) => (e.CURRENT_BOOK = "current book", e.CHOOSE_BOOKS = "choose books", e))(ec || {}); +const c0 = Object.freeze([ + "%webView_bookSelector_currentBook%", + "%webView_bookSelector_choose%", + "%webView_bookSelector_chooseBooks%" +]), Dn = (e, r) => e[r] ?? r; +function d0({ + handleBookSelectionModeChange: e, + currentBookName: r, + onSelectBooks: t, + selectedBookIds: n, + chapterCount: o, + endChapter: a, + handleSelectEndChapter: i, + startChapter: s, + handleSelectStartChapter: c, + localizedStrings: d +}) { + const u = Dn(d, "%webView_bookSelector_currentBook%"), b = Dn(d, "%webView_bookSelector_choose%"), p = Dn(d, "%webView_bookSelector_chooseBooks%"), [h, f] = fe( + "current book" + /* CURRENT_BOOK */ + ), g = (v) => { + f(v), e(v); + }; + return /* @__PURE__ */ l( + $i, + { + className: "pr-twp pr-flex", + value: h, + onValueChange: (v) => g(v), + children: /* @__PURE__ */ E("div", { className: "pr-flex pr-w-full pr-flex-col pr-gap-4", children: [ + /* @__PURE__ */ E("div", { className: "pr-grid pr-grid-cols-[25%,25%,50%]", children: [ + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center", children: [ + /* @__PURE__ */ l(ro, { + value: "current book" + /* CURRENT_BOOK */ + }), + /* @__PURE__ */ l(Ze, { className: "pr-ml-1", children: u }) + ] }), + /* @__PURE__ */ l(Ze, { className: "pr-flex pr-items-center", children: r }), + /* @__PURE__ */ l("div", { className: "pr-flex pr-items-center pr-justify-end", children: /* @__PURE__ */ l( + Ql, + { + isDisabled: h === "choose books", + handleSelectStartChapter: c, + handleSelectEndChapter: i, + chapterCount: o, + startChapter: s, + endChapter: a + } + ) }) + ] }), + /* @__PURE__ */ E("div", { className: "pr-grid pr-grid-cols-[25%,50%,25%]", children: [ + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center", children: [ + /* @__PURE__ */ l(ro, { + value: "choose books" + /* CHOOSE_BOOKS */ + }), + /* @__PURE__ */ l(Ze, { className: "pr-ml-1", children: p }) + ] }), + /* @__PURE__ */ l(Ze, { className: "pr-flex pr-items-center", children: n.map((v) => ce.bookIdToEnglishName(v)).join(", ") }), + /* @__PURE__ */ l( + ye, + { + disabled: h === "current book", + onClick: () => t(), + children: b + } + ) + ] }) + ] }) + } + ); +} +function rc({ table: e }) { + return /* @__PURE__ */ E(bo, { children: [ + /* @__PURE__ */ l(Wp, { asChild: !0, children: /* @__PURE__ */ E(ye, { variant: "outline", size: "sm", className: "pr-ml-auto pr-hidden pr-h-8 lg:pr-flex", children: [ + /* @__PURE__ */ l(Sp, { className: "pr-mr-2 pr-h-4 pr-w-4" }), + "View" + ] }) }), + /* @__PURE__ */ E(ln, { align: "end", className: "pr-w-[150px]", children: [ + /* @__PURE__ */ l(Ct, { children: "Toggle columns" }), + /* @__PURE__ */ l(cn, {}), + e.getAllColumns().filter((r) => r.getCanHide()).map((r) => /* @__PURE__ */ l( + wo, + { + className: "pr-capitalize", + checked: r.getIsVisible(), + onCheckedChange: (t) => r.toggleVisibility(!!t), + children: r.id + }, + r.id + )) + ] }) + ] }); +} +const wt = be.Root, tc = be.Group, yt = be.Value, zr = M.forwardRef(({ className: e, children: r, ...t }, n) => /* @__PURE__ */ E( + be.Trigger, + { + ref: n, + className: R( + "pr-flex pr-h-10 pr-w-full pr-items-center pr-justify-between pr-rounded-md pr-border pr-border-input pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background placeholder:pr-text-muted-foreground focus:pr-outline-none focus:pr-ring-2 focus:pr-ring-ring focus:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50 [&>span]:pr-line-clamp-1", + e + ), + ...t, + children: [ + r, + /* @__PURE__ */ l(be.Icon, { asChild: !0, children: /* @__PURE__ */ l(an, { className: "pr-h-4 pr-w-4 pr-opacity-50" }) }) + ] + } +)); +zr.displayName = be.Trigger.displayName; +const Vi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + be.ScrollUpButton, + { + ref: t, + className: R("pr-flex pr-cursor-default pr-items-center pr-justify-center pr-py-1", e), + ...r, + children: /* @__PURE__ */ l(Cp, { className: "pr-h-4 pr-w-4" }) + } +)); +Vi.displayName = be.ScrollUpButton.displayName; +const Li = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + be.ScrollDownButton, + { + ref: t, + className: R("pr-flex pr-cursor-default pr-items-center pr-justify-center pr-py-1", e), + ...r, + children: /* @__PURE__ */ l(an, { className: "pr-h-4 pr-w-4" }) + } +)); +Li.displayName = be.ScrollDownButton.displayName; +const Fr = M.forwardRef(({ className: e, children: r, position: t = "popper", ...n }, o) => /* @__PURE__ */ l(be.Portal, { children: /* @__PURE__ */ E( + be.Content, + { + ref: o, + className: R( + "pr-twp pr-relative pr-z-50 pr-max-h-96 pr-min-w-[8rem] pr-overflow-hidden pr-rounded-md pr-border pr-bg-popover pr-text-popover-foreground pr-shadow-md data-[state=open]:pr-animate-in data-[state=closed]:pr-animate-out data-[state=closed]:pr-fade-out-0 data-[state=open]:pr-fade-in-0 data-[state=closed]:pr-zoom-out-95 data-[state=open]:pr-zoom-in-95 data-[side=bottom]:pr-slide-in-from-top-2 data-[side=left]:pr-slide-in-from-right-2 data-[side=right]:pr-slide-in-from-left-2 data-[side=top]:pr-slide-in-from-bottom-2", + t === "popper" && "data-[side=bottom]:pr-translate-y-1 data-[side=left]:pr--translate-x-1 data-[side=right]:pr-translate-x-1 data-[side=top]:pr--translate-y-1", + e + ), + position: t, + ...n, + children: [ + /* @__PURE__ */ l(Vi, {}), + /* @__PURE__ */ l( + be.Viewport, + { + className: R( + "pr-p-1", + t === "popper" && "pr-h-[var(--radix-select-trigger-height)] pr-w-full pr-min-w-[var(--radix-select-trigger-width)]" + ), + children: r + } + ), + /* @__PURE__ */ l(Li, {}) + ] + } +) })); +Fr.displayName = be.Content.displayName; +const nc = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + be.Label, + { + ref: t, + className: R("pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-font-semibold", e), + ...r + } +)); +nc.displayName = be.Label.displayName; +const Ue = M.forwardRef(({ className: e, children: r, ...t }, n) => /* @__PURE__ */ E( + be.Item, + { + ref: n, + className: R( + "pr-relative pr-flex pr-w-full pr-cursor-default pr-select-none pr-items-center pr-rounded-sm pr-py-1.5 pr-pl-8 pr-pr-2 pr-text-sm pr-outline-none focus:pr-bg-accent focus:pr-text-accent-foreground data-[disabled]:pr-pointer-events-none data-[disabled]:pr-opacity-50", + e + ), + ...t, + children: [ + /* @__PURE__ */ l("span", { className: "pr-absolute pr-left-2 pr-flex pr-h-3.5 pr-w-3.5 pr-items-center pr-justify-center", children: /* @__PURE__ */ l(be.ItemIndicator, { children: /* @__PURE__ */ l(on, { className: "pr-h-4 pr-w-4" }) }) }), + /* @__PURE__ */ l(be.ItemText, { children: r }) + ] + } +)); +Ue.displayName = be.Item.displayName; +const oc = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + be.Separator, + { + ref: t, + className: R("pr--mx-1 pr-my-1 pr-h-px pr-bg-muted", e), + ...r + } +)); +oc.displayName = be.Separator.displayName; +function ac({ table: e }) { + return /* @__PURE__ */ l("div", { className: "pr-flex pr-items-center pr-justify-between pr-px-2 pr-pb-3 pr-pt-3", children: /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-space-x-6 lg:pr-space-x-8", children: [ + /* @__PURE__ */ E("div", { className: "pr-flex-1 pr-text-sm pr-text-muted-foreground", children: [ + e.getFilteredSelectedRowModel().rows.length, + " of", + " ", + e.getFilteredRowModel().rows.length, + " row(s) selected" + ] }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-space-x-2", children: [ + /* @__PURE__ */ l("p", { className: "pr-text-nowrap pr-text-sm pr-font-medium", children: "Rows per page" }), + /* @__PURE__ */ E( + wt, + { + value: `${e.getState().pagination.pageSize}`, + onValueChange: (r) => { + e.setPageSize(Number(r)); + }, + children: [ + /* @__PURE__ */ l(zr, { className: "pr-h-8 pr-w-[70px]", children: /* @__PURE__ */ l(yt, { placeholder: e.getState().pagination.pageSize }) }), + /* @__PURE__ */ l(Fr, { side: "top", children: [10, 20, 30, 40, 50].map((r) => /* @__PURE__ */ l(Ue, { value: `${r}`, children: r }, r)) }) + ] + } + ) + ] }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-w-[100px] pr-items-center pr-justify-center pr-text-sm pr-font-medium", children: [ + "Page ", + e.getState().pagination.pageIndex + 1, + " of ", + e.getPageCount() + ] }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-space-x-2", children: [ + /* @__PURE__ */ E( + ye, + { + variant: "outline", + size: "icon", + className: "pr-hidden pr-h-8 pr-w-8 pr-p-0 lg:pr-flex", + onClick: () => e.setPageIndex(0), + disabled: !e.getCanPreviousPage(), + children: [ + /* @__PURE__ */ l("span", { className: "pr-sr-only", children: "Go to first page" }), + /* @__PURE__ */ l(Op, { className: "pr-h-4 pr-w-4" }) + ] + } + ), + /* @__PURE__ */ E( + ye, + { + variant: "outline", + size: "icon", + className: "pr-h-8 pr-w-8 pr-p-0", + onClick: () => e.previousPage(), + disabled: !e.getCanPreviousPage(), + children: [ + /* @__PURE__ */ l("span", { className: "pr-sr-only", children: "Go to previous page" }), + /* @__PURE__ */ l(Rp, { className: "pr-h-4 pr-w-4" }) + ] + } + ), + /* @__PURE__ */ E( + ye, + { + variant: "outline", + size: "icon", + className: "pr-h-8 pr-w-8 pr-p-0", + onClick: () => e.nextPage(), + disabled: !e.getCanNextPage(), + children: [ + /* @__PURE__ */ l("span", { className: "pr-sr-only", children: "Go to next page" }), + /* @__PURE__ */ l(Pp, { className: "pr-h-4 pr-w-4" }) + ] + } + ), + /* @__PURE__ */ E( + ye, + { + variant: "outline", + size: "icon", + className: "pr-hidden pr-h-8 pr-w-8 pr-p-0 lg:pr-flex", + onClick: () => e.setPageIndex(e.getPageCount() - 1), + disabled: !e.getCanNextPage(), + children: [ + /* @__PURE__ */ l("span", { className: "pr-sr-only", children: "Go to last page" }), + /* @__PURE__ */ l($p, { className: "pr-h-4 pr-w-4" }) + ] + } + ) + ] }) + ] }) }); +} +const dn = M.forwardRef(({ className: e, stickyHeader: r, ...t }, n) => /* @__PURE__ */ l("div", { className: R("pr-twp pr-relative pr-w-full", { "pr-overflow-auto": !r }), children: /* @__PURE__ */ l( + "table", + { + ref: n, + className: R("pr-w-full pr-caption-bottom pr-text-sm", e), + ...t + } +) })); +dn.displayName = "Table"; +const un = M.forwardRef(({ className: e, stickyHeader: r, ...t }, n) => /* @__PURE__ */ l( + "thead", + { + ref: n, + className: R( + { "pr-sticky pr-top-0 pr-bg-muted": r }, + "[&_tr]:pr-border-b", + e + ), + ...t + } +)); +un.displayName = "TableHeader"; +const fn = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l("tbody", { ref: t, className: R("[&_tr:last-child]:pr-border-0", e), ...r })); +fn.displayName = "TableBody"; +const ic = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + "tfoot", + { + ref: t, + className: R("pr-border-t pr-bg-muted/50 pr-font-medium [&>tr]:last:pr-border-b-0", e), + ...r + } +)); +ic.displayName = "TableFooter"; +const pr = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l( + "tr", + { + ref: t, + className: R( + "pr-border-b pr-transition-colors hover:pr-bg-muted/50 data-[state=selected]:pr-bg-muted", + e + ), + ...r + } + ) +); +pr.displayName = "TableRow"; +const xt = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + "th", + { + ref: t, + className: R( + "pr-h-12 pr-px-4 pr-text-start pr-align-middle pr-font-medium pr-text-muted-foreground [&:has([role=checkbox])]:pr-pe-0", + e + ), + ...r + } +)); +xt.displayName = "TableHead"; +const Ur = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + "td", + { + ref: t, + className: R("pr-p-4 pr-align-middle [&:has([role=checkbox])]:pr-pe-0", e), + ...r + } +)); +Ur.displayName = "TableCell"; +const sc = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + "caption", + { + ref: t, + className: R("pr-mt-4 pr-text-sm pr-text-muted-foreground", e), + ...r + } +)); +sc.displayName = "TableCaption"; +function pc({ + columns: e, + data: r, + enablePagination: t = !1, + showPaginationControls: n = !1, + showColumnVisibilityControls: o = !1, + stickyHeader: a = !1, + onRowClickHandler: i = () => { + } +}) { + var v; + const [s, c] = fe([]), [d, u] = fe([]), [b, p] = fe({}), [h, f] = fe({}), g = mi({ + data: r, + columns: e, + getCoreRowModel: hi(), + ...t && { getPaginationRowModel: Zp() }, + onSortingChange: c, + getSortedRowModel: gi(), + onColumnFiltersChange: u, + getFilteredRowModel: Qp(), + onColumnVisibilityChange: p, + onRowSelectionChange: f, + state: { + sorting: s, + columnFilters: d, + columnVisibility: b, + rowSelection: h + } + }); + return /* @__PURE__ */ E("div", { className: "pr-twp", children: [ + o && /* @__PURE__ */ l(rc, { table: g }), + /* @__PURE__ */ E(dn, { stickyHeader: a, children: [ + /* @__PURE__ */ l(un, { stickyHeader: a, children: g.getHeaderGroups().map((y) => /* @__PURE__ */ l(pr, { children: y.headers.map((C) => /* @__PURE__ */ l(xt, { children: C.isPlaceholder ? void 0 : ut(C.column.columnDef.header, C.getContext()) }, C.id)) }, y.id)) }), + /* @__PURE__ */ l(fn, { children: (v = g.getRowModel().rows) != null && v.length ? g.getRowModel().rows.map((y) => /* @__PURE__ */ l( + pr, + { + onClick: () => i(y, g), + "data-state": y.getIsSelected() && "selected", + children: y.getVisibleCells().map((C) => /* @__PURE__ */ l(Ur, { children: ut(C.column.columnDef.cell, C.getContext()) }, C.id)) + }, + y.id + )) : /* @__PURE__ */ l(pr, { children: /* @__PURE__ */ l(Ur, { colSpan: e.length, className: "pr-h-24 pr-text-center", children: "No results." }) }) }) + ] }), + t && /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-justify-end pr-space-x-2 pr-py-4", children: [ + /* @__PURE__ */ l( + ye, + { + variant: "outline", + size: "sm", + onClick: () => g.previousPage(), + disabled: !g.getCanPreviousPage(), + children: "Previous" + } + ), + /* @__PURE__ */ l( + ye, + { + variant: "outline", + size: "sm", + onClick: () => g.nextPage(), + disabled: !g.getCanNextPage(), + children: "Next" + } + ) + ] }), + t && n && /* @__PURE__ */ l(ac, { table: g }) + ] }); +} +const lc = (e) => e.split(/(?:\r?\n|\r)|(?=(?:\\(?:v|c|id)))/g), ca = (e) => { + const r = /^\\[vc]\s+(\d+)/, t = e.match(r); + if (t) + return +t[1]; +}, da = (e, r, t, n) => { + if (!e || e === "" || r === "") + return []; + const o = [], a = lc(e); + let i = n.chapterNum, s = n.verseNum, c = 0; + return a.forEach((d) => { + d.startsWith("\\id") && (i = 0, s = 0), d.startsWith("\\c") && (i = ca(d), s = 0), d.startsWith("\\v") && (s = ca(d), i === 0 && (i = n.chapterNum)); + const u = t(d, r); + for (let b = 0; b < u.length; b++) { + const p = { + reference: { + ...n, + chapterNum: i !== void 0 ? +i : -1, + verseNum: s !== void 0 ? +s : -1 + }, + snippet: d, + key: c + }; + c += 1, o.push(p); + } + }), o; +}; +function cc({ + selectedItem: e, + text: r, + extractItems: t, + scriptureReference: n, + setScriptureReference: o, + localizedStrings: a +}) { + const i = a["%webView_inventory_occurrences_table_header_reference%"], s = a["%webView_inventory_occurrences_table_header_occurrence%"], [c, d] = fe( + da(r, e, t, n) + ); + return Xe( + () => d(da(r, e, t, n)), + [r, e, n, t] + ), /* @__PURE__ */ E(dn, { stickyHeader: !0, children: [ + /* @__PURE__ */ l(un, { stickyHeader: !0, children: /* @__PURE__ */ E(pr, { children: [ + /* @__PURE__ */ l(xt, { children: i }), + /* @__PURE__ */ l(xt, { children: s }) + ] }) }), + /* @__PURE__ */ l(fn, { children: c.map((u) => /* @__PURE__ */ E( + pr, + { + onClick: () => { + o(u.reference); + }, + children: [ + /* @__PURE__ */ l(Ur, { children: `${ce.bookNumberToEnglishName(u.reference.bookNum)} ${u.reference.chapterNum}:${u.reference.verseNum}` }), + /* @__PURE__ */ l(Ur, { children: u.snippet }) + ] + }, + u.key + )) }) + ] }); +} +const u0 = Object.freeze([ + "%webView_inventory_all%", + "%webView_inventory_approved%", + "%webView_inventory_unapproved%", + "%webView_inventory_unknown%", + "%webView_inventory_scope_currentBook%", + "%webView_inventory_scope_chapter%", + "%webView_inventory_scope_verse%", + "%webView_inventory_filter_text%", + "%webView_inventory_occurrences_table_header_reference%", + "%webView_inventory_occurrences_table_header_occurrence%" +]), yo = (e) => e === "asc" ? /* @__PURE__ */ l(_p, { className: "pr-ms-2 pr-h-4 pr-w-4" }) : e === "desc" ? /* @__PURE__ */ l(Ip, { className: "pr-ms-2 pr-h-4 pr-w-4" }) : /* @__PURE__ */ l(Ap, { className: "pr-ms-2 pr-h-4 pr-w-4" }), dc = (e, r, t) => { + let n = e; + return r !== "all" && (n = n.filter( + (o) => r === "approved" && o.status === "approved" || r === "unapproved" && o.status === "unapproved" || r === "unknown" && o.status === "unknown" + )), t !== "" && (n = n.filter((o) => o.item.includes(t))), n; +}, uc = (e, r, t) => { + const n = [], o = r(e); + for (let a = 0; a < o.length; a++) { + const i = o[a], s = n.find((c) => c.item === i); + if (s) + s.count += 1; + else { + const c = { + item: i, + count: 1, + status: t(i) + }; + n.push(c); + } + } + return n; +}, nr = (e, r) => e[r] ?? r; +function f0({ + scriptureReference: e, + setScriptureReference: r, + localizedStrings: t, + extractItems: n, + approvedItems: o, + onApprovedItemsChange: a, + unapprovedItems: i, + onUnapprovedItemsChange: s, + text: c, + scope: d, + onScopeChange: u, + getColumns: b +}) { + const p = nr(t, "%webView_inventory_all%"), h = nr(t, "%webView_inventory_approved%"), f = nr(t, "%webView_inventory_unapproved%"), g = nr(t, "%webView_inventory_unknown%"), v = nr(t, "%webView_inventory_scope_currentBook%"), y = nr(t, "%webView_inventory_scope_chapter%"), C = nr(t, "%webView_inventory_scope_verse%"), T = nr(t, "%webView_inventory_filter_text%"), [x, w] = fe([]), [O, P] = fe("all"), [V, S] = fe(""), [$, k] = fe(""), j = Se( + (z, N) => { + w((U) => { + let F = []; + return z.forEach((q) => { + F = U.map((G) => G.item === q && G.status !== N ? { ...G, status: N } : G); + }), F; + }); + let I = [...o]; + z.forEach((U) => { + N === "approved" ? I.includes(U) || I.push(U) : I = I.filter((F) => F !== U); + }), a(I); + let W = [...i]; + z.forEach((U) => { + N === "unapproved" ? W.includes(U) || W.push(U) : W = W.filter( + (F) => F !== U + ); + }), s(W); + }, + [o, a, i, s] + ), B = Se( + (z) => o.includes(z) ? "approved" : i.includes(z) ? "unapproved" : "unknown", + [o, i] + ); + Xe(() => { + c && w(uc(c, n, B)); + }, [n, c, B]); + const Z = lr(() => dc(x, O, V), [x, O, V]); + Xe(() => { + k(""); + }, [Z]); + const J = (z, N) => { + N.toggleAllRowsSelected(!1), z.toggleSelected(void 0), k(z.getValue("item")); + }, X = lr(() => b(j), [b, j]), te = (z) => { + if (z === "book" || z === "chapter" || z === "verse") + u(z); + else + throw new Error(`Invalid scope value: ${z}`); + }, ae = (z) => { + if (z === "all" || z === "approved" || z === "unapproved" || z === "unknown") + P(z); + else + throw new Error(`Invalid status filter value: ${z}`); + }; + return /* @__PURE__ */ E("div", { className: "pr-twp pr-flex pr-h-full pr-flex-col", children: [ + /* @__PURE__ */ E("div", { className: "pr-flex", children: [ + /* @__PURE__ */ E( + wt, + { + onValueChange: (z) => ae(z), + defaultValue: O, + children: [ + /* @__PURE__ */ l(zr, { className: "pr-m-1", children: /* @__PURE__ */ l(yt, { placeholder: "Select filter" }) }), + /* @__PURE__ */ E(Fr, { children: [ + /* @__PURE__ */ l(Ue, { value: "all", children: p }), + /* @__PURE__ */ l(Ue, { value: "approved", children: h }), + /* @__PURE__ */ l(Ue, { value: "unapproved", children: f }), + /* @__PURE__ */ l(Ue, { value: "unknown", children: g }) + ] }) + ] + } + ), + /* @__PURE__ */ E(wt, { onValueChange: (z) => te(z), defaultValue: d, children: [ + /* @__PURE__ */ l(zr, { className: "pr-m-1", children: /* @__PURE__ */ l(yt, { placeholder: "Select scope" }) }), + /* @__PURE__ */ E(Fr, { children: [ + /* @__PURE__ */ l(Ue, { value: "book", children: v }), + /* @__PURE__ */ l(Ue, { value: "chapter", children: y }), + /* @__PURE__ */ l(Ue, { value: "verse", children: C }) + ] }) + ] }), + /* @__PURE__ */ l( + St, + { + className: "pr-m-1 pr-rounded-md pr-border", + placeholder: T, + value: V, + onChange: (z) => { + S(z.target.value); + } + } + ) + ] }), + /* @__PURE__ */ l("div", { className: "pr-m-1 pr-flex-1 pr-overflow-auto pr-rounded-md pr-border", children: /* @__PURE__ */ l( + pc, + { + columns: X, + data: Z, + onRowClickHandler: J, + stickyHeader: !0 + } + ) }), + $ !== "" && /* @__PURE__ */ l("div", { className: "pr-m-1 pr-flex-1 pr-overflow-auto pr-rounded-md pr-border", children: /* @__PURE__ */ l( + cc, + { + selectedItem: $, + text: c, + extractItems: n, + scriptureReference: e, + setScriptureReference: (z) => r(z), + localizedStrings: t + } + ) }) + ] }); +} +const zi = sn( + "pr-twp pr-inline-flex pr-items-center pr-justify-center pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors hover:pr-bg-muted hover:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=on]:pr-bg-accent data-[state=on]:pr-text-accent-foreground", + { + variants: { + variant: { + default: "pr-bg-transparent", + outline: "pr-border pr-border-input pr-bg-transparent hover:pr-bg-accent hover:pr-text-accent-foreground" + }, + size: { + default: "pr-h-10 pr-px-3", + sm: "pr-h-9 pr-px-2.5", + lg: "pr-h-11 pr-px-5" + } + }, + defaultVariants: { + variant: "default", + size: "default" + } + } +), fc = M.forwardRef(({ className: e, variant: r, size: t, ...n }, o) => /* @__PURE__ */ l( + vi.Root, + { + ref: o, + className: R(zi({ variant: r, size: t, className: e })), + ...n + } +)); +fc.displayName = vi.Root.displayName; +const Fi = M.createContext({ + size: "default", + variant: "default" +}), Ui = M.forwardRef(({ className: e, variant: r, size: t, children: n, ...o }, a) => /* @__PURE__ */ l( + pn.Root, + { + ref: a, + className: R("pr-twp pr-flex pr-items-center pr-justify-center pr-gap-1", e), + ...o, + children: /* @__PURE__ */ l( + Fi.Provider, + { + value: { variant: r, size: t }, + children: n + } + ) + } +)); +Ui.displayName = pn.Root.displayName; +const Xt = M.forwardRef(({ className: e, children: r, variant: t, size: n, ...o }, a) => { + const i = M.useContext(Fi); + return /* @__PURE__ */ l( + pn.Item, + { + ref: a, + className: R( + zi({ + variant: i.variant || t, + size: i.size || n + }), + e + ), + ...o, + children: r + } + ); +}); +Xt.displayName = pn.Item.displayName; +const m0 = (e) => ({ + accessorKey: "item", + header: ({ column: r }) => /* @__PURE__ */ E(ye, { variant: "ghost", onClick: () => r.toggleSorting(void 0), children: [ + e, + yo(r.getIsSorted()) + ] }) +}), h0 = (e) => ({ + accessorKey: "count", + header: ({ column: r }) => /* @__PURE__ */ l("div", { className: "pr-flex pr-justify-end pr-tabular-nums", children: /* @__PURE__ */ E(ye, { variant: "ghost", onClick: () => r.toggleSorting(void 0), children: [ + e, + yo(r.getIsSorted()) + ] }) }), + cell: ({ row: r }) => /* @__PURE__ */ l("div", { className: "pr-flex pr-justify-end", children: r.getValue("count") }) +}), g0 = (e, r) => ({ + accessorKey: "status", + header: ({ column: t }) => /* @__PURE__ */ l("div", { className: "pr-flex pr-justify-center", children: /* @__PURE__ */ E(ye, { variant: "ghost", onClick: () => t.toggleSorting(void 0), children: [ + e, + yo(t.getIsSorted()) + ] }) }), + cell: ({ row: t }) => { + const n = t.getValue("status"), o = t.getValue("item"); + return /* @__PURE__ */ E(Ui, { value: n, variant: "outline", type: "single", children: [ + /* @__PURE__ */ l(Xt, { onClick: () => r([o], "approved"), value: "approved", children: /* @__PURE__ */ l(Dp, {}) }), + /* @__PURE__ */ l( + Xt, + { + onClick: () => r([o], "unapproved"), + value: "unapproved", + children: /* @__PURE__ */ l(Mp, {}) + } + ), + /* @__PURE__ */ l(Xt, { onClick: () => r([o], "unknown"), value: "unknown", children: /* @__PURE__ */ l(Bp, {}) }) + ] }); + } +}); +function mc({ onSearch: e, placeholder: r, isFullWidth: t }) { + const [n, o] = fe(""), a = (i) => { + o(i), e(i); + }; + return /* @__PURE__ */ l( + St, + { + className: R( + "pr-flex pr-h-10 pr-rounded-md pr-border pr-border-input pr-bg-background pr-px-3 pr-py-2 pr-text-sm pr-ring-offset-background file:pr-border-0 file:pr-bg-transparent file:pr-text-sm file:pr-font-medium placeholder:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-[color:hsl(240,5%,64.9%)] focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50", + { "pr-w-full": t } + ), + placeholder: r, + value: n, + onChange: (i) => a(i.target.value) + } + ); +} +const Gi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.Root, + { + orientation: "vertical", + ref: t, + className: R("pr-flex pr-gap-1 pr-rounded-md pr-text-muted-foreground", e), + ...r + } +)); +Gi.displayName = Pe.List.displayName; +const Hi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.List, + { + ref: t, + className: R( + "pr-flex-fit pr-mlk-items-center pr-w-[124px] pr-justify-center pr-rounded-md pr-bg-muted pr-p-1 pr-text-muted-foreground", + e + ), + ...r + } +)); +Hi.displayName = Pe.List.displayName; +const hc = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.Trigger, + { + ref: t, + ...r, + className: R( + "overflow-clip pr-inline-flex pr-w-[116px] pr-cursor-pointer pr-items-center pr-justify-center pr-break-words pr-rounded-sm pr-border-0 pr-bg-muted pr-px-3 pr-py-1.5 pr-text-sm pr-font-medium pr-text-inherit pr-ring-offset-background pr-transition-all hover:pr-text-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=active]:pr-bg-background data-[state=active]:pr-text-foreground data-[state=active]:pr-shadow-sm", + e + ) + } +)), Xi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.Content, + { + ref: t, + className: R( + "mt-2 pr-ms-5 pr-flex-grow pr-text-foreground pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2", + e + ), + ...r + } +)); +Xi.displayName = Pe.Content.displayName; +function v0({ + tabList: e, + onSearch: r, + searchPlaceholder: t, + headerTitle: n, + isSearchBarFullWidth: o = !1, + direction: a = "ltr" +}) { + return /* @__PURE__ */ E("div", { className: "pr-twp", children: [ + /* @__PURE__ */ E("div", { className: "pr-sticky pr-top-0 pr-space-y-2 pr-pb-2", children: [ + n ? /* @__PURE__ */ l("h1", { children: n }) : "", + /* @__PURE__ */ l( + mc, + { + isFullWidth: o, + onSearch: r, + placeholder: t + } + ) + ] }), + /* @__PURE__ */ E(Gi, { dir: a, children: [ + /* @__PURE__ */ l(Hi, { children: e.map((i) => /* @__PURE__ */ l(hc, { value: i.value, children: i.value }, i.key)) }), + e.map((i) => /* @__PURE__ */ l(Xi, { value: i.value, children: i.content }, i.key)) + ] }) + ] }); +} +const ir = "scrBook", gc = "scrRef", vr = "source", vc = "details", bc = "Scripture Reference", wc = "Scripture Book", Wi = "Type", yc = "Details"; +function xc(e, r) { + const t = r ?? !1; + return [ + { + accessorFn: (n) => `${ce.bookNumberToId(n.start.bookNum)} ${n.start.chapterNum}:${n.start.verseNum}`, + id: ir, + header: (e == null ? void 0 : e.scriptureReferenceColumnName) ?? bc, + cell: (n) => { + const o = n.row.original; + return n.row.getIsGrouped() ? ce.bookNumberToEnglishName(o.start.bookNum) : n.row.groupingColumnId === ir ? In(o.start) : void 0; + }, + getGroupingValue: (n) => n.start.bookNum, + sortingFn: (n, o) => Zn(n.original.start, o.original.start), + enableGrouping: !0 + }, + { + accessorFn: (n) => In(n.start), + id: gc, + header: void 0, + cell: (n) => { + const o = n.row.original; + return n.row.getIsGrouped() ? void 0 : In(o.start); + }, + sortingFn: (n, o) => Zn(n.original.start, o.original.start), + enableGrouping: !1 + }, + { + accessorFn: (n) => n.source.displayName, + id: vr, + header: t ? (e == null ? void 0 : e.typeColumnName) ?? Wi : void 0, + cell: (n) => t || n.row.getIsGrouped() ? n.getValue() : void 0, + getGroupingValue: (n) => n.source.id, + sortingFn: (n, o) => n.original.source.displayName.localeCompare(o.original.source.displayName), + enableGrouping: !0 + }, + { + accessorFn: (n) => n.detail, + id: vc, + header: (e == null ? void 0 : e.detailsColumnName) ?? yc, + cell: (n) => n.getValue(), + enableGrouping: !1 + } + ]; +} +const kc = (e) => { + if (!("offset" in e.start)) + throw new Error("No offset available in range start"); + if (e.end && !("offset" in e.end)) + throw new Error("No offset available in range end"); + const { offset: r } = e.start; + let t = 0; + return e.end && ({ offset: t } = e.end), !e.end || Zn(e.start, e.end) === 0 ? `${An(e.start)}+${r}` : `${An(e.start)}+${r}-${An(e.end)}+${t}`; +}, ua = (e) => `${kc({ start: e.start, end: e.end })} ${e.source.displayName} ${e.detail}`; +function b0({ + sources: e, + showColumnHeaders: r = !1, + showSourceColumn: t = !1, + scriptureReferenceColumnName: n, + scriptureBookGroupName: o, + typeColumnName: a, + detailsColumnName: i, + onRowSelected: s, + direction: c = "ltr" +}) { + const [d, u] = fe([]), [b, p] = fe([{ id: ir, desc: !1 }]), [h, f] = fe({}), g = lr( + () => e.flatMap((S) => S.data.map(($) => ({ + ...$, + source: S.source + }))), + [e] + ), v = lr( + () => xc( + { + scriptureReferenceColumnName: n, + typeColumnName: a, + detailsColumnName: i + }, + t + ), + [n, a, i, t] + ); + Xe(() => { + d.includes(vr) ? p([ + { id: vr, desc: !1 }, + { id: ir, desc: !1 } + ]) : p([{ id: ir, desc: !1 }]); + }, [d]); + const y = mi({ + data: g, + columns: v, + state: { + grouping: d, + sorting: b, + rowSelection: h + }, + onGroupingChange: u, + onSortingChange: p, + onRowSelectionChange: f, + getExpandedRowModel: el(), + getGroupedRowModel: rl(), + getCoreRowModel: hi(), + getSortedRowModel: gi(), + getRowId: ua, + autoResetExpanded: !1, + enableMultiRowSelection: !1, + enableSubRowSelection: !1 + }); + Xe(() => { + if (s) { + const S = y.getSelectedRowModel().rowsById, $ = Object.keys(S); + if ($.length === 1) { + const k = g.find((j) => ua(j) === $[0]) || void 0; + k && s(k); + } + } + }, [h, g, s, y]); + const C = o ?? wc, T = a ?? Wi, x = [ + { label: "No Grouping", value: [] }, + { label: `Group by ${C}`, value: [ir] }, + { label: `Group by ${T}`, value: [vr] }, + { + label: `Group by ${C} and ${T}`, + value: [ir, vr] + }, + { + label: `Group by ${T} and ${C}`, + value: [vr, ir] + } + ], w = (S) => { + u(JSON.parse(S)); + }, O = (S, $) => { + !S.getIsGrouped() && !S.getIsSelected() && S.getToggleSelectedHandler()($); + }, P = (S, $) => S.getIsGrouped() ? "" : R("banded-row", $ % 2 === 0 ? "even" : "odd"), V = (S, $, k) => { + if (!((S == null ? void 0 : S.length) === 0 || $.depth < k.column.getGroupedIndex())) { + if ($.getIsGrouped()) + switch ($.depth) { + case 1: + return "pr-ps-4"; + default: + return; + } + switch ($.depth) { + case 1: + return "pr-ps-8"; + case 2: + return "pr-ps-12"; + default: + return; + } + } + }; + return /* @__PURE__ */ E("div", { className: "pr-twp pr-flex pr-h-full pr-w-full pr-flex-col", children: [ + !r && /* @__PURE__ */ E( + wt, + { + value: JSON.stringify(d), + onValueChange: (S) => { + w(S); + }, + children: [ + /* @__PURE__ */ l(zr, { className: "pr-mb-1 pr-mt-2", children: /* @__PURE__ */ l(yt, {}) }), + /* @__PURE__ */ l(Fr, { position: "item-aligned", children: /* @__PURE__ */ l(tc, { children: x.map((S) => /* @__PURE__ */ l(Ue, { value: JSON.stringify(S.value), children: S.label }, S.label)) }) }) + ] + } + ), + /* @__PURE__ */ E(dn, { className: "pr-relative pr-flex pr-flex-col pr-overflow-y-auto pr-p-0", children: [ + r && /* @__PURE__ */ l(un, { children: y.getHeaderGroups().map((S) => /* @__PURE__ */ l(pr, { children: S.headers.filter(($) => $.column.columnDef.header).map(($) => ( + /* For sticky column headers to work, we probably need to change the default definition of the shadcn Table component. See https://github.com/shadcn-ui/ui/issues/1151 */ + /* @__PURE__ */ l(xt, { colSpan: $.colSpan, className: "top-0 pr-sticky", children: $.isPlaceholder ? void 0 : /* @__PURE__ */ E("div", { children: [ + $.column.getCanGroup() ? /* @__PURE__ */ l( + ye, + { + variant: "ghost", + title: `Toggle grouping by ${$.column.columnDef.header}`, + onClick: $.column.getToggleGroupingHandler(), + type: "button", + children: $.column.getIsGrouped() ? "🛑" : "👊 " + } + ) : void 0, + " ", + ut($.column.columnDef.header, $.getContext()) + ] }) }, $.id) + )) }, S.id)) }), + /* @__PURE__ */ l(fn, { children: y.getRowModel().rows.map((S, $) => /* @__PURE__ */ l( + pr, + { + "data-state": S.getIsSelected() ? "selected" : "", + className: R(P(S, $)), + onClick: (k) => O(S, k), + children: S.getVisibleCells().map((k) => { + if (!(k.getIsPlaceholder() || k.column.columnDef.enableGrouping && !k.getIsGrouped() && (k.column.columnDef.id !== vr || !t))) + return /* @__PURE__ */ l( + Ur, + { + className: R( + k.column.columnDef.id, + "pr-p-[1px]", + V(d, S, k) + ), + children: (() => k.getIsGrouped() ? /* @__PURE__ */ E( + ye, + { + variant: "link", + onClick: S.getToggleExpandedHandler(), + type: "button", + children: [ + S.getIsExpanded() && /* @__PURE__ */ l(an, {}), + !S.getIsExpanded() && (c === "ltr" ? /* @__PURE__ */ l(di, {}) : /* @__PURE__ */ l(jp, {})), + " ", + ut(k.column.columnDef.cell, k.getContext()), + " (", + S.subRows.length, + ")" + ] + } + ) : ut(k.column.columnDef.cell, k.getContext()))() + }, + k.id + ); + }) + }, + S.id + )) }) + ] }) + ] }); +} +const Mn = { + [ue("undefined")]: "Ø", + [ue(0)]: "A", + [ue(1)]: "B", + [ue(2)]: "C", + [ue(3)]: "D", + [ue(4)]: "E", + [ue(5)]: "F", + [ue(6)]: "G", + [ue(7)]: "H", + [ue(8)]: "I", + [ue(9)]: "J", + [ue(10)]: "K", + [ue(11)]: "L", + [ue(12)]: "M", + [ue(13)]: "N", + [ue(14)]: "O", + [ue(15)]: "P", + [ue(16)]: "Q", + [ue(17)]: "R", + [ue(18)]: "S", + [ue(19)]: "T", + [ue(20)]: "U", + [ue(21)]: "V", + [ue(22)]: "W", + [ue(23)]: "X", + [ue(24)]: "Y", + [ue(25)]: "Z" +}; +function w0({ + availableScrollGroupIds: e, + scrollGroupId: r, + onChangeScrollGroupId: t, + localizedStrings: n = {} +}) { + const o = { + ...Mn, + ...Object.fromEntries( + Object.entries(n).map( + ([a, i]) => [ + a, + a === i && a in Mn ? Mn[a] : i + ] + ) + ) + }; + return /* @__PURE__ */ E( + wt, + { + value: `${r}`, + onValueChange: (a) => t( + a === "undefined" ? void 0 : parseInt(a, 10) + ), + children: [ + /* @__PURE__ */ l(zr, { className: "pr-twp pr-w-auto", children: /* @__PURE__ */ l( + yt, + { + placeholder: o[ue(r)] ?? r + } + ) }), + /* @__PURE__ */ l( + Fr, + { + style: { zIndex: 250 }, + children: e.map((a) => /* @__PURE__ */ l(Ue, { value: `${a}`, children: o[ue(a)] }, `${a}`)) + } + ) + ] + } + ); +} +const Yi = M.forwardRef(({ className: e, orientation: r = "horizontal", decorative: t = !0, ...n }, o) => /* @__PURE__ */ l( + bi.Root, + { + ref: o, + decorative: t, + orientation: r, + className: R( + "pr-twp pr-shrink-0 pr-bg-border", + r === "horizontal" ? "pr-h-[1px] pr-w-full" : "pr-h-full pr-w-[1px]", + e + ), + ...n + } +)); +Yi.displayName = bi.Root.displayName; +function y0({ children: e }) { + return /* @__PURE__ */ l("div", { className: "pr-twp pr-grid", children: e }); +} +function x0({ + primary: e, + secondary: r, + children: t, + isLoading: n = !1, + loadingMessage: o +}) { + return /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-justify-between pr-space-x-4 pr-py-2", children: [ + /* @__PURE__ */ E("div", { children: [ + /* @__PURE__ */ l("p", { className: "pr-text-sm pr-font-medium pr-leading-none", children: e }), + /* @__PURE__ */ l("p", { className: "pr-whitespace-normal pr-break-words pr-text-sm pr-text-muted-foreground", children: r }) + ] }), + n ? /* @__PURE__ */ l("p", { className: "pr-text-sm pr-text-muted-foreground", children: o }) : /* @__PURE__ */ l("div", { children: t }) + ] }); +} +function k0({ + primary: e, + secondary: r, + includeSeparator: t = !1 +}) { + return /* @__PURE__ */ E("div", { className: "pr-space-y-4 pr-py-2", children: [ + /* @__PURE__ */ E("div", { children: [ + /* @__PURE__ */ l("h3", { className: "pr-text-lg pr-font-medium", children: e }), + /* @__PURE__ */ l("p", { className: "pr-text-sm pr-text-muted-foreground", children: r }) + ] }), + t ? /* @__PURE__ */ l(Yi, {}) : "" + ] }); +} +const qi = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Qn.Root, + { + ref: t, + className: R( + "pr-peer pr-twp pr-h-4 pr-w-4 pr-shrink-0 pr-rounded-sm pr-border pr-border-primary pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-cursor-not-allowed disabled:pr-opacity-50 data-[state=checked]:pr-bg-primary data-[state=checked]:pr-text-primary-foreground", + e + ), + ...r, + children: /* @__PURE__ */ l( + Qn.Indicator, + { + className: R("pr-flex pr-items-center pr-justify-center pr-text-current"), + children: /* @__PURE__ */ l(on, { className: "pr-h-4 pr-w-4" }) + } + ) + } +)); +qi.displayName = Qn.Root.displayName; +function N0({ + id: e, + className: r, + listItems: t, + selectedListItems: n, + handleSelectListItem: o, + createLabel: a +}) { + return /* @__PURE__ */ l("div", { id: e, className: r, children: t.map((i) => /* @__PURE__ */ E("div", { className: "pr-m-2 pr-flex pr-items-center", children: [ + /* @__PURE__ */ l( + qi, + { + className: "pr-mr-2 pr-align-middle", + checked: n.includes(i), + onCheckedChange: (s) => o(i, s) + } + ), + /* @__PURE__ */ l(Ze, { children: a ? a(i) : i }) + ] }, i)) }); +} +function Nc(e) { + return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e; +} +function Ec(e) { + if (e.__esModule) + return e; + var r = e.default; + if (typeof r == "function") { + var t = function n() { + return this instanceof n ? Reflect.construct(r, arguments, this.constructor) : r.apply(this, arguments); + }; + t.prototype = r.prototype; + } else + t = {}; + return Object.defineProperty(t, "__esModule", { value: !0 }), Object.keys(e).forEach(function(n) { + var o = Object.getOwnPropertyDescriptor(e, n); + Object.defineProperty(t, n, o.get ? o : { + enumerable: !0, + get: function() { + return e[n]; + } + }); + }), t; +} +var xo = {}, Ki = { exports: {} }; +(function(e) { + function r(t) { + return t && t.__esModule ? t : { + default: t + }; + } + e.exports = r, e.exports.__esModule = !0, e.exports.default = e.exports; +})(Ki); +var Tc = Ki.exports, Bn = {}; +function ko(e, r) { + return process.env.NODE_ENV === "production" ? () => null : function(...n) { + return e(...n) || r(...n); + }; +} +function _() { + return _ = Object.assign ? Object.assign.bind() : function(e) { + for (var r = 1; r < arguments.length; r++) { + var t = arguments[r]; + for (var n in t) + Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]); + } + return e; + }, _.apply(this, arguments); +} +function yr(e) { + if (typeof e != "object" || e === null) + return !1; + const r = Object.getPrototypeOf(e); + return (r === null || r === Object.prototype || Object.getPrototypeOf(r) === null) && !(Symbol.toStringTag in e) && !(Symbol.iterator in e); +} +function Ji(e) { + if (!yr(e)) + return e; + const r = {}; + return Object.keys(e).forEach((t) => { + r[t] = Ji(e[t]); + }), r; +} +function Qe(e, r, t = { + clone: !0 +}) { + const n = t.clone ? _({}, e) : e; + return yr(e) && yr(r) && Object.keys(r).forEach((o) => { + o !== "__proto__" && (yr(r[o]) && o in e && yr(e[o]) ? n[o] = Qe(e[o], r[o], t) : t.clone ? n[o] = yr(r[o]) ? Ji(r[o]) : r[o] : n[o] = r[o]); + }), n; +} +var to = { exports: {} }, Lt = { exports: {} }, ie = {}; +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var fa; +function Sc() { + if (fa) + return ie; + fa = 1; + var e = typeof Symbol == "function" && Symbol.for, r = e ? Symbol.for("react.element") : 60103, t = e ? Symbol.for("react.portal") : 60106, n = e ? Symbol.for("react.fragment") : 60107, o = e ? Symbol.for("react.strict_mode") : 60108, a = e ? Symbol.for("react.profiler") : 60114, i = e ? Symbol.for("react.provider") : 60109, s = e ? Symbol.for("react.context") : 60110, c = e ? Symbol.for("react.async_mode") : 60111, d = e ? Symbol.for("react.concurrent_mode") : 60111, u = e ? Symbol.for("react.forward_ref") : 60112, b = e ? Symbol.for("react.suspense") : 60113, p = e ? Symbol.for("react.suspense_list") : 60120, h = e ? Symbol.for("react.memo") : 60115, f = e ? Symbol.for("react.lazy") : 60116, g = e ? Symbol.for("react.block") : 60121, v = e ? Symbol.for("react.fundamental") : 60117, y = e ? Symbol.for("react.responder") : 60118, C = e ? Symbol.for("react.scope") : 60119; + function T(w) { + if (typeof w == "object" && w !== null) { + var O = w.$$typeof; + switch (O) { + case r: + switch (w = w.type, w) { + case c: + case d: + case n: + case a: + case o: + case b: + return w; + default: + switch (w = w && w.$$typeof, w) { + case s: + case u: + case f: + case h: + case i: + return w; + default: + return O; + } + } + case t: + return O; + } + } + } + function x(w) { + return T(w) === d; + } + return ie.AsyncMode = c, ie.ConcurrentMode = d, ie.ContextConsumer = s, ie.ContextProvider = i, ie.Element = r, ie.ForwardRef = u, ie.Fragment = n, ie.Lazy = f, ie.Memo = h, ie.Portal = t, ie.Profiler = a, ie.StrictMode = o, ie.Suspense = b, ie.isAsyncMode = function(w) { + return x(w) || T(w) === c; + }, ie.isConcurrentMode = x, ie.isContextConsumer = function(w) { + return T(w) === s; + }, ie.isContextProvider = function(w) { + return T(w) === i; + }, ie.isElement = function(w) { + return typeof w == "object" && w !== null && w.$$typeof === r; + }, ie.isForwardRef = function(w) { + return T(w) === u; + }, ie.isFragment = function(w) { + return T(w) === n; + }, ie.isLazy = function(w) { + return T(w) === f; + }, ie.isMemo = function(w) { + return T(w) === h; + }, ie.isPortal = function(w) { + return T(w) === t; + }, ie.isProfiler = function(w) { + return T(w) === a; + }, ie.isStrictMode = function(w) { + return T(w) === o; + }, ie.isSuspense = function(w) { + return T(w) === b; + }, ie.isValidElementType = function(w) { + return typeof w == "string" || typeof w == "function" || w === n || w === d || w === a || w === o || w === b || w === p || typeof w == "object" && w !== null && (w.$$typeof === f || w.$$typeof === h || w.$$typeof === i || w.$$typeof === s || w.$$typeof === u || w.$$typeof === v || w.$$typeof === y || w.$$typeof === C || w.$$typeof === g); + }, ie.typeOf = T, ie; +} +var se = {}; +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var ma; +function Cc() { + return ma || (ma = 1, process.env.NODE_ENV !== "production" && function() { + var e = typeof Symbol == "function" && Symbol.for, r = e ? Symbol.for("react.element") : 60103, t = e ? Symbol.for("react.portal") : 60106, n = e ? Symbol.for("react.fragment") : 60107, o = e ? Symbol.for("react.strict_mode") : 60108, a = e ? Symbol.for("react.profiler") : 60114, i = e ? Symbol.for("react.provider") : 60109, s = e ? Symbol.for("react.context") : 60110, c = e ? Symbol.for("react.async_mode") : 60111, d = e ? Symbol.for("react.concurrent_mode") : 60111, u = e ? Symbol.for("react.forward_ref") : 60112, b = e ? Symbol.for("react.suspense") : 60113, p = e ? Symbol.for("react.suspense_list") : 60120, h = e ? Symbol.for("react.memo") : 60115, f = e ? Symbol.for("react.lazy") : 60116, g = e ? Symbol.for("react.block") : 60121, v = e ? Symbol.for("react.fundamental") : 60117, y = e ? Symbol.for("react.responder") : 60118, C = e ? Symbol.for("react.scope") : 60119; + function T(A) { + return typeof A == "string" || typeof A == "function" || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + A === n || A === d || A === a || A === o || A === b || A === p || typeof A == "object" && A !== null && (A.$$typeof === f || A.$$typeof === h || A.$$typeof === i || A.$$typeof === s || A.$$typeof === u || A.$$typeof === v || A.$$typeof === y || A.$$typeof === C || A.$$typeof === g); + } + function x(A) { + if (typeof A == "object" && A !== null) { + var ke = A.$$typeof; + switch (ke) { + case r: + var L = A.type; + switch (L) { + case c: + case d: + case n: + case a: + case o: + case b: + return L; + default: + var xe = L && L.$$typeof; + switch (xe) { + case s: + case u: + case f: + case h: + case i: + return xe; + default: + return ke; + } + } + case t: + return ke; + } + } + } + var w = c, O = d, P = s, V = i, S = r, $ = u, k = n, j = f, B = h, Z = t, J = a, X = o, te = b, ae = !1; + function z(A) { + return ae || (ae = !0, console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.")), N(A) || x(A) === c; + } + function N(A) { + return x(A) === d; + } + function I(A) { + return x(A) === s; + } + function W(A) { + return x(A) === i; + } + function U(A) { + return typeof A == "object" && A !== null && A.$$typeof === r; + } + function F(A) { + return x(A) === u; + } + function q(A) { + return x(A) === n; + } + function G(A) { + return x(A) === f; + } + function K(A) { + return x(A) === h; + } + function Y(A) { + return x(A) === t; + } + function Q(A) { + return x(A) === a; + } + function ee(A) { + return x(A) === o; + } + function de(A) { + return x(A) === b; + } + se.AsyncMode = w, se.ConcurrentMode = O, se.ContextConsumer = P, se.ContextProvider = V, se.Element = S, se.ForwardRef = $, se.Fragment = k, se.Lazy = j, se.Memo = B, se.Portal = Z, se.Profiler = J, se.StrictMode = X, se.Suspense = te, se.isAsyncMode = z, se.isConcurrentMode = N, se.isContextConsumer = I, se.isContextProvider = W, se.isElement = U, se.isForwardRef = F, se.isFragment = q, se.isLazy = G, se.isMemo = K, se.isPortal = Y, se.isProfiler = Q, se.isStrictMode = ee, se.isSuspense = de, se.isValidElementType = T, se.typeOf = x; + }()), se; +} +var ha; +function Zi() { + return ha || (ha = 1, process.env.NODE_ENV === "production" ? Lt.exports = Sc() : Lt.exports = Cc()), Lt.exports; +} +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +var jn, ga; +function Oc() { + if (ga) + return jn; + ga = 1; + var e = Object.getOwnPropertySymbols, r = Object.prototype.hasOwnProperty, t = Object.prototype.propertyIsEnumerable; + function n(a) { + if (a == null) + throw new TypeError("Object.assign cannot be called with null or undefined"); + return Object(a); + } + function o() { + try { + if (!Object.assign) + return !1; + var a = new String("abc"); + if (a[5] = "de", Object.getOwnPropertyNames(a)[0] === "5") + return !1; + for (var i = {}, s = 0; s < 10; s++) + i["_" + String.fromCharCode(s)] = s; + var c = Object.getOwnPropertyNames(i).map(function(u) { + return i[u]; + }); + if (c.join("") !== "0123456789") + return !1; + var d = {}; + return "abcdefghijklmnopqrst".split("").forEach(function(u) { + d[u] = u; + }), Object.keys(Object.assign({}, d)).join("") === "abcdefghijklmnopqrst"; + } catch { + return !1; + } + } + return jn = o() ? Object.assign : function(a, i) { + for (var s, c = n(a), d, u = 1; u < arguments.length; u++) { + s = Object(arguments[u]); + for (var b in s) + r.call(s, b) && (c[b] = s[b]); + if (e) { + d = e(s); + for (var p = 0; p < d.length; p++) + t.call(s, d[p]) && (c[d[p]] = s[d[p]]); + } + } + return c; + }, jn; +} +var Vn, va; +function No() { + if (va) + return Vn; + va = 1; + var e = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"; + return Vn = e, Vn; +} +var Ln, ba; +function Qi() { + return ba || (ba = 1, Ln = Function.call.bind(Object.prototype.hasOwnProperty)), Ln; +} +var zn, wa; +function Rc() { + if (wa) + return zn; + wa = 1; + var e = function() { + }; + if (process.env.NODE_ENV !== "production") { + var r = No(), t = {}, n = Qi(); + e = function(a) { + var i = "Warning: " + a; + typeof console < "u" && console.error(i); + try { + throw new Error(i); + } catch { + } + }; + } + function o(a, i, s, c, d) { + if (process.env.NODE_ENV !== "production") { + for (var u in a) + if (n(a, u)) { + var b; + try { + if (typeof a[u] != "function") { + var p = Error( + (c || "React class") + ": " + s + " type `" + u + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof a[u] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`." + ); + throw p.name = "Invariant Violation", p; + } + b = a[u](i, u, c, s, null, r); + } catch (f) { + b = f; + } + if (b && !(b instanceof Error) && e( + (c || "React class") + ": type specification of " + s + " `" + u + "` is invalid; the type checker function must return `null` or an `Error` but returned a " + typeof b + ". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)." + ), b instanceof Error && !(b.message in t)) { + t[b.message] = !0; + var h = d ? d() : ""; + e( + "Failed " + s + " type: " + b.message + (h ?? "") + ); + } + } + } + } + return o.resetWarningCache = function() { + process.env.NODE_ENV !== "production" && (t = {}); + }, zn = o, zn; +} +var Fn, ya; +function Pc() { + if (ya) + return Fn; + ya = 1; + var e = Zi(), r = Oc(), t = No(), n = Qi(), o = Rc(), a = function() { + }; + process.env.NODE_ENV !== "production" && (a = function(s) { + var c = "Warning: " + s; + typeof console < "u" && console.error(c); + try { + throw new Error(c); + } catch { + } + }); + function i() { + return null; + } + return Fn = function(s, c) { + var d = typeof Symbol == "function" && Symbol.iterator, u = "@@iterator"; + function b(N) { + var I = N && (d && N[d] || N[u]); + if (typeof I == "function") + return I; + } + var p = "<>", h = { + array: y("array"), + bigint: y("bigint"), + bool: y("boolean"), + func: y("function"), + number: y("number"), + object: y("object"), + string: y("string"), + symbol: y("symbol"), + any: C(), + arrayOf: T, + element: x(), + elementType: w(), + instanceOf: O, + node: $(), + objectOf: V, + oneOf: P, + oneOfType: S, + shape: j, + exact: B + }; + function f(N, I) { + return N === I ? N !== 0 || 1 / N === 1 / I : N !== N && I !== I; + } + function g(N, I) { + this.message = N, this.data = I && typeof I == "object" ? I : {}, this.stack = ""; + } + g.prototype = Error.prototype; + function v(N) { + if (process.env.NODE_ENV !== "production") + var I = {}, W = 0; + function U(q, G, K, Y, Q, ee, de) { + if (Y = Y || p, ee = ee || K, de !== t) { + if (c) { + var A = new Error( + "Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types" + ); + throw A.name = "Invariant Violation", A; + } else if (process.env.NODE_ENV !== "production" && typeof console < "u") { + var ke = Y + ":" + K; + !I[ke] && // Avoid spamming the console because they are often not actionable except for lib authors + W < 3 && (a( + "You are manually calling a React.PropTypes validation function for the `" + ee + "` prop on `" + Y + "`. This is deprecated and will throw in the standalone `prop-types` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details." + ), I[ke] = !0, W++); + } + } + return G[K] == null ? q ? G[K] === null ? new g("The " + Q + " `" + ee + "` is marked as required " + ("in `" + Y + "`, but its value is `null`.")) : new g("The " + Q + " `" + ee + "` is marked as required in " + ("`" + Y + "`, but its value is `undefined`.")) : null : N(G, K, Y, Q, ee); + } + var F = U.bind(null, !1); + return F.isRequired = U.bind(null, !0), F; + } + function y(N) { + function I(W, U, F, q, G, K) { + var Y = W[U], Q = X(Y); + if (Q !== N) { + var ee = te(Y); + return new g( + "Invalid " + q + " `" + G + "` of type " + ("`" + ee + "` supplied to `" + F + "`, expected ") + ("`" + N + "`."), + { expectedType: N } + ); + } + return null; + } + return v(I); + } + function C() { + return v(i); + } + function T(N) { + function I(W, U, F, q, G) { + if (typeof N != "function") + return new g("Property `" + G + "` of component `" + F + "` has invalid PropType notation inside arrayOf."); + var K = W[U]; + if (!Array.isArray(K)) { + var Y = X(K); + return new g("Invalid " + q + " `" + G + "` of type " + ("`" + Y + "` supplied to `" + F + "`, expected an array.")); + } + for (var Q = 0; Q < K.length; Q++) { + var ee = N(K, Q, F, q, G + "[" + Q + "]", t); + if (ee instanceof Error) + return ee; + } + return null; + } + return v(I); + } + function x() { + function N(I, W, U, F, q) { + var G = I[W]; + if (!s(G)) { + var K = X(G); + return new g("Invalid " + F + " `" + q + "` of type " + ("`" + K + "` supplied to `" + U + "`, expected a single ReactElement.")); + } + return null; + } + return v(N); + } + function w() { + function N(I, W, U, F, q) { + var G = I[W]; + if (!e.isValidElementType(G)) { + var K = X(G); + return new g("Invalid " + F + " `" + q + "` of type " + ("`" + K + "` supplied to `" + U + "`, expected a single ReactElement type.")); + } + return null; + } + return v(N); + } + function O(N) { + function I(W, U, F, q, G) { + if (!(W[U] instanceof N)) { + var K = N.name || p, Y = z(W[U]); + return new g("Invalid " + q + " `" + G + "` of type " + ("`" + Y + "` supplied to `" + F + "`, expected ") + ("instance of `" + K + "`.")); + } + return null; + } + return v(I); + } + function P(N) { + if (!Array.isArray(N)) + return process.env.NODE_ENV !== "production" && (arguments.length > 1 ? a( + "Invalid arguments supplied to oneOf, expected an array, got " + arguments.length + " arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z])." + ) : a("Invalid argument supplied to oneOf, expected an array.")), i; + function I(W, U, F, q, G) { + for (var K = W[U], Y = 0; Y < N.length; Y++) + if (f(K, N[Y])) + return null; + var Q = JSON.stringify(N, function(de, A) { + var ke = te(A); + return ke === "symbol" ? String(A) : A; + }); + return new g("Invalid " + q + " `" + G + "` of value `" + String(K) + "` " + ("supplied to `" + F + "`, expected one of " + Q + ".")); + } + return v(I); + } + function V(N) { + function I(W, U, F, q, G) { + if (typeof N != "function") + return new g("Property `" + G + "` of component `" + F + "` has invalid PropType notation inside objectOf."); + var K = W[U], Y = X(K); + if (Y !== "object") + return new g("Invalid " + q + " `" + G + "` of type " + ("`" + Y + "` supplied to `" + F + "`, expected an object.")); + for (var Q in K) + if (n(K, Q)) { + var ee = N(K, Q, F, q, G + "." + Q, t); + if (ee instanceof Error) + return ee; + } + return null; + } + return v(I); + } + function S(N) { + if (!Array.isArray(N)) + return process.env.NODE_ENV !== "production" && a("Invalid argument supplied to oneOfType, expected an instance of array."), i; + for (var I = 0; I < N.length; I++) { + var W = N[I]; + if (typeof W != "function") + return a( + "Invalid argument supplied to oneOfType. Expected an array of check functions, but received " + ae(W) + " at index " + I + "." + ), i; + } + function U(F, q, G, K, Y) { + for (var Q = [], ee = 0; ee < N.length; ee++) { + var de = N[ee], A = de(F, q, G, K, Y, t); + if (A == null) + return null; + A.data && n(A.data, "expectedType") && Q.push(A.data.expectedType); + } + var ke = Q.length > 0 ? ", expected one of type [" + Q.join(", ") + "]" : ""; + return new g("Invalid " + K + " `" + Y + "` supplied to " + ("`" + G + "`" + ke + ".")); + } + return v(U); + } + function $() { + function N(I, W, U, F, q) { + return Z(I[W]) ? null : new g("Invalid " + F + " `" + q + "` supplied to " + ("`" + U + "`, expected a ReactNode.")); + } + return v(N); + } + function k(N, I, W, U, F) { + return new g( + (N || "React class") + ": " + I + " type `" + W + "." + U + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + F + "`." + ); + } + function j(N) { + function I(W, U, F, q, G) { + var K = W[U], Y = X(K); + if (Y !== "object") + return new g("Invalid " + q + " `" + G + "` of type `" + Y + "` " + ("supplied to `" + F + "`, expected `object`.")); + for (var Q in N) { + var ee = N[Q]; + if (typeof ee != "function") + return k(F, q, G, Q, te(ee)); + var de = ee(K, Q, F, q, G + "." + Q, t); + if (de) + return de; + } + return null; + } + return v(I); + } + function B(N) { + function I(W, U, F, q, G) { + var K = W[U], Y = X(K); + if (Y !== "object") + return new g("Invalid " + q + " `" + G + "` of type `" + Y + "` " + ("supplied to `" + F + "`, expected `object`.")); + var Q = r({}, W[U], N); + for (var ee in Q) { + var de = N[ee]; + if (n(N, ee) && typeof de != "function") + return k(F, q, G, ee, te(de)); + if (!de) + return new g( + "Invalid " + q + " `" + G + "` key `" + ee + "` supplied to `" + F + "`.\nBad object: " + JSON.stringify(W[U], null, " ") + ` +Valid keys: ` + JSON.stringify(Object.keys(N), null, " ") + ); + var A = de(K, ee, F, q, G + "." + ee, t); + if (A) + return A; + } + return null; + } + return v(I); + } + function Z(N) { + switch (typeof N) { + case "number": + case "string": + case "undefined": + return !0; + case "boolean": + return !N; + case "object": + if (Array.isArray(N)) + return N.every(Z); + if (N === null || s(N)) + return !0; + var I = b(N); + if (I) { + var W = I.call(N), U; + if (I !== N.entries) { + for (; !(U = W.next()).done; ) + if (!Z(U.value)) + return !1; + } else + for (; !(U = W.next()).done; ) { + var F = U.value; + if (F && !Z(F[1])) + return !1; + } + } else + return !1; + return !0; + default: + return !1; + } + } + function J(N, I) { + return N === "symbol" ? !0 : I ? I["@@toStringTag"] === "Symbol" || typeof Symbol == "function" && I instanceof Symbol : !1; + } + function X(N) { + var I = typeof N; + return Array.isArray(N) ? "array" : N instanceof RegExp ? "object" : J(I, N) ? "symbol" : I; + } + function te(N) { + if (typeof N > "u" || N === null) + return "" + N; + var I = X(N); + if (I === "object") { + if (N instanceof Date) + return "date"; + if (N instanceof RegExp) + return "regexp"; + } + return I; + } + function ae(N) { + var I = te(N); + switch (I) { + case "array": + case "object": + return "an " + I; + case "boolean": + case "date": + case "regexp": + return "a " + I; + default: + return I; + } + } + function z(N) { + return !N.constructor || !N.constructor.name ? p : N.constructor.name; + } + return h.checkPropTypes = o, h.resetWarningCache = o.resetWarningCache, h.PropTypes = h, h; + }, Fn; +} +var Un, xa; +function $c() { + if (xa) + return Un; + xa = 1; + var e = No(); + function r() { + } + function t() { + } + return t.resetWarningCache = r, Un = function() { + function n(i, s, c, d, u, b) { + if (b !== e) { + var p = new Error( + "Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types" + ); + throw p.name = "Invariant Violation", p; + } + } + n.isRequired = n; + function o() { + return n; + } + var a = { + array: n, + bigint: n, + bool: n, + func: n, + number: n, + object: n, + string: n, + symbol: n, + any: n, + arrayOf: o, + element: n, + elementType: n, + instanceOf: o, + node: n, + objectOf: o, + oneOf: o, + oneOfType: o, + shape: o, + exact: o, + checkPropTypes: t, + resetWarningCache: r + }; + return a.PropTypes = a, a; + }, Un; +} +if (process.env.NODE_ENV !== "production") { + var _c = Zi(), Ic = !0; + to.exports = Pc()(_c.isElement, Ic); +} else + to.exports = $c()(); +var Ac = to.exports; +const m = /* @__PURE__ */ Nc(Ac); +function Dc(e) { + const { + prototype: r = {} + } = e; + return !!r.isReactComponent; +} +function es(e, r, t, n, o) { + const a = e[r], i = o || r; + if (a == null || // When server-side rendering React doesn't warn either. + // This is not an accurate check for SSR. + // This is only in place for Emotion compat. + // TODO: Revisit once https://github.com/facebook/react/issues/20047 is resolved. + typeof window > "u") + return null; + let s; + const c = a.type; + return typeof c == "function" && !Dc(c) && (s = "Did you accidentally use a plain function component for an element instead?"), s !== void 0 ? new Error(`Invalid ${n} \`${i}\` supplied to \`${t}\`. Expected an element that can hold a ref. ${s} For more information see https://mui.com/r/caveat-with-refs-guide`) : null; +} +const rs = ko(m.element, es); +rs.isRequired = ko(m.element.isRequired, es); +const ts = rs, Mc = "exact-prop: ​"; +function Bc(e) { + return process.env.NODE_ENV === "production" ? e : _({}, e, { + [Mc]: (r) => { + const t = Object.keys(r).filter((n) => !e.hasOwnProperty(n)); + return t.length > 0 ? new Error(`The following props are not supported: ${t.map((n) => `\`${n}\``).join(", ")}. Please remove them.`) : null; + } + }); +} +function Gr(e) { + let r = "https://mui.com/production-error/?code=" + e; + for (let t = 1; t < arguments.length; t += 1) + r += "&args[]=" + encodeURIComponent(arguments[t]); + return "Minified MUI error #" + e + "; visit " + r + " for the full message."; +} +var no = { exports: {} }, pe = {}; +/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var ka; +function jc() { + if (ka) + return pe; + ka = 1; + var e = Symbol.for("react.element"), r = Symbol.for("react.portal"), t = Symbol.for("react.fragment"), n = Symbol.for("react.strict_mode"), o = Symbol.for("react.profiler"), a = Symbol.for("react.provider"), i = Symbol.for("react.context"), s = Symbol.for("react.server_context"), c = Symbol.for("react.forward_ref"), d = Symbol.for("react.suspense"), u = Symbol.for("react.suspense_list"), b = Symbol.for("react.memo"), p = Symbol.for("react.lazy"), h = Symbol.for("react.offscreen"), f; + f = Symbol.for("react.module.reference"); + function g(v) { + if (typeof v == "object" && v !== null) { + var y = v.$$typeof; + switch (y) { + case e: + switch (v = v.type, v) { + case t: + case o: + case n: + case d: + case u: + return v; + default: + switch (v = v && v.$$typeof, v) { + case s: + case i: + case c: + case p: + case b: + case a: + return v; + default: + return y; + } + } + case r: + return y; + } + } + } + return pe.ContextConsumer = i, pe.ContextProvider = a, pe.Element = e, pe.ForwardRef = c, pe.Fragment = t, pe.Lazy = p, pe.Memo = b, pe.Portal = r, pe.Profiler = o, pe.StrictMode = n, pe.Suspense = d, pe.SuspenseList = u, pe.isAsyncMode = function() { + return !1; + }, pe.isConcurrentMode = function() { + return !1; + }, pe.isContextConsumer = function(v) { + return g(v) === i; + }, pe.isContextProvider = function(v) { + return g(v) === a; + }, pe.isElement = function(v) { + return typeof v == "object" && v !== null && v.$$typeof === e; + }, pe.isForwardRef = function(v) { + return g(v) === c; + }, pe.isFragment = function(v) { + return g(v) === t; + }, pe.isLazy = function(v) { + return g(v) === p; + }, pe.isMemo = function(v) { + return g(v) === b; + }, pe.isPortal = function(v) { + return g(v) === r; + }, pe.isProfiler = function(v) { + return g(v) === o; + }, pe.isStrictMode = function(v) { + return g(v) === n; + }, pe.isSuspense = function(v) { + return g(v) === d; + }, pe.isSuspenseList = function(v) { + return g(v) === u; + }, pe.isValidElementType = function(v) { + return typeof v == "string" || typeof v == "function" || v === t || v === o || v === n || v === d || v === u || v === h || typeof v == "object" && v !== null && (v.$$typeof === p || v.$$typeof === b || v.$$typeof === a || v.$$typeof === i || v.$$typeof === c || v.$$typeof === f || v.getModuleId !== void 0); + }, pe.typeOf = g, pe; +} +var le = {}; +/** + * @license React + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var Na; +function Vc() { + return Na || (Na = 1, process.env.NODE_ENV !== "production" && function() { + var e = Symbol.for("react.element"), r = Symbol.for("react.portal"), t = Symbol.for("react.fragment"), n = Symbol.for("react.strict_mode"), o = Symbol.for("react.profiler"), a = Symbol.for("react.provider"), i = Symbol.for("react.context"), s = Symbol.for("react.server_context"), c = Symbol.for("react.forward_ref"), d = Symbol.for("react.suspense"), u = Symbol.for("react.suspense_list"), b = Symbol.for("react.memo"), p = Symbol.for("react.lazy"), h = Symbol.for("react.offscreen"), f = !1, g = !1, v = !1, y = !1, C = !1, T; + T = Symbol.for("react.module.reference"); + function x(L) { + return !!(typeof L == "string" || typeof L == "function" || L === t || L === o || C || L === n || L === d || L === u || y || L === h || f || g || v || typeof L == "object" && L !== null && (L.$$typeof === p || L.$$typeof === b || L.$$typeof === a || L.$$typeof === i || L.$$typeof === c || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + L.$$typeof === T || L.getModuleId !== void 0)); + } + function w(L) { + if (typeof L == "object" && L !== null) { + var xe = L.$$typeof; + switch (xe) { + case e: + var ze = L.type; + switch (ze) { + case t: + case o: + case n: + case d: + case u: + return ze; + default: + var fr = ze && ze.$$typeof; + switch (fr) { + case s: + case i: + case c: + case p: + case b: + case a: + return fr; + default: + return xe; + } + } + case r: + return xe; + } + } + } + var O = i, P = a, V = e, S = c, $ = t, k = p, j = b, B = r, Z = o, J = n, X = d, te = u, ae = !1, z = !1; + function N(L) { + return ae || (ae = !0, console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.")), !1; + } + function I(L) { + return z || (z = !0, console.warn("The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.")), !1; + } + function W(L) { + return w(L) === i; + } + function U(L) { + return w(L) === a; + } + function F(L) { + return typeof L == "object" && L !== null && L.$$typeof === e; + } + function q(L) { + return w(L) === c; + } + function G(L) { + return w(L) === t; + } + function K(L) { + return w(L) === p; + } + function Y(L) { + return w(L) === b; + } + function Q(L) { + return w(L) === r; + } + function ee(L) { + return w(L) === o; + } + function de(L) { + return w(L) === n; + } + function A(L) { + return w(L) === d; + } + function ke(L) { + return w(L) === u; + } + le.ContextConsumer = O, le.ContextProvider = P, le.Element = V, le.ForwardRef = S, le.Fragment = $, le.Lazy = k, le.Memo = j, le.Portal = B, le.Profiler = Z, le.StrictMode = J, le.Suspense = X, le.SuspenseList = te, le.isAsyncMode = N, le.isConcurrentMode = I, le.isContextConsumer = W, le.isContextProvider = U, le.isElement = F, le.isForwardRef = q, le.isFragment = G, le.isLazy = K, le.isMemo = Y, le.isPortal = Q, le.isProfiler = ee, le.isStrictMode = de, le.isSuspense = A, le.isSuspenseList = ke, le.isValidElementType = x, le.typeOf = w; + }()), le; +} +process.env.NODE_ENV === "production" ? no.exports = jc() : no.exports = Vc(); +var Ea = no.exports; +const Lc = /^\s*function(?:\s|\s*\/\*.*\*\/\s*)+([^(\s/]*)\s*/; +function zc(e) { + const r = `${e}`.match(Lc); + return r && r[1] || ""; +} +function ns(e, r = "") { + return e.displayName || e.name || zc(e) || r; +} +function Ta(e, r, t) { + const n = ns(r); + return e.displayName || (n !== "" ? `${t}(${n})` : t); +} +function Fc(e) { + if (e != null) { + if (typeof e == "string") + return e; + if (typeof e == "function") + return ns(e, "Component"); + if (typeof e == "object") + switch (e.$$typeof) { + case Ea.ForwardRef: + return Ta(e, e.render, "ForwardRef"); + case Ea.Memo: + return Ta(e, e.type, "memo"); + default: + return; + } + } +} +function kt(e, r, t, n, o) { + if (process.env.NODE_ENV === "production") + return null; + const a = e[r], i = o || r; + return a == null ? null : a && a.nodeType !== 1 ? new Error(`Invalid ${n} \`${i}\` supplied to \`${t}\`. Expected an HTMLElement.`) : null; +} +const Uc = m.oneOfType([m.func, m.object]), os = Uc; +function Ye(e) { + if (typeof e != "string") + throw new Error(process.env.NODE_ENV !== "production" ? "MUI: `capitalize(string)` expects a string argument." : Gr(7)); + return e.charAt(0).toUpperCase() + e.slice(1); +} +function Gc(...e) { + return e.reduce((r, t) => t == null ? r : function(...o) { + r.apply(this, o), t.apply(this, o); + }, () => { + }); +} +function Hc(e, r = 166) { + let t; + function n(...o) { + const a = () => { + e.apply(this, o); + }; + clearTimeout(t), t = setTimeout(a, r); + } + return n.clear = () => { + clearTimeout(t); + }, n; +} +function Xc(e, r) { + return process.env.NODE_ENV === "production" ? () => null : (t, n, o, a, i) => { + const s = o || "<>", c = i || n; + return typeof t[n] < "u" ? new Error(`The ${a} \`${c}\` of \`${s}\` is deprecated. ${r}`) : null; + }; +} +function Wc(e, r) { + var t, n; + return /* @__PURE__ */ D.isValidElement(e) && r.indexOf( + // For server components `muiName` is avaialble in element.type._payload.value.muiName + // relevant info - https://github.com/facebook/react/blob/2807d781a08db8e9873687fccc25c0f12b4fb3d4/packages/react/src/ReactLazy.js#L45 + // eslint-disable-next-line no-underscore-dangle + (t = e.type.muiName) != null ? t : (n = e.type) == null || (n = n._payload) == null || (n = n.value) == null ? void 0 : n.muiName + ) !== -1; +} +function Jt(e) { + return e && e.ownerDocument || document; +} +function Yc(e) { + return Jt(e).defaultView || window; +} +function qc(e, r) { + if (process.env.NODE_ENV === "production") + return () => null; + const t = r ? _({}, r.propTypes) : null; + return (o) => (a, i, s, c, d, ...u) => { + const b = d || i, p = t == null ? void 0 : t[b]; + if (p) { + const h = p(a, i, s, c, d, ...u); + if (h) + return h; + } + return typeof a[i] < "u" && !a[o] ? new Error(`The prop \`${b}\` of \`${e}\` can only be used together with the \`${o}\` prop.`) : null; + }; +} +function Zt(e, r) { + typeof e == "function" ? e(r) : e && (e.current = r); +} +const Kc = typeof window < "u" ? D.useLayoutEffect : D.useEffect, Hr = Kc; +let Sa = 0; +function Jc(e) { + const [r, t] = D.useState(e), n = e || r; + return D.useEffect(() => { + r == null && (Sa += 1, t(`mui-${Sa}`)); + }, [r]), n; +} +const Ca = D["useId".toString()]; +function as(e) { + if (Ca !== void 0) { + const r = Ca(); + return e ?? r; + } + return Jc(e); +} +function Zc(e, r, t, n, o) { + if (process.env.NODE_ENV === "production") + return null; + const a = o || r; + return typeof e[r] < "u" ? new Error(`The prop \`${a}\` is not supported. Please remove it.`) : null; +} +function is({ + controlled: e, + default: r, + name: t, + state: n = "value" +}) { + const { + current: o + } = D.useRef(e !== void 0), [a, i] = D.useState(r), s = o ? e : a; + if (process.env.NODE_ENV !== "production") { + D.useEffect(() => { + o !== (e !== void 0) && console.error([`MUI: A component is changing the ${o ? "" : "un"}controlled ${n} state of ${t} to be ${o ? "un" : ""}controlled.`, "Elements should not switch from uncontrolled to controlled (or vice versa).", `Decide between using a controlled or uncontrolled ${t} element for the lifetime of the component.`, "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", "More info: https://fb.me/react-controlled-components"].join(` +`)); + }, [n, t, e]); + const { + current: d + } = D.useRef(r); + D.useEffect(() => { + !o && d !== r && console.error([`MUI: A component is changing the default ${n} state of an uncontrolled ${t} after being initialized. To suppress this warning opt to use a controlled ${t}.`].join(` +`)); + }, [JSON.stringify(r)]); + } + const c = D.useCallback((d) => { + o || i(d); + }, []); + return [s, c]; +} +function oo(e) { + const r = D.useRef(e); + return Hr(() => { + r.current = e; + }), D.useRef((...t) => ( + // @ts-expect-error hide `this` + (0, r.current)(...t) + )).current; +} +function Sr(...e) { + return D.useMemo(() => e.every((r) => r == null) ? null : (r) => { + e.forEach((t) => { + Zt(t, r); + }); + }, e); +} +const Oa = {}; +function Qc(e, r) { + const t = D.useRef(Oa); + return t.current === Oa && (t.current = e(r)), t; +} +const ed = []; +function rd(e) { + D.useEffect(e, ed); +} +class Ot { + constructor() { + this.currentId = null, this.clear = () => { + this.currentId !== null && (clearTimeout(this.currentId), this.currentId = null); + }, this.disposeEffect = () => this.clear; + } + static create() { + return new Ot(); + } + /** + * Executes `fn` after `delay`, clearing any previously scheduled call. + */ + start(r, t) { + this.clear(), this.currentId = setTimeout(() => { + this.currentId = null, t(); + }, r); + } +} +function lt() { + const e = Qc(Ot.create).current; + return rd(e.disposeEffect), e; +} +let mn = !0, ao = !1; +const td = new Ot(), nd = { + text: !0, + search: !0, + url: !0, + tel: !0, + email: !0, + password: !0, + number: !0, + date: !0, + month: !0, + week: !0, + time: !0, + datetime: !0, + "datetime-local": !0 +}; +function od(e) { + const { + type: r, + tagName: t + } = e; + return !!(t === "INPUT" && nd[r] && !e.readOnly || t === "TEXTAREA" && !e.readOnly || e.isContentEditable); +} +function ad(e) { + e.metaKey || e.altKey || e.ctrlKey || (mn = !0); +} +function Gn() { + mn = !1; +} +function id() { + this.visibilityState === "hidden" && ao && (mn = !0); +} +function sd(e) { + e.addEventListener("keydown", ad, !0), e.addEventListener("mousedown", Gn, !0), e.addEventListener("pointerdown", Gn, !0), e.addEventListener("touchstart", Gn, !0), e.addEventListener("visibilitychange", id, !0); +} +function pd(e) { + const { + target: r + } = e; + try { + return r.matches(":focus-visible"); + } catch { + } + return mn || od(r); +} +function ss() { + const e = D.useCallback((o) => { + o != null && sd(o.ownerDocument); + }, []), r = D.useRef(!1); + function t() { + return r.current ? (ao = !0, td.start(100, () => { + ao = !1; + }), r.current = !1, !0) : !1; + } + function n(o) { + return pd(o) ? (r.current = !0, !0) : !1; + } + return { + isFocusVisibleRef: r, + onFocus: n, + onBlur: t, + ref: e + }; +} +function ps(e, r) { + const t = _({}, r); + return Object.keys(e).forEach((n) => { + if (n.toString().match(/^(components|slots)$/)) + t[n] = _({}, e[n], t[n]); + else if (n.toString().match(/^(componentsProps|slotProps)$/)) { + const o = e[n] || {}, a = r[n]; + t[n] = {}, !a || !Object.keys(a) ? t[n] = o : !o || !Object.keys(o) ? t[n] = a : (t[n] = _({}, a), Object.keys(o).forEach((i) => { + t[n][i] = ps(o[i], a[i]); + })); + } else + t[n] === void 0 && (t[n] = e[n]); + }), t; +} +function Eo(e, r, t = void 0) { + const n = {}; + return Object.keys(e).forEach( + // `Object.keys(slots)` can't be wider than `T` because we infer `T` from `slots`. + // @ts-expect-error https://github.com/microsoft/TypeScript/pull/12253#issuecomment-263132208 + (o) => { + n[o] = e[o].reduce((a, i) => { + if (i) { + const s = r(i); + s !== "" && a.push(s), t && t[i] && a.push(t[i]); + } + return a; + }, []).join(" "); + } + ), n; +} +const Ra = (e) => e, ld = () => { + let e = Ra; + return { + configure(r) { + e = r; + }, + generate(r) { + return e(r); + }, + reset() { + e = Ra; + } + }; +}, cd = ld(), ls = cd, cs = { + active: "active", + checked: "checked", + completed: "completed", + disabled: "disabled", + error: "error", + expanded: "expanded", + focused: "focused", + focusVisible: "focusVisible", + open: "open", + readOnly: "readOnly", + required: "required", + selected: "selected" +}; +function hn(e, r, t = "Mui") { + const n = cs[r]; + return n ? `${t}-${n}` : `${ls.generate(e)}-${r}`; +} +function ds(e, r, t = "Mui") { + const n = {}; + return r.forEach((o) => { + n[o] = hn(e, o, t); + }), n; +} +function dd(e, r = Number.MIN_SAFE_INTEGER, t = Number.MAX_SAFE_INTEGER) { + return Math.max(r, Math.min(e, t)); +} +function Ne(e, r) { + if (e == null) + return {}; + var t = {}, n = Object.keys(e), o, a; + for (a = 0; a < n.length; a++) + o = n[a], !(r.indexOf(o) >= 0) && (t[o] = e[o]); + return t; +} +const ud = ["values", "unit", "step"], fd = (e) => { + const r = Object.keys(e).map((t) => ({ + key: t, + val: e[t] + })) || []; + return r.sort((t, n) => t.val - n.val), r.reduce((t, n) => _({}, t, { + [n.key]: n.val + }), {}); +}; +function md(e) { + const { + // The breakpoint **start** at this value. + // For instance with the first breakpoint xs: [xs, sm). + values: r = { + xs: 0, + // phone + sm: 600, + // tablet + md: 900, + // small laptop + lg: 1200, + // desktop + xl: 1536 + // large screen + }, + unit: t = "px", + step: n = 5 + } = e, o = Ne(e, ud), a = fd(r), i = Object.keys(a); + function s(p) { + return `@media (min-width:${typeof r[p] == "number" ? r[p] : p}${t})`; + } + function c(p) { + return `@media (max-width:${(typeof r[p] == "number" ? r[p] : p) - n / 100}${t})`; + } + function d(p, h) { + const f = i.indexOf(h); + return `@media (min-width:${typeof r[p] == "number" ? r[p] : p}${t}) and (max-width:${(f !== -1 && typeof r[i[f]] == "number" ? r[i[f]] : h) - n / 100}${t})`; + } + function u(p) { + return i.indexOf(p) + 1 < i.length ? d(p, i[i.indexOf(p) + 1]) : s(p); + } + function b(p) { + const h = i.indexOf(p); + return h === 0 ? s(i[1]) : h === i.length - 1 ? c(i[h]) : d(p, i[i.indexOf(p) + 1]).replace("@media", "@media not all and"); + } + return _({ + keys: i, + values: a, + up: s, + down: c, + between: d, + only: u, + not: b, + unit: t + }, o); +} +const hd = { + borderRadius: 4 +}, gd = hd, vd = process.env.NODE_ENV !== "production" ? m.oneOfType([m.number, m.string, m.object, m.array]) : {}, dr = vd; +function mt(e, r) { + return r ? Qe(e, r, { + clone: !1 + // No need to clone deep, it's way faster. + }) : e; +} +const To = { + xs: 0, + // phone + sm: 600, + // tablet + md: 900, + // small laptop + lg: 1200, + // desktop + xl: 1536 + // large screen +}, Pa = { + // Sorted ASC by size. That's important. + // It can't be configured as it's used statically for propTypes. + keys: ["xs", "sm", "md", "lg", "xl"], + up: (e) => `@media (min-width:${To[e]}px)` +}; +function er(e, r, t) { + const n = e.theme || {}; + if (Array.isArray(r)) { + const a = n.breakpoints || Pa; + return r.reduce((i, s, c) => (i[a.up(a.keys[c])] = t(r[c]), i), {}); + } + if (typeof r == "object") { + const a = n.breakpoints || Pa; + return Object.keys(r).reduce((i, s) => { + if (Object.keys(a.values || To).indexOf(s) !== -1) { + const c = a.up(s); + i[c] = t(r[s], s); + } else { + const c = s; + i[c] = r[c]; + } + return i; + }, {}); + } + return t(r); +} +function bd(e = {}) { + var r; + return ((r = e.keys) == null ? void 0 : r.reduce((n, o) => { + const a = e.up(o); + return n[a] = {}, n; + }, {})) || {}; +} +function wd(e, r) { + return e.reduce((t, n) => { + const o = t[n]; + return (!o || Object.keys(o).length === 0) && delete t[n], t; + }, r); +} +function gn(e, r, t = !0) { + if (!r || typeof r != "string") + return null; + if (e && e.vars && t) { + const n = `vars.${r}`.split(".").reduce((o, a) => o && o[a] ? o[a] : null, e); + if (n != null) + return n; + } + return r.split(".").reduce((n, o) => n && n[o] != null ? n[o] : null, e); +} +function Qt(e, r, t, n = t) { + let o; + return typeof e == "function" ? o = e(t) : Array.isArray(e) ? o = e[t] || n : o = gn(e, t) || n, r && (o = r(o, n, e)), o; +} +function we(e) { + const { + prop: r, + cssProperty: t = e.prop, + themeKey: n, + transform: o + } = e, a = (i) => { + if (i[r] == null) + return null; + const s = i[r], c = i.theme, d = gn(c, n) || {}; + return er(i, s, (b) => { + let p = Qt(d, o, b); + return b === p && typeof b == "string" && (p = Qt(d, o, `${r}${b === "default" ? "" : Ye(b)}`, b)), t === !1 ? p : { + [t]: p + }; + }); + }; + return a.propTypes = process.env.NODE_ENV !== "production" ? { + [r]: dr + } : {}, a.filterProps = [r], a; +} +function yd(e) { + const r = {}; + return (t) => (r[t] === void 0 && (r[t] = e(t)), r[t]); +} +const xd = { + m: "margin", + p: "padding" +}, kd = { + t: "Top", + r: "Right", + b: "Bottom", + l: "Left", + x: ["Left", "Right"], + y: ["Top", "Bottom"] +}, $a = { + marginX: "mx", + marginY: "my", + paddingX: "px", + paddingY: "py" +}, Nd = yd((e) => { + if (e.length > 2) + if ($a[e]) + e = $a[e]; + else + return [e]; + const [r, t] = e.split(""), n = xd[r], o = kd[t] || ""; + return Array.isArray(o) ? o.map((a) => n + a) : [n + o]; +}), vn = ["m", "mt", "mr", "mb", "ml", "mx", "my", "margin", "marginTop", "marginRight", "marginBottom", "marginLeft", "marginX", "marginY", "marginInline", "marginInlineStart", "marginInlineEnd", "marginBlock", "marginBlockStart", "marginBlockEnd"], bn = ["p", "pt", "pr", "pb", "pl", "px", "py", "padding", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "paddingX", "paddingY", "paddingInline", "paddingInlineStart", "paddingInlineEnd", "paddingBlock", "paddingBlockStart", "paddingBlockEnd"], Ed = [...vn, ...bn]; +function Rt(e, r, t, n) { + var o; + const a = (o = gn(e, r, !1)) != null ? o : t; + return typeof a == "number" ? (i) => typeof i == "string" ? i : (process.env.NODE_ENV !== "production" && typeof i != "number" && console.error(`MUI: Expected ${n} argument to be a number or a string, got ${i}.`), a * i) : Array.isArray(a) ? (i) => typeof i == "string" ? i : (process.env.NODE_ENV !== "production" && (Number.isInteger(i) ? i > a.length - 1 && console.error([`MUI: The value provided (${i}) overflows.`, `The supported values are: ${JSON.stringify(a)}.`, `${i} > ${a.length - 1}, you need to add the missing values.`].join(` +`)) : console.error([`MUI: The \`theme.${r}\` array type cannot be combined with non integer values.You should either use an integer value that can be used as index, or define the \`theme.${r}\` as a number.`].join(` +`))), a[i]) : typeof a == "function" ? a : (process.env.NODE_ENV !== "production" && console.error([`MUI: The \`theme.${r}\` value (${a}) is invalid.`, "It should be a number, an array or a function."].join(` +`)), () => { + }); +} +function us(e) { + return Rt(e, "spacing", 8, "spacing"); +} +function Pt(e, r) { + if (typeof r == "string" || r == null) + return r; + const t = Math.abs(r), n = e(t); + return r >= 0 ? n : typeof n == "number" ? -n : `-${n}`; +} +function Td(e, r) { + return (t) => e.reduce((n, o) => (n[o] = Pt(r, t), n), {}); +} +function Sd(e, r, t, n) { + if (r.indexOf(t) === -1) + return null; + const o = Nd(t), a = Td(o, n), i = e[t]; + return er(e, i, a); +} +function fs(e, r) { + const t = us(e.theme); + return Object.keys(e).map((n) => Sd(e, r, n, t)).reduce(mt, {}); +} +function ge(e) { + return fs(e, vn); +} +ge.propTypes = process.env.NODE_ENV !== "production" ? vn.reduce((e, r) => (e[r] = dr, e), {}) : {}; +ge.filterProps = vn; +function ve(e) { + return fs(e, bn); +} +ve.propTypes = process.env.NODE_ENV !== "production" ? bn.reduce((e, r) => (e[r] = dr, e), {}) : {}; +ve.filterProps = bn; +process.env.NODE_ENV !== "production" && Ed.reduce((e, r) => (e[r] = dr, e), {}); +function Cd(e = 8) { + if (e.mui) + return e; + const r = us({ + spacing: e + }), t = (...n) => (process.env.NODE_ENV !== "production" && (n.length <= 4 || console.error(`MUI: Too many arguments provided, expected between 0 and 4, got ${n.length}`)), (n.length === 0 ? [1] : n).map((a) => { + const i = r(a); + return typeof i == "number" ? `${i}px` : i; + }).join(" ")); + return t.mui = !0, t; +} +function wn(...e) { + const r = e.reduce((n, o) => (o.filterProps.forEach((a) => { + n[a] = o; + }), n), {}), t = (n) => Object.keys(n).reduce((o, a) => r[a] ? mt(o, r[a](n)) : o, {}); + return t.propTypes = process.env.NODE_ENV !== "production" ? e.reduce((n, o) => Object.assign(n, o.propTypes), {}) : {}, t.filterProps = e.reduce((n, o) => n.concat(o.filterProps), []), t; +} +function Me(e) { + return typeof e != "number" ? e : `${e}px solid`; +} +function Le(e, r) { + return we({ + prop: e, + themeKey: "borders", + transform: r + }); +} +const Od = Le("border", Me), Rd = Le("borderTop", Me), Pd = Le("borderRight", Me), $d = Le("borderBottom", Me), _d = Le("borderLeft", Me), Id = Le("borderColor"), Ad = Le("borderTopColor"), Dd = Le("borderRightColor"), Md = Le("borderBottomColor"), Bd = Le("borderLeftColor"), jd = Le("outline", Me), Vd = Le("outlineColor"), yn = (e) => { + if (e.borderRadius !== void 0 && e.borderRadius !== null) { + const r = Rt(e.theme, "shape.borderRadius", 4, "borderRadius"), t = (n) => ({ + borderRadius: Pt(r, n) + }); + return er(e, e.borderRadius, t); + } + return null; +}; +yn.propTypes = process.env.NODE_ENV !== "production" ? { + borderRadius: dr +} : {}; +yn.filterProps = ["borderRadius"]; +wn(Od, Rd, Pd, $d, _d, Id, Ad, Dd, Md, Bd, yn, jd, Vd); +const xn = (e) => { + if (e.gap !== void 0 && e.gap !== null) { + const r = Rt(e.theme, "spacing", 8, "gap"), t = (n) => ({ + gap: Pt(r, n) + }); + return er(e, e.gap, t); + } + return null; +}; +xn.propTypes = process.env.NODE_ENV !== "production" ? { + gap: dr +} : {}; +xn.filterProps = ["gap"]; +const kn = (e) => { + if (e.columnGap !== void 0 && e.columnGap !== null) { + const r = Rt(e.theme, "spacing", 8, "columnGap"), t = (n) => ({ + columnGap: Pt(r, n) + }); + return er(e, e.columnGap, t); + } + return null; +}; +kn.propTypes = process.env.NODE_ENV !== "production" ? { + columnGap: dr +} : {}; +kn.filterProps = ["columnGap"]; +const Nn = (e) => { + if (e.rowGap !== void 0 && e.rowGap !== null) { + const r = Rt(e.theme, "spacing", 8, "rowGap"), t = (n) => ({ + rowGap: Pt(r, n) + }); + return er(e, e.rowGap, t); + } + return null; +}; +Nn.propTypes = process.env.NODE_ENV !== "production" ? { + rowGap: dr +} : {}; +Nn.filterProps = ["rowGap"]; +const Ld = we({ + prop: "gridColumn" +}), zd = we({ + prop: "gridRow" +}), Fd = we({ + prop: "gridAutoFlow" +}), Ud = we({ + prop: "gridAutoColumns" +}), Gd = we({ + prop: "gridAutoRows" +}), Hd = we({ + prop: "gridTemplateColumns" +}), Xd = we({ + prop: "gridTemplateRows" +}), Wd = we({ + prop: "gridTemplateAreas" +}), Yd = we({ + prop: "gridArea" +}); +wn(xn, kn, Nn, Ld, zd, Fd, Ud, Gd, Hd, Xd, Wd, Yd); +function Lr(e, r) { + return r === "grey" ? r : e; +} +const qd = we({ + prop: "color", + themeKey: "palette", + transform: Lr +}), Kd = we({ + prop: "bgcolor", + cssProperty: "backgroundColor", + themeKey: "palette", + transform: Lr +}), Jd = we({ + prop: "backgroundColor", + themeKey: "palette", + transform: Lr +}); +wn(qd, Kd, Jd); +function Ie(e) { + return e <= 1 && e !== 0 ? `${e * 100}%` : e; +} +const Zd = we({ + prop: "width", + transform: Ie +}), So = (e) => { + if (e.maxWidth !== void 0 && e.maxWidth !== null) { + const r = (t) => { + var n, o; + const a = ((n = e.theme) == null || (n = n.breakpoints) == null || (n = n.values) == null ? void 0 : n[t]) || To[t]; + return a ? ((o = e.theme) == null || (o = o.breakpoints) == null ? void 0 : o.unit) !== "px" ? { + maxWidth: `${a}${e.theme.breakpoints.unit}` + } : { + maxWidth: a + } : { + maxWidth: Ie(t) + }; + }; + return er(e, e.maxWidth, r); + } + return null; +}; +So.filterProps = ["maxWidth"]; +const Qd = we({ + prop: "minWidth", + transform: Ie +}), eu = we({ + prop: "height", + transform: Ie +}), ru = we({ + prop: "maxHeight", + transform: Ie +}), tu = we({ + prop: "minHeight", + transform: Ie +}); +we({ + prop: "size", + cssProperty: "width", + transform: Ie +}); +we({ + prop: "size", + cssProperty: "height", + transform: Ie +}); +const nu = we({ + prop: "boxSizing" +}); +wn(Zd, So, Qd, eu, ru, tu, nu); +const ou = { + // borders + border: { + themeKey: "borders", + transform: Me + }, + borderTop: { + themeKey: "borders", + transform: Me + }, + borderRight: { + themeKey: "borders", + transform: Me + }, + borderBottom: { + themeKey: "borders", + transform: Me + }, + borderLeft: { + themeKey: "borders", + transform: Me + }, + borderColor: { + themeKey: "palette" + }, + borderTopColor: { + themeKey: "palette" + }, + borderRightColor: { + themeKey: "palette" + }, + borderBottomColor: { + themeKey: "palette" + }, + borderLeftColor: { + themeKey: "palette" + }, + outline: { + themeKey: "borders", + transform: Me + }, + outlineColor: { + themeKey: "palette" + }, + borderRadius: { + themeKey: "shape.borderRadius", + style: yn + }, + // palette + color: { + themeKey: "palette", + transform: Lr + }, + bgcolor: { + themeKey: "palette", + cssProperty: "backgroundColor", + transform: Lr + }, + backgroundColor: { + themeKey: "palette", + transform: Lr + }, + // spacing + p: { + style: ve + }, + pt: { + style: ve + }, + pr: { + style: ve + }, + pb: { + style: ve + }, + pl: { + style: ve + }, + px: { + style: ve + }, + py: { + style: ve + }, + padding: { + style: ve + }, + paddingTop: { + style: ve + }, + paddingRight: { + style: ve + }, + paddingBottom: { + style: ve + }, + paddingLeft: { + style: ve + }, + paddingX: { + style: ve + }, + paddingY: { + style: ve + }, + paddingInline: { + style: ve + }, + paddingInlineStart: { + style: ve + }, + paddingInlineEnd: { + style: ve + }, + paddingBlock: { + style: ve + }, + paddingBlockStart: { + style: ve + }, + paddingBlockEnd: { + style: ve + }, + m: { + style: ge + }, + mt: { + style: ge + }, + mr: { + style: ge + }, + mb: { + style: ge + }, + ml: { + style: ge + }, + mx: { + style: ge + }, + my: { + style: ge + }, + margin: { + style: ge + }, + marginTop: { + style: ge + }, + marginRight: { + style: ge + }, + marginBottom: { + style: ge + }, + marginLeft: { + style: ge + }, + marginX: { + style: ge + }, + marginY: { + style: ge + }, + marginInline: { + style: ge + }, + marginInlineStart: { + style: ge + }, + marginInlineEnd: { + style: ge + }, + marginBlock: { + style: ge + }, + marginBlockStart: { + style: ge + }, + marginBlockEnd: { + style: ge + }, + // display + displayPrint: { + cssProperty: !1, + transform: (e) => ({ + "@media print": { + display: e + } + }) + }, + display: {}, + overflow: {}, + textOverflow: {}, + visibility: {}, + whiteSpace: {}, + // flexbox + flexBasis: {}, + flexDirection: {}, + flexWrap: {}, + justifyContent: {}, + alignItems: {}, + alignContent: {}, + order: {}, + flex: {}, + flexGrow: {}, + flexShrink: {}, + alignSelf: {}, + justifyItems: {}, + justifySelf: {}, + // grid + gap: { + style: xn + }, + rowGap: { + style: Nn + }, + columnGap: { + style: kn + }, + gridColumn: {}, + gridRow: {}, + gridAutoFlow: {}, + gridAutoColumns: {}, + gridAutoRows: {}, + gridTemplateColumns: {}, + gridTemplateRows: {}, + gridTemplateAreas: {}, + gridArea: {}, + // positions + position: {}, + zIndex: { + themeKey: "zIndex" + }, + top: {}, + right: {}, + bottom: {}, + left: {}, + // shadows + boxShadow: { + themeKey: "shadows" + }, + // sizing + width: { + transform: Ie + }, + maxWidth: { + style: So + }, + minWidth: { + transform: Ie + }, + height: { + transform: Ie + }, + maxHeight: { + transform: Ie + }, + minHeight: { + transform: Ie + }, + boxSizing: {}, + // typography + fontFamily: { + themeKey: "typography" + }, + fontSize: { + themeKey: "typography" + }, + fontStyle: { + themeKey: "typography" + }, + fontWeight: { + themeKey: "typography" + }, + letterSpacing: {}, + textTransform: {}, + lineHeight: {}, + textAlign: {}, + typography: { + cssProperty: !1, + themeKey: "typography" + } +}, Co = ou; +function au(...e) { + const r = e.reduce((n, o) => n.concat(Object.keys(o)), []), t = new Set(r); + return e.every((n) => t.size === Object.keys(n).length); +} +function iu(e, r) { + return typeof e == "function" ? e(r) : e; +} +function su() { + function e(t, n, o, a) { + const i = { + [t]: n, + theme: o + }, s = a[t]; + if (!s) + return { + [t]: n + }; + const { + cssProperty: c = t, + themeKey: d, + transform: u, + style: b + } = s; + if (n == null) + return null; + if (d === "typography" && n === "inherit") + return { + [t]: n + }; + const p = gn(o, d) || {}; + return b ? b(i) : er(i, n, (f) => { + let g = Qt(p, u, f); + return f === g && typeof f == "string" && (g = Qt(p, u, `${t}${f === "default" ? "" : Ye(f)}`, f)), c === !1 ? g : { + [c]: g + }; + }); + } + function r(t) { + var n; + const { + sx: o, + theme: a = {} + } = t || {}; + if (!o) + return null; + const i = (n = a.unstable_sxConfig) != null ? n : Co; + function s(c) { + let d = c; + if (typeof c == "function") + d = c(a); + else if (typeof c != "object") + return c; + if (!d) + return null; + const u = bd(a.breakpoints), b = Object.keys(u); + let p = u; + return Object.keys(d).forEach((h) => { + const f = iu(d[h], a); + if (f != null) + if (typeof f == "object") + if (i[h]) + p = mt(p, e(h, f, a, i)); + else { + const g = er({ + theme: a + }, f, (v) => ({ + [h]: v + })); + au(g, f) ? p[h] = r({ + sx: f, + theme: a + }) : p = mt(p, g); + } + else + p = mt(p, e(h, f, a, i)); + }), wd(b, p); + } + return Array.isArray(o) ? o.map(s) : s(o); + } + return r; +} +const ms = su(); +ms.filterProps = ["sx"]; +const Oo = ms; +function pu(e, r) { + const t = this; + return t.vars && typeof t.getColorSchemeSelector == "function" ? { + [t.getColorSchemeSelector(e).replace(/(\[[^\]]+\])/, "*:where($1)")]: r + } : t.palette.mode === e ? r : {}; +} +const lu = ["breakpoints", "palette", "spacing", "shape"]; +function Ro(e = {}, ...r) { + const { + breakpoints: t = {}, + palette: n = {}, + spacing: o, + shape: a = {} + } = e, i = Ne(e, lu), s = md(t), c = Cd(o); + let d = Qe({ + breakpoints: s, + direction: "ltr", + components: {}, + // Inject component definitions. + palette: _({ + mode: "light" + }, n), + spacing: c, + shape: _({}, gd, a) + }, i); + return d.applyStyles = pu, d = r.reduce((u, b) => Qe(u, b), d), d.unstable_sxConfig = _({}, Co, i == null ? void 0 : i.unstable_sxConfig), d.unstable_sx = function(b) { + return Oo({ + sx: b, + theme: this + }); + }, d; +} +function cu(e) { + return Object.keys(e).length === 0; +} +function hs(e = null) { + const r = D.useContext(nl); + return !r || cu(r) ? e : r; +} +const du = Ro(); +function gs(e = du) { + return hs(e); +} +const uu = ["ownerState"], fu = ["variants"], mu = ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"]; +function hu(e) { + return Object.keys(e).length === 0; +} +function gu(e) { + return typeof e == "string" && // 96 is one less than the char code + // for "a" so this is checking that + // it's a lowercase character + e.charCodeAt(0) > 96; +} +function Wt(e) { + return e !== "ownerState" && e !== "theme" && e !== "sx" && e !== "as"; +} +const vu = Ro(), _a = (e) => e && e.charAt(0).toLowerCase() + e.slice(1); +function zt({ + defaultTheme: e, + theme: r, + themeId: t +}) { + return hu(r) ? e : r[t] || r; +} +function bu(e) { + return e ? (r, t) => t[e] : null; +} +function Yt(e, r) { + let { + ownerState: t + } = r, n = Ne(r, uu); + const o = typeof e == "function" ? e(_({ + ownerState: t + }, n)) : e; + if (Array.isArray(o)) + return o.flatMap((a) => Yt(a, _({ + ownerState: t + }, n))); + if (o && typeof o == "object" && Array.isArray(o.variants)) { + const { + variants: a = [] + } = o; + let s = Ne(o, fu); + return a.forEach((c) => { + let d = !0; + typeof c.props == "function" ? d = c.props(_({ + ownerState: t + }, n, t)) : Object.keys(c.props).forEach((u) => { + (t == null ? void 0 : t[u]) !== c.props[u] && n[u] !== c.props[u] && (d = !1); + }), d && (Array.isArray(s) || (s = [s]), s.push(typeof c.style == "function" ? c.style(_({ + ownerState: t + }, n, t)) : c.style)); + }), s; + } + return o; +} +function wu(e = {}) { + const { + themeId: r, + defaultTheme: t = vu, + rootShouldForwardProp: n = Wt, + slotShouldForwardProp: o = Wt + } = e, a = (i) => Oo(_({}, i, { + theme: zt(_({}, i, { + defaultTheme: t, + themeId: r + })) + })); + return a.__mui_systemSx = !0, (i, s = {}) => { + ol(i, (w) => w.filter((O) => !(O != null && O.__mui_systemSx))); + const { + name: c, + slot: d, + skipVariantsResolver: u, + skipSx: b, + // TODO v6: remove `lowercaseFirstLetter()` in the next major release + // For more details: https://github.com/mui/material-ui/pull/37908 + overridesResolver: p = bu(_a(d)) + } = s, h = Ne(s, mu), f = u !== void 0 ? u : ( + // TODO v6: remove `Root` in the next major release + // For more details: https://github.com/mui/material-ui/pull/37908 + d && d !== "Root" && d !== "root" || !1 + ), g = b || !1; + let v; + process.env.NODE_ENV !== "production" && c && (v = `${c}-${_a(d || "Root")}`); + let y = Wt; + d === "Root" || d === "root" ? y = n : d ? y = o : gu(i) && (y = void 0); + const C = tl(i, _({ + shouldForwardProp: y, + label: v + }, h)), T = (w) => typeof w == "function" && w.__emotion_real !== w || yr(w) ? (O) => Yt(w, _({}, O, { + theme: zt({ + theme: O.theme, + defaultTheme: t, + themeId: r + }) + })) : w, x = (w, ...O) => { + let P = T(w); + const V = O ? O.map(T) : []; + c && p && V.push((k) => { + const j = zt(_({}, k, { + defaultTheme: t, + themeId: r + })); + if (!j.components || !j.components[c] || !j.components[c].styleOverrides) + return null; + const B = j.components[c].styleOverrides, Z = {}; + return Object.entries(B).forEach(([J, X]) => { + Z[J] = Yt(X, _({}, k, { + theme: j + })); + }), p(k, Z); + }), c && !f && V.push((k) => { + var j; + const B = zt(_({}, k, { + defaultTheme: t, + themeId: r + })), Z = B == null || (j = B.components) == null || (j = j[c]) == null ? void 0 : j.variants; + return Yt({ + variants: Z + }, _({}, k, { + theme: B + })); + }), g || V.push(a); + const S = V.length - O.length; + if (Array.isArray(w) && S > 0) { + const k = new Array(S).fill(""); + P = [...w, ...k], P.raw = [...w.raw, ...k]; + } + const $ = C(P, ...V); + if (process.env.NODE_ENV !== "production") { + let k; + c && (k = `${c}${Ye(d || "")}`), k === void 0 && (k = `Styled(${Fc(i)})`), $.displayName = k; + } + return i.muiName && ($.muiName = i.muiName), $; + }; + return C.withConfig && (x.withConfig = C.withConfig), x; + }; +} +function yu(e) { + const { + theme: r, + name: t, + props: n + } = e; + return !r || !r.components || !r.components[t] || !r.components[t].defaultProps ? n : ps(r.components[t].defaultProps, n); +} +function xu({ + props: e, + name: r, + defaultTheme: t, + themeId: n +}) { + let o = gs(t); + return n && (o = o[n] || o), yu({ + theme: o, + name: r, + props: e + }); +} +function Po(e, r = 0, t = 1) { + return process.env.NODE_ENV !== "production" && (e < r || e > t) && console.error(`MUI: The value provided ${e} is out of range [${r}, ${t}].`), dd(e, r, t); +} +function ku(e) { + e = e.slice(1); + const r = new RegExp(`.{1,${e.length >= 6 ? 2 : 1}}`, "g"); + let t = e.match(r); + return t && t[0].length === 1 && (t = t.map((n) => n + n)), t ? `rgb${t.length === 4 ? "a" : ""}(${t.map((n, o) => o < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1e3) / 1e3).join(", ")})` : ""; +} +function Cr(e) { + if (e.type) + return e; + if (e.charAt(0) === "#") + return Cr(ku(e)); + const r = e.indexOf("("), t = e.substring(0, r); + if (["rgb", "rgba", "hsl", "hsla", "color"].indexOf(t) === -1) + throw new Error(process.env.NODE_ENV !== "production" ? `MUI: Unsupported \`${e}\` color. +The following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().` : Gr(9, e)); + let n = e.substring(r + 1, e.length - 1), o; + if (t === "color") { + if (n = n.split(" "), o = n.shift(), n.length === 4 && n[3].charAt(0) === "/" && (n[3] = n[3].slice(1)), ["srgb", "display-p3", "a98-rgb", "prophoto-rgb", "rec-2020"].indexOf(o) === -1) + throw new Error(process.env.NODE_ENV !== "production" ? `MUI: unsupported \`${o}\` color space. +The following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.` : Gr(10, o)); + } else + n = n.split(","); + return n = n.map((a) => parseFloat(a)), { + type: t, + values: n, + colorSpace: o + }; +} +function En(e) { + const { + type: r, + colorSpace: t + } = e; + let { + values: n + } = e; + return r.indexOf("rgb") !== -1 ? n = n.map((o, a) => a < 3 ? parseInt(o, 10) : o) : r.indexOf("hsl") !== -1 && (n[1] = `${n[1]}%`, n[2] = `${n[2]}%`), r.indexOf("color") !== -1 ? n = `${t} ${n.join(" ")}` : n = `${n.join(", ")}`, `${r}(${n})`; +} +function Nu(e) { + e = Cr(e); + const { + values: r + } = e, t = r[0], n = r[1] / 100, o = r[2] / 100, a = n * Math.min(o, 1 - o), i = (d, u = (d + t / 30) % 12) => o - a * Math.max(Math.min(u - 3, 9 - u, 1), -1); + let s = "rgb"; + const c = [Math.round(i(0) * 255), Math.round(i(8) * 255), Math.round(i(4) * 255)]; + return e.type === "hsla" && (s += "a", c.push(r[3])), En({ + type: s, + values: c + }); +} +function Ia(e) { + e = Cr(e); + let r = e.type === "hsl" || e.type === "hsla" ? Cr(Nu(e)).values : e.values; + return r = r.map((t) => (e.type !== "color" && (t /= 255), t <= 0.03928 ? t / 12.92 : ((t + 0.055) / 1.055) ** 2.4)), Number((0.2126 * r[0] + 0.7152 * r[1] + 0.0722 * r[2]).toFixed(3)); +} +function Aa(e, r) { + const t = Ia(e), n = Ia(r); + return (Math.max(t, n) + 0.05) / (Math.min(t, n) + 0.05); +} +function vs(e, r) { + return e = Cr(e), r = Po(r), (e.type === "rgb" || e.type === "hsl") && (e.type += "a"), e.type === "color" ? e.values[3] = `/${r}` : e.values[3] = r, En(e); +} +function Eu(e, r) { + if (e = Cr(e), r = Po(r), e.type.indexOf("hsl") !== -1) + e.values[2] *= 1 - r; + else if (e.type.indexOf("rgb") !== -1 || e.type.indexOf("color") !== -1) + for (let t = 0; t < 3; t += 1) + e.values[t] *= 1 - r; + return En(e); +} +function Tu(e, r) { + if (e = Cr(e), r = Po(r), e.type.indexOf("hsl") !== -1) + e.values[2] += (100 - e.values[2]) * r; + else if (e.type.indexOf("rgb") !== -1) + for (let t = 0; t < 3; t += 1) + e.values[t] += (255 - e.values[t]) * r; + else if (e.type.indexOf("color") !== -1) + for (let t = 0; t < 3; t += 1) + e.values[t] += (1 - e.values[t]) * r; + return En(e); +} +function Su(e, r) { + return _({ + toolbar: { + minHeight: 56, + [e.up("xs")]: { + "@media (orientation: landscape)": { + minHeight: 48 + } + }, + [e.up("sm")]: { + minHeight: 64 + } + } + }, r); +} +const Cu = { + black: "#000", + white: "#fff" +}, Nt = Cu, Ou = { + 50: "#fafafa", + 100: "#f5f5f5", + 200: "#eeeeee", + 300: "#e0e0e0", + 400: "#bdbdbd", + 500: "#9e9e9e", + 600: "#757575", + 700: "#616161", + 800: "#424242", + 900: "#212121", + A100: "#f5f5f5", + A200: "#eeeeee", + A400: "#bdbdbd", + A700: "#616161" +}, Ru = Ou, Pu = { + 50: "#f3e5f5", + 100: "#e1bee7", + 200: "#ce93d8", + 300: "#ba68c8", + 400: "#ab47bc", + 500: "#9c27b0", + 600: "#8e24aa", + 700: "#7b1fa2", + 800: "#6a1b9a", + 900: "#4a148c", + A100: "#ea80fc", + A200: "#e040fb", + A400: "#d500f9", + A700: "#aa00ff" +}, Ir = Pu, $u = { + 50: "#ffebee", + 100: "#ffcdd2", + 200: "#ef9a9a", + 300: "#e57373", + 400: "#ef5350", + 500: "#f44336", + 600: "#e53935", + 700: "#d32f2f", + 800: "#c62828", + 900: "#b71c1c", + A100: "#ff8a80", + A200: "#ff5252", + A400: "#ff1744", + A700: "#d50000" +}, Ar = $u, _u = { + 50: "#fff3e0", + 100: "#ffe0b2", + 200: "#ffcc80", + 300: "#ffb74d", + 400: "#ffa726", + 500: "#ff9800", + 600: "#fb8c00", + 700: "#f57c00", + 800: "#ef6c00", + 900: "#e65100", + A100: "#ffd180", + A200: "#ffab40", + A400: "#ff9100", + A700: "#ff6d00" +}, ot = _u, Iu = { + 50: "#e3f2fd", + 100: "#bbdefb", + 200: "#90caf9", + 300: "#64b5f6", + 400: "#42a5f5", + 500: "#2196f3", + 600: "#1e88e5", + 700: "#1976d2", + 800: "#1565c0", + 900: "#0d47a1", + A100: "#82b1ff", + A200: "#448aff", + A400: "#2979ff", + A700: "#2962ff" +}, Dr = Iu, Au = { + 50: "#e1f5fe", + 100: "#b3e5fc", + 200: "#81d4fa", + 300: "#4fc3f7", + 400: "#29b6f6", + 500: "#03a9f4", + 600: "#039be5", + 700: "#0288d1", + 800: "#0277bd", + 900: "#01579b", + A100: "#80d8ff", + A200: "#40c4ff", + A400: "#00b0ff", + A700: "#0091ea" +}, Mr = Au, Du = { + 50: "#e8f5e9", + 100: "#c8e6c9", + 200: "#a5d6a7", + 300: "#81c784", + 400: "#66bb6a", + 500: "#4caf50", + 600: "#43a047", + 700: "#388e3c", + 800: "#2e7d32", + 900: "#1b5e20", + A100: "#b9f6ca", + A200: "#69f0ae", + A400: "#00e676", + A700: "#00c853" +}, Br = Du, Mu = ["mode", "contrastThreshold", "tonalOffset"], Da = { + // The colors used to style the text. + text: { + // The most important text. + primary: "rgba(0, 0, 0, 0.87)", + // Secondary text. + secondary: "rgba(0, 0, 0, 0.6)", + // Disabled text have even lower visual prominence. + disabled: "rgba(0, 0, 0, 0.38)" + }, + // The color used to divide different elements. + divider: "rgba(0, 0, 0, 0.12)", + // The background colors used to style the surfaces. + // Consistency between these values is important. + background: { + paper: Nt.white, + default: Nt.white + }, + // The colors used to style the action elements. + action: { + // The color of an active action like an icon button. + active: "rgba(0, 0, 0, 0.54)", + // The color of an hovered action. + hover: "rgba(0, 0, 0, 0.04)", + hoverOpacity: 0.04, + // The color of a selected action. + selected: "rgba(0, 0, 0, 0.08)", + selectedOpacity: 0.08, + // The color of a disabled action. + disabled: "rgba(0, 0, 0, 0.26)", + // The background color of a disabled action. + disabledBackground: "rgba(0, 0, 0, 0.12)", + disabledOpacity: 0.38, + focus: "rgba(0, 0, 0, 0.12)", + focusOpacity: 0.12, + activatedOpacity: 0.12 + } +}, Hn = { + text: { + primary: Nt.white, + secondary: "rgba(255, 255, 255, 0.7)", + disabled: "rgba(255, 255, 255, 0.5)", + icon: "rgba(255, 255, 255, 0.5)" + }, + divider: "rgba(255, 255, 255, 0.12)", + background: { + paper: "#121212", + default: "#121212" + }, + action: { + active: Nt.white, + hover: "rgba(255, 255, 255, 0.08)", + hoverOpacity: 0.08, + selected: "rgba(255, 255, 255, 0.16)", + selectedOpacity: 0.16, + disabled: "rgba(255, 255, 255, 0.3)", + disabledBackground: "rgba(255, 255, 255, 0.12)", + disabledOpacity: 0.38, + focus: "rgba(255, 255, 255, 0.12)", + focusOpacity: 0.12, + activatedOpacity: 0.24 + } +}; +function Ma(e, r, t, n) { + const o = n.light || n, a = n.dark || n * 1.5; + e[r] || (e.hasOwnProperty(t) ? e[r] = e[t] : r === "light" ? e.light = Tu(e.main, o) : r === "dark" && (e.dark = Eu(e.main, a))); +} +function Bu(e = "light") { + return e === "dark" ? { + main: Dr[200], + light: Dr[50], + dark: Dr[400] + } : { + main: Dr[700], + light: Dr[400], + dark: Dr[800] + }; +} +function ju(e = "light") { + return e === "dark" ? { + main: Ir[200], + light: Ir[50], + dark: Ir[400] + } : { + main: Ir[500], + light: Ir[300], + dark: Ir[700] + }; +} +function Vu(e = "light") { + return e === "dark" ? { + main: Ar[500], + light: Ar[300], + dark: Ar[700] + } : { + main: Ar[700], + light: Ar[400], + dark: Ar[800] + }; +} +function Lu(e = "light") { + return e === "dark" ? { + main: Mr[400], + light: Mr[300], + dark: Mr[700] + } : { + main: Mr[700], + light: Mr[500], + dark: Mr[900] + }; +} +function zu(e = "light") { + return e === "dark" ? { + main: Br[400], + light: Br[300], + dark: Br[700] + } : { + main: Br[800], + light: Br[500], + dark: Br[900] + }; +} +function Fu(e = "light") { + return e === "dark" ? { + main: ot[400], + light: ot[300], + dark: ot[700] + } : { + main: "#ed6c02", + // closest to orange[800] that pass 3:1. + light: ot[500], + dark: ot[900] + }; +} +function Uu(e) { + const { + mode: r = "light", + contrastThreshold: t = 3, + tonalOffset: n = 0.2 + } = e, o = Ne(e, Mu), a = e.primary || Bu(r), i = e.secondary || ju(r), s = e.error || Vu(r), c = e.info || Lu(r), d = e.success || zu(r), u = e.warning || Fu(r); + function b(g) { + const v = Aa(g, Hn.text.primary) >= t ? Hn.text.primary : Da.text.primary; + if (process.env.NODE_ENV !== "production") { + const y = Aa(g, v); + y < 3 && console.error([`MUI: The contrast ratio of ${y}:1 for ${v} on ${g}`, "falls below the WCAG recommended absolute minimum contrast ratio of 3:1.", "https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast"].join(` +`)); + } + return v; + } + const p = ({ + color: g, + name: v, + mainShade: y = 500, + lightShade: C = 300, + darkShade: T = 700 + }) => { + if (g = _({}, g), !g.main && g[y] && (g.main = g[y]), !g.hasOwnProperty("main")) + throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The color${v ? ` (${v})` : ""} provided to augmentColor(color) is invalid. +The color object needs to have a \`main\` property or a \`${y}\` property.` : Gr(11, v ? ` (${v})` : "", y)); + if (typeof g.main != "string") + throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The color${v ? ` (${v})` : ""} provided to augmentColor(color) is invalid. +\`color.main\` should be a string, but \`${JSON.stringify(g.main)}\` was provided instead. + +Did you intend to use one of the following approaches? + +import { green } from "@mui/material/colors"; + +const theme1 = createTheme({ palette: { + primary: green, +} }); + +const theme2 = createTheme({ palette: { + primary: { main: green[500] }, +} });` : Gr(12, v ? ` (${v})` : "", JSON.stringify(g.main))); + return Ma(g, "light", C, n), Ma(g, "dark", T, n), g.contrastText || (g.contrastText = b(g.main)), g; + }, h = { + dark: Hn, + light: Da + }; + return process.env.NODE_ENV !== "production" && (h[r] || console.error(`MUI: The palette mode \`${r}\` is not supported.`)), Qe(_({ + // A collection of common colors. + common: _({}, Nt), + // prevent mutable object. + // The palette mode, can be light or dark. + mode: r, + // The colors used to represent primary interface elements for a user. + primary: p({ + color: a, + name: "primary" + }), + // The colors used to represent secondary interface elements for a user. + secondary: p({ + color: i, + name: "secondary", + mainShade: "A400", + lightShade: "A200", + darkShade: "A700" + }), + // The colors used to represent interface elements that the user should be made aware of. + error: p({ + color: s, + name: "error" + }), + // The colors used to represent potentially dangerous actions or important messages. + warning: p({ + color: u, + name: "warning" + }), + // The colors used to present information to the user that is neutral and not necessarily important. + info: p({ + color: c, + name: "info" + }), + // The colors used to indicate the successful completion of an action that user triggered. + success: p({ + color: d, + name: "success" + }), + // The grey colors. + grey: Ru, + // Used by `getContrastText()` to maximize the contrast between + // the background and the text. + contrastThreshold: t, + // Takes a background color and returns the text color that maximizes the contrast. + getContrastText: b, + // Generate a rich color object. + augmentColor: p, + // Used by the functions below to shift a color's luminance by approximately + // two indexes within its tonal palette. + // E.g., shift from Red 500 to Red 300 or Red 700. + tonalOffset: n + }, h[r]), o); +} +const Gu = ["fontFamily", "fontSize", "fontWeightLight", "fontWeightRegular", "fontWeightMedium", "fontWeightBold", "htmlFontSize", "allVariants", "pxToRem"]; +function Hu(e) { + return Math.round(e * 1e5) / 1e5; +} +const Ba = { + textTransform: "uppercase" +}, ja = '"Roboto", "Helvetica", "Arial", sans-serif'; +function Xu(e, r) { + const t = typeof r == "function" ? r(e) : r, { + fontFamily: n = ja, + // The default font size of the Material Specification. + fontSize: o = 14, + // px + fontWeightLight: a = 300, + fontWeightRegular: i = 400, + fontWeightMedium: s = 500, + fontWeightBold: c = 700, + // Tell MUI what's the font-size on the html element. + // 16px is the default font-size used by browsers. + htmlFontSize: d = 16, + // Apply the CSS properties to all the variants. + allVariants: u, + pxToRem: b + } = t, p = Ne(t, Gu); + process.env.NODE_ENV !== "production" && (typeof o != "number" && console.error("MUI: `fontSize` is required to be a number."), typeof d != "number" && console.error("MUI: `htmlFontSize` is required to be a number.")); + const h = o / 14, f = b || ((y) => `${y / d * h}rem`), g = (y, C, T, x, w) => _({ + fontFamily: n, + fontWeight: y, + fontSize: f(C), + // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/ + lineHeight: T + }, n === ja ? { + letterSpacing: `${Hu(x / C)}em` + } : {}, w, u), v = { + h1: g(a, 96, 1.167, -1.5), + h2: g(a, 60, 1.2, -0.5), + h3: g(i, 48, 1.167, 0), + h4: g(i, 34, 1.235, 0.25), + h5: g(i, 24, 1.334, 0), + h6: g(s, 20, 1.6, 0.15), + subtitle1: g(i, 16, 1.75, 0.15), + subtitle2: g(s, 14, 1.57, 0.1), + body1: g(i, 16, 1.5, 0.15), + body2: g(i, 14, 1.43, 0.15), + button: g(s, 14, 1.75, 0.4, Ba), + caption: g(i, 12, 1.66, 0.4), + overline: g(i, 12, 2.66, 1, Ba), + // TODO v6: Remove handling of 'inherit' variant from the theme as it is already handled in Material UI's Typography component. Also, remember to remove the associated types. + inherit: { + fontFamily: "inherit", + fontWeight: "inherit", + fontSize: "inherit", + lineHeight: "inherit", + letterSpacing: "inherit" + } + }; + return Qe(_({ + htmlFontSize: d, + pxToRem: f, + fontFamily: n, + fontSize: o, + fontWeightLight: a, + fontWeightRegular: i, + fontWeightMedium: s, + fontWeightBold: c + }, v), p, { + clone: !1 + // No need to clone deep + }); +} +const Wu = 0.2, Yu = 0.14, qu = 0.12; +function he(...e) { + return [`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${Wu})`, `${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${Yu})`, `${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${qu})`].join(","); +} +const Ku = ["none", he(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), he(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), he(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), he(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), he(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), he(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), he(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), he(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), he(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), he(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), he(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), he(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), he(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), he(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), he(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), he(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), he(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), he(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), he(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), he(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), he(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), he(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), he(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), he(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)], Ju = Ku, Zu = ["duration", "easing", "delay"], Qu = { + // This is the most common easing curve. + easeInOut: "cubic-bezier(0.4, 0, 0.2, 1)", + // Objects enter the screen at full velocity from off-screen and + // slowly decelerate to a resting point. + easeOut: "cubic-bezier(0.0, 0, 0.2, 1)", + // Objects leave the screen at full velocity. They do not decelerate when off-screen. + easeIn: "cubic-bezier(0.4, 0, 1, 1)", + // The sharp curve is used by objects that may return to the screen at any time. + sharp: "cubic-bezier(0.4, 0, 0.6, 1)" +}, ef = { + shortest: 150, + shorter: 200, + short: 250, + // most basic recommended timing + standard: 300, + // this is to be used in complex animations + complex: 375, + // recommended when something is entering screen + enteringScreen: 225, + // recommended when something is leaving screen + leavingScreen: 195 +}; +function Va(e) { + return `${Math.round(e)}ms`; +} +function rf(e) { + if (!e) + return 0; + const r = e / 36; + return Math.round((4 + 15 * r ** 0.25 + r / 5) * 10); +} +function tf(e) { + const r = _({}, Qu, e.easing), t = _({}, ef, e.duration); + return _({ + getAutoHeightDuration: rf, + create: (o = ["all"], a = {}) => { + const { + duration: i = t.standard, + easing: s = r.easeInOut, + delay: c = 0 + } = a, d = Ne(a, Zu); + if (process.env.NODE_ENV !== "production") { + const u = (p) => typeof p == "string", b = (p) => !isNaN(parseFloat(p)); + !u(o) && !Array.isArray(o) && console.error('MUI: Argument "props" must be a string or Array.'), !b(i) && !u(i) && console.error(`MUI: Argument "duration" must be a number or a string but found ${i}.`), u(s) || console.error('MUI: Argument "easing" must be a string.'), !b(c) && !u(c) && console.error('MUI: Argument "delay" must be a number or a string.'), typeof a != "object" && console.error(["MUI: Secong argument of transition.create must be an object.", "Arguments should be either `create('prop1', options)` or `create(['prop1', 'prop2'], options)`"].join(` +`)), Object.keys(d).length !== 0 && console.error(`MUI: Unrecognized argument(s) [${Object.keys(d).join(",")}].`); + } + return (Array.isArray(o) ? o : [o]).map((u) => `${u} ${typeof i == "string" ? i : Va(i)} ${s} ${typeof c == "string" ? c : Va(c)}`).join(","); + } + }, e, { + easing: r, + duration: t + }); +} +const nf = { + mobileStepper: 1e3, + fab: 1050, + speedDial: 1050, + appBar: 1100, + drawer: 1200, + modal: 1300, + snackbar: 1400, + tooltip: 1500 +}, of = nf, af = ["breakpoints", "mixins", "spacing", "palette", "transitions", "typography", "shape"]; +function sf(e = {}, ...r) { + const { + mixins: t = {}, + palette: n = {}, + transitions: o = {}, + typography: a = {} + } = e, i = Ne(e, af); + if (e.vars) + throw new Error(process.env.NODE_ENV !== "production" ? "MUI: `vars` is a private field used for CSS variables support.\nPlease use another name." : Gr(18)); + const s = Uu(n), c = Ro(e); + let d = Qe(c, { + mixins: Su(c.breakpoints, t), + palette: s, + // Don't use [...shadows] until you've verified its transpiled code is not invoking the iterator protocol. + shadows: Ju.slice(), + typography: Xu(s, a), + transitions: tf(o), + zIndex: _({}, of) + }); + if (d = Qe(d, i), d = r.reduce((u, b) => Qe(u, b), d), process.env.NODE_ENV !== "production") { + const u = ["active", "checked", "completed", "disabled", "error", "expanded", "focused", "focusVisible", "required", "selected"], b = (p, h) => { + let f; + for (f in p) { + const g = p[f]; + if (u.indexOf(f) !== -1 && Object.keys(g).length > 0) { + if (process.env.NODE_ENV !== "production") { + const v = hn("", f); + console.error([`MUI: The \`${h}\` component increases the CSS specificity of the \`${f}\` internal state.`, "You can not override it like this: ", JSON.stringify(p, null, 2), "", `Instead, you need to use the '&.${v}' syntax:`, JSON.stringify({ + root: { + [`&.${v}`]: g + } + }, null, 2), "", "https://mui.com/r/state-classes-guide"].join(` +`)); + } + p[f] = {}; + } + } + }; + Object.keys(d.components).forEach((p) => { + const h = d.components[p].styleOverrides; + h && p.indexOf("Mui") === 0 && b(h, p); + }); + } + return d.unstable_sxConfig = _({}, Co, i == null ? void 0 : i.unstable_sxConfig), d.unstable_sx = function(b) { + return Oo({ + sx: b, + theme: this + }); + }, d; +} +const pf = sf(), $o = pf, _o = "$$material"; +function Io({ + props: e, + name: r +}) { + return xu({ + props: e, + name: r, + defaultTheme: $o, + themeId: _o + }); +} +const lf = (e) => Wt(e) && e !== "classes", cf = wu({ + themeId: _o, + defaultTheme: $o, + rootShouldForwardProp: lf +}), $t = cf; +function df(e) { + return hn("MuiSvgIcon", e); +} +ds("MuiSvgIcon", ["root", "colorPrimary", "colorSecondary", "colorAction", "colorError", "colorDisabled", "fontSizeInherit", "fontSizeSmall", "fontSizeMedium", "fontSizeLarge"]); +const uf = ["children", "className", "color", "component", "fontSize", "htmlColor", "inheritViewBox", "titleAccess", "viewBox"], ff = (e) => { + const { + color: r, + fontSize: t, + classes: n + } = e, o = { + root: ["root", r !== "inherit" && `color${Ye(r)}`, `fontSize${Ye(t)}`] + }; + return Eo(o, df, n); +}, mf = $t("svg", { + name: "MuiSvgIcon", + slot: "Root", + overridesResolver: (e, r) => { + const { + ownerState: t + } = e; + return [r.root, t.color !== "inherit" && r[`color${Ye(t.color)}`], r[`fontSize${Ye(t.fontSize)}`]]; + } +})(({ + theme: e, + ownerState: r +}) => { + var t, n, o, a, i, s, c, d, u, b, p, h, f; + return { + userSelect: "none", + width: "1em", + height: "1em", + display: "inline-block", + // the will define the property that has `currentColor` + // e.g. heroicons uses fill="none" and stroke="currentColor" + fill: r.hasSvgAsChild ? void 0 : "currentColor", + flexShrink: 0, + transition: (t = e.transitions) == null || (n = t.create) == null ? void 0 : n.call(t, "fill", { + duration: (o = e.transitions) == null || (o = o.duration) == null ? void 0 : o.shorter + }), + fontSize: { + inherit: "inherit", + small: ((a = e.typography) == null || (i = a.pxToRem) == null ? void 0 : i.call(a, 20)) || "1.25rem", + medium: ((s = e.typography) == null || (c = s.pxToRem) == null ? void 0 : c.call(s, 24)) || "1.5rem", + large: ((d = e.typography) == null || (u = d.pxToRem) == null ? void 0 : u.call(d, 35)) || "2.1875rem" + }[r.fontSize], + // TODO v5 deprecate, v6 remove for sx + color: (b = (p = (e.vars || e).palette) == null || (p = p[r.color]) == null ? void 0 : p.main) != null ? b : { + action: (h = (e.vars || e).palette) == null || (h = h.action) == null ? void 0 : h.active, + disabled: (f = (e.vars || e).palette) == null || (f = f.action) == null ? void 0 : f.disabled, + inherit: void 0 + }[r.color] + }; +}), Ao = /* @__PURE__ */ D.forwardRef(function(r, t) { + const n = Io({ + props: r, + name: "MuiSvgIcon" + }), { + children: o, + className: a, + color: i = "inherit", + component: s = "svg", + fontSize: c = "medium", + htmlColor: d, + inheritViewBox: u = !1, + titleAccess: b, + viewBox: p = "0 0 24 24" + } = n, h = Ne(n, uf), f = /* @__PURE__ */ D.isValidElement(o) && o.type === "svg", g = _({}, n, { + color: i, + component: s, + fontSize: c, + instanceFontSize: r.fontSize, + inheritViewBox: u, + viewBox: p, + hasSvgAsChild: f + }), v = {}; + u || (v.viewBox = p); + const y = ff(g); + return /* @__PURE__ */ E(mf, _({ + as: s, + className: Nr(y.root, a), + focusable: "false", + color: d, + "aria-hidden": b ? void 0 : !0, + role: b ? "img" : void 0, + ref: t + }, v, h, f && o.props, { + ownerState: g, + children: [f ? o.props.children : o, b ? /* @__PURE__ */ l("title", { + children: b + }) : null] + })); +}); +process.env.NODE_ENV !== "production" && (Ao.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the d.ts file and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * Node passed into the SVG element. + */ + children: m.node, + /** + * Override or extend the styles applied to the component. + */ + classes: m.object, + /** + * @ignore + */ + className: m.string, + /** + * The color of the component. + * It supports both default and custom theme colors, which can be added as shown in the + * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors). + * You can use the `htmlColor` prop to apply a color attribute to the SVG element. + * @default 'inherit' + */ + color: m.oneOfType([m.oneOf(["inherit", "action", "disabled", "primary", "secondary", "error", "info", "success", "warning"]), m.string]), + /** + * The component used for the root node. + * Either a string to use a HTML element or a component. + */ + component: m.elementType, + /** + * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size. + * @default 'medium' + */ + fontSize: m.oneOfType([m.oneOf(["inherit", "large", "medium", "small"]), m.string]), + /** + * Applies a color attribute to the SVG element. + */ + htmlColor: m.string, + /** + * If `true`, the root node will inherit the custom `component`'s viewBox and the `viewBox` + * prop will be ignored. + * Useful when you want to reference a custom `component` and have `SvgIcon` pass that + * `component`'s viewBox to the root node. + * @default false + */ + inheritViewBox: m.bool, + /** + * The shape-rendering attribute. The behavior of the different options is described on the + * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering). + * If you are having issues with blurry icons you should investigate this prop. + */ + shapeRendering: m.string, + /** + * The system prop that allows defining system overrides as well as additional CSS styles. + */ + sx: m.oneOfType([m.arrayOf(m.oneOfType([m.func, m.object, m.bool])), m.func, m.object]), + /** + * Provides a human-readable title for the element that contains it. + * https://www.w3.org/TR/SVG-access/#Equivalent + */ + titleAccess: m.string, + /** + * Allows you to redefine what the coordinates without units mean inside an SVG element. + * For example, if the SVG element is 500 (width) by 200 (height), + * and you pass viewBox="0 0 50 20", + * this means that the coordinates inside the SVG will go from the top left corner (0,0) + * to bottom right (50,20) and each unit will be worth 10px. + * @default '0 0 24 24' + */ + viewBox: m.string +}); +Ao.muiName = "SvgIcon"; +const La = Ao; +function bs(e, r) { + function t(n, o) { + return /* @__PURE__ */ l(La, _({ + "data-testid": `${r}Icon`, + ref: o + }, n, { + children: e + })); + } + return process.env.NODE_ENV !== "production" && (t.displayName = `${r}Icon`), t.muiName = La.muiName, /* @__PURE__ */ D.memo(/* @__PURE__ */ D.forwardRef(t)); +} +const hf = { + configure: (e) => { + process.env.NODE_ENV !== "production" && console.warn(["MUI: `ClassNameGenerator` import from `@mui/material/utils` is outdated and might cause unexpected issues.", "", "You should use `import { unstable_ClassNameGenerator } from '@mui/material/className'` instead", "", "The detail of the issue: https://github.com/mui/material-ui/issues/30011#issuecomment-1024993401", "", "The updated documentation: https://mui.com/guides/classname-generator/"].join(` +`)), ls.configure(e); + } +}, gf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + capitalize: Ye, + createChainedFunction: Gc, + createSvgIcon: bs, + debounce: Hc, + deprecatedPropType: Xc, + isMuiElement: Wc, + ownerDocument: Jt, + ownerWindow: Yc, + requirePropFactory: qc, + setRef: Zt, + unstable_ClassNameGenerator: hf, + unstable_useEnhancedEffect: Hr, + unstable_useId: as, + unsupportedProp: Zc, + useControlled: is, + useEventCallback: oo, + useForkRef: Sr, + useIsFocusVisible: ss +}, Symbol.toStringTag, { value: "Module" })), vf = /* @__PURE__ */ Ec(gf); +var za; +function bf() { + return za || (za = 1, function(e) { + "use client"; + Object.defineProperty(e, "__esModule", { + value: !0 + }), Object.defineProperty(e, "default", { + enumerable: !0, + get: function() { + return r.createSvgIcon; + } + }); + var r = vf; + }(Bn)), Bn; +} +var wf = Tc; +Object.defineProperty(xo, "__esModule", { + value: !0 +}); +var ws = xo.default = void 0, yf = wf(bf()), xf = bp; +ws = xo.default = (0, yf.default)(/* @__PURE__ */ (0, xf.jsx)("path", { + d: "m10 17 5-5-5-5z" +}), "ArrowRight"); +function kf(e) { + return typeof e == "string"; +} +function ct(e, r, t) { + return e === void 0 || kf(e) ? r : _({}, r, { + ownerState: _({}, r.ownerState, t) + }); +} +const Nf = { + disableDefaultClasses: !1 +}, Ef = /* @__PURE__ */ D.createContext(Nf); +function Tf(e) { + const { + disableDefaultClasses: r + } = D.useContext(Ef); + return (t) => r ? "" : e(t); +} +function Sf(e, r = []) { + if (e === void 0) + return {}; + const t = {}; + return Object.keys(e).filter((n) => n.match(/^on[A-Z]/) && typeof e[n] == "function" && !r.includes(n)).forEach((n) => { + t[n] = e[n]; + }), t; +} +function Cf(e, r, t) { + return typeof e == "function" ? e(r, t) : e; +} +function Fa(e) { + if (e === void 0) + return {}; + const r = {}; + return Object.keys(e).filter((t) => !(t.match(/^on[A-Z]/) && typeof e[t] == "function")).forEach((t) => { + r[t] = e[t]; + }), r; +} +function Of(e) { + const { + getSlotProps: r, + additionalProps: t, + externalSlotProps: n, + externalForwardedProps: o, + className: a + } = e; + if (!r) { + const h = Nr(t == null ? void 0 : t.className, a, o == null ? void 0 : o.className, n == null ? void 0 : n.className), f = _({}, t == null ? void 0 : t.style, o == null ? void 0 : o.style, n == null ? void 0 : n.style), g = _({}, t, o, n); + return h.length > 0 && (g.className = h), Object.keys(f).length > 0 && (g.style = f), { + props: g, + internalRef: void 0 + }; + } + const i = Sf(_({}, o, n)), s = Fa(n), c = Fa(o), d = r(i), u = Nr(d == null ? void 0 : d.className, t == null ? void 0 : t.className, a, o == null ? void 0 : o.className, n == null ? void 0 : n.className), b = _({}, d == null ? void 0 : d.style, t == null ? void 0 : t.style, o == null ? void 0 : o.style, n == null ? void 0 : n.style), p = _({}, d, t, c, s); + return u.length > 0 && (p.className = u), Object.keys(b).length > 0 && (p.style = b), { + props: p, + internalRef: d.ref + }; +} +const Rf = ["elementType", "externalSlotProps", "ownerState", "skipResolvingSlotProps"]; +function Pf(e) { + var r; + const { + elementType: t, + externalSlotProps: n, + ownerState: o, + skipResolvingSlotProps: a = !1 + } = e, i = Ne(e, Rf), s = a ? {} : Cf(n, o), { + props: c, + internalRef: d + } = Of(_({}, i, { + externalSlotProps: s + })), u = Sr(d, s == null ? void 0 : s.ref, (r = e.additionalProps) == null ? void 0 : r.ref); + return ct(t, _({}, c, { + ref: u + }), o); +} +const ys = "base"; +function $f(e) { + return `${ys}--${e}`; +} +function _f(e, r) { + return `${ys}-${e}-${r}`; +} +function xs(e, r) { + const t = cs[r]; + return t ? $f(t) : _f(e, r); +} +function If(e, r) { + const t = {}; + return r.forEach((n) => { + t[n] = xs(e, n); + }), t; +} +function Af(e) { + return typeof e == "function" ? e() : e; +} +const en = /* @__PURE__ */ D.forwardRef(function(r, t) { + const { + children: n, + container: o, + disablePortal: a = !1 + } = r, [i, s] = D.useState(null), c = Sr(/* @__PURE__ */ D.isValidElement(n) ? n.ref : null, t); + if (Hr(() => { + a || s(Af(o) || document.body); + }, [o, a]), Hr(() => { + if (i && !a) + return Zt(t, i), () => { + Zt(t, null); + }; + }, [t, i, a]), a) { + if (/* @__PURE__ */ D.isValidElement(n)) { + const d = { + ref: c + }; + return /* @__PURE__ */ D.cloneElement(n, d); + } + return /* @__PURE__ */ l(D.Fragment, { + children: n + }); + } + return /* @__PURE__ */ l(D.Fragment, { + children: i && /* @__PURE__ */ ul.createPortal(n, i) + }); +}); +process.env.NODE_ENV !== "production" && (en.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * The children to render into the `container`. + */ + children: m.node, + /** + * An HTML element or function that returns one. + * The `container` will have the portal children appended to it. + * + * You can also provide a callback, which is called in a React layout effect. + * This lets you set the container from a ref, and also makes server-side rendering possible. + * + * By default, it uses the body of the top-level document object, + * so it's simply `document.body` most of the time. + */ + container: m.oneOfType([kt, m.func]), + /** + * The `children` will be under the DOM hierarchy of the parent component. + * @default false + */ + disablePortal: m.bool +}); +process.env.NODE_ENV !== "production" && (en["propTypes"] = Bc(en.propTypes)); +var Ce = "top", je = "bottom", Ve = "right", Oe = "left", Do = "auto", _t = [Ce, je, Ve, Oe], Xr = "start", Et = "end", Df = "clippingParents", ks = "viewport", at = "popper", Mf = "reference", Ua = /* @__PURE__ */ _t.reduce(function(e, r) { + return e.concat([r + "-" + Xr, r + "-" + Et]); +}, []), Ns = /* @__PURE__ */ [].concat(_t, [Do]).reduce(function(e, r) { + return e.concat([r, r + "-" + Xr, r + "-" + Et]); +}, []), Bf = "beforeRead", jf = "read", Vf = "afterRead", Lf = "beforeMain", zf = "main", Ff = "afterMain", Uf = "beforeWrite", Gf = "write", Hf = "afterWrite", Xf = [Bf, jf, Vf, Lf, zf, Ff, Uf, Gf, Hf]; +function qe(e) { + return e ? (e.nodeName || "").toLowerCase() : null; +} +function Ae(e) { + if (e == null) + return window; + if (e.toString() !== "[object Window]") { + var r = e.ownerDocument; + return r && r.defaultView || window; + } + return e; +} +function Or(e) { + var r = Ae(e).Element; + return e instanceof r || e instanceof Element; +} +function Be(e) { + var r = Ae(e).HTMLElement; + return e instanceof r || e instanceof HTMLElement; +} +function Mo(e) { + if (typeof ShadowRoot > "u") + return !1; + var r = Ae(e).ShadowRoot; + return e instanceof r || e instanceof ShadowRoot; +} +function Wf(e) { + var r = e.state; + Object.keys(r.elements).forEach(function(t) { + var n = r.styles[t] || {}, o = r.attributes[t] || {}, a = r.elements[t]; + !Be(a) || !qe(a) || (Object.assign(a.style, n), Object.keys(o).forEach(function(i) { + var s = o[i]; + s === !1 ? a.removeAttribute(i) : a.setAttribute(i, s === !0 ? "" : s); + })); + }); +} +function Yf(e) { + var r = e.state, t = { + popper: { + position: r.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + return Object.assign(r.elements.popper.style, t.popper), r.styles = t, r.elements.arrow && Object.assign(r.elements.arrow.style, t.arrow), function() { + Object.keys(r.elements).forEach(function(n) { + var o = r.elements[n], a = r.attributes[n] || {}, i = Object.keys(r.styles.hasOwnProperty(n) ? r.styles[n] : t[n]), s = i.reduce(function(c, d) { + return c[d] = "", c; + }, {}); + !Be(o) || !qe(o) || (Object.assign(o.style, s), Object.keys(a).forEach(function(c) { + o.removeAttribute(c); + })); + }); + }; +} +const qf = { + name: "applyStyles", + enabled: !0, + phase: "write", + fn: Wf, + effect: Yf, + requires: ["computeStyles"] +}; +function He(e) { + return e.split("-")[0]; +} +var Er = Math.max, rn = Math.min, Wr = Math.round; +function io() { + var e = navigator.userAgentData; + return e != null && e.brands && Array.isArray(e.brands) ? e.brands.map(function(r) { + return r.brand + "/" + r.version; + }).join(" ") : navigator.userAgent; +} +function Es() { + return !/^((?!chrome|android).)*safari/i.test(io()); +} +function Yr(e, r, t) { + r === void 0 && (r = !1), t === void 0 && (t = !1); + var n = e.getBoundingClientRect(), o = 1, a = 1; + r && Be(e) && (o = e.offsetWidth > 0 && Wr(n.width) / e.offsetWidth || 1, a = e.offsetHeight > 0 && Wr(n.height) / e.offsetHeight || 1); + var i = Or(e) ? Ae(e) : window, s = i.visualViewport, c = !Es() && t, d = (n.left + (c && s ? s.offsetLeft : 0)) / o, u = (n.top + (c && s ? s.offsetTop : 0)) / a, b = n.width / o, p = n.height / a; + return { + width: b, + height: p, + top: u, + right: d + b, + bottom: u + p, + left: d, + x: d, + y: u + }; +} +function Bo(e) { + var r = Yr(e), t = e.offsetWidth, n = e.offsetHeight; + return Math.abs(r.width - t) <= 1 && (t = r.width), Math.abs(r.height - n) <= 1 && (n = r.height), { + x: e.offsetLeft, + y: e.offsetTop, + width: t, + height: n + }; +} +function Ts(e, r) { + var t = r.getRootNode && r.getRootNode(); + if (e.contains(r)) + return !0; + if (t && Mo(t)) { + var n = r; + do { + if (n && e.isSameNode(n)) + return !0; + n = n.parentNode || n.host; + } while (n); + } + return !1; +} +function rr(e) { + return Ae(e).getComputedStyle(e); +} +function Kf(e) { + return ["table", "td", "th"].indexOf(qe(e)) >= 0; +} +function ur(e) { + return ((Or(e) ? e.ownerDocument : ( + // $FlowFixMe[prop-missing] + e.document + )) || window.document).documentElement; +} +function Tn(e) { + return qe(e) === "html" ? e : ( + // this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + e.assignedSlot || // step into the shadow DOM of the parent of a slotted node + e.parentNode || // DOM Element detected + (Mo(e) ? e.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + ur(e) + ); +} +function Ga(e) { + return !Be(e) || // https://github.com/popperjs/popper-core/issues/837 + rr(e).position === "fixed" ? null : e.offsetParent; +} +function Jf(e) { + var r = /firefox/i.test(io()), t = /Trident/i.test(io()); + if (t && Be(e)) { + var n = rr(e); + if (n.position === "fixed") + return null; + } + var o = Tn(e); + for (Mo(o) && (o = o.host); Be(o) && ["html", "body"].indexOf(qe(o)) < 0; ) { + var a = rr(o); + if (a.transform !== "none" || a.perspective !== "none" || a.contain === "paint" || ["transform", "perspective"].indexOf(a.willChange) !== -1 || r && a.willChange === "filter" || r && a.filter && a.filter !== "none") + return o; + o = o.parentNode; + } + return null; +} +function It(e) { + for (var r = Ae(e), t = Ga(e); t && Kf(t) && rr(t).position === "static"; ) + t = Ga(t); + return t && (qe(t) === "html" || qe(t) === "body" && rr(t).position === "static") ? r : t || Jf(e) || r; +} +function jo(e) { + return ["top", "bottom"].indexOf(e) >= 0 ? "x" : "y"; +} +function ht(e, r, t) { + return Er(e, rn(r, t)); +} +function Zf(e, r, t) { + var n = ht(e, r, t); + return n > t ? t : n; +} +function Ss() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} +function Cs(e) { + return Object.assign({}, Ss(), e); +} +function Os(e, r) { + return r.reduce(function(t, n) { + return t[n] = e, t; + }, {}); +} +var Qf = function(r, t) { + return r = typeof r == "function" ? r(Object.assign({}, t.rects, { + placement: t.placement + })) : r, Cs(typeof r != "number" ? r : Os(r, _t)); +}; +function em(e) { + var r, t = e.state, n = e.name, o = e.options, a = t.elements.arrow, i = t.modifiersData.popperOffsets, s = He(t.placement), c = jo(s), d = [Oe, Ve].indexOf(s) >= 0, u = d ? "height" : "width"; + if (!(!a || !i)) { + var b = Qf(o.padding, t), p = Bo(a), h = c === "y" ? Ce : Oe, f = c === "y" ? je : Ve, g = t.rects.reference[u] + t.rects.reference[c] - i[c] - t.rects.popper[u], v = i[c] - t.rects.reference[c], y = It(a), C = y ? c === "y" ? y.clientHeight || 0 : y.clientWidth || 0 : 0, T = g / 2 - v / 2, x = b[h], w = C - p[u] - b[f], O = C / 2 - p[u] / 2 + T, P = ht(x, O, w), V = c; + t.modifiersData[n] = (r = {}, r[V] = P, r.centerOffset = P - O, r); + } +} +function rm(e) { + var r = e.state, t = e.options, n = t.element, o = n === void 0 ? "[data-popper-arrow]" : n; + o != null && (typeof o == "string" && (o = r.elements.popper.querySelector(o), !o) || Ts(r.elements.popper, o) && (r.elements.arrow = o)); +} +const tm = { + name: "arrow", + enabled: !0, + phase: "main", + fn: em, + effect: rm, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] +}; +function qr(e) { + return e.split("-")[1]; +} +var nm = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function om(e, r) { + var t = e.x, n = e.y, o = r.devicePixelRatio || 1; + return { + x: Wr(t * o) / o || 0, + y: Wr(n * o) / o || 0 + }; +} +function Ha(e) { + var r, t = e.popper, n = e.popperRect, o = e.placement, a = e.variation, i = e.offsets, s = e.position, c = e.gpuAcceleration, d = e.adaptive, u = e.roundOffsets, b = e.isFixed, p = i.x, h = p === void 0 ? 0 : p, f = i.y, g = f === void 0 ? 0 : f, v = typeof u == "function" ? u({ + x: h, + y: g + }) : { + x: h, + y: g + }; + h = v.x, g = v.y; + var y = i.hasOwnProperty("x"), C = i.hasOwnProperty("y"), T = Oe, x = Ce, w = window; + if (d) { + var O = It(t), P = "clientHeight", V = "clientWidth"; + if (O === Ae(t) && (O = ur(t), rr(O).position !== "static" && s === "absolute" && (P = "scrollHeight", V = "scrollWidth")), O = O, o === Ce || (o === Oe || o === Ve) && a === Et) { + x = je; + var S = b && O === w && w.visualViewport ? w.visualViewport.height : ( + // $FlowFixMe[prop-missing] + O[P] + ); + g -= S - n.height, g *= c ? 1 : -1; + } + if (o === Oe || (o === Ce || o === je) && a === Et) { + T = Ve; + var $ = b && O === w && w.visualViewport ? w.visualViewport.width : ( + // $FlowFixMe[prop-missing] + O[V] + ); + h -= $ - n.width, h *= c ? 1 : -1; + } + } + var k = Object.assign({ + position: s + }, d && nm), j = u === !0 ? om({ + x: h, + y: g + }, Ae(t)) : { + x: h, + y: g + }; + if (h = j.x, g = j.y, c) { + var B; + return Object.assign({}, k, (B = {}, B[x] = C ? "0" : "", B[T] = y ? "0" : "", B.transform = (w.devicePixelRatio || 1) <= 1 ? "translate(" + h + "px, " + g + "px)" : "translate3d(" + h + "px, " + g + "px, 0)", B)); + } + return Object.assign({}, k, (r = {}, r[x] = C ? g + "px" : "", r[T] = y ? h + "px" : "", r.transform = "", r)); +} +function am(e) { + var r = e.state, t = e.options, n = t.gpuAcceleration, o = n === void 0 ? !0 : n, a = t.adaptive, i = a === void 0 ? !0 : a, s = t.roundOffsets, c = s === void 0 ? !0 : s, d = { + placement: He(r.placement), + variation: qr(r.placement), + popper: r.elements.popper, + popperRect: r.rects.popper, + gpuAcceleration: o, + isFixed: r.options.strategy === "fixed" + }; + r.modifiersData.popperOffsets != null && (r.styles.popper = Object.assign({}, r.styles.popper, Ha(Object.assign({}, d, { + offsets: r.modifiersData.popperOffsets, + position: r.options.strategy, + adaptive: i, + roundOffsets: c + })))), r.modifiersData.arrow != null && (r.styles.arrow = Object.assign({}, r.styles.arrow, Ha(Object.assign({}, d, { + offsets: r.modifiersData.arrow, + position: "absolute", + adaptive: !1, + roundOffsets: c + })))), r.attributes.popper = Object.assign({}, r.attributes.popper, { + "data-popper-placement": r.placement + }); +} +const im = { + name: "computeStyles", + enabled: !0, + phase: "beforeWrite", + fn: am, + data: {} +}; +var Ft = { + passive: !0 +}; +function sm(e) { + var r = e.state, t = e.instance, n = e.options, o = n.scroll, a = o === void 0 ? !0 : o, i = n.resize, s = i === void 0 ? !0 : i, c = Ae(r.elements.popper), d = [].concat(r.scrollParents.reference, r.scrollParents.popper); + return a && d.forEach(function(u) { + u.addEventListener("scroll", t.update, Ft); + }), s && c.addEventListener("resize", t.update, Ft), function() { + a && d.forEach(function(u) { + u.removeEventListener("scroll", t.update, Ft); + }), s && c.removeEventListener("resize", t.update, Ft); + }; +} +const pm = { + name: "eventListeners", + enabled: !0, + phase: "write", + fn: function() { + }, + effect: sm, + data: {} +}; +var lm = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function qt(e) { + return e.replace(/left|right|bottom|top/g, function(r) { + return lm[r]; + }); +} +var cm = { + start: "end", + end: "start" +}; +function Xa(e) { + return e.replace(/start|end/g, function(r) { + return cm[r]; + }); +} +function Vo(e) { + var r = Ae(e), t = r.pageXOffset, n = r.pageYOffset; + return { + scrollLeft: t, + scrollTop: n + }; +} +function Lo(e) { + return Yr(ur(e)).left + Vo(e).scrollLeft; +} +function dm(e, r) { + var t = Ae(e), n = ur(e), o = t.visualViewport, a = n.clientWidth, i = n.clientHeight, s = 0, c = 0; + if (o) { + a = o.width, i = o.height; + var d = Es(); + (d || !d && r === "fixed") && (s = o.offsetLeft, c = o.offsetTop); + } + return { + width: a, + height: i, + x: s + Lo(e), + y: c + }; +} +function um(e) { + var r, t = ur(e), n = Vo(e), o = (r = e.ownerDocument) == null ? void 0 : r.body, a = Er(t.scrollWidth, t.clientWidth, o ? o.scrollWidth : 0, o ? o.clientWidth : 0), i = Er(t.scrollHeight, t.clientHeight, o ? o.scrollHeight : 0, o ? o.clientHeight : 0), s = -n.scrollLeft + Lo(e), c = -n.scrollTop; + return rr(o || t).direction === "rtl" && (s += Er(t.clientWidth, o ? o.clientWidth : 0) - a), { + width: a, + height: i, + x: s, + y: c + }; +} +function zo(e) { + var r = rr(e), t = r.overflow, n = r.overflowX, o = r.overflowY; + return /auto|scroll|overlay|hidden/.test(t + o + n); +} +function Rs(e) { + return ["html", "body", "#document"].indexOf(qe(e)) >= 0 ? e.ownerDocument.body : Be(e) && zo(e) ? e : Rs(Tn(e)); +} +function gt(e, r) { + var t; + r === void 0 && (r = []); + var n = Rs(e), o = n === ((t = e.ownerDocument) == null ? void 0 : t.body), a = Ae(n), i = o ? [a].concat(a.visualViewport || [], zo(n) ? n : []) : n, s = r.concat(i); + return o ? s : ( + // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + s.concat(gt(Tn(i))) + ); +} +function so(e) { + return Object.assign({}, e, { + left: e.x, + top: e.y, + right: e.x + e.width, + bottom: e.y + e.height + }); +} +function fm(e, r) { + var t = Yr(e, !1, r === "fixed"); + return t.top = t.top + e.clientTop, t.left = t.left + e.clientLeft, t.bottom = t.top + e.clientHeight, t.right = t.left + e.clientWidth, t.width = e.clientWidth, t.height = e.clientHeight, t.x = t.left, t.y = t.top, t; +} +function Wa(e, r, t) { + return r === ks ? so(dm(e, t)) : Or(r) ? fm(r, t) : so(um(ur(e))); +} +function mm(e) { + var r = gt(Tn(e)), t = ["absolute", "fixed"].indexOf(rr(e).position) >= 0, n = t && Be(e) ? It(e) : e; + return Or(n) ? r.filter(function(o) { + return Or(o) && Ts(o, n) && qe(o) !== "body"; + }) : []; +} +function hm(e, r, t, n) { + var o = r === "clippingParents" ? mm(e) : [].concat(r), a = [].concat(o, [t]), i = a[0], s = a.reduce(function(c, d) { + var u = Wa(e, d, n); + return c.top = Er(u.top, c.top), c.right = rn(u.right, c.right), c.bottom = rn(u.bottom, c.bottom), c.left = Er(u.left, c.left), c; + }, Wa(e, i, n)); + return s.width = s.right - s.left, s.height = s.bottom - s.top, s.x = s.left, s.y = s.top, s; +} +function Ps(e) { + var r = e.reference, t = e.element, n = e.placement, o = n ? He(n) : null, a = n ? qr(n) : null, i = r.x + r.width / 2 - t.width / 2, s = r.y + r.height / 2 - t.height / 2, c; + switch (o) { + case Ce: + c = { + x: i, + y: r.y - t.height + }; + break; + case je: + c = { + x: i, + y: r.y + r.height + }; + break; + case Ve: + c = { + x: r.x + r.width, + y: s + }; + break; + case Oe: + c = { + x: r.x - t.width, + y: s + }; + break; + default: + c = { + x: r.x, + y: r.y + }; + } + var d = o ? jo(o) : null; + if (d != null) { + var u = d === "y" ? "height" : "width"; + switch (a) { + case Xr: + c[d] = c[d] - (r[u] / 2 - t[u] / 2); + break; + case Et: + c[d] = c[d] + (r[u] / 2 - t[u] / 2); + break; + } + } + return c; +} +function Tt(e, r) { + r === void 0 && (r = {}); + var t = r, n = t.placement, o = n === void 0 ? e.placement : n, a = t.strategy, i = a === void 0 ? e.strategy : a, s = t.boundary, c = s === void 0 ? Df : s, d = t.rootBoundary, u = d === void 0 ? ks : d, b = t.elementContext, p = b === void 0 ? at : b, h = t.altBoundary, f = h === void 0 ? !1 : h, g = t.padding, v = g === void 0 ? 0 : g, y = Cs(typeof v != "number" ? v : Os(v, _t)), C = p === at ? Mf : at, T = e.rects.popper, x = e.elements[f ? C : p], w = hm(Or(x) ? x : x.contextElement || ur(e.elements.popper), c, u, i), O = Yr(e.elements.reference), P = Ps({ + reference: O, + element: T, + strategy: "absolute", + placement: o + }), V = so(Object.assign({}, T, P)), S = p === at ? V : O, $ = { + top: w.top - S.top + y.top, + bottom: S.bottom - w.bottom + y.bottom, + left: w.left - S.left + y.left, + right: S.right - w.right + y.right + }, k = e.modifiersData.offset; + if (p === at && k) { + var j = k[o]; + Object.keys($).forEach(function(B) { + var Z = [Ve, je].indexOf(B) >= 0 ? 1 : -1, J = [Ce, je].indexOf(B) >= 0 ? "y" : "x"; + $[B] += j[J] * Z; + }); + } + return $; +} +function gm(e, r) { + r === void 0 && (r = {}); + var t = r, n = t.placement, o = t.boundary, a = t.rootBoundary, i = t.padding, s = t.flipVariations, c = t.allowedAutoPlacements, d = c === void 0 ? Ns : c, u = qr(n), b = u ? s ? Ua : Ua.filter(function(f) { + return qr(f) === u; + }) : _t, p = b.filter(function(f) { + return d.indexOf(f) >= 0; + }); + p.length === 0 && (p = b); + var h = p.reduce(function(f, g) { + return f[g] = Tt(e, { + placement: g, + boundary: o, + rootBoundary: a, + padding: i + })[He(g)], f; + }, {}); + return Object.keys(h).sort(function(f, g) { + return h[f] - h[g]; + }); +} +function vm(e) { + if (He(e) === Do) + return []; + var r = qt(e); + return [Xa(e), r, Xa(r)]; +} +function bm(e) { + var r = e.state, t = e.options, n = e.name; + if (!r.modifiersData[n]._skip) { + for (var o = t.mainAxis, a = o === void 0 ? !0 : o, i = t.altAxis, s = i === void 0 ? !0 : i, c = t.fallbackPlacements, d = t.padding, u = t.boundary, b = t.rootBoundary, p = t.altBoundary, h = t.flipVariations, f = h === void 0 ? !0 : h, g = t.allowedAutoPlacements, v = r.options.placement, y = He(v), C = y === v, T = c || (C || !f ? [qt(v)] : vm(v)), x = [v].concat(T).reduce(function(F, q) { + return F.concat(He(q) === Do ? gm(r, { + placement: q, + boundary: u, + rootBoundary: b, + padding: d, + flipVariations: f, + allowedAutoPlacements: g + }) : q); + }, []), w = r.rects.reference, O = r.rects.popper, P = /* @__PURE__ */ new Map(), V = !0, S = x[0], $ = 0; $ < x.length; $++) { + var k = x[$], j = He(k), B = qr(k) === Xr, Z = [Ce, je].indexOf(j) >= 0, J = Z ? "width" : "height", X = Tt(r, { + placement: k, + boundary: u, + rootBoundary: b, + altBoundary: p, + padding: d + }), te = Z ? B ? Ve : Oe : B ? je : Ce; + w[J] > O[J] && (te = qt(te)); + var ae = qt(te), z = []; + if (a && z.push(X[j] <= 0), s && z.push(X[te] <= 0, X[ae] <= 0), z.every(function(F) { + return F; + })) { + S = k, V = !1; + break; + } + P.set(k, z); + } + if (V) + for (var N = f ? 3 : 1, I = function(q) { + var G = x.find(function(K) { + var Y = P.get(K); + if (Y) + return Y.slice(0, q).every(function(Q) { + return Q; + }); + }); + if (G) + return S = G, "break"; + }, W = N; W > 0; W--) { + var U = I(W); + if (U === "break") + break; + } + r.placement !== S && (r.modifiersData[n]._skip = !0, r.placement = S, r.reset = !0); + } +} +const wm = { + name: "flip", + enabled: !0, + phase: "main", + fn: bm, + requiresIfExists: ["offset"], + data: { + _skip: !1 + } +}; +function Ya(e, r, t) { + return t === void 0 && (t = { + x: 0, + y: 0 + }), { + top: e.top - r.height - t.y, + right: e.right - r.width + t.x, + bottom: e.bottom - r.height + t.y, + left: e.left - r.width - t.x + }; +} +function qa(e) { + return [Ce, Ve, je, Oe].some(function(r) { + return e[r] >= 0; + }); +} +function ym(e) { + var r = e.state, t = e.name, n = r.rects.reference, o = r.rects.popper, a = r.modifiersData.preventOverflow, i = Tt(r, { + elementContext: "reference" + }), s = Tt(r, { + altBoundary: !0 + }), c = Ya(i, n), d = Ya(s, o, a), u = qa(c), b = qa(d); + r.modifiersData[t] = { + referenceClippingOffsets: c, + popperEscapeOffsets: d, + isReferenceHidden: u, + hasPopperEscaped: b + }, r.attributes.popper = Object.assign({}, r.attributes.popper, { + "data-popper-reference-hidden": u, + "data-popper-escaped": b + }); +} +const xm = { + name: "hide", + enabled: !0, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: ym +}; +function km(e, r, t) { + var n = He(e), o = [Oe, Ce].indexOf(n) >= 0 ? -1 : 1, a = typeof t == "function" ? t(Object.assign({}, r, { + placement: e + })) : t, i = a[0], s = a[1]; + return i = i || 0, s = (s || 0) * o, [Oe, Ve].indexOf(n) >= 0 ? { + x: s, + y: i + } : { + x: i, + y: s + }; +} +function Nm(e) { + var r = e.state, t = e.options, n = e.name, o = t.offset, a = o === void 0 ? [0, 0] : o, i = Ns.reduce(function(u, b) { + return u[b] = km(b, r.rects, a), u; + }, {}), s = i[r.placement], c = s.x, d = s.y; + r.modifiersData.popperOffsets != null && (r.modifiersData.popperOffsets.x += c, r.modifiersData.popperOffsets.y += d), r.modifiersData[n] = i; +} +const Em = { + name: "offset", + enabled: !0, + phase: "main", + requires: ["popperOffsets"], + fn: Nm +}; +function Tm(e) { + var r = e.state, t = e.name; + r.modifiersData[t] = Ps({ + reference: r.rects.reference, + element: r.rects.popper, + strategy: "absolute", + placement: r.placement + }); +} +const Sm = { + name: "popperOffsets", + enabled: !0, + phase: "read", + fn: Tm, + data: {} +}; +function Cm(e) { + return e === "x" ? "y" : "x"; +} +function Om(e) { + var r = e.state, t = e.options, n = e.name, o = t.mainAxis, a = o === void 0 ? !0 : o, i = t.altAxis, s = i === void 0 ? !1 : i, c = t.boundary, d = t.rootBoundary, u = t.altBoundary, b = t.padding, p = t.tether, h = p === void 0 ? !0 : p, f = t.tetherOffset, g = f === void 0 ? 0 : f, v = Tt(r, { + boundary: c, + rootBoundary: d, + padding: b, + altBoundary: u + }), y = He(r.placement), C = qr(r.placement), T = !C, x = jo(y), w = Cm(x), O = r.modifiersData.popperOffsets, P = r.rects.reference, V = r.rects.popper, S = typeof g == "function" ? g(Object.assign({}, r.rects, { + placement: r.placement + })) : g, $ = typeof S == "number" ? { + mainAxis: S, + altAxis: S + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, S), k = r.modifiersData.offset ? r.modifiersData.offset[r.placement] : null, j = { + x: 0, + y: 0 + }; + if (O) { + if (a) { + var B, Z = x === "y" ? Ce : Oe, J = x === "y" ? je : Ve, X = x === "y" ? "height" : "width", te = O[x], ae = te + v[Z], z = te - v[J], N = h ? -V[X] / 2 : 0, I = C === Xr ? P[X] : V[X], W = C === Xr ? -V[X] : -P[X], U = r.elements.arrow, F = h && U ? Bo(U) : { + width: 0, + height: 0 + }, q = r.modifiersData["arrow#persistent"] ? r.modifiersData["arrow#persistent"].padding : Ss(), G = q[Z], K = q[J], Y = ht(0, P[X], F[X]), Q = T ? P[X] / 2 - N - Y - G - $.mainAxis : I - Y - G - $.mainAxis, ee = T ? -P[X] / 2 + N + Y + K + $.mainAxis : W + Y + K + $.mainAxis, de = r.elements.arrow && It(r.elements.arrow), A = de ? x === "y" ? de.clientTop || 0 : de.clientLeft || 0 : 0, ke = (B = k == null ? void 0 : k[x]) != null ? B : 0, L = te + Q - ke - A, xe = te + ee - ke, ze = ht(h ? rn(ae, L) : ae, te, h ? Er(z, xe) : z); + O[x] = ze, j[x] = ze - te; + } + if (s) { + var fr, Ee = x === "x" ? Ce : Oe, Dt = x === "x" ? je : Ve, Fe = O[w], Rr = w === "y" ? "height" : "width", mr = Fe + v[Ee], Pr = Fe - v[Dt], $r = [Ce, Oe].indexOf(y) !== -1, _r = (fr = k == null ? void 0 : k[w]) != null ? fr : 0, hr = $r ? mr : Fe - P[Rr] - V[Rr] - _r + $.altAxis, Jr = $r ? Fe + P[Rr] + V[Rr] - _r - $.altAxis : Pr, Mt = h && $r ? Zf(hr, Fe, Jr) : ht(h ? hr : mr, Fe, h ? Jr : Pr); + O[w] = Mt, j[w] = Mt - Fe; + } + r.modifiersData[n] = j; + } +} +const Rm = { + name: "preventOverflow", + enabled: !0, + phase: "main", + fn: Om, + requiresIfExists: ["offset"] +}; +function Pm(e) { + return { + scrollLeft: e.scrollLeft, + scrollTop: e.scrollTop + }; +} +function $m(e) { + return e === Ae(e) || !Be(e) ? Vo(e) : Pm(e); +} +function _m(e) { + var r = e.getBoundingClientRect(), t = Wr(r.width) / e.offsetWidth || 1, n = Wr(r.height) / e.offsetHeight || 1; + return t !== 1 || n !== 1; +} +function Im(e, r, t) { + t === void 0 && (t = !1); + var n = Be(r), o = Be(r) && _m(r), a = ur(r), i = Yr(e, o, t), s = { + scrollLeft: 0, + scrollTop: 0 + }, c = { + x: 0, + y: 0 + }; + return (n || !n && !t) && ((qe(r) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 + zo(a)) && (s = $m(r)), Be(r) ? (c = Yr(r, !0), c.x += r.clientLeft, c.y += r.clientTop) : a && (c.x = Lo(a))), { + x: i.left + s.scrollLeft - c.x, + y: i.top + s.scrollTop - c.y, + width: i.width, + height: i.height + }; +} +function Am(e) { + var r = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Set(), n = []; + e.forEach(function(a) { + r.set(a.name, a); + }); + function o(a) { + t.add(a.name); + var i = [].concat(a.requires || [], a.requiresIfExists || []); + i.forEach(function(s) { + if (!t.has(s)) { + var c = r.get(s); + c && o(c); + } + }), n.push(a); + } + return e.forEach(function(a) { + t.has(a.name) || o(a); + }), n; +} +function Dm(e) { + var r = Am(e); + return Xf.reduce(function(t, n) { + return t.concat(r.filter(function(o) { + return o.phase === n; + })); + }, []); +} +function Mm(e) { + var r; + return function() { + return r || (r = new Promise(function(t) { + Promise.resolve().then(function() { + r = void 0, t(e()); + }); + })), r; + }; +} +function Bm(e) { + var r = e.reduce(function(t, n) { + var o = t[n.name]; + return t[n.name] = o ? Object.assign({}, o, n, { + options: Object.assign({}, o.options, n.options), + data: Object.assign({}, o.data, n.data) + }) : n, t; + }, {}); + return Object.keys(r).map(function(t) { + return r[t]; + }); +} +var Ka = { + placement: "bottom", + modifiers: [], + strategy: "absolute" +}; +function Ja() { + for (var e = arguments.length, r = new Array(e), t = 0; t < e; t++) + r[t] = arguments[t]; + return !r.some(function(n) { + return !(n && typeof n.getBoundingClientRect == "function"); + }); +} +function jm(e) { + e === void 0 && (e = {}); + var r = e, t = r.defaultModifiers, n = t === void 0 ? [] : t, o = r.defaultOptions, a = o === void 0 ? Ka : o; + return function(s, c, d) { + d === void 0 && (d = a); + var u = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, Ka, a), + modifiersData: {}, + elements: { + reference: s, + popper: c + }, + attributes: {}, + styles: {} + }, b = [], p = !1, h = { + state: u, + setOptions: function(y) { + var C = typeof y == "function" ? y(u.options) : y; + g(), u.options = Object.assign({}, a, u.options, C), u.scrollParents = { + reference: Or(s) ? gt(s) : s.contextElement ? gt(s.contextElement) : [], + popper: gt(c) + }; + var T = Dm(Bm([].concat(n, u.options.modifiers))); + return u.orderedModifiers = T.filter(function(x) { + return x.enabled; + }), f(), h.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function() { + if (!p) { + var y = u.elements, C = y.reference, T = y.popper; + if (Ja(C, T)) { + u.rects = { + reference: Im(C, It(T), u.options.strategy === "fixed"), + popper: Bo(T) + }, u.reset = !1, u.placement = u.options.placement, u.orderedModifiers.forEach(function($) { + return u.modifiersData[$.name] = Object.assign({}, $.data); + }); + for (var x = 0; x < u.orderedModifiers.length; x++) { + if (u.reset === !0) { + u.reset = !1, x = -1; + continue; + } + var w = u.orderedModifiers[x], O = w.fn, P = w.options, V = P === void 0 ? {} : P, S = w.name; + typeof O == "function" && (u = O({ + state: u, + options: V, + name: S, + instance: h + }) || u); + } + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: Mm(function() { + return new Promise(function(v) { + h.forceUpdate(), v(u); + }); + }), + destroy: function() { + g(), p = !0; + } + }; + if (!Ja(s, c)) + return h; + h.setOptions(d).then(function(v) { + !p && d.onFirstUpdate && d.onFirstUpdate(v); + }); + function f() { + u.orderedModifiers.forEach(function(v) { + var y = v.name, C = v.options, T = C === void 0 ? {} : C, x = v.effect; + if (typeof x == "function") { + var w = x({ + state: u, + name: y, + instance: h, + options: T + }), O = function() { + }; + b.push(w || O); + } + }); + } + function g() { + b.forEach(function(v) { + return v(); + }), b = []; + } + return h; + }; +} +var Vm = [pm, Sm, im, qf, Em, wm, Rm, tm, xm], Lm = /* @__PURE__ */ jm({ + defaultModifiers: Vm +}); +const $s = "Popper"; +function zm(e) { + return xs($s, e); +} +If($s, ["root"]); +const Fm = ["anchorEl", "children", "direction", "disablePortal", "modifiers", "open", "placement", "popperOptions", "popperRef", "slotProps", "slots", "TransitionProps", "ownerState"], Um = ["anchorEl", "children", "container", "direction", "disablePortal", "keepMounted", "modifiers", "open", "placement", "popperOptions", "popperRef", "style", "transition", "slotProps", "slots"]; +function Gm(e, r) { + if (r === "ltr") + return e; + switch (e) { + case "bottom-end": + return "bottom-start"; + case "bottom-start": + return "bottom-end"; + case "top-end": + return "top-start"; + case "top-start": + return "top-end"; + default: + return e; + } +} +function tn(e) { + return typeof e == "function" ? e() : e; +} +function Sn(e) { + return e.nodeType !== void 0; +} +function Hm(e) { + return !Sn(e); +} +const Xm = () => Eo({ + root: ["root"] +}, Tf(zm)), Wm = {}, Ym = /* @__PURE__ */ D.forwardRef(function(r, t) { + var n; + const { + anchorEl: o, + children: a, + direction: i, + disablePortal: s, + modifiers: c, + open: d, + placement: u, + popperOptions: b, + popperRef: p, + slotProps: h = {}, + slots: f = {}, + TransitionProps: g + // @ts-ignore internal logic + // prevent from spreading to DOM, it can come from the parent component e.g. Select. + } = r, v = Ne(r, Fm), y = D.useRef(null), C = Sr(y, t), T = D.useRef(null), x = Sr(T, p), w = D.useRef(x); + Hr(() => { + w.current = x; + }, [x]), D.useImperativeHandle(p, () => T.current, []); + const O = Gm(u, i), [P, V] = D.useState(O), [S, $] = D.useState(tn(o)); + D.useEffect(() => { + T.current && T.current.forceUpdate(); + }), D.useEffect(() => { + o && $(tn(o)); + }, [o]), Hr(() => { + if (!S || !d) + return; + const J = (ae) => { + V(ae.placement); + }; + if (process.env.NODE_ENV !== "production" && S && Sn(S) && S.nodeType === 1) { + const ae = S.getBoundingClientRect(); + process.env.NODE_ENV !== "test" && ae.top === 0 && ae.left === 0 && ae.right === 0 && ae.bottom === 0 && console.warn(["MUI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join(` +`)); + } + let X = [{ + name: "preventOverflow", + options: { + altBoundary: s + } + }, { + name: "flip", + options: { + altBoundary: s + } + }, { + name: "onUpdate", + enabled: !0, + phase: "afterWrite", + fn: ({ + state: ae + }) => { + J(ae); + } + }]; + c != null && (X = X.concat(c)), b && b.modifiers != null && (X = X.concat(b.modifiers)); + const te = Lm(S, y.current, _({ + placement: O + }, b, { + modifiers: X + })); + return w.current(te), () => { + te.destroy(), w.current(null); + }; + }, [S, s, c, d, b, O]); + const k = { + placement: P + }; + g !== null && (k.TransitionProps = g); + const j = Xm(), B = (n = f.root) != null ? n : "div", Z = Pf({ + elementType: B, + externalSlotProps: h.root, + externalForwardedProps: v, + additionalProps: { + role: "tooltip", + ref: C + }, + ownerState: r, + className: j.root + }); + return /* @__PURE__ */ l(B, _({}, Z, { + children: typeof a == "function" ? a(k) : a + })); +}), _s = /* @__PURE__ */ D.forwardRef(function(r, t) { + const { + anchorEl: n, + children: o, + container: a, + direction: i = "ltr", + disablePortal: s = !1, + keepMounted: c = !1, + modifiers: d, + open: u, + placement: b = "bottom", + popperOptions: p = Wm, + popperRef: h, + style: f, + transition: g = !1, + slotProps: v = {}, + slots: y = {} + } = r, C = Ne(r, Um), [T, x] = D.useState(!0), w = () => { + x(!1); + }, O = () => { + x(!0); + }; + if (!c && !u && (!g || T)) + return null; + let P; + if (a) + P = a; + else if (n) { + const $ = tn(n); + P = $ && Sn($) ? Jt($).body : Jt(null).body; + } + const V = !u && c && (!g || T) ? "none" : void 0, S = g ? { + in: u, + onEnter: w, + onExited: O + } : void 0; + return /* @__PURE__ */ l(en, { + disablePortal: s, + container: P, + children: /* @__PURE__ */ l(Ym, _({ + anchorEl: n, + direction: i, + disablePortal: s, + modifiers: d, + ref: t, + open: g ? !T : u, + placement: b, + popperOptions: p, + popperRef: h, + slotProps: v, + slots: y + }, C, { + style: _({ + // Prevents scroll issue, waiting for Popper.js to add this style once initiated. + position: "fixed", + // Fix Popper.js display issue + top: 0, + left: 0, + display: V + }, f), + TransitionProps: S, + children: o + })) + }); +}); +process.env.NODE_ENV !== "production" && (_s.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/), + * or a function that returns either. + * It's used to set the position of the popper. + * The return value will passed as the reference object of the Popper instance. + */ + anchorEl: ko(m.oneOfType([kt, m.object, m.func]), (e) => { + if (e.open) { + const r = tn(e.anchorEl); + if (r && Sn(r) && r.nodeType === 1) { + const t = r.getBoundingClientRect(); + if (process.env.NODE_ENV !== "test" && t.top === 0 && t.left === 0 && t.right === 0 && t.bottom === 0) + return new Error(["MUI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join(` +`)); + } else if (!r || typeof r.getBoundingClientRect != "function" || Hm(r) && r.contextElement != null && r.contextElement.nodeType !== 1) + return new Error(["MUI: The `anchorEl` prop provided to the component is invalid.", "It should be an HTML element instance or a virtualElement ", "(https://popper.js.org/docs/v2/virtual-elements/)."].join(` +`)); + } + return null; + }), + /** + * Popper render function or node. + */ + children: m.oneOfType([m.node, m.func]), + /** + * An HTML element or function that returns one. + * The `container` will have the portal children appended to it. + * + * You can also provide a callback, which is called in a React layout effect. + * This lets you set the container from a ref, and also makes server-side rendering possible. + * + * By default, it uses the body of the top-level document object, + * so it's simply `document.body` most of the time. + */ + container: m.oneOfType([kt, m.func]), + /** + * Direction of the text. + * @default 'ltr' + */ + direction: m.oneOf(["ltr", "rtl"]), + /** + * The `children` will be under the DOM hierarchy of the parent component. + * @default false + */ + disablePortal: m.bool, + /** + * Always keep the children in the DOM. + * This prop can be useful in SEO situation or + * when you want to maximize the responsiveness of the Popper. + * @default false + */ + keepMounted: m.bool, + /** + * Popper.js is based on a "plugin-like" architecture, + * most of its features are fully encapsulated "modifiers". + * + * A modifier is a function that is called each time Popper.js needs to + * compute the position of the popper. + * For this reason, modifiers should be very performant to avoid bottlenecks. + * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/). + */ + modifiers: m.arrayOf(m.shape({ + data: m.object, + effect: m.func, + enabled: m.bool, + fn: m.func, + name: m.any, + options: m.object, + phase: m.oneOf(["afterMain", "afterRead", "afterWrite", "beforeMain", "beforeRead", "beforeWrite", "main", "read", "write"]), + requires: m.arrayOf(m.string), + requiresIfExists: m.arrayOf(m.string) + })), + /** + * If `true`, the component is shown. + */ + open: m.bool.isRequired, + /** + * Popper placement. + * @default 'bottom' + */ + placement: m.oneOf(["auto-end", "auto-start", "auto", "bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), + /** + * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance. + * @default {} + */ + popperOptions: m.shape({ + modifiers: m.array, + onFirstUpdate: m.func, + placement: m.oneOf(["auto-end", "auto-start", "auto", "bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), + strategy: m.oneOf(["absolute", "fixed"]) + }), + /** + * A ref that points to the used popper instance. + */ + popperRef: os, + /** + * The props used for each slot inside the Popper. + * @default {} + */ + slotProps: m.shape({ + root: m.oneOfType([m.func, m.object]) + }), + /** + * The components used for each slot inside the Popper. + * Either a string to use a HTML element or a component. + * @default {} + */ + slots: m.shape({ + root: m.elementType + }), + /** + * Help supporting a react-transition-group/Transition component. + * @default false + */ + transition: m.bool +}); +function Is() { + const e = gs($o); + return process.env.NODE_ENV !== "production" && D.useDebugValue(e), e[_o] || e; +} +function po(e, r) { + return po = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(n, o) { + return n.__proto__ = o, n; + }, po(e, r); +} +function qm(e, r) { + e.prototype = Object.create(r.prototype), e.prototype.constructor = e, po(e, r); +} +const Za = { + disabled: !1 +}; +var Km = process.env.NODE_ENV !== "production" ? m.oneOfType([m.number, m.shape({ + enter: m.number, + exit: m.number, + appear: m.number +}).isRequired]) : null; +process.env.NODE_ENV !== "production" && m.oneOfType([m.string, m.shape({ + enter: m.string, + exit: m.string, + active: m.string +}), m.shape({ + enter: m.string, + enterDone: m.string, + enterActive: m.string, + exit: m.string, + exitDone: m.string, + exitActive: m.string +})]); +const As = M.createContext(null); +var Jm = function(r) { + return r.scrollTop; +}, dt = "unmounted", br = "exited", wr = "entering", Vr = "entered", lo = "exiting", tr = /* @__PURE__ */ function(e) { + qm(r, e); + function r(n, o) { + var a; + a = e.call(this, n, o) || this; + var i = o, s = i && !i.isMounting ? n.enter : n.appear, c; + return a.appearStatus = null, n.in ? s ? (c = br, a.appearStatus = wr) : c = Vr : n.unmountOnExit || n.mountOnEnter ? c = dt : c = br, a.state = { + status: c + }, a.nextCallback = null, a; + } + r.getDerivedStateFromProps = function(o, a) { + var i = o.in; + return i && a.status === dt ? { + status: br + } : null; + }; + var t = r.prototype; + return t.componentDidMount = function() { + this.updateStatus(!0, this.appearStatus); + }, t.componentDidUpdate = function(o) { + var a = null; + if (o !== this.props) { + var i = this.state.status; + this.props.in ? i !== wr && i !== Vr && (a = wr) : (i === wr || i === Vr) && (a = lo); + } + this.updateStatus(!1, a); + }, t.componentWillUnmount = function() { + this.cancelNextCallback(); + }, t.getTimeouts = function() { + var o = this.props.timeout, a, i, s; + return a = i = s = o, o != null && typeof o != "number" && (a = o.exit, i = o.enter, s = o.appear !== void 0 ? o.appear : i), { + exit: a, + enter: i, + appear: s + }; + }, t.updateStatus = function(o, a) { + if (o === void 0 && (o = !1), a !== null) + if (this.cancelNextCallback(), a === wr) { + if (this.props.unmountOnExit || this.props.mountOnEnter) { + var i = this.props.nodeRef ? this.props.nodeRef.current : Vt.findDOMNode(this); + i && Jm(i); + } + this.performEnter(o); + } else + this.performExit(); + else + this.props.unmountOnExit && this.state.status === br && this.setState({ + status: dt + }); + }, t.performEnter = function(o) { + var a = this, i = this.props.enter, s = this.context ? this.context.isMounting : o, c = this.props.nodeRef ? [s] : [Vt.findDOMNode(this), s], d = c[0], u = c[1], b = this.getTimeouts(), p = s ? b.appear : b.enter; + if (!o && !i || Za.disabled) { + this.safeSetState({ + status: Vr + }, function() { + a.props.onEntered(d); + }); + return; + } + this.props.onEnter(d, u), this.safeSetState({ + status: wr + }, function() { + a.props.onEntering(d, u), a.onTransitionEnd(p, function() { + a.safeSetState({ + status: Vr + }, function() { + a.props.onEntered(d, u); + }); + }); + }); + }, t.performExit = function() { + var o = this, a = this.props.exit, i = this.getTimeouts(), s = this.props.nodeRef ? void 0 : Vt.findDOMNode(this); + if (!a || Za.disabled) { + this.safeSetState({ + status: br + }, function() { + o.props.onExited(s); + }); + return; + } + this.props.onExit(s), this.safeSetState({ + status: lo + }, function() { + o.props.onExiting(s), o.onTransitionEnd(i.exit, function() { + o.safeSetState({ + status: br + }, function() { + o.props.onExited(s); + }); + }); + }); + }, t.cancelNextCallback = function() { + this.nextCallback !== null && (this.nextCallback.cancel(), this.nextCallback = null); + }, t.safeSetState = function(o, a) { + a = this.setNextCallback(a), this.setState(o, a); + }, t.setNextCallback = function(o) { + var a = this, i = !0; + return this.nextCallback = function(s) { + i && (i = !1, a.nextCallback = null, o(s)); + }, this.nextCallback.cancel = function() { + i = !1; + }, this.nextCallback; + }, t.onTransitionEnd = function(o, a) { + this.setNextCallback(a); + var i = this.props.nodeRef ? this.props.nodeRef.current : Vt.findDOMNode(this), s = o == null && !this.props.addEndListener; + if (!i || s) { + setTimeout(this.nextCallback, 0); + return; + } + if (this.props.addEndListener) { + var c = this.props.nodeRef ? [this.nextCallback] : [i, this.nextCallback], d = c[0], u = c[1]; + this.props.addEndListener(d, u); + } + o != null && setTimeout(this.nextCallback, o); + }, t.render = function() { + var o = this.state.status; + if (o === dt) + return null; + var a = this.props, i = a.children; + a.in, a.mountOnEnter, a.unmountOnExit, a.appear, a.enter, a.exit, a.timeout, a.addEndListener, a.onEnter, a.onEntering, a.onEntered, a.onExit, a.onExiting, a.onExited, a.nodeRef; + var s = Ne(a, ["children", "in", "mountOnEnter", "unmountOnExit", "appear", "enter", "exit", "timeout", "addEndListener", "onEnter", "onEntering", "onEntered", "onExit", "onExiting", "onExited", "nodeRef"]); + return ( + // allows for nested Transitions + /* @__PURE__ */ M.createElement(As.Provider, { + value: null + }, typeof i == "function" ? i(o, s) : M.cloneElement(M.Children.only(i), s)) + ); + }, r; +}(M.Component); +tr.contextType = As; +tr.propTypes = process.env.NODE_ENV !== "production" ? { + /** + * A React reference to DOM element that need to transition: + * https://stackoverflow.com/a/51127130/4671932 + * + * - When `nodeRef` prop is used, `node` is not passed to callback functions + * (e.g. `onEnter`) because user already has direct access to the node. + * - When changing `key` prop of `Transition` in a `TransitionGroup` a new + * `nodeRef` need to be provided to `Transition` with changed `key` prop + * (see + * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)). + */ + nodeRef: m.shape({ + current: typeof Element > "u" ? m.any : function(e, r, t, n, o, a) { + var i = e[r]; + return m.instanceOf(i && "ownerDocument" in i ? i.ownerDocument.defaultView.Element : Element)(e, r, t, n, o, a); + } + }), + /** + * A `function` child can be used instead of a React element. This function is + * called with the current transition status (`'entering'`, `'entered'`, + * `'exiting'`, `'exited'`), which can be used to apply context + * specific props to a component. + * + * ```jsx + * + * {state => ( + * + * )} + * + * ``` + */ + children: m.oneOfType([m.func.isRequired, m.element.isRequired]).isRequired, + /** + * Show the component; triggers the enter or exit states + */ + in: m.bool, + /** + * By default the child component is mounted immediately along with + * the parent `Transition` component. If you want to "lazy mount" the component on the + * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay + * mounted, even on "exited", unless you also specify `unmountOnExit`. + */ + mountOnEnter: m.bool, + /** + * By default the child component stays mounted after it reaches the `'exited'` state. + * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting. + */ + unmountOnExit: m.bool, + /** + * By default the child component does not perform the enter transition when + * it first mounts, regardless of the value of `in`. If you want this + * behavior, set both `appear` and `in` to `true`. + * + * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop + * > only adds an additional enter transition. However, in the + * > `` component that first enter transition does result in + * > additional `.appear-*` classes, that way you can choose to style it + * > differently. + */ + appear: m.bool, + /** + * Enable or disable enter transitions. + */ + enter: m.bool, + /** + * Enable or disable exit transitions. + */ + exit: m.bool, + /** + * The duration of the transition, in milliseconds. + * Required unless `addEndListener` is provided. + * + * You may specify a single timeout for all transitions: + * + * ```jsx + * timeout={500} + * ``` + * + * or individually: + * + * ```jsx + * timeout={{ + * appear: 500, + * enter: 300, + * exit: 500, + * }} + * ``` + * + * - `appear` defaults to the value of `enter` + * - `enter` defaults to `0` + * - `exit` defaults to `0` + * + * @type {number | { enter?: number, exit?: number, appear?: number }} + */ + timeout: function(r) { + var t = Km; + r.addEndListener || (t = t.isRequired); + for (var n = arguments.length, o = new Array(n > 1 ? n - 1 : 0), a = 1; a < n; a++) + o[a - 1] = arguments[a]; + return t.apply(void 0, [r].concat(o)); + }, + /** + * Add a custom transition end trigger. Called with the transitioning + * DOM node and a `done` callback. Allows for more fine grained transition end + * logic. Timeouts are still used as a fallback if provided. + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * ```jsx + * addEndListener={(node, done) => { + * // use the css transitionend event to mark the finish of a transition + * node.addEventListener('transitionend', done, false); + * }} + * ``` + */ + addEndListener: m.func, + /** + * Callback fired before the "entering" status is applied. An extra parameter + * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * @type Function(node: HtmlElement, isAppearing: bool) -> void + */ + onEnter: m.func, + /** + * Callback fired after the "entering" status is applied. An extra parameter + * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * @type Function(node: HtmlElement, isAppearing: bool) + */ + onEntering: m.func, + /** + * Callback fired after the "entered" status is applied. An extra parameter + * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * @type Function(node: HtmlElement, isAppearing: bool) -> void + */ + onEntered: m.func, + /** + * Callback fired before the "exiting" status is applied. + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * @type Function(node: HtmlElement) -> void + */ + onExit: m.func, + /** + * Callback fired after the "exiting" status is applied. + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed. + * + * @type Function(node: HtmlElement) -> void + */ + onExiting: m.func, + /** + * Callback fired after the "exited" status is applied. + * + * **Note**: when `nodeRef` prop is passed, `node` is not passed + * + * @type Function(node: HtmlElement) -> void + */ + onExited: m.func +} : {}; +function jr() { +} +tr.defaultProps = { + in: !1, + mountOnEnter: !1, + unmountOnExit: !1, + appear: !1, + enter: !0, + exit: !0, + onEnter: jr, + onEntering: jr, + onEntered: jr, + onExit: jr, + onExiting: jr, + onExited: jr +}; +tr.UNMOUNTED = dt; +tr.EXITED = br; +tr.ENTERING = wr; +tr.ENTERED = Vr; +tr.EXITING = lo; +const Zm = tr, Qm = (e) => e.scrollTop; +function Qa(e, r) { + var t, n; + const { + timeout: o, + easing: a, + style: i = {} + } = e; + return { + duration: (t = i.transitionDuration) != null ? t : typeof o == "number" ? o : o[r.mode] || 0, + easing: (n = i.transitionTimingFunction) != null ? n : typeof a == "object" ? a[r.mode] : a, + delay: i.transitionDelay + }; +} +const eh = ["addEndListener", "appear", "children", "easing", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]; +function co(e) { + return `scale(${e}, ${e ** 2})`; +} +const rh = { + entering: { + opacity: 1, + transform: co(1) + }, + entered: { + opacity: 1, + transform: "none" + } +}, Xn = typeof navigator < "u" && /^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent) && /(os |version\/)15(.|_)4/i.test(navigator.userAgent), Fo = /* @__PURE__ */ D.forwardRef(function(r, t) { + const { + addEndListener: n, + appear: o = !0, + children: a, + easing: i, + in: s, + onEnter: c, + onEntered: d, + onEntering: u, + onExit: b, + onExited: p, + onExiting: h, + style: f, + timeout: g = "auto", + // eslint-disable-next-line react/prop-types + TransitionComponent: v = Zm + } = r, y = Ne(r, eh), C = lt(), T = D.useRef(), x = Is(), w = D.useRef(null), O = Sr(w, a.ref, t), P = (J) => (X) => { + if (J) { + const te = w.current; + X === void 0 ? J(te) : J(te, X); + } + }, V = P(u), S = P((J, X) => { + Qm(J); + const { + duration: te, + delay: ae, + easing: z + } = Qa({ + style: f, + timeout: g, + easing: i + }, { + mode: "enter" + }); + let N; + g === "auto" ? (N = x.transitions.getAutoHeightDuration(J.clientHeight), T.current = N) : N = te, J.style.transition = [x.transitions.create("opacity", { + duration: N, + delay: ae + }), x.transitions.create("transform", { + duration: Xn ? N : N * 0.666, + delay: ae, + easing: z + })].join(","), c && c(J, X); + }), $ = P(d), k = P(h), j = P((J) => { + const { + duration: X, + delay: te, + easing: ae + } = Qa({ + style: f, + timeout: g, + easing: i + }, { + mode: "exit" + }); + let z; + g === "auto" ? (z = x.transitions.getAutoHeightDuration(J.clientHeight), T.current = z) : z = X, J.style.transition = [x.transitions.create("opacity", { + duration: z, + delay: te + }), x.transitions.create("transform", { + duration: Xn ? z : z * 0.666, + delay: Xn ? te : te || z * 0.333, + easing: ae + })].join(","), J.style.opacity = 0, J.style.transform = co(0.75), b && b(J); + }), B = P(p); + return /* @__PURE__ */ l(v, _({ + appear: o, + in: s, + nodeRef: w, + onEnter: S, + onEntered: $, + onEntering: V, + onExit: j, + onExited: B, + onExiting: k, + addEndListener: (J) => { + g === "auto" && C.start(T.current || 0, J), n && n(w.current, J); + }, + timeout: g === "auto" ? null : g + }, y, { + children: (J, X) => /* @__PURE__ */ D.cloneElement(a, _({ + style: _({ + opacity: 0, + transform: co(0.75), + visibility: J === "exited" && !s ? "hidden" : void 0 + }, rh[J], f, a.props.style), + ref: O + }, X)) + })); +}); +process.env.NODE_ENV !== "production" && (Fo.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the d.ts file and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * Add a custom transition end trigger. Called with the transitioning DOM + * node and a done callback. Allows for more fine grained transition end + * logic. Note: Timeouts are still used as a fallback if provided. + */ + addEndListener: m.func, + /** + * Perform the enter transition when it first mounts if `in` is also `true`. + * Set this to `false` to disable this behavior. + * @default true + */ + appear: m.bool, + /** + * A single child content element. + */ + children: ts.isRequired, + /** + * The transition timing function. + * You may specify a single easing or a object containing enter and exit values. + */ + easing: m.oneOfType([m.shape({ + enter: m.string, + exit: m.string + }), m.string]), + /** + * If `true`, the component will transition in. + */ + in: m.bool, + /** + * @ignore + */ + onEnter: m.func, + /** + * @ignore + */ + onEntered: m.func, + /** + * @ignore + */ + onEntering: m.func, + /** + * @ignore + */ + onExit: m.func, + /** + * @ignore + */ + onExited: m.func, + /** + * @ignore + */ + onExiting: m.func, + /** + * @ignore + */ + style: m.object, + /** + * The duration for the transition, in milliseconds. + * You may specify a single timeout for all transitions, or individually with an object. + * + * Set to 'auto' to automatically calculate transition time based on height. + * @default 'auto' + */ + timeout: m.oneOfType([m.oneOf(["auto"]), m.number, m.shape({ + appear: m.number, + enter: m.number, + exit: m.number + })]) +}); +Fo.muiSupportAuto = !0; +const ei = Fo, th = ["anchorEl", "component", "components", "componentsProps", "container", "disablePortal", "keepMounted", "modifiers", "open", "placement", "popperOptions", "popperRef", "transition", "slots", "slotProps"], nh = $t(_s, { + name: "MuiPopper", + slot: "Root", + overridesResolver: (e, r) => r.root +})({}), Ds = /* @__PURE__ */ D.forwardRef(function(r, t) { + var n; + const o = hs(), a = Io({ + props: r, + name: "MuiPopper" + }), { + anchorEl: i, + component: s, + components: c, + componentsProps: d, + container: u, + disablePortal: b, + keepMounted: p, + modifiers: h, + open: f, + placement: g, + popperOptions: v, + popperRef: y, + transition: C, + slots: T, + slotProps: x + } = a, w = Ne(a, th), O = (n = T == null ? void 0 : T.root) != null ? n : c == null ? void 0 : c.Root, P = _({ + anchorEl: i, + container: u, + disablePortal: b, + keepMounted: p, + modifiers: h, + open: f, + placement: g, + popperOptions: v, + popperRef: y, + transition: C + }, w); + return /* @__PURE__ */ l(nh, _({ + as: s, + direction: o == null ? void 0 : o.direction, + slots: { + root: O + }, + slotProps: x ?? d + }, P, { + ref: t + })); +}); +process.env.NODE_ENV !== "production" && (Ds.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/), + * or a function that returns either. + * It's used to set the position of the popper. + * The return value will passed as the reference object of the Popper instance. + */ + anchorEl: m.oneOfType([kt, m.object, m.func]), + /** + * Popper render function or node. + */ + children: m.oneOfType([m.node, m.func]), + /** + * The component used for the root node. + * Either a string to use a HTML element or a component. + */ + component: m.elementType, + /** + * The components used for each slot inside the Popper. + * Either a string to use a HTML element or a component. + * @default {} + */ + components: m.shape({ + Root: m.elementType + }), + /** + * The props used for each slot inside the Popper. + * @default {} + */ + componentsProps: m.shape({ + root: m.oneOfType([m.func, m.object]) + }), + /** + * An HTML element or function that returns one. + * The `container` will have the portal children appended to it. + * + * You can also provide a callback, which is called in a React layout effect. + * This lets you set the container from a ref, and also makes server-side rendering possible. + * + * By default, it uses the body of the top-level document object, + * so it's simply `document.body` most of the time. + */ + container: m.oneOfType([kt, m.func]), + /** + * The `children` will be under the DOM hierarchy of the parent component. + * @default false + */ + disablePortal: m.bool, + /** + * Always keep the children in the DOM. + * This prop can be useful in SEO situation or + * when you want to maximize the responsiveness of the Popper. + * @default false + */ + keepMounted: m.bool, + /** + * Popper.js is based on a "plugin-like" architecture, + * most of its features are fully encapsulated "modifiers". + * + * A modifier is a function that is called each time Popper.js needs to + * compute the position of the popper. + * For this reason, modifiers should be very performant to avoid bottlenecks. + * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/). + */ + modifiers: m.arrayOf(m.shape({ + data: m.object, + effect: m.func, + enabled: m.bool, + fn: m.func, + name: m.any, + options: m.object, + phase: m.oneOf(["afterMain", "afterRead", "afterWrite", "beforeMain", "beforeRead", "beforeWrite", "main", "read", "write"]), + requires: m.arrayOf(m.string), + requiresIfExists: m.arrayOf(m.string) + })), + /** + * If `true`, the component is shown. + */ + open: m.bool.isRequired, + /** + * Popper placement. + * @default 'bottom' + */ + placement: m.oneOf(["auto-end", "auto-start", "auto", "bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), + /** + * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance. + * @default {} + */ + popperOptions: m.shape({ + modifiers: m.array, + onFirstUpdate: m.func, + placement: m.oneOf(["auto-end", "auto-start", "auto", "bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), + strategy: m.oneOf(["absolute", "fixed"]) + }), + /** + * A ref that points to the used popper instance. + */ + popperRef: os, + /** + * The props used for each slot inside the Popper. + * @default {} + */ + slotProps: m.shape({ + root: m.oneOfType([m.func, m.object]) + }), + /** + * The components used for each slot inside the Popper. + * Either a string to use a HTML element or a component. + * @default {} + */ + slots: m.shape({ + root: m.elementType + }), + /** + * The system prop that allows defining system overrides as well as additional CSS styles. + */ + sx: m.oneOfType([m.arrayOf(m.oneOfType([m.func, m.object, m.bool])), m.func, m.object]), + /** + * Help supporting a react-transition-group/Transition component. + * @default false + */ + transition: m.bool +}); +const Ms = Ds; +function oh(e) { + return hn("MuiTooltip", e); +} +const ah = ds("MuiTooltip", ["popper", "popperInteractive", "popperArrow", "popperClose", "tooltip", "tooltipArrow", "touch", "tooltipPlacementLeft", "tooltipPlacementRight", "tooltipPlacementTop", "tooltipPlacementBottom", "arrow"]), sr = ah, ih = ["arrow", "children", "classes", "components", "componentsProps", "describeChild", "disableFocusListener", "disableHoverListener", "disableInteractive", "disableTouchListener", "enterDelay", "enterNextDelay", "enterTouchDelay", "followCursor", "id", "leaveDelay", "leaveTouchDelay", "onClose", "onOpen", "open", "placement", "PopperComponent", "PopperProps", "slotProps", "slots", "title", "TransitionComponent", "TransitionProps"]; +function sh(e) { + return Math.round(e * 1e5) / 1e5; +} +const ph = (e) => { + const { + classes: r, + disableInteractive: t, + arrow: n, + touch: o, + placement: a + } = e, i = { + popper: ["popper", !t && "popperInteractive", n && "popperArrow"], + tooltip: ["tooltip", n && "tooltipArrow", o && "touch", `tooltipPlacement${Ye(a.split("-")[0])}`], + arrow: ["arrow"] + }; + return Eo(i, oh, r); +}, lh = $t(Ms, { + name: "MuiTooltip", + slot: "Popper", + overridesResolver: (e, r) => { + const { + ownerState: t + } = e; + return [r.popper, !t.disableInteractive && r.popperInteractive, t.arrow && r.popperArrow, !t.open && r.popperClose]; + } +})(({ + theme: e, + ownerState: r, + open: t +}) => _({ + zIndex: (e.vars || e).zIndex.tooltip, + pointerEvents: "none" +}, !r.disableInteractive && { + pointerEvents: "auto" +}, !t && { + pointerEvents: "none" +}, r.arrow && { + [`&[data-popper-placement*="bottom"] .${sr.arrow}`]: { + top: 0, + marginTop: "-0.71em", + "&::before": { + transformOrigin: "0 100%" + } + }, + [`&[data-popper-placement*="top"] .${sr.arrow}`]: { + bottom: 0, + marginBottom: "-0.71em", + "&::before": { + transformOrigin: "100% 0" + } + }, + [`&[data-popper-placement*="right"] .${sr.arrow}`]: _({}, r.isRtl ? { + right: 0, + marginRight: "-0.71em" + } : { + left: 0, + marginLeft: "-0.71em" + }, { + height: "1em", + width: "0.71em", + "&::before": { + transformOrigin: "100% 100%" + } + }), + [`&[data-popper-placement*="left"] .${sr.arrow}`]: _({}, r.isRtl ? { + left: 0, + marginLeft: "-0.71em" + } : { + right: 0, + marginRight: "-0.71em" + }, { + height: "1em", + width: "0.71em", + "&::before": { + transformOrigin: "0 0" + } + }) +})), ch = $t("div", { + name: "MuiTooltip", + slot: "Tooltip", + overridesResolver: (e, r) => { + const { + ownerState: t + } = e; + return [r.tooltip, t.touch && r.touch, t.arrow && r.tooltipArrow, r[`tooltipPlacement${Ye(t.placement.split("-")[0])}`]]; + } +})(({ + theme: e, + ownerState: r +}) => _({ + backgroundColor: e.vars ? e.vars.palette.Tooltip.bg : vs(e.palette.grey[700], 0.92), + borderRadius: (e.vars || e).shape.borderRadius, + color: (e.vars || e).palette.common.white, + fontFamily: e.typography.fontFamily, + padding: "4px 8px", + fontSize: e.typography.pxToRem(11), + maxWidth: 300, + margin: 2, + wordWrap: "break-word", + fontWeight: e.typography.fontWeightMedium +}, r.arrow && { + position: "relative", + margin: 0 +}, r.touch && { + padding: "8px 16px", + fontSize: e.typography.pxToRem(14), + lineHeight: `${sh(16 / 14)}em`, + fontWeight: e.typography.fontWeightRegular +}, { + [`.${sr.popper}[data-popper-placement*="left"] &`]: _({ + transformOrigin: "right center" + }, r.isRtl ? _({ + marginLeft: "14px" + }, r.touch && { + marginLeft: "24px" + }) : _({ + marginRight: "14px" + }, r.touch && { + marginRight: "24px" + })), + [`.${sr.popper}[data-popper-placement*="right"] &`]: _({ + transformOrigin: "left center" + }, r.isRtl ? _({ + marginRight: "14px" + }, r.touch && { + marginRight: "24px" + }) : _({ + marginLeft: "14px" + }, r.touch && { + marginLeft: "24px" + })), + [`.${sr.popper}[data-popper-placement*="top"] &`]: _({ + transformOrigin: "center bottom", + marginBottom: "14px" + }, r.touch && { + marginBottom: "24px" + }), + [`.${sr.popper}[data-popper-placement*="bottom"] &`]: _({ + transformOrigin: "center top", + marginTop: "14px" + }, r.touch && { + marginTop: "24px" + }) +})), dh = $t("span", { + name: "MuiTooltip", + slot: "Arrow", + overridesResolver: (e, r) => r.arrow +})(({ + theme: e +}) => ({ + overflow: "hidden", + position: "absolute", + width: "1em", + height: "0.71em", + boxSizing: "border-box", + color: e.vars ? e.vars.palette.Tooltip.bg : vs(e.palette.grey[700], 0.9), + "&::before": { + content: '""', + margin: "auto", + display: "block", + width: "100%", + height: "100%", + backgroundColor: "currentColor", + transform: "rotate(45deg)" + } +})); +let Ut = !1; +const ri = new Ot(); +let it = { + x: 0, + y: 0 +}; +function Gt(e, r) { + return (t) => { + r && r(t), e(t); + }; +} +const Bs = /* @__PURE__ */ D.forwardRef(function(r, t) { + var n, o, a, i, s, c, d, u, b, p, h, f, g, v, y, C, T, x, w; + const O = Io({ + props: r, + name: "MuiTooltip" + }), { + arrow: P = !1, + children: V, + components: S = {}, + componentsProps: $ = {}, + describeChild: k = !1, + disableFocusListener: j = !1, + disableHoverListener: B = !1, + disableInteractive: Z = !1, + disableTouchListener: J = !1, + enterDelay: X = 100, + enterNextDelay: te = 0, + enterTouchDelay: ae = 700, + followCursor: z = !1, + id: N, + leaveDelay: I = 0, + leaveTouchDelay: W = 1500, + onClose: U, + onOpen: F, + open: q, + placement: G = "bottom", + PopperComponent: K, + PopperProps: Y = {}, + slotProps: Q = {}, + slots: ee = {}, + title: de, + TransitionComponent: A = ei, + TransitionProps: ke + } = O, L = Ne(O, ih), xe = /* @__PURE__ */ D.isValidElement(V) ? V : /* @__PURE__ */ l("span", { + children: V + }), ze = Is(), fr = ze.direction === "rtl", [Ee, Dt] = D.useState(), [Fe, Rr] = D.useState(null), mr = D.useRef(!1), Pr = Z || z, $r = lt(), _r = lt(), hr = lt(), Jr = lt(), [Mt, Ho] = is({ + controlled: q, + default: !1, + name: "Tooltip", + state: "open" + }); + let Ke = Mt; + if (process.env.NODE_ENV !== "production") { + const { + current: re + } = D.useRef(q !== void 0); + D.useEffect(() => { + Ee && Ee.disabled && !re && de !== "" && Ee.tagName.toLowerCase() === "button" && console.error(["MUI: You are providing a disabled `button` child to the Tooltip component.", "A disabled element does not fire events.", "Tooltip needs to listen to the child element's events to display the title.", "", "Add a simple wrapper element, such as a `span`."].join(` +`)); + }, [de, Ee, re]); + } + const On = as(N), Zr = D.useRef(), Bt = oo(() => { + Zr.current !== void 0 && (document.body.style.WebkitUserSelect = Zr.current, Zr.current = void 0), Jr.clear(); + }); + D.useEffect(() => Bt, [Bt]); + const Xo = (re) => { + ri.clear(), Ut = !0, Ho(!0), F && !Ke && F(re); + }, jt = oo( + /** + * @param {React.SyntheticEvent | Event} event + */ + (re) => { + ri.start(800 + I, () => { + Ut = !1; + }), Ho(!1), U && Ke && U(re), $r.start(ze.transitions.duration.shortest, () => { + mr.current = !1; + }); + } + ), Rn = (re) => { + mr.current && re.type !== "touchstart" || (Ee && Ee.removeAttribute("title"), _r.clear(), hr.clear(), X || Ut && te ? _r.start(Ut ? te : X, () => { + Xo(re); + }) : Xo(re)); + }, Wo = (re) => { + _r.clear(), hr.start(I, () => { + jt(re); + }); + }, { + isFocusVisibleRef: Yo, + onBlur: ip, + onFocus: sp, + ref: pp + } = ss(), [, qo] = D.useState(!1), Ko = (re) => { + ip(re), Yo.current === !1 && (qo(!1), Wo(re)); + }, Jo = (re) => { + Ee || Dt(re.currentTarget), sp(re), Yo.current === !0 && (qo(!0), Rn(re)); + }, Zo = (re) => { + mr.current = !0; + const $e = xe.props; + $e.onTouchStart && $e.onTouchStart(re); + }, Qo = Rn, ea = Wo, lp = (re) => { + Zo(re), hr.clear(), $r.clear(), Bt(), Zr.current = document.body.style.WebkitUserSelect, document.body.style.WebkitUserSelect = "none", Jr.start(ae, () => { + document.body.style.WebkitUserSelect = Zr.current, Rn(re); + }); + }, cp = (re) => { + xe.props.onTouchEnd && xe.props.onTouchEnd(re), Bt(), hr.start(W, () => { + jt(re); + }); + }; + D.useEffect(() => { + if (!Ke) + return; + function re($e) { + ($e.key === "Escape" || $e.key === "Esc") && jt($e); + } + return document.addEventListener("keydown", re), () => { + document.removeEventListener("keydown", re); + }; + }, [jt, Ke]); + const dp = Sr(xe.ref, pp, Dt, t); + !de && de !== 0 && (Ke = !1); + const Pn = D.useRef(), up = (re) => { + const $e = xe.props; + $e.onMouseMove && $e.onMouseMove(re), it = { + x: re.clientX, + y: re.clientY + }, Pn.current && Pn.current.update(); + }, Qr = {}, $n = typeof de == "string"; + k ? (Qr.title = !Ke && $n && !B ? de : null, Qr["aria-describedby"] = Ke ? On : null) : (Qr["aria-label"] = $n ? de : null, Qr["aria-labelledby"] = Ke && !$n ? On : null); + const De = _({}, Qr, L, xe.props, { + className: Nr(L.className, xe.props.className), + onTouchStart: Zo, + ref: dp + }, z ? { + onMouseMove: up + } : {}); + process.env.NODE_ENV !== "production" && (De["data-mui-internal-clone-element"] = !0, D.useEffect(() => { + Ee && !Ee.getAttribute("data-mui-internal-clone-element") && console.error(["MUI: The `children` component of the Tooltip is not forwarding its props correctly.", "Please make sure that props are spread on the same element that the ref is applied to."].join(` +`)); + }, [Ee])); + const et = {}; + J || (De.onTouchStart = lp, De.onTouchEnd = cp), B || (De.onMouseOver = Gt(Qo, De.onMouseOver), De.onMouseLeave = Gt(ea, De.onMouseLeave), Pr || (et.onMouseOver = Qo, et.onMouseLeave = ea)), j || (De.onFocus = Gt(Jo, De.onFocus), De.onBlur = Gt(Ko, De.onBlur), Pr || (et.onFocus = Jo, et.onBlur = Ko)), process.env.NODE_ENV !== "production" && xe.props.title && console.error(["MUI: You have provided a `title` prop to the child of .", `Remove this title prop \`${xe.props.title}\` or the Tooltip component.`].join(` +`)); + const fp = D.useMemo(() => { + var re; + let $e = [{ + name: "arrow", + enabled: !!Fe, + options: { + element: Fe, + padding: 4 + } + }]; + return (re = Y.popperOptions) != null && re.modifiers && ($e = $e.concat(Y.popperOptions.modifiers)), _({}, Y.popperOptions, { + modifiers: $e + }); + }, [Fe, Y]), rt = _({}, O, { + isRtl: fr, + arrow: P, + disableInteractive: Pr, + placement: G, + PopperComponentProp: K, + touch: mr.current + }), _n = ph(rt), ra = (n = (o = ee.popper) != null ? o : S.Popper) != null ? n : lh, ta = (a = (i = (s = ee.transition) != null ? s : S.Transition) != null ? i : A) != null ? a : ei, na = (c = (d = ee.tooltip) != null ? d : S.Tooltip) != null ? c : ch, oa = (u = (b = ee.arrow) != null ? b : S.Arrow) != null ? u : dh, mp = ct(ra, _({}, Y, (p = Q.popper) != null ? p : $.popper, { + className: Nr(_n.popper, Y == null ? void 0 : Y.className, (h = (f = Q.popper) != null ? f : $.popper) == null ? void 0 : h.className) + }), rt), hp = ct(ta, _({}, ke, (g = Q.transition) != null ? g : $.transition), rt), gp = ct(na, _({}, (v = Q.tooltip) != null ? v : $.tooltip, { + className: Nr(_n.tooltip, (y = (C = Q.tooltip) != null ? C : $.tooltip) == null ? void 0 : y.className) + }), rt), vp = ct(oa, _({}, (T = Q.arrow) != null ? T : $.arrow, { + className: Nr(_n.arrow, (x = (w = Q.arrow) != null ? w : $.arrow) == null ? void 0 : x.className) + }), rt); + return /* @__PURE__ */ E(D.Fragment, { + children: [/* @__PURE__ */ D.cloneElement(xe, De), /* @__PURE__ */ l(ra, _({ + as: K ?? Ms, + placement: G, + anchorEl: z ? { + getBoundingClientRect: () => ({ + top: it.y, + left: it.x, + right: it.x, + bottom: it.y, + width: 0, + height: 0 + }) + } : Ee, + popperRef: Pn, + open: Ee ? Ke : !1, + id: On, + transition: !0 + }, et, mp, { + popperOptions: fp, + children: ({ + TransitionProps: re + }) => /* @__PURE__ */ l(ta, _({ + timeout: ze.transitions.duration.shorter + }, re, hp, { + children: /* @__PURE__ */ E(na, _({}, gp, { + children: [de, P ? /* @__PURE__ */ l(oa, _({}, vp, { + ref: Rr + })) : null] + })) + })) + }))] + }); +}); +process.env.NODE_ENV !== "production" && (Bs.propTypes = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the d.ts file and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * If `true`, adds an arrow to the tooltip. + * @default false + */ + arrow: m.bool, + /** + * Tooltip reference element. + */ + children: ts.isRequired, + /** + * Override or extend the styles applied to the component. + */ + classes: m.object, + /** + * @ignore + */ + className: m.string, + /** + * The components used for each slot inside. + * + * This prop is an alias for the `slots` prop. + * It's recommended to use the `slots` prop instead. + * + * @default {} + */ + components: m.shape({ + Arrow: m.elementType, + Popper: m.elementType, + Tooltip: m.elementType, + Transition: m.elementType + }), + /** + * The extra props for the slot components. + * You can override the existing props or add new ones. + * + * This prop is an alias for the `slotProps` prop. + * It's recommended to use the `slotProps` prop instead, as `componentsProps` will be deprecated in the future. + * + * @default {} + */ + componentsProps: m.shape({ + arrow: m.object, + popper: m.object, + tooltip: m.object, + transition: m.object + }), + /** + * Set to `true` if the `title` acts as an accessible description. + * By default the `title` acts as an accessible label for the child. + * @default false + */ + describeChild: m.bool, + /** + * Do not respond to focus-visible events. + * @default false + */ + disableFocusListener: m.bool, + /** + * Do not respond to hover events. + * @default false + */ + disableHoverListener: m.bool, + /** + * Makes a tooltip not interactive, i.e. it will close when the user + * hovers over the tooltip before the `leaveDelay` is expired. + * @default false + */ + disableInteractive: m.bool, + /** + * Do not respond to long press touch events. + * @default false + */ + disableTouchListener: m.bool, + /** + * The number of milliseconds to wait before showing the tooltip. + * This prop won't impact the enter touch delay (`enterTouchDelay`). + * @default 100 + */ + enterDelay: m.number, + /** + * The number of milliseconds to wait before showing the tooltip when one was already recently opened. + * @default 0 + */ + enterNextDelay: m.number, + /** + * The number of milliseconds a user must touch the element before showing the tooltip. + * @default 700 + */ + enterTouchDelay: m.number, + /** + * If `true`, the tooltip follow the cursor over the wrapped element. + * @default false + */ + followCursor: m.bool, + /** + * This prop is used to help implement the accessibility logic. + * If you don't provide this prop. It falls back to a randomly generated id. + */ + id: m.string, + /** + * The number of milliseconds to wait before hiding the tooltip. + * This prop won't impact the leave touch delay (`leaveTouchDelay`). + * @default 0 + */ + leaveDelay: m.number, + /** + * The number of milliseconds after the user stops touching an element before hiding the tooltip. + * @default 1500 + */ + leaveTouchDelay: m.number, + /** + * Callback fired when the component requests to be closed. + * + * @param {React.SyntheticEvent} event The event source of the callback. + */ + onClose: m.func, + /** + * Callback fired when the component requests to be open. + * + * @param {React.SyntheticEvent} event The event source of the callback. + */ + onOpen: m.func, + /** + * If `true`, the component is shown. + */ + open: m.bool, + /** + * Tooltip placement. + * @default 'bottom' + */ + placement: m.oneOf(["bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), + /** + * The component used for the popper. + * @default Popper + */ + PopperComponent: m.elementType, + /** + * Props applied to the [`Popper`](/material-ui/api/popper/) element. + * @default {} + */ + PopperProps: m.object, + /** + * The extra props for the slot components. + * You can override the existing props or add new ones. + * + * This prop is an alias for the `componentsProps` prop, which will be deprecated in the future. + * + * @default {} + */ + slotProps: m.shape({ + arrow: m.object, + popper: m.object, + tooltip: m.object, + transition: m.object + }), + /** + * The components used for each slot inside. + * + * This prop is an alias for the `components` prop, which will be deprecated in the future. + * + * @default {} + */ + slots: m.shape({ + arrow: m.elementType, + popper: m.elementType, + tooltip: m.elementType, + transition: m.elementType + }), + /** + * The system prop that allows defining system overrides as well as additional CSS styles. + */ + sx: m.oneOfType([m.arrayOf(m.oneOfType([m.func, m.object, m.bool])), m.func, m.object]), + /** + * Tooltip title. Zero-length titles string, undefined, null and false are never displayed. + */ + title: m.node, + /** + * The component used for the transition. + * [Follow this guide](/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component. + * @default Grow + */ + TransitionComponent: m.elementType, + /** + * Props applied to the transition element. + * By default, the element is based on this [`Transition`](http://reactcommunity.org/react-transition-group/transition/) component. + */ + TransitionProps: m.object +}); +const uh = Bs; +function ti(e, r, t) { + return e ? /* @__PURE__ */ l(wi, { className: `papi-menu-icon-${t ? "leading" : "trailing"}`, children: /* @__PURE__ */ l("img", { src: e, alt: `${t ? "Leading" : "Trailing"} icon for ${r}` }) }) : void 0; +} +function js(e) { + const { + onClick: r, + label: t, + tooltip: n, + allowForLeadingIcons: o = !0, + iconPathBefore: a = void 0, + iconPathAfter: i = void 0, + hasAutoFocus: s = !1, + className: c, + isDisabled: d = !1, + isDense: u = !0, + isSubMenuParent: b = !1, + hasDisabledGutters: p = !1, + hasDivider: h = !1, + focusVisibleClassName: f, + id: g, + children: v + } = e, y = /* @__PURE__ */ l( + al, + { + sx: { lineHeight: 0.8 }, + autoFocus: s, + className: c, + disabled: d, + dense: u, + disableGutters: p, + divider: h, + focusVisibleClassName: f, + onClick: r, + id: g, + children: t ? /* @__PURE__ */ E(cr, { children: [ + ti(a, t, !0), + /* @__PURE__ */ l(il, { primary: t, inset: !a && o }), + b ? /* @__PURE__ */ l(wi, { className: "papi-menu-icon-trailing", children: /* @__PURE__ */ l(ws, {}) }) : ti(i, t, !1) + ] }) : v + } + ); + return n ? /* @__PURE__ */ l(uh, { title: n, placement: "right", children: /* @__PURE__ */ l("div", { children: y }) }) : y; +} +function Vs(e) { + return Object.entries(e.groups).map(([t, n]) => ({ id: t, group: n })); +} +function fh(e) { + const [r, t] = fe(void 0), { parentMenuItem: n, parentItemProps: o, menuDefinition: a } = e, i = (d) => { + t(d.currentTarget); + }, s = () => { + t(void 0); + }, c = () => { + let d = Vs(a).filter((u) => "menuItem" in u.group); + if (!(n != null && n.id)) + throw new Error("A valid parent menu item is required for submenus."); + return d = d.filter( + (u) => "menuItem" in u.group && u.group.menuItem === n.id + ), /* @__PURE__ */ l(Ls, { ...e, includedGroups: d }); + }; + return /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(js, { onClick: i, ...o, isSubMenuParent: !0 }), + /* @__PURE__ */ l( + sl, + { + anchorEl: r, + open: !!r, + onClose: s, + anchorOrigin: { + vertical: "top", + horizontal: "right" + }, + transformOrigin: { + vertical: "top", + horizontal: "left" + }, + children: c() + }, + n.id + ) + ] }); +} +const mh = (e, r) => r.filter((o) => o.group === e).sort((o, a) => (o.order || 0) - (a.order || 0)); +function Ls(e) { + const { menuDefinition: r, onClick: t, commandHandler: n, includedGroups: o } = e, { items: a, allowForLeadingIcons: i } = lr(() => { + const u = o && o.length > 0 ? o : ( + // We're apparently laying out a single-column menu (presumably a context menu). In this + // case, all groups should be included except ones that belong to a submenu. + Vs(r).filter((f) => !("menuItem" in f.group)) + ), b = Object.values(u).sort( + (f, g) => (f.group.order || 0) - (g.group.order || 0) + ), p = []; + b.forEach((f) => { + mh(f.id, r.items).forEach( + (g) => p.push({ item: g, isLastItemInGroup: !1 }) + ), p.length > 0 && (p[p.length - 1].isLastItemInGroup = !0); + }), p.length > 0 && (p[p.length - 1].isLastItemInGroup = !1); + const h = p.some( + (f) => "iconPathBefore" in f.item && f.item.iconPathBefore + ); + return { items: p, allowForLeadingIcons: h }; + }, [o, r]), s = ({ item: u, isLastItemInGroup: b }) => ({ + className: "papi-menu-item", + label: u.label, + tooltip: u.tooltip, + iconPathBefore: "iconPathBefore" in u ? u.iconPathBefore : void 0, + iconPathAfter: "iconPathAfter" in u ? u.iconPathAfter : void 0, + hasDivider: b, + // Set hasDivider to true for the last item in a group + allowForLeadingIcons: i + }), [c] = a; + if (!c) + return /* @__PURE__ */ l("div", {}); + const d = c.item.group; + return /* @__PURE__ */ l("div", { role: "menu", "aria-label": d, children: a.map((u, b) => { + const { item: p } = u, h = s(u); + if ("command" in p) { + const f = p.group + b; + return /* @__PURE__ */ l( + js, + { + onClick: (g) => { + t == null || t(g), n(p); + }, + ...h + }, + f + ); + } + return /* @__PURE__ */ l( + fh, + { + parentMenuItem: p, + parentItemProps: h, + ...e + }, + d + p.id + ); + }) }, d); +} +function hh(e) { + const { menuDefinition: r, columnId: t } = e; + let a = Object.entries(r.groups).map(([i, s]) => ({ id: i, group: s })).filter((i) => "column" in i.group); + return t && "columns" in r && // Without this type assertion, TS doesn't know what columns is. + // eslint-disable-next-line no-type-assertion/no-type-assertion + r.columns[t] && (a = a.filter( + (i) => "column" in i.group && i.group.column === t + )), /* @__PURE__ */ l(Ls, { ...e, includedGroups: a }); +} +function gh({ + commandHandler: e, + menuDefinition: r, + id: t, + metadata: n, + onClick: o, + className: a +}) { + return /* @__PURE__ */ E( + yi, + { + id: t, + item: !0, + xs: "auto", + role: "menu", + "aria-label": t, + className: `papi-menu-column ${a ?? ""}`, + children: [ + /* @__PURE__ */ l("h3", { "aria-label": n.label, className: `papi-menu-column-header ${a ?? ""}`, children: n.label }), + /* @__PURE__ */ l(pl, { id: t, dense: !0, className: a ?? "", children: /* @__PURE__ */ l( + hh, + { + commandHandler: e, + menuDefinition: r, + columnId: t, + onClick: o + } + ) }) + ] + } + ); +} +function vh({ + commandHandler: e, + className: r, + multiColumnMenu: t, + id: n +}) { + const { columns: o } = t, a = lr(() => { + const i = /* @__PURE__ */ new Map(); + return Object.getOwnPropertyNames(o).forEach((s) => { + if (s === "isExtensible") + return; + const c = s, d = o[c]; + typeof d == "object" && typeof d.order == "number" && !Number.isNaN(d.order) ? i.set(d.order, { id: c, metadata: d }) : console.warn( + `Property ${s} (${typeof d}) on menu ${n} is not a valid column and is being ignored. This might indicate data corruption` + ); + }), Array.from(i.values()).sort((s, c) => (s.metadata.order || 0) - (c.metadata.order || 0)); + }, [o, n]); + return /* @__PURE__ */ l( + yi, + { + container: !0, + spacing: 0, + className: `papi-multi-column-menu ${r ?? ""}`, + columns: a.length, + role: "menu", + "aria-label": "GridMenu", + id: n, + children: a.map((i, s) => /* @__PURE__ */ l( + gh, + { + commandHandler: e, + menuDefinition: t, + ...i, + className: r + }, + s + )) + } + ); +} +function bh(e) { + return { + preserveValue: !0, + ...e + }; +} +const uo = (e, r, t = {}) => { + const n = kr(r); + n.current = r; + const o = kr(t); + o.current = bh(o.current); + const [a, i] = fe(() => n.current), [s, c] = fe(!0); + return Xe(() => { + let d = !0; + return c(!!e), (async () => { + if (e) { + const u = await e(); + d && (i(() => u), c(!1)); + } + })(), () => { + d = !1, o.current.preserveValue || i(() => n.current); + }; + }, [e]), [a, s]; +}, wh = bs(/* @__PURE__ */ l("path", { + d: "M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z" +}), "Menu"); +function yh({ + menuProvider: e, + normalMenu: r, + fullMenu: t, + commandHandler: n, + containerRef: o, + className: a, + ariaLabelPrefix: i, + children: s +}) { + const [c, d] = fe(!1), [u, b] = fe(!1), p = Se(() => { + c && d(!1), b(!1); + }, [c]), h = Se((x) => { + x.stopPropagation(), d((w) => { + const O = !w; + return O && x.shiftKey ? b(!0) : O || b(!1), O; + }); + }, []), f = Se( + (x) => (p(), n(x)), + [n, p] + ), [g, v] = fe({ top: 1, left: 1 }); + Xe(() => { + if (c) { + const x = o == null ? void 0 : o.current; + if (x) { + const w = x.getBoundingClientRect(), O = window.scrollY, P = window.scrollX, V = w.top + O + x.clientHeight, S = w.left + P; + v({ top: V, left: S }); + } + } + }, [c, o]); + const [y] = uo( + Se(async () => (e == null ? void 0 : e(!1)) ?? r, [e, r, c]), + r + ), [C] = uo( + Se(async () => (e == null ? void 0 : e(!0)) ?? t ?? y, [e, t, y, c]), + t ?? y + ), T = u && C ? C : y; + return /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l( + xi, + { + sx: { + paddingTop: 0, + paddingBottom: 0 + }, + edge: "start", + className: `papi-menuButton ${a ?? ""}`, + color: "inherit", + "aria-label": `${i ?? ""} menu button`, + onClick: h, + children: s ?? /* @__PURE__ */ l(wh, {}) + } + ), + /* @__PURE__ */ l( + ll, + { + className: `papi-menu-drawer ${a ?? ""}`, + anchor: "left", + variant: "temporary", + open: c, + onClose: p, + PaperProps: { + className: "papi-menu-drawer-paper", + style: { + top: g.top, + left: g.left + } + }, + children: T ? /* @__PURE__ */ l( + vh, + { + className: a, + id: `${i ?? ""} main menu`, + commandHandler: f, + multiColumnMenu: T + } + ) : void 0 + } + ) + ] }); +} +function E0({ + id: e, + label: r, + isDisabled: t = !1, + tooltip: n, + isTooltipSuppressed: o = !1, + adjustMarginToAlignToEdge: a = !1, + size: i = "medium", + className: s, + onClick: c, + children: d +}) { + return /* @__PURE__ */ l( + xi, + { + id: e, + disabled: t, + edge: a, + size: i, + "aria-label": r, + title: o ? void 0 : n ?? r, + className: `papi-icon-button ${s ?? ""}`, + onClick: c, + children: d + } + ); +} +const At = nn(({ className: e, ...r }, t) => /* @__PURE__ */ l(Vp, { size: 35, className: R("pr-animate-spin", e), ...r, ref: t })); +At.displayName = "Spinner"; +function T0({ + id: e, + isDisabled: r = !1, + hasError: t = !1, + isFullWidth: n = !1, + helperText: o, + label: a, + placeholder: i, + isRequired: s = !1, + className: c, + defaultValue: d, + value: u, + onChange: b, + onFocus: p, + onBlur: h +}) { + return /* @__PURE__ */ E("div", { className: R("pr-inline-grid pr-items-center pr-gap-1.5", { "pr-w-full": n }), children: [ + /* @__PURE__ */ l( + Ze, + { + htmlFor: e, + className: R({ + "pr-text-red-600": t, + "pr-hidden": !a + }), + children: `${a}${s ? "*" : ""}` + } + ), + /* @__PURE__ */ l( + St, + { + id: e, + disabled: r, + placeholder: i, + required: s, + className: R(c, { "pr-border-red-600": t }), + defaultValue: d, + value: u, + onChange: b, + onFocus: p, + onBlur: h + } + ), + /* @__PURE__ */ l("p", { className: R({ "pr-hidden": !o }), children: o }) + ] }); +} +function S0({ + menuProvider: e, + commandHandler: r, + className: t, + id: n, + children: o +}) { + const a = kr(void 0); + return /* @__PURE__ */ l("div", { ref: a, style: { position: "relative" }, children: /* @__PURE__ */ l(cl, { position: "static", id: n, children: /* @__PURE__ */ E( + dl, + { + className: R("pr-bg-muted pr-text-muted-foreground", t), + variant: "dense", + children: [ + e ? /* @__PURE__ */ l( + yh, + { + commandHandler: r, + containerRef: a, + menuProvider: e + } + ) : void 0, + o ? /* @__PURE__ */ l("div", { className: "papi-toolbar-children", children: o }) : void 0 + ] + } + ) }) }); +} +const xh = sn( + "pr-relative pr-w-full pr-rounded-lg pr-border pr-p-4 [&>svg~*]:pr-pl-7 [&>svg+div]:pr-translate-y-[-3px] [&>svg]:pr-absolute [&>svg]:pr-left-4 [&>svg]:pr-top-4 [&>svg]:pr-text-foreground", + { + variants: { + variant: { + default: "pr-bg-background pr-text-foreground", + destructive: "pr-border-destructive/50 pr-text-destructive dark:pr-border-destructive [&>svg]:pr-text-destructive" + } + }, + defaultVariants: { + variant: "default" + } + } +), kh = M.forwardRef(({ className: e, variant: r, ...t }, n) => /* @__PURE__ */ l("div", { ref: n, role: "alert", className: R(xh({ variant: r }), e), ...t })); +kh.displayName = "Alert"; +const Nh = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ E( + "h5", + { + ref: t, + className: R("pr-mb-1 pr-font-medium pr-leading-none pr-tracking-tight", e), + ...r, + children: [ + r.children, + " " + ] + } + ) +); +Nh.displayName = "AlertTitle"; +const Eh = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l("div", { ref: t, className: R("pr-text-sm [&_p]:pr-leading-relaxed", e), ...r })); +Eh.displayName = "AlertDescription"; +const Th = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l( + "div", + { + ref: t, + className: R( + "pr-twp pr-rounded-lg pr-border pr-bg-card pr-text-card-foreground pr-shadow-sm", + e + ), + ...r + } + ) +); +Th.displayName = "Card"; +const Sh = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l( + "div", + { + ref: t, + className: R("pr-twp pr-flex pr-flex-col pr-space-y-1.5 pr-p-6", e), + ...r + } + ) +); +Sh.displayName = "CardHeader"; +const Ch = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l( + "h3", + { + ref: t, + className: R( + "pr-twp pr-text-2xl pr-font-semibold pr-leading-none pr-tracking-tight", + e + ), + ...r, + children: r.children + } + ) +); +Ch.displayName = "CardTitle"; +const Oh = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l("p", { ref: t, className: R("pr-twp pr-text-sm pr-text-muted-foreground", e), ...r })); +Oh.displayName = "CardDescription"; +const Rh = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l("div", { ref: t, className: R("pr-twp pr-p-6 pr-pt-0", e), ...r }) +); +Rh.displayName = "CardContent"; +const Ph = M.forwardRef( + ({ className: e, ...r }, t) => /* @__PURE__ */ l( + "div", + { + ref: t, + className: R("pr-twp pr-flex pr-items-center pr-p-6 pr-pt-0", e), + ...r + } + ) +); +Ph.displayName = "CardFooter"; +function C0({ ...e }) { + return /* @__PURE__ */ l( + fl, + { + className: "pr-toaster pr-group", + toastOptions: { + classNames: { + toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", + description: "group-[.toast]:text-muted-foreground", + actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", + cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground" + } + }, + ...e + } + ); +} +const $h = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ E( + pt.Root, + { + ref: t, + className: R( + "pr-twp pr-relative pr-flex pr-w-full pr-touch-none pr-select-none pr-items-center", + e + ), + ...r, + children: [ + /* @__PURE__ */ l(pt.Track, { className: "pr-relative pr-h-2 pr-w-full pr-grow pr-overflow-hidden pr-rounded-full pr-bg-secondary", children: /* @__PURE__ */ l(pt.Range, { className: "pr-absolute pr-h-full pr-bg-primary" }) }), + /* @__PURE__ */ l(pt.Thumb, { className: "pr-block pr-h-5 pr-w-5 pr-rounded-full pr-border-2 pr-border-primary pr-bg-background pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50" }) + ] + } +)); +$h.displayName = pt.Root.displayName; +const _h = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + eo.Root, + { + className: R( + "pr-peer pr-twp pr-inline-flex pr-h-6 pr-w-11 pr-shrink-0 pr-cursor-pointer pr-items-center pr-rounded-full pr-border-2 pr-border-transparent pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 focus-visible:pr-ring-offset-background disabled:pr-cursor-not-allowed disabled:pr-opacity-50 data-[state=checked]:pr-bg-primary data-[state=unchecked]:pr-bg-input", + e + ), + ...r, + ref: t, + children: /* @__PURE__ */ l( + eo.Thumb, + { + className: R( + "pr-twp pr-pointer-events-none pr-block pr-h-5 pr-w-5 pr-rounded-full pr-bg-background pr-shadow-lg pr-ring-0 pr-transition-transform data-[state=checked]:pr-translate-x-5 data-[state=unchecked]:pr-translate-x-0" + ) + } + ) + } +)); +_h.displayName = eo.Root.displayName; +const O0 = Pe.Root, Ih = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.List, + { + ref: t, + className: R( + "pr-inline-flex pr-h-10 pr-items-center pr-justify-center pr-rounded-md pr-bg-muted pr-p-1 pr-text-muted-foreground", + e + ), + ...r + } +)); +Ih.displayName = Pe.List.displayName; +const Ah = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.Trigger, + { + ref: t, + className: R( + "pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-sm pr-px-3 pr-py-1.5 pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-all hover:pr-text-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=active]:pr-bg-background data-[state=active]:pr-text-foreground data-[state=active]:pr-shadow-sm", + e + ), + ...r + } +)); +Ah.displayName = Pe.Trigger.displayName; +const Dh = M.forwardRef(({ className: e, ...r }, t) => /* @__PURE__ */ l( + Pe.Content, + { + ref: t, + className: R( + "pr-mt-2 pr-ring-offset-background focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2", + e + ), + ...r + } +)); +Dh.displayName = Pe.Content.displayName; +function R0({ + isInstalling: e, + handleClick: r, + buttonText: t, + className: n, + ...o +}) { + return /* @__PURE__ */ l( + ye, + { + className: R( + "pr-h-8 pr-rounded-md pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700", + { + "pr-cursor-not-allowed pr-bg-blue-700": e, + "pr-bg-blue-600": !e, + "pr-bg-white pr-text-blue-600 hover:pr-text-white": !t, + "pr-w-20": t + }, + n + ), + onClick: r, + ...o, + children: e ? /* @__PURE__ */ l(At, { size: 15 }) : /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(Lp, { size: 25, className: R("pr-h-4 pr-w-4", { "pr-mr-1": t }) }), + t + ] }) + } + ); +} +function P0({ + isEnabling: e, + handleClick: r, + className: t, + ...n +}) { + return /* @__PURE__ */ l( + ye, + { + className: R( + "pr-h-8 pr-rounded-md pr-bg-blue-600 pr-px-4 pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700", + { + "pr-cursor-not-allowed pr-bg-blue-700": e + }, + t + ), + onClick: r, + ...n, + children: e ? /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(At, { size: 15, className: "pr-mr-1 pr-text-white" }), + "Enabling..." + ] }) : "Enable" + } + ); +} +function $0({ + isDisabling: e, + handleClick: r, + className: t, + ...n +}) { + return /* @__PURE__ */ l( + ye, + { + className: R( + "pr-h-8 pr-rounded-md pr-bg-gray-300 pr-text-black pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-gray-400", + { + "pr-cursor-not-allowed pr-bg-gray-400": e + }, + t + ), + onClick: r, + ...n, + children: e ? /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(At, { size: 15, className: "pr-mr-1 pr-text-black" }), + "Disabling..." + ] }) : "Disable" + } + ); +} +function _0({ + isUpdating: e, + handleClick: r, + className: t, + ...n +}) { + return /* @__PURE__ */ l( + ye, + { + className: R( + "pr-h-8 pr-rounded-md pr-bg-blue-600 pr-px-4 pr-text-white pr-transition pr-duration-300 pr-ease-in-out hover:pr-bg-blue-700 hover:pr-text-white", + { + "pr-cursor-not-allowed pr-bg-blue-700": e + }, + t + ), + onClick: r, + ...n, + children: e ? /* @__PURE__ */ E(cr, { children: [ + /* @__PURE__ */ l(At, { size: 15, className: "pr-mr-1 pr-text-white" }), + "Updating..." + ] }) : "Update" + } + ); +} +function xr() { + return xr = Object.assign ? Object.assign.bind() : function(e) { + for (var r = 1; r < arguments.length; r++) { + var t = arguments[r]; + for (var n in t) + Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]); + } + return e; + }, xr.apply(this, arguments); +} +const Mh = ["children", "options"], H = { blockQuote: "0", breakLine: "1", breakThematic: "2", codeBlock: "3", codeFenced: "4", codeInline: "5", footnote: "6", footnoteReference: "7", gfmTask: "8", heading: "9", headingSetext: "10", htmlBlock: "11", htmlComment: "12", htmlSelfClosing: "13", image: "14", link: "15", linkAngleBraceStyleDetector: "16", linkBareUrlDetector: "17", linkMailtoDetector: "18", newlineCoalescer: "19", orderedList: "20", paragraph: "21", ref: "22", refImage: "23", refLink: "24", table: "25", tableSeparator: "26", text: "27", textBolded: "28", textEmphasized: "29", textEscaped: "30", textMarked: "31", textStrikethroughed: "32", unorderedList: "33" }; +var ni; +(function(e) { + e[e.MAX = 0] = "MAX", e[e.HIGH = 1] = "HIGH", e[e.MED = 2] = "MED", e[e.LOW = 3] = "LOW", e[e.MIN = 4] = "MIN"; +})(ni || (ni = {})); +const oi = ["allowFullScreen", "allowTransparency", "autoComplete", "autoFocus", "autoPlay", "cellPadding", "cellSpacing", "charSet", "className", "classId", "colSpan", "contentEditable", "contextMenu", "crossOrigin", "encType", "formAction", "formEncType", "formMethod", "formNoValidate", "formTarget", "frameBorder", "hrefLang", "inputMode", "keyParams", "keyType", "marginHeight", "marginWidth", "maxLength", "mediaGroup", "minLength", "noValidate", "radioGroup", "readOnly", "rowSpan", "spellCheck", "srcDoc", "srcLang", "srcSet", "tabIndex", "useMap"].reduce((e, r) => (e[r.toLowerCase()] = r, e), { for: "htmlFor" }), ai = { amp: "&", apos: "'", gt: ">", lt: "<", nbsp: " ", quot: "“" }, Bh = ["style", "script"], jh = /([-A-Z0-9_:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|(?:\{((?:\\.|{[^}]*?}|[^}])*)\})))?/gi, Vh = /mailto:/i, Lh = /\n{2,}$/, zs = /^(\s*>[\s\S]*?)(?=\n{2,})/, zh = /^ *> ?/gm, Fh = /^ {2,}\n/, Uh = /^(?:( *[-*_])){3,} *(?:\n *)+\n/, Fs = /^\s*(`{3,}|~{3,}) *(\S+)?([^\n]*?)?\n([\s\S]+?)\s*\1 *(?:\n *)*\n?/, Us = /^(?: {4}[^\n]+\n*)+(?:\n *)+\n?/, Gh = /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/, Hh = /^(?:\n *)*\n/, Xh = /\r\n?/g, Wh = /^\[\^([^\]]+)](:(.*)((\n+ {4,}.*)|(\n(?!\[\^).+))*)/, Yh = /^\[\^([^\]]+)]/, qh = /\f/g, Kh = /^---[ \t]*\n(.|\n)*\n---[ \t]*\n/, Jh = /^\s*?\[(x|\s)\]/, Gs = /^ *(#{1,6}) *([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/, Hs = /^ *(#{1,6}) +([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/, Xs = /^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/, fo = /^ *(?!<[a-z][^ >/]* ?\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\n?(\s*(?:<\1[^>]*?>[\s\S]*?<\/\1>|(?!<\1\b)[\s\S])*?)<\/\1>(?!<\/\1>)\n*/i, Zh = /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi, Ws = /^)/, Qh = /^(data|aria|x)-[a-z_][a-z\d_.-]*$/, mo = /^ *<([a-z][a-z0-9:]*)(?:\s+((?:<.*?>|[^>])*))?\/?>(?!<\/\1>)(\s*\n)?/i, eg = /^\{.*\}$/, rg = /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/, tg = /^<([^ >]+@[^ >]+)>/, ng = /^<([^ >]+:\/[^ >]+)>/, og = /-([a-z])?/gi, Ys = /^(.*\|.*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:.*\|.*\n)*))?\n?/, ag = /^\[([^\]]*)\]:\s+]+)>?\s*("([^"]*)")?/, ig = /^!\[([^\]]*)\] ?\[([^\]]*)\]/, sg = /^\[([^\]]*)\] ?\[([^\]]*)\]/, pg = /(\[|\])/g, lg = /(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/, cg = /\t/g, dg = /(^ *\||\| *$)/g, ug = /^ *:-+: *$/, fg = /^ *:-+ *$/, mg = /^ *-+: *$/, Cn = "((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~~.*?~~|==.*?==|.|\\n)*?)", hg = new RegExp(`^([*_])\\1${Cn}\\1\\1(?!\\1)`), gg = new RegExp(`^([*_])${Cn}\\1(?!\\1|\\w)`), vg = new RegExp(`^==${Cn}==`), bg = new RegExp(`^~~${Cn}~~`), wg = /^\\([^0-9A-Za-z\s])/, yg = /^[\s\S]+?(?=[^0-9A-Z\s\u00c0-\uffff&#;.()'"]|\d+\.|\n\n| {2,}\n|\w+:\S|$)/i, xg = /^\n+/, kg = /^([ \t]*)/, Ng = /\\([^\\])/g, ii = / *\n+$/, Eg = /(?:^|\n)( *)$/, Uo = "(?:\\d+\\.)", Go = "(?:[*+-])"; +function qs(e) { + return "( *)(" + (e === 1 ? Uo : Go) + ") +"; +} +const Ks = qs(1), Js = qs(2); +function Zs(e) { + return new RegExp("^" + (e === 1 ? Ks : Js)); +} +const Tg = Zs(1), Sg = Zs(2); +function Qs(e) { + return new RegExp("^" + (e === 1 ? Ks : Js) + "[^\\n]*(?:\\n(?!\\1" + (e === 1 ? Uo : Go) + " )[^\\n]*)*(\\n|$)", "gm"); +} +const ep = Qs(1), rp = Qs(2); +function tp(e) { + const r = e === 1 ? Uo : Go; + return new RegExp("^( *)(" + r + ") [\\s\\S]+?(?:\\n{2,}(?! )(?!\\1" + r + " (?!" + r + " ))\\n*|\\s*\\n*$)"); +} +const np = tp(1), op = tp(2); +function si(e, r) { + const t = r === 1, n = t ? np : op, o = t ? ep : rp, a = t ? Tg : Sg; + return { match(i, s, c) { + const d = Eg.exec(c); + return d && (s.list || !s.inline && !s.simple) ? n.exec(i = d[1] + i) : null; + }, order: 1, parse(i, s, c) { + const d = t ? +i[2] : void 0, u = i[0].replace(Lh, ` +`).match(o); + let b = !1; + return { items: u.map(function(p, h) { + const f = a.exec(p)[0].length, g = new RegExp("^ {1," + f + "}", "gm"), v = p.replace(g, "").replace(a, ""), y = h === u.length - 1, C = v.indexOf(` + +`) !== -1 || y && b; + b = C; + const T = c.inline, x = c.list; + let w; + c.list = !0, C ? (c.inline = !1, w = v.replace(ii, ` + +`)) : (c.inline = !0, w = v.replace(ii, "")); + const O = s(w, c); + return c.inline = T, c.list = x, O; + }), ordered: t, start: d }; + }, render: (i, s, c) => e(i.ordered ? "ol" : "ul", { key: c.key, start: i.type === H.orderedList ? i.start : void 0 }, i.items.map(function(d, u) { + return e("li", { key: u }, s(d, c)); + })) }; +} +const Cg = new RegExp(`^\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\]\\(\\s*?(?:\\s+['"]([\\s\\S]*?)['"])?\\s*\\)`), Og = /^!\[(.*?)\]\( *((?:\([^)]*\)|[^() ])*) *"?([^)"]*)?"?\)/, ap = [zs, Fs, Us, Gs, Xs, Hs, Ws, Ys, ep, np, rp, op], Rg = [...ap, /^[^\n]+(?: \n|\n{2,})/, fo, mo]; +function Ht(e) { + return e.replace(/[ÀÁÂÃÄÅàáâãäåæÆ]/g, "a").replace(/[çÇ]/g, "c").replace(/[ðÐ]/g, "d").replace(/[ÈÉÊËéèêë]/g, "e").replace(/[ÏïÎîÍíÌì]/g, "i").replace(/[Ññ]/g, "n").replace(/[øØœŒÕõÔôÓóÒò]/g, "o").replace(/[ÜüÛûÚúÙù]/g, "u").replace(/[ŸÿÝý]/g, "y").replace(/[^a-z0-9- ]/gi, "").replace(/ /gi, "-").toLowerCase(); +} +function Pg(e) { + return mg.test(e) ? "right" : ug.test(e) ? "center" : fg.test(e) ? "left" : null; +} +function pi(e, r, t, n) { + const o = t.inTable; + t.inTable = !0; + let a = e.trim().split(/( *(?:`[^`]*`|<.*?>.*?<\/.*?>(?!<\/.*?>)|\\\||\|) *)/).reduce((s, c) => (c.trim() === "|" ? s.push(n ? { type: H.tableSeparator } : { type: H.text, text: c }) : c !== "" && s.push.apply(s, r(c, t)), s), []); + t.inTable = o; + let i = [[]]; + return a.forEach(function(s, c) { + s.type === H.tableSeparator ? c !== 0 && c !== a.length - 1 && i.push([]) : (s.type !== H.text || a[c + 1] != null && a[c + 1].type !== H.tableSeparator || (s.text = s.text.trimEnd()), i[i.length - 1].push(s)); + }), i; +} +function $g(e, r, t) { + t.inline = !0; + const n = e[2] ? e[2].replace(dg, "").split("|").map(Pg) : [], o = e[3] ? function(i, s, c) { + return i.trim().split(` +`).map(function(d) { + return pi(d, s, c, !0); + }); + }(e[3], r, t) : [], a = pi(e[1], r, t, !!o.length); + return t.inline = !1, o.length ? { align: n, cells: o, header: a, type: H.table } : { children: a, type: H.paragraph }; +} +function li(e, r) { + return e.align[r] == null ? {} : { textAlign: e.align[r] }; +} +function or(e) { + return function(r, t) { + return t.inline ? e.exec(r) : null; + }; +} +function ar(e) { + return function(r, t) { + return t.inline || t.simple ? e.exec(r) : null; + }; +} +function Je(e) { + return function(r, t) { + return t.inline || t.simple ? null : e.exec(r); + }; +} +function st(e) { + return function(r) { + return e.exec(r); + }; +} +function _g(e, r, t) { + if (r.inline || r.simple || t && !t.endsWith(` +`)) + return null; + let n = ""; + e.split(` +`).every((a) => !ap.some((i) => i.test(a)) && (n += a + ` +`, a.trim())); + const o = n.trimEnd(); + return o == "" ? null : [n, o]; +} +function Ig(e) { + try { + if (decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g, "").match(/^\s*(javascript|vbscript|data(?!:image)):/i)) + return null; + } catch { + return null; + } + return e; +} +function ci(e) { + return e.replace(Ng, "$1"); +} +function Kt(e, r, t) { + const n = t.inline || !1, o = t.simple || !1; + t.inline = !0, t.simple = !0; + const a = e(r, t); + return t.inline = n, t.simple = o, a; +} +function Ag(e, r, t) { + const n = t.inline || !1, o = t.simple || !1; + t.inline = !1, t.simple = !0; + const a = e(r, t); + return t.inline = n, t.simple = o, a; +} +function Dg(e, r, t) { + const n = t.inline || !1; + t.inline = !1; + const o = e(r, t); + return t.inline = n, o; +} +const Wn = (e, r, t) => ({ children: Kt(r, e[1], t) }); +function Yn() { + return {}; +} +function qn() { + return null; +} +function Mg(...e) { + return e.filter(Boolean).join(" "); +} +function Kn(e, r, t) { + let n = e; + const o = r.split("."); + for (; o.length && (n = n[o[0]], n !== void 0); ) + o.shift(); + return n || t; +} +function Bg(e = "", r = {}) { + function t(p, h, ...f) { + const g = Kn(r.overrides, `${p}.props`, {}); + return r.createElement(function(v, y) { + const C = Kn(y, v); + return C ? typeof C == "function" || typeof C == "object" && "render" in C ? C : Kn(y, `${v}.component`, v) : v; + }(p, r.overrides), xr({}, h, g, { className: Mg(h == null ? void 0 : h.className, g.className) || void 0 }), ...f); + } + function n(p) { + p = p.replace(Kh, ""); + let h = !1; + r.forceInline ? h = !0 : r.forceBlock || (h = lg.test(p) === !1); + const f = d(c(h ? p : `${p.trimEnd().replace(xg, "")} + +`, { inline: h })); + for (; typeof f[f.length - 1] == "string" && !f[f.length - 1].trim(); ) + f.pop(); + if (r.wrapper === null) + return f; + const g = r.wrapper || (h ? "span" : "div"); + let v; + if (f.length > 1 || r.forceWrapper) + v = f; + else { + if (f.length === 1) + return v = f[0], typeof v == "string" ? t("span", { key: "outer" }, v) : v; + v = null; + } + return D.createElement(g, { key: "outer" }, v); + } + function o(p, h) { + const f = h.match(jh); + return f ? f.reduce(function(g, v, y) { + const C = v.indexOf("="); + if (C !== -1) { + const T = function(P) { + return P.indexOf("-") !== -1 && P.match(Qh) === null && (P = P.replace(og, function(V, S) { + return S.toUpperCase(); + })), P; + }(v.slice(0, C)).trim(), x = function(P) { + const V = P[0]; + return (V === '"' || V === "'") && P.length >= 2 && P[P.length - 1] === V ? P.slice(1, -1) : P; + }(v.slice(C + 1).trim()), w = oi[T] || T, O = g[w] = function(P, V, S, $) { + return V === "style" ? S.split(/;\s?/).reduce(function(k, j) { + const B = j.slice(0, j.indexOf(":")); + return k[B.trim().replace(/(-[a-z])/g, (Z) => Z[1].toUpperCase())] = j.slice(B.length + 1).trim(), k; + }, {}) : V === "href" || V === "src" ? $(S, P, V) : (S.match(eg) && (S = S.slice(1, S.length - 1)), S === "true" || S !== "false" && S); + }(p, T, x, r.sanitizer); + typeof O == "string" && (fo.test(O) || mo.test(O)) && (g[w] = D.cloneElement(n(O.trim()), { key: y })); + } else + v !== "style" && (g[oi[v] || v] = !0); + return g; + }, {}) : null; + } + r.overrides = r.overrides || {}, r.sanitizer = r.sanitizer || Ig, r.slugify = r.slugify || Ht, r.namedCodesToUnicode = r.namedCodesToUnicode ? xr({}, ai, r.namedCodesToUnicode) : ai, r.createElement = r.createElement || D.createElement; + const a = [], i = {}, s = { [H.blockQuote]: { match: Je(zs), order: 1, parse: (p, h, f) => ({ children: h(p[0].replace(zh, ""), f) }), render: (p, h, f) => t("blockquote", { key: f.key }, h(p.children, f)) }, [H.breakLine]: { match: st(Fh), order: 1, parse: Yn, render: (p, h, f) => t("br", { key: f.key }) }, [H.breakThematic]: { match: Je(Uh), order: 1, parse: Yn, render: (p, h, f) => t("hr", { key: f.key }) }, [H.codeBlock]: { match: Je(Us), order: 0, parse: (p) => ({ lang: void 0, text: p[0].replace(/^ {4}/gm, "").replace(/\n+$/, "") }), render: (p, h, f) => t("pre", { key: f.key }, t("code", xr({}, p.attrs, { className: p.lang ? `lang-${p.lang}` : "" }), p.text)) }, [H.codeFenced]: { match: Je(Fs), order: 0, parse: (p) => ({ attrs: o("code", p[3] || ""), lang: p[2] || void 0, text: p[4], type: H.codeBlock }) }, [H.codeInline]: { match: ar(Gh), order: 3, parse: (p) => ({ text: p[2] }), render: (p, h, f) => t("code", { key: f.key }, p.text) }, [H.footnote]: { match: Je(Wh), order: 0, parse: (p) => (a.push({ footnote: p[2], identifier: p[1] }), {}), render: qn }, [H.footnoteReference]: { match: or(Yh), order: 1, parse: (p) => ({ target: `#${r.slugify(p[1], Ht)}`, text: p[1] }), render: (p, h, f) => t("a", { key: f.key, href: r.sanitizer(p.target, "a", "href") }, t("sup", { key: f.key }, p.text)) }, [H.gfmTask]: { match: or(Jh), order: 1, parse: (p) => ({ completed: p[1].toLowerCase() === "x" }), render: (p, h, f) => t("input", { checked: p.completed, key: f.key, readOnly: !0, type: "checkbox" }) }, [H.heading]: { match: Je(r.enforceAtxHeadings ? Hs : Gs), order: 1, parse: (p, h, f) => ({ children: Kt(h, p[2], f), id: r.slugify(p[2], Ht), level: p[1].length }), render: (p, h, f) => t(`h${p.level}`, { id: p.id, key: f.key }, h(p.children, f)) }, [H.headingSetext]: { match: Je(Xs), order: 0, parse: (p, h, f) => ({ children: Kt(h, p[1], f), level: p[2] === "=" ? 1 : 2, type: H.heading }) }, [H.htmlBlock]: { match: st(fo), order: 1, parse(p, h, f) { + const [, g] = p[3].match(kg), v = new RegExp(`^${g}`, "gm"), y = p[3].replace(v, ""), C = (T = y, Rg.some((V) => V.test(T)) ? Dg : Kt); + var T; + const x = p[1].toLowerCase(), w = Bh.indexOf(x) !== -1, O = (w ? x : p[1]).trim(), P = { attrs: o(O, p[2]), noInnerParse: w, tag: O }; + return f.inAnchor = f.inAnchor || x === "a", w ? P.text = p[3] : P.children = C(h, y, f), f.inAnchor = !1, P; + }, render: (p, h, f) => t(p.tag, xr({ key: f.key }, p.attrs), p.text || h(p.children, f)) }, [H.htmlSelfClosing]: { match: st(mo), order: 1, parse(p) { + const h = p[1].trim(); + return { attrs: o(h, p[2] || ""), tag: h }; + }, render: (p, h, f) => t(p.tag, xr({}, p.attrs, { key: f.key })) }, [H.htmlComment]: { match: st(Ws), order: 1, parse: () => ({}), render: qn }, [H.image]: { match: ar(Og), order: 1, parse: (p) => ({ alt: p[1], target: ci(p[2]), title: p[3] }), render: (p, h, f) => t("img", { key: f.key, alt: p.alt || void 0, title: p.title || void 0, src: r.sanitizer(p.target, "img", "src") }) }, [H.link]: { match: or(Cg), order: 3, parse: (p, h, f) => ({ children: Ag(h, p[1], f), target: ci(p[2]), title: p[3] }), render: (p, h, f) => t("a", { key: f.key, href: r.sanitizer(p.target, "a", "href"), title: p.title }, h(p.children, f)) }, [H.linkAngleBraceStyleDetector]: { match: or(ng), order: 0, parse: (p) => ({ children: [{ text: p[1], type: H.text }], target: p[1], type: H.link }) }, [H.linkBareUrlDetector]: { match: (p, h) => h.inAnchor ? null : or(rg)(p, h), order: 0, parse: (p) => ({ children: [{ text: p[1], type: H.text }], target: p[1], title: void 0, type: H.link }) }, [H.linkMailtoDetector]: { match: or(tg), order: 0, parse(p) { + let h = p[1], f = p[1]; + return Vh.test(f) || (f = "mailto:" + f), { children: [{ text: h.replace("mailto:", ""), type: H.text }], target: f, type: H.link }; + } }, [H.orderedList]: si(t, 1), [H.unorderedList]: si(t, 2), [H.newlineCoalescer]: { match: Je(Hh), order: 3, parse: Yn, render: () => ` +` }, [H.paragraph]: { match: _g, order: 3, parse: Wn, render: (p, h, f) => t("p", { key: f.key }, h(p.children, f)) }, [H.ref]: { match: or(ag), order: 0, parse: (p) => (i[p[1]] = { target: p[2], title: p[4] }, {}), render: qn }, [H.refImage]: { match: ar(ig), order: 0, parse: (p) => ({ alt: p[1] || void 0, ref: p[2] }), render: (p, h, f) => i[p.ref] ? t("img", { key: f.key, alt: p.alt, src: r.sanitizer(i[p.ref].target, "img", "src"), title: i[p.ref].title }) : null }, [H.refLink]: { match: or(sg), order: 0, parse: (p, h, f) => ({ children: h(p[1], f), fallbackChildren: h(p[0].replace(pg, "\\$1"), f), ref: p[2] }), render: (p, h, f) => i[p.ref] ? t("a", { key: f.key, href: r.sanitizer(i[p.ref].target, "a", "href"), title: i[p.ref].title }, h(p.children, f)) : t("span", { key: f.key }, h(p.fallbackChildren, f)) }, [H.table]: { match: Je(Ys), order: 1, parse: $g, render(p, h, f) { + const g = p; + return t("table", { key: f.key }, t("thead", null, t("tr", null, g.header.map(function(v, y) { + return t("th", { key: y, style: li(g, y) }, h(v, f)); + }))), t("tbody", null, g.cells.map(function(v, y) { + return t("tr", { key: y }, v.map(function(C, T) { + return t("td", { key: T, style: li(g, T) }, h(C, f)); + })); + }))); + } }, [H.text]: { match: st(yg), order: 4, parse: (p) => ({ text: p[0].replace(Zh, (h, f) => r.namedCodesToUnicode[f] ? r.namedCodesToUnicode[f] : h) }), render: (p) => p.text }, [H.textBolded]: { match: ar(hg), order: 2, parse: (p, h, f) => ({ children: h(p[2], f) }), render: (p, h, f) => t("strong", { key: f.key }, h(p.children, f)) }, [H.textEmphasized]: { match: ar(gg), order: 3, parse: (p, h, f) => ({ children: h(p[2], f) }), render: (p, h, f) => t("em", { key: f.key }, h(p.children, f)) }, [H.textEscaped]: { match: ar(wg), order: 1, parse: (p) => ({ text: p[1], type: H.text }) }, [H.textMarked]: { match: ar(vg), order: 3, parse: Wn, render: (p, h, f) => t("mark", { key: f.key }, h(p.children, f)) }, [H.textStrikethroughed]: { match: ar(bg), order: 3, parse: Wn, render: (p, h, f) => t("del", { key: f.key }, h(p.children, f)) } }; + r.disableParsingRawHTML === !0 && (delete s[H.htmlBlock], delete s[H.htmlSelfClosing]); + const c = function(p) { + let h = Object.keys(p); + function f(g, v) { + let y = [], C = ""; + for (; g; ) { + let T = 0; + for (; T < h.length; ) { + const x = h[T], w = p[x], O = w.match(g, v, C); + if (O) { + const P = O[0]; + g = g.substring(P.length); + const V = w.parse(O, f, v); + V.type == null && (V.type = x), y.push(V), C = P; + break; + } + T++; + } + } + return y; + } + return h.sort(function(g, v) { + let y = p[g].order, C = p[v].order; + return y !== C ? y - C : g < v ? -1 : 1; + }), function(g, v) { + return f(function(y) { + return y.replace(Xh, ` +`).replace(qh, "").replace(cg, " "); + }(g), v); + }; + }(s), d = (u = function(p, h) { + return function(f, g, v) { + const y = p[f.type].render; + return h ? h(() => y(f, g, v), f, g, v) : y(f, g, v); + }; + }(s, r.renderRule), function p(h, f = {}) { + if (Array.isArray(h)) { + const g = f.key, v = []; + let y = !1; + for (let C = 0; C < h.length; C++) { + f.key = C; + const T = p(h[C], f), x = typeof T == "string"; + x && y ? v[v.length - 1] += T : T !== null && v.push(T), y = x; + } + return f.key = g, v; + } + return u(h, p, f); + }); + var u; + const b = n(e); + return a.length ? t("div", null, b, t("footer", { key: "footer" }, a.map(function(p) { + return t("div", { id: r.slugify(p.identifier, Ht), key: p.identifier }, p.identifier, d(c(p.footnote, { inline: !0 }))); + }))) : b; +} +const jg = (e) => { + let { children: r = "", options: t } = e, n = function(o, a) { + if (o == null) + return {}; + var i, s, c = {}, d = Object.keys(o); + for (s = 0; s < d.length; s++) + a.indexOf(i = d[s]) >= 0 || (c[i] = o[i]); + return c; + }(e, Mh); + return D.cloneElement(Bg(r, t), n); +}; +function I0({ id: e, markdown: r }) { + return /* @__PURE__ */ l("div", { id: e, className: "pr-prose", children: /* @__PURE__ */ l(jg, { children: r }) }); +} +const Vg = nn((e, r) => /* @__PURE__ */ E( + ye, + { + ref: r, + className: "pr-rounded-md pr-border pr-border-dashed pr-border-gray-400 pr-bg-white pr-px-4 pr-py-2 pr-text-black pr-transition pr-duration-300 pr-ease-in-out hover:pr-border-blue-600 hover:pr-bg-white hover:pr-text-blue-600", + ...e, + children: [ + /* @__PURE__ */ l(zp, { size: 16, className: "pr-mr-2 pr-h-4 pr-w-4 pr-text-gray-700 hover:pr-text-blue-600" }), + "Filter", + /* @__PURE__ */ l( + an, + { + size: 16, + className: "pr-ml-2 pr-h-4 pr-w-4 pr-text-gray-700 hover:pr-text-blue-600" + } + ) + ] + } +)); +var Lg = /* @__PURE__ */ ((e) => (e[e.Check = 0] = "Check", e[e.Radio = 1] = "Radio", e))(Lg || {}); +function A0({ id: e, groups: r }) { + return /* @__PURE__ */ l("div", { id: e, children: /* @__PURE__ */ E(bo, { children: [ + /* @__PURE__ */ l(Oi, { asChild: !0, children: /* @__PURE__ */ l(Vg, {}) }), + /* @__PURE__ */ l(ln, { children: r.map((t) => /* @__PURE__ */ E("div", { children: [ + /* @__PURE__ */ l(Ct, { children: t.label }), + /* @__PURE__ */ l(Ol, { children: t.items.map((n) => /* @__PURE__ */ l("div", { children: n.itemType === 0 ? /* @__PURE__ */ l(wo, { onClick: n.onClick, children: n.label }) : /* @__PURE__ */ l(Pi, { onClick: n.onClick, value: n.label, children: n.label }) }, n.label)) }), + /* @__PURE__ */ l(cn, {}) + ] }, t.label)) }) + ] }) }); +} +function D0({ id: e, message: r }) { + return /* @__PURE__ */ l("div", { id: e, className: "pr-mb-20 pr-mt-20 pr-flex pr-items-center pr-justify-center", children: /* @__PURE__ */ l("div", { className: "pr-w-3/4 pr-rounded-lg pr-bg-gray-100 pr-p-8 pr-text-center", children: /* @__PURE__ */ l("p", { className: "pr-text-lg pr-text-gray-800", children: r }) }) }); +} +function M0({ + id: e, + category: r, + downloads: t, + languages: n, + moreInfoUrl: o +}) { + const a = new qp("en", { + notation: "compact", + compactDisplay: "short" + }).format(Object.values(t).reduce((s, c) => s + c, 0)), i = () => { + window.scrollTo(0, document.body.scrollHeight); + }; + return /* @__PURE__ */ E( + "div", + { + id: e, + className: "pr-flex pr-flex-wrap pr-items-start pr-space-x-4 pr-border-b pr-border-t pr-bg-white pr-pb-4 pr-pt-4", + children: [ + /* @__PURE__ */ E("div", { className: "pr-flex pr-flex-col pr-items-center", children: [ + /* @__PURE__ */ l("div", { className: "pr-flex pr-items-center pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1", children: /* @__PURE__ */ l("span", { className: "pr-text-xs pr-font-semibold pr-text-gray-700", children: r }) }), + /* @__PURE__ */ l("span", { className: "pr-text-xs pr-text-gray-500", children: "CATEGORY" }) + ] }), + /* @__PURE__ */ l("div", { className: "pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300" }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-flex-col pr-items-center", children: [ + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-center pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1", children: [ + /* @__PURE__ */ l(Fp, { className: "pr-mr-1 pr-h-4 pr-w-4" }), + /* @__PURE__ */ l("span", { className: "pr-text-xs pr-font-semibold pr-text-gray-700", children: a }) + ] }), + /* @__PURE__ */ l("span", { className: "pr-text-xs pr-text-gray-500", children: "USERS" }) + ] }), + /* @__PURE__ */ l("div", { className: "pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300" }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-flex-col pr-items-center", children: [ + /* @__PURE__ */ l("div", { className: "pr-flex pr-items-center", children: n.slice(0, 3).map((s) => /* @__PURE__ */ l( + "span", + { + className: "pr-ml-1 pr-rounded-md pr-bg-gray-100 pr-px-2 pr-py-1 pr-text-xs pr-font-semibold pr-text-gray-700", + children: s.toUpperCase() + }, + s + )) }), + n.length > 3 && /* @__PURE__ */ E( + "button", + { + type: "button", + onClick: () => i(), + className: "pr-text-xs pr-text-gray-500 pr-underline", + children: [ + "+", + n.length - 3, + " more languages" + ] + } + ) + ] }), + /* @__PURE__ */ l("div", { className: "pr-mx-2 pr-h-10 pr-border-l pr-border-gray-300" }), + /* @__PURE__ */ E("div", { className: "pr-ml-auto pr-flex pr-flex-col pr-space-y-2", children: [ + /* @__PURE__ */ E( + "a", + { + href: o, + target: "_blank", + rel: "noreferrer", + className: "pr-flex pr-items-center pr-text-xs pr-font-semibold pr-text-gray-500 pr-underline", + children: [ + "Website", + /* @__PURE__ */ l(Up, { className: "pr-ml-1 pr-inline pr-h-4 pr-w-4" }) + ] + } + ), + /* @__PURE__ */ E( + "a", + { + href: "https://example.com", + target: "_blank", + rel: "noreferrer", + className: "pr-flex pr-items-center pr-text-xs pr-font-semibold pr-text-gray-500 pr-underline", + children: [ + "Support", + /* @__PURE__ */ l(Gp, { className: "pr-ml-1 pr-inline pr-h-4 pr-w-4" }) + ] + } + ) + ] }) + ] + } + ); +} +function zg({ id: e, versionHistory: r }) { + const [t, n] = fe(!1), o = /* @__PURE__ */ new Date(); + function a(s) { + const c = new Date(s), d = new Date(o.getTime() - c.getTime()), u = d.getUTCFullYear() - 1970, b = d.getUTCMonth(), p = d.getUTCDate() - 1; + let h = ""; + return u > 0 ? h = `${u.toString()} year${u === 1 ? "" : "s"} ago` : b > 0 ? h = `${b.toString()} month${b === 1 ? "" : "s"} ago` : p === 0 ? h = "today" : h = `${p.toString()} day${p === 1 ? "" : "s"} ago`, h; + } + const i = Object.entries(r).sort((s, c) => c[0].localeCompare(s[0])); + return /* @__PURE__ */ E("div", { id: e, children: [ + /* @__PURE__ */ l("h3", { className: "pr-text-md pr-font-semibold", children: "What`s New" }), + /* @__PURE__ */ l("ul", { className: "pr-list-disc pr-pl-5 pr-pr-4 pr-text-xs pr-text-gray-600", children: (t ? i : i.slice(0, 5)).map((s) => /* @__PURE__ */ E("div", { className: "pr-mt-3 pr-flex pr-justify-between", children: [ + /* @__PURE__ */ l("div", { className: "pr-text-gray-600", children: /* @__PURE__ */ l("li", { className: "pr-prose pr-text-xs", children: /* @__PURE__ */ l("span", { children: s[1].description }) }) }), + /* @__PURE__ */ E("div", { className: "pr-justify-end pr-text-right", children: [ + /* @__PURE__ */ E("div", { children: [ + "Version ", + s[0] + ] }), + /* @__PURE__ */ l("div", { children: a(s[1].date) }) + ] }) + ] }, s[0])) }), + i.length > 5 && /* @__PURE__ */ l( + "button", + { + type: "button", + onClick: () => n(!t), + className: "pr-text-xs pr-text-gray-500 pr-underline", + children: t ? "Show Less Version History" : "Show All Version History" + } + ) + ] }); +} +function B0({ + id: e, + publisherDisplayName: r, + fileSize: t, + locales: n, + versionHistory: o +}) { + const a = lr(() => Kp(t), [t]), s = ((c) => { + const d = new Intl.DisplayNames(navigator.language, { type: "language" }); + return c.map((u) => d.of(u)); + })(n); + return /* @__PURE__ */ l("div", { id: e, className: "pr-border-t pr-pb-4 pr-pt-4", children: /* @__PURE__ */ E("div", { className: "pr-md:flex-row pr-md:space-x-8 pr-flex pr-flex-col pr-space-x-0", children: [ + /* @__PURE__ */ l(zg, { versionHistory: o }), + /* @__PURE__ */ l("div", { className: "pr-md:border-t-0 pr-md:border-l pr-md-h-auto pr-md-ml-8 pr-mt-4 pr-border-t pr-border-gray-300" }), + /* @__PURE__ */ E("div", { className: "pr-md:mt-0 pr-mt-4 pr-flex-1 pr-space-y-3", children: [ + /* @__PURE__ */ l("h2", { className: "pr-text-md pr-font-semibold", children: "Information" }), + /* @__PURE__ */ E("div", { className: "pr-flex pr-items-start pr-justify-between pr-pr-4 pr-text-xs pr-text-gray-600", children: [ + /* @__PURE__ */ E("p", { className: "pr-flex pr-flex-col pr-justify-start", children: [ + /* @__PURE__ */ l("span", { className: "pr-mb-2", children: "Publisher" }), + /* @__PURE__ */ l("span", { className: "pr-font-semibold", children: r }), + /* @__PURE__ */ l("span", { className: "pr-mb-2 pr-mt-4", children: "Size" }), + /* @__PURE__ */ l("span", { className: "pr-font-semibold", children: a }) + ] }), + /* @__PURE__ */ l("div", { className: "pr-flex pr-w-3/4 pr-items-center pr-justify-between pr-text-xs pr-text-gray-600", children: /* @__PURE__ */ E("p", { className: "pr-flex pr-flex-col pr-justify-start", children: [ + /* @__PURE__ */ l("span", { className: "pr-mb-2", children: "Languages" }), + /* @__PURE__ */ l("span", { className: "pr-font-semibold", children: s.join(", ") }) + ] }) }) + ] }) + ] }) + ] }) }); +} +const j0 = (e, r) => { + Xe(() => { + if (!e) + return () => { + }; + const t = e(r); + return () => { + t(); + }; + }, [e, r]); +}, Jn = () => !1, V0 = (e, r) => { + const [t] = uo( + Se(async () => { + if (!e) + return Jn; + const n = await Promise.resolve(e(r)); + return async () => n(); + }, [r, e]), + Jn, + // We want the unsubscriber to return to default value immediately upon changing subscription + // So the useEffect below will unsubscribe asap + { preserveValue: !1 } + ); + Xe(() => () => { + t !== Jn && t(); + }, [t]); +}; +function Fg(e, r = "top") { + if (!e || typeof document > "u") + return; + const t = document.head || document.querySelector("head"), n = t.querySelector(":first-child"), o = document.createElement("style"); + o.appendChild(document.createTextNode(e)), r === "top" && n ? t.insertBefore(o, n) : t.appendChild(o); +} +Fg(`/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*:where(.pr-twp,.pr-twp *), +::before:where(.pr-twp,.pr-twp *), +::after:where(.pr-twp,.pr-twp *) { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e5e7eb; /* 2 */ +} + +::before:where(.pr-twp,.pr-twp *), +::after:where(.pr-twp,.pr-twp *) { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured \`sans\` font-family by default. +5. Use the user's configured \`sans\` font-feature-settings by default. +6. Use the user's configured \`sans\` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html:where(.pr-twp,.pr-twp *), +:host:where(.pr-twp,.pr-twp *) { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ /* 3 */ + tab-size: 4; /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element. +*/ + +body:where(.pr-twp,.pr-twp *) { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr:where(.pr-twp,.pr-twp *) { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]):where(.pr-twp,.pr-twp *) { + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1:where(.pr-twp,.pr-twp *), +h2:where(.pr-twp,.pr-twp *), +h3:where(.pr-twp,.pr-twp *), +h4:where(.pr-twp,.pr-twp *), +h5:where(.pr-twp,.pr-twp *), +h6:where(.pr-twp,.pr-twp *) { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a:where(.pr-twp,.pr-twp *) { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b:where(.pr-twp,.pr-twp *), +strong:where(.pr-twp,.pr-twp *) { + font-weight: bolder; +} + +/* +1. Use the user's configured \`mono\` font-family by default. +2. Use the user's configured \`mono\` font-feature-settings by default. +3. Use the user's configured \`mono\` font-variation-settings by default. +4. Correct the odd \`em\` font sizing in all browsers. +*/ + +code:where(.pr-twp,.pr-twp *), +kbd:where(.pr-twp,.pr-twp *), +samp:where(.pr-twp,.pr-twp *), +pre:where(.pr-twp,.pr-twp *) { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small:where(.pr-twp,.pr-twp *) { + font-size: 80%; +} + +/* +Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers. +*/ + +sub:where(.pr-twp,.pr-twp *), +sup:where(.pr-twp,.pr-twp *) { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub:where(.pr-twp,.pr-twp *) { + bottom: -0.25em; +} + +sup:where(.pr-twp,.pr-twp *) { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table:where(.pr-twp,.pr-twp *) { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button:where(.pr-twp,.pr-twp *), +input:where(.pr-twp,.pr-twp *), +optgroup:where(.pr-twp,.pr-twp *), +select:where(.pr-twp,.pr-twp *), +textarea:where(.pr-twp,.pr-twp *) { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button:where(.pr-twp,.pr-twp *), +select:where(.pr-twp,.pr-twp *) { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button:where(.pr-twp,.pr-twp *), +input:where([type='button']):where(.pr-twp,.pr-twp *), +input:where([type='reset']):where(.pr-twp,.pr-twp *), +input:where([type='submit']):where(.pr-twp,.pr-twp *) { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring:where(.pr-twp,.pr-twp *) { + outline: auto; +} + +/* +Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid:where(.pr-twp,.pr-twp *) { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress:where(.pr-twp,.pr-twp *) { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button:where(.pr-twp,.pr-twp *), +::-webkit-outer-spin-button:where(.pr-twp,.pr-twp *) { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search']:where(.pr-twp,.pr-twp *) { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration:where(.pr-twp,.pr-twp *) { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to \`inherit\` in Safari. +*/ + +::-webkit-file-upload-button:where(.pr-twp,.pr-twp *) { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary:where(.pr-twp,.pr-twp *) { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote:where(.pr-twp,.pr-twp *), +dl:where(.pr-twp,.pr-twp *), +dd:where(.pr-twp,.pr-twp *), +h1:where(.pr-twp,.pr-twp *), +h2:where(.pr-twp,.pr-twp *), +h3:where(.pr-twp,.pr-twp *), +h4:where(.pr-twp,.pr-twp *), +h5:where(.pr-twp,.pr-twp *), +h6:where(.pr-twp,.pr-twp *), +hr:where(.pr-twp,.pr-twp *), +figure:where(.pr-twp,.pr-twp *), +p:where(.pr-twp,.pr-twp *), +pre:where(.pr-twp,.pr-twp *) { + margin: 0; +} + +fieldset:where(.pr-twp,.pr-twp *) { + margin: 0; + padding: 0; +} + +legend:where(.pr-twp,.pr-twp *) { + padding: 0; +} + +ol:where(.pr-twp,.pr-twp *), +ul:where(.pr-twp,.pr-twp *), +menu:where(.pr-twp,.pr-twp *) { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ +dialog:where(.pr-twp,.pr-twp *) { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea:where(.pr-twp,.pr-twp *) { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::placeholder:where(.pr-twp,.pr-twp *), +textarea::placeholder:where(.pr-twp,.pr-twp *) { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button:where(.pr-twp,.pr-twp *), +[role="button"]:where(.pr-twp,.pr-twp *) { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled:where(.pr-twp,.pr-twp *) { + cursor: default; +} + +/* +1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img:where(.pr-twp,.pr-twp *), +svg:where(.pr-twp,.pr-twp *), +video:where(.pr-twp,.pr-twp *), +canvas:where(.pr-twp,.pr-twp *), +audio:where(.pr-twp,.pr-twp *), +iframe:where(.pr-twp,.pr-twp *), +embed:where(.pr-twp,.pr-twp *), +object:where(.pr-twp,.pr-twp *) { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img:where(.pr-twp,.pr-twp *), +video:where(.pr-twp,.pr-twp *) { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden]:where(.pr-twp,.pr-twp *) { + display: none; +} + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* Adding the preflight selector (pr-twp) to components was not changing the font as desired. + So this piece of code adds pr-font-sans everywhere we include preflight. */ + .pr-twp { + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + * { + border-color: hsl(var(--border)); +} + + body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +.pr-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} +.pr-pointer-events-none { + pointer-events: none; +} +.pr-fixed { + position: fixed; +} +.pr-absolute { + position: absolute; +} +.pr-relative { + position: relative; +} +.pr-sticky { + position: sticky; +} +.pr-inset-0 { + inset: 0px; +} +.pr-inset-y-0 { + top: 0px; + bottom: 0px; +} +.pr-bottom-2 { + bottom: 0.5rem; +} +.pr-left-2 { + left: 0.5rem; +} +.pr-left-2\\.5 { + left: 0.625rem; +} +.pr-left-\\[50\\%\\] { + left: 50%; +} +.pr-right-3 { + right: 0.75rem; +} +.pr-right-4 { + right: 1rem; +} +.pr-top-0 { + top: 0px; +} +.pr-top-1\\/2 { + top: 50%; +} +.pr-top-2 { + top: 0.5rem; +} +.pr-top-2\\.5 { + top: 0.625rem; +} +.pr-top-4 { + top: 1rem; +} +.pr-top-\\[50\\%\\] { + top: 50%; +} +.pr-z-10 { + z-index: 10; +} +.pr-z-30 { + z-index: 30; +} +.pr-z-50 { + z-index: 50; +} +.pr-col-span-2 { + grid-column: span 2 / span 2; +} +.pr-m-1 { + margin: 0.25rem; +} +.pr-m-2 { + margin: 0.5rem; +} +.pr--mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +.pr-mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.pr-mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} +.pr-my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.pr-my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.pr-my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.pr-mb-1 { + margin-bottom: 0.25rem; +} +.pr-mb-2 { + margin-bottom: 0.5rem; +} +.pr-mb-20 { + margin-bottom: 5rem; +} +.pr-me-2 { + margin-inline-end: 0.5rem; +} +.pr-ml-1 { + margin-left: 0.25rem; +} +.pr-ml-2 { + margin-left: 0.5rem; +} +.pr-ml-auto { + margin-left: auto; +} +.pr-mr-1 { + margin-right: 0.25rem; +} +.pr-mr-2 { + margin-right: 0.5rem; +} +.pr-ms-2 { + margin-inline-start: 0.5rem; +} +.pr-ms-5 { + margin-inline-start: 1.25rem; +} +.pr-ms-auto { + margin-inline-start: auto; +} +.pr-mt-2 { + margin-top: 0.5rem; +} +.pr-mt-20 { + margin-top: 5rem; +} +.pr-mt-3 { + margin-top: 0.75rem; +} +.pr-mt-4 { + margin-top: 1rem; +} +.pr-mt-auto { + margin-top: auto; +} +.pr-box-border { + box-sizing: border-box; +} +.pr-box-content { + box-sizing: content-box; +} +.pr-block { + display: block; +} +.pr-inline-block { + display: inline-block; +} +.pr-inline { + display: inline; +} +.pr-flex { + display: flex; +} +.pr-inline-flex { + display: inline-flex; +} +.pr-grid { + display: grid; +} +.pr-inline-grid { + display: inline-grid; +} +.pr-hidden { + display: none; +} +.pr-aspect-square { + aspect-ratio: 1 / 1; +} +.pr-h-1\\/2 { + height: 50%; +} +.pr-h-10 { + height: 2.5rem; +} +.pr-h-11 { + height: 2.75rem; +} +.pr-h-12 { + height: 3rem; +} +.pr-h-14 { + height: 3.5rem; +} +.pr-h-2 { + height: 0.5rem; +} +.pr-h-2\\.5 { + height: 0.625rem; +} +.pr-h-24 { + height: 6rem; +} +.pr-h-3 { + height: 0.75rem; +} +.pr-h-3\\.5 { + height: 0.875rem; +} +.pr-h-4 { + height: 1rem; +} +.pr-h-5 { + height: 1.25rem; +} +.pr-h-6 { + height: 1.5rem; +} +.pr-h-7 { + height: 1.75rem; +} +.pr-h-8 { + height: 2rem; +} +.pr-h-9 { + height: 2.25rem; +} +.pr-h-96 { + height: 24rem; +} +.pr-h-\\[1\\.2rem\\] { + height: 1.2rem; +} +.pr-h-\\[100\\%\\] { + height: 100%; +} +.pr-h-\\[1px\\] { + height: 1px; +} +.pr-h-\\[405px\\] { + height: 405px; +} +.pr-h-\\[var\\(--radix-select-trigger-height\\)\\] { + height: var(--radix-select-trigger-height); +} +.pr-h-full { + height: 100%; +} +.pr-h-px { + height: 1px; +} +.pr-max-h-96 { + max-height: 24rem; +} +.pr-max-h-\\[300px\\] { + max-height: 300px; +} +.pr-w-0 { + width: 0px; +} +.pr-w-1\\/3 { + width: 33.333333%; +} +.pr-w-10 { + width: 2.5rem; +} +.pr-w-11 { + width: 2.75rem; +} +.pr-w-14 { + width: 3.5rem; +} +.pr-w-2 { + width: 0.5rem; +} +.pr-w-2\\.5 { + width: 0.625rem; +} +.pr-w-20 { + width: 5rem; +} +.pr-w-3 { + width: 0.75rem; +} +.pr-w-3\\.5 { + width: 0.875rem; +} +.pr-w-3\\/4 { + width: 75%; +} +.pr-w-4 { + width: 1rem; +} +.pr-w-5 { + width: 1.25rem; +} +.pr-w-6 { + width: 1.5rem; +} +.pr-w-72 { + width: 18rem; +} +.pr-w-8 { + width: 2rem; +} +.pr-w-9 { + width: 2.25rem; +} +.pr-w-\\[1\\.2rem\\] { + width: 1.2rem; +} +.pr-w-\\[100px\\] { + width: 100px; +} +.pr-w-\\[116px\\] { + width: 116px; +} +.pr-w-\\[124px\\] { + width: 124px; +} +.pr-w-\\[150px\\] { + width: 150px; +} +.pr-w-\\[1px\\] { + width: 1px; +} +.pr-w-\\[200px\\] { + width: 200px; +} +.pr-w-\\[350px\\] { + width: 350px; +} +.pr-w-\\[70px\\] { + width: 70px; +} +.pr-w-auto { + width: auto; +} +.pr-w-full { + width: 100%; +} +.pr-min-w-\\[8rem\\] { + min-width: 8rem; +} +.pr-min-w-\\[var\\(--radix-select-trigger-width\\)\\] { + min-width: var(--radix-select-trigger-width); +} +.pr-max-w-64 { + max-width: 16rem; +} +.pr-max-w-lg { + max-width: 32rem; +} +.pr-flex-1 { + flex: 1 1 0%; +} +.pr-shrink-0 { + flex-shrink: 0; +} +.pr-flex-grow { + flex-grow: 1; +} +.pr-grow { + flex-grow: 1; +} +.pr-caption-bottom { + caption-side: bottom; +} +.pr--translate-y-1\\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-translate-x-\\[-50\\%\\] { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-translate-y-\\[-50\\%\\] { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-rotate-0 { + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-scale-0 { + --tw-scale-x: 0; + --tw-scale-y: 0; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.pr-transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +@keyframes pr-spin { + + to { + transform: rotate(360deg); + } +} +.pr-animate-spin { + animation: pr-spin 1s linear infinite; +} +.pr-cursor-default { + cursor: default; +} +.pr-cursor-not-allowed { + cursor: not-allowed; +} +.pr-cursor-pointer { + cursor: pointer; +} +.pr-touch-none { + touch-action: none; +} +.pr-select-none { + user-select: none; +} +.pr-list-disc { + list-style-type: disc; +} +.pr-columns-2 { + columns: 2; +} +.pr-auto-rows-max { + grid-auto-rows: max-content; +} +.pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.pr-grid-cols-\\[25\\%\\,25\\%\\,50\\%\\] { + grid-template-columns: 25% 25% 50%; +} +.pr-grid-cols-\\[25\\%\\,50\\%\\,25\\%\\] { + grid-template-columns: 25% 50% 25%; +} +.pr-flex-row { + flex-direction: row; +} +.pr-flex-col { + flex-direction: column; +} +.pr-flex-col-reverse { + flex-direction: column-reverse; +} +.pr-flex-wrap { + flex-wrap: wrap; +} +.pr-items-start { + align-items: flex-start; +} +.pr-items-center { + align-items: center; +} +.pr-justify-start { + justify-content: flex-start; +} +.pr-justify-end { + justify-content: flex-end; +} +.pr-justify-center { + justify-content: center; +} +.pr-justify-between { + justify-content: space-between; +} +.pr-gap-0 { + gap: 0px; +} +.pr-gap-0\\.5 { + gap: 0.125rem; +} +.pr-gap-1 { + gap: 0.25rem; +} +.pr-gap-1\\.5 { + gap: 0.375rem; +} +.pr-gap-2 { + gap: 0.5rem; +} +.pr-gap-2\\.5 { + gap: 0.625rem; +} +.pr-gap-3 { + gap: 0.75rem; +} +.pr-gap-4 { + gap: 1rem; +} +.pr-gap-6 { + gap: 1.5rem; +} +.pr-gap-x-4 { + column-gap: 1rem; +} +.pr-space-x-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0px * var(--tw-space-x-reverse)); + margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-x-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1.5rem * var(--tw-space-x-reverse)); + margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); +} +.pr-space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} +.pr-space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} +.pr-space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} +.pr-space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} +.pr-space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} +.pr-self-stretch { + align-self: stretch; +} +.pr-overflow-auto { + overflow: auto; +} +.pr-overflow-hidden { + overflow: hidden; +} +.pr-overflow-y-auto { + overflow-y: auto; +} +.pr-overflow-x-hidden { + overflow-x: hidden; +} +.pr-overflow-y-hidden { + overflow-y: hidden; +} +.pr-text-ellipsis { + text-overflow: ellipsis; +} +.pr-whitespace-normal { + white-space: normal; +} +.pr-whitespace-nowrap { + white-space: nowrap; +} +.pr-text-nowrap { + text-wrap: nowrap; +} +.pr-text-balance { + text-wrap: balance; +} +.pr-break-words { + overflow-wrap: break-word; +} +.pr-rounded-full { + border-radius: 9999px; +} +.pr-rounded-lg { + border-radius: var(--radius); +} +.pr-rounded-md { + border-radius: calc(var(--radius) - 2px); +} +.pr-rounded-sm { + border-radius: calc(var(--radius) - 4px); +} +.pr-rounded-s-md { + border-start-start-radius: calc(var(--radius) - 2px); + border-end-start-radius: calc(var(--radius) - 2px); +} +.pr-rounded-ee-none { + border-end-end-radius: 0px; +} +.pr-rounded-se-md { + border-start-end-radius: calc(var(--radius) - 2px); +} +.pr-rounded-ss-none { + border-start-start-radius: 0px; +} +.pr-border { + border-width: 1px; +} +.pr-border-0 { + border-width: 0px; +} +.pr-border-2 { + border-width: 2px; +} +.pr-border-b { + border-bottom-width: 1px; +} +.pr-border-b-0 { + border-bottom-width: 0px; +} +.pr-border-e { + border-inline-end-width: 1px; +} +.pr-border-l { + border-left-width: 1px; +} +.pr-border-l-2 { + border-left-width: 2px; +} +.pr-border-r-0 { + border-right-width: 0px; +} +.pr-border-t { + border-top-width: 1px; +} +.pr-border-t-0 { + border-top-width: 0px; +} +.pr-border-solid { + border-style: solid; +} +.pr-border-dashed { + border-style: dashed; +} +.pr-border-black { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity)); +} +.pr-border-destructive\\/50 { + border-color: hsl(var(--destructive) / 0.5); +} +.pr-border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} +.pr-border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} +.pr-border-input { + border-color: hsl(var(--input)); +} +.pr-border-primary { + border-color: hsl(var(--primary)); +} +.pr-border-red-600 { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity)); +} +.pr-border-transparent { + border-color: transparent; +} +.pr-border-l-indigo-200 { + --tw-border-opacity: 1; + border-left-color: rgb(199 210 254 / var(--tw-border-opacity)); +} +.pr-border-l-purple-200 { + --tw-border-opacity: 1; + border-left-color: rgb(233 213 255 / var(--tw-border-opacity)); +} +.pr-border-l-red-200 { + --tw-border-opacity: 1; + border-left-color: rgb(254 202 202 / var(--tw-border-opacity)); +} +.pr-bg-accent { + background-color: hsl(var(--accent)); +} +.pr-bg-accent-foreground { + background-color: hsl(var(--accent-foreground)); +} +.pr-bg-amber-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity)); +} +.pr-bg-amber-200 { + --tw-bg-opacity: 1; + background-color: rgb(253 230 138 / var(--tw-bg-opacity)); +} +.pr-bg-amber-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity)); +} +.pr-bg-background { + background-color: hsl(var(--background)); +} +.pr-bg-black\\/80 { + background-color: rgb(0 0 0 / 0.8); +} +.pr-bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} +.pr-bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} +.pr-bg-border { + background-color: hsl(var(--border)); +} +.pr-bg-card { + background-color: hsl(var(--card)); +} +.pr-bg-card-foreground { + background-color: hsl(var(--card-foreground)); +} +.pr-bg-destructive { + background-color: hsl(var(--destructive)); +} +.pr-bg-destructive-foreground { + background-color: hsl(var(--destructive-foreground)); +} +.pr-bg-foreground { + background-color: hsl(var(--foreground)); +} +.pr-bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} +.pr-bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} +.pr-bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} +.pr-bg-input { + background-color: hsl(var(--input)); +} +.pr-bg-muted { + background-color: hsl(var(--muted)); +} +.pr-bg-muted-foreground { + background-color: hsl(var(--muted-foreground)); +} +.pr-bg-muted\\/40 { + background-color: hsl(var(--muted) / 0.4); +} +.pr-bg-muted\\/50 { + background-color: hsl(var(--muted) / 0.5); +} +.pr-bg-neutral-300 { + --tw-bg-opacity: 1; + background-color: rgb(212 212 212 / var(--tw-bg-opacity)); +} +.pr-bg-popover { + background-color: hsl(var(--popover)); +} +.pr-bg-popover-foreground { + background-color: hsl(var(--popover-foreground)); +} +.pr-bg-primary { + background-color: hsl(var(--primary)); +} +.pr-bg-primary-foreground { + background-color: hsl(var(--primary-foreground)); +} +.pr-bg-ring { + background-color: hsl(var(--ring)); +} +.pr-bg-secondary { + background-color: hsl(var(--secondary)); +} +.pr-bg-secondary-foreground { + background-color: hsl(var(--secondary-foreground)); +} +.pr-bg-transparent { + background-color: transparent; +} +.pr-bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.pr-fill-current { + fill: currentColor; +} +.pr-p-0 { + padding: 0px; +} +.pr-p-1 { + padding: 0.25rem; +} +.pr-p-2 { + padding: 0.5rem; +} +.pr-p-4 { + padding: 1rem; +} +.pr-p-6 { + padding: 1.5rem; +} +.pr-p-8 { + padding: 2rem; +} +.pr-p-\\[1px\\] { + padding: 1px; +} +.pr-px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.pr-px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.pr-px-2\\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} +.pr-px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.pr-px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.pr-px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} +.pr-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.pr-px-7 { + padding-left: 1.75rem; + padding-right: 1.75rem; +} +.pr-px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.pr-py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.pr-py-1\\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} +.pr-py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.pr-py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.pr-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.pr-py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.pr-pb-2 { + padding-bottom: 0.5rem; +} +.pr-pb-3 { + padding-bottom: 0.75rem; +} +.pr-pb-4 { + padding-bottom: 1rem; +} +.pr-pe-2 { + padding-inline-end: 0.5rem; +} +.pr-pl-4 { + padding-left: 1rem; +} +.pr-pl-5 { + padding-left: 1.25rem; +} +.pr-pl-8 { + padding-left: 2rem; +} +.pr-pr-2 { + padding-right: 0.5rem; +} +.pr-pr-3 { + padding-right: 0.75rem; +} +.pr-pr-4 { + padding-right: 1rem; +} +.pr-ps-12 { + padding-inline-start: 3rem; +} +.pr-ps-4 { + padding-inline-start: 1rem; +} +.pr-ps-8 { + padding-inline-start: 2rem; +} +.pr-pt-0 { + padding-top: 0px; +} +.pr-pt-3 { + padding-top: 0.75rem; +} +.pr-pt-4 { + padding-top: 1rem; +} +.pr-text-center { + text-align: center; +} +.pr-text-right { + text-align: right; +} +.pr-text-start { + text-align: start; +} +.pr-text-end { + text-align: end; +} +.pr-align-middle { + vertical-align: middle; +} +.pr-text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} +.pr-text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} +.pr-text-5xl { + font-size: 3rem; + line-height: 1; +} +.pr-text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} +.pr-text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} +.pr-text-xs { + font-size: 0.75rem; + line-height: 1rem; +} +.pr-font-bold { + font-weight: 700; +} +.pr-font-medium { + font-weight: 500; +} +.pr-font-normal { + font-weight: 400; +} +.pr-font-semibold { + font-weight: 600; +} +.pr-uppercase { + text-transform: uppercase; +} +.pr-capitalize { + text-transform: capitalize; +} +.pr-not-italic { + font-style: normal; +} +.pr-tabular-nums { + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} +.pr-leading-9 { + line-height: 2.25rem; +} +.pr-leading-none { + line-height: 1; +} +.pr-leading-relaxed { + line-height: 1.625; +} +.pr-tracking-tight { + letter-spacing: -0.025em; +} +.pr-tracking-widest { + letter-spacing: 0.1em; +} +.pr-text-accent-foreground { + color: hsl(var(--accent-foreground)); +} +.pr-text-amber-800 { + --tw-text-opacity: 1; + color: rgb(146 64 14 / var(--tw-text-opacity)); +} +.pr-text-amber-900 { + --tw-text-opacity: 1; + color: rgb(120 53 15 / var(--tw-text-opacity)); +} +.pr-text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} +.pr-text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} +.pr-text-card-foreground { + color: hsl(var(--card-foreground)); +} +.pr-text-current { + color: currentColor; +} +.pr-text-destructive { + color: hsl(var(--destructive)); +} +.pr-text-destructive-foreground { + color: hsl(var(--destructive-foreground)); +} +.pr-text-foreground { + color: hsl(var(--foreground)); +} +.pr-text-foreground\\/80 { + color: hsl(var(--foreground) / 0.8); +} +.pr-text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} +.pr-text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} +.pr-text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} +.pr-text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} +.pr-text-inherit { + color: inherit; +} +.pr-text-muted-foreground { + color: hsl(var(--muted-foreground)); +} +.pr-text-popover-foreground { + color: hsl(var(--popover-foreground)); +} +.pr-text-primary { + color: hsl(var(--primary)); +} +.pr-text-primary-foreground { + color: hsl(var(--primary-foreground)); +} +.pr-text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} +.pr-text-secondary-foreground { + color: hsl(var(--secondary-foreground)); +} +.pr-text-slate-900 { + --tw-text-opacity: 1; + color: rgb(15 23 42 / var(--tw-text-opacity)); +} +.pr-text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.pr-text-yellow-900 { + --tw-text-opacity: 1; + color: rgb(113 63 18 / var(--tw-text-opacity)); +} +.pr-underline { + text-decoration-line: underline; +} +.pr-underline-offset-4 { + text-underline-offset: 4px; +} +.pr-opacity-0 { + opacity: 0; +} +.pr-opacity-50 { + opacity: 0.5; +} +.pr-opacity-60 { + opacity: 0.6; +} +.pr-opacity-70 { + opacity: 0.7; +} +.pr-shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.pr-outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} +.pr-ring-0 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.pr-ring-offset-background { + --tw-ring-offset-color: hsl(var(--background)); +} +.pr-transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.pr-duration-200 { + transition-duration: 200ms; +} +.pr-duration-300 { + transition-duration: 300ms; +} +.pr-ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +@keyframes enter { + + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0)); + } +} +@keyframes exit { + + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0)); + } +} +.pr-duration-200 { + animation-duration: 200ms; +} +.pr-duration-300 { + animation-duration: 300ms; +} +.pr-ease-in-out { + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.\\*\\:pr-m-4 > * { + margin: 1rem; +} +.file\\:pr-border-0::file-selector-button { + border-width: 0px; +} +.file\\:pr-bg-transparent::file-selector-button { + background-color: transparent; +} +.file\\:pr-text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.25rem; +} +.file\\:pr-font-medium::file-selector-button { + font-weight: 500; +} +.placeholder\\:pr-text-muted-foreground::placeholder { + color: hsl(var(--muted-foreground)); +} +.hover\\:pr-border-blue-600:hover { + --tw-border-opacity: 1; + border-color: rgb(37 99 235 / var(--tw-border-opacity)); +} +.hover\\:pr-bg-accent:hover { + background-color: hsl(var(--accent)); +} +.hover\\:pr-bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} +.hover\\:pr-bg-destructive\\/90:hover { + background-color: hsl(var(--destructive) / 0.9); +} +.hover\\:pr-bg-gray-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} +.hover\\:pr-bg-muted:hover { + background-color: hsl(var(--muted)); +} +.hover\\:pr-bg-muted\\/50:hover { + background-color: hsl(var(--muted) / 0.5); +} +.hover\\:pr-bg-primary\\/90:hover { + background-color: hsl(var(--primary) / 0.9); +} +.hover\\:pr-bg-secondary\\/80:hover { + background-color: hsl(var(--secondary) / 0.8); +} +.hover\\:pr-bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.hover\\:pr-text-accent-foreground:hover { + color: hsl(var(--accent-foreground)); +} +.hover\\:pr-text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} +.hover\\:pr-text-foreground:hover { + color: hsl(var(--foreground)); +} +.hover\\:pr-text-muted-foreground:hover { + color: hsl(var(--muted-foreground)); +} +.hover\\:pr-text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.hover\\:pr-underline:hover { + text-decoration-line: underline; +} +.hover\\:pr-opacity-100:hover { + opacity: 1; +} +.focus\\:pr-bg-accent:focus { + background-color: hsl(var(--accent)); +} +.focus\\:pr-text-accent-foreground:focus { + color: hsl(var(--accent-foreground)); +} +.focus\\:pr-outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} +.focus\\:pr-ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.focus\\:pr-ring-ring:focus { + --tw-ring-color: hsl(var(--ring)); +} +.focus\\:pr-ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} +.focus-visible\\:pr-outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} +.focus-visible\\:pr-ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.focus-visible\\:pr-ring-\\[color\\:hsl\\(2400o2c 5\\%0o2c 64\\.9\\%\\)\\]:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: hsl(240 5% 64.9% / var(--tw-ring-opacity)); +} +.focus-visible\\:pr-ring-ring:focus-visible { + --tw-ring-color: hsl(var(--ring)); +} +.focus-visible\\:pr-ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} +.focus-visible\\:pr-ring-offset-background:focus-visible { + --tw-ring-offset-color: hsl(var(--background)); +} +.disabled\\:pr-pointer-events-none:disabled { + pointer-events: none; +} +.disabled\\:pr-cursor-not-allowed:disabled { + cursor: not-allowed; +} +.disabled\\:pr-opacity-50:disabled { + opacity: 0.5; +} +.pr-group:hover .group-hover\\:pr-opacity-100 { + opacity: 1; +} +.pr-peer:disabled ~ .peer-disabled\\:pr-cursor-not-allowed { + cursor: not-allowed; +} +.pr-peer:disabled ~ .peer-disabled\\:pr-opacity-70 { + opacity: 0.7; +} +.data-\\[disabled\\=true\\]\\:pr-pointer-events-none[data-disabled=true] { + pointer-events: none; +} +.data-\\[disabled\\]\\:pr-pointer-events-none[data-disabled] { + pointer-events: none; +} +.data-\\[side\\=bottom\\]\\:pr-translate-y-1[data-side=bottom] { + --tw-translate-y: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=left\\]\\:pr--translate-x-1[data-side=left] { + --tw-translate-x: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=right\\]\\:pr-translate-x-1[data-side=right] { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[side\\=top\\]\\:pr--translate-y-1[data-side=top] { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[state\\=checked\\]\\:pr-translate-x-5[data-state=checked] { + --tw-translate-x: 1.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[state\\=unchecked\\]\\:pr-translate-x-0[data-state=unchecked] { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.data-\\[highlighted\\]\\:pr-bg-amber-100[data-highlighted] { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity)); +} +.data-\\[selected\\=true\\]\\:pr-bg-accent[data-selected=true] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=active\\]\\:pr-bg-background[data-state=active] { + background-color: hsl(var(--background)); +} +.data-\\[state\\=checked\\]\\:pr-bg-primary[data-state=checked] { + background-color: hsl(var(--primary)); +} +.data-\\[state\\=on\\]\\:pr-bg-accent[data-state=on] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=open\\]\\:pr-bg-accent[data-state=open] { + background-color: hsl(var(--accent)); +} +.data-\\[state\\=selected\\]\\:pr-bg-muted[data-state=selected] { + background-color: hsl(var(--muted)); +} +.data-\\[state\\=unchecked\\]\\:pr-bg-input[data-state=unchecked] { + background-color: hsl(var(--input)); +} +.data-\\[selected\\=true\\]\\:pr-text-accent-foreground[data-selected=true] { + color: hsl(var(--accent-foreground)); +} +.data-\\[state\\=active\\]\\:pr-text-foreground[data-state=active] { + color: hsl(var(--foreground)); +} +.data-\\[state\\=checked\\]\\:pr-text-primary-foreground[data-state=checked] { + color: hsl(var(--primary-foreground)); +} +.data-\\[state\\=on\\]\\:pr-text-accent-foreground[data-state=on] { + color: hsl(var(--accent-foreground)); +} +.data-\\[state\\=open\\]\\:pr-text-muted-foreground[data-state=open] { + color: hsl(var(--muted-foreground)); +} +.data-\\[disabled\\=true\\]\\:pr-opacity-50[data-disabled=true] { + opacity: 0.5; +} +.data-\\[disabled\\]\\:pr-opacity-50[data-disabled] { + opacity: 0.5; +} +.data-\\[state\\=active\\]\\:pr-shadow-sm[data-state=active] { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.data-\\[state\\=open\\]\\:pr-animate-in[data-state=open] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} +.data-\\[state\\=closed\\]\\:pr-animate-out[data-state=closed] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} +.data-\\[state\\=closed\\]\\:pr-fade-out-0[data-state=closed] { + --tw-exit-opacity: 0; +} +.data-\\[state\\=open\\]\\:pr-fade-in-0[data-state=open] { + --tw-enter-opacity: 0; +} +.data-\\[state\\=closed\\]\\:pr-zoom-out-95[data-state=closed] { + --tw-exit-scale: .95; +} +.data-\\[state\\=open\\]\\:pr-zoom-in-95[data-state=open] { + --tw-enter-scale: .95; +} +.data-\\[side\\=bottom\\]\\:pr-slide-in-from-top-2[data-side=bottom] { + --tw-enter-translate-y: -0.5rem; +} +.data-\\[side\\=left\\]\\:pr-slide-in-from-right-2[data-side=left] { + --tw-enter-translate-x: 0.5rem; +} +.data-\\[side\\=right\\]\\:pr-slide-in-from-left-2[data-side=right] { + --tw-enter-translate-x: -0.5rem; +} +.data-\\[side\\=top\\]\\:pr-slide-in-from-bottom-2[data-side=top] { + --tw-enter-translate-y: 0.5rem; +} +.data-\\[state\\=closed\\]\\:pr-slide-out-to-left-1\\/2[data-state=closed] { + --tw-exit-translate-x: -50%; +} +.data-\\[state\\=closed\\]\\:pr-slide-out-to-top-\\[48\\%\\][data-state=closed] { + --tw-exit-translate-y: -48%; +} +.data-\\[state\\=open\\]\\:pr-slide-in-from-left-1\\/2[data-state=open] { + --tw-enter-translate-x: -50%; +} +.data-\\[state\\=open\\]\\:pr-slide-in-from-top-\\[48\\%\\][data-state=open] { + --tw-enter-translate-y: -48%; +} +@media (min-width: 640px) { + + .sm\\:pr-not-sr-only { + position: static; + width: auto; + height: auto; + padding: 0; + margin: 0; + overflow: visible; + clip: auto; + white-space: normal; + } + + .sm\\:pr-static { + position: static; + } + + .sm\\:pr-col-span-2 { + grid-column: span 2 / span 2; + } + + .sm\\:pr-flex { + display: flex; + } + + .sm\\:pr-table-cell { + display: table-cell; + } + + .sm\\:pr-hidden { + display: none; + } + + .sm\\:pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\\:pr-flex-row { + flex-direction: row; + } + + .sm\\:pr-justify-end { + justify-content: flex-end; + } + + .sm\\:pr-gap-4 { + gap: 1rem; + } + + .sm\\:pr-space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\\:pr-rounded-lg { + border-radius: var(--radius); + } + + .sm\\:pr-border-0 { + border-width: 0px; + } + + .sm\\:pr-bg-transparent { + background-color: transparent; + } + + .sm\\:pr-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\\:pr-py-0 { + padding-top: 0px; + padding-bottom: 0px; + } + + .sm\\:pr-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; + } + + .sm\\:pr-py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } + + .sm\\:pr-pl-14 { + padding-left: 3.5rem; + } + + .sm\\:pr-text-left { + text-align: left; + } +} +@media (min-width: 768px) { + + .md\\:pr-inline { + display: inline; + } + + .md\\:pr-flex { + display: flex; + } + + .md\\:pr-table-cell { + display: table-cell; + } + + .md\\:pr-h-8 { + height: 2rem; + } + + .md\\:pr-w-8 { + width: 2rem; + } + + .md\\:pr-w-\\[200px\\] { + width: 200px; + } + + .md\\:pr-grow-0 { + flex-grow: 0; + } + + .md\\:pr-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .md\\:pr-gap-8 { + gap: 2rem; + } + + .md\\:pr-text-base { + font-size: 1rem; + line-height: 1.5rem; + } +} +@media (min-width: 1024px) { + + .lg\\:pr-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; + } + + .lg\\:pr-col-span-2 { + grid-column: span 2 / span 2; + } + + .lg\\:pr-flex { + display: flex; + } + + .lg\\:pr-w-\\[336px\\] { + width: 336px; + } + + .lg\\:pr-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .lg\\:pr-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\\:pr-space-x-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2rem * var(--tw-space-x-reverse)); + margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); + } +} +@media (min-width: 1280px) { + + .xl\\:pr-not-sr-only { + position: static; + width: auto; + height: auto; + padding: 0; + margin: 0; + overflow: visible; + clip: auto; + white-space: normal; + } + + .xl\\:pr-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\\:pr-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .xl\\:pr-whitespace-nowrap { + white-space: nowrap; + } +} +@media (prefers-color-scheme: dark) { + + .dark\\:pr--rotate-90 { + --tw-rotate: -90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-rotate-0 { + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-scale-0 { + --tw-scale-x: 0; + --tw-scale-y: 0; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .dark\\:pr-border-destructive { + border-color: hsl(var(--destructive)); + } +} +.\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-pe-0:has([role=checkbox]) { + padding-inline-end: 0px; +} +.\\[\\&\\>span\\]\\:pr-line-clamp-1>span { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.\\[\\&\\>svg\\+div\\]\\:pr-translate-y-\\[-3px\\]>svg+div { + --tw-translate-y: -3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.\\[\\&\\>svg\\]\\:pr-absolute>svg { + position: absolute; +} +.\\[\\&\\>svg\\]\\:pr-left-4>svg { + left: 1rem; +} +.\\[\\&\\>svg\\]\\:pr-top-4>svg { + top: 1rem; +} +.\\[\\&\\>svg\\]\\:pr-text-destructive>svg { + color: hsl(var(--destructive)); +} +.\\[\\&\\>svg\\]\\:pr-text-foreground>svg { + color: hsl(var(--foreground)); +} +.\\[\\&\\>svg\\~\\*\\]\\:pr-pl-7>svg~* { + padding-left: 1.75rem; +} +.\\[\\&\\>tr\\]\\:last\\:pr-border-b-0:last-child>tr { + border-bottom-width: 0px; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-px-2 [cmdk-group-heading] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-py-1\\.5 [cmdk-group-heading] { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-text-xs [cmdk-group-heading] { + font-size: 0.75rem; + line-height: 1rem; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-font-medium [cmdk-group-heading] { + font-weight: 500; +} +.\\[\\&_\\[cmdk-group-heading\\]\\]\\:pr-text-muted-foreground [cmdk-group-heading] { + color: hsl(var(--muted-foreground)); +} +.\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pr-pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] { + padding-top: 0px; +} +.\\[\\&_\\[cmdk-group\\]\\]\\:pr-px-2 [cmdk-group] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:pr-h-5 [cmdk-input-wrapper] svg { + height: 1.25rem; +} +.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:pr-w-5 [cmdk-input-wrapper] svg { + width: 1.25rem; +} +.\\[\\&_\\[cmdk-input\\]\\]\\:pr-h-12 [cmdk-input] { + height: 3rem; +} +.\\[\\&_\\[cmdk-item\\]\\]\\:pr-px-2 [cmdk-item] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.\\[\\&_\\[cmdk-item\\]\\]\\:pr-py-3 [cmdk-item] { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.\\[\\&_\\[cmdk-item\\]_svg\\]\\:pr-h-5 [cmdk-item] svg { + height: 1.25rem; +} +.\\[\\&_\\[cmdk-item\\]_svg\\]\\:pr-w-5 [cmdk-item] svg { + width: 1.25rem; +} +.\\[\\&_p\\]\\:pr-leading-relaxed p { + line-height: 1.625; +} +.\\[\\&_tr\\:last-child\\]\\:pr-border-0 tr:last-child { + border-width: 0px; +} +.\\[\\&_tr\\]\\:pr-border-b tr { + border-bottom-width: 1px; +} +.papi-icon-button { + border: 0; + border-radius: 3em; + cursor: pointer; + display: inline-block; +} + +.papi-icon-button.primary { + background-color: #1ea7fd; + color: white; +} + +.papi-icon-button.secondary { + background-color: transparent; + color: #333; +} + +.papi-icon-button.paratext { + background-color: darkgreen; + color: greenyellow; +} + +.papi-icon-button.paratext.bright { + background-color: greenyellow; + color: darkgreen; +} +.papi-multi-column-menu { + background-color: rgb(222, 222, 222); + display: flex; + flex-direction: column; + padding-left: 3px; + padding-right: 3px; +} + +.papi-menu-column { + font-size: 11pt; + font-weight: 600; + padding-bottom: 2px; +} + +.papi-menu-column ul { + padding-top: 0; +} + +.papi-menu-column-header { + background-color: rgb(181, 181, 181); + padding-left: 24px; + margin-top: 0; + margin-bottom: 0; +} + +.papi-multi-column-menu.paratext { + background-color: rgb(76, 106, 76); + color: rgb(214, 255, 152); +} + +.papi-multi-column-menu.paratext.bright { + color: rgb(76, 106, 76); + background-color: rgb(214, 255, 152); +} +.banded-row:hover { + cursor: pointer; +} + +.banded-row[data-state="selected"]:hover { + cursor: default; +} +.papi-menu-item { + background-color: transparent; +} + +.papi-menu-icon-trailing { + margin-left: 10px; + place-content: flex-end; +} + +.papi-menu-item img { + max-width: 24px; + max-height: 24px; +} +.papi-menu-drawer-paper { + height: fit-content !important; + position: absolute !important; +} + +.papi-toolbar-children { + padding: 10px; + display: flex; + gap: 8px; +} +`, "top"); +export { + kh as Alert, + Eh as AlertDescription, + Nh as AlertTitle, + c0 as BOOK_SELECTOR_STRING_KEYS, + l0 as BookChapterControl, + ec as BookSelectionMode, + d0 as BookSelector, + ye as Button, + Th as Card, + Rh as CardContent, + Oh as CardDescription, + Ph as CardFooter, + Sh as CardHeader, + Ch as CardTitle, + Ql as ChapterRangeSelector, + qi as Checkbox, + N0 as Checklist, + la as ComboBox, + pc as DataTable, + $0 as DisableButton, + bo as DropdownMenu, + wo as DropdownMenuCheckboxItem, + ln as DropdownMenuContent, + Ol as DropdownMenuGroup, + Ri as DropdownMenuItem, + Lg as DropdownMenuItemType, + Ct as DropdownMenuLabel, + i0 as DropdownMenuPortal, + p0 as DropdownMenuRadioGroup, + Pi as DropdownMenuRadioItem, + cn as DropdownMenuSeparator, + $l as DropdownMenuShortcut, + s0 as DropdownMenuSub, + Pl as DropdownMenuSubContent, + Rl as DropdownMenuSubTrigger, + Oi as DropdownMenuTrigger, + P0 as EnableButton, + Vg as FilterButton, + A0 as FilterDropdown, + B0 as Footer, + vh as GridMenu, + yh as HamburgerMenuButton, + u0 as INVENTORY_STRING_KEYS, + E0 as IconButton, + St as Input, + R0 as InstallButton, + f0 as Inventory, + Ze as Label, + I0 as MarkdownRenderer, + js as MenuItem, + M0 as MoreInfo, + v0 as NavigationContentSearch, + D0 as NoExtensionsFound, + $i as RadioGroup, + ro as RadioGroupItem, + b0 as ScriptureResultsViewer, + w0 as ScrollGroupSelector, + mc as SearchBar, + wt as Select, + Fr as SelectContent, + tc as SelectGroup, + Ue as SelectItem, + nc as SelectLabel, + Li as SelectScrollDownButton, + Vi as SelectScrollUpButton, + oc as SelectSeparator, + zr as SelectTrigger, + yt as SelectValue, + Yi as Separator, + y0 as SettingsList, + k0 as SettingsListHeader, + x0 as SettingsListItem, + $h as Slider, + C0 as Sonner, + At as Spinner, + _h as Switch, + dn as Table, + fn as TableBody, + sc as TableCaption, + Ur as TableCell, + ic as TableFooter, + xt as TableHead, + un as TableHeader, + pr as TableRow, + O0 as Tabs, + Dh as TabsContent, + Ih as TabsList, + Ah as TabsTrigger, + T0 as TextField, + Ui as ToggleGroup, + Xt as ToggleGroupItem, + S0 as Toolbar, + _0 as UpdateButton, + zg as VersionHistory, + Gi as VerticalTabs, + Xi as VerticalTabsContent, + Hi as VerticalTabsList, + hc as VerticalTabsTrigger, + Fl as buttonVariants, + yo as getSortingIcon, + h0 as inventoryCountColumn, + m0 as inventoryItemColumn, + g0 as inventoryStatusColumn, + F0 as sonner, + j0 as useEvent, + V0 as useEventAsync, + uo as usePromise +}; +//# sourceMappingURL=index.js.map diff --git a/lib/platform-bible-react/dist/index.js.map b/lib/platform-bible-react/dist/index.js.map new file mode 100644 index 0000000000..0208f89b3f --- /dev/null +++ b/lib/platform-bible-react/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["../src/utils/shadcn-ui.util.ts","../src/components/shadcn-ui/input.tsx","../src/components/advanced/book-chapter-control/book-chapter-input.component.tsx","../../../node_modules/@sillsdev/scripture/dist/index.es.js","../src/components/shadcn-ui/dropdown-menu.tsx","../src/components/advanced/book-chapter-control/book-menu-item.component.tsx","../src/components/advanced/book-chapter-control/chapter-select.component.tsx","../src/components/advanced/book-chapter-control/go-to-menu-item.component.tsx","../src/components/advanced/book-chapter-control/book-chapter-control.component.tsx","../src/components/shadcn-ui/button.tsx","../src/components/shadcn-ui/label.tsx","../src/components/shadcn-ui/radio-group.tsx","../src/components/shadcn-ui/popover.tsx","../src/components/shadcn-ui/dialog.tsx","../src/components/shadcn-ui/command.tsx","../src/components/basics/combo-box.component.tsx","../src/components/basics/chapter-range-selector.component.tsx","../src/components/advanced/book-selector.component.tsx","../src/components/advanced/data-table/data-table-column-toggle.component.tsx","../src/components/shadcn-ui/select.tsx","../src/components/advanced/data-table/data-table-pagination.component.tsx","../src/components/shadcn-ui/table.tsx","../src/components/advanced/data-table/data-table.component.tsx","../src/components/advanced/inventory/inventory-utils.ts","../src/components/advanced/inventory/occurrences-table.component.tsx","../src/components/advanced/inventory/inventory.component.tsx","../src/components/shadcn-ui/toggle.tsx","../src/components/shadcn-ui/toggle-group.tsx","../src/components/advanced/inventory/inventory-columns.tsx","../src/components/basics/search-bar.component.tsx","../src/components/basics/tabs-vertical.tsx","../src/components/advanced/navigation-content-search.component.tsx","../src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx","../src/components/advanced/scroll-group-selector.component.tsx","../src/components/shadcn-ui/separator.tsx","../src/components/advanced/settings-components/settings-list.component.tsx","../src/components/shadcn-ui/checkbox.tsx","../src/components/basics/checklist.component.tsx","../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js","../../../node_modules/@mui/utils/chainPropTypes/chainPropTypes.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@mui/utils/deepmerge/deepmerge.js","../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js","../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js","../../../node_modules/prop-types/node_modules/react-is/index.js","../../../node_modules/object-assign/index.js","../../../node_modules/prop-types/lib/ReactPropTypesSecret.js","../../../node_modules/prop-types/lib/has.js","../../../node_modules/prop-types/checkPropTypes.js","../../../node_modules/prop-types/factoryWithTypeCheckers.js","../../../node_modules/prop-types/factoryWithThrowingShims.js","../../../node_modules/prop-types/index.js","../../../node_modules/@mui/utils/elementAcceptingRef/elementAcceptingRef.js","../../../node_modules/@mui/utils/exactProp/exactProp.js","../../../node_modules/@mui/utils/formatMuiErrorMessage/formatMuiErrorMessage.js","../../../node_modules/react-is/cjs/react-is.production.min.js","../../../node_modules/react-is/cjs/react-is.development.js","../../../node_modules/react-is/index.js","../../../node_modules/@mui/utils/getDisplayName/getDisplayName.js","../../../node_modules/@mui/utils/HTMLElementType/HTMLElementType.js","../../../node_modules/@mui/utils/refType/refType.js","../../../node_modules/@mui/utils/capitalize/capitalize.js","../../../node_modules/@mui/utils/createChainedFunction/createChainedFunction.js","../../../node_modules/@mui/utils/debounce/debounce.js","../../../node_modules/@mui/utils/deprecatedPropType/deprecatedPropType.js","../../../node_modules/@mui/utils/isMuiElement/isMuiElement.js","../../../node_modules/@mui/utils/ownerDocument/ownerDocument.js","../../../node_modules/@mui/utils/ownerWindow/ownerWindow.js","../../../node_modules/@mui/utils/requirePropFactory/requirePropFactory.js","../../../node_modules/@mui/utils/setRef/setRef.js","../../../node_modules/@mui/utils/useEnhancedEffect/useEnhancedEffect.js","../../../node_modules/@mui/utils/useId/useId.js","../../../node_modules/@mui/utils/unsupportedProp/unsupportedProp.js","../../../node_modules/@mui/utils/useControlled/useControlled.js","../../../node_modules/@mui/utils/useEventCallback/useEventCallback.js","../../../node_modules/@mui/utils/useForkRef/useForkRef.js","../../../node_modules/@mui/utils/useLazyRef/useLazyRef.js","../../../node_modules/@mui/utils/useOnMount/useOnMount.js","../../../node_modules/@mui/utils/useTimeout/useTimeout.js","../../../node_modules/@mui/utils/useIsFocusVisible/useIsFocusVisible.js","../../../node_modules/@mui/utils/resolveProps/resolveProps.js","../../../node_modules/@mui/utils/composeClasses/composeClasses.js","../../../node_modules/@mui/utils/ClassNameGenerator/ClassNameGenerator.js","../../../node_modules/@mui/utils/generateUtilityClass/generateUtilityClass.js","../../../node_modules/@mui/utils/generateUtilityClasses/generateUtilityClasses.js","../../../node_modules/@mui/utils/clamp/clamp.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/@mui/system/esm/createTheme/createBreakpoints.js","../../../node_modules/@mui/system/esm/createTheme/shape.js","../../../node_modules/@mui/system/esm/responsivePropType.js","../../../node_modules/@mui/system/esm/merge.js","../../../node_modules/@mui/system/esm/breakpoints.js","../../../node_modules/@mui/system/esm/style.js","../../../node_modules/@mui/system/esm/memoize.js","../../../node_modules/@mui/system/esm/spacing.js","../../../node_modules/@mui/system/esm/createTheme/createSpacing.js","../../../node_modules/@mui/system/esm/compose.js","../../../node_modules/@mui/system/esm/borders.js","../../../node_modules/@mui/system/esm/cssGrid.js","../../../node_modules/@mui/system/esm/palette.js","../../../node_modules/@mui/system/esm/sizing.js","../../../node_modules/@mui/system/esm/styleFunctionSx/defaultSxConfig.js","../../../node_modules/@mui/system/esm/styleFunctionSx/styleFunctionSx.js","../../../node_modules/@mui/system/esm/createTheme/applyStyles.js","../../../node_modules/@mui/system/esm/createTheme/createTheme.js","../../../node_modules/@mui/system/esm/useThemeWithoutDefault.js","../../../node_modules/@mui/system/esm/useTheme.js","../../../node_modules/@mui/system/esm/createStyled.js","../../../node_modules/@mui/system/esm/useThemeProps/getThemeProps.js","../../../node_modules/@mui/system/esm/useThemeProps/useThemeProps.js","../../../node_modules/@mui/system/esm/colorManipulator.js","../../../node_modules/@mui/material/styles/createMixins.js","../../../node_modules/@mui/material/colors/common.js","../../../node_modules/@mui/material/colors/grey.js","../../../node_modules/@mui/material/colors/purple.js","../../../node_modules/@mui/material/colors/red.js","../../../node_modules/@mui/material/colors/orange.js","../../../node_modules/@mui/material/colors/blue.js","../../../node_modules/@mui/material/colors/lightBlue.js","../../../node_modules/@mui/material/colors/green.js","../../../node_modules/@mui/material/styles/createPalette.js","../../../node_modules/@mui/material/styles/createTypography.js","../../../node_modules/@mui/material/styles/shadows.js","../../../node_modules/@mui/material/styles/createTransitions.js","../../../node_modules/@mui/material/styles/zIndex.js","../../../node_modules/@mui/material/styles/createTheme.js","../../../node_modules/@mui/material/styles/defaultTheme.js","../../../node_modules/@mui/material/styles/identifier.js","../../../node_modules/@mui/material/styles/useThemeProps.js","../../../node_modules/@mui/material/styles/styled.js","../../../node_modules/@mui/material/SvgIcon/svgIconClasses.js","../../../node_modules/@mui/material/SvgIcon/SvgIcon.js","../../../node_modules/@mui/material/utils/createSvgIcon.js","../../../node_modules/@mui/material/utils/index.js","../../../node_modules/@mui/icons-material/utils/createSvgIcon.js","../../../node_modules/@mui/icons-material/ArrowRight.js","../../../node_modules/@mui/base/utils/isHostComponent.js","../../../node_modules/@mui/base/utils/appendOwnerState.js","../../../node_modules/@mui/base/utils/ClassNameConfigurator.js","../../../node_modules/@mui/base/utils/extractEventHandlers.js","../../../node_modules/@mui/base/utils/resolveComponentProps.js","../../../node_modules/@mui/base/utils/omitEventHandlers.js","../../../node_modules/@mui/base/utils/mergeSlotProps.js","../../../node_modules/@mui/base/utils/useSlotProps.js","../../../node_modules/@mui/base/generateUtilityClass/index.js","../../../node_modules/@mui/base/generateUtilityClasses/index.js","../../../node_modules/@mui/base/Portal/Portal.js","../../../node_modules/@popperjs/core/lib/enums.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../../node_modules/@popperjs/core/lib/utils/math.js","../../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../../node_modules/@popperjs/core/lib/utils/within.js","../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../../node_modules/@popperjs/core/lib/utils/debounce.js","../../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../../node_modules/@popperjs/core/lib/createPopper.js","../../../node_modules/@popperjs/core/lib/popper.js","../../../node_modules/@mui/base/Popper/popperClasses.js","../../../node_modules/@mui/base/Popper/Popper.js","../../../node_modules/@mui/material/styles/useTheme.js","../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../../../node_modules/react-transition-group/esm/config.js","../../../node_modules/react-transition-group/esm/utils/PropTypes.js","../../../node_modules/react-transition-group/esm/TransitionGroupContext.js","../../../node_modules/react-transition-group/esm/utils/reflow.js","../../../node_modules/react-transition-group/esm/Transition.js","../../../node_modules/@mui/material/transitions/utils.js","../../../node_modules/@mui/material/Grow/Grow.js","../../../node_modules/@mui/material/Popper/Popper.js","../../../node_modules/@mui/material/Tooltip/tooltipClasses.js","../../../node_modules/@mui/material/Tooltip/Tooltip.js","../src/components/mui/menu-item.component.tsx","../src/components/mui/grouped-menu-item-list.component.tsx","../src/components/mui/top-level-menu.component.tsx","../src/components/mui/grid-menu.component.tsx","../src/hooks/use-promise.hook.ts","../../../node_modules/@mui/icons-material/esm/Menu.js","../src/components/mui/hamburger-menu-button.component.tsx","../src/components/mui/icon-button.component.tsx","../src/components/basics/spinner.component.tsx","../src/components/basics/text-field.component.tsx","../src/components/mui/toolbar.component.tsx","../src/components/shadcn-ui/alert.tsx","../src/components/shadcn-ui/card.tsx","../src/components/shadcn-ui/sonner.tsx","../src/components/shadcn-ui/slider.tsx","../src/components/shadcn-ui/switch.tsx","../src/components/shadcn-ui/tabs.tsx","../src/components/advanced/extension-marketplace/buttons/install-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/enable-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/disable-button.component.tsx","../src/components/advanced/extension-marketplace/buttons/update-button.component.tsx","../../../node_modules/markdown-to-jsx/dist/index.modern.js","../src/components/advanced/extension-marketplace/markdown-renderer.component.tsx","../src/components/advanced/extension-marketplace/buttons/filter-button.component.tsx","../src/components/advanced/extension-marketplace/filter-dropdown.component.tsx","../src/components/advanced/extension-marketplace/no-extensions-found.component.tsx","../src/components/advanced/extension-marketplace/more-info.component.tsx","../src/components/advanced/extension-marketplace/version-history.component.tsx","../src/components/advanced/extension-marketplace/footer.component.tsx","../src/hooks/use-event.hook.ts","../src/hooks/use-event-async.hook.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMergeCustom = extendTailwindMerge({ prefix: 'pr-' });\n\n// shadcn/ui uses this export in its boilerplate code\n// eslint-disable-next-line import/prefer-default-export\nexport function cn(...inputs: ClassValue[]) {\n return twMergeCustom(clsx(inputs));\n}\n","import React from 'react';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport interface InputProps extends React.InputHTMLAttributes {}\n\nexport const Input = React.forwardRef(\n ({ className, type, ...props }, ref) => {\n return (\n \n );\n },\n);\nInput.displayName = 'Input';\n","import { FocusEventHandler, forwardRef, KeyboardEvent, MouseEventHandler } from 'react';\nimport { History } from 'lucide-react';\nimport { Input as ShadInput } from '@/components/shadcn-ui/input';\n\nexport type BookChapterInputProps = {\n handleSearch: (searchString: string) => void;\n handleKeyDown: (event: KeyboardEvent) => void;\n handleOnClick: MouseEventHandler;\n handleSubmit: () => void;\n onFocus?: FocusEventHandler;\n value: string;\n placeholder: string;\n};\n\n// Shadcn Input sets type to \"button\"- HAVE to prop spread before setting type\nconst BookChapterInput = forwardRef(\n (\n { handleSearch, handleKeyDown, handleOnClick, handleSubmit, ...props }: BookChapterInputProps,\n ref,\n ) => {\n return (\n
\n handleSearch(event.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleSubmit();\n }\n handleKeyDown(e);\n }}\n onClick={handleOnClick}\n ref={ref}\n />\n {\n // eslint-disable-next-line no-console\n console.log('back in history');\n }}\n />\n
\n );\n },\n);\n\nexport default BookChapterInput;\n","var P = Object.defineProperty;\nvar R = (t, e, s) => e in t ? P(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;\nvar n = (t, e, s) => R(t, typeof e != \"symbol\" ? e + \"\" : e, s);\nclass _ {\n constructor() {\n n(this, \"books\");\n n(this, \"firstSelectedBookNum\");\n n(this, \"lastSelectedBookNum\");\n n(this, \"count\");\n n(this, \"selectedBookNumbers\");\n n(this, \"selectedBookIds\");\n }\n}\nconst N = [\n \"GEN\",\n \"EXO\",\n \"LEV\",\n \"NUM\",\n \"DEU\",\n \"JOS\",\n \"JDG\",\n \"RUT\",\n \"1SA\",\n \"2SA\",\n // 10\n \"1KI\",\n \"2KI\",\n \"1CH\",\n \"2CH\",\n \"EZR\",\n \"NEH\",\n \"EST\",\n \"JOB\",\n \"PSA\",\n \"PRO\",\n // 20\n \"ECC\",\n \"SNG\",\n \"ISA\",\n \"JER\",\n \"LAM\",\n \"EZK\",\n \"DAN\",\n \"HOS\",\n \"JOL\",\n \"AMO\",\n // 30\n \"OBA\",\n \"JON\",\n \"MIC\",\n \"NAM\",\n \"HAB\",\n \"ZEP\",\n \"HAG\",\n \"ZEC\",\n \"MAL\",\n \"MAT\",\n // 40\n \"MRK\",\n \"LUK\",\n \"JHN\",\n \"ACT\",\n \"ROM\",\n \"1CO\",\n \"2CO\",\n \"GAL\",\n \"EPH\",\n \"PHP\",\n // 50\n \"COL\",\n \"1TH\",\n \"2TH\",\n \"1TI\",\n \"2TI\",\n \"TIT\",\n \"PHM\",\n \"HEB\",\n \"JAS\",\n \"1PE\",\n // 60\n \"2PE\",\n \"1JN\",\n \"2JN\",\n \"3JN\",\n \"JUD\",\n \"REV\",\n \"TOB\",\n \"JDT\",\n \"ESG\",\n \"WIS\",\n // 70\n \"SIR\",\n \"BAR\",\n \"LJE\",\n \"S3Y\",\n \"SUS\",\n \"BEL\",\n \"1MA\",\n \"2MA\",\n \"3MA\",\n \"4MA\",\n // 80\n \"1ES\",\n \"2ES\",\n \"MAN\",\n \"PS2\",\n \"ODA\",\n \"PSS\",\n \"JSA\",\n // actual variant text for JOS, now in LXA text\n \"JDB\",\n // actual variant text for JDG, now in LXA text\n \"TBS\",\n // actual variant text for TOB, now in LXA text\n \"SST\",\n // actual variant text for SUS, now in LXA text // 90\n \"DNT\",\n // actual variant text for DAN, now in LXA text\n \"BLT\",\n // actual variant text for BEL, now in LXA text\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n // 100\n \"BAK\",\n \"OTH\",\n \"3ES\",\n // Used previously but really should be 2ES\n \"EZA\",\n // Used to be called 4ES, but not actually in any known project\n \"5EZ\",\n // Used to be called 5ES, but not actually in any known project\n \"6EZ\",\n // Used to be called 6ES, but not actually in any known project\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n // 110\n \"NDX\",\n \"DAG\",\n \"PS3\",\n \"2BA\",\n \"LBA\",\n \"JUB\",\n \"ENO\",\n \"1MQ\",\n \"2MQ\",\n \"3MQ\",\n // 120\n \"REP\",\n \"4BA\",\n \"LAO\"\n], B = [\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n \"BAK\",\n \"OTH\",\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n \"NDX\"\n], O = [\n \"Genesis\",\n \"Exodus\",\n \"Leviticus\",\n \"Numbers\",\n \"Deuteronomy\",\n \"Joshua\",\n \"Judges\",\n \"Ruth\",\n \"1 Samuel\",\n \"2 Samuel\",\n \"1 Kings\",\n \"2 Kings\",\n \"1 Chronicles\",\n \"2 Chronicles\",\n \"Ezra\",\n \"Nehemiah\",\n \"Esther (Hebrew)\",\n \"Job\",\n \"Psalms\",\n \"Proverbs\",\n \"Ecclesiastes\",\n \"Song of Songs\",\n \"Isaiah\",\n \"Jeremiah\",\n \"Lamentations\",\n \"Ezekiel\",\n \"Daniel (Hebrew)\",\n \"Hosea\",\n \"Joel\",\n \"Amos\",\n \"Obadiah\",\n \"Jonah\",\n \"Micah\",\n \"Nahum\",\n \"Habakkuk\",\n \"Zephaniah\",\n \"Haggai\",\n \"Zechariah\",\n \"Malachi\",\n \"Matthew\",\n \"Mark\",\n \"Luke\",\n \"John\",\n \"Acts\",\n \"Romans\",\n \"1 Corinthians\",\n \"2 Corinthians\",\n \"Galatians\",\n \"Ephesians\",\n \"Philippians\",\n \"Colossians\",\n \"1 Thessalonians\",\n \"2 Thessalonians\",\n \"1 Timothy\",\n \"2 Timothy\",\n \"Titus\",\n \"Philemon\",\n \"Hebrews\",\n \"James\",\n \"1 Peter\",\n \"2 Peter\",\n \"1 John\",\n \"2 John\",\n \"3 John\",\n \"Jude\",\n \"Revelation\",\n \"Tobit\",\n \"Judith\",\n \"Esther Greek\",\n \"Wisdom of Solomon\",\n \"Sirach (Ecclesiasticus)\",\n \"Baruch\",\n \"Letter of Jeremiah\",\n \"Song of 3 Young Men\",\n \"Susanna\",\n \"Bel and the Dragon\",\n \"1 Maccabees\",\n \"2 Maccabees\",\n \"3 Maccabees\",\n \"4 Maccabees\",\n \"1 Esdras (Greek)\",\n \"2 Esdras (Latin)\",\n \"Prayer of Manasseh\",\n \"Psalm 151\",\n \"Odes\",\n \"Psalms of Solomon\",\n // WARNING, if you change the spelling of the *obsolete* tag be sure to update\n // IsObsolete routine\n \"Joshua A. *obsolete*\",\n \"Judges B. *obsolete*\",\n \"Tobit S. *obsolete*\",\n \"Susanna Th. *obsolete*\",\n \"Daniel Th. *obsolete*\",\n \"Bel Th. *obsolete*\",\n \"Extra A\",\n \"Extra B\",\n \"Extra C\",\n \"Extra D\",\n \"Extra E\",\n \"Extra F\",\n \"Extra G\",\n \"Front Matter\",\n \"Back Matter\",\n \"Other Matter\",\n \"3 Ezra *obsolete*\",\n \"Apocalypse of Ezra\",\n \"5 Ezra (Latin Prologue)\",\n \"6 Ezra (Latin Epilogue)\",\n \"Introduction\",\n \"Concordance \",\n \"Glossary \",\n \"Topical Index\",\n \"Names Index\",\n \"Daniel Greek\",\n \"Psalms 152-155\",\n \"2 Baruch (Apocalypse)\",\n \"Letter of Baruch\",\n \"Jubilees\",\n \"Enoch\",\n \"1 Meqabyan\",\n \"2 Meqabyan\",\n \"3 Meqabyan\",\n \"Reproof (Proverbs 25-31)\",\n \"4 Baruch (Rest of Baruch)\",\n \"Laodiceans\"\n], S = K();\nfunction g(t, e = !0) {\n return e && (t = t.toUpperCase()), t in S ? S[t] : 0;\n}\nfunction k(t) {\n return g(t) > 0;\n}\nfunction x(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return e >= 40 && e <= 66;\n}\nfunction T(t) {\n return (typeof t == \"string\" ? g(t) : t) <= 39;\n}\nfunction X(t) {\n return t <= 66;\n}\nfunction V(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return w(e) && !X(e);\n}\nfunction* L() {\n for (let t = 1; t <= N.length; t++) yield t;\n}\nconst G = 1, A = N.length;\nfunction H() {\n return [\"XXA\", \"XXB\", \"XXC\", \"XXD\", \"XXE\", \"XXF\", \"XXG\"];\n}\nfunction C(t, e = \"***\") {\n const s = t - 1;\n return s < 0 || s >= N.length ? e : N[s];\n}\nfunction I(t) {\n return t <= 0 || t > A ? \"******\" : O[t - 1];\n}\nfunction y(t) {\n return I(g(t));\n}\nfunction w(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && !B.includes(e);\n}\nfunction q(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && B.includes(e);\n}\nfunction U(t) {\n return O[t - 1].includes(\"*obsolete*\");\n}\nfunction K() {\n const t = {};\n for (let e = 0; e < N.length; e++)\n t[N[e]] = e + 1;\n return t;\n}\nconst m = {\n allBookIds: N,\n nonCanonicalIds: B,\n bookIdToNumber: g,\n isBookIdValid: k,\n isBookNT: x,\n isBookOT: T,\n isBookOTNT: X,\n isBookDC: V,\n allBookNumbers: L,\n firstBook: G,\n lastBook: A,\n extraBooks: H,\n bookNumberToId: C,\n bookNumberToEnglishName: I,\n bookIdToEnglishName: y,\n isCanonical: w,\n isExtraMaterial: q,\n isObsolete: U\n};\nvar l = /* @__PURE__ */ ((t) => (t[t.Unknown = 0] = \"Unknown\", t[t.Original = 1] = \"Original\", t[t.Septuagint = 2] = \"Septuagint\", t[t.Vulgate = 3] = \"Vulgate\", t[t.English = 4] = \"English\", t[t.RussianProtestant = 5] = \"RussianProtestant\", t[t.RussianOrthodox = 6] = \"RussianOrthodox\", t))(l || {});\nconst h = class h {\n // private versInfo: Versification;\n constructor(e) {\n n(this, \"name\");\n n(this, \"fullPath\");\n n(this, \"isPresent\");\n n(this, \"hasVerseSegments\");\n n(this, \"isCustomized\");\n n(this, \"baseVersification\");\n n(this, \"scriptureBooks\");\n n(this, \"_type\");\n if (e == null)\n throw new Error(\"Argument undefined\");\n typeof e == \"string\" ? (this.name = e, this._type = l[e]) : (this._type = e, this.name = l[e]);\n }\n get type() {\n return this._type;\n }\n equals(e) {\n return !e.type || !this.type ? !1 : e.type === this.type;\n }\n};\nn(h, \"Original\", new h(l.Original)), n(h, \"Septuagint\", new h(l.Septuagint)), n(h, \"Vulgate\", new h(l.Vulgate)), n(h, \"English\", new h(l.English)), n(h, \"RussianProtestant\", new h(l.RussianProtestant)), n(h, \"RussianOrthodox\", new h(l.RussianOrthodox));\nlet c = h;\nfunction E(t, e) {\n const s = e[0];\n for (let r = 1; r < e.length; r++)\n t = t.split(e[r]).join(s);\n return t.split(s);\n}\nvar D = /* @__PURE__ */ ((t) => (t[t.Valid = 0] = \"Valid\", t[t.UnknownVersification = 1] = \"UnknownVersification\", t[t.OutOfRange = 2] = \"OutOfRange\", t[t.VerseOutOfOrder = 3] = \"VerseOutOfOrder\", t[t.VerseRepeated = 4] = \"VerseRepeated\", t))(D || {});\nconst i = class i {\n constructor(e, s, r, a) {\n /** Not yet implemented. */\n n(this, \"firstChapter\");\n /** Not yet implemented. */\n n(this, \"lastChapter\");\n /** Not yet implemented. */\n n(this, \"lastVerse\");\n /** Not yet implemented. */\n n(this, \"hasSegmentsDefined\");\n /** Not yet implemented. */\n n(this, \"text\");\n /** Not yet implemented. */\n n(this, \"BBBCCCVVVS\");\n /** Not yet implemented. */\n n(this, \"longHashCode\");\n /** The versification of the reference. */\n n(this, \"versification\");\n n(this, \"rtlMark\", \"‏\");\n n(this, \"_bookNum\", 0);\n n(this, \"_chapterNum\", 0);\n n(this, \"_verseNum\", 0);\n n(this, \"_verse\");\n if (r == null && a == null)\n if (e != null && typeof e == \"string\") {\n const o = e, u = s != null && s instanceof c ? s : void 0;\n this.setEmpty(u), this.parse(o);\n } else if (e != null && typeof e == \"number\") {\n const o = s != null && s instanceof c ? s : void 0;\n this.setEmpty(o), this._verseNum = e % i.chapterDigitShifter, this._chapterNum = Math.floor(\n e % i.bookDigitShifter / i.chapterDigitShifter\n ), this._bookNum = Math.floor(e / i.bookDigitShifter);\n } else if (s == null)\n if (e != null && e instanceof i) {\n const o = e;\n this._bookNum = o.bookNum, this._chapterNum = o.chapterNum, this._verseNum = o.verseNum, this._verse = o.verse, this.versification = o.versification;\n } else {\n if (e == null) return;\n const o = e instanceof c ? e : i.defaultVersification;\n this.setEmpty(o);\n }\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else if (e != null && s != null && r != null)\n if (typeof e == \"string\" && typeof s == \"string\" && typeof r == \"string\")\n this.setEmpty(a), this.updateInternal(e, s, r);\n else if (typeof e == \"number\" && typeof s == \"number\" && typeof r == \"number\")\n this._bookNum = e, this._chapterNum = s, this._verseNum = r, this.versification = a ?? i.defaultVersification;\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else\n throw new Error(\"VerseRef constructor not supported.\");\n }\n /**\n * Determines if the verse string is in a valid format (does not consider versification).\n */\n static isVerseParseable(e) {\n return e.length > 0 && \"0123456789\".includes(e[0]) && !e.endsWith(this.verseRangeSeparator) && !e.endsWith(this.verseSequenceIndicator);\n }\n /**\n * Tries to parse the specified string into a verse reference.\n * @param str - The string to attempt to parse.\n * @returns success: `true` if the specified string was successfully parsed, `false` otherwise.\n * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed\n */\n static tryParse(e) {\n let s;\n try {\n return s = new i(e), { success: !0, verseRef: s };\n } catch (r) {\n if (r instanceof v)\n return s = new i(), { success: !1, verseRef: s };\n throw r;\n }\n }\n /**\n * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n * @param bookNum - Book number (this is 1-based, not an index).\n * @param chapterNum - Chapter number.\n * @param verseNum - Verse number.\n * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n */\n static getBBBCCCVVV(e, s, r) {\n return e % i.bcvMaxValue * i.bookDigitShifter + (s >= 0 ? s % i.bcvMaxValue * i.chapterDigitShifter : 0) + (r >= 0 ? r % i.bcvMaxValue : 0);\n }\n /**\n * Deserializes a serialized VerseRef.\n * @param serializedVerseRef - Serialized VerseRef to create from.\n * @returns the deserialized VerseRef.\n */\n static fromJSON(e) {\n const { book: s, chapterNum: r, verseNum: a, verse: o, versificationStr: u } = e, f = o || a.toString();\n let d;\n return u && (d = new c(u)), s ? new i(s, r.toString(), f, d) : new i();\n }\n /**\n * Parses a verse string and gets the leading numeric portion as a number.\n * @param verseStr - verse string to parse\n * @returns true if the entire string could be parsed as a single, simple verse number (1-999);\n * false if the verse string represented a verse bridge, contained segment letters, or was invalid\n */\n static tryGetVerseNum(e) {\n let s;\n if (!e)\n return s = -1, { success: !0, vNum: s };\n s = 0;\n let r;\n for (let a = 0; a < e.length; a++) {\n if (r = e[a], r < \"0\" || r > \"9\")\n return a === 0 && (s = -1), { success: !1, vNum: s };\n if (s = s * 10 + +r - 0, s > i.bcvMaxValue)\n return s = -1, { success: !1, vNum: s };\n }\n return { success: !0, vNum: s };\n }\n /**\n * Checks to see if a VerseRef hasn't been set - all values are the default.\n */\n get isDefault() {\n return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null;\n }\n /**\n * Gets whether the verse contains multiple verses.\n */\n get hasMultiple() {\n return this._verse != null && (this._verse.includes(i.verseRangeSeparator) || this._verse.includes(i.verseSequenceIndicator));\n }\n /**\n * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters,\n * e.g. `'MAT'`.\n */\n get book() {\n return m.bookNumberToId(this.bookNum, \"\");\n }\n set book(e) {\n this.bookNum = m.bookIdToNumber(e);\n }\n /**\n * Gets or sets the chapter of the reference,. e.g. `'3'`.\n */\n get chapter() {\n return this.isDefault || this._chapterNum < 0 ? \"\" : this._chapterNum.toString();\n }\n set chapter(e) {\n const s = +e;\n this._chapterNum = Number.isInteger(s) ? s : -1;\n }\n /**\n * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`,\n * or `'4b-5a, 7'`.\n */\n get verse() {\n return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? \"\" : this._verseNum.toString();\n }\n set verse(e) {\n const { success: s, vNum: r } = i.tryGetVerseNum(e);\n this._verse = s ? void 0 : e.replace(this.rtlMark, \"\"), this._verseNum = r, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = i.tryGetVerseNum(this._verse));\n }\n /**\n * Get or set Book based on book number, e.g. `42`.\n */\n get bookNum() {\n return this._bookNum;\n }\n set bookNum(e) {\n if (e <= 0 || e > m.lastBook)\n throw new v(\n \"BookNum must be greater than zero and less than or equal to last book\"\n );\n this._bookNum = e;\n }\n /**\n * Gets or sets the chapter number, e.g. `3`. `-1` if not valid.\n */\n get chapterNum() {\n return this._chapterNum;\n }\n set chapterNum(e) {\n this.chapterNum = e;\n }\n /**\n * Gets or sets verse start number, e.g. `4`. `-1` if not valid.\n */\n get verseNum() {\n return this._verseNum;\n }\n set verseNum(e) {\n this._verseNum = e;\n }\n /**\n * String representing the versification (should ONLY be used for serialization/deserialization).\n *\n * @remarks This is for backwards compatibility when ScrVers was an enumeration.\n */\n get versificationStr() {\n var e;\n return (e = this.versification) == null ? void 0 : e.name;\n }\n set versificationStr(e) {\n this.versification = this.versification != null ? new c(e) : void 0;\n }\n /**\n * Determines if the reference is valid.\n */\n get valid() {\n return this.validStatus === 0;\n }\n /**\n * Get the valid status for this reference.\n */\n get validStatus() {\n return this.validateVerse(i.verseRangeSeparators, i.verseSequenceIndicators);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits and the verse is 0.\n */\n get BBBCCC() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, 0);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits. If verse is not null\n * (i.e., this reference represents a complex reference with verse\n * segments or bridge) this cannot be used for an exact comparison.\n */\n get BBBCCCVVV() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum);\n }\n /**\n * Gets whether the verse is defined as an excluded verse in the versification.\n * Does not handle verse ranges.\n */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n get isExcluded() {\n return !1;\n }\n /**\n * Parses the reference in the specified string.\n * Optionally versification can follow reference as in GEN 3:11/4\n * Throw an exception if\n * - invalid book name\n * - chapter number is missing or not a number\n * - verse number is missing or does not start with a number\n * - versification is invalid\n * @param verseStr - string to parse e.g. 'MAT 3:11'\n */\n parse(e) {\n if (e = e.replace(this.rtlMark, \"\"), e.includes(\"/\")) {\n const o = e.split(\"/\");\n if (e = o[0], o.length > 1)\n try {\n const u = +o[1].trim();\n this.versification = new c(l[u]);\n } catch {\n throw new v(\"Invalid reference : \" + e);\n }\n }\n const s = e.trim().split(\" \");\n if (s.length !== 2)\n throw new v(\"Invalid reference : \" + e);\n const r = s[1].split(\":\"), a = +r[0];\n if (r.length !== 2 || m.bookIdToNumber(s[0]) === 0 || !Number.isInteger(a) || a < 0 || !i.isVerseParseable(r[1]))\n throw new v(\"Invalid reference : \" + e);\n this.updateInternal(s[0], r[0], r[1]);\n }\n /**\n * Simplifies this verse ref so that it has no bridging of verses or\n * verse segments like `'1a'`.\n */\n simplify() {\n this._verse = void 0;\n }\n /**\n * Makes a clone of the reference.\n *\n * @returns The cloned VerseRef.\n */\n clone() {\n return new i(this);\n }\n toString() {\n const e = this.book;\n return e === \"\" ? \"\" : `${e} ${this.chapter}:${this.verse}`;\n }\n toJSON() {\n let e = this.verse;\n (e === \"\" || e === this.verseNum.toString()) && (e = void 0);\n const s = {\n book: this.book,\n chapterNum: this.chapterNum,\n verseNum: this.verseNum,\n verse: e,\n versificationStr: this.versificationStr\n };\n return e || delete s.verse, s;\n }\n /**\n * Compares this `VerseRef` with supplied one.\n * @param verseRef - object to compare this one to.\n * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise.\n */\n equals(e) {\n return e instanceof i ? e._bookNum === this._bookNum && e._chapterNum === this._chapterNum && e._verseNum === this._verseNum && e.verse === this.verse && (e.versification == null && this.versification == null || e.versification != null && this.versification != null && e.versification.equals(this.versification)) : !1;\n }\n /**\n * Enumerate all individual verses contained in a VerseRef.\n * Verse ranges are indicated by \"-\" and consecutive verses by \",\"s.\n * Examples:\n * GEN 1:2 returns GEN 1:2\n * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5\n * GEN 1:2a-2c returns //! ??????\n *\n * @param specifiedVersesOnly - if set to true return only verses that are\n * explicitly specified only, not verses within a range. Defaults to `false`.\n * @param verseRangeSeparators - Verse range separators.\n * Defaults to `VerseRef.verseRangeSeparators`.\n * @param verseSequenceSeparators - Verse sequence separators.\n * Defaults to `VerseRef.verseSequenceIndicators`.\n * @returns An array of all single verse references in this VerseRef.\n */\n allVerses(e = !1, s = i.verseRangeSeparators, r = i.verseSequenceIndicators) {\n if (this._verse == null || this.chapterNum <= 0)\n return [this.clone()];\n const a = [], o = E(this._verse, r);\n for (const u of o.map((f) => E(f, s))) {\n const f = this.clone();\n f.verse = u[0];\n const d = f.verseNum;\n if (a.push(f), u.length > 1) {\n const b = this.clone();\n if (b.verse = u[1], !e)\n for (let p = d + 1; p < b.verseNum; p++) {\n const J = new i(\n this._bookNum,\n this._chapterNum,\n p,\n this.versification\n );\n this.isExcluded || a.push(J);\n }\n a.push(b);\n }\n }\n return a;\n }\n /**\n * Validates a verse number using the supplied separators rather than the defaults.\n */\n validateVerse(e, s) {\n if (!this.verse)\n return this.internalValid;\n let r = 0;\n for (const a of this.allVerses(!0, e, s)) {\n const o = a.internalValid;\n if (o !== 0)\n return o;\n const u = a.BBBCCCVVV;\n if (r > u)\n return 3;\n if (r === u)\n return 4;\n r = u;\n }\n return 0;\n }\n /**\n * Gets whether a single verse reference is valid.\n */\n get internalValid() {\n return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > m.lastBook ? 2 : (m.isCanonical(this._bookNum), 0);\n }\n setEmpty(e = i.defaultVersification) {\n this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = e;\n }\n updateInternal(e, s, r) {\n this.bookNum = m.bookIdToNumber(e), this.chapter = s, this.verse = r;\n }\n};\nn(i, \"defaultVersification\", c.English), n(i, \"verseRangeSeparator\", \"-\"), n(i, \"verseSequenceIndicator\", \",\"), n(i, \"verseRangeSeparators\", [i.verseRangeSeparator]), n(i, \"verseSequenceIndicators\", [i.verseSequenceIndicator]), n(i, \"chapterDigitShifter\", 1e3), n(i, \"bookDigitShifter\", i.chapterDigitShifter * i.chapterDigitShifter), n(i, \"bcvMaxValue\", i.chapterDigitShifter - 1), /**\n * The valid status of the VerseRef.\n */\nn(i, \"ValidStatusType\", D);\nlet M = i;\nclass v extends Error {\n}\nexport {\n _ as BookSet,\n m as Canon,\n c as ScrVers,\n l as ScrVersType,\n M as VerseRef,\n v as VerseRefException\n};\n//# sourceMappingURL=index.es.js.map\n","import React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\n\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nexport type DropdownMenuSubTriggerProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.SubTrigger\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuSubContentProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.SubContent\n> & {\n className?: string;\n};\n\nexport type DropdownMenuContentProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Content\n> & {\n className?: string;\n sideOffset?: number;\n};\n\nexport type DropdownMenuItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Item\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuCheckboxItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.CheckboxItem\n> & {\n className?: string;\n checked?: boolean;\n};\n\nexport type DropdownMenuRadioItemProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.RadioItem\n> & {\n className?: string;\n};\n\nexport type DropdownMenuLabelProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Label\n> & {\n className?: string;\n inset?: boolean;\n};\n\nexport type DropdownMenuSeparatorProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Separator\n> & {\n className?: string;\n};\n\nexport type DropdownMenuShortcutProps = React.HTMLAttributes & {\n className?: string;\n};\n\nexport const DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef,\n DropdownMenuSubTriggerProps\n>(({ className, inset, children, ...props }, ref) => (\n \n {children}\n \n \n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nexport const DropdownMenuSubContent = React.forwardRef<\n React.ElementRef,\n DropdownMenuSubContentProps\n>(({ className, ...props }, ref) => (\n \n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nexport const DropdownMenuContent = React.forwardRef<\n React.ElementRef,\n DropdownMenuContentProps\n>(({ className, sideOffset = 4, ...props }, ref) => (\n \n \n \n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\n/**\n * TODO: fix: direction is not automatically handled by this component, so that shortcuts are\n * display always to the right\n */\nexport const DropdownMenuItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuItemProps\n>(({ className, inset, ...props }, ref) => (\n \n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nexport const DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuCheckboxItemProps\n>(({ className, children, checked, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nexport const DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef,\n DropdownMenuRadioItemProps\n>(({ className, children, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nexport const DropdownMenuLabel = React.forwardRef<\n React.ElementRef,\n DropdownMenuLabelProps\n>(({ className, inset, ...props }, ref) => (\n \n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nexport const DropdownMenuSeparator = React.forwardRef<\n React.ElementRef,\n DropdownMenuSeparatorProps\n>(({ className, ...props }, ref) => (\n \n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nexport function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps) {\n return (\n \n );\n}\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n","import { Canon } from '@sillsdev/scripture';\nimport { PropsWithChildren, KeyboardEvent, forwardRef } from 'react';\nimport { DropdownMenuItem as ShadDropdownMenuItem } from '@/components/shadcn-ui/dropdown-menu';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport type BookType = 'OT' | 'NT' | 'DC';\n\ntype BookMenuItemProps = PropsWithChildren<{\n /** String id of book */\n bookId: string;\n /** Callback to run when a book menu item is selected */\n handleSelectBook: () => void;\n /** Indicates if this menu item is currently selected */\n isSelected: boolean;\n /** Function that is called upon highlighting a book in the dropdown menu */\n handleHighlightBook: () => void;\n /**\n * Function that is called on pressing a key\n *\n * @param event Event that contains information about the key stroke\n */\n handleKeyDown: (event: KeyboardEvent) => void;\n /**\n * Type of book associated with this menu item, coordinates color labels ? Mock up has the labels\n * coordinated to genre\n */\n bookType: BookType;\n}>;\n\nconst BookMenuItem = forwardRef(\n (\n {\n bookId,\n handleSelectBook,\n isSelected,\n handleHighlightBook,\n handleKeyDown,\n bookType,\n children,\n }: BookMenuItemProps,\n ref,\n ) => {\n return (\n {\n // preventDefault() here prevents the entire dropdown menu from closing when selecting this item\n event.preventDefault();\n handleSelectBook();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n handleKeyDown(event);\n }}\n onFocus={handleHighlightBook}\n onMouseMove={handleHighlightBook}\n >\n \n {Canon.bookIdToEnglishName(bookId)}\n \n {isSelected &&
{children}
}\n \n );\n },\n);\n\nexport default BookMenuItem;\n","import { cn } from '@/utils/shadcn-ui.util';\nimport { useCallback } from 'react';\n\nexport type ChapterSelectProps = {\n /**\n * Callback to run when a chapter div is selected\n *\n * @param chapterNumber Number of the chapter that has been selected\n */\n handleSelectChapter: (chapterNumber: number) => void;\n /** The highest chapter number in the book (of course equal to number of chapters in the book) */\n endChapter: number;\n /** The chapter number that is currently selected */\n activeChapter: number;\n /** The chapter number that is currently highlighted using keyboard or mouse navigation */\n highlightedChapter: number;\n /**\n * Callback to run when a chapter is highlighted by the user\n *\n * @param chapterNumber The chapter that is highlighted\n */\n handleHighlightedChapter: (chapterNumber: number) => void;\n};\n\nfunction ChapterSelect({\n handleSelectChapter,\n endChapter,\n activeChapter,\n highlightedChapter,\n handleHighlightedChapter,\n}: ChapterSelectProps) {\n const chapters = Array.from({ length: endChapter }, (_, i) => i + 1);\n\n const handleMouse = useCallback(\n (chapterNumber: number) => {\n handleHighlightedChapter(chapterNumber);\n },\n [handleHighlightedChapter],\n );\n\n return (\n
\n {chapters.map((chapter) => (\n {\n event.preventDefault();\n event.stopPropagation();\n handleSelectChapter(chapter);\n }}\n role=\"button\"\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n handleSelectChapter(chapter);\n }\n }}\n tabIndex={0}\n onMouseMove={() => handleMouse(chapter)}\n >\n {chapter}\n
\n ))}\n
\n );\n}\n\nexport default ChapterSelect;\n","import { DropdownMenuLabel as ShadDropdownMenuLabel } from '@/components/shadcn-ui/dropdown-menu';\nimport { Bookmark, Clock, ArrowDownWideNarrow } from 'lucide-react';\n\nexport type GoToMenuItemProps = {\n handleSort: () => void;\n handleLocationHistory: () => void;\n handleBookmarks: () => void;\n};\n\nfunction GoToMenuItem({ handleSort, handleLocationHistory, handleBookmarks }: GoToMenuItemProps) {\n return (\n \n

Go To

\n
\n \n \n \n
\n
\n );\n}\n\nexport default GoToMenuItem;\n","import BookChapterInput from '@/components/advanced/book-chapter-control/book-chapter-input.component';\nimport BookMenuItem, {\n BookType,\n} from '@/components/advanced/book-chapter-control/book-menu-item.component';\nimport ChapterSelect from '@/components/advanced/book-chapter-control/chapter-select.component';\nimport GoToMenuItem from '@/components/advanced/book-chapter-control/go-to-menu-item.component';\nimport {\n DropdownMenu as ShadDropdownMenu,\n DropdownMenuContent as ShadDropdownMenuContent,\n DropdownMenuLabel as ShadDropdownMenuLabel,\n DropdownMenuSeparator as ShadDropdownMenuSeparator,\n DropdownMenuTrigger as ShadDropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport { Canon } from '@sillsdev/scripture';\nimport { ScriptureReference, getChaptersForBook } from 'platform-bible-utils';\nimport {\n KeyboardEvent as ReactKeyboardEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\ntype BookTypeLabels = {\n [bookType in BookType]: string;\n};\ntype BookChapterControlProps = {\n scrRef: ScriptureReference;\n handleSubmit: (scrRef: ScriptureReference) => void;\n};\n\nconst ALL_BOOK_IDS = Canon.allBookIds;\nconst BOOK_TYPE_LABELS: BookTypeLabels = {\n OT: 'Old Testament',\n NT: 'New Testament',\n DC: 'Deuterocanon',\n};\nconst BOOK_TYPE_ARRAY: BookType[] = ['OT', 'NT', 'DC'];\n// This is the height of three menu items to offset scrolling to the selected menu item\n// If you use menuItemRef.clientHeight- includes height of chapter div which is too big\nconst SCROLL_OFFSET = 32 + 32 + 32;\nconst SEARCH_QUERY_FORMATS = [\n /^(\\w+)$/i, // Matches a single word (book name or id)\n /^(\\w+)(?:\\s(\\d+))$/i, // Matches a word followed by a chapter number\n /^(\\w+)(?:\\s(\\d+):(\\d+))$/i, // Matches a word followed by a chapter and verse number\n];\nconst fetchGroupedBooks = (bookType: BookType) => {\n const groupedBooks = {\n OT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookOT(bookId)),\n NT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookNT(bookId)),\n DC: ALL_BOOK_IDS.filter((bookId) => Canon.isBookDC(bookId)),\n };\n return groupedBooks[bookType];\n};\nconst fetchEndChapter = (bookId: string) => {\n // getChaptersForBook returns -1 if not found in scrBookData\n // scrBookData only includes OT and NT, so all DC will return -1\n return getChaptersForBook(Canon.bookIdToNumber(bookId));\n};\n\n/**\n * Gets all of the English names from book ids\n *\n * @returns String[]\n */\nfunction getAllEnglishNames(): string[] {\n const allEnglishNames = ALL_BOOK_IDS.map((bookId) => {\n return Canon.bookIdToEnglishName(bookId);\n });\n return allEnglishNames;\n}\n\n/**\n * Determines if bookName is in allEnglishNames\n *\n * @param bookName Book English name\n * @returns True if bookName is included, false otherwise\n */\nfunction isValidBookEnglishName(bookName: string): boolean {\n return getAllEnglishNames().includes(bookName);\n}\n\n/**\n * Gets a bookId from given English name\n *\n * @param bookName Book English name\n * @returns BookId of provided bookName, undefined otherwise\n */\nfunction getBookIdFromEnglishName(bookName: string): string | undefined {\n // Convert bookName to lowercase and then capitalize the first letter\n const formattedBookName = bookName.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase());\n\n if (isValidBookEnglishName(formattedBookName)) {\n const matchingBookId = ALL_BOOK_IDS.find((bookId) => {\n return Canon.bookIdToEnglishName(bookId) === formattedBookName;\n });\n return matchingBookId;\n }\n\n return undefined;\n}\n\nfunction BookChapterControl({ scrRef, handleSubmit }: BookChapterControlProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedBookId, setSelectedBookId] = useState(\n Canon.bookNumberToId(scrRef.bookNum),\n );\n const [highlightedChapter, setHighlightedChapter] = useState(scrRef.chapterNum ?? 0);\n const [highlightedBookId, setHighlightedBookId] = useState(\n Canon.bookNumberToId(scrRef.bookNum),\n );\n const [isContentOpen, setIsContentOpen] = useState(false);\n const [isContentOpenDelayed, setIsContentOpenDelayed] = useState(isContentOpen);\n\n // This ref will always be defined\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const inputRef = useRef(undefined!);\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const contentRef = useRef(undefined!);\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const menuItemRef = useRef(undefined!);\n\n const fetchFilteredBooks = useCallback(\n (bookType: BookType) => {\n return fetchGroupedBooks(bookType).filter((bookId: string) => {\n const englishNameLowerCase = Canon.bookIdToEnglishName(bookId).toLowerCase();\n const normalizedQuery = searchQuery.replace(/[^a-zA-Z]/g, '').toLowerCase();\n return (\n englishNameLowerCase.includes(normalizedQuery) || // Match book name\n bookId.toLowerCase().includes(normalizedQuery) // Match book ID\n );\n });\n },\n [searchQuery],\n );\n\n const handleSearchInput = (searchString: string) => {\n setSearchQuery(searchString);\n };\n\n /**\n * Whether to prevent radix's logic from closing the dropdown. This is important because radix\n * tries to close the dropdown when the input first focuses, and we don't want it to do that. But\n * we don't want to prevent the dropdown from closing when we click away from the input, so we\n * don't want to just keep it open if the input is focused\n */\n const shouldPreventAutoClosing = useRef(false);\n\n const controlMenuState = useCallback((open: boolean) => {\n if (shouldPreventAutoClosing.current) {\n shouldPreventAutoClosing.current = false;\n return;\n }\n setIsContentOpen(open);\n }, []);\n\n const updateReference = useCallback(\n (bookId: string, shouldClose: boolean, chapter?: number, verse?: number) => {\n setHighlightedChapter(\n Canon.bookNumberToId(scrRef.bookNum) !== bookId ? 1 : scrRef.chapterNum,\n );\n\n if (shouldClose || fetchEndChapter(bookId) === -1) {\n handleSubmit({\n bookNum: Canon.bookIdToNumber(bookId),\n chapterNum: chapter || 1,\n verseNum: verse || 1,\n });\n\n setIsContentOpen(false);\n setSearchQuery('');\n return;\n }\n\n setSelectedBookId(selectedBookId !== bookId ? bookId : '');\n setIsContentOpen(!shouldClose);\n },\n [handleSubmit, scrRef.bookNum, scrRef.chapterNum, selectedBookId],\n );\n\n const handleSelectChapter = (chapterNumber: number) => {\n if (chapterNumber <= 0 || chapterNumber > fetchEndChapter(selectedBookId)) {\n return;\n }\n updateReference(selectedBookId, true, chapterNumber);\n };\n\n const handleInputSubmit = useCallback(() => {\n SEARCH_QUERY_FORMATS.forEach((format) => {\n const matches = searchQuery.match(format);\n if (matches) {\n // Book should be a bookId or an english name\n const [book, chapter = undefined, verse = undefined] = matches.slice(1);\n const englishName = getBookIdFromEnglishName(book);\n\n if (Canon.isBookIdValid(book) || englishName) {\n updateReference(\n englishName ?? book,\n true,\n chapter ? parseInt(chapter, 10) : 1,\n verse ? parseInt(verse, 10) : 1,\n );\n }\n }\n });\n }, [updateReference, searchQuery]);\n\n const handleKeyDownInput = useCallback(\n (event: ReactKeyboardEvent) => {\n if (!isContentOpen) {\n setIsContentOpen(true);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (\n typeof menuItemRef !== 'undefined' &&\n // Ref uses null\n // eslint-disable-next-line no-null/no-null\n menuItemRef.current !== null\n ) {\n menuItemRef.current.focus();\n } else if (\n typeof contentRef !== 'undefined' &&\n // Ref uses null\n // eslint-disable-next-line no-null/no-null\n contentRef.current !== null\n ) {\n contentRef.current.focus();\n }\n event.preventDefault();\n }\n },\n [isContentOpen],\n );\n\n const handleKeyDownContent = (event: ReactKeyboardEvent) => {\n // When the dropdown menu has focus, key strokes should give focus to the input component,\n // unless they're navigation keys (arrows and enter)\n const { key } = event;\n if (\n key === 'ArrowRight' ||\n key === 'ArrowLeft' ||\n key === 'ArrowDown' ||\n key === 'ArrowUp' ||\n key === 'Enter'\n ) {\n return;\n }\n\n inputRef.current.dispatchEvent(new KeyboardEvent('keydown', { key }));\n inputRef.current.focus();\n };\n\n const handleKeyDownMenuItem = (event: ReactKeyboardEvent) => {\n const { key } = event;\n if (highlightedBookId === selectedBookId) {\n if (key === 'Enter') {\n event.preventDefault();\n updateReference(selectedBookId, true, highlightedChapter);\n return;\n }\n\n let chapterOffSet = 0;\n if (key === 'ArrowRight') {\n if (highlightedChapter < fetchEndChapter(highlightedBookId)) {\n chapterOffSet = 1;\n } else {\n event.preventDefault();\n return;\n }\n } else if (key === 'ArrowLeft') {\n if (highlightedChapter > 1) {\n chapterOffSet = -1;\n } else {\n event.preventDefault();\n return;\n }\n } else if (key === 'ArrowDown') {\n chapterOffSet = 6;\n } else if (key === 'ArrowUp') {\n chapterOffSet = -6;\n }\n if (\n highlightedChapter + chapterOffSet <= 0 ||\n highlightedChapter + chapterOffSet > fetchEndChapter(highlightedBookId)\n ) {\n setHighlightedChapter(0);\n } else if (chapterOffSet !== 0) {\n setHighlightedChapter(highlightedChapter + chapterOffSet);\n event.preventDefault();\n }\n }\n };\n\n useEffect(() => {\n if (selectedBookId === highlightedBookId) {\n if (selectedBookId === Canon.bookNumberToId(scrRef.bookNum)) {\n setHighlightedChapter(scrRef.chapterNum);\n } else {\n setHighlightedChapter(1);\n }\n } else {\n setHighlightedChapter(0);\n }\n }, [highlightedBookId, scrRef.bookNum, scrRef.chapterNum, selectedBookId]);\n\n // The purpose of these useLayoutEffects and timeout is to delay the scroll just\n // enough so that the refs are defined and available when they are used after the timeout\n useLayoutEffect(() => {\n setIsContentOpenDelayed(isContentOpen);\n }, [isContentOpen]);\n\n useLayoutEffect(() => {\n const scrollTimeout = setTimeout(() => {\n if (isContentOpenDelayed && contentRef.current && menuItemRef.current) {\n const menuItemOffsetTop = menuItemRef.current.offsetTop;\n const scrollPosition = menuItemOffsetTop - SCROLL_OFFSET;\n contentRef.current.scrollTo({ top: scrollPosition, behavior: 'instant' });\n }\n }, 10);\n return () => {\n clearTimeout(scrollTimeout);\n };\n }, [isContentOpenDelayed]);\n\n return (\n
\n \n \n {\n setSelectedBookId(Canon.bookNumberToId(scrRef.bookNum));\n setHighlightedBookId(Canon.bookNumberToId(scrRef.bookNum));\n setHighlightedChapter(scrRef.chapterNum > 0 ? scrRef.chapterNum : 0);\n setIsContentOpen(true);\n inputRef.current.focus();\n }}\n onFocus={() => {\n // Radix thinks we want to close because the input is being focused. Prevent that\n shouldPreventAutoClosing.current = true;\n }}\n handleSubmit={handleInputSubmit}\n placeholder={`${Canon.bookNumberToEnglishName(scrRef.bookNum)} ${scrRef.chapterNum}:${scrRef.verseNum}`}\n />\n \n \n console.log('sorting')}\n handleLocationHistory={() => console.log('location history')}\n handleBookmarks={() => console.log('bookmarks')}\n />\n {BOOK_TYPE_ARRAY.map(\n (bookType, bookTypeIndex) =>\n fetchFilteredBooks(bookType).length > 0 && (\n
\n \n {BOOK_TYPE_LABELS[bookType]}\n \n\n {fetchFilteredBooks(bookType).map((bookId) => (\n
\n updateReference(bookId, false)}\n isSelected={selectedBookId === bookId}\n handleHighlightBook={() => setHighlightedBookId(bookId)}\n handleKeyDown={handleKeyDownMenuItem}\n bookType={bookType}\n ref={(element: HTMLDivElement) => {\n if (selectedBookId === bookId) menuItemRef.current = element;\n }}\n >\n {\n setHighlightedChapter(chapterNumber);\n }}\n />\n \n
\n ))}\n {BOOK_TYPE_ARRAY.length - 1 !== bookTypeIndex ? (\n \n ) : undefined}\n
\n ),\n )}\n \n
\n
\n );\n}\n\nexport default BookChapterControl;\n","import React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const buttonVariants = cva(\n 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50',\n {\n variants: {\n variant: {\n default: 'pr-bg-primary pr-text-primary-foreground hover:pr-bg-primary/90',\n destructive: 'pr-bg-destructive pr-text-destructive-foreground hover:pr-bg-destructive/90',\n outline:\n 'pr-border pr-border-input pr-bg-background hover:pr-bg-accent hover:pr-text-accent-foreground',\n secondary: 'pr-bg-secondary pr-text-secondary-foreground hover:pr-bg-secondary/80',\n ghost: 'hover:pr-bg-accent hover:pr-text-accent-foreground',\n link: 'pr-text-primary pr-underline-offset-4 hover:pr-underline',\n },\n size: {\n default: 'pr-h-10 pr-px-4 pr-py-2',\n sm: 'pr-h-9 pr-rounded-md pr-px-3',\n lg: 'pr-h-11 pr-rounded-md pr-px-8',\n icon: 'pr-h-10 pr-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes,\n VariantProps {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n \n );\n },\n);\nButton.displayName = 'Button';\n","import React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst labelVariants = cva(\n 'pr-text-sm pr-font-medium pr-leading-none peer-disabled:pr-cursor-not-allowed peer-disabled:pr-opacity-70',\n);\n\nexport const Label = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & VariantProps\n>(({ className, ...props }, ref) => (\n \n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n","import React from 'react';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport { Circle } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => {\n return (\n \n );\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => {\n return (\n \n \n \n \n \n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n \n \n \n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n \n \n {children}\n \n \n Close\n \n \n \n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import React from 'react';\nimport { type DialogProps } from '@radix-ui/react-dialog';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Search } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Dialog, DialogContent } from '@/components/shadcn-ui/dialog';\n\nconst Command = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nCommand.displayName = CommandPrimitive.displayName;\n\ninterface CommandDialogProps extends DialogProps {}\n\nfunction CommandDialog({ children, ...props }: CommandDialogProps) {\n return (\n \n \n \n {children}\n \n \n \n );\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n
\n \n \n
\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>((props, ref) => (\n \n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nfunction CommandShortcut({ className, ...props }: React.HTMLAttributes) {\n return (\n \n );\n}\nCommandShortcut.displayName = 'CommandShortcut';\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import { useState } from 'react';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover';\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/shadcn-ui/command';\nimport { PopoverProps } from '@radix-ui/react-popover';\n\nexport type ComboBoxLabelOption = { label: string };\nexport type ComboBoxOption = string | number | ComboBoxLabelOption;\n\nexport type ComboBoxProps = {\n /** Optional unique identifier */\n id?: string;\n /** Text label title for combobox */\n /** List of available options for the dropdown menu */\n options?: readonly T[];\n /** Additional css classes to help with unique styling of the combo box */\n className?: string;\n /**\n * The selected value that the combo box currently holds. Must be shallow equal to one of the\n * options entries.\n */\n value?: T;\n /** Triggers when content of textfield is changed */\n onChange?: (newValue: T) => void;\n /** Used to determine the string value for a given option. */\n getOptionLabel?: (option: ComboBoxOption) => string;\n /** Text displayed on button if `value` is undefined */\n buttonPlaceholder?: string;\n /** Placeholder text for text field */\n textPlaceholder?: string;\n /** Text to display when no options match input */\n commandEmptyMessage?: string;\n /** Variant of button */\n buttonVariant?: ButtonProps['variant'];\n /** Text direction ltr or rtl */\n dir?: Direction;\n /** Optional boolean to set if trigger should be disabled */\n isDisabled?: boolean;\n} & PopoverProps;\n\ntype Direction = 'ltr' | 'rtl';\n\nfunction getOptionLabelDefault(option: ComboBoxOption): string {\n if (typeof option === 'string') {\n return option;\n }\n if (typeof option === 'number') {\n return option.toString();\n }\n return option.label;\n}\n\n/**\n * Autocomplete input and command palette with a list of suggestions.\n *\n * Thanks to Shadcn for heavy inspiration and documentation\n * https://ui.shadcn.com/docs/components/combobox\n */\nfunction ComboBox({\n id,\n options = [],\n className,\n value,\n onChange = () => {},\n getOptionLabel = getOptionLabelDefault,\n buttonPlaceholder = '',\n textPlaceholder = '',\n commandEmptyMessage = 'No option found',\n buttonVariant = 'outline',\n dir = 'ltr',\n isDisabled = false,\n ...props\n}: ComboBoxProps) {\n const [open, setOpen] = useState(false);\n\n return (\n \n \n \n \n {value ? getOptionLabel(value) : buttonPlaceholder}\n \n \n \n \n \n \n \n {commandEmptyMessage}\n \n {options.map((option) => (\n {\n onChange(option);\n setOpen(false);\n }}\n >\n \n {getOptionLabel(option)}\n \n ))}\n \n \n \n \n );\n}\n\nexport default ComboBox;\n","import { useMemo } from 'react';\nimport ComboBox from '@/components/basics/combo-box.component';\nimport { Label } from '@/components/shadcn-ui/label';\n\nexport type ChapterRangeSelectorProps = {\n startChapter: number;\n endChapter: number;\n handleSelectStartChapter: (chapter: number) => void;\n handleSelectEndChapter: (chapter: number) => void;\n isDisabled?: boolean;\n chapterCount: number;\n};\n\nexport default function ChapterRangeSelector({\n startChapter,\n endChapter,\n handleSelectStartChapter,\n handleSelectEndChapter,\n isDisabled = false,\n chapterCount,\n}: ChapterRangeSelectorProps) {\n const chapterOptions = useMemo(\n () => Array.from({ length: chapterCount }, (_, index) => index + 1),\n [chapterCount],\n );\n\n const onChangeStartChapter = (value: number) => {\n handleSelectStartChapter(value);\n if (value > endChapter) {\n handleSelectEndChapter(value);\n }\n };\n\n const onChangeEndChapter = (value: number) => {\n handleSelectEndChapter(value);\n if (value < startChapter) {\n handleSelectStartChapter(value);\n }\n };\n\n return (\n <>\n \n option.toString()}\n value={startChapter}\n />\n\n \n option.toString()}\n value={endChapter}\n />\n \n );\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group';\nimport { Canon } from '@sillsdev/scripture';\nimport { LocalizedStringValue } from 'platform-bible-utils';\nimport { useState } from 'react';\nimport ChapterRangeSelector, {\n ChapterRangeSelectorProps,\n} from '../basics/chapter-range-selector.component';\n\nexport enum BookSelectionMode {\n CURRENT_BOOK = 'current book',\n CHOOSE_BOOKS = 'choose books',\n}\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const BOOK_SELECTOR_STRING_KEYS = Object.freeze([\n '%webView_bookSelector_currentBook%',\n '%webView_bookSelector_choose%',\n '%webView_bookSelector_chooseBooks%',\n] as const);\n\nexport type BookSelectorLocalizedStrings = {\n [localizedInventoryKey in (typeof BOOK_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: BookSelectorLocalizedStrings,\n key: keyof BookSelectorLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\ntype BookSelectorProps = ChapterRangeSelectorProps & {\n handleBookSelectionModeChange: (newMode: BookSelectionMode) => void;\n currentBookName: string;\n onSelectBooks: () => void;\n selectedBookIds: string[];\n localizedStrings: BookSelectorLocalizedStrings;\n};\n\nexport default function BookSelector({\n handleBookSelectionModeChange,\n currentBookName,\n onSelectBooks,\n selectedBookIds,\n chapterCount,\n endChapter,\n handleSelectEndChapter,\n startChapter,\n handleSelectStartChapter,\n localizedStrings,\n}: BookSelectorProps) {\n const currentBookText = localizeString(localizedStrings, '%webView_bookSelector_currentBook%');\n const chooseText = localizeString(localizedStrings, '%webView_bookSelector_choose%');\n const chooseBooksText = localizeString(localizedStrings, '%webView_bookSelector_chooseBooks%');\n\n const [bookSelectionMode, setBookSelectionMode] = useState(\n BookSelectionMode.CURRENT_BOOK,\n );\n\n const onSelectionModeChange = (newMode: BookSelectionMode) => {\n setBookSelectionMode(newMode);\n handleBookSelectionModeChange(newMode);\n };\n\n return (\n onSelectionModeChange(value as BookSelectionMode)}\n >\n
\n
\n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n
\n \n onSelectBooks()}\n >\n {chooseText}\n \n
\n
\n \n );\n}\n","import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu';\nimport { FilterIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/shadcn-ui/dropdown-menu';\n\ninterface DataTableViewOptionsProps {\n table: Table;\n}\n\nfunction DataTableViewOptions({ table }: DataTableViewOptionsProps) {\n return (\n \n \n \n \n \n Toggle columns\n \n {table\n .getAllColumns()\n .filter((column) => column.getCanHide())\n .map((column) => {\n return (\n column.toggleVisibility(!!value)}\n >\n {column.id}\n \n );\n })}\n \n \n );\n}\n\nexport default DataTableViewOptions;\n","import React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n span]:pr-line-clamp-1',\n className,\n )}\n {...props}\n >\n {children}\n \n \n \n \n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, position = 'popper', ...props }, ref) => (\n \n \n \n \n {children}\n \n \n \n \n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n \n \n \n \n \n\n {children}\n \n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","import { ChevronLeftIcon, ChevronRightIcon, ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\n\ninterface DataTablePaginationProps {\n table: Table;\n}\n\nfunction DataTablePagination({ table }: DataTablePaginationProps) {\n return (\n
\n
\n
\n {table.getFilteredSelectedRowModel().rows.length} of{' '}\n {table.getFilteredRowModel().rows.length} row(s) selected\n
\n
\n

Rows per page

\n {\n table.setPageSize(Number(value));\n }}\n >\n \n \n \n \n {[10, 20, 30, 40, 50].map((pageSize) => (\n \n {pageSize}\n \n ))}\n \n \n
\n
\n Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}\n
\n
\n table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n Go to first page\n \n \n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Go to previous page\n \n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Go to next page\n \n \n table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n Go to last page\n \n \n
\n
\n
\n );\n}\n\nexport default DataTablePagination;\n","import React from 'react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes & { stickyHeader?: boolean }\n>(({ className, stickyHeader, ...props }, ref) => (\n
\n \n
\n));\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes & { stickyHeader?: boolean }\n>(({ className, stickyHeader, ...props }, ref) => (\n \n));\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableBody.displayName = 'TableBody';\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n tr]:last:pr-border-b-0', className)}\n {...props}\n />\n));\nTableFooter.displayName = 'TableFooter';\n\nconst TableRow = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nTableRow.displayName = 'TableRow';\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableHead.displayName = 'TableHead';\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n \n));\nTableCaption.displayName = 'TableCaption';\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import { useState } from 'react';\n\nimport {\n ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n SortingState,\n ColumnDef as TSColumnDef,\n Row as TSRow,\n SortDirection as TSSortDirection,\n Table as TSTable,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table';\n\nimport DataTableViewOptions from '@/components/advanced/data-table/data-table-column-toggle.component';\nimport DataTablePagination from '@/components/advanced/data-table/data-table-pagination.component';\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\n\nexport type ColumnDef = TSColumnDef;\nexport type RowContents = TSRow;\nexport type TableContents = TSTable;\nexport type SortDirection = TSSortDirection;\n\ninterface DataTableProps {\n columns: ColumnDef[];\n data: TData[];\n enablePagination?: boolean;\n showPaginationControls?: boolean;\n showColumnVisibilityControls?: boolean;\n stickyHeader?: boolean;\n onRowClickHandler?: (row: RowContents, table: TableContents) => void;\n}\n\n/**\n * Feature-rich table component that infuses our basic shadcn-based Table component with features\n * from TanStack's React Table library\n */\nfunction DataTable({\n columns,\n data,\n enablePagination = false,\n showPaginationControls = false,\n showColumnVisibilityControls = false,\n stickyHeader = false,\n onRowClickHandler = () => {},\n}: DataTableProps) {\n const [sorting, setSorting] = useState([]);\n const [columnFilters, setColumnFilters] = useState([]);\n const [columnVisibility, setColumnVisibility] = useState({});\n const [rowSelection, setRowSelection] = useState({});\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n ...(enablePagination && { getPaginationRowModel: getPaginationRowModel() }),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n onColumnFiltersChange: setColumnFilters,\n getFilteredRowModel: getFilteredRowModel(),\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n },\n });\n\n return (\n
\n {showColumnVisibilityControls && }\n \n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers.map((header) => {\n return (\n \n {header.isPlaceholder\n ? undefined\n : flexRender(header.column.columnDef.header, header.getContext())}\n \n );\n })}\n \n ))}\n \n \n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n onRowClickHandler(row, table)}\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n >\n {row.getVisibleCells().map((cell) => (\n \n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n \n ))}\n \n ))\n ) : (\n \n \n No results.\n \n \n )}\n \n
\n {enablePagination && (\n
\n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n \n
\n )}\n {enablePagination && showPaginationControls && }\n
\n );\n}\n\nexport default DataTable;\n","/**\n * Splits USFM string into shorter line-like segments\n *\n * @param text A single (likely very large) USFM string\n * @returns An array containing the input text, split into shorter segments\n */\nexport const getLinesFromUSFM = (text: string) => {\n // Splits on (CR)LF, CR, \\v, \\c and \\id\n return text.split(/(?:\\r?\\n|\\r)|(?=(?:\\\\(?:v|c|id)))/g);\n};\n\n/**\n * Extracts chapter or verse number from USFM strings that start with a chapter or verse marker\n *\n * @param text USFM string\n * @returns Chapter or verse number if one is found. Else returns 0.\n */\nexport const extractNumberFromUSFM = (text: string): number | undefined => {\n // Captures all digits that follow \\v or \\c markers followed by whitespace located at the start of a string\n const regex = /^\\\\[vc]\\s+(\\d+)/;\n const match = text.match(regex);\n if (match) {\n return +match[1];\n }\n return undefined;\n};\n","import {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { Canon } from '@sillsdev/scripture';\nimport { LanguageStrings, ScriptureReference } from 'platform-bible-utils';\nimport { useEffect, useState } from 'react';\nimport { extractNumberFromUSFM, getLinesFromUSFM } from './inventory-utils';\n\ntype SearchResult = {\n reference: ScriptureReference;\n snippet: string;\n key: number;\n};\n\nconst extractOccurrences = (\n text: string | undefined,\n item: string,\n extractItems: (text: string, item?: string | undefined) => string[],\n scriptureRef: ScriptureReference,\n): SearchResult[] => {\n if (!text || text === '' || item === '') return [];\n\n const results: SearchResult[] = [];\n const lines = getLinesFromUSFM(text);\n\n let currentChapter: number | undefined = scriptureRef.chapterNum;\n let currentVerse: number | undefined = scriptureRef.verseNum;\n let key: number = 0;\n\n lines.forEach((line) => {\n if (line.startsWith('\\\\id')) {\n currentChapter = 0;\n currentVerse = 0;\n }\n if (line.startsWith('\\\\c')) {\n currentChapter = extractNumberFromUSFM(line);\n currentVerse = 0;\n }\n if (line.startsWith('\\\\v')) {\n currentVerse = extractNumberFromUSFM(line);\n if (currentChapter === 0) {\n currentChapter = scriptureRef.chapterNum;\n }\n }\n\n const items: string[] = extractItems(line, item);\n\n for (let i = 0; i < items.length; i++) {\n const result: SearchResult = {\n reference: {\n ...scriptureRef,\n chapterNum: currentChapter !== undefined ? +currentChapter : -1,\n verseNum: currentVerse !== undefined ? +currentVerse : -1,\n },\n snippet: line,\n key,\n };\n key += 1;\n results.push(result);\n }\n });\n\n return results;\n};\n\ntype OccurrencesTableProps = {\n selectedItem: string;\n text: string | undefined;\n extractItems: (text: string, item?: string | undefined) => string[];\n scriptureReference: ScriptureReference;\n setScriptureReference: (scriptureReference: ScriptureReference) => void;\n localizedStrings: LanguageStrings;\n};\n\nfunction OccurrencesTable({\n selectedItem,\n text,\n extractItems,\n scriptureReference,\n setScriptureReference,\n localizedStrings,\n}: OccurrencesTableProps) {\n const reference = localizedStrings['%webView_inventory_occurrences_table_header_reference%'];\n const occurrence = localizedStrings['%webView_inventory_occurrences_table_header_occurrence%'];\n const [tableData, setTableData] = useState(\n extractOccurrences(text, selectedItem, extractItems, scriptureReference),\n );\n\n useEffect(\n () => setTableData(extractOccurrences(text, selectedItem, extractItems, scriptureReference)),\n [text, selectedItem, scriptureReference, extractItems],\n );\n\n return (\n \n \n \n {reference}\n {occurrence}\n \n \n \n {tableData.map((result) => (\n {\n setScriptureReference(result.reference);\n }}\n >\n {`${Canon.bookNumberToEnglishName(result.reference.bookNum)} ${result.reference.chapterNum}:${result.reference.verseNum}`}\n {result.snippet}\n \n ))}\n \n
\n );\n}\n\nexport default OccurrencesTable;\n","import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\nimport { LocalizedStringValue, ScriptureReference } from 'platform-bible-utils';\nimport { Input } from '@/components/shadcn-ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport DataTable, {\n ColumnDef,\n RowContents,\n SortDirection,\n TableContents,\n} from '@/components/advanced/data-table/data-table.component';\nimport OccurrencesTable from '@/components/advanced/inventory/occurrences-table.component';\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from 'lucide-react';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const INVENTORY_STRING_KEYS = Object.freeze([\n '%webView_inventory_all%',\n '%webView_inventory_approved%',\n '%webView_inventory_unapproved%',\n '%webView_inventory_unknown%',\n '%webView_inventory_scope_currentBook%',\n '%webView_inventory_scope_chapter%',\n '%webView_inventory_scope_verse%',\n '%webView_inventory_filter_text%',\n '%webView_inventory_occurrences_table_header_reference%',\n '%webView_inventory_occurrences_table_header_occurrence%',\n] as const);\n\nexport type InventoryLocalizedStrings = {\n [localizedInventoryKey in (typeof INVENTORY_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\nexport type Scope = 'book' | 'chapter' | 'verse';\n\nexport type Status = 'approved' | 'unapproved' | 'unknown';\n\nexport type StatusFilter = Status | 'all';\n\nexport type ItemData = {\n item: string;\n count: number;\n status: Status;\n};\n\n/**\n * Gets an icon that indicates the current sorting direction based on the provided input\n *\n * @param sortDirection Sorting direction. Can be ascending ('asc'), descending ('desc') or false (\n * i.e. not sorted)\n * @returns The appropriate sorting icon for the provided sorting direction\n */\nexport const getSortingIcon = (sortDirection: false | SortDirection): ReactNode => {\n if (sortDirection === 'asc') {\n return ;\n }\n if (sortDirection === 'desc') {\n return ;\n }\n return ;\n};\n\n/**\n * Filters data that is shown in the DataTable section of the inventory\n *\n * @param items All items and their related information\n * @param statusFilter Allows filtering by status (i.e. show all items, or only items that are\n * 'approved', 'unapproved' or 'unknown')\n * @param textFilter Allows filtering by text. All items that include the filter text will be\n * selected.\n * @returns Array of items and their related information that are matched by the specified filters\n */\nconst filterItemData = (\n items: ItemData[],\n statusFilter: StatusFilter,\n textFilter: string,\n): ItemData[] => {\n let filteredItemData: ItemData[] = items;\n\n if (statusFilter !== 'all') {\n filteredItemData = filteredItemData.filter(\n (item) =>\n (statusFilter === 'approved' && item.status === 'approved') ||\n (statusFilter === 'unapproved' && item.status === 'unapproved') ||\n (statusFilter === 'unknown' && item.status === 'unknown'),\n );\n }\n\n if (textFilter !== '')\n filteredItemData = filteredItemData.filter((item) => item.item.includes(textFilter));\n\n return filteredItemData;\n};\n\n/**\n * Turns scripture text into array of inventory items, along with their count and status\n *\n * @param text Scripture text from which the inventory items are extracted\n * @param getInventoryItems Function that provides logic for extracting inventory items from text\n * @param getStatusForItem Function that gets status for inventory item from related project\n * settings\n * @returns Array of inventory items, along with their count and status\n */\nconst convertTextToItemData = (\n text: string,\n getInventoryItems: (text: string) => string[],\n getStatusForItem: (item: string) => Status,\n): ItemData[] => {\n const itemData: ItemData[] = [];\n\n const items: string[] = getInventoryItems(text);\n\n for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n const item = items[itemIndex];\n const existingItem = itemData.find((entry) => {\n return entry.item === item;\n });\n if (existingItem) {\n existingItem.count += 1;\n } else {\n const newItem: ItemData = {\n item,\n count: 1,\n status: getStatusForItem(item),\n };\n itemData.push(newItem);\n }\n }\n\n return itemData;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: InventoryLocalizedStrings,\n key: keyof InventoryLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\ntype InventoryProps = {\n scriptureReference: ScriptureReference;\n setScriptureReference: (scriptureReference: ScriptureReference) => void;\n localizedStrings: InventoryLocalizedStrings;\n extractItems: (text: string, item?: string | undefined) => string[];\n approvedItems: string[];\n onApprovedItemsChange: (items: string[]) => void;\n unapprovedItems: string[];\n onUnapprovedItemsChange: (items: string[]) => void;\n text: string | undefined;\n scope: Scope;\n onScopeChange: (scope: Scope) => void;\n getColumns: (\n onStatusChange: (newItems: string[], status: Status) => void,\n ) => ColumnDef[];\n};\n\n/** Inventory component that is used to view and control the status of provided project settings */\nexport default function Inventory({\n scriptureReference,\n setScriptureReference,\n localizedStrings,\n extractItems,\n approvedItems,\n onApprovedItemsChange,\n unapprovedItems,\n onUnapprovedItemsChange,\n text,\n scope,\n onScopeChange,\n getColumns,\n}: InventoryProps) {\n const allItemsText = localizeString(localizedStrings, '%webView_inventory_all%');\n const approvedItemsText = localizeString(localizedStrings, '%webView_inventory_approved%');\n const unapprovedItemsText = localizeString(localizedStrings, '%webView_inventory_unapproved%');\n const unknownItemsText = localizeString(localizedStrings, '%webView_inventory_unknown%');\n const scopeBookText = localizeString(localizedStrings, '%webView_inventory_scope_currentBook%');\n const scopeChapterText = localizeString(localizedStrings, '%webView_inventory_scope_chapter%');\n const scopeVerseText = localizeString(localizedStrings, '%webView_inventory_scope_verse%');\n const filterText = localizeString(localizedStrings, '%webView_inventory_filter_text%');\n\n const [items, setItems] = useState([]);\n const [statusFilter, setStatusFilter] = useState('all');\n const [textFilter, setTextFilter] = useState('');\n const [selectedItem, setSelectedItem] = useState('');\n\n const statusChangeHandler = useCallback(\n (changedItems: string[], status: Status) => {\n setItems((prevTableData) => {\n let tableData: ItemData[] = [];\n changedItems.forEach((item) => {\n tableData = prevTableData.map((tableEntry) => {\n if (tableEntry.item === item && tableEntry.status !== status)\n return { ...tableEntry, status };\n return tableEntry;\n });\n });\n return tableData;\n });\n\n let newApprovedItems: string[] = [...approvedItems];\n changedItems.forEach((item) => {\n if (status === 'approved') {\n if (!newApprovedItems.includes(item)) {\n newApprovedItems.push(item);\n }\n } else {\n newApprovedItems = newApprovedItems.filter((validItem) => validItem !== item);\n }\n });\n onApprovedItemsChange(newApprovedItems);\n\n let newUnapprovedItems: string[] = [...unapprovedItems];\n changedItems.forEach((item) => {\n if (status === 'unapproved') {\n if (!newUnapprovedItems.includes(item)) {\n newUnapprovedItems.push(item);\n }\n } else {\n newUnapprovedItems = newUnapprovedItems.filter(\n (unapprovedItem) => unapprovedItem !== item,\n );\n }\n });\n onUnapprovedItemsChange(newUnapprovedItems);\n },\n [approvedItems, onApprovedItemsChange, unapprovedItems, onUnapprovedItemsChange],\n );\n\n const getStatusForItem = useCallback(\n (item: string): Status => {\n if (approvedItems.includes(item)) return 'approved';\n if (unapprovedItems.includes(item)) return 'unapproved';\n return 'unknown';\n },\n [approvedItems, unapprovedItems],\n );\n\n useEffect(() => {\n if (!text) return;\n setItems(convertTextToItemData(text, extractItems, getStatusForItem));\n }, [extractItems, text, getStatusForItem]);\n\n const filteredItemData = useMemo(() => {\n return filterItemData(items, statusFilter, textFilter);\n }, [items, statusFilter, textFilter]);\n\n useEffect(() => {\n setSelectedItem('');\n }, [filteredItemData]);\n\n const rowClickHandler = (row: RowContents, table: TableContents) => {\n table.toggleAllRowsSelected(false); // this is pretty hacky, and also prevents us from selecting multiple rows\n row.toggleSelected(undefined);\n\n setSelectedItem(row.getValue('item'));\n };\n\n const columns = useMemo(() => getColumns(statusChangeHandler), [getColumns, statusChangeHandler]);\n\n const handleScopeChange = (value: string) => {\n if (value === 'book' || value === 'chapter' || value === 'verse') {\n onScopeChange(value);\n } else {\n throw new Error(`Invalid scope value: ${value}`);\n }\n };\n\n const handleStatusFilterChange = (value: string) => {\n if (value === 'all' || value === 'approved' || value === 'unapproved' || value === 'unknown') {\n setStatusFilter(value);\n } else {\n throw new Error(`Invalid status filter value: ${value}`);\n }\n };\n\n return (\n
\n
\n handleStatusFilterChange(value)}\n defaultValue={statusFilter}\n >\n \n \n \n \n {allItemsText}\n {approvedItemsText}\n {unapprovedItemsText}\n {unknownItemsText}\n \n \n \n {\n setTextFilter(event.target.value);\n }}\n />\n
\n
\n \n
\n {selectedItem !== '' && (\n
\n \n setScriptureReference(newScriptureReference)\n }\n localizedStrings={localizedStrings}\n />\n
\n )}\n
\n );\n}\n","import React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst toggleVariants = cva(\n 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors hover:pr-bg-muted hover:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=on]:pr-bg-accent data-[state=on]:pr-text-accent-foreground',\n {\n variants: {\n variant: {\n default: 'pr-bg-transparent',\n outline:\n 'pr-border pr-border-input pr-bg-transparent hover:pr-bg-accent hover:pr-text-accent-foreground',\n },\n size: {\n default: 'pr-h-10 pr-px-3',\n sm: 'pr-h-9 pr-px-2.5',\n lg: 'pr-h-11 pr-px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & VariantProps\n>(({ className, variant, size, ...props }, ref) => (\n \n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","import React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport { type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { toggleVariants } from '@/components/shadcn-ui/toggle';\n\nconst ToggleGroupContext = React.createContext>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps\n>(({ className, variant, size, children, ...props }, ref) => (\n \n \n {children}\n \n \n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n \n {children}\n \n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","import { Button } from '@/components/shadcn-ui/button';\nimport { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group';\nimport { CircleCheckIcon, CircleHelpIcon, CircleXIcon } from 'lucide-react';\nimport { ColumnDef } from '../data-table/data-table.component';\nimport { getSortingIcon, ItemData, Status } from './inventory.component';\n\n/**\n * Function that creates the item column for inventories\n *\n * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.)\n * @returns Column that shows the inventory items. Should be used with the DataTable component\n */\nexport const inventoryItemColumn = (itemLabel: string): ColumnDef => {\n return {\n accessorKey: 'item',\n header: ({ column }) => (\n \n ),\n };\n};\n\n/**\n * Function that creates the count column for inventories. Should be used with the DataTable\n * component.\n *\n * @param itemLabel Localized label for the count column\n * @returns Column that shows the number of occurrences of the related inventory items\n */\nexport const inventoryCountColumn = (countLabel: string): ColumnDef => {\n return {\n accessorKey: 'count',\n header: ({ column }) => (\n
\n \n
\n ),\n cell: ({ row }) =>
{row.getValue('count')}
,\n };\n};\n\n/**\n * Function that creates the status column for inventories. Should be used with the DataTable\n * component.\n *\n * @param itemLabel Localized label for the status column\n * @param statusChangeHandler Callback function that handles status updates to selected item(s)\n * @returns Column that shows the status of the related inventory items.\n */\nexport const inventoryStatusColumn = (\n statusLabel: string,\n statusChangeHandler: (items: string[], status: Status) => void,\n): ColumnDef => {\n return {\n accessorKey: 'status',\n header: ({ column }) => {\n return (\n
\n \n
\n );\n },\n cell: ({ row }) => {\n const status: Status = row.getValue('status');\n const item: string = row.getValue('item');\n return (\n \n statusChangeHandler([item], 'approved')} value=\"approved\">\n \n \n statusChangeHandler([item], 'unapproved')}\n value=\"unapproved\"\n >\n \n \n statusChangeHandler([item], 'unknown')} value=\"unknown\">\n \n \n \n );\n },\n };\n};\n","import { Input } from '@/components/shadcn-ui/input';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { useState } from 'react';\n\nexport type SearchBarProps = {\n /**\n * Callback fired to handle the search query when button pressed\n *\n * @param searchQuery\n */\n onSearch: (searchQuery: string) => void;\n\n /** Optional string that appears in the search bar without a search string */\n placeholder?: string;\n\n /** Optional boolean to set the input base to full width */\n isFullWidth?: boolean;\n};\n\nexport default function SearchBar({ onSearch, placeholder, isFullWidth }: SearchBarProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleInputChange = (searchString: string) => {\n setSearchQuery(searchString);\n onSearch(searchString);\n };\n\n return (\n handleInputChange(e.target.value)}\n />\n );\n}\n","// adapted from: https://github.com/shadcn-ui/ui/discussions/752\n\n'use client';\n\nimport { TabsContentProps, TabsListProps, TabsTriggerProps } from '@/components/shadcn-ui/tabs';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport React from 'react';\n\nexport type VerticalTabsProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type LeftTabsTriggerProps = TabsTriggerProps & {\n value: string;\n ref?: React.Ref;\n};\n\nexport const VerticalTabs = React.forwardRef<\n React.ElementRef,\n VerticalTabsProps\n>(({ className, ...props }, ref) => (\n \n));\n\nVerticalTabs.displayName = TabsPrimitive.List.displayName;\n\nexport const VerticalTabsList = React.forwardRef<\n React.ElementRef,\n TabsListProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsList.displayName = TabsPrimitive.List.displayName;\n\nexport const VerticalTabsTrigger = React.forwardRef<\n React.ElementRef,\n LeftTabsTriggerProps\n>(({ className, ...props }, ref) => (\n \n));\n\nexport const VerticalTabsContent = React.forwardRef<\n React.ElementRef,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsContent.displayName = TabsPrimitive.Content.displayName;\n","import SearchBar from '@/components/basics/search-bar.component';\nimport {\n VerticalTabs,\n VerticalTabsContent,\n VerticalTabsList,\n VerticalTabsTrigger,\n} from '@/components/basics/tabs-vertical';\nimport { ReactNode } from 'react';\n\nexport type TabKeyValueContent = {\n key: string;\n value: string;\n content: ReactNode;\n};\n\nexport type NavigationContentSearchProps = {\n /** List of values and keys for each tab this component should provide */\n tabList: TabKeyValueContent[];\n\n /** Handler to run when the value of the search bar changes */\n onSearch: (searchQuery: string) => void;\n\n /** Optional placeholder for the search bar */\n searchPlaceholder?: string;\n\n /** Optional title to include in the header */\n headerTitle?: string;\n\n /** Optional flag to make the search bar appear full width */\n isSearchBarFullWidth?: boolean;\n\n /** Text direction ltr or rtl */\n direction?: 'ltr' | 'rtl';\n};\n\nexport default function NavigationContentSearch({\n tabList,\n onSearch,\n searchPlaceholder,\n headerTitle,\n isSearchBarFullWidth = false,\n direction = 'ltr',\n}: NavigationContentSearchProps) {\n return (\n
\n
\n {headerTitle ?

{headerTitle}

: ''}\n \n
\n \n \n {tabList.map((tab) => (\n \n {tab.value}\n \n ))}\n \n {tabList.map((tab) => (\n \n {tab.content}\n \n ))}\n \n
\n );\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Canon } from '@sillsdev/scripture';\nimport {\n Cell,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getExpandedRowModel,\n getGroupedRowModel,\n getSortedRowModel,\n GroupingState,\n Row,\n RowSelectionState,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table';\nimport '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css';\nimport {\n compareScrRefs,\n formatScrRef,\n ScriptureSelection,\n scrRefToBBBCCCVVV,\n} from 'platform-bible-utils';\nimport { MouseEvent, useEffect, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\n\n/**\n * Information (e.g., a checking error or some other type of \"transient\" annotation) about something\n * noteworthy at a specific place in an instance of the Scriptures.\n */\nexport type ScriptureItemDetail = ScriptureSelection & {\n /**\n * Text of the error, note, etc. In the future, we might want to support something more than just\n * text so that a JSX element could be provided with a link or some other controls related to the\n * issue being reported.\n */\n detail: string;\n};\n\n/**\n * A uniquely identifiable source of results that can be displayed in the ScriptureResultsViewer.\n * Generally, the source will be a particular Scripture check, but there may be other types of\n * sources.\n */\nexport type ResultsSource = {\n /**\n * Uniquely identifies the source.\n *\n * @type {string}\n */\n id: string;\n\n /**\n * Name (potentially localized) of the source, suitable for display in the UI.\n *\n * @type {string}\n */\n displayName: string;\n};\n\nexport type ScriptureSrcItemDetail = ScriptureItemDetail & {\n /** Source/type of detail. Can be used for grouping. */\n source: ResultsSource;\n};\n\n/**\n * Represents a set of results keyed by Scripture reference. Generally, the source will be a\n * particular Scripture check, but this type also allows for other types of uniquely identifiable\n * sources.\n */\nexport type ResultsSet = {\n /**\n * The backing source associated with this set of results.\n *\n * @type {ResultsSource}\n */\n source: ResultsSource;\n\n /**\n * Array of Scripture item details (messages keyed by Scripture reference).\n *\n * @type {ScriptureItemDetail[]}\n */\n data: ScriptureItemDetail[];\n};\n\nconst scrBookColId = 'scrBook';\nconst scrRefColId = 'scrRef';\nconst typeColId = 'source';\nconst detailsColId = 'details';\n\nconst defaultScrRefColumnName = 'Scripture Reference';\nconst defaultScrBookGroupName = 'Scripture Book';\nconst defaultTypeColumnName = 'Type';\nconst defaultDetailsColumnName = 'Details';\n\nexport type ScriptureResultsViewerColumnInfo = {\n /** Optional header to display for the Reference column. Default value: 'Scripture Reference'. */\n scriptureReferenceColumnName?: string;\n\n /** Optional text to display to refer to the Scripture book group. Default value: 'Scripture Book'. */\n scriptureBookGroupName?: string;\n\n /** Optional header to display for the Type column. Default value: 'Type'. */\n typeColumnName?: string;\n\n /** Optional header to display for the Details column. Default value: 'Details' */\n detailsColumnName?: string;\n};\n\nexport type ScriptureResultsViewerProps = ScriptureResultsViewerColumnInfo & {\n /** Groups of ScriptureItemDetail objects from particular sources (e.g., Scripture checks) */\n sources: ResultsSet[];\n\n /** Flag indicating whether to display column headers. Default is false. */\n showColumnHeaders?: boolean;\n\n /** Flag indicating whether to display source column. Default is false. */\n showSourceColumn?: boolean;\n\n /** Callback function to notify when a row is selected */\n onRowSelected?: (selectedRow: ScriptureSrcItemDetail | undefined) => void;\n\n /** Text direction ltr or rtl */\n direction?: 'ltr' | 'rtl';\n};\n\nfunction getColumns(\n colInfo?: ScriptureResultsViewerColumnInfo,\n showSourceColumn?: boolean,\n): ColumnDef[] {\n const showSrcCol = showSourceColumn ?? false;\n return [\n {\n accessorFn: (row) =>\n `${Canon.bookNumberToId(row.start.bookNum)} ${row.start.chapterNum}:${row.start.verseNum}`,\n id: scrBookColId,\n header: colInfo?.scriptureReferenceColumnName ?? defaultScrRefColumnName,\n cell: (info) => {\n const row = info.row.original;\n if (info.row.getIsGrouped()) {\n return Canon.bookNumberToEnglishName(row.start.bookNum);\n }\n return info.row.groupingColumnId === scrBookColId ? formatScrRef(row.start) : undefined;\n },\n getGroupingValue: (row) => row.start.bookNum,\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: true,\n },\n {\n accessorFn: (row) => formatScrRef(row.start),\n id: scrRefColId,\n header: undefined,\n cell: (info) => {\n const row = info.row.original;\n return info.row.getIsGrouped() ? undefined : formatScrRef(row.start);\n },\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: false,\n },\n {\n accessorFn: (row) => row.source.displayName,\n id: typeColId,\n header: showSrcCol ? (colInfo?.typeColumnName ?? defaultTypeColumnName) : undefined,\n cell: (info) => (showSrcCol || info.row.getIsGrouped() ? info.getValue() : undefined),\n getGroupingValue: (row) => row.source.id,\n sortingFn: (a, b) =>\n a.original.source.displayName.localeCompare(b.original.source.displayName),\n enableGrouping: true,\n },\n {\n accessorFn: (row) => row.detail,\n id: detailsColId,\n header: colInfo?.detailsColumnName ?? defaultDetailsColumnName,\n cell: (info) => info.getValue(),\n enableGrouping: false,\n },\n ];\n}\n\nconst toRefOrRange = (scriptureSelection: ScriptureSelection) => {\n if (!('offset' in scriptureSelection.start))\n throw new Error('No offset available in range start');\n if (scriptureSelection.end && !('offset' in scriptureSelection.end))\n throw new Error('No offset available in range end');\n const { offset: offsetStart } = scriptureSelection.start;\n let offsetEnd: number = 0;\n if (scriptureSelection.end) ({ offset: offsetEnd } = scriptureSelection.end);\n if (\n !scriptureSelection.end ||\n compareScrRefs(scriptureSelection.start, scriptureSelection.end) === 0\n )\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}`;\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}-${scrRefToBBBCCCVVV(scriptureSelection.end)}+${offsetEnd}`;\n};\n\nconst getRowKey = (row: ScriptureSrcItemDetail) =>\n `${toRefOrRange({ start: row.start, end: row.end })} ${row.source.displayName} ${row.detail}`;\n\n/**\n * Component to display a combined list of detailed items from one or more sources, where the items\n * are keyed primarily by Scripture reference. This is particularly useful for displaying a list of\n * results from Scripture checks, but more generally could be used to display any \"results\" from any\n * source(s). The component allows for grouping by Scripture book, source, or both. By default, it\n * displays somewhat \"tree-like\" which allows it to be more horizontally compact and intuitive. But\n * it also has the option of displaying as a traditional table with column headings (with or without\n * the source column showing).\n */\nexport default function ScriptureResultsViewer({\n sources,\n showColumnHeaders = false,\n showSourceColumn = false,\n scriptureReferenceColumnName,\n scriptureBookGroupName,\n typeColumnName,\n detailsColumnName,\n onRowSelected,\n direction = 'ltr',\n}: ScriptureResultsViewerProps) {\n const [grouping, setGrouping] = useState([]);\n const [sorting, setSorting] = useState([{ id: scrBookColId, desc: false }]);\n const [rowSelection, setRowSelection] = useState({});\n\n const scriptureResults = useMemo(\n () =>\n sources.flatMap((source) => {\n return source.data.map((item) => ({\n ...item,\n source: source.source,\n }));\n }),\n [sources],\n );\n\n const columns = useMemo(\n () =>\n getColumns(\n {\n scriptureReferenceColumnName,\n typeColumnName,\n detailsColumnName,\n },\n showSourceColumn,\n ),\n [scriptureReferenceColumnName, typeColumnName, detailsColumnName, showSourceColumn],\n );\n\n useEffect(() => {\n // Ensure sorting is applied correctly when grouped by type\n if (grouping.includes(typeColId)) {\n setSorting([\n { id: typeColId, desc: false },\n { id: scrBookColId, desc: false },\n ]);\n } else {\n setSorting([{ id: scrBookColId, desc: false }]);\n }\n }, [grouping]);\n\n const table = useReactTable({\n data: scriptureResults,\n columns,\n state: {\n grouping,\n sorting,\n rowSelection,\n },\n onGroupingChange: setGrouping,\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n getExpandedRowModel: getExpandedRowModel(),\n getGroupedRowModel: getGroupedRowModel(),\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: getRowKey,\n autoResetExpanded: false,\n enableMultiRowSelection: false,\n enableSubRowSelection: false,\n });\n\n useEffect(() => {\n if (onRowSelected) {\n const selectedRows = table.getSelectedRowModel().rowsById;\n const keys = Object.keys(selectedRows);\n if (keys.length === 1) {\n const selectedRow = scriptureResults.find((row) => getRowKey(row) === keys[0]) || undefined;\n if (selectedRow) onRowSelected(selectedRow);\n }\n }\n }, [rowSelection, scriptureResults, onRowSelected, table]);\n\n // Define possible grouping options\n const scrBookGroupName = scriptureBookGroupName ?? defaultScrBookGroupName;\n const typeGroupName = typeColumnName ?? defaultTypeColumnName;\n\n const groupingOptions = [\n { label: 'No Grouping', value: [] },\n { label: `Group by ${scrBookGroupName}`, value: [scrBookColId] },\n { label: `Group by ${typeGroupName}`, value: [typeColId] },\n {\n label: `Group by ${scrBookGroupName} and ${typeGroupName}`,\n value: [scrBookColId, typeColId],\n },\n {\n label: `Group by ${typeGroupName} and ${scrBookGroupName}`,\n value: [typeColId, scrBookColId],\n },\n ];\n\n const handleSelectChange = (selectedGrouping: string) => {\n setGrouping(JSON.parse(selectedGrouping));\n };\n\n const handleRowClick = (row: Row, event: MouseEvent) => {\n if (!row.getIsGrouped() && !row.getIsSelected()) {\n row.getToggleSelectedHandler()(event);\n }\n };\n\n const getEvenOrOddBandingStyle = (row: Row, index: number) => {\n if (row.getIsGrouped()) return '';\n // UX has now said they don't think they want banding. I'm leaving in the code to\n // set even and odd styles, but there's nothing in the CSS to style them differently.\n // The \"even\" style used to also have pr-bg-neutral-300 (along with even) to create\n // a visual banding effect. That could be added back in if UX changes the decision.\n return cn('banded-row', index % 2 === 0 ? 'even' : 'odd');\n };\n\n const getIndent = (\n groupingState: GroupingState,\n row: Row,\n cell: Cell,\n ) => {\n if (groupingState?.length === 0 || row.depth < cell.column.getGroupedIndex()) return undefined;\n if (row.getIsGrouped()) {\n switch (row.depth) {\n case 1:\n return 'pr-ps-4';\n default:\n return undefined;\n }\n }\n switch (row.depth) {\n case 1:\n return 'pr-ps-8';\n case 2:\n return 'pr-ps-12';\n default:\n return undefined;\n }\n };\n\n return (\n
\n {!showColumnHeaders && (\n {\n handleSelectChange(value);\n }}\n >\n \n \n \n \n \n {groupingOptions.map((option) => (\n \n {option.label}\n \n ))}\n \n \n \n )}\n \n {showColumnHeaders && (\n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers\n .filter((h) => h.column.columnDef.header)\n .map((header) => (\n /* For sticky column headers to work, we probably need to change the default definition of the shadcn Table component. See https://github.com/shadcn-ui/ui/issues/1151 */\n \n {header.isPlaceholder ? undefined : (\n
\n {header.column.getCanGroup() ? (\n \n {header.column.getIsGrouped() ? `🛑` : `👊 `}\n \n ) : undefined}{' '}\n {flexRender(header.column.columnDef.header, header.getContext())}\n
\n )}\n
\n ))}\n
\n ))}\n
\n )}\n \n {table.getRowModel().rows.map((row, rowIndex) => {\n return (\n handleRowClick(row, event)}\n >\n {row.getVisibleCells().map((cell) => {\n if (\n cell.getIsPlaceholder() ||\n (cell.column.columnDef.enableGrouping &&\n !cell.getIsGrouped() &&\n (cell.column.columnDef.id !== typeColId || !showSourceColumn))\n )\n return undefined;\n return (\n \n {(() => {\n if (cell.getIsGrouped()) {\n return (\n \n {row.getIsExpanded() && }\n {!row.getIsExpanded() &&\n (direction === 'ltr' ? : )}{' '}\n {flexRender(cell.column.columnDef.cell, cell.getContext())} (\n {row.subRows.length})\n \n );\n }\n\n // if (cell.getIsAggregated()) {\n // flexRender(\n // cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,\n // cell.getContext(),\n // );\n // }\n\n return flexRender(cell.column.columnDef.cell, cell.getContext());\n })()}\n \n );\n })}\n \n );\n })}\n \n
\n
\n );\n}\n","import {\n getLocalizeKeyForScrollGroupId,\n LanguageStrings,\n ScrollGroupId,\n} from 'platform-bible-utils';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\n\nconst DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS = {\n [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø',\n [getLocalizeKeyForScrollGroupId(0)]: 'A',\n [getLocalizeKeyForScrollGroupId(1)]: 'B',\n [getLocalizeKeyForScrollGroupId(2)]: 'C',\n [getLocalizeKeyForScrollGroupId(3)]: 'D',\n [getLocalizeKeyForScrollGroupId(4)]: 'E',\n [getLocalizeKeyForScrollGroupId(5)]: 'F',\n [getLocalizeKeyForScrollGroupId(6)]: 'G',\n [getLocalizeKeyForScrollGroupId(7)]: 'H',\n [getLocalizeKeyForScrollGroupId(8)]: 'I',\n [getLocalizeKeyForScrollGroupId(9)]: 'J',\n [getLocalizeKeyForScrollGroupId(10)]: 'K',\n [getLocalizeKeyForScrollGroupId(11)]: 'L',\n [getLocalizeKeyForScrollGroupId(12)]: 'M',\n [getLocalizeKeyForScrollGroupId(13)]: 'N',\n [getLocalizeKeyForScrollGroupId(14)]: 'O',\n [getLocalizeKeyForScrollGroupId(15)]: 'P',\n [getLocalizeKeyForScrollGroupId(16)]: 'Q',\n [getLocalizeKeyForScrollGroupId(17)]: 'R',\n [getLocalizeKeyForScrollGroupId(18)]: 'S',\n [getLocalizeKeyForScrollGroupId(19)]: 'T',\n [getLocalizeKeyForScrollGroupId(20)]: 'U',\n [getLocalizeKeyForScrollGroupId(21)]: 'V',\n [getLocalizeKeyForScrollGroupId(22)]: 'W',\n [getLocalizeKeyForScrollGroupId(23)]: 'X',\n [getLocalizeKeyForScrollGroupId(24)]: 'Y',\n [getLocalizeKeyForScrollGroupId(25)]: 'Z',\n};\n\nexport type ScrollGroupSelectorProps = {\n /**\n * List of scroll group ids to show to the user. Either a {@link ScrollGroupId} or `undefined` for\n * no scroll group\n */\n availableScrollGroupIds: (ScrollGroupId | undefined)[];\n /** Currently selected scroll group id. `undefined` for no scroll group */\n scrollGroupId: ScrollGroupId | undefined;\n /** Callback function run when the user tries to change the scroll group id */\n onChangeScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void;\n /**\n * Localized strings to use for displaying scroll group ids. Must be an object whose keys are\n * `getLocalizeKeyForScrollGroupId(scrollGroupId)` for all scroll group ids (and `undefined` if\n * included) in {@link ScrollGroupSelectorProps.availableScrollGroupIds} and whose values are the\n * localized strings to use for those scroll group ids.\n *\n * Defaults to English localizations of English alphabet for scroll groups 0-25 (e.g. 0 is A) and\n * Ø for `undefined`. Will fill in any that are not provided with these English localizations.\n * Also, if any values match the keys, the English localization will be used. This is useful in\n * case you want to pass in a temporary version of the localized strings while your localized\n * strings load.\n *\n * @example\n *\n * ```typescript\n * const myScrollGroupIdLocalizedStrings = {\n * [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø',\n * [getLocalizeKeyForScrollGroupId(0)]: 'A',\n * [getLocalizeKeyForScrollGroupId(1)]: 'B',\n * [getLocalizeKeyForScrollGroupId(2)]: 'C',\n * [getLocalizeKeyForScrollGroupId(3)]: 'D',\n * [getLocalizeKeyForScrollGroupId(4)]: 'E',\n * };\n * ```\n *\n * @example\n *\n * ```tsx\n * const availableScrollGroupIds = [undefined, 0, 1, 2, 3, 4];\n *\n * const localizeKeys = getLocalizeKeysForScrollGroupIds();\n *\n * const [localizedStrings] = useLocalizedStrings(localizeKeys);\n *\n * ...\n *\n * \n * ```\n */\n localizedStrings?: LanguageStrings;\n};\n\n/** Selector component for choosing a scroll group */\nexport default function ScrollGroupSelector({\n availableScrollGroupIds,\n scrollGroupId,\n onChangeScrollGroupId,\n localizedStrings = {},\n}: ScrollGroupSelectorProps) {\n const localizedStringsDefaulted = {\n ...DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS,\n ...Object.fromEntries(\n Object.entries(localizedStrings).map(\n ([localizedStringKey, localizedStringValue]: [string, string]) => [\n localizedStringKey,\n localizedStringKey === localizedStringValue &&\n localizedStringKey in DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS\n ? DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS[localizedStringKey]\n : localizedStringValue,\n ],\n ),\n ),\n };\n return (\n \n onChangeScrollGroupId(\n newScrollGroupString === 'undefined' ? undefined : parseInt(newScrollGroupString, 10),\n )\n }\n >\n \n \n \n \n {availableScrollGroupIds.map((scrollGroupOptionId) => (\n \n {localizedStringsDefaulted[getLocalizeKeyForScrollGroupId(scrollGroupOptionId)]}\n \n ))}\n \n \n );\n}\n","import React from 'react';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Separator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n \n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import { PropsWithChildren } from 'react';\nimport { Separator } from '@/components/shadcn-ui/separator';\n\n/** Props for the SettingsList component, currently just children */\ntype SettingsListProps = PropsWithChildren;\n\n/**\n * SettingsList component is a wrapper for list items. Rendered with a formatted div\n *\n * @param children To populate the list with\n * @returns Formatted div encompassing the children\n */\nexport function SettingsList({ children }: SettingsListProps) {\n return
{children}
;\n}\n\n/** Props for SettingsListItem component */\ntype SettingsListItemProps = PropsWithChildren & {\n /** Primary text of the list item */\n primary: string;\n\n /** Optional text of the list item */\n secondary?: string | undefined;\n\n /** Optional boolean to display a message if the children aren't loaded yet. Defaults to false */\n isLoading?: boolean;\n\n /** Optional message to display if isLoading */\n loadingMessage?: string;\n};\n\n/**\n * SettingsListItem component is a common list item. Rendered with a formatted div\n *\n * @param primary Primary text of the list item\n * @param secondary Optional secondary text of the list item\n * @param isLoading Optional, to display a message if the action component isn't generated yet,\n * defaults to false\n * @param children The action component(s) to provide for this item\n * @param loadingMessage Optional, message to display if isLoading\n * @returns Formatted div encompassing the list item content\n */\nexport function SettingsListItem({\n primary,\n secondary,\n children,\n isLoading = false,\n loadingMessage,\n}: SettingsListItemProps) {\n return (\n
\n
\n

{primary}

\n

\n {secondary}\n

\n
\n\n {isLoading ? (\n

{loadingMessage}

\n ) : (\n
{children}
\n )}\n
\n );\n}\n\n/** Props for SettingsListHeader component */\ntype SettingsListHeaderProps = {\n /** The primary text of the list header */\n primary: string;\n\n /** Optional secondary text of the list header */\n secondary?: string | undefined;\n\n /** Optional boolean to include a separator underneath the secondary text. Defaults to false */\n includeSeparator?: boolean;\n};\n\n/**\n * SettingsListHeader component displays text above the list\n *\n * @param primary The primary text of the list header\n * @param secondary Optional secondary text of the list header\n * @param includeSeparator Optional boolean to include a separator underneath the secondary text.\n * Defaults to false\n * @returns Formatted div with list header content\n */\nexport function SettingsListHeader({\n primary,\n secondary,\n includeSeparator = false,\n}: SettingsListHeaderProps) {\n return (\n
\n
\n

{primary}

\n

{secondary}

\n
\n {includeSeparator ? : ''}\n
\n );\n}\n","import React from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Checkbox = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n \n \n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport default Checkbox;\n","import Checkbox from '@/components/shadcn-ui/checkbox';\nimport { Label } from '@/components/shadcn-ui/label';\n\nexport type ChecklistProps = {\n /** Optional string representing the id attribute of the Checklist */\n id?: string;\n /** Optional string representing CSS class name(s) for styling */\n className?: string;\n /** Array of strings representing the checkable items */\n listItems: string[];\n /** Array of strings representing the checked items */\n selectedListItems: string[];\n /**\n * Function that is called when a checkbox item is selected or deselected\n *\n * @param item The string description for this item\n * @param selected True if selected, false if not selected\n */\n handleSelectListItem: (item: string, selected: boolean) => void;\n\n /**\n * Optional function creates a label for a provided checkable item\n *\n * @param item The item for which a label is to be created\n * @returns A string representing the label text for the checkbox associated with that item\n */\n createLabel?: (item: string) => string;\n};\n\n/** Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array. */\nexport default function Checklist({\n id,\n className,\n listItems,\n selectedListItems,\n handleSelectListItem,\n createLabel,\n}: ChecklistProps) {\n return (\n
\n {listItems.map((item) => (\n
\n handleSelectListItem(item, value)}\n />\n \n
\n ))}\n
\n );\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function chainPropTypes(propType1, propType2) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n return function validate(...args) {\n return propType1(...args) || propType2(...args);\n };\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\nexport function isPlainObject(item) {\n if (typeof item !== 'object' || item === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(item);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in item) && !(Symbol.iterator in item);\n}\nfunction deepClone(source) {\n if (!isPlainObject(source)) {\n return source;\n }\n const output = {};\n Object.keys(source).forEach(key => {\n output[key] = deepClone(source[key]);\n });\n return output;\n}\nexport default function deepmerge(target, source, options = {\n clone: true\n}) {\n const output = options.clone ? _extends({}, target) : target;\n if (isPlainObject(target) && isPlainObject(source)) {\n Object.keys(source).forEach(key => {\n // Avoid prototype pollution\n if (key === '__proto__') {\n return;\n }\n if (isPlainObject(source[key]) && key in target && isPlainObject(target[key])) {\n // Since `output` is a clone of `target` and we have narrowed `target` in this block we can cast to the same type.\n output[key] = deepmerge(target[key], source[key], options);\n } else if (options.clone) {\n output[key] = isPlainObject(source[key]) ? deepClone(source[key]) : source[key];\n } else {\n output[key] = source[key];\n }\n });\n }\n return output;\n}","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import PropTypes from 'prop-types';\nimport chainPropTypes from '../chainPropTypes';\nfunction isClassComponent(elementType) {\n // elementType.prototype?.isReactComponent\n const {\n prototype = {}\n } = elementType;\n return Boolean(prototype.isReactComponent);\n}\nfunction acceptingRef(props, propName, componentName, location, propFullName) {\n const element = props[propName];\n const safePropName = propFullName || propName;\n if (element == null ||\n // When server-side rendering React doesn't warn either.\n // This is not an accurate check for SSR.\n // This is only in place for Emotion compat.\n // TODO: Revisit once https://github.com/facebook/react/issues/20047 is resolved.\n typeof window === 'undefined') {\n return null;\n }\n let warningHint;\n const elementType = element.type;\n /**\n * Blacklisting instead of whitelisting\n *\n * Blacklisting will miss some components, such as React.Fragment. Those will at least\n * trigger a warning in React.\n * We can't whitelist because there is no safe way to detect React.forwardRef\n * or class components. \"Safe\" means there's no public API.\n *\n */\n if (typeof elementType === 'function' && !isClassComponent(elementType)) {\n warningHint = 'Did you accidentally use a plain function component for an element instead?';\n }\n if (warningHint !== undefined) {\n return new Error(`Invalid ${location} \\`${safePropName}\\` supplied to \\`${componentName}\\`. ` + `Expected an element that can hold a ref. ${warningHint} ` + 'For more information see https://mui.com/r/caveat-with-refs-guide');\n }\n return null;\n}\nconst elementAcceptingRef = chainPropTypes(PropTypes.element, acceptingRef);\nelementAcceptingRef.isRequired = chainPropTypes(PropTypes.element.isRequired, acceptingRef);\nexport default elementAcceptingRef;","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n\nconst specialProperty = 'exact-prop: \\u200b';\nexport default function exactProp(propTypes) {\n if (process.env.NODE_ENV === 'production') {\n return propTypes;\n }\n return _extends({}, propTypes, {\n [specialProperty]: props => {\n const unsupportedProps = Object.keys(props).filter(prop => !propTypes.hasOwnProperty(prop));\n if (unsupportedProps.length > 0) {\n return new Error(`The following props are not supported: ${unsupportedProps.map(prop => `\\`${prop}\\``).join(', ')}. Please remove them.`);\n }\n return null;\n }\n });\n}","/**\n * WARNING: Don't import this directly.\n * Use `MuiError` from `@mui/internal-babel-macros/MuiError.macro` instead.\n * @param {number} code\n */\nexport default function formatMuiErrorMessage(code) {\n // Apply babel-plugin-transform-template-literals in loose mode\n // loose mode is safe if we're concatenating primitives\n // see https://babeljs.io/docs/en/babel-plugin-transform-template-literals#loose\n /* eslint-disable prefer-template */\n let url = 'https://mui.com/production-error/?code=' + code;\n for (let i = 1; i < arguments.length; i += 1) {\n // rest params over-transpile for this case\n // eslint-disable-next-line prefer-rest-params\n url += '&args[]=' + encodeURIComponent(arguments[i]);\n }\n return 'Minified MUI error #' + code + '; visit ' + url + ' for the full message.';\n /* eslint-enable prefer-template */\n}","/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=Symbol.for(\"react.element\"),c=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),e=Symbol.for(\"react.strict_mode\"),f=Symbol.for(\"react.profiler\"),g=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),k=Symbol.for(\"react.server_context\"),l=Symbol.for(\"react.forward_ref\"),m=Symbol.for(\"react.suspense\"),n=Symbol.for(\"react.suspense_list\"),p=Symbol.for(\"react.memo\"),q=Symbol.for(\"react.lazy\"),t=Symbol.for(\"react.offscreen\"),u;u=Symbol.for(\"react.module.reference\");\nfunction v(a){if(\"object\"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m;\nexports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p};\nexports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||\"object\"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v;\n","/**\n * @license React\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n case REACT_SUSPENSE_LIST_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_SERVER_CONTEXT_TYPE:\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n}\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar SuspenseList = REACT_SUSPENSE_LIST_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false;\nvar hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isConcurrentMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsConcurrentMode) {\n hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\nfunction isSuspenseList(object) {\n return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;\n}\n\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.SuspenseList = SuspenseList;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isSuspenseList = isSuspenseList;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","import { ForwardRef, Memo } from 'react-is';\n\n// Simplified polyfill for IE11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\nconst fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\nexport function getFunctionName(fn) {\n const match = `${fn}`.match(fnNameMatchRegex);\n const name = match && match[1];\n return name || '';\n}\nfunction getFunctionComponentName(Component, fallback = '') {\n return Component.displayName || Component.name || getFunctionName(Component) || fallback;\n}\nfunction getWrappedName(outerType, innerType, wrapperName) {\n const functionName = getFunctionComponentName(innerType);\n return outerType.displayName || (functionName !== '' ? `${wrapperName}(${functionName})` : wrapperName);\n}\n\n/**\n * cherry-pick from\n * https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js\n * originally forked from recompose/getDisplayName with added IE11 support\n */\nexport default function getDisplayName(Component) {\n if (Component == null) {\n return undefined;\n }\n if (typeof Component === 'string') {\n return Component;\n }\n if (typeof Component === 'function') {\n return getFunctionComponentName(Component, 'Component');\n }\n\n // TypeScript can't have components as objects but they exist in the form of `memo` or `Suspense`\n if (typeof Component === 'object') {\n switch (Component.$$typeof) {\n case ForwardRef:\n return getWrappedName(Component, Component.render, 'ForwardRef');\n case Memo:\n return getWrappedName(Component, Component.type, 'memo');\n default:\n return undefined;\n }\n }\n return undefined;\n}","export default function HTMLElementType(props, propName, componentName, location, propFullName) {\n if (process.env.NODE_ENV === 'production') {\n return null;\n }\n const propValue = props[propName];\n const safePropName = propFullName || propName;\n if (propValue == null) {\n return null;\n }\n if (propValue && propValue.nodeType !== 1) {\n return new Error(`Invalid ${location} \\`${safePropName}\\` supplied to \\`${componentName}\\`. ` + `Expected an HTMLElement.`);\n }\n return null;\n}","import PropTypes from 'prop-types';\nconst refType = PropTypes.oneOfType([PropTypes.func, PropTypes.object]);\nexport default refType;","import _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word in the sentence.\n// We only handle the first word.\nexport default function capitalize(string) {\n if (typeof string !== 'string') {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: \\`capitalize(string)\\` expects a string argument.` : _formatMuiErrorMessage(7));\n }\n return string.charAt(0).toUpperCase() + string.slice(1);\n}","/**\n * Safe chained function.\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n */\nexport default function createChainedFunction(...funcs) {\n return funcs.reduce((acc, func) => {\n if (func == null) {\n return acc;\n }\n return function chainedFunction(...args) {\n acc.apply(this, args);\n func.apply(this, args);\n };\n }, () => {});\n}","// Corresponds to 10 frames at 60 Hz.\n// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\nexport default function debounce(func, wait = 166) {\n let timeout;\n function debounced(...args) {\n const later = () => {\n // @ts-ignore\n func.apply(this, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n }\n debounced.clear = () => {\n clearTimeout(timeout);\n };\n return debounced;\n}","export default function deprecatedPropType(validator, reason) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n return (props, propName, componentName, location, propFullName) => {\n const componentNameSafe = componentName || '<>';\n const propFullNameSafe = propFullName || propName;\n if (typeof props[propName] !== 'undefined') {\n return new Error(`The ${location} \\`${propFullNameSafe}\\` of ` + `\\`${componentNameSafe}\\` is deprecated. ${reason}`);\n }\n return null;\n };\n}","import * as React from 'react';\nexport default function isMuiElement(element, muiNames) {\n var _muiName, _element$type;\n return /*#__PURE__*/React.isValidElement(element) && muiNames.indexOf( // For server components `muiName` is avaialble in element.type._payload.value.muiName\n // relevant info - https://github.com/facebook/react/blob/2807d781a08db8e9873687fccc25c0f12b4fb3d4/packages/react/src/ReactLazy.js#L45\n // eslint-disable-next-line no-underscore-dangle\n (_muiName = element.type.muiName) != null ? _muiName : (_element$type = element.type) == null || (_element$type = _element$type._payload) == null || (_element$type = _element$type.value) == null ? void 0 : _element$type.muiName) !== -1;\n}","export default function ownerDocument(node) {\n return node && node.ownerDocument || document;\n}","import ownerDocument from '../ownerDocument';\nexport default function ownerWindow(node) {\n const doc = ownerDocument(node);\n return doc.defaultView || window;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nexport default function requirePropFactory(componentNameInError, Component) {\n if (process.env.NODE_ENV === 'production') {\n return () => null;\n }\n\n // eslint-disable-next-line react/forbid-foreign-prop-types\n const prevPropTypes = Component ? _extends({}, Component.propTypes) : null;\n const requireProp = requiredProp => (props, propName, componentName, location, propFullName, ...args) => {\n const propFullNameSafe = propFullName || propName;\n const defaultTypeChecker = prevPropTypes == null ? void 0 : prevPropTypes[propFullNameSafe];\n if (defaultTypeChecker) {\n const typeCheckerResult = defaultTypeChecker(props, propName, componentName, location, propFullName, ...args);\n if (typeCheckerResult) {\n return typeCheckerResult;\n }\n }\n if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n return new Error(`The prop \\`${propFullNameSafe}\\` of ` + `\\`${componentNameInError}\\` can only be used together with the \\`${requiredProp}\\` prop.`);\n }\n return null;\n };\n return requireProp;\n}","/**\n * TODO v5: consider making it private\n *\n * passes {value} to {ref}\n *\n * WARNING: Be sure to only call this inside a callback that is passed as a ref.\n * Otherwise, make sure to cleanup the previous {ref} if it changes. See\n * https://github.com/mui/material-ui/issues/13539\n *\n * Useful if you want to expose the ref of an inner component to the public API\n * while still using it inside the component.\n * @param ref A ref callback or ref object. If anything falsy, this is a no-op.\n */\nexport default function setRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}","'use client';\n\nimport * as React from 'react';\n\n/**\n * A version of `React.useLayoutEffect` that does not show a warning when server-side rendering.\n * This is useful for effects that are only needed for client-side rendering but not for SSR.\n *\n * Before you use this hook, make sure to read https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85\n * and confirm it doesn't apply to your use-case.\n */\nconst useEnhancedEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nexport default useEnhancedEffect;","'use client';\n\nimport * as React from 'react';\nlet globalId = 0;\nfunction useGlobalId(idOverride) {\n const [defaultId, setDefaultId] = React.useState(idOverride);\n const id = idOverride || defaultId;\n React.useEffect(() => {\n if (defaultId == null) {\n // Fallback to this default id when possible.\n // Use the incrementing value for client-side rendering only.\n // We can't use it server-side.\n // If you want to use random values please consider the Birthday Problem: https://en.wikipedia.org/wiki/Birthday_problem\n globalId += 1;\n setDefaultId(`mui-${globalId}`);\n }\n }, [defaultId]);\n return id;\n}\n\n// downstream bundlers may remove unnecessary concatenation, but won't remove toString call -- Workaround for https://github.com/webpack/webpack/issues/14814\nconst maybeReactUseId = React['useId'.toString()];\n/**\n *\n * @example
\n * @param idOverride\n * @returns {string}\n */\nexport default function useId(idOverride) {\n if (maybeReactUseId !== undefined) {\n const reactId = maybeReactUseId();\n return idOverride != null ? idOverride : reactId;\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks -- `React.useId` is invariant at runtime.\n return useGlobalId(idOverride);\n}","export default function unsupportedProp(props, propName, componentName, location, propFullName) {\n if (process.env.NODE_ENV === 'production') {\n return null;\n }\n const propFullNameSafe = propFullName || propName;\n if (typeof props[propName] !== 'undefined') {\n return new Error(`The prop \\`${propFullNameSafe}\\` is not supported. Please remove it.`);\n }\n return null;\n}","'use client';\n\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\nimport * as React from 'react';\nexport default function useControlled({\n controlled,\n default: defaultProp,\n name,\n state = 'value'\n}) {\n // isControlled is ignored in the hook dependency lists as it should never change.\n const {\n current: isControlled\n } = React.useRef(controlled !== undefined);\n const [valueState, setValue] = React.useState(defaultProp);\n const value = isControlled ? controlled : valueState;\n if (process.env.NODE_ENV !== 'production') {\n React.useEffect(() => {\n if (isControlled !== (controlled !== undefined)) {\n console.error([`MUI: A component is changing the ${isControlled ? '' : 'un'}controlled ${state} state of ${name} to be ${isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${name} ` + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n }\n }, [state, name, controlled]);\n const {\n current: defaultValue\n } = React.useRef(defaultProp);\n React.useEffect(() => {\n if (!isControlled && defaultValue !== defaultProp) {\n console.error([`MUI: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` + `To suppress this warning opt to use a controlled ${name}.`].join('\\n'));\n }\n }, [JSON.stringify(defaultProp)]);\n }\n const setValueIfUncontrolled = React.useCallback(newValue => {\n if (!isControlled) {\n setValue(newValue);\n }\n }, []);\n return [value, setValueIfUncontrolled];\n}","'use client';\n\nimport * as React from 'react';\nimport useEnhancedEffect from '../useEnhancedEffect';\n\n/**\n * Inspired by https://github.com/facebook/react/issues/14099#issuecomment-440013892\n * See RFC in https://github.com/reactjs/rfcs/pull/220\n */\n\nfunction useEventCallback(fn) {\n const ref = React.useRef(fn);\n useEnhancedEffect(() => {\n ref.current = fn;\n });\n return React.useRef((...args) =>\n // @ts-expect-error hide `this`\n (0, ref.current)(...args)).current;\n}\nexport default useEventCallback;","'use client';\n\nimport * as React from 'react';\nimport setRef from '../setRef';\nexport default function useForkRef(...refs) {\n /**\n * This will create a new function if the refs passed to this hook change and are all defined.\n * This means react will call the old forkRef with `null` and the new forkRef\n * with the ref. Cleanup naturally emerges from this behavior.\n */\n return React.useMemo(() => {\n if (refs.every(ref => ref == null)) {\n return null;\n }\n return instance => {\n refs.forEach(ref => {\n setRef(ref, instance);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}","'use client';\n\nimport * as React from 'react';\nconst UNINITIALIZED = {};\n\n/**\n * A React.useRef() that is initialized lazily with a function. Note that it accepts an optional\n * initialization argument, so the initialization function doesn't need to be an inline closure.\n *\n * @usage\n * const ref = useLazyRef(sortColumns, columns)\n */\nexport default function useLazyRef(init, initArg) {\n const ref = React.useRef(UNINITIALIZED);\n if (ref.current === UNINITIALIZED) {\n ref.current = init(initArg);\n }\n return ref;\n}","'use client';\n\nimport * as React from 'react';\nconst EMPTY = [];\n\n/**\n * A React.useEffect equivalent that runs once, when the component is mounted.\n */\nexport default function useOnMount(fn) {\n /* eslint-disable react-hooks/exhaustive-deps */\n React.useEffect(fn, EMPTY);\n /* eslint-enable react-hooks/exhaustive-deps */\n}","'use client';\n\nimport useLazyRef from '../useLazyRef/useLazyRef';\nimport useOnMount from '../useOnMount/useOnMount';\nexport class Timeout {\n constructor() {\n this.currentId = null;\n this.clear = () => {\n if (this.currentId !== null) {\n clearTimeout(this.currentId);\n this.currentId = null;\n }\n };\n this.disposeEffect = () => {\n return this.clear;\n };\n }\n static create() {\n return new Timeout();\n }\n /**\n * Executes `fn` after `delay`, clearing any previously scheduled call.\n */\n start(delay, fn) {\n this.clear();\n this.currentId = setTimeout(() => {\n this.currentId = null;\n fn();\n }, delay);\n }\n}\nexport default function useTimeout() {\n const timeout = useLazyRef(Timeout.create).current;\n useOnMount(timeout.disposeEffect);\n return timeout;\n}","'use client';\n\n// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js\nimport * as React from 'react';\nimport { Timeout } from '../useTimeout/useTimeout';\nlet hadKeyboardEvent = true;\nlet hadFocusVisibleRecently = false;\nconst hadFocusVisibleRecentlyTimeout = new Timeout();\nconst inputTypesWhitelist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n};\n\n/**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} node\n * @returns {boolean}\n */\nfunction focusTriggersKeyboardModality(node) {\n const {\n type,\n tagName\n } = node;\n if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {\n return true;\n }\n if (tagName === 'TEXTAREA' && !node.readOnly) {\n return true;\n }\n if (node.isContentEditable) {\n return true;\n }\n return false;\n}\n\n/**\n * Keep track of our keyboard modality state with `hadKeyboardEvent`.\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * @param {KeyboardEvent} event\n */\nfunction handleKeyDown(event) {\n if (event.metaKey || event.altKey || event.ctrlKey) {\n return;\n }\n hadKeyboardEvent = true;\n}\n\n/**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n */\nfunction handlePointerDown() {\n hadKeyboardEvent = false;\n}\nfunction handleVisibilityChange() {\n if (this.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n }\n}\nfunction prepare(doc) {\n doc.addEventListener('keydown', handleKeyDown, true);\n doc.addEventListener('mousedown', handlePointerDown, true);\n doc.addEventListener('pointerdown', handlePointerDown, true);\n doc.addEventListener('touchstart', handlePointerDown, true);\n doc.addEventListener('visibilitychange', handleVisibilityChange, true);\n}\nexport function teardown(doc) {\n doc.removeEventListener('keydown', handleKeyDown, true);\n doc.removeEventListener('mousedown', handlePointerDown, true);\n doc.removeEventListener('pointerdown', handlePointerDown, true);\n doc.removeEventListener('touchstart', handlePointerDown, true);\n doc.removeEventListener('visibilitychange', handleVisibilityChange, true);\n}\nfunction isFocusVisible(event) {\n const {\n target\n } = event;\n try {\n return target.matches(':focus-visible');\n } catch (error) {\n // Browsers not implementing :focus-visible will throw a SyntaxError.\n // We use our own heuristic for those browsers.\n // Rethrow might be better if it's not the expected error but do we really\n // want to crash if focus-visible malfunctioned?\n }\n\n // No need for validFocusTarget check. The user does that by attaching it to\n // focusable events only.\n return hadKeyboardEvent || focusTriggersKeyboardModality(target);\n}\nexport default function useIsFocusVisible() {\n const ref = React.useCallback(node => {\n if (node != null) {\n prepare(node.ownerDocument);\n }\n }, []);\n const isFocusVisibleRef = React.useRef(false);\n\n /**\n * Should be called if a blur event is fired\n */\n function handleBlurVisible() {\n // checking against potential state variable does not suffice if we focus and blur synchronously.\n // React wouldn't have time to trigger a re-render so `focusVisible` would be stale.\n // Ideally we would adjust `isFocusVisible(event)` to look at `relatedTarget` for blur events.\n // This doesn't work in IE11 due to https://github.com/facebook/react/issues/3751\n // TODO: check again if React releases their internal changes to focus event handling (https://github.com/facebook/react/pull/19186).\n if (isFocusVisibleRef.current) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n hadFocusVisibleRecentlyTimeout.start(100, () => {\n hadFocusVisibleRecently = false;\n });\n isFocusVisibleRef.current = false;\n return true;\n }\n return false;\n }\n\n /**\n * Should be called if a blur event is fired\n */\n function handleFocusVisible(event) {\n if (isFocusVisible(event)) {\n isFocusVisibleRef.current = true;\n return true;\n }\n return false;\n }\n return {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref\n };\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\n/**\n * Add keys, values of `defaultProps` that does not exist in `props`\n * @param {object} defaultProps\n * @param {object} props\n * @returns {object} resolved props\n */\nexport default function resolveProps(defaultProps, props) {\n const output = _extends({}, props);\n Object.keys(defaultProps).forEach(propName => {\n if (propName.toString().match(/^(components|slots)$/)) {\n output[propName] = _extends({}, defaultProps[propName], output[propName]);\n } else if (propName.toString().match(/^(componentsProps|slotProps)$/)) {\n const defaultSlotProps = defaultProps[propName] || {};\n const slotProps = props[propName];\n output[propName] = {};\n if (!slotProps || !Object.keys(slotProps)) {\n // Reduce the iteration if the slot props is empty\n output[propName] = defaultSlotProps;\n } else if (!defaultSlotProps || !Object.keys(defaultSlotProps)) {\n // Reduce the iteration if the default slot props is empty\n output[propName] = slotProps;\n } else {\n output[propName] = _extends({}, slotProps);\n Object.keys(defaultSlotProps).forEach(slotPropName => {\n output[propName][slotPropName] = resolveProps(defaultSlotProps[slotPropName], slotProps[slotPropName]);\n });\n }\n } else if (output[propName] === undefined) {\n output[propName] = defaultProps[propName];\n }\n });\n return output;\n}","export default function composeClasses(slots, getUtilityClass, classes = undefined) {\n const output = {};\n Object.keys(slots).forEach(\n // `Object.keys(slots)` can't be wider than `T` because we infer `T` from `slots`.\n // @ts-expect-error https://github.com/microsoft/TypeScript/pull/12253#issuecomment-263132208\n slot => {\n output[slot] = slots[slot].reduce((acc, key) => {\n if (key) {\n const utilityClass = getUtilityClass(key);\n if (utilityClass !== '') {\n acc.push(utilityClass);\n }\n if (classes && classes[key]) {\n acc.push(classes[key]);\n }\n }\n return acc;\n }, []).join(' ');\n });\n return output;\n}","const defaultGenerator = componentName => componentName;\nconst createClassNameGenerator = () => {\n let generate = defaultGenerator;\n return {\n configure(generator) {\n generate = generator;\n },\n generate(componentName) {\n return generate(componentName);\n },\n reset() {\n generate = defaultGenerator;\n }\n };\n};\nconst ClassNameGenerator = createClassNameGenerator();\nexport default ClassNameGenerator;","import ClassNameGenerator from '../ClassNameGenerator';\nexport const globalStateClasses = {\n active: 'active',\n checked: 'checked',\n completed: 'completed',\n disabled: 'disabled',\n error: 'error',\n expanded: 'expanded',\n focused: 'focused',\n focusVisible: 'focusVisible',\n open: 'open',\n readOnly: 'readOnly',\n required: 'required',\n selected: 'selected'\n};\nexport default function generateUtilityClass(componentName, slot, globalStatePrefix = 'Mui') {\n const globalStateClass = globalStateClasses[slot];\n return globalStateClass ? `${globalStatePrefix}-${globalStateClass}` : `${ClassNameGenerator.generate(componentName)}-${slot}`;\n}\nexport function isGlobalState(slot) {\n return globalStateClasses[slot] !== undefined;\n}","import generateUtilityClass from '../generateUtilityClass';\nexport default function generateUtilityClasses(componentName, slots, globalStatePrefix = 'Mui') {\n const result = {};\n slots.forEach(slot => {\n result[slot] = generateUtilityClass(componentName, slot, globalStatePrefix);\n });\n return result;\n}","function clamp(val, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {\n return Math.max(min, Math.min(val, max));\n}\nexport default clamp;","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"values\", \"unit\", \"step\"];\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nexport const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'];\nconst sortBreakpointsValues = values => {\n const breakpointsAsArray = Object.keys(values).map(key => ({\n key,\n val: values[key]\n })) || [];\n // Sort in ascending order\n breakpointsAsArray.sort((breakpoint1, breakpoint2) => breakpoint1.val - breakpoint2.val);\n return breakpointsAsArray.reduce((acc, obj) => {\n return _extends({}, acc, {\n [obj.key]: obj.val\n });\n }, {});\n};\n\n// Keep in mind that @media is inclusive by the CSS specification.\nexport default function createBreakpoints(breakpoints) {\n const {\n // The breakpoint **start** at this value.\n // For instance with the first breakpoint xs: [xs, sm).\n values = {\n xs: 0,\n // phone\n sm: 600,\n // tablet\n md: 900,\n // small laptop\n lg: 1200,\n // desktop\n xl: 1536 // large screen\n },\n unit = 'px',\n step = 5\n } = breakpoints,\n other = _objectWithoutPropertiesLoose(breakpoints, _excluded);\n const sortedValues = sortBreakpointsValues(values);\n const keys = Object.keys(sortedValues);\n function up(key) {\n const value = typeof values[key] === 'number' ? values[key] : key;\n return `@media (min-width:${value}${unit})`;\n }\n function down(key) {\n const value = typeof values[key] === 'number' ? values[key] : key;\n return `@media (max-width:${value - step / 100}${unit})`;\n }\n function between(start, end) {\n const endIndex = keys.indexOf(end);\n return `@media (min-width:${typeof values[start] === 'number' ? values[start] : start}${unit}) and ` + `(max-width:${(endIndex !== -1 && typeof values[keys[endIndex]] === 'number' ? values[keys[endIndex]] : end) - step / 100}${unit})`;\n }\n function only(key) {\n if (keys.indexOf(key) + 1 < keys.length) {\n return between(key, keys[keys.indexOf(key) + 1]);\n }\n return up(key);\n }\n function not(key) {\n // handle first and last key separately, for better readability\n const keyIndex = keys.indexOf(key);\n if (keyIndex === 0) {\n return up(keys[1]);\n }\n if (keyIndex === keys.length - 1) {\n return down(keys[keyIndex]);\n }\n return between(key, keys[keys.indexOf(key) + 1]).replace('@media', '@media not all and');\n }\n return _extends({\n keys,\n values: sortedValues,\n up,\n down,\n between,\n only,\n not,\n unit\n }, other);\n}","const shape = {\n borderRadius: 4\n};\nexport default shape;","import PropTypes from 'prop-types';\nconst responsivePropType = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.object, PropTypes.array]) : {};\nexport default responsivePropType;","import deepmerge from '@mui/utils/deepmerge';\nfunction merge(acc, item) {\n if (!item) {\n return acc;\n }\n return deepmerge(acc, item, {\n clone: false // No need to clone deep, it's way faster.\n });\n}\nexport default merge;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport PropTypes from 'prop-types';\nimport deepmerge from '@mui/utils/deepmerge';\nimport merge from './merge';\n\n// The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\nexport const values = {\n xs: 0,\n // phone\n sm: 600,\n // tablet\n md: 900,\n // small laptop\n lg: 1200,\n // desktop\n xl: 1536 // large screen\n};\nconst defaultBreakpoints = {\n // Sorted ASC by size. That's important.\n // It can't be configured as it's used statically for propTypes.\n keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n up: key => `@media (min-width:${values[key]}px)`\n};\nexport function handleBreakpoints(props, propValue, styleFromPropValue) {\n const theme = props.theme || {};\n if (Array.isArray(propValue)) {\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n return propValue.reduce((acc, item, index) => {\n acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n return acc;\n }, {});\n }\n if (typeof propValue === 'object') {\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n return Object.keys(propValue).reduce((acc, breakpoint) => {\n // key is breakpoint\n if (Object.keys(themeBreakpoints.values || values).indexOf(breakpoint) !== -1) {\n const mediaKey = themeBreakpoints.up(breakpoint);\n acc[mediaKey] = styleFromPropValue(propValue[breakpoint], breakpoint);\n } else {\n const cssKey = breakpoint;\n acc[cssKey] = propValue[cssKey];\n }\n return acc;\n }, {});\n }\n const output = styleFromPropValue(propValue);\n return output;\n}\nfunction breakpoints(styleFunction) {\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const newStyleFunction = props => {\n const theme = props.theme || {};\n const base = styleFunction(props);\n const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n const extended = themeBreakpoints.keys.reduce((acc, key) => {\n if (props[key]) {\n acc = acc || {};\n acc[themeBreakpoints.up(key)] = styleFunction(_extends({\n theme\n }, props[key]));\n }\n return acc;\n }, null);\n return merge(base, extended);\n };\n newStyleFunction.propTypes = process.env.NODE_ENV !== 'production' ? _extends({}, styleFunction.propTypes, {\n xs: PropTypes.object,\n sm: PropTypes.object,\n md: PropTypes.object,\n lg: PropTypes.object,\n xl: PropTypes.object\n }) : {};\n newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl', ...styleFunction.filterProps];\n return newStyleFunction;\n}\nexport function createEmptyBreakpointObject(breakpointsInput = {}) {\n var _breakpointsInput$key;\n const breakpointsInOrder = (_breakpointsInput$key = breakpointsInput.keys) == null ? void 0 : _breakpointsInput$key.reduce((acc, key) => {\n const breakpointStyleKey = breakpointsInput.up(key);\n acc[breakpointStyleKey] = {};\n return acc;\n }, {});\n return breakpointsInOrder || {};\n}\nexport function removeUnusedBreakpoints(breakpointKeys, style) {\n return breakpointKeys.reduce((acc, key) => {\n const breakpointOutput = acc[key];\n const isBreakpointUnused = !breakpointOutput || Object.keys(breakpointOutput).length === 0;\n if (isBreakpointUnused) {\n delete acc[key];\n }\n return acc;\n }, style);\n}\nexport function mergeBreakpointsInOrder(breakpointsInput, ...styles) {\n const emptyBreakpoints = createEmptyBreakpointObject(breakpointsInput);\n const mergedOutput = [emptyBreakpoints, ...styles].reduce((prev, next) => deepmerge(prev, next), {});\n return removeUnusedBreakpoints(Object.keys(emptyBreakpoints), mergedOutput);\n}\n\n// compute base for responsive values; e.g.,\n// [1,2,3] => {xs: true, sm: true, md: true}\n// {xs: 1, sm: 2, md: 3} => {xs: true, sm: true, md: true}\nexport function computeBreakpointsBase(breakpointValues, themeBreakpoints) {\n // fixed value\n if (typeof breakpointValues !== 'object') {\n return {};\n }\n const base = {};\n const breakpointsKeys = Object.keys(themeBreakpoints);\n if (Array.isArray(breakpointValues)) {\n breakpointsKeys.forEach((breakpoint, i) => {\n if (i < breakpointValues.length) {\n base[breakpoint] = true;\n }\n });\n } else {\n breakpointsKeys.forEach(breakpoint => {\n if (breakpointValues[breakpoint] != null) {\n base[breakpoint] = true;\n }\n });\n }\n return base;\n}\nexport function resolveBreakpointValues({\n values: breakpointValues,\n breakpoints: themeBreakpoints,\n base: customBase\n}) {\n const base = customBase || computeBreakpointsBase(breakpointValues, themeBreakpoints);\n const keys = Object.keys(base);\n if (keys.length === 0) {\n return breakpointValues;\n }\n let previous;\n return keys.reduce((acc, breakpoint, i) => {\n if (Array.isArray(breakpointValues)) {\n acc[breakpoint] = breakpointValues[i] != null ? breakpointValues[i] : breakpointValues[previous];\n previous = i;\n } else if (typeof breakpointValues === 'object') {\n acc[breakpoint] = breakpointValues[breakpoint] != null ? breakpointValues[breakpoint] : breakpointValues[previous];\n previous = breakpoint;\n } else {\n acc[breakpoint] = breakpointValues;\n }\n return acc;\n }, {});\n}\nexport default breakpoints;","import capitalize from '@mui/utils/capitalize';\nimport responsivePropType from './responsivePropType';\nimport { handleBreakpoints } from './breakpoints';\nexport function getPath(obj, path, checkVars = true) {\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Check if CSS variables are used\n if (obj && obj.vars && checkVars) {\n const val = `vars.${path}`.split('.').reduce((acc, item) => acc && acc[item] ? acc[item] : null, obj);\n if (val != null) {\n return val;\n }\n }\n return path.split('.').reduce((acc, item) => {\n if (acc && acc[item] != null) {\n return acc[item];\n }\n return null;\n }, obj);\n}\nexport function getStyleValue(themeMapping, transform, propValueFinal, userValue = propValueFinal) {\n let value;\n if (typeof themeMapping === 'function') {\n value = themeMapping(propValueFinal);\n } else if (Array.isArray(themeMapping)) {\n value = themeMapping[propValueFinal] || userValue;\n } else {\n value = getPath(themeMapping, propValueFinal) || userValue;\n }\n if (transform) {\n value = transform(value, userValue, themeMapping);\n }\n return value;\n}\nfunction style(options) {\n const {\n prop,\n cssProperty = options.prop,\n themeKey,\n transform\n } = options;\n\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const fn = props => {\n if (props[prop] == null) {\n return null;\n }\n const propValue = props[prop];\n const theme = props.theme;\n const themeMapping = getPath(theme, themeKey) || {};\n const styleFromPropValue = propValueFinal => {\n let value = getStyleValue(themeMapping, transform, propValueFinal);\n if (propValueFinal === value && typeof propValueFinal === 'string') {\n // Haven't found value\n value = getStyleValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize(propValueFinal)}`, propValueFinal);\n }\n if (cssProperty === false) {\n return value;\n }\n return {\n [cssProperty]: value\n };\n };\n return handleBreakpoints(props, propValue, styleFromPropValue);\n };\n fn.propTypes = process.env.NODE_ENV !== 'production' ? {\n [prop]: responsivePropType\n } : {};\n fn.filterProps = [prop];\n return fn;\n}\nexport default style;","export default function memoize(fn) {\n const cache = {};\n return arg => {\n if (cache[arg] === undefined) {\n cache[arg] = fn(arg);\n }\n return cache[arg];\n };\n}","import responsivePropType from './responsivePropType';\nimport { handleBreakpoints } from './breakpoints';\nimport { getPath } from './style';\nimport merge from './merge';\nimport memoize from './memoize';\nconst properties = {\n m: 'margin',\n p: 'padding'\n};\nconst directions = {\n t: 'Top',\n r: 'Right',\n b: 'Bottom',\n l: 'Left',\n x: ['Left', 'Right'],\n y: ['Top', 'Bottom']\n};\nconst aliases = {\n marginX: 'mx',\n marginY: 'my',\n paddingX: 'px',\n paddingY: 'py'\n};\n\n// memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\nconst getCssProperties = memoize(prop => {\n // It's not a shorthand notation.\n if (prop.length > 2) {\n if (aliases[prop]) {\n prop = aliases[prop];\n } else {\n return [prop];\n }\n }\n const [a, b] = prop.split('');\n const property = properties[a];\n const direction = directions[b] || '';\n return Array.isArray(direction) ? direction.map(dir => property + dir) : [property + direction];\n});\nexport const marginKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'marginInline', 'marginInlineStart', 'marginInlineEnd', 'marginBlock', 'marginBlockStart', 'marginBlockEnd'];\nexport const paddingKeys = ['p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY', 'paddingInline', 'paddingInlineStart', 'paddingInlineEnd', 'paddingBlock', 'paddingBlockStart', 'paddingBlockEnd'];\nconst spacingKeys = [...marginKeys, ...paddingKeys];\nexport function createUnaryUnit(theme, themeKey, defaultValue, propName) {\n var _getPath;\n const themeSpacing = (_getPath = getPath(theme, themeKey, false)) != null ? _getPath : defaultValue;\n if (typeof themeSpacing === 'number') {\n return abs => {\n if (typeof abs === 'string') {\n return abs;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (typeof abs !== 'number') {\n console.error(`MUI: Expected ${propName} argument to be a number or a string, got ${abs}.`);\n }\n }\n return themeSpacing * abs;\n };\n }\n if (Array.isArray(themeSpacing)) {\n return abs => {\n if (typeof abs === 'string') {\n return abs;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!Number.isInteger(abs)) {\n console.error([`MUI: The \\`theme.${themeKey}\\` array type cannot be combined with non integer values.` + `You should either use an integer value that can be used as index, or define the \\`theme.${themeKey}\\` as a number.`].join('\\n'));\n } else if (abs > themeSpacing.length - 1) {\n console.error([`MUI: The value provided (${abs}) overflows.`, `The supported values are: ${JSON.stringify(themeSpacing)}.`, `${abs} > ${themeSpacing.length - 1}, you need to add the missing values.`].join('\\n'));\n }\n }\n return themeSpacing[abs];\n };\n }\n if (typeof themeSpacing === 'function') {\n return themeSpacing;\n }\n if (process.env.NODE_ENV !== 'production') {\n console.error([`MUI: The \\`theme.${themeKey}\\` value (${themeSpacing}) is invalid.`, 'It should be a number, an array or a function.'].join('\\n'));\n }\n return () => undefined;\n}\nexport function createUnarySpacing(theme) {\n return createUnaryUnit(theme, 'spacing', 8, 'spacing');\n}\nexport function getValue(transformer, propValue) {\n if (typeof propValue === 'string' || propValue == null) {\n return propValue;\n }\n const abs = Math.abs(propValue);\n const transformed = transformer(abs);\n if (propValue >= 0) {\n return transformed;\n }\n if (typeof transformed === 'number') {\n return -transformed;\n }\n return `-${transformed}`;\n}\nexport function getStyleFromPropValue(cssProperties, transformer) {\n return propValue => cssProperties.reduce((acc, cssProperty) => {\n acc[cssProperty] = getValue(transformer, propValue);\n return acc;\n }, {});\n}\nfunction resolveCssProperty(props, keys, prop, transformer) {\n // Using a hash computation over an array iteration could be faster, but with only 28 items,\n // it's doesn't worth the bundle size.\n if (keys.indexOf(prop) === -1) {\n return null;\n }\n const cssProperties = getCssProperties(prop);\n const styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n const propValue = props[prop];\n return handleBreakpoints(props, propValue, styleFromPropValue);\n}\nfunction style(props, keys) {\n const transformer = createUnarySpacing(props.theme);\n return Object.keys(props).map(prop => resolveCssProperty(props, keys, prop, transformer)).reduce(merge, {});\n}\nexport function margin(props) {\n return style(props, marginKeys);\n}\nmargin.propTypes = process.env.NODE_ENV !== 'production' ? marginKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\nmargin.filterProps = marginKeys;\nexport function padding(props) {\n return style(props, paddingKeys);\n}\npadding.propTypes = process.env.NODE_ENV !== 'production' ? paddingKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\npadding.filterProps = paddingKeys;\nfunction spacing(props) {\n return style(props, spacingKeys);\n}\nspacing.propTypes = process.env.NODE_ENV !== 'production' ? spacingKeys.reduce((obj, key) => {\n obj[key] = responsivePropType;\n return obj;\n}, {}) : {};\nspacing.filterProps = spacingKeys;\nexport default spacing;","import { createUnarySpacing } from '../spacing';\n\n// The different signatures imply different meaning for their arguments that can't be expressed structurally.\n// We express the difference with variable names.\n\nexport default function createSpacing(spacingInput = 8) {\n // Already transformed.\n if (spacingInput.mui) {\n return spacingInput;\n }\n\n // Material Design layouts are visually balanced. Most measurements align to an 8dp grid, which aligns both spacing and the overall layout.\n // Smaller components, such as icons, can align to a 4dp grid.\n // https://m2.material.io/design/layout/understanding-layout.html\n const transform = createUnarySpacing({\n spacing: spacingInput\n });\n const spacing = (...argsInput) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(argsInput.length <= 4)) {\n console.error(`MUI: Too many arguments provided, expected between 0 and 4, got ${argsInput.length}`);\n }\n }\n const args = argsInput.length === 0 ? [1] : argsInput;\n return args.map(argument => {\n const output = transform(argument);\n return typeof output === 'number' ? `${output}px` : output;\n }).join(' ');\n };\n spacing.mui = true;\n return spacing;\n}","import merge from './merge';\nfunction compose(...styles) {\n const handlers = styles.reduce((acc, style) => {\n style.filterProps.forEach(prop => {\n acc[prop] = style;\n });\n return acc;\n }, {});\n\n // false positive\n // eslint-disable-next-line react/function-component-definition\n const fn = props => {\n return Object.keys(props).reduce((acc, prop) => {\n if (handlers[prop]) {\n return merge(acc, handlers[prop](props));\n }\n return acc;\n }, {});\n };\n fn.propTypes = process.env.NODE_ENV !== 'production' ? styles.reduce((acc, style) => Object.assign(acc, style.propTypes), {}) : {};\n fn.filterProps = styles.reduce((acc, style) => acc.concat(style.filterProps), []);\n return fn;\n}\nexport default compose;","import responsivePropType from './responsivePropType';\nimport style from './style';\nimport compose from './compose';\nimport { createUnaryUnit, getValue } from './spacing';\nimport { handleBreakpoints } from './breakpoints';\nexport function borderTransform(value) {\n if (typeof value !== 'number') {\n return value;\n }\n return `${value}px solid`;\n}\nfunction createBorderStyle(prop, transform) {\n return style({\n prop,\n themeKey: 'borders',\n transform\n });\n}\nexport const border = createBorderStyle('border', borderTransform);\nexport const borderTop = createBorderStyle('borderTop', borderTransform);\nexport const borderRight = createBorderStyle('borderRight', borderTransform);\nexport const borderBottom = createBorderStyle('borderBottom', borderTransform);\nexport const borderLeft = createBorderStyle('borderLeft', borderTransform);\nexport const borderColor = createBorderStyle('borderColor');\nexport const borderTopColor = createBorderStyle('borderTopColor');\nexport const borderRightColor = createBorderStyle('borderRightColor');\nexport const borderBottomColor = createBorderStyle('borderBottomColor');\nexport const borderLeftColor = createBorderStyle('borderLeftColor');\nexport const outline = createBorderStyle('outline', borderTransform);\nexport const outlineColor = createBorderStyle('outlineColor');\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const borderRadius = props => {\n if (props.borderRadius !== undefined && props.borderRadius !== null) {\n const transformer = createUnaryUnit(props.theme, 'shape.borderRadius', 4, 'borderRadius');\n const styleFromPropValue = propValue => ({\n borderRadius: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.borderRadius, styleFromPropValue);\n }\n return null;\n};\nborderRadius.propTypes = process.env.NODE_ENV !== 'production' ? {\n borderRadius: responsivePropType\n} : {};\nborderRadius.filterProps = ['borderRadius'];\nconst borders = compose(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderTopColor, borderRightColor, borderBottomColor, borderLeftColor, borderRadius, outline, outlineColor);\nexport default borders;","import style from './style';\nimport compose from './compose';\nimport { createUnaryUnit, getValue } from './spacing';\nimport { handleBreakpoints } from './breakpoints';\nimport responsivePropType from './responsivePropType';\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const gap = props => {\n if (props.gap !== undefined && props.gap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap');\n const styleFromPropValue = propValue => ({\n gap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.gap, styleFromPropValue);\n }\n return null;\n};\ngap.propTypes = process.env.NODE_ENV !== 'production' ? {\n gap: responsivePropType\n} : {};\ngap.filterProps = ['gap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const columnGap = props => {\n if (props.columnGap !== undefined && props.columnGap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap');\n const styleFromPropValue = propValue => ({\n columnGap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.columnGap, styleFromPropValue);\n }\n return null;\n};\ncolumnGap.propTypes = process.env.NODE_ENV !== 'production' ? {\n columnGap: responsivePropType\n} : {};\ncolumnGap.filterProps = ['columnGap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nexport const rowGap = props => {\n if (props.rowGap !== undefined && props.rowGap !== null) {\n const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap');\n const styleFromPropValue = propValue => ({\n rowGap: getValue(transformer, propValue)\n });\n return handleBreakpoints(props, props.rowGap, styleFromPropValue);\n }\n return null;\n};\nrowGap.propTypes = process.env.NODE_ENV !== 'production' ? {\n rowGap: responsivePropType\n} : {};\nrowGap.filterProps = ['rowGap'];\nexport const gridColumn = style({\n prop: 'gridColumn'\n});\nexport const gridRow = style({\n prop: 'gridRow'\n});\nexport const gridAutoFlow = style({\n prop: 'gridAutoFlow'\n});\nexport const gridAutoColumns = style({\n prop: 'gridAutoColumns'\n});\nexport const gridAutoRows = style({\n prop: 'gridAutoRows'\n});\nexport const gridTemplateColumns = style({\n prop: 'gridTemplateColumns'\n});\nexport const gridTemplateRows = style({\n prop: 'gridTemplateRows'\n});\nexport const gridTemplateAreas = style({\n prop: 'gridTemplateAreas'\n});\nexport const gridArea = style({\n prop: 'gridArea'\n});\nconst grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\nexport default grid;","import style from './style';\nimport compose from './compose';\nexport function paletteTransform(value, userValue) {\n if (userValue === 'grey') {\n return userValue;\n }\n return value;\n}\nexport const color = style({\n prop: 'color',\n themeKey: 'palette',\n transform: paletteTransform\n});\nexport const bgcolor = style({\n prop: 'bgcolor',\n cssProperty: 'backgroundColor',\n themeKey: 'palette',\n transform: paletteTransform\n});\nexport const backgroundColor = style({\n prop: 'backgroundColor',\n themeKey: 'palette',\n transform: paletteTransform\n});\nconst palette = compose(color, bgcolor, backgroundColor);\nexport default palette;","import style from './style';\nimport compose from './compose';\nimport { handleBreakpoints, values as breakpointsValues } from './breakpoints';\nexport function sizingTransform(value) {\n return value <= 1 && value !== 0 ? `${value * 100}%` : value;\n}\nexport const width = style({\n prop: 'width',\n transform: sizingTransform\n});\nexport const maxWidth = props => {\n if (props.maxWidth !== undefined && props.maxWidth !== null) {\n const styleFromPropValue = propValue => {\n var _props$theme, _props$theme2;\n const breakpoint = ((_props$theme = props.theme) == null || (_props$theme = _props$theme.breakpoints) == null || (_props$theme = _props$theme.values) == null ? void 0 : _props$theme[propValue]) || breakpointsValues[propValue];\n if (!breakpoint) {\n return {\n maxWidth: sizingTransform(propValue)\n };\n }\n if (((_props$theme2 = props.theme) == null || (_props$theme2 = _props$theme2.breakpoints) == null ? void 0 : _props$theme2.unit) !== 'px') {\n return {\n maxWidth: `${breakpoint}${props.theme.breakpoints.unit}`\n };\n }\n return {\n maxWidth: breakpoint\n };\n };\n return handleBreakpoints(props, props.maxWidth, styleFromPropValue);\n }\n return null;\n};\nmaxWidth.filterProps = ['maxWidth'];\nexport const minWidth = style({\n prop: 'minWidth',\n transform: sizingTransform\n});\nexport const height = style({\n prop: 'height',\n transform: sizingTransform\n});\nexport const maxHeight = style({\n prop: 'maxHeight',\n transform: sizingTransform\n});\nexport const minHeight = style({\n prop: 'minHeight',\n transform: sizingTransform\n});\nexport const sizeWidth = style({\n prop: 'size',\n cssProperty: 'width',\n transform: sizingTransform\n});\nexport const sizeHeight = style({\n prop: 'size',\n cssProperty: 'height',\n transform: sizingTransform\n});\nexport const boxSizing = style({\n prop: 'boxSizing'\n});\nconst sizing = compose(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\nexport default sizing;","import { padding, margin } from '../spacing';\nimport { borderRadius, borderTransform } from '../borders';\nimport { gap, rowGap, columnGap } from '../cssGrid';\nimport { paletteTransform } from '../palette';\nimport { maxWidth, sizingTransform } from '../sizing';\nconst defaultSxConfig = {\n // borders\n border: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderTop: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderRight: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderBottom: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderLeft: {\n themeKey: 'borders',\n transform: borderTransform\n },\n borderColor: {\n themeKey: 'palette'\n },\n borderTopColor: {\n themeKey: 'palette'\n },\n borderRightColor: {\n themeKey: 'palette'\n },\n borderBottomColor: {\n themeKey: 'palette'\n },\n borderLeftColor: {\n themeKey: 'palette'\n },\n outline: {\n themeKey: 'borders',\n transform: borderTransform\n },\n outlineColor: {\n themeKey: 'palette'\n },\n borderRadius: {\n themeKey: 'shape.borderRadius',\n style: borderRadius\n },\n // palette\n color: {\n themeKey: 'palette',\n transform: paletteTransform\n },\n bgcolor: {\n themeKey: 'palette',\n cssProperty: 'backgroundColor',\n transform: paletteTransform\n },\n backgroundColor: {\n themeKey: 'palette',\n transform: paletteTransform\n },\n // spacing\n p: {\n style: padding\n },\n pt: {\n style: padding\n },\n pr: {\n style: padding\n },\n pb: {\n style: padding\n },\n pl: {\n style: padding\n },\n px: {\n style: padding\n },\n py: {\n style: padding\n },\n padding: {\n style: padding\n },\n paddingTop: {\n style: padding\n },\n paddingRight: {\n style: padding\n },\n paddingBottom: {\n style: padding\n },\n paddingLeft: {\n style: padding\n },\n paddingX: {\n style: padding\n },\n paddingY: {\n style: padding\n },\n paddingInline: {\n style: padding\n },\n paddingInlineStart: {\n style: padding\n },\n paddingInlineEnd: {\n style: padding\n },\n paddingBlock: {\n style: padding\n },\n paddingBlockStart: {\n style: padding\n },\n paddingBlockEnd: {\n style: padding\n },\n m: {\n style: margin\n },\n mt: {\n style: margin\n },\n mr: {\n style: margin\n },\n mb: {\n style: margin\n },\n ml: {\n style: margin\n },\n mx: {\n style: margin\n },\n my: {\n style: margin\n },\n margin: {\n style: margin\n },\n marginTop: {\n style: margin\n },\n marginRight: {\n style: margin\n },\n marginBottom: {\n style: margin\n },\n marginLeft: {\n style: margin\n },\n marginX: {\n style: margin\n },\n marginY: {\n style: margin\n },\n marginInline: {\n style: margin\n },\n marginInlineStart: {\n style: margin\n },\n marginInlineEnd: {\n style: margin\n },\n marginBlock: {\n style: margin\n },\n marginBlockStart: {\n style: margin\n },\n marginBlockEnd: {\n style: margin\n },\n // display\n displayPrint: {\n cssProperty: false,\n transform: value => ({\n '@media print': {\n display: value\n }\n })\n },\n display: {},\n overflow: {},\n textOverflow: {},\n visibility: {},\n whiteSpace: {},\n // flexbox\n flexBasis: {},\n flexDirection: {},\n flexWrap: {},\n justifyContent: {},\n alignItems: {},\n alignContent: {},\n order: {},\n flex: {},\n flexGrow: {},\n flexShrink: {},\n alignSelf: {},\n justifyItems: {},\n justifySelf: {},\n // grid\n gap: {\n style: gap\n },\n rowGap: {\n style: rowGap\n },\n columnGap: {\n style: columnGap\n },\n gridColumn: {},\n gridRow: {},\n gridAutoFlow: {},\n gridAutoColumns: {},\n gridAutoRows: {},\n gridTemplateColumns: {},\n gridTemplateRows: {},\n gridTemplateAreas: {},\n gridArea: {},\n // positions\n position: {},\n zIndex: {\n themeKey: 'zIndex'\n },\n top: {},\n right: {},\n bottom: {},\n left: {},\n // shadows\n boxShadow: {\n themeKey: 'shadows'\n },\n // sizing\n width: {\n transform: sizingTransform\n },\n maxWidth: {\n style: maxWidth\n },\n minWidth: {\n transform: sizingTransform\n },\n height: {\n transform: sizingTransform\n },\n maxHeight: {\n transform: sizingTransform\n },\n minHeight: {\n transform: sizingTransform\n },\n boxSizing: {},\n // typography\n fontFamily: {\n themeKey: 'typography'\n },\n fontSize: {\n themeKey: 'typography'\n },\n fontStyle: {\n themeKey: 'typography'\n },\n fontWeight: {\n themeKey: 'typography'\n },\n letterSpacing: {},\n textTransform: {},\n lineHeight: {},\n textAlign: {},\n typography: {\n cssProperty: false,\n themeKey: 'typography'\n }\n};\nexport default defaultSxConfig;","import capitalize from '@mui/utils/capitalize';\nimport merge from '../merge';\nimport { getPath, getStyleValue as getValue } from '../style';\nimport { handleBreakpoints, createEmptyBreakpointObject, removeUnusedBreakpoints } from '../breakpoints';\nimport defaultSxConfig from './defaultSxConfig';\nfunction objectsHaveSameKeys(...objects) {\n const allKeys = objects.reduce((keys, object) => keys.concat(Object.keys(object)), []);\n const union = new Set(allKeys);\n return objects.every(object => union.size === Object.keys(object).length);\n}\nfunction callIfFn(maybeFn, arg) {\n return typeof maybeFn === 'function' ? maybeFn(arg) : maybeFn;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function unstable_createStyleFunctionSx() {\n function getThemeValue(prop, val, theme, config) {\n const props = {\n [prop]: val,\n theme\n };\n const options = config[prop];\n if (!options) {\n return {\n [prop]: val\n };\n }\n const {\n cssProperty = prop,\n themeKey,\n transform,\n style\n } = options;\n if (val == null) {\n return null;\n }\n\n // TODO v6: remove, see https://github.com/mui/material-ui/pull/38123\n if (themeKey === 'typography' && val === 'inherit') {\n return {\n [prop]: val\n };\n }\n const themeMapping = getPath(theme, themeKey) || {};\n if (style) {\n return style(props);\n }\n const styleFromPropValue = propValueFinal => {\n let value = getValue(themeMapping, transform, propValueFinal);\n if (propValueFinal === value && typeof propValueFinal === 'string') {\n // Haven't found value\n value = getValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize(propValueFinal)}`, propValueFinal);\n }\n if (cssProperty === false) {\n return value;\n }\n return {\n [cssProperty]: value\n };\n };\n return handleBreakpoints(props, val, styleFromPropValue);\n }\n function styleFunctionSx(props) {\n var _theme$unstable_sxCon;\n const {\n sx,\n theme = {}\n } = props || {};\n if (!sx) {\n return null; // Emotion & styled-components will neglect null\n }\n const config = (_theme$unstable_sxCon = theme.unstable_sxConfig) != null ? _theme$unstable_sxCon : defaultSxConfig;\n\n /*\n * Receive `sxInput` as object or callback\n * and then recursively check keys & values to create media query object styles.\n * (the result will be used in `styled`)\n */\n function traverse(sxInput) {\n let sxObject = sxInput;\n if (typeof sxInput === 'function') {\n sxObject = sxInput(theme);\n } else if (typeof sxInput !== 'object') {\n // value\n return sxInput;\n }\n if (!sxObject) {\n return null;\n }\n const emptyBreakpoints = createEmptyBreakpointObject(theme.breakpoints);\n const breakpointsKeys = Object.keys(emptyBreakpoints);\n let css = emptyBreakpoints;\n Object.keys(sxObject).forEach(styleKey => {\n const value = callIfFn(sxObject[styleKey], theme);\n if (value !== null && value !== undefined) {\n if (typeof value === 'object') {\n if (config[styleKey]) {\n css = merge(css, getThemeValue(styleKey, value, theme, config));\n } else {\n const breakpointsValues = handleBreakpoints({\n theme\n }, value, x => ({\n [styleKey]: x\n }));\n if (objectsHaveSameKeys(breakpointsValues, value)) {\n css[styleKey] = styleFunctionSx({\n sx: value,\n theme\n });\n } else {\n css = merge(css, breakpointsValues);\n }\n }\n } else {\n css = merge(css, getThemeValue(styleKey, value, theme, config));\n }\n }\n });\n return removeUnusedBreakpoints(breakpointsKeys, css);\n }\n return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);\n }\n return styleFunctionSx;\n}\nconst styleFunctionSx = unstable_createStyleFunctionSx();\nstyleFunctionSx.filterProps = ['sx'];\nexport default styleFunctionSx;","/**\n * A universal utility to style components with multiple color modes. Always use it from the theme object.\n * It works with:\n * - [Basic theme](https://mui.com/material-ui/customization/dark-mode/)\n * - [CSS theme variables](https://mui.com/material-ui/experimental-api/css-theme-variables/overview/)\n * - Zero-runtime engine\n *\n * Tips: Use an array over object spread and place `theme.applyStyles()` last.\n *\n * ✅ [{ background: '#e5e5e5' }, theme.applyStyles('dark', { background: '#1c1c1c' })]\n *\n * 🚫 { background: '#e5e5e5', ...theme.applyStyles('dark', { background: '#1c1c1c' })}\n *\n * @example\n * 1. using with `styled`:\n * ```jsx\n * const Component = styled('div')(({ theme }) => [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ]);\n * ```\n *\n * @example\n * 2. using with `sx` prop:\n * ```jsx\n * [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ]}\n * />\n * ```\n *\n * @example\n * 3. theming a component:\n * ```jsx\n * extendTheme({\n * components: {\n * MuiButton: {\n * styleOverrides: {\n * root: ({ theme }) => [\n * { background: '#e5e5e5' },\n * theme.applyStyles('dark', {\n * background: '#1c1c1c',\n * color: '#fff',\n * }),\n * ],\n * },\n * }\n * }\n * })\n *```\n */\nexport default function applyStyles(key, styles) {\n // @ts-expect-error this is 'any' type\n const theme = this;\n if (theme.vars && typeof theme.getColorSchemeSelector === 'function') {\n // If CssVarsProvider is used as a provider,\n // returns '* :where([data-mui-color-scheme=\"light|dark\"]) &'\n const selector = theme.getColorSchemeSelector(key).replace(/(\\[[^\\]]+\\])/, '*:where($1)');\n return {\n [selector]: styles\n };\n }\n if (theme.palette.mode === key) {\n return styles;\n }\n return {};\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"breakpoints\", \"palette\", \"spacing\", \"shape\"];\nimport deepmerge from '@mui/utils/deepmerge';\nimport createBreakpoints from './createBreakpoints';\nimport shape from './shape';\nimport createSpacing from './createSpacing';\nimport styleFunctionSx from '../styleFunctionSx/styleFunctionSx';\nimport defaultSxConfig from '../styleFunctionSx/defaultSxConfig';\nimport applyStyles from './applyStyles';\nfunction createTheme(options = {}, ...args) {\n const {\n breakpoints: breakpointsInput = {},\n palette: paletteInput = {},\n spacing: spacingInput,\n shape: shapeInput = {}\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n const breakpoints = createBreakpoints(breakpointsInput);\n const spacing = createSpacing(spacingInput);\n let muiTheme = deepmerge({\n breakpoints,\n direction: 'ltr',\n components: {},\n // Inject component definitions.\n palette: _extends({\n mode: 'light'\n }, paletteInput),\n spacing,\n shape: _extends({}, shape, shapeInput)\n }, other);\n muiTheme.applyStyles = applyStyles;\n muiTheme = args.reduce((acc, argument) => deepmerge(acc, argument), muiTheme);\n muiTheme.unstable_sxConfig = _extends({}, defaultSxConfig, other == null ? void 0 : other.unstable_sxConfig);\n muiTheme.unstable_sx = function sx(props) {\n return styleFunctionSx({\n sx: props,\n theme: this\n });\n };\n return muiTheme;\n}\nexport default createTheme;","'use client';\n\nimport * as React from 'react';\nimport { ThemeContext } from '@mui/styled-engine';\nfunction isObjectEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction useTheme(defaultTheme = null) {\n const contextTheme = React.useContext(ThemeContext);\n return !contextTheme || isObjectEmpty(contextTheme) ? defaultTheme : contextTheme;\n}\nexport default useTheme;","'use client';\n\nimport createTheme from './createTheme';\nimport useThemeWithoutDefault from './useThemeWithoutDefault';\nexport const systemDefaultTheme = createTheme();\nfunction useTheme(defaultTheme = systemDefaultTheme) {\n return useThemeWithoutDefault(defaultTheme);\n}\nexport default useTheme;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"ownerState\"],\n _excluded2 = [\"variants\"],\n _excluded3 = [\"name\", \"slot\", \"skipVariantsResolver\", \"skipSx\", \"overridesResolver\"];\n/* eslint-disable no-underscore-dangle */\nimport styledEngineStyled, { internal_processStyles as processStyles } from '@mui/styled-engine';\nimport { isPlainObject } from '@mui/utils/deepmerge';\nimport capitalize from '@mui/utils/capitalize';\nimport getDisplayName from '@mui/utils/getDisplayName';\nimport createTheme from './createTheme';\nimport styleFunctionSx from './styleFunctionSx';\nfunction isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// https://github.com/emotion-js/emotion/blob/26ded6109fcd8ca9875cc2ce4564fee678a3f3c5/packages/styled/src/utils.js#L40\nfunction isStringTag(tag) {\n return typeof tag === 'string' &&\n // 96 is one less than the char code\n // for \"a\" so this is checking that\n // it's a lowercase character\n tag.charCodeAt(0) > 96;\n}\n\n// Update /system/styled/#api in case if this changes\nexport function shouldForwardProp(prop) {\n return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';\n}\nexport const systemDefaultTheme = createTheme();\nconst lowercaseFirstLetter = string => {\n if (!string) {\n return string;\n }\n return string.charAt(0).toLowerCase() + string.slice(1);\n};\nfunction resolveTheme({\n defaultTheme,\n theme,\n themeId\n}) {\n return isEmpty(theme) ? defaultTheme : theme[themeId] || theme;\n}\nfunction defaultOverridesResolver(slot) {\n if (!slot) {\n return null;\n }\n return (props, styles) => styles[slot];\n}\nfunction processStyleArg(callableStyle, _ref) {\n let {\n ownerState\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n const resolvedStylesArg = typeof callableStyle === 'function' ? callableStyle(_extends({\n ownerState\n }, props)) : callableStyle;\n if (Array.isArray(resolvedStylesArg)) {\n return resolvedStylesArg.flatMap(resolvedStyle => processStyleArg(resolvedStyle, _extends({\n ownerState\n }, props)));\n }\n if (!!resolvedStylesArg && typeof resolvedStylesArg === 'object' && Array.isArray(resolvedStylesArg.variants)) {\n const {\n variants = []\n } = resolvedStylesArg,\n otherStyles = _objectWithoutPropertiesLoose(resolvedStylesArg, _excluded2);\n let result = otherStyles;\n variants.forEach(variant => {\n let isMatch = true;\n if (typeof variant.props === 'function') {\n isMatch = variant.props(_extends({\n ownerState\n }, props, ownerState));\n } else {\n Object.keys(variant.props).forEach(key => {\n if ((ownerState == null ? void 0 : ownerState[key]) !== variant.props[key] && props[key] !== variant.props[key]) {\n isMatch = false;\n }\n });\n }\n if (isMatch) {\n if (!Array.isArray(result)) {\n result = [result];\n }\n result.push(typeof variant.style === 'function' ? variant.style(_extends({\n ownerState\n }, props, ownerState)) : variant.style);\n }\n });\n return result;\n }\n return resolvedStylesArg;\n}\nexport default function createStyled(input = {}) {\n const {\n themeId,\n defaultTheme = systemDefaultTheme,\n rootShouldForwardProp = shouldForwardProp,\n slotShouldForwardProp = shouldForwardProp\n } = input;\n const systemSx = props => {\n return styleFunctionSx(_extends({}, props, {\n theme: resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }))\n }));\n };\n systemSx.__mui_systemSx = true;\n return (tag, inputOptions = {}) => {\n // Filter out the `sx` style function from the previous styled component to prevent unnecessary styles generated by the composite components.\n processStyles(tag, styles => styles.filter(style => !(style != null && style.__mui_systemSx)));\n const {\n name: componentName,\n slot: componentSlot,\n skipVariantsResolver: inputSkipVariantsResolver,\n skipSx: inputSkipSx,\n // TODO v6: remove `lowercaseFirstLetter()` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot))\n } = inputOptions,\n options = _objectWithoutPropertiesLoose(inputOptions, _excluded3);\n\n // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.\n const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :\n // TODO v6: remove `Root` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n componentSlot && componentSlot !== 'Root' && componentSlot !== 'root' || false;\n const skipSx = inputSkipSx || false;\n let label;\n if (process.env.NODE_ENV !== 'production') {\n if (componentName) {\n // TODO v6: remove `lowercaseFirstLetter()` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n label = `${componentName}-${lowercaseFirstLetter(componentSlot || 'Root')}`;\n }\n }\n let shouldForwardPropOption = shouldForwardProp;\n\n // TODO v6: remove `Root` in the next major release\n // For more details: https://github.com/mui/material-ui/pull/37908\n if (componentSlot === 'Root' || componentSlot === 'root') {\n shouldForwardPropOption = rootShouldForwardProp;\n } else if (componentSlot) {\n // any other slot specified\n shouldForwardPropOption = slotShouldForwardProp;\n } else if (isStringTag(tag)) {\n // for string (html) tag, preserve the behavior in emotion & styled-components.\n shouldForwardPropOption = undefined;\n }\n const defaultStyledResolver = styledEngineStyled(tag, _extends({\n shouldForwardProp: shouldForwardPropOption,\n label\n }, options));\n const transformStyleArg = stylesArg => {\n // On the server Emotion doesn't use React.forwardRef for creating components, so the created\n // component stays as a function. This condition makes sure that we do not interpolate functions\n // which are basically components used as a selectors.\n if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || isPlainObject(stylesArg)) {\n return props => processStyleArg(stylesArg, _extends({}, props, {\n theme: resolveTheme({\n theme: props.theme,\n defaultTheme,\n themeId\n })\n }));\n }\n return stylesArg;\n };\n const muiStyledResolver = (styleArg, ...expressions) => {\n let transformedStyleArg = transformStyleArg(styleArg);\n const expressionsWithDefaultTheme = expressions ? expressions.map(transformStyleArg) : [];\n if (componentName && overridesResolver) {\n expressionsWithDefaultTheme.push(props => {\n const theme = resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }));\n if (!theme.components || !theme.components[componentName] || !theme.components[componentName].styleOverrides) {\n return null;\n }\n const styleOverrides = theme.components[componentName].styleOverrides;\n const resolvedStyleOverrides = {};\n // TODO: v7 remove iteration and use `resolveStyleArg(styleOverrides[slot])` directly\n Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => {\n resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, _extends({}, props, {\n theme\n }));\n });\n return overridesResolver(props, resolvedStyleOverrides);\n });\n }\n if (componentName && !skipVariantsResolver) {\n expressionsWithDefaultTheme.push(props => {\n var _theme$components;\n const theme = resolveTheme(_extends({}, props, {\n defaultTheme,\n themeId\n }));\n const themeVariants = theme == null || (_theme$components = theme.components) == null || (_theme$components = _theme$components[componentName]) == null ? void 0 : _theme$components.variants;\n return processStyleArg({\n variants: themeVariants\n }, _extends({}, props, {\n theme\n }));\n });\n }\n if (!skipSx) {\n expressionsWithDefaultTheme.push(systemSx);\n }\n const numOfCustomFnsApplied = expressionsWithDefaultTheme.length - expressions.length;\n if (Array.isArray(styleArg) && numOfCustomFnsApplied > 0) {\n const placeholders = new Array(numOfCustomFnsApplied).fill('');\n // If the type is array, than we need to add placeholders in the template for the overrides, variants and the sx styles.\n transformedStyleArg = [...styleArg, ...placeholders];\n transformedStyleArg.raw = [...styleArg.raw, ...placeholders];\n }\n const Component = defaultStyledResolver(transformedStyleArg, ...expressionsWithDefaultTheme);\n if (process.env.NODE_ENV !== 'production') {\n let displayName;\n if (componentName) {\n displayName = `${componentName}${capitalize(componentSlot || '')}`;\n }\n if (displayName === undefined) {\n displayName = `Styled(${getDisplayName(tag)})`;\n }\n Component.displayName = displayName;\n }\n if (tag.muiName) {\n Component.muiName = tag.muiName;\n }\n return Component;\n };\n if (defaultStyledResolver.withConfig) {\n muiStyledResolver.withConfig = defaultStyledResolver.withConfig;\n }\n return muiStyledResolver;\n };\n}","import resolveProps from '@mui/utils/resolveProps';\nexport default function getThemeProps(params) {\n const {\n theme,\n name,\n props\n } = params;\n if (!theme || !theme.components || !theme.components[name] || !theme.components[name].defaultProps) {\n return props;\n }\n return resolveProps(theme.components[name].defaultProps, props);\n}","'use client';\n\nimport getThemeProps from './getThemeProps';\nimport useTheme from '../useTheme';\nexport default function useThemeProps({\n props,\n name,\n defaultTheme,\n themeId\n}) {\n let theme = useTheme(defaultTheme);\n if (themeId) {\n theme = theme[themeId] || theme;\n }\n const mergedProps = getThemeProps({\n theme,\n name,\n props\n });\n return mergedProps;\n}","import _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\n/* eslint-disable @typescript-eslint/naming-convention */\nimport clamp from '@mui/utils/clamp';\n/**\n * Returns a number whose value is limited to the given range.\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clampWrapper(value, min = 0, max = 1) {\n if (process.env.NODE_ENV !== 'production') {\n if (value < min || value > max) {\n console.error(`MUI: The value provided ${value} is out of range [${min}, ${max}].`);\n }\n }\n return clamp(value, min, max);\n}\n\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\nexport function hexToRgb(color) {\n color = color.slice(1);\n const re = new RegExp(`.{1,${color.length >= 6 ? 2 : 1}}`, 'g');\n let colors = color.match(re);\n if (colors && colors[0].length === 1) {\n colors = colors.map(n => n + n);\n }\n return colors ? `rgb${colors.length === 4 ? 'a' : ''}(${colors.map((n, index) => {\n return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n }).join(', ')})` : '';\n}\nfunction intToHex(int) {\n const hex = int.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n}\n\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\nexport function decomposeColor(color) {\n // Idempotent\n if (color.type) {\n return color;\n }\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n const marker = color.indexOf('(');\n const type = color.substring(0, marker);\n if (['rgb', 'rgba', 'hsl', 'hsla', 'color'].indexOf(type) === -1) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: Unsupported \\`${color}\\` color.\nThe following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().` : _formatMuiErrorMessage(9, color));\n }\n let values = color.substring(marker + 1, color.length - 1);\n let colorSpace;\n if (type === 'color') {\n values = values.split(' ');\n colorSpace = values.shift();\n if (values.length === 4 && values[3].charAt(0) === '/') {\n values[3] = values[3].slice(1);\n }\n if (['srgb', 'display-p3', 'a98-rgb', 'prophoto-rgb', 'rec-2020'].indexOf(colorSpace) === -1) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: unsupported \\`${colorSpace}\\` color space.\nThe following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.` : _formatMuiErrorMessage(10, colorSpace));\n }\n } else {\n values = values.split(',');\n }\n values = values.map(value => parseFloat(value));\n return {\n type,\n values,\n colorSpace\n };\n}\n\n/**\n * Returns a channel created from the input color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {string} - The channel for the color, that can be used in rgba or hsla colors\n */\nexport const colorChannel = color => {\n const decomposedColor = decomposeColor(color);\n return decomposedColor.values.slice(0, 3).map((val, idx) => decomposedColor.type.indexOf('hsl') !== -1 && idx !== 0 ? `${val}%` : val).join(' ');\n};\nexport const private_safeColorChannel = (color, warning) => {\n try {\n return colorChannel(color);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n};\n\n/**\n * Converts a color object with type and values to a string.\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla', 'color'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\nexport function recomposeColor(color) {\n const {\n type,\n colorSpace\n } = color;\n let {\n values\n } = color;\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map((n, i) => i < 3 ? parseInt(n, 10) : n);\n } else if (type.indexOf('hsl') !== -1) {\n values[1] = `${values[1]}%`;\n values[2] = `${values[2]}%`;\n }\n if (type.indexOf('color') !== -1) {\n values = `${colorSpace} ${values.join(' ')}`;\n } else {\n values = `${values.join(', ')}`;\n }\n return `${type}(${values})`;\n}\n\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\nexport function rgbToHex(color) {\n // Idempotent\n if (color.indexOf('#') === 0) {\n return color;\n }\n const {\n values\n } = decomposeColor(color);\n return `#${values.map((n, i) => intToHex(i === 3 ? Math.round(255 * n) : n)).join('')}`;\n}\n\n/**\n * Converts a color from hsl format to rgb format.\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\nexport function hslToRgb(color) {\n color = decomposeColor(color);\n const {\n values\n } = color;\n const h = values[0];\n const s = values[1] / 100;\n const l = values[2] / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n let type = 'rgb';\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n if (color.type === 'hsla') {\n type += 'a';\n rgb.push(values[3]);\n }\n return recomposeColor({\n type,\n values: rgb\n });\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\nexport function getLuminance(color) {\n color = decomposeColor(color);\n let rgb = color.type === 'hsl' || color.type === 'hsla' ? decomposeColor(hslToRgb(color)).values : color.values;\n rgb = rgb.map(val => {\n if (color.type !== 'color') {\n val /= 255; // normalized\n }\n return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4;\n });\n\n // Truncate at 3 digits\n return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\nexport function getContrastRatio(foreground, background) {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/**\n * Sets the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} value - value to set the alpha channel to in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function alpha(color, value) {\n color = decomposeColor(color);\n value = clampWrapper(value);\n if (color.type === 'rgb' || color.type === 'hsl') {\n color.type += 'a';\n }\n if (color.type === 'color') {\n color.values[3] = `/${value}`;\n } else {\n color.values[3] = value;\n }\n return recomposeColor(color);\n}\nexport function private_safeAlpha(color, value, warning) {\n try {\n return alpha(color, value);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Darkens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function darken(color, coefficient) {\n color = decomposeColor(color);\n coefficient = clampWrapper(coefficient);\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] *= 1 - coefficient;\n } else if (color.type.indexOf('rgb') !== -1 || color.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] *= 1 - coefficient;\n }\n }\n return recomposeColor(color);\n}\nexport function private_safeDarken(color, coefficient, warning) {\n try {\n return darken(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Lightens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function lighten(color, coefficient) {\n color = decomposeColor(color);\n coefficient = clampWrapper(coefficient);\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] += (100 - color.values[2]) * coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] += (255 - color.values[i]) * coefficient;\n }\n } else if (color.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n color.values[i] += (1 - color.values[i]) * coefficient;\n }\n }\n return recomposeColor(color);\n}\nexport function private_safeLighten(color, coefficient, warning) {\n try {\n return lighten(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nexport function emphasize(color, coefficient = 0.15) {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\nexport function private_safeEmphasize(color, coefficient, warning) {\n try {\n return emphasize(color, coefficient);\n } catch (error) {\n if (warning && process.env.NODE_ENV !== 'production') {\n console.warn(warning);\n }\n return color;\n }\n}\n\n/**\n * Blend a transparent overlay color with a background color, resulting in a single\n * RGB color.\n * @param {string} background - CSS color\n * @param {string} overlay - CSS color\n * @param {number} opacity - Opacity multiplier in the range 0 - 1\n * @param {number} [gamma=1.0] - Gamma correction factor. For gamma-correct blending, 2.2 is usual.\n */\nexport function blend(background, overlay, opacity, gamma = 1.0) {\n const blendChannel = (b, o) => Math.round((b ** (1 / gamma) * (1 - opacity) + o ** (1 / gamma) * opacity) ** gamma);\n const backgroundColor = decomposeColor(background);\n const overlayColor = decomposeColor(overlay);\n const rgb = [blendChannel(backgroundColor.values[0], overlayColor.values[0]), blendChannel(backgroundColor.values[1], overlayColor.values[1]), blendChannel(backgroundColor.values[2], overlayColor.values[2])];\n return recomposeColor({\n type: 'rgb',\n values: rgb\n });\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nexport default function createMixins(breakpoints, mixins) {\n return _extends({\n toolbar: {\n minHeight: 56,\n [breakpoints.up('xs')]: {\n '@media (orientation: landscape)': {\n minHeight: 48\n }\n },\n [breakpoints.up('sm')]: {\n minHeight: 64\n }\n }\n }, mixins);\n}","const common = {\n black: '#000',\n white: '#fff'\n};\nexport default common;","const grey = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n A100: '#f5f5f5',\n A200: '#eeeeee',\n A400: '#bdbdbd',\n A700: '#616161'\n};\nexport default grey;","const purple = {\n 50: '#f3e5f5',\n 100: '#e1bee7',\n 200: '#ce93d8',\n 300: '#ba68c8',\n 400: '#ab47bc',\n 500: '#9c27b0',\n 600: '#8e24aa',\n 700: '#7b1fa2',\n 800: '#6a1b9a',\n 900: '#4a148c',\n A100: '#ea80fc',\n A200: '#e040fb',\n A400: '#d500f9',\n A700: '#aa00ff'\n};\nexport default purple;","const red = {\n 50: '#ffebee',\n 100: '#ffcdd2',\n 200: '#ef9a9a',\n 300: '#e57373',\n 400: '#ef5350',\n 500: '#f44336',\n 600: '#e53935',\n 700: '#d32f2f',\n 800: '#c62828',\n 900: '#b71c1c',\n A100: '#ff8a80',\n A200: '#ff5252',\n A400: '#ff1744',\n A700: '#d50000'\n};\nexport default red;","const orange = {\n 50: '#fff3e0',\n 100: '#ffe0b2',\n 200: '#ffcc80',\n 300: '#ffb74d',\n 400: '#ffa726',\n 500: '#ff9800',\n 600: '#fb8c00',\n 700: '#f57c00',\n 800: '#ef6c00',\n 900: '#e65100',\n A100: '#ffd180',\n A200: '#ffab40',\n A400: '#ff9100',\n A700: '#ff6d00'\n};\nexport default orange;","const blue = {\n 50: '#e3f2fd',\n 100: '#bbdefb',\n 200: '#90caf9',\n 300: '#64b5f6',\n 400: '#42a5f5',\n 500: '#2196f3',\n 600: '#1e88e5',\n 700: '#1976d2',\n 800: '#1565c0',\n 900: '#0d47a1',\n A100: '#82b1ff',\n A200: '#448aff',\n A400: '#2979ff',\n A700: '#2962ff'\n};\nexport default blue;","const lightBlue = {\n 50: '#e1f5fe',\n 100: '#b3e5fc',\n 200: '#81d4fa',\n 300: '#4fc3f7',\n 400: '#29b6f6',\n 500: '#03a9f4',\n 600: '#039be5',\n 700: '#0288d1',\n 800: '#0277bd',\n 900: '#01579b',\n A100: '#80d8ff',\n A200: '#40c4ff',\n A400: '#00b0ff',\n A700: '#0091ea'\n};\nexport default lightBlue;","const green = {\n 50: '#e8f5e9',\n 100: '#c8e6c9',\n 200: '#a5d6a7',\n 300: '#81c784',\n 400: '#66bb6a',\n 500: '#4caf50',\n 600: '#43a047',\n 700: '#388e3c',\n 800: '#2e7d32',\n 900: '#1b5e20',\n A100: '#b9f6ca',\n A200: '#69f0ae',\n A400: '#00e676',\n A700: '#00c853'\n};\nexport default green;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\nconst _excluded = [\"mode\", \"contrastThreshold\", \"tonalOffset\"];\nimport { deepmerge } from '@mui/utils';\nimport { darken, getContrastRatio, lighten } from '@mui/system';\nimport common from '../colors/common';\nimport grey from '../colors/grey';\nimport purple from '../colors/purple';\nimport red from '../colors/red';\nimport orange from '../colors/orange';\nimport blue from '../colors/blue';\nimport lightBlue from '../colors/lightBlue';\nimport green from '../colors/green';\nexport const light = {\n // The colors used to style the text.\n text: {\n // The most important text.\n primary: 'rgba(0, 0, 0, 0.87)',\n // Secondary text.\n secondary: 'rgba(0, 0, 0, 0.6)',\n // Disabled text have even lower visual prominence.\n disabled: 'rgba(0, 0, 0, 0.38)'\n },\n // The color used to divide different elements.\n divider: 'rgba(0, 0, 0, 0.12)',\n // The background colors used to style the surfaces.\n // Consistency between these values is important.\n background: {\n paper: common.white,\n default: common.white\n },\n // The colors used to style the action elements.\n action: {\n // The color of an active action like an icon button.\n active: 'rgba(0, 0, 0, 0.54)',\n // The color of an hovered action.\n hover: 'rgba(0, 0, 0, 0.04)',\n hoverOpacity: 0.04,\n // The color of a selected action.\n selected: 'rgba(0, 0, 0, 0.08)',\n selectedOpacity: 0.08,\n // The color of a disabled action.\n disabled: 'rgba(0, 0, 0, 0.26)',\n // The background color of a disabled action.\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n disabledOpacity: 0.38,\n focus: 'rgba(0, 0, 0, 0.12)',\n focusOpacity: 0.12,\n activatedOpacity: 0.12\n }\n};\nexport const dark = {\n text: {\n primary: common.white,\n secondary: 'rgba(255, 255, 255, 0.7)',\n disabled: 'rgba(255, 255, 255, 0.5)',\n icon: 'rgba(255, 255, 255, 0.5)'\n },\n divider: 'rgba(255, 255, 255, 0.12)',\n background: {\n paper: '#121212',\n default: '#121212'\n },\n action: {\n active: common.white,\n hover: 'rgba(255, 255, 255, 0.08)',\n hoverOpacity: 0.08,\n selected: 'rgba(255, 255, 255, 0.16)',\n selectedOpacity: 0.16,\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n disabledOpacity: 0.38,\n focus: 'rgba(255, 255, 255, 0.12)',\n focusOpacity: 0.12,\n activatedOpacity: 0.24\n }\n};\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n const tonalOffsetLight = tonalOffset.light || tonalOffset;\n const tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n if (!intent[direction]) {\n if (intent.hasOwnProperty(shade)) {\n intent[direction] = intent[shade];\n } else if (direction === 'light') {\n intent.light = lighten(intent.main, tonalOffsetLight);\n } else if (direction === 'dark') {\n intent.dark = darken(intent.main, tonalOffsetDark);\n }\n }\n}\nfunction getDefaultPrimary(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: blue[200],\n light: blue[50],\n dark: blue[400]\n };\n }\n return {\n main: blue[700],\n light: blue[400],\n dark: blue[800]\n };\n}\nfunction getDefaultSecondary(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: purple[200],\n light: purple[50],\n dark: purple[400]\n };\n }\n return {\n main: purple[500],\n light: purple[300],\n dark: purple[700]\n };\n}\nfunction getDefaultError(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: red[500],\n light: red[300],\n dark: red[700]\n };\n }\n return {\n main: red[700],\n light: red[400],\n dark: red[800]\n };\n}\nfunction getDefaultInfo(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: lightBlue[400],\n light: lightBlue[300],\n dark: lightBlue[700]\n };\n }\n return {\n main: lightBlue[700],\n light: lightBlue[500],\n dark: lightBlue[900]\n };\n}\nfunction getDefaultSuccess(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: green[400],\n light: green[300],\n dark: green[700]\n };\n }\n return {\n main: green[800],\n light: green[500],\n dark: green[900]\n };\n}\nfunction getDefaultWarning(mode = 'light') {\n if (mode === 'dark') {\n return {\n main: orange[400],\n light: orange[300],\n dark: orange[700]\n };\n }\n return {\n main: '#ed6c02',\n // closest to orange[800] that pass 3:1.\n light: orange[500],\n dark: orange[900]\n };\n}\nexport default function createPalette(palette) {\n const {\n mode = 'light',\n contrastThreshold = 3,\n tonalOffset = 0.2\n } = palette,\n other = _objectWithoutPropertiesLoose(palette, _excluded);\n const primary = palette.primary || getDefaultPrimary(mode);\n const secondary = palette.secondary || getDefaultSecondary(mode);\n const error = palette.error || getDefaultError(mode);\n const info = palette.info || getDefaultInfo(mode);\n const success = palette.success || getDefaultSuccess(mode);\n const warning = palette.warning || getDefaultWarning(mode);\n\n // Use the same logic as\n // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n function getContrastText(background) {\n const contrastText = getContrastRatio(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n if (process.env.NODE_ENV !== 'production') {\n const contrast = getContrastRatio(background, contrastText);\n if (contrast < 3) {\n console.error([`MUI: The contrast ratio of ${contrast}:1 for ${contrastText} on ${background}`, 'falls below the WCAG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n'));\n }\n }\n return contrastText;\n }\n const augmentColor = ({\n color,\n name,\n mainShade = 500,\n lightShade = 300,\n darkShade = 700\n }) => {\n color = _extends({}, color);\n if (!color.main && color[mainShade]) {\n color.main = color[mainShade];\n }\n if (!color.hasOwnProperty('main')) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: The color${name ? ` (${name})` : ''} provided to augmentColor(color) is invalid.\nThe color object needs to have a \\`main\\` property or a \\`${mainShade}\\` property.` : _formatMuiErrorMessage(11, name ? ` (${name})` : '', mainShade));\n }\n if (typeof color.main !== 'string') {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: The color${name ? ` (${name})` : ''} provided to augmentColor(color) is invalid.\n\\`color.main\\` should be a string, but \\`${JSON.stringify(color.main)}\\` was provided instead.\n\nDid you intend to use one of the following approaches?\n\nimport { green } from \"@mui/material/colors\";\n\nconst theme1 = createTheme({ palette: {\n primary: green,\n} });\n\nconst theme2 = createTheme({ palette: {\n primary: { main: green[500] },\n} });` : _formatMuiErrorMessage(12, name ? ` (${name})` : '', JSON.stringify(color.main)));\n }\n addLightOrDark(color, 'light', lightShade, tonalOffset);\n addLightOrDark(color, 'dark', darkShade, tonalOffset);\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n return color;\n };\n const modes = {\n dark,\n light\n };\n if (process.env.NODE_ENV !== 'production') {\n if (!modes[mode]) {\n console.error(`MUI: The palette mode \\`${mode}\\` is not supported.`);\n }\n }\n const paletteOutput = deepmerge(_extends({\n // A collection of common colors.\n common: _extends({}, common),\n // prevent mutable object.\n // The palette mode, can be light or dark.\n mode,\n // The colors used to represent primary interface elements for a user.\n primary: augmentColor({\n color: primary,\n name: 'primary'\n }),\n // The colors used to represent secondary interface elements for a user.\n secondary: augmentColor({\n color: secondary,\n name: 'secondary',\n mainShade: 'A400',\n lightShade: 'A200',\n darkShade: 'A700'\n }),\n // The colors used to represent interface elements that the user should be made aware of.\n error: augmentColor({\n color: error,\n name: 'error'\n }),\n // The colors used to represent potentially dangerous actions or important messages.\n warning: augmentColor({\n color: warning,\n name: 'warning'\n }),\n // The colors used to present information to the user that is neutral and not necessarily important.\n info: augmentColor({\n color: info,\n name: 'info'\n }),\n // The colors used to indicate the successful completion of an action that user triggered.\n success: augmentColor({\n color: success,\n name: 'success'\n }),\n // The grey colors.\n grey,\n // Used by `getContrastText()` to maximize the contrast between\n // the background and the text.\n contrastThreshold,\n // Takes a background color and returns the text color that maximizes the contrast.\n getContrastText,\n // Generate a rich color object.\n augmentColor,\n // Used by the functions below to shift a color's luminance by approximately\n // two indexes within its tonal palette.\n // E.g., shift from Red 500 to Red 300 or Red 700.\n tonalOffset\n }, modes[mode]), other);\n return paletteOutput;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"fontWeightBold\", \"htmlFontSize\", \"allVariants\", \"pxToRem\"];\nimport { deepmerge } from '@mui/utils';\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\nconst caseAllCaps = {\n textTransform: 'uppercase'\n};\nconst defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n\n/**\n * @see @link{https://m2.material.io/design/typography/the-type-system.html}\n * @see @link{https://m2.material.io/design/typography/understanding-typography.html}\n */\nexport default function createTypography(palette, typography) {\n const _ref = typeof typography === 'function' ? typography(palette) : typography,\n {\n fontFamily = defaultFontFamily,\n // The default font size of the Material Specification.\n fontSize = 14,\n // px\n fontWeightLight = 300,\n fontWeightRegular = 400,\n fontWeightMedium = 500,\n fontWeightBold = 700,\n // Tell MUI what's the font-size on the html element.\n // 16px is the default font-size used by browsers.\n htmlFontSize = 16,\n // Apply the CSS properties to all the variants.\n allVariants,\n pxToRem: pxToRem2\n } = _ref,\n other = _objectWithoutPropertiesLoose(_ref, _excluded);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof fontSize !== 'number') {\n console.error('MUI: `fontSize` is required to be a number.');\n }\n if (typeof htmlFontSize !== 'number') {\n console.error('MUI: `htmlFontSize` is required to be a number.');\n }\n }\n const coef = fontSize / 14;\n const pxToRem = pxToRem2 || (size => `${size / htmlFontSize * coef}rem`);\n const buildVariant = (fontWeight, size, lineHeight, letterSpacing, casing) => _extends({\n fontFamily,\n fontWeight,\n fontSize: pxToRem(size),\n // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n lineHeight\n }, fontFamily === defaultFontFamily ? {\n letterSpacing: `${round(letterSpacing / size)}em`\n } : {}, casing, allVariants);\n const variants = {\n h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps),\n // TODO v6: Remove handling of 'inherit' variant from the theme as it is already handled in Material UI's Typography component. Also, remember to remove the associated types.\n inherit: {\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n fontSize: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit'\n }\n };\n return deepmerge(_extends({\n htmlFontSize,\n pxToRem,\n fontFamily,\n fontSize,\n fontWeightLight,\n fontWeightRegular,\n fontWeightMedium,\n fontWeightBold\n }, variants), other, {\n clone: false // No need to clone deep\n });\n}","const shadowKeyUmbraOpacity = 0.2;\nconst shadowKeyPenumbraOpacity = 0.14;\nconst shadowAmbientShadowOpacity = 0.12;\nfunction createShadow(...px) {\n return [`${px[0]}px ${px[1]}px ${px[2]}px ${px[3]}px rgba(0,0,0,${shadowKeyUmbraOpacity})`, `${px[4]}px ${px[5]}px ${px[6]}px ${px[7]}px rgba(0,0,0,${shadowKeyPenumbraOpacity})`, `${px[8]}px ${px[9]}px ${px[10]}px ${px[11]}px rgba(0,0,0,${shadowAmbientShadowOpacity})`].join(',');\n}\n\n// Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\nconst shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\nexport default shadows;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"duration\", \"easing\", \"delay\"];\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nexport const easing = {\n // This is the most common easing curve.\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n // Objects enter the screen at full velocity from off-screen and\n // slowly decelerate to a resting point.\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n // The sharp curve is used by objects that may return to the screen at any time.\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n};\n\n// Follow https://m2.material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\nexport const duration = {\n shortest: 150,\n shorter: 200,\n short: 250,\n // most basic recommended timing\n standard: 300,\n // this is to be used in complex animations\n complex: 375,\n // recommended when something is entering screen\n enteringScreen: 225,\n // recommended when something is leaving screen\n leavingScreen: 195\n};\nfunction formatMs(milliseconds) {\n return `${Math.round(milliseconds)}ms`;\n}\nfunction getAutoHeightDuration(height) {\n if (!height) {\n return 0;\n }\n const constant = height / 36;\n\n // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10);\n}\nexport default function createTransitions(inputTransitions) {\n const mergedEasing = _extends({}, easing, inputTransitions.easing);\n const mergedDuration = _extends({}, duration, inputTransitions.duration);\n const create = (props = ['all'], options = {}) => {\n const {\n duration: durationOption = mergedDuration.standard,\n easing: easingOption = mergedEasing.easeInOut,\n delay = 0\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n if (process.env.NODE_ENV !== 'production') {\n const isString = value => typeof value === 'string';\n // IE11 support, replace with Number.isNaN\n // eslint-disable-next-line no-restricted-globals\n const isNumber = value => !isNaN(parseFloat(value));\n if (!isString(props) && !Array.isArray(props)) {\n console.error('MUI: Argument \"props\" must be a string or Array.');\n }\n if (!isNumber(durationOption) && !isString(durationOption)) {\n console.error(`MUI: Argument \"duration\" must be a number or a string but found ${durationOption}.`);\n }\n if (!isString(easingOption)) {\n console.error('MUI: Argument \"easing\" must be a string.');\n }\n if (!isNumber(delay) && !isString(delay)) {\n console.error('MUI: Argument \"delay\" must be a number or a string.');\n }\n if (typeof options !== 'object') {\n console.error(['MUI: Secong argument of transition.create must be an object.', \"Arguments should be either `create('prop1', options)` or `create(['prop1', 'prop2'], options)`\"].join('\\n'));\n }\n if (Object.keys(other).length !== 0) {\n console.error(`MUI: Unrecognized argument(s) [${Object.keys(other).join(',')}].`);\n }\n }\n return (Array.isArray(props) ? props : [props]).map(animatedProp => `${animatedProp} ${typeof durationOption === 'string' ? durationOption : formatMs(durationOption)} ${easingOption} ${typeof delay === 'string' ? delay : formatMs(delay)}`).join(',');\n };\n return _extends({\n getAutoHeightDuration,\n create\n }, inputTransitions, {\n easing: mergedEasing,\n duration: mergedDuration\n });\n}","// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nconst zIndex = {\n mobileStepper: 1000,\n fab: 1050,\n speedDial: 1050,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500\n};\nexport default zIndex;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _formatMuiErrorMessage from \"@mui/utils/formatMuiErrorMessage\";\nconst _excluded = [\"breakpoints\", \"mixins\", \"spacing\", \"palette\", \"transitions\", \"typography\", \"shape\"];\nimport { deepmerge } from '@mui/utils';\nimport { createTheme as systemCreateTheme, unstable_defaultSxConfig as defaultSxConfig, unstable_styleFunctionSx as styleFunctionSx } from '@mui/system';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nimport createMixins from './createMixins';\nimport createPalette from './createPalette';\nimport createTypography from './createTypography';\nimport shadows from './shadows';\nimport createTransitions from './createTransitions';\nimport zIndex from './zIndex';\nfunction createTheme(options = {}, ...args) {\n const {\n mixins: mixinsInput = {},\n palette: paletteInput = {},\n transitions: transitionsInput = {},\n typography: typographyInput = {}\n } = options,\n other = _objectWithoutPropertiesLoose(options, _excluded);\n if (options.vars) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? `MUI: \\`vars\\` is a private field used for CSS variables support.\nPlease use another name.` : _formatMuiErrorMessage(18));\n }\n const palette = createPalette(paletteInput);\n const systemTheme = systemCreateTheme(options);\n let muiTheme = deepmerge(systemTheme, {\n mixins: createMixins(systemTheme.breakpoints, mixinsInput),\n palette,\n // Don't use [...shadows] until you've verified its transpiled code is not invoking the iterator protocol.\n shadows: shadows.slice(),\n typography: createTypography(palette, typographyInput),\n transitions: createTransitions(transitionsInput),\n zIndex: _extends({}, zIndex)\n });\n muiTheme = deepmerge(muiTheme, other);\n muiTheme = args.reduce((acc, argument) => deepmerge(acc, argument), muiTheme);\n if (process.env.NODE_ENV !== 'production') {\n // TODO v6: Refactor to use globalStateClassesMapping from @mui/utils once `readOnly` state class is used in Rating component.\n const stateClasses = ['active', 'checked', 'completed', 'disabled', 'error', 'expanded', 'focused', 'focusVisible', 'required', 'selected'];\n const traverse = (node, component) => {\n let key;\n\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (key in node) {\n const child = node[key];\n if (stateClasses.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n if (process.env.NODE_ENV !== 'production') {\n const stateClass = generateUtilityClass('', key);\n console.error([`MUI: The \\`${component}\\` component increases ` + `the CSS specificity of the \\`${key}\\` internal state.`, 'You can not override it like this: ', JSON.stringify(node, null, 2), '', `Instead, you need to use the '&.${stateClass}' syntax:`, JSON.stringify({\n root: {\n [`&.${stateClass}`]: child\n }\n }, null, 2), '', 'https://mui.com/r/state-classes-guide'].join('\\n'));\n }\n // Remove the style to prevent global conflicts.\n node[key] = {};\n }\n }\n };\n Object.keys(muiTheme.components).forEach(component => {\n const styleOverrides = muiTheme.components[component].styleOverrides;\n if (styleOverrides && component.indexOf('Mui') === 0) {\n traverse(styleOverrides, component);\n }\n });\n }\n muiTheme.unstable_sxConfig = _extends({}, defaultSxConfig, other == null ? void 0 : other.unstable_sxConfig);\n muiTheme.unstable_sx = function sx(props) {\n return styleFunctionSx({\n sx: props,\n theme: this\n });\n };\n return muiTheme;\n}\nlet warnedOnce = false;\nexport function createMuiTheme(...args) {\n if (process.env.NODE_ENV !== 'production') {\n if (!warnedOnce) {\n warnedOnce = true;\n console.error(['MUI: the createMuiTheme function was renamed to createTheme.', '', \"You should use `import { createTheme } from '@mui/material/styles'`\"].join('\\n'));\n }\n }\n return createTheme(...args);\n}\nexport default createTheme;","'use client';\n\nimport createTheme from './createTheme';\nconst defaultTheme = createTheme();\nexport default defaultTheme;","export default '$$material';","'use client';\n\nimport { useThemeProps as systemUseThemeProps } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport default function useThemeProps({\n props,\n name\n}) {\n return systemUseThemeProps({\n props,\n name,\n defaultTheme,\n themeId: THEME_ID\n });\n}","'use client';\n\nimport { createStyled, shouldForwardProp } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport const rootShouldForwardProp = prop => shouldForwardProp(prop) && prop !== 'classes';\nexport const slotShouldForwardProp = shouldForwardProp;\nconst styled = createStyled({\n themeId: THEME_ID,\n defaultTheme,\n rootShouldForwardProp\n});\nexport default styled;","import generateUtilityClasses from '@mui/utils/generateUtilityClasses';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nexport function getSvgIconUtilityClass(slot) {\n return generateUtilityClass('MuiSvgIcon', slot);\n}\nconst svgIconClasses = generateUtilityClasses('MuiSvgIcon', ['root', 'colorPrimary', 'colorSecondary', 'colorAction', 'colorError', 'colorDisabled', 'fontSizeInherit', 'fontSizeSmall', 'fontSizeMedium', 'fontSizeLarge']);\nexport default svgIconClasses;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"children\", \"className\", \"color\", \"component\", \"fontSize\", \"htmlColor\", \"inheritViewBox\", \"titleAccess\", \"viewBox\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base/composeClasses';\nimport capitalize from '../utils/capitalize';\nimport useThemeProps from '../styles/useThemeProps';\nimport styled from '../styles/styled';\nimport { getSvgIconUtilityClass } from './svgIconClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst useUtilityClasses = ownerState => {\n const {\n color,\n fontSize,\n classes\n } = ownerState;\n const slots = {\n root: ['root', color !== 'inherit' && `color${capitalize(color)}`, `fontSize${capitalize(fontSize)}`]\n };\n return composeClasses(slots, getSvgIconUtilityClass, classes);\n};\nconst SvgIconRoot = styled('svg', {\n name: 'MuiSvgIcon',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.color !== 'inherit' && styles[`color${capitalize(ownerState.color)}`], styles[`fontSize${capitalize(ownerState.fontSize)}`]];\n }\n})(({\n theme,\n ownerState\n}) => {\n var _theme$transitions, _theme$transitions$cr, _theme$transitions2, _theme$typography, _theme$typography$pxT, _theme$typography2, _theme$typography2$px, _theme$typography3, _theme$typography3$px, _palette$ownerState$c, _palette, _palette2, _palette3;\n return {\n userSelect: 'none',\n width: '1em',\n height: '1em',\n display: 'inline-block',\n // the will define the property that has `currentColor`\n // e.g. heroicons uses fill=\"none\" and stroke=\"currentColor\"\n fill: ownerState.hasSvgAsChild ? undefined : 'currentColor',\n flexShrink: 0,\n transition: (_theme$transitions = theme.transitions) == null || (_theme$transitions$cr = _theme$transitions.create) == null ? void 0 : _theme$transitions$cr.call(_theme$transitions, 'fill', {\n duration: (_theme$transitions2 = theme.transitions) == null || (_theme$transitions2 = _theme$transitions2.duration) == null ? void 0 : _theme$transitions2.shorter\n }),\n fontSize: {\n inherit: 'inherit',\n small: ((_theme$typography = theme.typography) == null || (_theme$typography$pxT = _theme$typography.pxToRem) == null ? void 0 : _theme$typography$pxT.call(_theme$typography, 20)) || '1.25rem',\n medium: ((_theme$typography2 = theme.typography) == null || (_theme$typography2$px = _theme$typography2.pxToRem) == null ? void 0 : _theme$typography2$px.call(_theme$typography2, 24)) || '1.5rem',\n large: ((_theme$typography3 = theme.typography) == null || (_theme$typography3$px = _theme$typography3.pxToRem) == null ? void 0 : _theme$typography3$px.call(_theme$typography3, 35)) || '2.1875rem'\n }[ownerState.fontSize],\n // TODO v5 deprecate, v6 remove for sx\n color: (_palette$ownerState$c = (_palette = (theme.vars || theme).palette) == null || (_palette = _palette[ownerState.color]) == null ? void 0 : _palette.main) != null ? _palette$ownerState$c : {\n action: (_palette2 = (theme.vars || theme).palette) == null || (_palette2 = _palette2.action) == null ? void 0 : _palette2.active,\n disabled: (_palette3 = (theme.vars || theme).palette) == null || (_palette3 = _palette3.action) == null ? void 0 : _palette3.disabled,\n inherit: undefined\n }[ownerState.color]\n };\n});\nconst SvgIcon = /*#__PURE__*/React.forwardRef(function SvgIcon(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiSvgIcon'\n });\n const {\n children,\n className,\n color = 'inherit',\n component = 'svg',\n fontSize = 'medium',\n htmlColor,\n inheritViewBox = false,\n titleAccess,\n viewBox = '0 0 24 24'\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const hasSvgAsChild = /*#__PURE__*/React.isValidElement(children) && children.type === 'svg';\n const ownerState = _extends({}, props, {\n color,\n component,\n fontSize,\n instanceFontSize: inProps.fontSize,\n inheritViewBox,\n viewBox,\n hasSvgAsChild\n });\n const more = {};\n if (!inheritViewBox) {\n more.viewBox = viewBox;\n }\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/_jsxs(SvgIconRoot, _extends({\n as: component,\n className: clsx(classes.root, className),\n focusable: \"false\",\n color: htmlColor,\n \"aria-hidden\": titleAccess ? undefined : true,\n role: titleAccess ? 'img' : undefined,\n ref: ref\n }, more, other, hasSvgAsChild && children.props, {\n ownerState: ownerState,\n children: [hasSvgAsChild ? children.props.children : children, titleAccess ? /*#__PURE__*/_jsx(\"title\", {\n children: titleAccess\n }) : null]\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? SvgIcon.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * Node passed into the SVG element.\n */\n children: PropTypes.node,\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n /**\n * @ignore\n */\n className: PropTypes.string,\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).\n * You can use the `htmlColor` prop to apply a color attribute to the SVG element.\n * @default 'inherit'\n */\n color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['inherit', 'action', 'disabled', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n /**\n * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\n * @default 'medium'\n */\n fontSize: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['inherit', 'large', 'medium', 'small']), PropTypes.string]),\n /**\n * Applies a color attribute to the SVG element.\n */\n htmlColor: PropTypes.string,\n /**\n * If `true`, the root node will inherit the custom `component`'s viewBox and the `viewBox`\n * prop will be ignored.\n * Useful when you want to reference a custom `component` and have `SvgIcon` pass that\n * `component`'s viewBox to the root node.\n * @default false\n */\n inheritViewBox: PropTypes.bool,\n /**\n * The shape-rendering attribute. The behavior of the different options is described on the\n * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering).\n * If you are having issues with blurry icons you should investigate this prop.\n */\n shapeRendering: PropTypes.string,\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Provides a human-readable title for the element that contains it.\n * https://www.w3.org/TR/SVG-access/#Equivalent\n */\n titleAccess: PropTypes.string,\n /**\n * Allows you to redefine what the coordinates without units mean inside an SVG element.\n * For example, if the SVG element is 500 (width) by 200 (height),\n * and you pass viewBox=\"0 0 50 20\",\n * this means that the coordinates inside the SVG will go from the top left corner (0,0)\n * to bottom right (50,20) and each unit will be worth 10px.\n * @default '0 0 24 24'\n */\n viewBox: PropTypes.string\n} : void 0;\nSvgIcon.muiName = 'SvgIcon';\nexport default SvgIcon;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport SvgIcon from '../SvgIcon';\n\n/**\n * Private module reserved for @mui packages.\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default function createSvgIcon(path, displayName) {\n function Component(props, ref) {\n return /*#__PURE__*/_jsx(SvgIcon, _extends({\n \"data-testid\": `${displayName}Icon`,\n ref: ref\n }, props, {\n children: path\n }));\n }\n if (process.env.NODE_ENV !== 'production') {\n // Need to set `displayName` on the inner component for React.memo.\n // React prior to 16.14 ignores `displayName` on the wrapper.\n Component.displayName = `${displayName}Icon`;\n }\n Component.muiName = SvgIcon.muiName;\n return /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(Component));\n}","'use client';\n\nimport { unstable_ClassNameGenerator as ClassNameGenerator } from '@mui/base/ClassNameGenerator';\nexport { default as capitalize } from './capitalize';\nexport { default as createChainedFunction } from './createChainedFunction';\nexport { default as createSvgIcon } from './createSvgIcon';\nexport { default as debounce } from './debounce';\nexport { default as deprecatedPropType } from './deprecatedPropType';\nexport { default as isMuiElement } from './isMuiElement';\nexport { default as ownerDocument } from './ownerDocument';\nexport { default as ownerWindow } from './ownerWindow';\nexport { default as requirePropFactory } from './requirePropFactory';\nexport { default as setRef } from './setRef';\nexport { default as unstable_useEnhancedEffect } from './useEnhancedEffect';\nexport { default as unstable_useId } from './useId';\nexport { default as unsupportedProp } from './unsupportedProp';\nexport { default as useControlled } from './useControlled';\nexport { default as useEventCallback } from './useEventCallback';\nexport { default as useForkRef } from './useForkRef';\nexport { default as useIsFocusVisible } from './useIsFocusVisible';\n// TODO: remove this export once ClassNameGenerator is stable\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const unstable_ClassNameGenerator = {\n configure: generator => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(['MUI: `ClassNameGenerator` import from `@mui/material/utils` is outdated and might cause unexpected issues.', '', \"You should use `import { unstable_ClassNameGenerator } from '@mui/material/className'` instead\", '', 'The detail of the issue: https://github.com/mui/material-ui/issues/30011#issuecomment-1024993401', '', 'The updated documentation: https://mui.com/guides/classname-generator/'].join('\\n'));\n }\n ClassNameGenerator.configure(generator);\n }\n};","\"use strict\";\n'use client';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function () {\n return _utils.createSvgIcon;\n }\n});\nvar _utils = require(\"@mui/material/utils\");","\"use strict\";\n\"use client\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _default = exports.default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"m10 17 5-5-5-5z\"\n}), 'ArrowRight');","/**\n * Determines if a given element is a DOM element name (i.e. not a React component).\n */\nexport function isHostComponent(element) {\n return typeof element === 'string';\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport { isHostComponent } from './isHostComponent';\n\n/**\n * Type of the ownerState based on the type of an element it applies to.\n * This resolves to the provided OwnerState for React components and `undefined` for host components.\n * Falls back to `OwnerState | undefined` when the exact type can't be determined in development time.\n */\n\n/**\n * Appends the ownerState object to the props, merging with the existing one if necessary.\n *\n * @param elementType Type of the element that owns the `existingProps`. If the element is a DOM node or undefined, `ownerState` is not applied.\n * @param otherProps Props of the element.\n * @param ownerState\n */\nexport function appendOwnerState(elementType, otherProps, ownerState) {\n if (elementType === undefined || isHostComponent(elementType)) {\n return otherProps;\n }\n return _extends({}, otherProps, {\n ownerState: _extends({}, otherProps.ownerState, ownerState)\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst defaultContextValue = {\n disableDefaultClasses: false\n};\nconst ClassNameConfiguratorContext = /*#__PURE__*/React.createContext(defaultContextValue);\n/**\n * @ignore - internal hook.\n *\n * Wraps the `generateUtilityClass` function and controls how the classes are generated.\n * Currently it only affects whether the classes are applied or not.\n *\n * @returns Function to be called with the `generateUtilityClass` function specific to a component to generate the classes.\n */\nexport function useClassNamesOverride(generateUtilityClass) {\n const {\n disableDefaultClasses\n } = React.useContext(ClassNameConfiguratorContext);\n return slot => {\n if (disableDefaultClasses) {\n return '';\n }\n return generateUtilityClass(slot);\n };\n}\n\n/**\n * Allows to configure the components within to not apply any built-in classes.\n */\nexport function ClassNameConfigurator(props) {\n const {\n disableDefaultClasses,\n children\n } = props;\n const contextValue = React.useMemo(() => ({\n disableDefaultClasses: disableDefaultClasses != null ? disableDefaultClasses : false\n }), [disableDefaultClasses]);\n return /*#__PURE__*/_jsx(ClassNameConfiguratorContext.Provider, {\n value: contextValue,\n children: children\n });\n}","/**\n * Extracts event handlers from a given object.\n * A prop is considered an event handler if it is a function and its name starts with `on`.\n *\n * @param object An object to extract event handlers from.\n * @param excludeKeys An array of keys to exclude from the returned object.\n */\nexport function extractEventHandlers(object, excludeKeys = []) {\n if (object === undefined) {\n return {};\n }\n const result = {};\n Object.keys(object).filter(prop => prop.match(/^on[A-Z]/) && typeof object[prop] === 'function' && !excludeKeys.includes(prop)).forEach(prop => {\n result[prop] = object[prop];\n });\n return result;\n}","/**\n * If `componentProps` is a function, calls it with the provided `ownerState`.\n * Otherwise, just returns `componentProps`.\n */\nexport function resolveComponentProps(componentProps, ownerState, slotState) {\n if (typeof componentProps === 'function') {\n return componentProps(ownerState, slotState);\n }\n return componentProps;\n}","/**\n * Removes event handlers from the given object.\n * A field is considered an event handler if it is a function with a name beginning with `on`.\n *\n * @param object Object to remove event handlers from.\n * @returns Object with event handlers removed.\n */\nexport function omitEventHandlers(object) {\n if (object === undefined) {\n return {};\n }\n const result = {};\n Object.keys(object).filter(prop => !(prop.match(/^on[A-Z]/) && typeof object[prop] === 'function')).forEach(prop => {\n result[prop] = object[prop];\n });\n return result;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport clsx from 'clsx';\nimport { extractEventHandlers } from './extractEventHandlers';\nimport { omitEventHandlers } from './omitEventHandlers';\n/**\n * Merges the slot component internal props (usually coming from a hook)\n * with the externally provided ones.\n *\n * The merge order is (the latter overrides the former):\n * 1. The internal props (specified as a getter function to work with get*Props hook result)\n * 2. Additional props (specified internally on a Base UI component)\n * 3. External props specified on the owner component. These should only be used on a root slot.\n * 4. External props specified in the `slotProps.*` prop.\n * 5. The `className` prop - combined from all the above.\n * @param parameters\n * @returns\n */\nexport function mergeSlotProps(parameters) {\n const {\n getSlotProps,\n additionalProps,\n externalSlotProps,\n externalForwardedProps,\n className\n } = parameters;\n if (!getSlotProps) {\n // The simpler case - getSlotProps is not defined, so no internal event handlers are defined,\n // so we can simply merge all the props without having to worry about extracting event handlers.\n const joinedClasses = clsx(additionalProps == null ? void 0 : additionalProps.className, className, externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className);\n const mergedStyle = _extends({}, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);\n const props = _extends({}, additionalProps, externalForwardedProps, externalSlotProps);\n if (joinedClasses.length > 0) {\n props.className = joinedClasses;\n }\n if (Object.keys(mergedStyle).length > 0) {\n props.style = mergedStyle;\n }\n return {\n props,\n internalRef: undefined\n };\n }\n\n // In this case, getSlotProps is responsible for calling the external event handlers.\n // We don't need to include them in the merged props because of this.\n\n const eventHandlers = extractEventHandlers(_extends({}, externalForwardedProps, externalSlotProps));\n const componentsPropsWithoutEventHandlers = omitEventHandlers(externalSlotProps);\n const otherPropsWithoutEventHandlers = omitEventHandlers(externalForwardedProps);\n const internalSlotProps = getSlotProps(eventHandlers);\n\n // The order of classes is important here.\n // Emotion (that we use in libraries consuming Base UI) depends on this order\n // to properly override style. It requires the most important classes to be last\n // (see https://github.com/mui/material-ui/pull/33205) for the related discussion.\n const joinedClasses = clsx(internalSlotProps == null ? void 0 : internalSlotProps.className, additionalProps == null ? void 0 : additionalProps.className, className, externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className);\n const mergedStyle = _extends({}, internalSlotProps == null ? void 0 : internalSlotProps.style, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);\n const props = _extends({}, internalSlotProps, additionalProps, otherPropsWithoutEventHandlers, componentsPropsWithoutEventHandlers);\n if (joinedClasses.length > 0) {\n props.className = joinedClasses;\n }\n if (Object.keys(mergedStyle).length > 0) {\n props.style = mergedStyle;\n }\n return {\n props,\n internalRef: internalSlotProps.ref\n };\n}","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"elementType\", \"externalSlotProps\", \"ownerState\", \"skipResolvingSlotProps\"];\nimport { unstable_useForkRef as useForkRef } from '@mui/utils';\nimport { appendOwnerState } from './appendOwnerState';\nimport { mergeSlotProps } from './mergeSlotProps';\nimport { resolveComponentProps } from './resolveComponentProps';\n/**\n * @ignore - do not document.\n * Builds the props to be passed into the slot of an unstyled component.\n * It merges the internal props of the component with the ones supplied by the user, allowing to customize the behavior.\n * If the slot component is not a host component, it also merges in the `ownerState`.\n *\n * @param parameters.getSlotProps - A function that returns the props to be passed to the slot component.\n */\nexport function useSlotProps(parameters) {\n var _parameters$additiona;\n const {\n elementType,\n externalSlotProps,\n ownerState,\n skipResolvingSlotProps = false\n } = parameters,\n rest = _objectWithoutPropertiesLoose(parameters, _excluded);\n const resolvedComponentsProps = skipResolvingSlotProps ? {} : resolveComponentProps(externalSlotProps, ownerState);\n const {\n props: mergedProps,\n internalRef\n } = mergeSlotProps(_extends({}, rest, {\n externalSlotProps: resolvedComponentsProps\n }));\n const ref = useForkRef(internalRef, resolvedComponentsProps == null ? void 0 : resolvedComponentsProps.ref, (_parameters$additiona = parameters.additionalProps) == null ? void 0 : _parameters$additiona.ref);\n const props = appendOwnerState(elementType, _extends({}, mergedProps, {\n ref\n }), ownerState);\n return props;\n}","import { globalStateClasses } from '@mui/utils/generateUtilityClass';\nconst GLOBAL_CLASS_PREFIX = 'base';\nfunction buildStateClass(state) {\n return `${GLOBAL_CLASS_PREFIX}--${state}`;\n}\nfunction buildSlotClass(componentName, slot) {\n return `${GLOBAL_CLASS_PREFIX}-${componentName}-${slot}`;\n}\nexport function generateUtilityClass(componentName, slot) {\n const globalStateClass = globalStateClasses[slot];\n return globalStateClass ? buildStateClass(globalStateClass) : buildSlotClass(componentName, slot);\n}\nexport function isGlobalState(slot) {\n return globalStateClasses[slot] !== undefined;\n}","import { generateUtilityClass } from '../generateUtilityClass';\nexport function generateUtilityClasses(componentName, slots) {\n const result = {};\n slots.forEach(slot => {\n result[slot] = generateUtilityClass(componentName, slot);\n });\n return result;\n}","'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { exactProp, HTMLElementType, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useForkRef as useForkRef, unstable_setRef as setRef } from '@mui/utils';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction getContainer(container) {\n return typeof container === 'function' ? container() : container;\n}\n\n/**\n * Portals provide a first-class way to render children into a DOM node\n * that exists outside the DOM hierarchy of the parent component.\n *\n * Demos:\n *\n * - [Portal](https://mui.com/base-ui/react-portal/)\n *\n * API:\n *\n * - [Portal API](https://mui.com/base-ui/react-portal/components-api/#portal)\n */\nconst Portal = /*#__PURE__*/React.forwardRef(function Portal(props, forwardedRef) {\n const {\n children,\n container,\n disablePortal = false\n } = props;\n const [mountNode, setMountNode] = React.useState(null);\n // @ts-expect-error TODO upstream fix\n const handleRef = useForkRef( /*#__PURE__*/React.isValidElement(children) ? children.ref : null, forwardedRef);\n useEnhancedEffect(() => {\n if (!disablePortal) {\n setMountNode(getContainer(container) || document.body);\n }\n }, [container, disablePortal]);\n useEnhancedEffect(() => {\n if (mountNode && !disablePortal) {\n setRef(forwardedRef, mountNode);\n return () => {\n setRef(forwardedRef, null);\n };\n }\n return undefined;\n }, [forwardedRef, mountNode, disablePortal]);\n if (disablePortal) {\n if ( /*#__PURE__*/React.isValidElement(children)) {\n const newProps = {\n ref: handleRef\n };\n return /*#__PURE__*/React.cloneElement(children, newProps);\n }\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: children\n });\n }\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: mountNode ? /*#__PURE__*/ReactDOM.createPortal(children, mountNode) : mountNode\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Portal.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * The children to render into the `container`.\n */\n children: PropTypes.node,\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool\n} : void 0;\nif (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line\n Portal['propTypes' + ''] = exactProp(Portal.propTypes);\n}\nexport { Portal };","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { generateUtilityClass } from '../generateUtilityClass';\nimport { generateUtilityClasses } from '../generateUtilityClasses';\nconst COMPONENT_NAME = 'Popper';\nexport function getPopperUtilityClass(slot) {\n return generateUtilityClass(COMPONENT_NAME, slot);\n}\nexport const popperClasses = generateUtilityClasses(COMPONENT_NAME, ['root']);","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"anchorEl\", \"children\", \"direction\", \"disablePortal\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"slotProps\", \"slots\", \"TransitionProps\", \"ownerState\"],\n _excluded2 = [\"anchorEl\", \"children\", \"container\", \"direction\", \"disablePortal\", \"keepMounted\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"style\", \"transition\", \"slotProps\", \"slots\"];\nimport * as React from 'react';\nimport { chainPropTypes, HTMLElementType, refType, unstable_ownerDocument as ownerDocument, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useForkRef as useForkRef } from '@mui/utils';\nimport { createPopper } from '@popperjs/core';\nimport PropTypes from 'prop-types';\nimport { unstable_composeClasses as composeClasses } from '../composeClasses';\nimport { Portal } from '../Portal';\nimport { getPopperUtilityClass } from './popperClasses';\nimport { useSlotProps } from '../utils';\nimport { useClassNamesOverride } from '../utils/ClassNameConfigurator';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction flipPlacement(placement, direction) {\n if (direction === 'ltr') {\n return placement;\n }\n switch (placement) {\n case 'bottom-end':\n return 'bottom-start';\n case 'bottom-start':\n return 'bottom-end';\n case 'top-end':\n return 'top-start';\n case 'top-start':\n return 'top-end';\n default:\n return placement;\n }\n}\nfunction resolveAnchorEl(anchorEl) {\n return typeof anchorEl === 'function' ? anchorEl() : anchorEl;\n}\nfunction isHTMLElement(element) {\n return element.nodeType !== undefined;\n}\nfunction isVirtualElement(element) {\n return !isHTMLElement(element);\n}\nconst useUtilityClasses = () => {\n const slots = {\n root: ['root']\n };\n return composeClasses(slots, useClassNamesOverride(getPopperUtilityClass));\n};\nconst defaultPopperOptions = {};\nconst PopperTooltip = /*#__PURE__*/React.forwardRef(function PopperTooltip(props, forwardedRef) {\n var _slots$root;\n const {\n anchorEl,\n children,\n direction,\n disablePortal,\n modifiers,\n open,\n placement: initialPlacement,\n popperOptions,\n popperRef: popperRefProp,\n slotProps = {},\n slots = {},\n TransitionProps\n // @ts-ignore internal logic\n // prevent from spreading to DOM, it can come from the parent component e.g. Select.\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const tooltipRef = React.useRef(null);\n const ownRef = useForkRef(tooltipRef, forwardedRef);\n const popperRef = React.useRef(null);\n const handlePopperRef = useForkRef(popperRef, popperRefProp);\n const handlePopperRefRef = React.useRef(handlePopperRef);\n useEnhancedEffect(() => {\n handlePopperRefRef.current = handlePopperRef;\n }, [handlePopperRef]);\n React.useImperativeHandle(popperRefProp, () => popperRef.current, []);\n const rtlPlacement = flipPlacement(initialPlacement, direction);\n /**\n * placement initialized from prop but can change during lifetime if modifiers.flip.\n * modifiers.flip is essentially a flip for controlled/uncontrolled behavior\n */\n const [placement, setPlacement] = React.useState(rtlPlacement);\n const [resolvedAnchorElement, setResolvedAnchorElement] = React.useState(resolveAnchorEl(anchorEl));\n React.useEffect(() => {\n if (popperRef.current) {\n popperRef.current.forceUpdate();\n }\n });\n React.useEffect(() => {\n if (anchorEl) {\n setResolvedAnchorElement(resolveAnchorEl(anchorEl));\n }\n }, [anchorEl]);\n useEnhancedEffect(() => {\n if (!resolvedAnchorElement || !open) {\n return undefined;\n }\n const handlePopperUpdate = data => {\n setPlacement(data.placement);\n };\n if (process.env.NODE_ENV !== 'production') {\n if (resolvedAnchorElement && isHTMLElement(resolvedAnchorElement) && resolvedAnchorElement.nodeType === 1) {\n const box = resolvedAnchorElement.getBoundingClientRect();\n if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n }\n }\n }\n let popperModifiers = [{\n name: 'preventOverflow',\n options: {\n altBoundary: disablePortal\n }\n }, {\n name: 'flip',\n options: {\n altBoundary: disablePortal\n }\n }, {\n name: 'onUpdate',\n enabled: true,\n phase: 'afterWrite',\n fn: ({\n state\n }) => {\n handlePopperUpdate(state);\n }\n }];\n if (modifiers != null) {\n popperModifiers = popperModifiers.concat(modifiers);\n }\n if (popperOptions && popperOptions.modifiers != null) {\n popperModifiers = popperModifiers.concat(popperOptions.modifiers);\n }\n const popper = createPopper(resolvedAnchorElement, tooltipRef.current, _extends({\n placement: rtlPlacement\n }, popperOptions, {\n modifiers: popperModifiers\n }));\n handlePopperRefRef.current(popper);\n return () => {\n popper.destroy();\n handlePopperRefRef.current(null);\n };\n }, [resolvedAnchorElement, disablePortal, modifiers, open, popperOptions, rtlPlacement]);\n const childProps = {\n placement: placement\n };\n if (TransitionProps !== null) {\n childProps.TransitionProps = TransitionProps;\n }\n const classes = useUtilityClasses();\n const Root = (_slots$root = slots.root) != null ? _slots$root : 'div';\n const rootProps = useSlotProps({\n elementType: Root,\n externalSlotProps: slotProps.root,\n externalForwardedProps: other,\n additionalProps: {\n role: 'tooltip',\n ref: ownRef\n },\n ownerState: props,\n className: classes.root\n });\n return /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {\n children: typeof children === 'function' ? children(childProps) : children\n }));\n});\n\n/**\n * Poppers rely on the 3rd party library [Popper.js](https://popper.js.org/docs/v2/) for positioning.\n *\n * Demos:\n *\n * - [Popper](https://mui.com/base-ui/react-popper/)\n *\n * API:\n *\n * - [Popper API](https://mui.com/base-ui/react-popper/components-api/#popper)\n */\nconst Popper = /*#__PURE__*/React.forwardRef(function Popper(props, forwardedRef) {\n const {\n anchorEl,\n children,\n container: containerProp,\n direction = 'ltr',\n disablePortal = false,\n keepMounted = false,\n modifiers,\n open,\n placement = 'bottom',\n popperOptions = defaultPopperOptions,\n popperRef,\n style,\n transition = false,\n slotProps = {},\n slots = {}\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded2);\n const [exited, setExited] = React.useState(true);\n const handleEnter = () => {\n setExited(false);\n };\n const handleExited = () => {\n setExited(true);\n };\n if (!keepMounted && !open && (!transition || exited)) {\n return null;\n }\n\n // If the container prop is provided, use that\n // If the anchorEl prop is provided, use its parent body element as the container\n // If neither are provided let the Modal take care of choosing the container\n let container;\n if (containerProp) {\n container = containerProp;\n } else if (anchorEl) {\n const resolvedAnchorEl = resolveAnchorEl(anchorEl);\n container = resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) ? ownerDocument(resolvedAnchorEl).body : ownerDocument(null).body;\n }\n const display = !open && keepMounted && (!transition || exited) ? 'none' : undefined;\n const transitionProps = transition ? {\n in: open,\n onEnter: handleEnter,\n onExited: handleExited\n } : undefined;\n return /*#__PURE__*/_jsx(Portal, {\n disablePortal: disablePortal,\n container: container,\n children: /*#__PURE__*/_jsx(PopperTooltip, _extends({\n anchorEl: anchorEl,\n direction: direction,\n disablePortal: disablePortal,\n modifiers: modifiers,\n ref: forwardedRef,\n open: transition ? !exited : open,\n placement: placement,\n popperOptions: popperOptions,\n popperRef: popperRef,\n slotProps: slotProps,\n slots: slots\n }, other, {\n style: _extends({\n // Prevents scroll issue, waiting for Popper.js to add this style once initiated.\n position: 'fixed',\n // Fix Popper.js display issue\n top: 0,\n left: 0,\n display\n }, style),\n TransitionProps: transitionProps,\n children: children\n }))\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Popper.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/),\n * or a function that returns either.\n * It's used to set the position of the popper.\n * The return value will passed as the reference object of the Popper instance.\n */\n anchorEl: chainPropTypes(PropTypes.oneOfType([HTMLElementType, PropTypes.object, PropTypes.func]), props => {\n if (props.open) {\n const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);\n if (resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) && resolvedAnchorEl.nodeType === 1) {\n const box = resolvedAnchorEl.getBoundingClientRect();\n if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n }\n } else if (!resolvedAnchorEl || typeof resolvedAnchorEl.getBoundingClientRect !== 'function' || isVirtualElement(resolvedAnchorEl) && resolvedAnchorEl.contextElement != null && resolvedAnchorEl.contextElement.nodeType !== 1) {\n return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'It should be an HTML element instance or a virtualElement ', '(https://popper.js.org/docs/v2/virtual-elements/).'].join('\\n'));\n }\n }\n return null;\n }),\n /**\n * Popper render function or node.\n */\n children: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.node, PropTypes.func]),\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * Direction of the text.\n * @default 'ltr'\n */\n direction: PropTypes.oneOf(['ltr', 'rtl']),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool,\n /**\n * Always keep the children in the DOM.\n * This prop can be useful in SEO situation or\n * when you want to maximize the responsiveness of the Popper.\n * @default false\n */\n keepMounted: PropTypes.bool,\n /**\n * Popper.js is based on a \"plugin-like\" architecture,\n * most of its features are fully encapsulated \"modifiers\".\n *\n * A modifier is a function that is called each time Popper.js needs to\n * compute the position of the popper.\n * For this reason, modifiers should be very performant to avoid bottlenecks.\n * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/).\n */\n modifiers: PropTypes.arrayOf(PropTypes.shape({\n data: PropTypes.object,\n effect: PropTypes.func,\n enabled: PropTypes.bool,\n fn: PropTypes.func,\n name: PropTypes.any,\n options: PropTypes.object,\n phase: PropTypes.oneOf(['afterMain', 'afterRead', 'afterWrite', 'beforeMain', 'beforeRead', 'beforeWrite', 'main', 'read', 'write']),\n requires: PropTypes.arrayOf(PropTypes.string),\n requiresIfExists: PropTypes.arrayOf(PropTypes.string)\n })),\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool.isRequired,\n /**\n * Popper placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance.\n * @default {}\n */\n popperOptions: PropTypes.shape({\n modifiers: PropTypes.array,\n onFirstUpdate: PropTypes.func,\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n strategy: PropTypes.oneOf(['absolute', 'fixed'])\n }),\n /**\n * A ref that points to the used popper instance.\n */\n popperRef: refType,\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n slotProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n slots: PropTypes.shape({\n root: PropTypes.elementType\n }),\n /**\n * Help supporting a react-transition-group/Transition component.\n * @default false\n */\n transition: PropTypes.bool\n} : void 0;\nexport { Popper };","'use client';\n\nimport * as React from 'react';\nimport { useTheme as useThemeSystem } from '@mui/system';\nimport defaultTheme from './defaultTheme';\nimport THEME_ID from './identifier';\nexport default function useTheme() {\n const theme = useThemeSystem(defaultTheme);\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useDebugValue(theme);\n }\n return theme[THEME_ID] || theme;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default {\n disabled: false\n};","import PropTypes from 'prop-types';\nexport var timeoutsShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.shape({\n enter: PropTypes.number,\n exit: PropTypes.number,\n appear: PropTypes.number\n}).isRequired]) : null;\nexport var classNamesShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.string, PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string,\n active: PropTypes.string\n}), PropTypes.shape({\n enter: PropTypes.string,\n enterDone: PropTypes.string,\n enterActive: PropTypes.string,\n exit: PropTypes.string,\n exitDone: PropTypes.string,\n exitActive: PropTypes.string\n})]) : null;","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * \n * {state => (\n * \n * )}\n * \n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","export const reflow = node => node.scrollTop;\nexport function getTransitionProps(props, options) {\n var _style$transitionDura, _style$transitionTimi;\n const {\n timeout,\n easing,\n style = {}\n } = props;\n return {\n duration: (_style$transitionDura = style.transitionDuration) != null ? _style$transitionDura : typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n easing: (_style$transitionTimi = style.transitionTimingFunction) != null ? _style$transitionTimi : typeof easing === 'object' ? easing[options.mode] : easing,\n delay: style.transitionDelay\n };\n}","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"addEndListener\", \"appear\", \"children\", \"easing\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"timeout\", \"TransitionComponent\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { elementAcceptingRef, unstable_useTimeout as useTimeout } from '@mui/utils';\nimport { Transition } from 'react-transition-group';\nimport useTheme from '../styles/useTheme';\nimport { getTransitionProps, reflow } from '../transitions/utils';\nimport useForkRef from '../utils/useForkRef';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction getScale(value) {\n return `scale(${value}, ${value ** 2})`;\n}\nconst styles = {\n entering: {\n opacity: 1,\n transform: getScale(1)\n },\n entered: {\n opacity: 1,\n transform: 'none'\n }\n};\n\n/*\n TODO v6: remove\n Conditionally apply a workaround for the CSS transition bug in Safari 15.4 / WebKit browsers.\n */\nconst isWebKit154 = typeof navigator !== 'undefined' && /^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent) && /(os |version\\/)15(.|_)4/i.test(navigator.userAgent);\n\n/**\n * The Grow transition is used by the [Tooltip](/material-ui/react-tooltip/) and\n * [Popover](/material-ui/react-popover/) components.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\nconst Grow = /*#__PURE__*/React.forwardRef(function Grow(props, ref) {\n const {\n addEndListener,\n appear = true,\n children,\n easing,\n in: inProp,\n onEnter,\n onEntered,\n onEntering,\n onExit,\n onExited,\n onExiting,\n style,\n timeout = 'auto',\n // eslint-disable-next-line react/prop-types\n TransitionComponent = Transition\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const timer = useTimeout();\n const autoTimeout = React.useRef();\n const theme = useTheme();\n const nodeRef = React.useRef(null);\n const handleRef = useForkRef(nodeRef, children.ref, ref);\n const normalizedTransitionCallback = callback => maybeIsAppearing => {\n if (callback) {\n const node = nodeRef.current;\n\n // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n if (maybeIsAppearing === undefined) {\n callback(node);\n } else {\n callback(node, maybeIsAppearing);\n }\n }\n };\n const handleEntering = normalizedTransitionCallback(onEntering);\n const handleEnter = normalizedTransitionCallback((node, isAppearing) => {\n reflow(node); // So the animation always start from the start.\n\n const {\n duration: transitionDuration,\n delay,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'enter'\n });\n let duration;\n if (timeout === 'auto') {\n duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n autoTimeout.current = duration;\n } else {\n duration = transitionDuration;\n }\n node.style.transition = [theme.transitions.create('opacity', {\n duration,\n delay\n }), theme.transitions.create('transform', {\n duration: isWebKit154 ? duration : duration * 0.666,\n delay,\n easing: transitionTimingFunction\n })].join(',');\n if (onEnter) {\n onEnter(node, isAppearing);\n }\n });\n const handleEntered = normalizedTransitionCallback(onEntered);\n const handleExiting = normalizedTransitionCallback(onExiting);\n const handleExit = normalizedTransitionCallback(node => {\n const {\n duration: transitionDuration,\n delay,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'exit'\n });\n let duration;\n if (timeout === 'auto') {\n duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n autoTimeout.current = duration;\n } else {\n duration = transitionDuration;\n }\n node.style.transition = [theme.transitions.create('opacity', {\n duration,\n delay\n }), theme.transitions.create('transform', {\n duration: isWebKit154 ? duration : duration * 0.666,\n delay: isWebKit154 ? delay : delay || duration * 0.333,\n easing: transitionTimingFunction\n })].join(',');\n node.style.opacity = 0;\n node.style.transform = getScale(0.75);\n if (onExit) {\n onExit(node);\n }\n });\n const handleExited = normalizedTransitionCallback(onExited);\n const handleAddEndListener = next => {\n if (timeout === 'auto') {\n timer.start(autoTimeout.current || 0, next);\n }\n if (addEndListener) {\n // Old call signature before `react-transition-group` implemented `nodeRef`\n addEndListener(nodeRef.current, next);\n }\n };\n return /*#__PURE__*/_jsx(TransitionComponent, _extends({\n appear: appear,\n in: inProp,\n nodeRef: nodeRef,\n onEnter: handleEnter,\n onEntered: handleEntered,\n onEntering: handleEntering,\n onExit: handleExit,\n onExited: handleExited,\n onExiting: handleExiting,\n addEndListener: handleAddEndListener,\n timeout: timeout === 'auto' ? null : timeout\n }, other, {\n children: (state, childProps) => {\n return /*#__PURE__*/React.cloneElement(children, _extends({\n style: _extends({\n opacity: 0,\n transform: getScale(0.75),\n visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n }, styles[state], style, children.props.style),\n ref: handleRef\n }, childProps));\n }\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Grow.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * Add a custom transition end trigger. Called with the transitioning DOM\n * node and a done callback. Allows for more fine grained transition end\n * logic. Note: Timeouts are still used as a fallback if provided.\n */\n addEndListener: PropTypes.func,\n /**\n * Perform the enter transition when it first mounts if `in` is also `true`.\n * Set this to `false` to disable this behavior.\n * @default true\n */\n appear: PropTypes.bool,\n /**\n * A single child content element.\n */\n children: elementAcceptingRef.isRequired,\n /**\n * The transition timing function.\n * You may specify a single easing or a object containing enter and exit values.\n */\n easing: PropTypes.oneOfType([PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string\n }), PropTypes.string]),\n /**\n * If `true`, the component will transition in.\n */\n in: PropTypes.bool,\n /**\n * @ignore\n */\n onEnter: PropTypes.func,\n /**\n * @ignore\n */\n onEntered: PropTypes.func,\n /**\n * @ignore\n */\n onEntering: PropTypes.func,\n /**\n * @ignore\n */\n onExit: PropTypes.func,\n /**\n * @ignore\n */\n onExited: PropTypes.func,\n /**\n * @ignore\n */\n onExiting: PropTypes.func,\n /**\n * @ignore\n */\n style: PropTypes.object,\n /**\n * The duration for the transition, in milliseconds.\n * You may specify a single timeout for all transitions, or individually with an object.\n *\n * Set to 'auto' to automatically calculate transition time based on height.\n * @default 'auto'\n */\n timeout: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number, PropTypes.shape({\n appear: PropTypes.number,\n enter: PropTypes.number,\n exit: PropTypes.number\n })])\n} : void 0;\nGrow.muiSupportAuto = true;\nexport default Grow;","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"anchorEl\", \"component\", \"components\", \"componentsProps\", \"container\", \"disablePortal\", \"keepMounted\", \"modifiers\", \"open\", \"placement\", \"popperOptions\", \"popperRef\", \"transition\", \"slots\", \"slotProps\"];\nimport { Popper as BasePopper } from '@mui/base/Popper';\nimport { useThemeWithoutDefault as useTheme } from '@mui/system';\nimport { HTMLElementType, refType } from '@mui/utils';\nimport PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { styled, useThemeProps } from '../styles';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst PopperRoot = styled(BasePopper, {\n name: 'MuiPopper',\n slot: 'Root',\n overridesResolver: (props, styles) => styles.root\n})({});\n\n/**\n *\n * Demos:\n *\n * - [Autocomplete](https://mui.com/material-ui/react-autocomplete/)\n * - [Menu](https://mui.com/material-ui/react-menu/)\n * - [Popper](https://mui.com/material-ui/react-popper/)\n *\n * API:\n *\n * - [Popper API](https://mui.com/material-ui/api/popper/)\n */\nconst Popper = /*#__PURE__*/React.forwardRef(function Popper(inProps, ref) {\n var _slots$root;\n const theme = useTheme();\n const props = useThemeProps({\n props: inProps,\n name: 'MuiPopper'\n });\n const {\n anchorEl,\n component,\n components,\n componentsProps,\n container,\n disablePortal,\n keepMounted,\n modifiers,\n open,\n placement,\n popperOptions,\n popperRef,\n transition,\n slots,\n slotProps\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n const RootComponent = (_slots$root = slots == null ? void 0 : slots.root) != null ? _slots$root : components == null ? void 0 : components.Root;\n const otherProps = _extends({\n anchorEl,\n container,\n disablePortal,\n keepMounted,\n modifiers,\n open,\n placement,\n popperOptions,\n popperRef,\n transition\n }, other);\n return /*#__PURE__*/_jsx(PopperRoot, _extends({\n as: component,\n direction: theme == null ? void 0 : theme.direction,\n slots: {\n root: RootComponent\n },\n slotProps: slotProps != null ? slotProps : componentsProps\n }, otherProps, {\n ref: ref\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Popper.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/),\n * or a function that returns either.\n * It's used to set the position of the popper.\n * The return value will passed as the reference object of the Popper instance.\n */\n anchorEl: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.object, PropTypes.func]),\n /**\n * Popper render function or node.\n */\n children: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.node, PropTypes.func]),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n components: PropTypes.shape({\n Root: PropTypes.elementType\n }),\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n componentsProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * An HTML element or function that returns one.\n * The `container` will have the portal children appended to it.\n *\n * You can also provide a callback, which is called in a React layout effect.\n * This lets you set the container from a ref, and also makes server-side rendering possible.\n *\n * By default, it uses the body of the top-level document object,\n * so it's simply `document.body` most of the time.\n */\n container: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([HTMLElementType, PropTypes.func]),\n /**\n * The `children` will be under the DOM hierarchy of the parent component.\n * @default false\n */\n disablePortal: PropTypes.bool,\n /**\n * Always keep the children in the DOM.\n * This prop can be useful in SEO situation or\n * when you want to maximize the responsiveness of the Popper.\n * @default false\n */\n keepMounted: PropTypes.bool,\n /**\n * Popper.js is based on a \"plugin-like\" architecture,\n * most of its features are fully encapsulated \"modifiers\".\n *\n * A modifier is a function that is called each time Popper.js needs to\n * compute the position of the popper.\n * For this reason, modifiers should be very performant to avoid bottlenecks.\n * To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/).\n */\n modifiers: PropTypes.arrayOf(PropTypes.shape({\n data: PropTypes.object,\n effect: PropTypes.func,\n enabled: PropTypes.bool,\n fn: PropTypes.func,\n name: PropTypes.any,\n options: PropTypes.object,\n phase: PropTypes.oneOf(['afterMain', 'afterRead', 'afterWrite', 'beforeMain', 'beforeRead', 'beforeWrite', 'main', 'read', 'write']),\n requires: PropTypes.arrayOf(PropTypes.string),\n requiresIfExists: PropTypes.arrayOf(PropTypes.string)\n })),\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool.isRequired,\n /**\n * Popper placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance.\n * @default {}\n */\n popperOptions: PropTypes.shape({\n modifiers: PropTypes.array,\n onFirstUpdate: PropTypes.func,\n placement: PropTypes.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n strategy: PropTypes.oneOf(['absolute', 'fixed'])\n }),\n /**\n * A ref that points to the used popper instance.\n */\n popperRef: refType,\n /**\n * The props used for each slot inside the Popper.\n * @default {}\n */\n slotProps: PropTypes.shape({\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])\n }),\n /**\n * The components used for each slot inside the Popper.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n slots: PropTypes.shape({\n root: PropTypes.elementType\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Help supporting a react-transition-group/Transition component.\n * @default false\n */\n transition: PropTypes.bool\n} : void 0;\nexport default Popper;","import generateUtilityClasses from '@mui/utils/generateUtilityClasses';\nimport generateUtilityClass from '@mui/utils/generateUtilityClass';\nexport function getTooltipUtilityClass(slot) {\n return generateUtilityClass('MuiTooltip', slot);\n}\nconst tooltipClasses = generateUtilityClasses('MuiTooltip', ['popper', 'popperInteractive', 'popperArrow', 'popperClose', 'tooltip', 'tooltipArrow', 'touch', 'tooltipPlacementLeft', 'tooltipPlacementRight', 'tooltipPlacementTop', 'tooltipPlacementBottom', 'arrow']);\nexport default tooltipClasses;","'use client';\n\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"arrow\", \"children\", \"classes\", \"components\", \"componentsProps\", \"describeChild\", \"disableFocusListener\", \"disableHoverListener\", \"disableInteractive\", \"disableTouchListener\", \"enterDelay\", \"enterNextDelay\", \"enterTouchDelay\", \"followCursor\", \"id\", \"leaveDelay\", \"leaveTouchDelay\", \"onClose\", \"onOpen\", \"open\", \"placement\", \"PopperComponent\", \"PopperProps\", \"slotProps\", \"slots\", \"title\", \"TransitionComponent\", \"TransitionProps\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { elementAcceptingRef, unstable_useTimeout as useTimeout, unstable_Timeout as Timeout } from '@mui/utils';\nimport { unstable_composeClasses as composeClasses, appendOwnerState } from '@mui/base';\nimport { alpha } from '@mui/system';\nimport styled from '../styles/styled';\nimport useTheme from '../styles/useTheme';\nimport useThemeProps from '../styles/useThemeProps';\nimport capitalize from '../utils/capitalize';\nimport Grow from '../Grow';\nimport Popper from '../Popper';\nimport useEventCallback from '../utils/useEventCallback';\nimport useForkRef from '../utils/useForkRef';\nimport useId from '../utils/useId';\nimport useIsFocusVisible from '../utils/useIsFocusVisible';\nimport useControlled from '../utils/useControlled';\nimport tooltipClasses, { getTooltipUtilityClass } from './tooltipClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n disableInteractive,\n arrow,\n touch,\n placement\n } = ownerState;\n const slots = {\n popper: ['popper', !disableInteractive && 'popperInteractive', arrow && 'popperArrow'],\n tooltip: ['tooltip', arrow && 'tooltipArrow', touch && 'touch', `tooltipPlacement${capitalize(placement.split('-')[0])}`],\n arrow: ['arrow']\n };\n return composeClasses(slots, getTooltipUtilityClass, classes);\n};\nconst TooltipPopper = styled(Popper, {\n name: 'MuiTooltip',\n slot: 'Popper',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.popper, !ownerState.disableInteractive && styles.popperInteractive, ownerState.arrow && styles.popperArrow, !ownerState.open && styles.popperClose];\n }\n})(({\n theme,\n ownerState,\n open\n}) => _extends({\n zIndex: (theme.vars || theme).zIndex.tooltip,\n pointerEvents: 'none'\n}, !ownerState.disableInteractive && {\n pointerEvents: 'auto'\n}, !open && {\n pointerEvents: 'none'\n}, ownerState.arrow && {\n [`&[data-popper-placement*=\"bottom\"] .${tooltipClasses.arrow}`]: {\n top: 0,\n marginTop: '-0.71em',\n '&::before': {\n transformOrigin: '0 100%'\n }\n },\n [`&[data-popper-placement*=\"top\"] .${tooltipClasses.arrow}`]: {\n bottom: 0,\n marginBottom: '-0.71em',\n '&::before': {\n transformOrigin: '100% 0'\n }\n },\n [`&[data-popper-placement*=\"right\"] .${tooltipClasses.arrow}`]: _extends({}, !ownerState.isRtl ? {\n left: 0,\n marginLeft: '-0.71em'\n } : {\n right: 0,\n marginRight: '-0.71em'\n }, {\n height: '1em',\n width: '0.71em',\n '&::before': {\n transformOrigin: '100% 100%'\n }\n }),\n [`&[data-popper-placement*=\"left\"] .${tooltipClasses.arrow}`]: _extends({}, !ownerState.isRtl ? {\n right: 0,\n marginRight: '-0.71em'\n } : {\n left: 0,\n marginLeft: '-0.71em'\n }, {\n height: '1em',\n width: '0.71em',\n '&::before': {\n transformOrigin: '0 0'\n }\n })\n}));\nconst TooltipTooltip = styled('div', {\n name: 'MuiTooltip',\n slot: 'Tooltip',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.tooltip, ownerState.touch && styles.touch, ownerState.arrow && styles.tooltipArrow, styles[`tooltipPlacement${capitalize(ownerState.placement.split('-')[0])}`]];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n backgroundColor: theme.vars ? theme.vars.palette.Tooltip.bg : alpha(theme.palette.grey[700], 0.92),\n borderRadius: (theme.vars || theme).shape.borderRadius,\n color: (theme.vars || theme).palette.common.white,\n fontFamily: theme.typography.fontFamily,\n padding: '4px 8px',\n fontSize: theme.typography.pxToRem(11),\n maxWidth: 300,\n margin: 2,\n wordWrap: 'break-word',\n fontWeight: theme.typography.fontWeightMedium\n}, ownerState.arrow && {\n position: 'relative',\n margin: 0\n}, ownerState.touch && {\n padding: '8px 16px',\n fontSize: theme.typography.pxToRem(14),\n lineHeight: `${round(16 / 14)}em`,\n fontWeight: theme.typography.fontWeightRegular\n}, {\n [`.${tooltipClasses.popper}[data-popper-placement*=\"left\"] &`]: _extends({\n transformOrigin: 'right center'\n }, !ownerState.isRtl ? _extends({\n marginRight: '14px'\n }, ownerState.touch && {\n marginRight: '24px'\n }) : _extends({\n marginLeft: '14px'\n }, ownerState.touch && {\n marginLeft: '24px'\n })),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"right\"] &`]: _extends({\n transformOrigin: 'left center'\n }, !ownerState.isRtl ? _extends({\n marginLeft: '14px'\n }, ownerState.touch && {\n marginLeft: '24px'\n }) : _extends({\n marginRight: '14px'\n }, ownerState.touch && {\n marginRight: '24px'\n })),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"top\"] &`]: _extends({\n transformOrigin: 'center bottom',\n marginBottom: '14px'\n }, ownerState.touch && {\n marginBottom: '24px'\n }),\n [`.${tooltipClasses.popper}[data-popper-placement*=\"bottom\"] &`]: _extends({\n transformOrigin: 'center top',\n marginTop: '14px'\n }, ownerState.touch && {\n marginTop: '24px'\n })\n}));\nconst TooltipArrow = styled('span', {\n name: 'MuiTooltip',\n slot: 'Arrow',\n overridesResolver: (props, styles) => styles.arrow\n})(({\n theme\n}) => ({\n overflow: 'hidden',\n position: 'absolute',\n width: '1em',\n height: '0.71em' /* = width / sqrt(2) = (length of the hypotenuse) */,\n boxSizing: 'border-box',\n color: theme.vars ? theme.vars.palette.Tooltip.bg : alpha(theme.palette.grey[700], 0.9),\n '&::before': {\n content: '\"\"',\n margin: 'auto',\n display: 'block',\n width: '100%',\n height: '100%',\n backgroundColor: 'currentColor',\n transform: 'rotate(45deg)'\n }\n}));\nlet hystersisOpen = false;\nconst hystersisTimer = new Timeout();\nlet cursorPosition = {\n x: 0,\n y: 0\n};\nexport function testReset() {\n hystersisOpen = false;\n hystersisTimer.clear();\n}\nfunction composeEventHandler(handler, eventHandler) {\n return event => {\n if (eventHandler) {\n eventHandler(event);\n }\n handler(event);\n };\n}\n\n// TODO v6: Remove PopperComponent, PopperProps, TransitionComponent and TransitionProps.\nconst Tooltip = /*#__PURE__*/React.forwardRef(function Tooltip(inProps, ref) {\n var _ref, _slots$popper, _ref2, _ref3, _slots$transition, _ref4, _slots$tooltip, _ref5, _slots$arrow, _slotProps$popper, _ref6, _slotProps$popper2, _slotProps$transition, _slotProps$tooltip, _ref7, _slotProps$tooltip2, _slotProps$arrow, _ref8, _slotProps$arrow2;\n const props = useThemeProps({\n props: inProps,\n name: 'MuiTooltip'\n });\n const {\n arrow = false,\n children: childrenProp,\n components = {},\n componentsProps = {},\n describeChild = false,\n disableFocusListener = false,\n disableHoverListener = false,\n disableInteractive: disableInteractiveProp = false,\n disableTouchListener = false,\n enterDelay = 100,\n enterNextDelay = 0,\n enterTouchDelay = 700,\n followCursor = false,\n id: idProp,\n leaveDelay = 0,\n leaveTouchDelay = 1500,\n onClose,\n onOpen,\n open: openProp,\n placement = 'bottom',\n PopperComponent: PopperComponentProp,\n PopperProps = {},\n slotProps = {},\n slots = {},\n title,\n TransitionComponent: TransitionComponentProp = Grow,\n TransitionProps\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n // to prevent runtime errors, developers will need to provide a child as a React element anyway.\n const children = /*#__PURE__*/React.isValidElement(childrenProp) ? childrenProp : /*#__PURE__*/_jsx(\"span\", {\n children: childrenProp\n });\n const theme = useTheme();\n const isRtl = theme.direction === 'rtl';\n const [childNode, setChildNode] = React.useState();\n const [arrowRef, setArrowRef] = React.useState(null);\n const ignoreNonTouchEvents = React.useRef(false);\n const disableInteractive = disableInteractiveProp || followCursor;\n const closeTimer = useTimeout();\n const enterTimer = useTimeout();\n const leaveTimer = useTimeout();\n const touchTimer = useTimeout();\n const [openState, setOpenState] = useControlled({\n controlled: openProp,\n default: false,\n name: 'Tooltip',\n state: 'open'\n });\n let open = openState;\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {\n current: isControlled\n } = React.useRef(openProp !== undefined);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (childNode && childNode.disabled && !isControlled && title !== '' && childNode.tagName.toLowerCase() === 'button') {\n console.error(['MUI: You are providing a disabled `button` child to the Tooltip component.', 'A disabled element does not fire events.', \"Tooltip needs to listen to the child element's events to display the title.\", '', 'Add a simple wrapper element, such as a `span`.'].join('\\n'));\n }\n }, [title, childNode, isControlled]);\n }\n const id = useId(idProp);\n const prevUserSelect = React.useRef();\n const stopTouchInteraction = useEventCallback(() => {\n if (prevUserSelect.current !== undefined) {\n document.body.style.WebkitUserSelect = prevUserSelect.current;\n prevUserSelect.current = undefined;\n }\n touchTimer.clear();\n });\n React.useEffect(() => stopTouchInteraction, [stopTouchInteraction]);\n const handleOpen = event => {\n hystersisTimer.clear();\n hystersisOpen = true;\n\n // The mouseover event will trigger for every nested element in the tooltip.\n // We can skip rerendering when the tooltip is already open.\n // We are using the mouseover event instead of the mouseenter event to fix a hide/show issue.\n setOpenState(true);\n if (onOpen && !open) {\n onOpen(event);\n }\n };\n const handleClose = useEventCallback(\n /**\n * @param {React.SyntheticEvent | Event} event\n */\n event => {\n hystersisTimer.start(800 + leaveDelay, () => {\n hystersisOpen = false;\n });\n setOpenState(false);\n if (onClose && open) {\n onClose(event);\n }\n closeTimer.start(theme.transitions.duration.shortest, () => {\n ignoreNonTouchEvents.current = false;\n });\n });\n const handleEnter = event => {\n if (ignoreNonTouchEvents.current && event.type !== 'touchstart') {\n return;\n }\n\n // Remove the title ahead of time.\n // We don't want to wait for the next render commit.\n // We would risk displaying two tooltips at the same time (native + this one).\n if (childNode) {\n childNode.removeAttribute('title');\n }\n enterTimer.clear();\n leaveTimer.clear();\n if (enterDelay || hystersisOpen && enterNextDelay) {\n enterTimer.start(hystersisOpen ? enterNextDelay : enterDelay, () => {\n handleOpen(event);\n });\n } else {\n handleOpen(event);\n }\n };\n const handleLeave = event => {\n enterTimer.clear();\n leaveTimer.start(leaveDelay, () => {\n handleClose(event);\n });\n };\n const {\n isFocusVisibleRef,\n onBlur: handleBlurVisible,\n onFocus: handleFocusVisible,\n ref: focusVisibleRef\n } = useIsFocusVisible();\n // We don't necessarily care about the focusVisible state (which is safe to access via ref anyway).\n // We just need to re-render the Tooltip if the focus-visible state changes.\n const [, setChildIsFocusVisible] = React.useState(false);\n const handleBlur = event => {\n handleBlurVisible(event);\n if (isFocusVisibleRef.current === false) {\n setChildIsFocusVisible(false);\n handleLeave(event);\n }\n };\n const handleFocus = event => {\n // Workaround for https://github.com/facebook/react/issues/7769\n // The autoFocus of React might trigger the event before the componentDidMount.\n // We need to account for this eventuality.\n if (!childNode) {\n setChildNode(event.currentTarget);\n }\n handleFocusVisible(event);\n if (isFocusVisibleRef.current === true) {\n setChildIsFocusVisible(true);\n handleEnter(event);\n }\n };\n const detectTouchStart = event => {\n ignoreNonTouchEvents.current = true;\n const childrenProps = children.props;\n if (childrenProps.onTouchStart) {\n childrenProps.onTouchStart(event);\n }\n };\n const handleMouseOver = handleEnter;\n const handleMouseLeave = handleLeave;\n const handleTouchStart = event => {\n detectTouchStart(event);\n leaveTimer.clear();\n closeTimer.clear();\n stopTouchInteraction();\n prevUserSelect.current = document.body.style.WebkitUserSelect;\n // Prevent iOS text selection on long-tap.\n document.body.style.WebkitUserSelect = 'none';\n touchTimer.start(enterTouchDelay, () => {\n document.body.style.WebkitUserSelect = prevUserSelect.current;\n handleEnter(event);\n });\n };\n const handleTouchEnd = event => {\n if (children.props.onTouchEnd) {\n children.props.onTouchEnd(event);\n }\n stopTouchInteraction();\n leaveTimer.start(leaveTouchDelay, () => {\n handleClose(event);\n });\n };\n React.useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n /**\n * @param {KeyboardEvent} nativeEvent\n */\n function handleKeyDown(nativeEvent) {\n // IE11, Edge (prior to using Bink?) use 'Esc'\n if (nativeEvent.key === 'Escape' || nativeEvent.key === 'Esc') {\n handleClose(nativeEvent);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleClose, open]);\n const handleRef = useForkRef(children.ref, focusVisibleRef, setChildNode, ref);\n\n // There is no point in displaying an empty tooltip.\n // So we exclude all falsy values, except 0, which is valid.\n if (!title && title !== 0) {\n open = false;\n }\n const popperRef = React.useRef();\n const handleMouseMove = event => {\n const childrenProps = children.props;\n if (childrenProps.onMouseMove) {\n childrenProps.onMouseMove(event);\n }\n cursorPosition = {\n x: event.clientX,\n y: event.clientY\n };\n if (popperRef.current) {\n popperRef.current.update();\n }\n };\n const nameOrDescProps = {};\n const titleIsString = typeof title === 'string';\n if (describeChild) {\n nameOrDescProps.title = !open && titleIsString && !disableHoverListener ? title : null;\n nameOrDescProps['aria-describedby'] = open ? id : null;\n } else {\n nameOrDescProps['aria-label'] = titleIsString ? title : null;\n nameOrDescProps['aria-labelledby'] = open && !titleIsString ? id : null;\n }\n const childrenProps = _extends({}, nameOrDescProps, other, children.props, {\n className: clsx(other.className, children.props.className),\n onTouchStart: detectTouchStart,\n ref: handleRef\n }, followCursor ? {\n onMouseMove: handleMouseMove\n } : {});\n if (process.env.NODE_ENV !== 'production') {\n childrenProps['data-mui-internal-clone-element'] = true;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (childNode && !childNode.getAttribute('data-mui-internal-clone-element')) {\n console.error(['MUI: The `children` component of the Tooltip is not forwarding its props correctly.', 'Please make sure that props are spread on the same element that the ref is applied to.'].join('\\n'));\n }\n }, [childNode]);\n }\n const interactiveWrapperListeners = {};\n if (!disableTouchListener) {\n childrenProps.onTouchStart = handleTouchStart;\n childrenProps.onTouchEnd = handleTouchEnd;\n }\n if (!disableHoverListener) {\n childrenProps.onMouseOver = composeEventHandler(handleMouseOver, childrenProps.onMouseOver);\n childrenProps.onMouseLeave = composeEventHandler(handleMouseLeave, childrenProps.onMouseLeave);\n if (!disableInteractive) {\n interactiveWrapperListeners.onMouseOver = handleMouseOver;\n interactiveWrapperListeners.onMouseLeave = handleMouseLeave;\n }\n }\n if (!disableFocusListener) {\n childrenProps.onFocus = composeEventHandler(handleFocus, childrenProps.onFocus);\n childrenProps.onBlur = composeEventHandler(handleBlur, childrenProps.onBlur);\n if (!disableInteractive) {\n interactiveWrapperListeners.onFocus = handleFocus;\n interactiveWrapperListeners.onBlur = handleBlur;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (children.props.title) {\n console.error(['MUI: You have provided a `title` prop to the child of .', `Remove this title prop \\`${children.props.title}\\` or the Tooltip component.`].join('\\n'));\n }\n }\n const popperOptions = React.useMemo(() => {\n var _PopperProps$popperOp;\n let tooltipModifiers = [{\n name: 'arrow',\n enabled: Boolean(arrowRef),\n options: {\n element: arrowRef,\n padding: 4\n }\n }];\n if ((_PopperProps$popperOp = PopperProps.popperOptions) != null && _PopperProps$popperOp.modifiers) {\n tooltipModifiers = tooltipModifiers.concat(PopperProps.popperOptions.modifiers);\n }\n return _extends({}, PopperProps.popperOptions, {\n modifiers: tooltipModifiers\n });\n }, [arrowRef, PopperProps]);\n const ownerState = _extends({}, props, {\n isRtl,\n arrow,\n disableInteractive,\n placement,\n PopperComponentProp,\n touch: ignoreNonTouchEvents.current\n });\n const classes = useUtilityClasses(ownerState);\n const PopperComponent = (_ref = (_slots$popper = slots.popper) != null ? _slots$popper : components.Popper) != null ? _ref : TooltipPopper;\n const TransitionComponent = (_ref2 = (_ref3 = (_slots$transition = slots.transition) != null ? _slots$transition : components.Transition) != null ? _ref3 : TransitionComponentProp) != null ? _ref2 : Grow;\n const TooltipComponent = (_ref4 = (_slots$tooltip = slots.tooltip) != null ? _slots$tooltip : components.Tooltip) != null ? _ref4 : TooltipTooltip;\n const ArrowComponent = (_ref5 = (_slots$arrow = slots.arrow) != null ? _slots$arrow : components.Arrow) != null ? _ref5 : TooltipArrow;\n const popperProps = appendOwnerState(PopperComponent, _extends({}, PopperProps, (_slotProps$popper = slotProps.popper) != null ? _slotProps$popper : componentsProps.popper, {\n className: clsx(classes.popper, PopperProps == null ? void 0 : PopperProps.className, (_ref6 = (_slotProps$popper2 = slotProps.popper) != null ? _slotProps$popper2 : componentsProps.popper) == null ? void 0 : _ref6.className)\n }), ownerState);\n const transitionProps = appendOwnerState(TransitionComponent, _extends({}, TransitionProps, (_slotProps$transition = slotProps.transition) != null ? _slotProps$transition : componentsProps.transition), ownerState);\n const tooltipProps = appendOwnerState(TooltipComponent, _extends({}, (_slotProps$tooltip = slotProps.tooltip) != null ? _slotProps$tooltip : componentsProps.tooltip, {\n className: clsx(classes.tooltip, (_ref7 = (_slotProps$tooltip2 = slotProps.tooltip) != null ? _slotProps$tooltip2 : componentsProps.tooltip) == null ? void 0 : _ref7.className)\n }), ownerState);\n const tooltipArrowProps = appendOwnerState(ArrowComponent, _extends({}, (_slotProps$arrow = slotProps.arrow) != null ? _slotProps$arrow : componentsProps.arrow, {\n className: clsx(classes.arrow, (_ref8 = (_slotProps$arrow2 = slotProps.arrow) != null ? _slotProps$arrow2 : componentsProps.arrow) == null ? void 0 : _ref8.className)\n }), ownerState);\n return /*#__PURE__*/_jsxs(React.Fragment, {\n children: [/*#__PURE__*/React.cloneElement(children, childrenProps), /*#__PURE__*/_jsx(PopperComponent, _extends({\n as: PopperComponentProp != null ? PopperComponentProp : Popper,\n placement: placement,\n anchorEl: followCursor ? {\n getBoundingClientRect: () => ({\n top: cursorPosition.y,\n left: cursorPosition.x,\n right: cursorPosition.x,\n bottom: cursorPosition.y,\n width: 0,\n height: 0\n })\n } : childNode,\n popperRef: popperRef,\n open: childNode ? open : false,\n id: id,\n transition: true\n }, interactiveWrapperListeners, popperProps, {\n popperOptions: popperOptions,\n children: ({\n TransitionProps: TransitionPropsInner\n }) => /*#__PURE__*/_jsx(TransitionComponent, _extends({\n timeout: theme.transitions.duration.shorter\n }, TransitionPropsInner, transitionProps, {\n children: /*#__PURE__*/_jsxs(TooltipComponent, _extends({}, tooltipProps, {\n children: [title, arrow ? /*#__PURE__*/_jsx(ArrowComponent, _extends({}, tooltipArrowProps, {\n ref: setArrowRef\n })) : null]\n }))\n }))\n }))]\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Tooltip.propTypes /* remove-proptypes */ = {\n // ┌────────────────────────────── Warning ──────────────────────────────┐\n // │ These PropTypes are generated from the TypeScript type definitions. │\n // │ To update them, edit the d.ts file and run `pnpm proptypes`. │\n // └─────────────────────────────────────────────────────────────────────┘\n /**\n * If `true`, adds an arrow to the tooltip.\n * @default false\n */\n arrow: PropTypes.bool,\n /**\n * Tooltip reference element.\n */\n children: elementAcceptingRef.isRequired,\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n /**\n * @ignore\n */\n className: PropTypes.string,\n /**\n * The components used for each slot inside.\n *\n * This prop is an alias for the `slots` prop.\n * It's recommended to use the `slots` prop instead.\n *\n * @default {}\n */\n components: PropTypes.shape({\n Arrow: PropTypes.elementType,\n Popper: PropTypes.elementType,\n Tooltip: PropTypes.elementType,\n Transition: PropTypes.elementType\n }),\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n *\n * This prop is an alias for the `slotProps` prop.\n * It's recommended to use the `slotProps` prop instead, as `componentsProps` will be deprecated in the future.\n *\n * @default {}\n */\n componentsProps: PropTypes.shape({\n arrow: PropTypes.object,\n popper: PropTypes.object,\n tooltip: PropTypes.object,\n transition: PropTypes.object\n }),\n /**\n * Set to `true` if the `title` acts as an accessible description.\n * By default the `title` acts as an accessible label for the child.\n * @default false\n */\n describeChild: PropTypes.bool,\n /**\n * Do not respond to focus-visible events.\n * @default false\n */\n disableFocusListener: PropTypes.bool,\n /**\n * Do not respond to hover events.\n * @default false\n */\n disableHoverListener: PropTypes.bool,\n /**\n * Makes a tooltip not interactive, i.e. it will close when the user\n * hovers over the tooltip before the `leaveDelay` is expired.\n * @default false\n */\n disableInteractive: PropTypes.bool,\n /**\n * Do not respond to long press touch events.\n * @default false\n */\n disableTouchListener: PropTypes.bool,\n /**\n * The number of milliseconds to wait before showing the tooltip.\n * This prop won't impact the enter touch delay (`enterTouchDelay`).\n * @default 100\n */\n enterDelay: PropTypes.number,\n /**\n * The number of milliseconds to wait before showing the tooltip when one was already recently opened.\n * @default 0\n */\n enterNextDelay: PropTypes.number,\n /**\n * The number of milliseconds a user must touch the element before showing the tooltip.\n * @default 700\n */\n enterTouchDelay: PropTypes.number,\n /**\n * If `true`, the tooltip follow the cursor over the wrapped element.\n * @default false\n */\n followCursor: PropTypes.bool,\n /**\n * This prop is used to help implement the accessibility logic.\n * If you don't provide this prop. It falls back to a randomly generated id.\n */\n id: PropTypes.string,\n /**\n * The number of milliseconds to wait before hiding the tooltip.\n * This prop won't impact the leave touch delay (`leaveTouchDelay`).\n * @default 0\n */\n leaveDelay: PropTypes.number,\n /**\n * The number of milliseconds after the user stops touching an element before hiding the tooltip.\n * @default 1500\n */\n leaveTouchDelay: PropTypes.number,\n /**\n * Callback fired when the component requests to be closed.\n *\n * @param {React.SyntheticEvent} event The event source of the callback.\n */\n onClose: PropTypes.func,\n /**\n * Callback fired when the component requests to be open.\n *\n * @param {React.SyntheticEvent} event The event source of the callback.\n */\n onOpen: PropTypes.func,\n /**\n * If `true`, the component is shown.\n */\n open: PropTypes.bool,\n /**\n * Tooltip placement.\n * @default 'bottom'\n */\n placement: PropTypes.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),\n /**\n * The component used for the popper.\n * @default Popper\n */\n PopperComponent: PropTypes.elementType,\n /**\n * Props applied to the [`Popper`](/material-ui/api/popper/) element.\n * @default {}\n */\n PopperProps: PropTypes.object,\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n *\n * This prop is an alias for the `componentsProps` prop, which will be deprecated in the future.\n *\n * @default {}\n */\n slotProps: PropTypes.shape({\n arrow: PropTypes.object,\n popper: PropTypes.object,\n tooltip: PropTypes.object,\n transition: PropTypes.object\n }),\n /**\n * The components used for each slot inside.\n *\n * This prop is an alias for the `components` prop, which will be deprecated in the future.\n *\n * @default {}\n */\n slots: PropTypes.shape({\n arrow: PropTypes.elementType,\n popper: PropTypes.elementType,\n tooltip: PropTypes.elementType,\n transition: PropTypes.elementType\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n /**\n * Tooltip title. Zero-length titles string, undefined, null and false are never displayed.\n */\n title: PropTypes.node,\n /**\n * The component used for the transition.\n * [Follow this guide](/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n * @default Grow\n */\n TransitionComponent: PropTypes.elementType,\n /**\n * Props applied to the transition element.\n * By default, the element is based on this [`Transition`](http://reactcommunity.org/react-transition-group/transition/) component.\n */\n TransitionProps: PropTypes.object\n} : void 0;\nexport default Tooltip;","import '@/components/mui/menu-item.component.css';\nimport ArrowRightIcon from '@mui/icons-material/ArrowRight';\nimport {\n ListItemIcon as MuiListItemIcon,\n ListItemText as MuiListItemText,\n MenuItem as MuiMenuItem,\n} from '@mui/material';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Localized, ReferencedItem, SingleColumnMenu } from 'platform-bible-utils';\nimport { MouseEvent, PropsWithChildren } from 'react';\n\ntype MenuItemInfoBase = {\n /** Text (displayable in the UI) as the name of the menu item */\n label: string;\n /** Text to display when the mouse hovers over the menu item */\n tooltip?: string;\n};\n\nexport type Command = MenuItemInfoBase & {\n /** Command to execute (string.string) */\n command: string;\n};\n\ntype SubMenu = MenuItemInfoBase & {\n /** Command to execute (string.string) */\n items: MenuItemInfo[];\n};\n\nexport interface CommandHandler {\n (command: Command): void;\n}\n\nexport type MenuPropsBase = {\n /*\n * The JSON defining the menu whose items are to be rendered. This will typically be one of the\n * menus in the \"defs\" in a Platform.Bible menu (see PlatformMenus). The schema for this is\n * menuDocumentSchema (at the end of menus.model.ts). Note that while this is a\n * \"SingleColumnMenu\", somewhat bizarrely, a MultiColumnMenu is a SingleColumnMenu, so it really\n * could be a MultiColumnMenu, in which case, column had better be defined so it can be used\n * to filter out the actual groups and items to display on the column.\n */\n menuDefinition: Localized;\n\n commandHandler: CommandHandler;\n\n /**\n * Additional action to perform when any menu item is clicked. Allows the caller to handle event\n * (e.g., to close the menu).\n */\n onClick?: (event: MouseEvent) => void;\n};\n\nexport type MenuItemListProps = MenuPropsBase & {\n /** Optional unique (column) identifier */\n columnId?: ReferencedItem;\n};\n\nexport type MenuItemProps = Omit &\n PropsWithChildren<{\n /** Optional unique identifier */\n id?: string;\n\n onClick: (event: MouseEvent) => void;\n }>;\n\ntype MenuItemInfo = (Command | SubMenu) & {\n /**\n * If specified, menu item will be inset if it does not have a leading icon.\n *\n * @default true\n */\n allowForLeadingIcons?: boolean;\n /**\n * If specified, the path to the icon image to display on the leading side of the menu text.\n *\n * @default undefined (no leading icon will be shown)\n */\n iconPathBefore?: string;\n /**\n * If specified, the path to the icon image to display on the trailing side of the menu text.\n *\n * @default undefined (no trailing icon will be shown)\n */\n iconPathAfter?: string;\n /**\n * If true, list item is focused during the first mount\n *\n * @default false\n */\n hasAutoFocus?: boolean;\n\n /** Additional css classes to help with unique styling of the menu item */\n className?: string;\n\n /**\n * If true, the menu item will appear disabled and it will not respond to clicks or mouse hovers.\n *\n * @default false\n */\n isDisabled?: boolean;\n\n /**\n * If true, compact vertical padding designed for keyboard and mouse input is used.\n *\n * @default true\n */\n isDense?: boolean;\n\n /**\n * If true, a right-arrow icon will be displayed (iconPathAfter, if specified, will be ignored).\n *\n * @default false\n */\n isSubMenuParent?: boolean;\n\n /**\n * If true, the left and right padding is removed\n *\n * @default false\n */\n hasDisabledGutters?: boolean;\n\n /**\n * If true, a 1px light border is added to bottom of menu item\n *\n * @default false\n */\n hasDivider?: boolean;\n\n /** Help identify which element has keyboard focus */\n focusVisibleClassName?: string;\n\n /** If it's a submenu, it should have the items property */\n items?: MenuItemInfo[];\n};\n\nfunction getIcon(icon: string | undefined, menuLabel: string, leading: boolean) {\n return icon ? (\n \n {`${leading\n \n ) : undefined;\n}\n\nexport default function MenuItem(props: MenuItemProps) {\n const {\n onClick,\n label,\n tooltip,\n allowForLeadingIcons = true,\n iconPathBefore = undefined,\n iconPathAfter = undefined,\n hasAutoFocus = false,\n className,\n isDisabled = false,\n isDense = true,\n isSubMenuParent = false,\n hasDisabledGutters = false,\n hasDivider = false,\n focusVisibleClassName,\n id,\n children,\n } = props;\n\n const menuItem = (\n \n {label ? (\n <>\n {getIcon(iconPathBefore, label, true)}\n \n {isSubMenuParent ? (\n \n \n \n ) : (\n getIcon(iconPathAfter, label, false)\n )}\n \n ) : (\n children\n )}\n \n );\n\n return tooltip ? (\n \n
{menuItem}
\n
\n ) : (\n menuItem\n );\n}\n","import MenuItem, {\n MenuItemListProps,\n MenuItemProps,\n MenuPropsBase,\n} from '@/components/mui/menu-item.component';\nimport { Menu } from '@mui/material';\nimport {\n Localized,\n MenuGroupDetailsInSubMenu,\n MenuItemContainingCommand,\n MenuItemContainingSubmenu,\n OrderedExtensibleContainer,\n ReferencedItem,\n SingleColumnMenu,\n} from 'platform-bible-utils';\nimport { MouseEvent, useMemo, useState } from 'react';\n\n/**\n * All the exported types in this file should be regarded as \"internal\" (i.e., they should not be\n * exposed via index.ts).\n */\n\nexport type GroupedMenuPropsBase = MenuPropsBase & {\n /** Optional unique (column) identifier */\n columnId?: ReferencedItem;\n};\n\nexport type GroupedMenuItemListProps = MenuItemListProps & {\n /**\n * If the menuDefinition includes \"top-level\" groups (i.e., those that belong to a column as\n * opposed to those that belong to a submenu) that should not be included in the list, then this\n * array specifies which groups to include. Likewise, for a submenu, this list indicates which\n * groups are pertinent for that submenu. So then for a context menu this property need not be\n * specified since it is a top-level menu based on a \"true\" SingleColumnMenu (i.e., one that is\n * not a MultiColumnMenu).\n */\n includedGroups?: {\n id: string;\n group: Localized;\n }[];\n};\n\ninterface ItemInfo {\n item: Localized;\n isLastItemInGroup: boolean;\n}\n\ntype SubMenuProps = MenuPropsBase & {\n parentMenuItem: Localized;\n parentItemProps: Omit, 'iconPathAfter'>;\n};\n\nfunction getAllGroups(menuDefinition: Localized) {\n const groupEntries = Object.entries(menuDefinition.groups);\n // Convert array of entries to array of objects with id and group properties\n return groupEntries.map(([key, value]) => ({ id: key, group: value }));\n}\n\nfunction SubMenu(props: SubMenuProps) {\n const [anchorEl, setAnchorEl] = useState(undefined);\n\n const { parentMenuItem, parentItemProps, menuDefinition } = props;\n\n const handleParentMenuItemClick = (event: MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(undefined);\n };\n\n const renderSubMenuItems = () => {\n let includedGroups = getAllGroups(menuDefinition).filter((g) => 'menuItem' in g.group);\n\n // Ensure valid parent menu was provided. (If not, submenu will contain all groups!)\n if (!parentMenuItem?.id) throw new Error('A valid parent menu item is required for submenus.');\n\n // When laying out a submenu, only include groups associated with the provided parent menu.\n // Note: without the (annoying) redundant check that the included groups\n // have the menuItem field, TS doesn't think it exists.\n includedGroups = includedGroups.filter(\n (group) => 'menuItem' in group.group && group.group.menuItem === parentMenuItem.id,\n );\n\n return ;\n };\n\n return (\n <>\n \n \n {renderSubMenuItems()}\n \n \n );\n}\n\nconst getOrderedGroupItems = (\n groupId: string,\n allItems: Localized[],\n) => {\n // Filter items that belong to the specified group\n const itemsForGroup = allItems.filter((item) => item.group === groupId);\n // Sort items based on order\n const sortedItems = itemsForGroup.sort((a, b) => (a.order || 0) - (b.order || 0));\n return sortedItems;\n};\n\n/**\n * This component is internal; it does not need to be exposed to the outside world since it is not\n * useful on its own. It is used to generate and lay out the MenuItems that appear either on a\n * top-level menu (in a GridMenu or ContextMenu) or in a submenu.\n */\nexport default function GroupedMenuItemList(menuProps: GroupedMenuItemListProps) {\n const { menuDefinition, onClick, commandHandler, includedGroups } = menuProps;\n\n const { items, allowForLeadingIcons } = useMemo(() => {\n const groupsToInclude =\n includedGroups && includedGroups.length > 0\n ? includedGroups\n : // We're apparently laying out a single-column menu (presumably a context menu). In this\n // case, all groups should be included except ones that belong to a submenu.\n getAllGroups(menuDefinition).filter((g) => !('menuItem' in g.group));\n\n const sortedGroups = Object.values(groupsToInclude).sort(\n (a, b) => (a.group.order || 0) - (b.group.order || 0),\n );\n\n const itemArray: ItemInfo[] = [];\n\n sortedGroups.forEach((group) => {\n getOrderedGroupItems(group.id, menuDefinition.items).forEach((item) =>\n itemArray.push({ item, isLastItemInGroup: false }),\n );\n if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = true;\n });\n\n // No divider after last item in final group.\n if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = false;\n\n const allowSpaceForLeadingIcons = itemArray.some(\n (i) => 'iconPathBefore' in i.item && i.item.iconPathBefore,\n );\n\n return { items: itemArray, allowForLeadingIcons: allowSpaceForLeadingIcons };\n }, [includedGroups, menuDefinition]);\n\n // Create props for MenuItem component including setting hasDivider for the last item in a group\n const createMenuItemProps = ({ item, isLastItemInGroup }: ItemInfo) => {\n const menuItemProps = {\n className: 'papi-menu-item',\n label: item.label,\n tooltip: item.tooltip,\n iconPathBefore: 'iconPathBefore' in item ? item.iconPathBefore : undefined,\n iconPathAfter: 'iconPathAfter' in item ? item.iconPathAfter : undefined,\n hasDivider: isLastItemInGroup, // Set hasDivider to true for the last item in a group\n allowForLeadingIcons,\n };\n\n return menuItemProps;\n };\n\n const [firstItem] = items;\n\n if (!firstItem) return
;\n\n const divKey = firstItem.item.group;\n\n return (\n
\n {items.map((itemInfo, index) => {\n const { item } = itemInfo;\n const menuItemProps = createMenuItemProps(itemInfo);\n if ('command' in item) {\n const key = item.group + index;\n return (\n ) => {\n onClick?.(event);\n commandHandler(item);\n }}\n {...menuItemProps}\n />\n );\n }\n return (\n \n );\n })}\n
\n );\n}\n","import GroupedMenuItemList from '@/components/mui/grouped-menu-item-list.component';\nimport { MenuItemListProps } from '@/components/mui/menu-item.component';\nimport { MultiColumnMenu } from 'platform-bible-utils';\n\n/**\n * This component is internal; it does not need to be exposed to the outside world since it is not\n * useful on its own. Use either GridMenu or ContextMenu.\n */\nexport default function TopLevelMenu(props: MenuItemListProps) {\n const { menuDefinition, columnId } = props;\n\n const groupEntries = Object.entries(menuDefinition.groups);\n // Convert array of entries to array of objects with id and group properties\n const groups = groupEntries.map(([key, value]) => ({ id: key, group: value }));\n let includedGroups = groups.filter((g) => 'column' in g.group);\n\n // Check if column is provided and menuDefinition is a MultiColumnMenu\n if (\n columnId &&\n 'columns' in menuDefinition &&\n // Without this type assertion, TS doesn't know what columns is.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n (menuDefinition as MultiColumnMenu).columns[columnId]\n ) {\n // When laying out a single column in a MultiColumnMenu, only include groups associated with\n // the provided column. Note: without the (annoying) redundant check that the included groups\n // have the colum field, TS doesn't think it exists.\n includedGroups = includedGroups.filter(\n (g) => 'column' in g.group && g.group.column === columnId,\n );\n }\n\n return ;\n}\n","import '@/components/mui/grid-menu.component.css';\nimport { GroupedMenuPropsBase } from '@/components/mui/grouped-menu-item-list.component';\nimport { CommandHandler } from '@/components/mui/menu-item.component';\nimport TopLevelMenu from '@/components/mui/top-level-menu.component';\nimport { Grid, List } from '@mui/material';\nimport {\n Localized,\n MenuColumnWithHeader,\n MultiColumnMenu,\n ReferencedItem,\n} from 'platform-bible-utils';\nimport { useMemo } from 'react';\n\ntype ColumnInfo = {\n /*\n * The ID (`${string}.${string}`) of a specific menu column.\n */\n id: ReferencedItem;\n\n /*\n * Metadata (label, order, etc.) for a specific menu column.\n */\n metadata: Localized;\n};\n\ntype MenuColumnProps = ColumnInfo &\n GroupedMenuPropsBase & {\n /** Additional css classes to help with unique styling of the menu column */\n className?: string;\n };\n\nexport type GridMenuInfo = {\n /** The menu object containing information about the columns, groups, and items to display. */\n multiColumnMenu: Localized;\n};\n\nexport type GridMenuProps = GridMenuInfo & {\n /** Optional unique identifier */\n id?: string;\n\n commandHandler: CommandHandler;\n\n /** Additional css classes to help with unique styling of the grid menu */\n className?: string;\n};\n\nfunction MenuColumn({\n commandHandler,\n menuDefinition,\n id,\n metadata,\n onClick,\n className,\n}: MenuColumnProps) {\n return (\n \n

\n {metadata.label}\n

\n {/* It would seem as though this List component were unnecessary, since it only contains one\n thing, but the \"dense\" property does affect the layout of the items (in a way I don't fully\n understand). There might be a better way. */}\n \n \n \n \n );\n}\n\nexport default function GridMenu({\n commandHandler,\n className,\n multiColumnMenu,\n id,\n}: GridMenuProps) {\n const { columns } = multiColumnMenu;\n\n const sortedColumns = useMemo(() => {\n const columnNumbers = new Map();\n Object.getOwnPropertyNames(columns).forEach((columnName: string) => {\n // We know for sure there is a (boolean) property 'isExtensible' that we are not interested in.\n if (columnName === 'isExtensible') return;\n // TS doesn't allow `columnName` above to be a ReferencedItem even though the type says it is\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const columnId = columnName as ReferencedItem;\n const column = columns[columnId];\n // As of right now (and hopefully forever after), all remaining properties of the\n // ColumnsWithHeaders object are columns whose property names are the IDs of the columns.\n // This is an additional (redundant) sanity check. Specifically we're interested in\n // MenuColumnWithHeader objects, which TypeScript now \"knows\" we have, but at runtime all we\n // can check for is that it's an object with a valid numeric order field. That's likely good\n // enough.\n if (\n typeof column === 'object' &&\n typeof column.order === 'number' &&\n !Number.isNaN(column.order)\n )\n columnNumbers.set(column.order, { id: columnId, metadata: column });\n else\n console.warn(\n `Property ${columnName} (${typeof column}) on menu ${id} is not a valid column and is being ignored. This might indicate data corruption`,\n );\n });\n\n // Extract values and sort them based on the 'order' property\n return Array.from(columnNumbers.values()).sort((a, b) => {\n return (a.metadata.order || 0) - (b.metadata.order || 0);\n });\n }, [columns, id]);\n\n // We might need something like this if we need to be able to prevent empty columns\n // sortedColumns.filter((c) => multiColumnMenu.groups.some((g) => 'column' in g && (g as .column)...\n\n return (\n \n {sortedColumns.map((col, index) => (\n \n ))}\n \n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type UsePromiseOptions = {\n /**\n * Whether to leave the value as the most recent resolved promise value or set it back to\n * defaultValue while running the promise again. Defaults to true\n */\n preserveValue?: boolean;\n};\n\n/** Set up defaults for options for usePromise hook */\nfunction getUsePromiseOptionsDefaults(options: UsePromiseOptions): UsePromiseOptions {\n return {\n preserveValue: true,\n ...options,\n };\n}\n\n/**\n * Awaits a promise and returns a loading value while the promise is unresolved\n *\n * @param promiseFactoryCallback A function that returns the promise to await. If this callback is\n * undefined, the current value will be returned (defaultValue unless it was previously changed\n * and `options.preserveValue` is true), and there will be no loading.\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n * @param defaultValue The initial value to return while first awaiting the promise. If\n * `options.preserveValue` is false, this value is also shown while awaiting the promise on\n * subsequent calls.\n *\n * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks\n * to re-run with its new value. This means that, if the `promiseFactoryCallback` changes and\n * `options.preserveValue` is `false`, the returned value will be set to the current\n * `defaultValue`. However, the returned value will not be updated if`defaultValue` changes.\n * @param options Various options for adjusting how this hook runs the `promiseFactoryCallback`\n *\n * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks\n * to re-run with its new value. However, the latest `options.preserveValue` will always be used\n * appropriately to determine whether to preserve the returned value when changing the\n * `promiseFactoryCallback`\n * @returns `[value, isLoading]`\n *\n * - `value`: the current value for the promise, either the defaultValue or the resolved promise value\n * - `isLoading`: whether the promise is waiting to be resolved\n */\nconst usePromise = (\n promiseFactoryCallback: (() => Promise) | undefined,\n defaultValue: T,\n options: UsePromiseOptions = {},\n): [value: T, isLoading: boolean] => {\n // Use defaultValue as a ref so it doesn't update dependency arrays\n const defaultValueRef = useRef(defaultValue);\n defaultValueRef.current = defaultValue;\n // Use options as a ref so it doesn't update dependency arrays\n const optionsDefaultedRef = useRef(options);\n optionsDefaultedRef.current = getUsePromiseOptionsDefaults(optionsDefaultedRef.current);\n\n const [value, setValue] = useState(() => defaultValueRef.current);\n const [isLoading, setIsLoading] = useState(true);\n useEffect(() => {\n let promiseIsCurrent = true;\n // If a promiseFactoryCallback was provided, we are loading. Otherwise, there is no loading to do\n setIsLoading(!!promiseFactoryCallback);\n (async () => {\n // If there is a callback to run, run it\n if (promiseFactoryCallback) {\n const result = await promiseFactoryCallback();\n // If the promise was not already replaced, update the value\n if (promiseIsCurrent) {\n setValue(() => result);\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n // Mark this promise as old and not to be used\n promiseIsCurrent = false;\n if (!optionsDefaultedRef.current.preserveValue) setValue(() => defaultValueRef.current);\n };\n }, [promiseFactoryCallback]);\n\n return [value, isLoading];\n};\nexport default usePromise;\n","\"use client\";\n\nimport createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z\"\n}), 'Menu');","import GridMenu from '@/components/mui/grid-menu.component';\nimport { Command, CommandHandler } from '@/components/mui/menu-item.component';\nimport usePromise from '@/hooks/use-promise.hook';\nimport { Menu as MenuIcon } from '@mui/icons-material';\nimport { Drawer, IconButton } from '@mui/material';\nimport { Localized, MultiColumnMenu } from 'platform-bible-utils';\nimport {\n MouseEvent,\n MutableRefObject,\n PropsWithChildren,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\nexport interface MultiColumnMenuProvider {\n (isSupportAndDevelopment: boolean): Promise>;\n}\n\nexport type HamburgerMenuButtonProps = PropsWithChildren & {\n /** The handler to use for menu commands (and eventually toolbar commands). */\n commandHandler: CommandHandler;\n\n /**\n * Optional reference to the \"div\" container that determines the where the menu should appear. If\n * not defined, then (1,1) used.\n */\n containerRef?: MutableRefObject;\n\n /**\n * The delegate to use to get the menu data. If not specified or if it returns undefined, the data\n * in normalMenu or fullMenu property will be used.\n */\n menuProvider?: MultiColumnMenuProvider;\n\n /**\n * The menu data to show when the menu is opened if the menuProvider property is not defined.\n * (This allows for a default or test-only static menu to be used.)\n */\n normalMenu?: Localized;\n\n /**\n * The menu data to show for \"full\" menu (when opened with the SHIFT key pressed) if the\n * menuProvider property is not defined. (This allows for a default or test-only static menu to be\n * used.)\n */\n fullMenu?: Localized;\n\n /** Additional css class(es) to help with unique styling of the sub-components */\n className?: string;\n\n /** Value to use as prefix for ARIA labels on interactive sub-components */\n ariaLabelPrefix?: string;\n};\n\nexport default function HamburgerMenuButton({\n menuProvider,\n normalMenu,\n fullMenu,\n commandHandler,\n containerRef,\n className,\n ariaLabelPrefix,\n children,\n}: HamburgerMenuButtonProps) {\n const [isMenuOpen, setMenuOpen] = useState(false);\n const [showFullMenu, setShowFullMenu] = useState(false);\n\n const handleMenuItemClick = useCallback(() => {\n if (isMenuOpen) setMenuOpen(false);\n setShowFullMenu(false);\n }, [isMenuOpen]);\n\n const handleMenuButtonClick = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n setMenuOpen((prevIsOpen) => {\n const isOpening = !prevIsOpen;\n if (isOpening && e.shiftKey) setShowFullMenu(true);\n else if (!isOpening) setShowFullMenu(false);\n return isOpening;\n });\n }, []);\n\n const menuCommandHandler = useCallback(\n (command: Command) => {\n handleMenuItemClick();\n return commandHandler(command);\n },\n [commandHandler, handleMenuItemClick],\n );\n\n const [offset, setOffset] = useState({ top: 1, left: 1 });\n\n useEffect(() => {\n if (isMenuOpen) {\n const node = containerRef?.current;\n if (node) {\n const rect = node.getBoundingClientRect();\n const scrollTop = window.scrollY;\n const scrollLeft = window.scrollX;\n const top = rect.top + scrollTop + node.clientHeight;\n const left = rect.left + scrollLeft;\n setOffset({ top, left });\n }\n }\n }, [isMenuOpen, containerRef]);\n\n const [normalMenuData] = usePromise(\n useCallback(async () => {\n return menuProvider?.(false) ?? normalMenu;\n // isMenuOpen needs to be included for the menu contents to reevaluate when reopened\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menuProvider, normalMenu, isMenuOpen]),\n normalMenu,\n );\n\n const [fullMenuData] = usePromise(\n useCallback(async () => {\n return menuProvider?.(true) ?? fullMenu ?? normalMenuData;\n // isMenuOpen needs to be included for the menu contents to reevaluate when reopened\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menuProvider, fullMenu, normalMenuData, isMenuOpen]),\n fullMenu ?? normalMenuData,\n );\n\n const menu = showFullMenu && fullMenuData ? fullMenuData : normalMenuData;\n\n return (\n <>\n \n {children ?? }\n \n \n {menu ? (\n \n ) : undefined}\n \n \n );\n}\n","import '@/components/mui/icon-button.component.css';\nimport { IconButton as MuiIconButton } from '@mui/material';\nimport { MouseEventHandler, PropsWithChildren } from 'react';\n\nexport type IconButtonProps = PropsWithChildren<{\n /** Optional unique identifier */\n id?: string;\n /**\n * Required. Used as both the tooltip (aka, title) and the aria-label (used for accessibility,\n * testing, etc.), unless a distinct tooltip is supplied.\n */\n label: string;\n /**\n * Enabled status of button\n *\n * @default false\n */\n isDisabled?: boolean;\n /** Optional tooltip to display if different from the aria-label. */\n tooltip?: string;\n /** If true, no tooltip will be displayed. */\n isTooltipSuppressed?: boolean;\n /**\n * If given, uses a negative margin to counteract the padding on one side (this is often helpful\n * for aligning the left or right side of the icon with content above or below, without ruining\n * the border size and shape).\n *\n * @default false\n */\n adjustMarginToAlignToEdge?: 'end' | 'start' | false;\n /**\n * The size of the component. small is equivalent to the dense button styling.\n *\n * @default false\n */\n size: 'small' | 'medium' | 'large';\n /** Additional css classes to help with unique styling of the button */\n className?: string;\n /** Optional click handler */\n onClick?: MouseEventHandler;\n}>;\n\n/**\n * Iconic button a user can click to do something\n *\n * Thanks to MUI for heavy inspiration and documentation\n * https://mui.com/material-ui/getting-started/overview/\n */\nfunction IconButton({\n id,\n label,\n isDisabled = false,\n tooltip,\n isTooltipSuppressed = false,\n adjustMarginToAlignToEdge = false,\n size = 'medium',\n className,\n onClick,\n children,\n}: IconButtonProps) {\n return (\n \n {children /* the icon to display */}\n \n );\n}\n\nexport default IconButton;\n","import { cn } from '@/utils/shadcn-ui.util';\nimport { LoaderCircle, LucideProps } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nexport type SpinnerProps = LucideProps;\n\nconst Spinner = forwardRef(({ className, ...props }, ref) => {\n return (\n \n );\n});\n\nSpinner.displayName = 'Spinner';\n\nexport default Spinner;\n","import { Input as ShadInput } from '@/components/shadcn-ui/input';\nimport { Label as ShadLabel } from '@/components/shadcn-ui/label';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { ChangeEventHandler, FocusEventHandler } from 'react';\n\nexport type TextFieldProps = {\n /** Optional unique identifier */\n id?: string;\n /**\n * If `true`, the component is disabled.\n *\n * @default false\n */\n isDisabled?: boolean;\n /**\n * If `true`, the label is displayed in an error state.\n *\n * @default false\n */\n hasError?: boolean;\n /**\n * If `true`, the input will take up the full width of its container.\n *\n * @default false\n */\n isFullWidth?: boolean;\n /** Text that gives the user instructions on what contents the TextField expects */\n helperText?: string;\n /** The title of the TextField */\n label?: string;\n /** The short hint displayed in the `input` before the user enters a value. */\n placeholder?: string;\n /**\n * If `true`, the label is displayed as required and the `input` element is required.\n *\n * @default false\n */\n isRequired?: boolean;\n /** Additional css classes to help with unique styling of the text field */\n className?: string;\n /** Starting value for the text field if it is not controlled */\n defaultValue?: string | number;\n /** Value of the text field if controlled */\n value?: string | number;\n /** Triggers when content of textfield is changed */\n onChange?: ChangeEventHandler;\n /** Triggers when textfield gets focus */\n onFocus?: FocusEventHandler;\n /** Triggers when textfield loses focus */\n onBlur?: FocusEventHandler;\n};\n\n/**\n * Text input field\n *\n * Thanks to Shadcn for heavy inspiration and documentation\n * https://ui.shadcn.com/docs/components/input#with-label\n */\nfunction TextField({\n id,\n isDisabled = false,\n hasError = false,\n isFullWidth = false,\n helperText,\n label,\n placeholder,\n isRequired = false,\n className,\n defaultValue,\n value,\n onChange,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n return (\n
\n {`${label}${isRequired ? '*' : ''}`}\n \n

{helperText}

\n
\n );\n}\n\nexport default TextField;\n","import HamburgerMenuButton, {\n MultiColumnMenuProvider,\n} from '@/components/mui/hamburger-menu-button.component';\nimport { CommandHandler } from '@/components/mui/menu-item.component';\nimport '@/components/mui/toolbar.component.css';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { AppBar, Toolbar as MuiToolbar } from '@mui/material';\nimport { PropsWithChildren, useRef } from 'react';\n\nexport type ToolbarProps = PropsWithChildren<{\n /** The handler to use for menu commands (and eventually toolbar commands). */\n commandHandler: CommandHandler;\n\n /**\n * The optional delegate to use to get the menu data. If not specified, the \"hamburger\" menu will\n * not display.\n */\n menuProvider?: MultiColumnMenuProvider;\n\n /** Optional unique identifier */\n id?: string;\n\n /** Additional css classes to help with unique styling of the toolbar */\n className?: string;\n}>;\n\nexport default function Toolbar({\n menuProvider,\n commandHandler,\n className,\n id,\n children,\n}: ToolbarProps) {\n // This ref will always be defined\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const containerRef = useRef(undefined!);\n\n return (\n
\n \n \n {menuProvider ? (\n \n ) : undefined}\n {children ?
{children}
: undefined}\n \n
\n
\n );\n}\n","import React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst alertVariants = cva(\n 'pr-relative pr-w-full pr-rounded-lg pr-border pr-p-4 [&>svg~*]:pr-pl-7 [&>svg+div]:pr-translate-y-[-3px] [&>svg]:pr-absolute [&>svg]:pr-left-4 [&>svg]:pr-top-4 [&>svg]:pr-text-foreground',\n {\n variants: {\n variant: {\n default: 'pr-bg-background pr-text-foreground',\n destructive:\n 'pr-border-destructive/50 pr-text-destructive dark:pr-border-destructive [&>svg]:pr-text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes & VariantProps\n>(({ className, variant, ...props }, ref) => (\n
\n));\nAlert.displayName = 'Alert';\n\nconst AlertTitle = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */}\n {props.children}{' '}\n \n ),\n);\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n
\n));\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription };\n","import React from 'react';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Card = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */}\n {props.children}\n \n ),\n);\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => (\n

\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef>(\n ({ className, ...props }, ref) => (\n

\n ),\n);\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef>(\n ({ className, ...props }, ref) => (\n \n ),\n);\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","import { ComponentProps } from 'react';\nimport { toast as sonner, Toaster } from 'sonner';\n\ntype SonnerProps = ComponentProps;\n\nfunction Sonner({ ...props }: SonnerProps) {\n return (\n \n );\n}\n\n// The re-export of the sonner function was added manually\nexport { Sonner, sonner };\n","import React from 'react';\nimport * as SliderPrimitive from '@radix-ui/react-slider';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Slider = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n \n \n \n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import React from 'react';\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nconst Switch = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n \n \n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\n\nimport { cn } from '@/utils/shadcn-ui.util';\n\nexport const Tabs = TabsPrimitive.Root;\n\nexport type TabsListProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type TabsTriggerProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type TabsContentProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport const TabsList = React.forwardRef<\n React.ElementRef,\n TabsListProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef,\n TabsTriggerProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n \n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\nimport { Download } from 'lucide-react';\n\ntype InstallButtonProps = {\n /** The installing boolean value determines the state of the button. */\n isInstalling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n /** Optional text for the button. */\n buttonText?: string;\n} & ButtonProps;\n\n/**\n * The InstallButton component is a button designed for initiating installs. It includes visuals for\n * active installing and idle states.\n *\n * @param isInstalling The installing boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @param buttonText Optional text for the button.\n * @returns A install button.\n */\nexport default function InstallButton({\n isInstalling,\n handleClick,\n buttonText,\n className,\n ...props\n}: InstallButtonProps) {\n return (\n \n {isInstalling ? (\n \n ) : (\n <>\n \n {buttonText}\n \n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype EnableButtonProps = {\n /** The enabling boolean value determines the state of the button. */\n isEnabling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The EnableButton component is a button designed for initiating enabling of downloads. It includes\n * visuals for active enabling and idle states.\n *\n * @param isEnabling The enabling boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to enable.\n */\nexport default function EnableButton({\n isEnabling,\n handleClick,\n className,\n ...props\n}: EnableButtonProps) {\n return (\n \n {isEnabling ? (\n <>\n \n Enabling...\n \n ) : (\n 'Enable'\n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype DisableButtonProps = {\n /** The disabling boolean value determines the state of the button. */\n isDisabling: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The DisableButton component is a button designed for initiating disabling of downloads. It\n * includes visuals for active disabling and idle states.\n *\n * @param isDisabling The disabling boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to disable.\n */\nexport default function DisableButton({\n isDisabling,\n handleClick,\n className,\n ...props\n}: DisableButtonProps) {\n return (\n \n {isDisabling ? (\n <>\n \n Disabling...\n \n ) : (\n 'Disable'\n )}\n \n );\n}\n","import { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport Spinner from '@/components/basics/spinner.component';\nimport { cn } from '@/utils/shadcn-ui.util';\n\ntype UpdateButtonProps = {\n /** The updating boolean value determines the state of the button. */\n isUpdating: boolean;\n /** The handleClick function is called when the button is clicked. */\n handleClick: () => void;\n} & ButtonProps;\n\n/**\n * The UpdateButton component is a button designed for initiating updates for downloaded extensions.\n * It includes visuals for active updating and idle states.\n *\n * @param isUpdating The updating boolean value determines the state of the button.\n * @param handleClick The handleClick function is called when the button is clicked.\n * @returns A button that can be used to update.\n */\nexport default function UpdateButton({\n isUpdating,\n handleClick,\n className,\n ...props\n}: UpdateButtonProps) {\n return (\n \n {isUpdating ? (\n <>\n \n Updating...\n \n ) : (\n 'Update'\n )}\n \n );\n}\n","import*as e from\"react\";function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t(e[t.toLowerCase()]=t,e),{for:\"htmlFor\"}),a={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",nbsp:\" \",quot:\"“\"},o=[\"style\",\"script\"],c=/([-A-Z0-9_:]+)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|(?:\\{((?:\\\\.|{[^}]*?}|[^}])*)\\})))?/gi,s=/mailto:/i,d=/\\n{2,}$/,u=/^(\\s*>[\\s\\S]*?)(?=\\n{2,})/,p=/^ *> ?/gm,f=/^ {2,}\\n/,h=/^(?:( *[-*_])){3,} *(?:\\n *)+\\n/,m=/^\\s*(`{3,}|~{3,}) *(\\S+)?([^\\n]*?)?\\n([\\s\\S]+?)\\s*\\1 *(?:\\n *)*\\n?/,g=/^(?: {4}[^\\n]+\\n*)+(?:\\n *)+\\n?/,y=/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,k=/^(?:\\n *)*\\n/,x=/\\r\\n?/g,b=/^\\[\\^([^\\]]+)](:(.*)((\\n+ {4,}.*)|(\\n(?!\\[\\^).+))*)/,v=/^\\[\\^([^\\]]+)]/,S=/\\f/g,E=/^---[ \\t]*\\n(.|\\n)*\\n---[ \\t]*\\n/,$=/^\\s*?\\[(x|\\s)\\]/,w=/^ *(#{1,6}) *([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/,C=/^ *(#{1,6}) +([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/,z=/^([^\\n]+)\\n *(=|-){3,} *(?:\\n *)+\\n/,L=/^ *(?!<[a-z][^ >/]* ?\\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\\n?(\\s*(?:<\\1[^>]*?>[\\s\\S]*?<\\/\\1>|(?!<\\1\\b)[\\s\\S])*?)<\\/\\1>(?!<\\/\\1>)\\n*/i,A=/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi,T=/^)/,O=/^(data|aria|x)-[a-z_][a-z\\d_.-]*$/,B=/^ *<([a-z][a-z0-9:]*)(?:\\s+((?:<.*?>|[^>])*))?\\/?>(?!<\\/\\1>)(\\s*\\n)?/i,M=/^\\{.*\\}$/,R=/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,I=/^<([^ >]+@[^ >]+)>/,U=/^<([^ >]+:\\/[^ >]+)>/,D=/-([a-z])?/gi,j=/^(.*\\|.*)\\n(?: *(\\|? *[-:]+ *\\|[-| :]*)\\n((?:.*\\|.*\\n)*))?\\n?/,N=/^\\[([^\\]]*)\\]:\\s+]+)>?\\s*(\"([^\"]*)\")?/,H=/^!\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/,F=/^\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/,P=/(\\[|\\])/g,_=/(\\n|^[-*]\\s|^#|^ {2,}|^-{2,}|^>\\s)/,W=/\\t/g,G=/(^ *\\||\\| *$)/g,Z=/^ *:-+: *$/,q=/^ *:-+ *$/,Q=/^ *-+: *$/,V=\"((?:\\\\[.*?\\\\][([].*?[)\\\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~~.*?~~|==.*?==|.|\\\\n)*?)\",X=new RegExp(`^([*_])\\\\1${V}\\\\1\\\\1(?!\\\\1)`),J=new RegExp(`^([*_])${V}\\\\1(?!\\\\1|\\\\w)`),K=new RegExp(`^==${V}==`),Y=new RegExp(`^~~${V}~~`),ee=/^\\\\([^0-9A-Za-z\\s])/,te=/^[\\s\\S]+?(?=[^0-9A-Z\\s\\u00c0-\\uffff&#;.()'\"]|\\d+\\.|\\n\\n| {2,}\\n|\\w+:\\S|$)/i,ne=/^\\n+/,re=/^([ \\t]*)/,ie=/\\\\([^\\\\])/g,le=/ *\\n+$/,ae=/(?:^|\\n)( *)$/,oe=\"(?:\\\\d+\\\\.)\",ce=\"(?:[*+-])\";function se(e){return\"( *)(\"+(1===e?oe:ce)+\") +\"}const de=se(1),ue=se(2);function pe(e){return new RegExp(\"^\"+(1===e?de:ue))}const fe=pe(1),he=pe(2);function me(e){return new RegExp(\"^\"+(1===e?de:ue)+\"[^\\\\n]*(?:\\\\n(?!\\\\1\"+(1===e?oe:ce)+\" )[^\\\\n]*)*(\\\\n|$)\",\"gm\")}const ge=me(1),ye=me(2);function ke(e){const t=1===e?oe:ce;return new RegExp(\"^( *)(\"+t+\") [\\\\s\\\\S]+?(?:\\\\n{2,}(?! )(?!\\\\1\"+t+\" (?!\"+t+\" ))\\\\n*|\\\\s*\\\\n*$)\")}const xe=ke(1),be=ke(2);function ve(e,t){const n=1===t,i=n?xe:be,l=n?ge:ye,a=n?fe:he;return{match(e,t,n){const r=ae.exec(n);return r&&(t.list||!t.inline&&!t.simple)?i.exec(e=r[1]+e):null},order:1,parse(e,t,r){const i=n?+e[2]:void 0,o=e[0].replace(d,\"\\n\").match(l);let c=!1;return{items:o.map(function(e,n){const i=a.exec(e)[0].length,l=new RegExp(\"^ {1,\"+i+\"}\",\"gm\"),s=e.replace(l,\"\").replace(a,\"\"),d=n===o.length-1,u=-1!==s.indexOf(\"\\n\\n\")||d&&c;c=u;const p=r.inline,f=r.list;let h;r.list=!0,u?(r.inline=!1,h=s.replace(le,\"\\n\\n\")):(r.inline=!0,h=s.replace(le,\"\"));const m=t(h,r);return r.inline=p,r.list=f,m}),ordered:n,start:i}},render:(t,n,i)=>e(t.ordered?\"ol\":\"ul\",{key:i.key,start:t.type===r.orderedList?t.start:void 0},t.items.map(function(t,r){return e(\"li\",{key:r},n(t,i))}))}}const Se=new RegExp(\"^\\\\[((?:\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]|\\\\](?=[^\\\\[]*\\\\]))*)\\\\]\\\\(\\\\s*?(?:\\\\s+['\\\"]([\\\\s\\\\S]*?)['\\\"])?\\\\s*\\\\)\"),Ee=/^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/,$e=[u,m,g,w,z,C,T,j,ge,xe,ye,be],we=[...$e,/^[^\\n]+(?: \\n|\\n{2,})/,L,B];function Ce(e){return e.replace(/[ÀÁÂÃÄÅàáâãäåæÆ]/g,\"a\").replace(/[çÇ]/g,\"c\").replace(/[ðÐ]/g,\"d\").replace(/[ÈÉÊËéèêë]/g,\"e\").replace(/[ÏïÎîÍíÌì]/g,\"i\").replace(/[Ññ]/g,\"n\").replace(/[øØœŒÕõÔôÓóÒò]/g,\"o\").replace(/[ÜüÛûÚúÙù]/g,\"u\").replace(/[ŸÿÝý]/g,\"y\").replace(/[^a-z0-9- ]/gi,\"\").replace(/ /gi,\"-\").toLowerCase()}function ze(e){return Q.test(e)?\"right\":Z.test(e)?\"center\":q.test(e)?\"left\":null}function Le(e,t,n,i){const l=n.inTable;n.inTable=!0;let a=e.trim().split(/( *(?:`[^`]*`|<.*?>.*?<\\/.*?>(?!<\\/.*?>)|\\\\\\||\\|) *)/).reduce((e,l)=>(\"|\"===l.trim()?e.push(i?{type:r.tableSeparator}:{type:r.text,text:l}):\"\"!==l&&e.push.apply(e,t(l,n)),e),[]);n.inTable=l;let o=[[]];return a.forEach(function(e,t){e.type===r.tableSeparator?0!==t&&t!==a.length-1&&o.push([]):(e.type!==r.text||null!=a[t+1]&&a[t+1].type!==r.tableSeparator||(e.text=e.text.trimEnd()),o[o.length-1].push(e))}),o}function Ae(e,t,n){n.inline=!0;const i=e[2]?e[2].replace(G,\"\").split(\"|\").map(ze):[],l=e[3]?function(e,t,n){return e.trim().split(\"\\n\").map(function(e){return Le(e,t,n,!0)})}(e[3],t,n):[],a=Le(e[1],t,n,!!l.length);return n.inline=!1,l.length?{align:i,cells:l,header:a,type:r.table}:{children:a,type:r.paragraph}}function Te(e,t){return null==e.align[t]?{}:{textAlign:e.align[t]}}function Oe(e){return function(t,n){return n.inline?e.exec(t):null}}function Be(e){return function(t,n){return n.inline||n.simple?e.exec(t):null}}function Me(e){return function(t,n){return n.inline||n.simple?null:e.exec(t)}}function Re(e){return function(t){return e.exec(t)}}function Ie(e,t,n){if(t.inline||t.simple)return null;if(n&&!n.endsWith(\"\\n\"))return null;let r=\"\";e.split(\"\\n\").every(e=>!$e.some(t=>t.test(e))&&(r+=e+\"\\n\",e.trim()));const i=r.trimEnd();return\"\"==i?null:[r,i]}function Ue(e){try{if(decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,\"\").match(/^\\s*(javascript|vbscript|data(?!:image)):/i))return null}catch(e){return null}return e}function De(e){return e.replace(ie,\"$1\")}function je(e,t,n){const r=n.inline||!1,i=n.simple||!1;n.inline=!0,n.simple=!0;const l=e(t,n);return n.inline=r,n.simple=i,l}function Ne(e,t,n){const r=n.inline||!1,i=n.simple||!1;n.inline=!1,n.simple=!0;const l=e(t,n);return n.inline=r,n.simple=i,l}function He(e,t,n){const r=n.inline||!1;n.inline=!1;const i=e(t,n);return n.inline=r,i}const Fe=(e,t,n)=>({children:je(t,e[1],n)});function Pe(){return{}}function _e(){return null}function We(...e){return e.filter(Boolean).join(\" \")}function Ge(e,t,n){let r=e;const i=t.split(\".\");for(;i.length&&(r=r[i[0]],void 0!==r);)i.shift();return r||n}function Ze(n=\"\",i={}){function d(e,n,...r){const l=Ge(i.overrides,`${e}.props`,{});return i.createElement(function(e,t){const n=Ge(t,e);return n?\"function\"==typeof n||\"object\"==typeof n&&\"render\"in n?n:Ge(t,`${e}.component`,e):e}(e,i.overrides),t({},n,l,{className:We(null==n?void 0:n.className,l.className)||void 0}),...r)}function G(t){t=t.replace(E,\"\");let n=!1;i.forceInline?n=!0:i.forceBlock||(n=!1===_.test(t));const r=le(ie(n?t:`${t.trimEnd().replace(ne,\"\")}\\n\\n`,{inline:n}));for(;\"string\"==typeof r[r.length-1]&&!r[r.length-1].trim();)r.pop();if(null===i.wrapper)return r;const l=i.wrapper||(n?\"span\":\"div\");let a;if(r.length>1||i.forceWrapper)a=r;else{if(1===r.length)return a=r[0],\"string\"==typeof a?d(\"span\",{key:\"outer\"},a):a;a=null}return e.createElement(l,{key:\"outer\"},a)}function Z(t,n){const r=n.match(c);return r?r.reduce(function(n,r,a){const o=r.indexOf(\"=\");if(-1!==o){const c=function(e){return-1!==e.indexOf(\"-\")&&null===e.match(O)&&(e=e.replace(D,function(e,t){return t.toUpperCase()})),e}(r.slice(0,o)).trim(),s=function(e){const t=e[0];return('\"'===t||\"'\"===t)&&e.length>=2&&e[e.length-1]===t?e.slice(1,-1):e}(r.slice(o+1).trim()),d=l[c]||c,u=n[d]=function(e,t,n,r){return\"style\"===t?n.split(/;\\s?/).reduce(function(e,t){const n=t.slice(0,t.indexOf(\":\"));return e[n.trim().replace(/(-[a-z])/g,e=>e[1].toUpperCase())]=t.slice(n.length+1).trim(),e},{}):\"href\"===t||\"src\"===t?r(n,e,t):(n.match(M)&&(n=n.slice(1,n.length-1)),\"true\"===n||\"false\"!==n&&n)}(t,c,s,i.sanitizer);\"string\"==typeof u&&(L.test(u)||B.test(u))&&(n[d]=e.cloneElement(G(u.trim()),{key:a}))}else\"style\"!==r&&(n[l[r]||r]=!0);return n},{}):null}i.overrides=i.overrides||{},i.sanitizer=i.sanitizer||Ue,i.slugify=i.slugify||Ce,i.namedCodesToUnicode=i.namedCodesToUnicode?t({},a,i.namedCodesToUnicode):a,i.createElement=i.createElement||e.createElement;const q=[],Q={},V={[r.blockQuote]:{match:Me(u),order:1,parse:(e,t,n)=>({children:t(e[0].replace(p,\"\"),n)}),render:(e,t,n)=>d(\"blockquote\",{key:n.key},t(e.children,n))},[r.breakLine]:{match:Re(f),order:1,parse:Pe,render:(e,t,n)=>d(\"br\",{key:n.key})},[r.breakThematic]:{match:Me(h),order:1,parse:Pe,render:(e,t,n)=>d(\"hr\",{key:n.key})},[r.codeBlock]:{match:Me(g),order:0,parse:e=>({lang:void 0,text:e[0].replace(/^ {4}/gm,\"\").replace(/\\n+$/,\"\")}),render:(e,n,r)=>d(\"pre\",{key:r.key},d(\"code\",t({},e.attrs,{className:e.lang?`lang-${e.lang}`:\"\"}),e.text))},[r.codeFenced]:{match:Me(m),order:0,parse:e=>({attrs:Z(\"code\",e[3]||\"\"),lang:e[2]||void 0,text:e[4],type:r.codeBlock})},[r.codeInline]:{match:Be(y),order:3,parse:e=>({text:e[2]}),render:(e,t,n)=>d(\"code\",{key:n.key},e.text)},[r.footnote]:{match:Me(b),order:0,parse:e=>(q.push({footnote:e[2],identifier:e[1]}),{}),render:_e},[r.footnoteReference]:{match:Oe(v),order:1,parse:e=>({target:`#${i.slugify(e[1],Ce)}`,text:e[1]}),render:(e,t,n)=>d(\"a\",{key:n.key,href:i.sanitizer(e.target,\"a\",\"href\")},d(\"sup\",{key:n.key},e.text))},[r.gfmTask]:{match:Oe($),order:1,parse:e=>({completed:\"x\"===e[1].toLowerCase()}),render:(e,t,n)=>d(\"input\",{checked:e.completed,key:n.key,readOnly:!0,type:\"checkbox\"})},[r.heading]:{match:Me(i.enforceAtxHeadings?C:w),order:1,parse:(e,t,n)=>({children:je(t,e[2],n),id:i.slugify(e[2],Ce),level:e[1].length}),render:(e,t,n)=>d(`h${e.level}`,{id:e.id,key:n.key},t(e.children,n))},[r.headingSetext]:{match:Me(z),order:0,parse:(e,t,n)=>({children:je(t,e[1],n),level:\"=\"===e[2]?1:2,type:r.heading})},[r.htmlBlock]:{match:Re(L),order:1,parse(e,t,n){const[,r]=e[3].match(re),i=new RegExp(`^${r}`,\"gm\"),l=e[3].replace(i,\"\"),a=(c=l,we.some(e=>e.test(c))?He:je);var c;const s=e[1].toLowerCase(),d=-1!==o.indexOf(s),u=(d?s:e[1]).trim(),p={attrs:Z(u,e[2]),noInnerParse:d,tag:u};return n.inAnchor=n.inAnchor||\"a\"===s,d?p.text=e[3]:p.children=a(t,l,n),n.inAnchor=!1,p},render:(e,n,r)=>d(e.tag,t({key:r.key},e.attrs),e.text||n(e.children,r))},[r.htmlSelfClosing]:{match:Re(B),order:1,parse(e){const t=e[1].trim();return{attrs:Z(t,e[2]||\"\"),tag:t}},render:(e,n,r)=>d(e.tag,t({},e.attrs,{key:r.key}))},[r.htmlComment]:{match:Re(T),order:1,parse:()=>({}),render:_e},[r.image]:{match:Be(Ee),order:1,parse:e=>({alt:e[1],target:De(e[2]),title:e[3]}),render:(e,t,n)=>d(\"img\",{key:n.key,alt:e.alt||void 0,title:e.title||void 0,src:i.sanitizer(e.target,\"img\",\"src\")})},[r.link]:{match:Oe(Se),order:3,parse:(e,t,n)=>({children:Ne(t,e[1],n),target:De(e[2]),title:e[3]}),render:(e,t,n)=>d(\"a\",{key:n.key,href:i.sanitizer(e.target,\"a\",\"href\"),title:e.title},t(e.children,n))},[r.linkAngleBraceStyleDetector]:{match:Oe(U),order:0,parse:e=>({children:[{text:e[1],type:r.text}],target:e[1],type:r.link})},[r.linkBareUrlDetector]:{match:(e,t)=>t.inAnchor?null:Oe(R)(e,t),order:0,parse:e=>({children:[{text:e[1],type:r.text}],target:e[1],title:void 0,type:r.link})},[r.linkMailtoDetector]:{match:Oe(I),order:0,parse(e){let t=e[1],n=e[1];return s.test(n)||(n=\"mailto:\"+n),{children:[{text:t.replace(\"mailto:\",\"\"),type:r.text}],target:n,type:r.link}}},[r.orderedList]:ve(d,1),[r.unorderedList]:ve(d,2),[r.newlineCoalescer]:{match:Me(k),order:3,parse:Pe,render:()=>\"\\n\"},[r.paragraph]:{match:Ie,order:3,parse:Fe,render:(e,t,n)=>d(\"p\",{key:n.key},t(e.children,n))},[r.ref]:{match:Oe(N),order:0,parse:e=>(Q[e[1]]={target:e[2],title:e[4]},{}),render:_e},[r.refImage]:{match:Be(H),order:0,parse:e=>({alt:e[1]||void 0,ref:e[2]}),render:(e,t,n)=>Q[e.ref]?d(\"img\",{key:n.key,alt:e.alt,src:i.sanitizer(Q[e.ref].target,\"img\",\"src\"),title:Q[e.ref].title}):null},[r.refLink]:{match:Oe(F),order:0,parse:(e,t,n)=>({children:t(e[1],n),fallbackChildren:t(e[0].replace(P,\"\\\\$1\"),n),ref:e[2]}),render:(e,t,n)=>Q[e.ref]?d(\"a\",{key:n.key,href:i.sanitizer(Q[e.ref].target,\"a\",\"href\"),title:Q[e.ref].title},t(e.children,n)):d(\"span\",{key:n.key},t(e.fallbackChildren,n))},[r.table]:{match:Me(j),order:1,parse:Ae,render(e,t,n){const r=e;return d(\"table\",{key:n.key},d(\"thead\",null,d(\"tr\",null,r.header.map(function(e,i){return d(\"th\",{key:i,style:Te(r,i)},t(e,n))}))),d(\"tbody\",null,r.cells.map(function(e,i){return d(\"tr\",{key:i},e.map(function(e,i){return d(\"td\",{key:i,style:Te(r,i)},t(e,n))}))})))}},[r.text]:{match:Re(te),order:4,parse:e=>({text:e[0].replace(A,(e,t)=>i.namedCodesToUnicode[t]?i.namedCodesToUnicode[t]:e)}),render:e=>e.text},[r.textBolded]:{match:Be(X),order:2,parse:(e,t,n)=>({children:t(e[2],n)}),render:(e,t,n)=>d(\"strong\",{key:n.key},t(e.children,n))},[r.textEmphasized]:{match:Be(J),order:3,parse:(e,t,n)=>({children:t(e[2],n)}),render:(e,t,n)=>d(\"em\",{key:n.key},t(e.children,n))},[r.textEscaped]:{match:Be(ee),order:1,parse:e=>({text:e[1],type:r.text})},[r.textMarked]:{match:Be(K),order:3,parse:Fe,render:(e,t,n)=>d(\"mark\",{key:n.key},t(e.children,n))},[r.textStrikethroughed]:{match:Be(Y),order:3,parse:Fe,render:(e,t,n)=>d(\"del\",{key:n.key},t(e.children,n))}};!0===i.disableParsingRawHTML&&(delete V[r.htmlBlock],delete V[r.htmlSelfClosing]);const ie=function(e){let t=Object.keys(e);function n(r,i){let l=[],a=\"\";for(;r;){let o=0;for(;ol(n,r,i),n,r,i):l(n,r,i)}}(V,i.renderRule),function e(t,n={}){if(Array.isArray(t)){const r=n.key,i=[];let l=!1;for(let r=0;r{let{children:r=\"\",options:i}=t,l=function(e,t){if(null==e)return{};var n,r,i={},l=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}(t,n);return e.cloneElement(Ze(r,i),l)};export{r as RuleType,Ze as compiler,Ue as sanitizer,Ce as slugify};\n//# sourceMappingURL=index.modern.js.map\n","import Markdown from 'markdown-to-jsx';\n\ninterface MarkdownRendererProps {\n /** Optional unique identifier */\n id?: string;\n /** The markdown string to render */\n markdown: string;\n}\n\n/**\n * This component renders markdown content given a markdown string. It uses typography styles from\n * the platform.\n *\n * @param markdown The markdown string to render.\n * @param id Optional unique identifier\n * @returns A div containing the rendered markdown content.\n */\nexport default function MarkdownRenderer({ id, markdown }: MarkdownRendererProps) {\n return (\n
\n {markdown}\n
\n );\n}\n","import { Filter, ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { Button } from '@/components/shadcn-ui/button';\n\n/**\n * The FilterButton component is a button designed for initiating filtering of data. It is designed\n * to be used with the dropdown menu. It uses forwardRef to pass the button to the dropdown trigger\n * asChild.\n *\n * @returns A button that can be used to filter.\n */\nconst FilterButton = forwardRef((props, ref) => {\n return (\n \n \n Filter\n \n \n );\n});\n\nexport default FilterButton;\n","import {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuGroup,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport FilterButton from './buttons/filter-button.component';\n\nexport enum DropdownMenuItemType {\n Check,\n Radio,\n}\n\nexport type DropdownItem = {\n /** The label is the text that will be displayed on the dropdown item. */\n label: string;\n /** The itemType determines the DropdownMenuItemType type as either Check or Radio. */\n itemType: DropdownMenuItemType;\n /** The onClick function is called when the item is clicked. */\n onClick: () => void;\n};\n\nexport type DropdownGroup = {\n /**\n * The label is the text that will be displayed on the dropdown group. It is used to categorize\n * the items in the group.\n */\n label: string;\n /** The items array contains the items that will be displayed in the dropdown group */\n items: DropdownItem[];\n};\n\nexport type FilterDropdownProps = {\n /** Object unique identifier */\n id?: string;\n /** The groups array contains the groups that will be displayed in the dropdown */\n groups: DropdownGroup[];\n}; // TODO: extend the props later\n\n/**\n * The FilterDropdown component is a dropdown designed for filtering content. It includes groups of\n * items that can be checkboxes or radio items.\n *\n * @param id Optional unique identifier\n * @param groups The groups array contains the groups that will be displayed in the dropdown\n * @returns A filter dropdown.\n */\nexport default function FilterDropdown({ id, groups }: FilterDropdownProps) {\n return (\n
\n {/* TODO: remove this once the DropDown Menu shadcn has an id prop */}\n \n \n \n \n \n {groups.map((group) => (\n
\n {group.label}\n \n {group.items.map((item) => (\n
\n {item.itemType === DropdownMenuItemType.Check ? (\n \n {item.label}\n \n ) : (\n \n {item.label}\n \n )}\n
\n ))}\n
\n \n
\n ))}\n
\n
\n
\n );\n}\n","interface NoExtensionsFoundProps {\n /** Optional unique identifier */\n id?: string;\n /** The message to display */\n message: string;\n}\n/**\n * This component displays a message to the user when no extensions are found in the marketplace.\n *\n * @param id Optional unique identifier\n * @param message The message to display.\n * @returns {JSX.Element} - Returns the message component that displays the message to the user.\n */\nexport default function NoExtensionsFound({ id, message }: NoExtensionsFoundProps) {\n return (\n
\n
\n

{message}

\n
\n
\n );\n}\n","import { CircleHelp, Link as LucideLink, User } from 'lucide-react';\nimport { NumberFormat } from 'platform-bible-utils';\n\n/** Interface that stores the parameters passed to the More Info component */\ninterface MoreInfoProps {\n /** Optional unique identifier */\n id?: string;\n /** The category of the extension */\n category: string;\n /** The number of downloads for the extension */\n downloads: Record;\n /** The languages supported by the extension */\n languages: string[];\n /** The URL to the more info page of the extension */\n moreInfoUrl: string;\n}\n/**\n * This component displays the more info section of the extension which includes the category,\n * number of downloads, languages, and links to the website and support\n *\n * @param id Optional unique identifier\n * @param category The category of the extension\n * @param downloads The number of downloads for the extension\n * @param languages The languages supported by the extension\n * @param moreInfoUrl The URL to the more info page of the extension\n * @returns {JSX.Element} - Returns the more info component that displays the category, number of\n * downloads, languages, and links to the website and support\n */\nexport default function MoreInfo({\n id,\n category,\n downloads,\n languages,\n moreInfoUrl,\n}: MoreInfoProps) {\n /**\n * This constant formats the number of downloads into a more readable format.\n *\n * @example 1000 -> 1K\n *\n * @example 1000000 -> 1M\n *\n * @returns The formatted number of downloads\n */\n const numberFormatted = new NumberFormat('en', {\n notation: 'compact',\n compactDisplay: 'short',\n }).format(Object.values(downloads).reduce((a: number, b: number) => a + b, 0));\n\n /** This function scrolls the window to the bottom of the page. */\n const handleScrollToBottom = () => {\n window.scrollTo(0, document.body.scrollHeight);\n };\n\n return (\n \n
\n
\n {category}\n
\n CATEGORY\n
\n
\n
\n
\n \n {numberFormatted}\n
\n USERS\n
\n
\n
\n
\n {languages.slice(0, 3).map((locale) => (\n \n {locale.toUpperCase()}\n \n ))}\n
\n {languages.length > 3 && (\n handleScrollToBottom()}\n className=\"pr-text-xs pr-text-gray-500 pr-underline\"\n >\n +{languages.length - 3} more languages\n \n )}\n
\n
\n
\n \n Website\n \n \n \n Support\n \n \n
\n
\n );\n}\n","import { useState } from 'react';\n\nexport type VersionInformation = {\n /** Date the version was published */\n date: string;\n /** Description of the changes in the version */\n description: string;\n};\n\n/** Type to store the version history information */\nexport type VersionHistoryType = Record;\n\n/** Interface that stores the parameters passed to the Version History component */\ninterface VersionHistoryProps {\n /** Optional unique identifier */\n id?: string;\n /** Object containing the versions mapped with their information */\n versionHistory: VersionHistoryType;\n}\n\n/**\n * Component to render the version history information shown in the footer component. Lists the 5\n * most recent versions, with the options to show all versions by pressing a button.\n *\n * @param versionHistory Object containing the versions mapped with their information\n * @param id Optional unique identifier\n * @returns Rendered version history for the Footer component\n */\nexport default function VersionHistory({ id, versionHistory }: VersionHistoryProps) {\n const [showAllVersions, setShowAllVersions] = useState(false);\n const currentDate = new Date();\n\n /**\n * Function to format the time string for the version history in the form of 'X year(s) ago'.\n *\n * @param dateString ISO Date string to determine the time string from\n * @returns Formatted time string\n */\n function formatTimeString(dateString: string) {\n const date = new Date(dateString);\n const dateDiff = new Date(currentDate.getTime() - date.getTime());\n const yearDiff = dateDiff.getUTCFullYear() - 1970;\n const monthDiff = dateDiff.getUTCMonth();\n const dayDiff = dateDiff.getUTCDate() - 1;\n\n // Determines how long ago the version was published\n let timeString = '';\n if (yearDiff > 0) {\n timeString = `${yearDiff.toString()} year${yearDiff === 1 ? '' : 's'} ago`;\n } else if (monthDiff > 0) {\n timeString = `${monthDiff.toString()} month${monthDiff === 1 ? '' : 's'} ago`;\n } else if (dayDiff === 0) {\n timeString = 'today';\n } else {\n timeString = `${dayDiff.toString()} day${dayDiff === 1 ? '' : 's'} ago`;\n }\n\n return timeString;\n }\n\n // Sorts the version history by version number\n const sortedEntries = Object.entries(versionHistory).sort((a, b) => b[0].localeCompare(a[0]));\n\n return (\n
\n

What`s New

\n
    \n {(showAllVersions ? sortedEntries : sortedEntries.slice(0, 5)).map((entry) => (\n
    \n
    \n
  • \n {entry[1].description}\n
  • \n
    \n
    \n
    Version {entry[0]}
    \n
    {formatTimeString(entry[1].date)}
    \n
    \n
    \n ))}\n
\n {sortedEntries.length > 5 && (\n setShowAllVersions(!showAllVersions)}\n className=\"pr-text-xs pr-text-gray-500 pr-underline\"\n >\n {showAllVersions ? 'Show Less Version History' : 'Show All Version History'}\n \n )}\n
\n );\n}\n","import { useMemo } from 'react';\nimport { formatBytes } from 'platform-bible-utils';\nimport VersionHistory, { VersionHistoryType } from './version-history.component';\n\n/** Interface to store the parameters passed to the Footer component */\ninterface FooterProps {\n /** Optional unique identifier */\n id?: string;\n /** Name of the publisher */\n publisherDisplayName: string;\n /** Size of the extension file in bytes */\n fileSize: number;\n /** List of language codes supported by the extension */\n locales: string[];\n /** Object containing the version history mapped with their information */\n versionHistory: VersionHistoryType;\n}\n\n/**\n * Component to render the footer for the extension details which contains information on the\n * publisher, version history, languages, and file size.\n *\n * @param id Optional unique identifier\n * @param publisherDisplayName Name of the publisher\n * @param fileSize Size of the extension file in bytes\n * @param locales List of language codes supported by the extension\n * @param versionHistory Object containing the version history mapped with their information\n * @returns The rendered Footer component\n */\nexport default function Footer({\n id,\n publisherDisplayName,\n fileSize,\n locales,\n versionHistory,\n}: FooterProps) {\n /** Formats the file size into a human-readable format */\n const formattedFileSize = useMemo(() => formatBytes(fileSize), [fileSize]);\n\n /**\n * This function gets the display names of the languages based on the language codes.\n *\n * @param codes The list of language codes\n * @returns The list of language names\n */\n const getLanguageNames = (codes: string[]) => {\n const displayNames = new Intl.DisplayNames(navigator.language, { type: 'language' });\n return codes.map((code) => displayNames.of(code));\n };\n\n const languageNames = getLanguageNames(locales);\n\n return (\n
\n
\n \n
\n
\n

Information

\n
\n

\n Publisher\n {publisherDisplayName}\n Size\n {formattedFileSize}\n

\n
\n

\n Languages\n {languageNames.join(', ')}\n

\n
\n
\n
\n
\n
\n );\n}\n","import { PlatformEvent, PlatformEventHandler } from 'platform-bible-utils';\nimport { useEffect } from 'react';\n\n/**\n * Adds an event handler to an event so the event handler runs when the event is emitted. Use\n * `papi.network.getNetworkEvent` to use a networked event with this hook.\n *\n * @param event The event to subscribe to.\n *\n * - If event is a `PlatformEvent`, that event will be used\n * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet\n * available for example\n *\n * @param eventHandler The callback to run when the event is emitted\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n */\nconst useEvent = (\n event: PlatformEvent | undefined,\n eventHandler: PlatformEventHandler,\n) => {\n useEffect(() => {\n // Do nothing if the event is not provided (in case the event is not yet available, for example)\n if (!event) return () => {};\n\n const unsubscriber = event(eventHandler);\n return () => {\n unsubscriber();\n };\n }, [event, eventHandler]);\n};\nexport default useEvent;\n","import { useCallback, useEffect } from 'react';\nimport { PlatformEvent, PlatformEventAsync, PlatformEventHandler } from 'platform-bible-utils';\nimport usePromise from './use-promise.hook';\n\nconst noopUnsubscriber = () => false;\n\n/**\n * Adds an event handler to an asynchronously subscribing/unsubscribing event so the event handler\n * runs when the event is emitted. Use `papi.network.getNetworkEvent` to use a networked event with\n * this hook.\n *\n * @param event The asynchronously (un)subscribing event to subscribe to.\n *\n * - If event is a `PlatformEvent` or `PlatformEventAsync`, that event will be used\n * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet\n * available for example\n *\n * @param eventHandler The callback to run when the event is emitted\n *\n * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated\n * every render\n */\nconst useEventAsync = (\n event: PlatformEvent | PlatformEventAsync | undefined,\n eventHandler: PlatformEventHandler,\n) => {\n // Subscribe to the event asynchronously\n const [unsubscribe] = usePromise(\n useCallback(async () => {\n // Do nothing if the event is not provided (in case the event is not yet available, for example)\n if (!event) return noopUnsubscriber;\n\n // Wrap subscribe and unsubscribe in promises to allow normal events to be used as well\n const unsub = await Promise.resolve(event(eventHandler));\n return async () => unsub();\n }, [eventHandler, event]),\n noopUnsubscriber,\n // We want the unsubscriber to return to default value immediately upon changing subscription\n // So the useEffect below will unsubscribe asap\n { preserveValue: false },\n );\n\n // Unsubscribe from the event asynchronously (but we aren't awaiting the unsub)\n useEffect(() => {\n return () => {\n if (unsubscribe !== noopUnsubscriber) {\n unsubscribe();\n }\n };\n }, [unsubscribe]);\n};\n\nexport default useEventAsync;\n"],"names":["twMergeCustom","extendTailwindMerge","cn","inputs","clsx","Input","React","className","type","props","ref","jsx","BookChapterInput","forwardRef","handleSearch","handleKeyDown","handleOnClick","handleSubmit","jsxs","ShadInput","event","e","History","P","R","t","s","n","N","B","O","S","K","g","k","x","T","X","V","w","L","G","A","H","C","I","y","q","U","m","l","h","c","E","r","D","i","a","o","u","v","f","d","b","p","J","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","inset","children","ChevronRight","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","Check","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","BookMenuItem","bookId","handleSelectBook","isSelected","handleHighlightBook","bookType","ShadDropdownMenuItem","Canon","ChapterSelect","handleSelectChapter","endChapter","activeChapter","highlightedChapter","handleHighlightedChapter","chapters","_","handleMouse","useCallback","chapterNumber","chapter","GoToMenuItem","handleSort","handleLocationHistory","handleBookmarks","ShadDropdownMenuLabel","ArrowDownWideNarrow","Clock","Bookmark","ALL_BOOK_IDS","BOOK_TYPE_LABELS","BOOK_TYPE_ARRAY","SCROLL_OFFSET","SEARCH_QUERY_FORMATS","fetchGroupedBooks","fetchEndChapter","getChaptersForBook","getAllEnglishNames","isValidBookEnglishName","bookName","getBookIdFromEnglishName","formattedBookName","BookChapterControl","scrRef","searchQuery","setSearchQuery","useState","selectedBookId","setSelectedBookId","setHighlightedChapter","highlightedBookId","setHighlightedBookId","isContentOpen","setIsContentOpen","isContentOpenDelayed","setIsContentOpenDelayed","inputRef","useRef","contentRef","menuItemRef","fetchFilteredBooks","englishNameLowerCase","normalizedQuery","handleSearchInput","searchString","shouldPreventAutoClosing","controlMenuState","open","updateReference","shouldClose","verse","handleInputSubmit","format","matches","book","englishName","handleKeyDownInput","handleKeyDownContent","key","handleKeyDownMenuItem","chapterOffSet","useEffect","useLayoutEffect","scrollTimeout","scrollPosition","ShadDropdownMenu","ShadDropdownMenuTrigger","ShadDropdownMenuContent","bookTypeIndex","element","ShadDropdownMenuSeparator","buttonVariants","cva","Button","variant","size","asChild","Slot","labelVariants","Label","LabelPrimitive","RadioGroup","RadioGroupPrimitive","RadioGroupItem","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","DialogPortal","DialogPrimitive","DialogOverlay","DialogContent","DialogTitle","DialogDescription","Command","CommandPrimitive","CommandInput","Search","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","getOptionLabelDefault","option","ComboBox","id","options","value","onChange","getOptionLabel","buttonPlaceholder","textPlaceholder","commandEmptyMessage","buttonVariant","dir","isDisabled","setOpen","ChevronsUpDown","ChapterRangeSelector","startChapter","handleSelectStartChapter","handleSelectEndChapter","chapterCount","chapterOptions","useMemo","index","Fragment","BookSelectionMode","BOOK_SELECTOR_STRING_KEYS","localizeString","strings","BookSelector","handleBookSelectionModeChange","currentBookName","onSelectBooks","selectedBookIds","localizedStrings","currentBookText","chooseText","chooseBooksText","bookSelectionMode","setBookSelectionMode","onSelectionModeChange","newMode","DataTableViewOptions","table","FilterIcon","column","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","DataTablePagination","pageSize","ArrowLeftIcon","ChevronLeftIcon","ChevronRightIcon","ArrowRightIcon","Table","stickyHeader","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","DataTable","columns","data","enablePagination","showPaginationControls","showColumnVisibilityControls","onRowClickHandler","sorting","setSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","useReactTable","getCoreRowModel","getPaginationRowModel","getSortedRowModel","getFilteredRowModel","headerGroup","header","flexRender","_a","row","cell","getLinesFromUSFM","text","extractNumberFromUSFM","regex","match","extractOccurrences","item","extractItems","scriptureRef","results","lines","currentChapter","currentVerse","line","items","result","OccurrencesTable","selectedItem","scriptureReference","setScriptureReference","reference","occurrence","tableData","setTableData","INVENTORY_STRING_KEYS","getSortingIcon","sortDirection","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","filterItemData","statusFilter","textFilter","filteredItemData","convertTextToItemData","getInventoryItems","getStatusForItem","itemData","itemIndex","existingItem","entry","newItem","Inventory","approvedItems","onApprovedItemsChange","unapprovedItems","onUnapprovedItemsChange","scope","onScopeChange","getColumns","allItemsText","approvedItemsText","unapprovedItemsText","unknownItemsText","scopeBookText","scopeChapterText","scopeVerseText","filterText","setItems","setStatusFilter","setTextFilter","setSelectedItem","statusChangeHandler","changedItems","status","prevTableData","tableEntry","newApprovedItems","validItem","newUnapprovedItems","unapprovedItem","rowClickHandler","handleScopeChange","handleStatusFilterChange","newScriptureReference","toggleVariants","Toggle","TogglePrimitive","ToggleGroupContext","ToggleGroup","ToggleGroupPrimitive","ToggleGroupItem","context","inventoryItemColumn","itemLabel","inventoryCountColumn","countLabel","inventoryStatusColumn","statusLabel","CircleCheckIcon","CircleXIcon","CircleHelpIcon","SearchBar","onSearch","placeholder","isFullWidth","handleInputChange","VerticalTabs","TabsPrimitive","VerticalTabsList","VerticalTabsTrigger","VerticalTabsContent","NavigationContentSearch","tabList","searchPlaceholder","headerTitle","isSearchBarFullWidth","direction","tab","scrBookColId","scrRefColId","typeColId","detailsColId","defaultScrRefColumnName","defaultScrBookGroupName","defaultTypeColumnName","defaultDetailsColumnName","colInfo","showSourceColumn","showSrcCol","info","formatScrRef","compareScrRefs","toRefOrRange","scriptureSelection","offsetStart","offsetEnd","scrRefToBBBCCCVVV","getRowKey","ScriptureResultsViewer","sources","showColumnHeaders","scriptureReferenceColumnName","scriptureBookGroupName","typeColumnName","detailsColumnName","onRowSelected","grouping","setGrouping","scriptureResults","source","getExpandedRowModel","getGroupedRowModel","selectedRows","keys","selectedRow","scrBookGroupName","typeGroupName","groupingOptions","handleSelectChange","selectedGrouping","handleRowClick","getEvenOrOddBandingStyle","getIndent","groupingState","rowIndex","ChevronLeft","DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS","getLocalizeKeyForScrollGroupId","ScrollGroupSelector","availableScrollGroupIds","scrollGroupId","onChangeScrollGroupId","localizedStringsDefaulted","localizedStringKey","localizedStringValue","newScrollGroupString","scrollGroupOptionId","Separator","orientation","decorative","SeparatorPrimitive","SettingsList","SettingsListItem","primary","secondary","isLoading","loadingMessage","SettingsListHeader","includeSeparator","Checkbox","CheckboxPrimitive","Checklist","listItems","selectedListItems","handleSelectListItem","createLabel","_interopRequireDefault","obj","module","chainPropTypes","propType1","propType2","args","_extends","target","isPlainObject","prototype","deepClone","output","deepmerge","z","reactIs_production_min","hasSymbol","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","isValidElementType","typeOf","object","$$typeof","$$typeofType","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","hasWarnedAboutDeprecatedIsAsyncMode","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","reactIs_development","reactIsModule","require$$0","require$$1","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","test3","letter","objectAssign","from","to","symbols","ReactPropTypesSecret","ReactPropTypesSecret_1","has","printWarning","loggedTypeFailures","message","checkPropTypes","typeSpecs","values","location","componentName","getStack","typeSpecName","error","err","ex","stack","checkPropTypes_1","ReactIs","assign","require$$2","require$$3","require$$4","emptyFunctionThatReturnsNull","factoryWithTypeCheckers","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","iteratorFn","ANONYMOUS","ReactPropTypes","createPrimitiveTypeChecker","createAnyTypeChecker","createArrayOfTypeChecker","createElementTypeChecker","createElementTypeTypeChecker","createInstanceTypeChecker","createNodeChecker","createObjectOfTypeChecker","createEnumTypeChecker","createUnionTypeChecker","createShapeTypeChecker","createStrictShapeTypeChecker","is","PropTypeError","createChainableTypeChecker","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","isRequired","propName","propFullName","secret","cacheKey","chainedCheckType","expectedType","propValue","propType","getPropType","preciseType","getPreciseType","typeChecker","expectedClass","expectedClassName","actualClassName","getClassName","expectedValues","valuesString","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","expectedTypes","checkerResult","expectedTypesMessage","isNode","invalidValidatorError","shapeTypes","allKeys","iterator","step","isSymbol","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","getShim","propTypesModule","isClassComponent","elementType","acceptingRef","safePropName","warningHint","elementAcceptingRef","PropTypes","elementAcceptingRef$1","specialProperty","exactProp","propTypes","unsupportedProps","prop","formatMuiErrorMessage","code","url","REACT_SERVER_CONTEXT_TYPE","REACT_OFFSCREEN_TYPE","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","SuspenseList","hasWarnedAboutDeprecatedIsConcurrentMode","isSuspenseList","fnNameMatchRegex","getFunctionName","fn","getFunctionComponentName","Component","fallback","getWrappedName","outerType","innerType","wrapperName","functionName","getDisplayName","HTMLElementType","refType","refType$1","capitalize","string","_formatMuiErrorMessage","createChainedFunction","funcs","acc","func","debounce","wait","timeout","debounced","later","deprecatedPropType","validator","reason","componentNameSafe","propFullNameSafe","isMuiElement","muiNames","_muiName","_element$type","ownerDocument","node","ownerWindow","requirePropFactory","componentNameInError","prevPropTypes","requiredProp","defaultTypeChecker","typeCheckerResult","setRef","useEnhancedEffect","useEnhancedEffect$1","globalId","useGlobalId","idOverride","defaultId","setDefaultId","maybeReactUseId","useId","reactId","unsupportedProp","useControlled","controlled","defaultProp","name","state","isControlled","valueState","setValue","defaultValue","setValueIfUncontrolled","newValue","useEventCallback","useForkRef","refs","instance","UNINITIALIZED","useLazyRef","init","initArg","EMPTY","useOnMount","Timeout","delay","useTimeout","hadKeyboardEvent","hadFocusVisibleRecently","hadFocusVisibleRecentlyTimeout","inputTypesWhitelist","focusTriggersKeyboardModality","tagName","handlePointerDown","handleVisibilityChange","prepare","doc","isFocusVisible","useIsFocusVisible","isFocusVisibleRef","handleBlurVisible","handleFocusVisible","resolveProps","defaultProps","defaultSlotProps","slotProps","slotPropName","composeClasses","slots","getUtilityClass","classes","slot","utilityClass","defaultGenerator","createClassNameGenerator","generate","generator","ClassNameGenerator","ClassNameGenerator$1","globalStateClasses","generateUtilityClass","globalStatePrefix","globalStateClass","generateUtilityClasses","clamp","min","max","_objectWithoutPropertiesLoose","excluded","sourceKeys","_excluded","sortBreakpointsValues","breakpointsAsArray","breakpoint1","breakpoint2","createBreakpoints","breakpoints","unit","other","sortedValues","up","down","between","start","end","endIndex","only","not","keyIndex","shape","shape$1","responsivePropType","responsivePropType$1","merge","defaultBreakpoints","handleBreakpoints","styleFromPropValue","theme","themeBreakpoints","breakpoint","mediaKey","cssKey","createEmptyBreakpointObject","breakpointsInput","_breakpointsInput$key","breakpointStyleKey","removeUnusedBreakpoints","breakpointKeys","style","breakpointOutput","getPath","path","checkVars","getStyleValue","themeMapping","transform","propValueFinal","userValue","cssProperty","themeKey","memoize","cache","arg","properties","directions","aliases","getCssProperties","property","marginKeys","paddingKeys","spacingKeys","createUnaryUnit","_getPath","themeSpacing","abs","createUnarySpacing","getValue","transformer","transformed","getStyleFromPropValue","cssProperties","resolveCssProperty","margin","padding","createSpacing","spacingInput","spacing","argsInput","argument","compose","styles","handlers","borderTransform","createBorderStyle","border","borderTop","borderRight","borderBottom","borderLeft","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outline","outlineColor","borderRadius","gap","columnGap","rowGap","gridColumn","gridRow","gridAutoFlow","gridAutoColumns","gridAutoRows","gridTemplateColumns","gridTemplateRows","gridTemplateAreas","gridArea","paletteTransform","color","bgcolor","backgroundColor","sizingTransform","width","maxWidth","_props$theme","_props$theme2","breakpointsValues","minWidth","height","maxHeight","minHeight","boxSizing","defaultSxConfig","defaultSxConfig$1","objectsHaveSameKeys","objects","union","callIfFn","maybeFn","unstable_createStyleFunctionSx","getThemeValue","config","styleFunctionSx","_theme$unstable_sxCon","sx","traverse","sxInput","sxObject","emptyBreakpoints","breakpointsKeys","css","styleKey","styleFunctionSx$1","applyStyles","createTheme","paletteInput","shapeInput","muiTheme","isObjectEmpty","useTheme","defaultTheme","contextTheme","ThemeContext","systemDefaultTheme","useThemeWithoutDefault","_excluded2","_excluded3","isEmpty","isStringTag","tag","shouldForwardProp","lowercaseFirstLetter","resolveTheme","themeId","defaultOverridesResolver","processStyleArg","callableStyle","_ref","ownerState","resolvedStylesArg","resolvedStyle","variants","isMatch","createStyled","input","rootShouldForwardProp","slotShouldForwardProp","systemSx","inputOptions","processStyles","componentSlot","inputSkipVariantsResolver","inputSkipSx","overridesResolver","skipVariantsResolver","skipSx","label","shouldForwardPropOption","defaultStyledResolver","styledEngineStyled","transformStyleArg","stylesArg","muiStyledResolver","styleArg","expressions","transformedStyleArg","expressionsWithDefaultTheme","styleOverrides","resolvedStyleOverrides","slotKey","slotStyle","_theme$components","themeVariants","numOfCustomFnsApplied","placeholders","displayName","getThemeProps","params","useThemeProps","clampWrapper","hexToRgb","re","colors","decomposeColor","marker","colorSpace","recomposeColor","hslToRgb","rgb","getLuminance","getContrastRatio","foreground","background","lumA","lumB","alpha","darken","coefficient","lighten","createMixins","mixins","common","common$1","grey","grey$1","purple","purple$1","red","red$1","orange","orange$1","blue","blue$1","lightBlue","lightBlue$1","green","green$1","light","dark","addLightOrDark","intent","shade","tonalOffset","tonalOffsetLight","tonalOffsetDark","getDefaultPrimary","mode","getDefaultSecondary","getDefaultError","getDefaultInfo","getDefaultSuccess","getDefaultWarning","createPalette","palette","contrastThreshold","success","warning","getContrastText","contrastText","contrast","augmentColor","mainShade","lightShade","darkShade","modes","round","caseAllCaps","defaultFontFamily","createTypography","typography","fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem2","coef","pxToRem","buildVariant","fontWeight","lineHeight","letterSpacing","casing","shadowKeyUmbraOpacity","shadowKeyPenumbraOpacity","shadowAmbientShadowOpacity","createShadow","px","shadows","shadows$1","easing","duration","formatMs","milliseconds","getAutoHeightDuration","constant","createTransitions","inputTransitions","mergedEasing","mergedDuration","durationOption","easingOption","isString","isNumber","animatedProp","zIndex","zIndex$1","mixinsInput","transitionsInput","typographyInput","systemTheme","systemCreateTheme","stateClasses","component","child","stateClass","defaultTheme$1","THEME_ID","systemUseThemeProps","styled","styled$1","getSvgIconUtilityClass","useUtilityClasses","SvgIconRoot","_theme$transitions","_theme$transitions$cr","_theme$transitions2","_theme$typography","_theme$typography$pxT","_theme$typography2","_theme$typography2$px","_theme$typography3","_theme$typography3$px","_palette$ownerState$c","_palette","_palette2","_palette3","SvgIcon","inProps","htmlColor","inheritViewBox","titleAccess","viewBox","hasSvgAsChild","more","_jsxs","_jsx","SvgIcon$1","createSvgIcon","unstable_ClassNameGenerator","exports","_utils","ArrowRight","default_1","_createSvgIcon","_jsxRuntime","isHostComponent","appendOwnerState","otherProps","defaultContextValue","ClassNameConfiguratorContext","useClassNamesOverride","disableDefaultClasses","extractEventHandlers","excludeKeys","resolveComponentProps","componentProps","slotState","omitEventHandlers","mergeSlotProps","parameters","getSlotProps","additionalProps","externalSlotProps","externalForwardedProps","joinedClasses","mergedStyle","eventHandlers","componentsPropsWithoutEventHandlers","otherPropsWithoutEventHandlers","internalSlotProps","useSlotProps","_parameters$additiona","skipResolvingSlotProps","rest","resolvedComponentsProps","mergedProps","internalRef","GLOBAL_CLASS_PREFIX","buildStateClass","buildSlotClass","getContainer","container","forwardedRef","disablePortal","mountNode","setMountNode","handleRef","newProps","ReactDOM","top","bottom","right","left","auto","basePlacements","clippingParents","viewport","popper","variationPlacements","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","getWindow","OwnElement","isHTMLElement","isShadowRoot","attributes","effect","_ref2","initialStyles","styleProperties","attribute","applyStyles$1","getBasePlacement","getUAString","uaData","isLayoutViewport","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","visualViewport","addVisualOffsets","getLayoutRect","contains","parent","rootNode","next","getComputedStyle","isTableElement","getDocumentElement","getParentNode","getTrueOffsetParent","getContainingBlock","isFirefox","isIE","elementCss","currentNode","getOffsetParent","window","offsetParent","getMainAxisFromPlacement","within","mathMax","mathMin","withinMaxClamp","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","toPaddingObject","arrow","_state$modifiersData$","arrowElement","popperOffsets","basePlacement","axis","isVertical","len","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","center","offset","axisProp","_options$element","arrow$1","getVariation","unsetSides","roundOffsetsByDPR","win","dpr","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","heightProp","widthProp","offsetY","offsetX","commonStyles","_ref4","_Object$assign","computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","computeStyles$1","passive","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","eventListeners","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","getViewportRect","strategy","html","layoutViewport","getDocumentRect","_element$ownerDocumen","winScroll","body","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","list","isBody","updatedList","rectToClientRect","rect","getInnerBoundingClientRect","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","getExpandedFallbackPlacements","oppositePlacement","flip","_options$mainAxis","checkMainAxis","_options$altAxis","checkAltAxis","specifiedFallbackPlacements","_options$flipVariatio","preferredPlacement","isBasePlacement","fallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","mainVariationSide","altVariationSide","checks","check","numberOfChecks","_loop","_i","fittingPlacement","_ret","flip$1","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","hide","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","hide$1","distanceAndSkiddingToXY","rects","invertDistance","skidding","distance","_options$offset","_data$state$placement","offset$1","popperOffsets$1","getAltAxis","preventOverflow","_options$tether","tether","_options$tetherOffset","tetherOffset","altAxis","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","preventOverflow$1","getHTMLElementScroll","getNodeScroll","isElementScaled","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","documentElement","order","modifiers","map","visited","modifier","sort","requires","dep","depModifier","orderModifiers","orderedModifiers","phase","pending","resolve","mergeByName","merged","current","existing","DEFAULT_OPTIONS","areValidElements","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","effectCleanupFns","isDestroyed","setOptionsAction","cleanupModifierEffects","runModifierEffects","_state$elements","_state$orderedModifie","_state$orderedModifie2","_ref$options","cleanupFn","noopFn","createPopper","COMPONENT_NAME","getPopperUtilityClass","flipPlacement","resolveAnchorEl","anchorEl","isVirtualElement","defaultPopperOptions","PopperTooltip","_slots$root","initialPlacement","popperOptions","popperRefProp","TransitionProps","tooltipRef","ownRef","popperRef","handlePopperRef","handlePopperRefRef","rtlPlacement","setPlacement","resolvedAnchorElement","setResolvedAnchorElement","handlePopperUpdate","box","popperModifiers","childProps","Root","rootProps","Popper","containerProp","keepMounted","transition","exited","setExited","handleEnter","handleExited","resolvedAnchorEl","display","transitionProps","useThemeSystem","_setPrototypeOf","_inheritsLoose","subClass","superClass","setPrototypeOf","timeoutsShape","TransitionGroupContext","forceReflow","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","parentGroup","appear","initialStatus","prevState","nextIn","_proto","prevProps","nextStatus","exit","enter","mounting","_this2","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","_this3","nextState","callback","_this4","active","handler","doesNotHaveTimeoutOrListener","maybeNextCallback","_this$props","pt","noop","Transition$1","reflow","getTransitionProps","_style$transitionDura","_style$transitionTimi","getScale","isWebKit154","Grow","addEndListener","inProp","onEnter","onEntered","onEntering","onExit","onExited","onExiting","TransitionComponent","timer","autoTimeout","nodeRef","normalizedTransitionCallback","maybeIsAppearing","handleEntering","isAppearing","transitionDuration","transitionTimingFunction","handleEntered","handleExiting","handleExit","Grow$1","PopperRoot","BasePopper","components","componentsProps","RootComponent","Popper$1","getTooltipUtilityClass","tooltipClasses","tooltipClasses$1","disableInteractive","touch","TooltipPopper","TooltipTooltip","TooltipArrow","hystersisOpen","hystersisTimer","cursorPosition","composeEventHandler","eventHandler","Tooltip","_slots$popper","_slots$transition","_slots$tooltip","_slots$arrow","_slotProps$popper","_ref6","_slotProps$popper2","_slotProps$transition","_slotProps$tooltip","_ref7","_slotProps$tooltip2","_slotProps$arrow","_ref8","_slotProps$arrow2","childrenProp","describeChild","disableFocusListener","disableHoverListener","disableInteractiveProp","disableTouchListener","enterDelay","enterNextDelay","enterTouchDelay","followCursor","idProp","leaveDelay","leaveTouchDelay","onClose","onOpen","openProp","PopperComponentProp","PopperProps","title","TransitionComponentProp","isRtl","childNode","setChildNode","arrowRef","setArrowRef","ignoreNonTouchEvents","closeTimer","enterTimer","leaveTimer","touchTimer","openState","setOpenState","prevUserSelect","stopTouchInteraction","handleOpen","handleClose","handleLeave","focusVisibleRef","setChildIsFocusVisible","handleBlur","handleFocus","detectTouchStart","childrenProps","handleMouseOver","handleMouseLeave","handleTouchStart","handleTouchEnd","nativeEvent","handleMouseMove","nameOrDescProps","titleIsString","interactiveWrapperListeners","_PopperProps$popperOp","tooltipModifiers","PopperComponent","TooltipComponent","ArrowComponent","popperProps","tooltipProps","tooltipArrowProps","TransitionPropsInner","Tooltip$1","getIcon","icon","menuLabel","leading","MuiListItemIcon","MenuItem","onClick","tooltip","allowForLeadingIcons","iconPathBefore","iconPathAfter","hasAutoFocus","isDense","isSubMenuParent","hasDisabledGutters","hasDivider","focusVisibleClassName","menuItem","MuiMenuItem","MuiListItemText","getAllGroups","menuDefinition","SubMenu","setAnchorEl","parentMenuItem","parentItemProps","handleParentMenuItemClick","renderSubMenuItems","includedGroups","group","GroupedMenuItemList","Menu","getOrderedGroupItems","groupId","allItems","menuProps","commandHandler","groupsToInclude","sortedGroups","itemArray","allowSpaceForLeadingIcons","createMenuItemProps","isLastItemInGroup","firstItem","divKey","itemInfo","menuItemProps","TopLevelMenu","columnId","MenuColumn","metadata","Grid","List","GridMenu","multiColumnMenu","sortedColumns","columnNumbers","columnName","col","getUsePromiseOptionsDefaults","usePromise","promiseFactoryCallback","defaultValueRef","optionsDefaultedRef","setIsLoading","promiseIsCurrent","MenuIcon","HamburgerMenuButton","menuProvider","normalMenu","fullMenu","containerRef","ariaLabelPrefix","isMenuOpen","setMenuOpen","showFullMenu","setShowFullMenu","handleMenuItemClick","handleMenuButtonClick","prevIsOpen","isOpening","menuCommandHandler","command","setOffset","normalMenuData","fullMenuData","menu","IconButton","Drawer","isTooltipSuppressed","adjustMarginToAlignToEdge","MuiIconButton","Spinner","LoaderCircle","TextField","hasError","helperText","onFocus","onBlur","ShadLabel","Toolbar","AppBar","MuiToolbar","alertVariants","Alert","AlertTitle","AlertDescription","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Sonner","Toaster","Slider","SliderPrimitive","Switch","SwitchPrimitives","Tabs","TabsList","TabsTrigger","TabsContent","InstallButton","isInstalling","handleClick","buttonText","Download","EnableButton","isEnabling","DisableButton","isDisabling","UpdateButton","isUpdating","$","M","j","F","W","Z","Q","Y","ee","te","ne","ie","le","ae","oe","ce","se","de","ue","pe","fe","he","me","ge","ye","ke","xe","be","ve","Se","Ee","$e","we","Ce","ze","Le","Ae","Te","Oe","Be","Me","Re","Ie","Ue","De","je","Ne","He","Fe","Pe","_e","We","Ge","Ze","MarkdownRenderer","markdown","Markdown","FilterButton","Filter","DropdownMenuItemType","DropdownMenuItemType2","FilterDropdown","groups","NoExtensionsFound","MoreInfo","category","downloads","languages","moreInfoUrl","numberFormatted","NumberFormat","handleScrollToBottom","User","locale","LucideLink","CircleHelp","VersionHistory","versionHistory","showAllVersions","setShowAllVersions","currentDate","formatTimeString","dateString","date","dateDiff","yearDiff","monthDiff","dayDiff","timeString","sortedEntries","Footer","publisherDisplayName","fileSize","locales","formattedFileSize","formatBytes","languageNames","codes","displayNames","useEvent","unsubscriber","noopUnsubscriber","useEventAsync","unsubscribe","unsub"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAMA,KAAgBC,GAAoB,EAAE,QAAQ,MAAO,CAAA;AAIpD,SAASC,KAAMC,GAAsB;AACnC,SAAAH,GAAcI,GAAKD,CAAM,CAAC;AACnC;ACJO,MAAME,KAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,WAAAC,GAAW,MAAAC,GAAM,GAAGC,EAAA,GAASC,MAE5B,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAAH;AAAA,MACA,WAAWN;AAAA,QACT;AAAA,QACAK;AAAA,MACF;AAAA,MACA,KAAAG;AAAA,MAEC,GAAGD;AAAA,IAAA;AAAA,EAAA;AAIZ;AACAJ,GAAM,cAAc;ACNpB,MAAMO,KAAmBC;AAAA,EACvB,CACE,EAAE,cAAAC,GAAc,eAAAC,GAAe,eAAAC,GAAe,cAAAC,GAAc,GAAGR,EAAM,GACrEC,MAGE,gBAAAQ,EAAC,OAAI,EAAA,WAAU,eACb,UAAA;AAAA,IAAA,gBAAAP;AAAA,MAACQ;AAAAA,MAAA;AAAA,QACE,GAAGV;AAAA,QACJ,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAU,CAACW,MAAUN,EAAaM,EAAM,OAAO,KAAK;AAAA,QACpD,WAAW,CAACC,MAAM;AACZ,UAAAA,EAAE,QAAQ,WACCJ,KAEfF,EAAcM,CAAC;AAAA,QACjB;AAAA,QACA,SAASL;AAAA,QACT,KAAAN;AAAA,MAAA;AAAA,IACF;AAAA,IACA,gBAAAC;AAAA,MAACW;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM;AAEb,kBAAQ,IAAI,iBAAiB;AAAA,QAC/B;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAGN;AC9CA,IAAIC,KAAI,OAAO,gBACXC,KAAI,CAACC,GAAGJ,GAAGK,MAAML,KAAKI,IAAIF,GAAEE,GAAGJ,GAAG,EAAE,YAAY,IAAI,cAAc,IAAI,UAAU,IAAI,OAAOK,EAAC,CAAE,IAAID,EAAEJ,CAAC,IAAIK,GACzGC,KAAI,CAACF,GAAGJ,GAAGK,MAAMF,GAAEC,GAAG,OAAOJ,KAAK,WAAWA,IAAI,KAAKA,GAAGK,CAAC;AAW9D,MAAME,KAAI;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;A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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[3,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,221,237]} \ No newline at end of file diff --git a/lib/platform-bible-react/dts-bundle-generator.config.ts b/lib/platform-bible-react/dts-bundle-generator.config.ts new file mode 100644 index 0000000000..b183b32d99 --- /dev/null +++ b/lib/platform-bible-react/dts-bundle-generator.config.ts @@ -0,0 +1,11 @@ +const config = { + entries: [ + { + filePath: './src/index.ts', + outFile: './dist/index.d.ts', + noCheck: false, + }, + ], +}; + +module.exports = config; diff --git a/lib/platform-bible-react/index.html b/lib/platform-bible-react/index.html new file mode 100644 index 0000000000..06dc4ac051 --- /dev/null +++ b/lib/platform-bible-react/index.html @@ -0,0 +1,12 @@ + + + + + + platform-bible-react Preview + + +
+ + + diff --git a/lib/platform-bible-react/jest.config.ts b/lib/platform-bible-react/jest.config.ts new file mode 100644 index 0000000000..c267656aa4 --- /dev/null +++ b/lib/platform-bible-react/jest.config.ts @@ -0,0 +1,32 @@ +import type { Config } from 'jest'; +import { pathsToModuleNameMapper } from 'ts-jest'; +import fs from 'fs'; +import typescript from 'typescript'; + +// Get this tsconfig +const { + config: { compilerOptions }, +} = typescript.parseConfigFileTextToJson('tsconfig.json', fs.readFileSync('tsconfig.json', 'utf8')); + +const config: Config = { + moduleDirectories: ['node_modules', 'release/app/node_modules', 'src'], + moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json'], + modulePathIgnorePatterns: ['/extensions/dist', '/release'], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/.erb/mocks/file.mock.js', + '\\.(css|less|sass|scss)$': 'identity-obj-proxy', + ...pathsToModuleNameMapper(compilerOptions.paths, { + prefix: '/src', + }), + }, + testEnvironment: 'jsdom', + testEnvironmentOptions: { + url: 'http://localhost/', + }, + transform: { + '\\.(ts|tsx|js|jsx)$': 'ts-jest', + }, +}; + +export default config; diff --git a/lib/platform-bible-react/package.json b/lib/platform-bible-react/package.json new file mode 100644 index 0000000000..8db28e95cd --- /dev/null +++ b/lib/platform-bible-react/package.json @@ -0,0 +1,121 @@ +{ + "name": "platform-bible-react", + "version": "0.0.1", + "type": "module", + "description": "React components and hooks to use in Paranext - packaged to include styles sheets.", + "license": "MIT", + "homepage": "https://github.com/paranext/paranext-core/tree/main/lib/platform-bible-react", + "bugs": { + "url": "https://github.com/paranext/paranext-core/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/paranext/paranext-core.git" + }, + "author": { + "name": "Paranext", + "url": "https://github.com/paranext/" + }, + "contributors": [ + { + "name": "Ira J Hopkinson", + "url": "https://github.com/irahopkinson" + } + ], + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "start": "vite --host --open", + "build:basic": "tsc && vite build && dts-bundle-generator --config ./dts-bundle-generator.config.ts", + "build:docs": "typedoc", + "build": "npm run build:basic && npm run lint-fix", + "watch": "tsc && vite build --watch", + "lint": "npm run lint:scripts && npm run lint:styles", + "lint:scripts": "cross-env NODE_ENV=development eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint:styles": "stylelint **/*.{css,scss}", + "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts", + "test": "jest --silent" + }, + "peerDependencies": { + "react": ">=18.3.1", + "react-dom": ">=18.3.1" + }, + "dependencies": { + "@emotion/react": ">=11.11.4", + "@emotion/styled": ">=11.11.0", + "@mui/material": ">=5.15.10", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-radio-group": "^1.2.0", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.1.0", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.2.1", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-toggle-group": "^1.1.0", + "@tanstack/react-table": "^8.19.2", + "autoprefixer": "^10.4.19", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "cmdk": "^1.0.0", + "lucide-react": "^0.367.0", + "next-themes": "^0.3.0", + "platform-bible-utils": "file:../platform-bible-utils", + "react-data-grid": ">=7.0.0-beta.42", + "sonner": "^1.5.0", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@babel/preset-env": "^7.25.7", + "@babel/preset-react": "^7.25.7", + "@babel/preset-typescript": "^7.25.7", + "@mui/icons-material": "^5.15.10", + "@senojs/rollup-plugin-style-inject": "^0.2.3", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.13", + "@types/react": "^18.3.11", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react": "^4.3.2", + "dts-bundle-generator": "^9.5.1", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "prettier": "^3.3.3", + "prettier-plugin-jsdoc": "^1.3.0", + "prettier-plugin-tailwindcss": "^0.6.1", + "stylelint": "^16.9.0", + "stylelint-config-recommended": "^14.0.1", + "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-tailwindcss": "^0.0.7", + "tailwindcss": "^3.4.3", + "tailwindcss-scoped-preflight": "^2.1.0", + "ts-jest": "^29.2.5", + "tslib": "^2.7.0", + "typedoc": "^0.26.7", + "typescript": "^5.4.5", + "vite": "^4.5.5", + "vite-tsconfig-paths": "^4.3.2" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/lib/platform-bible-react/postcss.config.js b/lib/platform-bible-react/postcss.config.js new file mode 100644 index 0000000000..a982c6414e --- /dev/null +++ b/lib/platform-bible-react/postcss.config.js @@ -0,0 +1,8 @@ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-control.component.tsx b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-control.component.tsx new file mode 100644 index 0000000000..6a9c36e0cd --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-control.component.tsx @@ -0,0 +1,410 @@ +import BookChapterInput from '@/components/advanced/book-chapter-control/book-chapter-input.component'; +import BookMenuItem, { + BookType, +} from '@/components/advanced/book-chapter-control/book-menu-item.component'; +import ChapterSelect from '@/components/advanced/book-chapter-control/chapter-select.component'; +import GoToMenuItem from '@/components/advanced/book-chapter-control/go-to-menu-item.component'; +import { + DropdownMenu as ShadDropdownMenu, + DropdownMenuContent as ShadDropdownMenuContent, + DropdownMenuLabel as ShadDropdownMenuLabel, + DropdownMenuSeparator as ShadDropdownMenuSeparator, + DropdownMenuTrigger as ShadDropdownMenuTrigger, +} from '@/components/shadcn-ui/dropdown-menu'; +import { Canon } from '@sillsdev/scripture'; +import { ScriptureReference, getChaptersForBook } from 'platform-bible-utils'; +import { + KeyboardEvent as ReactKeyboardEvent, + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, +} from 'react'; + +type BookTypeLabels = { + [bookType in BookType]: string; +}; +type BookChapterControlProps = { + scrRef: ScriptureReference; + handleSubmit: (scrRef: ScriptureReference) => void; +}; + +const ALL_BOOK_IDS = Canon.allBookIds; +const BOOK_TYPE_LABELS: BookTypeLabels = { + OT: 'Old Testament', + NT: 'New Testament', + DC: 'Deuterocanon', +}; +const BOOK_TYPE_ARRAY: BookType[] = ['OT', 'NT', 'DC']; +// This is the height of three menu items to offset scrolling to the selected menu item +// If you use menuItemRef.clientHeight- includes height of chapter div which is too big +const SCROLL_OFFSET = 32 + 32 + 32; +const SEARCH_QUERY_FORMATS = [ + /^(\w+)$/i, // Matches a single word (book name or id) + /^(\w+)(?:\s(\d+))$/i, // Matches a word followed by a chapter number + /^(\w+)(?:\s(\d+):(\d+))$/i, // Matches a word followed by a chapter and verse number +]; +const fetchGroupedBooks = (bookType: BookType) => { + const groupedBooks = { + OT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookOT(bookId)), + NT: ALL_BOOK_IDS.filter((bookId) => Canon.isBookNT(bookId)), + DC: ALL_BOOK_IDS.filter((bookId) => Canon.isBookDC(bookId)), + }; + return groupedBooks[bookType]; +}; +const fetchEndChapter = (bookId: string) => { + // getChaptersForBook returns -1 if not found in scrBookData + // scrBookData only includes OT and NT, so all DC will return -1 + return getChaptersForBook(Canon.bookIdToNumber(bookId)); +}; + +/** + * Gets all of the English names from book ids + * + * @returns String[] + */ +function getAllEnglishNames(): string[] { + const allEnglishNames = ALL_BOOK_IDS.map((bookId) => { + return Canon.bookIdToEnglishName(bookId); + }); + return allEnglishNames; +} + +/** + * Determines if bookName is in allEnglishNames + * + * @param bookName Book English name + * @returns True if bookName is included, false otherwise + */ +function isValidBookEnglishName(bookName: string): boolean { + return getAllEnglishNames().includes(bookName); +} + +/** + * Gets a bookId from given English name + * + * @param bookName Book English name + * @returns BookId of provided bookName, undefined otherwise + */ +function getBookIdFromEnglishName(bookName: string): string | undefined { + // Convert bookName to lowercase and then capitalize the first letter + const formattedBookName = bookName.toLowerCase().replace(/^\w/, (c) => c.toUpperCase()); + + if (isValidBookEnglishName(formattedBookName)) { + const matchingBookId = ALL_BOOK_IDS.find((bookId) => { + return Canon.bookIdToEnglishName(bookId) === formattedBookName; + }); + return matchingBookId; + } + + return undefined; +} + +function BookChapterControl({ scrRef, handleSubmit }: BookChapterControlProps) { + const [searchQuery, setSearchQuery] = useState(''); + const [selectedBookId, setSelectedBookId] = useState( + Canon.bookNumberToId(scrRef.bookNum), + ); + const [highlightedChapter, setHighlightedChapter] = useState(scrRef.chapterNum ?? 0); + const [highlightedBookId, setHighlightedBookId] = useState( + Canon.bookNumberToId(scrRef.bookNum), + ); + const [isContentOpen, setIsContentOpen] = useState(false); + const [isContentOpenDelayed, setIsContentOpenDelayed] = useState(isContentOpen); + + // This ref will always be defined + // eslint-disable-next-line no-type-assertion/no-type-assertion + const inputRef = useRef(undefined!); + // eslint-disable-next-line no-type-assertion/no-type-assertion + const contentRef = useRef(undefined!); + // eslint-disable-next-line no-type-assertion/no-type-assertion + const menuItemRef = useRef(undefined!); + + const fetchFilteredBooks = useCallback( + (bookType: BookType) => { + return fetchGroupedBooks(bookType).filter((bookId: string) => { + const englishNameLowerCase = Canon.bookIdToEnglishName(bookId).toLowerCase(); + const normalizedQuery = searchQuery.replace(/[^a-zA-Z]/g, '').toLowerCase(); + return ( + englishNameLowerCase.includes(normalizedQuery) || // Match book name + bookId.toLowerCase().includes(normalizedQuery) // Match book ID + ); + }); + }, + [searchQuery], + ); + + const handleSearchInput = (searchString: string) => { + setSearchQuery(searchString); + }; + + /** + * Whether to prevent radix's logic from closing the dropdown. This is important because radix + * tries to close the dropdown when the input first focuses, and we don't want it to do that. But + * we don't want to prevent the dropdown from closing when we click away from the input, so we + * don't want to just keep it open if the input is focused + */ + const shouldPreventAutoClosing = useRef(false); + + const controlMenuState = useCallback((open: boolean) => { + if (shouldPreventAutoClosing.current) { + shouldPreventAutoClosing.current = false; + return; + } + setIsContentOpen(open); + }, []); + + const updateReference = useCallback( + (bookId: string, shouldClose: boolean, chapter?: number, verse?: number) => { + setHighlightedChapter( + Canon.bookNumberToId(scrRef.bookNum) !== bookId ? 1 : scrRef.chapterNum, + ); + + if (shouldClose || fetchEndChapter(bookId) === -1) { + handleSubmit({ + bookNum: Canon.bookIdToNumber(bookId), + chapterNum: chapter || 1, + verseNum: verse || 1, + }); + + setIsContentOpen(false); + setSearchQuery(''); + return; + } + + setSelectedBookId(selectedBookId !== bookId ? bookId : ''); + setIsContentOpen(!shouldClose); + }, + [handleSubmit, scrRef.bookNum, scrRef.chapterNum, selectedBookId], + ); + + const handleSelectChapter = (chapterNumber: number) => { + if (chapterNumber <= 0 || chapterNumber > fetchEndChapter(selectedBookId)) { + return; + } + updateReference(selectedBookId, true, chapterNumber); + }; + + const handleInputSubmit = useCallback(() => { + SEARCH_QUERY_FORMATS.forEach((format) => { + const matches = searchQuery.match(format); + if (matches) { + // Book should be a bookId or an english name + const [book, chapter = undefined, verse = undefined] = matches.slice(1); + const englishName = getBookIdFromEnglishName(book); + + if (Canon.isBookIdValid(book) || englishName) { + updateReference( + englishName ?? book, + true, + chapter ? parseInt(chapter, 10) : 1, + verse ? parseInt(verse, 10) : 1, + ); + } + } + }); + }, [updateReference, searchQuery]); + + const handleKeyDownInput = useCallback( + (event: ReactKeyboardEvent) => { + if (!isContentOpen) { + setIsContentOpen(true); + } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { + if ( + typeof menuItemRef !== 'undefined' && + // Ref uses null + // eslint-disable-next-line no-null/no-null + menuItemRef.current !== null + ) { + menuItemRef.current.focus(); + } else if ( + typeof contentRef !== 'undefined' && + // Ref uses null + // eslint-disable-next-line no-null/no-null + contentRef.current !== null + ) { + contentRef.current.focus(); + } + event.preventDefault(); + } + }, + [isContentOpen], + ); + + const handleKeyDownContent = (event: ReactKeyboardEvent) => { + // When the dropdown menu has focus, key strokes should give focus to the input component, + // unless they're navigation keys (arrows and enter) + const { key } = event; + if ( + key === 'ArrowRight' || + key === 'ArrowLeft' || + key === 'ArrowDown' || + key === 'ArrowUp' || + key === 'Enter' + ) { + return; + } + + inputRef.current.dispatchEvent(new KeyboardEvent('keydown', { key })); + inputRef.current.focus(); + }; + + const handleKeyDownMenuItem = (event: ReactKeyboardEvent) => { + const { key } = event; + if (highlightedBookId === selectedBookId) { + if (key === 'Enter') { + event.preventDefault(); + updateReference(selectedBookId, true, highlightedChapter); + return; + } + + let chapterOffSet = 0; + if (key === 'ArrowRight') { + if (highlightedChapter < fetchEndChapter(highlightedBookId)) { + chapterOffSet = 1; + } else { + event.preventDefault(); + return; + } + } else if (key === 'ArrowLeft') { + if (highlightedChapter > 1) { + chapterOffSet = -1; + } else { + event.preventDefault(); + return; + } + } else if (key === 'ArrowDown') { + chapterOffSet = 6; + } else if (key === 'ArrowUp') { + chapterOffSet = -6; + } + if ( + highlightedChapter + chapterOffSet <= 0 || + highlightedChapter + chapterOffSet > fetchEndChapter(highlightedBookId) + ) { + setHighlightedChapter(0); + } else if (chapterOffSet !== 0) { + setHighlightedChapter(highlightedChapter + chapterOffSet); + event.preventDefault(); + } + } + }; + + useEffect(() => { + if (selectedBookId === highlightedBookId) { + if (selectedBookId === Canon.bookNumberToId(scrRef.bookNum)) { + setHighlightedChapter(scrRef.chapterNum); + } else { + setHighlightedChapter(1); + } + } else { + setHighlightedChapter(0); + } + }, [highlightedBookId, scrRef.bookNum, scrRef.chapterNum, selectedBookId]); + + // The purpose of these useLayoutEffects and timeout is to delay the scroll just + // enough so that the refs are defined and available when they are used after the timeout + useLayoutEffect(() => { + setIsContentOpenDelayed(isContentOpen); + }, [isContentOpen]); + + useLayoutEffect(() => { + const scrollTimeout = setTimeout(() => { + if (isContentOpenDelayed && contentRef.current && menuItemRef.current) { + const menuItemOffsetTop = menuItemRef.current.offsetTop; + const scrollPosition = menuItemOffsetTop - SCROLL_OFFSET; + contentRef.current.scrollTo({ top: scrollPosition, behavior: 'instant' }); + } + }, 10); + return () => { + clearTimeout(scrollTimeout); + }; + }, [isContentOpenDelayed]); + + return ( +
+ + + { + setSelectedBookId(Canon.bookNumberToId(scrRef.bookNum)); + setHighlightedBookId(Canon.bookNumberToId(scrRef.bookNum)); + setHighlightedChapter(scrRef.chapterNum > 0 ? scrRef.chapterNum : 0); + setIsContentOpen(true); + inputRef.current.focus(); + }} + onFocus={() => { + // Radix thinks we want to close because the input is being focused. Prevent that + shouldPreventAutoClosing.current = true; + }} + handleSubmit={handleInputSubmit} + placeholder={`${Canon.bookNumberToEnglishName(scrRef.bookNum)} ${scrRef.chapterNum}:${scrRef.verseNum}`} + /> + + + console.log('sorting')} + handleLocationHistory={() => console.log('location history')} + handleBookmarks={() => console.log('bookmarks')} + /> + {BOOK_TYPE_ARRAY.map( + (bookType, bookTypeIndex) => + fetchFilteredBooks(bookType).length > 0 && ( +
+ + {BOOK_TYPE_LABELS[bookType]} + + + {fetchFilteredBooks(bookType).map((bookId) => ( +
+ updateReference(bookId, false)} + isSelected={selectedBookId === bookId} + handleHighlightBook={() => setHighlightedBookId(bookId)} + handleKeyDown={handleKeyDownMenuItem} + bookType={bookType} + ref={(element: HTMLDivElement) => { + if (selectedBookId === bookId) menuItemRef.current = element; + }} + > + { + setHighlightedChapter(chapterNumber); + }} + /> + +
+ ))} + {BOOK_TYPE_ARRAY.length - 1 !== bookTypeIndex ? ( + + ) : undefined} +
+ ), + )} +
+
+
+ ); +} + +export default BookChapterControl; diff --git a/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-input.component.tsx b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-input.component.tsx new file mode 100644 index 0000000000..082d47efa9 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-chapter-input.component.tsx @@ -0,0 +1,49 @@ +import { FocusEventHandler, forwardRef, KeyboardEvent, MouseEventHandler } from 'react'; +import { History } from 'lucide-react'; +import { Input as ShadInput } from '@/components/shadcn-ui/input'; + +export type BookChapterInputProps = { + handleSearch: (searchString: string) => void; + handleKeyDown: (event: KeyboardEvent) => void; + handleOnClick: MouseEventHandler; + handleSubmit: () => void; + onFocus?: FocusEventHandler; + value: string; + placeholder: string; +}; + +// Shadcn Input sets type to "button"- HAVE to prop spread before setting type +const BookChapterInput = forwardRef( + ( + { handleSearch, handleKeyDown, handleOnClick, handleSubmit, ...props }: BookChapterInputProps, + ref, + ) => { + return ( +
+ handleSearch(event.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + handleSubmit(); + } + handleKeyDown(e); + }} + onClick={handleOnClick} + ref={ref} + /> + { + // eslint-disable-next-line no-console + console.log('back in history'); + }} + /> +
+ ); + }, +); + +export default BookChapterInput; diff --git a/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-menu-item.component.tsx b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-menu-item.component.tsx new file mode 100644 index 0000000000..662452588a --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-chapter-control/book-menu-item.component.tsx @@ -0,0 +1,82 @@ +import { Canon } from '@sillsdev/scripture'; +import { PropsWithChildren, KeyboardEvent, forwardRef } from 'react'; +import { DropdownMenuItem as ShadDropdownMenuItem } from '@/components/shadcn-ui/dropdown-menu'; +import { cn } from '@/utils/shadcn-ui.util'; + +export type BookType = 'OT' | 'NT' | 'DC'; + +type BookMenuItemProps = PropsWithChildren<{ + /** String id of book */ + bookId: string; + /** Callback to run when a book menu item is selected */ + handleSelectBook: () => void; + /** Indicates if this menu item is currently selected */ + isSelected: boolean; + /** Function that is called upon highlighting a book in the dropdown menu */ + handleHighlightBook: () => void; + /** + * Function that is called on pressing a key + * + * @param event Event that contains information about the key stroke + */ + handleKeyDown: (event: KeyboardEvent) => void; + /** + * Type of book associated with this menu item, coordinates color labels ? Mock up has the labels + * coordinated to genre + */ + bookType: BookType; +}>; + +const BookMenuItem = forwardRef( + ( + { + bookId, + handleSelectBook, + isSelected, + handleHighlightBook, + handleKeyDown, + bookType, + children, + }: BookMenuItemProps, + ref, + ) => { + return ( + { + // preventDefault() here prevents the entire dropdown menu from closing when selecting this item + event.preventDefault(); + handleSelectBook(); + }} + onKeyDown={(event: KeyboardEvent) => { + handleKeyDown(event); + }} + onFocus={handleHighlightBook} + onMouseMove={handleHighlightBook} + > + + {Canon.bookIdToEnglishName(bookId)} + + {isSelected &&
{children}
} +
+ ); + }, +); + +export default BookMenuItem; diff --git a/lib/platform-bible-react/src/components/advanced/book-chapter-control/chapter-select.component.tsx b/lib/platform-bible-react/src/components/advanced/book-chapter-control/chapter-select.component.tsx new file mode 100644 index 0000000000..6a350a1fb9 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-chapter-control/chapter-select.component.tsx @@ -0,0 +1,74 @@ +import { cn } from '@/utils/shadcn-ui.util'; +import { useCallback } from 'react'; + +export type ChapterSelectProps = { + /** + * Callback to run when a chapter div is selected + * + * @param chapterNumber Number of the chapter that has been selected + */ + handleSelectChapter: (chapterNumber: number) => void; + /** The highest chapter number in the book (of course equal to number of chapters in the book) */ + endChapter: number; + /** The chapter number that is currently selected */ + activeChapter: number; + /** The chapter number that is currently highlighted using keyboard or mouse navigation */ + highlightedChapter: number; + /** + * Callback to run when a chapter is highlighted by the user + * + * @param chapterNumber The chapter that is highlighted + */ + handleHighlightedChapter: (chapterNumber: number) => void; +}; + +function ChapterSelect({ + handleSelectChapter, + endChapter, + activeChapter, + highlightedChapter, + handleHighlightedChapter, +}: ChapterSelectProps) { + const chapters = Array.from({ length: endChapter }, (_, i) => i + 1); + + const handleMouse = useCallback( + (chapterNumber: number) => { + handleHighlightedChapter(chapterNumber); + }, + [handleHighlightedChapter], + ); + + return ( +
+ {chapters.map((chapter) => ( +
{ + event.preventDefault(); + event.stopPropagation(); + handleSelectChapter(chapter); + }} + role="button" + onKeyDown={(event) => { + if (event.key === 'Enter') { + handleSelectChapter(chapter); + } + }} + tabIndex={0} + onMouseMove={() => handleMouse(chapter)} + > + {chapter} +
+ ))} +
+ ); +} + +export default ChapterSelect; diff --git a/lib/platform-bible-react/src/components/advanced/book-chapter-control/go-to-menu-item.component.tsx b/lib/platform-bible-react/src/components/advanced/book-chapter-control/go-to-menu-item.component.tsx new file mode 100644 index 0000000000..e8fc52df1f --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-chapter-control/go-to-menu-item.component.tsx @@ -0,0 +1,32 @@ +import { DropdownMenuLabel as ShadDropdownMenuLabel } from '@/components/shadcn-ui/dropdown-menu'; +import { Bookmark, Clock, ArrowDownWideNarrow } from 'lucide-react'; + +export type GoToMenuItemProps = { + handleSort: () => void; + handleLocationHistory: () => void; + handleBookmarks: () => void; +}; + +function GoToMenuItem({ handleSort, handleLocationHistory, handleBookmarks }: GoToMenuItemProps) { + return ( + +

Go To

+
+ + + +
+
+ ); +} + +export default GoToMenuItem; diff --git a/lib/platform-bible-react/src/components/advanced/book-selector.component.tsx b/lib/platform-bible-react/src/components/advanced/book-selector.component.tsx new file mode 100644 index 0000000000..17275ec53f --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/book-selector.component.tsx @@ -0,0 +1,123 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { Label } from '@/components/shadcn-ui/label'; +import { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group'; +import { Canon } from '@sillsdev/scripture'; +import { LocalizedStringValue } from 'platform-bible-utils'; +import { useState } from 'react'; +import ChapterRangeSelector, { + ChapterRangeSelectorProps, +} from '../basics/chapter-range-selector.component'; + +export enum BookSelectionMode { + CURRENT_BOOK = 'current book', + CHOOSE_BOOKS = 'choose books', +} + +/** + * Object containing all keys used for localization in this component. If you're using this + * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the + * localized strings and pass them into the localizedStrings prop of this component + */ +export const BOOK_SELECTOR_STRING_KEYS = Object.freeze([ + '%webView_bookSelector_currentBook%', + '%webView_bookSelector_choose%', + '%webView_bookSelector_chooseBooks%', +] as const); + +export type BookSelectorLocalizedStrings = { + [localizedInventoryKey in (typeof BOOK_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue; +}; + +/** + * Gets the localized value for the provided key + * + * @param strings Object containing localized string + * @param key Key for a localized string + * @returns The localized value for the provided key, if available. Returns the key if no localized + * value is available + */ +const localizeString = ( + strings: BookSelectorLocalizedStrings, + key: keyof BookSelectorLocalizedStrings, +) => { + return strings[key] ?? key; +}; + +type BookSelectorProps = ChapterRangeSelectorProps & { + handleBookSelectionModeChange: (newMode: BookSelectionMode) => void; + currentBookName: string; + onSelectBooks: () => void; + selectedBookIds: string[]; + localizedStrings: BookSelectorLocalizedStrings; +}; + +export default function BookSelector({ + handleBookSelectionModeChange, + currentBookName, + onSelectBooks, + selectedBookIds, + chapterCount, + endChapter, + handleSelectEndChapter, + startChapter, + handleSelectStartChapter, + localizedStrings, +}: BookSelectorProps) { + const currentBookText = localizeString(localizedStrings, '%webView_bookSelector_currentBook%'); + const chooseText = localizeString(localizedStrings, '%webView_bookSelector_choose%'); + const chooseBooksText = localizeString(localizedStrings, '%webView_bookSelector_chooseBooks%'); + + const [bookSelectionMode, setBookSelectionMode] = useState( + BookSelectionMode.CURRENT_BOOK, + ); + + const onSelectionModeChange = (newMode: BookSelectionMode) => { + setBookSelectionMode(newMode); + handleBookSelectionModeChange(newMode); + }; + + return ( + onSelectionModeChange(value as BookSelectionMode)} + > +
+
+
+ + +
+ +
+ +
+
+
+
+ + +
+ + +
+
+
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/data-table/data-table-column-toggle.component.tsx b/lib/platform-bible-react/src/components/advanced/data-table/data-table-column-toggle.component.tsx new file mode 100644 index 0000000000..353d53d085 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/data-table/data-table-column-toggle.component.tsx @@ -0,0 +1,50 @@ +import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'; +import { FilterIcon } from 'lucide-react'; +import { Table } from '@tanstack/react-table'; + +import { Button } from '@/components/shadcn-ui/button'; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuSeparator, +} from '@/components/shadcn-ui/dropdown-menu'; + +interface DataTableViewOptionsProps { + table: Table; +} + +function DataTableViewOptions({ table }: DataTableViewOptionsProps) { + return ( + + + + + + Toggle columns + + {table + .getAllColumns() + .filter((column) => column.getCanHide()) + .map((column) => { + return ( + column.toggleVisibility(!!value)} + > + {column.id} + + ); + })} + + + ); +} + +export default DataTableViewOptions; diff --git a/lib/platform-bible-react/src/components/advanced/data-table/data-table-pagination.component.tsx b/lib/platform-bible-react/src/components/advanced/data-table/data-table-pagination.component.tsx new file mode 100644 index 0000000000..3193e8b6f0 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/data-table/data-table-pagination.component.tsx @@ -0,0 +1,95 @@ +import { ChevronLeftIcon, ChevronRightIcon, ArrowLeftIcon, ArrowRightIcon } from 'lucide-react'; +import { Table } from '@tanstack/react-table'; + +import { Button } from '@/components/shadcn-ui/button'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/shadcn-ui/select'; + +interface DataTablePaginationProps { + table: Table; +} + +function DataTablePagination({ table }: DataTablePaginationProps) { + return ( +
+
+
+ {table.getFilteredSelectedRowModel().rows.length} of{' '} + {table.getFilteredRowModel().rows.length} row(s) selected +
+
+

Rows per page

+ +
+
+ Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()} +
+
+ + + + +
+
+
+ ); +} + +export default DataTablePagination; diff --git a/lib/platform-bible-react/src/components/advanced/data-table/data-table.component.tsx b/lib/platform-bible-react/src/components/advanced/data-table/data-table.component.tsx new file mode 100644 index 0000000000..f9fd00b950 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/data-table/data-table.component.tsx @@ -0,0 +1,151 @@ +import { useState } from 'react'; + +import { + ColumnFiltersState, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + SortingState, + ColumnDef as TSColumnDef, + Row as TSRow, + SortDirection as TSSortDirection, + Table as TSTable, + useReactTable, + VisibilityState, +} from '@tanstack/react-table'; + +import DataTableViewOptions from '@/components/advanced/data-table/data-table-column-toggle.component'; +import DataTablePagination from '@/components/advanced/data-table/data-table-pagination.component'; +import { Button } from '@/components/shadcn-ui/button'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/shadcn-ui/table'; + +export type ColumnDef = TSColumnDef; +export type RowContents = TSRow; +export type TableContents = TSTable; +export type SortDirection = TSSortDirection; + +interface DataTableProps { + columns: ColumnDef[]; + data: TData[]; + enablePagination?: boolean; + showPaginationControls?: boolean; + showColumnVisibilityControls?: boolean; + stickyHeader?: boolean; + onRowClickHandler?: (row: RowContents, table: TableContents) => void; +} + +/** + * Feature-rich table component that infuses our basic shadcn-based Table component with features + * from TanStack's React Table library + */ +function DataTable({ + columns, + data, + enablePagination = false, + showPaginationControls = false, + showColumnVisibilityControls = false, + stickyHeader = false, + onRowClickHandler = () => {}, +}: DataTableProps) { + const [sorting, setSorting] = useState([]); + const [columnFilters, setColumnFilters] = useState([]); + const [columnVisibility, setColumnVisibility] = useState({}); + const [rowSelection, setRowSelection] = useState({}); + + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + ...(enablePagination && { getPaginationRowModel: getPaginationRowModel() }), + onSortingChange: setSorting, + getSortedRowModel: getSortedRowModel(), + onColumnFiltersChange: setColumnFilters, + getFilteredRowModel: getFilteredRowModel(), + onColumnVisibilityChange: setColumnVisibility, + onRowSelectionChange: setRowSelection, + state: { + sorting, + columnFilters, + columnVisibility, + rowSelection, + }, + }); + + return ( +
+ {showColumnVisibilityControls && } + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? undefined + : flexRender(header.column.columnDef.header, header.getContext())} + + ); + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + onRowClickHandler(row, table)} + key={row.id} + data-state={row.getIsSelected() && 'selected'} + > + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) : ( + + + No results. + + + )} + +
+ {enablePagination && ( +
+ + +
+ )} + {enablePagination && showPaginationControls && } +
+ ); +} + +export default DataTable; diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/disable-button.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/disable-button.component.tsx new file mode 100644 index 0000000000..b2f6c81701 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/disable-button.component.tsx @@ -0,0 +1,48 @@ +import { Button, ButtonProps } from '@/components/shadcn-ui/button'; +import Spinner from '@/components/basics/spinner.component'; +import { cn } from '@/utils/shadcn-ui.util'; + +type DisableButtonProps = { + /** The disabling boolean value determines the state of the button. */ + isDisabling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; + +/** + * The DisableButton component is a button designed for initiating disabling of downloads. It + * includes visuals for active disabling and idle states. + * + * @param isDisabling The disabling boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to disable. + */ +export default function DisableButton({ + isDisabling, + handleClick, + className, + ...props +}: DisableButtonProps) { + return ( + + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/enable-button.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/enable-button.component.tsx new file mode 100644 index 0000000000..fadf01c854 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/enable-button.component.tsx @@ -0,0 +1,48 @@ +import { Button, ButtonProps } from '@/components/shadcn-ui/button'; +import Spinner from '@/components/basics/spinner.component'; +import { cn } from '@/utils/shadcn-ui.util'; + +type EnableButtonProps = { + /** The enabling boolean value determines the state of the button. */ + isEnabling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; + +/** + * The EnableButton component is a button designed for initiating enabling of downloads. It includes + * visuals for active enabling and idle states. + * + * @param isEnabling The enabling boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to enable. + */ +export default function EnableButton({ + isEnabling, + handleClick, + className, + ...props +}: EnableButtonProps) { + return ( + + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/filter-button.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/filter-button.component.tsx new file mode 100644 index 0000000000..5af7b01c33 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/filter-button.component.tsx @@ -0,0 +1,29 @@ +import { Filter, ChevronDown } from 'lucide-react'; +import { forwardRef } from 'react'; +import { Button } from '@/components/shadcn-ui/button'; + +/** + * The FilterButton component is a button designed for initiating filtering of data. It is designed + * to be used with the dropdown menu. It uses forwardRef to pass the button to the dropdown trigger + * asChild. + * + * @returns A button that can be used to filter. + */ +const FilterButton = forwardRef((props, ref) => { + return ( + + ); +}); + +export default FilterButton; diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/install-button.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/install-button.component.tsx new file mode 100644 index 0000000000..e716cd1b2a --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/install-button.component.tsx @@ -0,0 +1,56 @@ +import { Button, ButtonProps } from '@/components/shadcn-ui/button'; +import Spinner from '@/components/basics/spinner.component'; +import { cn } from '@/utils/shadcn-ui.util'; +import { Download } from 'lucide-react'; + +type InstallButtonProps = { + /** The installing boolean value determines the state of the button. */ + isInstalling: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; + /** Optional text for the button. */ + buttonText?: string; +} & ButtonProps; + +/** + * The InstallButton component is a button designed for initiating installs. It includes visuals for + * active installing and idle states. + * + * @param isInstalling The installing boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @param buttonText Optional text for the button. + * @returns A install button. + */ +export default function InstallButton({ + isInstalling, + handleClick, + buttonText, + className, + ...props +}: InstallButtonProps) { + return ( + + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/update-button.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/update-button.component.tsx new file mode 100644 index 0000000000..89cacb9a09 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/buttons/update-button.component.tsx @@ -0,0 +1,48 @@ +import { Button, ButtonProps } from '@/components/shadcn-ui/button'; +import Spinner from '@/components/basics/spinner.component'; +import { cn } from '@/utils/shadcn-ui.util'; + +type UpdateButtonProps = { + /** The updating boolean value determines the state of the button. */ + isUpdating: boolean; + /** The handleClick function is called when the button is clicked. */ + handleClick: () => void; +} & ButtonProps; + +/** + * The UpdateButton component is a button designed for initiating updates for downloaded extensions. + * It includes visuals for active updating and idle states. + * + * @param isUpdating The updating boolean value determines the state of the button. + * @param handleClick The handleClick function is called when the button is clicked. + * @returns A button that can be used to update. + */ +export default function UpdateButton({ + isUpdating, + handleClick, + className, + ...props +}: UpdateButtonProps) { + return ( + + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/filter-dropdown.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/filter-dropdown.component.tsx new file mode 100644 index 0000000000..9a446e9c8c --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/filter-dropdown.component.tsx @@ -0,0 +1,86 @@ +import { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuGroup, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuSeparator, +} from '@/components/shadcn-ui/dropdown-menu'; +import FilterButton from './buttons/filter-button.component'; + +export enum DropdownMenuItemType { + Check, + Radio, +} + +export type DropdownItem = { + /** The label is the text that will be displayed on the dropdown item. */ + label: string; + /** The itemType determines the DropdownMenuItemType type as either Check or Radio. */ + itemType: DropdownMenuItemType; + /** The onClick function is called when the item is clicked. */ + onClick: () => void; +}; + +export type DropdownGroup = { + /** + * The label is the text that will be displayed on the dropdown group. It is used to categorize + * the items in the group. + */ + label: string; + /** The items array contains the items that will be displayed in the dropdown group */ + items: DropdownItem[]; +}; + +export type FilterDropdownProps = { + /** Object unique identifier */ + id?: string; + /** The groups array contains the groups that will be displayed in the dropdown */ + groups: DropdownGroup[]; +}; // TODO: extend the props later + +/** + * The FilterDropdown component is a dropdown designed for filtering content. It includes groups of + * items that can be checkboxes or radio items. + * + * @param id Optional unique identifier + * @param groups The groups array contains the groups that will be displayed in the dropdown + * @returns A filter dropdown. + */ +export default function FilterDropdown({ id, groups }: FilterDropdownProps) { + return ( +
+ {/* TODO: remove this once the DropDown Menu shadcn has an id prop */} + + + + + + {groups.map((group) => ( +
+ {group.label} + + {group.items.map((item) => ( +
+ {item.itemType === DropdownMenuItemType.Check ? ( + + {item.label} + + ) : ( + + {item.label} + + )} +
+ ))} +
+ +
+ ))} +
+
+
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/footer.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/footer.component.tsx new file mode 100644 index 0000000000..a5d94ea064 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/footer.component.tsx @@ -0,0 +1,78 @@ +import { useMemo } from 'react'; +import { formatBytes } from 'platform-bible-utils'; +import VersionHistory, { VersionHistoryType } from './version-history.component'; + +/** Interface to store the parameters passed to the Footer component */ +interface FooterProps { + /** Optional unique identifier */ + id?: string; + /** Name of the publisher */ + publisherDisplayName: string; + /** Size of the extension file in bytes */ + fileSize: number; + /** List of language codes supported by the extension */ + locales: string[]; + /** Object containing the version history mapped with their information */ + versionHistory: VersionHistoryType; +} + +/** + * Component to render the footer for the extension details which contains information on the + * publisher, version history, languages, and file size. + * + * @param id Optional unique identifier + * @param publisherDisplayName Name of the publisher + * @param fileSize Size of the extension file in bytes + * @param locales List of language codes supported by the extension + * @param versionHistory Object containing the version history mapped with their information + * @returns The rendered Footer component + */ +export default function Footer({ + id, + publisherDisplayName, + fileSize, + locales, + versionHistory, +}: FooterProps) { + /** Formats the file size into a human-readable format */ + const formattedFileSize = useMemo(() => formatBytes(fileSize), [fileSize]); + + /** + * This function gets the display names of the languages based on the language codes. + * + * @param codes The list of language codes + * @returns The list of language names + */ + const getLanguageNames = (codes: string[]) => { + const displayNames = new Intl.DisplayNames(navigator.language, { type: 'language' }); + return codes.map((code) => displayNames.of(code)); + }; + + const languageNames = getLanguageNames(locales); + + return ( +
+
+ +
+
+

Information

+
+

+ Publisher + {publisherDisplayName} + Size + {formattedFileSize} +

+
+

+ Languages + {languageNames.join(', ')} +

+
+
+
+
+
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/markdown-renderer.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/markdown-renderer.component.tsx new file mode 100644 index 0000000000..2c531987d8 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/markdown-renderer.component.tsx @@ -0,0 +1,24 @@ +import Markdown from 'markdown-to-jsx'; + +interface MarkdownRendererProps { + /** Optional unique identifier */ + id?: string; + /** The markdown string to render */ + markdown: string; +} + +/** + * This component renders markdown content given a markdown string. It uses typography styles from + * the platform. + * + * @param markdown The markdown string to render. + * @param id Optional unique identifier + * @returns A div containing the rendered markdown content. + */ +export default function MarkdownRenderer({ id, markdown }: MarkdownRendererProps) { + return ( +
+ {markdown} +
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/more-info.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/more-info.component.tsx new file mode 100644 index 0000000000..707e980889 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/more-info.component.tsx @@ -0,0 +1,119 @@ +import { CircleHelp, Link as LucideLink, User } from 'lucide-react'; +import { NumberFormat } from 'platform-bible-utils'; + +/** Interface that stores the parameters passed to the More Info component */ +interface MoreInfoProps { + /** Optional unique identifier */ + id?: string; + /** The category of the extension */ + category: string; + /** The number of downloads for the extension */ + downloads: Record; + /** The languages supported by the extension */ + languages: string[]; + /** The URL to the more info page of the extension */ + moreInfoUrl: string; +} +/** + * This component displays the more info section of the extension which includes the category, + * number of downloads, languages, and links to the website and support + * + * @param id Optional unique identifier + * @param category The category of the extension + * @param downloads The number of downloads for the extension + * @param languages The languages supported by the extension + * @param moreInfoUrl The URL to the more info page of the extension + * @returns {JSX.Element} - Returns the more info component that displays the category, number of + * downloads, languages, and links to the website and support + */ +export default function MoreInfo({ + id, + category, + downloads, + languages, + moreInfoUrl, +}: MoreInfoProps) { + /** + * This constant formats the number of downloads into a more readable format. + * + * @example 1000 -> 1K + * + * @example 1000000 -> 1M + * + * @returns The formatted number of downloads + */ + const numberFormatted = new NumberFormat('en', { + notation: 'compact', + compactDisplay: 'short', + }).format(Object.values(downloads).reduce((a: number, b: number) => a + b, 0)); + + /** This function scrolls the window to the bottom of the page. */ + const handleScrollToBottom = () => { + window.scrollTo(0, document.body.scrollHeight); + }; + + return ( +
+
+
+ {category} +
+ CATEGORY +
+
+
+
+ + {numberFormatted} +
+ USERS +
+
+
+
+ {languages.slice(0, 3).map((locale) => ( + + {locale.toUpperCase()} + + ))} +
+ {languages.length > 3 && ( + + )} +
+ + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/no-extensions-found.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/no-extensions-found.component.tsx new file mode 100644 index 0000000000..19093407fb --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/no-extensions-found.component.tsx @@ -0,0 +1,22 @@ +interface NoExtensionsFoundProps { + /** Optional unique identifier */ + id?: string; + /** The message to display */ + message: string; +} +/** + * This component displays a message to the user when no extensions are found in the marketplace. + * + * @param id Optional unique identifier + * @param message The message to display. + * @returns {JSX.Element} - Returns the message component that displays the message to the user. + */ +export default function NoExtensionsFound({ id, message }: NoExtensionsFoundProps) { + return ( +
+
+

{message}

+
+
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/extension-marketplace/version-history.component.tsx b/lib/platform-bible-react/src/components/advanced/extension-marketplace/version-history.component.tsx new file mode 100644 index 0000000000..1067c9536a --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/extension-marketplace/version-history.component.tsx @@ -0,0 +1,93 @@ +import { useState } from 'react'; + +export type VersionInformation = { + /** Date the version was published */ + date: string; + /** Description of the changes in the version */ + description: string; +}; + +/** Type to store the version history information */ +export type VersionHistoryType = Record; + +/** Interface that stores the parameters passed to the Version History component */ +interface VersionHistoryProps { + /** Optional unique identifier */ + id?: string; + /** Object containing the versions mapped with their information */ + versionHistory: VersionHistoryType; +} + +/** + * Component to render the version history information shown in the footer component. Lists the 5 + * most recent versions, with the options to show all versions by pressing a button. + * + * @param versionHistory Object containing the versions mapped with their information + * @param id Optional unique identifier + * @returns Rendered version history for the Footer component + */ +export default function VersionHistory({ id, versionHistory }: VersionHistoryProps) { + const [showAllVersions, setShowAllVersions] = useState(false); + const currentDate = new Date(); + + /** + * Function to format the time string for the version history in the form of 'X year(s) ago'. + * + * @param dateString ISO Date string to determine the time string from + * @returns Formatted time string + */ + function formatTimeString(dateString: string) { + const date = new Date(dateString); + const dateDiff = new Date(currentDate.getTime() - date.getTime()); + const yearDiff = dateDiff.getUTCFullYear() - 1970; + const monthDiff = dateDiff.getUTCMonth(); + const dayDiff = dateDiff.getUTCDate() - 1; + + // Determines how long ago the version was published + let timeString = ''; + if (yearDiff > 0) { + timeString = `${yearDiff.toString()} year${yearDiff === 1 ? '' : 's'} ago`; + } else if (monthDiff > 0) { + timeString = `${monthDiff.toString()} month${monthDiff === 1 ? '' : 's'} ago`; + } else if (dayDiff === 0) { + timeString = 'today'; + } else { + timeString = `${dayDiff.toString()} day${dayDiff === 1 ? '' : 's'} ago`; + } + + return timeString; + } + + // Sorts the version history by version number + const sortedEntries = Object.entries(versionHistory).sort((a, b) => b[0].localeCompare(a[0])); + + return ( +
+

What`s New

+
    + {(showAllVersions ? sortedEntries : sortedEntries.slice(0, 5)).map((entry) => ( +
    +
    +
  • + {entry[1].description} +
  • +
    +
    +
    Version {entry[0]}
    +
    {formatTimeString(entry[1].date)}
    +
    +
    + ))} +
+ {sortedEntries.length > 5 && ( + + )} +
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/inventory/inventory-columns.tsx b/lib/platform-bible-react/src/components/advanced/inventory/inventory-columns.tsx new file mode 100644 index 0000000000..6fe6dbe563 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/inventory/inventory-columns.tsx @@ -0,0 +1,92 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group'; +import { CircleCheckIcon, CircleHelpIcon, CircleXIcon } from 'lucide-react'; +import { ColumnDef } from '../data-table/data-table.component'; +import { getSortingIcon, ItemData, Status } from './inventory.component'; + +/** + * Function that creates the item column for inventories + * + * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.) + * @returns Column that shows the inventory items. Should be used with the DataTable component + */ +export const inventoryItemColumn = (itemLabel: string): ColumnDef => { + return { + accessorKey: 'item', + header: ({ column }) => ( + + ), + }; +}; + +/** + * Function that creates the count column for inventories. Should be used with the DataTable + * component. + * + * @param itemLabel Localized label for the count column + * @returns Column that shows the number of occurrences of the related inventory items + */ +export const inventoryCountColumn = (countLabel: string): ColumnDef => { + return { + accessorKey: 'count', + header: ({ column }) => ( +
+ +
+ ), + cell: ({ row }) =>
{row.getValue('count')}
, + }; +}; + +/** + * Function that creates the status column for inventories. Should be used with the DataTable + * component. + * + * @param itemLabel Localized label for the status column + * @param statusChangeHandler Callback function that handles status updates to selected item(s) + * @returns Column that shows the status of the related inventory items. + */ +export const inventoryStatusColumn = ( + statusLabel: string, + statusChangeHandler: (items: string[], status: Status) => void, +): ColumnDef => { + return { + accessorKey: 'status', + header: ({ column }) => { + return ( +
+ +
+ ); + }, + cell: ({ row }) => { + const status: Status = row.getValue('status'); + const item: string = row.getValue('item'); + return ( + + statusChangeHandler([item], 'approved')} value="approved"> + + + statusChangeHandler([item], 'unapproved')} + value="unapproved" + > + + + statusChangeHandler([item], 'unknown')} value="unknown"> + + + + ); + }, + }; +}; diff --git a/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.test.ts b/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.test.ts new file mode 100644 index 0000000000..28466fb1b7 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.test.ts @@ -0,0 +1,49 @@ +import { extractNumberFromUSFM, getLinesFromUSFM } from './inventory-utils'; + +test('Extract lines from USFM string', async () => { + const input: string = `Input text line 1\nThis is line 2\\v This is line 3\\c This is line 4\\id This is line 5\nThis is line 6 +This is line 7\rThis is line 8`; + const lines: string[] = getLinesFromUSFM(input); + expect(lines).toEqual([ + 'Input text line 1', + 'This is line 2', + '\\v This is line 3', + '\\c This is line 4', + '\\id This is line 5', + 'This is line 6', + 'This is line 7', + 'This is line 8', + ]); +}); + +test('Extract number from USFM verse string', async () => { + const input: string = + '\\v 1 Dis letta from Peter. Jesus Christ wen sen me all ova da place fo tell peopo da Good Stuff from him.'; + const number: number | undefined = extractNumberFromUSFM(input); + expect(number).toEqual(1); +}); + +test('Extract number from USFM chapter string', async () => { + const input: string = '\\c 3'; + const number: number | undefined = extractNumberFromUSFM(input); + expect(number).toEqual(3); +}); + +test('Extract number from USFM chapter string with value of 0', async () => { + const input: string = '\\c 0'; + const number: number | undefined = extractNumberFromUSFM(input); + expect(number).toEqual(0); +}); + +test('Unsuccessfully trying to extract number from USFM string', async () => { + const input: string = '\\c There is no number here'; + const number: number | undefined = extractNumberFromUSFM(input); + expect(number).toEqual(undefined); +}); + +test('Unsuccessfully trying to extract number from random string', async () => { + const input: string = + 'This string does not contain a chapter or verse marker followed by a number'; + const number: number | undefined = extractNumberFromUSFM(input); + expect(number).toEqual(undefined); +}); diff --git a/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.ts b/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.ts new file mode 100644 index 0000000000..5332450b60 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/inventory/inventory-utils.ts @@ -0,0 +1,26 @@ +/** + * Splits USFM string into shorter line-like segments + * + * @param text A single (likely very large) USFM string + * @returns An array containing the input text, split into shorter segments + */ +export const getLinesFromUSFM = (text: string) => { + // Splits on (CR)LF, CR, \v, \c and \id + return text.split(/(?:\r?\n|\r)|(?=(?:\\(?:v|c|id)))/g); +}; + +/** + * Extracts chapter or verse number from USFM strings that start with a chapter or verse marker + * + * @param text USFM string + * @returns Chapter or verse number if one is found. Else returns 0. + */ +export const extractNumberFromUSFM = (text: string): number | undefined => { + // Captures all digits that follow \v or \c markers followed by whitespace located at the start of a string + const regex = /^\\[vc]\s+(\d+)/; + const match = text.match(regex); + if (match) { + return +match[1]; + } + return undefined; +}; diff --git a/lib/platform-bible-react/src/components/advanced/inventory/inventory.component.tsx b/lib/platform-bible-react/src/components/advanced/inventory/inventory.component.tsx new file mode 100644 index 0000000000..6d2198380c --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/inventory/inventory.component.tsx @@ -0,0 +1,352 @@ +import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; +import { LocalizedStringValue, ScriptureReference } from 'platform-bible-utils'; +import { Input } from '@/components/shadcn-ui/input'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/shadcn-ui/select'; +import DataTable, { + ColumnDef, + RowContents, + SortDirection, + TableContents, +} from '@/components/advanced/data-table/data-table.component'; +import OccurrencesTable from '@/components/advanced/inventory/occurrences-table.component'; +import { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from 'lucide-react'; + +/** + * Object containing all keys used for localization in this component. If you're using this + * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the + * localized strings and pass them into the localizedStrings prop of this component + */ +export const INVENTORY_STRING_KEYS = Object.freeze([ + '%webView_inventory_all%', + '%webView_inventory_approved%', + '%webView_inventory_unapproved%', + '%webView_inventory_unknown%', + '%webView_inventory_scope_currentBook%', + '%webView_inventory_scope_chapter%', + '%webView_inventory_scope_verse%', + '%webView_inventory_filter_text%', + '%webView_inventory_occurrences_table_header_reference%', + '%webView_inventory_occurrences_table_header_occurrence%', +] as const); + +export type InventoryLocalizedStrings = { + [localizedInventoryKey in (typeof INVENTORY_STRING_KEYS)[number]]?: LocalizedStringValue; +}; + +export type Scope = 'book' | 'chapter' | 'verse'; + +export type Status = 'approved' | 'unapproved' | 'unknown'; + +export type StatusFilter = Status | 'all'; + +export type ItemData = { + item: string; + count: number; + status: Status; +}; + +/** + * Gets an icon that indicates the current sorting direction based on the provided input + * + * @param sortDirection Sorting direction. Can be ascending ('asc'), descending ('desc') or false ( + * i.e. not sorted) + * @returns The appropriate sorting icon for the provided sorting direction + */ +export const getSortingIcon = (sortDirection: false | SortDirection): ReactNode => { + if (sortDirection === 'asc') { + return ; + } + if (sortDirection === 'desc') { + return ; + } + return ; +}; + +/** + * Filters data that is shown in the DataTable section of the inventory + * + * @param items All items and their related information + * @param statusFilter Allows filtering by status (i.e. show all items, or only items that are + * 'approved', 'unapproved' or 'unknown') + * @param textFilter Allows filtering by text. All items that include the filter text will be + * selected. + * @returns Array of items and their related information that are matched by the specified filters + */ +const filterItemData = ( + items: ItemData[], + statusFilter: StatusFilter, + textFilter: string, +): ItemData[] => { + let filteredItemData: ItemData[] = items; + + if (statusFilter !== 'all') { + filteredItemData = filteredItemData.filter( + (item) => + (statusFilter === 'approved' && item.status === 'approved') || + (statusFilter === 'unapproved' && item.status === 'unapproved') || + (statusFilter === 'unknown' && item.status === 'unknown'), + ); + } + + if (textFilter !== '') + filteredItemData = filteredItemData.filter((item) => item.item.includes(textFilter)); + + return filteredItemData; +}; + +/** + * Turns scripture text into array of inventory items, along with their count and status + * + * @param text Scripture text from which the inventory items are extracted + * @param getInventoryItems Function that provides logic for extracting inventory items from text + * @param getStatusForItem Function that gets status for inventory item from related project + * settings + * @returns Array of inventory items, along with their count and status + */ +const convertTextToItemData = ( + text: string, + getInventoryItems: (text: string) => string[], + getStatusForItem: (item: string) => Status, +): ItemData[] => { + const itemData: ItemData[] = []; + + const items: string[] = getInventoryItems(text); + + for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { + const item = items[itemIndex]; + const existingItem = itemData.find((entry) => { + return entry.item === item; + }); + if (existingItem) { + existingItem.count += 1; + } else { + const newItem: ItemData = { + item, + count: 1, + status: getStatusForItem(item), + }; + itemData.push(newItem); + } + } + + return itemData; +}; + +/** + * Gets the localized value for the provided key + * + * @param strings Object containing localized string + * @param key Key for a localized string + * @returns The localized value for the provided key, if available. Returns the key if no localized + * value is available + */ +const localizeString = ( + strings: InventoryLocalizedStrings, + key: keyof InventoryLocalizedStrings, +) => { + return strings[key] ?? key; +}; + +type InventoryProps = { + scriptureReference: ScriptureReference; + setScriptureReference: (scriptureReference: ScriptureReference) => void; + localizedStrings: InventoryLocalizedStrings; + extractItems: (text: string, item?: string | undefined) => string[]; + approvedItems: string[]; + onApprovedItemsChange: (items: string[]) => void; + unapprovedItems: string[]; + onUnapprovedItemsChange: (items: string[]) => void; + text: string | undefined; + scope: Scope; + onScopeChange: (scope: Scope) => void; + getColumns: ( + onStatusChange: (newItems: string[], status: Status) => void, + ) => ColumnDef[]; +}; + +/** Inventory component that is used to view and control the status of provided project settings */ +export default function Inventory({ + scriptureReference, + setScriptureReference, + localizedStrings, + extractItems, + approvedItems, + onApprovedItemsChange, + unapprovedItems, + onUnapprovedItemsChange, + text, + scope, + onScopeChange, + getColumns, +}: InventoryProps) { + const allItemsText = localizeString(localizedStrings, '%webView_inventory_all%'); + const approvedItemsText = localizeString(localizedStrings, '%webView_inventory_approved%'); + const unapprovedItemsText = localizeString(localizedStrings, '%webView_inventory_unapproved%'); + const unknownItemsText = localizeString(localizedStrings, '%webView_inventory_unknown%'); + const scopeBookText = localizeString(localizedStrings, '%webView_inventory_scope_currentBook%'); + const scopeChapterText = localizeString(localizedStrings, '%webView_inventory_scope_chapter%'); + const scopeVerseText = localizeString(localizedStrings, '%webView_inventory_scope_verse%'); + const filterText = localizeString(localizedStrings, '%webView_inventory_filter_text%'); + + const [items, setItems] = useState([]); + const [statusFilter, setStatusFilter] = useState('all'); + const [textFilter, setTextFilter] = useState(''); + const [selectedItem, setSelectedItem] = useState(''); + + const statusChangeHandler = useCallback( + (changedItems: string[], status: Status) => { + setItems((prevTableData) => { + let tableData: ItemData[] = []; + changedItems.forEach((item) => { + tableData = prevTableData.map((tableEntry) => { + if (tableEntry.item === item && tableEntry.status !== status) + return { ...tableEntry, status }; + return tableEntry; + }); + }); + return tableData; + }); + + let newApprovedItems: string[] = [...approvedItems]; + changedItems.forEach((item) => { + if (status === 'approved') { + if (!newApprovedItems.includes(item)) { + newApprovedItems.push(item); + } + } else { + newApprovedItems = newApprovedItems.filter((validItem) => validItem !== item); + } + }); + onApprovedItemsChange(newApprovedItems); + + let newUnapprovedItems: string[] = [...unapprovedItems]; + changedItems.forEach((item) => { + if (status === 'unapproved') { + if (!newUnapprovedItems.includes(item)) { + newUnapprovedItems.push(item); + } + } else { + newUnapprovedItems = newUnapprovedItems.filter( + (unapprovedItem) => unapprovedItem !== item, + ); + } + }); + onUnapprovedItemsChange(newUnapprovedItems); + }, + [approvedItems, onApprovedItemsChange, unapprovedItems, onUnapprovedItemsChange], + ); + + const getStatusForItem = useCallback( + (item: string): Status => { + if (approvedItems.includes(item)) return 'approved'; + if (unapprovedItems.includes(item)) return 'unapproved'; + return 'unknown'; + }, + [approvedItems, unapprovedItems], + ); + + useEffect(() => { + if (!text) return; + setItems(convertTextToItemData(text, extractItems, getStatusForItem)); + }, [extractItems, text, getStatusForItem]); + + const filteredItemData = useMemo(() => { + return filterItemData(items, statusFilter, textFilter); + }, [items, statusFilter, textFilter]); + + useEffect(() => { + setSelectedItem(''); + }, [filteredItemData]); + + const rowClickHandler = (row: RowContents, table: TableContents) => { + table.toggleAllRowsSelected(false); // this is pretty hacky, and also prevents us from selecting multiple rows + row.toggleSelected(undefined); + + setSelectedItem(row.getValue('item')); + }; + + const columns = useMemo(() => getColumns(statusChangeHandler), [getColumns, statusChangeHandler]); + + const handleScopeChange = (value: string) => { + if (value === 'book' || value === 'chapter' || value === 'verse') { + onScopeChange(value); + } else { + throw new Error(`Invalid scope value: ${value}`); + } + }; + + const handleStatusFilterChange = (value: string) => { + if (value === 'all' || value === 'approved' || value === 'unapproved' || value === 'unknown') { + setStatusFilter(value); + } else { + throw new Error(`Invalid status filter value: ${value}`); + } + }; + + return ( +
+
+ + + { + setTextFilter(event.target.value); + }} + /> +
+
+ +
+ {selectedItem !== '' && ( +
+ + setScriptureReference(newScriptureReference) + } + localizedStrings={localizedStrings} + /> +
+ )} +
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/inventory/occurrences-table.component.tsx b/lib/platform-bible-react/src/components/advanced/inventory/occurrences-table.component.tsx new file mode 100644 index 0000000000..051ede77b1 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/inventory/occurrences-table.component.tsx @@ -0,0 +1,124 @@ +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/shadcn-ui/table'; +import { Canon } from '@sillsdev/scripture'; +import { LanguageStrings, ScriptureReference } from 'platform-bible-utils'; +import { useEffect, useState } from 'react'; +import { extractNumberFromUSFM, getLinesFromUSFM } from './inventory-utils'; + +type SearchResult = { + reference: ScriptureReference; + snippet: string; + key: number; +}; + +const extractOccurrences = ( + text: string | undefined, + item: string, + extractItems: (text: string, item?: string | undefined) => string[], + scriptureRef: ScriptureReference, +): SearchResult[] => { + if (!text || text === '' || item === '') return []; + + const results: SearchResult[] = []; + const lines = getLinesFromUSFM(text); + + let currentChapter: number | undefined = scriptureRef.chapterNum; + let currentVerse: number | undefined = scriptureRef.verseNum; + let key: number = 0; + + lines.forEach((line) => { + if (line.startsWith('\\id')) { + currentChapter = 0; + currentVerse = 0; + } + if (line.startsWith('\\c')) { + currentChapter = extractNumberFromUSFM(line); + currentVerse = 0; + } + if (line.startsWith('\\v')) { + currentVerse = extractNumberFromUSFM(line); + if (currentChapter === 0) { + currentChapter = scriptureRef.chapterNum; + } + } + + const items: string[] = extractItems(line, item); + + for (let i = 0; i < items.length; i++) { + const result: SearchResult = { + reference: { + ...scriptureRef, + chapterNum: currentChapter !== undefined ? +currentChapter : -1, + verseNum: currentVerse !== undefined ? +currentVerse : -1, + }, + snippet: line, + key, + }; + key += 1; + results.push(result); + } + }); + + return results; +}; + +type OccurrencesTableProps = { + selectedItem: string; + text: string | undefined; + extractItems: (text: string, item?: string | undefined) => string[]; + scriptureReference: ScriptureReference; + setScriptureReference: (scriptureReference: ScriptureReference) => void; + localizedStrings: LanguageStrings; +}; + +function OccurrencesTable({ + selectedItem, + text, + extractItems, + scriptureReference, + setScriptureReference, + localizedStrings, +}: OccurrencesTableProps) { + const reference = localizedStrings['%webView_inventory_occurrences_table_header_reference%']; + const occurrence = localizedStrings['%webView_inventory_occurrences_table_header_occurrence%']; + const [tableData, setTableData] = useState( + extractOccurrences(text, selectedItem, extractItems, scriptureReference), + ); + + useEffect( + () => setTableData(extractOccurrences(text, selectedItem, extractItems, scriptureReference)), + [text, selectedItem, scriptureReference, extractItems], + ); + + return ( + + + + {reference} + {occurrence} + + + + {tableData.map((result) => ( + { + setScriptureReference(result.reference); + }} + > + {`${Canon.bookNumberToEnglishName(result.reference.bookNum)} ${result.reference.chapterNum}:${result.reference.verseNum}`} + {result.snippet} + + ))} + +
+ ); +} + +export default OccurrencesTable; diff --git a/lib/platform-bible-react/src/components/advanced/navigation-content-search.component.tsx b/lib/platform-bible-react/src/components/advanced/navigation-content-search.component.tsx new file mode 100644 index 0000000000..7fa1160831 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/navigation-content-search.component.tsx @@ -0,0 +1,70 @@ +import SearchBar from '@/components/basics/search-bar.component'; +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; +import { ReactNode } from 'react'; + +export type TabKeyValueContent = { + key: string; + value: string; + content: ReactNode; +}; + +export type NavigationContentSearchProps = { + /** List of values and keys for each tab this component should provide */ + tabList: TabKeyValueContent[]; + + /** Handler to run when the value of the search bar changes */ + onSearch: (searchQuery: string) => void; + + /** Optional placeholder for the search bar */ + searchPlaceholder?: string; + + /** Optional title to include in the header */ + headerTitle?: string; + + /** Optional flag to make the search bar appear full width */ + isSearchBarFullWidth?: boolean; + + /** Text direction ltr or rtl */ + direction?: 'ltr' | 'rtl'; +}; + +export default function NavigationContentSearch({ + tabList, + onSearch, + searchPlaceholder, + headerTitle, + isSearchBarFullWidth = false, + direction = 'ltr', +}: NavigationContentSearchProps) { + return ( +
+
+ {headerTitle ?

{headerTitle}

: ''} + +
+ + + {tabList.map((tab) => ( + + {tab.value} + + ))} + + {tabList.map((tab) => ( + + {tab.content} + + ))} + +
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css new file mode 100644 index 0000000000..e153993e33 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css @@ -0,0 +1,7 @@ +.banded-row:hover { + cursor: pointer; +} + +.banded-row[data-state="selected"]:hover { + cursor: default; +} diff --git a/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx new file mode 100644 index 0000000000..315a540035 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx @@ -0,0 +1,495 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/shadcn-ui/select'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/shadcn-ui/table'; +import { cn } from '@/utils/shadcn-ui.util'; +import { Canon } from '@sillsdev/scripture'; +import { + Cell, + ColumnDef, + flexRender, + getCoreRowModel, + getExpandedRowModel, + getGroupedRowModel, + getSortedRowModel, + GroupingState, + Row, + RowSelectionState, + SortingState, + useReactTable, +} from '@tanstack/react-table'; +import '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css'; +import { + compareScrRefs, + formatScrRef, + ScriptureSelection, + scrRefToBBBCCCVVV, +} from 'platform-bible-utils'; +import { MouseEvent, useEffect, useMemo, useState } from 'react'; +import { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react'; + +/** + * Information (e.g., a checking error or some other type of "transient" annotation) about something + * noteworthy at a specific place in an instance of the Scriptures. + */ +export type ScriptureItemDetail = ScriptureSelection & { + /** + * Text of the error, note, etc. In the future, we might want to support something more than just + * text so that a JSX element could be provided with a link or some other controls related to the + * issue being reported. + */ + detail: string; +}; + +/** + * A uniquely identifiable source of results that can be displayed in the ScriptureResultsViewer. + * Generally, the source will be a particular Scripture check, but there may be other types of + * sources. + */ +export type ResultsSource = { + /** + * Uniquely identifies the source. + * + * @type {string} + */ + id: string; + + /** + * Name (potentially localized) of the source, suitable for display in the UI. + * + * @type {string} + */ + displayName: string; +}; + +export type ScriptureSrcItemDetail = ScriptureItemDetail & { + /** Source/type of detail. Can be used for grouping. */ + source: ResultsSource; +}; + +/** + * Represents a set of results keyed by Scripture reference. Generally, the source will be a + * particular Scripture check, but this type also allows for other types of uniquely identifiable + * sources. + */ +export type ResultsSet = { + /** + * The backing source associated with this set of results. + * + * @type {ResultsSource} + */ + source: ResultsSource; + + /** + * Array of Scripture item details (messages keyed by Scripture reference). + * + * @type {ScriptureItemDetail[]} + */ + data: ScriptureItemDetail[]; +}; + +const scrBookColId = 'scrBook'; +const scrRefColId = 'scrRef'; +const typeColId = 'source'; +const detailsColId = 'details'; + +const defaultScrRefColumnName = 'Scripture Reference'; +const defaultScrBookGroupName = 'Scripture Book'; +const defaultTypeColumnName = 'Type'; +const defaultDetailsColumnName = 'Details'; + +export type ScriptureResultsViewerColumnInfo = { + /** Optional header to display for the Reference column. Default value: 'Scripture Reference'. */ + scriptureReferenceColumnName?: string; + + /** Optional text to display to refer to the Scripture book group. Default value: 'Scripture Book'. */ + scriptureBookGroupName?: string; + + /** Optional header to display for the Type column. Default value: 'Type'. */ + typeColumnName?: string; + + /** Optional header to display for the Details column. Default value: 'Details' */ + detailsColumnName?: string; +}; + +export type ScriptureResultsViewerProps = ScriptureResultsViewerColumnInfo & { + /** Groups of ScriptureItemDetail objects from particular sources (e.g., Scripture checks) */ + sources: ResultsSet[]; + + /** Flag indicating whether to display column headers. Default is false. */ + showColumnHeaders?: boolean; + + /** Flag indicating whether to display source column. Default is false. */ + showSourceColumn?: boolean; + + /** Callback function to notify when a row is selected */ + onRowSelected?: (selectedRow: ScriptureSrcItemDetail | undefined) => void; + + /** Text direction ltr or rtl */ + direction?: 'ltr' | 'rtl'; +}; + +function getColumns( + colInfo?: ScriptureResultsViewerColumnInfo, + showSourceColumn?: boolean, +): ColumnDef[] { + const showSrcCol = showSourceColumn ?? false; + return [ + { + accessorFn: (row) => + `${Canon.bookNumberToId(row.start.bookNum)} ${row.start.chapterNum}:${row.start.verseNum}`, + id: scrBookColId, + header: colInfo?.scriptureReferenceColumnName ?? defaultScrRefColumnName, + cell: (info) => { + const row = info.row.original; + if (info.row.getIsGrouped()) { + return Canon.bookNumberToEnglishName(row.start.bookNum); + } + return info.row.groupingColumnId === scrBookColId ? formatScrRef(row.start) : undefined; + }, + getGroupingValue: (row) => row.start.bookNum, + sortingFn: (a, b) => { + return compareScrRefs(a.original.start, b.original.start); + }, + enableGrouping: true, + }, + { + accessorFn: (row) => formatScrRef(row.start), + id: scrRefColId, + header: undefined, + cell: (info) => { + const row = info.row.original; + return info.row.getIsGrouped() ? undefined : formatScrRef(row.start); + }, + sortingFn: (a, b) => { + return compareScrRefs(a.original.start, b.original.start); + }, + enableGrouping: false, + }, + { + accessorFn: (row) => row.source.displayName, + id: typeColId, + header: showSrcCol ? (colInfo?.typeColumnName ?? defaultTypeColumnName) : undefined, + cell: (info) => (showSrcCol || info.row.getIsGrouped() ? info.getValue() : undefined), + getGroupingValue: (row) => row.source.id, + sortingFn: (a, b) => + a.original.source.displayName.localeCompare(b.original.source.displayName), + enableGrouping: true, + }, + { + accessorFn: (row) => row.detail, + id: detailsColId, + header: colInfo?.detailsColumnName ?? defaultDetailsColumnName, + cell: (info) => info.getValue(), + enableGrouping: false, + }, + ]; +} + +const toRefOrRange = (scriptureSelection: ScriptureSelection) => { + if (!('offset' in scriptureSelection.start)) + throw new Error('No offset available in range start'); + if (scriptureSelection.end && !('offset' in scriptureSelection.end)) + throw new Error('No offset available in range end'); + const { offset: offsetStart } = scriptureSelection.start; + let offsetEnd: number = 0; + if (scriptureSelection.end) ({ offset: offsetEnd } = scriptureSelection.end); + if ( + !scriptureSelection.end || + compareScrRefs(scriptureSelection.start, scriptureSelection.end) === 0 + ) + return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}`; + return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}-${scrRefToBBBCCCVVV(scriptureSelection.end)}+${offsetEnd}`; +}; + +const getRowKey = (row: ScriptureSrcItemDetail) => + `${toRefOrRange({ start: row.start, end: row.end })} ${row.source.displayName} ${row.detail}`; + +/** + * Component to display a combined list of detailed items from one or more sources, where the items + * are keyed primarily by Scripture reference. This is particularly useful for displaying a list of + * results from Scripture checks, but more generally could be used to display any "results" from any + * source(s). The component allows for grouping by Scripture book, source, or both. By default, it + * displays somewhat "tree-like" which allows it to be more horizontally compact and intuitive. But + * it also has the option of displaying as a traditional table with column headings (with or without + * the source column showing). + */ +export default function ScriptureResultsViewer({ + sources, + showColumnHeaders = false, + showSourceColumn = false, + scriptureReferenceColumnName, + scriptureBookGroupName, + typeColumnName, + detailsColumnName, + onRowSelected, + direction = 'ltr', +}: ScriptureResultsViewerProps) { + const [grouping, setGrouping] = useState([]); + const [sorting, setSorting] = useState([{ id: scrBookColId, desc: false }]); + const [rowSelection, setRowSelection] = useState({}); + + const scriptureResults = useMemo( + () => + sources.flatMap((source) => { + return source.data.map((item) => ({ + ...item, + source: source.source, + })); + }), + [sources], + ); + + const columns = useMemo( + () => + getColumns( + { + scriptureReferenceColumnName, + typeColumnName, + detailsColumnName, + }, + showSourceColumn, + ), + [scriptureReferenceColumnName, typeColumnName, detailsColumnName, showSourceColumn], + ); + + useEffect(() => { + // Ensure sorting is applied correctly when grouped by type + if (grouping.includes(typeColId)) { + setSorting([ + { id: typeColId, desc: false }, + { id: scrBookColId, desc: false }, + ]); + } else { + setSorting([{ id: scrBookColId, desc: false }]); + } + }, [grouping]); + + const table = useReactTable({ + data: scriptureResults, + columns, + state: { + grouping, + sorting, + rowSelection, + }, + onGroupingChange: setGrouping, + onSortingChange: setSorting, + onRowSelectionChange: setRowSelection, + getExpandedRowModel: getExpandedRowModel(), + getGroupedRowModel: getGroupedRowModel(), + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getRowId: getRowKey, + autoResetExpanded: false, + enableMultiRowSelection: false, + enableSubRowSelection: false, + }); + + useEffect(() => { + if (onRowSelected) { + const selectedRows = table.getSelectedRowModel().rowsById; + const keys = Object.keys(selectedRows); + if (keys.length === 1) { + const selectedRow = scriptureResults.find((row) => getRowKey(row) === keys[0]) || undefined; + if (selectedRow) onRowSelected(selectedRow); + } + } + }, [rowSelection, scriptureResults, onRowSelected, table]); + + // Define possible grouping options + const scrBookGroupName = scriptureBookGroupName ?? defaultScrBookGroupName; + const typeGroupName = typeColumnName ?? defaultTypeColumnName; + + const groupingOptions = [ + { label: 'No Grouping', value: [] }, + { label: `Group by ${scrBookGroupName}`, value: [scrBookColId] }, + { label: `Group by ${typeGroupName}`, value: [typeColId] }, + { + label: `Group by ${scrBookGroupName} and ${typeGroupName}`, + value: [scrBookColId, typeColId], + }, + { + label: `Group by ${typeGroupName} and ${scrBookGroupName}`, + value: [typeColId, scrBookColId], + }, + ]; + + const handleSelectChange = (selectedGrouping: string) => { + setGrouping(JSON.parse(selectedGrouping)); + }; + + const handleRowClick = (row: Row, event: MouseEvent) => { + if (!row.getIsGrouped() && !row.getIsSelected()) { + row.getToggleSelectedHandler()(event); + } + }; + + const getEvenOrOddBandingStyle = (row: Row, index: number) => { + if (row.getIsGrouped()) return ''; + // UX has now said they don't think they want banding. I'm leaving in the code to + // set even and odd styles, but there's nothing in the CSS to style them differently. + // The "even" style used to also have pr-bg-neutral-300 (along with even) to create + // a visual banding effect. That could be added back in if UX changes the decision. + return cn('banded-row', index % 2 === 0 ? 'even' : 'odd'); + }; + + const getIndent = ( + groupingState: GroupingState, + row: Row, + cell: Cell, + ) => { + if (groupingState?.length === 0 || row.depth < cell.column.getGroupedIndex()) return undefined; + if (row.getIsGrouped()) { + switch (row.depth) { + case 1: + return 'pr-ps-4'; + default: + return undefined; + } + } + switch (row.depth) { + case 1: + return 'pr-ps-8'; + case 2: + return 'pr-ps-12'; + default: + return undefined; + } + }; + + return ( +
+ {!showColumnHeaders && ( + + )} + + {showColumnHeaders && ( + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers + .filter((h) => h.column.columnDef.header) + .map((header) => ( + /* For sticky column headers to work, we probably need to change the default definition of the shadcn Table component. See https://github.com/shadcn-ui/ui/issues/1151 */ + + {header.isPlaceholder ? undefined : ( +
+ {header.column.getCanGroup() ? ( + + ) : undefined}{' '} + {flexRender(header.column.columnDef.header, header.getContext())} +
+ )} +
+ ))} +
+ ))} +
+ )} + + {table.getRowModel().rows.map((row, rowIndex) => { + return ( + handleRowClick(row, event)} + > + {row.getVisibleCells().map((cell) => { + if ( + cell.getIsPlaceholder() || + (cell.column.columnDef.enableGrouping && + !cell.getIsGrouped() && + (cell.column.columnDef.id !== typeColId || !showSourceColumn)) + ) + return undefined; + return ( + + {(() => { + if (cell.getIsGrouped()) { + return ( + + ); + } + + // if (cell.getIsAggregated()) { + // flexRender( + // cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell, + // cell.getContext(), + // ); + // } + + return flexRender(cell.column.columnDef.cell, cell.getContext()); + })()} + + ); + })} + + ); + })} + +
+
+ ); +} diff --git a/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withAllThreeColumns.test.tsx b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withAllThreeColumns.test.tsx new file mode 100644 index 0000000000..268178c5d9 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withAllThreeColumns.test.tsx @@ -0,0 +1,105 @@ +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import ScriptureResultsViewer from '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component'; + +describe('ScriptureResultsViewer with all three column headers (showing Check Type/source column)', () => { + const repeatedWordsCheck = { id: 'testCheck1', displayName: 'Repeated Words' }; + const markersCheck = { id: 'testCheck2', displayName: 'Markers' }; + const quotationsCheck = { id: 'testCheck3', displayName: 'Quotations' }; + const frogRepeatedError = "Word 'frog' repeated twice"; + const unknownMarkerError = 'Undefined marker'; + const unclosedMarkerError = 'Marker not closed'; + const missingEndQuote = 'First-level quote opened but never closed'; + const checkTypeHeader = 'Check Type'; + const errorDetailsTypeHeader = 'Error Details'; + const textAnchor = { jsonPath: '', offset: 3 }; + + const sources = [ + { + source: repeatedWordsCheck, + data: [ + { + start: { bookNum: 1, chapterNum: 1, verseNum: 1, ...textAnchor }, + detail: frogRepeatedError, + }, + ], + }, + { + source: markersCheck, + data: [ + { + start: { bookNum: 2, chapterNum: 2, verseNum: 3, ...textAnchor }, + detail: unknownMarkerError, + }, + { + start: { bookNum: 66, chapterNum: 10, verseNum: 15, ...textAnchor }, + detail: unclosedMarkerError, + }, + ], + }, + { + source: quotationsCheck, + data: [ + { + start: { bookNum: 40, chapterNum: 20, verseNum: 1, ...textAnchor }, + detail: missingEndQuote, + }, + ], + }, + ]; + + beforeEach(() => { + render( + , + ); + }); + + it('should render column headers', () => { + const scrRefHeaderElement = screen.getByText('Scripture Reference'); + const scrRefButton = screen.getByTitle('Toggle grouping by Scripture Reference'); + expect(scrRefHeaderElement).toBe(scrRefButton.parentNode); + const checkTypeHeaderElement = screen.getByText(checkTypeHeader); + const checkTypeButton = screen.getByTitle('Toggle grouping by Check Type'); + expect(checkTypeHeaderElement).toBe(checkTypeButton.parentNode); + const headerRow = scrRefHeaderElement.closest('tr'); + expect(headerRow).toBe(checkTypeHeaderElement.closest('tr')); + expect(headerRow).toBe(screen.getByText(errorDetailsTypeHeader).closest('tr')); + }); + + it('should render body with no grouping', () => { + const table = screen.getByRole('table'); + if (!table) { + throw new Error('The table is missing.'); + } + const body = table.lastElementChild; + if (!body) { + throw new Error('The table does have any child elements.'); + } + + expect(body.outerHTML).toMatch(/^$/); + expect(body.childElementCount).toBe(4); + const children = Array.from(body?.childNodes); + children.forEach((child) => { + expect(child).toBeDefined(); + expect(child.childNodes.length).toBe(3); + const cellScrRef = child.childNodes[0]; + if (!(cellScrRef instanceof HTMLElement)) + throw new Error('Each row should have three td elements'); + expect(cellScrRef).toHaveClass('scrRef'); + const cellSource = child.childNodes[1]; + if (!(cellSource instanceof HTMLElement)) + throw new Error('Each row should have three td elements'); + expect(cellSource).toHaveClass('source'); + const cellDetails = child.childNodes[2]; + if (!(cellDetails instanceof HTMLElement)) + throw new Error('Each row should have three td elements'); + expect(cellDetails).toHaveClass('details'); + }); + }); +}); diff --git a/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withGroupingSelect.test.tsx b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withGroupingSelect.test.tsx new file mode 100644 index 0000000000..2f61cad59b --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withGroupingSelect.test.tsx @@ -0,0 +1,169 @@ +import { fireEvent, render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import ScriptureResultsViewer, { + ScriptureSrcItemDetail, +} from '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component'; + +let lastSelectedItem: ScriptureSrcItemDetail | undefined; +let numberOfRowSelectsHandled: number = 0; + +function RememberSelectedRow(item?: ScriptureSrcItemDetail) { + lastSelectedItem = item; + numberOfRowSelectsHandled += 1; +} + +function EnsureHTMLElement(node: Node): HTMLElement { + if (!(node instanceof HTMLElement)) + throw new Error('We checked this previously. This error is impossible.'); + return node; +} + +describe('ScriptureResultsViewer default display mode (with combobox for grouping option)', () => { + const repeatedWordsCheck = { id: 'testCheck1', displayName: 'Repeated Words' }; + const markersCheck = { id: 'testCheck2', displayName: 'Markers' }; + const quotationsCheck = { id: 'testCheck3', displayName: 'Quotations' }; + const frogRepeatedError = "Word 'frog' repeated twice"; + const unknownMarkerError = 'Undefined marker'; + const unclosedMarkerError = 'Marker not closed'; + const missingEndQuote = 'First-level quote opened but never closed'; + const checkTypeHeader = 'Check Type'; + const errorDetailsTypeHeader = 'Error Details'; + const textAnchor = { jsonPath: '', offset: 3 }; + + const sources = [ + { + source: repeatedWordsCheck, + data: [ + { + start: { bookNum: 1, chapterNum: 1, verseNum: 1, ...textAnchor }, + detail: frogRepeatedError, + }, + ], + }, + { + source: markersCheck, + data: [ + { + start: { bookNum: 2, chapterNum: 2, verseNum: 3, ...textAnchor }, + detail: unknownMarkerError, + }, + { + start: { bookNum: 66, chapterNum: 10, verseNum: 15, ...textAnchor }, + detail: unclosedMarkerError, + }, + ], + }, + { + source: quotationsCheck, + data: [ + { + start: { bookNum: 40, chapterNum: 20, verseNum: 1, ...textAnchor }, + detail: missingEndQuote, + }, + ], + }, + ]; + + beforeEach(() => { + render( + , + ); + }); + + // TODO (https://github.com/paranext/paranext-core/issues/923) More unit tests needed. + // it should show grouping drop-down when clicked + // it should change the grouping option to the selected one + + it('should not have column headers in the table', () => { + const table = screen.getByRole('table'); + expect(table).toBeInTheDocument(); + expect(table.innerHTML).not.toMatch(/ { + const table = screen.getByRole('table'); + const body = table.lastElementChild; + if (!body) { + throw new Error('The table does have any child elements.'); + } + expect(body.outerHTML).toMatch(/^$/); + expect(body.childElementCount).toBe(4); + const children = Array.from(body?.childNodes); + children.forEach((child) => { + expect(child).toBeDefined(); + expect(child.childNodes.length).toBe(2); + const cellScrRef = child.childNodes[0]; + if (!(cellScrRef instanceof HTMLElement) || cellScrRef.nodeName.toUpperCase() !== 'TD') + throw new Error('Each row should have two td elements'); + expect(cellScrRef).toHaveClass('scrRef'); + const cellDetails = child.childNodes[1]; + if (!(cellDetails instanceof HTMLElement) || cellScrRef.nodeName.toUpperCase() !== 'TD') + throw new Error('Each row should have two td elements'); + expect(cellDetails).toHaveClass('details'); + }); + + const rows = screen.getAllByRole('row'); + expect(rows.length).toBe(body.childElementCount); + + rows.forEach((row) => { + expect(row.className).toMatch(/\bbanded-row\b/); + }); + + const [firstRow, secondRow, thirdRow, fourthRow] = rows; + + // UX has now said they don't think they want banding. I'm leaving in the code to + // set even and odd styles, but there's nothing in the CSS to style them differently. + + let [scrRefCell, detailsCell] = firstRow.childNodes; + expect(firstRow.className).toMatch(/\beven\b/); + expect(EnsureHTMLElement(scrRefCell).innerHTML).toBe('GEN 1:1'); + expect(EnsureHTMLElement(detailsCell).innerHTML).toBe(frogRepeatedError); + + [scrRefCell, detailsCell] = secondRow.childNodes; + expect(secondRow.className).toMatch(/\bodd\b/); + expect(EnsureHTMLElement(scrRefCell).innerHTML).toBe('EXO 2:3'); + expect(EnsureHTMLElement(detailsCell).innerHTML).toBe(unknownMarkerError); + + [scrRefCell, detailsCell] = thirdRow.childNodes; + expect(firstRow.className).toMatch(/\beven\b/); + expect(EnsureHTMLElement(scrRefCell).innerHTML).toBe('MAT 20:1'); + expect(EnsureHTMLElement(detailsCell).innerHTML).toBe(missingEndQuote); + + [scrRefCell, detailsCell] = fourthRow.childNodes; + expect(secondRow.className).toMatch(/\bodd\b/); + expect(EnsureHTMLElement(scrRefCell).innerHTML).toBe('REV 10:15'); + expect(EnsureHTMLElement(detailsCell).innerHTML).toBe(unclosedMarkerError); + }); + + it('Selects a detail row when clicked', () => { + const table = screen.getByRole('table'); + expect(table).toBeInTheDocument(); + + const firstRow = screen.getByText(frogRepeatedError).closest('tr'); + expect(firstRow).toBeInTheDocument(); + + if (!firstRow) throw new Error('First row is null'); + + const dataState = firstRow.attributes.getNamedItem('data-state'); + expect(dataState?.value).toBe(''); + + // Simulate clicking the first row + fireEvent.click(firstRow); + + // Check if the row is selected + // Assuming there's a class or attribute change on selection + // Replace 'selected' with the actual class or attribute used + expect(dataState?.value).toBe('selected'); + + expect(numberOfRowSelectsHandled).toBe(1); + expect(lastSelectedItem?.source).toBe(sources[0].source); + expect(lastSelectedItem?.detail).toBe(sources[0].data[0].detail); + expect(lastSelectedItem?.start).toBe(sources[0].data[0].start); + expect(lastSelectedItem?.end).toBeUndefined(); + }); +}); diff --git a/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withSourceColumnHidden.test.tsx b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withSourceColumnHidden.test.tsx new file mode 100644 index 0000000000..ca328065bc --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.withSourceColumnHidden.test.tsx @@ -0,0 +1,96 @@ +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import ScriptureResultsViewer from '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component'; + +describe('ScriptureResultsViewer with only Scripture ref and details columns', () => { + const repeatedWordsCheck = { id: 'testCheck1', displayName: 'Repeated Words' }; + const markersCheck = { id: 'testCheck2', displayName: 'Markers' }; + const quotationsCheck = { id: 'testCheck3', displayName: 'Quotations' }; + const frogRepeatedError = "Word 'frog' repeated twice"; + const unknownMarkerError = 'Undefined marker'; + const unclosedMarkerError = 'Marker not closed'; + const missingEndQuote = 'First-level quote opened but never closed'; + const checkTypeHeader = 'Check Type'; + const errorDetailsTypeHeader = 'Error Details'; + const textAnchor = { jsonPath: '', offset: 3 }; + + const sources = [ + { + source: repeatedWordsCheck, + data: [ + { + start: { bookNum: 1, chapterNum: 1, verseNum: 1, ...textAnchor }, + detail: frogRepeatedError, + }, + ], + }, + { + source: markersCheck, + data: [ + { + start: { bookNum: 2, chapterNum: 2, verseNum: 3, ...textAnchor }, + detail: unknownMarkerError, + }, + { + start: { bookNum: 66, chapterNum: 10, verseNum: 15, ...textAnchor }, + detail: unclosedMarkerError, + }, + ], + }, + { + source: quotationsCheck, + data: [ + { + start: { bookNum: 40, chapterNum: 20, verseNum: 1, ...textAnchor }, + detail: missingEndQuote, + }, + ], + }, + ]; + + beforeEach(() => { + render( + // By default, it should omit Check Type/source column + , + ); + }); + + it('should render the other headers', () => { + expect(screen.queryByTitle('Toggle grouping by Scripture Reference')).toBeDefined(); + expect(screen.queryByText(checkTypeHeader)).toBeNull(); + expect(screen.queryByTitle('Toggle grouping by Check Type')).toBeNull(); + expect(screen.queryByText(errorDetailsTypeHeader)).toBeDefined(); + }); + + it('should render the other cells in the body', () => { + const table = screen.getByRole('table'); + if (!table) { + throw new Error('The table is missing.'); + } + const body = table.lastElementChild; + if (!body) { + throw new Error('The table does have any child elements.'); + } + + expect(body.outerHTML).toMatch(/^$/); + expect(body.childElementCount).toBe(4); + const children = Array.from(body?.childNodes); + children.forEach((child) => { + expect(child).toBeDefined(); + expect(child.childNodes.length).toBe(2); + const cellScrRef = child.childNodes[0]; + if (!(cellScrRef instanceof HTMLElement)) + throw new Error('Each row should have two td elements'); + expect(cellScrRef).toHaveClass('scrRef'); + const cellDetails = child.childNodes[1]; + if (!(cellDetails instanceof HTMLElement)) + throw new Error('Each row should have two td elements'); + expect(cellDetails).toHaveClass('details'); + }); + }); +}); diff --git a/lib/platform-bible-react/src/components/advanced/scroll-group-selector.component.tsx b/lib/platform-bible-react/src/components/advanced/scroll-group-selector.component.tsx new file mode 100644 index 0000000000..b89194b538 --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/scroll-group-selector.component.tsx @@ -0,0 +1,146 @@ +import { + getLocalizeKeyForScrollGroupId, + LanguageStrings, + ScrollGroupId, +} from 'platform-bible-utils'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/shadcn-ui/select'; + +const DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS = { + [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø', + [getLocalizeKeyForScrollGroupId(0)]: 'A', + [getLocalizeKeyForScrollGroupId(1)]: 'B', + [getLocalizeKeyForScrollGroupId(2)]: 'C', + [getLocalizeKeyForScrollGroupId(3)]: 'D', + [getLocalizeKeyForScrollGroupId(4)]: 'E', + [getLocalizeKeyForScrollGroupId(5)]: 'F', + [getLocalizeKeyForScrollGroupId(6)]: 'G', + [getLocalizeKeyForScrollGroupId(7)]: 'H', + [getLocalizeKeyForScrollGroupId(8)]: 'I', + [getLocalizeKeyForScrollGroupId(9)]: 'J', + [getLocalizeKeyForScrollGroupId(10)]: 'K', + [getLocalizeKeyForScrollGroupId(11)]: 'L', + [getLocalizeKeyForScrollGroupId(12)]: 'M', + [getLocalizeKeyForScrollGroupId(13)]: 'N', + [getLocalizeKeyForScrollGroupId(14)]: 'O', + [getLocalizeKeyForScrollGroupId(15)]: 'P', + [getLocalizeKeyForScrollGroupId(16)]: 'Q', + [getLocalizeKeyForScrollGroupId(17)]: 'R', + [getLocalizeKeyForScrollGroupId(18)]: 'S', + [getLocalizeKeyForScrollGroupId(19)]: 'T', + [getLocalizeKeyForScrollGroupId(20)]: 'U', + [getLocalizeKeyForScrollGroupId(21)]: 'V', + [getLocalizeKeyForScrollGroupId(22)]: 'W', + [getLocalizeKeyForScrollGroupId(23)]: 'X', + [getLocalizeKeyForScrollGroupId(24)]: 'Y', + [getLocalizeKeyForScrollGroupId(25)]: 'Z', +}; + +export type ScrollGroupSelectorProps = { + /** + * List of scroll group ids to show to the user. Either a {@link ScrollGroupId} or `undefined` for + * no scroll group + */ + availableScrollGroupIds: (ScrollGroupId | undefined)[]; + /** Currently selected scroll group id. `undefined` for no scroll group */ + scrollGroupId: ScrollGroupId | undefined; + /** Callback function run when the user tries to change the scroll group id */ + onChangeScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void; + /** + * Localized strings to use for displaying scroll group ids. Must be an object whose keys are + * `getLocalizeKeyForScrollGroupId(scrollGroupId)` for all scroll group ids (and `undefined` if + * included) in {@link ScrollGroupSelectorProps.availableScrollGroupIds} and whose values are the + * localized strings to use for those scroll group ids. + * + * Defaults to English localizations of English alphabet for scroll groups 0-25 (e.g. 0 is A) and + * Ø for `undefined`. Will fill in any that are not provided with these English localizations. + * Also, if any values match the keys, the English localization will be used. This is useful in + * case you want to pass in a temporary version of the localized strings while your localized + * strings load. + * + * @example + * + * ```typescript + * const myScrollGroupIdLocalizedStrings = { + * [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø', + * [getLocalizeKeyForScrollGroupId(0)]: 'A', + * [getLocalizeKeyForScrollGroupId(1)]: 'B', + * [getLocalizeKeyForScrollGroupId(2)]: 'C', + * [getLocalizeKeyForScrollGroupId(3)]: 'D', + * [getLocalizeKeyForScrollGroupId(4)]: 'E', + * }; + * ``` + * + * @example + * + * ```tsx + * const availableScrollGroupIds = [undefined, 0, 1, 2, 3, 4]; + * + * const localizeKeys = getLocalizeKeysForScrollGroupIds(); + * + * const [localizedStrings] = useLocalizedStrings(localizeKeys); + * + * ... + * + * + * ``` + */ + localizedStrings?: LanguageStrings; +}; + +/** Selector component for choosing a scroll group */ +export default function ScrollGroupSelector({ + availableScrollGroupIds, + scrollGroupId, + onChangeScrollGroupId, + localizedStrings = {}, +}: ScrollGroupSelectorProps) { + const localizedStringsDefaulted = { + ...DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS, + ...Object.fromEntries( + Object.entries(localizedStrings).map( + ([localizedStringKey, localizedStringValue]: [string, string]) => [ + localizedStringKey, + localizedStringKey === localizedStringValue && + localizedStringKey in DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS + ? DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS[localizedStringKey] + : localizedStringValue, + ], + ), + ), + }; + return ( + + ); +} diff --git a/lib/platform-bible-react/src/components/advanced/settings-components/settings-list.component.tsx b/lib/platform-bible-react/src/components/advanced/settings-components/settings-list.component.tsx new file mode 100644 index 0000000000..a5f4fef2ff --- /dev/null +++ b/lib/platform-bible-react/src/components/advanced/settings-components/settings-list.component.tsx @@ -0,0 +1,103 @@ +import { PropsWithChildren } from 'react'; +import { Separator } from '@/components/shadcn-ui/separator'; + +/** Props for the SettingsList component, currently just children */ +type SettingsListProps = PropsWithChildren; + +/** + * SettingsList component is a wrapper for list items. Rendered with a formatted div + * + * @param children To populate the list with + * @returns Formatted div encompassing the children + */ +export function SettingsList({ children }: SettingsListProps) { + return
{children}
; +} + +/** Props for SettingsListItem component */ +type SettingsListItemProps = PropsWithChildren & { + /** Primary text of the list item */ + primary: string; + + /** Optional text of the list item */ + secondary?: string | undefined; + + /** Optional boolean to display a message if the children aren't loaded yet. Defaults to false */ + isLoading?: boolean; + + /** Optional message to display if isLoading */ + loadingMessage?: string; +}; + +/** + * SettingsListItem component is a common list item. Rendered with a formatted div + * + * @param primary Primary text of the list item + * @param secondary Optional secondary text of the list item + * @param isLoading Optional, to display a message if the action component isn't generated yet, + * defaults to false + * @param children The action component(s) to provide for this item + * @param loadingMessage Optional, message to display if isLoading + * @returns Formatted div encompassing the list item content + */ +export function SettingsListItem({ + primary, + secondary, + children, + isLoading = false, + loadingMessage, +}: SettingsListItemProps) { + return ( +
+
+

{primary}

+

+ {secondary} +

+
+ + {isLoading ? ( +

{loadingMessage}

+ ) : ( +
{children}
+ )} +
+ ); +} + +/** Props for SettingsListHeader component */ +type SettingsListHeaderProps = { + /** The primary text of the list header */ + primary: string; + + /** Optional secondary text of the list header */ + secondary?: string | undefined; + + /** Optional boolean to include a separator underneath the secondary text. Defaults to false */ + includeSeparator?: boolean; +}; + +/** + * SettingsListHeader component displays text above the list + * + * @param primary The primary text of the list header + * @param secondary Optional secondary text of the list header + * @param includeSeparator Optional boolean to include a separator underneath the secondary text. + * Defaults to false + * @returns Formatted div with list header content + */ +export function SettingsListHeader({ + primary, + secondary, + includeSeparator = false, +}: SettingsListHeaderProps) { + return ( +
+
+

{primary}

+

{secondary}

+
+ {includeSeparator ? : ''} +
+ ); +} diff --git a/lib/platform-bible-react/src/components/basics/chapter-range-selector.component.tsx b/lib/platform-bible-react/src/components/basics/chapter-range-selector.component.tsx new file mode 100644 index 0000000000..4dc5cb6c4d --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/chapter-range-selector.component.tsx @@ -0,0 +1,66 @@ +import { useMemo } from 'react'; +import ComboBox from '@/components/basics/combo-box.component'; +import { Label } from '@/components/shadcn-ui/label'; + +export type ChapterRangeSelectorProps = { + startChapter: number; + endChapter: number; + handleSelectStartChapter: (chapter: number) => void; + handleSelectEndChapter: (chapter: number) => void; + isDisabled?: boolean; + chapterCount: number; +}; + +export default function ChapterRangeSelector({ + startChapter, + endChapter, + handleSelectStartChapter, + handleSelectEndChapter, + isDisabled = false, + chapterCount, +}: ChapterRangeSelectorProps) { + const chapterOptions = useMemo( + () => Array.from({ length: chapterCount }, (_, index) => index + 1), + [chapterCount], + ); + + const onChangeStartChapter = (value: number) => { + handleSelectStartChapter(value); + if (value > endChapter) { + handleSelectEndChapter(value); + } + }; + + const onChangeEndChapter = (value: number) => { + handleSelectEndChapter(value); + if (value < startChapter) { + handleSelectStartChapter(value); + } + }; + + return ( + <> + + option.toString()} + value={startChapter} + /> + + + option.toString()} + value={endChapter} + /> + + ); +} diff --git a/lib/platform-bible-react/src/components/basics/checklist.component.tsx b/lib/platform-bible-react/src/components/basics/checklist.component.tsx new file mode 100644 index 0000000000..d0152b7432 --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/checklist.component.tsx @@ -0,0 +1,53 @@ +import Checkbox from '@/components/shadcn-ui/checkbox'; +import { Label } from '@/components/shadcn-ui/label'; + +export type ChecklistProps = { + /** Optional string representing the id attribute of the Checklist */ + id?: string; + /** Optional string representing CSS class name(s) for styling */ + className?: string; + /** Array of strings representing the checkable items */ + listItems: string[]; + /** Array of strings representing the checked items */ + selectedListItems: string[]; + /** + * Function that is called when a checkbox item is selected or deselected + * + * @param item The string description for this item + * @param selected True if selected, false if not selected + */ + handleSelectListItem: (item: string, selected: boolean) => void; + + /** + * Optional function creates a label for a provided checkable item + * + * @param item The item for which a label is to be created + * @returns A string representing the label text for the checkbox associated with that item + */ + createLabel?: (item: string) => string; +}; + +/** Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array. */ +export default function Checklist({ + id, + className, + listItems, + selectedListItems, + handleSelectListItem, + createLabel, +}: ChecklistProps) { + return ( +
+ {listItems.map((item) => ( +
+ handleSelectListItem(item, value)} + /> + +
+ ))} +
+ ); +} diff --git a/lib/platform-bible-react/src/components/basics/combo-box.component.tsx b/lib/platform-bible-react/src/components/basics/combo-box.component.tsx new file mode 100644 index 0000000000..d8f572e137 --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/combo-box.component.tsx @@ -0,0 +1,130 @@ +import { useState } from 'react'; +import { Check, ChevronsUpDown } from 'lucide-react'; +import { cn } from '@/utils/shadcn-ui.util'; +import { Button, ButtonProps } from '@/components/shadcn-ui/button'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover'; +import { + Command, + CommandEmpty, + CommandInput, + CommandItem, + CommandList, +} from '@/components/shadcn-ui/command'; +import { PopoverProps } from '@radix-ui/react-popover'; + +export type ComboBoxLabelOption = { label: string }; +export type ComboBoxOption = string | number | ComboBoxLabelOption; + +export type ComboBoxProps = { + /** Optional unique identifier */ + id?: string; + /** Text label title for combobox */ + /** List of available options for the dropdown menu */ + options?: readonly T[]; + /** Additional css classes to help with unique styling of the combo box */ + className?: string; + /** + * The selected value that the combo box currently holds. Must be shallow equal to one of the + * options entries. + */ + value?: T; + /** Triggers when content of textfield is changed */ + onChange?: (newValue: T) => void; + /** Used to determine the string value for a given option. */ + getOptionLabel?: (option: ComboBoxOption) => string; + /** Text displayed on button if `value` is undefined */ + buttonPlaceholder?: string; + /** Placeholder text for text field */ + textPlaceholder?: string; + /** Text to display when no options match input */ + commandEmptyMessage?: string; + /** Variant of button */ + buttonVariant?: ButtonProps['variant']; + /** Text direction ltr or rtl */ + dir?: Direction; + /** Optional boolean to set if trigger should be disabled */ + isDisabled?: boolean; +} & PopoverProps; + +type Direction = 'ltr' | 'rtl'; + +function getOptionLabelDefault(option: ComboBoxOption): string { + if (typeof option === 'string') { + return option; + } + if (typeof option === 'number') { + return option.toString(); + } + return option.label; +} + +/** + * Autocomplete input and command palette with a list of suggestions. + * + * Thanks to Shadcn for heavy inspiration and documentation + * https://ui.shadcn.com/docs/components/combobox + */ +function ComboBox({ + id, + options = [], + className, + value, + onChange = () => {}, + getOptionLabel = getOptionLabelDefault, + buttonPlaceholder = '', + textPlaceholder = '', + commandEmptyMessage = 'No option found', + buttonVariant = 'outline', + dir = 'ltr', + isDisabled = false, + ...props +}: ComboBoxProps) { + const [open, setOpen] = useState(false); + + return ( + + + + + + + + {commandEmptyMessage} + + {options.map((option) => ( + { + onChange(option); + setOpen(false); + }} + > + + {getOptionLabel(option)} + + ))} + + + + + ); +} + +export default ComboBox; diff --git a/lib/platform-bible-react/src/components/basics/search-bar.component.tsx b/lib/platform-bible-react/src/components/basics/search-bar.component.tsx new file mode 100644 index 0000000000..6ada2ca296 --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/search-bar.component.tsx @@ -0,0 +1,39 @@ +import { Input } from '@/components/shadcn-ui/input'; +import { cn } from '@/utils/shadcn-ui.util'; +import { useState } from 'react'; + +export type SearchBarProps = { + /** + * Callback fired to handle the search query when button pressed + * + * @param searchQuery + */ + onSearch: (searchQuery: string) => void; + + /** Optional string that appears in the search bar without a search string */ + placeholder?: string; + + /** Optional boolean to set the input base to full width */ + isFullWidth?: boolean; +}; + +export default function SearchBar({ onSearch, placeholder, isFullWidth }: SearchBarProps) { + const [searchQuery, setSearchQuery] = useState(''); + + const handleInputChange = (searchString: string) => { + setSearchQuery(searchString); + onSearch(searchString); + }; + + return ( + handleInputChange(e.target.value)} + /> + ); +} diff --git a/lib/platform-bible-react/src/components/basics/spinner.component.tsx b/lib/platform-bible-react/src/components/basics/spinner.component.tsx new file mode 100644 index 0000000000..eb3512d67f --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/spinner.component.tsx @@ -0,0 +1,15 @@ +import { cn } from '@/utils/shadcn-ui.util'; +import { LoaderCircle, LucideProps } from 'lucide-react'; +import { forwardRef } from 'react'; + +export type SpinnerProps = LucideProps; + +const Spinner = forwardRef(({ className, ...props }, ref) => { + return ( + + ); +}); + +Spinner.displayName = 'Spinner'; + +export default Spinner; diff --git a/lib/platform-bible-react/src/components/basics/tabs-vertical.tsx b/lib/platform-bible-react/src/components/basics/tabs-vertical.tsx new file mode 100644 index 0000000000..7d03a359f8 --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/tabs-vertical.tsx @@ -0,0 +1,75 @@ +// adapted from: https://github.com/shadcn-ui/ui/discussions/752 + +'use client'; + +import { TabsContentProps, TabsListProps, TabsTriggerProps } from '@/components/shadcn-ui/tabs'; +import { cn } from '@/utils/shadcn-ui.util'; +import * as TabsPrimitive from '@radix-ui/react-tabs'; +import React from 'react'; + +export type VerticalTabsProps = React.ComponentPropsWithoutRef & { + className?: string; +}; + +export type LeftTabsTriggerProps = TabsTriggerProps & { + value: string; + ref?: React.Ref; +}; + +export const VerticalTabs = React.forwardRef< + React.ElementRef, + VerticalTabsProps +>(({ className, ...props }, ref) => ( + +)); + +VerticalTabs.displayName = TabsPrimitive.List.displayName; + +export const VerticalTabsList = React.forwardRef< + React.ElementRef, + TabsListProps +>(({ className, ...props }, ref) => ( + +)); +VerticalTabsList.displayName = TabsPrimitive.List.displayName; + +export const VerticalTabsTrigger = React.forwardRef< + React.ElementRef, + LeftTabsTriggerProps +>(({ className, ...props }, ref) => ( + +)); + +export const VerticalTabsContent = React.forwardRef< + React.ElementRef, + TabsContentProps +>(({ className, ...props }, ref) => ( + +)); +VerticalTabsContent.displayName = TabsPrimitive.Content.displayName; diff --git a/lib/platform-bible-react/src/components/basics/text-field.component.tsx b/lib/platform-bible-react/src/components/basics/text-field.component.tsx new file mode 100644 index 0000000000..d093dc734a --- /dev/null +++ b/lib/platform-bible-react/src/components/basics/text-field.component.tsx @@ -0,0 +1,101 @@ +import { Input as ShadInput } from '@/components/shadcn-ui/input'; +import { Label as ShadLabel } from '@/components/shadcn-ui/label'; +import { cn } from '@/utils/shadcn-ui.util'; +import { ChangeEventHandler, FocusEventHandler } from 'react'; + +export type TextFieldProps = { + /** Optional unique identifier */ + id?: string; + /** + * If `true`, the component is disabled. + * + * @default false + */ + isDisabled?: boolean; + /** + * If `true`, the label is displayed in an error state. + * + * @default false + */ + hasError?: boolean; + /** + * If `true`, the input will take up the full width of its container. + * + * @default false + */ + isFullWidth?: boolean; + /** Text that gives the user instructions on what contents the TextField expects */ + helperText?: string; + /** The title of the TextField */ + label?: string; + /** The short hint displayed in the `input` before the user enters a value. */ + placeholder?: string; + /** + * If `true`, the label is displayed as required and the `input` element is required. + * + * @default false + */ + isRequired?: boolean; + /** Additional css classes to help with unique styling of the text field */ + className?: string; + /** Starting value for the text field if it is not controlled */ + defaultValue?: string | number; + /** Value of the text field if controlled */ + value?: string | number; + /** Triggers when content of textfield is changed */ + onChange?: ChangeEventHandler; + /** Triggers when textfield gets focus */ + onFocus?: FocusEventHandler; + /** Triggers when textfield loses focus */ + onBlur?: FocusEventHandler; +}; + +/** + * Text input field + * + * Thanks to Shadcn for heavy inspiration and documentation + * https://ui.shadcn.com/docs/components/input#with-label + */ +function TextField({ + id, + isDisabled = false, + hasError = false, + isFullWidth = false, + helperText, + label, + placeholder, + isRequired = false, + className, + defaultValue, + value, + onChange, + onFocus, + onBlur, +}: TextFieldProps) { + return ( +
+ {`${label}${isRequired ? '*' : ''}`} + +

{helperText}

+
+ ); +} + +export default TextField; diff --git a/lib/platform-bible-react/src/components/mui/grid-menu.component.css b/lib/platform-bible-react/src/components/mui/grid-menu.component.css new file mode 100644 index 0000000000..cd4c401d94 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/grid-menu.component.css @@ -0,0 +1,34 @@ +.papi-multi-column-menu { + background-color: rgb(222, 222, 222); + display: flex; + flex-direction: column; + padding-left: 3px; + padding-right: 3px; +} + +.papi-menu-column { + font-size: 11pt; + font-weight: 600; + padding-bottom: 2px; +} + +.papi-menu-column ul { + padding-top: 0; +} + +.papi-menu-column-header { + background-color: rgb(181, 181, 181); + padding-left: 24px; + margin-top: 0; + margin-bottom: 0; +} + +.papi-multi-column-menu.paratext { + background-color: rgb(76, 106, 76); + color: rgb(214, 255, 152); +} + +.papi-multi-column-menu.paratext.bright { + color: rgb(76, 106, 76); + background-color: rgb(214, 255, 152); +} diff --git a/lib/platform-bible-react/src/components/mui/grid-menu.component.tsx b/lib/platform-bible-react/src/components/mui/grid-menu.component.tsx new file mode 100644 index 0000000000..35508cb724 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/grid-menu.component.tsx @@ -0,0 +1,149 @@ +import '@/components/mui/grid-menu.component.css'; +import { GroupedMenuPropsBase } from '@/components/mui/grouped-menu-item-list.component'; +import { CommandHandler } from '@/components/mui/menu-item.component'; +import TopLevelMenu from '@/components/mui/top-level-menu.component'; +import { Grid, List } from '@mui/material'; +import { + Localized, + MenuColumnWithHeader, + MultiColumnMenu, + ReferencedItem, +} from 'platform-bible-utils'; +import { useMemo } from 'react'; + +type ColumnInfo = { + /* + * The ID (`${string}.${string}`) of a specific menu column. + */ + id: ReferencedItem; + + /* + * Metadata (label, order, etc.) for a specific menu column. + */ + metadata: Localized; +}; + +type MenuColumnProps = ColumnInfo & + GroupedMenuPropsBase & { + /** Additional css classes to help with unique styling of the menu column */ + className?: string; + }; + +export type GridMenuInfo = { + /** The menu object containing information about the columns, groups, and items to display. */ + multiColumnMenu: Localized; +}; + +export type GridMenuProps = GridMenuInfo & { + /** Optional unique identifier */ + id?: string; + + commandHandler: CommandHandler; + + /** Additional css classes to help with unique styling of the grid menu */ + className?: string; +}; + +function MenuColumn({ + commandHandler, + menuDefinition, + id, + metadata, + onClick, + className, +}: MenuColumnProps) { + return ( + +

+ {metadata.label} +

+ {/* It would seem as though this List component were unnecessary, since it only contains one + thing, but the "dense" property does affect the layout of the items (in a way I don't fully + understand). There might be a better way. */} + + + +
+ ); +} + +export default function GridMenu({ + commandHandler, + className, + multiColumnMenu, + id, +}: GridMenuProps) { + const { columns } = multiColumnMenu; + + const sortedColumns = useMemo(() => { + const columnNumbers = new Map(); + Object.getOwnPropertyNames(columns).forEach((columnName: string) => { + // We know for sure there is a (boolean) property 'isExtensible' that we are not interested in. + if (columnName === 'isExtensible') return; + // TS doesn't allow `columnName` above to be a ReferencedItem even though the type says it is + // eslint-disable-next-line no-type-assertion/no-type-assertion + const columnId = columnName as ReferencedItem; + const column = columns[columnId]; + // As of right now (and hopefully forever after), all remaining properties of the + // ColumnsWithHeaders object are columns whose property names are the IDs of the columns. + // This is an additional (redundant) sanity check. Specifically we're interested in + // MenuColumnWithHeader objects, which TypeScript now "knows" we have, but at runtime all we + // can check for is that it's an object with a valid numeric order field. That's likely good + // enough. + if ( + typeof column === 'object' && + typeof column.order === 'number' && + !Number.isNaN(column.order) + ) + columnNumbers.set(column.order, { id: columnId, metadata: column }); + else + console.warn( + `Property ${columnName} (${typeof column}) on menu ${id} is not a valid column and is being ignored. This might indicate data corruption`, + ); + }); + + // Extract values and sort them based on the 'order' property + return Array.from(columnNumbers.values()).sort((a, b) => { + return (a.metadata.order || 0) - (b.metadata.order || 0); + }); + }, [columns, id]); + + // We might need something like this if we need to be able to prevent empty columns + // sortedColumns.filter((c) => multiColumnMenu.groups.some((g) => 'column' in g && (g as .column)... + + return ( + + {sortedColumns.map((col, index) => ( + + ))} + + ); +} diff --git a/lib/platform-bible-react/src/components/mui/gridMenu.component.onClick.test.tsx b/lib/platform-bible-react/src/components/mui/gridMenu.component.onClick.test.tsx new file mode 100644 index 0000000000..c671ef84ac --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/gridMenu.component.onClick.test.tsx @@ -0,0 +1,38 @@ +import GridMenu from '@/components/mui/grid-menu.component'; +import { Command } from '@/components/mui/menu-item.component'; +import * as jsonMenu from '@/components/mui/sample.composed.full.menu.json'; +import '@testing-library/jest-dom'; +import { fireEvent, render, screen } from '@testing-library/react'; +import { NonValidatingDocumentCombiner, PlatformMenus } from 'platform-bible-utils'; + +let lastCommandHandled: string; +let numberOfCommandsHandled: number = 0; + +function RememberLastMenuCommand(command: Command) { + lastCommandHandled = command.command; + numberOfCommandsHandled += 1; +} + +describe('GridMenu', () => { + const topMenuCombiner = new NonValidatingDocumentCombiner(jsonMenu, { + copyDocuments: false, + ignoreDuplicateProperties: true, + }); + + // Assert the type that schema validation should have already sorted out + // eslint-disable-next-line no-type-assertion/no-type-assertion + const menuData = topMenuCombiner.output as PlatformMenus; + + it('handles click event correctly', () => { + render( + , + ); + + const sendReceiveProjectsItem = screen.getByRole('menuitem', { name: '%sendReceiveProjects%' }); + + fireEvent.click(sendReceiveProjectsItem); + + expect(numberOfCommandsHandled).toBe(1); + expect(lastCommandHandled).toBe('paratext.sendReceiveProjects'); + }); +}); diff --git a/lib/platform-bible-react/src/components/mui/gridMenu.component.openSubmenu.render.test.tsx b/lib/platform-bible-react/src/components/mui/gridMenu.component.openSubmenu.render.test.tsx new file mode 100644 index 0000000000..fb76cc80f6 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/gridMenu.component.openSubmenu.render.test.tsx @@ -0,0 +1,34 @@ +import GridMenu from '@/components/mui/grid-menu.component'; +import * as jsonMenu from '@/components/mui/sample.composed.full.menu.json'; +import '@testing-library/jest-dom'; +import { fireEvent, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { NonValidatingDocumentCombiner, PlatformMenus } from 'platform-bible-utils'; + +describe('GridMenu', () => { + const topMenuCombiner = new NonValidatingDocumentCombiner(jsonMenu, { + copyDocuments: false, + ignoreDuplicateProperties: true, + }); + + // Assert the type that schema validation should have already sorted out + // eslint-disable-next-line no-type-assertion/no-type-assertion + const menuData = topMenuCombiner.output as PlatformMenus; + render( {}} />); + + it('renders submenu when parent menu is clicked', async () => { + const parentMenuItem = screen.getByRole('menuitem', { name: '%paratext_help%' }); + + const rightArrowIcon = parentMenuItem.querySelector('.MuiListItemIcon-root > .MuiSvgIcon-root'); + expect(rightArrowIcon).toHaveAttribute('data-testid', 'ArrowRightIcon'); + + fireEvent.click(parentMenuItem); + + screen.getByRole('menuitem', { name: '%paratext_helpVideos%' }); + const helpGuideMenuItem = screen.getByRole('menuitem', { name: '%paratext_helpGuide%' }); + await userEvent.hover(helpGuideMenuItem); + const tip = await screen.findByRole('tooltip'); + expect(tip).toBeInTheDocument(); + expect(tip.textContent).toBe('%paratext_helpGuide_tooltip%'); + }); +}); diff --git a/lib/platform-bible-react/src/components/mui/gridMenu.component.render.test.tsx b/lib/platform-bible-react/src/components/mui/gridMenu.component.render.test.tsx new file mode 100644 index 0000000000..6cdb6e731f --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/gridMenu.component.render.test.tsx @@ -0,0 +1,100 @@ +import GridMenu from '@/components/mui/grid-menu.component'; +import * as jsonMenu from '@/components/mui/sample.composed.full.menu.json'; +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import { NonValidatingDocumentCombiner, PlatformMenus } from 'platform-bible-utils'; +import { PropsWithChildren } from 'react'; + +jest.mock('@mui/material', () => { + const mui = jest.requireActual('@mui/material'); // Import the actual MUI components + + return { + ...mui, // Spread the actual MUI exports + + // Mocked components + MenuItem: ({ + divider, + className, + children, + }: { + divider: boolean | undefined; + className: string | undefined; + } & PropsWithChildren) => { + const dividerStyle = divider ? ' hasDivider' : ''; + return ( +
  • + {children} +
  • + ); + }, + }; +}); + +describe('GridMenu renders', () => { + const topMenuCombiner = new NonValidatingDocumentCombiner(jsonMenu, { + copyDocuments: false, + ignoreDuplicateProperties: true, + }); + + // Assert the type that schema validation should have already sorted out + // eslint-disable-next-line no-type-assertion/no-type-assertion + const menuData = topMenuCombiner.output as PlatformMenus; + render( {}} />); + + it('column label correctly', () => { + const expectedColumns = [ + { + html: screen.getByRole('menu', { name: 'paratext.paratext' }), + label: '%mainMenu_Paratext%', + }, + { html: screen.getByRole('menu', { name: 'platform.window' }), label: '%mainMenu_Window%' }, + { html: screen.getByRole('menu', { name: 'platform.layout' }), label: '%mainMenu_Layout%' }, + { html: screen.getByRole('menu', { name: 'platform.help' }), label: '%mainMenu_Help%' }, + ]; + + expectedColumns.forEach((column) => { + const { html, label } = column; + expect(html).toBeInTheDocument(); + const labelElement = screen.getByLabelText(label); + expect(html).toContainElement(labelElement); + expect(labelElement).toHaveTextContent(label); + expect(labelElement).toHaveAttribute( + 'class', + expect.stringMatching(/\bpapi-menu-column-header\b/), + ); + }); + }); + + const allMenuItems = screen.queryAllByRole('menuitem'); + + // We expect all the top-level menu items to be laid out in the grid, but not the ones which + // belong to a submenu. + // (Note: In our test data, groups that are in submenus have the text "Sub" in them.) + const expectedMenuItems = jsonMenu.mainMenu.items.filter( + (i) => 'group' in i && !/sub/i.test(i.group), + ); + + it('the correct total number of items', () => { + expect(allMenuItems.length).toBe(expectedMenuItems.length); + }); + + it('the correct total number of groups with dividers', () => { + let cGroupsWithDividers = 0; + allMenuItems.forEach((m) => { + if (m.outerHTML?.match('hasDivider')) cGroupsWithDividers += 1; + }); + + // In the test data, only 4 of the column-level groups contain menu items. They are in two + // columns and there should be no divider for the final group in each column. + expect(cGroupsWithDividers).toBe(2); + }); + + it('the last group in a column without a final separator', () => { + const htmlForAddParatextVideoItem = allMenuItems + .map((i) => i.outerHTML) + .find((html) => html && /%video_AddParatextVideo%/.test(html)); + + expect(htmlForAddParatextVideoItem).toBeDefined(); + expect(htmlForAddParatextVideoItem).not.toMatch('hasDivider'); + }); +}); diff --git a/lib/platform-bible-react/src/components/mui/grouped-menu-item-list.component.tsx b/lib/platform-bible-react/src/components/mui/grouped-menu-item-list.component.tsx new file mode 100644 index 0000000000..0c7602fedb --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/grouped-menu-item-list.component.tsx @@ -0,0 +1,211 @@ +import MenuItem, { + MenuItemListProps, + MenuItemProps, + MenuPropsBase, +} from '@/components/mui/menu-item.component'; +import { Menu } from '@mui/material'; +import { + Localized, + MenuGroupDetailsInSubMenu, + MenuItemContainingCommand, + MenuItemContainingSubmenu, + OrderedExtensibleContainer, + ReferencedItem, + SingleColumnMenu, +} from 'platform-bible-utils'; +import { MouseEvent, useMemo, useState } from 'react'; + +/** + * All the exported types in this file should be regarded as "internal" (i.e., they should not be + * exposed via index.ts). + */ + +export type GroupedMenuPropsBase = MenuPropsBase & { + /** Optional unique (column) identifier */ + columnId?: ReferencedItem; +}; + +export type GroupedMenuItemListProps = MenuItemListProps & { + /** + * If the menuDefinition includes "top-level" groups (i.e., those that belong to a column as + * opposed to those that belong to a submenu) that should not be included in the list, then this + * array specifies which groups to include. Likewise, for a submenu, this list indicates which + * groups are pertinent for that submenu. So then for a context menu this property need not be + * specified since it is a top-level menu based on a "true" SingleColumnMenu (i.e., one that is + * not a MultiColumnMenu). + */ + includedGroups?: { + id: string; + group: Localized; + }[]; +}; + +interface ItemInfo { + item: Localized; + isLastItemInGroup: boolean; +} + +type SubMenuProps = MenuPropsBase & { + parentMenuItem: Localized; + parentItemProps: Omit, 'iconPathAfter'>; +}; + +function getAllGroups(menuDefinition: Localized) { + const groupEntries = Object.entries(menuDefinition.groups); + // Convert array of entries to array of objects with id and group properties + return groupEntries.map(([key, value]) => ({ id: key, group: value })); +} + +function SubMenu(props: SubMenuProps) { + const [anchorEl, setAnchorEl] = useState(undefined); + + const { parentMenuItem, parentItemProps, menuDefinition } = props; + + const handleParentMenuItemClick = (event: MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(undefined); + }; + + const renderSubMenuItems = () => { + let includedGroups = getAllGroups(menuDefinition).filter((g) => 'menuItem' in g.group); + + // Ensure valid parent menu was provided. (If not, submenu will contain all groups!) + if (!parentMenuItem?.id) throw new Error('A valid parent menu item is required for submenus.'); + + // When laying out a submenu, only include groups associated with the provided parent menu. + // Note: without the (annoying) redundant check that the included groups + // have the menuItem field, TS doesn't think it exists. + includedGroups = includedGroups.filter( + (group) => 'menuItem' in group.group && group.group.menuItem === parentMenuItem.id, + ); + + return ; + }; + + return ( + <> + + + {renderSubMenuItems()} + + + ); +} + +const getOrderedGroupItems = ( + groupId: string, + allItems: Localized[], +) => { + // Filter items that belong to the specified group + const itemsForGroup = allItems.filter((item) => item.group === groupId); + // Sort items based on order + const sortedItems = itemsForGroup.sort((a, b) => (a.order || 0) - (b.order || 0)); + return sortedItems; +}; + +/** + * This component is internal; it does not need to be exposed to the outside world since it is not + * useful on its own. It is used to generate and lay out the MenuItems that appear either on a + * top-level menu (in a GridMenu or ContextMenu) or in a submenu. + */ +export default function GroupedMenuItemList(menuProps: GroupedMenuItemListProps) { + const { menuDefinition, onClick, commandHandler, includedGroups } = menuProps; + + const { items, allowForLeadingIcons } = useMemo(() => { + const groupsToInclude = + includedGroups && includedGroups.length > 0 + ? includedGroups + : // We're apparently laying out a single-column menu (presumably a context menu). In this + // case, all groups should be included except ones that belong to a submenu. + getAllGroups(menuDefinition).filter((g) => !('menuItem' in g.group)); + + const sortedGroups = Object.values(groupsToInclude).sort( + (a, b) => (a.group.order || 0) - (b.group.order || 0), + ); + + const itemArray: ItemInfo[] = []; + + sortedGroups.forEach((group) => { + getOrderedGroupItems(group.id, menuDefinition.items).forEach((item) => + itemArray.push({ item, isLastItemInGroup: false }), + ); + if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = true; + }); + + // No divider after last item in final group. + if (itemArray.length > 0) itemArray[itemArray.length - 1].isLastItemInGroup = false; + + const allowSpaceForLeadingIcons = itemArray.some( + (i) => 'iconPathBefore' in i.item && i.item.iconPathBefore, + ); + + return { items: itemArray, allowForLeadingIcons: allowSpaceForLeadingIcons }; + }, [includedGroups, menuDefinition]); + + // Create props for MenuItem component including setting hasDivider for the last item in a group + const createMenuItemProps = ({ item, isLastItemInGroup }: ItemInfo) => { + const menuItemProps = { + className: 'papi-menu-item', + label: item.label, + tooltip: item.tooltip, + iconPathBefore: 'iconPathBefore' in item ? item.iconPathBefore : undefined, + iconPathAfter: 'iconPathAfter' in item ? item.iconPathAfter : undefined, + hasDivider: isLastItemInGroup, // Set hasDivider to true for the last item in a group + allowForLeadingIcons, + }; + + return menuItemProps; + }; + + const [firstItem] = items; + + if (!firstItem) return
    ; + + const divKey = firstItem.item.group; + + return ( +
    + {items.map((itemInfo, index) => { + const { item } = itemInfo; + const menuItemProps = createMenuItemProps(itemInfo); + if ('command' in item) { + const key = item.group + index; + return ( + ) => { + onClick?.(event); + commandHandler(item); + }} + {...menuItemProps} + /> + ); + } + return ( + + ); + })} +
    + ); +} diff --git a/lib/platform-bible-react/src/components/mui/hamburger-menu-button.component.tsx b/lib/platform-bible-react/src/components/mui/hamburger-menu-button.component.tsx new file mode 100644 index 0000000000..6bbcc1e57e --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/hamburger-menu-button.component.tsx @@ -0,0 +1,168 @@ +import GridMenu from '@/components/mui/grid-menu.component'; +import { Command, CommandHandler } from '@/components/mui/menu-item.component'; +import usePromise from '@/hooks/use-promise.hook'; +import { Menu as MenuIcon } from '@mui/icons-material'; +import { Drawer, IconButton } from '@mui/material'; +import { Localized, MultiColumnMenu } from 'platform-bible-utils'; +import { + MouseEvent, + MutableRefObject, + PropsWithChildren, + useCallback, + useEffect, + useState, +} from 'react'; + +export interface MultiColumnMenuProvider { + (isSupportAndDevelopment: boolean): Promise>; +} + +export type HamburgerMenuButtonProps = PropsWithChildren & { + /** The handler to use for menu commands (and eventually toolbar commands). */ + commandHandler: CommandHandler; + + /** + * Optional reference to the "div" container that determines the where the menu should appear. If + * not defined, then (1,1) used. + */ + containerRef?: MutableRefObject; + + /** + * The delegate to use to get the menu data. If not specified or if it returns undefined, the data + * in normalMenu or fullMenu property will be used. + */ + menuProvider?: MultiColumnMenuProvider; + + /** + * The menu data to show when the menu is opened if the menuProvider property is not defined. + * (This allows for a default or test-only static menu to be used.) + */ + normalMenu?: Localized; + + /** + * The menu data to show for "full" menu (when opened with the SHIFT key pressed) if the + * menuProvider property is not defined. (This allows for a default or test-only static menu to be + * used.) + */ + fullMenu?: Localized; + + /** Additional css class(es) to help with unique styling of the sub-components */ + className?: string; + + /** Value to use as prefix for ARIA labels on interactive sub-components */ + ariaLabelPrefix?: string; +}; + +export default function HamburgerMenuButton({ + menuProvider, + normalMenu, + fullMenu, + commandHandler, + containerRef, + className, + ariaLabelPrefix, + children, +}: HamburgerMenuButtonProps) { + const [isMenuOpen, setMenuOpen] = useState(false); + const [showFullMenu, setShowFullMenu] = useState(false); + + const handleMenuItemClick = useCallback(() => { + if (isMenuOpen) setMenuOpen(false); + setShowFullMenu(false); + }, [isMenuOpen]); + + const handleMenuButtonClick = useCallback((e: MouseEvent) => { + e.stopPropagation(); + setMenuOpen((prevIsOpen) => { + const isOpening = !prevIsOpen; + if (isOpening && e.shiftKey) setShowFullMenu(true); + else if (!isOpening) setShowFullMenu(false); + return isOpening; + }); + }, []); + + const menuCommandHandler = useCallback( + (command: Command) => { + handleMenuItemClick(); + return commandHandler(command); + }, + [commandHandler, handleMenuItemClick], + ); + + const [offset, setOffset] = useState({ top: 1, left: 1 }); + + useEffect(() => { + if (isMenuOpen) { + const node = containerRef?.current; + if (node) { + const rect = node.getBoundingClientRect(); + const scrollTop = window.scrollY; + const scrollLeft = window.scrollX; + const top = rect.top + scrollTop + node.clientHeight; + const left = rect.left + scrollLeft; + setOffset({ top, left }); + } + } + }, [isMenuOpen, containerRef]); + + const [normalMenuData] = usePromise( + useCallback(async () => { + return menuProvider?.(false) ?? normalMenu; + // isMenuOpen needs to be included for the menu contents to reevaluate when reopened + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [menuProvider, normalMenu, isMenuOpen]), + normalMenu, + ); + + const [fullMenuData] = usePromise( + useCallback(async () => { + return menuProvider?.(true) ?? fullMenu ?? normalMenuData; + // isMenuOpen needs to be included for the menu contents to reevaluate when reopened + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [menuProvider, fullMenu, normalMenuData, isMenuOpen]), + fullMenu ?? normalMenuData, + ); + + const menu = showFullMenu && fullMenuData ? fullMenuData : normalMenuData; + + return ( + <> + + {children ?? } + + + {menu ? ( + + ) : undefined} + + + ); +} diff --git a/lib/platform-bible-react/src/components/mui/icon-button.component.css b/lib/platform-bible-react/src/components/mui/icon-button.component.css new file mode 100644 index 0000000000..5ab7240941 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/icon-button.component.css @@ -0,0 +1,26 @@ +.papi-icon-button { + border: 0; + border-radius: 3em; + cursor: pointer; + display: inline-block; +} + +.papi-icon-button.primary { + background-color: #1ea7fd; + color: white; +} + +.papi-icon-button.secondary { + background-color: transparent; + color: #333; +} + +.papi-icon-button.paratext { + background-color: darkgreen; + color: greenyellow; +} + +.papi-icon-button.paratext.bright { + background-color: greenyellow; + color: darkgreen; +} diff --git a/lib/platform-bible-react/src/components/mui/icon-button.component.tsx b/lib/platform-bible-react/src/components/mui/icon-button.component.tsx new file mode 100644 index 0000000000..f135682982 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/icon-button.component.tsx @@ -0,0 +1,77 @@ +import '@/components/mui/icon-button.component.css'; +import { IconButton as MuiIconButton } from '@mui/material'; +import { MouseEventHandler, PropsWithChildren } from 'react'; + +export type IconButtonProps = PropsWithChildren<{ + /** Optional unique identifier */ + id?: string; + /** + * Required. Used as both the tooltip (aka, title) and the aria-label (used for accessibility, + * testing, etc.), unless a distinct tooltip is supplied. + */ + label: string; + /** + * Enabled status of button + * + * @default false + */ + isDisabled?: boolean; + /** Optional tooltip to display if different from the aria-label. */ + tooltip?: string; + /** If true, no tooltip will be displayed. */ + isTooltipSuppressed?: boolean; + /** + * If given, uses a negative margin to counteract the padding on one side (this is often helpful + * for aligning the left or right side of the icon with content above or below, without ruining + * the border size and shape). + * + * @default false + */ + adjustMarginToAlignToEdge?: 'end' | 'start' | false; + /** + * The size of the component. small is equivalent to the dense button styling. + * + * @default false + */ + size: 'small' | 'medium' | 'large'; + /** Additional css classes to help with unique styling of the button */ + className?: string; + /** Optional click handler */ + onClick?: MouseEventHandler; +}>; + +/** + * Iconic button a user can click to do something + * + * Thanks to MUI for heavy inspiration and documentation + * https://mui.com/material-ui/getting-started/overview/ + */ +function IconButton({ + id, + label, + isDisabled = false, + tooltip, + isTooltipSuppressed = false, + adjustMarginToAlignToEdge = false, + size = 'medium', + className, + onClick, + children, +}: IconButtonProps) { + return ( + + {children /* the icon to display */} + + ); +} + +export default IconButton; diff --git a/lib/platform-bible-react/src/components/mui/menu-item.component.css b/lib/platform-bible-react/src/components/mui/menu-item.component.css new file mode 100644 index 0000000000..cb42af13a6 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/menu-item.component.css @@ -0,0 +1,13 @@ +.papi-menu-item { + background-color: transparent; +} + +.papi-menu-icon-trailing { + margin-left: 10px; + place-content: flex-end; +} + +.papi-menu-item img { + max-width: 24px; + max-height: 24px; +} diff --git a/lib/platform-bible-react/src/components/mui/menu-item.component.tsx b/lib/platform-bible-react/src/components/mui/menu-item.component.tsx new file mode 100644 index 0000000000..2d5a5b7a7a --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/menu-item.component.tsx @@ -0,0 +1,203 @@ +import '@/components/mui/menu-item.component.css'; +import ArrowRightIcon from '@mui/icons-material/ArrowRight'; +import { + ListItemIcon as MuiListItemIcon, + ListItemText as MuiListItemText, + MenuItem as MuiMenuItem, +} from '@mui/material'; +import Tooltip from '@mui/material/Tooltip'; +import { Localized, ReferencedItem, SingleColumnMenu } from 'platform-bible-utils'; +import { MouseEvent, PropsWithChildren } from 'react'; + +type MenuItemInfoBase = { + /** Text (displayable in the UI) as the name of the menu item */ + label: string; + /** Text to display when the mouse hovers over the menu item */ + tooltip?: string; +}; + +export type Command = MenuItemInfoBase & { + /** Command to execute (string.string) */ + command: string; +}; + +type SubMenu = MenuItemInfoBase & { + /** Command to execute (string.string) */ + items: MenuItemInfo[]; +}; + +export interface CommandHandler { + (command: Command): void; +} + +export type MenuPropsBase = { + /* + * The JSON defining the menu whose items are to be rendered. This will typically be one of the + * menus in the "defs" in a Platform.Bible menu (see PlatformMenus). The schema for this is + * menuDocumentSchema (at the end of menus.model.ts). Note that while this is a + * "SingleColumnMenu", somewhat bizarrely, a MultiColumnMenu is a SingleColumnMenu, so it really + * could be a MultiColumnMenu, in which case, column had better be defined so it can be used + * to filter out the actual groups and items to display on the column. + */ + menuDefinition: Localized; + + commandHandler: CommandHandler; + + /** + * Additional action to perform when any menu item is clicked. Allows the caller to handle event + * (e.g., to close the menu). + */ + onClick?: (event: MouseEvent) => void; +}; + +export type MenuItemListProps = MenuPropsBase & { + /** Optional unique (column) identifier */ + columnId?: ReferencedItem; +}; + +export type MenuItemProps = Omit & + PropsWithChildren<{ + /** Optional unique identifier */ + id?: string; + + onClick: (event: MouseEvent) => void; + }>; + +type MenuItemInfo = (Command | SubMenu) & { + /** + * If specified, menu item will be inset if it does not have a leading icon. + * + * @default true + */ + allowForLeadingIcons?: boolean; + /** + * If specified, the path to the icon image to display on the leading side of the menu text. + * + * @default undefined (no leading icon will be shown) + */ + iconPathBefore?: string; + /** + * If specified, the path to the icon image to display on the trailing side of the menu text. + * + * @default undefined (no trailing icon will be shown) + */ + iconPathAfter?: string; + /** + * If true, list item is focused during the first mount + * + * @default false + */ + hasAutoFocus?: boolean; + + /** Additional css classes to help with unique styling of the menu item */ + className?: string; + + /** + * If true, the menu item will appear disabled and it will not respond to clicks or mouse hovers. + * + * @default false + */ + isDisabled?: boolean; + + /** + * If true, compact vertical padding designed for keyboard and mouse input is used. + * + * @default true + */ + isDense?: boolean; + + /** + * If true, a right-arrow icon will be displayed (iconPathAfter, if specified, will be ignored). + * + * @default false + */ + isSubMenuParent?: boolean; + + /** + * If true, the left and right padding is removed + * + * @default false + */ + hasDisabledGutters?: boolean; + + /** + * If true, a 1px light border is added to bottom of menu item + * + * @default false + */ + hasDivider?: boolean; + + /** Help identify which element has keyboard focus */ + focusVisibleClassName?: string; + + /** If it's a submenu, it should have the items property */ + items?: MenuItemInfo[]; +}; + +function getIcon(icon: string | undefined, menuLabel: string, leading: boolean) { + return icon ? ( + + {`${leading + + ) : undefined; +} + +export default function MenuItem(props: MenuItemProps) { + const { + onClick, + label, + tooltip, + allowForLeadingIcons = true, + iconPathBefore = undefined, + iconPathAfter = undefined, + hasAutoFocus = false, + className, + isDisabled = false, + isDense = true, + isSubMenuParent = false, + hasDisabledGutters = false, + hasDivider = false, + focusVisibleClassName, + id, + children, + } = props; + + const menuItem = ( + + {label ? ( + <> + {getIcon(iconPathBefore, label, true)} + + {isSubMenuParent ? ( + + + + ) : ( + getIcon(iconPathAfter, label, false) + )} + + ) : ( + children + )} + + ); + + return tooltip ? ( + +
    {menuItem}
    +
    + ) : ( + menuItem + ); +} diff --git a/lib/platform-bible-react/src/components/mui/sample.composed.full.menu.json b/lib/platform-bible-react/src/components/mui/sample.composed.full.menu.json new file mode 100644 index 0000000000..daab549fb1 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/sample.composed.full.menu.json @@ -0,0 +1,176 @@ +{ + "mainMenu": { + "columns": { + "paratext.paratext": { "label": "%mainMenu_Paratext%", "order": 0 }, + "platform.window": { "label": "%mainMenu_Window%", "order": 1 }, + "platform.layout": { "label": "%mainMenu_Layout%", "order": 2 }, + "platform.help": { "label": "%mainMenu_Help%", "order": 3, "isExtensible": true }, + "isExtensible": true + }, + "groups": { + "paratext.sendReceive": { "column": "paratext.paratext", "order": 1 }, + "paratext.openCreate": { "column": "paratext.paratext", "order": 2 }, + "paratext.saveDelete": { "column": "paratext.paratext", "order": 3 }, + "paratext.misc": { "column": "paratext.paratext", "order": 9999999, "isExtensible": true }, + "platform.windowGroup1": { "column": "platform.window", "order": 1 }, + "platform.windowGroup2": { "column": "platform.window", "order": 2 }, + "platform.layoutSaveDelete": { "column": "platform.layout", "order": 1 }, + "platform.helpGroup1": { "column": "platform.help", "order": 1 }, + "paratext.helpGroup": { "column": "platform.help", "order": 100 }, + "paratext.helpSubgroup": { "menuItem": "paratext.helpRoot", "order": 1 } + }, + "items": [ + { + "label": "%sendReceiveProjects%", + "tooltip": "%sendReceiveProjects_tooltip%", + "localizeNotes": "Main application menu > Paratext column > Send/Receive Projects", + "group": "paratext.sendReceive", + "order": 1, + "command": "paratext.sendReceiveProjects" + }, + { + "label": "%downloadInstallResources%", + "tooltip": "%downloadInstallResources_tooltip%", + "localizeNotes": "Main application menu > Paratext column > Download/Install Resources", + "group": "paratext.sendReceive", + "order": 2, + "command": "paratext.downloadInstallResources" + }, + { + "label": "%newProject%", + "tooltip": "%newProject_tooltip%", + "localizeNotes": "Main application menu > Paratext column > New Project", + "group": "paratext.openCreate", + "order": 1, + "command": "paratext.createNewProject" + }, + { + "label": "%openProject%", + "tooltip": "%openProject_tooltip%", + "localizeNotes": "Main application menu > Paratext column > Open Project", + "group": "paratext.openCreate", + "order": 2, + "command": "paratext.openProject" + }, + { + "label": "%openTextCollection%", + "localizeNotes": "Main application menu > Paratext column > Open Text Collection", + "group": "paratext.openCreate", + "order": 3, + "command": "paratext.openTextCollection" + }, + { + "label": "%paratext_help%", + "localizeNotes": "Main application menu > Help column > Paratext", + "group": "paratext.helpGroup", + "order": 100, + "id": "paratext.helpRoot" + }, + { + "label": "%paratext_helpVideos%", + "localizeNotes": "Main application menu > Help column > Paratext > Videos", + "group": "paratext.helpSubgroup", + "order": 1, + "command": "paratext.showHelpVideos" + }, + { + "label": "%paratext_helpGuide%", + "tooltip": "%paratext_helpGuide_tooltip%", + "localizeNotes": "Main application menu > Help column > Paratext > Guide", + "group": "paratext.helpSubgroup", + "order": 1, + "command": "paratext.showHelpGuide" + }, + { + "label": "%video_AddParatextVideo%", + "localizeNotes": "Main application menu > Paratext column > Add Video", + "group": "paratext.misc", + "order": 1, + "command": "videoExtension.addParatextVideo" + } + ] + }, + "defaultWebViewTopMenu": { + "columns": { + "platform.project": { "label": "%webView_Project%", "order": 1 }, + "platform.edit": { "label": "%webView_Edit%", "order": 2, "isExtensible": true } + }, + "groups": { + "platform.projectTop": { "column": "platform.project", "order": 1 }, + "platform.manageBooks": { "column": "platform.project", "order": 2 }, + "platform.deleteProject": { "column": "platform.project", "order": 3 }, + "platform.projectDetails": { "column": "platform.project", "order": 4, "isExtensible": true }, + "platform.undoRedo": { "column": "platform.edit", "order": 1 }, + "platform.cutCopyPaste": { "column": "platform.edit", "order": 2 } + }, + "items": [ + { + "label": "%projectSendReceive%", + "localizeNotes": "Web view main menu > Project > Send/Receive this project", + "group": "platform.projectTop", + "order": 1, + "command": "platform.sendReceiveProject" + }, + { + "label": "%projectAssignmentsAndProgress%", + "localizeNotes": "Web view main menu > Project > Assignments and progress...", + "group": "platform.projectTop", + "order": 2, + "command": "platform.assignments" + } + ] + }, + "defaultWebViewContextMenu": { + "groups": { + "platform.insert": { "order": 1, "isExtensible": true }, + "platform.wordList": { "order": 2, "isExtensible": true } + }, + "items": [ + { + "label": "%insertNote%", + "localizeNotes": "Web view context menu > Insert note...", + "group": "platform.insert", + "order": 1, + "command": "platform.insertNote" + }, + { + "label": "%wordList%", + "localizeNotes": "Web view context menu > Word list...", + "group": "platform.wordList", + "order": 1, + "command": "platform.openWordList" + } + ] + }, + "webViewMenus": { + "videoExtension.playEditWebView": { + "includeDefaults": false, + "topMenu": { + "columns": { + "videoExtension.video": { "label": "%video%", "order": 1 } + }, + "groups": { + "videoExtension.videoTop": { "column": "videoExtension.project", "order": 1 } + }, + "items": [ + { + "label": "%playVideo%", + "group": "videoExtension.videoTop", + "order": 1, + "command": "videoExtension.playVideo" + }, + { + "label": "%editVideo%", + "group": "videoExtension.videoTop", + "order": 2, + "command": "videoExtension.editVideo" + } + ] + }, + "contextMenu": { + "groups": {}, + "items": [] + } + } + } +} diff --git a/lib/platform-bible-react/src/components/mui/toolbar.component.css b/lib/platform-bible-react/src/components/mui/toolbar.component.css new file mode 100644 index 0000000000..cf5eb3e3c5 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/toolbar.component.css @@ -0,0 +1,10 @@ +.papi-menu-drawer-paper { + height: fit-content !important; + position: absolute !important; +} + +.papi-toolbar-children { + padding: 10px; + display: flex; + gap: 8px; +} diff --git a/lib/platform-bible-react/src/components/mui/toolbar.component.tsx b/lib/platform-bible-react/src/components/mui/toolbar.component.tsx new file mode 100644 index 0000000000..664b91f09f --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/toolbar.component.tsx @@ -0,0 +1,57 @@ +import HamburgerMenuButton, { + MultiColumnMenuProvider, +} from '@/components/mui/hamburger-menu-button.component'; +import { CommandHandler } from '@/components/mui/menu-item.component'; +import '@/components/mui/toolbar.component.css'; +import { cn } from '@/utils/shadcn-ui.util'; +import { AppBar, Toolbar as MuiToolbar } from '@mui/material'; +import { PropsWithChildren, useRef } from 'react'; + +export type ToolbarProps = PropsWithChildren<{ + /** The handler to use for menu commands (and eventually toolbar commands). */ + commandHandler: CommandHandler; + + /** + * The optional delegate to use to get the menu data. If not specified, the "hamburger" menu will + * not display. + */ + menuProvider?: MultiColumnMenuProvider; + + /** Optional unique identifier */ + id?: string; + + /** Additional css classes to help with unique styling of the toolbar */ + className?: string; +}>; + +export default function Toolbar({ + menuProvider, + commandHandler, + className, + id, + children, +}: ToolbarProps) { + // This ref will always be defined + // eslint-disable-next-line no-type-assertion/no-type-assertion + const containerRef = useRef(undefined!); + + return ( +
    + + + {menuProvider ? ( + + ) : undefined} + {children ?
    {children}
    : undefined} +
    +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/components/mui/top-level-menu.component.tsx b/lib/platform-bible-react/src/components/mui/top-level-menu.component.tsx new file mode 100644 index 0000000000..630bc16430 --- /dev/null +++ b/lib/platform-bible-react/src/components/mui/top-level-menu.component.tsx @@ -0,0 +1,34 @@ +import GroupedMenuItemList from '@/components/mui/grouped-menu-item-list.component'; +import { MenuItemListProps } from '@/components/mui/menu-item.component'; +import { MultiColumnMenu } from 'platform-bible-utils'; + +/** + * This component is internal; it does not need to be exposed to the outside world since it is not + * useful on its own. Use either GridMenu or ContextMenu. + */ +export default function TopLevelMenu(props: MenuItemListProps) { + const { menuDefinition, columnId } = props; + + const groupEntries = Object.entries(menuDefinition.groups); + // Convert array of entries to array of objects with id and group properties + const groups = groupEntries.map(([key, value]) => ({ id: key, group: value })); + let includedGroups = groups.filter((g) => 'column' in g.group); + + // Check if column is provided and menuDefinition is a MultiColumnMenu + if ( + columnId && + 'columns' in menuDefinition && + // Without this type assertion, TS doesn't know what columns is. + // eslint-disable-next-line no-type-assertion/no-type-assertion + (menuDefinition as MultiColumnMenu).columns[columnId] + ) { + // When laying out a single column in a MultiColumnMenu, only include groups associated with + // the provided column. Note: without the (annoying) redundant check that the included groups + // have the colum field, TS doesn't think it exists. + includedGroups = includedGroups.filter( + (g) => 'column' in g.group && g.group.column === columnId, + ); + } + + return ; +} diff --git a/lib/platform-bible-react/src/components/shadcn-ui/alert.tsx b/lib/platform-bible-react/src/components/shadcn-ui/alert.tsx new file mode 100644 index 0000000000..4489f71136 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/alert.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const alertVariants = cva( + 'pr-relative pr-w-full pr-rounded-lg pr-border pr-p-4 [&>svg~*]:pr-pl-7 [&>svg+div]:pr-translate-y-[-3px] [&>svg]:pr-absolute [&>svg]:pr-left-4 [&>svg]:pr-top-4 [&>svg]:pr-text-foreground', + { + variants: { + variant: { + default: 'pr-bg-background pr-text-foreground', + destructive: + 'pr-border-destructive/50 pr-text-destructive dark:pr-border-destructive [&>svg]:pr-text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
    +)); +Alert.displayName = 'Alert'; + +const AlertTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */} + {props.children}{' '} +
    + ), +); +AlertTitle.displayName = 'AlertTitle'; + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
    +)); +AlertDescription.displayName = 'AlertDescription'; + +export { Alert, AlertTitle, AlertDescription }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/button.tsx b/lib/platform-bible-react/src/components/shadcn-ui/button.tsx new file mode 100644 index 0000000000..bf42b0199b --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/button.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { cn } from '@/utils/shadcn-ui.util'; + +export const buttonVariants = cva( + 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-whitespace-nowrap pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50', + { + variants: { + variant: { + default: 'pr-bg-primary pr-text-primary-foreground hover:pr-bg-primary/90', + destructive: 'pr-bg-destructive pr-text-destructive-foreground hover:pr-bg-destructive/90', + outline: + 'pr-border pr-border-input pr-bg-background hover:pr-bg-accent hover:pr-text-accent-foreground', + secondary: 'pr-bg-secondary pr-text-secondary-foreground hover:pr-bg-secondary/80', + ghost: 'hover:pr-bg-accent hover:pr-text-accent-foreground', + link: 'pr-text-primary pr-underline-offset-4 hover:pr-underline', + }, + size: { + default: 'pr-h-10 pr-px-4 pr-py-2', + sm: 'pr-h-9 pr-rounded-md pr-px-3', + lg: 'pr-h-11 pr-rounded-md pr-px-8', + icon: 'pr-h-10 pr-w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +export const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button'; + return ( + + ); + }, +); +Button.displayName = 'Button'; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/card.tsx b/lib/platform-bible-react/src/components/shadcn-ui/card.tsx new file mode 100644 index 0000000000..abacc1712c --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/card.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Card = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ), +); +Card.displayName = 'Card'; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ), +); +CardHeader.displayName = 'CardHeader'; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

    + {/* added because of https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md */} + {props.children} +

    + ), +); +CardTitle.displayName = 'CardTitle'; + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

    +)); +CardDescription.displayName = 'CardDescription'; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) => ( +

    + ), +); +CardContent.displayName = 'CardContent'; + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ), +); +CardFooter.displayName = 'CardFooter'; + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/checkbox.tsx b/lib/platform-bible-react/src/components/shadcn-ui/checkbox.tsx new file mode 100644 index 0000000000..6e50205885 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/checkbox.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import { Check } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export default Checkbox; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/command.tsx b/lib/platform-bible-react/src/components/shadcn-ui/command.tsx new file mode 100644 index 0000000000..764fd1cc4f --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/command.tsx @@ -0,0 +1,143 @@ +import React from 'react'; +import { type DialogProps } from '@radix-ui/react-dialog'; +import { Command as CommandPrimitive } from 'cmdk'; +import { Search } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; +import { Dialog, DialogContent } from '@/components/shadcn-ui/dialog'; + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Command.displayName = CommandPrimitive.displayName; + +interface CommandDialogProps extends DialogProps {} + +function CommandDialog({ children, ...props }: CommandDialogProps) { + return ( + + + + {children} + + + + ); +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
    + + +
    +)); + +CommandInput.displayName = CommandPrimitive.Input.displayName; + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandList.displayName = CommandPrimitive.List.displayName; + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)); + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandGroup.displayName = CommandPrimitive.Group.displayName; + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandSeparator.displayName = CommandPrimitive.Separator.displayName; + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandItem.displayName = CommandPrimitive.Item.displayName; + +function CommandShortcut({ className, ...props }: React.HTMLAttributes) { + return ( + + ); +} +CommandShortcut.displayName = 'CommandShortcut'; + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +}; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/dialog.tsx b/lib/platform-bible-react/src/components/shadcn-ui/dialog.tsx new file mode 100644 index 0000000000..79a5939420 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/dialog.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import * as DialogPrimitive from '@radix-ui/react-dialog'; +import { X } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +function DialogHeader({ className, ...props }: React.HTMLAttributes) { + return ( +
    + ); +} +DialogHeader.displayName = 'DialogHeader'; + +function DialogFooter({ className, ...props }: React.HTMLAttributes) { + return ( +
    + ); +} +DialogFooter.displayName = 'DialogFooter'; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/dropdown-menu.tsx b/lib/platform-bible-react/src/components/shadcn-ui/dropdown-menu.tsx new file mode 100644 index 0000000000..de5a402084 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/dropdown-menu.tsx @@ -0,0 +1,228 @@ +import React from 'react'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import { Check, ChevronRight, Circle } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +export const DropdownMenu = DropdownMenuPrimitive.Root; + +export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +export const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +export const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +export const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +export type DropdownMenuSubTriggerProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.SubTrigger +> & { + className?: string; + inset?: boolean; +}; + +export type DropdownMenuSubContentProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.SubContent +> & { + className?: string; +}; + +export type DropdownMenuContentProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.Content +> & { + className?: string; + sideOffset?: number; +}; + +export type DropdownMenuItemProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.Item +> & { + className?: string; + inset?: boolean; +}; + +export type DropdownMenuCheckboxItemProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.CheckboxItem +> & { + className?: string; + checked?: boolean; +}; + +export type DropdownMenuRadioItemProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.RadioItem +> & { + className?: string; +}; + +export type DropdownMenuLabelProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.Label +> & { + className?: string; + inset?: boolean; +}; + +export type DropdownMenuSeparatorProps = React.ComponentPropsWithoutRef< + typeof DropdownMenuPrimitive.Separator +> & { + className?: string; +}; + +export type DropdownMenuShortcutProps = React.HTMLAttributes & { + className?: string; +}; + +export const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + DropdownMenuSubTriggerProps +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; + +export const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + DropdownMenuSubContentProps +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; + +export const DropdownMenuContent = React.forwardRef< + React.ElementRef, + DropdownMenuContentProps +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +/** + * TODO: fix: direction is not automatically handled by this component, so that shortcuts are + * display always to the right + */ +export const DropdownMenuItem = React.forwardRef< + React.ElementRef, + DropdownMenuItemProps +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +export const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + DropdownMenuCheckboxItemProps +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; + +export const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + DropdownMenuRadioItemProps +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +export const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + DropdownMenuLabelProps +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +export const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + DropdownMenuSeparatorProps +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +export function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps) { + return ( + + ); +} +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut'; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/input.tsx b/lib/platform-bible-react/src/components/shadcn-ui/input.tsx new file mode 100644 index 0000000000..b40eae95ee --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/input.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { cn } from '@/utils/shadcn-ui.util'; + +export interface InputProps extends React.InputHTMLAttributes {} + +export const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ); + }, +); +Input.displayName = 'Input'; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/label.tsx b/lib/platform-bible-react/src/components/shadcn-ui/label.tsx new file mode 100644 index 0000000000..667dd96c48 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/label.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import * as LabelPrimitive from '@radix-ui/react-label'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const labelVariants = cva( + 'pr-text-sm pr-font-medium pr-leading-none peer-disabled:pr-cursor-not-allowed peer-disabled:pr-opacity-70', +); + +export const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & VariantProps +>(({ className, ...props }, ref) => ( + +)); +Label.displayName = LabelPrimitive.Root.displayName; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/popover.tsx b/lib/platform-bible-react/src/components/shadcn-ui/popover.tsx new file mode 100644 index 0000000000..b55d2a042d --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/popover.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import * as PopoverPrimitive from '@radix-ui/react-popover'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Popover = PopoverPrimitive.Root; + +const PopoverTrigger = PopoverPrimitive.Trigger; + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; + +export { Popover, PopoverTrigger, PopoverContent }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/radio-group.tsx b/lib/platform-bible-react/src/components/shadcn-ui/radio-group.tsx new file mode 100644 index 0000000000..f9231fddc1 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/radio-group.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'; +import { Circle } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const RadioGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ); +}); +RadioGroup.displayName = RadioGroupPrimitive.Root.displayName; + +const RadioGroupItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + + + + + ); +}); +RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName; + +export { RadioGroup, RadioGroupItem }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/select.tsx b/lib/platform-bible-react/src/components/shadcn-ui/select.tsx new file mode 100644 index 0000000000..7e580ce924 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/select.tsx @@ -0,0 +1,151 @@ +import React from 'react'; +import * as SelectPrimitive from '@radix-ui/react-select'; +import { Check, ChevronDown, ChevronUp } from 'lucide-react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:pr-line-clamp-1', + className, + )} + {...props} + > + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = 'popper', ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +}; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/separator.tsx b/lib/platform-bible-react/src/components/shadcn-ui/separator.tsx new file mode 100644 index 0000000000..193c79e0f2 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/separator.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import * as SeparatorPrimitive from '@radix-ui/react-separator'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => ( + +)); +Separator.displayName = SeparatorPrimitive.Root.displayName; + +export { Separator }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/slider.tsx b/lib/platform-bible-react/src/components/shadcn-ui/slider.tsx new file mode 100644 index 0000000000..b58cc1d6f3 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/slider.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import * as SliderPrimitive from '@radix-ui/react-slider'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Slider = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + + +)); +Slider.displayName = SliderPrimitive.Root.displayName; + +export { Slider }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/sonner.tsx b/lib/platform-bible-react/src/components/shadcn-ui/sonner.tsx new file mode 100644 index 0000000000..f46cac9eda --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/sonner.tsx @@ -0,0 +1,25 @@ +import { ComponentProps } from 'react'; +import { toast as sonner, Toaster } from 'sonner'; + +type SonnerProps = ComponentProps; + +function Sonner({ ...props }: SonnerProps) { + return ( + + ); +} + +// The re-export of the sonner function was added manually +export { Sonner, sonner }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/switch.tsx b/lib/platform-bible-react/src/components/shadcn-ui/switch.tsx new file mode 100644 index 0000000000..7f11d11cce --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/switch.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import * as SwitchPrimitives from '@radix-ui/react-switch'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/table.tsx b/lib/platform-bible-react/src/components/shadcn-ui/table.tsx new file mode 100644 index 0000000000..1acd18a034 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/table.tsx @@ -0,0 +1,108 @@ +import React from 'react'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes & { stickyHeader?: boolean } +>(({ className, stickyHeader, ...props }, ref) => ( +
    + + +)); +Table.displayName = 'Table'; + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes & { stickyHeader?: boolean } +>(({ className, stickyHeader, ...props }, ref) => ( + +)); +TableHeader.displayName = 'TableHeader'; + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableBody.displayName = 'TableBody'; + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:pr-border-b-0', className)} + {...props} + /> +)); +TableFooter.displayName = 'TableFooter'; + +const TableRow = React.forwardRef>( + ({ className, ...props }, ref) => ( + + ), +); +TableRow.displayName = 'TableRow'; + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( + } + {createPreviewCell( + color, + colorString.split(', ')[2] === '0%' ? 'white' : 'inherit', + colorString, + )} + {invert ? : ''} + + ); +} + +function createPreviewCell(color: string, foreground: string, text: string) { + return ( + + ); +} + +export default function ThemeColorDisplay() { + return ( + <> +

    + Color variables are defined in{' '} + + index.css +
    +
    +
    +

    + {useTheme().theme.includes('paratext') ? ( + '' + ) : ( +

    + The currently selected theme is matching the Shadcn Slate theme, whereas ui.shadcn.com + uses the Zinc theme (with a deviating --ring 240 5% 64.9%). So be aware of the slight + differences of grayish / blueish tones. +
    +
    +

    + )} +

    Following colors are defined by the current theme:

    + {/* dummy to create all classes */} +
    +
    +)); +TableHead.displayName = 'TableHead'; + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableCell.displayName = 'TableCell'; + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
    +)); +TableCaption.displayName = 'TableCaption'; + +export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/tabs.tsx b/lib/platform-bible-react/src/components/shadcn-ui/tabs.tsx new file mode 100644 index 0000000000..1d70616224 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/tabs.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import * as TabsPrimitive from '@radix-ui/react-tabs'; + +import { cn } from '@/utils/shadcn-ui.util'; + +export const Tabs = TabsPrimitive.Root; + +export type TabsListProps = React.ComponentPropsWithoutRef & { + className?: string; +}; + +export type TabsTriggerProps = React.ComponentPropsWithoutRef & { + className?: string; +}; + +export type TabsContentProps = React.ComponentPropsWithoutRef & { + className?: string; +}; + +export const TabsList = React.forwardRef< + React.ElementRef, + TabsListProps +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +export const TabsTrigger = React.forwardRef< + React.ElementRef, + TabsTriggerProps +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +export const TabsContent = React.forwardRef< + React.ElementRef, + TabsContentProps +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/toggle-group.tsx b/lib/platform-bible-react/src/components/shadcn-ui/toggle-group.tsx new file mode 100644 index 0000000000..203a86bfb7 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/toggle-group.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'; +import { type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/utils/shadcn-ui.util'; +import { toggleVariants } from '@/components/shadcn-ui/toggle'; + +const ToggleGroupContext = React.createContext>({ + size: 'default', + variant: 'default', +}); + +const ToggleGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, size, children, ...props }, ref) => ( + + + {children} + + +)); + +ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName; + +const ToggleGroupItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, children, variant, size, ...props }, ref) => { + const context = React.useContext(ToggleGroupContext); + + return ( + + {children} + + ); +}); + +ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName; + +export { ToggleGroup, ToggleGroupItem }; diff --git a/lib/platform-bible-react/src/components/shadcn-ui/toggle.tsx b/lib/platform-bible-react/src/components/shadcn-ui/toggle.tsx new file mode 100644 index 0000000000..39f1fd8a91 --- /dev/null +++ b/lib/platform-bible-react/src/components/shadcn-ui/toggle.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import * as TogglePrimitive from '@radix-ui/react-toggle'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/utils/shadcn-ui.util'; + +const toggleVariants = cva( + 'pr-twp pr-inline-flex pr-items-center pr-justify-center pr-rounded-md pr-text-sm pr-font-medium pr-ring-offset-background pr-transition-colors hover:pr-bg-muted hover:pr-text-muted-foreground focus-visible:pr-outline-none focus-visible:pr-ring-2 focus-visible:pr-ring-ring focus-visible:pr-ring-offset-2 disabled:pr-pointer-events-none disabled:pr-opacity-50 data-[state=on]:pr-bg-accent data-[state=on]:pr-text-accent-foreground', + { + variants: { + variant: { + default: 'pr-bg-transparent', + outline: + 'pr-border pr-border-input pr-bg-transparent hover:pr-bg-accent hover:pr-text-accent-foreground', + }, + size: { + default: 'pr-h-10 pr-px-3', + sm: 'pr-h-9 pr-px-2.5', + lg: 'pr-h-11 pr-px-5', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +const Toggle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & VariantProps +>(({ className, variant, size, ...props }, ref) => ( + +)); + +Toggle.displayName = TogglePrimitive.Root.displayName; + +export { Toggle, toggleVariants }; diff --git a/lib/platform-bible-react/src/hooks/use-event-async.hook.ts b/lib/platform-bible-react/src/hooks/use-event-async.hook.ts new file mode 100644 index 0000000000..56d139661d --- /dev/null +++ b/lib/platform-bible-react/src/hooks/use-event-async.hook.ts @@ -0,0 +1,53 @@ +import { useCallback, useEffect } from 'react'; +import { PlatformEvent, PlatformEventAsync, PlatformEventHandler } from 'platform-bible-utils'; +import usePromise from './use-promise.hook'; + +const noopUnsubscriber = () => false; + +/** + * Adds an event handler to an asynchronously subscribing/unsubscribing event so the event handler + * runs when the event is emitted. Use `papi.network.getNetworkEvent` to use a networked event with + * this hook. + * + * @param event The asynchronously (un)subscribing event to subscribe to. + * + * - If event is a `PlatformEvent` or `PlatformEventAsync`, that event will be used + * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet + * available for example + * + * @param eventHandler The callback to run when the event is emitted + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + */ +const useEventAsync = ( + event: PlatformEvent | PlatformEventAsync | undefined, + eventHandler: PlatformEventHandler, +) => { + // Subscribe to the event asynchronously + const [unsubscribe] = usePromise( + useCallback(async () => { + // Do nothing if the event is not provided (in case the event is not yet available, for example) + if (!event) return noopUnsubscriber; + + // Wrap subscribe and unsubscribe in promises to allow normal events to be used as well + const unsub = await Promise.resolve(event(eventHandler)); + return async () => unsub(); + }, [eventHandler, event]), + noopUnsubscriber, + // We want the unsubscriber to return to default value immediately upon changing subscription + // So the useEffect below will unsubscribe asap + { preserveValue: false }, + ); + + // Unsubscribe from the event asynchronously (but we aren't awaiting the unsub) + useEffect(() => { + return () => { + if (unsubscribe !== noopUnsubscriber) { + unsubscribe(); + } + }; + }, [unsubscribe]); +}; + +export default useEventAsync; diff --git a/lib/platform-bible-react/src/hooks/use-event.hook.ts b/lib/platform-bible-react/src/hooks/use-event.hook.ts new file mode 100644 index 0000000000..a05ce13087 --- /dev/null +++ b/lib/platform-bible-react/src/hooks/use-event.hook.ts @@ -0,0 +1,33 @@ +import { PlatformEvent, PlatformEventHandler } from 'platform-bible-utils'; +import { useEffect } from 'react'; + +/** + * Adds an event handler to an event so the event handler runs when the event is emitted. Use + * `papi.network.getNetworkEvent` to use a networked event with this hook. + * + * @param event The event to subscribe to. + * + * - If event is a `PlatformEvent`, that event will be used + * - If event is undefined, the callback will not be subscribed. Useful if the event is not yet + * available for example + * + * @param eventHandler The callback to run when the event is emitted + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + */ +const useEvent = ( + event: PlatformEvent | undefined, + eventHandler: PlatformEventHandler, +) => { + useEffect(() => { + // Do nothing if the event is not provided (in case the event is not yet available, for example) + if (!event) return () => {}; + + const unsubscriber = event(eventHandler); + return () => { + unsubscriber(); + }; + }, [event, eventHandler]); +}; +export default useEvent; diff --git a/lib/platform-bible-react/src/hooks/use-promise.hook.ts b/lib/platform-bible-react/src/hooks/use-promise.hook.ts new file mode 100644 index 0000000000..58df887c28 --- /dev/null +++ b/lib/platform-bible-react/src/hooks/use-promise.hook.ts @@ -0,0 +1,86 @@ +import { useEffect, useRef, useState } from 'react'; + +export type UsePromiseOptions = { + /** + * Whether to leave the value as the most recent resolved promise value or set it back to + * defaultValue while running the promise again. Defaults to true + */ + preserveValue?: boolean; +}; + +/** Set up defaults for options for usePromise hook */ +function getUsePromiseOptionsDefaults(options: UsePromiseOptions): UsePromiseOptions { + return { + preserveValue: true, + ...options, + }; +} + +/** + * Awaits a promise and returns a loading value while the promise is unresolved + * + * @param promiseFactoryCallback A function that returns the promise to await. If this callback is + * undefined, the current value will be returned (defaultValue unless it was previously changed + * and `options.preserveValue` is true), and there will be no loading. + * + * WARNING: MUST BE STABLE - const or wrapped in useCallback. The reference must not be updated + * every render + * @param defaultValue The initial value to return while first awaiting the promise. If + * `options.preserveValue` is false, this value is also shown while awaiting the promise on + * subsequent calls. + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. This means that, if the `promiseFactoryCallback` changes and + * `options.preserveValue` is `false`, the returned value will be set to the current + * `defaultValue`. However, the returned value will not be updated if`defaultValue` changes. + * @param options Various options for adjusting how this hook runs the `promiseFactoryCallback` + * + * Note: this parameter is internally assigned to a `ref`, so changing it will not cause any hooks + * to re-run with its new value. However, the latest `options.preserveValue` will always be used + * appropriately to determine whether to preserve the returned value when changing the + * `promiseFactoryCallback` + * @returns `[value, isLoading]` + * + * - `value`: the current value for the promise, either the defaultValue or the resolved promise value + * - `isLoading`: whether the promise is waiting to be resolved + */ +const usePromise = ( + promiseFactoryCallback: (() => Promise) | undefined, + defaultValue: T, + options: UsePromiseOptions = {}, +): [value: T, isLoading: boolean] => { + // Use defaultValue as a ref so it doesn't update dependency arrays + const defaultValueRef = useRef(defaultValue); + defaultValueRef.current = defaultValue; + // Use options as a ref so it doesn't update dependency arrays + const optionsDefaultedRef = useRef(options); + optionsDefaultedRef.current = getUsePromiseOptionsDefaults(optionsDefaultedRef.current); + + const [value, setValue] = useState(() => defaultValueRef.current); + const [isLoading, setIsLoading] = useState(true); + useEffect(() => { + let promiseIsCurrent = true; + // If a promiseFactoryCallback was provided, we are loading. Otherwise, there is no loading to do + setIsLoading(!!promiseFactoryCallback); + (async () => { + // If there is a callback to run, run it + if (promiseFactoryCallback) { + const result = await promiseFactoryCallback(); + // If the promise was not already replaced, update the value + if (promiseIsCurrent) { + setValue(() => result); + setIsLoading(false); + } + } + })(); + + return () => { + // Mark this promise as old and not to be used + promiseIsCurrent = false; + if (!optionsDefaultedRef.current.preserveValue) setValue(() => defaultValueRef.current); + }; + }, [promiseFactoryCallback]); + + return [value, isLoading]; +}; +export default usePromise; diff --git a/lib/platform-bible-react/src/index.css b/lib/platform-bible-react/src/index.css new file mode 100644 index 0000000000..2f60745fc8 --- /dev/null +++ b/lib/platform-bible-react/src/index.css @@ -0,0 +1,134 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* Adding the preflight selector (pr-twp) to components was not changing the font as desired. + So this piece of code adds pr-font-sans everywhere we include preflight. */ + .pr-twp { + @apply pr-font-sans; + } + + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply pr-border-border; + } + + body { + @apply pr-bg-background pr-text-foreground; + } +} diff --git a/lib/platform-bible-react/src/index.ts b/lib/platform-bible-react/src/index.ts new file mode 100644 index 0000000000..7ce4b5cfc9 --- /dev/null +++ b/lib/platform-bible-react/src/index.ts @@ -0,0 +1,139 @@ +import './index.css'; + +// Components and Types +export { default as BookChapterControl } from './components/advanced/book-chapter-control/book-chapter-control.component'; +export { default as BookSelector } from './components/advanced/book-selector.component'; +export { + BOOK_SELECTOR_STRING_KEYS, + BookSelectionMode, +} from './components/advanced/book-selector.component'; +export type { BookSelectorLocalizedStrings } from './components/advanced/book-selector.component'; +export { default as DataTable } from './components/advanced/data-table/data-table.component'; +export type { + ColumnDef, + RowContents, + SortDirection, + TableContents, +} from './components/advanced/data-table/data-table.component'; +export { default as Inventory } from './components/advanced/inventory/inventory.component'; +export { + getSortingIcon, + INVENTORY_STRING_KEYS, +} from './components/advanced/inventory/inventory.component'; +export type { + InventoryLocalizedStrings, + ItemData, + Scope, + Status, +} from './components/advanced/inventory/inventory.component'; +export { + inventoryItemColumn, + inventoryCountColumn, + inventoryStatusColumn, +} from './components/advanced/inventory/inventory-columns'; +export { + default as NavigationContentSearch, + type TabKeyValueContent, +} from './components/advanced/navigation-content-search.component'; +export { default as ScriptureResultsViewer } from './components/advanced/scripture-results-viewer/scripture-results-viewer.component'; +export type { + ResultsSet, + ResultsSource, + ScriptureItemDetail, + ScriptureResultsViewerColumnInfo, + ScriptureResultsViewerProps, + ScriptureSrcItemDetail, +} from './components/advanced/scripture-results-viewer/scripture-results-viewer.component'; +export { + default as ScrollGroupSelector, + type ScrollGroupSelectorProps, +} from './components/advanced/scroll-group-selector.component'; +export { + SettingsList, + SettingsListHeader, + SettingsListItem, +} from './components/advanced/settings-components/settings-list.component'; + +export { default as ChapterRangeSelector } from './components/basics/chapter-range-selector.component'; +export type { ChapterRangeSelectorProps } from './components/basics/chapter-range-selector.component'; +export { default as Checklist } from './components/basics/checklist.component'; +export type { ChecklistProps } from './components/basics/checklist.component'; +export { default as ComboBox } from './components/basics/combo-box.component'; +export type { + ComboBoxLabelOption, + ComboBoxProps, + ComboBoxOption, +} from './components/basics/combo-box.component'; +export { default as GridMenu } from './components/mui/grid-menu.component'; +export type { GridMenuProps, GridMenuInfo } from './components/mui/grid-menu.component'; +export { default as HamburgerMenuButton } from './components/mui/hamburger-menu-button.component'; +export type { MultiColumnMenuProvider } from './components/mui/hamburger-menu-button.component'; +export { default as IconButton } from './components/mui/icon-button.component'; +export type { IconButtonProps } from './components/mui/icon-button.component'; +export { default as MenuItem } from './components/mui/menu-item.component'; +export type { CommandHandler, MenuItemListProps } from './components/mui/menu-item.component'; +export { default as SearchBar } from './components/basics/search-bar.component'; +export type { SearchBarProps } from './components/basics/search-bar.component'; +export { default as Spinner } from './components/basics/spinner.component'; +export type { SpinnerProps } from './components/basics/spinner.component'; +export { default as TextField } from './components/basics/text-field.component'; +export type { TextFieldProps } from './components/basics/text-field.component'; +export { default as Toolbar } from './components/mui/toolbar.component'; +export type { ToolbarProps } from './components/mui/toolbar.component'; + +export { Alert, AlertTitle, AlertDescription } from './components/shadcn-ui/alert'; +export { Button, type ButtonProps, buttonVariants } from './components/shadcn-ui/button'; +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +} from './components/shadcn-ui/card'; +export { default as Checkbox } from './components/shadcn-ui/checkbox'; +export * from './components/shadcn-ui/dropdown-menu'; +export { Input } from './components/shadcn-ui/input'; +export { Label } from './components/shadcn-ui/label'; +export { RadioGroup, RadioGroupItem } from './components/shadcn-ui/radio-group'; +export * from './components/shadcn-ui/select'; +export { Separator } from './components/shadcn-ui/separator'; +export * from './components/shadcn-ui/sonner'; +export { Slider } from './components/shadcn-ui/slider'; +export { Switch } from './components/shadcn-ui/switch'; +export * from './components/shadcn-ui/table'; +export { Tabs, TabsList, TabsContent, TabsTrigger } from './components/shadcn-ui/tabs'; +export { + VerticalTabs, + VerticalTabsList, + VerticalTabsContent, + VerticalTabsTrigger, +} from './components/basics/tabs-vertical'; +export { ToggleGroup, ToggleGroupItem } from './components/shadcn-ui/toggle-group'; + +export { default as InstallButton } from './components/advanced/extension-marketplace/buttons/install-button.component'; +export { default as EnableButton } from './components/advanced/extension-marketplace/buttons/enable-button.component'; +export { default as DisableButton } from './components/advanced/extension-marketplace/buttons/disable-button.component'; +export { default as UpdateButton } from './components/advanced/extension-marketplace/buttons/update-button.component'; +export { default as MarkdownRenderer } from './components/advanced/extension-marketplace/markdown-renderer.component'; +export { + default as FilterDropdown, + DropdownMenuItemType, + type DropdownItem, + type DropdownGroup, +} from './components/advanced/extension-marketplace/filter-dropdown.component'; +export { default as FilterButton } from './components/advanced/extension-marketplace/buttons/filter-button.component'; +export { default as NoExtensionsFound } from './components/advanced/extension-marketplace/no-extensions-found.component'; +export { default as MoreInfo } from './components/advanced/extension-marketplace/more-info.component'; +export { + default as VersionHistory, + type VersionInformation, + type VersionHistoryType, +} from './components/advanced/extension-marketplace/version-history.component'; +export { default as Footer } from './components/advanced/extension-marketplace/footer.component'; + +// Hooks +export { default as useEvent } from './hooks/use-event.hook'; +export { default as useEventAsync } from './hooks/use-event-async.hook'; +export { default as usePromise } from './hooks/use-promise.hook'; +export type { UsePromiseOptions } from './hooks/use-promise.hook'; diff --git a/lib/platform-bible-react/src/preview/README.md b/lib/platform-bible-react/src/preview/README.md new file mode 100644 index 0000000000..5c4873edf3 --- /dev/null +++ b/lib/platform-bible-react/src/preview/README.md @@ -0,0 +1,4 @@ +This folder contains a preview site to play with `platform-bible-react` components in a live, +hot-reloading environment without having to rebuild and run Platform.Bible every time. + +Run the preview with `npm start`. diff --git a/lib/platform-bible-react/src/preview/app.component.tsx b/lib/platform-bible-react/src/preview/app.component.tsx new file mode 100644 index 0000000000..6989fc8b86 --- /dev/null +++ b/lib/platform-bible-react/src/preview/app.component.tsx @@ -0,0 +1,58 @@ +import { useState } from 'react'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '..'; +import Compositions from './pages/components/advanced.component'; +import Basics from './pages/components/basics.component'; +import Guide from './pages/guide.component'; +import Layouts from './pages/layouts.component'; +import Playground from './pages/playground.component'; +import { DirToggle, Direction } from './preview-components/direction-toggle.component'; +import { ThemeProvider } from './preview-components/theme-provider.component'; +import { ThemeButton } from './preview-components/theme-toggle.component'; +import ContactButtons from './preview-components/contact-buttons.component'; + +function App() { + const [direction, setDirection] = useState('ltr'); + const changeDirectionHandler = (dir: Direction) => setDirection(dir); + + return ( + +
    +
    + + +
    +
    + +
    +

    platform-bible-react Preview

    + + + Basic Components + Advanced Components + Example Layouts + Playground + Guide & Colors + + + + + + + + + + + + + + + + + + +
    +
    + ); +} + +export default App; diff --git a/lib/platform-bible-react/src/preview/index.tsx b/lib/platform-bible-react/src/preview/index.tsx new file mode 100644 index 0000000000..c0d4e6df5e --- /dev/null +++ b/lib/platform-bible-react/src/preview/index.tsx @@ -0,0 +1,14 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './app.component'; + +const container = document.getElementById('root'); +if (!container) { + throw new Error('Document root element not found!'); +} + +createRoot(container).render( + + + , +); diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced.component.tsx new file mode 100644 index 0000000000..3ad3bdfffd --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced.component.tsx @@ -0,0 +1,161 @@ +import BookChapterControl from '@/components/advanced/book-chapter-control/book-chapter-control.component'; +import DataTable from '@/components/advanced/data-table/data-table.component'; +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import { ScriptureReference, ScrollGroupId } from 'platform-bible-utils'; +import { useState } from 'react'; +import NavigationContentSearch from '@/components/advanced/navigation-content-search.component'; +import ScrollGroupSelector from '@/components/advanced/scroll-group-selector.component'; +import MarketplaceButtonExamples from './advanced/marketplace-buttons.example.component'; +import ScriptureResultsViewerExample from './advanced/scripture-results-viewer.examples.component'; +import { columns, data } from './data-sources/data-table-content'; +import MarketplaceExamples from './advanced/marketplace.example.component'; +import InventoryExample from './advanced/inventory-example.component'; +import SettingsListExamples from './advanced/settings-list.examples.component'; +import BookSelectorExample from './advanced/book-selector-example.component'; + +const defaultScrRef: ScriptureReference = { + bookNum: 1, + chapterNum: 1, + verseNum: 1, +}; + +function Compositions({ direction }: HasDirection) { + const [scrRef, setScrRef] = useState(defaultScrRef); + const [scrollGroupId, setScrollGroupId] = useState(0); + const [searchValue, setSearchValue] = useState(''); + + const tabList = [ + { + key: 'tab1', + value: 'tab1', + content: ( +
    +

    TAB 1 CONTENT

    +
    + ), + }, + { + key: 'tab2', + value: 'tab2', + content: ( +
    +

    TAB 2 CONTENT

    +
    + ), + }, + { + key: 'tab3', + value: 'tab3', + content: ( +
    +

    TAB 3 CONTENT

    +
    + ), + }, + ]; + + const handleSearchChange = (newSearchValue: string) => { + setSearchValue(newSearchValue); + }; + + return ( +
    +

    + A place for components that are composed from basic components +

    + + + + Book Chapter Control + + Book Selector + Data Table + Inventory + Marketplace + + Navigation Content Search + + Result List + Settings Components + + Scroll Group Selector + + + + + +
    {JSON.stringify(scrRef)}
    +
    + + + + + + + +
    Scroll Group Id: {`${scrollGroupId}`}
    +
    + + + + + + + + + + Marketplace Buttons + + + Marketplace Components + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + ); +} + +export default Compositions; diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/book-selector-example.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/book-selector-example.component.tsx new file mode 100644 index 0000000000..8a1e0fddc3 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/book-selector-example.component.tsx @@ -0,0 +1,43 @@ +import BookSelector, { BookSelectionMode } from '@/components/advanced/book-selector.component'; +import { Canon } from '@sillsdev/scripture'; +import { useState } from 'react'; + +const localizedStrings = { + '%webView_bookSelector_currentBook%': 'Current Book', + '%webView_bookSelector_choose%': 'Choose', + '%webView_bookSelector_chooseBooks%': 'Choose Books', +}; + +function BookSelectorExample() { + const [startChapter, setStartChapter] = useState(0); + const [endChapter, setEndChapter] = useState(0); + const selectedBooksIds = [ + Canon.bookNumberToId(1), + Canon.bookNumberToId(4), + Canon.bookNumberToId(33), + ]; + + const handleSelectBooks = () => + console.log( + 'This should open the Book Select dialog, which is in the Platform.Bible renderer. This is too tightly coupled and should be fixed.', + ); + + return ( + { + console.log(`New mode is ${newMode}`); + }} + currentBookName="Genesis" + onSelectBooks={handleSelectBooks} + selectedBookIds={selectedBooksIds} + localizedStrings={localizedStrings} + /> + ); +} + +export default BookSelectorExample; diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/inventory-example.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/inventory-example.component.tsx new file mode 100644 index 0000000000..9660bc3f92 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/inventory-example.component.tsx @@ -0,0 +1,94 @@ +import { ColumnDef } from '@/components/advanced/data-table/data-table.component'; +import { + inventoryCountColumn, + inventoryItemColumn, + inventoryStatusColumn, +} from '@/components/advanced/inventory/inventory-columns'; +import Inventory, { + ItemData, + Scope, + Status, +} from '@/components/advanced/inventory/inventory.component'; +import { ScriptureReference } from 'platform-bible-utils'; +import { useState } from 'react'; +import scriptureSnippet from './scripture-snippet'; + +const defaultScrRef: ScriptureReference = { + bookNum: 1, + chapterNum: 1, + verseNum: 1, +}; + +const localizedStrings = { + '%webView_inventory_all%': 'All items', + '%webView_inventory_approved%': 'Approved items', + '%webView_inventory_filter_text%': 'Filter text...', + '%webView_inventory_occurrences_table_header_occurrence%': 'Occurrence', + '%webView_inventory_occurrences_table_header_reference%': 'Reference', + '%webView_inventory_scope_currentBook%': 'Current book', + '%webView_inventory_scope_chapter%': 'Current chapter', + '%webView_inventory_scope_verse%': 'Current verse', + '%webView_inventory_unapproved%': 'Unapproved items', + '%webView_inventory_unknown%': 'Unknown items', +}; + +const createColumns = ( + statusChangeHandler: (items: string[], status: Status) => void, +): ColumnDef[] => [ + inventoryItemColumn('Item'), + inventoryCountColumn('Count'), + inventoryStatusColumn('Status', statusChangeHandler), +]; + +const extractItems = (text: string, target: string | undefined = undefined): string[] => { + // Finds repeated words, and captures the first occurrence of the word + const repeatedWords = text.match(/\b(\p{L}+)\b(?= \b\1\b)/gu) || []; + + if (target) return repeatedWords?.filter((word) => word === target); + + return repeatedWords; +}; + +function InventoryExample() { + const [scrRef, setScrRef] = useState(defaultScrRef); + const [approvedItems, setApprovedItems] = useState(['well', 'he']); + const [unapprovedItems, setUnapprovedItems] = useState(['for', 'of']); + const [scope, setScope] = useState('book'); + + return ( +
    + + Approved items: +
      + {approvedItems.map((item) => { + return
    • - {item}
    • ; + })} +
    + Unapproved items: +
      + {unapprovedItems.map((item) => { + return
    • - {item}
    • ; + })} +
    +

    + Note: This Inventory example works on some static scripture data, so the scope selector is + not functional +

    +
    + ); +} + +export default InventoryExample; diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace-buttons.example.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace-buttons.example.component.tsx new file mode 100644 index 0000000000..0fe99e40ee --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace-buttons.example.component.tsx @@ -0,0 +1,68 @@ +import InstallButton from '@/components/advanced/extension-marketplace/buttons/install-button.component'; +import DisableButton from '@/components/advanced/extension-marketplace/buttons/disable-button.component'; +import UpdateButton from '@/components/advanced/extension-marketplace/buttons/update-button.component'; +import EnableButton from '@/components/advanced/extension-marketplace/buttons/enable-button.component'; +import FilterDropdown, { + DropdownMenuItemType, +} from '@/components/advanced/extension-marketplace/filter-dropdown.component'; + +export default function MarketplaceButtonExamples() { + const publisherFilterItems = ['All', 'Verified', 'Experimental']; + + const filterGroup = { + label: 'Publishers', + items: [ + ...publisherFilterItems.map((items) => ({ + label: items, + itemType: DropdownMenuItemType.Check, + onClick: () => {}, + })), + ], + }; + + const sortGroup = { + label: 'Sort by', + items: [ + { + label: 'Release Date (Newest First)', + itemType: DropdownMenuItemType.Radio, + onClick: () => {}, + }, + { label: 'Name A-Z', itemType: DropdownMenuItemType.Radio, onClick: () => {} }, + ], + }; + return ( + <> +

    + Note: These buttons are currently styled with fixed colors and are therefore not theme-able +

    +
    + FilterButton Button: +
    + +
    + InstallButton Button: +
    + {}} buttonText="Get" /> + {}} buttonText="Get" /> + {}} /> + {}} /> +
    + DisableButton Button: +
    + {}} /> + {}} /> +
    + EnableButton Button: +
    + {}} /> + {}} /> +
    + UpdateButton Button: +
    + {}} /> + {}} /> +
    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace.example.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace.example.component.tsx new file mode 100644 index 0000000000..d3fe30bfd7 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/marketplace.example.component.tsx @@ -0,0 +1,23 @@ +import Footer from '@/components/advanced/extension-marketplace/footer.component'; +import NoExtensionsFound from '@/components/advanced/extension-marketplace/no-extensions-found.component'; +import MoreInfo from '@/components/advanced/extension-marketplace/more-info.component'; + +export default function MarketplaceExamples() { + return ( +
    + +
    + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-results-viewer.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-results-viewer.examples.component.tsx new file mode 100644 index 0000000000..1d8a117a38 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-results-viewer.examples.component.tsx @@ -0,0 +1,87 @@ +import ScriptureResultsViewer from '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component'; +import { Button } from '@/components/shadcn-ui/button'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import { useState } from 'react'; +import generateRandomCheckingData from '../data-sources/generate-random-checking-data'; + +export default function ScriptureResultsViewerExample({ direction }: HasDirection) { + const checks = [ + { + id: 'preview.repeatedWords', + displayName: 'Repeated Words', + possibleErrors: ['Word repeated'], + }, + { + id: 'preview.characters', + displayName: 'Characters', + possibleErrors: ['Invalid character', 'Unknown character'], + }, + { + id: 'preview.quotationMarks', + displayName: 'Quotation Marks', + possibleErrors: [ + 'Closing first-level quotation mark missing', + 'Closing second-level quotation mark missing', + 'Closing third-level quotation mark missing', + 'Missing continuer', + ], + }, + { + id: 'preview.chapterVerseNumbers', + displayName: 'Chapter/Verse Numbers', + possibleErrors: [ + 'Missing Verse number', + 'Missing chapter', + 'Empty verse', + 'Verse out of order', + 'Repeated verse number', + ], + }, + ]; + + const [sources, setSources] = useState(() => + checks.map((check) => ({ + source: check, + data: generateRandomCheckingData(check.possibleErrors), + })), + ); + + const updateSource = (index: number) => { + const newData = generateRandomCheckingData(checks[index].possibleErrors); + const updatedSource = { + ...sources[index], + data: newData, + }; + + // Create a new array with the updated source + const updatedSources = [...sources]; + updatedSources[index] = updatedSource; + + // Set the new array as the state + setSources(updatedSources); + }; + + return ( +
    +
    + {checks.map((check, index) => ( + + ))} +
    + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-snippet.ts b/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-snippet.ts new file mode 100644 index 0000000000..a80ba57ba8 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/scripture-snippet.ts @@ -0,0 +1,116 @@ +const scriptureSnippet: string = `\\id MAT 40-MAT-web.sfm World English Bible (WEB) +\\ide UTF-8 +\\h Matthew +\\toc1 The Good News According to Matthew +\\toc2 Matthew +\\toc3 Matthew +\\mt2 The Good News According to +\\mt1 Matthew +\\c 1 +\\p +\\v 1 The book of the genealogy of Jesus Christ,\\f + \\fr 1:1 \\ft Messiah (Hebrew) and Christ (Greek) both mean “Anointed One”\\f* the son of David, the son of Abraham. +\\p +\\v 2 Abraham became the father of Isaac. Isaac became the father of Jacob. Jacob became the father of Judah and his brothers. +\\v 3 Judah became the father of Perez and Zerah by Tamar. Perez became the father of Hezron. Hezron became the father of Ram. +\\v 4 Ram became the father of Amminadab. Amminadab became the father of Nahshon. Nahshon became the father of Salmon. +\\v 5 Salmon became the father of Boaz by Rahab. Boaz became the father of Obed by Ruth. Obed became the father of Jesse. +\\v 6 Jesse became the father of King David. David the king\\f + \\fr 1:6 \\ft NU omits “the king”.\\f* became the father of Solomon by her who had been Uriah’s wife. +\\v 7 Solomon became the father of Rehoboam. Rehoboam became the father of Abijah. Abijah became the father of Asa. +\\v 8 Asa became the father of Jehoshaphat. Jehoshaphat became the father of Joram. Joram became the father of Uzziah. +\\v 9 Uzziah became the father of Jotham. Jotham became the father of Ahaz. Ahaz became the father of Hezekiah. +\\v 10 Hezekiah became the father of Manasseh. Manasseh became the father of Amon. Amon became the father of Josiah. +\\v 11 Josiah became the father of Jechoniah and his brothers at the time of the exile to Babylon. +\\p +\\v 12 After the exile to Babylon, Jechoniah became the father of Shealtiel. Shealtiel became the father of Zerubbabel. +\\v 13 Zerubbabel became the father of Abiud. Abiud became the father of Eliakim. Eliakim became the father of Azor. +\\v 14 Azor became the father of Zadok. Zadok became the father of Achim. Achim became the father of Eliud. +\\v 15 Eliud became the father of Eleazar. Eleazar became the father of Matthan. Matthan became the father of Jacob. +\\v 16 Jacob became the father of Joseph, the husband of Mary, from whom was born Jesus,\\f + \\fr 1:16 \\ft “Jesus” means “Salvation”.\\f* who is called Christ. +\\p +\\v 17 So all the generations from Abraham to David are fourteen generations; from David to the exile to Babylon fourteen generations; and from the carrying away to Babylon to the Christ, fourteen generations. +\\p +\\v 18 Now the birth of Jesus Christ was like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like like this: After his mother, Mary, was engaged to Joseph, before they came together, she was found pregnant by the Holy Spirit. +\\v 19 Joseph, her husband, being a righteous man, and not willing to make her a public example, intended to put her away secretly. +\\v 20 But when he thought about these things, behold,\\f + \\fr 1:20 \\ft “Behold”, from “ἰδοὺ”, means look at, take notice, observe, see, or gaze at. It is often used as an interjection.\\f* an angel of the Lord appeared to him in a dream, saying, “Joseph, son of David, don’t be afraid to take to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to to yourself Mary as your wife, for that which is conceived in her is of the Holy Spirit. +\\v 21 She shall give birth to a son. You shall name him Jesus,\\f + \\fr 1:21 \\ft “Jesus” means “Salvation”.\\f* for it is he who shall save his people from their sins.” +\\p +\\v 22 Now all this has happened that it might be fulfilled which was spoken by the Lord through the prophet, saying, +\\q1 +\\v 23 “Behold, the virgin shall be with child, +\\q2 and shall give birth to a son. +\\q1 They shall call his name Immanuel,” +\\q2 which is, being interpreted, “God with us.”\\x + \\xo 1:23 \\xt Isaiah 7:14\\x* +\\p +\\v 24 Joseph arose from his sleep, and did as the angel of the Lord commanded him, and took his wife to himself; +\\v 25 and didn’t know her sexually until she had given birth to her firstborn son. He named him Jesus. +\\c 2 +\\p +\\v 1 Now when Jesus was born in Bethlehem of Judea in the days of King Herod, behold, wise men\\f + \\fr 2:1 \\ft The word for “wise men” (magoi) can also mean teachers, scientists, physicians, astrologers, seers, interpreters of dreams, or sorcerers.\\f* from the east came to Jerusalem, saying, +\\v 2 “Where is he who is born King of the Jews? For we saw his star in the east, and have come to worship him.” +\\v 3 When King Herod heard it, he was troubled, and all Jerusalem with him. +\\v 4 Gathering together all the chief priests and scribes of the people, he asked them where the Christ would be born. +\\v 5 They said to him, “In Bethlehem of of Judea, for this is written through the prophet, +\\q1 +\\v 6 ‘You Bethlehem, land of Judah, +\\q2 are in no way least among the princes of Judah; +\\q1 for out of you shall come a governor +\\q2 who shall shepherd my people, Israel.’”\\x + \\xo 2:6 \\xt Micah 5:2\\x* +\\p +\\v 7 Then Herod secretly called the wise men, and learned from them exactly what time the star appeared. +\\v 8 He sent them to Bethlehem, and said, “Go and search diligently for the young child. When you have found him, bring me word, so that I also may come and worship him.” +\\p +\\v 9 They, having heard the king, went their way; and behold, the star, which they saw in the east, went before them until it came and stood over where the young child was. +\\v 10 When they saw the star, they rejoiced with exceedingly great joy. +\\v 11 They came into the house and saw the young child with Mary, his mother, and they fell down and worshiped him. Opening their treasures, they offered to him gifts: gold, frankincense, and myrrh. +\\v 12 Being warned in a dream not to return to Herod, they went back to their own country another way. +\\p +\\v 13 Now when they had departed, behold, an angel of the Lord appeared to Joseph in a dream, saying, “Arise and take the young child and his mother, and flee into Egypt, and stay there until I tell you, for Herod will seek the young child to destroy him.” +\\p +\\v 14 He arose and took the young child and his mother by night and departed into Egypt, +\\v 15 and was there until the death of Herod, that it might be fulfilled which was spoken by the Lord through the prophet, saying, “Out of Egypt I called my son.”\\x + \\xo 2:15 \\xt Hosea 11:1\\x* +\\p +\\v 16 Then Herod, when he saw that he he was mocked by the wise men, was exceedingly angry, and sent out and killed all all the male children who were in Bethlehem and in all the surrounding countryside, from two years old and under, according to the exact time which he had learned from the wise men. +\\v 17 Then that which was spoken by Jeremiah the prophet was fulfilled, saying, +\\q1 +\\v 18 “A voice was heard in Ramah, +\\q2 lamentation, weeping and great mourning, +\\q1 Rachel weeping for her children; +\\q2 she wouldn’t be comforted, +\\q2 because they are no more.”\\x + \\xo 2:18 \\xt Jeremiah 31:15\\x* +\\p +\\v 19 But when Herod was dead, behold, an angel of the Lord appeared in a dream to Joseph in Egypt, saying, +\\v 20 “Arise and take the young child and his mother, and go into the land of Israel, for those who sought the young child’s life are dead.” +\\p +\\v 21 He arose and took the young child and his mother, and came into the land of Israel. +\\v 22 But when he heard that Archelaus was reigning over Judea in the place of his father, Herod, he was afraid to go there. Being warned in a dream, he withdrew into the region of Galilee, +\\v 23 and came and lived in a city called Nazareth; that it might be fulfilled which was spoken through the prophets that he will be called a Nazarene. +\\c 3 +\\p +\\v 1 In those days, John the Baptizer came, preaching in the wilderness of of Judea, saying, +\\v 2 “Repent, for the Kingdom of Heaven is at hand!” +\\v 3 For this is he who was spoken of by Isaiah the prophet, saying, +\\q1 “The voice of one crying in the wilderness, +\\q2 make the way of the Lord ready! +\\q2 Make his paths straight!”\\x + \\xo 3:3 \\xt Isaiah 40:3\\x* +\\p +\\v 4 Now John himself wore clothing made of camel’s hair with a leather belt around his waist. His food was locusts and wild honey. +\\v 5 Then people from Jerusalem, all of Judea, and all all the region around the Jordan went out to him. +\\v 6 They were baptized by him in the Jordan, confessing their sins. +\\p +\\v 7 But when he saw many of the Pharisees and Sadducees coming for his baptism, he said to them, “You offspring of vipers, who warned you to flee from the wrath to come? +\\v 8 Therefore produce fruit worthy of repentance! +\\v 9 Don’t think to yourselves, ‘We have Abraham for our father,’ for I tell you that God is able to raise up children to Abraham from these stones. +\\v 10 Even now the ax lies at the root of the trees. Therefore every tree that doesn’t produce good fruit is cut down, and cast into the fire. +\\p +\\v 11 “I indeed baptize you in water for repentance, but he who comes after me is mightier than I, whose sandals I am not worthy to carry. He will baptize you in the Holy Spirit.\\f + \\fr 3:11 \\ft TR and NU add “and with fire” \\f* +\\v 12 His winnowing fork is in his hand, and he will thoroughly cleanse his threshing floor. He will gather his wheat into the barn, but the chaff he will burn up with unquenchable fire.” +\\p +\\v 13 Then Jesus came from Galilee to the Jordan\\f + \\fr 3:13 \\ft i.e., the Jordan River\\f* to John, to be baptized by him. +\\v 14 But John would have hindered him, saying, “I need need to be baptized by you, and you come to me?” +\\p +\\v 15 But Jesus, answering, said to him, \\wj “Allow it now, for for this is the fitting way for us to fulfill all righteousness.”\\wj* Then he he allowed him. +\\p +\\v 16 Jesus, when he was baptized, went up directly from the water: and behold, the heavens were opened to him. He saw the Spirit of God descending as a dove, and coming on him. +\\v 17 Behold, a voice out of the heavens said, “This is my beloved Son, with whom I am well well pleased.”`; + +export default scriptureSnippet; diff --git a/lib/platform-bible-react/src/preview/pages/components/advanced/settings-list.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/advanced/settings-list.examples.component.tsx new file mode 100644 index 0000000000..b7c4ab717c --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/advanced/settings-list.examples.component.tsx @@ -0,0 +1,50 @@ +import { + SettingsList, + SettingsListHeader, + SettingsListItem, +} from '@/components/advanced/settings-components/settings-list.component'; +import { Input } from '@/components/shadcn-ui/input'; + +export default function SettingsListExamples() { + const generateComponent = (placeholder: string) => { + return ( + <> + {' '} + + ); + }; + + return ( + + + + {generateComponent('Red')} + + + {generateComponent('56')} + + + {generateComponent('color')} + + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics.component.tsx new file mode 100644 index 0000000000..99740211eb --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics.component.tsx @@ -0,0 +1,140 @@ +import SearchBar from '@/components/basics/search-bar.component'; +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import ExampleAlerts from './basics/alert.examples.component'; +import ButtonExamples from './basics/button.examples.component'; +import CardExamples from './basics/card.examples.component'; +import ChapterRangeSelectorExample from './basics/chapter-range-example.component'; +import CheckboxExamples from './basics/checkbox.examples.component'; +import ChecklistExamples from './basics/checklist.examples.component'; +import ComboBoxExamples from './basics/combo-box.examples.component'; +import DropdownExamples from './basics/dropdown.examples.component'; +import InputExamples from './basics/input.examples.component'; +import RadioGroupExamples from './basics/radio-group.examples'; +import SelectExamples from './basics/select.examples.component'; +import SliderExamples from './basics/slider.examples.component'; +import SonnerExamples from './basics/sonner.examples.component'; +import SpinnerExamples from './basics/spinner.examples.component'; +import SwitchExamples from './basics/switch.examples.component'; +import TabExamples from './basics/tab.examples.component'; +import TableExamples from './basics/table.examples.component'; +import ToggleGroupExamples from './basics/toggle-group.examples.component'; + +function Basics({ direction }: HasDirection) { + return ( +
    +

    A place for the most simple components

    + + + Alert + Button + Card + + Chapter Range Selector + + Checkbox + Checklist + Combo Box + Dropdown Menu + Input + Radio Group + Search Bar + Select + Slider + Sonner + Spinner + Switch + Tabs + Table + Toggle Group + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + alert(`you searched for ${search}`)} />{' '} + {direction === 'rtl' ? <>→ : <>←} type here +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + ); +} + +export default Basics; diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/alert.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/alert.examples.component.tsx new file mode 100644 index 0000000000..0225d98506 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/alert.examples.component.tsx @@ -0,0 +1,29 @@ +import { Alert, AlertDescription, AlertTitle } from '@/components/shadcn-ui/alert'; +import { AlertCircle, Terminal } from 'lucide-react'; + +export default function ExampleAlerts() { + return ( +
    + + + Heads up! + You can add components to your app using the cli. + + + + Settings are incomplete + + Results from the Capitalization check may be misleading because settings are incomplete + + + + + Alert! With only AlertDescription, this looks like a Card 🤔 + + + + Alert! With nothing else in it, this looks like a Card 🤔 + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/button.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/button.examples.component.tsx new file mode 100644 index 0000000000..86225130a9 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/button.examples.component.tsx @@ -0,0 +1,36 @@ +import { Button } from '@/components/shadcn-ui/button'; + +export default function ButtonExamples() { + return ( + + + + + + + + + + + +
    variant + + + + + + +
    size + default: + + icon: + + sm: + + lg: + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/card.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/card.examples.component.tsx new file mode 100644 index 0000000000..b49915a319 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/card.examples.component.tsx @@ -0,0 +1,104 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/shadcn-ui/card'; +import { Input } from '@/components/shadcn-ui/input'; +import { Label } from '@/components/shadcn-ui/label'; +import { Switch } from '@/components/shadcn-ui/switch'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import { BellRing, Check } from 'lucide-react'; +import SelectExamples from './select.examples.component'; + +export default function CardExamples({ direction }: HasDirection) { + const cardContent = ( +
    + +
    +

    Push Notifications

    +

    Send notifications to device.

    +
    + +
    + ); + + return ( +
    + Card only + + + Card with CardDescription only + + + + Card with CardHeader only + + + + + Card with CardHeader including a CardDescription + + + + + + Card with CardHeader including a CardTitle + + + + + + Psalms Layer-by-Layer + + Unpacking the meaning of the Psalms for translators + + + + + + + + + + Create project + Deploy your new project in one-click. + + +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + + +
    + + + + Notifications + You have 3 unread messages. + + {cardContent} + + + + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/chapter-range-example.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/chapter-range-example.component.tsx new file mode 100644 index 0000000000..b45dfdc8d2 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/chapter-range-example.component.tsx @@ -0,0 +1,26 @@ +import ChapterRangeSelector from '@/components/basics/chapter-range-selector.component'; +import { getChaptersForBook } from 'platform-bible-utils'; +import { useState } from 'react'; + +export default function ChapterRangeSelectorExample() { + const chapterCount = getChaptersForBook(1); + const [startChapter, setStartChapter] = useState(1); + const [endChapter, setEndChapter] = useState(chapterCount); + + const handleSelectStart = (newChapter: number) => { + setStartChapter(newChapter); + }; + + const handleSelectEnd = (newChapter: number) => { + setEndChapter(newChapter); + }; + return ( + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/checkbox.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/checkbox.examples.component.tsx new file mode 100644 index 0000000000..a4318edf21 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/checkbox.examples.component.tsx @@ -0,0 +1,34 @@ +import Checkbox from '@/components/shadcn-ui/checkbox'; +import { Label } from '@/components/shadcn-ui/label'; + +export default function CheckboxExamples() { + return ( +
    +

    Note: that the bug of checkboxes jumping up and down is already coming from Shadcn

    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/checklist.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/checklist.examples.component.tsx new file mode 100644 index 0000000000..9138f3e670 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/checklist.examples.component.tsx @@ -0,0 +1,29 @@ +import Checklist from '@/components/basics/checklist.component'; +import { Card, CardContent } from '@/components/shadcn-ui/card'; +import { useState } from 'react'; + +const listItems: string[] = ['Box A', 'Box B', 'Box C', 'Box D', 'Box E', 'Box F']; + +export default function ChecklistExamples() { + const [selectedListItems, setSelectedListItems] = useState(['Box B', 'Box E']); + + const handleSelectListItem = (item: string, selected: boolean): void => { + if (selected) setSelectedListItems((prevSelectedListItems) => [...prevSelectedListItems, item]); + else + setSelectedListItems((prevSelectedListItems) => + prevSelectedListItems.filter((listItem) => listItem !== item), + ); + }; + + return ( + + + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/combo-box.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/combo-box.examples.component.tsx new file mode 100644 index 0000000000..76b6f71487 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/combo-box.examples.component.tsx @@ -0,0 +1,38 @@ +import { useState } from 'react'; +import ComboBox from '@/components/basics/combo-box.component'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; + +export default function ComboBoxExamples({ direction }: HasDirection) { + const [comboBox1Value, setComboBox1Value] = useState(undefined); + const [comboBox2Value, setComboBox2Value] = useState(undefined); + + return ( +
    + +
    +

    Combobox with long text for options will truncate

    + +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/dropdown.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/dropdown.examples.component.tsx new file mode 100644 index 0000000000..7a1de9cd83 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/dropdown.examples.component.tsx @@ -0,0 +1,36 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '@/components/shadcn-ui/dropdown-menu'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import { ChevronDown } from 'lucide-react'; + +export default function DropdownExamples({ direction }: HasDirection) { + return ( + + + + + + DropdownMenuLabel + + + + DropdownMenuItem + ⇧⌘P + + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/input.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/input.examples.component.tsx new file mode 100644 index 0000000000..fa614be11e --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/input.examples.component.tsx @@ -0,0 +1,54 @@ +import TextField from '@/components/basics/text-field.component'; +import { Input } from '@/components/shadcn-ui/input'; + +export default function InputExamples() { + return ( + + + + + + + + + + + + + + + + + + + + + + + +
    + Text Field
    (wrapped)
    +
    + +
    + Shadcn Input +
    (shadcn-ui/input)
    +
    + +
    + Shdcn Input
    (from ui.shadcn.com → input)
    +
    + {/* copied from ui.shadcn.com but replaced ring-ring with pr-ring-[240 5% 64.9%], as they set --ring to this value in their style.css */} + +
    + Small Input +
    (from ui.jln.dev → popover)
    +
    + +
    + BVC Input
    (from book-chapter-control)
    +
    + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/radio-group.examples.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/radio-group.examples.tsx new file mode 100644 index 0000000000..188bfdd605 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/radio-group.examples.tsx @@ -0,0 +1,21 @@ +import { Label } from '@/components/shadcn-ui/label'; +import { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group'; + +export default function RadioGroupExamples() { + return ( + +
    + + +
    +
    + + +
    +
    + + +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/select.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/select.examples.component.tsx new file mode 100644 index 0000000000..d5de3e6d22 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/select.examples.component.tsx @@ -0,0 +1,24 @@ +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from '@/components/shadcn-ui/select'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; + +export default function SelectExamples({ direction }: HasDirection) { + return ( + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/slider.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/slider.examples.component.tsx new file mode 100644 index 0000000000..6fedfce377 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/slider.examples.component.tsx @@ -0,0 +1,21 @@ +import { Slider } from '@/components/shadcn-ui/slider'; +import { useState } from 'react'; + +export default function SliderExamples() { + const [sliderValue, setSlider] = useState([33]); + return ( + <> + + {sliderValue} + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/sonner.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/sonner.examples.component.tsx new file mode 100644 index 0000000000..77e697954e --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/sonner.examples.component.tsx @@ -0,0 +1,17 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { Sonner, sonner } from '@/components/shadcn-ui/sonner'; + +export default function SonnerExamples() { + return ( +
    + + + + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/spinner.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/spinner.examples.component.tsx new file mode 100644 index 0000000000..71fc62960b --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/spinner.examples.component.tsx @@ -0,0 +1,11 @@ +import Spinner from '@/components/basics/spinner.component'; + +export default function SpinnerExamples() { + return ( +
    + Default + Red + Size 10 +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/switch.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/switch.examples.component.tsx new file mode 100644 index 0000000000..761d9602fb --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/switch.examples.component.tsx @@ -0,0 +1,14 @@ +import { Switch } from '@/components/shadcn-ui/switch'; +import { useState } from 'react'; + +export default function SwitchExamples() { + const [value, setValue] = useState(false); + + return ( +
    + + + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/tab.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/tab.examples.component.tsx new file mode 100644 index 0000000000..71ef614401 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/tab.examples.component.tsx @@ -0,0 +1,55 @@ +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; +import { Button } from '@/components/shadcn-ui/button'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/shadcn-ui/tabs'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; + +export default function TabExamples({ direction }: HasDirection) { + return ( + <> + + + + + + Tab 2 + Tab 3 - no linked content + + Tab 1 Content + Tab 2 Content + {/* intentionally left out 3 to see the effect */} + +
    + + + + + + Tab 2 + Tab 3 + Tab 4 + + Tab 1 Content + +
    + Tab 2 Content: Another set of vertical tabs without a default value + + + Tab 2-1 + Tab 2-2 + + Tab 2-1 Content + Tab 2-2 Content + +
    +
    + Tab 3 Content + Tab 4 Content +
    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/table.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/table.examples.component.tsx new file mode 100644 index 0000000000..bc4cc384c4 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/table.examples.component.tsx @@ -0,0 +1,66 @@ +import { + Table, + TableBody, + TableCaption, + TableCell, + TableFooter, + TableHead, + TableHeader, + TableRow, +} from '@/components/shadcn-ui/table'; + +export default function TableExamples() { + const invoices = [ + { + invoice: 'INV001', + paymentStatus: 'Paid', + totalAmount: '$250.00', + paymentMethod: 'Credit Card', + }, + { + invoice: 'INV002', + paymentStatus: 'Pending', + totalAmount: '$150.00', + paymentMethod: 'PayPal', + }, + { + invoice: 'INV003', + paymentStatus: 'Unpaid', + totalAmount: '$350.00', + paymentMethod: 'Bank Transfer', + }, + ]; + + return ( + + A list of your recent invoices. + + + Invoice + Status + Method + Amount + + + + {invoices.map((invoice) => ( + + {invoice.invoice} + {invoice.paymentStatus} + {invoice.paymentMethod} + {invoice.totalAmount} + + ))} + + + + Total + -SUM- + + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/basics/toggle-group.examples.component.tsx b/lib/platform-bible-react/src/preview/pages/components/basics/toggle-group.examples.component.tsx new file mode 100644 index 0000000000..186eebd3c2 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/basics/toggle-group.examples.component.tsx @@ -0,0 +1,18 @@ +import { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group'; + +export default function ToggleGroupExamples() { + return ( +
    + + A + B + C + + + A + B + C + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/components/data-sources/data-table-content.tsx b/lib/platform-bible-react/src/preview/pages/components/data-sources/data-table-content.tsx new file mode 100644 index 0000000000..ca59954063 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/data-sources/data-table-content.tsx @@ -0,0 +1,84 @@ +import Checkbox from '@/components/shadcn-ui/checkbox'; +import { ColumnDef, SortDirection } from '@/components/advanced/data-table/data-table.component'; +import { Button } from '../../../..'; + +type MyDataType = { + character: string; +}; + +const getSortingIcon = (sortDirection: false | SortDirection): string => { + if (sortDirection === 'asc') { + return '↑'; + } + if (sortDirection === 'desc') { + return '↓'; + } + return '↕'; +}; + +export const data: MyDataType[] = [ + { character: '🦄' }, + { character: 'a' }, + { character: '1' }, + { character: '-' }, + { character: '#' }, + { character: 'A' }, + { character: 'ç' }, + { character: '€' }, + { character: '$' }, + { character: '𤭢' }, + { character: '𐐷' }, +]; + +export const columns: ColumnDef[] = [ + { + id: 'select', + header: ({ table }) => ( + table.toggleAllPageRowsSelected(!!value)} + aria-label="Select all" + /> + ), + cell: ({ row }) => ( + row.toggleSelected(!!value)} + aria-label="Select row" + /> + ), + enableSorting: false, + enableHiding: false, + }, + { + accessorKey: 'character', + header: ({ column }) => { + return ( + + ); + }, + }, + { + accessorKey: 'unicode_value', + header: 'Unicode Value', + cell: ({ row }) => { + const character: string = row.getValue('character'); + return character.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0'); + }, + }, + { + accessorKey: 'surrogate_pair', + header: 'Surrogate Pair', + cell: ({ row }) => { + const character: string = row.getValue('character'); + const codeUnit = character.charCodeAt(0); + + return codeUnit >= 0xd800 && codeUnit <= 0xdfff ? 'Yes' : 'No'; + }, + }, +]; diff --git a/lib/platform-bible-react/src/preview/pages/components/data-sources/generate-random-checking-data.ts b/lib/platform-bible-react/src/preview/pages/components/data-sources/generate-random-checking-data.ts new file mode 100644 index 0000000000..490f5970c4 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/components/data-sources/generate-random-checking-data.ts @@ -0,0 +1,30 @@ +import { ScriptureItemDetail } from '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component'; + +export default function generateRandomCheckingData(details: string[]): ScriptureItemDetail[] { + const getRandomNumber = (min: number, max: number) => + Math.floor(Math.random() * (max - min + 1)) + min; + + const numberOfResults = getRandomNumber(1, 10); + const results: ScriptureItemDetail[] = []; + + for (let i = 0; i < numberOfResults; i++) { + const randomOffset = getRandomNumber(0, 300); + const randomBookNum = getRandomNumber(1, 66); + const randomChapterNum = getRandomNumber(1, 150); + const randomVerseNum = getRandomNumber(1, 175); + const randomDetail = details[getRandomNumber(0, details.length - 1)]; + + results.push({ + start: { + jsonPath: '', + offset: randomOffset, + bookNum: randomBookNum, + chapterNum: randomChapterNum, + verseNum: randomVerseNum, + }, + detail: randomDetail, + }); + } + + return results; +} diff --git a/lib/platform-bible-react/src/preview/pages/guide.component.tsx b/lib/platform-bible-react/src/preview/pages/guide.component.tsx new file mode 100644 index 0000000000..c1e7450c45 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/guide.component.tsx @@ -0,0 +1,44 @@ +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; + +import { DirectionProps } from '@/preview/preview-components/direction-toggle.component'; +import DirectionGuide from './guide/direction.guide.component'; +import ThemeColorDisplay from './guide/theme-color-display.component'; +import ThemingGuide from './guide/theming.guide.component'; +import HowToGuide from './guide/howto.component'; + +function Guide({ direction, onChangeDirection: setDirection }: DirectionProps) { + return ( +
    +

    + A place to look up and learn about some concepts +

    + + + How to use + Direction + Theming + Current Theme Colors + + + + + + + + + + + + + + + +
    + ); +} +export default Guide; diff --git a/lib/platform-bible-react/src/preview/pages/guide/direction.guide.component.tsx b/lib/platform-bible-react/src/preview/pages/guide/direction.guide.component.tsx new file mode 100644 index 0000000000..3bf18c8d1f --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/guide/direction.guide.component.tsx @@ -0,0 +1,118 @@ +import { History } from 'lucide-react'; +import { Button } from '@/components/shadcn-ui/button'; +import { Input } from '@/components/shadcn-ui/input'; +import { DirectionProps, DirToggle } from '@/preview/preview-components/direction-toggle.component'; + +export default function DirectionGuide({ + direction, + onChangeDirection: setDirection, +}: DirectionProps) { + return ( + <> +

    + Direction is passed to the tabs using dir='ltr' or{' '} + dir='rtl' +

    +

    + You can easily try out your component / layout using the direction toggle in the upper right + corner. +

    +
    + Try it: change direction + +
    +
    +

    + One of the things to keep in mind is to use logical margin/padding definitions instead of + 'left' or 'right'. See{' '} + + https://tailwindcss.com/docs/margin#using-logical-properties + +

    + + + + + + + + + + + + + + + + + + + +
    + Bad example: pr-ml-2, pr-mr-2 + +
    + + + +
    +
    + Good example: pr-ms-2, pr-me-2 + +
    + + + +
    +
    + Bad example: pr-space-x-2 + +
    + + + +
    +
    + Good example: pr-gap-2 + +
    + + + +
    +
    +

    Other properties

    +

    + Bad: pr-text-right +

    +

    + Good: pr-text-end +

    +

    Another bad example

    +

    In left-to-right the icon should appear at the left

    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/guide/howto.component.tsx b/lib/platform-bible-react/src/preview/pages/guide/howto.component.tsx new file mode 100644 index 0000000000..c3b4f6cf37 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/guide/howto.component.tsx @@ -0,0 +1,24 @@ +export default function HowToGuide() { + return ( + <> +

    + To make changes to this preview edit files under{' '} + lib/platform-bible-react/src/preview/pages. On saving a file your changes will + show up immediately. +

    +
    +

    + For detailed explanation what to consider for developing components see{' '} + + the component creation page + {' '} + in the wiki. +

    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/guide/theme-color-display.component.tsx b/lib/platform-bible-react/src/preview/pages/guide/theme-color-display.component.tsx new file mode 100644 index 0000000000..e9ac33d471 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/guide/theme-color-display.component.tsx @@ -0,0 +1,97 @@ +import { Input } from '@/components/shadcn-ui/input'; +import { useTheme } from '@/preview/preview-components/theme-provider.component'; + +function createColorCells(color: string, invert: boolean = false) { + const colorString = getComputedStyle(document.documentElement).getPropertyValue(`--${color}`); + return ( + <> + {invert ? '' :
    {color}{color} + +
    + + + + + + + + + {['primary', 'secondary', 'destructive', 'muted', 'accent', 'popover', 'card'].map( + (color) => { + return ( + + {createPreviewCell(color, `${color}-foreground`, color)} + {createColorCells(color)} + {createColorCells(`${color}-foreground`, true)} + + ); + }, + )} + + {createPreviewCell('background', 'foreground', 'background')} + {createColorCells('background')} + {createColorCells('foreground', true)} + + {['border', 'input', 'ring'].map((color) => { + return ( + + + ); + })} + +
    Preview + BackgroundForeground +
    + {createColorCells(color)} +
    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/guide/theming.guide.component.tsx b/lib/platform-bible-react/src/preview/pages/guide/theming.guide.component.tsx new file mode 100644 index 0000000000..51f7a6c2ea --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/guide/theming.guide.component.tsx @@ -0,0 +1,91 @@ +import { Input } from '@/components/shadcn-ui/input'; +import { ThemeButton } from '@/preview/preview-components/theme-toggle.component'; + +export default function ThemingGuide() { + return ( + <> +

    By default we are sticking to use the existing shadcn styles.

    +

    + The components we install from shadcn already come with these styles. That means have a look + which properties the shadcn components expect (so that they will set their style themselves) + and use them accordingly. +

    +
    + Try it: change theme + +
    +

    + Shadcn already provides theming, defining the current theme values in{' '} + styling.css. You can easily test if your component adheres to the concept (and + so can be themed) by using the dark mode toggle (upper right corner). +

    + + + + + + + + + + + +
    + Bad example
    manual styles, unable to be themed
    +
    + +
    + Good example +
    theme-able by using the default styles
    +
    + +
    +

    Overwriting styles

    +

    + Try to not overwrite styles (colors). In case you need to, use Tailwind classes to apply + color variables, in the same way that shadcn does it. Shadcn defines the colors that you can + find on the next page. +

    +
    +

    + To overwrite styles use Tailwind css classes like{' '} + className="pr-bg-muted" on a header-like component and{' '} + className="pr-text-muted-foreground" for text on this component. +

    +

    + You can also use shades of these colors with{' '} + className="pr-bg-muted/50", but try to stay consistent with how + shadcn applies these styles in a very deliberate, rare choice. +

    +
    +

    + Descriptions on which colors should be used in which context are still to be added to this + preview app. If you are unsure, check out how{' '} + + shadcn + {' '} + uses a similar thing or talk to the{' '} + + Paratext UX team + + . +

    + + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/layouts.component.tsx b/lib/platform-bible-react/src/preview/pages/layouts.component.tsx new file mode 100644 index 0000000000..a14aa0c3f6 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/layouts.component.tsx @@ -0,0 +1,48 @@ +import { + VerticalTabs, + VerticalTabsContent, + VerticalTabsList, + VerticalTabsTrigger, +} from '@/components/basics/tabs-vertical'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import WindowOrTabExample from './layouts/window.layout.component'; +import Dashboard5Examples from './layouts/dashboard5.layout.component'; +import ToolbarExamples from './layouts/toolbar.layout.component'; + +function Layouts({ direction }: HasDirection) { + return ( +
    +

    A place to add examples for layouts

    + + + Window or Tab + MUI Toolbar + Settings (n/a) + Shadcn Dashboard 5 + + + +
    + + +
    + +
    + + + + + + TODO + + +
    + +
    +
    +
    +
    + ); +} + +export default Layouts; diff --git a/lib/platform-bible-react/src/preview/pages/layouts/dashboard5.layout.component.tsx b/lib/platform-bible-react/src/preview/pages/layouts/dashboard5.layout.component.tsx new file mode 100644 index 0000000000..db9c8a0c2c --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/layouts/dashboard5.layout.component.tsx @@ -0,0 +1,576 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +/* source: mostly copied and adapted from shadcn's blocks > dashboard 5 example */ +import { + Copy, + CreditCard, + File, + Home, + LineChart, + ListFilter, + MoreVertical, + Package, + Package2, + PanelLeft, + Search, + Settings, + ShoppingCart, + Truck, + User, + Users2, +} from 'lucide-react'; + +import { Button } from '@/components/shadcn-ui/button'; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/shadcn-ui/card'; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/shadcn-ui/dropdown-menu'; +import { Input } from '@/components/shadcn-ui/input'; + +import { Slider } from '@/components/shadcn-ui/slider'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/shadcn-ui/table'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/shadcn-ui/tabs'; +import { useState } from 'react'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; + +export default function Dashboard5Examples({ direction }: HasDirection) { + const [progress, setProgress] = useState([25]); + return ( +
    + +
    +
    + + + + + + + + + {/* */} + + + + + {/* + + + +
    Dashboard
    +
    +
    + + + +
    Orders
    +
    +
    + + + Recent Orders + +
    +
    */} +
    + + +
    + + + + + + My Account + + Settings + Support + + Logout + + +
    +
    +
    +
    + + + Your Orders + + Introducing Our Dynamic Orders Dashboard for Seamless Management and Insightful + Analysis. + + + + + + + + + This Week + $1,329 + + +
    + +{progress[0]}% from last week +
    +
    + + setProgress(value)} + aria-label={`${progress[0]}% increase`} + /> + +
    + + + This Month + $5,329 + + +
    +10% from last month
    +
    + Progress value={10} +
    +
    + +
    + + Week + Month + Year + +
    + + + + + + Filter by + + Fulfilled + Declined + Refunded + + + +
    +
    + + + + Orders + Recent orders from your store. + + + + + + Customer + Type + Status + Date + Amount + + + + + +
    Liam Johnson
    +
    + liam@example.com +
    +
    + Sale + +
    Fulfilled
    +
    + 2023-06-23 + $250.00 +
    + + +
    Olivia Smith
    +
    + olivia@example.com +
    +
    + Refund + +
    Declined
    +
    + 2023-06-24 + $150.00 +
    + + +
    Noah Williams
    +
    + noah@example.com +
    +
    + Subscription + +
    Fulfilled
    +
    + 2023-06-25 + $350.00 +
    + + +
    Emma Brown
    +
    + emma@example.com +
    +
    + Sale + +
    Fulfilled
    +
    + 2023-06-26 + $450.00 +
    + + +
    Liam Johnson
    +
    + liam@example.com +
    +
    + Sale + +
    Fulfilled
    +
    + 2023-06-23 + $250.00 +
    + + +
    Liam Johnson
    +
    + liam@example.com +
    +
    + Sale + +
    Fulfilled
    +
    + 2023-06-23 + $250.00 +
    + + +
    Olivia Smith
    +
    + olivia@example.com +
    +
    + Refund + +
    Declined
    +
    + 2023-06-24 + $150.00 +
    + + +
    Emma Brown
    +
    + emma@example.com +
    +
    + Sale + +
    Fulfilled
    +
    + 2023-06-26 + $450.00 +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + Order Oe31b70H + + + Date: November 23, 2023 +
    +
    + + + + + + + Edit + Export + + Trash + + +
    +
    + +
    +
    Order Details
    +
      +
    • + + Glimmer Lamps x 2 + + $250.00 +
    • +
    • + + Aqua Filters x 1 + + $49.00 +
    • +
    +
    +
      +
    • + Subtotal + $299.00 +
    • +
    • + Shipping + $5.00 +
    • +
    • + Tax + $25.00 +
    • +
    • + Total + $329.00 +
    • +
    +
    +
    +
    +
    +
    Shipping Information
    +
    + Liam Johnson + 1234 Main St. + Anytown, CA 12345 +
    +
    +
    +
    Billing Information
    +
    Same as shipping address
    +
    +
    +
    +
    +
    Customer Information
    +
    +
    +
    Customer
    +
    Liam Johnson
    +
    +
    +
    Email
    +
    + + liam@acme.com + +
    +
    +
    +
    Phone
    +
    + + +1 234 567 890 + +
    +
    +
    +
    +
    +
    +
    Payment Information
    +
    +
    +
    + + Visa +
    +
    **** **** **** 4532
    +
    +
    +
    +
    + +
    + Updated +
    + {/* + + + + + + + + + */} +
    +
    +
    +
    +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/layouts/toolbar.layout.component.tsx b/lib/platform-bible-react/src/preview/pages/layouts/toolbar.layout.component.tsx new file mode 100644 index 0000000000..340f48504c --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/layouts/toolbar.layout.component.tsx @@ -0,0 +1,31 @@ +import BookChapterControl from '@/components/advanced/book-chapter-control/book-chapter-control.component'; +import { MultiColumnMenuProvider } from '@/components/mui/hamburger-menu-button.component'; +import Toolbar from '@/components/mui/toolbar.component'; +import { Localized, MultiColumnMenu, ScriptureReference } from 'platform-bible-utils'; +import { useState } from 'react'; + +const defaultScrRef: ScriptureReference = { + bookNum: 1, + chapterNum: 1, + verseNum: 1, +}; + +export default function ToolbarExamples() { + const [scrRef] = useState(defaultScrRef); + const menu: MultiColumnMenu = { columns: {}, groups: {}, items: [] }; + const menuProvider: MultiColumnMenuProvider = () => + new Promise>((resolve) => { + resolve(menu); + }); + return ( +
    + {}}> + {}} /> + + + {}}> + {}} /> + +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/layouts/window.layout.component.tsx b/lib/platform-bible-react/src/preview/pages/layouts/window.layout.component.tsx new file mode 100644 index 0000000000..04190d9cf7 --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/layouts/window.layout.component.tsx @@ -0,0 +1,153 @@ +import BookChapterControl from '@/components/advanced/book-chapter-control/book-chapter-control.component'; +import { Button } from '@/components/shadcn-ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '@/components/shadcn-ui/dropdown-menu'; +import { Tabs, TabsList, TabsTrigger } from '@/components/shadcn-ui/tabs'; +import { HasDirection } from '@/preview/preview-components/direction-toggle.component'; +import { ScriptureReference } from 'platform-bible-utils'; +import { useState } from 'react'; + +export default function WindowOrTabExample({ direction }: HasDirection) { + const defaultScrRef: ScriptureReference = { + bookNum: 1, + chapterNum: 1, + verseNum: 1, + }; + const [scrRef, setScrRef] = useState(defaultScrRef); + return ( +
    +
    +
    + +
    +
    +
    + + + A + B + + + + + + + + Tab Options + + { + e.preventDefault(); + }} + > + Zoom + + 50% + -----o----- + 200% + + + { + e.preventDefault(); + }} + > + View + [Publish v] + + { + e.preventDefault(); + }} + > + Scroll with + + + + A + + + B + + + C + + + D + + + - + + + + + + + + + 1 item in a group + CTRL⇧F + + + + + Item without group + CTRL⇧F + + + + +
    + +
    +
    +

    + Imagine here the text of {JSON.stringify(scrRef)} +

    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum. +

    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum. +

    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum. +

    +
    +
    + ); +} diff --git a/lib/platform-bible-react/src/preview/pages/playground.component.tsx b/lib/platform-bible-react/src/preview/pages/playground.component.tsx new file mode 100644 index 0000000000..ff1cc4633c --- /dev/null +++ b/lib/platform-bible-react/src/preview/pages/playground.component.tsx @@ -0,0 +1,10 @@ +function Playground() { + return ( + <> +

    Put here whatever you want

    +

    🎉

    + + ); +} + +export default Playground; diff --git a/lib/platform-bible-react/src/preview/preview-components/contact-buttons.component.tsx b/lib/platform-bible-react/src/preview/preview-components/contact-buttons.component.tsx new file mode 100644 index 0000000000..3f95b6d7b8 --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/contact-buttons.component.tsx @@ -0,0 +1,27 @@ +import { Button } from '@/components/shadcn-ui/button'; +import { Mail } from 'lucide-react'; +import DiscordLogo from './discord-logo.component'; + +export default function ContactButtons() { + return ( + <> + Get in contact with the UX Team + + + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/preview-components/direction-toggle.component.tsx b/lib/platform-bible-react/src/preview/preview-components/direction-toggle.component.tsx new file mode 100644 index 0000000000..5917f80ca2 --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/direction-toggle.component.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Button, type ButtonProps } from '@/components/shadcn-ui/button'; + +export type Direction = 'rtl' | 'ltr'; +export type HasDirection = { direction: Direction }; +export type DirectionProps = HasDirection & { + onChangeDirection: (dir: Direction) => void; +}; + +export const DirToggle = React.forwardRef( + ({ className, direction, onChangeDirection: changeDirection, ...props }) => { + const oppositeDirection = direction === 'rtl' ? 'ltr' : 'rtl'; + return ( + + ); + }, +); diff --git a/lib/platform-bible-react/src/preview/preview-components/discord-logo.component.tsx b/lib/platform-bible-react/src/preview/preview-components/discord-logo.component.tsx new file mode 100644 index 0000000000..5e0719701e --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/discord-logo.component.tsx @@ -0,0 +1,17 @@ +export default function DiscordLogo() { + return ( + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/preview-components/paratext-logo.component.tsx b/lib/platform-bible-react/src/preview/preview-components/paratext-logo.component.tsx new file mode 100644 index 0000000000..14be9eb09f --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/paratext-logo.component.tsx @@ -0,0 +1,3 @@ +export default function ParatextLogo() { + return 'PT10'; +} diff --git a/lib/platform-bible-react/src/preview/preview-components/shadcn-logo.component.tsx b/lib/platform-bible-react/src/preview/preview-components/shadcn-logo.component.tsx new file mode 100644 index 0000000000..86c30206a0 --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/shadcn-logo.component.tsx @@ -0,0 +1,29 @@ +export default function ShadCnLogo() { + return ( + + + + + + ); +} diff --git a/lib/platform-bible-react/src/preview/preview-components/theme-provider.component.tsx b/lib/platform-bible-react/src/preview/preview-components/theme-provider.component.tsx new file mode 100644 index 0000000000..a80d0f4695 --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/theme-provider.component.tsx @@ -0,0 +1,78 @@ +// source: https://ui.shadcn.com/docs/dark-mode/vite + +import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; + +export type Theme = 'dark' | 'light' | 'system' | 'paratext-light' | 'paratext-dark'; + +type ThemeProviderProps = { + children: React.ReactNode; + defaultTheme?: Theme; + storageKey?: string; +}; + +type ThemeProviderState = { + theme: Theme; + setTheme: (theme: Theme) => void; +}; + +const initialState: ThemeProviderState = { + theme: 'system', + setTheme: () => undefined, +}; + +const ThemeProviderContext = createContext(initialState); + +export function ThemeProvider({ + children, + defaultTheme = 'system', + storageKey = 'vite-ui-theme', + ...props +}: ThemeProviderProps) { + const [theme, setTheme] = useState( + // Assert type from generic storage type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + () => (localStorage.getItem(storageKey) as Theme) || defaultTheme, + ); + + useEffect(() => { + const root = window.document.documentElement; + + root.classList.remove('light', 'dark', 'paratext-light', 'paratext-dark'); + + if (theme === 'system') { + const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches + ? 'dark' + : 'light'; + + root.classList.add(systemTheme); + return; + } + + root.classList.add(theme); + }, [theme]); + + const value = useMemo( + () => ({ + theme, + setTheme: (newTheme: Theme) => { + localStorage.setItem(storageKey, newTheme); + setTheme(newTheme); + }, + }), + [storageKey, theme], + ); + + return ( + + {children} + + ); +} + +export const useTheme = () => { + const context = useContext(ThemeProviderContext); + + if (context === undefined) throw new Error('useTheme must be used within a ThemeProvider'); + + return context; +}; diff --git a/lib/platform-bible-react/src/preview/preview-components/theme-toggle.component.tsx b/lib/platform-bible-react/src/preview/preview-components/theme-toggle.component.tsx new file mode 100644 index 0000000000..cc49819e86 --- /dev/null +++ b/lib/platform-bible-react/src/preview/preview-components/theme-toggle.component.tsx @@ -0,0 +1,100 @@ +// source: https://ui.shadcn.com/docs/dark-mode/vite + +import { Button } from '@/components/shadcn-ui/button'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import { Moon, Sun } from 'lucide-react'; +import React, { ComponentPropsWithoutRef } from 'react'; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/shadcn-ui/dropdown-menu'; +import ParatextLogo from './paratext-logo.component'; +import ShadCnLogo from './shadcn-logo.component'; +import { Theme, useTheme } from './theme-provider.component'; + +export type ThemeToggleProps = ComponentPropsWithoutRef & { + className?: string; +}; + +const ThemeToggle = React.forwardRef< + React.ElementRef, + ThemeToggleProps +>(({ className }, ref) => { + const { setTheme } = useTheme(); + return ( +
    + + + + + + + setTheme('light')}>Light + setTheme('dark')}>Dark + setTheme('system')}>System + + +
    + ); +}); + +export const ThemeButton = React.forwardRef< + React.ElementRef, + ThemeToggleProps +>(({ className }, ref) => { + const { theme, setTheme } = useTheme(); + return ( +
    +
    + +
    +
    + +
    +
    + ); +}); + +export default ThemeToggle; diff --git a/lib/platform-bible-react/src/utils/shadcn-ui.util.ts b/lib/platform-bible-react/src/utils/shadcn-ui.util.ts new file mode 100644 index 0000000000..20aab5c8fe --- /dev/null +++ b/lib/platform-bible-react/src/utils/shadcn-ui.util.ts @@ -0,0 +1,10 @@ +import { type ClassValue, clsx } from 'clsx'; +import { extendTailwindMerge } from 'tailwind-merge'; + +const twMergeCustom = extendTailwindMerge({ prefix: 'pr-' }); + +// shadcn/ui uses this export in its boilerplate code +// eslint-disable-next-line import/prefer-default-export +export function cn(...inputs: ClassValue[]) { + return twMergeCustom(clsx(inputs)); +} diff --git a/lib/platform-bible-react/tailwind.config.ts b/lib/platform-bible-react/tailwind.config.ts new file mode 100644 index 0000000000..e32c6ec580 --- /dev/null +++ b/lib/platform-bible-react/tailwind.config.ts @@ -0,0 +1,87 @@ +import { Config } from 'tailwindcss'; +import { scopedPreflightStyles } from 'tailwindcss-scoped-preflight'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for platform-bible-react - we don't want to conflict with other people's tailwind classes either + prefix: 'pr-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Restrict tailwind's preflight base css style modifications to within this component library + scopedPreflightStyles({ + // short for platform-bible-react tailwind-preflight - need to put this class on top of each component + cssSelector: '.pr-twp', + }), + // Plugin from shadcn/ui + tailwindCssAnimate, + ], +}; + +export default config; diff --git a/lib/platform-bible-react/tsconfig.json b/lib/platform-bible-react/tsconfig.json new file mode 100644 index 0000000000..449f442c51 --- /dev/null +++ b/lib/platform-bible-react/tsconfig.json @@ -0,0 +1,30 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "baseUrl": "./src", + "rootDir": "./src", + "target": "ESNext", + "module": "ESNext", + // Running npm i removes packages that are in common between the current directory's + // node_modules and any below. Without typeRoots specified like this, TypeScript climbs + // directories looking for node_modules/@types folders by default. + // We needed to remove react from here below because having two copies was causing problems in + // the jest tests. But we need the types in both places. + "typeRoots": ["./node_modules/@types", "../../node_modules/@types"], + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "forceConsistentCasingInFileNames": true, + "incremental": false, + "isolatedModules": true, + "noEmit": true, + "noImplicitReturns": false, + "skipLibCheck": false, + "useDefineForClassFields": true, + "outDir": "", + "paths": { + "@/*": ["./*"] + } + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/lib/platform-bible-react/tsconfig.lint.json b/lib/platform-bible-react/tsconfig.lint.json new file mode 100644 index 0000000000..468dd5a784 --- /dev/null +++ b/lib/platform-bible-react/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.cjs", "postcss.config.js", "*.ts", "src"] +} diff --git a/lib/platform-bible-react/tsconfig.node.json b/lib/platform-bible-react/tsconfig.node.json new file mode 100644 index 0000000000..66bfa30883 --- /dev/null +++ b/lib/platform-bible-react/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/lib/platform-bible-react/typedoc.json b/lib/platform-bible-react/typedoc.json new file mode 100644 index 0000000000..b26e48dc74 --- /dev/null +++ b/lib/platform-bible-react/typedoc.json @@ -0,0 +1,7 @@ +{ + "entryPoints": ["src/index.ts"], + "out": "docs", + "tsconfig": "tsconfig.json", + "sort": ["kind", "alphabetical"], + "kindSortOrder": ["Function"] +} diff --git a/lib/platform-bible-react/vite.config.ts b/lib/platform-bible-react/vite.config.ts new file mode 100644 index 0000000000..9762592de6 --- /dev/null +++ b/lib/platform-bible-react/vite.config.ts @@ -0,0 +1,41 @@ +import path from 'path'; +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import react from '@vitejs/plugin-react'; +import styleInject from '@senojs/rollup-plugin-style-inject'; +import { peerDependencies, dependencies } from './package.json'; + +const config = defineConfig({ + base: './', + plugins: [ + tsconfigPaths(), + react(), + styleInject({ + insertAt: 'top', + }), + ], + build: { + sourcemap: true, + lib: { + entry: path.resolve(__dirname, 'src/index.ts'), + formats: ['es', 'cjs'], + fileName: (format) => `index.${format === 'es' ? 'js' : format}`, + }, + rollupOptions: { + external: [ + ...Object.keys(peerDependencies ?? {}), + ...Object.keys(dependencies ?? {}), + 'react/jsx-runtime', + '@mui/styled-engine-sc', + '@mui/styled-engine', + ], + output: { + globals: { + react: 'React', + 'react-dom': 'ReactDOM', + }, + }, + }, + }, +}); +export default config; diff --git a/lib/platform-bible-utils/.babelrc.json b/lib/platform-bible-utils/.babelrc.json new file mode 100644 index 0000000000..00ca841a4b --- /dev/null +++ b/lib/platform-bible-utils/.babelrc.json @@ -0,0 +1,16 @@ +{ + "sourceType": "unambiguous", + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "chrome": 100 + } + } + ], + "@babel/preset-typescript", + "@babel/preset-react" + ], + "plugins": [] +} diff --git a/lib/platform-bible-utils/.editorconfig b/lib/platform-bible-utils/.editorconfig new file mode 100644 index 0000000000..bd59ac6a31 --- /dev/null +++ b/lib/platform-bible-utils/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 diff --git a/lib/platform-bible-utils/.eslintignore b/lib/platform-bible-utils/.eslintignore new file mode 100644 index 0000000000..2aa8552e24 --- /dev/null +++ b/lib/platform-bible-utils/.eslintignore @@ -0,0 +1,10 @@ +# Please keep this file in sync with .prettierignore and .stylelintignore + +# Dependency directory +node_modules + +# Built files +dist + +# Doc files +docs diff --git a/lib/platform-bible-utils/.eslintrc.cjs b/lib/platform-bible-utils/.eslintrc.cjs new file mode 100644 index 0000000000..c1f70ea27e --- /dev/null +++ b/lib/platform-bible-utils/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + extends: '../../.eslintrc.js', + root: true, + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + }, + rules: { + 'no-console': 'off', + '@typescript-eslint/no-explicit-any': 'error', + }, + parserOptions: { + project: './tsconfig.lint.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/lib/platform-bible-utils/.gitignore b/lib/platform-bible-utils/.gitignore new file mode 100644 index 0000000000..7946c9e76c --- /dev/null +++ b/lib/platform-bible-utils/.gitignore @@ -0,0 +1,27 @@ +# dependencies +node_modules + +# production +build +# dist # We want these commited so developers don't need to build the package. +dist-ssr +*.local +docs + +# logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/lib/platform-bible-utils/.prettierignore b/lib/platform-bible-utils/.prettierignore new file mode 100644 index 0000000000..c50824b13a --- /dev/null +++ b/lib/platform-bible-utils/.prettierignore @@ -0,0 +1,10 @@ +# Please keep this file in sync with .eslintignore and .stylelintignore + +# Dependency directory +node_modules + +# Built files +dist + +# Doc files +docs diff --git a/lib/platform-bible-utils/.prettierrc.json b/lib/platform-bible-utils/.prettierrc.json new file mode 100644 index 0000000000..5628319f03 --- /dev/null +++ b/lib/platform-bible-utils/.prettierrc.json @@ -0,0 +1 @@ +"../../.prettierrc.js" diff --git a/lib/platform-bible-utils/.vscode/settings.json b/lib/platform-bible-utils/.vscode/settings.json new file mode 100644 index 0000000000..0ff0da3fc8 --- /dev/null +++ b/lib/platform-bible-utils/.vscode/settings.json @@ -0,0 +1,58 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [100], + "editor.wordWrapColumn": 100, + + "eslint.validate": ["javascript", "javascriptreact", "html", "typescriptreact"], + + "files.associations": { + ".eslintignore": "ignore", + ".prettierignore": "ignore", + ".stylelintignore": "ignore" + }, + "files.eol": "\n", + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + "node_modules": true, + "npm-debug.log.*": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + }, + + "json.schemas": [ + { + "fileMatch": ["*tsconfig*.json"], + "url": "http://json.schemastore.org/tsconfig" + } + ], + + "todohighlight.keywords": [ + { + "text": "WARNING:", + "isWholeLine": true, + "color": "#FF0000", + "backgroundColor": "none", + "overviewRulerColor": "#FF000000" + }, + { + "text": "#region", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + }, + { + "text": "#endregion", + "color": "#6cf5ff", + "backgroundColor": "none", + "overviewRulerColor": "#6cf5ff60" + } + ], + "jestrunner.jestPath": "../../node_modules/jest/bin/jest.js" +} diff --git a/lib/platform-bible-utils/README.md b/lib/platform-bible-utils/README.md new file mode 100644 index 0000000000..f6c2ed2a62 --- /dev/null +++ b/lib/platform-bible-utils/README.md @@ -0,0 +1,46 @@ +# Platform.Bible Utils + +A set of utility functions, types, and classes for use inside Platform.Bible and extensions. + +## Development + +Inspired by https://github.com/jasonsturges/vite-typescript-npm-package + +When we publish this npm package, then in the root `package.json`, a version can be given to `platform-bible-utils` instead of the existing file link. At that time we will likely need to use `npm link` and `npm unlink` to develop the components ([see here](https://github.com/jasonsturges/vite-typescript-npm-package#development)). + +TODO: + +- [ ] Decide if this package will be public, if not it will probably need an NPM organization setup to publish it to privately. +- [ ] What NPM user login will we use to publish it (each developer or an app-wide user)? + +### Building + +#### Setting up + +To set up the dev environment to build, you must run the following from `paranext-core`: + +```bash +npm i +``` + +#### Building `platform-bible-utils` + +Once you have set up your environment, you can run the build command in this folder to build `platform-bible-utils`: + +```bash +npm run build +``` + +Or you can build from `paranext-core`: + +```bash +npm run build:platform-bible-utils +``` + +If you want a quick build that doesn't lint, run the following: + +```bash +npm run build:basic +``` + +Do not commit changes after running this basic build. Before committing, always run a full build. diff --git a/lib/platform-bible-utils/dist/index.cjs b/lib/platform-bible-utils/dist/index.cjs new file mode 100644 index 0000000000..bdc935854f --- /dev/null +++ b/lib/platform-bible-utils/dist/index.cjs @@ -0,0 +1,2 @@ +"use strict";var rt=Object.defineProperty;var st=(t,e,r)=>e in t?rt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var d=(t,e,r)=>st(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const nt=require("async-mutex");class it{constructor(e,r=1e4){d(this,"variableName");d(this,"promiseToValue");d(this,"resolver");d(this,"rejecter");this.variableName=e,this.promiseToValue=new Promise((s,n)=>{this.resolver=s,this.rejecter=n}),r>0&&setTimeout(()=>{this.rejecter&&(this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`),this.complete())},r),Object.seal(this)}get promise(){return this.promiseToValue}get hasSettled(){return Object.isFrozen(this)}resolveToValue(e,r=!1){if(this.resolver)console.debug(`${this.variableName} is being resolved now`),this.resolver(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent resolution of ${this.variableName}`)}}rejectWithReason(e,r=!1){if(this.rejecter)console.debug(`${this.variableName} is being rejected now`),this.rejecter(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent rejection of ${this.variableName}`)}}complete(){this.resolver=void 0,this.rejecter=void 0,Object.freeze(this)}}class ot{constructor(e,r){d(this,"collator");this.collator=new Intl.Collator(e,r)}compare(e,r){return this.collator.compare(e,r)}resolvedOptions(){return this.collator.resolvedOptions()}}class de{constructor(e,r){d(this,"dateTimeFormatter");this.dateTimeFormatter=new Intl.DateTimeFormat(e,r)}format(e){return this.dateTimeFormatter.format(e)}formatRange(e,r){return this.dateTimeFormatter.formatRange(e,r)}formatRangeToParts(e,r){return this.dateTimeFormatter.formatRangeToParts(e,r)}formatToParts(e){return this.dateTimeFormatter.formatToParts(e)}resolvedOptions(){return this.dateTimeFormatter.resolvedOptions()}}class me{constructor(){d(this,"subscribe",this.event);d(this,"subscriptions");d(this,"lazyEvent");d(this,"isDisposed",!1);d(this,"dispose",()=>this.disposeFn());d(this,"emit",e=>{this.emitFn(e)})}get event(){return this.assertNotDisposed(),this.lazyEvent||(this.lazyEvent=e=>{if(!e||typeof e!="function")throw new Error("Event handler callback must be a function!");return this.subscriptions||(this.subscriptions=[]),this.subscriptions.push(e),()=>{if(!this.subscriptions)return!1;const r=this.subscriptions.indexOf(e);return r<0?!1:(this.subscriptions.splice(r,1),!0)}}),this.lazyEvent}emitFn(e){this.assertNotDisposed(),[...this.subscriptions??[]].forEach(s=>s(e))}assertNotDisposed(){if(this.isDisposed)throw new Error("Emitter is disposed")}disposeFn(){return this.assertNotDisposed(),this.isDisposed=!0,this.subscriptions=void 0,this.lazyEvent=void 0,Promise.resolve(!0)}}function at(){return"00-0-4-1-000".replace(/[^-]/g,t=>((Math.random()+~~t)*65536>>t).toString(16).padStart(4,"0"))}function ge(t){return typeof t=="string"||t instanceof String}function A(t){return JSON.parse(JSON.stringify(t))}function ut(t,e=300){if(ge(t))throw new Error("Tried to debounce a string! Could be XSS");let r;return(...s)=>{clearTimeout(r),r=setTimeout(()=>t(...s),e)}}function lt(t,e,r){const s=new Map;return t.forEach(n=>{const i=e(n),o=s.get(i),a=r?r(n,i):n;o?o.push(a):s.set(i,[a])}),s}function ct(t){return typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"}function ft(t){if(ct(t))return t;try{return new Error(JSON.stringify(t))}catch{return new Error(String(t))}}function ht(t){return ft(t).message}function be(t){return new Promise(e=>setTimeout(e,t))}function pt(t,e){const r=be(e).then(()=>{});return Promise.any([r,t()])}function dt(t,e="obj"){const r=new Set;Object.getOwnPropertyNames(t).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch{}});let s=Object.getPrototypeOf(t);for(;s&&Object.getPrototypeOf(s);)Object.getOwnPropertyNames(s).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch{}}),s=Object.getPrototypeOf(s);return r}function mt(t,e={}){return new Proxy(e,{get(r,s){return s in r?r[s]:async(...n)=>(await t())[s](...n)}})}class ye{constructor(e,r){d(this,"baseDocument");d(this,"contributions",new Map);d(this,"latestOutput");d(this,"options");d(this,"onDidRebuildEmitter",new me);d(this,"onDidRebuild",this.onDidRebuildEmitter.subscribe);this.baseDocument=e,this.options=r,this.updateBaseDocument(e)}updateBaseDocument(e){return this.validateBaseDocument(e),this.baseDocument=this.options.copyDocuments?A(e):e,this.baseDocument=this.transformBaseDocumentAfterValidation(this.baseDocument),this.rebuild()}addOrUpdateContribution(e,r){this.validateContribution(e,r);const s=this.contributions.get(e);let n=this.options.copyDocuments&&r?A(r):r;n=this.transformContributionAfterValidation(e,n),this.contributions.set(e,n);try{return this.rebuild()}catch(i){throw s?this.contributions.set(e,s):this.contributions.delete(e),new Error(`Error when setting the document named ${e}: ${i}`)}}deleteContribution(e){const r=this.contributions.get(e);if(!r)throw new Error(`${e} does not exist`);this.contributions.delete(e);try{return this.rebuild()}catch(s){throw this.contributions.set(e,r),new Error(`Error when deleting the document named ${e}: ${s}`)}}deleteAllContributions(){if(this.contributions.size<=0)return this.latestOutput;const e=[...this.contributions.entries()];e.forEach(([r])=>this.contributions.delete(r));try{return this.rebuild()}catch(r){throw e.forEach(([s,n])=>this.contributions.set(s,n)),new Error(`Error when deleting all contributions: ${r}`)}}rebuild(){if(this.contributions.size===0){let r=A(this.baseDocument);return r=this.transformFinalOutputBeforeValidation(r),this.validateOutput(r),this.latestOutput=r,this.onDidRebuildEmitter.emit(void 0),this.latestOutput}let e=this.baseDocument;return this.contributions.forEach(r=>{e=gt(e,r,this.options.ignoreDuplicateProperties),this.validateOutput(e)}),e=this.transformFinalOutputBeforeValidation(e),this.validateOutput(e),this.latestOutput=e,this.onDidRebuildEmitter.emit(void 0),this.latestOutput}transformBaseDocumentAfterValidation(e){return e}transformContributionAfterValidation(e,r){return r}validateBaseDocument(e){}validateContribution(e,r){}validateOutput(e){}transformFinalOutputBeforeValidation(e){return e}}function ee(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||Array.isArray(r))&&(e=!1)}),e}function te(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||!Array.isArray(r))&&(e=!1)}),e}function gt(t,e,r){const s=A(t);return e?ve(s,A(e),r):s}function ve(t,e,r){if(!e)return t;if(ee(t,e)){const s=t,n=e;Object.keys(n).forEach(i=>{if(Object.hasOwn(s,i)){if(ee(s[i],n[i]))s[i]=ve(s[i],n[i],r);else if(te(s[i],n[i]))s[i]=s[i].concat(n[i]);else if(!r)throw new Error(`Cannot merge objects: key "${i}" already exists in the target object`)}else s[i]=n[i]})}else te(t,e)&&t.push(...e);return t}class Ne extends nt.Mutex{}class bt{constructor(){d(this,"mutexesByID",new Map)}get(e){let r=this.mutexesByID.get(e);return r||(r=new Ne,this.mutexesByID.set(e,r),r)}}class yt extends ye{constructor(e,r){super(e,r)}get output(){return this.latestOutput}}class we{constructor(e,r){d(this,"numberFormatter");this.numberFormatter=new Intl.NumberFormat(e,r)}format(e){return this.numberFormatter.format(e)}formatRange(e,r){return this.numberFormatter.formatRange(e,r)}formatRangeToParts(e,r){return this.numberFormatter.formatRangeToParts(e,r)}formatToParts(e){return this.numberFormatter.formatToParts(e)}resolvedOptions(){return this.numberFormatter.resolvedOptions()}}class vt{constructor(e="Anonymous"){d(this,"unsubscribers",new Set);this.name=e}add(...e){e.forEach(r=>{"dispose"in r?this.unsubscribers.add(r.dispose):this.unsubscribers.add(r)})}async runAllUnsubscribers(){const e=[...this.unsubscribers].map(s=>s()),r=await Promise.all(e);return this.unsubscribers.clear(),r.every((s,n)=>(s||console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${n} failed!`),s))}}var Nt=Object.defineProperty,wt=(t,e,r)=>e in t?Nt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,l=(t,e,r)=>wt(t,typeof e!="symbol"?e+"":e,r);const C=["GEN","EXO","LEV","NUM","DEU","JOS","JDG","RUT","1SA","2SA","1KI","2KI","1CH","2CH","EZR","NEH","EST","JOB","PSA","PRO","ECC","SNG","ISA","JER","LAM","EZK","DAN","HOS","JOL","AMO","OBA","JON","MIC","NAM","HAB","ZEP","HAG","ZEC","MAL","MAT","MRK","LUK","JHN","ACT","ROM","1CO","2CO","GAL","EPH","PHP","COL","1TH","2TH","1TI","2TI","TIT","PHM","HEB","JAS","1PE","2PE","1JN","2JN","3JN","JUD","REV","TOB","JDT","ESG","WIS","SIR","BAR","LJE","S3Y","SUS","BEL","1MA","2MA","3MA","4MA","1ES","2ES","MAN","PS2","ODA","PSS","JSA","JDB","TBS","SST","DNT","BLT","XXA","XXB","XXC","XXD","XXE","XXF","XXG","FRT","BAK","OTH","3ES","EZA","5EZ","6EZ","INT","CNC","GLO","TDX","NDX","DAG","PS3","2BA","LBA","JUB","ENO","1MQ","2MQ","3MQ","REP","4BA","LAO"],J=["XXA","XXB","XXC","XXD","XXE","XXF","XXG","FRT","BAK","OTH","INT","CNC","GLO","TDX","NDX"],Ee=["Genesis","Exodus","Leviticus","Numbers","Deuteronomy","Joshua","Judges","Ruth","1 Samuel","2 Samuel","1 Kings","2 Kings","1 Chronicles","2 Chronicles","Ezra","Nehemiah","Esther (Hebrew)","Job","Psalms","Proverbs","Ecclesiastes","Song of Songs","Isaiah","Jeremiah","Lamentations","Ezekiel","Daniel (Hebrew)","Hosea","Joel","Amos","Obadiah","Jonah","Micah","Nahum","Habakkuk","Zephaniah","Haggai","Zechariah","Malachi","Matthew","Mark","Luke","John","Acts","Romans","1 Corinthians","2 Corinthians","Galatians","Ephesians","Philippians","Colossians","1 Thessalonians","2 Thessalonians","1 Timothy","2 Timothy","Titus","Philemon","Hebrews","James","1 Peter","2 Peter","1 John","2 John","3 John","Jude","Revelation","Tobit","Judith","Esther Greek","Wisdom of Solomon","Sirach (Ecclesiasticus)","Baruch","Letter of Jeremiah","Song of 3 Young Men","Susanna","Bel and the Dragon","1 Maccabees","2 Maccabees","3 Maccabees","4 Maccabees","1 Esdras (Greek)","2 Esdras (Latin)","Prayer of Manasseh","Psalm 151","Odes","Psalms of Solomon","Joshua A. *obsolete*","Judges B. *obsolete*","Tobit S. *obsolete*","Susanna Th. *obsolete*","Daniel Th. *obsolete*","Bel Th. *obsolete*","Extra A","Extra B","Extra C","Extra D","Extra E","Extra F","Extra G","Front Matter","Back Matter","Other Matter","3 Ezra *obsolete*","Apocalypse of Ezra","5 Ezra (Latin Prologue)","6 Ezra (Latin Epilogue)","Introduction","Concordance ","Glossary ","Topical Index","Names Index","Daniel Greek","Psalms 152-155","2 Baruch (Apocalypse)","Letter of Baruch","Jubilees","Enoch","1 Meqabyan","2 Meqabyan","3 Meqabyan","Reproof (Proverbs 25-31)","4 Baruch (Rest of Baruch)","Laodiceans"],re=Pt();function P(t,e=!0){return e&&(t=t.toUpperCase()),t in re?re[t]:0}function K(t){return P(t)>0}function Et(t){const e=typeof t=="string"?P(t):t;return e>=40&&e<=66}function St(t){return(typeof t=="string"?P(t):t)<=39}function Se(t){return t<=66}function Ot(t){const e=typeof t=="string"?P(t):t;return je(e)&&!Se(e)}function*$t(){for(let t=1;t<=C.length;t++)yield t}const jt=1,Oe=C.length;function Ct(){return["XXA","XXB","XXC","XXD","XXE","XXF","XXG"]}function L(t,e="***"){const r=t-1;return r<0||r>=C.length?e:C[r]}function $e(t){return t<=0||t>Oe?"******":Ee[t-1]}function It(t){return $e(P(t))}function je(t){const e=typeof t=="number"?L(t):t;return K(e)&&!J.includes(e)}function At(t){const e=typeof t=="number"?L(t):t;return K(e)&&J.includes(e)}function Tt(t){return Ee[t-1].includes("*obsolete*")}function Pt(){const t={};for(let e=0;e(t[t.Unknown=0]="Unknown",t[t.Original=1]="Original",t[t.Septuagint=2]="Septuagint",t[t.Vulgate=3]="Vulgate",t[t.English=4]="English",t[t.RussianProtestant=5]="RussianProtestant",t[t.RussianOrthodox=6]="RussianOrthodox",t))(S||{});const N=class{constructor(e){if(l(this,"name"),l(this,"fullPath"),l(this,"isPresent"),l(this,"hasVerseSegments"),l(this,"isCustomized"),l(this,"baseVersification"),l(this,"scriptureBooks"),l(this,"_type"),e==null)throw new Error("Argument undefined");typeof e=="string"?(this.name=e,this._type=S[e]):(this._type=e,this.name=S[e])}get type(){return this._type}equals(e){return!e.type||!this.type?!1:e.type===this.type}};l(N,"Original",new N(S.Original)),l(N,"Septuagint",new N(S.Septuagint)),l(N,"Vulgate",new N(S.Vulgate)),l(N,"English",new N(S.English)),l(N,"RussianProtestant",new N(S.RussianProtestant)),l(N,"RussianOrthodox",new N(S.RussianOrthodox));let $=N;function se(t,e){const r=e[0];for(let s=1;s(t[t.Valid=0]="Valid",t[t.UnknownVersification=1]="UnknownVersification",t[t.OutOfRange=2]="OutOfRange",t[t.VerseOutOfOrder=3]="VerseOutOfOrder",t[t.VerseRepeated=4]="VerseRepeated",t))(Ce||{});const y=class f{constructor(e,r,s,n){if(l(this,"firstChapter"),l(this,"lastChapter"),l(this,"lastVerse"),l(this,"hasSegmentsDefined"),l(this,"text"),l(this,"BBBCCCVVVS"),l(this,"longHashCode"),l(this,"versification"),l(this,"rtlMark","‏"),l(this,"_bookNum",0),l(this,"_chapterNum",0),l(this,"_verseNum",0),l(this,"_verse"),s==null&&n==null)if(e!=null&&typeof e=="string"){const i=e,o=r!=null&&r instanceof $?r:void 0;this.setEmpty(o),this.parse(i)}else if(e!=null&&typeof e=="number"){const i=r!=null&&r instanceof $?r:void 0;this.setEmpty(i),this._verseNum=e%f.chapterDigitShifter,this._chapterNum=Math.floor(e%f.bookDigitShifter/f.chapterDigitShifter),this._bookNum=Math.floor(e/f.bookDigitShifter)}else if(r==null)if(e!=null&&e instanceof f){const i=e;this._bookNum=i.bookNum,this._chapterNum=i.chapterNum,this._verseNum=i.verseNum,this._verse=i.verse,this.versification=i.versification}else{if(e==null)return;const i=e instanceof $?e:f.defaultVersification;this.setEmpty(i)}else throw new Error("VerseRef constructor not supported.");else if(e!=null&&r!=null&&s!=null)if(typeof e=="string"&&typeof r=="string"&&typeof s=="string")this.setEmpty(n),this.updateInternal(e,r,s);else if(typeof e=="number"&&typeof r=="number"&&typeof s=="number")this._bookNum=e,this._chapterNum=r,this._verseNum=s,this.versification=n??f.defaultVersification;else throw new Error("VerseRef constructor not supported.");else throw new Error("VerseRef constructor not supported.")}static isVerseParseable(e){return e.length>0&&"0123456789".includes(e[0])&&!e.endsWith(this.verseRangeSeparator)&&!e.endsWith(this.verseSequenceIndicator)}static tryParse(e){let r;try{return r=new f(e),{success:!0,verseRef:r}}catch(s){if(s instanceof x)return r=new f,{success:!1,verseRef:r};throw s}}static getBBBCCCVVV(e,r,s){return e%f.bcvMaxValue*f.bookDigitShifter+(r>=0?r%f.bcvMaxValue*f.chapterDigitShifter:0)+(s>=0?s%f.bcvMaxValue:0)}static fromJSON(e){const{book:r,chapterNum:s,verseNum:n,verse:i,versificationStr:o}=e,a=i||n.toString();let h;return o&&(h=new $(o)),r?new f(r,s.toString(),a,h):new f}static tryGetVerseNum(e){let r;if(!e)return r=-1,{success:!0,vNum:r};r=0;let s;for(let n=0;n"9")return n===0&&(r=-1),{success:!1,vNum:r};if(r=r*10+ +s-0,r>f.bcvMaxValue)return r=-1,{success:!1,vNum:r}}return{success:!0,vNum:r}}get isDefault(){return this.bookNum===0&&this.chapterNum===0&&this.verseNum===0&&this.versification==null}get hasMultiple(){return this._verse!=null&&(this._verse.includes(f.verseRangeSeparator)||this._verse.includes(f.verseSequenceIndicator))}get book(){return E.bookNumberToId(this.bookNum,"")}set book(e){this.bookNum=E.bookIdToNumber(e)}get chapter(){return this.isDefault||this._chapterNum<0?"":this._chapterNum.toString()}set chapter(e){const r=+e;this._chapterNum=Number.isInteger(r)?r:-1}get verse(){return this._verse!=null?this._verse:this.isDefault||this._verseNum<0?"":this._verseNum.toString()}set verse(e){const{success:r,vNum:s}=f.tryGetVerseNum(e);this._verse=r?void 0:e.replace(this.rtlMark,""),this._verseNum=s,!(this._verseNum>=0)&&({vNum:this._verseNum}=f.tryGetVerseNum(this._verse))}get bookNum(){return this._bookNum}set bookNum(e){if(e<=0||e>E.lastBook)throw new x("BookNum must be greater than zero and less than or equal to last book");this._bookNum=e}get chapterNum(){return this._chapterNum}set chapterNum(e){this.chapterNum=e}get verseNum(){return this._verseNum}set verseNum(e){this._verseNum=e}get versificationStr(){var e;return(e=this.versification)==null?void 0:e.name}set versificationStr(e){this.versification=this.versification!=null?new $(e):void 0}get valid(){return this.validStatus===0}get validStatus(){return this.validateVerse(f.verseRangeSeparators,f.verseSequenceIndicators)}get BBBCCC(){return f.getBBBCCCVVV(this._bookNum,this._chapterNum,0)}get BBBCCCVVV(){return f.getBBBCCCVVV(this._bookNum,this._chapterNum,this._verseNum)}get isExcluded(){return!1}parse(e){if(e=e.replace(this.rtlMark,""),e.includes("/")){const i=e.split("/");if(e=i[0],i.length>1)try{const o=+i[1].trim();this.versification=new $(S[o])}catch{throw new x("Invalid reference : "+e)}}const r=e.trim().split(" ");if(r.length!==2)throw new x("Invalid reference : "+e);const s=r[1].split(":"),n=+s[0];if(s.length!==2||E.bookIdToNumber(r[0])===0||!Number.isInteger(n)||n<0||!f.isVerseParseable(s[1]))throw new x("Invalid reference : "+e);this.updateInternal(r[0],s[0],s[1])}simplify(){this._verse=void 0}clone(){return new f(this)}toString(){const e=this.book;return e===""?"":`${e} ${this.chapter}:${this.verse}`}toJSON(){let e=this.verse;(e===""||e===this.verseNum.toString())&&(e=void 0);const r={book:this.book,chapterNum:this.chapterNum,verseNum:this.verseNum,verse:e,versificationStr:this.versificationStr};return e||delete r.verse,r}equals(e){return e instanceof f?e._bookNum===this._bookNum&&e._chapterNum===this._chapterNum&&e._verseNum===this._verseNum&&e.verse===this.verse&&(e.versification==null&&this.versification==null||e.versification!=null&&this.versification!=null&&e.versification.equals(this.versification)):!1}allVerses(e=!1,r=f.verseRangeSeparators,s=f.verseSequenceIndicators){if(this._verse==null||this.chapterNum<=0)return[this.clone()];const n=[],i=se(this._verse,s);for(const o of i.map(a=>se(a,r))){const a=this.clone();a.verse=o[0];const h=a.verseNum;if(n.push(a),o.length>1){const p=this.clone();if(p.verse=o[1],!e)for(let u=h+1;uo)return 3;if(s===o)return 4;s=o}return 0}get internalValid(){return this.versification==null?1:this._bookNum<=0||this._bookNum>E.lastBook?2:(E.isCanonical(this._bookNum),0)}setEmpty(e=f.defaultVersification){this._bookNum=0,this._chapterNum=-1,this._verse=void 0,this.versification=e}updateInternal(e,r,s){this.bookNum=E.bookIdToNumber(e),this.chapter=r,this.verse=s}};l(y,"defaultVersification",$.English),l(y,"verseRangeSeparator","-"),l(y,"verseSequenceIndicator",","),l(y,"verseRangeSeparators",[y.verseRangeSeparator]),l(y,"verseSequenceIndicators",[y.verseSequenceIndicator]),l(y,"chapterDigitShifter",1e3),l(y,"bookDigitShifter",y.chapterDigitShifter*y.chapterDigitShifter),l(y,"bcvMaxValue",y.chapterDigitShifter-1),l(y,"ValidStatusType",Ce);let Rt=y;class x extends Error{}var ne=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},I={},Bt=()=>{const t="\\ud800-\\udfff",o="\\u0300-\\u036f"+"\\ufe20-\\ufe2f"+"\\u20d0-\\u20ff"+"\\u1ab0-\\u1aff"+"\\u1dc0-\\u1dff",a="\\ufe0e\\ufe0f",h="\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93",p=`[${t}]`,u=`[${o}]`,c="\\ud83c[\\udffb-\\udfff]",m=`(?:${u}|${c})`,v=`[^${t}]`,b="(?:\\uD83C[\\uDDE6-\\uDDFF]){2}",B="[\\ud800-\\udbff][\\udc00-\\udfff]",q="\\u200d",Ze="(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40(?:\\udc65|\\udc73|\\udc77)\\udb40(?:\\udc6e|\\udc63|\\udc6c)\\udb40(?:\\udc67|\\udc74|\\udc73)\\udb40\\udc7f)",Ye=`[${h}]`,Y=`${m}?`,Q=`[${a}]?`,Qe=`(?:${q}(?:${[v,b,B].join("|")})${Q+Y})*`,et=Q+Y+Qe,tt=`(?:${[`${v}${u}?`,u,b,B,p,Ye].join("|")})`;return new RegExp(`${Ze}|${c}(?=${c})|${tt+et}`,"g")},xt=ne&&ne.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(I,"__esModule",{value:!0});var k=xt(Bt);function z(t){if(typeof t!="string")throw new Error("A string is expected as input");return t.match(k.default())||[]}var Mt=I.toArray=z;function U(t){if(typeof t!="string")throw new Error("Input must be a string");var e=t.match(k.default());return e===null?0:e.length}var Dt=I.length=U;function Ie(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");(typeof e!="number"||e<0)&&(e=0),typeof r=="number"&&r<0&&(r=0);var s=t.match(k.default());return s?s.slice(e,r).join(""):""}var kt=I.substring=Ie;function Vt(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");var s=U(t);if(typeof e!="number"&&(e=parseInt(e,10)),e>=s)return"";e<0&&(e+=s);var n;typeof r>"u"?n=s:(typeof r!="number"&&(r=parseInt(r,10)),n=r>=0?r+e:e);var i=t.match(k.default());return i?i.slice(e,n).join(""):""}var qt=I.substr=Vt;function zt(t,e,r,s){if(e===void 0&&(e=16),r===void 0&&(r="#"),s===void 0&&(s="right"),typeof t!="string"||typeof e!="number")throw new Error("Invalid arguments specified");if(["left","right"].indexOf(s)===-1)throw new Error("Pad position should be either left or right");typeof r!="string"&&(r=String(r));var n=U(t);if(n>e)return Ie(t,0,e);if(n=s.length)return e===""?s.length:-1;if(e==="")return r;var n=z(e),i=!1,o;for(o=r;og(t)||e<-g(t)))return V(t,e,1)}function j(t,e){return e<0||e>g(t)-1?"":V(t,e,1)}function Jt(t,e){if(!(e<0||e>g(t)-1))return V(t,e,1).codePointAt(0)}function Te(t,e,r=g(t)){const s=Re(t,e);return!(s===-1||s+g(e)!==r)}function Kt(t,e,r){if(e<0)return-1;if(r){if(j(t,e)==="}"&&j(t,e-1)==="\\")return e;const i=T(t,"\\}",e);return i>=0?i+1:i}let s=e;const n=g(t);for(;s=n?-1:s}function Lt(t,e){let r=t,s=0;for(;s=0){const i=w(r,s+1,n),o=i in e?`${e[i]}`:i;r=`${w(r,0,s)}${o}${w(r,n+1)}`,s=n+g(o)-g(i)-2}}else r=`${w(r,0,s-1)}${w(r,s)}`,s-=1;break;case"}":j(r,s-1)!=="\\"||(r=`${w(r,0,s-1)}${w(r,s)}`,s-=1);break}s+=1}return r}function Pe(t,e,r=0){const s=w(t,r);return T(s,e)!==-1}function T(t,e,r=0){return Ft(t,e,r)}function Re(t,e,r){let s=r===void 0?g(t):r;s<0?s=0:s>=g(t)&&(s=g(t)-1);for(let n=s;n>=0;n--)if(V(t,n,g(e))===e)return n;return-1}function g(t){return Dt(t)}function Ut(t,e){const r=e.toUpperCase();return r==="NONE"?t:t.normalize(r)}function Xt(t,e,r){return t.localeCompare(e,"en",r)}function Ht(t,e,r=" "){return e<=g(t)?t:Ae(t,e,r,"right")}function Wt(t,e,r=" "){return e<=g(t)?t:Ae(t,e,r,"left")}function ie(t,e){return e>t?t:e<-t?0:e<0?e+t:e}function Zt(t,e,r){const s=g(t);if(e>s||r&&(e>r&&!(e>=0&&e-s)||r<-s))return"";const n=ie(s,e),i=r?ie(s,r):void 0;return w(t,n,i)}function _(t,e,r){const s=[];if(r!==void 0&&r<=0)return[t];if(e==="")return Be(t).slice(0,r);let n=e;(typeof e=="string"||e instanceof RegExp&&!Pe(e.flags,"g"))&&(n=new RegExp(e,"g"));const i=t.match(n);let o=0;if(!i)return[t];for(let a=0;a<(r?r-1:i.length);a++){const h=T(t,i[a],o),p=g(i[a]);if(s.push(w(t,o,h)),o=h+p,r!==void 0&&s.length===r)break}return s.push(w(t,o)),s}function H(t,e,r=0){return T(t,e,r)===r}function V(t,e=0,r=g(t)-e){return qt(t,e,r)}function w(t,e,r=g(t)){return kt(t,e,r)}function Be(t){return Mt(t)}function Yt(t){return H(t,"%")&&Te(t,"%")}function Qt(t){if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function er(t){return t?X(t).map(s=>Array.isArray(s)?s.map(n=>new RegExp(n)):new RegExp(s)):[]}function tr(t){return t?X(t).map(s=>new RegExp(s)):[]}const xe=[{shortName:"ERR",fullNames:["ERROR"],chapters:-1},{shortName:"GEN",fullNames:["Genesis"],chapters:50},{shortName:"EXO",fullNames:["Exodus"],chapters:40},{shortName:"LEV",fullNames:["Leviticus"],chapters:27},{shortName:"NUM",fullNames:["Numbers"],chapters:36},{shortName:"DEU",fullNames:["Deuteronomy"],chapters:34},{shortName:"JOS",fullNames:["Joshua"],chapters:24},{shortName:"JDG",fullNames:["Judges"],chapters:21},{shortName:"RUT",fullNames:["Ruth"],chapters:4},{shortName:"1SA",fullNames:["1 Samuel"],chapters:31},{shortName:"2SA",fullNames:["2 Samuel"],chapters:24},{shortName:"1KI",fullNames:["1 Kings"],chapters:22},{shortName:"2KI",fullNames:["2 Kings"],chapters:25},{shortName:"1CH",fullNames:["1 Chronicles"],chapters:29},{shortName:"2CH",fullNames:["2 Chronicles"],chapters:36},{shortName:"EZR",fullNames:["Ezra"],chapters:10},{shortName:"NEH",fullNames:["Nehemiah"],chapters:13},{shortName:"EST",fullNames:["Esther"],chapters:10},{shortName:"JOB",fullNames:["Job"],chapters:42},{shortName:"PSA",fullNames:["Psalm","Psalms"],chapters:150},{shortName:"PRO",fullNames:["Proverbs"],chapters:31},{shortName:"ECC",fullNames:["Ecclesiastes"],chapters:12},{shortName:"SNG",fullNames:["Song of Solomon","Song of Songs"],chapters:8},{shortName:"ISA",fullNames:["Isaiah"],chapters:66},{shortName:"JER",fullNames:["Jeremiah"],chapters:52},{shortName:"LAM",fullNames:["Lamentations"],chapters:5},{shortName:"EZK",fullNames:["Ezekiel"],chapters:48},{shortName:"DAN",fullNames:["Daniel"],chapters:12},{shortName:"HOS",fullNames:["Hosea"],chapters:14},{shortName:"JOL",fullNames:["Joel"],chapters:3},{shortName:"AMO",fullNames:["Amos"],chapters:9},{shortName:"OBA",fullNames:["Obadiah"],chapters:1},{shortName:"JON",fullNames:["Jonah"],chapters:4},{shortName:"MIC",fullNames:["Micah"],chapters:7},{shortName:"NAM",fullNames:["Nahum"],chapters:3},{shortName:"HAB",fullNames:["Habakkuk"],chapters:3},{shortName:"ZEP",fullNames:["Zephaniah"],chapters:3},{shortName:"HAG",fullNames:["Haggai"],chapters:2},{shortName:"ZEC",fullNames:["Zechariah"],chapters:14},{shortName:"MAL",fullNames:["Malachi"],chapters:4},{shortName:"MAT",fullNames:["Matthew"],chapters:28},{shortName:"MRK",fullNames:["Mark"],chapters:16},{shortName:"LUK",fullNames:["Luke"],chapters:24},{shortName:"JHN",fullNames:["John"],chapters:21},{shortName:"ACT",fullNames:["Acts"],chapters:28},{shortName:"ROM",fullNames:["Romans"],chapters:16},{shortName:"1CO",fullNames:["1 Corinthians"],chapters:16},{shortName:"2CO",fullNames:["2 Corinthians"],chapters:13},{shortName:"GAL",fullNames:["Galatians"],chapters:6},{shortName:"EPH",fullNames:["Ephesians"],chapters:6},{shortName:"PHP",fullNames:["Philippians"],chapters:4},{shortName:"COL",fullNames:["Colossians"],chapters:4},{shortName:"1TH",fullNames:["1 Thessalonians"],chapters:5},{shortName:"2TH",fullNames:["2 Thessalonians"],chapters:3},{shortName:"1TI",fullNames:["1 Timothy"],chapters:6},{shortName:"2TI",fullNames:["2 Timothy"],chapters:4},{shortName:"TIT",fullNames:["Titus"],chapters:3},{shortName:"PHM",fullNames:["Philemon"],chapters:1},{shortName:"HEB",fullNames:["Hebrews"],chapters:13},{shortName:"JAS",fullNames:["James"],chapters:5},{shortName:"1PE",fullNames:["1 Peter"],chapters:5},{shortName:"2PE",fullNames:["2 Peter"],chapters:3},{shortName:"1JN",fullNames:["1 John"],chapters:5},{shortName:"2JN",fullNames:["2 John"],chapters:1},{shortName:"3JN",fullNames:["3 John"],chapters:1},{shortName:"JUD",fullNames:["Jude"],chapters:1},{shortName:"REV",fullNames:["Revelation"],chapters:22}],Me=1,De=xe.length-1,ke=1,Ve=1,qe=t=>{var e;return((e=xe[t])==null?void 0:e.chapters)??-1},rr=(t,e)=>({bookNum:Math.max(Me,Math.min(t.bookNum+e,De)),chapterNum:1,verseNum:1}),sr=(t,e)=>({...t,chapterNum:Math.min(Math.max(ke,t.chapterNum+e),qe(t.bookNum)),verseNum:1}),nr=(t,e)=>({...t,verseNum:Math.max(Ve,t.verseNum+e)});async function ir(t,e,r){const s=E.bookNumberToId(t);if(!H(Intl.getCanonicalLocales(e)[0],"zh"))return r({localizeKey:`LocalizedId.${s}`,languagesToSearch:[e]});const n=await r({localizeKey:`Book.${s}`,languagesToSearch:[e]}),i=_(n,"-");return _(i[0],"ÿ08")[0].trim()}function F(t){return new Rt(t.bookNum,t.chapterNum,t.verseNum).BBBCCCVVV}function or(t,e){return F(t)-F(e)}function ze(t){return`%scrollGroup_${t}%`}function ar(t){return t.map(e=>ze(e))}function ur(t,e,r,s){let n;switch(e??"id"){case"English":n=E.bookNumberToEnglishName(t.bookNum);break;case"id":n=E.bookNumberToId(t.bookNum);break;default:n=e??"";break}return`${n}${s??" "}${t.chapterNum}${r??":"}${t.verseNum}`}const lr=t=>(...e)=>t.map(s=>s(...e)).every(s=>s),cr=t=>async(...e)=>{const r=t.map(async s=>s(...e));return(await Promise.all(r)).every(s=>s)};var fr=Object.getOwnPropertyNames,hr=Object.getOwnPropertySymbols,pr=Object.prototype.hasOwnProperty;function oe(t,e){return function(s,n,i){return t(s,n,i)&&e(s,n,i)}}function D(t){return function(r,s,n){if(!r||!s||typeof r!="object"||typeof s!="object")return t(r,s,n);var i=n.cache,o=i.get(r),a=i.get(s);if(o&&a)return o===s&&a===r;i.set(r,s),i.set(s,r);var h=t(r,s,n);return i.delete(r),i.delete(s),h}}function ae(t){return fr(t).concat(hr(t))}var _e=Object.hasOwn||function(t,e){return pr.call(t,e)};function R(t,e){return t||e?t===e:t===e||t!==t&&e!==e}var Fe="_owner",ue=Object.getOwnPropertyDescriptor,le=Object.keys;function dr(t,e,r){var s=t.length;if(e.length!==s)return!1;for(;s-- >0;)if(!r.equals(t[s],e[s],s,s,t,e,r))return!1;return!0}function mr(t,e){return R(t.getTime(),e.getTime())}function ce(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.entries(),i=0,o,a;(o=n.next())&&!o.done;){for(var h=e.entries(),p=!1,u=0;(a=h.next())&&!a.done;){var c=o.value,m=c[0],v=c[1],b=a.value,B=b[0],q=b[1];!p&&!s[u]&&(p=r.equals(m,B,i,u,t,e,r)&&r.equals(v,q,m,B,t,e,r))&&(s[u]=!0),u++}if(!p)return!1;i++}return!0}function gr(t,e,r){var s=le(t),n=s.length;if(le(e).length!==n)return!1;for(var i;n-- >0;)if(i=s[n],i===Fe&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!_e(e,i)||!r.equals(t[i],e[i],i,i,t,e,r))return!1;return!0}function M(t,e,r){var s=ae(t),n=s.length;if(ae(e).length!==n)return!1;for(var i,o,a;n-- >0;)if(i=s[n],i===Fe&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!_e(e,i)||!r.equals(t[i],e[i],i,i,t,e,r)||(o=ue(t,i),a=ue(e,i),(o||a)&&(!o||!a||o.configurable!==a.configurable||o.enumerable!==a.enumerable||o.writable!==a.writable)))return!1;return!0}function br(t,e){return R(t.valueOf(),e.valueOf())}function yr(t,e){return t.source===e.source&&t.flags===e.flags}function fe(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.values(),i,o;(i=n.next())&&!i.done;){for(var a=e.values(),h=!1,p=0;(o=a.next())&&!o.done;)!h&&!s[p]&&(h=r.equals(i.value,o.value,i.value,o.value,t,e,r))&&(s[p]=!0),p++;if(!h)return!1}return!0}function vr(t,e){var r=t.length;if(e.length!==r)return!1;for(;r-- >0;)if(t[r]!==e[r])return!1;return!0}var Nr="[object Arguments]",wr="[object Boolean]",Er="[object Date]",Sr="[object Map]",Or="[object Number]",$r="[object Object]",jr="[object RegExp]",Cr="[object Set]",Ir="[object String]",Ar=Array.isArray,he=typeof ArrayBuffer=="function"&&ArrayBuffer.isView?ArrayBuffer.isView:null,pe=Object.assign,Tr=Object.prototype.toString.call.bind(Object.prototype.toString);function Pr(t){var e=t.areArraysEqual,r=t.areDatesEqual,s=t.areMapsEqual,n=t.areObjectsEqual,i=t.arePrimitiveWrappersEqual,o=t.areRegExpsEqual,a=t.areSetsEqual,h=t.areTypedArraysEqual;return function(u,c,m){if(u===c)return!0;if(u==null||c==null||typeof u!="object"||typeof c!="object")return u!==u&&c!==c;var v=u.constructor;if(v!==c.constructor)return!1;if(v===Object)return n(u,c,m);if(Ar(u))return e(u,c,m);if(he!=null&&he(u))return h(u,c,m);if(v===Date)return r(u,c,m);if(v===RegExp)return o(u,c,m);if(v===Map)return s(u,c,m);if(v===Set)return a(u,c,m);var b=Tr(u);return b===Er?r(u,c,m):b===jr?o(u,c,m):b===Sr?s(u,c,m):b===Cr?a(u,c,m):b===$r?typeof u.then!="function"&&typeof c.then!="function"&&n(u,c,m):b===Nr?n(u,c,m):b===wr||b===Or||b===Ir?i(u,c,m):!1}}function Rr(t){var e=t.circular,r=t.createCustomConfig,s=t.strict,n={areArraysEqual:s?M:dr,areDatesEqual:mr,areMapsEqual:s?oe(ce,M):ce,areObjectsEqual:s?M:gr,arePrimitiveWrappersEqual:br,areRegExpsEqual:yr,areSetsEqual:s?oe(fe,M):fe,areTypedArraysEqual:s?M:vr};if(r&&(n=pe({},n,r(n))),e){var i=D(n.areArraysEqual),o=D(n.areMapsEqual),a=D(n.areObjectsEqual),h=D(n.areSetsEqual);n=pe({},n,{areArraysEqual:i,areMapsEqual:o,areObjectsEqual:a,areSetsEqual:h})}return n}function Br(t){return function(e,r,s,n,i,o,a){return t(e,r,a)}}function xr(t){var e=t.circular,r=t.comparator,s=t.createState,n=t.equals,i=t.strict;if(s)return function(h,p){var u=s(),c=u.cache,m=c===void 0?e?new WeakMap:void 0:c,v=u.meta;return r(h,p,{cache:m,equals:n,meta:v,strict:i})};if(e)return function(h,p){return r(h,p,{cache:new WeakMap,equals:n,meta:void 0,strict:i})};var o={cache:void 0,equals:n,meta:void 0,strict:i};return function(h,p){return r(h,p,o)}}var Mr=O();O({strict:!0});O({circular:!0});O({circular:!0,strict:!0});O({createInternalComparator:function(){return R}});O({strict:!0,createInternalComparator:function(){return R}});O({circular:!0,createInternalComparator:function(){return R}});O({circular:!0,createInternalComparator:function(){return R},strict:!0});function O(t){t===void 0&&(t={});var e=t.circular,r=e===void 0?!1:e,s=t.createInternalComparator,n=t.createState,i=t.strict,o=i===void 0?!1:i,a=Rr(t),h=Pr(a),p=s?s(h):Br(h);return xr({circular:r,comparator:h,createState:n,equals:p,strict:o})}function Ge(t,e){return Mr(t,e)}function Je(t,e){if(typeof t!=typeof e)return!1;if(!t&&!e)return!0;if(Array.isArray(t)){const i=e,o=t;return i.length===0?!0:i.every(a=>o.includes(a))}if(typeof t!="object")return Ge(t,e);const r=e,s=t;let n=!0;return Object.keys(r).forEach(i=>{n&&(Object.hasOwn(s,i)&&Je(s[i],r[i])||(n=!1))}),n}function G(t,e,r){return JSON.stringify(t,(n,i)=>{let o=i;return e&&(o=e(n,o)),o===void 0&&(o=null),o},r)}function Ke(t,e){function r(n){return Object.keys(n).forEach(i=>{n[i]===null?n[i]=void 0:typeof n[i]=="object"&&(n[i]=r(n[i]))}),n}const s=JSON.parse(t,e);if(s!==null)return typeof s=="object"?r(s):s}function Dr(t){try{const e=G(t);return e===G(Ke(e))}catch{return!1}}const kr=t=>t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/");function Vr(){return typeof navigator<"u"&&navigator.languages?navigator.languages[0]:new de().resolvedOptions().locale}function qr(t,e=2){if(t===0)return"0 Bytes";const r=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],s=Math.floor(Math.log(t)/Math.log(1024)),n=r[s];return`${new we("en",{style:"decimal",maximumFractionDigits:e,minimumFractionDigits:0}).format(t/1024**s)} ${n}`}const W={projectSettingsContribution:{description:"The data an extension provides to inform Platform.Bible of the project settings it provides",anyOf:[{$ref:"#/$defs/projectSettingsGroup"},{type:"array",items:{$ref:"#/$defs/projectSettingsGroup"}}]},projectSettingsGroup:{description:"Group of related settings definitions",type:"object",properties:{label:{description:"localizeKey that displays in the project settings dialog as the group name",$ref:"#/$defs/localizeKey"},description:{description:"localizeKey that displays in the project settings dialog to describe the group",$ref:"#/$defs/localizeKey"},properties:{$ref:"#/$defs/projectSettingProperties"}},required:["label","properties"]},projectSettingProperties:{description:"Object whose keys are setting IDs and whose values are settings objects",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{$ref:"#/$defs/projectSetting"}},additionalProperties:!1},projectSetting:{description:"A description of an extension's setting entry",anyOf:[{$ref:"#/$defs/extensionControlledProjectSetting"}]},extensionControlledProjectSetting:{description:"Setting definition that is validated by the extension.",allOf:[{$ref:"#/$defs/projectSettingBase"},{$ref:"#/$defs/modifierExtensionControlled"}]},projectSettingBase:{description:"Base information needed to describe a project setting entry",allOf:[{$ref:"#/$defs/settingBase"},{$ref:"#/$defs/modifierProject"}]},modifierProject:{description:"Modifies setting type to be project setting",type:"object",properties:{includeProjectInterfaces:{description:"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should be included.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to pass):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to all {@link ProjectInterfaces}, so all projects that do not match `excludeProjectInterfaces` will be included\n\n@example\n\n```typescript\nincludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed on projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.",anyOf:[{type:"null"},{type:"string"},{type:"array",items:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]}}]},excludeProjectInterfaces:{description:"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to exclude the project):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition and exclude the project\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition and exclude the project\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` will be included\n\n@example\n\n```typescript\nexcludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed and exclude projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.",anyOf:[{type:"null"},{type:"string"},{type:"array",items:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]}}]},includePdpFactoryIds:{description:"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should be included.\n\nDefaults to all Project Data Provider Factory Ids, so all projects that do not match `excludePdpFactoryIds` will be included",anyOf:[{type:"null"},{type:"string"},{type:"array",items:{type:"string"}}]},excludePdpFactoryIds:{description:"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nDefaults to none, so all projects that match `includePdpFactoryIds` will be included",anyOf:[{type:"null"},{type:"string"},{type:"array",items:{type:"string"}}]}}},settingsContribution:{description:"The data an extension provides to inform Platform.Bible of the settings it provides",anyOf:[{$ref:"#/$defs/settingsGroup"},{type:"array",items:{$ref:"#/$defs/settingsGroup"}}]},settingsGroup:{description:"Group of related settings definitions",type:"object",properties:{label:{description:"localizeKey that displays in the settings dialog as the group name",$ref:"#/$defs/localizeKey"},description:{description:"localizeKey that displays in the settings dialog to describe the group",$ref:"#/$defs/localizeKey"},properties:{$ref:"#/$defs/settingProperties"}},required:["label","properties"]},settingProperties:{description:"Object whose keys are setting IDs and whose values are settings objects",type:"object",patternProperties:{"^[\\w-]+\\.[\\w-]+$":{$ref:"#/$defs/setting"}},additionalProperties:!1},setting:{description:"A description of an extension's setting entry",anyOf:[{$ref:"#/$defs/extensionControlledSetting"}]},extensionControlledSetting:{description:"Setting definition that is validated by the extension.",allOf:[{$ref:"#/$defs/settingBase"},{$ref:"#/$defs/modifierExtensionControlled"}]},settingBase:{description:"Base information needed to describe a setting entry",allOf:[{$ref:"#/$defs/stateBase"},{type:"object",properties:{label:{description:"localizeKey that displays in the settings dialog as the setting name",$ref:"#/$defs/localizeKey"},description:{description:"localizeKey that displays in the settings dialog to describe the setting",$ref:"#/$defs/localizeKey"}},required:["label"]}]},projectStateContribution:{description:"The data an extension provides to inform Platform.Bible of the project state it provides",$ref:"#/$defs/userStateProperties"},userStateContribution:{description:"The data an extension provides to inform Platform.Bible of the user state it provides",$ref:"#/$defs/userStateProperties"},userStateProperties:{description:"Object whose keys are state IDs and whose values are state objects",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{$ref:"#/$defs/userState"}},additionalProperties:!1},userState:{description:"A description of an extension's user state entry",anyOf:[{$ref:"#/$defs/extensionControlledState"}]},extensionControlledState:{description:"State definition that is validated by the extension.",allOf:[{$ref:"#/$defs/stateBase"},{$ref:"#/$defs/modifierExtensionControlled"}]},modifierExtensionControlled:{description:'Modifies state/setting type to be extension-controlled. "Extension-controlled" means the extension provides the component and the validator for the state/setting, so the state/setting is controlled by the extension.',not:{anyOf:[{type:"object",required:["platformType"]},{type:"object",required:["type"]}]}},stateBase:{description:"Base information needed to describe a state entry",type:"object",properties:{default:{description:"default value for the state/setting",type:"any"},derivesFrom:{description:"a state/setting ID whose value to set to this state/setting's starting value the first time this state/setting is loaded",$ref:"#/$defs/id"}},required:["default"]},localizeKey:{description:"Identifier for a string that will be localized based on the user's UI language",type:"string",pattern:"^%[\\w\\-\\.]+%$",tsType:"LocalizeKey"},id:{description:"",type:"string",pattern:"^[\\w\\-]+\\.[\\w\\-]+$",tsType:"Id"}};function Z(t){t&&Object.values(t).forEach(e=>{if(e.type){if("tsType"in e&&delete e.tsType,e.type==="any"){delete e.type;return}e.type==="object"&&Z(e.properties)}})}Z(W);const Le={$schema:"https://json-schema.org/draft/2020-12/schema",title:"Project Settings Contribution",description:"The data an extension provides to inform Platform.Bible of the project settings it provides",anyOf:[{$ref:"#/$defs/projectSettingsGroup"},{type:"array",items:{$ref:"#/$defs/projectSettingsGroup"}}],$defs:W};Object.freeze(Le);const Ue={$schema:"https://json-schema.org/draft/2020-12/schema",title:"Settings Contribution",description:"The data an extension provides to inform Platform.Bible of the settings it provides",anyOf:[{$ref:"#/$defs/settingsGroup"},{type:"array",items:{$ref:"#/$defs/settingsGroup"}}],$defs:W};Object.freeze(Ue);const Xe={languageStrings:{description:"Map whose keys are localized string keys and whose values provide information about how to localize strings for the localized string key",type:"object",patternProperties:{"^%[\\w\\-\\.]+%$":{$ref:"#/$defs/localizedStringValue"}},additionalProperties:!1},localizedStringValue:{description:"Localized string value associated with this key",type:"string"},stringsMetadata:{description:"Map whose keys are localized string keys and whose values provide additional non-locale-specific information about the localized string key",type:"object",patternProperties:{"^%[\\w\\-\\.]+%$":{$ref:"#/$defs/stringMetadata"}},additionalProperties:!1},stringMetadata:{description:"Additional non-locale-specific information about a localized string key",type:"object",properties:{fallbackKey:{description:"Localized string key from which to get this value if one does not exist in the specified language. If a new key/value pair needs to be made to replace an existing one, this could help smooth over the transition if the meanings are close enough.\nYou can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a backslash `\\`.",type:"string",pattern:"^%[\\w\\-\\.;&,' (){}#:/\\\\?%⋮|[\\]“”‘’!~* +=•`…​↑↓]+%$",tsType:"LocalizeKey"},notes:{description:"Additional information provided by developers in English to help the translator to know how to translate this localized string accurately",type:"string"}}},localizeKey:{description:"Identifier for a string that will be localized based on the user's UI language",type:"string",pattern:"^%[\\w\\-\\.]+%$",tsType:"LocalizeKey"}};Z(Xe);const He={$schema:"https://json-schema.org/draft/2020-12/schema",title:"Localized String Data Contribution",description:"The data an extension provides to inform Platform.Bible of the localized strings it provides.",type:"object",properties:{metadata:{$ref:"#/$defs/stringsMetadata"},localizedStrings:{type:"object",additionalProperties:{$ref:"#/$defs/languageStrings"}}},$defs:Xe};Object.freeze(He);const We={title:"Platform.Bible menus",type:"object",properties:{mainMenu:{description:"Top level menu for the application",$ref:"#/$defs/multiColumnMenu"},defaultWebViewTopMenu:{description:"Default top menu for web views that don't specify their own",$ref:"#/$defs/multiColumnMenu"},defaultWebViewContextMenu:{description:"Default context menu for web views that don't specify their own",$ref:"#/$defs/singleColumnMenu"},webViewMenus:{description:"Menus that apply per web view in the application",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{$ref:"#/$defs/menusForOneWebView"}},additionalProperties:!1}},required:["mainMenu","defaultWebViewTopMenu","defaultWebViewContextMenu","webViewMenus"],additionalProperties:!1,$defs:{localizeKey:{description:"Identifier for a string that will be localized in a menu based on the user's UI language",type:"string",pattern:"^%[\\w\\-\\.]+%$"},referencedItem:{description:"Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)",type:"string",pattern:"^[\\w\\-]+\\.[\\w\\-]+$"},columnsWithHeaders:{description:"Group of columns that can be combined with other columns to form a multi-column menu",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single column with a header string",type:"object",properties:{label:{description:"Header text for this this column in the UI",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},order:{description:"Relative order of this column compared to other columns (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu groups to this column",type:"boolean"}},required:["label","order"],additionalProperties:!1}},properties:{isExtensible:{description:"Defines whether contributions are allowed to add columns to this multi-column menu",type:"boolean"}}},menuGroups:{description:"Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single group that contains menu items",type:"object",oneOf:[{properties:{column:{description:"Column where this group belongs, not required for single column menus",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["order"],additionalProperties:!1},{properties:{menuItem:{description:"Menu item that anchors the submenu where this group belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["menuItem","order"],additionalProperties:!1}]}},additionalProperties:!1},menuItem:{description:"Single item in a menu that can be clicked on to take an action or can be the parent of a submenu",type:"object",oneOf:[{properties:{id:{description:"ID for this menu item that holds a submenu",$ref:"#/$defs/referencedItem"}},required:["id"]},{properties:{command:{description:"Name of the PAPI command to run when this menu item is selected.",$ref:"#/$defs/referencedItem"},iconPathBefore:{description:"Uri path to the icon to display before the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`",type:"string"},iconPathAfter:{description:"Uri path to the icon to display after the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`",type:"string"}},required:["command"]}],properties:{label:{description:"Key that represents the text of this menu item to display",$ref:"#/$defs/localizeKey"},tooltip:{description:"Key that represents the text to display if a mouse pointer hovers over the menu item",$ref:"#/$defs/localizeKey"},searchTerms:{description:"Key that represents additional words the platform should reference when users are searching for menu items",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},group:{description:"Group to which this menu item belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this menu item compared to other menu items in the same group (sorted ascending)",type:"number"}},required:["label","group","order"],unevaluatedProperties:!1},groupsAndItems:{description:"Core schema for a column",type:"object",properties:{groups:{description:"Groups that belong in this menu",$ref:"#/$defs/menuGroups"},items:{description:"List of menu items that belong in this menu",type:"array",items:{$ref:"#/$defs/menuItem"},uniqueItems:!0}},required:["groups","items"]},singleColumnMenu:{description:"Menu that contains a column without a header",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"}],unevaluatedProperties:!1},multiColumnMenu:{description:"Menu that can contain multiple columns with headers",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"},{properties:{columns:{description:"Columns that belong in this menu",$ref:"#/$defs/columnsWithHeaders"}},required:["columns"]}],unevaluatedProperties:!1},menusForOneWebView:{description:"Set of menus that are associated with a single tab",type:"object",properties:{includeDefaults:{description:"Indicates whether the platform default menus should be included for this webview",type:"boolean"},topMenu:{description:"Menu that opens when you click on the top left corner of a tab",$ref:"#/$defs/multiColumnMenu"},contextMenu:{description:"Menu that opens when you right click on the main body/area of a tab",$ref:"#/$defs/singleColumnMenu"}},additionalProperties:!1}}};Object.freeze(We);exports.AsyncVariable=it;exports.Collator=ot;exports.DateTimeFormat=de;exports.DocumentCombiner=ye;exports.FIRST_SCR_BOOK_NUM=Me;exports.FIRST_SCR_CHAPTER_NUM=ke;exports.FIRST_SCR_VERSE_NUM=Ve;exports.LAST_SCR_BOOK_NUM=De;exports.Mutex=Ne;exports.MutexMap=bt;exports.NonValidatingDocumentCombiner=yt;exports.NumberFormat=we;exports.PlatformEventEmitter=me;exports.UnsubscriberAsyncList=vt;exports.aggregateUnsubscriberAsyncs=cr;exports.aggregateUnsubscribers=lr;exports.at=Gt;exports.charAt=j;exports.codePointAt=Jt;exports.compareScrRefs=or;exports.createSyncProxyForAsyncObject=mt;exports.debounce=ut;exports.deepClone=A;exports.deepEqual=Ge;exports.deserialize=Ke;exports.endsWith=Te;exports.ensureArray=X;exports.escapeStringRegexp=Qt;exports.formatBytes=qr;exports.formatReplacementString=Lt;exports.formatScrRef=ur;exports.getAllObjectFunctionNames=dt;exports.getChaptersForBook=qe;exports.getCurrentLocale=Vr;exports.getErrorMessage=ht;exports.getLocalizeKeyForScrollGroupId=ze;exports.getLocalizeKeysForScrollGroupIds=ar;exports.getLocalizedIdFromBookNumber=ir;exports.groupBy=lt;exports.htmlEncode=kr;exports.includes=Pe;exports.indexOf=T;exports.isLocalizeKey=Yt;exports.isSerializable=Dr;exports.isString=ge;exports.isSubset=Je;exports.lastIndexOf=Re;exports.localizedStringsDocumentSchema=He;exports.menuDocumentSchema=We;exports.newGuid=at;exports.normalize=Ut;exports.offsetBook=rr;exports.offsetChapter=sr;exports.offsetVerse=nr;exports.ordinalCompare=Xt;exports.padEnd=Ht;exports.padStart=Wt;exports.projectSettingsDocumentSchema=Le;exports.scrRefToBBBCCCVVV=F;exports.serialize=G;exports.settingsDocumentSchema=Ue;exports.slice=Zt;exports.split=_;exports.startsWith=H;exports.stringLength=g;exports.substring=w;exports.toArray=Be;exports.transformAndEnsureRegExpArray=tr;exports.transformAndEnsureRegExpRegExpArray=er;exports.wait=be;exports.waitForDuration=pt; +//# sourceMappingURL=index.cjs.map diff --git a/lib/platform-bible-utils/dist/index.cjs.map b/lib/platform-bible-utils/dist/index.cjs.map new file mode 100644 index 0000000000..47f69cc131 --- /dev/null +++ b/lib/platform-bible-utils/dist/index.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.cjs","sources":["../src/async-variable.ts","../src/intl-collator.ts","../src/intl-date-time-format.ts","../src/platform-event-emitter.model.ts","../src/util.ts","../src/document-combiner.ts","../src/mutex.ts","../src/mutex-map.ts","../src/non-validating-document-combiner.ts","../src/intl-number-format.ts","../src/unsubscriber-async-list.ts","../../../node_modules/@sillsdev/scripture/dist/index.es.js","../../../node_modules/char-regex/index.js","../../../node_modules/stringz/dist/index.js","../src/array-util.ts","../src/string-util.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/subset-checking.ts","../src/serialization.ts","../src/intl-util.ts","../src/number-utils.ts","../src/settings.model.ts","../src/localized-strings.model.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all. Defaults to 10000 ms\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected. Defaults to `false`\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected. Defaults to `false`\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Enables language-sensitive string comparison. Wraps Intl.Collator */\nexport default class Collator {\n private collator: Intl.Collator;\n\n constructor(locales?: string | string[], options?: Intl.CollatorOptions) {\n this.collator = new Intl.Collator(locales, options);\n }\n\n /**\n * Compares two strings according to the sort order of this Collator object\n *\n * @param string1 String to compare\n * @param string2 String to compare\n * @returns A number indicating how string1 and string2 compare to each other according to the\n * sort order of this Collator object. Negative value if string1 comes before string2. Positive\n * value if string1 comes after string2. 0 if they are considered equal.\n */\n compare(string1: string, string2: string): number {\n return this.collator.compare(string1, string2);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and collation options computed\n * during initialization of this collator object.\n *\n * @returns ResolvedCollatorOptions object\n */\n resolvedOptions(): Intl.ResolvedCollatorOptions {\n return this.collator.resolvedOptions();\n }\n}\n","/** Enables language-sensitive data and time formatting. Wraps Intl.DateTimeFormat */\nexport default class DateTimeFormat {\n private dateTimeFormatter: Intl.DateTimeFormat;\n\n constructor(locales?: string | string[], options?: Intl.DateTimeFormatOptions) {\n this.dateTimeFormatter = new Intl.DateTimeFormat(locales, options);\n }\n\n /**\n * Formats a date according to the locale and formatting option for this DateTimeFormat object\n *\n * @param date The date to format\n * @returns String representing the given date formatted according to the locale and formatting\n * options of this DateTimeFormat object\n */\n format(date: Date): string {\n return this.dateTimeFormatter.format(date);\n }\n\n /**\n * Formats a date range in the most concise way based on the locales and options provided when\n * instantiating this DateTimeFormat object\n *\n * @param startDate Date object representing start of the date range\n * @param endDate Date object representing the end of the date range\n * @returns String representing the given date range formatted according to the locale and\n * formatting options of this DateTimeFormat object\n */\n formatRange(startDate: Date, endDate: Date): string {\n return this.dateTimeFormatter.formatRange(startDate, endDate);\n }\n\n /**\n * Returns an array of locale-specific tokens representing each part of the formatted date range\n * produced by this DateTimeFormat object\n *\n * @param startDate Date object representing start of the date range\n * @param endDate Date object representing the end of the date range\n * @returns Array of DateTimeRangeFormatPart objects\n */\n formatRangeToParts(startDate: Date, endDate: Date): Intl.DateTimeRangeFormatPart[] {\n return this.dateTimeFormatter.formatRangeToParts(startDate, endDate);\n }\n\n /**\n * Allows locale-aware formatting of strings produced by this DateTimeFormat object\n *\n * @param date The date to format\n * @returns Array of DateTimeFormatPart objects\n */\n formatToParts(date: Date): Intl.DateTimeFormatPart[] {\n return this.dateTimeFormatter.formatToParts(date);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and date and time formatting options\n * computed during initialization of this DateTimeFormat object\n *\n * @returns ResolvedDateTimeFormatOptions object\n */\n resolvedOptions(): Intl.ResolvedDateTimeFormatOptions {\n return this.dateTimeFormatter.resolvedOptions();\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n // Clone the subscriptions array before iterating over the callbacks so the callback index\n // doesn't get messed up if someone subscribes or unsubscribes inside one of the callbacks\n const emitCallbacks = [...(this.subscriptions ?? [])];\n emitCallbacks.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param _objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n // Leaving it here for debugging\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n // Too noisy - only reenable if you need more details\n // console.trace(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n // Too noisy - only reenable if you need more details\n // console.trace(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n\n/** Within type T, recursively change all properties to be optional */\nexport type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T;\n\n/** Within type T, recursively change properties that were of type A to be of type B */\nexport type ReplaceType = T extends A\n ? B\n : T extends object\n ? { [K in keyof T]: ReplaceType }\n : T;\n\n// Thanks to jcalz at https://stackoverflow.com/a/50375286\n/**\n * Converts a union type to an intersection type (`|` to `&`).\n *\n * Note: this utility type is for use on object types. It may fail on other types.\n *\n * @example\n *\n * ```typescript\n * type TypeOne = { one: string };\n * type TypeTwo = { two: number };\n * type TypeThree = { three: string };\n *\n * type TypeNums = { one: TypeOne; two: TypeTwo; three: TypeThree };\n * const numNames = ['one', 'two'] as const;\n * type TypeNumNames = typeof numNames;\n *\n * // Same as `TypeOne | TypeTwo`\n * // `{ one: string } | { two: number }`\n * type TypeOneTwoUnion = TypeNums[TypeNumNames[number]];\n *\n * // Same as `TypeOne & TypeTwo`\n * // `{ one: string; two: number }`\n * type TypeOneTwoIntersection = UnionToIntersection;\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UnionToIntersection = (U extends any ? (x: U) => void : never) extends (\n x: infer I,\n) => void\n ? I\n : never;\n","import PlatformEventEmitter from './platform-event-emitter.model';\nimport { deepClone } from './util';\n\ntype JsonObjectLike = { [key: string]: unknown };\ntype JsonArrayLike = unknown[];\n\nexport type JsonDocumentLike = JsonObjectLike | JsonArrayLike;\n\n/**\n * Options for DocumentCombiner objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (primarily in the form of JS objects\n * or arrays) together into a single output document.\n */\nexport default class DocumentCombiner {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n private readonly onDidRebuildEmitter = new PlatformEventEmitter();\n /** Event that emits to announce that the document has been rebuilt and the output has been updated */\n // Need `onDidRebuildEmitter` to be instantiated before this line\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly onDidRebuild = this.onDidRebuildEmitter.subscribe;\n\n /**\n * Create a DocumentCombiner instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateBaseDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n this.baseDocument = this.transformBaseDocumentAfterValidation(this.baseDocument);\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * Note: the order in which contribution documents are added can be considered to be indeterminate\n * as it is currently ordered by however `Map.forEach` provides the contributions. The order\n * matters when merging two arrays into one. Also, when `options.ignoreDuplicateProperties` is\n * `true`, the order also matters when adding the same property to an object that is already\n * provided previously. Please let us know if you have trouble because of indeterminate\n * contribution ordering.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n let documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n documentToSet = this.transformContributionAfterValidation(documentName, documentToSet);\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): JsonDocumentLike | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`${documentName} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete all present contribution documents for the composition process and return to the base\n * document\n *\n * @returns Recalculated output document consisting only of the base document\n */\n deleteAllContributions(): JsonDocumentLike | undefined {\n if (this.contributions.size <= 0) return this.latestOutput;\n\n // Save out all contributions\n const contributions = [...this.contributions.entries()];\n\n // Delete all contributions\n contributions.forEach(([contributionName]) => this.contributions.delete(contributionName));\n\n // Rebuild with no contributions\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting all contributions, put them back and rethrow\n contributions.forEach(([contributionName, document]) =>\n this.contributions.set(contributionName, document),\n );\n throw new Error(`Error when deleting all contributions: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutputBeforeValidation(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n this.onDidRebuildEmitter.emit(undefined);\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutputBeforeValidation(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n this.onDidRebuildEmitter.emit(undefined);\n return this.latestOutput;\n }\n\n /**\n * Transform the starting document that is given to the combiner. This transformation occurs after\n * validating the base document and before combining any contributions.\n *\n * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside\n * this method, this method will directly modify the `baseDocument` passed in.\n *\n * @param baseDocument Initial input document. Already validated via `validateBaseDocument`\n * @returns Transformed base document\n */\n // We just don't need `this` here. This is basically a no-op function that is available to child\n // classes to override\n // eslint-disable-next-line class-methods-use-this\n protected transformBaseDocumentAfterValidation(baseDocument: JsonDocumentLike): JsonDocumentLike {\n return baseDocument;\n }\n\n /**\n * Transform the contributed document associated with `documentName`. This transformation occurs\n * after validating the contributed document and before combining with other documents.\n *\n * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside\n * this method, this method will directly modify the contributed `document` passed in.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine. Already validated via\n * `validateContribution`\n * @returns Transformed contributed document\n */\n // We just don't need `this` here. This is basically a no-op function that is available to child\n // classes to override\n // eslint-disable-next-line class-methods-use-this\n protected transformContributionAfterValidation(\n // @ts-expect-error this parameter is unused but may be used in child classes\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike {\n return document;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateBaseDocument(baseDocument: JsonDocumentLike): void {}\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateContribution(documentName: string, document: JsonDocumentLike): void {}\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateOutput(output: JsonDocumentLike): void {}\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation via `validateOutput`\n * before `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n // no-op intended to be overridden by child classes. Can't be static\n // eslint-disable-next-line class-methods-use-this\n protected transformFinalOutputBeforeValidation(finalOutput: JsonDocumentLike): JsonDocumentLike {\n return finalOutput;\n }\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Deep clone and recursively merge the properties of one object (copyFrom) into another\n * (startingPoint). Throws if copyFrom would overwrite values already existing in startingPoint.\n *\n * Does not modify the objects passed in.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @param ignoreDuplicateProperties Whether to ignore object properties that are present in\n * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object\n * property in `copyFrom` is already present in `startingPoint`\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n\n if (!copyFrom) return retVal;\n\n return mergeObjectsInternal(retVal, deepClone(copyFrom), ignoreDuplicateProperties);\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * WARNING: Modifies the argument objects in some way. Recommended to use `mergeObjects`\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @param ignoreDuplicateProperties Whether to ignore object properties that are present in\n * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object\n * property in `copyFrom` is already present in `startingPoint`\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjectsInternal(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n if (!copyFrom) return startingPoint;\n\n if (areNonArrayObjects(startingPoint, copyFrom)) {\n // Merge properties since they are both objects\n\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n const startingPointObj = startingPoint as JsonObjectLike;\n const copyFromObj = copyFrom as JsonObjectLike;\n /* eslint-enable no-type-assertion/no-type-assertion */\n Object.keys(copyFromObj).forEach((key: string | number) => {\n if (Object.hasOwn(startingPointObj, key)) {\n if (areNonArrayObjects(startingPointObj[key], copyFromObj[key])) {\n startingPointObj[key] = mergeObjectsInternal(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPointObj[key] as JsonObjectLike,\n copyFromObj[key] as JsonObjectLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPointObj[key], copyFromObj[key])) {\n // Concat the arrays since they are both arrays\n\n // We know these are arrays from the `else if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPointObj[key] = (startingPointObj[key] as JsonArrayLike).concat(\n copyFromObj[key] as JsonArrayLike,\n );\n /* eslint-enable no-type-assertion/no-type-assertion */\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n // Note that the first non-object non-array value that gets placed in a property stays.\n // New values do not override existing ones\n } else {\n startingPointObj[key] = copyFromObj[key];\n }\n });\n } else if (areArrayObjects(startingPoint, copyFrom)) {\n // Concat the arrays since they are both arrays\n\n // Push the contents of copyFrom into startingPoint since it is a const and was already deep cloned\n // We know these are objects from the `else if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n (startingPoint as JsonArrayLike).push(...(copyFrom as JsonArrayLike));\n /* eslint-enable no-type-assertion/no-type-assertion */\n }\n\n // Note that nothing happens if `startingPoint` is not an object or an array or if `startingPoint`\n // and `copyFrom` are not both object or both arrays. Should we throw? Should we push `copyFrom`'s\n // values into the array? Other? Maybe one day we can add some options to decide what to do in\n // this situation, but YAGNI for now\n\n return startingPoint;\n}\n\n// #endregion\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import DocumentCombiner, { DocumentCombinerOptions, JsonDocumentLike } from './document-combiner';\n\nexport default class NonValidatingDocumentCombiner extends DocumentCombiner {\n // Making the protected base constructor public\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n super(baseDocument, options);\n }\n\n get output(): JsonDocumentLike | undefined {\n return this.latestOutput;\n }\n}\n","/** Enables language-sensitive number formatting. Wraps Intl.NumberFormat */\nexport default class NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n\n constructor(locales?: string | string[], options?: Intl.NumberFormatOptions) {\n this.numberFormatter = new Intl.NumberFormat(locales, options);\n }\n\n /**\n * Formats a number according to the locale and formatting options of this NumberFormat object\n *\n * @param value Number or BigInt to format\n * @returns String representing the given number formatted according to the locale and formatting\n * options of this NumberFormat object\n */\n format(value: number | bigint): string {\n return this.numberFormatter.format(value);\n }\n\n /**\n * Formats a range of numbers according to the locale and formatting options of this NumberFormat\n * object\n *\n * @param startRange Number or bigint representing the start of the range\n * @param endRange Number or bigint representing the end of the range\n * @returns String representing the given range of numbers formatted according to the locale and\n * formatting options of this NumberFormat object\n */\n formatRange(startRange: number | bigint, endRange: number | bigint): string {\n return this.numberFormatter.formatRange(startRange, endRange);\n }\n\n /**\n * Returns an array of objects containing the locale-specific tokens from which it is possible to\n * build custom strings while preserving the locale-specific parts.\n *\n * @param startRange Number or bigint representing start of the range\n * @param endRange Number or bigint representing end of the range\n * @returns Array of NumberRangeFormatPart objects containing the formatted range of numbers in\n * parts\n */\n formatRangeToParts(\n startRange: number | bigint,\n endRange: number | bigint,\n ): Intl.NumberRangeFormatPart[] {\n return this.numberFormatter.formatRangeToParts(startRange, endRange);\n }\n\n /**\n * Allows locale-aware formatting of strings produced by this NumberFormat object\n *\n * @param value Number or bigint to format\n * @returns Array of NumberFormatPart objects containing the formatted number in parts\n */\n formatToParts(value: number | bigint): Intl.NumberFormatPart[] {\n return this.numberFormatter.formatToParts(value);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and number formatting options\n * computed during initialization of this NumberFormat object\n *\n * @returns ResolvedNumberFormatOptions object\n */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n return this.numberFormatter.resolvedOptions();\n }\n}\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","var P = Object.defineProperty;\nvar R = (t, e, s) => e in t ? P(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;\nvar n = (t, e, s) => R(t, typeof e != \"symbol\" ? e + \"\" : e, s);\nclass _ {\n constructor() {\n n(this, \"books\");\n n(this, \"firstSelectedBookNum\");\n n(this, \"lastSelectedBookNum\");\n n(this, \"count\");\n n(this, \"selectedBookNumbers\");\n n(this, \"selectedBookIds\");\n }\n}\nconst N = [\n \"GEN\",\n \"EXO\",\n \"LEV\",\n \"NUM\",\n \"DEU\",\n \"JOS\",\n \"JDG\",\n \"RUT\",\n \"1SA\",\n \"2SA\",\n // 10\n \"1KI\",\n \"2KI\",\n \"1CH\",\n \"2CH\",\n \"EZR\",\n \"NEH\",\n \"EST\",\n \"JOB\",\n \"PSA\",\n \"PRO\",\n // 20\n \"ECC\",\n \"SNG\",\n \"ISA\",\n \"JER\",\n \"LAM\",\n \"EZK\",\n \"DAN\",\n \"HOS\",\n \"JOL\",\n \"AMO\",\n // 30\n \"OBA\",\n \"JON\",\n \"MIC\",\n \"NAM\",\n \"HAB\",\n \"ZEP\",\n \"HAG\",\n \"ZEC\",\n \"MAL\",\n \"MAT\",\n // 40\n \"MRK\",\n \"LUK\",\n \"JHN\",\n \"ACT\",\n \"ROM\",\n \"1CO\",\n \"2CO\",\n \"GAL\",\n \"EPH\",\n \"PHP\",\n // 50\n \"COL\",\n \"1TH\",\n \"2TH\",\n \"1TI\",\n \"2TI\",\n \"TIT\",\n \"PHM\",\n \"HEB\",\n \"JAS\",\n \"1PE\",\n // 60\n \"2PE\",\n \"1JN\",\n \"2JN\",\n \"3JN\",\n \"JUD\",\n \"REV\",\n \"TOB\",\n \"JDT\",\n \"ESG\",\n \"WIS\",\n // 70\n \"SIR\",\n \"BAR\",\n \"LJE\",\n \"S3Y\",\n \"SUS\",\n \"BEL\",\n \"1MA\",\n \"2MA\",\n \"3MA\",\n \"4MA\",\n // 80\n \"1ES\",\n \"2ES\",\n \"MAN\",\n \"PS2\",\n \"ODA\",\n \"PSS\",\n \"JSA\",\n // actual variant text for JOS, now in LXA text\n \"JDB\",\n // actual variant text for JDG, now in LXA text\n \"TBS\",\n // actual variant text for TOB, now in LXA text\n \"SST\",\n // actual variant text for SUS, now in LXA text // 90\n \"DNT\",\n // actual variant text for DAN, now in LXA text\n \"BLT\",\n // actual variant text for BEL, now in LXA text\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n // 100\n \"BAK\",\n \"OTH\",\n \"3ES\",\n // Used previously but really should be 2ES\n \"EZA\",\n // Used to be called 4ES, but not actually in any known project\n \"5EZ\",\n // Used to be called 5ES, but not actually in any known project\n \"6EZ\",\n // Used to be called 6ES, but not actually in any known project\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n // 110\n \"NDX\",\n \"DAG\",\n \"PS3\",\n \"2BA\",\n \"LBA\",\n \"JUB\",\n \"ENO\",\n \"1MQ\",\n \"2MQ\",\n \"3MQ\",\n // 120\n \"REP\",\n \"4BA\",\n \"LAO\"\n], B = [\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n \"BAK\",\n \"OTH\",\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n \"NDX\"\n], O = [\n \"Genesis\",\n \"Exodus\",\n \"Leviticus\",\n \"Numbers\",\n \"Deuteronomy\",\n \"Joshua\",\n \"Judges\",\n \"Ruth\",\n \"1 Samuel\",\n \"2 Samuel\",\n \"1 Kings\",\n \"2 Kings\",\n \"1 Chronicles\",\n \"2 Chronicles\",\n \"Ezra\",\n \"Nehemiah\",\n \"Esther (Hebrew)\",\n \"Job\",\n \"Psalms\",\n \"Proverbs\",\n \"Ecclesiastes\",\n \"Song of Songs\",\n \"Isaiah\",\n \"Jeremiah\",\n \"Lamentations\",\n \"Ezekiel\",\n \"Daniel (Hebrew)\",\n \"Hosea\",\n \"Joel\",\n \"Amos\",\n \"Obadiah\",\n \"Jonah\",\n \"Micah\",\n \"Nahum\",\n \"Habakkuk\",\n \"Zephaniah\",\n \"Haggai\",\n \"Zechariah\",\n \"Malachi\",\n \"Matthew\",\n \"Mark\",\n \"Luke\",\n \"John\",\n \"Acts\",\n \"Romans\",\n \"1 Corinthians\",\n \"2 Corinthians\",\n \"Galatians\",\n \"Ephesians\",\n \"Philippians\",\n \"Colossians\",\n \"1 Thessalonians\",\n \"2 Thessalonians\",\n \"1 Timothy\",\n \"2 Timothy\",\n \"Titus\",\n \"Philemon\",\n \"Hebrews\",\n \"James\",\n \"1 Peter\",\n \"2 Peter\",\n \"1 John\",\n \"2 John\",\n \"3 John\",\n \"Jude\",\n \"Revelation\",\n \"Tobit\",\n \"Judith\",\n \"Esther Greek\",\n \"Wisdom of Solomon\",\n \"Sirach (Ecclesiasticus)\",\n \"Baruch\",\n \"Letter of Jeremiah\",\n \"Song of 3 Young Men\",\n \"Susanna\",\n \"Bel and the Dragon\",\n \"1 Maccabees\",\n \"2 Maccabees\",\n \"3 Maccabees\",\n \"4 Maccabees\",\n \"1 Esdras (Greek)\",\n \"2 Esdras (Latin)\",\n \"Prayer of Manasseh\",\n \"Psalm 151\",\n \"Odes\",\n \"Psalms of Solomon\",\n // WARNING, if you change the spelling of the *obsolete* tag be sure to update\n // IsObsolete routine\n \"Joshua A. *obsolete*\",\n \"Judges B. *obsolete*\",\n \"Tobit S. *obsolete*\",\n \"Susanna Th. *obsolete*\",\n \"Daniel Th. *obsolete*\",\n \"Bel Th. *obsolete*\",\n \"Extra A\",\n \"Extra B\",\n \"Extra C\",\n \"Extra D\",\n \"Extra E\",\n \"Extra F\",\n \"Extra G\",\n \"Front Matter\",\n \"Back Matter\",\n \"Other Matter\",\n \"3 Ezra *obsolete*\",\n \"Apocalypse of Ezra\",\n \"5 Ezra (Latin Prologue)\",\n \"6 Ezra (Latin Epilogue)\",\n \"Introduction\",\n \"Concordance \",\n \"Glossary \",\n \"Topical Index\",\n \"Names Index\",\n \"Daniel Greek\",\n \"Psalms 152-155\",\n \"2 Baruch (Apocalypse)\",\n \"Letter of Baruch\",\n \"Jubilees\",\n \"Enoch\",\n \"1 Meqabyan\",\n \"2 Meqabyan\",\n \"3 Meqabyan\",\n \"Reproof (Proverbs 25-31)\",\n \"4 Baruch (Rest of Baruch)\",\n \"Laodiceans\"\n], S = K();\nfunction g(t, e = !0) {\n return e && (t = t.toUpperCase()), t in S ? S[t] : 0;\n}\nfunction k(t) {\n return g(t) > 0;\n}\nfunction x(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return e >= 40 && e <= 66;\n}\nfunction T(t) {\n return (typeof t == \"string\" ? g(t) : t) <= 39;\n}\nfunction X(t) {\n return t <= 66;\n}\nfunction V(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return w(e) && !X(e);\n}\nfunction* L() {\n for (let t = 1; t <= N.length; t++) yield t;\n}\nconst G = 1, A = N.length;\nfunction H() {\n return [\"XXA\", \"XXB\", \"XXC\", \"XXD\", \"XXE\", \"XXF\", \"XXG\"];\n}\nfunction C(t, e = \"***\") {\n const s = t - 1;\n return s < 0 || s >= N.length ? e : N[s];\n}\nfunction I(t) {\n return t <= 0 || t > A ? \"******\" : O[t - 1];\n}\nfunction y(t) {\n return I(g(t));\n}\nfunction w(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && !B.includes(e);\n}\nfunction q(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && B.includes(e);\n}\nfunction U(t) {\n return O[t - 1].includes(\"*obsolete*\");\n}\nfunction K() {\n const t = {};\n for (let e = 0; e < N.length; e++)\n t[N[e]] = e + 1;\n return t;\n}\nconst m = {\n allBookIds: N,\n nonCanonicalIds: B,\n bookIdToNumber: g,\n isBookIdValid: k,\n isBookNT: x,\n isBookOT: T,\n isBookOTNT: X,\n isBookDC: V,\n allBookNumbers: L,\n firstBook: G,\n lastBook: A,\n extraBooks: H,\n bookNumberToId: C,\n bookNumberToEnglishName: I,\n bookIdToEnglishName: y,\n isCanonical: w,\n isExtraMaterial: q,\n isObsolete: U\n};\nvar l = /* @__PURE__ */ ((t) => (t[t.Unknown = 0] = \"Unknown\", t[t.Original = 1] = \"Original\", t[t.Septuagint = 2] = \"Septuagint\", t[t.Vulgate = 3] = \"Vulgate\", t[t.English = 4] = \"English\", t[t.RussianProtestant = 5] = \"RussianProtestant\", t[t.RussianOrthodox = 6] = \"RussianOrthodox\", t))(l || {});\nconst h = class h {\n // private versInfo: Versification;\n constructor(e) {\n n(this, \"name\");\n n(this, \"fullPath\");\n n(this, \"isPresent\");\n n(this, \"hasVerseSegments\");\n n(this, \"isCustomized\");\n n(this, \"baseVersification\");\n n(this, \"scriptureBooks\");\n n(this, \"_type\");\n if (e == null)\n throw new Error(\"Argument undefined\");\n typeof e == \"string\" ? (this.name = e, this._type = l[e]) : (this._type = e, this.name = l[e]);\n }\n get type() {\n return this._type;\n }\n equals(e) {\n return !e.type || !this.type ? !1 : e.type === this.type;\n }\n};\nn(h, \"Original\", new h(l.Original)), n(h, \"Septuagint\", new h(l.Septuagint)), n(h, \"Vulgate\", new h(l.Vulgate)), n(h, \"English\", new h(l.English)), n(h, \"RussianProtestant\", new h(l.RussianProtestant)), n(h, \"RussianOrthodox\", new h(l.RussianOrthodox));\nlet c = h;\nfunction E(t, e) {\n const s = e[0];\n for (let r = 1; r < e.length; r++)\n t = t.split(e[r]).join(s);\n return t.split(s);\n}\nvar D = /* @__PURE__ */ ((t) => (t[t.Valid = 0] = \"Valid\", t[t.UnknownVersification = 1] = \"UnknownVersification\", t[t.OutOfRange = 2] = \"OutOfRange\", t[t.VerseOutOfOrder = 3] = \"VerseOutOfOrder\", t[t.VerseRepeated = 4] = \"VerseRepeated\", t))(D || {});\nconst i = class i {\n constructor(e, s, r, a) {\n /** Not yet implemented. */\n n(this, \"firstChapter\");\n /** Not yet implemented. */\n n(this, \"lastChapter\");\n /** Not yet implemented. */\n n(this, \"lastVerse\");\n /** Not yet implemented. */\n n(this, \"hasSegmentsDefined\");\n /** Not yet implemented. */\n n(this, \"text\");\n /** Not yet implemented. */\n n(this, \"BBBCCCVVVS\");\n /** Not yet implemented. */\n n(this, \"longHashCode\");\n /** The versification of the reference. */\n n(this, \"versification\");\n n(this, \"rtlMark\", \"‏\");\n n(this, \"_bookNum\", 0);\n n(this, \"_chapterNum\", 0);\n n(this, \"_verseNum\", 0);\n n(this, \"_verse\");\n if (r == null && a == null)\n if (e != null && typeof e == \"string\") {\n const o = e, u = s != null && s instanceof c ? s : void 0;\n this.setEmpty(u), this.parse(o);\n } else if (e != null && typeof e == \"number\") {\n const o = s != null && s instanceof c ? s : void 0;\n this.setEmpty(o), this._verseNum = e % i.chapterDigitShifter, this._chapterNum = Math.floor(\n e % i.bookDigitShifter / i.chapterDigitShifter\n ), this._bookNum = Math.floor(e / i.bookDigitShifter);\n } else if (s == null)\n if (e != null && e instanceof i) {\n const o = e;\n this._bookNum = o.bookNum, this._chapterNum = o.chapterNum, this._verseNum = o.verseNum, this._verse = o.verse, this.versification = o.versification;\n } else {\n if (e == null) return;\n const o = e instanceof c ? e : i.defaultVersification;\n this.setEmpty(o);\n }\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else if (e != null && s != null && r != null)\n if (typeof e == \"string\" && typeof s == \"string\" && typeof r == \"string\")\n this.setEmpty(a), this.updateInternal(e, s, r);\n else if (typeof e == \"number\" && typeof s == \"number\" && typeof r == \"number\")\n this._bookNum = e, this._chapterNum = s, this._verseNum = r, this.versification = a ?? i.defaultVersification;\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else\n throw new Error(\"VerseRef constructor not supported.\");\n }\n /**\n * Determines if the verse string is in a valid format (does not consider versification).\n */\n static isVerseParseable(e) {\n return e.length > 0 && \"0123456789\".includes(e[0]) && !e.endsWith(this.verseRangeSeparator) && !e.endsWith(this.verseSequenceIndicator);\n }\n /**\n * Tries to parse the specified string into a verse reference.\n * @param str - The string to attempt to parse.\n * @returns success: `true` if the specified string was successfully parsed, `false` otherwise.\n * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed\n */\n static tryParse(e) {\n let s;\n try {\n return s = new i(e), { success: !0, verseRef: s };\n } catch (r) {\n if (r instanceof v)\n return s = new i(), { success: !1, verseRef: s };\n throw r;\n }\n }\n /**\n * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n * @param bookNum - Book number (this is 1-based, not an index).\n * @param chapterNum - Chapter number.\n * @param verseNum - Verse number.\n * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n */\n static getBBBCCCVVV(e, s, r) {\n return e % i.bcvMaxValue * i.bookDigitShifter + (s >= 0 ? s % i.bcvMaxValue * i.chapterDigitShifter : 0) + (r >= 0 ? r % i.bcvMaxValue : 0);\n }\n /**\n * Deserializes a serialized VerseRef.\n * @param serializedVerseRef - Serialized VerseRef to create from.\n * @returns the deserialized VerseRef.\n */\n static fromJSON(e) {\n const { book: s, chapterNum: r, verseNum: a, verse: o, versificationStr: u } = e, f = o || a.toString();\n let d;\n return u && (d = new c(u)), s ? new i(s, r.toString(), f, d) : new i();\n }\n /**\n * Parses a verse string and gets the leading numeric portion as a number.\n * @param verseStr - verse string to parse\n * @returns true if the entire string could be parsed as a single, simple verse number (1-999);\n * false if the verse string represented a verse bridge, contained segment letters, or was invalid\n */\n static tryGetVerseNum(e) {\n let s;\n if (!e)\n return s = -1, { success: !0, vNum: s };\n s = 0;\n let r;\n for (let a = 0; a < e.length; a++) {\n if (r = e[a], r < \"0\" || r > \"9\")\n return a === 0 && (s = -1), { success: !1, vNum: s };\n if (s = s * 10 + +r - 0, s > i.bcvMaxValue)\n return s = -1, { success: !1, vNum: s };\n }\n return { success: !0, vNum: s };\n }\n /**\n * Checks to see if a VerseRef hasn't been set - all values are the default.\n */\n get isDefault() {\n return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null;\n }\n /**\n * Gets whether the verse contains multiple verses.\n */\n get hasMultiple() {\n return this._verse != null && (this._verse.includes(i.verseRangeSeparator) || this._verse.includes(i.verseSequenceIndicator));\n }\n /**\n * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters,\n * e.g. `'MAT'`.\n */\n get book() {\n return m.bookNumberToId(this.bookNum, \"\");\n }\n set book(e) {\n this.bookNum = m.bookIdToNumber(e);\n }\n /**\n * Gets or sets the chapter of the reference,. e.g. `'3'`.\n */\n get chapter() {\n return this.isDefault || this._chapterNum < 0 ? \"\" : this._chapterNum.toString();\n }\n set chapter(e) {\n const s = +e;\n this._chapterNum = Number.isInteger(s) ? s : -1;\n }\n /**\n * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`,\n * or `'4b-5a, 7'`.\n */\n get verse() {\n return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? \"\" : this._verseNum.toString();\n }\n set verse(e) {\n const { success: s, vNum: r } = i.tryGetVerseNum(e);\n this._verse = s ? void 0 : e.replace(this.rtlMark, \"\"), this._verseNum = r, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = i.tryGetVerseNum(this._verse));\n }\n /**\n * Get or set Book based on book number, e.g. `42`.\n */\n get bookNum() {\n return this._bookNum;\n }\n set bookNum(e) {\n if (e <= 0 || e > m.lastBook)\n throw new v(\n \"BookNum must be greater than zero and less than or equal to last book\"\n );\n this._bookNum = e;\n }\n /**\n * Gets or sets the chapter number, e.g. `3`. `-1` if not valid.\n */\n get chapterNum() {\n return this._chapterNum;\n }\n set chapterNum(e) {\n this.chapterNum = e;\n }\n /**\n * Gets or sets verse start number, e.g. `4`. `-1` if not valid.\n */\n get verseNum() {\n return this._verseNum;\n }\n set verseNum(e) {\n this._verseNum = e;\n }\n /**\n * String representing the versification (should ONLY be used for serialization/deserialization).\n *\n * @remarks This is for backwards compatibility when ScrVers was an enumeration.\n */\n get versificationStr() {\n var e;\n return (e = this.versification) == null ? void 0 : e.name;\n }\n set versificationStr(e) {\n this.versification = this.versification != null ? new c(e) : void 0;\n }\n /**\n * Determines if the reference is valid.\n */\n get valid() {\n return this.validStatus === 0;\n }\n /**\n * Get the valid status for this reference.\n */\n get validStatus() {\n return this.validateVerse(i.verseRangeSeparators, i.verseSequenceIndicators);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits and the verse is 0.\n */\n get BBBCCC() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, 0);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits. If verse is not null\n * (i.e., this reference represents a complex reference with verse\n * segments or bridge) this cannot be used for an exact comparison.\n */\n get BBBCCCVVV() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum);\n }\n /**\n * Gets whether the verse is defined as an excluded verse in the versification.\n * Does not handle verse ranges.\n */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n get isExcluded() {\n return !1;\n }\n /**\n * Parses the reference in the specified string.\n * Optionally versification can follow reference as in GEN 3:11/4\n * Throw an exception if\n * - invalid book name\n * - chapter number is missing or not a number\n * - verse number is missing or does not start with a number\n * - versification is invalid\n * @param verseStr - string to parse e.g. 'MAT 3:11'\n */\n parse(e) {\n if (e = e.replace(this.rtlMark, \"\"), e.includes(\"/\")) {\n const o = e.split(\"/\");\n if (e = o[0], o.length > 1)\n try {\n const u = +o[1].trim();\n this.versification = new c(l[u]);\n } catch {\n throw new v(\"Invalid reference : \" + e);\n }\n }\n const s = e.trim().split(\" \");\n if (s.length !== 2)\n throw new v(\"Invalid reference : \" + e);\n const r = s[1].split(\":\"), a = +r[0];\n if (r.length !== 2 || m.bookIdToNumber(s[0]) === 0 || !Number.isInteger(a) || a < 0 || !i.isVerseParseable(r[1]))\n throw new v(\"Invalid reference : \" + e);\n this.updateInternal(s[0], r[0], r[1]);\n }\n /**\n * Simplifies this verse ref so that it has no bridging of verses or\n * verse segments like `'1a'`.\n */\n simplify() {\n this._verse = void 0;\n }\n /**\n * Makes a clone of the reference.\n *\n * @returns The cloned VerseRef.\n */\n clone() {\n return new i(this);\n }\n toString() {\n const e = this.book;\n return e === \"\" ? \"\" : `${e} ${this.chapter}:${this.verse}`;\n }\n toJSON() {\n let e = this.verse;\n (e === \"\" || e === this.verseNum.toString()) && (e = void 0);\n const s = {\n book: this.book,\n chapterNum: this.chapterNum,\n verseNum: this.verseNum,\n verse: e,\n versificationStr: this.versificationStr\n };\n return e || delete s.verse, s;\n }\n /**\n * Compares this `VerseRef` with supplied one.\n * @param verseRef - object to compare this one to.\n * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise.\n */\n equals(e) {\n return e instanceof i ? e._bookNum === this._bookNum && e._chapterNum === this._chapterNum && e._verseNum === this._verseNum && e.verse === this.verse && (e.versification == null && this.versification == null || e.versification != null && this.versification != null && e.versification.equals(this.versification)) : !1;\n }\n /**\n * Enumerate all individual verses contained in a VerseRef.\n * Verse ranges are indicated by \"-\" and consecutive verses by \",\"s.\n * Examples:\n * GEN 1:2 returns GEN 1:2\n * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5\n * GEN 1:2a-2c returns //! ??????\n *\n * @param specifiedVersesOnly - if set to true return only verses that are\n * explicitly specified only, not verses within a range. Defaults to `false`.\n * @param verseRangeSeparators - Verse range separators.\n * Defaults to `VerseRef.verseRangeSeparators`.\n * @param verseSequenceSeparators - Verse sequence separators.\n * Defaults to `VerseRef.verseSequenceIndicators`.\n * @returns An array of all single verse references in this VerseRef.\n */\n allVerses(e = !1, s = i.verseRangeSeparators, r = i.verseSequenceIndicators) {\n if (this._verse == null || this.chapterNum <= 0)\n return [this.clone()];\n const a = [], o = E(this._verse, r);\n for (const u of o.map((f) => E(f, s))) {\n const f = this.clone();\n f.verse = u[0];\n const d = f.verseNum;\n if (a.push(f), u.length > 1) {\n const b = this.clone();\n if (b.verse = u[1], !e)\n for (let p = d + 1; p < b.verseNum; p++) {\n const J = new i(\n this._bookNum,\n this._chapterNum,\n p,\n this.versification\n );\n this.isExcluded || a.push(J);\n }\n a.push(b);\n }\n }\n return a;\n }\n /**\n * Validates a verse number using the supplied separators rather than the defaults.\n */\n validateVerse(e, s) {\n if (!this.verse)\n return this.internalValid;\n let r = 0;\n for (const a of this.allVerses(!0, e, s)) {\n const o = a.internalValid;\n if (o !== 0)\n return o;\n const u = a.BBBCCCVVV;\n if (r > u)\n return 3;\n if (r === u)\n return 4;\n r = u;\n }\n return 0;\n }\n /**\n * Gets whether a single verse reference is valid.\n */\n get internalValid() {\n return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > m.lastBook ? 2 : (m.isCanonical(this._bookNum), 0);\n }\n setEmpty(e = i.defaultVersification) {\n this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = e;\n }\n updateInternal(e, s, r) {\n this.bookNum = m.bookIdToNumber(e), this.chapter = s, this.verse = r;\n }\n};\nn(i, \"defaultVersification\", c.English), n(i, \"verseRangeSeparator\", \"-\"), n(i, \"verseSequenceIndicator\", \",\"), n(i, \"verseRangeSeparators\", [i.verseRangeSeparator]), n(i, \"verseSequenceIndicators\", [i.verseSequenceIndicator]), n(i, \"chapterDigitShifter\", 1e3), n(i, \"bookDigitShifter\", i.chapterDigitShifter * i.chapterDigitShifter), n(i, \"bcvMaxValue\", i.chapterDigitShifter - 1), /**\n * The valid status of the VerseRef.\n */\nn(i, \"ValidStatusType\", D);\nlet M = i;\nclass v extends Error {\n}\nexport {\n _ as BookSet,\n m as Canon,\n c as ScrVers,\n l as ScrVersType,\n M as VerseRef,\n v as VerseRefException\n};\n//# sourceMappingURL=index.es.js.map\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","/**\n * Ensures that the given input is returned as an array.\n *\n * This function takes a value that might be a single item, an array, or `undefined` and returns it\n * as an array:\n *\n * - If the input is `undefined`, an empty array is returned.\n * - If the input is already an array, it is returned as-is.\n * - If the input is a single item, it is wrapped in an array.\n *\n * @typeParam T - The type of the elements in the array.\n * @param maybeArray - The value that may be a single item, an array, or `undefined`.\n * @returns An array containing the input value(s). If the input is `undefined`, an empty array is\n * returned.\n */\nexport default function ensureArray(maybeArray: T | T[] | undefined): T[] {\n if (!maybeArray) return [];\n\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n","import { LocalizeKey } from 'menus.model';\nimport {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\nimport ensureArray from './array-util';\n\n/**\n * This function mirrors the `at` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Finds the Unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified offset,\n * undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > stringLength(string) || index < -stringLength(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `charAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a new string consisting of the single unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified offset, empty\n * string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > stringLength(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the character at the given\n * index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > stringLength(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * This function mirrors the `endsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether a string ends with the characters of this string.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be found. Default is\n * `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = stringLength(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * Get the index of the closest closing curly brace in a string.\n *\n * Note: when escaped, gets the index of the curly brace, not the backslash before it.\n *\n * @param str String to search\n * @param index Index at which to start searching. Inclusive of this index\n * @param escaped Whether to search for an escaped or an unescaped closing curly brace\n * @returns Index of closest closing curly brace or -1 if not found\n */\nfunction indexOfClosestClosingCurlyBrace(str: string, index: number, escaped: boolean) {\n if (index < 0) return -1;\n if (escaped) {\n if (charAt(str, index) === '}' && charAt(str, index - 1) === '\\\\') return index;\n const closeCurlyBraceIndex = indexOf(str, '\\\\}', index);\n return closeCurlyBraceIndex >= 0 ? closeCurlyBraceIndex + 1 : closeCurlyBraceIndex;\n }\n\n let i = index;\n const strLength = stringLength(str);\n while (i < strLength) {\n i = indexOf(str, '}', i);\n\n if (i === -1 || charAt(str, i - 1) !== '\\\\') break;\n\n // Didn't find an un-escaped close brace, so keep looking\n i += 1;\n }\n\n return i >= strLength ? -1 : i;\n}\n\n/**\n * Formats a string, replacing `{replacer key}` with the value in the `replacers` at that replacer\n * key (or multiple replacer values if there are multiple in the string). Will also remove \\ before\n * curly braces if curly braces are escaped with a backslash in order to preserve the curly braces.\n * E.g. 'Hi, this is {name}! I like `\\{curly braces\\}`! would become Hi, this is Jim! I like {curly\n * braces}!\n *\n * If the key in unescaped braces is not found, returns the key without the braces. Empty unescaped\n * curly braces will just return a string without the braces e.g. ('I am {Nemo}', { 'name': 'Jim'})\n * would return 'I am Nemo'.\n *\n * @example\n *\n * ```typescript\n * formatReplacementString(\n * 'Hi, this is {name}! I like \\{curly braces\\}! I have a {carColor} car. My favorite food is {food}.',\n * { name: 'Bill', carColor: 'blue' }\n * );\n *\n * =>\n *\n * 'Hi, this is Bill! I like {curly braces}! I have a blue car. My favorite food is food.'\n * ```\n *\n * @param str String to format\n * @param replacers Object whose keys are replacer keys and whose values are the values with which\n * to replace `{replacer key}`s found in the string to format. Will be coerced to strings using\n * `${replacerValue}`\n * @returns Formatted string\n */\nexport function formatReplacementString(\n str: string,\n replacers: { [key: string | number]: string | unknown } | object,\n): string {\n let updatedStr = str;\n\n let i = 0;\n while (i < stringLength(updatedStr)) {\n switch (charAt(updatedStr, i)) {\n case '{':\n if (charAt(updatedStr, i - 1) !== '\\\\') {\n // This character is an un-escaped open curly brace. Try to match and replace\n const closeCurlyBraceIndex = indexOfClosestClosingCurlyBrace(updatedStr, i, false);\n if (closeCurlyBraceIndex >= 0) {\n // We have matching open and close indices. Try to replace the contents\n const replacerKey = substring(updatedStr, i + 1, closeCurlyBraceIndex);\n // Replace with the replacer string or just remove the curly braces\n const replacerString =\n replacerKey in replacers\n ? // We're getting a value.toString() with any type from an object with any keys\n // here. TypeScript doesn't need to carefully and precisely track the exact type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n `${replacers[replacerKey as keyof typeof replacers]}`\n : replacerKey;\n\n updatedStr = `${substring(updatedStr, 0, i)}${replacerString}${substring(updatedStr, closeCurlyBraceIndex + 1)}`;\n // Put our index at the closing brace adjusted for the new string length minus two\n // because we are removing the curly braces\n // Ex: \"stuff {and} things\"\n // Replacer for and: n'\n // closeCurlyBraceIndex is 10\n // \"stuff n' things\"\n // i = 10 + 2 - 3 - 2 = 7\n i = closeCurlyBraceIndex + stringLength(replacerString) - stringLength(replacerKey) - 2;\n } else {\n // This is an unexpected un-escaped open curly brace with no matching closing curly\n // brace. Just ignore, I guess\n }\n } else {\n // This character is an escaped open curly brace. Remove the escape\n updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`;\n // Adjust our index because we removed the escape\n i -= 1;\n }\n break;\n case '}':\n if (charAt(updatedStr, i - 1) !== '\\\\') {\n // This character is an un-escaped closing curly brace with no matching open curly\n // brace. Just ignore, I guess\n } else {\n // This character is an escaped closing curly brace. Remove the escape\n updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`;\n // Adjust our index because we removed the escape\n i -= 1;\n }\n break;\n default:\n // No need to do anything with other characters at this point\n break;\n }\n\n i += 1;\n }\n\n return updatedStr;\n}\n/**\n * This function mirrors the `includes` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Performs a case-sensitive search to determine if searchString is found in string.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString. Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * This function mirrors the `indexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the index of the first occurrence of a given string.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Searches this string and returns the index of the last occurrence of the specified substring.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(string: string, searchString: string, position?: number): number {\n let validatedPosition = position === undefined ? stringLength(string) : position;\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= stringLength(string)) {\n validatedPosition = stringLength(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, stringLength(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * This function mirrors the `length` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes. Since `length` appears to be a\n * reserved keyword, the function was renamed to `stringLength`\n *\n * Returns the length of a string.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function stringLength(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * This function mirrors the `normalize` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * Compares two strings using an ordinal comparison approach based on the specified collation\n * options. This function uses the built-in `localeCompare` method with the 'en' locale and the\n * provided collation options to compare the strings.\n *\n * @param string1 The first string to compare.\n * @param string2 The second string to compare.\n * @param options Optional. The collation options used for comparison.\n * @returns A number indicating the result of the comparison: - Negative value if string1 precedes\n * string2 in sorting order. - Zero if string1 and string2 are equivalent in sorting order. -\n * Positive value if string1 follows string2 in sorting order.\n */\nexport function ordinalCompare(\n string1: string,\n string2: string,\n options?: Intl.CollatorOptions,\n): number {\n return string1.localeCompare(string2, 'en', options);\n}\n\n/**\n * This function mirrors the `padEnd` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * This function mirrors the `padStart` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\n// This is a helper function that performs a correction on the slice index to make sure it\n// cannot go out of bounds\nfunction correctSliceIndex(length: number, index: number) {\n if (index > length) return length;\n if (index < -length) return 0;\n if (index < 0) return index + length;\n return index;\n}\n\n/**\n * This function mirrors the `slice` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const length: number = stringLength(string);\n if (\n indexStart > length ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(indexStart >= 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) ||\n indexEnd < -length))\n )\n return '';\n\n const newStart = correctSliceIndex(length, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * This function mirrors the `split` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits the\n * string at each occurrence of specified separator, but stops when limit entries have been placed\n * in the array.\n * @returns An array of strings, split at each point where separator occurs in the starting string.\n * Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = stringLength(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * This function mirrors the `startsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found (the index of\n * searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string, including when\n * searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * This function mirrors the `substr` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and length. This function is not exported because it is\n * considered deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String length minus start parameter`. Default is `String\n * length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(\n string: string,\n begin: number = 0,\n len: number = stringLength(string) - begin,\n): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * This function mirrors the `substring` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and end position.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = stringLength(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * This function mirrors the `toArray` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Converts a string to an array of string characters.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n\n/** Determine whether the string is a `LocalizeKey` meant to be localized in Platform.Bible. */\nexport function isLocalizeKey(str: string): str is LocalizeKey {\n return startsWith(str, '%') && endsWith(str, '%');\n}\n\n/**\n * Escape RegExp special characters.\n *\n * You can also use this to escape a string that is inserted into the middle of a regex, for\n * example, into a character class.\n *\n * All credit to [`escape-string-regexp`](https://www.npmjs.com/package/escape-string-regexp) - this\n * function is simply copied directly from there to allow a common js export\n *\n * @example\n *\n * import escapeStringRegexp from 'platform-bible-utils';\n *\n * const escapedString = escapeStringRegexp('How much $ for a 🦄?');\n * //=> 'How much \\\\$ for a 🦄\\\\?'\n *\n * new RegExp(escapedString);\n */\nexport function escapeStringRegexp(string: string): string {\n if (typeof string !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n // Escape characters with special meaning either inside or outside character sets.\n // Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n return string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n\n/**\n * Transforms a string or an array of strings into an array of regular expressions, ensuring that\n * the result is always an array.\n *\n * This function accepts a value that may be a single string, an array of strings, or `undefined`.\n * It then:\n *\n * - Converts each string into a `RegExp` object.\n * - If the input is an array containing nested arrays, it converts each string in the nested arrays\n * into `RegExp` objects.\n * - Ensures that the result is always an array of `RegExp` objects or arrays of `RegExp` objects.\n *\n * @param stringStringMaybeArray - The value to be transformed, which can be a single string, an\n * array of strings or arrays of strings, or `undefined`.\n * @returns An array of `RegExp` objects or arrays of `RegExp` objects. If the input is `undefined`,\n * an empty array is returned.\n */\nexport function transformAndEnsureRegExpRegExpArray(\n stringStringMaybeArray: string | (string | string[])[] | undefined,\n): (RegExp | RegExp[])[] {\n if (!stringStringMaybeArray) return [];\n\n const stringStringArray = ensureArray(stringStringMaybeArray);\n\n const regExpRegExpArray = stringStringArray.map((stringMaybeStringArray: string | string[]) =>\n Array.isArray(stringMaybeStringArray)\n ? stringMaybeStringArray.map((str) => new RegExp(str))\n : new RegExp(stringMaybeStringArray),\n );\n\n return regExpRegExpArray;\n}\n\n/**\n * Transforms a string or an array of strings into an array of regular expressions.\n *\n * This function accepts a value that may be a single string, an array of strings, or `undefined`.\n * It then:\n *\n * - Converts each string into a `RegExp` object.\n * - Ensures that the result is always an array of `RegExp` objects.\n *\n * @param stringMaybeArray - The value to be transformed, which can be a single string, an array of\n * strings, or `undefined`.\n * @returns An array of `RegExp` objects. If the input is `undefined`, an empty array is returned.\n */\nexport function transformAndEnsureRegExpArray(\n stringMaybeArray: string | string[] | undefined,\n): RegExp[] {\n if (!stringMaybeArray) return [];\n\n const stringArray = ensureArray(stringMaybeArray);\n\n const regExpArray = stringArray.map((str: string) => new RegExp(str));\n\n return regExpArray;\n}\n\n/** This is an internal-only export for testing purposes and should not be used in development */\nexport const testingStringUtils = {\n indexOfClosestClosingCurlyBrace,\n};\n","import { Canon, VerseRef } from '@sillsdev/scripture';\nimport { BookInfo, ScriptureReference, ScrollGroupId } from './scripture.model';\nimport { split, startsWith } from './string-util';\nimport { LocalizeKey } from './menus.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n\n/**\n * https://github.com/ubsicap/Paratext/blob/master/ParatextData/SILScriptureExtensions.cs#L72\n *\n * Convert book number to a localized Id (a short description of the book). This should be used\n * whenever a book ID (short code) is shown to the user. It is primarily needed for people who do\n * not read Roman script well and need to have books identified in a alternate script (e.g. Chinese\n * or Russian)\n *\n * @param bookNumber\n * @param localizationLanguage In BCP 47 format\n * @param getLocalizedString Function that provides the localized versions of the book ids and names\n * asynchronously.\n * @returns\n */\nexport async function getLocalizedIdFromBookNumber(\n bookNumber: number,\n localizationLanguage: string,\n getLocalizedString: (item: {\n localizeKey: string;\n languagesToSearch?: string[];\n }) => Promise,\n) {\n const id = Canon.bookNumberToId(bookNumber);\n\n if (!startsWith(Intl.getCanonicalLocales(localizationLanguage)[0], 'zh'))\n return getLocalizedString({\n localizeKey: `LocalizedId.${id}`,\n languagesToSearch: [localizationLanguage],\n });\n\n // For Chinese the normal book name is already fairly short.\n const bookName = await getLocalizedString({\n localizeKey: `Book.${id}`,\n languagesToSearch: [localizationLanguage],\n });\n const parts = split(bookName, '-');\n // some entries had a second name inside ideographic parenthesis\n const parts2 = split(parts[0], '\\xff08');\n const retVal = parts2[0].trim();\n return retVal;\n}\n\n/**\n * Get the Scripture reference as an easily comparable/sortable integer.\n *\n * @param scrRef The Scripture reference.\n * @returns An integer where the first three digits represent the book, the next three represent the\n * chapter and the last three represent the verse.\n */\nexport function scrRefToBBBCCCVVV(scrRef: ScriptureReference): number {\n return new VerseRef(scrRef.bookNum, scrRef.chapterNum, scrRef.verseNum).BBBCCCVVV;\n}\n\n/**\n * Compares two Scripture references canonically.\n *\n * @param scrRef1 The first Scripture reference to compare.\n * @param scrRef2 The second Scripture reference to compare.\n * @returns A number indicating the result of the comparison: - Negative value if scrRef1 precedes\n * scrRef2 in sorting order. - Zero if scrRef1 and scrRef2 are equivalent in sorting order. -\n * Positive value if scrRef1 follows scrRef2 in sorting order.\n */\nexport function compareScrRefs(scrRef1: ScriptureReference, scrRef2: ScriptureReference): number {\n // TODO: consider edge cases for invalid references (current implementation should suffice for\n // all but the most extreme cases)\n return scrRefToBBBCCCVVV(scrRef1) - scrRefToBBBCCCVVV(scrRef2);\n}\n\n/** Get the localized string key for a given scroll group Id (or no scroll group if `undefined`) */\nexport function getLocalizeKeyForScrollGroupId(\n scrollGroupId: ScrollGroupId | undefined | 'undefined',\n): LocalizeKey {\n return `%scrollGroup_${scrollGroupId}%`;\n}\n\n/**\n * Gets a list of localized string keys for provided scroll group Ids. Uses\n * {@link getLocalizeKeyForScrollGroupId} internally\n *\n * @example\n *\n * ```typescript\n * getLocalizeKeysForScrollGroupIds([undefined, 0, 1, 2, 3, 4]);\n * // Gives localized string keys for the provided scroll group ids in an array\n * ```\n *\n * @param scrollGroupIds Scroll group ids to include\n * @returns List of localized string keys for scroll group Ids\n */\nexport function getLocalizeKeysForScrollGroupIds(scrollGroupIds: (ScrollGroupId | undefined)[]) {\n return scrollGroupIds.map((scrollGroupId) => getLocalizeKeyForScrollGroupId(scrollGroupId));\n}\n\n/**\n * Formats a Scripture reference.\n *\n * @param scrRef The Scripture reference to format.\n * @param optionOrLocalizedBookName Either 'id' (the default) to format using the \"standard\" (as\n * defined by SIL/UBS) 3-letter book ID, 'English' to format using the English book name spelled\n * out, or some other string (e.g., a localized book name, vernacular abbreviation, FCBH book id,\n * etc.) to use.\n * @param chapterVerseSeparator The character used to separate the chapter number from the verse\n * number. Default is a colon (:). Note: More than one character is allowed.\n * @param bookChapterSeparator The character used to separate the book from the chapter number.\n * Default is a single space. Note: More than one character is allowed.\n * @returns The formatted reference.\n */\nexport function formatScrRef(\n scrRef: ScriptureReference,\n optionOrLocalizedBookName?: 'id' | 'English' | string,\n chapterVerseSeparator?: string,\n bookChapterSeparator?: string,\n): string {\n let book: string;\n switch (optionOrLocalizedBookName ?? 'id') {\n case 'English':\n book = Canon.bookNumberToEnglishName(scrRef.bookNum);\n break;\n case 'id':\n book = Canon.bookNumberToId(scrRef.bookNum);\n break;\n default:\n // We already dealt with undefined about in the switch, but TS is getting confused.\n book = optionOrLocalizedBookName ?? '';\n break;\n }\n return `${book}${bookChapterSeparator ?? ' '}${scrRef.chapterNum}${chapterVerseSeparator ?? ':'}${scrRef.verseNum}`;\n}\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","import deepEqual from './equality-checking';\n\n/**\n * Check if one object is a subset of the other object. \"Subset\" means that all properties of one\n * object are present in the other object, and if they are present that all values of those\n * properties are deeply equal. Sub-objects are also checked to be subsets of the corresponding\n * sub-object in the other object.\n *\n * @example ObjB is a subset of objA given these objects:\n *\n * ```ts\n * objA = { name: 'Alice', age: 30, address: { city: 'Seattle', state: 'Washington' } };\n * objB = { name: 'Alice', address: { city: 'Seattle' } };\n * ```\n *\n * It is important to note that only arrays of primitives (i.e., booleans, numbers, strings) are\n * supported. In particular, objects in arrays will not be checked for deep equality. Also, presence\n * in an array is all this checks, not the number of times that an item appears in an array. `[1,\n * 1]` is a subset of `[1]`.\n *\n * @param objectWithAllProperties Object to be checked if it is a superset of\n * `objectWithPartialProperties`\n * @param objectWithPartialProperties Object to be checked if it is a subset of\n * `objectWithAllProperties`\n * @returns True if `objectWithAllProperties` contains all the properties of\n * `objectWithPartialProperties` and all values of those properties are deeply equal\n */\nexport default function isSubset(\n objectWithAllProperties: unknown,\n objectWithPartialProperties: unknown,\n): boolean {\n if (typeof objectWithAllProperties !== typeof objectWithPartialProperties) return false;\n\n // For this function we're saying that all falsy things of the same type are equal to each other\n if (!objectWithAllProperties && !objectWithPartialProperties) return true;\n\n if (Array.isArray(objectWithAllProperties)) {\n // We know these are arrays from the line above\n /* eslint-disable no-type-assertion/no-type-assertion */\n const partialArray = objectWithPartialProperties as Array;\n const allArray = objectWithAllProperties as Array;\n /* eslint-enable no-type-assertion/no-type-assertion */\n\n if (partialArray.length === 0) return true;\n\n // This only works with arrays of primitives.\n // If someone cares about checking arrays of objects this needs updating.\n return partialArray.every((item) => allArray.includes(item));\n }\n\n if (typeof objectWithAllProperties !== 'object')\n return deepEqual(objectWithAllProperties, objectWithPartialProperties);\n\n // We know these are objects that potentially have properties because of the earlier checks\n /* eslint-disable no-type-assertion/no-type-assertion */\n const partialObj = objectWithPartialProperties as Record;\n const allObj = objectWithAllProperties as Record;\n /* eslint-enable no-type-assertion/no-type-assertion */\n\n let retVal = true;\n Object.keys(partialObj).forEach((key) => {\n if (!retVal) return;\n if (!Object.hasOwn(allObj, key)) retVal = false;\n else if (!isSubset(allObj[key], partialObj[key])) retVal = false;\n });\n return retVal;\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","import DateTimeFormat from './intl-date-time-format';\n\n/**\n * Retrieves the current locale of the user's environment.\n *\n * @returns A string representing the current locale. If the locale cannot be determined, the\n * function returns an empty string.\n */\nexport default function getCurrentLocale(): string {\n // Use navigator when available\n if (typeof navigator !== 'undefined' && navigator.languages) {\n return navigator.languages[0];\n }\n // For Node.js\n return new DateTimeFormat().resolvedOptions().locale;\n}\n","import NumberFormat from './intl-number-format';\n\n/**\n * Formats a number according to the locale and formatting options of this NumberFormat object\n *\n * @example FormatBytes(1024) => \"1 KB\"\n *\n * @example FormatBytes(1024, 0) => \"1 KB\"\n *\n * @param fileSize Number to format\n * @param decimals Number of decimal places to round to\n * @returns String representing the given number formatted according to the locale and formatting\n * options of this NumberFormat object\n */\nexport default function formatBytes(fileSize: number, decimals: number = 2): string {\n if (fileSize === 0) return '0 Bytes';\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(fileSize) / Math.log(1024));\n const sizeToUse = sizes[i];\n const formattingFileSize = new NumberFormat('en', {\n style: 'decimal',\n maximumFractionDigits: decimals,\n minimumFractionDigits: 0,\n }).format(fileSize / 1024 ** i);\n return `${formattingFileSize} ${sizeToUse}`;\n}\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { LocalizeKey, ReferencedItem } from 'menus.model';\n\n/** The data an extension provides to inform Platform.Bible of the settings it provides */\nexport type SettingsContribution = SettingsGroup | SettingsGroup[];\n/** A description of an extension's setting entry */\nexport type Setting = ExtensionControlledSetting;\n/** Setting definition that is validated by the extension. */\nexport type ExtensionControlledSetting = SettingBase & ModifierExtensionControlled;\n/** Base information needed to describe a setting entry */\nexport type SettingBase = StateBase & {\n [k: string]: unknown;\n /** LocalizeKey that displays in the settings dialog as the setting name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the settings dialog to describe the setting */\n description?: LocalizeKey;\n};\n/** The data an extension provides to inform Platform.Bible of the project settings it provides */\nexport type ProjectSettingsContribution = ProjectSettingsGroup | ProjectSettingsGroup[];\n/** A description of an extension's setting entry */\nexport type ProjectSetting = ExtensionControlledProjectSetting;\n/** Setting definition that is validated by the extension. */\nexport type ExtensionControlledProjectSetting = ProjectSettingBase & ModifierExtensionControlled;\n/** Base information needed to describe a project setting entry */\nexport type ProjectSettingBase = SettingBase & ModifierProject;\n/** A description of an extension's user state entry */\nexport type UserState = ExtensionControlledState;\n/** State definition that is validated by the extension. */\nexport type ExtensionControlledState = StateBase & ModifierExtensionControlled;\n/** Group of related settings definitions */\nexport interface SettingsGroup {\n [k: string]: unknown;\n /** LocalizeKey that displays in the settings dialog as the group name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the settings dialog to describe the group */\n description?: LocalizeKey;\n properties: SettingProperties;\n}\n/** Object whose keys are setting IDs and whose values are settings objects */\nexport interface SettingProperties {\n [k: ReferencedItem]: Setting;\n}\n/** Base information needed to describe a state entry */\nexport interface StateBase {\n [k: string]: unknown;\n /** Default value for the state/setting */\n default: unknown;\n /**\n * A state/setting ID whose value to set to this state/setting's starting value the first time\n * this state/setting is loaded\n */\n derivesFrom?: ReferencedItem;\n}\n/**\n * Modifies state/setting type to be extension-controlled. \"Extension-controlled\" means the\n * extension provides the component and the validator for the state/setting, so the state/setting is\n * controlled by the extension.\n */\nexport interface ModifierExtensionControlled {\n [k: string]: unknown;\n platformType?: undefined;\n type?: undefined;\n}\n/** Group of related settings definitions */\nexport interface ProjectSettingsGroup {\n [k: string]: unknown;\n /** LocalizeKey that displays in the project settings dialog as the group name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the project settings dialog to describe the group */\n description?: LocalizeKey;\n properties: ProjectSettingProperties;\n}\n/** Object whose keys are setting IDs and whose values are settings objects */\nexport interface ProjectSettingProperties {\n [k: ReferencedItem]: ProjectSetting;\n}\n\n// Note: we removed the index signature on ModifierProject to avoid having it on\n// `ProjectMetadataFilterOptions`. Unfortunately adding \"additionalProperties\": false on the json\n// schema messes up validation. Please remove the index signature again in the future if you\n// regenerate types\nexport interface ModifierProject {\n /**\n * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s\n * (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if they should be included.\n *\n * If this is one string, it will be matched against `projectInterface`s. If this is an array,\n * each entry is handled based on its type (at least one entry must match for this filter\n * condition to pass):\n *\n * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the\n * project will pass this filter condition\n * - If the entry is an array of strings, each will be matched against each `projectInterface`. If\n * every string matches against at least one `projectInterface`, the project will pass this\n * filter condition\n *\n * In other words, each entry in the first-level array is `OR`'ed together. Each entry in\n * second-level arrays (arrays within the first-level array) are `AND`'ed together.\n *\n * Defaults to all {@link ProjectInterfaces}, so all projects that do not match\n * `excludeProjectInterfaces` will be included\n *\n * @example\n *\n * ```typescript\n * includeProjectInterfaces: ['one', ['two', 'three']];\n * ```\n *\n * This filter condition will succeed on projects whose `projectInterface`s fulfill at least one\n * of the following conditions (At least one entry in the array must match):\n *\n * - Include `one`\n * - Include both `two` and `three`.\n */\n includeProjectInterfaces?: undefined | string | (string | string[])[];\n /**\n * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s\n * (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if they should absolutely not be included even if they match with\n * `includeProjectInterfaces`.\n *\n * If this is one string, it will be matched against `projectInterface`s. If this is an array,\n * each entry is handled based on its type (at least one entry must match for this filter\n * condition to exclude the project):\n *\n * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the\n * project will pass this filter condition and exclude the project\n * - If the entry is an array of strings, each will be matched against each `projectInterface`. If\n * every string matches against at least one `projectInterface`, the project will pass this\n * filter condition and exclude the project\n *\n * In other words, each entry in the first-level array is `OR`'ed together. Each entry in\n * second-level arrays (arrays within the first-level array) are `AND`'ed together.\n *\n * Defaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces`\n * will be included\n *\n * @example\n *\n * ```typescript\n * excludeProjectInterfaces: ['one', ['two', 'three']];\n * ```\n *\n * This filter condition will succeed and exclude projects whose `projectInterface`s fulfill at\n * least one of the following conditions (At least one entry in the array must match):\n *\n * - Include `one`\n * - Include both `two` and `three`.\n */\n excludeProjectInterfaces?: undefined | string | (string | string[])[];\n /**\n * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory\n * Ids that provided each project's metadata (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if the projects should be included.\n *\n * Defaults to all Project Data Provider Factory Ids, so all projects that do not match\n * `excludePdpFactoryIds` will be included\n */\n includePdpFactoryIds?: undefined | string | string[];\n /**\n * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory\n * Ids that provided each project's metadata (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if the projects should absolutely not be included even if they match\n * with `includeProjectInterfaces`.\n *\n * Defaults to none, so all projects that match `includePdpFactoryIds` will be included\n */\n excludePdpFactoryIds?: undefined | string | string[];\n}\n\n/** The data an extension provides to inform Platform.Bible of the user state it provides */\nexport interface UserStateContribution {\n [k: ReferencedItem]: UserState;\n}\n/** The data an extension provides to inform Platform.Bible of the project state it provides */\nexport interface ProjectStateContribution {\n [k: ReferencedItem]: UserState;\n}\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\nconst settingsDefs = {\n projectSettingsContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the project settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/projectSettingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/projectSettingsGroup',\n },\n },\n ],\n },\n projectSettingsGroup: {\n description: 'Group of related settings definitions',\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the project settings dialog as the group name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description:\n 'localizeKey that displays in the project settings dialog to describe the group',\n $ref: '#/$defs/localizeKey',\n },\n properties: {\n $ref: '#/$defs/projectSettingProperties',\n },\n },\n required: ['label', 'properties'],\n },\n projectSettingProperties: {\n description: 'Object whose keys are setting IDs and whose values are settings objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/projectSetting',\n },\n },\n additionalProperties: false,\n },\n projectSetting: {\n description: \"A description of an extension's setting entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledProjectSetting',\n },\n ],\n },\n extensionControlledProjectSetting: {\n description: 'Setting definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/projectSettingBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n projectSettingBase: {\n description: 'Base information needed to describe a project setting entry',\n allOf: [\n {\n $ref: '#/$defs/settingBase',\n },\n {\n $ref: '#/$defs/modifierProject',\n },\n ],\n },\n modifierProject: {\n description: 'Modifies setting type to be project setting',\n type: 'object',\n properties: {\n includeProjectInterfaces: {\n description:\n \"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should be included.\\n\\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to pass):\\n\\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition\\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition\\n\\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\\n\\nDefaults to all {@link ProjectInterfaces}, so all projects that do not match `excludeProjectInterfaces` will be included\\n\\n@example\\n\\n```typescript\\nincludeProjectInterfaces: ['one', ['two', 'three']];\\n```\\n\\nThis filter condition will succeed on projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\\n\\n- Include `one`\\n- Include both `two` and `three`.\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n ],\n },\n excludeProjectInterfaces: {\n description:\n \"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should absolutely not be included even if they match with `includeProjectInterfaces`.\\n\\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to exclude the project):\\n\\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition and exclude the project\\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition and exclude the project\\n\\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\\n\\nDefaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` will be included\\n\\n@example\\n\\n```typescript\\nexcludeProjectInterfaces: ['one', ['two', 'three']];\\n```\\n\\nThis filter condition will succeed and exclude projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\\n\\n- Include `one`\\n- Include both `two` and `three`.\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n ],\n },\n includePdpFactoryIds: {\n description:\n \"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should be included.\\n\\nDefaults to all Project Data Provider Factory Ids, so all projects that do not match `excludePdpFactoryIds` will be included\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n excludePdpFactoryIds: {\n description:\n \"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should absolutely not be included even if they match with `includeProjectInterfaces`.\\n\\nDefaults to none, so all projects that match `includePdpFactoryIds` will be included\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n },\n settingsContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/settingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/settingsGroup',\n },\n },\n ],\n },\n settingsGroup: {\n description: 'Group of related settings definitions',\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the settings dialog as the group name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description: 'localizeKey that displays in the settings dialog to describe the group',\n $ref: '#/$defs/localizeKey',\n },\n properties: {\n $ref: '#/$defs/settingProperties',\n },\n },\n required: ['label', 'properties'],\n },\n settingProperties: {\n description: 'Object whose keys are setting IDs and whose values are settings objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w-]+\\\\.[\\\\w-]+$': {\n $ref: '#/$defs/setting',\n },\n },\n additionalProperties: false,\n },\n setting: {\n description: \"A description of an extension's setting entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledSetting',\n },\n ],\n },\n extensionControlledSetting: {\n description: 'Setting definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/settingBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n settingBase: {\n description: 'Base information needed to describe a setting entry',\n allOf: [\n {\n $ref: '#/$defs/stateBase',\n },\n {\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the settings dialog as the setting name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description: 'localizeKey that displays in the settings dialog to describe the setting',\n $ref: '#/$defs/localizeKey',\n },\n },\n required: ['label'],\n },\n ],\n },\n projectStateContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the project state it provides',\n $ref: '#/$defs/userStateProperties',\n },\n userStateContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the user state it provides',\n $ref: '#/$defs/userStateProperties',\n },\n userStateProperties: {\n description: 'Object whose keys are state IDs and whose values are state objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/userState',\n },\n },\n additionalProperties: false,\n },\n userState: {\n description: \"A description of an extension's user state entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledState',\n },\n ],\n },\n extensionControlledState: {\n description: 'State definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/stateBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n modifierExtensionControlled: {\n description:\n 'Modifies state/setting type to be extension-controlled. \"Extension-controlled\" means the extension provides the component and the validator for the state/setting, so the state/setting is controlled by the extension.',\n not: {\n anyOf: [\n {\n type: 'object',\n required: ['platformType'],\n },\n {\n type: 'object',\n required: ['type'],\n },\n ],\n },\n },\n stateBase: {\n description: 'Base information needed to describe a state entry',\n type: 'object',\n properties: {\n default: {\n description: 'default value for the state/setting',\n type: 'any',\n },\n derivesFrom: {\n description:\n \"a state/setting ID whose value to set to this state/setting's starting value the first time this state/setting is loaded\",\n $ref: '#/$defs/id',\n },\n },\n required: ['default'],\n },\n localizeKey: {\n description: \"Identifier for a string that will be localized based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n tsType: 'LocalizeKey',\n },\n id: {\n description: '',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n tsType: 'Id',\n },\n};\n\n/**\n * Json-schema-to-typescript has some added stuff that isn't actually compatible with JSON schema,\n * so we remove them here\n *\n * @param defs The `$defs` property of a JSON schema (will be modified in place)\n */\n// JSON schema types are weird, so we'll just be careful\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function removeJsonToTypeScriptTypesStuff(defs: any) {\n if (!defs) return;\n\n // JSON schema types are weird, so we'll just be careful\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.values(defs).forEach((def: any) => {\n if (!def.type) return;\n\n if ('tsType' in def) delete def.tsType;\n\n if (def.type === 'any') {\n delete def.type;\n return;\n }\n\n if (def.type === 'object') {\n removeJsonToTypeScriptTypesStuff(def.properties);\n }\n });\n}\n\nremoveJsonToTypeScriptTypesStuff(settingsDefs);\n\n/** JSON schema object that aligns with the ProjectSettingsContribution type */\nexport const projectSettingsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Project Settings Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the project settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/projectSettingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/projectSettingsGroup',\n },\n },\n ],\n\n $defs: settingsDefs,\n};\n\nObject.freeze(projectSettingsDocumentSchema);\n\n/** JSON schema object that aligns with the {@link SettingsContribution} type */\nexport const settingsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Settings Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/settingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/settingsGroup',\n },\n },\n ],\n\n $defs: settingsDefs,\n};\n\nObject.freeze(settingsDocumentSchema);\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { LocalizeKey } from 'menus.model';\nimport { removeJsonToTypeScriptTypesStuff } from './settings.model';\n\n/** Localized string value associated with this key */\nexport type LocalizedStringValue = string;\n\n/** The data an extension provides to inform Platform.Bible of the localized strings it provides. */\nexport interface LocalizedStringDataContribution {\n [k: string]: unknown;\n metadata?: StringsMetadata;\n localizedStrings?: {\n [k: string]: LanguageStrings;\n };\n}\n/**\n * Map whose keys are localized string keys and whose values provide additional non-locale-specific\n * information about the localized string key\n */\nexport interface StringsMetadata {\n [k: LocalizeKey]: StringMetadata;\n}\n/** Additional non-locale-specific information about a localized string key */\nexport interface StringMetadata {\n [k: string]: unknown;\n /**\n * Localized string key from which to get this value if one does not exist in the specified\n * language. If a new key/value pair needs to be made to replace an existing one, this could help\n * smooth over the transition if the meanings are close enough\n *\n * You can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a\n * backslash `\\`.\n */\n fallbackKey?: LocalizeKey;\n /**\n * Additional information provided by developers in English to help the translator to know how to\n * translate this localized string accurately\n */\n notes?: string;\n}\n/**\n * Map whose keys are localized string keys and whose values provide information about how to\n * localize strings for the localized string key\n */\nexport interface LanguageStrings {\n [k: LocalizeKey]: LocalizedStringValue;\n}\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n\nconst localizedStringsDefs = {\n languageStrings: {\n description:\n 'Map whose keys are localized string keys and whose values provide information about how to localize strings for the localized string key',\n type: 'object',\n patternProperties: {\n '^%[\\\\w\\\\-\\\\.]+%$': {\n $ref: '#/$defs/localizedStringValue',\n },\n },\n additionalProperties: false,\n },\n localizedStringValue: {\n description: 'Localized string value associated with this key',\n type: 'string',\n },\n stringsMetadata: {\n description:\n 'Map whose keys are localized string keys and whose values provide additional non-locale-specific information about the localized string key',\n type: 'object',\n patternProperties: {\n '^%[\\\\w\\\\-\\\\.]+%$': {\n $ref: '#/$defs/stringMetadata',\n },\n },\n additionalProperties: false,\n },\n stringMetadata: {\n description: 'Additional non-locale-specific information about a localized string key',\n type: 'object',\n properties: {\n fallbackKey: {\n description:\n 'Localized string key from which to get this value if one does not exist in the specified language. If a new key/value pair needs to be made to replace an existing one, this could help smooth over the transition if the meanings are close enough.\\nYou can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a backslash `\\\\`.',\n type: 'string',\n pattern: \"^%[\\\\w\\\\-\\\\.;&,' (){}#:/\\\\\\\\?%⋮|[\\\\]“”‘’!~*\\u00A0+=•`…\\u200B↑↓]+%$\",\n tsType: 'LocalizeKey',\n },\n notes: {\n description:\n 'Additional information provided by developers in English to help the translator to know how to translate this localized string accurately',\n type: 'string',\n },\n },\n },\n localizeKey: {\n description: \"Identifier for a string that will be localized based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n tsType: 'LocalizeKey',\n },\n};\n\nremoveJsonToTypeScriptTypesStuff(localizedStringsDefs);\n\n/** JSON schema object that aligns with the LocalizedStringDataContribution type */\nexport const localizedStringsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Localized String Data Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the localized strings it provides.',\n type: 'object',\n properties: {\n metadata: {\n $ref: '#/$defs/stringsMetadata',\n },\n localizedStrings: {\n type: 'object',\n additionalProperties: {\n $ref: '#/$defs/languageStrings',\n },\n },\n },\n $defs: localizedStringsDefs,\n};\n\nObject.freeze(localizedStringsDocumentSchema);\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { ReplaceType } from './util';\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /**\n * Uri path to the icon to display after the menu text. Ex:\n * `papi-extension://helloWorld/assets/icon.png`\n */\n iconPathAfter?: string;\n /**\n * Uri path to the icon to display before the menu text. Ex:\n * `papi-extension://helloWorld/assets/icon.png`\n */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single context menu/submenu.\n * Groups are separated using a line within the menu/submenu.\n */\nexport type GroupsInSingleColumnMenu = {\n /** Named menu group */\n [property: ReferencedItem]: OrderedExtensibleContainer | MenuGroupDetailsInSubMenu;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu within a\n * multi-column menu. Groups are separated using a line within the menu/submenu.\n */\nexport type GroupsInMultiColumnMenu = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: GroupsInSingleColumnMenu;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n /** Groups that belong in this menu */\n groups: GroupsInMultiColumnMenu;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus before they are localized */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n/**\n * Type that converts any menu type before it is localized to what it is after it is localized. This\n * can be applied to any menu type as needed.\n */\nexport type Localized = ReplaceType, ReferencedItem, string>;\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description:\n 'Uri path to the icon to display before the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`',\n type: 'string',\n },\n iconPathAfter: {\n description:\n 'Uri path to the icon to display after the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","Collator","locales","options","string1","string2","DateTimeFormat","date","startDate","endDate","PlatformEventEmitter","event","callback","callbackIndex","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","_objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombiner","baseDocument","documentName","document","previousDocumentVersion","documentToSet","contributions","contributionName","potentialOutput","outputIteration","contribution","mergeObjects","output","finalOutput","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","mergeObjectsInternal","startingPointObj","copyFromObj","Mutex","AsyncMutex","MutexMap","mutexID","NonValidatingDocumentCombiner","NumberFormat","startRange","endRange","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","P","R","n","N","B","O","S","K","g","k","x","T","X","V","w","L","G","A","H","C","I","y","q","U","m","l","h","c","E","r","D","i","a","u","v","f","d","b","p","J","M","charRegex","astralRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","ensureArray","maybeArray","at","string","stringLength","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","indexOfClosestClosingCurlyBrace","escaped","closeCurlyBraceIndex","formatReplacementString","replacers","updatedStr","replacerKey","replacerString","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","ordinalCompare","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","isLocalizeKey","escapeStringRegexp","transformAndEnsureRegExpRegExpArray","stringStringMaybeArray","stringMaybeStringArray","transformAndEnsureRegExpArray","stringMaybeArray","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","_a","offsetBook","scrRef","offset","offsetChapter","offsetVerse","getLocalizedIdFromBookNumber","bookNumber","localizationLanguage","getLocalizedString","id","Canon","bookName","parts","scrRefToBBBCCCVVV","VerseRef","compareScrRefs","scrRef1","scrRef2","getLocalizeKeyForScrollGroupId","scrollGroupId","getLocalizeKeysForScrollGroupIds","scrollGroupIds","formatScrRef","optionOrLocalizedBookName","chapterVerseSeparator","bookChapterSeparator","book","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","isSubset","objectWithAllProperties","objectWithPartialProperties","partialArray","allArray","partialObj","allObj","serialize","replacer","space","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","getCurrentLocale","formatBytes","fileSize","decimals","sizes","sizeToUse","settingsDefs","removeJsonToTypeScriptTypesStuff","defs","def","projectSettingsDocumentSchema","settingsDocumentSchema","localizedStringsDefs","localizedStringsDocumentSchema","menuDocumentSchema"],"mappings":"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AAA,CAAc,EACrEE,EAAU,MAAM,QAAQ,IAAID,CAAM,EACxC,YAAK,cAAc,QACZC,EAAQ,MAAM,CAACC,EAAuBC,KACtCD,GACH,QAAQ,MAAM,yBAAyB,KAAK,IAAI,2BAA2BC,CAAK,UAAU,EAErFD,EACR,CACH,CACF,CCrCA,IAAIE,GAAI,OAAO,eACXC,GAAI,CAAC,EAAG,EAAG/E,IAAM,KAAK,EAAI8E,GAAE,EAAG,EAAG,CAAE,WAAY,GAAI,aAAc,GAAI,SAAU,GAAI,MAAO9E,CAAC,CAAE,EAAI,EAAE,CAAC,EAAIA,EACzGgF,EAAI,CAAC,EAAG,EAAGhF,IAAM+E,GAAE,EAAG,OAAO,GAAK,SAAW,EAAI,GAAK,EAAG/E,CAAC,EAW9D,MAAMiF,EAAI,CACR,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MAEA,MAEA,MAEA,MAEA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MAEA,MAEA,MAEA,MAEA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,KACF,EAAGC,EAAI,CACL,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EAAGC,GAAI,CACL,UACA,SACA,YACA,UACA,cACA,SACA,SACA,OACA,WACA,WACA,UACA,UACA,eACA,eACA,OACA,WACA,kBACA,MACA,SACA,WACA,eACA,gBACA,SACA,WACA,eACA,UACA,kBACA,QACA,OACA,OACA,UACA,QACA,QACA,QACA,WACA,YACA,SACA,YACA,UACA,UACA,OACA,OACA,OACA,OACA,SACA,gBACA,gBACA,YACA,YACA,cACA,aACA,kBACA,kBACA,YACA,YACA,QACA,WACA,UACA,QACA,UACA,UACA,SACA,SACA,SACA,OACA,aACA,QACA,SACA,eACA,oBACA,0BACA,SACA,qBACA,sBACA,UACA,qBACA,cACA,cACA,cACA,cACA,mBACA,mBACA,qBACA,YACA,OACA,oBAGA,uBACA,uBACA,sBACA,yBACA,wBACA,qBACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,eACA,cACA,eACA,oBACA,qBACA,0BACA,0BACA,eACA,eACA,YACA,gBACA,cACA,eACA,iBACA,wBACA,mBACA,WACA,QACA,aACA,aACA,aACA,2BACA,4BACA,YACF,EAAGC,GAAIC,KACP,SAASC,EAAE,EAAG,EAAI,GAAI,CACpB,OAAO,IAAM,EAAI,EAAE,YAAa,GAAG,KAAKF,GAAIA,GAAE,CAAC,EAAI,CACrD,CACA,SAASG,EAAE,EAAG,CACZ,OAAOD,EAAE,CAAC,EAAI,CAChB,CACA,SAASE,GAAE,EAAG,CACZ,MAAM,EAAI,OAAO,GAAK,SAAWF,EAAE,CAAC,EAAI,EACxC,OAAO,GAAK,IAAM,GAAK,EACzB,CACA,SAASG,GAAE,EAAG,CACZ,OAAQ,OAAO,GAAK,SAAWH,EAAE,CAAC,EAAI,IAAM,EAC9C,CACA,SAASI,GAAE,EAAG,CACZ,OAAO,GAAK,EACd,CACA,SAASC,GAAE,EAAG,CACZ,MAAM,EAAI,OAAO,GAAK,SAAWL,EAAE,CAAC,EAAI,EACxC,OAAOM,GAAE,CAAC,GAAK,CAACF,GAAE,CAAC,CACrB,CACA,SAAUG,IAAI,CACZ,QAAS,EAAI,EAAG,GAAKZ,EAAE,OAAQ,IAAK,MAAM,CAC5C,CACA,MAAMa,GAAI,EAAGC,GAAId,EAAE,OACnB,SA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,CACL,CACE,KAAM,8BACR,EACA,CACE,KAAM,QACN,MAAO,CACL,KAAM,8BACR,CACF,CACF,CACF,EACA,qBAAsB,CACpB,YAAa,wCACb,KAAM,SACN,WAAY,CACV,MAAO,CACL,YAAa,6EACb,KAAM,qBACR,EACA,YAAa,CACX,YACE,iFACF,KAAM,qBACR,EACA,WAAY,CACV,KAAM,kCACR,CACF,EACA,SAAU,CAAC,QAAS,YAAY,CAClC,EACA,yBAA0B,CACxB,YAAa,0EACb,KAAM,SACN,kBAAmB,CACjB,0BAA2B,CACzB,KAAM,wBACR,CACF,EACA,qBAAsB,EACxB,EACA,eAAgB,CACd,YAAa,gDACb,MAAO,CACL,CACE,KAAM,2CACR,CACF,CACF,EACA,kCAAmC,CACjC,YAAa,yDACb,MAAO,CACL,CACE,KAAM,4BACR,EACA,CACE,KAAM,qCACR,CACF,CACF,EACA,mBAAoB,CAClB,YAAa,8DACb,MAAO,CACL,CACE,KAAM,qBACR,EACA,CACE,KAAM,yBACR,CACF,CACF,EACA,gBAAiB,CACf,YAAa,8CACb,KAAM,SACN,WAAY,CACV,yBAA0B,CACxB,YACE,q4CACF,MAAO,CACL,CACE,KAAM,MACR,EACA,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CACL,MAAO,CACL,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,CAC1B,CACF,CACF,CACF,CACF,CACF,EACA,yBAA0B,CACxB,YACE,ugDACF,MAAO,CACL,CACE,KAAM,MACR,EACA,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CACL,MAAO,CACL,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,CAC1B,CACF,CACF,CACF,CACF,CACF,EACA,qBAAsB,CACpB,YACE,ybACF,MAAO,CACL,CACE,KAAM,MACR,EACA,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,CAC1B,CACF,CACF,EACA,qBAAsB,CACpB,YACE,mdACF,MAAO,CACL,CACE,KAAM,MACR,EACA,CACE,KAAM,QACR,EACA,CACE,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,CAC1B,CACF,CACF,CACF,CACF,EACA,qBAAsB,CACpB,YACE,sFACF,MAAO,CACL,CACE,KAAM,uBACR,EACA,CACE,KAAM,QACN,MAAO,CACL,KAAM,uBACR,CACF,CACF,CACF,EACA,cAAe,CACb,YAAa,wCACb,KAAM,SACN,WAAY,CACV,MAAO,CACL,YAAa,qEACb,KAAM,qBACR,EACA,YAAa,CACX,YAAa,yEACb,KAAM,qBACR,EACA,WAAY,CACV,KAAM,2BACR,CACF,EACA,SAAU,CAAC,QAAS,YAAY,CAClC,EACA,kBAAmB,CACjB,YAAa,0EACb,KAAM,SACN,kBAAmB,CACjB,sBAAuB,CACrB,KAAM,iBACR,CACF,EACA,qBAAsB,EACxB,EACA,QAAS,CACP,YAAa,gDACb,MAAO,CACL,CACE,KAAM,oCACR,CACF,CACF,EACA,2BAA4B,CAC1B,YAAa,yDACb,MAAO,CACL,CACE,KAAM,qBACR,EACA,CACE,KAAM,qCACR,CACF,CACF,EACA,YAAa,CACX,YAAa,sDACb,MAAO,CACL,CACE,KAAM,mBACR,EACA,CACE,KAAM,SACN,WAAY,CACV,MAAO,CACL,YAAa,uEACb,KAAM,qBACR,EACA,YAAa,CACX,YAAa,2EACb,KAAM,qBACR,CACF,EACA,SAAU,CAAC,OAAO,CACpB,CACF,CACF,EACA,yBAA0B,CACxB,YACE,2FACF,KAAM,6BACR,EACA,sBAAuB,CACrB,YACE,wFACF,KAAM,6BACR,EACA,oBAAqB,CACnB,YAAa,qEACb,KAAM,SACN,kBAAmB,CACjB,0BAA2B,CACzB,KAAM,mBACR,CACF,EACA,qBAAsB,EACxB,EACA,UAAW,CACT,YAAa,mDACb,MAAO,CACL,CACE,KAAM,kCACR,CACF,CACF,EACA,yBAA0B,CACxB,YAAa,uDACb,MAAO,CACL,CACE,KAAM,mBACR,EACA,CACE,KAAM,qCACR,CACF,CACF,EACA,4BAA6B,CAC3B,YACE,0NACF,IAAK,CACH,MAAO,CACL,CACE,KAAM,SACN,SAAU,CAAC,cAAc,CAC3B,EACA,CACE,KAAM,SACN,SAAU,CAAC,MAAM,CACnB,CACF,CACF,CACF,EACA,UAAW,CACT,YAAa,oDACb,KAAM,SACN,WAAY,CACV,QAAS,CACP,YAAa,sCACb,KAAM,KACR,EACA,YAAa,CACX,YACE,2HACF,KAAM,YACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,EACA,YAAa,CACX,YAAa,iFACb,KAAM,SACN,QAAS,mBACT,OAAQ,aACV,EACA,GAAI,CACF,YAAa,GACb,KAAM,SACN,QAAS,0BACT,OAAQ,IACV,CACF,EAUO,SAASC,EAAiCC,EAAW,CACrDA,GAIL,OAAO,OAAOA,CAAI,EAAE,QAASC,GAAa,CACpC,GAACA,EAAI,KAIL,IAFA,WAAYA,GAAK,OAAOA,EAAI,OAE5BA,EAAI,OAAS,MAAO,CACtB,OAAOA,EAAI,KACX,MACF,CAEIA,EAAI,OAAS,UACfF,EAAiCE,EAAI,UAAU,EACjD,CACD,CACH,CAEAF,EAAiCD,CAAY,EAGtC,MAAMI,GAAgC,CAC3C,QAAS,+CACT,MAAO,gCACP,YACE,8FACF,MAAO,CACL,CACE,KAAM,8BACR,EACA,CACE,KAAM,QACN,MAAO,CACL,KAAM,8BACR,CACF,CACF,EAEA,MAAOJ,CACT,EAEA,OAAO,OAAOI,EAA6B,EAGpC,MAAMC,GAAyB,CACpC,QAAS,+CACT,MAAO,wBACP,YACE,sFACF,MAAO,CACL,CACE,KAAM,uBACR,EACA,CACE,KAAM,QACN,MAAO,CACL,KAAM,uBACR,CACF,CACF,EAEA,MAAOL,CACT,EAEA,OAAO,OAAOK,EAAsB,EChiBpC,MAAMC,GAAuB,CAC3B,gBAAiB,CACf,YACE,2IACF,KAAM,SACN,kBAAmB,CACjB,mBAAoB,CAClB,KAAM,8BACR,CACF,EACA,qBAAsB,EACxB,EACA,qBAAsB,CACpB,YAAa,kDACb,KAAM,QACR,EACA,gBAAiB,CACf,YACE,8IACF,KAAM,SACN,kBAAmB,CACjB,mBAAoB,CAClB,KAAM,wBACR,CACF,EACA,qBAAsB,EACxB,EACA,eAAgB,CACd,YAAa,0EACb,KAAM,SACN,WAAY,CACV,YAAa,CACX,YACE,gWACF,KAAM,SACN,QAAS,2DACT,OAAQ,aACV,EACA,MAAO,CACL,YACE,4IACF,KAAM,QACR,CACF,CACF,EACA,YAAa,CACX,YAAa,iFACb,KAAM,SACN,QAAS,mBACT,OAAQ,aACV,CACF,EAEAL,EAAiCK,EAAoB,EAG9C,MAAMC,GAAiC,CAC5C,QAAS,+CACT,MAAO,qCACP,YACE,gGACF,KAAM,SACN,WAAY,CACV,SAAU,CACR,KAAM,yBACR,EACA,iBAAkB,CAChB,KAAM,SACN,qBAAsB,CACpB,KAAM,yBACR,CACF,CACF,EACA,MAAOD,EACT,EAEA,OAAO,OAAOC,EAA8B,EC0BrC,MAAMC,GAAqB,CAChC,MAAO,uBACP,KAAM,SACN,WAAY,CACV,SAAU,CACR,YAAa,qCACb,KAAM,yBACR,EACA,sBAAuB,CACrB,YAAa,8DACb,KAAM,yBACR,EACA,0BAA2B,CACzB,YAAa,kEACb,KAAM,0BACR,EACA,aAAc,CACZ,YAAa,mDACb,KAAM,SACN,kBAAmB,CACjB,0BAA2B,CACzB,KAAM,4BACR,CACF,EACA,qBAAsB,EACxB,CACF,EACA,SAAU,CAAC,WAAY,wBAAyB,4BAA6B,cAAc,EAC3F,qBAAsB,GACtB,MAAO,CACL,YAAa,CACX,YACE,2FACF,KAAM,SACN,QAAS,kBACX,EACA,eAAgB,CACd,YACE,oGACF,KAAM,SACN,QAAS,yBACX,EACA,mBAAoB,CAClB,YACE,uFACF,KAAM,SACN,kBAAmB,CACjB,0BAA2B,CACzB,YAAa,qCACb,KAAM,SACN,WAAY,CACV,MAAO,CACL,YAAa,6CACb,KAAM,qBACR,EACA,cAAe,CACb,YACE,wFACF,KAAM,QACR,EACA,MAAO,CACL,YACE,6EACF,KAAM,QACR,EACA,aAAc,CACZ,YACE,8EACF,KAAM,SACR,CACF,EACA,SAAU,CAAC,QAAS,OAAO,EAC3B,qBAAsB,EACxB,CACF,EACA,WAAY,CACV,aAAc,CACZ,YACE,qFACF,KAAM,SACR,CACF,CACF,EACA,WAAY,CACV,YACE,uJACF,KAAM,SACN,kBAAmB,CACjB,0BAA2B,CACzB,YAAa,wCACb,KAAM,SACN,MAAO,CACL,CACE,WAAY,CACV,OAAQ,CACN,YACE,wEACF,KAAM,wBACR,EACA,MAAO,CACL,YACE,yGACF,KAAM,QACR,EACA,aAAc,CACZ,YACE,iFACF,KAAM,SACR,CACF,EACA,SAAU,CAAC,OAAO,EAClB,qBAAsB,EACxB,EACA,CACE,WAAY,CACV,SAAU,CACR,YAAa,8DACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,yGACF,KAAM,QACR,EACA,aAAc,CACZ,YACE,iFACF,KAAM,SACR,CACF,EACA,SAAU,CAAC,WAAY,OAAO,EAC9B,qBAAsB,EACxB,CACF,CACF,CACF,EACA,qBAAsB,EACxB,EACA,SAAU,CACR,YACE,mGACF,KAAM,SACN,MAAO,CACL,CACE,WAAY,CACV,GAAI,CACF,YAAa,6CACb,KAAM,wBACR,CACF,EACA,SAAU,CAAC,IAAI,CACjB,EACA,CACE,WAAY,CACV,QAAS,CACP,YAAa,mEACb,KAAM,wBACR,EACA,eAAgB,CACd,YACE,0GACF,KAAM,QACR,EACA,cAAe,CACb,YACE,yGACF,KAAM,QACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,WAAY,CACV,MAAO,CACL,YAAa,4DACb,KAAM,qBACR,EACA,QAAS,CACP,YACE,uFACF,KAAM,qBACR,EACA,YAAa,CACX,YACE,6GACF,KAAM,qBACR,EACA,cAAe,CACb,YACE,wFACF,KAAM,QACR,EACA,MAAO,CACL,YAAa,wCACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,qGACF,KAAM,QACR,CACF,EACA,SAAU,CAAC,QAAS,QAAS,OAAO,EACpC,sBAAuB,EACzB,EACA,eAAgB,CACd,YAAa,2BACb,KAAM,SACN,WAAY,CACV,OAAQ,CACN,YAAa,kCACb,KAAM,oBACR,EACA,MAAO,CACL,YAAa,8CACb,KAAM,QACN,MAAO,CAAE,KAAM,kBAAmB,EAClC,YAAa,EACf,CACF,EACA,SAAU,CAAC,SAAU,OAAO,CAC9B,EACA,iBAAkB,CAChB,YAAa,+CACb,KAAM,SACN,MAAO,CAAC,CAAE,KAAM,yBAA0B,EAC1C,sBAAuB,EACzB,EACA,gBAAiB,CACf,YAAa,sDACb,KAAM,SACN,MAAO,CACL,CAAE,KAAM,wBAAyB,EACjC,CACE,WAAY,CACV,QAAS,CACP,YAAa,mCACb,KAAM,4BACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,sBAAuB,EACzB,EACA,mBAAoB,CAClB,YAAa,qDACb,KAAM,SACN,WAAY,CACV,gBAAiB,CACf,YACE,mFACF,KAAM,SACR,EACA,QAAS,CACP,YAAa,iEACb,KAAM,yBACR,EACA,YAAa,CACX,YAAa,sEACb,KAAM,0BACR,CACF,EACA,qBAAsB,EACxB,CACF,CACF,EAEA,OAAO,OAAOA,EAAkB","x_google_ignoreList":[11,12,13,18]} \ No newline at end of file diff --git a/lib/platform-bible-utils/dist/index.d.ts b/lib/platform-bible-utils/dist/index.d.ts new file mode 100644 index 0000000000..804bf11b66 --- /dev/null +++ b/lib/platform-bible-utils/dist/index.d.ts @@ -0,0 +1,2404 @@ +// Generated by dts-bundle-generator v9.5.1 + +import { Mutex as AsyncMutex } from 'async-mutex'; + +/** This class provides a convenient way for one task to wait on a variable that another task sets. */ +export declare class AsyncVariable { + private readonly variableName; + private readonly promiseToValue; + private resolver; + private rejecter; + /** + * Creates an instance of the class + * + * @param variableName Name to use when logging about this variable + * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was + * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you + * do not want a timeout at all. Defaults to 10000 ms + */ + constructor(variableName: string, rejectIfNotSettledWithinMS?: number); + /** + * Get this variable's promise to a value. This always returns the same promise even after the + * value has been resolved or rejected. + * + * @returns The promise for the value to be set + */ + get promise(): Promise; + /** + * A simple way to see if this variable's promise was resolved or rejected already + * + * @returns Whether the variable was already resolved or rejected + */ + get hasSettled(): boolean; + /** + * Resolve this variable's promise to the given value + * + * @param value This variable's promise will resolve to this value + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + resolveToValue(value: T, throwIfAlreadySettled?: boolean): void; + /** + * Reject this variable's promise for the value with the given reason + * + * @param reason This variable's promise will be rejected with this reason + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + rejectWithReason(reason: string, throwIfAlreadySettled?: boolean): void; + /** Prevent any further updates to this variable */ + private complete; +} +/** Enables language-sensitive string comparison. Wraps Intl.Collator */ +export declare class Collator { + private collator; + constructor(locales?: string | string[], options?: Intl.CollatorOptions); + /** + * Compares two strings according to the sort order of this Collator object + * + * @param string1 String to compare + * @param string2 String to compare + * @returns A number indicating how string1 and string2 compare to each other according to the + * sort order of this Collator object. Negative value if string1 comes before string2. Positive + * value if string1 comes after string2. 0 if they are considered equal. + */ + compare(string1: string, string2: string): number; + /** + * Returns a new object with properties reflecting the locale and collation options computed + * during initialization of this collator object. + * + * @returns ResolvedCollatorOptions object + */ + resolvedOptions(): Intl.ResolvedCollatorOptions; +} +/** Enables language-sensitive data and time formatting. Wraps Intl.DateTimeFormat */ +export declare class DateTimeFormat { + private dateTimeFormatter; + constructor(locales?: string | string[], options?: Intl.DateTimeFormatOptions); + /** + * Formats a date according to the locale and formatting option for this DateTimeFormat object + * + * @param date The date to format + * @returns String representing the given date formatted according to the locale and formatting + * options of this DateTimeFormat object + */ + format(date: Date): string; + /** + * Formats a date range in the most concise way based on the locales and options provided when + * instantiating this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns String representing the given date range formatted according to the locale and + * formatting options of this DateTimeFormat object + */ + formatRange(startDate: Date, endDate: Date): string; + /** + * Returns an array of locale-specific tokens representing each part of the formatted date range + * produced by this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns Array of DateTimeRangeFormatPart objects + */ + formatRangeToParts(startDate: Date, endDate: Date): Intl.DateTimeRangeFormatPart[]; + /** + * Allows locale-aware formatting of strings produced by this DateTimeFormat object + * + * @param date The date to format + * @returns Array of DateTimeFormatPart objects + */ + formatToParts(date: Date): Intl.DateTimeFormatPart[]; + /** + * Returns a new object with properties reflecting the locale and date and time formatting options + * computed during initialization of this DateTimeFormat object + * + * @returns ResolvedDateTimeFormatOptions object + */ + resolvedOptions(): Intl.ResolvedDateTimeFormatOptions; +} +/** Function to run to dispose of something. Returns true if successfully unsubscribed */ +export type Unsubscriber = () => boolean; +/** + * Returns an Unsubscriber function that combines all the unsubscribers passed in. + * + * @param unsubscribers All unsubscribers to aggregate into one unsubscriber + * @returns Function that unsubscribes from all passed in unsubscribers when run + */ +export declare const aggregateUnsubscribers: (unsubscribers: Unsubscriber[]) => Unsubscriber; +/** + * Function to run to dispose of something that runs asynchronously. The promise resolves to true if + * successfully unsubscribed + */ +export type UnsubscriberAsync = () => Promise; +/** + * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in. + * + * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber. + * @returns Function that unsubscribes from all passed in unsubscribers when run + */ +export declare const aggregateUnsubscriberAsyncs: (unsubscribers: (UnsubscriberAsync | Unsubscriber)[]) => UnsubscriberAsync; +/** Callback function that accepts an event and should run when an event is emitted */ +export type PlatformEventHandler = (event: T) => void; +/** + * Function that subscribes the provided callback to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ +export type PlatformEvent = (callback: PlatformEventHandler) => Unsubscriber; +/** + * A PapiEvent that subscribes asynchronously and resolves an asynchronous unsubscriber. + * + * Note: The callback itself is not asynchronous. + */ +export type PlatformEventAsync = (callback: PlatformEventHandler) => Promise; +export type JsonObjectLike = { + [key: string]: unknown; +}; +export type JsonArrayLike = unknown[]; +export type JsonDocumentLike = JsonObjectLike | JsonArrayLike; +/** + * Options for DocumentCombiner objects + * + * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before + * composing the output. If false, then changes made to provided documents after they are + * contributed will be reflected in the next time output is composed. + * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in + * contributed documents. If false, then throw when duplicate properties are seen in contributed + * documents. + */ +export type DocumentCombinerOptions = { + copyDocuments: boolean; + ignoreDuplicateProperties: boolean; +}; +/** + * Base class for any code that wants to compose JSON documents (primarily in the form of JS objects + * or arrays) together into a single output document. + */ +export declare class DocumentCombiner { + protected baseDocument: JsonDocumentLike; + protected readonly contributions: Map; + protected latestOutput: JsonDocumentLike | undefined; + protected readonly options: DocumentCombinerOptions; + private readonly onDidRebuildEmitter; + /** Event that emits to announce that the document has been rebuilt and the output has been updated */ + readonly onDidRebuild: PlatformEvent; + /** + * Create a DocumentCombiner instance + * + * @param baseDocument This is the first document that will be used when composing the output + * @param options Options used by this object when combining documents + */ + protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions); + /** + * Update the starting document for composition process + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + * @returns Recalculated output document given the new starting state and existing other documents + */ + updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined; + /** + * Add or update one of the contribution documents for the composition process + * + * Note: the order in which contribution documents are added can be considered to be indeterminate + * as it is currently ordered by however `Map.forEach` provides the contributions. The order + * matters when merging two arrays into one. Also, when `options.ignoreDuplicateProperties` is + * `true`, the order also matters when adding the same property to an object that is already + * provided previously. Please let us know if you have trouble because of indeterminate + * contribution ordering. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + * @returns Recalculated output document given the new or updated contribution and existing other + * documents + */ + addOrUpdateContribution(documentName: string, document: JsonDocumentLike): JsonDocumentLike | undefined; + /** + * Delete one of the contribution documents for the composition process + * + * @param documentName Name of the contributed document to delete + * @returns Recalculated output document given the remaining other documents + */ + deleteContribution(documentName: string): JsonDocumentLike | undefined; + /** + * Delete all present contribution documents for the composition process and return to the base + * document + * + * @returns Recalculated output document consisting only of the base document + */ + deleteAllContributions(): JsonDocumentLike | undefined; + /** + * Run the document composition process given the starting document and all contributions. Throws + * if the output document fails to validate properly. + * + * @returns Recalculated output document given the starting and contributed documents + */ + rebuild(): JsonDocumentLike | undefined; + /** + * Transform the starting document that is given to the combiner. This transformation occurs after + * validating the base document and before combining any contributions. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the `baseDocument` passed in. + * + * @param baseDocument Initial input document. Already validated via `validateBaseDocument` + * @returns Transformed base document + */ + protected transformBaseDocumentAfterValidation(baseDocument: JsonDocumentLike): JsonDocumentLike; + /** + * Transform the contributed document associated with `documentName`. This transformation occurs + * after validating the contributed document and before combining with other documents. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the contributed `document` passed in. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine. Already validated via + * `validateContribution` + * @returns Transformed contributed document + */ + protected transformContributionAfterValidation(documentName: string, document: JsonDocumentLike): JsonDocumentLike; + /** + * Throw an error if the provided document is not a valid starting document. + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + */ + protected validateBaseDocument(baseDocument: JsonDocumentLike): void; + /** + * Throw an error if the provided document is not a valid contribution document. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + */ + protected validateContribution(documentName: string, document: JsonDocumentLike): void; + /** + * Throw an error if the provided output is not valid. + * + * @param output Output document that could potentially be returned to callers + */ + protected validateOutput(output: JsonDocumentLike): void; + /** + * Transform the document that is the composition of the base document and all contribution + * documents. This is the last step that will be run prior to validation via `validateOutput` + * before `this.latestOutput` is updated to the new output. + * + * @param finalOutput Final output document that could potentially be returned to callers. "Final" + * means no further contribution documents will be merged. + */ + protected transformFinalOutputBeforeValidation(finalOutput: JsonDocumentLike): JsonDocumentLike; +} +/** + * Class that allows calling asynchronous functions multiple times at once while only running one at + * a time. + * + * @example + * + * ```typescript + * const mutex = new Mutex(); + * + * mutex.runExclusive(async () => { + * // Do some asynchronous stuff + * console.log('These run one-at-a-time'); + * }); + * + * mutex.runExclusive(async () => { + * // Do some asynchronous stuff + * console.log('These run one-at-a-time'); + * }); + * ``` + * + * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information. + */ +export declare class Mutex extends AsyncMutex { +} +/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */ +export declare class MutexMap { + private mutexesByID; + get(mutexID: string): Mutex; +} +export declare class NonValidatingDocumentCombiner extends DocumentCombiner { + constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions); + get output(): JsonDocumentLike | undefined; +} +/** Enables language-sensitive number formatting. Wraps Intl.NumberFormat */ +export declare class NumberFormat { + private numberFormatter; + constructor(locales?: string | string[], options?: Intl.NumberFormatOptions); + /** + * Formats a number according to the locale and formatting options of this NumberFormat object + * + * @param value Number or BigInt to format + * @returns String representing the given number formatted according to the locale and formatting + * options of this NumberFormat object + */ + format(value: number | bigint): string; + /** + * Formats a range of numbers according to the locale and formatting options of this NumberFormat + * object + * + * @param startRange Number or bigint representing the start of the range + * @param endRange Number or bigint representing the end of the range + * @returns String representing the given range of numbers formatted according to the locale and + * formatting options of this NumberFormat object + */ + formatRange(startRange: number | bigint, endRange: number | bigint): string; + /** + * Returns an array of objects containing the locale-specific tokens from which it is possible to + * build custom strings while preserving the locale-specific parts. + * + * @param startRange Number or bigint representing start of the range + * @param endRange Number or bigint representing end of the range + * @returns Array of NumberRangeFormatPart objects containing the formatted range of numbers in + * parts + */ + formatRangeToParts(startRange: number | bigint, endRange: number | bigint): Intl.NumberRangeFormatPart[]; + /** + * Allows locale-aware formatting of strings produced by this NumberFormat object + * + * @param value Number or bigint to format + * @returns Array of NumberFormatPart objects containing the formatted number in parts + */ + formatToParts(value: number | bigint): Intl.NumberFormatPart[]; + /** + * Returns a new object with properties reflecting the locale and number formatting options + * computed during initialization of this NumberFormat object + * + * @returns ResolvedNumberFormatOptions object + */ + resolvedOptions(): Intl.ResolvedNumberFormatOptions; +} +/** Require a `dispose` function */ +export interface Dispose { + /** Release resources and notify dependent services when tearing down an object */ + dispose: UnsubscriberAsync; +} +/** Require an `onDidDispose` event */ +export interface OnDidDispose { + /** Event that emits when `dispose` is called on an object */ + onDidDispose: PlatformEvent; +} +/** + * Indicates than an object cannot have an `onDidDispose` event. Also allows an object to include a + * `dispose` function. + */ +export interface CannotHaveOnDidDispose { + /** Release resources and notify dependent services when tearing down an object */ + dispose?: UnsubscriberAsync; + /** Event that emits when `dispose` is called on an object */ + onDidDispose?: undefined; +} +/** Allow onDidDispose to exist on the type if it was previously disallowed by CannotHaveOnDidDispose */ +export type CanHaveOnDidDispose = Omit; +/** + * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the + * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use + * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be + * private, and its event should be public. That way, the emitter is not publicized, but anyone can + * subscribe to the event. + */ +export declare class PlatformEventEmitter implements Dispose { + /** + * Subscribes a function to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + * @alias event + */ + subscribe: PlatformEvent; + /** All callback functions that will run when this event is emitted. Lazy loaded */ + private subscriptions?; + /** Event for listeners to subscribe to. Lazy loaded */ + private lazyEvent?; + /** Whether this emitter has been disposed */ + private isDisposed; + /** + * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted. + * Use like `const unsubscriber = event(callback)` + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ + get event(): PlatformEvent; + /** Disposes of this event, preparing it to release from memory */ + dispose: () => Promise; + /** + * Runs the subscriptions for the event + * + * @param event Event data to provide to subscribed callbacks + */ + emit: (event: T) => void; + /** + * Function that runs the subscriptions for the event. Added here so children can override emit + * and still call the base functionality. See NetworkEventEmitter.emit for example + */ + protected emitFn(event: T): void; + /** Check to make sure this emitter is not disposed. Throw if it is */ + protected assertNotDisposed(): void; + /** + * Disposes of this event, preparing it to release from memory. Added here so children can + * override emit and still call the base functionality. + */ + protected disposeFn(): Promise; +} +/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */ +export declare class UnsubscriberAsyncList { + private name; + readonly unsubscribers: Set; + constructor(name?: string); + /** + * Add unsubscribers to the list. Note that duplicates are not added twice. + * + * @param unsubscribers - Objects that were returned from a registration process. + */ + add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]): void; + /** + * Run all unsubscribers added to this list and then clear the list. + * + * @returns `true` if all unsubscribers succeeded, `false` otherwise. + */ + runAllUnsubscribers(): Promise; +} +export interface ScriptureReference { + bookNum: number; + chapterNum: number; + verseNum: number; +} +export interface BookInfo { + shortName: string; + fullNames: string[]; + chapters: number; +} +/** + * Represents a "node" in the JSON used to present Scripture in the editor, with a path that is + * relative to the start of a verse. + */ +export type ScriptureNode = ScriptureReference & { + jsonPath: string; +}; +/** Represents a specific character offset in the text of a textual Scripture node (in the editor.) */ +export type ScriptureTextAnchor = ScriptureNode & { + offset: number; +}; +/** + * Represents a range of text in the Scripture editor. The start and end node are expected to be in + * the same book. + */ +export type ScriptureSelection = { + start: ScriptureNode | ScriptureTextAnchor; + end?: ScriptureNode | ScriptureTextAnchor; +}; +/** + * An identifier corresponding to a Scripture reference shared by a group of Scripture reference + * consumers. + * + * For example, a few web views that share a Scroll Group Id would all change Scripture Reference + * together. + * + * These are generally expected to be non-negative numbers (starting at 0). + */ +export type ScrollGroupId = number; +/** Collection of functions, objects, and types that are used as helpers in other services. */ +export declare function newGuid(): string; +/** + * Determine whether the object is a string + * + * @param o Object to determine if it is a string + * @returns True if the object is a string; false otherwise + */ +export declare function isString(o: unknown): o is string; +/** + * If deepClone isn't used when copying properties between objects, you may be left with dangling + * references between the source and target of property copying operations. + * + * @param obj Object to clone + * @returns Duplicate copy of `obj` without any references back to the original one + */ +export declare function deepClone(obj: T): T; +/** + * Get a function that reduces calls to the function passed in + * + * @param fn The function to debounce + * @param delay How much delay in milliseconds after the most recent call to the debounced function + * to call the function + * @returns Function that, when called, only calls the function passed in at maximum every delay ms + */ +export declare function debounce void>(fn: T, delay?: number): T; +/** + * Groups each item in the array of items into a map according to the keySelector + * + * @param items Array of items to group by + * @param keySelector Function to run on each item to get the key for the group to which it belongs + * @param valueSelector Function to run on each item to get the value it should have in the group + * (like map function). If not provided, uses the item itself + * @returns Map of keys to groups of values corresponding to each item + */ +export declare function groupBy(items: T[], keySelector: (item: T) => K): Map>; +export declare function groupBy(items: T[], keySelector: (item: T) => K, valueSelector: (item: T, key: K) => V): Map>; +/** + * Function to get an error message from the object (useful for getting error message in a catch + * block) + * + * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }` + * + * @param error Error object whose message to get + * @returns Message of the error - if object has message, returns message. Otherwise tries to + * stringify + */ +export declare function getErrorMessage(error: unknown): string; +/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */ +export declare function wait(ms: number): Promise; +/** + * Runs the specified function and will timeout if it takes longer than the specified wait time + * + * @param fn The function to run + * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve + * @returns Promise that resolves to the resolved value of the function or undefined if it ran + * longer than the specified wait time + */ +export declare function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number): Promise | undefined>; +/** + * Get all functions on an object and its prototype chain (so we don't miss any class methods or any + * object methods). Note that the functions on the final item in the prototype chain (i.e., Object) + * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`, + * etc. + * + * @param obj Object whose functions to get + * @param _objId Optional ID of the object to use for debug logging + * @returns Array of all function names on an object + */ +export declare function getAllObjectFunctionNames(obj: { + [property: string]: unknown; +}, _objId?: string): Set; +/** + * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an + * object that is asynchronously fetched using a provided asynchronous function. + * + * @param getObject - A function that returns a promise resolving to the object whose asynchronous + * methods to call. + * @param objectToProxy - An optional object that is the object that is proxied. If a property is + * accessed that does exist on this object, it will be returned. If a property is accessed that + * does not exist on this object, it will be considered to be an asynchronous method called on the + * object returned from getObject. + * @returns A synchronous proxy for the asynchronous object. + */ +export declare function createSyncProxyForAsyncObject(getObject: (args?: unknown[]) => Promise, objectToProxy?: Partial): T; +/** Within type T, recursively change all properties to be optional */ +export type DeepPartial = T extends object ? { + [P in keyof T]?: DeepPartial; +} : T; +/** Within type T, recursively change properties that were of type A to be of type B */ +export type ReplaceType = T extends A ? B : T extends object ? { + [K in keyof T]: ReplaceType; +} : T; +/** + * Converts a union type to an intersection type (`|` to `&`). + * + * Note: this utility type is for use on object types. It may fail on other types. + * + * @example + * + * ```typescript + * type TypeOne = { one: string }; + * type TypeTwo = { two: number }; + * type TypeThree = { three: string }; + * + * type TypeNums = { one: TypeOne; two: TypeTwo; three: TypeThree }; + * const numNames = ['one', 'two'] as const; + * type TypeNumNames = typeof numNames; + * + * // Same as `TypeOne | TypeTwo` + * // `{ one: string } | { two: number }` + * type TypeOneTwoUnion = TypeNums[TypeNumNames[number]]; + * + * // Same as `TypeOne & TypeTwo` + * // `{ one: string; two: number }` + * type TypeOneTwoIntersection = UnionToIntersection; + * ``` + */ +export type UnionToIntersection = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never; +/** Identifier for a string that will be localized in a menu based on the user's UI language */ +export type LocalizeKey = `%${string}%`; +/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */ +export type ReferencedItem = `${string}.${string}`; +export type OrderedItem = { + /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */ + order: number; +}; +export type OrderedExtensibleContainer = OrderedItem & { + /** Determines whether other items can be added to this after it has been defined */ + isExtensible?: boolean; +}; +/** Group of menu items that belongs in a column */ +export type MenuGroupDetailsInColumn = OrderedExtensibleContainer & { + /** ID of column in which this group resides */ + column: ReferencedItem; +}; +/** Group of menu items that belongs in a submenu */ +export type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & { + /** ID of menu item hosting the submenu in which this group resides */ + menuItem: ReferencedItem; +}; +/** Column that includes header text in a menu */ +export type MenuColumnWithHeader = OrderedExtensibleContainer & { + /** Key that represents the text of the header text of the column */ + label: LocalizeKey; +}; +export type MenuItemBase = OrderedItem & { + /** Menu group to which this menu item belongs */ + group: ReferencedItem; + /** Key that represents the text of this menu item to display */ + label: LocalizeKey; + /** Key that represents words the platform should reference when users are searching for menu items */ + searchTerms?: LocalizeKey; + /** Key that represents the text to display if a mouse pointer hovers over the menu item */ + tooltip?: LocalizeKey; + /** Additional information provided by developers to help people who perform localization */ + localizeNotes: string; +}; +/** Menu item that hosts a submenu */ +export type MenuItemContainingSubmenu = MenuItemBase & { + /** ID for this menu item that holds a submenu */ + id: ReferencedItem; +}; +/** Menu item that runs a command */ +export type MenuItemContainingCommand = MenuItemBase & { + /** Name of the PAPI command to run when this menu item is selected. */ + command: ReferencedItem; + /** + * Uri path to the icon to display after the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathAfter?: string; + /** + * Uri path to the icon to display before the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathBefore?: string; +}; +/** + * Group of menu items that can be combined with other groups to form a single context menu/submenu. + * Groups are separated using a line within the menu/submenu. + */ +export type GroupsInSingleColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: OrderedExtensibleContainer | MenuGroupDetailsInSubMenu; +}; +/** + * Group of menu items that can be combined with other groups to form a single menu/submenu within a + * multi-column menu. Groups are separated using a line within the menu/submenu. + */ +export type GroupsInMultiColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu; +}; +/** Group of columns that can be combined with other columns to form a multi-column menu */ +export type ColumnsWithHeaders = { + /** Named column of a menu */ + [property: ReferencedItem]: MenuColumnWithHeader; + /** Defines whether columns can be added to this multi-column menu */ + isExtensible?: boolean; +}; +/** Menu that contains a column without a header */ +export type SingleColumnMenu = { + /** Groups that belong in this menu */ + groups: GroupsInSingleColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; +/** Menu that contains multiple columns with headers */ +export type MultiColumnMenu = { + /** Columns that belong in this menu */ + columns: ColumnsWithHeaders; + /** Groups that belong in this menu */ + groups: GroupsInMultiColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; +/** Menus for one single web view */ +export type WebViewMenu = { + /** Indicates whether the platform default menus should be included for this webview */ + includeDefaults: boolean | undefined; + /** Menu that opens when you click on the top left corner of a tab */ + topMenu: MultiColumnMenu | undefined; + /** Menu that opens when you right click on the main body/area of a tab */ + contextMenu: SingleColumnMenu | undefined; +}; +/** Menus for all web views */ +export type WebViewMenus = { + /** Named web view */ + [property: ReferencedItem]: WebViewMenu; +}; +/** Platform.Bible menus before they are localized */ +export type PlatformMenus = { + /** Top level menu for the application */ + mainMenu: MultiColumnMenu; + /** Menus that apply per web view in the application */ + webViewMenus: WebViewMenus; + /** Default context menu for web views that don't specify their own */ + defaultWebViewContextMenu: SingleColumnMenu; + /** Default top menu for web views that don't specify their own */ + defaultWebViewTopMenu: MultiColumnMenu; +}; +/** + * Type that converts any menu type before it is localized to what it is after it is localized. This + * can be applied to any menu type as needed. + */ +export type Localized = ReplaceType, ReferencedItem, string>; +/** JSON schema object that aligns with the PlatformMenus type */ +export declare const menuDocumentSchema: { + title: string; + type: string; + properties: { + mainMenu: { + description: string; + $ref: string; + }; + defaultWebViewTopMenu: { + description: string; + $ref: string; + }; + defaultWebViewContextMenu: { + description: string; + $ref: string; + }; + webViewMenus: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + }; + required: string[]; + additionalProperties: boolean; + $defs: { + localizeKey: { + description: string; + type: string; + pattern: string; + }; + referencedItem: { + description: string; + type: string; + pattern: string; + }; + columnsWithHeaders: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + description: string; + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + localizeNotes: { + description: string; + type: string; + }; + order: { + description: string; + type: string; + }; + isExtensible: { + description: string; + type: string; + }; + }; + required: string[]; + additionalProperties: boolean; + }; + }; + properties: { + isExtensible: { + description: string; + type: string; + }; + }; + }; + menuGroups: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + description: string; + type: string; + oneOf: ({ + properties: { + column: { + description: string; + $ref: string; + }; + order: { + description: string; + type: string; + }; + isExtensible: { + description: string; + type: string; + }; + menuItem?: undefined; + }; + required: string[]; + additionalProperties: boolean; + } | { + properties: { + menuItem: { + description: string; + $ref: string; + }; + order: { + description: string; + type: string; + }; + isExtensible: { + description: string; + type: string; + }; + column?: undefined; + }; + required: string[]; + additionalProperties: boolean; + })[]; + }; + }; + additionalProperties: boolean; + }; + menuItem: { + description: string; + type: string; + oneOf: ({ + properties: { + id: { + description: string; + $ref: string; + }; + command?: undefined; + iconPathBefore?: undefined; + iconPathAfter?: undefined; + }; + required: string[]; + } | { + properties: { + command: { + description: string; + $ref: string; + }; + iconPathBefore: { + description: string; + type: string; + }; + iconPathAfter: { + description: string; + type: string; + }; + id?: undefined; + }; + required: string[]; + })[]; + properties: { + label: { + description: string; + $ref: string; + }; + tooltip: { + description: string; + $ref: string; + }; + searchTerms: { + description: string; + $ref: string; + }; + localizeNotes: { + description: string; + type: string; + }; + group: { + description: string; + $ref: string; + }; + order: { + description: string; + type: string; + }; + }; + required: string[]; + unevaluatedProperties: boolean; + }; + groupsAndItems: { + description: string; + type: string; + properties: { + groups: { + description: string; + $ref: string; + }; + items: { + description: string; + type: string; + items: { + $ref: string; + }; + uniqueItems: boolean; + }; + }; + required: string[]; + }; + singleColumnMenu: { + description: string; + type: string; + allOf: { + $ref: string; + }[]; + unevaluatedProperties: boolean; + }; + multiColumnMenu: { + description: string; + type: string; + allOf: ({ + $ref: string; + properties?: undefined; + required?: undefined; + } | { + properties: { + columns: { + description: string; + $ref: string; + }; + }; + required: string[]; + $ref?: undefined; + })[]; + unevaluatedProperties: boolean; + }; + menusForOneWebView: { + description: string; + type: string; + properties: { + includeDefaults: { + description: string; + type: string; + }; + topMenu: { + description: string; + $ref: string; + }; + contextMenu: { + description: string; + $ref: string; + }; + }; + additionalProperties: boolean; + }; + }; +}; +export declare const FIRST_SCR_BOOK_NUM = 1; +export declare const LAST_SCR_BOOK_NUM: number; +export declare const FIRST_SCR_CHAPTER_NUM = 1; +export declare const FIRST_SCR_VERSE_NUM = 1; +export declare const getChaptersForBook: (bookNum: number) => number; +export declare const offsetBook: (scrRef: ScriptureReference, offset: number) => ScriptureReference; +export declare const offsetChapter: (scrRef: ScriptureReference, offset: number) => ScriptureReference; +export declare const offsetVerse: (scrRef: ScriptureReference, offset: number) => ScriptureReference; +/** + * https://github.com/ubsicap/Paratext/blob/master/ParatextData/SILScriptureExtensions.cs#L72 + * + * Convert book number to a localized Id (a short description of the book). This should be used + * whenever a book ID (short code) is shown to the user. It is primarily needed for people who do + * not read Roman script well and need to have books identified in a alternate script (e.g. Chinese + * or Russian) + * + * @param bookNumber + * @param localizationLanguage In BCP 47 format + * @param getLocalizedString Function that provides the localized versions of the book ids and names + * asynchronously. + * @returns + */ +export declare function getLocalizedIdFromBookNumber(bookNumber: number, localizationLanguage: string, getLocalizedString: (item: { + localizeKey: string; + languagesToSearch?: string[]; +}) => Promise): Promise; +/** + * Get the Scripture reference as an easily comparable/sortable integer. + * + * @param scrRef The Scripture reference. + * @returns An integer where the first three digits represent the book, the next three represent the + * chapter and the last three represent the verse. + */ +export declare function scrRefToBBBCCCVVV(scrRef: ScriptureReference): number; +/** + * Compares two Scripture references canonically. + * + * @param scrRef1 The first Scripture reference to compare. + * @param scrRef2 The second Scripture reference to compare. + * @returns A number indicating the result of the comparison: - Negative value if scrRef1 precedes + * scrRef2 in sorting order. - Zero if scrRef1 and scrRef2 are equivalent in sorting order. - + * Positive value if scrRef1 follows scrRef2 in sorting order. + */ +export declare function compareScrRefs(scrRef1: ScriptureReference, scrRef2: ScriptureReference): number; +/** Get the localized string key for a given scroll group Id (or no scroll group if `undefined`) */ +export declare function getLocalizeKeyForScrollGroupId(scrollGroupId: ScrollGroupId | undefined | "undefined"): LocalizeKey; +/** + * Gets a list of localized string keys for provided scroll group Ids. Uses + * {@link getLocalizeKeyForScrollGroupId} internally + * + * @example + * + * ```typescript + * getLocalizeKeysForScrollGroupIds([undefined, 0, 1, 2, 3, 4]); + * // Gives localized string keys for the provided scroll group ids in an array + * ``` + * + * @param scrollGroupIds Scroll group ids to include + * @returns List of localized string keys for scroll group Ids + */ +export declare function getLocalizeKeysForScrollGroupIds(scrollGroupIds: (ScrollGroupId | undefined)[]): `%${string}%`[]; +/** + * Formats a Scripture reference. + * + * @param scrRef The Scripture reference to format. + * @param optionOrLocalizedBookName Either 'id' (the default) to format using the "standard" (as + * defined by SIL/UBS) 3-letter book ID, 'English' to format using the English book name spelled + * out, or some other string (e.g., a localized book name, vernacular abbreviation, FCBH book id, + * etc.) to use. + * @param chapterVerseSeparator The character used to separate the chapter number from the verse + * number. Default is a colon (:). Note: More than one character is allowed. + * @param bookChapterSeparator The character used to separate the book from the chapter number. + * Default is a single space. Note: More than one character is allowed. + * @returns The formatted reference. + */ +export declare function formatScrRef(scrRef: ScriptureReference, optionOrLocalizedBookName?: "id" | "English" | string, chapterVerseSeparator?: string, bookChapterSeparator?: string): string; +/** + * This function mirrors the `at` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Finds the Unicode code point at the given index. + * + * @param string String to index + * @param index Position of the character to be returned in range of -length(string) to + * length(string) + * @returns New string consisting of the Unicode code point located at the specified offset, + * undefined if index is out of bounds + */ +export declare function at(string: string, index: number): string | undefined; +/** + * This function mirrors the `charAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a new string consisting of the single unicode code point at the given index. + * + * @param string String to index + * @param index Position of the string character to be returned, in the range of 0 to + * length(string)-1 + * @returns New string consisting of the Unicode code point located at the specified offset, empty + * string if index is out of bounds + */ +export declare function charAt(string: string, index: number): string; +/** + * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a non-negative integer that is the Unicode code point value of the character starting at + * the given index. + * + * @param string String to index + * @param index Position of the string character to be returned, in the range of 0 to + * length(string)-1 + * @returns Non-negative integer representing the code point value of the character at the given + * index, or undefined if there is no element at that position + */ +export declare function codePointAt(string: string, index: number): number | undefined; +/** + * This function mirrors the `endsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Determines whether a string ends with the characters of this string. + * + * @param string String to search through + * @param searchString Characters to search for at the end of the string + * @param endPosition End position where searchString is expected to be found. Default is + * `length(string)` + * @returns True if it ends with searchString, false if it does not + */ +export declare function endsWith(string: string, searchString: string, endPosition?: number): boolean; +/** + * Formats a string, replacing `{replacer key}` with the value in the `replacers` at that replacer + * key (or multiple replacer values if there are multiple in the string). Will also remove \ before + * curly braces if curly braces are escaped with a backslash in order to preserve the curly braces. + * E.g. 'Hi, this is {name}! I like `\{curly braces\}`! would become Hi, this is Jim! I like {curly + * braces}! + * + * If the key in unescaped braces is not found, returns the key without the braces. Empty unescaped + * curly braces will just return a string without the braces e.g. ('I am {Nemo}', { 'name': 'Jim'}) + * would return 'I am Nemo'. + * + * @example + * + * ```typescript + * formatReplacementString( + * 'Hi, this is {name}! I like \{curly braces\}! I have a {carColor} car. My favorite food is {food}.', + * { name: 'Bill', carColor: 'blue' } + * ); + * + * => + * + * 'Hi, this is Bill! I like {curly braces}! I have a blue car. My favorite food is food.' + * ``` + * + * @param str String to format + * @param replacers Object whose keys are replacer keys and whose values are the values with which + * to replace `{replacer key}`s found in the string to format. Will be coerced to strings using + * `${replacerValue}` + * @returns Formatted string + */ +export declare function formatReplacementString(str: string, replacers: { + [key: string | number]: string | unknown; +} | object): string; +/** + * This function mirrors the `includes` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Performs a case-sensitive search to determine if searchString is found in string. + * + * @param string String to search through + * @param searchString String to search for + * @param position Position within the string to start searching for searchString. Default is `0` + * @returns True if search string is found, false if it is not + */ +export declare function includes(string: string, searchString: string, position?: number): boolean; +/** + * This function mirrors the `indexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the index of the first occurrence of a given string. + * + * @param string String to search through + * @param searchString The string to search for + * @param position Start of searching. Default is `0` + * @returns Index of the first occurrence of a given string + */ +export declare function indexOf(string: string, searchString: string, position?: number | undefined): number; +/** + * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Searches this string and returns the index of the last occurrence of the specified substring. + * + * @param string String to search through + * @param searchString Substring to search for + * @param position The index at which to begin searching. If omitted, the search begins at the end + * of the string. Default is `undefined` + * @returns Index of the last occurrence of searchString found, or -1 if not found. + */ +export declare function lastIndexOf(string: string, searchString: string, position?: number): number; +/** + * This function mirrors the `length` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. Since `length` appears to be a + * reserved keyword, the function was renamed to `stringLength` + * + * Returns the length of a string. + * + * @param string String to return the length for + * @returns Number that is length of the starting string + */ +export declare function stringLength(string: string): number; +/** + * This function mirrors the `normalize` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the Unicode Normalization Form of this string. + * + * @param string The starting string + * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'` + * @returns A string containing the Unicode Normalization Form of the given string. + */ +export declare function normalize(string: string, form: "NFC" | "NFD" | "NFKC" | "NFKD" | "none"): string; +/** + * Compares two strings using an ordinal comparison approach based on the specified collation + * options. This function uses the built-in `localeCompare` method with the 'en' locale and the + * provided collation options to compare the strings. + * + * @param string1 The first string to compare. + * @param string2 The second string to compare. + * @param options Optional. The collation options used for comparison. + * @returns A number indicating the result of the comparison: - Negative value if string1 precedes + * string2 in sorting order. - Zero if string1 and string2 are equivalent in sorting order. - + * Positive value if string1 follows string2 in sorting order. + */ +export declare function ordinalCompare(string1: string, string2: string, options?: Intl.CollatorOptions): number; +/** + * This function mirrors the `padEnd` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the end of this string. + * + * @param string String to add padding too + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within targetLength, it will be truncated. Default is `" "` + * @returns String with appropriate padding at the end + */ +export declare function padEnd(string: string, targetLength: number, padString?: string): string; +/** + * This function mirrors the `padStart` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the start of this string. + * + * @param string String to add padding too + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within the targetLength, it will be truncated from the end. Default is `" "` + * @returns String with of specified targetLength with padString applied from the start + */ +export declare function padStart(string: string, targetLength: number, padString?: string): string; +/** + * This function mirrors the `slice` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Extracts a section of this string and returns it as a new string, without modifying the original + * string. + * + * @param string The starting string + * @param indexStart The index of the first character to include in the returned substring. + * @param indexEnd The index of the first character to exclude from the returned substring. + * @returns A new string containing the extracted section of the string. + */ +export declare function slice(string: string, indexStart: number, indexEnd?: number): string; +/** + * This function mirrors the `split` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Takes a pattern and divides the string into an ordered list of substrings by searching for the + * pattern, puts these substrings into an array, and returns the array. + * + * @param string The string to split + * @param separator The pattern describing where each split should occur + * @param splitLimit Limit on the number of substrings to be included in the array. Splits the + * string at each occurrence of specified separator, but stops when limit entries have been placed + * in the array. + * @returns An array of strings, split at each point where separator occurs in the starting string. + * Returns undefined if separator is not found in string. + */ +export declare function split(string: string, separator: string | RegExp, splitLimit?: number): string[]; +/** + * This function mirrors the `startsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Determines whether the string begins with the characters of a specified string, returning true or + * false as appropriate. + * + * @param string String to search through + * @param searchString The characters to be searched for at the start of this string. + * @param position The start position at which searchString is expected to be found (the index of + * searchString's first character). Default is `0` + * @returns True if the given characters are found at the beginning of the string, including when + * searchString is an empty string; otherwise, false. + */ +export declare function startsWith(string: string, searchString: string, position?: number): boolean; +/** + * This function mirrors the `substring` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a substring by providing start and end position. + * + * @param string String to be divided + * @param begin Start position + * @param end End position. Default is `End of string` + * @returns Substring from starting string + */ +export declare function substring(string: string, begin: number, end?: number): string; +/** + * This function mirrors the `toArray` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Converts a string to an array of string characters. + * + * @param string String to convert to array + * @returns An array of characters from the starting string + */ +export declare function toArray(string: string): string[]; +/** Determine whether the string is a `LocalizeKey` meant to be localized in Platform.Bible. */ +export declare function isLocalizeKey(str: string): str is LocalizeKey; +/** + * Escape RegExp special characters. + * + * You can also use this to escape a string that is inserted into the middle of a regex, for + * example, into a character class. + * + * All credit to [`escape-string-regexp`](https://www.npmjs.com/package/escape-string-regexp) - this + * function is simply copied directly from there to allow a common js export + * + * @example + * + * import escapeStringRegexp from 'platform-bible-utils'; + * + * const escapedString = escapeStringRegexp('How much $ for a 🦄?'); + * //=> 'How much \\$ for a 🦄\\?' + * + * new RegExp(escapedString); + */ +export declare function escapeStringRegexp(string: string): string; +/** + * Transforms a string or an array of strings into an array of regular expressions, ensuring that + * the result is always an array. + * + * This function accepts a value that may be a single string, an array of strings, or `undefined`. + * It then: + * + * - Converts each string into a `RegExp` object. + * - If the input is an array containing nested arrays, it converts each string in the nested arrays + * into `RegExp` objects. + * - Ensures that the result is always an array of `RegExp` objects or arrays of `RegExp` objects. + * + * @param stringStringMaybeArray - The value to be transformed, which can be a single string, an + * array of strings or arrays of strings, or `undefined`. + * @returns An array of `RegExp` objects or arrays of `RegExp` objects. If the input is `undefined`, + * an empty array is returned. + */ +export declare function transformAndEnsureRegExpRegExpArray(stringStringMaybeArray: string | (string | string[])[] | undefined): (RegExp | RegExp[])[]; +/** + * Transforms a string or an array of strings into an array of regular expressions. + * + * This function accepts a value that may be a single string, an array of strings, or `undefined`. + * It then: + * + * - Converts each string into a `RegExp` object. + * - Ensures that the result is always an array of `RegExp` objects. + * + * @param stringMaybeArray - The value to be transformed, which can be a single string, an array of + * strings, or `undefined`. + * @returns An array of `RegExp` objects. If the input is `undefined`, an empty array is returned. + */ +export declare function transformAndEnsureRegExpArray(stringMaybeArray: string | string[] | undefined): RegExp[]; +/** + * Check that two objects are deeply equal, comparing members of each object and such + * + * @param a The first object to compare + * @param b The second object to compare + * + * WARNING: Objects like arrays from different iframes have different constructor function + * references even if they do the same thing, so this deep equality comparison fails objects that + * look the same but have different constructors because different constructors could produce + * false positives in [a few specific + * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96). + * This means that two objects like arrays from different iframes that look the same will fail + * this check. Please use some other means to check deep equality in those situations. + * + * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to + * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3 + * }` are not considered equal in this case + * + * - For more information and examples, see [this + * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs). + * + * @returns True if a and b are deeply equal; false otherwise + */ +export function deepEqual(a: unknown, b: unknown): boolean; +/** + * Check if one object is a subset of the other object. "Subset" means that all properties of one + * object are present in the other object, and if they are present that all values of those + * properties are deeply equal. Sub-objects are also checked to be subsets of the corresponding + * sub-object in the other object. + * + * @example ObjB is a subset of objA given these objects: + * + * ```ts + * objA = { name: 'Alice', age: 30, address: { city: 'Seattle', state: 'Washington' } }; + * objB = { name: 'Alice', address: { city: 'Seattle' } }; + * ``` + * + * It is important to note that only arrays of primitives (i.e., booleans, numbers, strings) are + * supported. In particular, objects in arrays will not be checked for deep equality. Also, presence + * in an array is all this checks, not the number of times that an item appears in an array. `[1, + * 1]` is a subset of `[1]`. + * + * @param objectWithAllProperties Object to be checked if it is a superset of + * `objectWithPartialProperties` + * @param objectWithPartialProperties Object to be checked if it is a subset of + * `objectWithAllProperties` + * @returns True if `objectWithAllProperties` contains all the properties of + * `objectWithPartialProperties` and all values of those properties are deeply equal + */ +export function isSubset(objectWithAllProperties: unknown, objectWithPartialProperties: unknown): boolean; +/** + * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript + * object to `null` properties in the JSON string. + * + * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then + * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b: + * undefined, c: undefined }`. If you are passing around user data that needs to retain `null` + * values, you should wrap them yourself in a string before using this function. Alternatively, you + * can write your own replacer that will preserve `null` in a way that you can recover later. + * + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. Note that all `undefined` values returned + * by the replacer will be further transformed into `null` in the JSON string. + * @param space Adds indentation, white space, and line break characters to the return-value JSON + * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more + * details. + */ +export declare function serialize(value: unknown, replacer?: (this: unknown, key: string, value: unknown) => unknown, space?: string | number): string; +/** + * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined` + * in the returned JavaScript value/object. + * + * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then + * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b: + * undefined, c: undefined }`. If you are passing around user data that needs to retain `null` + * values, you should wrap them yourself in a string before using this function. Alternatively, you + * can write your own replacer that will preserve `null` in a way that you can recover later. + * + * @param value A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of + * the object. If a member contains nested objects, the nested objects are transformed before the + * parent object is. Note that `null` values are converted into `undefined` values after the + * reviver has run. + */ +export declare function deserialize(value: string, reviver?: (this: unknown, key: string, value: unknown) => unknown): any; +/** + * Check to see if the value is serializable without losing information + * + * @param value Value to test + * @returns True if serializable; false otherwise + * + * Note: the values `undefined` and `null` are serializable (on their own or in an array), but + * `null` values get transformed into `undefined` when serializing/deserializing. + * + * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value. + * Please only use this if you need to + * + * DISCLAIMER: this does not successfully detect that values are not serializable in some cases: + * + * - Losses of removed properties like functions and `Map`s + * - Class instances (not deserializable into class instances without special code) + * + * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify` + * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description) + * for more information. + */ +export declare function isSerializable(value: unknown): boolean; +/** + * HTML Encodes the provided string. Thanks to ChatGPT + * + * @param str String to HTML encode + * @returns HTML-encoded string + */ +export declare const htmlEncode: (str: string) => string; +/** + * Retrieves the current locale of the user's environment. + * + * @returns A string representing the current locale. If the locale cannot be determined, the + * function returns an empty string. + */ +export function getCurrentLocale(): string; +/** + * Formats a number according to the locale and formatting options of this NumberFormat object + * + * @example FormatBytes(1024) => "1 KB" + * + * @example FormatBytes(1024, 0) => "1 KB" + * + * @param fileSize Number to format + * @param decimals Number of decimal places to round to + * @returns String representing the given number formatted according to the locale and formatting + * options of this NumberFormat object + */ +export function formatBytes(fileSize: number, decimals?: number): string; +/** + * Ensures that the given input is returned as an array. + * + * This function takes a value that might be a single item, an array, or `undefined` and returns it + * as an array: + * + * - If the input is `undefined`, an empty array is returned. + * - If the input is already an array, it is returned as-is. + * - If the input is a single item, it is wrapped in an array. + * + * @typeParam T - The type of the elements in the array. + * @param maybeArray - The value that may be a single item, an array, or `undefined`. + * @returns An array containing the input value(s). If the input is `undefined`, an empty array is + * returned. + */ +export function ensureArray(maybeArray: T | T[] | undefined): T[]; +/** Localized string value associated with this key */ +export type LocalizedStringValue = string; +/** The data an extension provides to inform Platform.Bible of the localized strings it provides. */ +export interface LocalizedStringDataContribution { + [k: string]: unknown; + metadata?: StringsMetadata; + localizedStrings?: { + [k: string]: LanguageStrings; + }; +} +/** + * Map whose keys are localized string keys and whose values provide additional non-locale-specific + * information about the localized string key + */ +export interface StringsMetadata { + [k: LocalizeKey]: StringMetadata; +} +/** Additional non-locale-specific information about a localized string key */ +export interface StringMetadata { + [k: string]: unknown; + /** + * Localized string key from which to get this value if one does not exist in the specified + * language. If a new key/value pair needs to be made to replace an existing one, this could help + * smooth over the transition if the meanings are close enough + * + * You can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a + * backslash `\`. + */ + fallbackKey?: LocalizeKey; + /** + * Additional information provided by developers in English to help the translator to know how to + * translate this localized string accurately + */ + notes?: string; +} +/** + * Map whose keys are localized string keys and whose values provide information about how to + * localize strings for the localized string key + */ +export interface LanguageStrings { + [k: LocalizeKey]: LocalizedStringValue; +} +/** JSON schema object that aligns with the LocalizedStringDataContribution type */ +export declare const localizedStringsDocumentSchema: { + $schema: string; + title: string; + description: string; + type: string; + properties: { + metadata: { + $ref: string; + }; + localizedStrings: { + type: string; + additionalProperties: { + $ref: string; + }; + }; + }; + $defs: { + languageStrings: { + description: string; + type: string; + patternProperties: { + "^%[\\w\\-\\.]+%$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + localizedStringValue: { + description: string; + type: string; + }; + stringsMetadata: { + description: string; + type: string; + patternProperties: { + "^%[\\w\\-\\.]+%$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + stringMetadata: { + description: string; + type: string; + properties: { + fallbackKey: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + notes: { + description: string; + type: string; + }; + }; + }; + localizeKey: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + }; +}; +/** The data an extension provides to inform Platform.Bible of the settings it provides */ +export type SettingsContribution = SettingsGroup | SettingsGroup[]; +/** A description of an extension's setting entry */ +export type Setting = ExtensionControlledSetting; +/** Setting definition that is validated by the extension. */ +export type ExtensionControlledSetting = SettingBase & ModifierExtensionControlled; +/** Base information needed to describe a setting entry */ +export type SettingBase = StateBase & { + [k: string]: unknown; + /** LocalizeKey that displays in the settings dialog as the setting name */ + label: LocalizeKey; + /** LocalizeKey that displays in the settings dialog to describe the setting */ + description?: LocalizeKey; +}; +/** The data an extension provides to inform Platform.Bible of the project settings it provides */ +export type ProjectSettingsContribution = ProjectSettingsGroup | ProjectSettingsGroup[]; +/** A description of an extension's setting entry */ +export type ProjectSetting = ExtensionControlledProjectSetting; +/** Setting definition that is validated by the extension. */ +export type ExtensionControlledProjectSetting = ProjectSettingBase & ModifierExtensionControlled; +/** Base information needed to describe a project setting entry */ +export type ProjectSettingBase = SettingBase & ModifierProject; +/** A description of an extension's user state entry */ +export type UserState = ExtensionControlledState; +/** State definition that is validated by the extension. */ +export type ExtensionControlledState = StateBase & ModifierExtensionControlled; +/** Group of related settings definitions */ +export interface SettingsGroup { + [k: string]: unknown; + /** LocalizeKey that displays in the settings dialog as the group name */ + label: LocalizeKey; + /** LocalizeKey that displays in the settings dialog to describe the group */ + description?: LocalizeKey; + properties: SettingProperties; +} +/** Object whose keys are setting IDs and whose values are settings objects */ +export interface SettingProperties { + [k: ReferencedItem]: Setting; +} +/** Base information needed to describe a state entry */ +export interface StateBase { + [k: string]: unknown; + /** Default value for the state/setting */ + default: unknown; + /** + * A state/setting ID whose value to set to this state/setting's starting value the first time + * this state/setting is loaded + */ + derivesFrom?: ReferencedItem; +} +/** + * Modifies state/setting type to be extension-controlled. "Extension-controlled" means the + * extension provides the component and the validator for the state/setting, so the state/setting is + * controlled by the extension. + */ +export interface ModifierExtensionControlled { + [k: string]: unknown; + platformType?: undefined; + type?: undefined; +} +/** Group of related settings definitions */ +export interface ProjectSettingsGroup { + [k: string]: unknown; + /** LocalizeKey that displays in the project settings dialog as the group name */ + label: LocalizeKey; + /** LocalizeKey that displays in the project settings dialog to describe the group */ + description?: LocalizeKey; + properties: ProjectSettingProperties; +} +/** Object whose keys are setting IDs and whose values are settings objects */ +export interface ProjectSettingProperties { + [k: ReferencedItem]: ProjectSetting; +} +export interface ModifierProject { + /** + * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s + * (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if they should be included. + * + * If this is one string, it will be matched against `projectInterface`s. If this is an array, + * each entry is handled based on its type (at least one entry must match for this filter + * condition to pass): + * + * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the + * project will pass this filter condition + * - If the entry is an array of strings, each will be matched against each `projectInterface`. If + * every string matches against at least one `projectInterface`, the project will pass this + * filter condition + * + * In other words, each entry in the first-level array is `OR`'ed together. Each entry in + * second-level arrays (arrays within the first-level array) are `AND`'ed together. + * + * Defaults to all {@link ProjectInterfaces}, so all projects that do not match + * `excludeProjectInterfaces` will be included + * + * @example + * + * ```typescript + * includeProjectInterfaces: ['one', ['two', 'three']]; + * ``` + * + * This filter condition will succeed on projects whose `projectInterface`s fulfill at least one + * of the following conditions (At least one entry in the array must match): + * + * - Include `one` + * - Include both `two` and `three`. + */ + includeProjectInterfaces?: undefined | string | (string | string[])[]; + /** + * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s + * (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if they should absolutely not be included even if they match with + * `includeProjectInterfaces`. + * + * If this is one string, it will be matched against `projectInterface`s. If this is an array, + * each entry is handled based on its type (at least one entry must match for this filter + * condition to exclude the project): + * + * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the + * project will pass this filter condition and exclude the project + * - If the entry is an array of strings, each will be matched against each `projectInterface`. If + * every string matches against at least one `projectInterface`, the project will pass this + * filter condition and exclude the project + * + * In other words, each entry in the first-level array is `OR`'ed together. Each entry in + * second-level arrays (arrays within the first-level array) are `AND`'ed together. + * + * Defaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` + * will be included + * + * @example + * + * ```typescript + * excludeProjectInterfaces: ['one', ['two', 'three']]; + * ``` + * + * This filter condition will succeed and exclude projects whose `projectInterface`s fulfill at + * least one of the following conditions (At least one entry in the array must match): + * + * - Include `one` + * - Include both `two` and `three`. + */ + excludeProjectInterfaces?: undefined | string | (string | string[])[]; + /** + * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory + * Ids that provided each project's metadata (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if the projects should be included. + * + * Defaults to all Project Data Provider Factory Ids, so all projects that do not match + * `excludePdpFactoryIds` will be included + */ + includePdpFactoryIds?: undefined | string | string[]; + /** + * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory + * Ids that provided each project's metadata (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if the projects should absolutely not be included even if they match + * with `includeProjectInterfaces`. + * + * Defaults to none, so all projects that match `includePdpFactoryIds` will be included + */ + excludePdpFactoryIds?: undefined | string | string[]; +} +/** The data an extension provides to inform Platform.Bible of the user state it provides */ +export interface UserStateContribution { + [k: ReferencedItem]: UserState; +} +/** The data an extension provides to inform Platform.Bible of the project state it provides */ +export interface ProjectStateContribution { + [k: ReferencedItem]: UserState; +} +/** JSON schema object that aligns with the ProjectSettingsContribution type */ +export declare const projectSettingsDocumentSchema: { + $schema: string; + title: string; + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + $defs: { + projectSettingsContribution: { + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + }; + projectSettingsGroup: { + description: string; + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + properties: { + $ref: string; + }; + }; + required: string[]; + }; + projectSettingProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + projectSetting: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledProjectSetting: { + description: string; + allOf: { + $ref: string; + }[]; + }; + projectSettingBase: { + description: string; + allOf: { + $ref: string; + }[]; + }; + modifierProject: { + description: string; + type: string; + properties: { + includeProjectInterfaces: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + })[]; + }; + excludeProjectInterfaces: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + })[]; + }; + includePdpFactoryIds: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + excludePdpFactoryIds: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + }; + }; + settingsContribution: { + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + }; + settingsGroup: { + description: string; + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + properties: { + $ref: string; + }; + }; + required: string[]; + }; + settingProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w-]+\\.[\\w-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + setting: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledSetting: { + description: string; + allOf: { + $ref: string; + }[]; + }; + settingBase: { + description: string; + allOf: ({ + $ref: string; + type?: undefined; + properties?: undefined; + required?: undefined; + } | { + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + }; + required: string[]; + $ref?: undefined; + })[]; + }; + projectStateContribution: { + description: string; + $ref: string; + }; + userStateContribution: { + description: string; + $ref: string; + }; + userStateProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + userState: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledState: { + description: string; + allOf: { + $ref: string; + }[]; + }; + modifierExtensionControlled: { + description: string; + not: { + anyOf: { + type: string; + required: string[]; + }[]; + }; + }; + stateBase: { + description: string; + type: string; + properties: { + default: { + description: string; + type: string; + }; + derivesFrom: { + description: string; + $ref: string; + }; + }; + required: string[]; + }; + localizeKey: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + id: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + }; +}; +/** JSON schema object that aligns with the {@link SettingsContribution} type */ +export declare const settingsDocumentSchema: { + $schema: string; + title: string; + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + $defs: { + projectSettingsContribution: { + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + }; + projectSettingsGroup: { + description: string; + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + properties: { + $ref: string; + }; + }; + required: string[]; + }; + projectSettingProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + projectSetting: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledProjectSetting: { + description: string; + allOf: { + $ref: string; + }[]; + }; + projectSettingBase: { + description: string; + allOf: { + $ref: string; + }[]; + }; + modifierProject: { + description: string; + type: string; + properties: { + includeProjectInterfaces: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + })[]; + }; + excludeProjectInterfaces: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + })[]; + }; + includePdpFactoryIds: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + excludePdpFactoryIds: { + description: string; + anyOf: ({ + type: string; + items?: undefined; + } | { + type: string; + items: { + type: string; + }; + })[]; + }; + }; + }; + settingsContribution: { + description: string; + anyOf: ({ + $ref: string; + type?: undefined; + items?: undefined; + } | { + type: string; + items: { + $ref: string; + }; + $ref?: undefined; + })[]; + }; + settingsGroup: { + description: string; + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + properties: { + $ref: string; + }; + }; + required: string[]; + }; + settingProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w-]+\\.[\\w-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + setting: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledSetting: { + description: string; + allOf: { + $ref: string; + }[]; + }; + settingBase: { + description: string; + allOf: ({ + $ref: string; + type?: undefined; + properties?: undefined; + required?: undefined; + } | { + type: string; + properties: { + label: { + description: string; + $ref: string; + }; + description: { + description: string; + $ref: string; + }; + }; + required: string[]; + $ref?: undefined; + })[]; + }; + projectStateContribution: { + description: string; + $ref: string; + }; + userStateContribution: { + description: string; + $ref: string; + }; + userStateProperties: { + description: string; + type: string; + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: string; + }; + }; + additionalProperties: boolean; + }; + userState: { + description: string; + anyOf: { + $ref: string; + }[]; + }; + extensionControlledState: { + description: string; + allOf: { + $ref: string; + }[]; + }; + modifierExtensionControlled: { + description: string; + not: { + anyOf: { + type: string; + required: string[]; + }[]; + }; + }; + stateBase: { + description: string; + type: string; + properties: { + default: { + description: string; + type: string; + }; + derivesFrom: { + description: string; + $ref: string; + }; + }; + required: string[]; + }; + localizeKey: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + id: { + description: string; + type: string; + pattern: string; + tsType: string; + }; + }; +}; + +export {}; diff --git a/lib/platform-bible-utils/dist/index.js b/lib/platform-bible-utils/dist/index.js new file mode 100644 index 0000000000..b0e9a7da78 --- /dev/null +++ b/lib/platform-bible-utils/dist/index.js @@ -0,0 +1,2785 @@ +var Be = Object.defineProperty; +var xe = (t, e, r) => e in t ? Be(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r; +var d = (t, e, r) => xe(t, typeof e != "symbol" ? e + "" : e, r); +import { Mutex as Re } from "async-mutex"; +class or { + /** + * Creates an instance of the class + * + * @param variableName Name to use when logging about this variable + * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was + * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you + * do not want a timeout at all. Defaults to 10000 ms + */ + constructor(e, r = 1e4) { + d(this, "variableName"); + d(this, "promiseToValue"); + d(this, "resolver"); + d(this, "rejecter"); + this.variableName = e, this.promiseToValue = new Promise((s, n) => { + this.resolver = s, this.rejecter = n; + }), r > 0 && setTimeout(() => { + this.rejecter && (this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`), this.complete()); + }, r), Object.seal(this); + } + /** + * Get this variable's promise to a value. This always returns the same promise even after the + * value has been resolved or rejected. + * + * @returns The promise for the value to be set + */ + get promise() { + return this.promiseToValue; + } + /** + * A simple way to see if this variable's promise was resolved or rejected already + * + * @returns Whether the variable was already resolved or rejected + */ + get hasSettled() { + return Object.isFrozen(this); + } + /** + * Resolve this variable's promise to the given value + * + * @param value This variable's promise will resolve to this value + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + resolveToValue(e, r = !1) { + if (this.resolver) + console.debug(`${this.variableName} is being resolved now`), this.resolver(e), this.complete(); + else { + if (r) throw Error(`${this.variableName} was already settled`); + console.debug(`Ignoring subsequent resolution of ${this.variableName}`); + } + } + /** + * Reject this variable's promise for the value with the given reason + * + * @param reason This variable's promise will be rejected with this reason + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + rejectWithReason(e, r = !1) { + if (this.rejecter) + console.debug(`${this.variableName} is being rejected now`), this.rejecter(e), this.complete(); + else { + if (r) throw Error(`${this.variableName} was already settled`); + console.debug(`Ignoring subsequent rejection of ${this.variableName}`); + } + } + /** Prevent any further updates to this variable */ + complete() { + this.resolver = void 0, this.rejecter = void 0, Object.freeze(this); + } +} +class ar { + constructor(e, r) { + d(this, "collator"); + this.collator = new Intl.Collator(e, r); + } + /** + * Compares two strings according to the sort order of this Collator object + * + * @param string1 String to compare + * @param string2 String to compare + * @returns A number indicating how string1 and string2 compare to each other according to the + * sort order of this Collator object. Negative value if string1 comes before string2. Positive + * value if string1 comes after string2. 0 if they are considered equal. + */ + compare(e, r) { + return this.collator.compare(e, r); + } + /** + * Returns a new object with properties reflecting the locale and collation options computed + * during initialization of this collator object. + * + * @returns ResolvedCollatorOptions object + */ + resolvedOptions() { + return this.collator.resolvedOptions(); + } +} +class Me { + constructor(e, r) { + d(this, "dateTimeFormatter"); + this.dateTimeFormatter = new Intl.DateTimeFormat(e, r); + } + /** + * Formats a date according to the locale and formatting option for this DateTimeFormat object + * + * @param date The date to format + * @returns String representing the given date formatted according to the locale and formatting + * options of this DateTimeFormat object + */ + format(e) { + return this.dateTimeFormatter.format(e); + } + /** + * Formats a date range in the most concise way based on the locales and options provided when + * instantiating this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns String representing the given date range formatted according to the locale and + * formatting options of this DateTimeFormat object + */ + formatRange(e, r) { + return this.dateTimeFormatter.formatRange(e, r); + } + /** + * Returns an array of locale-specific tokens representing each part of the formatted date range + * produced by this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns Array of DateTimeRangeFormatPart objects + */ + formatRangeToParts(e, r) { + return this.dateTimeFormatter.formatRangeToParts(e, r); + } + /** + * Allows locale-aware formatting of strings produced by this DateTimeFormat object + * + * @param date The date to format + * @returns Array of DateTimeFormatPart objects + */ + formatToParts(e) { + return this.dateTimeFormatter.formatToParts(e); + } + /** + * Returns a new object with properties reflecting the locale and date and time formatting options + * computed during initialization of this DateTimeFormat object + * + * @returns ResolvedDateTimeFormatOptions object + */ + resolvedOptions() { + return this.dateTimeFormatter.resolvedOptions(); + } +} +class De { + constructor() { + /** + * Subscribes a function to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + * @alias event + */ + d(this, "subscribe", this.event); + /** All callback functions that will run when this event is emitted. Lazy loaded */ + d(this, "subscriptions"); + /** Event for listeners to subscribe to. Lazy loaded */ + d(this, "lazyEvent"); + /** Whether this emitter has been disposed */ + d(this, "isDisposed", !1); + /** Disposes of this event, preparing it to release from memory */ + d(this, "dispose", () => this.disposeFn()); + /** + * Runs the subscriptions for the event + * + * @param event Event data to provide to subscribed callbacks + */ + d(this, "emit", (e) => { + this.emitFn(e); + }); + } + /** + * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted. + * Use like `const unsubscriber = event(callback)` + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ + get event() { + return this.assertNotDisposed(), this.lazyEvent || (this.lazyEvent = (e) => { + if (!e || typeof e != "function") + throw new Error("Event handler callback must be a function!"); + return this.subscriptions || (this.subscriptions = []), this.subscriptions.push(e), () => { + if (!this.subscriptions) return !1; + const r = this.subscriptions.indexOf(e); + return r < 0 ? !1 : (this.subscriptions.splice(r, 1), !0); + }; + }), this.lazyEvent; + } + /** + * Function that runs the subscriptions for the event. Added here so children can override emit + * and still call the base functionality. See NetworkEventEmitter.emit for example + */ + emitFn(e) { + this.assertNotDisposed(), [...this.subscriptions ?? []].forEach((s) => s(e)); + } + /** Check to make sure this emitter is not disposed. Throw if it is */ + assertNotDisposed() { + if (this.isDisposed) throw new Error("Emitter is disposed"); + } + /** + * Disposes of this event, preparing it to release from memory. Added here so children can + * override emit and still call the base functionality. + */ + disposeFn() { + return this.assertNotDisposed(), this.isDisposed = !0, this.subscriptions = void 0, this.lazyEvent = void 0, Promise.resolve(!0); + } +} +function ur() { + return "00-0-4-1-000".replace( + /[^-]/g, + (t) => ( + // @ts-expect-error ts(2363) this works fine + // eslint-disable-next-line no-bitwise + ((Math.random() + ~~t) * 65536 >> t).toString(16).padStart(4, "0") + ) + ); +} +function ke(t) { + return typeof t == "string" || t instanceof String; +} +function R(t) { + return JSON.parse(JSON.stringify(t)); +} +function lr(t, e = 300) { + if (ke(t)) throw new Error("Tried to debounce a string! Could be XSS"); + let r; + return (...s) => { + clearTimeout(r), r = setTimeout(() => t(...s), e); + }; +} +function cr(t, e, r) { + const s = /* @__PURE__ */ new Map(); + return t.forEach((n) => { + const i = e(n), o = s.get(i), a = r ? r(n, i) : n; + o ? o.push(a) : s.set(i, [a]); + }), s; +} +function Ve(t) { + return typeof t == "object" && // We're potentially dealing with objects we didn't create, so they might contain `null` + // eslint-disable-next-line no-null/no-null + t !== null && "message" in t && // Type assert `error` to check it's `message`. + // eslint-disable-next-line no-type-assertion/no-type-assertion + typeof t.message == "string"; +} +function qe(t) { + if (Ve(t)) return t; + try { + return new Error(JSON.stringify(t)); + } catch { + return new Error(String(t)); + } +} +function fr(t) { + return qe(t).message; +} +function ze(t) { + return new Promise((e) => setTimeout(e, t)); +} +function hr(t, e) { + const r = ze(e).then(() => { + }); + return Promise.any([r, t()]); +} +function pr(t, e = "obj") { + const r = /* @__PURE__ */ new Set(); + Object.getOwnPropertyNames(t).forEach((n) => { + try { + typeof t[n] == "function" && r.add(n); + } catch { + } + }); + let s = Object.getPrototypeOf(t); + for (; s && Object.getPrototypeOf(s); ) + Object.getOwnPropertyNames(s).forEach((n) => { + try { + typeof t[n] == "function" && r.add(n); + } catch { + } + }), s = Object.getPrototypeOf(s); + return r; +} +function dr(t, e = {}) { + return new Proxy(e, { + get(r, s) { + return s in r ? r[s] : async (...n) => (await t())[s](...n); + } + }); +} +class Je { + /** + * Create a DocumentCombiner instance + * + * @param baseDocument This is the first document that will be used when composing the output + * @param options Options used by this object when combining documents + */ + constructor(e, r) { + d(this, "baseDocument"); + d(this, "contributions", /* @__PURE__ */ new Map()); + d(this, "latestOutput"); + d(this, "options"); + d(this, "onDidRebuildEmitter", new De()); + /** Event that emits to announce that the document has been rebuilt and the output has been updated */ + // Need `onDidRebuildEmitter` to be instantiated before this line + // eslint-disable-next-line @typescript-eslint/member-ordering + d(this, "onDidRebuild", this.onDidRebuildEmitter.subscribe); + this.baseDocument = e, this.options = r, this.updateBaseDocument(e); + } + /** + * Update the starting document for composition process + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + * @returns Recalculated output document given the new starting state and existing other documents + */ + updateBaseDocument(e) { + return this.validateBaseDocument(e), this.baseDocument = this.options.copyDocuments ? R(e) : e, this.baseDocument = this.transformBaseDocumentAfterValidation(this.baseDocument), this.rebuild(); + } + /** + * Add or update one of the contribution documents for the composition process + * + * Note: the order in which contribution documents are added can be considered to be indeterminate + * as it is currently ordered by however `Map.forEach` provides the contributions. The order + * matters when merging two arrays into one. Also, when `options.ignoreDuplicateProperties` is + * `true`, the order also matters when adding the same property to an object that is already + * provided previously. Please let us know if you have trouble because of indeterminate + * contribution ordering. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + * @returns Recalculated output document given the new or updated contribution and existing other + * documents + */ + addOrUpdateContribution(e, r) { + this.validateContribution(e, r); + const s = this.contributions.get(e); + let n = this.options.copyDocuments && r ? R(r) : r; + n = this.transformContributionAfterValidation(e, n), this.contributions.set(e, n); + try { + return this.rebuild(); + } catch (i) { + throw s ? this.contributions.set(e, s) : this.contributions.delete(e), new Error(`Error when setting the document named ${e}: ${i}`); + } + } + /** + * Delete one of the contribution documents for the composition process + * + * @param documentName Name of the contributed document to delete + * @returns Recalculated output document given the remaining other documents + */ + deleteContribution(e) { + const r = this.contributions.get(e); + if (!r) throw new Error(`${e} does not exist`); + this.contributions.delete(e); + try { + return this.rebuild(); + } catch (s) { + throw this.contributions.set(e, r), new Error(`Error when deleting the document named ${e}: ${s}`); + } + } + /** + * Delete all present contribution documents for the composition process and return to the base + * document + * + * @returns Recalculated output document consisting only of the base document + */ + deleteAllContributions() { + if (this.contributions.size <= 0) return this.latestOutput; + const e = [...this.contributions.entries()]; + e.forEach(([r]) => this.contributions.delete(r)); + try { + return this.rebuild(); + } catch (r) { + throw e.forEach( + ([s, n]) => this.contributions.set(s, n) + ), new Error(`Error when deleting all contributions: ${r}`); + } + } + /** + * Run the document composition process given the starting document and all contributions. Throws + * if the output document fails to validate properly. + * + * @returns Recalculated output document given the starting and contributed documents + */ + rebuild() { + if (this.contributions.size === 0) { + let r = R(this.baseDocument); + return r = this.transformFinalOutputBeforeValidation(r), this.validateOutput(r), this.latestOutput = r, this.onDidRebuildEmitter.emit(void 0), this.latestOutput; + } + let e = this.baseDocument; + return this.contributions.forEach((r) => { + e = Ge( + e, + r, + this.options.ignoreDuplicateProperties + ), this.validateOutput(e); + }), e = this.transformFinalOutputBeforeValidation(e), this.validateOutput(e), this.latestOutput = e, this.onDidRebuildEmitter.emit(void 0), this.latestOutput; + } + /** + * Transform the starting document that is given to the combiner. This transformation occurs after + * validating the base document and before combining any contributions. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the `baseDocument` passed in. + * + * @param baseDocument Initial input document. Already validated via `validateBaseDocument` + * @returns Transformed base document + */ + // We just don't need `this` here. This is basically a no-op function that is available to child + // classes to override + // eslint-disable-next-line class-methods-use-this + transformBaseDocumentAfterValidation(e) { + return e; + } + /** + * Transform the contributed document associated with `documentName`. This transformation occurs + * after validating the contributed document and before combining with other documents. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the contributed `document` passed in. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine. Already validated via + * `validateContribution` + * @returns Transformed contributed document + */ + // We just don't need `this` here. This is basically a no-op function that is available to child + // classes to override + // eslint-disable-next-line class-methods-use-this + transformContributionAfterValidation(e, r) { + return r; + } + /** + * Throw an error if the provided document is not a valid starting document. + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + validateBaseDocument(e) { + } + /** + * Throw an error if the provided document is not a valid contribution document. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + validateContribution(e, r) { + } + /** + * Throw an error if the provided output is not valid. + * + * @param output Output document that could potentially be returned to callers + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + validateOutput(e) { + } + /** + * Transform the document that is the composition of the base document and all contribution + * documents. This is the last step that will be run prior to validation via `validateOutput` + * before `this.latestOutput` is updated to the new output. + * + * @param finalOutput Final output document that could potentially be returned to callers. "Final" + * means no further contribution documents will be merged. + */ + // no-op intended to be overridden by child classes. Can't be static + // eslint-disable-next-line class-methods-use-this + transformFinalOutputBeforeValidation(e) { + return e; + } +} +function U(...t) { + let e = !0; + return t.forEach((r) => { + (!r || typeof r != "object" || Array.isArray(r)) && (e = !1); + }), e; +} +function W(...t) { + let e = !0; + return t.forEach((r) => { + (!r || typeof r != "object" || !Array.isArray(r)) && (e = !1); + }), e; +} +function Ge(t, e, r) { + const s = R(t); + return e ? he(s, R(e), r) : s; +} +function he(t, e, r) { + if (!e) return t; + if (U(t, e)) { + const s = t, n = e; + Object.keys(n).forEach((i) => { + if (Object.hasOwn(s, i)) { + if (U(s[i], n[i])) + s[i] = he( + // We know these are objects from the `if` check + /* eslint-disable no-type-assertion/no-type-assertion */ + s[i], + n[i], + r + /* eslint-enable no-type-assertion/no-type-assertion */ + ); + else if (W(s[i], n[i])) + s[i] = s[i].concat( + n[i] + ); + else if (!r) + throw new Error(`Cannot merge objects: key "${i}" already exists in the target object`); + } else + s[i] = n[i]; + }); + } else W(t, e) && t.push(...e); + return t; +} +class _e extends Re { +} +class mr { + constructor() { + d(this, "mutexesByID", /* @__PURE__ */ new Map()); + } + get(e) { + let r = this.mutexesByID.get(e); + return r || (r = new _e(), this.mutexesByID.set(e, r), r); + } +} +class gr extends Je { + // Making the protected base constructor public + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(e, r) { + super(e, r); + } + get output() { + return this.latestOutput; + } +} +class Fe { + constructor(e, r) { + d(this, "numberFormatter"); + this.numberFormatter = new Intl.NumberFormat(e, r); + } + /** + * Formats a number according to the locale and formatting options of this NumberFormat object + * + * @param value Number or BigInt to format + * @returns String representing the given number formatted according to the locale and formatting + * options of this NumberFormat object + */ + format(e) { + return this.numberFormatter.format(e); + } + /** + * Formats a range of numbers according to the locale and formatting options of this NumberFormat + * object + * + * @param startRange Number or bigint representing the start of the range + * @param endRange Number or bigint representing the end of the range + * @returns String representing the given range of numbers formatted according to the locale and + * formatting options of this NumberFormat object + */ + formatRange(e, r) { + return this.numberFormatter.formatRange(e, r); + } + /** + * Returns an array of objects containing the locale-specific tokens from which it is possible to + * build custom strings while preserving the locale-specific parts. + * + * @param startRange Number or bigint representing start of the range + * @param endRange Number or bigint representing end of the range + * @returns Array of NumberRangeFormatPart objects containing the formatted range of numbers in + * parts + */ + formatRangeToParts(e, r) { + return this.numberFormatter.formatRangeToParts(e, r); + } + /** + * Allows locale-aware formatting of strings produced by this NumberFormat object + * + * @param value Number or bigint to format + * @returns Array of NumberFormatPart objects containing the formatted number in parts + */ + formatToParts(e) { + return this.numberFormatter.formatToParts(e); + } + /** + * Returns a new object with properties reflecting the locale and number formatting options + * computed during initialization of this NumberFormat object + * + * @returns ResolvedNumberFormatOptions object + */ + resolvedOptions() { + return this.numberFormatter.resolvedOptions(); + } +} +class br { + constructor(e = "Anonymous") { + d(this, "unsubscribers", /* @__PURE__ */ new Set()); + this.name = e; + } + /** + * Add unsubscribers to the list. Note that duplicates are not added twice. + * + * @param unsubscribers - Objects that were returned from a registration process. + */ + add(...e) { + e.forEach((r) => { + "dispose" in r ? this.unsubscribers.add(r.dispose) : this.unsubscribers.add(r); + }); + } + /** + * Run all unsubscribers added to this list and then clear the list. + * + * @returns `true` if all unsubscribers succeeded, `false` otherwise. + */ + async runAllUnsubscribers() { + const e = [...this.unsubscribers].map((s) => s()), r = await Promise.all(e); + return this.unsubscribers.clear(), r.every((s, n) => (s || console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${n} failed!`), s)); + } +} +var Ke = Object.defineProperty, Xe = (t, e, r) => e in t ? Ke(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, l = (t, e, r) => Xe(t, typeof e != "symbol" ? e + "" : e, r); +const j = [ + "GEN", + "EXO", + "LEV", + "NUM", + "DEU", + "JOS", + "JDG", + "RUT", + "1SA", + "2SA", + // 10 + "1KI", + "2KI", + "1CH", + "2CH", + "EZR", + "NEH", + "EST", + "JOB", + "PSA", + "PRO", + // 20 + "ECC", + "SNG", + "ISA", + "JER", + "LAM", + "EZK", + "DAN", + "HOS", + "JOL", + "AMO", + // 30 + "OBA", + "JON", + "MIC", + "NAM", + "HAB", + "ZEP", + "HAG", + "ZEC", + "MAL", + "MAT", + // 40 + "MRK", + "LUK", + "JHN", + "ACT", + "ROM", + "1CO", + "2CO", + "GAL", + "EPH", + "PHP", + // 50 + "COL", + "1TH", + "2TH", + "1TI", + "2TI", + "TIT", + "PHM", + "HEB", + "JAS", + "1PE", + // 60 + "2PE", + "1JN", + "2JN", + "3JN", + "JUD", + "REV", + "TOB", + "JDT", + "ESG", + "WIS", + // 70 + "SIR", + "BAR", + "LJE", + "S3Y", + "SUS", + "BEL", + "1MA", + "2MA", + "3MA", + "4MA", + // 80 + "1ES", + "2ES", + "MAN", + "PS2", + "ODA", + "PSS", + "JSA", + // actual variant text for JOS, now in LXA text + "JDB", + // actual variant text for JDG, now in LXA text + "TBS", + // actual variant text for TOB, now in LXA text + "SST", + // actual variant text for SUS, now in LXA text // 90 + "DNT", + // actual variant text for DAN, now in LXA text + "BLT", + // actual variant text for BEL, now in LXA text + "XXA", + "XXB", + "XXC", + "XXD", + "XXE", + "XXF", + "XXG", + "FRT", + // 100 + "BAK", + "OTH", + "3ES", + // Used previously but really should be 2ES + "EZA", + // Used to be called 4ES, but not actually in any known project + "5EZ", + // Used to be called 5ES, but not actually in any known project + "6EZ", + // Used to be called 6ES, but not actually in any known project + "INT", + "CNC", + "GLO", + "TDX", + // 110 + "NDX", + "DAG", + "PS3", + "2BA", + "LBA", + "JUB", + "ENO", + "1MQ", + "2MQ", + "3MQ", + // 120 + "REP", + "4BA", + "LAO" +], J = [ + "XXA", + "XXB", + "XXC", + "XXD", + "XXE", + "XXF", + "XXG", + "FRT", + "BAK", + "OTH", + "INT", + "CNC", + "GLO", + "TDX", + "NDX" +], pe = [ + "Genesis", + "Exodus", + "Leviticus", + "Numbers", + "Deuteronomy", + "Joshua", + "Judges", + "Ruth", + "1 Samuel", + "2 Samuel", + "1 Kings", + "2 Kings", + "1 Chronicles", + "2 Chronicles", + "Ezra", + "Nehemiah", + "Esther (Hebrew)", + "Job", + "Psalms", + "Proverbs", + "Ecclesiastes", + "Song of Songs", + "Isaiah", + "Jeremiah", + "Lamentations", + "Ezekiel", + "Daniel (Hebrew)", + "Hosea", + "Joel", + "Amos", + "Obadiah", + "Jonah", + "Micah", + "Nahum", + "Habakkuk", + "Zephaniah", + "Haggai", + "Zechariah", + "Malachi", + "Matthew", + "Mark", + "Luke", + "John", + "Acts", + "Romans", + "1 Corinthians", + "2 Corinthians", + "Galatians", + "Ephesians", + "Philippians", + "Colossians", + "1 Thessalonians", + "2 Thessalonians", + "1 Timothy", + "2 Timothy", + "Titus", + "Philemon", + "Hebrews", + "James", + "1 Peter", + "2 Peter", + "1 John", + "2 John", + "3 John", + "Jude", + "Revelation", + "Tobit", + "Judith", + "Esther Greek", + "Wisdom of Solomon", + "Sirach (Ecclesiasticus)", + "Baruch", + "Letter of Jeremiah", + "Song of 3 Young Men", + "Susanna", + "Bel and the Dragon", + "1 Maccabees", + "2 Maccabees", + "3 Maccabees", + "4 Maccabees", + "1 Esdras (Greek)", + "2 Esdras (Latin)", + "Prayer of Manasseh", + "Psalm 151", + "Odes", + "Psalms of Solomon", + // WARNING, if you change the spelling of the *obsolete* tag be sure to update + // IsObsolete routine + "Joshua A. *obsolete*", + "Judges B. *obsolete*", + "Tobit S. *obsolete*", + "Susanna Th. *obsolete*", + "Daniel Th. *obsolete*", + "Bel Th. *obsolete*", + "Extra A", + "Extra B", + "Extra C", + "Extra D", + "Extra E", + "Extra F", + "Extra G", + "Front Matter", + "Back Matter", + "Other Matter", + "3 Ezra *obsolete*", + "Apocalypse of Ezra", + "5 Ezra (Latin Prologue)", + "6 Ezra (Latin Epilogue)", + "Introduction", + "Concordance ", + "Glossary ", + "Topical Index", + "Names Index", + "Daniel Greek", + "Psalms 152-155", + "2 Baruch (Apocalypse)", + "Letter of Baruch", + "Jubilees", + "Enoch", + "1 Meqabyan", + "2 Meqabyan", + "3 Meqabyan", + "Reproof (Proverbs 25-31)", + "4 Baruch (Rest of Baruch)", + "Laodiceans" +], Z = rt(); +function A(t, e = !0) { + return e && (t = t.toUpperCase()), t in Z ? Z[t] : 0; +} +function G(t) { + return A(t) > 0; +} +function He(t) { + const e = typeof t == "string" ? A(t) : t; + return e >= 40 && e <= 66; +} +function Le(t) { + return (typeof t == "string" ? A(t) : t) <= 39; +} +function de(t) { + return t <= 66; +} +function Ue(t) { + const e = typeof t == "string" ? A(t) : t; + return be(e) && !de(e); +} +function* We() { + for (let t = 1; t <= j.length; t++) yield t; +} +const Ze = 1, me = j.length; +function Ye() { + return ["XXA", "XXB", "XXC", "XXD", "XXE", "XXF", "XXG"]; +} +function _(t, e = "***") { + const r = t - 1; + return r < 0 || r >= j.length ? e : j[r]; +} +function ge(t) { + return t <= 0 || t > me ? "******" : pe[t - 1]; +} +function Qe(t) { + return ge(A(t)); +} +function be(t) { + const e = typeof t == "number" ? _(t) : t; + return G(e) && !J.includes(e); +} +function et(t) { + const e = typeof t == "number" ? _(t) : t; + return G(e) && J.includes(e); +} +function tt(t) { + return pe[t - 1].includes("*obsolete*"); +} +function rt() { + const t = {}; + for (let e = 0; e < j.length; e++) + t[j[e]] = e + 1; + return t; +} +const E = { + allBookIds: j, + nonCanonicalIds: J, + bookIdToNumber: A, + isBookIdValid: G, + isBookNT: He, + isBookOT: Le, + isBookOTNT: de, + isBookDC: Ue, + allBookNumbers: We, + firstBook: Ze, + lastBook: me, + extraBooks: Ye, + bookNumberToId: _, + bookNumberToEnglishName: ge, + bookIdToEnglishName: Qe, + isCanonical: be, + isExtraMaterial: et, + isObsolete: tt +}; +var S = /* @__PURE__ */ ((t) => (t[t.Unknown = 0] = "Unknown", t[t.Original = 1] = "Original", t[t.Septuagint = 2] = "Septuagint", t[t.Vulgate = 3] = "Vulgate", t[t.English = 4] = "English", t[t.RussianProtestant = 5] = "RussianProtestant", t[t.RussianOrthodox = 6] = "RussianOrthodox", t))(S || {}); +const N = class { + // private versInfo: Versification; + constructor(e) { + if (l(this, "name"), l(this, "fullPath"), l(this, "isPresent"), l(this, "hasVerseSegments"), l(this, "isCustomized"), l(this, "baseVersification"), l(this, "scriptureBooks"), l(this, "_type"), e == null) + throw new Error("Argument undefined"); + typeof e == "string" ? (this.name = e, this._type = S[e]) : (this._type = e, this.name = S[e]); + } + get type() { + return this._type; + } + equals(e) { + return !e.type || !this.type ? !1 : e.type === this.type; + } +}; +l(N, "Original", new N(S.Original)), l(N, "Septuagint", new N(S.Septuagint)), l(N, "Vulgate", new N(S.Vulgate)), l(N, "English", new N(S.English)), l(N, "RussianProtestant", new N(S.RussianProtestant)), l(N, "RussianOrthodox", new N(S.RussianOrthodox)); +let $ = N; +function Y(t, e) { + const r = e[0]; + for (let s = 1; s < e.length; s++) + t = t.split(e[s]).join(r); + return t.split(r); +} +var ye = /* @__PURE__ */ ((t) => (t[t.Valid = 0] = "Valid", t[t.UnknownVersification = 1] = "UnknownVersification", t[t.OutOfRange = 2] = "OutOfRange", t[t.VerseOutOfOrder = 3] = "VerseOutOfOrder", t[t.VerseRepeated = 4] = "VerseRepeated", t))(ye || {}); +const y = class f { + constructor(e, r, s, n) { + if (l(this, "firstChapter"), l(this, "lastChapter"), l(this, "lastVerse"), l(this, "hasSegmentsDefined"), l(this, "text"), l(this, "BBBCCCVVVS"), l(this, "longHashCode"), l(this, "versification"), l(this, "rtlMark", "‏"), l(this, "_bookNum", 0), l(this, "_chapterNum", 0), l(this, "_verseNum", 0), l(this, "_verse"), s == null && n == null) + if (e != null && typeof e == "string") { + const i = e, o = r != null && r instanceof $ ? r : void 0; + this.setEmpty(o), this.parse(i); + } else if (e != null && typeof e == "number") { + const i = r != null && r instanceof $ ? r : void 0; + this.setEmpty(i), this._verseNum = e % f.chapterDigitShifter, this._chapterNum = Math.floor( + e % f.bookDigitShifter / f.chapterDigitShifter + ), this._bookNum = Math.floor(e / f.bookDigitShifter); + } else if (r == null) + if (e != null && e instanceof f) { + const i = e; + this._bookNum = i.bookNum, this._chapterNum = i.chapterNum, this._verseNum = i.verseNum, this._verse = i.verse, this.versification = i.versification; + } else { + if (e == null) return; + const i = e instanceof $ ? e : f.defaultVersification; + this.setEmpty(i); + } + else + throw new Error("VerseRef constructor not supported."); + else if (e != null && r != null && s != null) + if (typeof e == "string" && typeof r == "string" && typeof s == "string") + this.setEmpty(n), this.updateInternal(e, r, s); + else if (typeof e == "number" && typeof r == "number" && typeof s == "number") + this._bookNum = e, this._chapterNum = r, this._verseNum = s, this.versification = n ?? f.defaultVersification; + else + throw new Error("VerseRef constructor not supported."); + else + throw new Error("VerseRef constructor not supported."); + } + /** + * Determines if the verse string is in a valid format (does not consider versification). + */ + static isVerseParseable(e) { + return e.length > 0 && "0123456789".includes(e[0]) && !e.endsWith(this.verseRangeSeparator) && !e.endsWith(this.verseSequenceIndicator); + } + /** + * Tries to parse the specified string into a verse reference. + * @param str - The string to attempt to parse. + * @returns success: `true` if the specified string was successfully parsed, `false` otherwise. + * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed + */ + static tryParse(e) { + let r; + try { + return r = new f(e), { success: !0, verseRef: r }; + } catch (s) { + if (s instanceof B) + return r = new f(), { success: !1, verseRef: r }; + throw s; + } + } + /** + * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3 + * digits. + * @param bookNum - Book number (this is 1-based, not an index). + * @param chapterNum - Chapter number. + * @param verseNum - Verse number. + * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3 + * digits. + */ + static getBBBCCCVVV(e, r, s) { + return e % f.bcvMaxValue * f.bookDigitShifter + (r >= 0 ? r % f.bcvMaxValue * f.chapterDigitShifter : 0) + (s >= 0 ? s % f.bcvMaxValue : 0); + } + /** + * Deserializes a serialized VerseRef. + * @param serializedVerseRef - Serialized VerseRef to create from. + * @returns the deserialized VerseRef. + */ + static fromJSON(e) { + const { book: r, chapterNum: s, verseNum: n, verse: i, versificationStr: o } = e, a = i || n.toString(); + let h; + return o && (h = new $(o)), r ? new f(r, s.toString(), a, h) : new f(); + } + /** + * Parses a verse string and gets the leading numeric portion as a number. + * @param verseStr - verse string to parse + * @returns true if the entire string could be parsed as a single, simple verse number (1-999); + * false if the verse string represented a verse bridge, contained segment letters, or was invalid + */ + static tryGetVerseNum(e) { + let r; + if (!e) + return r = -1, { success: !0, vNum: r }; + r = 0; + let s; + for (let n = 0; n < e.length; n++) { + if (s = e[n], s < "0" || s > "9") + return n === 0 && (r = -1), { success: !1, vNum: r }; + if (r = r * 10 + +s - 0, r > f.bcvMaxValue) + return r = -1, { success: !1, vNum: r }; + } + return { success: !0, vNum: r }; + } + /** + * Checks to see if a VerseRef hasn't been set - all values are the default. + */ + get isDefault() { + return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null; + } + /** + * Gets whether the verse contains multiple verses. + */ + get hasMultiple() { + return this._verse != null && (this._verse.includes(f.verseRangeSeparator) || this._verse.includes(f.verseSequenceIndicator)); + } + /** + * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters, + * e.g. `'MAT'`. + */ + get book() { + return E.bookNumberToId(this.bookNum, ""); + } + set book(e) { + this.bookNum = E.bookIdToNumber(e); + } + /** + * Gets or sets the chapter of the reference,. e.g. `'3'`. + */ + get chapter() { + return this.isDefault || this._chapterNum < 0 ? "" : this._chapterNum.toString(); + } + set chapter(e) { + const r = +e; + this._chapterNum = Number.isInteger(r) ? r : -1; + } + /** + * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`, + * or `'4b-5a, 7'`. + */ + get verse() { + return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? "" : this._verseNum.toString(); + } + set verse(e) { + const { success: r, vNum: s } = f.tryGetVerseNum(e); + this._verse = r ? void 0 : e.replace(this.rtlMark, ""), this._verseNum = s, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = f.tryGetVerseNum(this._verse)); + } + /** + * Get or set Book based on book number, e.g. `42`. + */ + get bookNum() { + return this._bookNum; + } + set bookNum(e) { + if (e <= 0 || e > E.lastBook) + throw new B( + "BookNum must be greater than zero and less than or equal to last book" + ); + this._bookNum = e; + } + /** + * Gets or sets the chapter number, e.g. `3`. `-1` if not valid. + */ + get chapterNum() { + return this._chapterNum; + } + set chapterNum(e) { + this.chapterNum = e; + } + /** + * Gets or sets verse start number, e.g. `4`. `-1` if not valid. + */ + get verseNum() { + return this._verseNum; + } + set verseNum(e) { + this._verseNum = e; + } + /** + * String representing the versification (should ONLY be used for serialization/deserialization). + * + * @remarks This is for backwards compatibility when ScrVers was an enumeration. + */ + get versificationStr() { + var e; + return (e = this.versification) == null ? void 0 : e.name; + } + set versificationStr(e) { + this.versification = this.versification != null ? new $(e) : void 0; + } + /** + * Determines if the reference is valid. + */ + get valid() { + return this.validStatus === 0; + } + /** + * Get the valid status for this reference. + */ + get validStatus() { + return this.validateVerse(f.verseRangeSeparators, f.verseSequenceIndicators); + } + /** + * Gets the reference as a comparable integer where the book, + * chapter, and verse each occupy three digits and the verse is 0. + */ + get BBBCCC() { + return f.getBBBCCCVVV(this._bookNum, this._chapterNum, 0); + } + /** + * Gets the reference as a comparable integer where the book, + * chapter, and verse each occupy three digits. If verse is not null + * (i.e., this reference represents a complex reference with verse + * segments or bridge) this cannot be used for an exact comparison. + */ + get BBBCCCVVV() { + return f.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum); + } + /** + * Gets whether the verse is defined as an excluded verse in the versification. + * Does not handle verse ranges. + */ + // eslint-disable-next-line @typescript-eslint/class-literal-property-style + get isExcluded() { + return !1; + } + /** + * Parses the reference in the specified string. + * Optionally versification can follow reference as in GEN 3:11/4 + * Throw an exception if + * - invalid book name + * - chapter number is missing or not a number + * - verse number is missing or does not start with a number + * - versification is invalid + * @param verseStr - string to parse e.g. 'MAT 3:11' + */ + parse(e) { + if (e = e.replace(this.rtlMark, ""), e.includes("/")) { + const i = e.split("/"); + if (e = i[0], i.length > 1) + try { + const o = +i[1].trim(); + this.versification = new $(S[o]); + } catch { + throw new B("Invalid reference : " + e); + } + } + const r = e.trim().split(" "); + if (r.length !== 2) + throw new B("Invalid reference : " + e); + const s = r[1].split(":"), n = +s[0]; + if (s.length !== 2 || E.bookIdToNumber(r[0]) === 0 || !Number.isInteger(n) || n < 0 || !f.isVerseParseable(s[1])) + throw new B("Invalid reference : " + e); + this.updateInternal(r[0], s[0], s[1]); + } + /** + * Simplifies this verse ref so that it has no bridging of verses or + * verse segments like `'1a'`. + */ + simplify() { + this._verse = void 0; + } + /** + * Makes a clone of the reference. + * + * @returns The cloned VerseRef. + */ + clone() { + return new f(this); + } + toString() { + const e = this.book; + return e === "" ? "" : `${e} ${this.chapter}:${this.verse}`; + } + toJSON() { + let e = this.verse; + (e === "" || e === this.verseNum.toString()) && (e = void 0); + const r = { + book: this.book, + chapterNum: this.chapterNum, + verseNum: this.verseNum, + verse: e, + versificationStr: this.versificationStr + }; + return e || delete r.verse, r; + } + /** + * Compares this `VerseRef` with supplied one. + * @param verseRef - object to compare this one to. + * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise. + */ + equals(e) { + return e instanceof f ? e._bookNum === this._bookNum && e._chapterNum === this._chapterNum && e._verseNum === this._verseNum && e.verse === this.verse && (e.versification == null && this.versification == null || e.versification != null && this.versification != null && e.versification.equals(this.versification)) : !1; + } + /** + * Enumerate all individual verses contained in a VerseRef. + * Verse ranges are indicated by "-" and consecutive verses by ","s. + * Examples: + * GEN 1:2 returns GEN 1:2 + * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5 + * GEN 1:2a-2c returns //! ?????? + * + * @param specifiedVersesOnly - if set to true return only verses that are + * explicitly specified only, not verses within a range. Defaults to `false`. + * @param verseRangeSeparators - Verse range separators. + * Defaults to `VerseRef.verseRangeSeparators`. + * @param verseSequenceSeparators - Verse sequence separators. + * Defaults to `VerseRef.verseSequenceIndicators`. + * @returns An array of all single verse references in this VerseRef. + */ + allVerses(e = !1, r = f.verseRangeSeparators, s = f.verseSequenceIndicators) { + if (this._verse == null || this.chapterNum <= 0) + return [this.clone()]; + const n = [], i = Y(this._verse, s); + for (const o of i.map((a) => Y(a, r))) { + const a = this.clone(); + a.verse = o[0]; + const h = a.verseNum; + if (n.push(a), o.length > 1) { + const p = this.clone(); + if (p.verse = o[1], !e) + for (let u = h + 1; u < p.verseNum; u++) { + const c = new f( + this._bookNum, + this._chapterNum, + u, + this.versification + ); + this.isExcluded || n.push(c); + } + n.push(p); + } + } + return n; + } + /** + * Validates a verse number using the supplied separators rather than the defaults. + */ + validateVerse(e, r) { + if (!this.verse) + return this.internalValid; + let s = 0; + for (const n of this.allVerses(!0, e, r)) { + const i = n.internalValid; + if (i !== 0) + return i; + const o = n.BBBCCCVVV; + if (s > o) + return 3; + if (s === o) + return 4; + s = o; + } + return 0; + } + /** + * Gets whether a single verse reference is valid. + */ + get internalValid() { + return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > E.lastBook ? 2 : (E.isCanonical(this._bookNum), 0); + } + setEmpty(e = f.defaultVersification) { + this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = e; + } + updateInternal(e, r, s) { + this.bookNum = E.bookIdToNumber(e), this.chapter = r, this.verse = s; + } +}; +l(y, "defaultVersification", $.English), l(y, "verseRangeSeparator", "-"), l(y, "verseSequenceIndicator", ","), l(y, "verseRangeSeparators", [y.verseRangeSeparator]), l(y, "verseSequenceIndicators", [y.verseSequenceIndicator]), l(y, "chapterDigitShifter", 1e3), l(y, "bookDigitShifter", y.chapterDigitShifter * y.chapterDigitShifter), l(y, "bcvMaxValue", y.chapterDigitShifter - 1), /** +* The valid status of the VerseRef. +*/ +l(y, "ValidStatusType", ye); +let st = y; +class B extends Error { +} +var Q = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}, C = {}, nt = () => { + const t = "\\ud800-\\udfff", o = "\\u0300-\\u036f" + "\\ufe20-\\ufe2f" + "\\u20d0-\\u20ff" + "\\u1ab0-\\u1aff" + "\\u1dc0-\\u1dff", a = "\\ufe0e\\ufe0f", h = "\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93", p = `[${t}]`, u = `[${o}]`, c = "\\ud83c[\\udffb-\\udfff]", m = `(?:${u}|${c})`, v = `[^${t}]`, b = "(?:\\uD83C[\\uDDE6-\\uDDFF]){2}", P = "[\\ud800-\\udbff][\\udc00-\\udfff]", q = "\\u200d", Ce = "(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40(?:\\udc65|\\udc73|\\udc77)\\udb40(?:\\udc6e|\\udc63|\\udc6c)\\udb40(?:\\udc67|\\udc74|\\udc73)\\udb40\\udc7f)", Ie = `[${h}]`, H = `${m}?`, L = `[${a}]?`, Ae = `(?:${q}(?:${[v, b, P].join("|")})${L + H})*`, Te = L + H + Ae, Pe = `(?:${[`${v}${u}?`, u, b, P, p, Ie].join("|")})`; + return new RegExp(`${Ce}|${c}(?=${c})|${Pe + Te}`, "g"); +}, it = Q && Q.__importDefault || function(t) { + return t && t.__esModule ? t : { default: t }; +}; +Object.defineProperty(C, "__esModule", { value: !0 }); +var k = it(nt); +function z(t) { + if (typeof t != "string") + throw new Error("A string is expected as input"); + return t.match(k.default()) || []; +} +var ot = C.toArray = z; +function F(t) { + if (typeof t != "string") + throw new Error("Input must be a string"); + var e = t.match(k.default()); + return e === null ? 0 : e.length; +} +var at = C.length = F; +function ve(t, e, r) { + if (e === void 0 && (e = 0), typeof t != "string") + throw new Error("Input must be a string"); + (typeof e != "number" || e < 0) && (e = 0), typeof r == "number" && r < 0 && (r = 0); + var s = t.match(k.default()); + return s ? s.slice(e, r).join("") : ""; +} +var ut = C.substring = ve; +function lt(t, e, r) { + if (e === void 0 && (e = 0), typeof t != "string") + throw new Error("Input must be a string"); + var s = F(t); + if (typeof e != "number" && (e = parseInt(e, 10)), e >= s) + return ""; + e < 0 && (e += s); + var n; + typeof r > "u" ? n = s : (typeof r != "number" && (r = parseInt(r, 10)), n = r >= 0 ? r + e : e); + var i = t.match(k.default()); + return i ? i.slice(e, n).join("") : ""; +} +var ct = C.substr = lt; +function ft(t, e, r, s) { + if (e === void 0 && (e = 16), r === void 0 && (r = "#"), s === void 0 && (s = "right"), typeof t != "string" || typeof e != "number") + throw new Error("Invalid arguments specified"); + if (["left", "right"].indexOf(s) === -1) + throw new Error("Pad position should be either left or right"); + typeof r != "string" && (r = String(r)); + var n = F(t); + if (n > e) + return ve(t, 0, e); + if (n < e) { + var i = r.repeat(e - n); + return s === "left" ? i + t : t + i; + } + return t; +} +var Ne = C.limit = ft; +function ht(t, e, r) { + if (r === void 0 && (r = 0), typeof t != "string") + throw new Error("Input must be a string"); + if (t === "") + return e === "" ? 0 : -1; + r = Number(r), r = isNaN(r) ? 0 : r, e = String(e); + var s = z(t); + if (r >= s.length) + return e === "" ? s.length : -1; + if (e === "") + return r; + var n = z(e), i = !1, o; + for (o = r; o < s.length; o += 1) { + for (var a = 0; a < n.length && n[a] === s[o + a]; ) + a += 1; + if (a === n.length && n[a - 1] === s[o + a - 1]) { + i = !0; + break; + } + } + return i ? o : -1; +} +var pt = C.indexOf = ht; +function we(t) { + return t ? Array.isArray(t) ? t : [t] : []; +} +function vr(t, e) { + if (!(e > g(t) || e < -g(t))) + return V(t, e, 1); +} +function I(t, e) { + return e < 0 || e > g(t) - 1 ? "" : V(t, e, 1); +} +function Nr(t, e) { + if (!(e < 0 || e > g(t) - 1)) + return V(t, e, 1).codePointAt(0); +} +function dt(t, e, r = g(t)) { + const s = bt(t, e); + return !(s === -1 || s + g(e) !== r); +} +function mt(t, e, r) { + if (e < 0) return -1; + if (r) { + if (I(t, e) === "}" && I(t, e - 1) === "\\") return e; + const i = M(t, "\\}", e); + return i >= 0 ? i + 1 : i; + } + let s = e; + const n = g(t); + for (; s < n && (s = M(t, "}", s), !(s === -1 || I(t, s - 1) !== "\\")); ) + s += 1; + return s >= n ? -1 : s; +} +function wr(t, e) { + let r = t, s = 0; + for (; s < g(r); ) { + switch (I(r, s)) { + case "{": + if (I(r, s - 1) !== "\\") { + const n = mt(r, s, !1); + if (n >= 0) { + const i = w(r, s + 1, n), o = i in e ? ( + // We're getting a value.toString() with any type from an object with any keys + // here. TypeScript doesn't need to carefully and precisely track the exact type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + `${e[i]}` + ) : i; + r = `${w(r, 0, s)}${o}${w(r, n + 1)}`, s = n + g(o) - g(i) - 2; + } + } else + r = `${w(r, 0, s - 1)}${w(r, s)}`, s -= 1; + break; + case "}": + I(r, s - 1) !== "\\" || (r = `${w(r, 0, s - 1)}${w(r, s)}`, s -= 1); + break; + } + s += 1; + } + return r; +} +function gt(t, e, r = 0) { + const s = w(t, r); + return M(s, e) !== -1; +} +function M(t, e, r = 0) { + return pt(t, e, r); +} +function bt(t, e, r) { + let s = r === void 0 ? g(t) : r; + s < 0 ? s = 0 : s >= g(t) && (s = g(t) - 1); + for (let n = s; n >= 0; n--) + if (V(t, n, g(e)) === e) + return n; + return -1; +} +function g(t) { + return at(t); +} +function Er(t, e) { + const r = e.toUpperCase(); + return r === "NONE" ? t : t.normalize(r); +} +function Sr(t, e, r) { + return t.localeCompare(e, "en", r); +} +function Or(t, e, r = " ") { + return e <= g(t) ? t : Ne(t, e, r, "right"); +} +function $r(t, e, r = " ") { + return e <= g(t) ? t : Ne(t, e, r, "left"); +} +function ee(t, e) { + return e > t ? t : e < -t ? 0 : e < 0 ? e + t : e; +} +function jr(t, e, r) { + const s = g(t); + if (e > s || r && (e > r && !(e >= 0 && e < s && r < 0 && r > -s) || r < -s)) + return ""; + const n = ee(s, e), i = r ? ee(s, r) : void 0; + return w(t, n, i); +} +function te(t, e, r) { + const s = []; + if (r !== void 0 && r <= 0) + return [t]; + if (e === "") return yt(t).slice(0, r); + let n = e; + (typeof e == "string" || e instanceof RegExp && !gt(e.flags, "g")) && (n = new RegExp(e, "g")); + const i = t.match(n); + let o = 0; + if (!i) return [t]; + for (let a = 0; a < (r ? r - 1 : i.length); a++) { + const h = M(t, i[a], o), p = g(i[a]); + if (s.push(w(t, o, h)), o = h + p, r !== void 0 && s.length === r) + break; + } + return s.push(w(t, o)), s; +} +function Ee(t, e, r = 0) { + return M(t, e, r) === r; +} +function V(t, e = 0, r = g(t) - e) { + return ct(t, e, r); +} +function w(t, e, r = g(t)) { + return ut(t, e, r); +} +function yt(t) { + return ot(t); +} +function Cr(t) { + return Ee(t, "%") && dt(t, "%"); +} +function Ir(t) { + if (typeof t != "string") + throw new TypeError("Expected a string"); + return t.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); +} +function Ar(t) { + return t ? we(t).map( + (s) => Array.isArray(s) ? s.map((n) => new RegExp(n)) : new RegExp(s) + ) : []; +} +function Tr(t) { + return t ? we(t).map((s) => new RegExp(s)) : []; +} +const Se = [ + { shortName: "ERR", fullNames: ["ERROR"], chapters: -1 }, + { shortName: "GEN", fullNames: ["Genesis"], chapters: 50 }, + { shortName: "EXO", fullNames: ["Exodus"], chapters: 40 }, + { shortName: "LEV", fullNames: ["Leviticus"], chapters: 27 }, + { shortName: "NUM", fullNames: ["Numbers"], chapters: 36 }, + { shortName: "DEU", fullNames: ["Deuteronomy"], chapters: 34 }, + { shortName: "JOS", fullNames: ["Joshua"], chapters: 24 }, + { shortName: "JDG", fullNames: ["Judges"], chapters: 21 }, + { shortName: "RUT", fullNames: ["Ruth"], chapters: 4 }, + { shortName: "1SA", fullNames: ["1 Samuel"], chapters: 31 }, + { shortName: "2SA", fullNames: ["2 Samuel"], chapters: 24 }, + { shortName: "1KI", fullNames: ["1 Kings"], chapters: 22 }, + { shortName: "2KI", fullNames: ["2 Kings"], chapters: 25 }, + { shortName: "1CH", fullNames: ["1 Chronicles"], chapters: 29 }, + { shortName: "2CH", fullNames: ["2 Chronicles"], chapters: 36 }, + { shortName: "EZR", fullNames: ["Ezra"], chapters: 10 }, + { shortName: "NEH", fullNames: ["Nehemiah"], chapters: 13 }, + { shortName: "EST", fullNames: ["Esther"], chapters: 10 }, + { shortName: "JOB", fullNames: ["Job"], chapters: 42 }, + { shortName: "PSA", fullNames: ["Psalm", "Psalms"], chapters: 150 }, + { shortName: "PRO", fullNames: ["Proverbs"], chapters: 31 }, + { shortName: "ECC", fullNames: ["Ecclesiastes"], chapters: 12 }, + { shortName: "SNG", fullNames: ["Song of Solomon", "Song of Songs"], chapters: 8 }, + { shortName: "ISA", fullNames: ["Isaiah"], chapters: 66 }, + { shortName: "JER", fullNames: ["Jeremiah"], chapters: 52 }, + { shortName: "LAM", fullNames: ["Lamentations"], chapters: 5 }, + { shortName: "EZK", fullNames: ["Ezekiel"], chapters: 48 }, + { shortName: "DAN", fullNames: ["Daniel"], chapters: 12 }, + { shortName: "HOS", fullNames: ["Hosea"], chapters: 14 }, + { shortName: "JOL", fullNames: ["Joel"], chapters: 3 }, + { shortName: "AMO", fullNames: ["Amos"], chapters: 9 }, + { shortName: "OBA", fullNames: ["Obadiah"], chapters: 1 }, + { shortName: "JON", fullNames: ["Jonah"], chapters: 4 }, + { shortName: "MIC", fullNames: ["Micah"], chapters: 7 }, + { shortName: "NAM", fullNames: ["Nahum"], chapters: 3 }, + { shortName: "HAB", fullNames: ["Habakkuk"], chapters: 3 }, + { shortName: "ZEP", fullNames: ["Zephaniah"], chapters: 3 }, + { shortName: "HAG", fullNames: ["Haggai"], chapters: 2 }, + { shortName: "ZEC", fullNames: ["Zechariah"], chapters: 14 }, + { shortName: "MAL", fullNames: ["Malachi"], chapters: 4 }, + { shortName: "MAT", fullNames: ["Matthew"], chapters: 28 }, + { shortName: "MRK", fullNames: ["Mark"], chapters: 16 }, + { shortName: "LUK", fullNames: ["Luke"], chapters: 24 }, + { shortName: "JHN", fullNames: ["John"], chapters: 21 }, + { shortName: "ACT", fullNames: ["Acts"], chapters: 28 }, + { shortName: "ROM", fullNames: ["Romans"], chapters: 16 }, + { shortName: "1CO", fullNames: ["1 Corinthians"], chapters: 16 }, + { shortName: "2CO", fullNames: ["2 Corinthians"], chapters: 13 }, + { shortName: "GAL", fullNames: ["Galatians"], chapters: 6 }, + { shortName: "EPH", fullNames: ["Ephesians"], chapters: 6 }, + { shortName: "PHP", fullNames: ["Philippians"], chapters: 4 }, + { shortName: "COL", fullNames: ["Colossians"], chapters: 4 }, + { shortName: "1TH", fullNames: ["1 Thessalonians"], chapters: 5 }, + { shortName: "2TH", fullNames: ["2 Thessalonians"], chapters: 3 }, + { shortName: "1TI", fullNames: ["1 Timothy"], chapters: 6 }, + { shortName: "2TI", fullNames: ["2 Timothy"], chapters: 4 }, + { shortName: "TIT", fullNames: ["Titus"], chapters: 3 }, + { shortName: "PHM", fullNames: ["Philemon"], chapters: 1 }, + { shortName: "HEB", fullNames: ["Hebrews"], chapters: 13 }, + { shortName: "JAS", fullNames: ["James"], chapters: 5 }, + { shortName: "1PE", fullNames: ["1 Peter"], chapters: 5 }, + { shortName: "2PE", fullNames: ["2 Peter"], chapters: 3 }, + { shortName: "1JN", fullNames: ["1 John"], chapters: 5 }, + { shortName: "2JN", fullNames: ["2 John"], chapters: 1 }, + { shortName: "3JN", fullNames: ["3 John"], chapters: 1 }, + { shortName: "JUD", fullNames: ["Jude"], chapters: 1 }, + { shortName: "REV", fullNames: ["Revelation"], chapters: 22 } +], vt = 1, Nt = Se.length - 1, wt = 1, Et = 1, St = (t) => { + var e; + return ((e = Se[t]) == null ? void 0 : e.chapters) ?? -1; +}, Pr = (t, e) => ({ + bookNum: Math.max(vt, Math.min(t.bookNum + e, Nt)), + chapterNum: 1, + verseNum: 1 +}), Br = (t, e) => ({ + ...t, + chapterNum: Math.min( + Math.max(wt, t.chapterNum + e), + St(t.bookNum) + ), + verseNum: 1 +}), xr = (t, e) => ({ + ...t, + verseNum: Math.max(Et, t.verseNum + e) +}); +async function Rr(t, e, r) { + const s = E.bookNumberToId(t); + if (!Ee(Intl.getCanonicalLocales(e)[0], "zh")) + return r({ + localizeKey: `LocalizedId.${s}`, + languagesToSearch: [e] + }); + const n = await r({ + localizeKey: `Book.${s}`, + languagesToSearch: [e] + }), i = te(n, "-"); + return te(i[0], "ÿ08")[0].trim(); +} +function re(t) { + return new st(t.bookNum, t.chapterNum, t.verseNum).BBBCCCVVV; +} +function Mr(t, e) { + return re(t) - re(e); +} +function Ot(t) { + return `%scrollGroup_${t}%`; +} +function Dr(t) { + return t.map((e) => Ot(e)); +} +function kr(t, e, r, s) { + let n; + switch (e ?? "id") { + case "English": + n = E.bookNumberToEnglishName(t.bookNum); + break; + case "id": + n = E.bookNumberToId(t.bookNum); + break; + default: + n = e ?? ""; + break; + } + return `${n}${s ?? " "}${t.chapterNum}${r ?? ":"}${t.verseNum}`; +} +const Vr = (t) => (...e) => t.map((s) => s(...e)).every((s) => s), qr = (t) => async (...e) => { + const r = t.map(async (s) => s(...e)); + return (await Promise.all(r)).every((s) => s); +}; +var $t = Object.getOwnPropertyNames, jt = Object.getOwnPropertySymbols, Ct = Object.prototype.hasOwnProperty; +function se(t, e) { + return function(s, n, i) { + return t(s, n, i) && e(s, n, i); + }; +} +function D(t) { + return function(r, s, n) { + if (!r || !s || typeof r != "object" || typeof s != "object") + return t(r, s, n); + var i = n.cache, o = i.get(r), a = i.get(s); + if (o && a) + return o === s && a === r; + i.set(r, s), i.set(s, r); + var h = t(r, s, n); + return i.delete(r), i.delete(s), h; + }; +} +function ne(t) { + return $t(t).concat(jt(t)); +} +var Oe = Object.hasOwn || function(t, e) { + return Ct.call(t, e); +}; +function T(t, e) { + return t || e ? t === e : t === e || t !== t && e !== e; +} +var $e = "_owner", ie = Object.getOwnPropertyDescriptor, oe = Object.keys; +function It(t, e, r) { + var s = t.length; + if (e.length !== s) + return !1; + for (; s-- > 0; ) + if (!r.equals(t[s], e[s], s, s, t, e, r)) + return !1; + return !0; +} +function At(t, e) { + return T(t.getTime(), e.getTime()); +} +function ae(t, e, r) { + if (t.size !== e.size) + return !1; + for (var s = {}, n = t.entries(), i = 0, o, a; (o = n.next()) && !o.done; ) { + for (var h = e.entries(), p = !1, u = 0; (a = h.next()) && !a.done; ) { + var c = o.value, m = c[0], v = c[1], b = a.value, P = b[0], q = b[1]; + !p && !s[u] && (p = r.equals(m, P, i, u, t, e, r) && r.equals(v, q, m, P, t, e, r)) && (s[u] = !0), u++; + } + if (!p) + return !1; + i++; + } + return !0; +} +function Tt(t, e, r) { + var s = oe(t), n = s.length; + if (oe(e).length !== n) + return !1; + for (var i; n-- > 0; ) + if (i = s[n], i === $e && (t.$$typeof || e.$$typeof) && t.$$typeof !== e.$$typeof || !Oe(e, i) || !r.equals(t[i], e[i], i, i, t, e, r)) + return !1; + return !0; +} +function x(t, e, r) { + var s = ne(t), n = s.length; + if (ne(e).length !== n) + return !1; + for (var i, o, a; n-- > 0; ) + if (i = s[n], i === $e && (t.$$typeof || e.$$typeof) && t.$$typeof !== e.$$typeof || !Oe(e, i) || !r.equals(t[i], e[i], i, i, t, e, r) || (o = ie(t, i), a = ie(e, i), (o || a) && (!o || !a || o.configurable !== a.configurable || o.enumerable !== a.enumerable || o.writable !== a.writable))) + return !1; + return !0; +} +function Pt(t, e) { + return T(t.valueOf(), e.valueOf()); +} +function Bt(t, e) { + return t.source === e.source && t.flags === e.flags; +} +function ue(t, e, r) { + if (t.size !== e.size) + return !1; + for (var s = {}, n = t.values(), i, o; (i = n.next()) && !i.done; ) { + for (var a = e.values(), h = !1, p = 0; (o = a.next()) && !o.done; ) + !h && !s[p] && (h = r.equals(i.value, o.value, i.value, o.value, t, e, r)) && (s[p] = !0), p++; + if (!h) + return !1; + } + return !0; +} +function xt(t, e) { + var r = t.length; + if (e.length !== r) + return !1; + for (; r-- > 0; ) + if (t[r] !== e[r]) + return !1; + return !0; +} +var Rt = "[object Arguments]", Mt = "[object Boolean]", Dt = "[object Date]", kt = "[object Map]", Vt = "[object Number]", qt = "[object Object]", zt = "[object RegExp]", Jt = "[object Set]", Gt = "[object String]", _t = Array.isArray, le = typeof ArrayBuffer == "function" && ArrayBuffer.isView ? ArrayBuffer.isView : null, ce = Object.assign, Ft = Object.prototype.toString.call.bind(Object.prototype.toString); +function Kt(t) { + var e = t.areArraysEqual, r = t.areDatesEqual, s = t.areMapsEqual, n = t.areObjectsEqual, i = t.arePrimitiveWrappersEqual, o = t.areRegExpsEqual, a = t.areSetsEqual, h = t.areTypedArraysEqual; + return function(u, c, m) { + if (u === c) + return !0; + if (u == null || c == null || typeof u != "object" || typeof c != "object") + return u !== u && c !== c; + var v = u.constructor; + if (v !== c.constructor) + return !1; + if (v === Object) + return n(u, c, m); + if (_t(u)) + return e(u, c, m); + if (le != null && le(u)) + return h(u, c, m); + if (v === Date) + return r(u, c, m); + if (v === RegExp) + return o(u, c, m); + if (v === Map) + return s(u, c, m); + if (v === Set) + return a(u, c, m); + var b = Ft(u); + return b === Dt ? r(u, c, m) : b === zt ? o(u, c, m) : b === kt ? s(u, c, m) : b === Jt ? a(u, c, m) : b === qt ? typeof u.then != "function" && typeof c.then != "function" && n(u, c, m) : b === Rt ? n(u, c, m) : b === Mt || b === Vt || b === Gt ? i(u, c, m) : !1; + }; +} +function Xt(t) { + var e = t.circular, r = t.createCustomConfig, s = t.strict, n = { + areArraysEqual: s ? x : It, + areDatesEqual: At, + areMapsEqual: s ? se(ae, x) : ae, + areObjectsEqual: s ? x : Tt, + arePrimitiveWrappersEqual: Pt, + areRegExpsEqual: Bt, + areSetsEqual: s ? se(ue, x) : ue, + areTypedArraysEqual: s ? x : xt + }; + if (r && (n = ce({}, n, r(n))), e) { + var i = D(n.areArraysEqual), o = D(n.areMapsEqual), a = D(n.areObjectsEqual), h = D(n.areSetsEqual); + n = ce({}, n, { + areArraysEqual: i, + areMapsEqual: o, + areObjectsEqual: a, + areSetsEqual: h + }); + } + return n; +} +function Ht(t) { + return function(e, r, s, n, i, o, a) { + return t(e, r, a); + }; +} +function Lt(t) { + var e = t.circular, r = t.comparator, s = t.createState, n = t.equals, i = t.strict; + if (s) + return function(h, p) { + var u = s(), c = u.cache, m = c === void 0 ? e ? /* @__PURE__ */ new WeakMap() : void 0 : c, v = u.meta; + return r(h, p, { + cache: m, + equals: n, + meta: v, + strict: i + }); + }; + if (e) + return function(h, p) { + return r(h, p, { + cache: /* @__PURE__ */ new WeakMap(), + equals: n, + meta: void 0, + strict: i + }); + }; + var o = { + cache: void 0, + equals: n, + meta: void 0, + strict: i + }; + return function(h, p) { + return r(h, p, o); + }; +} +var Ut = O(); +O({ strict: !0 }); +O({ circular: !0 }); +O({ + circular: !0, + strict: !0 +}); +O({ + createInternalComparator: function() { + return T; + } +}); +O({ + strict: !0, + createInternalComparator: function() { + return T; + } +}); +O({ + circular: !0, + createInternalComparator: function() { + return T; + } +}); +O({ + circular: !0, + createInternalComparator: function() { + return T; + }, + strict: !0 +}); +function O(t) { + t === void 0 && (t = {}); + var e = t.circular, r = e === void 0 ? !1 : e, s = t.createInternalComparator, n = t.createState, i = t.strict, o = i === void 0 ? !1 : i, a = Xt(t), h = Kt(a), p = s ? s(h) : Ht(h); + return Lt({ circular: r, comparator: h, createState: n, equals: p, strict: o }); +} +function Wt(t, e) { + return Ut(t, e); +} +function Zt(t, e) { + if (typeof t != typeof e) return !1; + if (!t && !e) return !0; + if (Array.isArray(t)) { + const i = e, o = t; + return i.length === 0 ? !0 : i.every((a) => o.includes(a)); + } + if (typeof t != "object") + return Wt(t, e); + const r = e, s = t; + let n = !0; + return Object.keys(r).forEach((i) => { + n && (Object.hasOwn(s, i) && Zt(s[i], r[i]) || (n = !1)); + }), n; +} +function fe(t, e, r) { + return JSON.stringify(t, (n, i) => { + let o = i; + return e && (o = e(n, o)), o === void 0 && (o = null), o; + }, r); +} +function Yt(t, e) { + function r(n) { + return Object.keys(n).forEach((i) => { + n[i] === null ? n[i] = void 0 : typeof n[i] == "object" && (n[i] = r(n[i])); + }), n; + } + const s = JSON.parse(t, e); + if (s !== null) + return typeof s == "object" ? r(s) : s; +} +function zr(t) { + try { + const e = fe(t); + return e === fe(Yt(e)); + } catch { + return !1; + } +} +const Jr = (t) => t.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\//g, "/"); +function Gr() { + return typeof navigator < "u" && navigator.languages ? navigator.languages[0] : new Me().resolvedOptions().locale; +} +function _r(t, e = 2) { + if (t === 0) return "0 Bytes"; + const r = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], s = Math.floor(Math.log(t) / Math.log(1024)), n = r[s]; + return `${new Fe("en", { + style: "decimal", + maximumFractionDigits: e, + minimumFractionDigits: 0 + }).format(t / 1024 ** s)} ${n}`; +} +const K = { + projectSettingsContribution: { + description: "The data an extension provides to inform Platform.Bible of the project settings it provides", + anyOf: [ + { + $ref: "#/$defs/projectSettingsGroup" + }, + { + type: "array", + items: { + $ref: "#/$defs/projectSettingsGroup" + } + } + ] + }, + projectSettingsGroup: { + description: "Group of related settings definitions", + type: "object", + properties: { + label: { + description: "localizeKey that displays in the project settings dialog as the group name", + $ref: "#/$defs/localizeKey" + }, + description: { + description: "localizeKey that displays in the project settings dialog to describe the group", + $ref: "#/$defs/localizeKey" + }, + properties: { + $ref: "#/$defs/projectSettingProperties" + } + }, + required: ["label", "properties"] + }, + projectSettingProperties: { + description: "Object whose keys are setting IDs and whose values are settings objects", + type: "object", + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: "#/$defs/projectSetting" + } + }, + additionalProperties: !1 + }, + projectSetting: { + description: "A description of an extension's setting entry", + anyOf: [ + { + $ref: "#/$defs/extensionControlledProjectSetting" + } + ] + }, + extensionControlledProjectSetting: { + description: "Setting definition that is validated by the extension.", + allOf: [ + { + $ref: "#/$defs/projectSettingBase" + }, + { + $ref: "#/$defs/modifierExtensionControlled" + } + ] + }, + projectSettingBase: { + description: "Base information needed to describe a project setting entry", + allOf: [ + { + $ref: "#/$defs/settingBase" + }, + { + $ref: "#/$defs/modifierProject" + } + ] + }, + modifierProject: { + description: "Modifies setting type to be project setting", + type: "object", + properties: { + includeProjectInterfaces: { + description: "String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should be included.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to pass):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to all {@link ProjectInterfaces}, so all projects that do not match `excludeProjectInterfaces` will be included\n\n@example\n\n```typescript\nincludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed on projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.", + anyOf: [ + { + type: "null" + }, + { + type: "string" + }, + { + type: "array", + items: { + anyOf: [ + { + type: "string" + }, + { + type: "array", + items: { type: "string" } + } + ] + } + } + ] + }, + excludeProjectInterfaces: { + description: "String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to exclude the project):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition and exclude the project\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition and exclude the project\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` will be included\n\n@example\n\n```typescript\nexcludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed and exclude projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.", + anyOf: [ + { + type: "null" + }, + { + type: "string" + }, + { + type: "array", + items: { + anyOf: [ + { + type: "string" + }, + { + type: "array", + items: { type: "string" } + } + ] + } + } + ] + }, + includePdpFactoryIds: { + description: "String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should be included.\n\nDefaults to all Project Data Provider Factory Ids, so all projects that do not match `excludePdpFactoryIds` will be included", + anyOf: [ + { + type: "null" + }, + { + type: "string" + }, + { + type: "array", + items: { type: "string" } + } + ] + }, + excludePdpFactoryIds: { + description: "String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nDefaults to none, so all projects that match `includePdpFactoryIds` will be included", + anyOf: [ + { + type: "null" + }, + { + type: "string" + }, + { + type: "array", + items: { type: "string" } + } + ] + } + } + }, + settingsContribution: { + description: "The data an extension provides to inform Platform.Bible of the settings it provides", + anyOf: [ + { + $ref: "#/$defs/settingsGroup" + }, + { + type: "array", + items: { + $ref: "#/$defs/settingsGroup" + } + } + ] + }, + settingsGroup: { + description: "Group of related settings definitions", + type: "object", + properties: { + label: { + description: "localizeKey that displays in the settings dialog as the group name", + $ref: "#/$defs/localizeKey" + }, + description: { + description: "localizeKey that displays in the settings dialog to describe the group", + $ref: "#/$defs/localizeKey" + }, + properties: { + $ref: "#/$defs/settingProperties" + } + }, + required: ["label", "properties"] + }, + settingProperties: { + description: "Object whose keys are setting IDs and whose values are settings objects", + type: "object", + patternProperties: { + "^[\\w-]+\\.[\\w-]+$": { + $ref: "#/$defs/setting" + } + }, + additionalProperties: !1 + }, + setting: { + description: "A description of an extension's setting entry", + anyOf: [ + { + $ref: "#/$defs/extensionControlledSetting" + } + ] + }, + extensionControlledSetting: { + description: "Setting definition that is validated by the extension.", + allOf: [ + { + $ref: "#/$defs/settingBase" + }, + { + $ref: "#/$defs/modifierExtensionControlled" + } + ] + }, + settingBase: { + description: "Base information needed to describe a setting entry", + allOf: [ + { + $ref: "#/$defs/stateBase" + }, + { + type: "object", + properties: { + label: { + description: "localizeKey that displays in the settings dialog as the setting name", + $ref: "#/$defs/localizeKey" + }, + description: { + description: "localizeKey that displays in the settings dialog to describe the setting", + $ref: "#/$defs/localizeKey" + } + }, + required: ["label"] + } + ] + }, + projectStateContribution: { + description: "The data an extension provides to inform Platform.Bible of the project state it provides", + $ref: "#/$defs/userStateProperties" + }, + userStateContribution: { + description: "The data an extension provides to inform Platform.Bible of the user state it provides", + $ref: "#/$defs/userStateProperties" + }, + userStateProperties: { + description: "Object whose keys are state IDs and whose values are state objects", + type: "object", + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: "#/$defs/userState" + } + }, + additionalProperties: !1 + }, + userState: { + description: "A description of an extension's user state entry", + anyOf: [ + { + $ref: "#/$defs/extensionControlledState" + } + ] + }, + extensionControlledState: { + description: "State definition that is validated by the extension.", + allOf: [ + { + $ref: "#/$defs/stateBase" + }, + { + $ref: "#/$defs/modifierExtensionControlled" + } + ] + }, + modifierExtensionControlled: { + description: 'Modifies state/setting type to be extension-controlled. "Extension-controlled" means the extension provides the component and the validator for the state/setting, so the state/setting is controlled by the extension.', + not: { + anyOf: [ + { + type: "object", + required: ["platformType"] + }, + { + type: "object", + required: ["type"] + } + ] + } + }, + stateBase: { + description: "Base information needed to describe a state entry", + type: "object", + properties: { + default: { + description: "default value for the state/setting", + type: "any" + }, + derivesFrom: { + description: "a state/setting ID whose value to set to this state/setting's starting value the first time this state/setting is loaded", + $ref: "#/$defs/id" + } + }, + required: ["default"] + }, + localizeKey: { + description: "Identifier for a string that will be localized based on the user's UI language", + type: "string", + pattern: "^%[\\w\\-\\.]+%$", + tsType: "LocalizeKey" + }, + id: { + description: "", + type: "string", + pattern: "^[\\w\\-]+\\.[\\w\\-]+$", + tsType: "Id" + } +}; +function X(t) { + t && Object.values(t).forEach((e) => { + if (e.type) { + if ("tsType" in e && delete e.tsType, e.type === "any") { + delete e.type; + return; + } + e.type === "object" && X(e.properties); + } + }); +} +X(K); +const Qt = { + $schema: "https://json-schema.org/draft/2020-12/schema", + title: "Project Settings Contribution", + description: "The data an extension provides to inform Platform.Bible of the project settings it provides", + anyOf: [ + { + $ref: "#/$defs/projectSettingsGroup" + }, + { + type: "array", + items: { + $ref: "#/$defs/projectSettingsGroup" + } + } + ], + $defs: K +}; +Object.freeze(Qt); +const er = { + $schema: "https://json-schema.org/draft/2020-12/schema", + title: "Settings Contribution", + description: "The data an extension provides to inform Platform.Bible of the settings it provides", + anyOf: [ + { + $ref: "#/$defs/settingsGroup" + }, + { + type: "array", + items: { + $ref: "#/$defs/settingsGroup" + } + } + ], + $defs: K +}; +Object.freeze(er); +const je = { + languageStrings: { + description: "Map whose keys are localized string keys and whose values provide information about how to localize strings for the localized string key", + type: "object", + patternProperties: { + "^%[\\w\\-\\.]+%$": { + $ref: "#/$defs/localizedStringValue" + } + }, + additionalProperties: !1 + }, + localizedStringValue: { + description: "Localized string value associated with this key", + type: "string" + }, + stringsMetadata: { + description: "Map whose keys are localized string keys and whose values provide additional non-locale-specific information about the localized string key", + type: "object", + patternProperties: { + "^%[\\w\\-\\.]+%$": { + $ref: "#/$defs/stringMetadata" + } + }, + additionalProperties: !1 + }, + stringMetadata: { + description: "Additional non-locale-specific information about a localized string key", + type: "object", + properties: { + fallbackKey: { + description: "Localized string key from which to get this value if one does not exist in the specified language. If a new key/value pair needs to be made to replace an existing one, this could help smooth over the transition if the meanings are close enough.\nYou can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a backslash `\\`.", + type: "string", + pattern: "^%[\\w\\-\\.;&,' (){}#:/\\\\?%⋮|[\\]“”‘’!~* +=•`…​↑↓]+%$", + tsType: "LocalizeKey" + }, + notes: { + description: "Additional information provided by developers in English to help the translator to know how to translate this localized string accurately", + type: "string" + } + } + }, + localizeKey: { + description: "Identifier for a string that will be localized based on the user's UI language", + type: "string", + pattern: "^%[\\w\\-\\.]+%$", + tsType: "LocalizeKey" + } +}; +X(je); +const tr = { + $schema: "https://json-schema.org/draft/2020-12/schema", + title: "Localized String Data Contribution", + description: "The data an extension provides to inform Platform.Bible of the localized strings it provides.", + type: "object", + properties: { + metadata: { + $ref: "#/$defs/stringsMetadata" + }, + localizedStrings: { + type: "object", + additionalProperties: { + $ref: "#/$defs/languageStrings" + } + } + }, + $defs: je +}; +Object.freeze(tr); +const rr = { + title: "Platform.Bible menus", + type: "object", + properties: { + mainMenu: { + description: "Top level menu for the application", + $ref: "#/$defs/multiColumnMenu" + }, + defaultWebViewTopMenu: { + description: "Default top menu for web views that don't specify their own", + $ref: "#/$defs/multiColumnMenu" + }, + defaultWebViewContextMenu: { + description: "Default context menu for web views that don't specify their own", + $ref: "#/$defs/singleColumnMenu" + }, + webViewMenus: { + description: "Menus that apply per web view in the application", + type: "object", + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + $ref: "#/$defs/menusForOneWebView" + } + }, + additionalProperties: !1 + } + }, + required: ["mainMenu", "defaultWebViewTopMenu", "defaultWebViewContextMenu", "webViewMenus"], + additionalProperties: !1, + $defs: { + localizeKey: { + description: "Identifier for a string that will be localized in a menu based on the user's UI language", + type: "string", + pattern: "^%[\\w\\-\\.]+%$" + }, + referencedItem: { + description: "Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)", + type: "string", + pattern: "^[\\w\\-]+\\.[\\w\\-]+$" + }, + columnsWithHeaders: { + description: "Group of columns that can be combined with other columns to form a multi-column menu", + type: "object", + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + description: "Single column with a header string", + type: "object", + properties: { + label: { + description: "Header text for this this column in the UI", + $ref: "#/$defs/localizeKey" + }, + localizeNotes: { + description: "Additional information provided by developers to help people who perform localization", + type: "string" + }, + order: { + description: "Relative order of this column compared to other columns (sorted ascending)", + type: "number" + }, + isExtensible: { + description: "Defines whether contributions are allowed to add menu groups to this column", + type: "boolean" + } + }, + required: ["label", "order"], + additionalProperties: !1 + } + }, + properties: { + isExtensible: { + description: "Defines whether contributions are allowed to add columns to this multi-column menu", + type: "boolean" + } + } + }, + menuGroups: { + description: "Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.", + type: "object", + patternProperties: { + "^[\\w\\-]+\\.[\\w\\-]+$": { + description: "Single group that contains menu items", + type: "object", + oneOf: [ + { + properties: { + column: { + description: "Column where this group belongs, not required for single column menus", + $ref: "#/$defs/referencedItem" + }, + order: { + description: "Relative order of this group compared to other groups in the same column or submenu (sorted ascending)", + type: "number" + }, + isExtensible: { + description: "Defines whether contributions are allowed to add menu items to this menu group", + type: "boolean" + } + }, + required: ["order"], + additionalProperties: !1 + }, + { + properties: { + menuItem: { + description: "Menu item that anchors the submenu where this group belongs", + $ref: "#/$defs/referencedItem" + }, + order: { + description: "Relative order of this group compared to other groups in the same column or submenu (sorted ascending)", + type: "number" + }, + isExtensible: { + description: "Defines whether contributions are allowed to add menu items to this menu group", + type: "boolean" + } + }, + required: ["menuItem", "order"], + additionalProperties: !1 + } + ] + } + }, + additionalProperties: !1 + }, + menuItem: { + description: "Single item in a menu that can be clicked on to take an action or can be the parent of a submenu", + type: "object", + oneOf: [ + { + properties: { + id: { + description: "ID for this menu item that holds a submenu", + $ref: "#/$defs/referencedItem" + } + }, + required: ["id"] + }, + { + properties: { + command: { + description: "Name of the PAPI command to run when this menu item is selected.", + $ref: "#/$defs/referencedItem" + }, + iconPathBefore: { + description: "Uri path to the icon to display before the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`", + type: "string" + }, + iconPathAfter: { + description: "Uri path to the icon to display after the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`", + type: "string" + } + }, + required: ["command"] + } + ], + properties: { + label: { + description: "Key that represents the text of this menu item to display", + $ref: "#/$defs/localizeKey" + }, + tooltip: { + description: "Key that represents the text to display if a mouse pointer hovers over the menu item", + $ref: "#/$defs/localizeKey" + }, + searchTerms: { + description: "Key that represents additional words the platform should reference when users are searching for menu items", + $ref: "#/$defs/localizeKey" + }, + localizeNotes: { + description: "Additional information provided by developers to help people who perform localization", + type: "string" + }, + group: { + description: "Group to which this menu item belongs", + $ref: "#/$defs/referencedItem" + }, + order: { + description: "Relative order of this menu item compared to other menu items in the same group (sorted ascending)", + type: "number" + } + }, + required: ["label", "group", "order"], + unevaluatedProperties: !1 + }, + groupsAndItems: { + description: "Core schema for a column", + type: "object", + properties: { + groups: { + description: "Groups that belong in this menu", + $ref: "#/$defs/menuGroups" + }, + items: { + description: "List of menu items that belong in this menu", + type: "array", + items: { $ref: "#/$defs/menuItem" }, + uniqueItems: !0 + } + }, + required: ["groups", "items"] + }, + singleColumnMenu: { + description: "Menu that contains a column without a header", + type: "object", + allOf: [{ $ref: "#/$defs/groupsAndItems" }], + unevaluatedProperties: !1 + }, + multiColumnMenu: { + description: "Menu that can contain multiple columns with headers", + type: "object", + allOf: [ + { $ref: "#/$defs/groupsAndItems" }, + { + properties: { + columns: { + description: "Columns that belong in this menu", + $ref: "#/$defs/columnsWithHeaders" + } + }, + required: ["columns"] + } + ], + unevaluatedProperties: !1 + }, + menusForOneWebView: { + description: "Set of menus that are associated with a single tab", + type: "object", + properties: { + includeDefaults: { + description: "Indicates whether the platform default menus should be included for this webview", + type: "boolean" + }, + topMenu: { + description: "Menu that opens when you click on the top left corner of a tab", + $ref: "#/$defs/multiColumnMenu" + }, + contextMenu: { + description: "Menu that opens when you right click on the main body/area of a tab", + $ref: "#/$defs/singleColumnMenu" + } + }, + additionalProperties: !1 + } + } +}; +Object.freeze(rr); +export { + or as AsyncVariable, + ar as Collator, + Me as DateTimeFormat, + Je as DocumentCombiner, + vt as FIRST_SCR_BOOK_NUM, + wt as FIRST_SCR_CHAPTER_NUM, + Et as FIRST_SCR_VERSE_NUM, + Nt as LAST_SCR_BOOK_NUM, + _e as Mutex, + mr as MutexMap, + gr as NonValidatingDocumentCombiner, + Fe as NumberFormat, + De as PlatformEventEmitter, + br as UnsubscriberAsyncList, + qr as aggregateUnsubscriberAsyncs, + Vr as aggregateUnsubscribers, + vr as at, + I as charAt, + Nr as codePointAt, + Mr as compareScrRefs, + dr as createSyncProxyForAsyncObject, + lr as debounce, + R as deepClone, + Wt as deepEqual, + Yt as deserialize, + dt as endsWith, + we as ensureArray, + Ir as escapeStringRegexp, + _r as formatBytes, + wr as formatReplacementString, + kr as formatScrRef, + pr as getAllObjectFunctionNames, + St as getChaptersForBook, + Gr as getCurrentLocale, + fr as getErrorMessage, + Ot as getLocalizeKeyForScrollGroupId, + Dr as getLocalizeKeysForScrollGroupIds, + Rr as getLocalizedIdFromBookNumber, + cr as groupBy, + Jr as htmlEncode, + gt as includes, + M as indexOf, + Cr as isLocalizeKey, + zr as isSerializable, + ke as isString, + Zt as isSubset, + bt as lastIndexOf, + tr as localizedStringsDocumentSchema, + rr as menuDocumentSchema, + ur as newGuid, + Er as normalize, + Pr as offsetBook, + Br as offsetChapter, + xr as offsetVerse, + Sr as ordinalCompare, + Or as padEnd, + $r as padStart, + Qt as projectSettingsDocumentSchema, + re as scrRefToBBBCCCVVV, + fe as serialize, + er as settingsDocumentSchema, + jr as slice, + te as split, + Ee as startsWith, + g as stringLength, + w as substring, + yt as toArray, + Tr as transformAndEnsureRegExpArray, + Ar as transformAndEnsureRegExpRegExpArray, + ze as wait, + hr as waitForDuration +}; +//# sourceMappingURL=index.js.map diff --git a/lib/platform-bible-utils/dist/index.js.map b/lib/platform-bible-utils/dist/index.js.map new file mode 100644 index 0000000000..954f259cd0 --- /dev/null +++ b/lib/platform-bible-utils/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["../src/async-variable.ts","../src/intl-collator.ts","../src/intl-date-time-format.ts","../src/platform-event-emitter.model.ts","../src/util.ts","../src/document-combiner.ts","../src/mutex.ts","../src/mutex-map.ts","../src/non-validating-document-combiner.ts","../src/intl-number-format.ts","../src/unsubscriber-async-list.ts","../../../node_modules/@sillsdev/scripture/dist/index.es.js","../../../node_modules/char-regex/index.js","../../../node_modules/stringz/dist/index.js","../src/array-util.ts","../src/string-util.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/subset-checking.ts","../src/serialization.ts","../src/intl-util.ts","../src/number-utils.ts","../src/settings.model.ts","../src/localized-strings.model.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all. Defaults to 10000 ms\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected. Defaults to `false`\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected. Defaults to `false`\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Enables language-sensitive string comparison. Wraps Intl.Collator */\nexport default class Collator {\n private collator: Intl.Collator;\n\n constructor(locales?: string | string[], options?: Intl.CollatorOptions) {\n this.collator = new Intl.Collator(locales, options);\n }\n\n /**\n * Compares two strings according to the sort order of this Collator object\n *\n * @param string1 String to compare\n * @param string2 String to compare\n * @returns A number indicating how string1 and string2 compare to each other according to the\n * sort order of this Collator object. Negative value if string1 comes before string2. Positive\n * value if string1 comes after string2. 0 if they are considered equal.\n */\n compare(string1: string, string2: string): number {\n return this.collator.compare(string1, string2);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and collation options computed\n * during initialization of this collator object.\n *\n * @returns ResolvedCollatorOptions object\n */\n resolvedOptions(): Intl.ResolvedCollatorOptions {\n return this.collator.resolvedOptions();\n }\n}\n","/** Enables language-sensitive data and time formatting. Wraps Intl.DateTimeFormat */\nexport default class DateTimeFormat {\n private dateTimeFormatter: Intl.DateTimeFormat;\n\n constructor(locales?: string | string[], options?: Intl.DateTimeFormatOptions) {\n this.dateTimeFormatter = new Intl.DateTimeFormat(locales, options);\n }\n\n /**\n * Formats a date according to the locale and formatting option for this DateTimeFormat object\n *\n * @param date The date to format\n * @returns String representing the given date formatted according to the locale and formatting\n * options of this DateTimeFormat object\n */\n format(date: Date): string {\n return this.dateTimeFormatter.format(date);\n }\n\n /**\n * Formats a date range in the most concise way based on the locales and options provided when\n * instantiating this DateTimeFormat object\n *\n * @param startDate Date object representing start of the date range\n * @param endDate Date object representing the end of the date range\n * @returns String representing the given date range formatted according to the locale and\n * formatting options of this DateTimeFormat object\n */\n formatRange(startDate: Date, endDate: Date): string {\n return this.dateTimeFormatter.formatRange(startDate, endDate);\n }\n\n /**\n * Returns an array of locale-specific tokens representing each part of the formatted date range\n * produced by this DateTimeFormat object\n *\n * @param startDate Date object representing start of the date range\n * @param endDate Date object representing the end of the date range\n * @returns Array of DateTimeRangeFormatPart objects\n */\n formatRangeToParts(startDate: Date, endDate: Date): Intl.DateTimeRangeFormatPart[] {\n return this.dateTimeFormatter.formatRangeToParts(startDate, endDate);\n }\n\n /**\n * Allows locale-aware formatting of strings produced by this DateTimeFormat object\n *\n * @param date The date to format\n * @returns Array of DateTimeFormatPart objects\n */\n formatToParts(date: Date): Intl.DateTimeFormatPart[] {\n return this.dateTimeFormatter.formatToParts(date);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and date and time formatting options\n * computed during initialization of this DateTimeFormat object\n *\n * @returns ResolvedDateTimeFormatOptions object\n */\n resolvedOptions(): Intl.ResolvedDateTimeFormatOptions {\n return this.dateTimeFormatter.resolvedOptions();\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n // Clone the subscriptions array before iterating over the callbacks so the callback index\n // doesn't get messed up if someone subscribes or unsubscribes inside one of the callbacks\n const emitCallbacks = [...(this.subscriptions ?? [])];\n emitCallbacks.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param _objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n // Leaving it here for debugging\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n // Too noisy - only reenable if you need more details\n // console.trace(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n // Too noisy - only reenable if you need more details\n // console.trace(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n\n/** Within type T, recursively change all properties to be optional */\nexport type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T;\n\n/** Within type T, recursively change properties that were of type A to be of type B */\nexport type ReplaceType = T extends A\n ? B\n : T extends object\n ? { [K in keyof T]: ReplaceType }\n : T;\n\n// Thanks to jcalz at https://stackoverflow.com/a/50375286\n/**\n * Converts a union type to an intersection type (`|` to `&`).\n *\n * Note: this utility type is for use on object types. It may fail on other types.\n *\n * @example\n *\n * ```typescript\n * type TypeOne = { one: string };\n * type TypeTwo = { two: number };\n * type TypeThree = { three: string };\n *\n * type TypeNums = { one: TypeOne; two: TypeTwo; three: TypeThree };\n * const numNames = ['one', 'two'] as const;\n * type TypeNumNames = typeof numNames;\n *\n * // Same as `TypeOne | TypeTwo`\n * // `{ one: string } | { two: number }`\n * type TypeOneTwoUnion = TypeNums[TypeNumNames[number]];\n *\n * // Same as `TypeOne & TypeTwo`\n * // `{ one: string; two: number }`\n * type TypeOneTwoIntersection = UnionToIntersection;\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UnionToIntersection = (U extends any ? (x: U) => void : never) extends (\n x: infer I,\n) => void\n ? I\n : never;\n","import PlatformEventEmitter from './platform-event-emitter.model';\nimport { deepClone } from './util';\n\ntype JsonObjectLike = { [key: string]: unknown };\ntype JsonArrayLike = unknown[];\n\nexport type JsonDocumentLike = JsonObjectLike | JsonArrayLike;\n\n/**\n * Options for DocumentCombiner objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (primarily in the form of JS objects\n * or arrays) together into a single output document.\n */\nexport default class DocumentCombiner {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n private readonly onDidRebuildEmitter = new PlatformEventEmitter();\n /** Event that emits to announce that the document has been rebuilt and the output has been updated */\n // Need `onDidRebuildEmitter` to be instantiated before this line\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly onDidRebuild = this.onDidRebuildEmitter.subscribe;\n\n /**\n * Create a DocumentCombiner instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateBaseDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n this.baseDocument = this.transformBaseDocumentAfterValidation(this.baseDocument);\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * Note: the order in which contribution documents are added can be considered to be indeterminate\n * as it is currently ordered by however `Map.forEach` provides the contributions. The order\n * matters when merging two arrays into one. Also, when `options.ignoreDuplicateProperties` is\n * `true`, the order also matters when adding the same property to an object that is already\n * provided previously. Please let us know if you have trouble because of indeterminate\n * contribution ordering.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n let documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n documentToSet = this.transformContributionAfterValidation(documentName, documentToSet);\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): JsonDocumentLike | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`${documentName} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete all present contribution documents for the composition process and return to the base\n * document\n *\n * @returns Recalculated output document consisting only of the base document\n */\n deleteAllContributions(): JsonDocumentLike | undefined {\n if (this.contributions.size <= 0) return this.latestOutput;\n\n // Save out all contributions\n const contributions = [...this.contributions.entries()];\n\n // Delete all contributions\n contributions.forEach(([contributionName]) => this.contributions.delete(contributionName));\n\n // Rebuild with no contributions\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting all contributions, put them back and rethrow\n contributions.forEach(([contributionName, document]) =>\n this.contributions.set(contributionName, document),\n );\n throw new Error(`Error when deleting all contributions: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutputBeforeValidation(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n this.onDidRebuildEmitter.emit(undefined);\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutputBeforeValidation(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n this.onDidRebuildEmitter.emit(undefined);\n return this.latestOutput;\n }\n\n /**\n * Transform the starting document that is given to the combiner. This transformation occurs after\n * validating the base document and before combining any contributions.\n *\n * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside\n * this method, this method will directly modify the `baseDocument` passed in.\n *\n * @param baseDocument Initial input document. Already validated via `validateBaseDocument`\n * @returns Transformed base document\n */\n // We just don't need `this` here. This is basically a no-op function that is available to child\n // classes to override\n // eslint-disable-next-line class-methods-use-this\n protected transformBaseDocumentAfterValidation(baseDocument: JsonDocumentLike): JsonDocumentLike {\n return baseDocument;\n }\n\n /**\n * Transform the contributed document associated with `documentName`. This transformation occurs\n * after validating the contributed document and before combining with other documents.\n *\n * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside\n * this method, this method will directly modify the contributed `document` passed in.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine. Already validated via\n * `validateContribution`\n * @returns Transformed contributed document\n */\n // We just don't need `this` here. This is basically a no-op function that is available to child\n // classes to override\n // eslint-disable-next-line class-methods-use-this\n protected transformContributionAfterValidation(\n // @ts-expect-error this parameter is unused but may be used in child classes\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike {\n return document;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateBaseDocument(baseDocument: JsonDocumentLike): void {}\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateContribution(documentName: string, document: JsonDocumentLike): void {}\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n // no-op intended to be overridden by child classes. Can't be static\n // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n protected validateOutput(output: JsonDocumentLike): void {}\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation via `validateOutput`\n * before `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n // no-op intended to be overridden by child classes. Can't be static\n // eslint-disable-next-line class-methods-use-this\n protected transformFinalOutputBeforeValidation(finalOutput: JsonDocumentLike): JsonDocumentLike {\n return finalOutput;\n }\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Deep clone and recursively merge the properties of one object (copyFrom) into another\n * (startingPoint). Throws if copyFrom would overwrite values already existing in startingPoint.\n *\n * Does not modify the objects passed in.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @param ignoreDuplicateProperties Whether to ignore object properties that are present in\n * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object\n * property in `copyFrom` is already present in `startingPoint`\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n\n if (!copyFrom) return retVal;\n\n return mergeObjectsInternal(retVal, deepClone(copyFrom), ignoreDuplicateProperties);\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * WARNING: Modifies the argument objects in some way. Recommended to use `mergeObjects`\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @param ignoreDuplicateProperties Whether to ignore object properties that are present in\n * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object\n * property in `copyFrom` is already present in `startingPoint`\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjectsInternal(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n if (!copyFrom) return startingPoint;\n\n if (areNonArrayObjects(startingPoint, copyFrom)) {\n // Merge properties since they are both objects\n\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n const startingPointObj = startingPoint as JsonObjectLike;\n const copyFromObj = copyFrom as JsonObjectLike;\n /* eslint-enable no-type-assertion/no-type-assertion */\n Object.keys(copyFromObj).forEach((key: string | number) => {\n if (Object.hasOwn(startingPointObj, key)) {\n if (areNonArrayObjects(startingPointObj[key], copyFromObj[key])) {\n startingPointObj[key] = mergeObjectsInternal(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPointObj[key] as JsonObjectLike,\n copyFromObj[key] as JsonObjectLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPointObj[key], copyFromObj[key])) {\n // Concat the arrays since they are both arrays\n\n // We know these are arrays from the `else if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPointObj[key] = (startingPointObj[key] as JsonArrayLike).concat(\n copyFromObj[key] as JsonArrayLike,\n );\n /* eslint-enable no-type-assertion/no-type-assertion */\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n // Note that the first non-object non-array value that gets placed in a property stays.\n // New values do not override existing ones\n } else {\n startingPointObj[key] = copyFromObj[key];\n }\n });\n } else if (areArrayObjects(startingPoint, copyFrom)) {\n // Concat the arrays since they are both arrays\n\n // Push the contents of copyFrom into startingPoint since it is a const and was already deep cloned\n // We know these are objects from the `else if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n (startingPoint as JsonArrayLike).push(...(copyFrom as JsonArrayLike));\n /* eslint-enable no-type-assertion/no-type-assertion */\n }\n\n // Note that nothing happens if `startingPoint` is not an object or an array or if `startingPoint`\n // and `copyFrom` are not both object or both arrays. Should we throw? Should we push `copyFrom`'s\n // values into the array? Other? Maybe one day we can add some options to decide what to do in\n // this situation, but YAGNI for now\n\n return startingPoint;\n}\n\n// #endregion\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import DocumentCombiner, { DocumentCombinerOptions, JsonDocumentLike } from './document-combiner';\n\nexport default class NonValidatingDocumentCombiner extends DocumentCombiner {\n // Making the protected base constructor public\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n super(baseDocument, options);\n }\n\n get output(): JsonDocumentLike | undefined {\n return this.latestOutput;\n }\n}\n","/** Enables language-sensitive number formatting. Wraps Intl.NumberFormat */\nexport default class NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n\n constructor(locales?: string | string[], options?: Intl.NumberFormatOptions) {\n this.numberFormatter = new Intl.NumberFormat(locales, options);\n }\n\n /**\n * Formats a number according to the locale and formatting options of this NumberFormat object\n *\n * @param value Number or BigInt to format\n * @returns String representing the given number formatted according to the locale and formatting\n * options of this NumberFormat object\n */\n format(value: number | bigint): string {\n return this.numberFormatter.format(value);\n }\n\n /**\n * Formats a range of numbers according to the locale and formatting options of this NumberFormat\n * object\n *\n * @param startRange Number or bigint representing the start of the range\n * @param endRange Number or bigint representing the end of the range\n * @returns String representing the given range of numbers formatted according to the locale and\n * formatting options of this NumberFormat object\n */\n formatRange(startRange: number | bigint, endRange: number | bigint): string {\n return this.numberFormatter.formatRange(startRange, endRange);\n }\n\n /**\n * Returns an array of objects containing the locale-specific tokens from which it is possible to\n * build custom strings while preserving the locale-specific parts.\n *\n * @param startRange Number or bigint representing start of the range\n * @param endRange Number or bigint representing end of the range\n * @returns Array of NumberRangeFormatPart objects containing the formatted range of numbers in\n * parts\n */\n formatRangeToParts(\n startRange: number | bigint,\n endRange: number | bigint,\n ): Intl.NumberRangeFormatPart[] {\n return this.numberFormatter.formatRangeToParts(startRange, endRange);\n }\n\n /**\n * Allows locale-aware formatting of strings produced by this NumberFormat object\n *\n * @param value Number or bigint to format\n * @returns Array of NumberFormatPart objects containing the formatted number in parts\n */\n formatToParts(value: number | bigint): Intl.NumberFormatPart[] {\n return this.numberFormatter.formatToParts(value);\n }\n\n /**\n * Returns a new object with properties reflecting the locale and number formatting options\n * computed during initialization of this NumberFormat object\n *\n * @returns ResolvedNumberFormatOptions object\n */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n return this.numberFormatter.resolvedOptions();\n }\n}\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","var P = Object.defineProperty;\nvar R = (t, e, s) => e in t ? P(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;\nvar n = (t, e, s) => R(t, typeof e != \"symbol\" ? e + \"\" : e, s);\nclass _ {\n constructor() {\n n(this, \"books\");\n n(this, \"firstSelectedBookNum\");\n n(this, \"lastSelectedBookNum\");\n n(this, \"count\");\n n(this, \"selectedBookNumbers\");\n n(this, \"selectedBookIds\");\n }\n}\nconst N = [\n \"GEN\",\n \"EXO\",\n \"LEV\",\n \"NUM\",\n \"DEU\",\n \"JOS\",\n \"JDG\",\n \"RUT\",\n \"1SA\",\n \"2SA\",\n // 10\n \"1KI\",\n \"2KI\",\n \"1CH\",\n \"2CH\",\n \"EZR\",\n \"NEH\",\n \"EST\",\n \"JOB\",\n \"PSA\",\n \"PRO\",\n // 20\n \"ECC\",\n \"SNG\",\n \"ISA\",\n \"JER\",\n \"LAM\",\n \"EZK\",\n \"DAN\",\n \"HOS\",\n \"JOL\",\n \"AMO\",\n // 30\n \"OBA\",\n \"JON\",\n \"MIC\",\n \"NAM\",\n \"HAB\",\n \"ZEP\",\n \"HAG\",\n \"ZEC\",\n \"MAL\",\n \"MAT\",\n // 40\n \"MRK\",\n \"LUK\",\n \"JHN\",\n \"ACT\",\n \"ROM\",\n \"1CO\",\n \"2CO\",\n \"GAL\",\n \"EPH\",\n \"PHP\",\n // 50\n \"COL\",\n \"1TH\",\n \"2TH\",\n \"1TI\",\n \"2TI\",\n \"TIT\",\n \"PHM\",\n \"HEB\",\n \"JAS\",\n \"1PE\",\n // 60\n \"2PE\",\n \"1JN\",\n \"2JN\",\n \"3JN\",\n \"JUD\",\n \"REV\",\n \"TOB\",\n \"JDT\",\n \"ESG\",\n \"WIS\",\n // 70\n \"SIR\",\n \"BAR\",\n \"LJE\",\n \"S3Y\",\n \"SUS\",\n \"BEL\",\n \"1MA\",\n \"2MA\",\n \"3MA\",\n \"4MA\",\n // 80\n \"1ES\",\n \"2ES\",\n \"MAN\",\n \"PS2\",\n \"ODA\",\n \"PSS\",\n \"JSA\",\n // actual variant text for JOS, now in LXA text\n \"JDB\",\n // actual variant text for JDG, now in LXA text\n \"TBS\",\n // actual variant text for TOB, now in LXA text\n \"SST\",\n // actual variant text for SUS, now in LXA text // 90\n \"DNT\",\n // actual variant text for DAN, now in LXA text\n \"BLT\",\n // actual variant text for BEL, now in LXA text\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n // 100\n \"BAK\",\n \"OTH\",\n \"3ES\",\n // Used previously but really should be 2ES\n \"EZA\",\n // Used to be called 4ES, but not actually in any known project\n \"5EZ\",\n // Used to be called 5ES, but not actually in any known project\n \"6EZ\",\n // Used to be called 6ES, but not actually in any known project\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n // 110\n \"NDX\",\n \"DAG\",\n \"PS3\",\n \"2BA\",\n \"LBA\",\n \"JUB\",\n \"ENO\",\n \"1MQ\",\n \"2MQ\",\n \"3MQ\",\n // 120\n \"REP\",\n \"4BA\",\n \"LAO\"\n], B = [\n \"XXA\",\n \"XXB\",\n \"XXC\",\n \"XXD\",\n \"XXE\",\n \"XXF\",\n \"XXG\",\n \"FRT\",\n \"BAK\",\n \"OTH\",\n \"INT\",\n \"CNC\",\n \"GLO\",\n \"TDX\",\n \"NDX\"\n], O = [\n \"Genesis\",\n \"Exodus\",\n \"Leviticus\",\n \"Numbers\",\n \"Deuteronomy\",\n \"Joshua\",\n \"Judges\",\n \"Ruth\",\n \"1 Samuel\",\n \"2 Samuel\",\n \"1 Kings\",\n \"2 Kings\",\n \"1 Chronicles\",\n \"2 Chronicles\",\n \"Ezra\",\n \"Nehemiah\",\n \"Esther (Hebrew)\",\n \"Job\",\n \"Psalms\",\n \"Proverbs\",\n \"Ecclesiastes\",\n \"Song of Songs\",\n \"Isaiah\",\n \"Jeremiah\",\n \"Lamentations\",\n \"Ezekiel\",\n \"Daniel (Hebrew)\",\n \"Hosea\",\n \"Joel\",\n \"Amos\",\n \"Obadiah\",\n \"Jonah\",\n \"Micah\",\n \"Nahum\",\n \"Habakkuk\",\n \"Zephaniah\",\n \"Haggai\",\n \"Zechariah\",\n \"Malachi\",\n \"Matthew\",\n \"Mark\",\n \"Luke\",\n \"John\",\n \"Acts\",\n \"Romans\",\n \"1 Corinthians\",\n \"2 Corinthians\",\n \"Galatians\",\n \"Ephesians\",\n \"Philippians\",\n \"Colossians\",\n \"1 Thessalonians\",\n \"2 Thessalonians\",\n \"1 Timothy\",\n \"2 Timothy\",\n \"Titus\",\n \"Philemon\",\n \"Hebrews\",\n \"James\",\n \"1 Peter\",\n \"2 Peter\",\n \"1 John\",\n \"2 John\",\n \"3 John\",\n \"Jude\",\n \"Revelation\",\n \"Tobit\",\n \"Judith\",\n \"Esther Greek\",\n \"Wisdom of Solomon\",\n \"Sirach (Ecclesiasticus)\",\n \"Baruch\",\n \"Letter of Jeremiah\",\n \"Song of 3 Young Men\",\n \"Susanna\",\n \"Bel and the Dragon\",\n \"1 Maccabees\",\n \"2 Maccabees\",\n \"3 Maccabees\",\n \"4 Maccabees\",\n \"1 Esdras (Greek)\",\n \"2 Esdras (Latin)\",\n \"Prayer of Manasseh\",\n \"Psalm 151\",\n \"Odes\",\n \"Psalms of Solomon\",\n // WARNING, if you change the spelling of the *obsolete* tag be sure to update\n // IsObsolete routine\n \"Joshua A. *obsolete*\",\n \"Judges B. *obsolete*\",\n \"Tobit S. *obsolete*\",\n \"Susanna Th. *obsolete*\",\n \"Daniel Th. *obsolete*\",\n \"Bel Th. *obsolete*\",\n \"Extra A\",\n \"Extra B\",\n \"Extra C\",\n \"Extra D\",\n \"Extra E\",\n \"Extra F\",\n \"Extra G\",\n \"Front Matter\",\n \"Back Matter\",\n \"Other Matter\",\n \"3 Ezra *obsolete*\",\n \"Apocalypse of Ezra\",\n \"5 Ezra (Latin Prologue)\",\n \"6 Ezra (Latin Epilogue)\",\n \"Introduction\",\n \"Concordance \",\n \"Glossary \",\n \"Topical Index\",\n \"Names Index\",\n \"Daniel Greek\",\n \"Psalms 152-155\",\n \"2 Baruch (Apocalypse)\",\n \"Letter of Baruch\",\n \"Jubilees\",\n \"Enoch\",\n \"1 Meqabyan\",\n \"2 Meqabyan\",\n \"3 Meqabyan\",\n \"Reproof (Proverbs 25-31)\",\n \"4 Baruch (Rest of Baruch)\",\n \"Laodiceans\"\n], S = K();\nfunction g(t, e = !0) {\n return e && (t = t.toUpperCase()), t in S ? S[t] : 0;\n}\nfunction k(t) {\n return g(t) > 0;\n}\nfunction x(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return e >= 40 && e <= 66;\n}\nfunction T(t) {\n return (typeof t == \"string\" ? g(t) : t) <= 39;\n}\nfunction X(t) {\n return t <= 66;\n}\nfunction V(t) {\n const e = typeof t == \"string\" ? g(t) : t;\n return w(e) && !X(e);\n}\nfunction* L() {\n for (let t = 1; t <= N.length; t++) yield t;\n}\nconst G = 1, A = N.length;\nfunction H() {\n return [\"XXA\", \"XXB\", \"XXC\", \"XXD\", \"XXE\", \"XXF\", \"XXG\"];\n}\nfunction C(t, e = \"***\") {\n const s = t - 1;\n return s < 0 || s >= N.length ? e : N[s];\n}\nfunction I(t) {\n return t <= 0 || t > A ? \"******\" : O[t - 1];\n}\nfunction y(t) {\n return I(g(t));\n}\nfunction w(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && !B.includes(e);\n}\nfunction q(t) {\n const e = typeof t == \"number\" ? C(t) : t;\n return k(e) && B.includes(e);\n}\nfunction U(t) {\n return O[t - 1].includes(\"*obsolete*\");\n}\nfunction K() {\n const t = {};\n for (let e = 0; e < N.length; e++)\n t[N[e]] = e + 1;\n return t;\n}\nconst m = {\n allBookIds: N,\n nonCanonicalIds: B,\n bookIdToNumber: g,\n isBookIdValid: k,\n isBookNT: x,\n isBookOT: T,\n isBookOTNT: X,\n isBookDC: V,\n allBookNumbers: L,\n firstBook: G,\n lastBook: A,\n extraBooks: H,\n bookNumberToId: C,\n bookNumberToEnglishName: I,\n bookIdToEnglishName: y,\n isCanonical: w,\n isExtraMaterial: q,\n isObsolete: U\n};\nvar l = /* @__PURE__ */ ((t) => (t[t.Unknown = 0] = \"Unknown\", t[t.Original = 1] = \"Original\", t[t.Septuagint = 2] = \"Septuagint\", t[t.Vulgate = 3] = \"Vulgate\", t[t.English = 4] = \"English\", t[t.RussianProtestant = 5] = \"RussianProtestant\", t[t.RussianOrthodox = 6] = \"RussianOrthodox\", t))(l || {});\nconst h = class h {\n // private versInfo: Versification;\n constructor(e) {\n n(this, \"name\");\n n(this, \"fullPath\");\n n(this, \"isPresent\");\n n(this, \"hasVerseSegments\");\n n(this, \"isCustomized\");\n n(this, \"baseVersification\");\n n(this, \"scriptureBooks\");\n n(this, \"_type\");\n if (e == null)\n throw new Error(\"Argument undefined\");\n typeof e == \"string\" ? (this.name = e, this._type = l[e]) : (this._type = e, this.name = l[e]);\n }\n get type() {\n return this._type;\n }\n equals(e) {\n return !e.type || !this.type ? !1 : e.type === this.type;\n }\n};\nn(h, \"Original\", new h(l.Original)), n(h, \"Septuagint\", new h(l.Septuagint)), n(h, \"Vulgate\", new h(l.Vulgate)), n(h, \"English\", new h(l.English)), n(h, \"RussianProtestant\", new h(l.RussianProtestant)), n(h, \"RussianOrthodox\", new h(l.RussianOrthodox));\nlet c = h;\nfunction E(t, e) {\n const s = e[0];\n for (let r = 1; r < e.length; r++)\n t = t.split(e[r]).join(s);\n return t.split(s);\n}\nvar D = /* @__PURE__ */ ((t) => (t[t.Valid = 0] = \"Valid\", t[t.UnknownVersification = 1] = \"UnknownVersification\", t[t.OutOfRange = 2] = \"OutOfRange\", t[t.VerseOutOfOrder = 3] = \"VerseOutOfOrder\", t[t.VerseRepeated = 4] = \"VerseRepeated\", t))(D || {});\nconst i = class i {\n constructor(e, s, r, a) {\n /** Not yet implemented. */\n n(this, \"firstChapter\");\n /** Not yet implemented. */\n n(this, \"lastChapter\");\n /** Not yet implemented. */\n n(this, \"lastVerse\");\n /** Not yet implemented. */\n n(this, \"hasSegmentsDefined\");\n /** Not yet implemented. */\n n(this, \"text\");\n /** Not yet implemented. */\n n(this, \"BBBCCCVVVS\");\n /** Not yet implemented. */\n n(this, \"longHashCode\");\n /** The versification of the reference. */\n n(this, \"versification\");\n n(this, \"rtlMark\", \"‏\");\n n(this, \"_bookNum\", 0);\n n(this, \"_chapterNum\", 0);\n n(this, \"_verseNum\", 0);\n n(this, \"_verse\");\n if (r == null && a == null)\n if (e != null && typeof e == \"string\") {\n const o = e, u = s != null && s instanceof c ? s : void 0;\n this.setEmpty(u), this.parse(o);\n } else if (e != null && typeof e == \"number\") {\n const o = s != null && s instanceof c ? s : void 0;\n this.setEmpty(o), this._verseNum = e % i.chapterDigitShifter, this._chapterNum = Math.floor(\n e % i.bookDigitShifter / i.chapterDigitShifter\n ), this._bookNum = Math.floor(e / i.bookDigitShifter);\n } else if (s == null)\n if (e != null && e instanceof i) {\n const o = e;\n this._bookNum = o.bookNum, this._chapterNum = o.chapterNum, this._verseNum = o.verseNum, this._verse = o.verse, this.versification = o.versification;\n } else {\n if (e == null) return;\n const o = e instanceof c ? e : i.defaultVersification;\n this.setEmpty(o);\n }\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else if (e != null && s != null && r != null)\n if (typeof e == \"string\" && typeof s == \"string\" && typeof r == \"string\")\n this.setEmpty(a), this.updateInternal(e, s, r);\n else if (typeof e == \"number\" && typeof s == \"number\" && typeof r == \"number\")\n this._bookNum = e, this._chapterNum = s, this._verseNum = r, this.versification = a ?? i.defaultVersification;\n else\n throw new Error(\"VerseRef constructor not supported.\");\n else\n throw new Error(\"VerseRef constructor not supported.\");\n }\n /**\n * Determines if the verse string is in a valid format (does not consider versification).\n */\n static isVerseParseable(e) {\n return e.length > 0 && \"0123456789\".includes(e[0]) && !e.endsWith(this.verseRangeSeparator) && !e.endsWith(this.verseSequenceIndicator);\n }\n /**\n * Tries to parse the specified string into a verse reference.\n * @param str - The string to attempt to parse.\n * @returns success: `true` if the specified string was successfully parsed, `false` otherwise.\n * @returns verseRef: The result of the parse if successful, or empty VerseRef if it failed\n */\n static tryParse(e) {\n let s;\n try {\n return s = new i(e), { success: !0, verseRef: s };\n } catch (r) {\n if (r instanceof v)\n return s = new i(), { success: !1, verseRef: s };\n throw r;\n }\n }\n /**\n * Gets the reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n * @param bookNum - Book number (this is 1-based, not an index).\n * @param chapterNum - Chapter number.\n * @param verseNum - Verse number.\n * @returns The reference as a comparable integer where the book, chapter, and verse each occupy 3\n * digits.\n */\n static getBBBCCCVVV(e, s, r) {\n return e % i.bcvMaxValue * i.bookDigitShifter + (s >= 0 ? s % i.bcvMaxValue * i.chapterDigitShifter : 0) + (r >= 0 ? r % i.bcvMaxValue : 0);\n }\n /**\n * Deserializes a serialized VerseRef.\n * @param serializedVerseRef - Serialized VerseRef to create from.\n * @returns the deserialized VerseRef.\n */\n static fromJSON(e) {\n const { book: s, chapterNum: r, verseNum: a, verse: o, versificationStr: u } = e, f = o || a.toString();\n let d;\n return u && (d = new c(u)), s ? new i(s, r.toString(), f, d) : new i();\n }\n /**\n * Parses a verse string and gets the leading numeric portion as a number.\n * @param verseStr - verse string to parse\n * @returns true if the entire string could be parsed as a single, simple verse number (1-999);\n * false if the verse string represented a verse bridge, contained segment letters, or was invalid\n */\n static tryGetVerseNum(e) {\n let s;\n if (!e)\n return s = -1, { success: !0, vNum: s };\n s = 0;\n let r;\n for (let a = 0; a < e.length; a++) {\n if (r = e[a], r < \"0\" || r > \"9\")\n return a === 0 && (s = -1), { success: !1, vNum: s };\n if (s = s * 10 + +r - 0, s > i.bcvMaxValue)\n return s = -1, { success: !1, vNum: s };\n }\n return { success: !0, vNum: s };\n }\n /**\n * Checks to see if a VerseRef hasn't been set - all values are the default.\n */\n get isDefault() {\n return this.bookNum === 0 && this.chapterNum === 0 && this.verseNum === 0 && this.versification == null;\n }\n /**\n * Gets whether the verse contains multiple verses.\n */\n get hasMultiple() {\n return this._verse != null && (this._verse.includes(i.verseRangeSeparator) || this._verse.includes(i.verseSequenceIndicator));\n }\n /**\n * Gets or sets the book of the reference. Book is the 3-letter abbreviation in capital letters,\n * e.g. `'MAT'`.\n */\n get book() {\n return m.bookNumberToId(this.bookNum, \"\");\n }\n set book(e) {\n this.bookNum = m.bookIdToNumber(e);\n }\n /**\n * Gets or sets the chapter of the reference,. e.g. `'3'`.\n */\n get chapter() {\n return this.isDefault || this._chapterNum < 0 ? \"\" : this._chapterNum.toString();\n }\n set chapter(e) {\n const s = +e;\n this._chapterNum = Number.isInteger(s) ? s : -1;\n }\n /**\n * Gets or sets the verse of the reference, including range, segments, and sequences, e.g. `'4'`,\n * or `'4b-5a, 7'`.\n */\n get verse() {\n return this._verse != null ? this._verse : this.isDefault || this._verseNum < 0 ? \"\" : this._verseNum.toString();\n }\n set verse(e) {\n const { success: s, vNum: r } = i.tryGetVerseNum(e);\n this._verse = s ? void 0 : e.replace(this.rtlMark, \"\"), this._verseNum = r, !(this._verseNum >= 0) && ({ vNum: this._verseNum } = i.tryGetVerseNum(this._verse));\n }\n /**\n * Get or set Book based on book number, e.g. `42`.\n */\n get bookNum() {\n return this._bookNum;\n }\n set bookNum(e) {\n if (e <= 0 || e > m.lastBook)\n throw new v(\n \"BookNum must be greater than zero and less than or equal to last book\"\n );\n this._bookNum = e;\n }\n /**\n * Gets or sets the chapter number, e.g. `3`. `-1` if not valid.\n */\n get chapterNum() {\n return this._chapterNum;\n }\n set chapterNum(e) {\n this.chapterNum = e;\n }\n /**\n * Gets or sets verse start number, e.g. `4`. `-1` if not valid.\n */\n get verseNum() {\n return this._verseNum;\n }\n set verseNum(e) {\n this._verseNum = e;\n }\n /**\n * String representing the versification (should ONLY be used for serialization/deserialization).\n *\n * @remarks This is for backwards compatibility when ScrVers was an enumeration.\n */\n get versificationStr() {\n var e;\n return (e = this.versification) == null ? void 0 : e.name;\n }\n set versificationStr(e) {\n this.versification = this.versification != null ? new c(e) : void 0;\n }\n /**\n * Determines if the reference is valid.\n */\n get valid() {\n return this.validStatus === 0;\n }\n /**\n * Get the valid status for this reference.\n */\n get validStatus() {\n return this.validateVerse(i.verseRangeSeparators, i.verseSequenceIndicators);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits and the verse is 0.\n */\n get BBBCCC() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, 0);\n }\n /**\n * Gets the reference as a comparable integer where the book,\n * chapter, and verse each occupy three digits. If verse is not null\n * (i.e., this reference represents a complex reference with verse\n * segments or bridge) this cannot be used for an exact comparison.\n */\n get BBBCCCVVV() {\n return i.getBBBCCCVVV(this._bookNum, this._chapterNum, this._verseNum);\n }\n /**\n * Gets whether the verse is defined as an excluded verse in the versification.\n * Does not handle verse ranges.\n */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n get isExcluded() {\n return !1;\n }\n /**\n * Parses the reference in the specified string.\n * Optionally versification can follow reference as in GEN 3:11/4\n * Throw an exception if\n * - invalid book name\n * - chapter number is missing or not a number\n * - verse number is missing or does not start with a number\n * - versification is invalid\n * @param verseStr - string to parse e.g. 'MAT 3:11'\n */\n parse(e) {\n if (e = e.replace(this.rtlMark, \"\"), e.includes(\"/\")) {\n const o = e.split(\"/\");\n if (e = o[0], o.length > 1)\n try {\n const u = +o[1].trim();\n this.versification = new c(l[u]);\n } catch {\n throw new v(\"Invalid reference : \" + e);\n }\n }\n const s = e.trim().split(\" \");\n if (s.length !== 2)\n throw new v(\"Invalid reference : \" + e);\n const r = s[1].split(\":\"), a = +r[0];\n if (r.length !== 2 || m.bookIdToNumber(s[0]) === 0 || !Number.isInteger(a) || a < 0 || !i.isVerseParseable(r[1]))\n throw new v(\"Invalid reference : \" + e);\n this.updateInternal(s[0], r[0], r[1]);\n }\n /**\n * Simplifies this verse ref so that it has no bridging of verses or\n * verse segments like `'1a'`.\n */\n simplify() {\n this._verse = void 0;\n }\n /**\n * Makes a clone of the reference.\n *\n * @returns The cloned VerseRef.\n */\n clone() {\n return new i(this);\n }\n toString() {\n const e = this.book;\n return e === \"\" ? \"\" : `${e} ${this.chapter}:${this.verse}`;\n }\n toJSON() {\n let e = this.verse;\n (e === \"\" || e === this.verseNum.toString()) && (e = void 0);\n const s = {\n book: this.book,\n chapterNum: this.chapterNum,\n verseNum: this.verseNum,\n verse: e,\n versificationStr: this.versificationStr\n };\n return e || delete s.verse, s;\n }\n /**\n * Compares this `VerseRef` with supplied one.\n * @param verseRef - object to compare this one to.\n * @returns `true` if this `VerseRef` is equal to the supplied one, `false` otherwise.\n */\n equals(e) {\n return e instanceof i ? e._bookNum === this._bookNum && e._chapterNum === this._chapterNum && e._verseNum === this._verseNum && e.verse === this.verse && (e.versification == null && this.versification == null || e.versification != null && this.versification != null && e.versification.equals(this.versification)) : !1;\n }\n /**\n * Enumerate all individual verses contained in a VerseRef.\n * Verse ranges are indicated by \"-\" and consecutive verses by \",\"s.\n * Examples:\n * GEN 1:2 returns GEN 1:2\n * GEN 1:1a-3b,5 returns GEN 1:1a, GEN 1:2, GEN 1:3b, GEN 1:5\n * GEN 1:2a-2c returns //! ??????\n *\n * @param specifiedVersesOnly - if set to true return only verses that are\n * explicitly specified only, not verses within a range. Defaults to `false`.\n * @param verseRangeSeparators - Verse range separators.\n * Defaults to `VerseRef.verseRangeSeparators`.\n * @param verseSequenceSeparators - Verse sequence separators.\n * Defaults to `VerseRef.verseSequenceIndicators`.\n * @returns An array of all single verse references in this VerseRef.\n */\n allVerses(e = !1, s = i.verseRangeSeparators, r = i.verseSequenceIndicators) {\n if (this._verse == null || this.chapterNum <= 0)\n return [this.clone()];\n const a = [], o = E(this._verse, r);\n for (const u of o.map((f) => E(f, s))) {\n const f = this.clone();\n f.verse = u[0];\n const d = f.verseNum;\n if (a.push(f), u.length > 1) {\n const b = this.clone();\n if (b.verse = u[1], !e)\n for (let p = d + 1; p < b.verseNum; p++) {\n const J = new i(\n this._bookNum,\n this._chapterNum,\n p,\n this.versification\n );\n this.isExcluded || a.push(J);\n }\n a.push(b);\n }\n }\n return a;\n }\n /**\n * Validates a verse number using the supplied separators rather than the defaults.\n */\n validateVerse(e, s) {\n if (!this.verse)\n return this.internalValid;\n let r = 0;\n for (const a of this.allVerses(!0, e, s)) {\n const o = a.internalValid;\n if (o !== 0)\n return o;\n const u = a.BBBCCCVVV;\n if (r > u)\n return 3;\n if (r === u)\n return 4;\n r = u;\n }\n return 0;\n }\n /**\n * Gets whether a single verse reference is valid.\n */\n get internalValid() {\n return this.versification == null ? 1 : this._bookNum <= 0 || this._bookNum > m.lastBook ? 2 : (m.isCanonical(this._bookNum), 0);\n }\n setEmpty(e = i.defaultVersification) {\n this._bookNum = 0, this._chapterNum = -1, this._verse = void 0, this.versification = e;\n }\n updateInternal(e, s, r) {\n this.bookNum = m.bookIdToNumber(e), this.chapter = s, this.verse = r;\n }\n};\nn(i, \"defaultVersification\", c.English), n(i, \"verseRangeSeparator\", \"-\"), n(i, \"verseSequenceIndicator\", \",\"), n(i, \"verseRangeSeparators\", [i.verseRangeSeparator]), n(i, \"verseSequenceIndicators\", [i.verseSequenceIndicator]), n(i, \"chapterDigitShifter\", 1e3), n(i, \"bookDigitShifter\", i.chapterDigitShifter * i.chapterDigitShifter), n(i, \"bcvMaxValue\", i.chapterDigitShifter - 1), /**\n * The valid status of the VerseRef.\n */\nn(i, \"ValidStatusType\", D);\nlet M = i;\nclass v extends Error {\n}\nexport {\n _ as BookSet,\n m as Canon,\n c as ScrVers,\n l as ScrVersType,\n M as VerseRef,\n v as VerseRefException\n};\n//# sourceMappingURL=index.es.js.map\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","/**\n * Ensures that the given input is returned as an array.\n *\n * This function takes a value that might be a single item, an array, or `undefined` and returns it\n * as an array:\n *\n * - If the input is `undefined`, an empty array is returned.\n * - If the input is already an array, it is returned as-is.\n * - If the input is a single item, it is wrapped in an array.\n *\n * @typeParam T - The type of the elements in the array.\n * @param maybeArray - The value that may be a single item, an array, or `undefined`.\n * @returns An array containing the input value(s). If the input is `undefined`, an empty array is\n * returned.\n */\nexport default function ensureArray(maybeArray: T | T[] | undefined): T[] {\n if (!maybeArray) return [];\n\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n","import { LocalizeKey } from 'menus.model';\nimport {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\nimport ensureArray from './array-util';\n\n/**\n * This function mirrors the `at` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Finds the Unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified offset,\n * undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > stringLength(string) || index < -stringLength(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `charAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a new string consisting of the single unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified offset, empty\n * string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > stringLength(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the character at the given\n * index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > stringLength(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * This function mirrors the `endsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether a string ends with the characters of this string.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be found. Default is\n * `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = stringLength(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * Get the index of the closest closing curly brace in a string.\n *\n * Note: when escaped, gets the index of the curly brace, not the backslash before it.\n *\n * @param str String to search\n * @param index Index at which to start searching. Inclusive of this index\n * @param escaped Whether to search for an escaped or an unescaped closing curly brace\n * @returns Index of closest closing curly brace or -1 if not found\n */\nfunction indexOfClosestClosingCurlyBrace(str: string, index: number, escaped: boolean) {\n if (index < 0) return -1;\n if (escaped) {\n if (charAt(str, index) === '}' && charAt(str, index - 1) === '\\\\') return index;\n const closeCurlyBraceIndex = indexOf(str, '\\\\}', index);\n return closeCurlyBraceIndex >= 0 ? closeCurlyBraceIndex + 1 : closeCurlyBraceIndex;\n }\n\n let i = index;\n const strLength = stringLength(str);\n while (i < strLength) {\n i = indexOf(str, '}', i);\n\n if (i === -1 || charAt(str, i - 1) !== '\\\\') break;\n\n // Didn't find an un-escaped close brace, so keep looking\n i += 1;\n }\n\n return i >= strLength ? -1 : i;\n}\n\n/**\n * Formats a string, replacing `{replacer key}` with the value in the `replacers` at that replacer\n * key (or multiple replacer values if there are multiple in the string). Will also remove \\ before\n * curly braces if curly braces are escaped with a backslash in order to preserve the curly braces.\n * E.g. 'Hi, this is {name}! I like `\\{curly braces\\}`! would become Hi, this is Jim! I like {curly\n * braces}!\n *\n * If the key in unescaped braces is not found, returns the key without the braces. Empty unescaped\n * curly braces will just return a string without the braces e.g. ('I am {Nemo}', { 'name': 'Jim'})\n * would return 'I am Nemo'.\n *\n * @example\n *\n * ```typescript\n * formatReplacementString(\n * 'Hi, this is {name}! I like \\{curly braces\\}! I have a {carColor} car. My favorite food is {food}.',\n * { name: 'Bill', carColor: 'blue' }\n * );\n *\n * =>\n *\n * 'Hi, this is Bill! I like {curly braces}! I have a blue car. My favorite food is food.'\n * ```\n *\n * @param str String to format\n * @param replacers Object whose keys are replacer keys and whose values are the values with which\n * to replace `{replacer key}`s found in the string to format. Will be coerced to strings using\n * `${replacerValue}`\n * @returns Formatted string\n */\nexport function formatReplacementString(\n str: string,\n replacers: { [key: string | number]: string | unknown } | object,\n): string {\n let updatedStr = str;\n\n let i = 0;\n while (i < stringLength(updatedStr)) {\n switch (charAt(updatedStr, i)) {\n case '{':\n if (charAt(updatedStr, i - 1) !== '\\\\') {\n // This character is an un-escaped open curly brace. Try to match and replace\n const closeCurlyBraceIndex = indexOfClosestClosingCurlyBrace(updatedStr, i, false);\n if (closeCurlyBraceIndex >= 0) {\n // We have matching open and close indices. Try to replace the contents\n const replacerKey = substring(updatedStr, i + 1, closeCurlyBraceIndex);\n // Replace with the replacer string or just remove the curly braces\n const replacerString =\n replacerKey in replacers\n ? // We're getting a value.toString() with any type from an object with any keys\n // here. TypeScript doesn't need to carefully and precisely track the exact type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n `${replacers[replacerKey as keyof typeof replacers]}`\n : replacerKey;\n\n updatedStr = `${substring(updatedStr, 0, i)}${replacerString}${substring(updatedStr, closeCurlyBraceIndex + 1)}`;\n // Put our index at the closing brace adjusted for the new string length minus two\n // because we are removing the curly braces\n // Ex: \"stuff {and} things\"\n // Replacer for and: n'\n // closeCurlyBraceIndex is 10\n // \"stuff n' things\"\n // i = 10 + 2 - 3 - 2 = 7\n i = closeCurlyBraceIndex + stringLength(replacerString) - stringLength(replacerKey) - 2;\n } else {\n // This is an unexpected un-escaped open curly brace with no matching closing curly\n // brace. Just ignore, I guess\n }\n } else {\n // This character is an escaped open curly brace. Remove the escape\n updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`;\n // Adjust our index because we removed the escape\n i -= 1;\n }\n break;\n case '}':\n if (charAt(updatedStr, i - 1) !== '\\\\') {\n // This character is an un-escaped closing curly brace with no matching open curly\n // brace. Just ignore, I guess\n } else {\n // This character is an escaped closing curly brace. Remove the escape\n updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`;\n // Adjust our index because we removed the escape\n i -= 1;\n }\n break;\n default:\n // No need to do anything with other characters at this point\n break;\n }\n\n i += 1;\n }\n\n return updatedStr;\n}\n/**\n * This function mirrors the `includes` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Performs a case-sensitive search to determine if searchString is found in string.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString. Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * This function mirrors the `indexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the index of the first occurrence of a given string.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Searches this string and returns the index of the last occurrence of the specified substring.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(string: string, searchString: string, position?: number): number {\n let validatedPosition = position === undefined ? stringLength(string) : position;\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= stringLength(string)) {\n validatedPosition = stringLength(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, stringLength(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * This function mirrors the `length` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes. Since `length` appears to be a\n * reserved keyword, the function was renamed to `stringLength`\n *\n * Returns the length of a string.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function stringLength(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * This function mirrors the `normalize` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * Compares two strings using an ordinal comparison approach based on the specified collation\n * options. This function uses the built-in `localeCompare` method with the 'en' locale and the\n * provided collation options to compare the strings.\n *\n * @param string1 The first string to compare.\n * @param string2 The second string to compare.\n * @param options Optional. The collation options used for comparison.\n * @returns A number indicating the result of the comparison: - Negative value if string1 precedes\n * string2 in sorting order. - Zero if string1 and string2 are equivalent in sorting order. -\n * Positive value if string1 follows string2 in sorting order.\n */\nexport function ordinalCompare(\n string1: string,\n string2: string,\n options?: Intl.CollatorOptions,\n): number {\n return string1.localeCompare(string2, 'en', options);\n}\n\n/**\n * This function mirrors the `padEnd` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * This function mirrors the `padStart` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\n// This is a helper function that performs a correction on the slice index to make sure it\n// cannot go out of bounds\nfunction correctSliceIndex(length: number, index: number) {\n if (index > length) return length;\n if (index < -length) return 0;\n if (index < 0) return index + length;\n return index;\n}\n\n/**\n * This function mirrors the `slice` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const length: number = stringLength(string);\n if (\n indexStart > length ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(indexStart >= 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) ||\n indexEnd < -length))\n )\n return '';\n\n const newStart = correctSliceIndex(length, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * This function mirrors the `split` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits the\n * string at each occurrence of specified separator, but stops when limit entries have been placed\n * in the array.\n * @returns An array of strings, split at each point where separator occurs in the starting string.\n * Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = stringLength(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * This function mirrors the `startsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found (the index of\n * searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string, including when\n * searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * This function mirrors the `substr` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and length. This function is not exported because it is\n * considered deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String length minus start parameter`. Default is `String\n * length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(\n string: string,\n begin: number = 0,\n len: number = stringLength(string) - begin,\n): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * This function mirrors the `substring` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and end position.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = stringLength(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * This function mirrors the `toArray` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Converts a string to an array of string characters.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n\n/** Determine whether the string is a `LocalizeKey` meant to be localized in Platform.Bible. */\nexport function isLocalizeKey(str: string): str is LocalizeKey {\n return startsWith(str, '%') && endsWith(str, '%');\n}\n\n/**\n * Escape RegExp special characters.\n *\n * You can also use this to escape a string that is inserted into the middle of a regex, for\n * example, into a character class.\n *\n * All credit to [`escape-string-regexp`](https://www.npmjs.com/package/escape-string-regexp) - this\n * function is simply copied directly from there to allow a common js export\n *\n * @example\n *\n * import escapeStringRegexp from 'platform-bible-utils';\n *\n * const escapedString = escapeStringRegexp('How much $ for a 🦄?');\n * //=> 'How much \\\\$ for a 🦄\\\\?'\n *\n * new RegExp(escapedString);\n */\nexport function escapeStringRegexp(string: string): string {\n if (typeof string !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n // Escape characters with special meaning either inside or outside character sets.\n // Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n return string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n\n/**\n * Transforms a string or an array of strings into an array of regular expressions, ensuring that\n * the result is always an array.\n *\n * This function accepts a value that may be a single string, an array of strings, or `undefined`.\n * It then:\n *\n * - Converts each string into a `RegExp` object.\n * - If the input is an array containing nested arrays, it converts each string in the nested arrays\n * into `RegExp` objects.\n * - Ensures that the result is always an array of `RegExp` objects or arrays of `RegExp` objects.\n *\n * @param stringStringMaybeArray - The value to be transformed, which can be a single string, an\n * array of strings or arrays of strings, or `undefined`.\n * @returns An array of `RegExp` objects or arrays of `RegExp` objects. If the input is `undefined`,\n * an empty array is returned.\n */\nexport function transformAndEnsureRegExpRegExpArray(\n stringStringMaybeArray: string | (string | string[])[] | undefined,\n): (RegExp | RegExp[])[] {\n if (!stringStringMaybeArray) return [];\n\n const stringStringArray = ensureArray(stringStringMaybeArray);\n\n const regExpRegExpArray = stringStringArray.map((stringMaybeStringArray: string | string[]) =>\n Array.isArray(stringMaybeStringArray)\n ? stringMaybeStringArray.map((str) => new RegExp(str))\n : new RegExp(stringMaybeStringArray),\n );\n\n return regExpRegExpArray;\n}\n\n/**\n * Transforms a string or an array of strings into an array of regular expressions.\n *\n * This function accepts a value that may be a single string, an array of strings, or `undefined`.\n * It then:\n *\n * - Converts each string into a `RegExp` object.\n * - Ensures that the result is always an array of `RegExp` objects.\n *\n * @param stringMaybeArray - The value to be transformed, which can be a single string, an array of\n * strings, or `undefined`.\n * @returns An array of `RegExp` objects. If the input is `undefined`, an empty array is returned.\n */\nexport function transformAndEnsureRegExpArray(\n stringMaybeArray: string | string[] | undefined,\n): RegExp[] {\n if (!stringMaybeArray) return [];\n\n const stringArray = ensureArray(stringMaybeArray);\n\n const regExpArray = stringArray.map((str: string) => new RegExp(str));\n\n return regExpArray;\n}\n\n/** This is an internal-only export for testing purposes and should not be used in development */\nexport const testingStringUtils = {\n indexOfClosestClosingCurlyBrace,\n};\n","import { Canon, VerseRef } from '@sillsdev/scripture';\nimport { BookInfo, ScriptureReference, ScrollGroupId } from './scripture.model';\nimport { split, startsWith } from './string-util';\nimport { LocalizeKey } from './menus.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n\n/**\n * https://github.com/ubsicap/Paratext/blob/master/ParatextData/SILScriptureExtensions.cs#L72\n *\n * Convert book number to a localized Id (a short description of the book). This should be used\n * whenever a book ID (short code) is shown to the user. It is primarily needed for people who do\n * not read Roman script well and need to have books identified in a alternate script (e.g. Chinese\n * or Russian)\n *\n * @param bookNumber\n * @param localizationLanguage In BCP 47 format\n * @param getLocalizedString Function that provides the localized versions of the book ids and names\n * asynchronously.\n * @returns\n */\nexport async function getLocalizedIdFromBookNumber(\n bookNumber: number,\n localizationLanguage: string,\n getLocalizedString: (item: {\n localizeKey: string;\n languagesToSearch?: string[];\n }) => Promise,\n) {\n const id = Canon.bookNumberToId(bookNumber);\n\n if (!startsWith(Intl.getCanonicalLocales(localizationLanguage)[0], 'zh'))\n return getLocalizedString({\n localizeKey: `LocalizedId.${id}`,\n languagesToSearch: [localizationLanguage],\n });\n\n // For Chinese the normal book name is already fairly short.\n const bookName = await getLocalizedString({\n localizeKey: `Book.${id}`,\n languagesToSearch: [localizationLanguage],\n });\n const parts = split(bookName, '-');\n // some entries had a second name inside ideographic parenthesis\n const parts2 = split(parts[0], '\\xff08');\n const retVal = parts2[0].trim();\n return retVal;\n}\n\n/**\n * Get the Scripture reference as an easily comparable/sortable integer.\n *\n * @param scrRef The Scripture reference.\n * @returns An integer where the first three digits represent the book, the next three represent the\n * chapter and the last three represent the verse.\n */\nexport function scrRefToBBBCCCVVV(scrRef: ScriptureReference): number {\n return new VerseRef(scrRef.bookNum, scrRef.chapterNum, scrRef.verseNum).BBBCCCVVV;\n}\n\n/**\n * Compares two Scripture references canonically.\n *\n * @param scrRef1 The first Scripture reference to compare.\n * @param scrRef2 The second Scripture reference to compare.\n * @returns A number indicating the result of the comparison: - Negative value if scrRef1 precedes\n * scrRef2 in sorting order. - Zero if scrRef1 and scrRef2 are equivalent in sorting order. -\n * Positive value if scrRef1 follows scrRef2 in sorting order.\n */\nexport function compareScrRefs(scrRef1: ScriptureReference, scrRef2: ScriptureReference): number {\n // TODO: consider edge cases for invalid references (current implementation should suffice for\n // all but the most extreme cases)\n return scrRefToBBBCCCVVV(scrRef1) - scrRefToBBBCCCVVV(scrRef2);\n}\n\n/** Get the localized string key for a given scroll group Id (or no scroll group if `undefined`) */\nexport function getLocalizeKeyForScrollGroupId(\n scrollGroupId: ScrollGroupId | undefined | 'undefined',\n): LocalizeKey {\n return `%scrollGroup_${scrollGroupId}%`;\n}\n\n/**\n * Gets a list of localized string keys for provided scroll group Ids. Uses\n * {@link getLocalizeKeyForScrollGroupId} internally\n *\n * @example\n *\n * ```typescript\n * getLocalizeKeysForScrollGroupIds([undefined, 0, 1, 2, 3, 4]);\n * // Gives localized string keys for the provided scroll group ids in an array\n * ```\n *\n * @param scrollGroupIds Scroll group ids to include\n * @returns List of localized string keys for scroll group Ids\n */\nexport function getLocalizeKeysForScrollGroupIds(scrollGroupIds: (ScrollGroupId | undefined)[]) {\n return scrollGroupIds.map((scrollGroupId) => getLocalizeKeyForScrollGroupId(scrollGroupId));\n}\n\n/**\n * Formats a Scripture reference.\n *\n * @param scrRef The Scripture reference to format.\n * @param optionOrLocalizedBookName Either 'id' (the default) to format using the \"standard\" (as\n * defined by SIL/UBS) 3-letter book ID, 'English' to format using the English book name spelled\n * out, or some other string (e.g., a localized book name, vernacular abbreviation, FCBH book id,\n * etc.) to use.\n * @param chapterVerseSeparator The character used to separate the chapter number from the verse\n * number. Default is a colon (:). Note: More than one character is allowed.\n * @param bookChapterSeparator The character used to separate the book from the chapter number.\n * Default is a single space. Note: More than one character is allowed.\n * @returns The formatted reference.\n */\nexport function formatScrRef(\n scrRef: ScriptureReference,\n optionOrLocalizedBookName?: 'id' | 'English' | string,\n chapterVerseSeparator?: string,\n bookChapterSeparator?: string,\n): string {\n let book: string;\n switch (optionOrLocalizedBookName ?? 'id') {\n case 'English':\n book = Canon.bookNumberToEnglishName(scrRef.bookNum);\n break;\n case 'id':\n book = Canon.bookNumberToId(scrRef.bookNum);\n break;\n default:\n // We already dealt with undefined about in the switch, but TS is getting confused.\n book = optionOrLocalizedBookName ?? '';\n break;\n }\n return `${book}${bookChapterSeparator ?? ' '}${scrRef.chapterNum}${chapterVerseSeparator ?? ':'}${scrRef.verseNum}`;\n}\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","import deepEqual from './equality-checking';\n\n/**\n * Check if one object is a subset of the other object. \"Subset\" means that all properties of one\n * object are present in the other object, and if they are present that all values of those\n * properties are deeply equal. Sub-objects are also checked to be subsets of the corresponding\n * sub-object in the other object.\n *\n * @example ObjB is a subset of objA given these objects:\n *\n * ```ts\n * objA = { name: 'Alice', age: 30, address: { city: 'Seattle', state: 'Washington' } };\n * objB = { name: 'Alice', address: { city: 'Seattle' } };\n * ```\n *\n * It is important to note that only arrays of primitives (i.e., booleans, numbers, strings) are\n * supported. In particular, objects in arrays will not be checked for deep equality. Also, presence\n * in an array is all this checks, not the number of times that an item appears in an array. `[1,\n * 1]` is a subset of `[1]`.\n *\n * @param objectWithAllProperties Object to be checked if it is a superset of\n * `objectWithPartialProperties`\n * @param objectWithPartialProperties Object to be checked if it is a subset of\n * `objectWithAllProperties`\n * @returns True if `objectWithAllProperties` contains all the properties of\n * `objectWithPartialProperties` and all values of those properties are deeply equal\n */\nexport default function isSubset(\n objectWithAllProperties: unknown,\n objectWithPartialProperties: unknown,\n): boolean {\n if (typeof objectWithAllProperties !== typeof objectWithPartialProperties) return false;\n\n // For this function we're saying that all falsy things of the same type are equal to each other\n if (!objectWithAllProperties && !objectWithPartialProperties) return true;\n\n if (Array.isArray(objectWithAllProperties)) {\n // We know these are arrays from the line above\n /* eslint-disable no-type-assertion/no-type-assertion */\n const partialArray = objectWithPartialProperties as Array;\n const allArray = objectWithAllProperties as Array;\n /* eslint-enable no-type-assertion/no-type-assertion */\n\n if (partialArray.length === 0) return true;\n\n // This only works with arrays of primitives.\n // If someone cares about checking arrays of objects this needs updating.\n return partialArray.every((item) => allArray.includes(item));\n }\n\n if (typeof objectWithAllProperties !== 'object')\n return deepEqual(objectWithAllProperties, objectWithPartialProperties);\n\n // We know these are objects that potentially have properties because of the earlier checks\n /* eslint-disable no-type-assertion/no-type-assertion */\n const partialObj = objectWithPartialProperties as Record;\n const allObj = objectWithAllProperties as Record;\n /* eslint-enable no-type-assertion/no-type-assertion */\n\n let retVal = true;\n Object.keys(partialObj).forEach((key) => {\n if (!retVal) return;\n if (!Object.hasOwn(allObj, key)) retVal = false;\n else if (!isSubset(allObj[key], partialObj[key])) retVal = false;\n });\n return retVal;\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","import DateTimeFormat from './intl-date-time-format';\n\n/**\n * Retrieves the current locale of the user's environment.\n *\n * @returns A string representing the current locale. If the locale cannot be determined, the\n * function returns an empty string.\n */\nexport default function getCurrentLocale(): string {\n // Use navigator when available\n if (typeof navigator !== 'undefined' && navigator.languages) {\n return navigator.languages[0];\n }\n // For Node.js\n return new DateTimeFormat().resolvedOptions().locale;\n}\n","import NumberFormat from './intl-number-format';\n\n/**\n * Formats a number according to the locale and formatting options of this NumberFormat object\n *\n * @example FormatBytes(1024) => \"1 KB\"\n *\n * @example FormatBytes(1024, 0) => \"1 KB\"\n *\n * @param fileSize Number to format\n * @param decimals Number of decimal places to round to\n * @returns String representing the given number formatted according to the locale and formatting\n * options of this NumberFormat object\n */\nexport default function formatBytes(fileSize: number, decimals: number = 2): string {\n if (fileSize === 0) return '0 Bytes';\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(fileSize) / Math.log(1024));\n const sizeToUse = sizes[i];\n const formattingFileSize = new NumberFormat('en', {\n style: 'decimal',\n maximumFractionDigits: decimals,\n minimumFractionDigits: 0,\n }).format(fileSize / 1024 ** i);\n return `${formattingFileSize} ${sizeToUse}`;\n}\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { LocalizeKey, ReferencedItem } from 'menus.model';\n\n/** The data an extension provides to inform Platform.Bible of the settings it provides */\nexport type SettingsContribution = SettingsGroup | SettingsGroup[];\n/** A description of an extension's setting entry */\nexport type Setting = ExtensionControlledSetting;\n/** Setting definition that is validated by the extension. */\nexport type ExtensionControlledSetting = SettingBase & ModifierExtensionControlled;\n/** Base information needed to describe a setting entry */\nexport type SettingBase = StateBase & {\n [k: string]: unknown;\n /** LocalizeKey that displays in the settings dialog as the setting name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the settings dialog to describe the setting */\n description?: LocalizeKey;\n};\n/** The data an extension provides to inform Platform.Bible of the project settings it provides */\nexport type ProjectSettingsContribution = ProjectSettingsGroup | ProjectSettingsGroup[];\n/** A description of an extension's setting entry */\nexport type ProjectSetting = ExtensionControlledProjectSetting;\n/** Setting definition that is validated by the extension. */\nexport type ExtensionControlledProjectSetting = ProjectSettingBase & ModifierExtensionControlled;\n/** Base information needed to describe a project setting entry */\nexport type ProjectSettingBase = SettingBase & ModifierProject;\n/** A description of an extension's user state entry */\nexport type UserState = ExtensionControlledState;\n/** State definition that is validated by the extension. */\nexport type ExtensionControlledState = StateBase & ModifierExtensionControlled;\n/** Group of related settings definitions */\nexport interface SettingsGroup {\n [k: string]: unknown;\n /** LocalizeKey that displays in the settings dialog as the group name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the settings dialog to describe the group */\n description?: LocalizeKey;\n properties: SettingProperties;\n}\n/** Object whose keys are setting IDs and whose values are settings objects */\nexport interface SettingProperties {\n [k: ReferencedItem]: Setting;\n}\n/** Base information needed to describe a state entry */\nexport interface StateBase {\n [k: string]: unknown;\n /** Default value for the state/setting */\n default: unknown;\n /**\n * A state/setting ID whose value to set to this state/setting's starting value the first time\n * this state/setting is loaded\n */\n derivesFrom?: ReferencedItem;\n}\n/**\n * Modifies state/setting type to be extension-controlled. \"Extension-controlled\" means the\n * extension provides the component and the validator for the state/setting, so the state/setting is\n * controlled by the extension.\n */\nexport interface ModifierExtensionControlled {\n [k: string]: unknown;\n platformType?: undefined;\n type?: undefined;\n}\n/** Group of related settings definitions */\nexport interface ProjectSettingsGroup {\n [k: string]: unknown;\n /** LocalizeKey that displays in the project settings dialog as the group name */\n label: LocalizeKey;\n /** LocalizeKey that displays in the project settings dialog to describe the group */\n description?: LocalizeKey;\n properties: ProjectSettingProperties;\n}\n/** Object whose keys are setting IDs and whose values are settings objects */\nexport interface ProjectSettingProperties {\n [k: ReferencedItem]: ProjectSetting;\n}\n\n// Note: we removed the index signature on ModifierProject to avoid having it on\n// `ProjectMetadataFilterOptions`. Unfortunately adding \"additionalProperties\": false on the json\n// schema messes up validation. Please remove the index signature again in the future if you\n// regenerate types\nexport interface ModifierProject {\n /**\n * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s\n * (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if they should be included.\n *\n * If this is one string, it will be matched against `projectInterface`s. If this is an array,\n * each entry is handled based on its type (at least one entry must match for this filter\n * condition to pass):\n *\n * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the\n * project will pass this filter condition\n * - If the entry is an array of strings, each will be matched against each `projectInterface`. If\n * every string matches against at least one `projectInterface`, the project will pass this\n * filter condition\n *\n * In other words, each entry in the first-level array is `OR`'ed together. Each entry in\n * second-level arrays (arrays within the first-level array) are `AND`'ed together.\n *\n * Defaults to all {@link ProjectInterfaces}, so all projects that do not match\n * `excludeProjectInterfaces` will be included\n *\n * @example\n *\n * ```typescript\n * includeProjectInterfaces: ['one', ['two', 'three']];\n * ```\n *\n * This filter condition will succeed on projects whose `projectInterface`s fulfill at least one\n * of the following conditions (At least one entry in the array must match):\n *\n * - Include `one`\n * - Include both `two` and `three`.\n */\n includeProjectInterfaces?: undefined | string | (string | string[])[];\n /**\n * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s\n * (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if they should absolutely not be included even if they match with\n * `includeProjectInterfaces`.\n *\n * If this is one string, it will be matched against `projectInterface`s. If this is an array,\n * each entry is handled based on its type (at least one entry must match for this filter\n * condition to exclude the project):\n *\n * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the\n * project will pass this filter condition and exclude the project\n * - If the entry is an array of strings, each will be matched against each `projectInterface`. If\n * every string matches against at least one `projectInterface`, the project will pass this\n * filter condition and exclude the project\n *\n * In other words, each entry in the first-level array is `OR`'ed together. Each entry in\n * second-level arrays (arrays within the first-level array) are `AND`'ed together.\n *\n * Defaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces`\n * will be included\n *\n * @example\n *\n * ```typescript\n * excludeProjectInterfaces: ['one', ['two', 'three']];\n * ```\n *\n * This filter condition will succeed and exclude projects whose `projectInterface`s fulfill at\n * least one of the following conditions (At least one entry in the array must match):\n *\n * - Include `one`\n * - Include both `two` and `three`.\n */\n excludeProjectInterfaces?: undefined | string | (string | string[])[];\n /**\n * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory\n * Ids that provided each project's metadata (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if the projects should be included.\n *\n * Defaults to all Project Data Provider Factory Ids, so all projects that do not match\n * `excludePdpFactoryIds` will be included\n */\n includePdpFactoryIds?: undefined | string | string[];\n /**\n * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory\n * Ids that provided each project's metadata (using the\n * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)\n * function) to determine if the projects should absolutely not be included even if they match\n * with `includeProjectInterfaces`.\n *\n * Defaults to none, so all projects that match `includePdpFactoryIds` will be included\n */\n excludePdpFactoryIds?: undefined | string | string[];\n}\n\n/** The data an extension provides to inform Platform.Bible of the user state it provides */\nexport interface UserStateContribution {\n [k: ReferencedItem]: UserState;\n}\n/** The data an extension provides to inform Platform.Bible of the project state it provides */\nexport interface ProjectStateContribution {\n [k: ReferencedItem]: UserState;\n}\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\nconst settingsDefs = {\n projectSettingsContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the project settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/projectSettingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/projectSettingsGroup',\n },\n },\n ],\n },\n projectSettingsGroup: {\n description: 'Group of related settings definitions',\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the project settings dialog as the group name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description:\n 'localizeKey that displays in the project settings dialog to describe the group',\n $ref: '#/$defs/localizeKey',\n },\n properties: {\n $ref: '#/$defs/projectSettingProperties',\n },\n },\n required: ['label', 'properties'],\n },\n projectSettingProperties: {\n description: 'Object whose keys are setting IDs and whose values are settings objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/projectSetting',\n },\n },\n additionalProperties: false,\n },\n projectSetting: {\n description: \"A description of an extension's setting entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledProjectSetting',\n },\n ],\n },\n extensionControlledProjectSetting: {\n description: 'Setting definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/projectSettingBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n projectSettingBase: {\n description: 'Base information needed to describe a project setting entry',\n allOf: [\n {\n $ref: '#/$defs/settingBase',\n },\n {\n $ref: '#/$defs/modifierProject',\n },\n ],\n },\n modifierProject: {\n description: 'Modifies setting type to be project setting',\n type: 'object',\n properties: {\n includeProjectInterfaces: {\n description:\n \"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should be included.\\n\\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to pass):\\n\\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition\\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition\\n\\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\\n\\nDefaults to all {@link ProjectInterfaces}, so all projects that do not match `excludeProjectInterfaces` will be included\\n\\n@example\\n\\n```typescript\\nincludeProjectInterfaces: ['one', ['two', 'three']];\\n```\\n\\nThis filter condition will succeed on projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\\n\\n- Include `one`\\n- Include both `two` and `three`.\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n ],\n },\n excludeProjectInterfaces: {\n description:\n \"String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should absolutely not be included even if they match with `includeProjectInterfaces`.\\n\\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to exclude the project):\\n\\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition and exclude the project\\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition and exclude the project\\n\\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\\n\\nDefaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` will be included\\n\\n@example\\n\\n```typescript\\nexcludeProjectInterfaces: ['one', ['two', 'three']];\\n```\\n\\nThis filter condition will succeed and exclude projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\\n\\n- Include `one`\\n- Include both `two` and `three`.\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n ],\n },\n includePdpFactoryIds: {\n description:\n \"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should be included.\\n\\nDefaults to all Project Data Provider Factory Ids, so all projects that do not match `excludePdpFactoryIds` will be included\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n excludePdpFactoryIds: {\n description:\n \"String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should absolutely not be included even if they match with `includeProjectInterfaces`.\\n\\nDefaults to none, so all projects that match `includePdpFactoryIds` will be included\",\n anyOf: [\n {\n type: 'null',\n },\n {\n type: 'string',\n },\n {\n type: 'array',\n items: { type: 'string' },\n },\n ],\n },\n },\n },\n settingsContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/settingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/settingsGroup',\n },\n },\n ],\n },\n settingsGroup: {\n description: 'Group of related settings definitions',\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the settings dialog as the group name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description: 'localizeKey that displays in the settings dialog to describe the group',\n $ref: '#/$defs/localizeKey',\n },\n properties: {\n $ref: '#/$defs/settingProperties',\n },\n },\n required: ['label', 'properties'],\n },\n settingProperties: {\n description: 'Object whose keys are setting IDs and whose values are settings objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w-]+\\\\.[\\\\w-]+$': {\n $ref: '#/$defs/setting',\n },\n },\n additionalProperties: false,\n },\n setting: {\n description: \"A description of an extension's setting entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledSetting',\n },\n ],\n },\n extensionControlledSetting: {\n description: 'Setting definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/settingBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n settingBase: {\n description: 'Base information needed to describe a setting entry',\n allOf: [\n {\n $ref: '#/$defs/stateBase',\n },\n {\n type: 'object',\n properties: {\n label: {\n description: 'localizeKey that displays in the settings dialog as the setting name',\n $ref: '#/$defs/localizeKey',\n },\n description: {\n description: 'localizeKey that displays in the settings dialog to describe the setting',\n $ref: '#/$defs/localizeKey',\n },\n },\n required: ['label'],\n },\n ],\n },\n projectStateContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the project state it provides',\n $ref: '#/$defs/userStateProperties',\n },\n userStateContribution: {\n description:\n 'The data an extension provides to inform Platform.Bible of the user state it provides',\n $ref: '#/$defs/userStateProperties',\n },\n userStateProperties: {\n description: 'Object whose keys are state IDs and whose values are state objects',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/userState',\n },\n },\n additionalProperties: false,\n },\n userState: {\n description: \"A description of an extension's user state entry\",\n anyOf: [\n {\n $ref: '#/$defs/extensionControlledState',\n },\n ],\n },\n extensionControlledState: {\n description: 'State definition that is validated by the extension.',\n allOf: [\n {\n $ref: '#/$defs/stateBase',\n },\n {\n $ref: '#/$defs/modifierExtensionControlled',\n },\n ],\n },\n modifierExtensionControlled: {\n description:\n 'Modifies state/setting type to be extension-controlled. \"Extension-controlled\" means the extension provides the component and the validator for the state/setting, so the state/setting is controlled by the extension.',\n not: {\n anyOf: [\n {\n type: 'object',\n required: ['platformType'],\n },\n {\n type: 'object',\n required: ['type'],\n },\n ],\n },\n },\n stateBase: {\n description: 'Base information needed to describe a state entry',\n type: 'object',\n properties: {\n default: {\n description: 'default value for the state/setting',\n type: 'any',\n },\n derivesFrom: {\n description:\n \"a state/setting ID whose value to set to this state/setting's starting value the first time this state/setting is loaded\",\n $ref: '#/$defs/id',\n },\n },\n required: ['default'],\n },\n localizeKey: {\n description: \"Identifier for a string that will be localized based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n tsType: 'LocalizeKey',\n },\n id: {\n description: '',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n tsType: 'Id',\n },\n};\n\n/**\n * Json-schema-to-typescript has some added stuff that isn't actually compatible with JSON schema,\n * so we remove them here\n *\n * @param defs The `$defs` property of a JSON schema (will be modified in place)\n */\n// JSON schema types are weird, so we'll just be careful\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function removeJsonToTypeScriptTypesStuff(defs: any) {\n if (!defs) return;\n\n // JSON schema types are weird, so we'll just be careful\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.values(defs).forEach((def: any) => {\n if (!def.type) return;\n\n if ('tsType' in def) delete def.tsType;\n\n if (def.type === 'any') {\n delete def.type;\n return;\n }\n\n if (def.type === 'object') {\n removeJsonToTypeScriptTypesStuff(def.properties);\n }\n });\n}\n\nremoveJsonToTypeScriptTypesStuff(settingsDefs);\n\n/** JSON schema object that aligns with the ProjectSettingsContribution type */\nexport const projectSettingsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Project Settings Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the project settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/projectSettingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/projectSettingsGroup',\n },\n },\n ],\n\n $defs: settingsDefs,\n};\n\nObject.freeze(projectSettingsDocumentSchema);\n\n/** JSON schema object that aligns with the {@link SettingsContribution} type */\nexport const settingsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Settings Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the settings it provides',\n anyOf: [\n {\n $ref: '#/$defs/settingsGroup',\n },\n {\n type: 'array',\n items: {\n $ref: '#/$defs/settingsGroup',\n },\n },\n ],\n\n $defs: settingsDefs,\n};\n\nObject.freeze(settingsDocumentSchema);\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { LocalizeKey } from 'menus.model';\nimport { removeJsonToTypeScriptTypesStuff } from './settings.model';\n\n/** Localized string value associated with this key */\nexport type LocalizedStringValue = string;\n\n/** The data an extension provides to inform Platform.Bible of the localized strings it provides. */\nexport interface LocalizedStringDataContribution {\n [k: string]: unknown;\n metadata?: StringsMetadata;\n localizedStrings?: {\n [k: string]: LanguageStrings;\n };\n}\n/**\n * Map whose keys are localized string keys and whose values provide additional non-locale-specific\n * information about the localized string key\n */\nexport interface StringsMetadata {\n [k: LocalizeKey]: StringMetadata;\n}\n/** Additional non-locale-specific information about a localized string key */\nexport interface StringMetadata {\n [k: string]: unknown;\n /**\n * Localized string key from which to get this value if one does not exist in the specified\n * language. If a new key/value pair needs to be made to replace an existing one, this could help\n * smooth over the transition if the meanings are close enough\n *\n * You can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a\n * backslash `\\`.\n */\n fallbackKey?: LocalizeKey;\n /**\n * Additional information provided by developers in English to help the translator to know how to\n * translate this localized string accurately\n */\n notes?: string;\n}\n/**\n * Map whose keys are localized string keys and whose values provide information about how to\n * localize strings for the localized string key\n */\nexport interface LanguageStrings {\n [k: LocalizeKey]: LocalizedStringValue;\n}\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n\nconst localizedStringsDefs = {\n languageStrings: {\n description:\n 'Map whose keys are localized string keys and whose values provide information about how to localize strings for the localized string key',\n type: 'object',\n patternProperties: {\n '^%[\\\\w\\\\-\\\\.]+%$': {\n $ref: '#/$defs/localizedStringValue',\n },\n },\n additionalProperties: false,\n },\n localizedStringValue: {\n description: 'Localized string value associated with this key',\n type: 'string',\n },\n stringsMetadata: {\n description:\n 'Map whose keys are localized string keys and whose values provide additional non-locale-specific information about the localized string key',\n type: 'object',\n patternProperties: {\n '^%[\\\\w\\\\-\\\\.]+%$': {\n $ref: '#/$defs/stringMetadata',\n },\n },\n additionalProperties: false,\n },\n stringMetadata: {\n description: 'Additional non-locale-specific information about a localized string key',\n type: 'object',\n properties: {\n fallbackKey: {\n description:\n 'Localized string key from which to get this value if one does not exist in the specified language. If a new key/value pair needs to be made to replace an existing one, this could help smooth over the transition if the meanings are close enough.\\nYou can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a backslash `\\\\`.',\n type: 'string',\n pattern: \"^%[\\\\w\\\\-\\\\.;&,' (){}#:/\\\\\\\\?%⋮|[\\\\]“”‘’!~*\\u00A0+=•`…\\u200B↑↓]+%$\",\n tsType: 'LocalizeKey',\n },\n notes: {\n description:\n 'Additional information provided by developers in English to help the translator to know how to translate this localized string accurately',\n type: 'string',\n },\n },\n },\n localizeKey: {\n description: \"Identifier for a string that will be localized based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n tsType: 'LocalizeKey',\n },\n};\n\nremoveJsonToTypeScriptTypesStuff(localizedStringsDefs);\n\n/** JSON schema object that aligns with the LocalizedStringDataContribution type */\nexport const localizedStringsDocumentSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'Localized String Data Contribution',\n description:\n 'The data an extension provides to inform Platform.Bible of the localized strings it provides.',\n type: 'object',\n properties: {\n metadata: {\n $ref: '#/$defs/stringsMetadata',\n },\n localizedStrings: {\n type: 'object',\n additionalProperties: {\n $ref: '#/$defs/languageStrings',\n },\n },\n },\n $defs: localizedStringsDefs,\n};\n\nObject.freeze(localizedStringsDocumentSchema);\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\nimport { ReplaceType } from './util';\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /**\n * Uri path to the icon to display after the menu text. Ex:\n * `papi-extension://helloWorld/assets/icon.png`\n */\n iconPathAfter?: string;\n /**\n * Uri path to the icon to display before the menu text. Ex:\n * `papi-extension://helloWorld/assets/icon.png`\n */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single context menu/submenu.\n * Groups are separated using a line within the menu/submenu.\n */\nexport type GroupsInSingleColumnMenu = {\n /** Named menu group */\n [property: ReferencedItem]: OrderedExtensibleContainer | MenuGroupDetailsInSubMenu;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu within a\n * multi-column menu. Groups are separated using a line within the menu/submenu.\n */\nexport type GroupsInMultiColumnMenu = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: GroupsInSingleColumnMenu;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n /** Groups that belong in this menu */\n groups: GroupsInMultiColumnMenu;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus before they are localized */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n/**\n * Type that converts any menu type before it is localized to what it is after it is localized. This\n * can be applied to any menu type as needed.\n */\nexport type Localized = ReplaceType, ReferencedItem, string>;\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description:\n 'Uri path to the icon to display before the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`',\n type: 'string',\n },\n iconPathAfter: {\n description:\n 'Uri path to the icon to display after the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","Collator","locales","options","string1","string2","DateTimeFormat","date","startDate","endDate","PlatformEventEmitter","event","callback","callbackIndex","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","_objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombiner","baseDocument","documentName","document","previousDocumentVersion","documentToSet","contributions","contributionName","potentialOutput","outputIteration","contribution","mergeObjects","output","finalOutput","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","mergeObjectsInternal","startingPointObj","copyFromObj","Mutex","AsyncMutex","MutexMap","mutexID","NonValidatingDocumentCombiner","NumberFormat","startRange","endRange","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","P","R","n","N","B","O","S","K","g","k","x","T","X","V","w","L","G","A","H","C","I","y","q","U","m","l","h","c","E","r","D","i","a","u","v","f","d","b","p","J","M","charRegex","astralRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","ensureArray","maybeArray","at","string","stringLength","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","indexOfClosestClosingCurlyBrace","escaped","closeCurlyBraceIndex","formatReplacementString","replacers","updatedStr","replacerKey","replacerString","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","ordinalCompare","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","isLocalizeKey","escapeStringRegexp","transformAndEnsureRegExpRegExpArray","stringStringMaybeArray","stringMaybeStringArray","transformAndEnsureRegExpArray","stringMaybeArray","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","_a","offsetBook","scrRef","offset","offsetChapter","offsetVerse","getLocalizedIdFromBookNumber","bookNumber","localizationLanguage","getLocalizedString","id","Canon","bookName","parts","scrRefToBBBCCCVVV","VerseRef","compareScrRefs","scrRef1","scrRef2","getLocalizeKeyForScrollGroupId","scrollGroupId","getLocalizeKeysForScrollGroupIds","scrollGroupIds","formatScrRef","optionOrLocalizedBookName","chapterVerseSeparator","bookChapterSeparator","book","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","isSubset","objectWithAllProperties","objectWithPartialProperties","partialArray","allArray","partialObj","allObj","serialize","replacer","space","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","getCurrentLocale","formatBytes","fileSize","decimals","sizes","sizeToUse","settingsDefs","removeJsonToTypeScriptTypesStuff","defs","def","projectSettingsDocumentSchema","settingsDocumentSchema","localizedStringsDefs","localizedStringsDocumentSchema","menuDocumentSchema"],"mappings":"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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,IAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","x_google_ignoreList":[11,12,13,18]} \ No newline at end of file diff --git a/lib/platform-bible-utils/dts-bundle-generator.config.ts b/lib/platform-bible-utils/dts-bundle-generator.config.ts new file mode 100644 index 0000000000..b183b32d99 --- /dev/null +++ b/lib/platform-bible-utils/dts-bundle-generator.config.ts @@ -0,0 +1,11 @@ +const config = { + entries: [ + { + filePath: './src/index.ts', + outFile: './dist/index.d.ts', + noCheck: false, + }, + ], +}; + +module.exports = config; diff --git a/lib/platform-bible-utils/package.json b/lib/platform-bible-utils/package.json new file mode 100644 index 0000000000..4c510e663b --- /dev/null +++ b/lib/platform-bible-utils/package.json @@ -0,0 +1,66 @@ +{ + "name": "platform-bible-utils", + "version": "0.0.1", + "type": "module", + "description": "Utilities to use in Paranext.", + "license": "MIT", + "homepage": "https://github.com/paranext/paranext-core/tree/main/lib/platform-bible-utils", + "bugs": { + "url": "https://github.com/paranext/paranext-core/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/paranext/paranext-core.git" + }, + "author": { + "name": "Paranext", + "url": "https://github.com/paranext/" + }, + "contributors": [ + { + "name": "Ira J Hopkinson", + "url": "https://github.com/irahopkinson" + } + ], + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "files": ["dist"], + "scripts": { + "start": "vite --host --open", + "build:basic": "tsc && vite build && dts-bundle-generator --config ./dts-bundle-generator.config.ts", + "build:docs": "npm install && typedoc", + "build": "npm run build:basic && npm run lint-fix && npm run test", + "watch": "tsc && vite build --watch", + "lint": "npm run lint:scripts", + "lint:scripts": "cross-env NODE_ENV=development eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "lint-fix": "npm run lint-fix:scripts", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts", + "test": "jest --silent" + }, + "peerDependencies": {}, + "dependencies": { + "async-mutex": "^0.4.1" + }, + "devDependencies": { + "@types/jest": "^29.5.13", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "dts-bundle-generator": "^9.5.1", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "prettier-plugin-jsdoc": "^1.3.0", + "stringz": "^2.1.0", + "tslib": "^2.7.0", + "typedoc": "^0.26.7", + "typescript": "^5.4.5", + "vite": "^5.4.8" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/lib/platform-bible-utils/src/array-util.test.ts b/lib/platform-bible-utils/src/array-util.test.ts new file mode 100644 index 0000000000..4b45f082ba --- /dev/null +++ b/lib/platform-bible-utils/src/array-util.test.ts @@ -0,0 +1,32 @@ +import ensureArray from './array-util'; + +describe('ensureArray', () => { + test('should return an empty array when input is undefined', () => { + expect(ensureArray(undefined)).toEqual([]); + }); + + test('should return the input array as-is when the input is already an array', () => { + const input = [1, 2, 3]; + expect(ensureArray(input)).toBe(input); + }); + + test('should wrap a single item in an array', () => { + const input = 5; + expect(ensureArray(input)).toEqual([input]); + }); + + test('should handle an array of objects', () => { + const input = [{ id: 1 }, { id: 2 }]; + expect(ensureArray(input)).toBe(input); + }); + + test('should wrap a single object in an array', () => { + const input = { id: 1 }; + expect(ensureArray(input)).toEqual([input]); + }); + + test('should wrap a single string in an array', () => { + const input = 'a'; + expect(ensureArray(input)).toEqual([input]); + }); +}); diff --git a/lib/platform-bible-utils/src/array-util.ts b/lib/platform-bible-utils/src/array-util.ts new file mode 100644 index 0000000000..5ddf6099ab --- /dev/null +++ b/lib/platform-bible-utils/src/array-util.ts @@ -0,0 +1,20 @@ +/** + * Ensures that the given input is returned as an array. + * + * This function takes a value that might be a single item, an array, or `undefined` and returns it + * as an array: + * + * - If the input is `undefined`, an empty array is returned. + * - If the input is already an array, it is returned as-is. + * - If the input is a single item, it is wrapped in an array. + * + * @typeParam T - The type of the elements in the array. + * @param maybeArray - The value that may be a single item, an array, or `undefined`. + * @returns An array containing the input value(s). If the input is `undefined`, an empty array is + * returned. + */ +export default function ensureArray(maybeArray: T | T[] | undefined): T[] { + if (!maybeArray) return []; + + return Array.isArray(maybeArray) ? maybeArray : [maybeArray]; +} diff --git a/lib/platform-bible-utils/src/async-variable.ts b/lib/platform-bible-utils/src/async-variable.ts new file mode 100644 index 0000000000..6c6f7c7e55 --- /dev/null +++ b/lib/platform-bible-utils/src/async-variable.ts @@ -0,0 +1,94 @@ +/** This class provides a convenient way for one task to wait on a variable that another task sets. */ +export default class AsyncVariable { + private readonly variableName: string; + private readonly promiseToValue: Promise; + private resolver: ((value: T) => void) | undefined; + private rejecter: ((reason: string | undefined) => void) | undefined; + + /** + * Creates an instance of the class + * + * @param variableName Name to use when logging about this variable + * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was + * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you + * do not want a timeout at all. Defaults to 10000 ms + */ + constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) { + this.variableName = variableName; + this.promiseToValue = new Promise((resolve, reject) => { + this.resolver = resolve; + this.rejecter = reject; + }); + if (rejectIfNotSettledWithinMS > 0) { + setTimeout(() => { + if (this.rejecter) { + this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`); + this.complete(); + } + }, rejectIfNotSettledWithinMS); + } + Object.seal(this); + } + + /** + * Get this variable's promise to a value. This always returns the same promise even after the + * value has been resolved or rejected. + * + * @returns The promise for the value to be set + */ + get promise(): Promise { + return this.promiseToValue; + } + + /** + * A simple way to see if this variable's promise was resolved or rejected already + * + * @returns Whether the variable was already resolved or rejected + */ + get hasSettled(): boolean { + return Object.isFrozen(this); + } + + /** + * Resolve this variable's promise to the given value + * + * @param value This variable's promise will resolve to this value + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void { + if (this.resolver) { + console.debug(`${this.variableName} is being resolved now`); + this.resolver(value); + this.complete(); + } else { + if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`); + console.debug(`Ignoring subsequent resolution of ${this.variableName}`); + } + } + + /** + * Reject this variable's promise for the value with the given reason + * + * @param reason This variable's promise will be rejected with this reason + * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved + * or rejected. Defaults to `false` + */ + rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void { + if (this.rejecter) { + console.debug(`${this.variableName} is being rejected now`); + this.rejecter(reason); + this.complete(); + } else { + if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`); + console.debug(`Ignoring subsequent rejection of ${this.variableName}`); + } + } + + /** Prevent any further updates to this variable */ + private complete(): void { + this.resolver = undefined; + this.rejecter = undefined; + Object.freeze(this); + } +} diff --git a/lib/platform-bible-utils/src/disposal.model.ts b/lib/platform-bible-utils/src/disposal.model.ts new file mode 100644 index 0000000000..bd39c55076 --- /dev/null +++ b/lib/platform-bible-utils/src/disposal.model.ts @@ -0,0 +1,29 @@ +import { UnsubscriberAsync } from './unsubscriber'; +import { PlatformEvent } from './platform-event'; + +/** Require a `dispose` function */ +export interface Dispose { + /** Release resources and notify dependent services when tearing down an object */ + dispose: UnsubscriberAsync; +} + +/** Require an `onDidDispose` event */ +export interface OnDidDispose { + /** Event that emits when `dispose` is called on an object */ + onDidDispose: PlatformEvent; +} + +/** + * Indicates than an object cannot have an `onDidDispose` event. Also allows an object to include a + * `dispose` function. + */ +export interface CannotHaveOnDidDispose { + /** Release resources and notify dependent services when tearing down an object */ + // Include dispose optionally to avoid extra type casting later + dispose?: UnsubscriberAsync; + /** Event that emits when `dispose` is called on an object */ + onDidDispose?: undefined; +} + +/** Allow onDidDispose to exist on the type if it was previously disallowed by CannotHaveOnDidDispose */ +export type CanHaveOnDidDispose = Omit; diff --git a/lib/platform-bible-utils/src/document-combiner.test.ts b/lib/platform-bible-utils/src/document-combiner.test.ts new file mode 100644 index 0000000000..5ddd9f7f54 --- /dev/null +++ b/lib/platform-bible-utils/src/document-combiner.test.ts @@ -0,0 +1,316 @@ +/* eslint-disable max-classes-per-file */ +import DocumentCombiner, { DocumentCombinerOptions, JsonDocumentLike } from './document-combiner'; + +// #region Combiner implementations + +// Add a common getter to obtain the combined document +class TestDocumentCombiner extends DocumentCombiner { + /** Gets the latest output of all composed documents */ + get output(): JsonDocumentLike | undefined { + return this.latestOutput; + } + + // Implementing an abstract base class method + // eslint-disable-next-line class-methods-use-this + protected transformFinalOutputBeforeValidation(finalOutput: JsonDocumentLike): JsonDocumentLike { + return finalOutput; + } +} + +/** Combine all provided documents without any checking */ +class DocumentCombinerWithoutValidation extends TestDocumentCombiner { + constructor(startingDocument: JsonDocumentLike, options?: DocumentCombinerOptions) { + let optionsWithDefault = { copyDocuments: true, ignoreDuplicateProperties: false }; + if (options) optionsWithDefault = options; + super(startingDocument, optionsWithDefault); + } + + // We have the implement this abstract function but don't want it to do anything + // eslint-disable-next-line class-methods-use-this + protected validateBaseDocument(): void {} + + // We have the implement this abstract function but don't want it to do anything + // eslint-disable-next-line class-methods-use-this + protected validateContribution(): void {} + + // We have the implement this abstract function but don't want it to do anything + // eslint-disable-next-line class-methods-use-this + protected validateOutput(): void {} +} + +/** Combine array and non-array contributions to make a final array of contributions */ +class ArrayDocumentCombiner extends DocumentCombinerWithoutValidation { + // We just don't need `this` here + // eslint-disable-next-line class-methods-use-this + protected transformContributionAfterValidation( + _documentName: string, + document: JsonDocumentLike, + ): JsonDocumentLike { + return Array.isArray(document) ? document : [document]; + } + + // We just don't need `this` here + // eslint-disable-next-line class-methods-use-this + protected transformBaseDocumentAfterValidation(baseDocument: JsonDocumentLike): JsonDocumentLike { + return Array.isArray(baseDocument) ? baseDocument : [baseDocument]; + } +} + +/** Throw a validation error on any operation, including construction */ +class AlwaysThrowingCombiner extends TestDocumentCombiner { + constructor(startingDocument: JsonDocumentLike) { + super(startingDocument, { copyDocuments: true, ignoreDuplicateProperties: false }); + } + + // eslint-disable-next-line class-methods-use-this + protected validateBaseDocument(): void { + throw new Error(); + } + + // eslint-disable-next-line class-methods-use-this + protected validateContribution(): void { + throw new Error(); + } + + // eslint-disable-next-line class-methods-use-this + protected validateOutput(): void { + throw new Error(); + } +} + +/** Throw a validation error on any operation after construction is complete */ +class ThrowingCombiner extends TestDocumentCombiner { + throwEnabled: boolean = false; + + constructor(startingDocument: JsonDocumentLike) { + super(startingDocument, { copyDocuments: true, ignoreDuplicateProperties: false }); + this.throwEnabled = true; + } + + protected validateBaseDocument(): void { + if (this.throwEnabled) throw new Error(); + } + + protected validateContribution(): void { + if (this.throwEnabled) throw new Error(); + } + + protected validateOutput(): void { + if (this.throwEnabled) throw new Error(); + } +} + +/** Throw a validation error only when checking the output */ +class OutputThrowingCombiner extends TestDocumentCombiner { + constructor(startingDocument: JsonDocumentLike) { + super(startingDocument, { copyDocuments: true, ignoreDuplicateProperties: false }); + } + + // eslint-disable-next-line class-methods-use-this + protected validateBaseDocument(): void {} + + // eslint-disable-next-line class-methods-use-this + protected validateContribution(): void {} + + // eslint-disable-next-line class-methods-use-this + protected validateOutput(): void { + throw new Error(); + } +} + +// #endregion + +describe('Simple object combining', () => { + const hasA = { a: 1 }; + const hasB = { b: 2 }; + const hasC = { c: 3 }; + const newC = { c: 4 }; + const arrayD1 = { d: ['red', 'yellow'] }; + const arrayD2 = { d: ['blue', 'green'] }; + + test('baseDocument, addOrUpdateContribution, deleteContribution, updateBaseDocument, onDidRebuild works', () => { + const combiner = new DocumentCombinerWithoutValidation(hasA); + const rebuildCallbackMock = jest.fn(() => {}); + const unsubscriber = combiner.onDidRebuild(rebuildCallbackMock); + + expect(JSON.stringify(combiner.output)).toBe('{"a":1}'); + combiner.addOrUpdateContribution('B', hasB); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"b":2}'); + combiner.addOrUpdateContribution('C', hasC); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"b":2,"c":3}'); + combiner.addOrUpdateContribution('C', newC); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"b":2,"c":4}'); + combiner.deleteContribution('B'); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"c":4}'); + combiner.deleteContribution('C'); + expect(JSON.stringify(combiner.output)).toBe('{"a":1}'); + combiner.updateBaseDocument({ a: 10 }); + expect(JSON.stringify(combiner.output)).toBe('{"a":10}'); + combiner.addOrUpdateContribution('D1', arrayD1); + expect(JSON.stringify(combiner.output)).toBe('{"a":10,"d":["red","yellow"]}'); + combiner.addOrUpdateContribution('D2', arrayD2); + expect(JSON.stringify(combiner.output)).toBe('{"a":10,"d":["red","yellow","blue","green"]}'); + expect(rebuildCallbackMock).toHaveBeenCalledTimes(8); + + unsubscriber(); + }); + + test('deleteAllContributions, onDidRebuild works', () => { + const combiner = new DocumentCombinerWithoutValidation(hasA); + const rebuildCallbackMock = jest.fn(() => {}); + const unsubscriber = combiner.onDidRebuild(rebuildCallbackMock); + + combiner.addOrUpdateContribution('B', hasB); + combiner.addOrUpdateContribution('C', newC); + combiner.deleteAllContributions(); + expect(JSON.stringify(combiner.output)).toBe('{"a":1}'); + expect(rebuildCallbackMock).toHaveBeenCalledTimes(3); + + unsubscriber(); + }); +}); + +describe('Simple array combining', () => { + const base = [1, 2, 3]; + const has4 = [4]; + const has5 = [5]; + const has6 = [6]; + + test('baseDocument, addOrUpdateContribution, deleteContribution, updateBaseDocument, onDidRebuild works', () => { + const combiner = new DocumentCombinerWithoutValidation(base); + const rebuildCallbackMock = jest.fn(() => {}); + const unsubscriber = combiner.onDidRebuild(rebuildCallbackMock); + + expect(JSON.stringify(combiner.output)).toBe('[1,2,3]'); + combiner.addOrUpdateContribution('4', has4); + expect(JSON.stringify(combiner.output)).toBe('[1,2,3,4]'); + combiner.addOrUpdateContribution('5', has5); + expect(JSON.stringify(combiner.output)).toBe('[1,2,3,4,5]'); + combiner.addOrUpdateContribution('5', has6); + expect(JSON.stringify(combiner.output)).toBe('[1,2,3,4,6]'); + combiner.deleteContribution('4'); + expect(JSON.stringify(combiner.output)).toBe('[1,2,3,6]'); + combiner.updateBaseDocument([0, 1, 2]); + expect(JSON.stringify(combiner.output)).toBe('[0,1,2,6]'); + expect(rebuildCallbackMock).toHaveBeenCalledTimes(5); + + unsubscriber(); + }); + + test('deleteAllContributions, onDidRebuild works', () => { + const combiner = new DocumentCombinerWithoutValidation(base); + const rebuildCallbackMock = jest.fn(() => {}); + const unsubscriber = combiner.onDidRebuild(rebuildCallbackMock); + + combiner.addOrUpdateContribution('4', has4); + combiner.addOrUpdateContribution('5', has5); + combiner.deleteAllContributions(); + expect(JSON.stringify(combiner.output)).toBe('[1,2,3]'); + expect(rebuildCallbackMock).toHaveBeenCalledTimes(3); + + unsubscriber(); + }); +}); + +test('transformBaseDocumentAfterValidation and transformContributionAfterValidation allow array or non-array docs to merge into an array together', () => { + const arrayBase = [{ thing: 0 }, [], [4]]; + const objectBase = { thing: 1 }; + const objectContribution = { stuff: 3 }; + const arrayContribution = [5, 6]; + + const combiner = new ArrayDocumentCombiner(arrayBase); + expect(JSON.stringify(combiner.output)).toBe('[{"thing":0},[],[4]]'); + combiner.addOrUpdateContribution('objectContribution', objectContribution); + expect(JSON.stringify(combiner.output)).toBe('[{"thing":0},[],[4],{"stuff":3}]'); + combiner.addOrUpdateContribution('arrayContribution', arrayContribution); + expect(JSON.stringify(combiner.output)).toBe('[{"thing":0},[],[4],{"stuff":3},5,6]'); + combiner.updateBaseDocument(objectBase); + expect(JSON.stringify(combiner.output)).toBe('[{"thing":1},{"stuff":3},5,6]'); +}); + +test('Collisions are not allowed', () => { + const hasA = { a: 1 }; + const newA = { a: 2 }; + const nestedObject = { b: { c: { d: 9 } } }; + const throwingCombiner = new DocumentCombinerWithoutValidation(hasA); + expect(() => throwingCombiner.addOrUpdateContribution('A', newA)).toThrow(); + throwingCombiner.addOrUpdateContribution('B', nestedObject); + expect(() => throwingCombiner.addOrUpdateContribution('C', nestedObject)).toThrow(); + const nonThrowingCombiner = new DocumentCombinerWithoutValidation(hasA, { + copyDocuments: true, + ignoreDuplicateProperties: true, + }); + expect(() => nonThrowingCombiner.addOrUpdateContribution('A', newA)).not.toThrow(); + expect(JSON.stringify(nonThrowingCombiner.output)).toBe('{"a":1}'); +}); + +test('Can handle various empty contributions', () => { + const combiner = new DocumentCombinerWithoutValidation({}); + expect(() => combiner.addOrUpdateContribution('A', {})).not.toThrow(); + // @ts-expect-error: Purposefully passing garbage + expect(() => combiner.addOrUpdateContribution('A', undefined)).not.toThrow(); + // @ts-expect-error: Purposefully passing garbage + // eslint-disable-next-line no-null/no-null + expect(() => combiner.addOrUpdateContribution('A', null)).not.toThrow(); +}); + +test('Validation checking works', () => { + expect(() => { + // eslint-disable-next-line no-new + new AlwaysThrowingCombiner({}); + }).toThrow(); + + const combiner = new ThrowingCombiner({}); + expect(() => combiner.updateBaseDocument({})).toThrow(); + expect(() => combiner.addOrUpdateContribution('A', {})).toThrow(); + + expect(() => { + // eslint-disable-next-line no-new + new OutputThrowingCombiner({}); + }).toThrow(); +}); + +test('Modifying contributed documents has no impact when copying documents', () => { + const emptyObject = {}; + const simpleObject = { a: 1 }; + const nestedObject = { b: { c: { d: 9 } } }; + const arrayObject = { e: ['red', 'yellow'] }; + const combiner = new DocumentCombinerWithoutValidation(emptyObject); + combiner.addOrUpdateContribution('simple', simpleObject); + simpleObject.a = 2; + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe('{"a":1}'); + combiner.addOrUpdateContribution('nested', nestedObject); + nestedObject.b.c = { d: 9876 }; + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"b":{"c":{"d":9}}}'); + combiner.addOrUpdateContribution('array', arrayObject); + arrayObject.e.push('blue'); + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe('{"a":1,"b":{"c":{"d":9}},"e":["red","yellow"]}'); +}); + +test('Modifying contributed documents has an impact when not copying documents', () => { + const emptyObject = {}; + const simpleObject = { a: 1 }; + const nestedObject = { b: { c: { d: 9 } } }; + const arrayObject = { e: ['red', 'yellow'] }; + const combiner = new DocumentCombinerWithoutValidation(emptyObject, { + copyDocuments: false, + ignoreDuplicateProperties: false, + }); + combiner.addOrUpdateContribution('simple', simpleObject); + simpleObject.a = 2; + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe('{"a":2}'); + combiner.addOrUpdateContribution('nested', nestedObject); + nestedObject.b.c = { d: 9876 }; + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe('{"a":2,"b":{"c":{"d":9876}}}'); + combiner.addOrUpdateContribution('array', arrayObject); + arrayObject.e.push('blue'); + combiner.rebuild(); + expect(JSON.stringify(combiner.output)).toBe( + '{"a":2,"b":{"c":{"d":9876}},"e":["red","yellow","blue"]}', + ); +}); diff --git a/lib/platform-bible-utils/src/document-combiner.ts b/lib/platform-bible-utils/src/document-combiner.ts new file mode 100644 index 0000000000..31e0502585 --- /dev/null +++ b/lib/platform-bible-utils/src/document-combiner.ts @@ -0,0 +1,394 @@ +import PlatformEventEmitter from './platform-event-emitter.model'; +import { deepClone } from './util'; + +type JsonObjectLike = { [key: string]: unknown }; +type JsonArrayLike = unknown[]; + +export type JsonDocumentLike = JsonObjectLike | JsonArrayLike; + +/** + * Options for DocumentCombiner objects + * + * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before + * composing the output. If false, then changes made to provided documents after they are + * contributed will be reflected in the next time output is composed. + * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in + * contributed documents. If false, then throw when duplicate properties are seen in contributed + * documents. + */ +export type DocumentCombinerOptions = { + copyDocuments: boolean; + ignoreDuplicateProperties: boolean; +}; + +/** + * Base class for any code that wants to compose JSON documents (primarily in the form of JS objects + * or arrays) together into a single output document. + */ +export default class DocumentCombiner { + protected baseDocument: JsonDocumentLike; + protected readonly contributions = new Map(); + protected latestOutput: JsonDocumentLike | undefined; + protected readonly options: DocumentCombinerOptions; + private readonly onDidRebuildEmitter = new PlatformEventEmitter(); + /** Event that emits to announce that the document has been rebuilt and the output has been updated */ + // Need `onDidRebuildEmitter` to be instantiated before this line + // eslint-disable-next-line @typescript-eslint/member-ordering + readonly onDidRebuild = this.onDidRebuildEmitter.subscribe; + + /** + * Create a DocumentCombiner instance + * + * @param baseDocument This is the first document that will be used when composing the output + * @param options Options used by this object when combining documents + */ + protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) { + // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it + this.baseDocument = baseDocument; + this.options = options; + this.updateBaseDocument(baseDocument); + } + + /** + * Update the starting document for composition process + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + * @returns Recalculated output document given the new starting state and existing other documents + */ + updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined { + this.validateBaseDocument(baseDocument); + this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument; + this.baseDocument = this.transformBaseDocumentAfterValidation(this.baseDocument); + return this.rebuild(); + } + + /** + * Add or update one of the contribution documents for the composition process + * + * Note: the order in which contribution documents are added can be considered to be indeterminate + * as it is currently ordered by however `Map.forEach` provides the contributions. The order + * matters when merging two arrays into one. Also, when `options.ignoreDuplicateProperties` is + * `true`, the order also matters when adding the same property to an object that is already + * provided previously. Please let us know if you have trouble because of indeterminate + * contribution ordering. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + * @returns Recalculated output document given the new or updated contribution and existing other + * documents + */ + addOrUpdateContribution( + documentName: string, + document: JsonDocumentLike, + ): JsonDocumentLike | undefined { + this.validateContribution(documentName, document); + const previousDocumentVersion = this.contributions.get(documentName); + let documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document; + documentToSet = this.transformContributionAfterValidation(documentName, documentToSet); + this.contributions.set(documentName, documentToSet); + try { + return this.rebuild(); + } catch (error) { + // If the output isn't valid after adding/updating the contribution, put it back how it was + if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion); + else this.contributions.delete(documentName); + throw new Error(`Error when setting the document named ${documentName}: ${error}`); + } + } + + /** + * Delete one of the contribution documents for the composition process + * + * @param documentName Name of the contributed document to delete + * @returns Recalculated output document given the remaining other documents + */ + deleteContribution(documentName: string): JsonDocumentLike | undefined { + const document = this.contributions.get(documentName); + if (!document) throw new Error(`${documentName} does not exist`); + this.contributions.delete(documentName); + try { + return this.rebuild(); + } catch (error) { + // If the output isn't valid after deleting the contribution, put it back and rethrow + this.contributions.set(documentName, document); + throw new Error(`Error when deleting the document named ${documentName}: ${error}`); + } + } + + /** + * Delete all present contribution documents for the composition process and return to the base + * document + * + * @returns Recalculated output document consisting only of the base document + */ + deleteAllContributions(): JsonDocumentLike | undefined { + if (this.contributions.size <= 0) return this.latestOutput; + + // Save out all contributions + const contributions = [...this.contributions.entries()]; + + // Delete all contributions + contributions.forEach(([contributionName]) => this.contributions.delete(contributionName)); + + // Rebuild with no contributions + try { + return this.rebuild(); + } catch (error) { + // If the output isn't valid after deleting all contributions, put them back and rethrow + contributions.forEach(([contributionName, document]) => + this.contributions.set(contributionName, document), + ); + throw new Error(`Error when deleting all contributions: ${error}`); + } + } + + /** + * Run the document composition process given the starting document and all contributions. Throws + * if the output document fails to validate properly. + * + * @returns Recalculated output document given the starting and contributed documents + */ + rebuild(): JsonDocumentLike | undefined { + // The starting document is the output if there are no other contributions + if (this.contributions.size === 0) { + let potentialOutput = deepClone(this.baseDocument); + potentialOutput = this.transformFinalOutputBeforeValidation(potentialOutput); + this.validateOutput(potentialOutput); + this.latestOutput = potentialOutput; + this.onDidRebuildEmitter.emit(undefined); + return this.latestOutput; + } + + // Compose the output by validating each document one at a time to pinpoint errors better + let outputIteration = this.baseDocument; + this.contributions.forEach((contribution: JsonDocumentLike) => { + outputIteration = mergeObjects( + outputIteration, + contribution, + this.options.ignoreDuplicateProperties, + ); + this.validateOutput(outputIteration); + }); + outputIteration = this.transformFinalOutputBeforeValidation(outputIteration); + this.validateOutput(outputIteration); + this.latestOutput = outputIteration; + this.onDidRebuildEmitter.emit(undefined); + return this.latestOutput; + } + + /** + * Transform the starting document that is given to the combiner. This transformation occurs after + * validating the base document and before combining any contributions. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the `baseDocument` passed in. + * + * @param baseDocument Initial input document. Already validated via `validateBaseDocument` + * @returns Transformed base document + */ + // We just don't need `this` here. This is basically a no-op function that is available to child + // classes to override + // eslint-disable-next-line class-methods-use-this + protected transformBaseDocumentAfterValidation(baseDocument: JsonDocumentLike): JsonDocumentLike { + return baseDocument; + } + + /** + * Transform the contributed document associated with `documentName`. This transformation occurs + * after validating the contributed document and before combining with other documents. + * + * WARNING: If you do not create the combiner with option `copyDocuments: true` or clone inside + * this method, this method will directly modify the contributed `document` passed in. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine. Already validated via + * `validateContribution` + * @returns Transformed contributed document + */ + // We just don't need `this` here. This is basically a no-op function that is available to child + // classes to override + // eslint-disable-next-line class-methods-use-this + protected transformContributionAfterValidation( + // @ts-expect-error this parameter is unused but may be used in child classes + documentName: string, + document: JsonDocumentLike, + ): JsonDocumentLike { + return document; + } + + /** + * Throw an error if the provided document is not a valid starting document. + * + * @param baseDocument Base JSON document/JS object that all other documents are added to + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + protected validateBaseDocument(baseDocument: JsonDocumentLike): void {} + + /** + * Throw an error if the provided document is not a valid contribution document. + * + * @param documentName Name of the contributed document to combine + * @param document Content of the contributed document to combine + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + protected validateContribution(documentName: string, document: JsonDocumentLike): void {} + + /** + * Throw an error if the provided output is not valid. + * + * @param output Output document that could potentially be returned to callers + */ + // no-op intended to be overridden by child classes. Can't be static + // @ts-expect-error ts(6133) parameter doesn't need to be used but still needs the right name + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + protected validateOutput(output: JsonDocumentLike): void {} + + /** + * Transform the document that is the composition of the base document and all contribution + * documents. This is the last step that will be run prior to validation via `validateOutput` + * before `this.latestOutput` is updated to the new output. + * + * @param finalOutput Final output document that could potentially be returned to callers. "Final" + * means no further contribution documents will be merged. + */ + // no-op intended to be overridden by child classes. Can't be static + // eslint-disable-next-line class-methods-use-this + protected transformFinalOutputBeforeValidation(finalOutput: JsonDocumentLike): JsonDocumentLike { + return finalOutput; + } +} + +// #region Helper functions + +/** + * Determines if the input values are objects but not arrays + * + * @param values Objects to check + * @returns True if all the values are objects but not arrays + */ +function areNonArrayObjects(...values: unknown[]): boolean { + let allMatch = true; + values.forEach((value: unknown) => { + if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false; + }); + return allMatch; +} + +/** + * Determines if the input values are arrays + * + * @param value Objects to check + * @returns True if the values are arrays + */ +function areArrayObjects(...values: unknown[]): boolean { + let allMatch = true; + values.forEach((value: unknown) => { + if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false; + }); + return allMatch; +} + +/** + * Deep clone and recursively merge the properties of one object (copyFrom) into another + * (startingPoint). Throws if copyFrom would overwrite values already existing in startingPoint. + * + * Does not modify the objects passed in. + * + * @param startingPoint Object that is the starting point for the return value + * @param copyFrom Object whose values are copied into the return value + * @param ignoreDuplicateProperties Whether to ignore object properties that are present in + * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object + * property in `copyFrom` is already present in `startingPoint` + * @returns Object that is the combination of the two documents + */ +function mergeObjects( + startingPoint: JsonDocumentLike, + copyFrom: JsonDocumentLike, + ignoreDuplicateProperties: boolean, +): JsonDocumentLike { + const retVal = deepClone(startingPoint); + + if (!copyFrom) return retVal; + + return mergeObjectsInternal(retVal, deepClone(copyFrom), ignoreDuplicateProperties); +} + +/** + * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if + * copyFrom would overwrite values already existing in startingPoint. + * + * WARNING: Modifies the argument objects in some way. Recommended to use `mergeObjects` + * + * @param startingPoint Object that is the starting point for the return value + * @param copyFrom Object whose values are copied into the return value + * @param ignoreDuplicateProperties Whether to ignore object properties that are present in + * `copyFrom` that are already present in `startingPoint`. If `false`, throws when an object + * property in `copyFrom` is already present in `startingPoint` + * @returns Object that is the combination of the two documents + */ +function mergeObjectsInternal( + startingPoint: JsonDocumentLike, + copyFrom: JsonDocumentLike, + ignoreDuplicateProperties: boolean, +): JsonDocumentLike { + if (!copyFrom) return startingPoint; + + if (areNonArrayObjects(startingPoint, copyFrom)) { + // Merge properties since they are both objects + + // We know these are objects from the `if` check + /* eslint-disable no-type-assertion/no-type-assertion */ + const startingPointObj = startingPoint as JsonObjectLike; + const copyFromObj = copyFrom as JsonObjectLike; + /* eslint-enable no-type-assertion/no-type-assertion */ + Object.keys(copyFromObj).forEach((key: string | number) => { + if (Object.hasOwn(startingPointObj, key)) { + if (areNonArrayObjects(startingPointObj[key], copyFromObj[key])) { + startingPointObj[key] = mergeObjectsInternal( + // We know these are objects from the `if` check + /* eslint-disable no-type-assertion/no-type-assertion */ + startingPointObj[key] as JsonObjectLike, + copyFromObj[key] as JsonObjectLike, + ignoreDuplicateProperties, + /* eslint-enable no-type-assertion/no-type-assertion */ + ); + } else if (areArrayObjects(startingPointObj[key], copyFromObj[key])) { + // Concat the arrays since they are both arrays + + // We know these are arrays from the `else if` check + /* eslint-disable no-type-assertion/no-type-assertion */ + startingPointObj[key] = (startingPointObj[key] as JsonArrayLike).concat( + copyFromObj[key] as JsonArrayLike, + ); + /* eslint-enable no-type-assertion/no-type-assertion */ + } else if (!ignoreDuplicateProperties) + throw new Error(`Cannot merge objects: key "${key}" already exists in the target object`); + // Note that the first non-object non-array value that gets placed in a property stays. + // New values do not override existing ones + } else { + startingPointObj[key] = copyFromObj[key]; + } + }); + } else if (areArrayObjects(startingPoint, copyFrom)) { + // Concat the arrays since they are both arrays + + // Push the contents of copyFrom into startingPoint since it is a const and was already deep cloned + // We know these are objects from the `else if` check + /* eslint-disable no-type-assertion/no-type-assertion */ + (startingPoint as JsonArrayLike).push(...(copyFrom as JsonArrayLike)); + /* eslint-enable no-type-assertion/no-type-assertion */ + } + + // Note that nothing happens if `startingPoint` is not an object or an array or if `startingPoint` + // and `copyFrom` are not both object or both arrays. Should we throw? Should we push `copyFrom`'s + // values into the array? Other? Maybe one day we can add some options to decide what to do in + // this situation, but YAGNI for now + + return startingPoint; +} + +// #endregion diff --git a/lib/platform-bible-utils/src/equality-checking.ts b/lib/platform-bible-utils/src/equality-checking.ts new file mode 100644 index 0000000000..effe475dab --- /dev/null +++ b/lib/platform-bible-utils/src/equality-checking.ts @@ -0,0 +1,31 @@ +// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I +// think allows comparing React refs (which have circular references in particular places that this +// library would ignore). Maybe we can change to that version sometime if needed. +import { deepEqual as isEqualDeep } from 'fast-equals'; + +/** + * Check that two objects are deeply equal, comparing members of each object and such + * + * @param a The first object to compare + * @param b The second object to compare + * + * WARNING: Objects like arrays from different iframes have different constructor function + * references even if they do the same thing, so this deep equality comparison fails objects that + * look the same but have different constructors because different constructors could produce + * false positives in [a few specific + * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96). + * This means that two objects like arrays from different iframes that look the same will fail + * this check. Please use some other means to check deep equality in those situations. + * + * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to + * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3 + * }` are not considered equal in this case + * + * - For more information and examples, see [this + * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs). + * + * @returns True if a and b are deeply equal; false otherwise + */ +export default function deepEqual(a: unknown, b: unknown) { + return isEqualDeep(a, b); +} diff --git a/lib/platform-bible-utils/src/index.ts b/lib/platform-bible-utils/src/index.ts new file mode 100644 index 0000000000..3708bc79da --- /dev/null +++ b/lib/platform-bible-utils/src/index.ts @@ -0,0 +1,148 @@ +// Classes +export { default as AsyncVariable } from './async-variable'; +export { default as Collator } from './intl-collator'; +export { default as DateTimeFormat } from './intl-date-time-format'; +export { default as DocumentCombiner } from './document-combiner'; +export { default as Mutex } from './mutex'; +export { default as MutexMap } from './mutex-map'; +export { default as NonValidatingDocumentCombiner } from './non-validating-document-combiner'; +export { default as NumberFormat } from './intl-number-format'; +export { default as PlatformEventEmitter } from './platform-event-emitter.model'; +export { default as UnsubscriberAsyncList } from './unsubscriber-async-list'; + +// Consts +export { + getChaptersForBook, + offsetBook, + offsetChapter, + offsetVerse, + FIRST_SCR_BOOK_NUM, + LAST_SCR_BOOK_NUM, + FIRST_SCR_CHAPTER_NUM, + FIRST_SCR_VERSE_NUM, + getLocalizeKeyForScrollGroupId, + getLocalizeKeysForScrollGroupIds, +} from './scripture-util'; +export { aggregateUnsubscribers, aggregateUnsubscriberAsyncs } from './unsubscriber'; + +// Functions +export { + newGuid, + isString, + deepClone, + debounce, + groupBy, + getErrorMessage, + wait, + waitForDuration, + getAllObjectFunctionNames, + createSyncProxyForAsyncObject, +} from './util'; +export { + compareScrRefs, + formatScrRef, + getLocalizedIdFromBookNumber, + scrRefToBBBCCCVVV, +} from './scripture-util'; +export { + at, + charAt, + codePointAt, + endsWith, + escapeStringRegexp, + formatReplacementString, + includes, + indexOf, + isLocalizeKey, + lastIndexOf, + stringLength, + normalize, + padEnd, + padStart, + slice, + split, + startsWith, + substring, + toArray, + ordinalCompare, + transformAndEnsureRegExpRegExpArray, + transformAndEnsureRegExpArray, +} from './string-util'; +export { default as deepEqual } from './equality-checking'; +export { default as isSubset } from './subset-checking'; +export { serialize, deserialize, isSerializable, htmlEncode } from './serialization'; +export { default as getCurrentLocale } from './intl-util'; +export { default as formatBytes } from './number-utils'; +export { default as ensureArray } from './array-util'; + +// Types +export type { DeepPartial, ReplaceType, UnionToIntersection } from './util'; +export type { + Dispose, + OnDidDispose, + CannotHaveOnDidDispose, + CanHaveOnDidDispose, +} from './disposal.model'; +export type { PlatformEventHandler, PlatformEvent, PlatformEventAsync } from './platform-event'; +export type { + BookInfo, + ScriptureReference, + ScrollGroupId, + ScriptureNode, + ScriptureSelection, + ScriptureTextAnchor, +} from './scripture.model'; +export type { Unsubscriber, UnsubscriberAsync } from './unsubscriber'; +export type { DocumentCombinerOptions, JsonDocumentLike } from './document-combiner'; +export type { + LanguageStrings, + LocalizedStringDataContribution, + LocalizedStringValue, + StringMetadata, + StringsMetadata, +} from './localized-strings.model'; +export { localizedStringsDocumentSchema } from './localized-strings.model'; +export type { + LocalizeKey, + ReferencedItem, + OrderedItem, + OrderedExtensibleContainer, + MenuItemBase, + MenuItemContainingSubmenu, + MenuItemContainingCommand, + MenuGroupDetailsInColumn, + MenuGroupDetailsInSubMenu, + MenuColumnWithHeader, + GroupsInSingleColumnMenu, + GroupsInMultiColumnMenu, + ColumnsWithHeaders, + SingleColumnMenu, + MultiColumnMenu, + WebViewMenu, + WebViewMenus, + PlatformMenus, + Localized, +} from './menus.model'; +export { menuDocumentSchema } from './menus.model'; +export type { + ExtensionControlledProjectSetting, + ExtensionControlledSetting, + ExtensionControlledState, + ModifierExtensionControlled, + ModifierProject, + ProjectSetting, + ProjectSettingBase, + ProjectSettingProperties, + ProjectSettingsContribution, + ProjectSettingsGroup, + ProjectStateContribution, + Setting, + SettingBase, + SettingProperties, + SettingsContribution, + SettingsGroup, + StateBase, + UserState, + UserStateContribution, +} from './settings.model'; +export { projectSettingsDocumentSchema, settingsDocumentSchema } from './settings.model'; diff --git a/lib/platform-bible-utils/src/intl-collator.test.ts b/lib/platform-bible-utils/src/intl-collator.test.ts new file mode 100644 index 0000000000..0d399c451d --- /dev/null +++ b/lib/platform-bible-utils/src/intl-collator.test.ts @@ -0,0 +1,24 @@ +import Collator from './intl-collator'; + +const testCollator: Collator = new Collator('en'); +const STRING_Z = 'z'; +const STRING_A = 'a'; + +describe('Collator', () => { + describe('compare', () => { + it('should return integer greater than 0', () => { + const result = testCollator.compare(STRING_Z, STRING_A); + expect(result).toBeGreaterThan(0); + }); + + it('should return integer less than 0', () => { + const result = testCollator.compare(STRING_A, STRING_Z); + expect(result).toBeLessThan(0); + }); + + it('should return 0', () => { + const result = testCollator.compare(STRING_Z, STRING_Z); + expect(result).toEqual(0); + }); + }); +}); diff --git a/lib/platform-bible-utils/src/intl-collator.ts b/lib/platform-bible-utils/src/intl-collator.ts new file mode 100644 index 0000000000..d50a44c71b --- /dev/null +++ b/lib/platform-bible-utils/src/intl-collator.ts @@ -0,0 +1,31 @@ +/** Enables language-sensitive string comparison. Wraps Intl.Collator */ +export default class Collator { + private collator: Intl.Collator; + + constructor(locales?: string | string[], options?: Intl.CollatorOptions) { + this.collator = new Intl.Collator(locales, options); + } + + /** + * Compares two strings according to the sort order of this Collator object + * + * @param string1 String to compare + * @param string2 String to compare + * @returns A number indicating how string1 and string2 compare to each other according to the + * sort order of this Collator object. Negative value if string1 comes before string2. Positive + * value if string1 comes after string2. 0 if they are considered equal. + */ + compare(string1: string, string2: string): number { + return this.collator.compare(string1, string2); + } + + /** + * Returns a new object with properties reflecting the locale and collation options computed + * during initialization of this collator object. + * + * @returns ResolvedCollatorOptions object + */ + resolvedOptions(): Intl.ResolvedCollatorOptions { + return this.collator.resolvedOptions(); + } +} diff --git a/lib/platform-bible-utils/src/intl-date-time-format.test.ts b/lib/platform-bible-utils/src/intl-date-time-format.test.ts new file mode 100644 index 0000000000..b37b3e7add --- /dev/null +++ b/lib/platform-bible-utils/src/intl-date-time-format.test.ts @@ -0,0 +1,43 @@ +import DateTimeFormat from './intl-date-time-format'; + +const testDateTimeFormatter: DateTimeFormat = new DateTimeFormat('en'); +const START_DATE = new Date(2024, 3, 25, 12, 30, 0); +const START_DATE_FORMATTED = '4/25/2024'; +const END_DATE = new Date(2024, 3, 30, 12, 30, 0); +const RANGE_FORMATTED = '4/25/2024 – 4/30/2024'; // Intl returns these space and dash characters instead of normal ones + +describe('DateTimeFormatter', () => { + describe('format', () => { + it('should return string with formatted date', () => { + const result = testDateTimeFormatter.format(START_DATE); + expect(result).toEqual(START_DATE_FORMATTED); + }); + }); + + describe('formatRange', () => { + it('should return string with formatted date range', () => { + const result = testDateTimeFormatter.formatRange(START_DATE, END_DATE); + expect(result).toEqual(RANGE_FORMATTED); + }); + }); + + describe('formatRangeToParts', () => { + it('should return an array of date-time format parts', () => { + const result = testDateTimeFormatter.formatRangeToParts(START_DATE, END_DATE); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + }); + }); + + describe('formatToParts', () => { + it('should return an array of date-time format parts', () => { + const result = testDateTimeFormatter.formatToParts(START_DATE); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + }); + }); +}); diff --git a/lib/platform-bible-utils/src/intl-date-time-format.ts b/lib/platform-bible-utils/src/intl-date-time-format.ts new file mode 100644 index 0000000000..d278d6d19c --- /dev/null +++ b/lib/platform-bible-utils/src/intl-date-time-format.ts @@ -0,0 +1,64 @@ +/** Enables language-sensitive data and time formatting. Wraps Intl.DateTimeFormat */ +export default class DateTimeFormat { + private dateTimeFormatter: Intl.DateTimeFormat; + + constructor(locales?: string | string[], options?: Intl.DateTimeFormatOptions) { + this.dateTimeFormatter = new Intl.DateTimeFormat(locales, options); + } + + /** + * Formats a date according to the locale and formatting option for this DateTimeFormat object + * + * @param date The date to format + * @returns String representing the given date formatted according to the locale and formatting + * options of this DateTimeFormat object + */ + format(date: Date): string { + return this.dateTimeFormatter.format(date); + } + + /** + * Formats a date range in the most concise way based on the locales and options provided when + * instantiating this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns String representing the given date range formatted according to the locale and + * formatting options of this DateTimeFormat object + */ + formatRange(startDate: Date, endDate: Date): string { + return this.dateTimeFormatter.formatRange(startDate, endDate); + } + + /** + * Returns an array of locale-specific tokens representing each part of the formatted date range + * produced by this DateTimeFormat object + * + * @param startDate Date object representing start of the date range + * @param endDate Date object representing the end of the date range + * @returns Array of DateTimeRangeFormatPart objects + */ + formatRangeToParts(startDate: Date, endDate: Date): Intl.DateTimeRangeFormatPart[] { + return this.dateTimeFormatter.formatRangeToParts(startDate, endDate); + } + + /** + * Allows locale-aware formatting of strings produced by this DateTimeFormat object + * + * @param date The date to format + * @returns Array of DateTimeFormatPart objects + */ + formatToParts(date: Date): Intl.DateTimeFormatPart[] { + return this.dateTimeFormatter.formatToParts(date); + } + + /** + * Returns a new object with properties reflecting the locale and date and time formatting options + * computed during initialization of this DateTimeFormat object + * + * @returns ResolvedDateTimeFormatOptions object + */ + resolvedOptions(): Intl.ResolvedDateTimeFormatOptions { + return this.dateTimeFormatter.resolvedOptions(); + } +} diff --git a/lib/platform-bible-utils/src/intl-number-format.test.ts b/lib/platform-bible-utils/src/intl-number-format.test.ts new file mode 100644 index 0000000000..928a1346cd --- /dev/null +++ b/lib/platform-bible-utils/src/intl-number-format.test.ts @@ -0,0 +1,43 @@ +import NumberFormat from './intl-number-format'; + +const testNumberFormatter: NumberFormat = new NumberFormat('en'); +const START_NUMBER = 654321.987; +const FORMATTED_NUMBER = '654,321.987'; +const END_NUMBER = 754321.987; +const FORMATTED_RANGE = '654,321.987–754,321.987'; + +describe('NumberFormat', () => { + describe('format', () => { + it('should return a string of the formatted number', () => { + const result = testNumberFormatter.format(START_NUMBER); + expect(result).toEqual(FORMATTED_NUMBER); + }); + }); + + describe('formatRange', () => { + it('should return a string of the formatted range', () => { + const result = testNumberFormatter.formatRange(START_NUMBER, END_NUMBER); + expect(result).toEqual(FORMATTED_RANGE); + }); + }); + + describe('formatRangeToParts', () => { + it('should return an array of number range format parts', () => { + const result = testNumberFormatter.formatRangeToParts(START_NUMBER, END_NUMBER); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + }); + }); + + describe('formatToParts', () => { + it('should return an array of number format parts', () => { + const result = testNumberFormatter.formatToParts(START_NUMBER); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + }); + }); +}); diff --git a/lib/platform-bible-utils/src/intl-number-format.ts b/lib/platform-bible-utils/src/intl-number-format.ts new file mode 100644 index 0000000000..dcd7e143ae --- /dev/null +++ b/lib/platform-bible-utils/src/intl-number-format.ts @@ -0,0 +1,68 @@ +/** Enables language-sensitive number formatting. Wraps Intl.NumberFormat */ +export default class NumberFormat { + private numberFormatter: Intl.NumberFormat; + + constructor(locales?: string | string[], options?: Intl.NumberFormatOptions) { + this.numberFormatter = new Intl.NumberFormat(locales, options); + } + + /** + * Formats a number according to the locale and formatting options of this NumberFormat object + * + * @param value Number or BigInt to format + * @returns String representing the given number formatted according to the locale and formatting + * options of this NumberFormat object + */ + format(value: number | bigint): string { + return this.numberFormatter.format(value); + } + + /** + * Formats a range of numbers according to the locale and formatting options of this NumberFormat + * object + * + * @param startRange Number or bigint representing the start of the range + * @param endRange Number or bigint representing the end of the range + * @returns String representing the given range of numbers formatted according to the locale and + * formatting options of this NumberFormat object + */ + formatRange(startRange: number | bigint, endRange: number | bigint): string { + return this.numberFormatter.formatRange(startRange, endRange); + } + + /** + * Returns an array of objects containing the locale-specific tokens from which it is possible to + * build custom strings while preserving the locale-specific parts. + * + * @param startRange Number or bigint representing start of the range + * @param endRange Number or bigint representing end of the range + * @returns Array of NumberRangeFormatPart objects containing the formatted range of numbers in + * parts + */ + formatRangeToParts( + startRange: number | bigint, + endRange: number | bigint, + ): Intl.NumberRangeFormatPart[] { + return this.numberFormatter.formatRangeToParts(startRange, endRange); + } + + /** + * Allows locale-aware formatting of strings produced by this NumberFormat object + * + * @param value Number or bigint to format + * @returns Array of NumberFormatPart objects containing the formatted number in parts + */ + formatToParts(value: number | bigint): Intl.NumberFormatPart[] { + return this.numberFormatter.formatToParts(value); + } + + /** + * Returns a new object with properties reflecting the locale and number formatting options + * computed during initialization of this NumberFormat object + * + * @returns ResolvedNumberFormatOptions object + */ + resolvedOptions(): Intl.ResolvedNumberFormatOptions { + return this.numberFormatter.resolvedOptions(); + } +} diff --git a/lib/platform-bible-utils/src/intl-util.test.ts b/lib/platform-bible-utils/src/intl-util.test.ts new file mode 100644 index 0000000000..c1175c5fe9 --- /dev/null +++ b/lib/platform-bible-utils/src/intl-util.test.ts @@ -0,0 +1,49 @@ +import getCurrentLocale from './intl-util'; + +jest.mock('./intl-date-time-format', () => { + return jest.fn().mockImplementation(() => ({ + resolvedOptions: jest.fn().mockImplementation(() => { + return { locale: 'he' }; + }), + })); +}); + +let originalNavigator: Navigator | undefined; + +describe('getCurrentLocale', () => { + beforeAll(() => { + // Store the original global.navigator before tests modify + originalNavigator = global.navigator; + }); + + afterEach(() => { + // Reset global.navigator to its original value + if (originalNavigator) { + global.navigator = originalNavigator; + } + }); + + it('should return the first language in navigator.languages array', () => { + // Set the languages so that navigator is defined + Object.defineProperty(global, 'navigator', { + value: { + languages: ['en', 'fr'], + }, + writable: true, + }); + + expect(getCurrentLocale()).toEqual('en'); + }); + + it('should return the locale resolved by DateTimeFormat when navigator.languages is not available', () => { + // Set navigator to undefined + Object.defineProperty(global, 'navigator', { + value: { + undefined, + }, + writable: true, + }); + + expect(getCurrentLocale()).toEqual('he'); + }); +}); diff --git a/lib/platform-bible-utils/src/intl-util.ts b/lib/platform-bible-utils/src/intl-util.ts new file mode 100644 index 0000000000..e8335cb611 --- /dev/null +++ b/lib/platform-bible-utils/src/intl-util.ts @@ -0,0 +1,16 @@ +import DateTimeFormat from './intl-date-time-format'; + +/** + * Retrieves the current locale of the user's environment. + * + * @returns A string representing the current locale. If the locale cannot be determined, the + * function returns an empty string. + */ +export default function getCurrentLocale(): string { + // Use navigator when available + if (typeof navigator !== 'undefined' && navigator.languages) { + return navigator.languages[0]; + } + // For Node.js + return new DateTimeFormat().resolvedOptions().locale; +} diff --git a/lib/platform-bible-utils/src/localized-strings.model.test.ts b/lib/platform-bible-utils/src/localized-strings.model.test.ts new file mode 100644 index 0000000000..4f3ecf4ef8 --- /dev/null +++ b/lib/platform-bible-utils/src/localized-strings.model.test.ts @@ -0,0 +1,167 @@ +import { localizedStringsDocumentSchema } from './localized-strings.model'; + +describe('fallbackKey regex', () => { + const fallbackKeyRegExp = new RegExp( + localizedStringsDocumentSchema.$defs.stringMetadata.properties.fallbackKey.pattern, + ); + + test('passes on normal LocalizeKeys', () => { + expect(fallbackKeyRegExp.test('%test_underscore%')).toBeTruthy(); + expect(fallbackKeyRegExp.test('%test-hyphen%')).toBeTruthy(); + }); + + test('fails on not LocalizeKeys', () => { + expect(fallbackKeyRegExp.test('test_stuff%')).toBeFalsy(); + expect(fallbackKeyRegExp.test('%test_stuff')).toBeFalsy(); + expect(fallbackKeyRegExp.test('%%')).toBeFalsy(); + }); + + test('passes on even the weirdest Paratext 9 keys', () => { + // This key is pretty typical with .;& and normal space + expect( + fallbackKeyRegExp.test( + '%Paratext.Repository.SendReceiveProjectsForm.lblProjectsTotal_MouseClick."Save As Html..."%', + ), + ).toBeTruthy(); + // , + expect( + fallbackKeyRegExp.test( + '%Paratext.Repository.SendReceiveProjectsForm.uiProjectList_RenderItem."If necessary, ask the project administrator to share the projects with you."%', + ), + ).toBeTruthy(); + // ' + expect( + fallbackKeyRegExp.test( + "%Paratext.PTLive.PTLiveDedicatedServerForm.RefreshUserList."There's a connection problem."%", + ), + ).toBeTruthy(); + // () + expect( + fallbackKeyRegExp.test( + '%Paratext.PTLive.PTLiveSessionManager.CreateServerSilent."Internet server (secondary)"%', + ), + ).toBeTruthy(); + // {}#? + expect( + fallbackKeyRegExp.test( + '%Paratext.PTLive.PTLiveSessionManager.BeginSession."The following files are different from the shared project. Do you wish to overwrite them with the shared project files? This is necessary for you (a project observer) to use Paratext Live. {0}"%', + ), + ).toBeTruthy(); + // : + expect( + fallbackKeyRegExp.test( + '%Paratext.PTLive.LocalSyncServer.MakeServerDisplayName."Local default (this computer: {0})"%', + ), + ).toBeTruthy(); + // / + expect( + fallbackKeyRegExp.test( + '%Paratext.PTLive.PTLiveControlCentre.BeforeSharingProject."You are an observer on project {0}. You cannot do a Send/Receive while Paratext Live is running."%', + ), + ).toBeTruthy(); + // \ + expect( + fallbackKeyRegExp.test( + '%Paratext.Checking.Reference.CrossReferenceScanner..ctor."Missing \\xt"%', + ), + ).toBeTruthy(); + // % + expect( + fallbackKeyRegExp.test( + '%Paratext.UpdateStatusForm.RefreshStatus."Downloading {0} {1}% of {2}MB has been downloaded."%', + ), + ).toBeTruthy(); + // ⋮ + expect( + fallbackKeyRegExp.test( + '%Paratext.TextForm.UpdateRibbonMessages."To determine if any content needs reordering, select "Tools > Check study content order" or click the link below. If you have editing permission on a chapter, you may use the "⋮" menu on any study content to reorder it."%', + ), + ).toBeTruthy(); + // | + expect( + fallbackKeyRegExp.test( + '%Paratext.TextForm.changedVerseTextToolStripMenuItem_Click."Some verse text has changed. Changes are shown as {original text|new text}."%', + ), + ).toBeTruthy(); + // [] + expect( + fallbackKeyRegExp.test('%Paratext.EditMenu.FindReplaceForm.cmbWordRestrictions.Items[0]%'), + ).toBeTruthy(); + // “” + expect( + fallbackKeyRegExp.test( + '%Paratext.ToolsMenu.ConvertProjectForm..ctor."This dialog allows converting your project into another project applying chosen transformations. This process can take a long time. You must enter the name of a registered Paratext user in the “With” box, spelling it exactly as it appears in the user’s official registration."%', + ), + ).toBeTruthy(); + // ‘’ + expect( + fallbackKeyRegExp.test( + '%Paratext.RegistrationForm..ctor."It will greatly assist the global support team to know who currently provides Paratext support to you. If unknown, enter ‘unknown’."%', + ), + ).toBeTruthy(); + // ! + expect( + fallbackKeyRegExp.test( + '%Paratext.ToolsMenu.CopyBooksForm.SetDefaultEligibility."The book in the "From" project is older!!!"%', + ), + ).toBeTruthy(); + // ~ + expect( + fallbackKeyRegExp.test( + '%Paratext.ToolsMenu.NoBreakSpaceReplacer.ReplaceRemovingTildes."This will replace all no-break spaces (currently represented by ~) with normal spaces. Continue?"%', + ), + ).toBeTruthy(); + // * + expect( + fallbackKeyRegExp.test( + "%Paratext.ToolsMenu.StudyBibleForm.ListUnmatchedNotesAndSidebars."All errors marked '***' must be fixed and the Merge repeated."%", + ), + ).toBeTruthy(); + // \u00A0 non-breaking space + expect( + fallbackKeyRegExp.test( + '%Paratext.ProjectMenu.ProjectPropertiesForm.cmbUsfmVersion_SelectedIndexChanged."Changing USFM version of project {0} will enable features introduced in Paratext 9 to support USFM 3."%', + ), + ).toBeTruthy(); + // + + expect( + fallbackKeyRegExp.test('%Paratext.Ruby.RubyEditorPopup..ctor."Ctrl+Right"%'), + ).toBeTruthy(); + // = + expect( + fallbackKeyRegExp.test( + "%Paratext.WordList.WordListForm.EditHyphenation."Enter the hyphenation by adding equal signs '=' at hyphenation points"%", + ), + ).toBeTruthy(); + // • + expect( + fallbackKeyRegExp.test( + '%Paratext.ProjectProgress.PlanListControl.AllowMoveTaskToAnotherStage."Your Project Plan is currently based on "{0}". You are moving a task to a different stage. This has the following consequences: • Recorded progress for this task will be lost. • You will not be able to update to a new version of "{0}"."%', + ), + ).toBeTruthy(); + // ` + expect( + fallbackKeyRegExp.test( + '%Paratext.ProjectProgress.Filters.CurrentPriorityFilter`1.get_Description."Current priority"%', + ), + ).toBeTruthy(); + // … + expect( + fallbackKeyRegExp.test( + '%Paratext.Marble.MarbleTabBase.AppendUserFeedbackHtml."Give feedback…&nbsp;(optional)"%', + ), + ).toBeTruthy(); + // \u200B zeo-width space + expect( + fallbackKeyRegExp.test( + '%Paratext.ParallelPassages."The current active window is a resource text. To check an editable project, click on that project window and ​re-launch this tool."%', + ), + ).toBeTruthy(); + // ↑↓ + expect( + fallbackKeyRegExp.test( + '%Paratext.Base.ParatextWindows.WindowManagerHelper..ctor."Previous verse (Ctrl+↑) Next verse (Ctrl+↓)"%', + ), + ).toBeTruthy(); + }); +}); diff --git a/lib/platform-bible-utils/src/localized-strings.model.ts b/lib/platform-bible-utils/src/localized-strings.model.ts new file mode 100644 index 0000000000..6d187fc17a --- /dev/null +++ b/lib/platform-bible-utils/src/localized-strings.model.ts @@ -0,0 +1,133 @@ +//---------------------------------------------------------------------------------------------- +// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets +// changed so they align. +//---------------------------------------------------------------------------------------------- + +import { LocalizeKey } from 'menus.model'; +import { removeJsonToTypeScriptTypesStuff } from './settings.model'; + +/** Localized string value associated with this key */ +export type LocalizedStringValue = string; + +/** The data an extension provides to inform Platform.Bible of the localized strings it provides. */ +export interface LocalizedStringDataContribution { + [k: string]: unknown; + metadata?: StringsMetadata; + localizedStrings?: { + [k: string]: LanguageStrings; + }; +} +/** + * Map whose keys are localized string keys and whose values provide additional non-locale-specific + * information about the localized string key + */ +export interface StringsMetadata { + [k: LocalizeKey]: StringMetadata; +} +/** Additional non-locale-specific information about a localized string key */ +export interface StringMetadata { + [k: string]: unknown; + /** + * Localized string key from which to get this value if one does not exist in the specified + * language. If a new key/value pair needs to be made to replace an existing one, this could help + * smooth over the transition if the meanings are close enough + * + * You can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a + * backslash `\`. + */ + fallbackKey?: LocalizeKey; + /** + * Additional information provided by developers in English to help the translator to know how to + * translate this localized string accurately + */ + notes?: string; +} +/** + * Map whose keys are localized string keys and whose values provide information about how to + * localize strings for the localized string key + */ +export interface LanguageStrings { + [k: LocalizeKey]: LocalizedStringValue; +} + +//---------------------------------------------------------------------------------------------- +// NOTE: If you change the schema below, make sure the TS types above get changed so they align. +//---------------------------------------------------------------------------------------------- + +const localizedStringsDefs = { + languageStrings: { + description: + 'Map whose keys are localized string keys and whose values provide information about how to localize strings for the localized string key', + type: 'object', + patternProperties: { + '^%[\\w\\-\\.]+%$': { + $ref: '#/$defs/localizedStringValue', + }, + }, + additionalProperties: false, + }, + localizedStringValue: { + description: 'Localized string value associated with this key', + type: 'string', + }, + stringsMetadata: { + description: + 'Map whose keys are localized string keys and whose values provide additional non-locale-specific information about the localized string key', + type: 'object', + patternProperties: { + '^%[\\w\\-\\.]+%$': { + $ref: '#/$defs/stringMetadata', + }, + }, + additionalProperties: false, + }, + stringMetadata: { + description: 'Additional non-locale-specific information about a localized string key', + type: 'object', + properties: { + fallbackKey: { + description: + 'Localized string key from which to get this value if one does not exist in the specified language. If a new key/value pair needs to be made to replace an existing one, this could help smooth over the transition if the meanings are close enough.\nYou can use Paratext 9 Localized String Keys here. Be sure to escape any % signs with a backslash `\\`.', + type: 'string', + pattern: "^%[\\w\\-\\.;&,' (){}#:/\\\\?%⋮|[\\]“”‘’!~*\u00A0+=•`…\u200B↑↓]+%$", + tsType: 'LocalizeKey', + }, + notes: { + description: + 'Additional information provided by developers in English to help the translator to know how to translate this localized string accurately', + type: 'string', + }, + }, + }, + localizeKey: { + description: "Identifier for a string that will be localized based on the user's UI language", + type: 'string', + pattern: '^%[\\w\\-\\.]+%$', + tsType: 'LocalizeKey', + }, +}; + +removeJsonToTypeScriptTypesStuff(localizedStringsDefs); + +/** JSON schema object that aligns with the LocalizedStringDataContribution type */ +export const localizedStringsDocumentSchema = { + $schema: 'https://json-schema.org/draft/2020-12/schema', + title: 'Localized String Data Contribution', + description: + 'The data an extension provides to inform Platform.Bible of the localized strings it provides.', + type: 'object', + properties: { + metadata: { + $ref: '#/$defs/stringsMetadata', + }, + localizedStrings: { + type: 'object', + additionalProperties: { + $ref: '#/$defs/languageStrings', + }, + }, + }, + $defs: localizedStringsDefs, +}; + +Object.freeze(localizedStringsDocumentSchema); diff --git a/lib/platform-bible-utils/src/menus.model.ts b/lib/platform-bible-utils/src/menus.model.ts new file mode 100644 index 0000000000..cbac0dfbd8 --- /dev/null +++ b/lib/platform-bible-utils/src/menus.model.ts @@ -0,0 +1,427 @@ +//---------------------------------------------------------------------------------------------- +// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets +// changed so they align. +//---------------------------------------------------------------------------------------------- + +import { ReplaceType } from './util'; + +/** Identifier for a string that will be localized in a menu based on the user's UI language */ +export type LocalizeKey = `%${string}%`; + +/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */ +export type ReferencedItem = `${string}.${string}`; + +export type OrderedItem = { + /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */ + order: number; +}; + +export type OrderedExtensibleContainer = OrderedItem & { + /** Determines whether other items can be added to this after it has been defined */ + isExtensible?: boolean; +}; + +/** Group of menu items that belongs in a column */ +export type MenuGroupDetailsInColumn = OrderedExtensibleContainer & { + /** ID of column in which this group resides */ + column: ReferencedItem; +}; + +/** Group of menu items that belongs in a submenu */ +export type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & { + /** ID of menu item hosting the submenu in which this group resides */ + menuItem: ReferencedItem; +}; + +/** Column that includes header text in a menu */ +export type MenuColumnWithHeader = OrderedExtensibleContainer & { + /** Key that represents the text of the header text of the column */ + label: LocalizeKey; +}; + +export type MenuItemBase = OrderedItem & { + /** Menu group to which this menu item belongs */ + group: ReferencedItem; + /** Key that represents the text of this menu item to display */ + label: LocalizeKey; + /** Key that represents words the platform should reference when users are searching for menu items */ + searchTerms?: LocalizeKey; + /** Key that represents the text to display if a mouse pointer hovers over the menu item */ + tooltip?: LocalizeKey; + /** Additional information provided by developers to help people who perform localization */ + localizeNotes: string; +}; + +/** Menu item that hosts a submenu */ +export type MenuItemContainingSubmenu = MenuItemBase & { + /** ID for this menu item that holds a submenu */ + id: ReferencedItem; +}; + +/** Menu item that runs a command */ +export type MenuItemContainingCommand = MenuItemBase & { + /** Name of the PAPI command to run when this menu item is selected. */ + command: ReferencedItem; + /** + * Uri path to the icon to display after the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathAfter?: string; + /** + * Uri path to the icon to display before the menu text. Ex: + * `papi-extension://helloWorld/assets/icon.png` + */ + iconPathBefore?: string; +}; + +/** + * Group of menu items that can be combined with other groups to form a single context menu/submenu. + * Groups are separated using a line within the menu/submenu. + */ +export type GroupsInSingleColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: OrderedExtensibleContainer | MenuGroupDetailsInSubMenu; +}; + +/** + * Group of menu items that can be combined with other groups to form a single menu/submenu within a + * multi-column menu. Groups are separated using a line within the menu/submenu. + */ +export type GroupsInMultiColumnMenu = { + /** Named menu group */ + [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu; +}; + +/** Group of columns that can be combined with other columns to form a multi-column menu */ +export type ColumnsWithHeaders = { + /** Named column of a menu */ + [property: ReferencedItem]: MenuColumnWithHeader; + /** Defines whether columns can be added to this multi-column menu */ + isExtensible?: boolean; +}; + +/** Menu that contains a column without a header */ +export type SingleColumnMenu = { + /** Groups that belong in this menu */ + groups: GroupsInSingleColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; + +/** Menu that contains multiple columns with headers */ +export type MultiColumnMenu = { + /** Columns that belong in this menu */ + columns: ColumnsWithHeaders; + /** Groups that belong in this menu */ + groups: GroupsInMultiColumnMenu; + /** List of menu items that belong in this menu */ + items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[]; +}; + +/** Menus for one single web view */ +export type WebViewMenu = { + /** Indicates whether the platform default menus should be included for this webview */ + includeDefaults: boolean | undefined; + /** Menu that opens when you click on the top left corner of a tab */ + topMenu: MultiColumnMenu | undefined; + /** Menu that opens when you right click on the main body/area of a tab */ + contextMenu: SingleColumnMenu | undefined; +}; + +/** Menus for all web views */ +export type WebViewMenus = { + /** Named web view */ + [property: ReferencedItem]: WebViewMenu; +}; + +/** Platform.Bible menus before they are localized */ +export type PlatformMenus = { + /** Top level menu for the application */ + mainMenu: MultiColumnMenu; + /** Menus that apply per web view in the application */ + webViewMenus: WebViewMenus; + /** Default context menu for web views that don't specify their own */ + defaultWebViewContextMenu: SingleColumnMenu; + /** Default top menu for web views that don't specify their own */ + defaultWebViewTopMenu: MultiColumnMenu; +}; + +/** + * Type that converts any menu type before it is localized to what it is after it is localized. This + * can be applied to any menu type as needed. + */ +export type Localized = ReplaceType, ReferencedItem, string>; + +//---------------------------------------------------------------------------------------------- +// NOTE: If you change the schema below, make sure the TS types above get changed so they align. +//---------------------------------------------------------------------------------------------- +/** JSON schema object that aligns with the PlatformMenus type */ +export const menuDocumentSchema = { + title: 'Platform.Bible menus', + type: 'object', + properties: { + mainMenu: { + description: 'Top level menu for the application', + $ref: '#/$defs/multiColumnMenu', + }, + defaultWebViewTopMenu: { + description: "Default top menu for web views that don't specify their own", + $ref: '#/$defs/multiColumnMenu', + }, + defaultWebViewContextMenu: { + description: "Default context menu for web views that don't specify their own", + $ref: '#/$defs/singleColumnMenu', + }, + webViewMenus: { + description: 'Menus that apply per web view in the application', + type: 'object', + patternProperties: { + '^[\\w\\-]+\\.[\\w\\-]+$': { + $ref: '#/$defs/menusForOneWebView', + }, + }, + additionalProperties: false, + }, + }, + required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'], + additionalProperties: false, + $defs: { + localizeKey: { + description: + "Identifier for a string that will be localized in a menu based on the user's UI language", + type: 'string', + pattern: '^%[\\w\\-\\.]+%$', + }, + referencedItem: { + description: + 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)', + type: 'string', + pattern: '^[\\w\\-]+\\.[\\w\\-]+$', + }, + columnsWithHeaders: { + description: + 'Group of columns that can be combined with other columns to form a multi-column menu', + type: 'object', + patternProperties: { + '^[\\w\\-]+\\.[\\w\\-]+$': { + description: 'Single column with a header string', + type: 'object', + properties: { + label: { + description: 'Header text for this this column in the UI', + $ref: '#/$defs/localizeKey', + }, + localizeNotes: { + description: + 'Additional information provided by developers to help people who perform localization', + type: 'string', + }, + order: { + description: + 'Relative order of this column compared to other columns (sorted ascending)', + type: 'number', + }, + isExtensible: { + description: + 'Defines whether contributions are allowed to add menu groups to this column', + type: 'boolean', + }, + }, + required: ['label', 'order'], + additionalProperties: false, + }, + }, + properties: { + isExtensible: { + description: + 'Defines whether contributions are allowed to add columns to this multi-column menu', + type: 'boolean', + }, + }, + }, + menuGroups: { + description: + 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.', + type: 'object', + patternProperties: { + '^[\\w\\-]+\\.[\\w\\-]+$': { + description: 'Single group that contains menu items', + type: 'object', + oneOf: [ + { + properties: { + column: { + description: + 'Column where this group belongs, not required for single column menus', + $ref: '#/$defs/referencedItem', + }, + order: { + description: + 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)', + type: 'number', + }, + isExtensible: { + description: + 'Defines whether contributions are allowed to add menu items to this menu group', + type: 'boolean', + }, + }, + required: ['order'], + additionalProperties: false, + }, + { + properties: { + menuItem: { + description: 'Menu item that anchors the submenu where this group belongs', + $ref: '#/$defs/referencedItem', + }, + order: { + description: + 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)', + type: 'number', + }, + isExtensible: { + description: + 'Defines whether contributions are allowed to add menu items to this menu group', + type: 'boolean', + }, + }, + required: ['menuItem', 'order'], + additionalProperties: false, + }, + ], + }, + }, + additionalProperties: false, + }, + menuItem: { + description: + 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu', + type: 'object', + oneOf: [ + { + properties: { + id: { + description: 'ID for this menu item that holds a submenu', + $ref: '#/$defs/referencedItem', + }, + }, + required: ['id'], + }, + { + properties: { + command: { + description: 'Name of the PAPI command to run when this menu item is selected.', + $ref: '#/$defs/referencedItem', + }, + iconPathBefore: { + description: + 'Uri path to the icon to display before the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`', + type: 'string', + }, + iconPathAfter: { + description: + 'Uri path to the icon to display after the menu text. Ex: `papi-extension://helloWorld/assets/icon.png`', + type: 'string', + }, + }, + required: ['command'], + }, + ], + properties: { + label: { + description: 'Key that represents the text of this menu item to display', + $ref: '#/$defs/localizeKey', + }, + tooltip: { + description: + 'Key that represents the text to display if a mouse pointer hovers over the menu item', + $ref: '#/$defs/localizeKey', + }, + searchTerms: { + description: + 'Key that represents additional words the platform should reference when users are searching for menu items', + $ref: '#/$defs/localizeKey', + }, + localizeNotes: { + description: + 'Additional information provided by developers to help people who perform localization', + type: 'string', + }, + group: { + description: 'Group to which this menu item belongs', + $ref: '#/$defs/referencedItem', + }, + order: { + description: + 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)', + type: 'number', + }, + }, + required: ['label', 'group', 'order'], + unevaluatedProperties: false, + }, + groupsAndItems: { + description: 'Core schema for a column', + type: 'object', + properties: { + groups: { + description: 'Groups that belong in this menu', + $ref: '#/$defs/menuGroups', + }, + items: { + description: 'List of menu items that belong in this menu', + type: 'array', + items: { $ref: '#/$defs/menuItem' }, + uniqueItems: true, + }, + }, + required: ['groups', 'items'], + }, + singleColumnMenu: { + description: 'Menu that contains a column without a header', + type: 'object', + allOf: [{ $ref: '#/$defs/groupsAndItems' }], + unevaluatedProperties: false, + }, + multiColumnMenu: { + description: 'Menu that can contain multiple columns with headers', + type: 'object', + allOf: [ + { $ref: '#/$defs/groupsAndItems' }, + { + properties: { + columns: { + description: 'Columns that belong in this menu', + $ref: '#/$defs/columnsWithHeaders', + }, + }, + required: ['columns'], + }, + ], + unevaluatedProperties: false, + }, + menusForOneWebView: { + description: 'Set of menus that are associated with a single tab', + type: 'object', + properties: { + includeDefaults: { + description: + 'Indicates whether the platform default menus should be included for this webview', + type: 'boolean', + }, + topMenu: { + description: 'Menu that opens when you click on the top left corner of a tab', + $ref: '#/$defs/multiColumnMenu', + }, + contextMenu: { + description: 'Menu that opens when you right click on the main body/area of a tab', + $ref: '#/$defs/singleColumnMenu', + }, + }, + additionalProperties: false, + }, + }, +}; + +Object.freeze(menuDocumentSchema); diff --git a/lib/platform-bible-utils/src/mutex-map.ts b/lib/platform-bible-utils/src/mutex-map.ts new file mode 100644 index 0000000000..57dcdf4a8c --- /dev/null +++ b/lib/platform-bible-utils/src/mutex-map.ts @@ -0,0 +1,17 @@ +import Mutex from './mutex'; + +/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */ +class MutexMap { + private mutexesByID = new Map(); + + get(mutexID: string): Mutex { + let retVal = this.mutexesByID.get(mutexID); + if (retVal) return retVal; + + retVal = new Mutex(); + this.mutexesByID.set(mutexID, retVal); + return retVal; + } +} + +export default MutexMap; diff --git a/lib/platform-bible-utils/src/mutex.ts b/lib/platform-bible-utils/src/mutex.ts new file mode 100644 index 0000000000..5b7145586d --- /dev/null +++ b/lib/platform-bible-utils/src/mutex.ts @@ -0,0 +1,29 @@ +import { Mutex as AsyncMutex } from 'async-mutex'; + +// Extending Mutex from async-mutex so we can add JSDoc + +/** + * Class that allows calling asynchronous functions multiple times at once while only running one at + * a time. + * + * @example + * + * ```typescript + * const mutex = new Mutex(); + * + * mutex.runExclusive(async () => { + * // Do some asynchronous stuff + * console.log('These run one-at-a-time'); + * }); + * + * mutex.runExclusive(async () => { + * // Do some asynchronous stuff + * console.log('These run one-at-a-time'); + * }); + * ``` + * + * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information. + */ +class Mutex extends AsyncMutex {} + +export default Mutex; diff --git a/lib/platform-bible-utils/src/non-validating-document-combiner.ts b/lib/platform-bible-utils/src/non-validating-document-combiner.ts new file mode 100644 index 0000000000..9dc0d737f1 --- /dev/null +++ b/lib/platform-bible-utils/src/non-validating-document-combiner.ts @@ -0,0 +1,13 @@ +import DocumentCombiner, { DocumentCombinerOptions, JsonDocumentLike } from './document-combiner'; + +export default class NonValidatingDocumentCombiner extends DocumentCombiner { + // Making the protected base constructor public + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) { + super(baseDocument, options); + } + + get output(): JsonDocumentLike | undefined { + return this.latestOutput; + } +} diff --git a/lib/platform-bible-utils/src/number-utils.ts b/lib/platform-bible-utils/src/number-utils.ts new file mode 100644 index 0000000000..a743e669db --- /dev/null +++ b/lib/platform-bible-utils/src/number-utils.ts @@ -0,0 +1,26 @@ +import NumberFormat from './intl-number-format'; + +/** + * Formats a number according to the locale and formatting options of this NumberFormat object + * + * @example FormatBytes(1024) => "1 KB" + * + * @example FormatBytes(1024, 0) => "1 KB" + * + * @param fileSize Number to format + * @param decimals Number of decimal places to round to + * @returns String representing the given number formatted according to the locale and formatting + * options of this NumberFormat object + */ +export default function formatBytes(fileSize: number, decimals: number = 2): string { + if (fileSize === 0) return '0 Bytes'; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const i = Math.floor(Math.log(fileSize) / Math.log(1024)); + const sizeToUse = sizes[i]; + const formattingFileSize = new NumberFormat('en', { + style: 'decimal', + maximumFractionDigits: decimals, + minimumFractionDigits: 0, + }).format(fileSize / 1024 ** i); + return `${formattingFileSize} ${sizeToUse}`; +} diff --git a/lib/platform-bible-utils/src/platform-event-emitter.model.test.ts b/lib/platform-bible-utils/src/platform-event-emitter.model.test.ts new file mode 100644 index 0000000000..57936de2c7 --- /dev/null +++ b/lib/platform-bible-utils/src/platform-event-emitter.model.test.ts @@ -0,0 +1,56 @@ +import PlatformEventEmitter from './platform-event-emitter.model'; + +describe('unsubscribing', () => { + it('does not prevent other subscribers from running when unsubscribing in a callback', () => { + const shouldUnsubscribeSubscriptions = [false, true, false, true, true, false]; + // Map of event number to which event subscription indices ran for that event number + // Purposely making this an array, not a Set, to make sure we catch duplicate runs + const subscriptionResults: { [eventNum: string]: number[] } = {}; + + const numEventsToEmit = 3; + // Array of each event number that should have been run: [0, 1, 2, ..., numEventsToEdit - 1] + const eventNumArray = [...Array(numEventsToEmit).keys()]; + // Array of each event number that should have been run after unsubscribing + // (basically eventNumArray without the first event) + const [, ...eventNumArrayAfterUnsubscribing] = eventNumArray; + let nextEventNum = 0; + const emitter = new PlatformEventEmitter(); + const emitEvent = () => { + emitter.emit(nextEventNum); + nextEventNum += 1; + }; + const unsubscribers = shouldUnsubscribeSubscriptions.map((shouldUnsubscribe, i) => + emitter.subscribe((eventNum) => { + const subscriptionResultsForEventNum = subscriptionResults[eventNum] ?? []; + if (!subscriptionResults[eventNum]) + subscriptionResults[eventNum] = subscriptionResultsForEventNum; + + subscriptionResultsForEventNum.push(i); + + if (shouldUnsubscribe) unsubscribers[i](); + }), + ); + + for (let i = 0; i < numEventsToEmit; i += 1) emitEvent(); + + // There should be results for each event that was run + expect( + Object.keys(subscriptionResults) + .map((eventNumString) => parseInt(eventNumString, 10)) + .sort(), + ).toEqual(eventNumArray); + + // All should have run the first time + expect(subscriptionResults[0]).toEqual( + shouldUnsubscribeSubscriptions.map((_shouldUnsubscribe, i) => i), + ); + eventNumArrayAfterUnsubscribing.forEach((eventNum) => { + // Only the `false` ones (didn't unsubscribe) should have run after the first time + expect(subscriptionResults[eventNum]).toEqual( + shouldUnsubscribeSubscriptions + .map((shouldUnsubscribe, i) => (shouldUnsubscribe ? undefined : i)) + .filter((i) => i !== undefined), + ); + }); + }); +}); diff --git a/lib/platform-bible-utils/src/platform-event-emitter.model.ts b/lib/platform-bible-utils/src/platform-event-emitter.model.ts new file mode 100644 index 0000000000..56242b1e8c --- /dev/null +++ b/lib/platform-bible-utils/src/platform-event-emitter.model.ts @@ -0,0 +1,114 @@ +/** Interfaces, classes, and functions related to events and event emitters */ + +import { Dispose } from './disposal.model'; +import { PlatformEvent, PlatformEventHandler } from './platform-event'; + +/** + * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the + * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use + * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be + * private, and its event should be public. That way, the emitter is not publicized, but anyone can + * subscribe to the event. + */ +export default class PlatformEventEmitter implements Dispose { + /** + * Subscribes a function to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + * @alias event + */ + subscribe = this.event; + + /** All callback functions that will run when this event is emitted. Lazy loaded */ + private subscriptions?: PlatformEventHandler[]; + /** Event for listeners to subscribe to. Lazy loaded */ + private lazyEvent?: PlatformEvent; + /** Whether this emitter has been disposed */ + private isDisposed = false; + + /** + * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted. + * Use like `const unsubscriber = event(callback)` + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ + get event(): PlatformEvent { + this.assertNotDisposed(); + + if (!this.lazyEvent) { + this.lazyEvent = (callback) => { + if (!callback || typeof callback !== 'function') + throw new Error(`Event handler callback must be a function!`); + + // Initialize this.subscriptions if it does not exist + if (!this.subscriptions) this.subscriptions = []; + + this.subscriptions.push(callback); + + return () => { + if (!this.subscriptions) return false; // Did not find any subscribed callbacks + + const callbackIndex = this.subscriptions.indexOf(callback); + + if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions + + // Remove the callback + this.subscriptions.splice(callbackIndex, 1); + + return true; + }; + }; + } + return this.lazyEvent; + } + + /** Disposes of this event, preparing it to release from memory */ + dispose = () => { + return this.disposeFn(); + }; + + /** + * Runs the subscriptions for the event + * + * @param event Event data to provide to subscribed callbacks + */ + emit = (event: T) => { + // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn + this.emitFn(event); + }; + + /** + * Function that runs the subscriptions for the event. Added here so children can override emit + * and still call the base functionality. See NetworkEventEmitter.emit for example + */ + protected emitFn(event: T) { + this.assertNotDisposed(); + + // Clone the subscriptions array before iterating over the callbacks so the callback index + // doesn't get messed up if someone subscribes or unsubscribes inside one of the callbacks + const emitCallbacks = [...(this.subscriptions ?? [])]; + emitCallbacks.forEach((callback) => callback(event)); + } + + /** Check to make sure this emitter is not disposed. Throw if it is */ + protected assertNotDisposed() { + if (this.isDisposed) throw new Error('Emitter is disposed'); + } + + /** + * Disposes of this event, preparing it to release from memory. Added here so children can + * override emit and still call the base functionality. + */ + protected disposeFn() { + this.assertNotDisposed(); + + this.isDisposed = true; + this.subscriptions = undefined; + this.lazyEvent = undefined; + return Promise.resolve(true); + } +} diff --git a/lib/platform-bible-utils/src/platform-event.ts b/lib/platform-bible-utils/src/platform-event.ts new file mode 100644 index 0000000000..8609898a7a --- /dev/null +++ b/lib/platform-bible-utils/src/platform-event.ts @@ -0,0 +1,22 @@ +import { Unsubscriber, UnsubscriberAsync } from './unsubscriber'; + +/** Callback function that accepts an event and should run when an event is emitted */ +export type PlatformEventHandler = (event: T) => void; + +/** + * Function that subscribes the provided callback to run when this event is emitted. + * + * @param callback Function to run with the event when it is emitted + * @returns Unsubscriber function to run to stop calling the passed-in function when the event is + * emitted + */ +export type PlatformEvent = (callback: PlatformEventHandler) => Unsubscriber; + +/** + * A PapiEvent that subscribes asynchronously and resolves an asynchronous unsubscriber. + * + * Note: The callback itself is not asynchronous. + */ +export type PlatformEventAsync = ( + callback: PlatformEventHandler, +) => Promise; diff --git a/lib/platform-bible-utils/src/scripture-util.test.ts b/lib/platform-bible-utils/src/scripture-util.test.ts new file mode 100644 index 0000000000..ecbe25de55 --- /dev/null +++ b/lib/platform-bible-utils/src/scripture-util.test.ts @@ -0,0 +1,175 @@ +import { + getLocalizedIdFromBookNumber, + compareScrRefs, + formatScrRef, + scrRefToBBBCCCVVV, + getLocalizeKeyForScrollGroupId, + getLocalizeKeysForScrollGroupIds, +} from './scripture-util'; + +async function mockGetLocalizedString(item: { + localizeKey: string; + languagesToSearch?: string[] | undefined; +}): Promise { + if (!item.languagesToSearch) item.languagesToSearch = ['en']; + + const { localizeKey, languagesToSearch } = item; + const language = languagesToSearch[0]; + if (localizeKey === 'LocalizedId.GEN') { + if (language === 'kh') return 'លប'; + return 'GEN'; + } + if (localizeKey === 'Book.GEN') { + if (language === 'zh-hans') return '创'; + } + return localizeKey; +} + +describe('getLocalizedIdFromBookNumber', () => { + test('with chinese', async () => { + const result = await getLocalizedIdFromBookNumber(1, 'zh-hans', mockGetLocalizedString); + expect(result).toEqual('创'); + }); + + test('with french', async () => { + const result = await getLocalizedIdFromBookNumber(1, 'fr', mockGetLocalizedString); + expect(result).toEqual('GEN'); + }); + + test('with khmer which defines a localization with localized.id', async () => { + const result = await getLocalizedIdFromBookNumber(1, 'kh', mockGetLocalizedString); + expect(result).toEqual('លប'); + }); +}); + +test('get reference as BBBCCCVVV', async () => { + expect(scrRefToBBBCCCVVV({ bookNum: 10, chapterNum: 4, verseNum: 6 })).toBe(10004006); +}); + +describe('compareScrRefs', () => { + test('when books are different', async () => { + expect( + compareScrRefs( + { bookNum: 1, chapterNum: 3, verseNum: 6 }, + { bookNum: 2, chapterNum: 3, verseNum: 6 }, + ), + ).toBeLessThan(0); + + expect( + compareScrRefs( + { bookNum: 66, chapterNum: 3, verseNum: 6 }, + { bookNum: 65, chapterNum: 3, verseNum: 6 }, + ), + ).toBeGreaterThan(0); + }); + + test('when books are the same but chapters are different', async () => { + expect( + compareScrRefs( + { bookNum: 10, chapterNum: 3, verseNum: 6 }, + { bookNum: 10, chapterNum: 4, verseNum: 6 }, + ), + ).toBeLessThan(0); + + expect( + compareScrRefs( + { bookNum: 10, chapterNum: 150, verseNum: 6 }, + { bookNum: 10, chapterNum: 149, verseNum: 6 }, + ), + ).toBeGreaterThan(0); + }); + + test('when books and chapters are the same but verses are different', async () => { + expect( + compareScrRefs( + { bookNum: 10, chapterNum: 4, verseNum: 6 }, + { bookNum: 10, chapterNum: 4, verseNum: 7 }, + ), + ).toBeLessThan(0); + + expect( + compareScrRefs( + { bookNum: 10, chapterNum: 150, verseNum: 2 }, + { bookNum: 10, chapterNum: 150, verseNum: 1 }, + ), + ).toBeGreaterThan(0); + }); + + test('when identical', async () => { + expect( + compareScrRefs( + { bookNum: 10, chapterNum: 4, verseNum: 6 }, + { bookNum: 10, chapterNum: 4, verseNum: 6 }, + ), + ).toBe(0); + }); +}); + +describe('formatScrRef', () => { + test('using 3-letter book id', async () => { + expect(formatScrRef({ bookNum: 5, chapterNum: 5, verseNum: 4 })).toBe('DEU 5:4'); + expect(formatScrRef({ bookNum: 66, chapterNum: 4, verseNum: 6 }, undefined, '.')).toBe( + 'REV 4.6', + ); + expect(formatScrRef({ bookNum: 2, chapterNum: 10, verseNum: 1 }, 'id', ';', '-')).toBe( + 'EXO-10;1', + ); + }); + + test('using English book name', async () => { + expect(formatScrRef({ bookNum: 5, chapterNum: 5, verseNum: 4 }, 'English')).toBe( + 'Deuteronomy 5:4', + ); + expect(formatScrRef({ bookNum: 66, chapterNum: 4, verseNum: 6 }, 'English', '.')).toBe( + 'Revelation 4.6', + ); + expect(formatScrRef({ bookNum: 2, chapterNum: 10, verseNum: 1 }, 'English', ';', '-')).toBe( + 'Exodus-10;1', + ); + }); + + test('using arbitrary book name, abbrev, etc.', async () => { + expect(formatScrRef({ bookNum: 5, chapterNum: 5, verseNum: 4 }, 'Deuteronomio')).toBe( + 'Deuteronomio 5:4', + ); + expect(formatScrRef({ bookNum: 66, chapterNum: 4, verseNum: 6 }, 'Rev.', '.')).toBe('Rev. 4.6'); + expect(formatScrRef({ bookNum: 2, chapterNum: 10, verseNum: 1 }, 'Ex', ';', '-')).toBe( + 'Ex-10;1', + ); + }); +}); + +describe('getLocalizeKeyForScrollGroupId', () => { + test('to work with undefined', () => { + expect(getLocalizeKeyForScrollGroupId(undefined)).toBe('%scrollGroup_undefined%'); + expect(getLocalizeKeyForScrollGroupId('undefined')).toBe('%scrollGroup_undefined%'); + }); + + test('to work with various numbers', () => { + expect(getLocalizeKeyForScrollGroupId(0)).toBe('%scrollGroup_0%'); + expect(getLocalizeKeyForScrollGroupId(5)).toBe('%scrollGroup_5%'); + expect(getLocalizeKeyForScrollGroupId(79)).toBe('%scrollGroup_79%'); + expect(getLocalizeKeyForScrollGroupId(50000001)).toBe('%scrollGroup_50000001%'); + expect(getLocalizeKeyForScrollGroupId(12)).toBe('%scrollGroup_12%'); + }); +}); + +describe('getLocalizeKeysForScrollGroupIds', () => { + test('to provide an array of scroll group keys from various scroll group ids', () => { + expect(getLocalizeKeysForScrollGroupIds([undefined, 0, 1, 2, 3, 4])).toEqual([ + '%scrollGroup_undefined%', + '%scrollGroup_0%', + '%scrollGroup_1%', + '%scrollGroup_2%', + '%scrollGroup_3%', + '%scrollGroup_4%', + ]); + expect(getLocalizeKeysForScrollGroupIds([0, 2, 3, undefined, 1])).toEqual([ + '%scrollGroup_0%', + '%scrollGroup_2%', + '%scrollGroup_3%', + '%scrollGroup_undefined%', + '%scrollGroup_1%', + ]); + }); +}); diff --git a/lib/platform-bible-utils/src/scripture-util.ts b/lib/platform-bible-utils/src/scripture-util.ts new file mode 100644 index 0000000000..6c4aadaf41 --- /dev/null +++ b/lib/platform-bible-utils/src/scripture-util.ts @@ -0,0 +1,232 @@ +import { Canon, VerseRef } from '@sillsdev/scripture'; +import { BookInfo, ScriptureReference, ScrollGroupId } from './scripture.model'; +import { split, startsWith } from './string-util'; +import { LocalizeKey } from './menus.model'; + +const scrBookData: BookInfo[] = [ + { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 }, + { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 }, + { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 }, + { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 }, + { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 }, + { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 }, + { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 }, + { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 }, + { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 }, + { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 }, + { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 }, + { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 }, + { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 }, + { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 }, + { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 }, + { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 }, + { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 }, + { shortName: 'EST', fullNames: ['Esther'], chapters: 10 }, + { shortName: 'JOB', fullNames: ['Job'], chapters: 42 }, + { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 }, + { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 }, + { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 }, + { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 }, + { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 }, + { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 }, + { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 }, + { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 }, + { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 }, + { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 }, + { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 }, + { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 }, + { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 }, + { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 }, + { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 }, + { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 }, + { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 }, + { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 }, + { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 }, + { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 }, + { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 }, + { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 }, + { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 }, + { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 }, + { shortName: 'JHN', fullNames: ['John'], chapters: 21 }, + { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 }, + { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 }, + { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 }, + { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 }, + { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 }, + { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 }, + { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 }, + { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 }, + { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 }, + { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 }, + { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 }, + { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 }, + { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 }, + { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 }, + { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 }, + { shortName: 'JAS', fullNames: ['James'], chapters: 5 }, + { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 }, + { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 }, + { shortName: '1JN', fullNames: ['1 John'], chapters: 5 }, + { shortName: '2JN', fullNames: ['2 John'], chapters: 1 }, + { shortName: '3JN', fullNames: ['3 John'], chapters: 1 }, + { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 }, + { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 }, +]; + +export const FIRST_SCR_BOOK_NUM = 1; +export const LAST_SCR_BOOK_NUM = scrBookData.length - 1; +export const FIRST_SCR_CHAPTER_NUM = 1; +export const FIRST_SCR_VERSE_NUM = 1; + +export const getChaptersForBook = (bookNum: number): number => { + return scrBookData[bookNum]?.chapters ?? -1; +}; + +export const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({ + bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)), + chapterNum: 1, + verseNum: 1, +}); + +export const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({ + ...scrRef, + chapterNum: Math.min( + Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset), + getChaptersForBook(scrRef.bookNum), + ), + verseNum: 1, +}); + +export const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({ + ...scrRef, + verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset), +}); + +/** + * https://github.com/ubsicap/Paratext/blob/master/ParatextData/SILScriptureExtensions.cs#L72 + * + * Convert book number to a localized Id (a short description of the book). This should be used + * whenever a book ID (short code) is shown to the user. It is primarily needed for people who do + * not read Roman script well and need to have books identified in a alternate script (e.g. Chinese + * or Russian) + * + * @param bookNumber + * @param localizationLanguage In BCP 47 format + * @param getLocalizedString Function that provides the localized versions of the book ids and names + * asynchronously. + * @returns + */ +export async function getLocalizedIdFromBookNumber( + bookNumber: number, + localizationLanguage: string, + getLocalizedString: (item: { + localizeKey: string; + languagesToSearch?: string[]; + }) => Promise, +) { + const id = Canon.bookNumberToId(bookNumber); + + if (!startsWith(Intl.getCanonicalLocales(localizationLanguage)[0], 'zh')) + return getLocalizedString({ + localizeKey: `LocalizedId.${id}`, + languagesToSearch: [localizationLanguage], + }); + + // For Chinese the normal book name is already fairly short. + const bookName = await getLocalizedString({ + localizeKey: `Book.${id}`, + languagesToSearch: [localizationLanguage], + }); + const parts = split(bookName, '-'); + // some entries had a second name inside ideographic parenthesis + const parts2 = split(parts[0], '\xff08'); + const retVal = parts2[0].trim(); + return retVal; +} + +/** + * Get the Scripture reference as an easily comparable/sortable integer. + * + * @param scrRef The Scripture reference. + * @returns An integer where the first three digits represent the book, the next three represent the + * chapter and the last three represent the verse. + */ +export function scrRefToBBBCCCVVV(scrRef: ScriptureReference): number { + return new VerseRef(scrRef.bookNum, scrRef.chapterNum, scrRef.verseNum).BBBCCCVVV; +} + +/** + * Compares two Scripture references canonically. + * + * @param scrRef1 The first Scripture reference to compare. + * @param scrRef2 The second Scripture reference to compare. + * @returns A number indicating the result of the comparison: - Negative value if scrRef1 precedes + * scrRef2 in sorting order. - Zero if scrRef1 and scrRef2 are equivalent in sorting order. - + * Positive value if scrRef1 follows scrRef2 in sorting order. + */ +export function compareScrRefs(scrRef1: ScriptureReference, scrRef2: ScriptureReference): number { + // TODO: consider edge cases for invalid references (current implementation should suffice for + // all but the most extreme cases) + return scrRefToBBBCCCVVV(scrRef1) - scrRefToBBBCCCVVV(scrRef2); +} + +/** Get the localized string key for a given scroll group Id (or no scroll group if `undefined`) */ +export function getLocalizeKeyForScrollGroupId( + scrollGroupId: ScrollGroupId | undefined | 'undefined', +): LocalizeKey { + return `%scrollGroup_${scrollGroupId}%`; +} + +/** + * Gets a list of localized string keys for provided scroll group Ids. Uses + * {@link getLocalizeKeyForScrollGroupId} internally + * + * @example + * + * ```typescript + * getLocalizeKeysForScrollGroupIds([undefined, 0, 1, 2, 3, 4]); + * // Gives localized string keys for the provided scroll group ids in an array + * ``` + * + * @param scrollGroupIds Scroll group ids to include + * @returns List of localized string keys for scroll group Ids + */ +export function getLocalizeKeysForScrollGroupIds(scrollGroupIds: (ScrollGroupId | undefined)[]) { + return scrollGroupIds.map((scrollGroupId) => getLocalizeKeyForScrollGroupId(scrollGroupId)); +} + +/** + * Formats a Scripture reference. + * + * @param scrRef The Scripture reference to format. + * @param optionOrLocalizedBookName Either 'id' (the default) to format using the "standard" (as + * defined by SIL/UBS) 3-letter book ID, 'English' to format using the English book name spelled + * out, or some other string (e.g., a localized book name, vernacular abbreviation, FCBH book id, + * etc.) to use. + * @param chapterVerseSeparator The character used to separate the chapter number from the verse + * number. Default is a colon (:). Note: More than one character is allowed. + * @param bookChapterSeparator The character used to separate the book from the chapter number. + * Default is a single space. Note: More than one character is allowed. + * @returns The formatted reference. + */ +export function formatScrRef( + scrRef: ScriptureReference, + optionOrLocalizedBookName?: 'id' | 'English' | string, + chapterVerseSeparator?: string, + bookChapterSeparator?: string, +): string { + let book: string; + switch (optionOrLocalizedBookName ?? 'id') { + case 'English': + book = Canon.bookNumberToEnglishName(scrRef.bookNum); + break; + case 'id': + book = Canon.bookNumberToId(scrRef.bookNum); + break; + default: + // We already dealt with undefined about in the switch, but TS is getting confused. + book = optionOrLocalizedBookName ?? ''; + break; + } + return `${book}${bookChapterSeparator ?? ' '}${scrRef.chapterNum}${chapterVerseSeparator ?? ':'}${scrRef.verseNum}`; +} diff --git a/lib/platform-bible-utils/src/scripture.model.ts b/lib/platform-bible-utils/src/scripture.model.ts new file mode 100644 index 0000000000..90aab47852 --- /dev/null +++ b/lib/platform-bible-utils/src/scripture.model.ts @@ -0,0 +1,44 @@ +export interface ScriptureReference { + bookNum: number; + chapterNum: number; + verseNum: number; +} + +export interface BookInfo { + shortName: string; + fullNames: string[]; + chapters: number; +} + +/** + * Represents a "node" in the JSON used to present Scripture in the editor, with a path that is + * relative to the start of a verse. + */ +export type ScriptureNode = ScriptureReference & { + jsonPath: string; +}; + +/** Represents a specific character offset in the text of a textual Scripture node (in the editor.) */ +export type ScriptureTextAnchor = ScriptureNode & { + offset: number; +}; + +/** + * Represents a range of text in the Scripture editor. The start and end node are expected to be in + * the same book. + */ +export type ScriptureSelection = { + start: ScriptureNode | ScriptureTextAnchor; + end?: ScriptureNode | ScriptureTextAnchor; +}; + +/** + * An identifier corresponding to a Scripture reference shared by a group of Scripture reference + * consumers. + * + * For example, a few web views that share a Scroll Group Id would all change Scripture Reference + * together. + * + * These are generally expected to be non-negative numbers (starting at 0). + */ +export type ScrollGroupId = number; diff --git a/lib/platform-bible-utils/src/serialization.ts b/lib/platform-bible-utils/src/serialization.ts new file mode 100644 index 0000000000..8d7fb7699b --- /dev/null +++ b/lib/platform-bible-utils/src/serialization.ts @@ -0,0 +1,123 @@ +/** + * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript + * object to `null` properties in the JSON string. + * + * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then + * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b: + * undefined, c: undefined }`. If you are passing around user data that needs to retain `null` + * values, you should wrap them yourself in a string before using this function. Alternatively, you + * can write your own replacer that will preserve `null` in a way that you can recover later. + * + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. Note that all `undefined` values returned + * by the replacer will be further transformed into `null` in the JSON string. + * @param space Adds indentation, white space, and line break characters to the return-value JSON + * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more + * details. + */ +export function serialize( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string { + const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => { + let newValue = replacerValue; + if (replacer) newValue = replacer(replacerKey, newValue); + // All `undefined` values become `null` on the way from JS objects into JSON strings + // eslint-disable-next-line no-null/no-null + if (newValue === undefined) newValue = null; + return newValue; + }; + return JSON.stringify(value, undefinedReplacer, space); +} + +/** + * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined` + * in the returned JavaScript value/object. + * + * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then + * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b: + * undefined, c: undefined }`. If you are passing around user data that needs to retain `null` + * values, you should wrap them yourself in a string before using this function. Alternatively, you + * can write your own replacer that will preserve `null` in a way that you can recover later. + * + * @param value A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of + * the object. If a member contains nested objects, the nested objects are transformed before the + * parent object is. Note that `null` values are converted into `undefined` values after the + * reviver has run. + */ +export function deserialize( + value: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, + // Need to use `any` instead of `unknown` here to match the signature of JSON.parse + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): any { + // Helper function to replace `null` with `undefined` on a per property basis. This can't be done + // with our own reviver because `JSON.parse` removes `undefined` properties from the return value. + function replaceNull(obj: Record): Record { + Object.keys(obj).forEach((key: string | number) => { + // We only want to replace `null`, not other falsy values + // eslint-disable-next-line no-null/no-null + if (obj[key] === null) obj[key] = undefined; + // If the property is an object, recursively call the helper function on it + else if (typeof obj[key] === 'object') + // Since the object came from a string, we know the keys will not be symbols + // eslint-disable-next-line no-type-assertion/no-type-assertion + obj[key] = replaceNull(obj[key] as Record); + }); + return obj; + } + + const parsedObject = JSON.parse(value, reviver); + // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined' + // eslint-disable-next-line no-null/no-null + if (parsedObject === null) return undefined; + if (typeof parsedObject === 'object') return replaceNull(parsedObject); + return parsedObject; +} + +/** + * Check to see if the value is serializable without losing information + * + * @param value Value to test + * @returns True if serializable; false otherwise + * + * Note: the values `undefined` and `null` are serializable (on their own or in an array), but + * `null` values get transformed into `undefined` when serializing/deserializing. + * + * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value. + * Please only use this if you need to + * + * DISCLAIMER: this does not successfully detect that values are not serializable in some cases: + * + * - Losses of removed properties like functions and `Map`s + * - Class instances (not deserializable into class instances without special code) + * + * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify` + * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description) + * for more information. + */ +export function isSerializable(value: unknown): boolean { + try { + const serializedValue = serialize(value); + return serializedValue === serialize(deserialize(serializedValue)); + } catch (e) { + return false; + } +} + +/** + * HTML Encodes the provided string. Thanks to ChatGPT + * + * @param str String to HTML encode + * @returns HTML-encoded string + */ +export const htmlEncode = (str: string): string => + str + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(/\//g, '/'); diff --git a/lib/platform-bible-utils/src/settings.model.ts b/lib/platform-bible-utils/src/settings.model.ts new file mode 100644 index 0000000000..4d601524e0 --- /dev/null +++ b/lib/platform-bible-utils/src/settings.model.ts @@ -0,0 +1,601 @@ +//---------------------------------------------------------------------------------------------- +// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets +// changed so they align. +//---------------------------------------------------------------------------------------------- + +import { LocalizeKey, ReferencedItem } from 'menus.model'; + +/** The data an extension provides to inform Platform.Bible of the settings it provides */ +export type SettingsContribution = SettingsGroup | SettingsGroup[]; +/** A description of an extension's setting entry */ +export type Setting = ExtensionControlledSetting; +/** Setting definition that is validated by the extension. */ +export type ExtensionControlledSetting = SettingBase & ModifierExtensionControlled; +/** Base information needed to describe a setting entry */ +export type SettingBase = StateBase & { + [k: string]: unknown; + /** LocalizeKey that displays in the settings dialog as the setting name */ + label: LocalizeKey; + /** LocalizeKey that displays in the settings dialog to describe the setting */ + description?: LocalizeKey; +}; +/** The data an extension provides to inform Platform.Bible of the project settings it provides */ +export type ProjectSettingsContribution = ProjectSettingsGroup | ProjectSettingsGroup[]; +/** A description of an extension's setting entry */ +export type ProjectSetting = ExtensionControlledProjectSetting; +/** Setting definition that is validated by the extension. */ +export type ExtensionControlledProjectSetting = ProjectSettingBase & ModifierExtensionControlled; +/** Base information needed to describe a project setting entry */ +export type ProjectSettingBase = SettingBase & ModifierProject; +/** A description of an extension's user state entry */ +export type UserState = ExtensionControlledState; +/** State definition that is validated by the extension. */ +export type ExtensionControlledState = StateBase & ModifierExtensionControlled; +/** Group of related settings definitions */ +export interface SettingsGroup { + [k: string]: unknown; + /** LocalizeKey that displays in the settings dialog as the group name */ + label: LocalizeKey; + /** LocalizeKey that displays in the settings dialog to describe the group */ + description?: LocalizeKey; + properties: SettingProperties; +} +/** Object whose keys are setting IDs and whose values are settings objects */ +export interface SettingProperties { + [k: ReferencedItem]: Setting; +} +/** Base information needed to describe a state entry */ +export interface StateBase { + [k: string]: unknown; + /** Default value for the state/setting */ + default: unknown; + /** + * A state/setting ID whose value to set to this state/setting's starting value the first time + * this state/setting is loaded + */ + derivesFrom?: ReferencedItem; +} +/** + * Modifies state/setting type to be extension-controlled. "Extension-controlled" means the + * extension provides the component and the validator for the state/setting, so the state/setting is + * controlled by the extension. + */ +export interface ModifierExtensionControlled { + [k: string]: unknown; + platformType?: undefined; + type?: undefined; +} +/** Group of related settings definitions */ +export interface ProjectSettingsGroup { + [k: string]: unknown; + /** LocalizeKey that displays in the project settings dialog as the group name */ + label: LocalizeKey; + /** LocalizeKey that displays in the project settings dialog to describe the group */ + description?: LocalizeKey; + properties: ProjectSettingProperties; +} +/** Object whose keys are setting IDs and whose values are settings objects */ +export interface ProjectSettingProperties { + [k: ReferencedItem]: ProjectSetting; +} + +// Note: we removed the index signature on ModifierProject to avoid having it on +// `ProjectMetadataFilterOptions`. Unfortunately adding "additionalProperties": false on the json +// schema messes up validation. Please remove the index signature again in the future if you +// regenerate types +export interface ModifierProject { + /** + * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s + * (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if they should be included. + * + * If this is one string, it will be matched against `projectInterface`s. If this is an array, + * each entry is handled based on its type (at least one entry must match for this filter + * condition to pass): + * + * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the + * project will pass this filter condition + * - If the entry is an array of strings, each will be matched against each `projectInterface`. If + * every string matches against at least one `projectInterface`, the project will pass this + * filter condition + * + * In other words, each entry in the first-level array is `OR`'ed together. Each entry in + * second-level arrays (arrays within the first-level array) are `AND`'ed together. + * + * Defaults to all {@link ProjectInterfaces}, so all projects that do not match + * `excludeProjectInterfaces` will be included + * + * @example + * + * ```typescript + * includeProjectInterfaces: ['one', ['two', 'three']]; + * ``` + * + * This filter condition will succeed on projects whose `projectInterface`s fulfill at least one + * of the following conditions (At least one entry in the array must match): + * + * - Include `one` + * - Include both `two` and `three`. + */ + includeProjectInterfaces?: undefined | string | (string | string[])[]; + /** + * String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s + * (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if they should absolutely not be included even if they match with + * `includeProjectInterfaces`. + * + * If this is one string, it will be matched against `projectInterface`s. If this is an array, + * each entry is handled based on its type (at least one entry must match for this filter + * condition to exclude the project): + * + * - If the entry is a string, it will be matched against each `projectInterface`. If any match, the + * project will pass this filter condition and exclude the project + * - If the entry is an array of strings, each will be matched against each `projectInterface`. If + * every string matches against at least one `projectInterface`, the project will pass this + * filter condition and exclude the project + * + * In other words, each entry in the first-level array is `OR`'ed together. Each entry in + * second-level arrays (arrays within the first-level array) are `AND`'ed together. + * + * Defaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` + * will be included + * + * @example + * + * ```typescript + * excludeProjectInterfaces: ['one', ['two', 'three']]; + * ``` + * + * This filter condition will succeed and exclude projects whose `projectInterface`s fulfill at + * least one of the following conditions (At least one entry in the array must match): + * + * - Include `one` + * - Include both `two` and `three`. + */ + excludeProjectInterfaces?: undefined | string | (string | string[])[]; + /** + * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory + * Ids that provided each project's metadata (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if the projects should be included. + * + * Defaults to all Project Data Provider Factory Ids, so all projects that do not match + * `excludePdpFactoryIds` will be included + */ + includePdpFactoryIds?: undefined | string | string[]; + /** + * String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory + * Ids that provided each project's metadata (using the + * [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) to determine if the projects should absolutely not be included even if they match + * with `includeProjectInterfaces`. + * + * Defaults to none, so all projects that match `includePdpFactoryIds` will be included + */ + excludePdpFactoryIds?: undefined | string | string[]; +} + +/** The data an extension provides to inform Platform.Bible of the user state it provides */ +export interface UserStateContribution { + [k: ReferencedItem]: UserState; +} +/** The data an extension provides to inform Platform.Bible of the project state it provides */ +export interface ProjectStateContribution { + [k: ReferencedItem]: UserState; +} + +//---------------------------------------------------------------------------------------------- +// NOTE: If you change the schema below, make sure the TS types above get changed so they align. +//---------------------------------------------------------------------------------------------- +const settingsDefs = { + projectSettingsContribution: { + description: + 'The data an extension provides to inform Platform.Bible of the project settings it provides', + anyOf: [ + { + $ref: '#/$defs/projectSettingsGroup', + }, + { + type: 'array', + items: { + $ref: '#/$defs/projectSettingsGroup', + }, + }, + ], + }, + projectSettingsGroup: { + description: 'Group of related settings definitions', + type: 'object', + properties: { + label: { + description: 'localizeKey that displays in the project settings dialog as the group name', + $ref: '#/$defs/localizeKey', + }, + description: { + description: + 'localizeKey that displays in the project settings dialog to describe the group', + $ref: '#/$defs/localizeKey', + }, + properties: { + $ref: '#/$defs/projectSettingProperties', + }, + }, + required: ['label', 'properties'], + }, + projectSettingProperties: { + description: 'Object whose keys are setting IDs and whose values are settings objects', + type: 'object', + patternProperties: { + '^[\\w\\-]+\\.[\\w\\-]+$': { + $ref: '#/$defs/projectSetting', + }, + }, + additionalProperties: false, + }, + projectSetting: { + description: "A description of an extension's setting entry", + anyOf: [ + { + $ref: '#/$defs/extensionControlledProjectSetting', + }, + ], + }, + extensionControlledProjectSetting: { + description: 'Setting definition that is validated by the extension.', + allOf: [ + { + $ref: '#/$defs/projectSettingBase', + }, + { + $ref: '#/$defs/modifierExtensionControlled', + }, + ], + }, + projectSettingBase: { + description: 'Base information needed to describe a project setting entry', + allOf: [ + { + $ref: '#/$defs/settingBase', + }, + { + $ref: '#/$defs/modifierProject', + }, + ], + }, + modifierProject: { + description: 'Modifies setting type to be project setting', + type: 'object', + properties: { + includeProjectInterfaces: { + description: + "String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should be included.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to pass):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to all {@link ProjectInterfaces}, so all projects that do not match `excludeProjectInterfaces` will be included\n\n@example\n\n```typescript\nincludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed on projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.", + anyOf: [ + { + type: 'null', + }, + { + type: 'string', + }, + { + type: 'array', + items: { + anyOf: [ + { + type: 'string', + }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + }, + ], + }, + excludeProjectInterfaces: { + description: + "String representation of `RegExp` pattern(s) to match against projects' `projectInterface`s (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if they should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nIf this is one string, it will be matched against `projectInterface`s. If this is an array, each entry is handled based on its type (at least one entry must match for this filter condition to exclude the project):\n\n- If the entry is a string, it will be matched against each `projectInterface`. If any match, the project will pass this filter condition and exclude the project\n- If the entry is an array of strings, each will be matched against each `projectInterface`. If every string matches against at least one `projectInterface`, the project will pass this filter condition and exclude the project\n\nIn other words, each entry in the first-level array is `OR`'ed together. Each entry in second-level arrays (arrays within the first-level array) are `AND`'ed together.\n\nDefaults to no {@link ProjectInterfaces}, so all projects that match `includeProjectInterfaces` will be included\n\n@example\n\n```typescript\nexcludeProjectInterfaces: ['one', ['two', 'three']];\n```\n\nThis filter condition will succeed and exclude projects whose `projectInterface`s fulfill at least one of the following conditions (At least one entry in the array must match):\n\n- Include `one`\n- Include both `two` and `three`.", + anyOf: [ + { + type: 'null', + }, + { + type: 'string', + }, + { + type: 'array', + items: { + anyOf: [ + { + type: 'string', + }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + }, + ], + }, + includePdpFactoryIds: { + description: + "String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should be included.\n\nDefaults to all Project Data Provider Factory Ids, so all projects that do not match `excludePdpFactoryIds` will be included", + anyOf: [ + { + type: 'null', + }, + { + type: 'string', + }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + excludePdpFactoryIds: { + description: + "String representation of `RegExp` pattern(s) to match against the Project Data Provider Factory Ids that provided each project's metadata (using the [`test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) function) to determine if the projects should absolutely not be included even if they match with `includeProjectInterfaces`.\n\nDefaults to none, so all projects that match `includePdpFactoryIds` will be included", + anyOf: [ + { + type: 'null', + }, + { + type: 'string', + }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + }, + }, + settingsContribution: { + description: + 'The data an extension provides to inform Platform.Bible of the settings it provides', + anyOf: [ + { + $ref: '#/$defs/settingsGroup', + }, + { + type: 'array', + items: { + $ref: '#/$defs/settingsGroup', + }, + }, + ], + }, + settingsGroup: { + description: 'Group of related settings definitions', + type: 'object', + properties: { + label: { + description: 'localizeKey that displays in the settings dialog as the group name', + $ref: '#/$defs/localizeKey', + }, + description: { + description: 'localizeKey that displays in the settings dialog to describe the group', + $ref: '#/$defs/localizeKey', + }, + properties: { + $ref: '#/$defs/settingProperties', + }, + }, + required: ['label', 'properties'], + }, + settingProperties: { + description: 'Object whose keys are setting IDs and whose values are settings objects', + type: 'object', + patternProperties: { + '^[\\w-]+\\.[\\w-]+$': { + $ref: '#/$defs/setting', + }, + }, + additionalProperties: false, + }, + setting: { + description: "A description of an extension's setting entry", + anyOf: [ + { + $ref: '#/$defs/extensionControlledSetting', + }, + ], + }, + extensionControlledSetting: { + description: 'Setting definition that is validated by the extension.', + allOf: [ + { + $ref: '#/$defs/settingBase', + }, + { + $ref: '#/$defs/modifierExtensionControlled', + }, + ], + }, + settingBase: { + description: 'Base information needed to describe a setting entry', + allOf: [ + { + $ref: '#/$defs/stateBase', + }, + { + type: 'object', + properties: { + label: { + description: 'localizeKey that displays in the settings dialog as the setting name', + $ref: '#/$defs/localizeKey', + }, + description: { + description: 'localizeKey that displays in the settings dialog to describe the setting', + $ref: '#/$defs/localizeKey', + }, + }, + required: ['label'], + }, + ], + }, + projectStateContribution: { + description: + 'The data an extension provides to inform Platform.Bible of the project state it provides', + $ref: '#/$defs/userStateProperties', + }, + userStateContribution: { + description: + 'The data an extension provides to inform Platform.Bible of the user state it provides', + $ref: '#/$defs/userStateProperties', + }, + userStateProperties: { + description: 'Object whose keys are state IDs and whose values are state objects', + type: 'object', + patternProperties: { + '^[\\w\\-]+\\.[\\w\\-]+$': { + $ref: '#/$defs/userState', + }, + }, + additionalProperties: false, + }, + userState: { + description: "A description of an extension's user state entry", + anyOf: [ + { + $ref: '#/$defs/extensionControlledState', + }, + ], + }, + extensionControlledState: { + description: 'State definition that is validated by the extension.', + allOf: [ + { + $ref: '#/$defs/stateBase', + }, + { + $ref: '#/$defs/modifierExtensionControlled', + }, + ], + }, + modifierExtensionControlled: { + description: + 'Modifies state/setting type to be extension-controlled. "Extension-controlled" means the extension provides the component and the validator for the state/setting, so the state/setting is controlled by the extension.', + not: { + anyOf: [ + { + type: 'object', + required: ['platformType'], + }, + { + type: 'object', + required: ['type'], + }, + ], + }, + }, + stateBase: { + description: 'Base information needed to describe a state entry', + type: 'object', + properties: { + default: { + description: 'default value for the state/setting', + type: 'any', + }, + derivesFrom: { + description: + "a state/setting ID whose value to set to this state/setting's starting value the first time this state/setting is loaded", + $ref: '#/$defs/id', + }, + }, + required: ['default'], + }, + localizeKey: { + description: "Identifier for a string that will be localized based on the user's UI language", + type: 'string', + pattern: '^%[\\w\\-\\.]+%$', + tsType: 'LocalizeKey', + }, + id: { + description: '', + type: 'string', + pattern: '^[\\w\\-]+\\.[\\w\\-]+$', + tsType: 'Id', + }, +}; + +/** + * Json-schema-to-typescript has some added stuff that isn't actually compatible with JSON schema, + * so we remove them here + * + * @param defs The `$defs` property of a JSON schema (will be modified in place) + */ +// JSON schema types are weird, so we'll just be careful +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function removeJsonToTypeScriptTypesStuff(defs: any) { + if (!defs) return; + + // JSON schema types are weird, so we'll just be careful + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Object.values(defs).forEach((def: any) => { + if (!def.type) return; + + if ('tsType' in def) delete def.tsType; + + if (def.type === 'any') { + delete def.type; + return; + } + + if (def.type === 'object') { + removeJsonToTypeScriptTypesStuff(def.properties); + } + }); +} + +removeJsonToTypeScriptTypesStuff(settingsDefs); + +/** JSON schema object that aligns with the ProjectSettingsContribution type */ +export const projectSettingsDocumentSchema = { + $schema: 'https://json-schema.org/draft/2020-12/schema', + title: 'Project Settings Contribution', + description: + 'The data an extension provides to inform Platform.Bible of the project settings it provides', + anyOf: [ + { + $ref: '#/$defs/projectSettingsGroup', + }, + { + type: 'array', + items: { + $ref: '#/$defs/projectSettingsGroup', + }, + }, + ], + + $defs: settingsDefs, +}; + +Object.freeze(projectSettingsDocumentSchema); + +/** JSON schema object that aligns with the {@link SettingsContribution} type */ +export const settingsDocumentSchema = { + $schema: 'https://json-schema.org/draft/2020-12/schema', + title: 'Settings Contribution', + description: + 'The data an extension provides to inform Platform.Bible of the settings it provides', + anyOf: [ + { + $ref: '#/$defs/settingsGroup', + }, + { + type: 'array', + items: { + $ref: '#/$defs/settingsGroup', + }, + }, + ], + + $defs: settingsDefs, +}; + +Object.freeze(settingsDocumentSchema); diff --git a/lib/platform-bible-utils/src/string-util.test.ts b/lib/platform-bible-utils/src/string-util.test.ts new file mode 100644 index 0000000000..d83a6514c8 --- /dev/null +++ b/lib/platform-bible-utils/src/string-util.test.ts @@ -0,0 +1,670 @@ +import { + at, + charAt, + codePointAt, + endsWith, + escapeStringRegexp, + formatReplacementString, + includes, + indexOf, + lastIndexOf, + stringLength, + normalize, + padEnd, + padStart, + slice, + split, + startsWith, + substring, + toArray, + ordinalCompare, + testingStringUtils, + transformAndEnsureRegExpRegExpArray, + transformAndEnsureRegExpArray, +} from './string-util'; + +const SHORT_SURROGATE_PAIRS_STRING = 'Look𐐷At👨‍👩‍👧‍👦👮🏽‍♀️'; +const SHORT_SURROGATE_PAIRS_ARRAY = ['L', 'o', 'o', 'k', '𐐷', 'A', 't', '👨‍👩‍👧‍👦', '👮🏽‍♀️']; + +const MEDIUM_SURROGATE_PAIRS_STRING = 'Look𐐷At🦄This𐐷Thing👮🏽‍♀️Its𐐷Awesome'; +const MEDIUM_SURROGATE_PAIRS_ARRAY = ['Look', 'At🦄This', 'Thing👮🏽‍♀️Its', 'Awesome']; + +const LONG_SURROGATE_PAIRS_STRING = + 'Look𐐷At🦄All😎These😁Awesome🍕Symbols💩That🚀Are📷Represented👮🏽‍♀️By🍕Surrogate🔥Pairs💋!🌟'; + +const POS_FIRST_PIZZA = 25; +const POS_SECOND_PIZZA = 57; +const SURROGATE_PAIRS_STRING_LENGTH = 76; +const TEN_SPACES = ' '; +const SEVEN_XS = 'XXXXXXX'; + +const NORMALIZE_STRING = '\u0041\u006d\u00e9\u006c\u0069\u0065'; +const NORMALIZE_SURROGATE_PAIRS = '\u0041\u006d\u0065\u0301\u006c\u0069\u0065'; + +describe('at', () => { + test('at with in bounds index', () => { + const result = at(LONG_SURROGATE_PAIRS_STRING, 4); + expect(result).toEqual('𐐷'); + }); + + test('at with negative index returns last character', () => { + const result = at(LONG_SURROGATE_PAIRS_STRING, -1); + expect(result).toEqual('🌟'); + }); + + test('at with index greater than length returns undefined', () => { + const result = at(LONG_SURROGATE_PAIRS_STRING, stringLength(LONG_SURROGATE_PAIRS_STRING) + 10); + expect(result).toEqual(undefined); + }); + + test('at with index smaller than -length returns undefined', () => { + const result = at(LONG_SURROGATE_PAIRS_STRING, -stringLength(LONG_SURROGATE_PAIRS_STRING) - 10); + expect(result).toEqual(undefined); + }); +}); + +describe('charAt', () => { + test('0 < index < string length', () => { + const result = charAt(MEDIUM_SURROGATE_PAIRS_STRING, 7); + expect(result).toEqual('🦄'); + }); + + test('index < 0', () => { + const result = charAt(MEDIUM_SURROGATE_PAIRS_STRING, -2); + expect(result).toEqual(''); + }); + + test('index > string length', () => { + const result = charAt(MEDIUM_SURROGATE_PAIRS_STRING, 50); + expect(result).toEqual(''); + }); +}); + +describe('codePointAt', () => { + test('codePointAt for regular character', () => { + const result = codePointAt(MEDIUM_SURROGATE_PAIRS_STRING, 11); + expect(result).toEqual(115); + }); + + test('codePointAt for surrogate pair', () => { + const result = codePointAt(MEDIUM_SURROGATE_PAIRS_STRING, 7); + expect(result).toEqual(129412); + }); + + test('codePointAt index < 0', () => { + const result = codePointAt(MEDIUM_SURROGATE_PAIRS_STRING, -1); + expect(result).toEqual(undefined); + }); + + test('codePointAt index > string length', () => { + const result = codePointAt(MEDIUM_SURROGATE_PAIRS_STRING, 50); + expect(result).toEqual(undefined); + }); +}); + +describe('endsWith', () => { + test('endsWith without position', () => { + const result = endsWith(LONG_SURROGATE_PAIRS_STRING, '💋!🌟'); + expect(result).toEqual(true); + }); + + test('endsWith with position', () => { + const result = endsWith(LONG_SURROGATE_PAIRS_STRING, 'At🦄', 8); + expect(result).toEqual(true); + }); +}); + +describe('indexOfClosestClosingCurlyBrace', () => { + const curlyString = + // 1 2 + // 23 456 78901 2 345678901 23456 + 'Thi\\{s👮🏽‍♀️{is}👨‍👩‍👧‍👦\\}a {stri\\}ng}!'; + + test('gets the closest un-escaped curly brace', () => { + let result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 0, false); + expect(result).toBe(10); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 4, false); + expect(result).toBe(10); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 10, false); + expect(result).toBe(10); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 11, false); + expect(result).toBe(25); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 16, false); + expect(result).toBe(25); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 23, false); + expect(result).toBe(25); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 25, false); + expect(result).toBe(25); + }); + + test('gets the closest escaped curly brace', () => { + let result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 0, true); + expect(result).toBe(13); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 4, true); + expect(result).toBe(13); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 10, true); + expect(result).toBe(13); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 11, true); + expect(result).toBe(13); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 13, true); + expect(result).toBe(13); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 16, true); + expect(result).toBe(22); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 22, true); + expect(result).toBe(22); + }); + + test('returns -1 when out of bounds or no more curly braces are found', () => { + const strLength = stringLength(curlyString); + let result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, -1, true); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, -1, false); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, -10, true); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, -10, false); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, strLength, true); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, strLength, false); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, strLength + 5, true); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, strLength + 5, false); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 26, false); + expect(result).toBe(-1); + result = testingStringUtils.indexOfClosestClosingCurlyBrace(curlyString, 23, true); + expect(result).toBe(-1); + }); +}); + +describe('formatReplacementString', () => { + test('with curly braces', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{one-horned}Thing👮🏽‍♀️Its𐐷Awesome', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷UnicornThing👮🏽‍♀️Its𐐷Awesome'); + }); + + test('with surrogate pairs in the escape sequence', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{one👮🏽‍♀️horned}Thing👮🏽‍♀️Its𐐷Awesome', { + 'one👮🏽‍♀️horned': 'Unicorn', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷UnicornThing👮🏽‍♀️Its𐐷Awesome'); + }); + + test('with curly braces at the start', () => { + const result = formatReplacementString('{one-horned}Thing👮🏽‍♀️Its𐐷Awesome', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('UnicornThing👮🏽‍♀️Its𐐷Awesome'); + }); + + test('with curly braces as the whole string', () => { + const result = formatReplacementString('{one-horned}', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('Unicorn'); + }); + + test('with curly braces and an empty string replacer', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{one-horned}Thing👮🏽‍♀️Its𐐷Awesome', { + 'one-horned': '', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷Thing👮🏽‍♀️Its𐐷Awesome'); + }); + + test('with multiple pairs of curly braces', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{one-horned}Thing👮🏽‍♀️Its𐐷Awesome{sauce}', { + 'one-horned': 'Unicorn', + sauce: 'ness', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷UnicornThing👮🏽‍♀️Its𐐷Awesomeness'); + }); + + test('with empty curly braces', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{}', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷'); + }); + + test('with unknown word in curly braces', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷{UFO}', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷UFO'); + }); + + test('with escaped curly braces', () => { + const result = formatReplacementString('Look𐐷At🦄This𐐷\\{one-horned\\}Thing👮🏽‍♀️Its𐐷Awesome', { + 'one-horned': 'Unicorn', + }); + expect(result).toEqual('Look𐐷At🦄This𐐷{one-horned}Thing👮🏽‍♀️Its𐐷Awesome'); + }); + + test('with multiple pairs of escaped curly braces', () => { + const result = formatReplacementString( + 'Look𐐷At🦄This𐐷\\{one-horned\\}Thing👮🏽‍♀️Its𐐷Awesome\\{:)\\}', + { + 'one-horned': 'Unicorn', + ':)': 'smiley face', + }, + ); + expect(result).toEqual('Look𐐷At🦄This𐐷{one-horned}Thing👮🏽‍♀️Its𐐷Awesome{:)}'); + }); + + test('with curly braces and escaped curly braces', () => { + const result = formatReplacementString('Hi, this is {name}! I like \\{curly braces\\}!', { + name: 'Jim', + }); + expect(result).toEqual('Hi, this is Jim! I like {curly braces}!'); + }); + + test('with multiple pairs of curly braces and escaped curly braces', () => { + const result = formatReplacementString( + 'Hi, this is {name}! I like \\{curly braces\\}!Hi, this is {name}! I like \\{curly braces\\}!', + { + name: 'Jim', + }, + ); + expect(result).toEqual( + 'Hi, this is Jim! I like {curly braces}!Hi, this is Jim! I like {curly braces}!', + ); + }); + + test('with interesting types as keys and values', () => { + const result = formatReplacementString( + 'Hi, this is {name}! I use {0} weights when I curl {weightLbs}lb weights. I do {1} reps {interval}. I have a weakness level of {weakness}.', + { + name: 'Chad', + 0: 'lead', + weightLbs: 9000, + 1: 1000, + interval: 'every second of every day', + weakness: undefined, + }, + ); + expect(result).toEqual( + 'Hi, this is Chad! I use lead weights when I curl 9000lb weights. I do 1000 reps every second of every day. I have a weakness level of undefined.', + ); + }); +}); + +describe('includes', () => { + test('includes without position', () => { + const result = includes(LONG_SURROGATE_PAIRS_STRING, '🍕Symbols💩'); + expect(result).toEqual(true); + }); + + test('includes with position', () => { + const result = includes(LONG_SURROGATE_PAIRS_STRING, '🦄All😎', 7); + expect(result).toEqual(true); + }); + + test('includes with position that is to high, so no matches are found', () => { + const result = includes(LONG_SURROGATE_PAIRS_STRING, '🦄All😎', 10); + expect(result).toEqual(false); + }); +}); + +describe('indexOf', () => { + test('indexOf without position', () => { + const result = indexOf(LONG_SURROGATE_PAIRS_STRING, '🍕'); + expect(result).toEqual(POS_FIRST_PIZZA); + }); + + test('indexOf with position', () => { + const result = indexOf(LONG_SURROGATE_PAIRS_STRING, '🍕', 40); + expect(result).toEqual(POS_SECOND_PIZZA); + }); +}); + +describe('lastIndexOf', () => { + test('lastIndexOf without position', () => { + const result = lastIndexOf(LONG_SURROGATE_PAIRS_STRING, '🍕'); + expect(result).toEqual(POS_SECOND_PIZZA); + }); + + test('lastIndexOf with position', () => { + const result = lastIndexOf(LONG_SURROGATE_PAIRS_STRING, '🍕', 5); + expect(result).toEqual(-1); + }); +}); + +describe('length', () => { + test('length is correct', () => { + const result = stringLength(LONG_SURROGATE_PAIRS_STRING); + expect(result).toEqual(SURROGATE_PAIRS_STRING_LENGTH); + }); +}); + +describe('normalize', () => { + test('normalize with no forms, compare strings', () => { + const regularStringResult = normalize(NORMALIZE_STRING, 'none'); + const surrogatePairStringResult = normalize(NORMALIZE_SURROGATE_PAIRS, 'none'); + expect(regularStringResult === surrogatePairStringResult).toEqual(false); + }); + + test('normalize with different forms, compare strings', () => { + const NFCResult = normalize(NORMALIZE_STRING, 'NFC'); + const NFDResult = normalize(NORMALIZE_SURROGATE_PAIRS, 'NFD'); + expect(NFCResult === NFDResult).toEqual(false); + }); + + test('normalize with same form, compare strings', () => { + const regularStringResult = normalize(NORMALIZE_STRING, 'NFC'); + const surrogatePairStringResult = normalize(NORMALIZE_SURROGATE_PAIRS, 'NFC'); + expect(regularStringResult === surrogatePairStringResult).toEqual(true); + }); + + test('normalize surrogate pairs string', () => { + const result = normalize(NORMALIZE_SURROGATE_PAIRS, 'NFC'); + expect(result).toEqual(NORMALIZE_STRING); + }); + + test('normalize surrogate pairs string as its own form', () => { + const result = normalize(NORMALIZE_SURROGATE_PAIRS, 'NFD'); + expect(result).toEqual(NORMALIZE_SURROGATE_PAIRS); + }); +}); + +describe('ordinalCompare', () => { + it('should return a negative number if string1 comes before string2', () => { + expect(ordinalCompare('👮🏽‍♀️', '🦄')).toBeLessThan(0); + }); + + it('should return a positive number if string1 comes after string2', () => { + expect(ordinalCompare('🦄', '👮🏽‍♀️')).toBeGreaterThan(0); + }); + + it('should return 0 if string1 is equal to string2', () => { + expect(ordinalCompare('🦄', '🦄')).toBe(0); + }); +}); + +describe('padEnd', () => { + test('padEnd without padString', () => { + const result = padEnd( + LONG_SURROGATE_PAIRS_STRING, + SURROGATE_PAIRS_STRING_LENGTH + 10, + undefined, + ); + expect(result).toEqual(LONG_SURROGATE_PAIRS_STRING + TEN_SPACES); + }); + + test('padEnd with padString', () => { + const result = padEnd(LONG_SURROGATE_PAIRS_STRING, SURROGATE_PAIRS_STRING_LENGTH + 7, 'X'); + expect(result).toEqual(LONG_SURROGATE_PAIRS_STRING + SEVEN_XS); + }); + + // Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 + // It expects 10 'ha' but it should only give 5 'ha' because that would be length 10 + // limit only works when length(padString) = 1 + // ('padEnd with padString', () => { + // const result = padEnd(TEXT_STRING, TEST_STRING_LENGTH + 10, 'ha'); + // expect(result).toEqual(`${TEXT_STRING}hahahahaha`); + // }); +}); + +describe('padStart', () => { + test('padStart without padString', () => { + const result = padStart( + LONG_SURROGATE_PAIRS_STRING, + SURROGATE_PAIRS_STRING_LENGTH + 10, + undefined, + ); + expect(result).toEqual(TEN_SPACES + LONG_SURROGATE_PAIRS_STRING); + }); + + test('padStart with padString', () => { + const result = padStart(LONG_SURROGATE_PAIRS_STRING, SURROGATE_PAIRS_STRING_LENGTH + 7, 'X'); + expect(result).toEqual(SEVEN_XS + LONG_SURROGATE_PAIRS_STRING); + }); + + // Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 + // It expects 10 'ha' but it should only give 5 'ha' because that would be length 10 + // limit only works when length(padString) = 1 + // ('padStart with padString', () => { + // const result = padStart(TEST_STRING, TEST_STRING_LENGTH + 10, 'ha'); + // expect(result).toEqual(`hahahahaha${TEST_STRING}`); + // }); +}); + +describe('slice', () => { + test('start (-inf)-(-L)', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -100); + expect(result).toEqual(MEDIUM_SURROGATE_PAIRS_STRING); + }); + test('start (-L)-0', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -3); + expect(result).toEqual('ome'); + }); + test('start 0-L', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 3); + expect(result).toEqual('k𐐷At🦄This𐐷Thing👮🏽‍♀️Its𐐷Awesome'); + }); + test('start L-inf', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 50); + expect(result).toEqual(''); + }); + test('start (-inf)-(-L) end (-inf)-(-L)', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -200, -100); + expect(result).toEqual(''); + }); + test('start (-inf)-(-L) end (-L)-0', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -100, -10); + expect(result).toEqual('Look𐐷At🦄This𐐷Thing👮🏽‍♀️I'); + }); + test('start (-inf)-(-L) end 0-L', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -100, 8); + expect(result).toEqual('Look𐐷At🦄'); + }); + test('start (-inf)-(-L) end L-inf', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -100, 100); + expect(result).toEqual(MEDIUM_SURROGATE_PAIRS_STRING); + }); + test('start (-L)-0 end (-inf)-(-L)', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -5, -100); + expect(result).toEqual(''); + }); + test('start (-L)-0 end (-L)-0', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -5, -10); + expect(result).toEqual(''); + }); + + test('start (-L)-0 end (-L)-0 and start < end', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -10, -5); + expect(result).toEqual('ts𐐷Aw'); + }); + test('start (-L)-0 end 0-L', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -5, 8); + expect(result).toEqual(''); + }); + test('start (-L)-0 end L-inf', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, -5, 100); + expect(result).toEqual('esome'); + }); + test('start 0-L end (-inf)-(-L)', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 5, -100); + expect(result).toEqual(''); + }); + test('start 0-L end (-L)-0', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 5, -10); + expect(result).toEqual('At🦄This𐐷Thing👮🏽‍♀️I'); + }); + test('start 0-L end 0-L', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 5, 8); + expect(result).toEqual('At🦄'); + }); + test('start 0-L end 0-L, and start > end', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 8, 5); + expect(result).toEqual(''); + }); + test('start 0-L end L-inf', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 5, 100); + expect(result).toEqual('At🦄This𐐷Thing👮🏽‍♀️Its𐐷Awesome'); + }); + test('start L-inf end (-inf)-(-L)', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 50, -100); + expect(result).toEqual(''); + }); + test('start L-inf end (-L)-0', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 50, -10); + expect(result).toEqual(''); + }); + test('start L-inf end 0-L', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 50, 8); + expect(result).toEqual(''); + }); + test('start L-inf end L-inf', () => { + const result = slice(MEDIUM_SURROGATE_PAIRS_STRING, 50, 100); + expect(result).toEqual(''); + }); + test('starting index is 0', () => { + const str = 'hello-someone.d.ts'; + expect(slice(str, 0)).toBe('hello-someone.d.ts'); + expect(slice(str, 0, 2)).toBe('he'); + expect(slice(str, 0, -stringLength('.d.ts'))).toBe('hello-someone'); + }); +}); + +describe('split', () => { + test('split without splitLimit', () => { + const result = split(MEDIUM_SURROGATE_PAIRS_STRING, '𐐷'); + expect(result).toEqual(MEDIUM_SURROGATE_PAIRS_ARRAY); + }); + + test('split with splitLimit', () => { + const result = split(MEDIUM_SURROGATE_PAIRS_STRING, '𐐷', 2); + expect(result).toEqual(['Look', 'At🦄This𐐷Thing👮🏽‍♀️Its𐐷Awesome']); + }); + + test('split by empty string', () => { + const result = split(SHORT_SURROGATE_PAIRS_STRING, ''); + expect(result).toEqual(SHORT_SURROGATE_PAIRS_ARRAY); + }); + + test('split by empty string with splitLimit', () => { + const result = split(SHORT_SURROGATE_PAIRS_STRING, '', 3); + expect(result).toEqual(['L', 'o', 'o']); + }); + + test('split with RegExp separator', () => { + const result = split(MEDIUM_SURROGATE_PAIRS_STRING, /[A-Z]/); + expect(result).toEqual(['', 'ook𐐷', 't🦄', 'his𐐷', 'hing👮🏽‍♀️', 'ts𐐷', 'wesome']); + }); + + test('split with RegExp separator that contains surrogate pairs', () => { + const result = split(MEDIUM_SURROGATE_PAIRS_STRING, /🦄/); + expect(result).toEqual(['Look𐐷At', 'This𐐷Thing👮🏽‍♀️Its𐐷Awesome']); + }); + + test('split with RegExp separator that matches nothing in the string', () => { + const result = split(MEDIUM_SURROGATE_PAIRS_STRING, /\d/); + expect(result).toEqual([MEDIUM_SURROGATE_PAIRS_STRING]); + }); +}); + +describe('startsWith', () => { + test('startsWith without position', () => { + const result = startsWith(LONG_SURROGATE_PAIRS_STRING, 'Look𐐷'); + expect(result).toEqual(true); + }); + + test('startsWith with position, searchString is not the start', () => { + const result = startsWith(LONG_SURROGATE_PAIRS_STRING, 'Look𐐷', 5); + expect(result).toEqual(false); + }); + + test('startsWith with position, searchString is the start', () => { + const result = startsWith(LONG_SURROGATE_PAIRS_STRING, 'At🦄', 5); + expect(result).toEqual(true); + }); +}); + +describe('substring', () => { + test('substring with begin', () => { + const result = substring(LONG_SURROGATE_PAIRS_STRING, POS_FIRST_PIZZA); + expect(result).toEqual('🍕Symbols💩That🚀Are📷Represented👮🏽‍♀️By🍕Surrogate🔥Pairs💋!🌟'); + }); + + test('substring with end', () => { + const result = substring(LONG_SURROGATE_PAIRS_STRING, 0, POS_FIRST_PIZZA); + expect(result).toEqual('Look𐐷At🦄All😎These😁Awesome'); + }); + + test('substring with begin and end', () => { + const result = substring(LONG_SURROGATE_PAIRS_STRING, POS_FIRST_PIZZA, POS_SECOND_PIZZA); + expect(result).toEqual('🍕Symbols💩That🚀Are📷Represented👮🏽‍♀️By'); + }); +}); + +describe('toArray', () => { + test('toArray returns correct array', () => { + const result = toArray(SHORT_SURROGATE_PAIRS_STRING); + expect(result).toEqual(SHORT_SURROGATE_PAIRS_ARRAY); + }); +}); + +describe('escapeStringRegexp', () => { + test('properly escapes stuff', () => { + const result = escapeStringRegexp('How much $ for a 🦄?'); + expect(result).toEqual('How much \\$ for a 🦄\\?'); + }); +}); + +describe('transformAndEnsureRegExpRegExpArray', () => { + test('should return an empty array when input is undefined', () => { + expect(transformAndEnsureRegExpRegExpArray(undefined)).toEqual([]); + }); + + test('should convert a single string to an array with one RegExp', () => { + const input = 'test'; + const result = transformAndEnsureRegExpRegExpArray(input); + expect(result).toEqual([/test/]); + }); + + test('should convert an array of strings to an array of RegExp objects', () => { + const input = ['test1', 'test2', 'test3']; + const result = transformAndEnsureRegExpRegExpArray(input); + expect(result).toEqual([/test1/, /test2/, /test3/]); + }); + + test('should convert nested arrays of strings to arrays of RegExp arrays', () => { + const input = ['test1', ['nested1', 'nested2'], 'test2']; + const result = transformAndEnsureRegExpRegExpArray(input); + expect(result).toEqual([/test1/, [/nested1/, /nested2/], /test2/]); + }); + + test('should handle an array of single strings and nested arrays', () => { + const input = ['a', ['b', 'c'], 'd']; + const result = transformAndEnsureRegExpRegExpArray(input); + expect(result).toEqual([/a/, [/b/, /c/], /d/]); + }); +}); + +describe('transformAndEnsureRegExpArray', () => { + test('should return an empty array when input is undefined', () => { + expect(transformAndEnsureRegExpArray(undefined)).toEqual([]); + }); + + test('should convert a single string to an array with one RegExp', () => { + const input = 'test'; + const result = transformAndEnsureRegExpArray(input); + expect(result).toEqual([/test/]); + }); + + test('should convert an array of strings to an array of RegExp objects', () => { + const input = ['test1', 'test2', 'test3']; + const result = transformAndEnsureRegExpArray(input); + expect(result).toEqual([/test1/, /test2/, /test3/]); + }); + + test('should handle empty strings in the input array', () => { + const input = ['', 'a', '']; + const result = transformAndEnsureRegExpArray(input); + expect(result).toEqual([/(?:)/, /a/, /(?:)/]); + }); +}); diff --git a/lib/platform-bible-utils/src/string-util.ts b/lib/platform-bible-utils/src/string-util.ts new file mode 100644 index 0000000000..f87a24aecc --- /dev/null +++ b/lib/platform-bible-utils/src/string-util.ts @@ -0,0 +1,634 @@ +import { LocalizeKey } from 'menus.model'; +import { + indexOf as stringzIndexOf, + substring as stringzSubstring, + length as stringzLength, + toArray as stringzToArray, + limit as stringzLimit, + substr as stringzSubstr, +} from 'stringz'; +import ensureArray from './array-util'; + +/** + * This function mirrors the `at` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Finds the Unicode code point at the given index. + * + * @param string String to index + * @param index Position of the character to be returned in range of -length(string) to + * length(string) + * @returns New string consisting of the Unicode code point located at the specified offset, + * undefined if index is out of bounds + */ +export function at(string: string, index: number): string | undefined { + if (index > stringLength(string) || index < -stringLength(string)) return undefined; + return substr(string, index, 1); +} + +/** + * This function mirrors the `charAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a new string consisting of the single unicode code point at the given index. + * + * @param string String to index + * @param index Position of the string character to be returned, in the range of 0 to + * length(string)-1 + * @returns New string consisting of the Unicode code point located at the specified offset, empty + * string if index is out of bounds + */ +export function charAt(string: string, index: number): string { + if (index < 0 || index > stringLength(string) - 1) return ''; + return substr(string, index, 1); +} + +/** + * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a non-negative integer that is the Unicode code point value of the character starting at + * the given index. + * + * @param string String to index + * @param index Position of the string character to be returned, in the range of 0 to + * length(string)-1 + * @returns Non-negative integer representing the code point value of the character at the given + * index, or undefined if there is no element at that position + */ +export function codePointAt(string: string, index: number): number | undefined { + if (index < 0 || index > stringLength(string) - 1) return undefined; + return substr(string, index, 1).codePointAt(0); +} + +/** + * This function mirrors the `endsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Determines whether a string ends with the characters of this string. + * + * @param string String to search through + * @param searchString Characters to search for at the end of the string + * @param endPosition End position where searchString is expected to be found. Default is + * `length(string)` + * @returns True if it ends with searchString, false if it does not + */ +export function endsWith( + string: string, + searchString: string, + endPosition: number = stringLength(string), +): boolean { + const lastIndexOfSearchString = lastIndexOf(string, searchString); + if (lastIndexOfSearchString === -1) return false; + if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false; + return true; +} + +/** + * Get the index of the closest closing curly brace in a string. + * + * Note: when escaped, gets the index of the curly brace, not the backslash before it. + * + * @param str String to search + * @param index Index at which to start searching. Inclusive of this index + * @param escaped Whether to search for an escaped or an unescaped closing curly brace + * @returns Index of closest closing curly brace or -1 if not found + */ +function indexOfClosestClosingCurlyBrace(str: string, index: number, escaped: boolean) { + if (index < 0) return -1; + if (escaped) { + if (charAt(str, index) === '}' && charAt(str, index - 1) === '\\') return index; + const closeCurlyBraceIndex = indexOf(str, '\\}', index); + return closeCurlyBraceIndex >= 0 ? closeCurlyBraceIndex + 1 : closeCurlyBraceIndex; + } + + let i = index; + const strLength = stringLength(str); + while (i < strLength) { + i = indexOf(str, '}', i); + + if (i === -1 || charAt(str, i - 1) !== '\\') break; + + // Didn't find an un-escaped close brace, so keep looking + i += 1; + } + + return i >= strLength ? -1 : i; +} + +/** + * Formats a string, replacing `{replacer key}` with the value in the `replacers` at that replacer + * key (or multiple replacer values if there are multiple in the string). Will also remove \ before + * curly braces if curly braces are escaped with a backslash in order to preserve the curly braces. + * E.g. 'Hi, this is {name}! I like `\{curly braces\}`! would become Hi, this is Jim! I like {curly + * braces}! + * + * If the key in unescaped braces is not found, returns the key without the braces. Empty unescaped + * curly braces will just return a string without the braces e.g. ('I am {Nemo}', { 'name': 'Jim'}) + * would return 'I am Nemo'. + * + * @example + * + * ```typescript + * formatReplacementString( + * 'Hi, this is {name}! I like \{curly braces\}! I have a {carColor} car. My favorite food is {food}.', + * { name: 'Bill', carColor: 'blue' } + * ); + * + * => + * + * 'Hi, this is Bill! I like {curly braces}! I have a blue car. My favorite food is food.' + * ``` + * + * @param str String to format + * @param replacers Object whose keys are replacer keys and whose values are the values with which + * to replace `{replacer key}`s found in the string to format. Will be coerced to strings using + * `${replacerValue}` + * @returns Formatted string + */ +export function formatReplacementString( + str: string, + replacers: { [key: string | number]: string | unknown } | object, +): string { + let updatedStr = str; + + let i = 0; + while (i < stringLength(updatedStr)) { + switch (charAt(updatedStr, i)) { + case '{': + if (charAt(updatedStr, i - 1) !== '\\') { + // This character is an un-escaped open curly brace. Try to match and replace + const closeCurlyBraceIndex = indexOfClosestClosingCurlyBrace(updatedStr, i, false); + if (closeCurlyBraceIndex >= 0) { + // We have matching open and close indices. Try to replace the contents + const replacerKey = substring(updatedStr, i + 1, closeCurlyBraceIndex); + // Replace with the replacer string or just remove the curly braces + const replacerString = + replacerKey in replacers + ? // We're getting a value.toString() with any type from an object with any keys + // here. TypeScript doesn't need to carefully and precisely track the exact type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + `${replacers[replacerKey as keyof typeof replacers]}` + : replacerKey; + + updatedStr = `${substring(updatedStr, 0, i)}${replacerString}${substring(updatedStr, closeCurlyBraceIndex + 1)}`; + // Put our index at the closing brace adjusted for the new string length minus two + // because we are removing the curly braces + // Ex: "stuff {and} things" + // Replacer for and: n' + // closeCurlyBraceIndex is 10 + // "stuff n' things" + // i = 10 + 2 - 3 - 2 = 7 + i = closeCurlyBraceIndex + stringLength(replacerString) - stringLength(replacerKey) - 2; + } else { + // This is an unexpected un-escaped open curly brace with no matching closing curly + // brace. Just ignore, I guess + } + } else { + // This character is an escaped open curly brace. Remove the escape + updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`; + // Adjust our index because we removed the escape + i -= 1; + } + break; + case '}': + if (charAt(updatedStr, i - 1) !== '\\') { + // This character is an un-escaped closing curly brace with no matching open curly + // brace. Just ignore, I guess + } else { + // This character is an escaped closing curly brace. Remove the escape + updatedStr = `${substring(updatedStr, 0, i - 1)}${substring(updatedStr, i)}`; + // Adjust our index because we removed the escape + i -= 1; + } + break; + default: + // No need to do anything with other characters at this point + break; + } + + i += 1; + } + + return updatedStr; +} +/** + * This function mirrors the `includes` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Performs a case-sensitive search to determine if searchString is found in string. + * + * @param string String to search through + * @param searchString String to search for + * @param position Position within the string to start searching for searchString. Default is `0` + * @returns True if search string is found, false if it is not + */ +export function includes(string: string, searchString: string, position: number = 0): boolean { + const partialString = substring(string, position); + const indexOfSearchString = indexOf(partialString, searchString); + if (indexOfSearchString === -1) return false; + return true; +} + +/** + * This function mirrors the `indexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the index of the first occurrence of a given string. + * + * @param string String to search through + * @param searchString The string to search for + * @param position Start of searching. Default is `0` + * @returns Index of the first occurrence of a given string + */ +export function indexOf( + string: string, + searchString: string, + position: number | undefined = 0, +): number { + return stringzIndexOf(string, searchString, position); +} + +/** + * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Searches this string and returns the index of the last occurrence of the specified substring. + * + * @param string String to search through + * @param searchString Substring to search for + * @param position The index at which to begin searching. If omitted, the search begins at the end + * of the string. Default is `undefined` + * @returns Index of the last occurrence of searchString found, or -1 if not found. + */ +export function lastIndexOf(string: string, searchString: string, position?: number): number { + let validatedPosition = position === undefined ? stringLength(string) : position; + + if (validatedPosition < 0) { + validatedPosition = 0; + } else if (validatedPosition >= stringLength(string)) { + validatedPosition = stringLength(string) - 1; + } + + for (let index = validatedPosition; index >= 0; index--) { + if (substr(string, index, stringLength(searchString)) === searchString) { + return index; + } + } + + return -1; +} + +/** + * This function mirrors the `length` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. Since `length` appears to be a + * reserved keyword, the function was renamed to `stringLength` + * + * Returns the length of a string. + * + * @param string String to return the length for + * @returns Number that is length of the starting string + */ +export function stringLength(string: string): number { + return stringzLength(string); +} + +/** + * This function mirrors the `normalize` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the Unicode Normalization Form of this string. + * + * @param string The starting string + * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'` + * @returns A string containing the Unicode Normalization Form of the given string. + */ +export function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string { + const upperCaseForm = form.toUpperCase(); + if (upperCaseForm === 'NONE') { + return string; + } + return string.normalize(upperCaseForm); +} + +/** + * Compares two strings using an ordinal comparison approach based on the specified collation + * options. This function uses the built-in `localeCompare` method with the 'en' locale and the + * provided collation options to compare the strings. + * + * @param string1 The first string to compare. + * @param string2 The second string to compare. + * @param options Optional. The collation options used for comparison. + * @returns A number indicating the result of the comparison: - Negative value if string1 precedes + * string2 in sorting order. - Zero if string1 and string2 are equivalent in sorting order. - + * Positive value if string1 follows string2 in sorting order. + */ +export function ordinalCompare( + string1: string, + string2: string, + options?: Intl.CollatorOptions, +): number { + return string1.localeCompare(string2, 'en', options); +} + +/** + * This function mirrors the `padEnd` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the end of this string. + * + * @param string String to add padding too + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within targetLength, it will be truncated. Default is `" "` + * @returns String with appropriate padding at the end + */ +// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 +export function padEnd(string: string, targetLength: number, padString: string = ' '): string { + if (targetLength <= stringLength(string)) return string; + return stringzLimit(string, targetLength, padString, 'right'); +} + +/** + * This function mirrors the `padStart` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the start of this string. + * + * @param string String to add padding too + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within the targetLength, it will be truncated from the end. Default is `" "` + * @returns String with of specified targetLength with padString applied from the start + */ +// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 +export function padStart(string: string, targetLength: number, padString: string = ' '): string { + if (targetLength <= stringLength(string)) return string; + return stringzLimit(string, targetLength, padString, 'left'); +} + +// This is a helper function that performs a correction on the slice index to make sure it +// cannot go out of bounds +function correctSliceIndex(length: number, index: number) { + if (index > length) return length; + if (index < -length) return 0; + if (index < 0) return index + length; + return index; +} + +/** + * This function mirrors the `slice` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Extracts a section of this string and returns it as a new string, without modifying the original + * string. + * + * @param string The starting string + * @param indexStart The index of the first character to include in the returned substring. + * @param indexEnd The index of the first character to exclude from the returned substring. + * @returns A new string containing the extracted section of the string. + */ +export function slice(string: string, indexStart: number, indexEnd?: number): string { + const length: number = stringLength(string); + if ( + indexStart > length || + (indexEnd && + ((indexStart > indexEnd && + !(indexStart >= 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) || + indexEnd < -length)) + ) + return ''; + + const newStart = correctSliceIndex(length, indexStart); + const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined; + + return substring(string, newStart, newEnd); +} + +/** + * This function mirrors the `split` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Takes a pattern and divides the string into an ordered list of substrings by searching for the + * pattern, puts these substrings into an array, and returns the array. + * + * @param string The string to split + * @param separator The pattern describing where each split should occur + * @param splitLimit Limit on the number of substrings to be included in the array. Splits the + * string at each occurrence of specified separator, but stops when limit entries have been placed + * in the array. + * @returns An array of strings, split at each point where separator occurs in the starting string. + * Returns undefined if separator is not found in string. + */ +export function split(string: string, separator: string | RegExp, splitLimit?: number): string[] { + const result: string[] = []; + + if (splitLimit !== undefined && splitLimit <= 0) { + return [string]; + } + + if (separator === '') return toArray(string).slice(0, splitLimit); + + let regexSeparator = separator; + if ( + typeof separator === 'string' || + (separator instanceof RegExp && !includes(separator.flags, 'g')) + ) { + regexSeparator = new RegExp(separator, 'g'); + } + + const matches: RegExpMatchArray | null = string.match(regexSeparator); + + let currentIndex = 0; + + if (!matches) return [string]; + + for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) { + const matchIndex = indexOf(string, matches[index], currentIndex); + const matchLength = stringLength(matches[index]); + + result.push(substring(string, currentIndex, matchIndex)); + currentIndex = matchIndex + matchLength; + + if (splitLimit !== undefined && result.length === splitLimit) { + break; + } + } + + result.push(substring(string, currentIndex)); + + return result; +} + +/** + * This function mirrors the `startsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Determines whether the string begins with the characters of a specified string, returning true or + * false as appropriate. + * + * @param string String to search through + * @param searchString The characters to be searched for at the start of this string. + * @param position The start position at which searchString is expected to be found (the index of + * searchString's first character). Default is `0` + * @returns True if the given characters are found at the beginning of the string, including when + * searchString is an empty string; otherwise, false. + */ +export function startsWith(string: string, searchString: string, position: number = 0): boolean { + const indexOfSearchString = indexOf(string, searchString, position); + if (indexOfSearchString !== position) return false; + return true; +} + +/** + * This function mirrors the `substr` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a substring by providing start and length. This function is not exported because it is + * considered deprecated, however it is still useful as a local helper function. + * + * @param string String to be divided + * @param begin Start position. Default is `Start of string` + * @param len Length of result. Default is `String length minus start parameter`. Default is `String + * length minus start parameter` + * @returns Substring from starting string + */ +function substr( + string: string, + begin: number = 0, + len: number = stringLength(string) - begin, +): string { + return stringzSubstr(string, begin, len); +} + +/** + * This function mirrors the `substring` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a substring by providing start and end position. + * + * @param string String to be divided + * @param begin Start position + * @param end End position. Default is `End of string` + * @returns Substring from starting string + */ +export function substring( + string: string, + begin: number, + end: number = stringLength(string), +): string { + return stringzSubstring(string, begin, end); +} + +/** + * This function mirrors the `toArray` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Converts a string to an array of string characters. + * + * @param string String to convert to array + * @returns An array of characters from the starting string + */ +export function toArray(string: string): string[] { + return stringzToArray(string); +} + +/** Determine whether the string is a `LocalizeKey` meant to be localized in Platform.Bible. */ +export function isLocalizeKey(str: string): str is LocalizeKey { + return startsWith(str, '%') && endsWith(str, '%'); +} + +/** + * Escape RegExp special characters. + * + * You can also use this to escape a string that is inserted into the middle of a regex, for + * example, into a character class. + * + * All credit to [`escape-string-regexp`](https://www.npmjs.com/package/escape-string-regexp) - this + * function is simply copied directly from there to allow a common js export + * + * @example + * + * import escapeStringRegexp from 'platform-bible-utils'; + * + * const escapedString = escapeStringRegexp('How much $ for a 🦄?'); + * //=> 'How much \\$ for a 🦄\\?' + * + * new RegExp(escapedString); + */ +export function escapeStringRegexp(string: string): string { + if (typeof string !== 'string') { + throw new TypeError('Expected a string'); + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return string.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d'); +} + +/** + * Transforms a string or an array of strings into an array of regular expressions, ensuring that + * the result is always an array. + * + * This function accepts a value that may be a single string, an array of strings, or `undefined`. + * It then: + * + * - Converts each string into a `RegExp` object. + * - If the input is an array containing nested arrays, it converts each string in the nested arrays + * into `RegExp` objects. + * - Ensures that the result is always an array of `RegExp` objects or arrays of `RegExp` objects. + * + * @param stringStringMaybeArray - The value to be transformed, which can be a single string, an + * array of strings or arrays of strings, or `undefined`. + * @returns An array of `RegExp` objects or arrays of `RegExp` objects. If the input is `undefined`, + * an empty array is returned. + */ +export function transformAndEnsureRegExpRegExpArray( + stringStringMaybeArray: string | (string | string[])[] | undefined, +): (RegExp | RegExp[])[] { + if (!stringStringMaybeArray) return []; + + const stringStringArray = ensureArray(stringStringMaybeArray); + + const regExpRegExpArray = stringStringArray.map((stringMaybeStringArray: string | string[]) => + Array.isArray(stringMaybeStringArray) + ? stringMaybeStringArray.map((str) => new RegExp(str)) + : new RegExp(stringMaybeStringArray), + ); + + return regExpRegExpArray; +} + +/** + * Transforms a string or an array of strings into an array of regular expressions. + * + * This function accepts a value that may be a single string, an array of strings, or `undefined`. + * It then: + * + * - Converts each string into a `RegExp` object. + * - Ensures that the result is always an array of `RegExp` objects. + * + * @param stringMaybeArray - The value to be transformed, which can be a single string, an array of + * strings, or `undefined`. + * @returns An array of `RegExp` objects. If the input is `undefined`, an empty array is returned. + */ +export function transformAndEnsureRegExpArray( + stringMaybeArray: string | string[] | undefined, +): RegExp[] { + if (!stringMaybeArray) return []; + + const stringArray = ensureArray(stringMaybeArray); + + const regExpArray = stringArray.map((str: string) => new RegExp(str)); + + return regExpArray; +} + +/** This is an internal-only export for testing purposes and should not be used in development */ +export const testingStringUtils = { + indexOfClosestClosingCurlyBrace, +}; diff --git a/lib/platform-bible-utils/src/subset-checking.test.ts b/lib/platform-bible-utils/src/subset-checking.test.ts new file mode 100644 index 0000000000..0b07cc13d4 --- /dev/null +++ b/lib/platform-bible-utils/src/subset-checking.test.ts @@ -0,0 +1,44 @@ +import isSubset from './subset-checking'; + +test('Subset checking works on simple types', () => { + expect(isSubset('a', 'a')).toBeTruthy(); + expect(isSubset('a', 'b')).toBeFalsy(); + expect(isSubset(1, 1)).toBeTruthy(); + expect(isSubset(1, 2)).toBeFalsy(); + expect(isSubset(true, true)).toBeTruthy(); + expect(isSubset(true, false)).toBeFalsy(); + // eslint-disable-next-line no-null/no-null + expect(isSubset(null, null)).toBeTruthy(); + expect(isSubset(undefined, undefined)).toBeTruthy(); + expect(isSubset('', '')).toBeTruthy(); + expect(isSubset(false, false)).toBeTruthy(); + expect(isSubset(0, 0)).toBeTruthy(); + expect(isSubset(undefined, false)).toBeFalsy(); + expect(isSubset(undefined, '')).toBeFalsy(); + expect(isSubset(undefined, 0)).toBeFalsy(); +}); + +test('Subset checking works on arrays of simple types', () => { + expect(isSubset([1, 2, 3], [1, 2, 3])).toBeTruthy(); + expect(isSubset([1, 2, 3], [1, 2])).toBeTruthy(); + expect(isSubset([1, 2, 3], [1])).toBeTruthy(); + expect(isSubset([1, 2, 3], [])).toBeTruthy(); + // You could argue this should be false, but we're only looking at existence of items, not counts + // Maybe it should consider counts, but it doesn't matter for the purpose that `isSubset` was made + expect(isSubset([1, 2, 3], [1, 1, 1])).toBeTruthy(); + + expect(isSubset(['a', 'b', 'c'], ['c', 'a', 'b'])).toBeTruthy(); + expect(isSubset([true, false], [false])).toBeTruthy(); +}); + +test('Subset checking works on objects with properties', () => { + const objA = { name: 'Alice', age: 30, address: { city: 'Seattle', state: 'Washington' } }; + const objB = { name: 'Alice', address: { city: 'Seattle' } }; + const objC = {}; + expect(isSubset(objA, objB)).toBeTruthy(); + expect(isSubset(objB, objA)).toBeFalsy(); + expect(isSubset(objA, objC)).toBeTruthy(); + expect(isSubset(objC, objA)).toBeFalsy(); + expect(isSubset(objB, objC)).toBeTruthy(); + expect(isSubset(objC, objB)).toBeFalsy(); +}); diff --git a/lib/platform-bible-utils/src/subset-checking.ts b/lib/platform-bible-utils/src/subset-checking.ts new file mode 100644 index 0000000000..12226d908b --- /dev/null +++ b/lib/platform-bible-utils/src/subset-checking.ts @@ -0,0 +1,67 @@ +import deepEqual from './equality-checking'; + +/** + * Check if one object is a subset of the other object. "Subset" means that all properties of one + * object are present in the other object, and if they are present that all values of those + * properties are deeply equal. Sub-objects are also checked to be subsets of the corresponding + * sub-object in the other object. + * + * @example ObjB is a subset of objA given these objects: + * + * ```ts + * objA = { name: 'Alice', age: 30, address: { city: 'Seattle', state: 'Washington' } }; + * objB = { name: 'Alice', address: { city: 'Seattle' } }; + * ``` + * + * It is important to note that only arrays of primitives (i.e., booleans, numbers, strings) are + * supported. In particular, objects in arrays will not be checked for deep equality. Also, presence + * in an array is all this checks, not the number of times that an item appears in an array. `[1, + * 1]` is a subset of `[1]`. + * + * @param objectWithAllProperties Object to be checked if it is a superset of + * `objectWithPartialProperties` + * @param objectWithPartialProperties Object to be checked if it is a subset of + * `objectWithAllProperties` + * @returns True if `objectWithAllProperties` contains all the properties of + * `objectWithPartialProperties` and all values of those properties are deeply equal + */ +export default function isSubset( + objectWithAllProperties: unknown, + objectWithPartialProperties: unknown, +): boolean { + if (typeof objectWithAllProperties !== typeof objectWithPartialProperties) return false; + + // For this function we're saying that all falsy things of the same type are equal to each other + if (!objectWithAllProperties && !objectWithPartialProperties) return true; + + if (Array.isArray(objectWithAllProperties)) { + // We know these are arrays from the line above + /* eslint-disable no-type-assertion/no-type-assertion */ + const partialArray = objectWithPartialProperties as Array; + const allArray = objectWithAllProperties as Array; + /* eslint-enable no-type-assertion/no-type-assertion */ + + if (partialArray.length === 0) return true; + + // This only works with arrays of primitives. + // If someone cares about checking arrays of objects this needs updating. + return partialArray.every((item) => allArray.includes(item)); + } + + if (typeof objectWithAllProperties !== 'object') + return deepEqual(objectWithAllProperties, objectWithPartialProperties); + + // We know these are objects that potentially have properties because of the earlier checks + /* eslint-disable no-type-assertion/no-type-assertion */ + const partialObj = objectWithPartialProperties as Record; + const allObj = objectWithAllProperties as Record; + /* eslint-enable no-type-assertion/no-type-assertion */ + + let retVal = true; + Object.keys(partialObj).forEach((key) => { + if (!retVal) return; + if (!Object.hasOwn(allObj, key)) retVal = false; + else if (!isSubset(allObj[key], partialObj[key])) retVal = false; + }); + return retVal; +} diff --git a/lib/platform-bible-utils/src/unsubscriber-async-list.ts b/lib/platform-bible-utils/src/unsubscriber-async-list.ts new file mode 100644 index 0000000000..28bddc2f55 --- /dev/null +++ b/lib/platform-bible-utils/src/unsubscriber-async-list.ts @@ -0,0 +1,38 @@ +import { Dispose } from './disposal.model'; +import { Unsubscriber, UnsubscriberAsync } from './unsubscriber'; + +/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */ +export default class UnsubscriberAsyncList { + readonly unsubscribers = new Set(); + + constructor(private name = 'Anonymous') {} + + /** + * Add unsubscribers to the list. Note that duplicates are not added twice. + * + * @param unsubscribers - Objects that were returned from a registration process. + */ + add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) { + unsubscribers.forEach((unsubscriber) => { + if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose); + else this.unsubscribers.add(unsubscriber); + }); + } + + /** + * Run all unsubscribers added to this list and then clear the list. + * + * @returns `true` if all unsubscribers succeeded, `false` otherwise. + */ + async runAllUnsubscribers(): Promise { + const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber()); + const results = await Promise.all(unsubs); + this.unsubscribers.clear(); + return results.every((unsubscriberSucceeded, index) => { + if (!unsubscriberSucceeded) + console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`); + + return unsubscriberSucceeded; + }); + } +} diff --git a/lib/platform-bible-utils/src/unsubscriber.ts b/lib/platform-bible-utils/src/unsubscriber.ts new file mode 100644 index 0000000000..dc306c91d8 --- /dev/null +++ b/lib/platform-bible-utils/src/unsubscriber.ts @@ -0,0 +1,42 @@ +/** Function to run to dispose of something. Returns true if successfully unsubscribed */ +export type Unsubscriber = () => boolean; + +/** + * Returns an Unsubscriber function that combines all the unsubscribers passed in. + * + * @param unsubscribers All unsubscribers to aggregate into one unsubscriber + * @returns Function that unsubscribes from all passed in unsubscribers when run + */ +export const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => { + return (...args) => { + // Run the unsubscriber for each handler + const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args)); + + // If all the unsubscribers resolve to truthiness, we succeed + return unsubs.every((success) => success); + }; +}; + +/** + * Function to run to dispose of something that runs asynchronously. The promise resolves to true if + * successfully unsubscribed + */ +export type UnsubscriberAsync = () => Promise; + +/** + * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in. + * + * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber. + * @returns Function that unsubscribes from all passed in unsubscribers when run + */ +export const aggregateUnsubscriberAsyncs = ( + unsubscribers: (UnsubscriberAsync | Unsubscriber)[], +): UnsubscriberAsync => { + return async (...args) => { + // Run the unsubscriber for each handler + const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args)); + + // If all the unsubscribers resolve to truthiness, we succeed + return (await Promise.all(unsubPromises)).every((success) => success); + }; +}; diff --git a/lib/platform-bible-utils/src/util.ts b/lib/platform-bible-utils/src/util.ts new file mode 100644 index 0000000000..4b6ca50169 --- /dev/null +++ b/lib/platform-bible-utils/src/util.ts @@ -0,0 +1,283 @@ +/** Collection of functions, objects, and types that are used as helpers in other services. */ + +// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579 +export function newGuid(): string { + return '00-0-4-1-000'.replace(/[^-]/g, (s) => + // @ts-expect-error ts(2363) this works fine + // eslint-disable-next-line no-bitwise + (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'), + ); +} + +// thanks to DRAX at https://stackoverflow.com/a/9436948 +/** + * Determine whether the object is a string + * + * @param o Object to determine if it is a string + * @returns True if the object is a string; false otherwise + */ +export function isString(o: unknown): o is string { + return typeof o === 'string' || o instanceof String; +} + +/** + * If deepClone isn't used when copying properties between objects, you may be left with dangling + * references between the source and target of property copying operations. + * + * @param obj Object to clone + * @returns Duplicate copy of `obj` without any references back to the original one + */ +export function deepClone(obj: T): T { + // Assert the return type matches what is expected + // eslint-disable-next-line no-type-assertion/no-type-assertion + return JSON.parse(JSON.stringify(obj)) as T; +} + +/** + * Get a function that reduces calls to the function passed in + * + * @param fn The function to debounce + * @param delay How much delay in milliseconds after the most recent call to the debounced function + * to call the function + * @returns Function that, when called, only calls the function passed in at maximum every delay ms + */ +// We don't know the parameter types since this function can be anything +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function debounce void>(fn: T, delay = 300): T { + if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS'); + let timeout: ReturnType; + // Ensure the right return type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + return ((...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => fn(...args), delay); + }) as T; +} + +/** + * Groups each item in the array of items into a map according to the keySelector + * + * @param items Array of items to group by + * @param keySelector Function to run on each item to get the key for the group to which it belongs + * @param valueSelector Function to run on each item to get the value it should have in the group + * (like map function). If not provided, uses the item itself + * @returns Map of keys to groups of values corresponding to each item + */ +export function groupBy(items: T[], keySelector: (item: T) => K): Map>; +export function groupBy( + items: T[], + keySelector: (item: T) => K, + valueSelector: (item: T, key: K) => V, +): Map>; +export function groupBy( + items: T[], + keySelector: (item: T) => K, + valueSelector?: (item: T, key: K) => V, +): Map> { + const map = new Map>(); + items.forEach((item) => { + const key = keySelector(item); + const group = map.get(key); + const value = valueSelector ? valueSelector(item, key) : item; + if (group) group.push(value); + else map.set(key, [value]); + }); + return map; +} + +// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript +type ErrorWithMessage = { + message: string; +}; + +// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript +function isErrorWithMessage(error: unknown): error is ErrorWithMessage { + return ( + typeof error === 'object' && + // We're potentially dealing with objects we didn't create, so they might contain `null` + // eslint-disable-next-line no-null/no-null + error !== null && + 'message' in error && + // Type assert `error` to check it's `message`. + // eslint-disable-next-line no-type-assertion/no-type-assertion + typeof (error as Record).message === 'string' + ); +} + +// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript +/** + * Function to get an error from the object (useful for getting an error in a catch block) + * + * @param error Error object whose message to get + * @returns Message of the error - if object has message, returns message. Otherwise tries to + * stringify + */ +function toErrorWithMessage(maybeError: unknown): ErrorWithMessage { + if (isErrorWithMessage(maybeError)) return maybeError; + + try { + return new Error(JSON.stringify(maybeError)); + } catch { + // fallback in case there's an error stringifying the maybeError + // like with circular references for example. + return new Error(String(maybeError)); + } +} + +// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript +/** + * Function to get an error message from the object (useful for getting error message in a catch + * block) + * + * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }` + * + * @param error Error object whose message to get + * @returns Message of the error - if object has message, returns message. Otherwise tries to + * stringify + */ +export function getErrorMessage(error: unknown) { + return toErrorWithMessage(error).message; +} + +/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */ +export function wait(ms: number) { + // eslint-disable-next-line no-promise-executor-return + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +/** + * Runs the specified function and will timeout if it takes longer than the specified wait time + * + * @param fn The function to run + * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve + * @returns Promise that resolves to the resolved value of the function or undefined if it ran + * longer than the specified wait time + */ +export function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) { + const timeout = wait(maxWaitTimeInMS).then(() => undefined); + return Promise.any([timeout, fn()]); +} + +/** + * Get all functions on an object and its prototype chain (so we don't miss any class methods or any + * object methods). Note that the functions on the final item in the prototype chain (i.e., Object) + * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`, + * etc. + * + * @param obj Object whose functions to get + * @param _objId Optional ID of the object to use for debug logging + * @returns Array of all function names on an object + */ +// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134 +export function getAllObjectFunctionNames( + obj: { [property: string]: unknown }, + // Leaving it here for debugging + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _objId: string = 'obj', +): Set { + const objectFunctionNames = new Set(); + + // Get all function properties directly defined on the object + Object.getOwnPropertyNames(obj).forEach((property) => { + try { + if (typeof obj[property] === 'function') objectFunctionNames.add(property); + } catch (error) { + // Too noisy - only reenable if you need more details + // console.trace(`Skipping ${property} on ${objId} due to error: ${error}`); + } + }); + + // Walk up the prototype chain and get additional function properties, skipping the functions + // provided by the final (Object) prototype + let objectPrototype = Object.getPrototypeOf(obj); + while (objectPrototype && Object.getPrototypeOf(objectPrototype)) { + Object.getOwnPropertyNames(objectPrototype).forEach((property) => { + try { + if (typeof obj[property] === 'function') objectFunctionNames.add(property); + } catch (error) { + // Too noisy - only reenable if you need more details + // console.trace(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`); + } + }); + objectPrototype = Object.getPrototypeOf(objectPrototype); + } + + return objectFunctionNames; +} + +/** + * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an + * object that is asynchronously fetched using a provided asynchronous function. + * + * @param getObject - A function that returns a promise resolving to the object whose asynchronous + * methods to call. + * @param objectToProxy - An optional object that is the object that is proxied. If a property is + * accessed that does exist on this object, it will be returned. If a property is accessed that + * does not exist on this object, it will be considered to be an asynchronous method called on the + * object returned from getObject. + * @returns A synchronous proxy for the asynchronous object. + */ +export function createSyncProxyForAsyncObject( + getObject: (args?: unknown[]) => Promise, + objectToProxy: Partial = {}, +): T { + // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy + // makes the async methods that do not exist yet available synchronously so we have all of T + // eslint-disable-next-line no-type-assertion/no-type-assertion + return new Proxy(objectToProxy as T, { + get(target, prop) { + // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist + // @ts-expect-error 7053 + if (prop in target) return target[prop]; + return async (...args: unknown[]) => { + // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist + // 2556: The args here are the parameters for the method specified + // @ts-expect-error 7053 2556 + return (await getObject())[prop](...args); + }; + }, + }); +} + +/** Within type T, recursively change all properties to be optional */ +export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T; + +/** Within type T, recursively change properties that were of type A to be of type B */ +export type ReplaceType = T extends A + ? B + : T extends object + ? { [K in keyof T]: ReplaceType } + : T; + +// Thanks to jcalz at https://stackoverflow.com/a/50375286 +/** + * Converts a union type to an intersection type (`|` to `&`). + * + * Note: this utility type is for use on object types. It may fail on other types. + * + * @example + * + * ```typescript + * type TypeOne = { one: string }; + * type TypeTwo = { two: number }; + * type TypeThree = { three: string }; + * + * type TypeNums = { one: TypeOne; two: TypeTwo; three: TypeThree }; + * const numNames = ['one', 'two'] as const; + * type TypeNumNames = typeof numNames; + * + * // Same as `TypeOne | TypeTwo` + * // `{ one: string } | { two: number }` + * type TypeOneTwoUnion = TypeNums[TypeNumNames[number]]; + * + * // Same as `TypeOne & TypeTwo` + * // `{ one: string; two: number }` + * type TypeOneTwoIntersection = UnionToIntersection; + * ``` + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type UnionToIntersection = (U extends any ? (x: U) => void : never) extends ( + x: infer I, +) => void + ? I + : never; diff --git a/lib/platform-bible-utils/tsconfig.json b/lib/platform-bible-utils/tsconfig.json new file mode 100644 index 0000000000..045c685224 --- /dev/null +++ b/lib/platform-bible-utils/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "baseUrl": "./src", + "rootDir": "./src", + "target": "ESNext", + "module": "ESNext", + // Running npm i removes packages that are in common between the current directory's + // node_modules and any below. Without typeRoots specified like this, TypeScript climbs + // directories looking for node_modules/@types folders by default. + // We needed to remove react from here below because having two copies was causing problems in + // the jest tests. But we need the types in both places. + "typeRoots": ["./node_modules/@types", "../../node_modules/@types"], + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "forceConsistentCasingInFileNames": true, + "incremental": false, + "isolatedModules": true, + "noEmit": true, + "noImplicitReturns": false, + "skipLibCheck": false, + "useDefineForClassFields": true, + "outDir": "", + "paths": {} + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/lib/platform-bible-utils/tsconfig.lint.json b/lib/platform-bible-utils/tsconfig.lint.json new file mode 100644 index 0000000000..86b7a99cfd --- /dev/null +++ b/lib/platform-bible-utils/tsconfig.lint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": [".eslintrc.cjs", "*.ts", "src"] +} diff --git a/lib/platform-bible-utils/tsconfig.node.json b/lib/platform-bible-utils/tsconfig.node.json new file mode 100644 index 0000000000..66bfa30883 --- /dev/null +++ b/lib/platform-bible-utils/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/lib/platform-bible-utils/typedoc.json b/lib/platform-bible-utils/typedoc.json new file mode 100644 index 0000000000..b26e48dc74 --- /dev/null +++ b/lib/platform-bible-utils/typedoc.json @@ -0,0 +1,7 @@ +{ + "entryPoints": ["src/index.ts"], + "out": "docs", + "tsconfig": "tsconfig.json", + "sort": ["kind", "alphabetical"], + "kindSortOrder": ["Function"] +} diff --git a/lib/platform-bible-utils/vite.config.ts b/lib/platform-bible-utils/vite.config.ts new file mode 100644 index 0000000000..1ef3ce617f --- /dev/null +++ b/lib/platform-bible-utils/vite.config.ts @@ -0,0 +1,25 @@ +import path from 'path'; +import { defineConfig } from 'vite'; +import { peerDependencies, dependencies } from './package.json'; + +const config = defineConfig({ + base: './', + build: { + sourcemap: true, + lib: { + entry: path.resolve(__dirname, 'src/index.ts'), + formats: ['es', 'cjs'], + fileName: (format) => `index.${format === 'es' ? 'js' : format}`, + }, + rollupOptions: { + external: [...Object.keys(peerDependencies ?? {}), ...Object.keys(dependencies ?? {})], + output: { + globals: { + react: 'React', + 'react-dom': 'ReactDOM', + }, + }, + }, + }, +}); +export default config; diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000000..72013a3272 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src/client/**", "src/extension-host/**", "src/node/**", "src/shared/**"], + "ext": "ts,js,json", + "delay": 500 +} diff --git a/package-lock.json b/package-lock.json index a3e65b0400..73e1a2f048 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,34 +1,93 @@ { - "name": "paranext-extension-template", - "version": "0.0.1", + "name": "paranext-core", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "paranext-extension-template", - "version": "0.0.1", + "hasInstallScript": true, "license": "MIT", + "workspaces": [ + "lib/*", + "extensions", + "extensions/src/*" + ], "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.10", + "@mui/material": "^5.15.10", "@sillsdev/scripture": "^2.0.2", - "platform-bible-utils": "file:../paranext-core/lib/platform-bible-utils" + "ajv": "^8.17.1", + "chalk": "^4.1.2", + "chokidar": "^3.6.0", + "electron-debug": "^3.2.0", + "electron-log": "^5.0.3", + "electron-updater": "^6.3.4", + "electron-window-state": "^5.0.3", + "fast-equals": "^5.0.1", + "http-status-codes": "^2.3.0", + "jszip": "^3.10.1", + "memoize-one": "^6.0.0", + "node-localstorage": "^3.0.5", + "platform-bible-react": "file:./lib/platform-bible-react", + "platform-bible-utils": "file:./lib/platform-bible-utils", + "rc-dock": "^3.2.19", + "react": "^18.3.1", + "react-data-grid": "^7.0.0-beta.42", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2", + "ws": "^8.18.0" }, "devDependencies": { - "@swc/core": "^1.7.26", + "@babel/preset-env": "^7.25.7", + "@babel/preset-react": "^7.25.7", + "@babel/preset-typescript": "^7.25.7", + "@electron/notarize": "^2.2.1", + "@electron/rebuild": "^3.6.2", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@storybook/addon-essentials": "^8.3.4", + "@storybook/addon-interactions": "^8.3.4", + "@storybook/addon-links": "^8.3.4", + "@storybook/addon-webpack5-compiler-babel": "^3.0.3", + "@storybook/blocks": "^8.3.4", + "@storybook/preview-api": "^8.3.4", + "@storybook/react": "^8.3.4", + "@storybook/react-webpack5": "^8.3.4", + "@storybook/test": "^8.3.4", + "@svgr/webpack": "^8.1.0", + "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@types/electron-devtools-installer": "^2.2.5", + "@types/jest": "^29.5.13", "@types/node": "^20.16.10", + "@types/node-localstorage": "^1.3.3", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", - "@types/webpack": "^5.28.5", + "@types/react-test-renderer": "^18.3.0", + "@types/source-map-support": "^0.5.10", + "@types/terser-webpack-plugin": "^5.2.0", + "@types/webpack-bundle-analyzer": "^4.7.0", + "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "browserslist-config-erb": "^0.0.3", "concurrently": "^9.0.1", - "copy-webpack-plugin": "^12.0.2", + "core-js": "^3.38.1", "cross-env": "^7.0.3", "css-loader": "^6.11.0", - "escape-string-regexp": "^5.0.0", + "css-minimizer-webpack-plugin": "^7.0.0", + "detect-port": "^1.6.1", + "electron": "^27.3.3", + "electron-builder": "^24.13.3", + "electron-devtools-installer": "^3.2.0", + "electronmon": "^2.0.3", "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", + "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-compat": "^4.2.0", "eslint-plugin-import": "^2.30.0", "eslint-plugin-jest": "^27.9.0", @@ -38,148 +97,143 @@ "eslint-plugin-promise": "^6.6.0", "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", - "glob": "^10.4.5", - "papi-dts": "file:../paranext-core/lib/papi-dts", - "platform-bible-react": "file:../paranext-core/lib/platform-bible-react", + "eslint-plugin-storybook": "^0.9.0", + "file-loader": "^6.2.0", + "fkill": "^9.0.0", + "html-webpack-plugin": "^5.6.0", + "husky": "^8.0.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "lint-staged": "^15.2.10", + "mini-css-extract-plugin": "^2.9.1", + "node-loader": "^2.0.0", + "nodemon": "^3.1.7", + "patch-package": "^8.0.0", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", + "react-refresh": "^0.14.2", + "react-test-renderer": "^18.3.1", + "rimraf": "^6.0.1", + "run-script-os": "^1.1.6", "sass": "^1.78.0", "sass-loader": "^14.2.1", + "storybook": "^8.3.4", + "style-loader": "^4.0.0", "stylelint": "^16.9.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", - "swc-loader": "^0.2.6", + "terser-webpack-plugin": "^5.3.10", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-mockito": "^2.6.1", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.19.1", + "typedoc": "^0.26.7", "typescript": "^5.4.5", + "url-loader": "^4.1.1", "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.1.0", "webpack-merge": "^6.0.1", - "zip-build": "^1.8.0" - }, - "peerDependencies": { - "react": ">=18.3.1", - "react-dom": ">=18.3.1" + "yalc": "^1.0.0-pre.53" } }, - "../paranext-core/lib/papi-dts": { + "extensions": { + "name": "paranext-extensions", "version": "0.0.1", - "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "platform-bible-utils": "file:../platform-bible-utils" + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../lib/platform-bible-utils" }, "devDependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.10", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", "escape-string-regexp": "^5.0.0", - "rimraf": "^6.0.1", - "typedoc": "^0.26.7", - "typescript": "^5.4.5" - } - }, - "../paranext-core/lib/papi-dts/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "../paranext-core/lib/papi-dts/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "../paranext-core/lib/papi-dts/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../paranext-core/lib/papi-dts/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "glob": "^10.3.12", + "papi-dts": "file:../lib/papi-dts", + "platform-bible-react": "file:../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "replace-in-file": "^7.1.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.7.1", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-folder-promise": "^1.2.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/brace-expansion": { + "extensions/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "../paranext-core/lib/papi-dts/node_modules/color-convert": { - "version": "2.0.1", + "extensions/node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" }, - "engines": { - "node": ">=7.0.0" - } - }, - "../paranext-core/lib/papi-dts/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">= 8" + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "../paranext-core/lib/papi-dts/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/escape-string-regexp": { + "extensions/node_modules/escape-string-regexp": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -187,34 +241,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../paranext-core/lib/papi-dts/node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../paranext-core/lib/papi-dts/node_modules/glob": { - "version": "10.3.3", + "extensions/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -223,48 +263,11 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../paranext-core/lib/papi-dts/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/papi-dts/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../paranext-core/lib/papi-dts/node_modules/jackspeak": { - "version": "2.2.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "../paranext-core/lib/papi-dts/node_modules/lru-cache": { - "version": "10.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "../paranext-core/lib/papi-dts/node_modules/minimatch": { + "extensions/node_modules/minimatch": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -275,289 +278,482 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../paranext-core/lib/papi-dts/node_modules/minipass": { - "version": "7.0.2", + "extensions/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, - "../paranext-core/lib/papi-dts/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/papi-dts/node_modules/path-scurry": { - "version": "1.10.1", + "extensions/node_modules/stylelint-config-sass-guidelines": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", + "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18.12.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.21", + "stylelint": "^16.1.0" } }, - "../paranext-core/lib/papi-dts/node_modules/platform-bible-utils": { - "resolved": "../paranext-core/lib/platform-bible-utils", - "link": true - }, - "../paranext-core/lib/papi-dts/node_modules/rimraf": { - "version": "5.0.1", + "extensions/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, - "license": "ISC", "dependencies": { - "glob": "^10.2.5" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "../paranext-core/lib/papi-dts/node_modules/shebang-command": { - "version": "2.0.0", + "extensions/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, - "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "../paranext-core/lib/papi-dts/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, + "extensions/src/evil": { + "version": "0.0.1", "license": "MIT", - "engines": { - "node": ">=8" + "devDependencies": { + "typescript": "^5.4.5" } }, - "../paranext-core/lib/papi-dts/node_modules/signal-exit": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" + "extensions/src/hello-someone": { + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../paranext-core/lib/papi-dts/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, + "extensions/src/hello-world": { + "version": "0.0.1", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, - "engines": { - "node": ">=8" + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, + "extensions/src/legacy-comment-manager": { + "version": "0.0.1", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" + }, + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.3.3", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, + "extensions/src/platform-scripture": { + "version": "0.0.1", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, - "engines": { - "node": ">=8" + "devDependencies": { + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, + "extensions/src/platform-scripture-editor": { + "version": "0.0.2", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, - "engines": { - "node": ">=12" + "devDependencies": { + "@biblionexus-foundation/platform-editor": "^0.6.3", + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, + "extensions/src/quick-verse": { + "version": "0.0.1", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@sillsdev/scripture": "^2.0.1", + "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, - "engines": { - "node": ">=8" + "devDependencies": { + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, + "lib/papi-components": { + "version": "0.0.1", + "extraneous": true, + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/papi-dts/node_modules/typescript": { - "version": "5.1.6", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "devDependencies": { + "@mui/icons-material": "^5.13.7", + "@senojs/rollup-plugin-style-inject": "^0.2.3", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@vitejs/plugin-react": "^4.0.3", + "dts-bundle-generator": "^8.0.1", + "eslint": "^8.45.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.8.8", + "prettier-plugin-jsdoc": "^0.4.2", + "stylelint": "^15.10.2", + "stylelint-config-recommended": "^13.0.0", + "stylelint-config-sass-guidelines": "^10.0.0", + "ts-node": "^10.9.1", + "tslib": "^2.6.0", + "typescript": "^5.1.6", + "vite": "^4.4.12" }, - "engines": { - "node": ">=14.17" + "peerDependencies": { + "@emotion/react": ">=11.11.1", + "@emotion/styled": ">=11.11.0", + "@mui/material": ">=5.14.1", + "react": ">=18.2.0", + "react-data-grid": ">=7.0.0-beta.34", + "react-dom": ">=18.2.0" } }, - "../paranext-core/lib/papi-dts/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", + "lib/papi-dts": { + "version": "0.0.1", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "platform-bible-utils": "file:../platform-bible-utils" }, - "engines": { - "node": ">= 8" + "devDependencies": { + "escape-string-regexp": "^5.0.0", + "rimraf": "^6.0.1", + "typedoc": "^0.26.7", + "typescript": "^5.4.5" } }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi": { - "version": "8.1.0", + "lib/papi-dts/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/papi-dts/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../paranext-core/lib/platform-bible-react": { - "version": "0.0.1", - "dev": true, + "lib/platform-bible-react": { + "version": "0.0.1", "license": "MIT", "dependencies": { "@emotion/react": ">=11.11.4", @@ -634,10582 +830,12056 @@ "react-dom": ">=18.3.1" } }, - "../paranext-core/lib/platform-bible-utils": { - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "async-mutex": "^0.4.1" + "lib/platform-bible-react/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "lib/platform-bible-react/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "devDependencies": { - "@types/jest": "^29.5.13", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "dts-bundle-generator": "^9.5.1", - "escape-string-regexp": "^5.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", - "prettier": "^3.3.3", - "prettier-plugin-jsdoc": "^1.3.0", - "stringz": "^2.1.0", - "tslib": "^2.7.0", - "typedoc": "^0.26.7", - "typescript": "^5.4.5", - "vite": "^5.4.8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "lib/platform-bible-react/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "lib/platform-bible-react/node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" + "lib/platform-bible-react/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" + "lib/platform-bible-react/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "@babel/types": "^7.22.5" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.15" + "lib/platform-bible-react/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=6.9.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "dependencies": { - "@babel/types": "^7.22.5" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" + "lib/platform-bible-react/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "lib/platform-bible-react/node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "lib/platform-bible-react/node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "peer": true, - "bin": { - "parser": "bin/babel-parser.js" + "node": "^14.18.0 || >=16.0.0" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, + "lib/platform-bible-react/node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": ">=10" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "lib/platform-bible-react/node_modules/stylelint-config-sass-guidelines": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", + "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", "dev": true, - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4.21", + "stylelint": "^16.1.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "lib/platform-bible-react/node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "lib/platform-bible-react/node_modules/tailwindcss-scoped-preflight": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss-scoped-preflight/-/tailwindcss-scoped-preflight-2.2.0.tgz", + "integrity": "sha512-OfFjMrB1fyDPgujX21pw4EwVMT/WIJdxpVq2AKTkTzAYdu5nuVxP0OFxz7UVCVTKOoY3KYKJ3fKHPvx1METt1w==", "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8", + "tailwindcss": "^3" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, + "lib/platform-bible-utils": { + "version": "0.0.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "async-mutex": "^0.4.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "devDependencies": { + "@types/jest": "^29.5.13", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "dts-bundle-generator": "^9.5.1", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "prettier-plugin-jsdoc": "^1.3.0", + "stringz": "^2.1.0", + "tslib": "^2.7.0", + "typedoc": "^0.26.7", + "typescript": "^5.4.5", + "vite": "^5.4.8" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "lib/platform-bible-utils/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "lib/platform-bible-utils/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "lib/platform-bible-utils/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "lib/platform-bible-utils/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "lib/platform-bible-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "lib/platform-bible-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "lib/platform-bible-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "lib/platform-bible-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "lib/platform-bible-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "lib/platform-bible-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "node": ">=12" } }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "node": ">=12" } }, - "node_modules/@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "lib/platform-bible-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.1.0" + "node": ">=12" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", + "lib/platform-bible-utils/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "lib/platform-bible-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "lib/platform-bible-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", + "lib/platform-bible-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "lib/platform-bible-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "lib/platform-bible-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "lib/platform-bible-utils/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "lib/platform-bible-utils/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "lib/platform-bible-utils/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "node": ">=12" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "lib/platform-bible-utils/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "lib/platform-bible-utils/node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "engines": { - "node": ">=12" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "lib/platform-bible-utils/node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "lib/platform-bible-utils/node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, - "peer": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "lib/platform-bible-utils/node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, - "peer": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "lib/platform-bible-utils/node_modules/vite": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, - "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/@istanbuljs/load-nyc-config/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, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@ampproject/remapping": { + "version": "2.2.0", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { - "p-limit": "^2.2.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/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, - "peer": true, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/compat-data": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/types": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "peer": true + "dependencies": { + "yallist": "^3.0.2" + } }, - "node_modules/@jest/console/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==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/types": "^7.25.7" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@jest/core/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==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, - "peer": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, - "peer": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, - "peer": true, "dependencies": { - "jest-get-type": "^29.6.3" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", "dev": true, - "peer": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-name": "~1.1.4" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/@jest/reporters/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, - "peer": true, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "peer": true, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "has-flag": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "peer": true, + "node_modules/@babel/parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@babel/types": "^7.25.7" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.0.0" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, - "peer": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jest/transform/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==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jest/types/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==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@mdn/browser-compat-data": { - "version": "5.3.14", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", "dev": true, - "license": "CC0-1.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "dev": true, - "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=12.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, - "optional": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.7" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "node_modules/@sillsdev/scripture": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@sillsdev/scripture/-/scripture-2.0.2.tgz", - "integrity": "sha512-fCsCm7xnPfzlYpk3yEb8UA45YWZLFzhP1fj1kRZhz/B+eoYkRYVJIDU22PGs4x4/SOuP5M3ZjDTCKoCAiurV9A==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, - "peer": true + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, - "peer": true, "dependencies": { - "type-detect": "4.0.8" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, - "peer": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.0.tgz", - "integrity": "sha512-NU2XR6i1x163KdyDj3zqblA13890fBzHNZYqZ13aor/sB3Yq8kU/0NKCudv5pfl9Kb/UAteo/D7vKMHtaror/A==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", "dev": true, "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "is-plain-object": "^5.0.0", - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { - "node": "^18.12 || >=20.9" + "node": ">=6.9.0" }, "peerDependencies": { - "stylelint": "^16.8.0" + "@babel/core": "^7.12.0" } }, - "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "globals": "^11.1.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true - }, - "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, "dependencies": { - "@swc/counter": "^0.1.3" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, - "peer": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, - "peer": true, "dependencies": { - "@babel/types": "^7.0.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, - "peer": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, - "peer": true, "dependencies": { - "@babel/types": "^7.20.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, "dependencies": { - "@types/ms": "*" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/eslint": { - "version": "8.44.2", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", "dev": true, - "peer": true, "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", "dev": true, - "peer": true + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, - "peer": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", "dev": true, - "peer": true, "dependencies": { - "@types/istanbul-lib-report": "*" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.12", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", - "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.5", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", "dev": true, "dependencies": { - "@types/react": "*" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true - }, - "node_modules/@types/webpack": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", - "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", + "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", "dev": true, "dependencies": { - "@types/node": "*", - "tapable": "^2.2.0", - "webpack": "^5" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dev": true, - "peer": true, "dependencies": { - "@types/yargs-parser": "*" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "peer": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", + "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@babel/plugin-transform-react-jsx": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", "dev": true, - "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", + "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@babel/helper-plugin-utils": "^7.25.7", + "regenerator-transform": "^0.15.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "node_modules/@babel/preset-env": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "node_modules/@babel/preset-react": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", + "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-react-display-name": "^7.25.7", + "@babel/plugin-transform-react-jsx": "^7.25.7", + "@babel/plugin-transform-react-jsx-development": "^7.25.7", + "@babel/plugin-transform-react-pure-annotations": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dev": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { - "@xtuc/long": "4.2.2" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@biblionexus-foundation/platform-editor": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@biblionexus-foundation/platform-editor/-/platform-editor-0.6.3.tgz", + "integrity": "sha512-adC0d28g30CYmka6a02w2C/uMEPzBX63ovta0ZAxLNRsbD7YHmiJfGuM79pvv3RGKyL1yfPe1foCr/3V8HjNyQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@lexical/react": "^0.17.1", + "@lexical/selection": "^0.17.1", + "@lexical/text": "^0.17.1", + "@lexical/utils": "^0.17.1", + "@lexical/yjs": "^0.17.1", + "fast-equals": "^5.0.1", + "lexical": "^0.17.1", + "yjs": "^13.6.15" + }, + "peerDependencies": { + "react": ">=18.3.1", + "react-dom": ">=18.3.1" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "node_modules/@biblionexus-foundation/scripture-utilities": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@biblionexus-foundation/scripture-utilities/-/scripture-utilities-0.0.4.tgz", + "integrity": "sha512-EslK90TulsLaePMRhcJV/lClFC7NTdbQXbNCXbMN4rR07ES9ZSqKRKaMelNOtWh0eZgXa+glBf7mPC2vdwM6uQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@xmldom/xmldom": "^0.8.10" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "devOptional": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "devOptional": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, - "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">= 8.9.0" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", + "node_modules/@develar/schema-utils/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, - "license": "MIT", - "engines": { - "node": ">=14.15.0" + "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/@develar/schema-utils/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": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "ajv": "^6.9.1" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", + "node_modules/@develar/schema-utils/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/@discoveryjs/json-ext": { + "version": "0.5.7", "dev": true, "license": "MIT", "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "node": ">=10.0.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/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/acorn": { - "version": "8.10.0", + "node_modules/@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", "dev": true, - "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, "bin": { - "acorn": "bin/acorn" + "asar": "bin/asar.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=10.12.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/@electron/get": { + "version": "2.0.2", "dev": true, - "peerDependencies": { - "acorn": "^8" + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", + "node_modules/@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", "dev": true, - "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 10.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", "dev": true, "license": "MIT", "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" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=10" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "universalify": "^2.0.0" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.0", "dev": true, "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "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" + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT" + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "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==", + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@electron/rebuild": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.2.tgz", + "integrity": "sha512-fTSoWdbrPTmQOwvct4VnJH45aJg79WRabuNqt7cAWIno5kTXv1QD6qVmR2e8wmHi/xryaiVINl1gcEhKGjREVw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" }, "engines": { - "node": ">=4" + "node": ">=12.13.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", + "node_modules/@electron/rebuild/node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", "dev": true, - "license": "ISC", - "peer": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "cross-spawn": "^7.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 12.13.0" } }, - "node_modules/archiver": { - "version": "5.3.2", + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", "dev": true, "license": "MIT", "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/archiver-utils": { - "version": "2.1.0", + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "universalify": "^2.0.0" }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 10.0.0" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "7.2.3", + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, - "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6" } }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT" + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "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" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 10.0.0" + } }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { - "safe-buffer": "~5.1.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "dequal": "^2.0.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@emotion/memoize": "^0.8.1" } }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "react": ">=16.8.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", + "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", + "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "node_modules/@esbuild/android-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", + "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/ast-metadata-inferer": { - "version": "0.8.0", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", + "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@mdn/browser-compat-data": "^5.2.34" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", + "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/async": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", + "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", + "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/axobject-query": { - "version": "3.2.1", + "node_modules/@esbuild/linux-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", + "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", + "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "node": ">=12" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", + "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", + "cpu": [ + "ia32" + ], "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", + "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", + "cpu": [ + "loong64" + ], "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", + "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/babel-jest/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==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", + "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "peer": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", + "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", + "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", + "cpu": [ + "s390x" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/@esbuild/linux-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", + "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", + "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", + "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/balanced-match": { - "version": "1.0.2", + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", + "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/base64-js": { - "version": "1.5.1", + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", + "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "optional": true, + "os": [ + "win32" ], - "license": "MIT" + "engines": { + "node": ">=12" + } }, - "node_modules/binary-searching": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", + "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@esbuild/win32-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "peer": true, "dependencies": { - "node-int64": "^0.4.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/buffer": { - "version": "5.7.1", + "node_modules/@eslint/eslintrc/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" + "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/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "peer": true, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001666", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", - "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@floating-ui/utils": "^0.2.1" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, - "node_modules/chardet": { - "version": "0.7.0", + "node_modules/@gar/promisify": { + "version": "1.1.3", "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "readdirp": "^4.0.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=10.10.0" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true, - "peer": true + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "restore-cursor": "^3.1.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "dev": true, - "license": "ISC", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">= 10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "color-name": "~1.1.4" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/clone": { - "version": "1.0.4", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "peer": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "node": ">=8" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.3", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, - "license": "MIT" - }, - "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 + "license": "BSD-3-Clause" }, - "node_modules/comment-parser": { - "version": "1.4.1", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=8" } }, - "node_modules/compress-commons": { - "version": "4.1.1", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", - "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/concurrently/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/concurrently/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "peer": true - }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "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/copy-webpack-plugin/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "typescript": ">=4.9.5" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "typescript": { + "node-notifier": { "optional": true } } }, - "node_modules/crc-32": { - "version": "1.2.2", - "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, - "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/create-jest": { + "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", + "@types/node": "*", "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/reporters/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, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "peer": true + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/create-jest/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==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/cross-env": { - "version": "7.0.3", + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", - "dev": true, - "engines": { - "node": ">=12 || >=16" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/css-tree": { - "version": "2.3.1", + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@jridgewell/source-map/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, - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/csstype": { - "version": "3.1.2", - "dev": true, - "license": "MIT" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@lexical/clipboard": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.17.1.tgz", + "integrity": "sha512-OVqnEfWX8XN5xxuMPo6BfgGKHREbz++D5V5ISOiml0Z8fV/TQkdgwqbBJcUdJHGRHWSUwdK7CWGs/VALvVvZyw==", "dev": true, "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@lexical/html": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "node_modules/@lexical/code": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.17.1.tgz", + "integrity": "sha512-ZspfTm6g6dN3nAb4G5bPp3SqxzdkB/bjGfa0uRKMU6/eBKtrMUgZsGxt0a8JRZ1eq2TZrQhx+l1ceRoLXii/bQ==", "dev": true, "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "@lexical/utils": "0.17.1", + "lexical": "0.17.1", + "prismjs": "^1.27.0" } }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "node_modules/@lexical/devtools-core": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.17.1.tgz", + "integrity": "sha512-SzL1EX9Rt5GptIo87t6nDxAc9TtYtl6DyAPNz/sCltspdd69KQgs23sTRa26/tkNFCS1jziRN7vpN3mlnmm5wA==", "dev": true, - "peer": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "@lexical/html": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/mark": "0.17.1", + "@lexical/table": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "peerDependencies": { + "react": ">=17.x", + "react-dom": ">=17.x" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "node_modules/@lexical/dragon": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.17.1.tgz", + "integrity": "sha512-lhBRKP7RlhiVCLtF0qiNqmMhEO6cQB43sMe7d4bvuY1G2++oKY/XAJPg6QJZdXRrCGRQ6vZ26QRNhRPmCxL5Ng==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "lexical": "0.17.1" } }, - "node_modules/deep-is": { - "version": "0.1.4", + "node_modules/@lexical/hashtag": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.17.1.tgz", + "integrity": "sha512-XtP0BI8vEewAe7tzq9MC49UPUvuChuNJI/jqFp+ezZlt/RUq0BClQCOPuSlrTJhluvE2rWnUnOnVMk8ILRvggQ==", "dev": true, - "license": "MIT" + "dependencies": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/@lexical/history": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.17.1.tgz", + "integrity": "sha512-OU/ohajz4FXchUhghsWC7xeBPypFe50FCm5OePwo767G7P233IztgRKIng2pTT4zhCPW7S6Mfl53JoFHKehpWA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/defaults": { - "version": "1.0.4", + "node_modules/@lexical/html": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.17.1.tgz", + "integrity": "sha512-yGG+K2DXl7Wn2DpNuZ0Y3uCHJgfHkJN3/MmnFb4jLnH1FoJJiuy7WJb/BRRh9H+6xBJ9v70iv+kttDJ0u1xp5w==", "dev": true, - "license": "MIT", "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@lexical/link": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.17.1.tgz", + "integrity": "sha512-qFJEKBesZAtR8kfJfIVXRFXVw6dwcpmGCW7duJbtBRjdLjralOxrlVKyFhW9PEXGhi4Mdq2Ux16YnnDncpORdQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@lexical/list": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.17.1.tgz", + "integrity": "sha512-k9ZnmQuBvW+xVUtWJZwoGtiVG2cy+hxzkLGU4jTq1sqxRIoSeGcjvhFAK8JSEj4i21SgkB1FmkWXoYK5kbwtRA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/dequal": { - "version": "2.0.3", + "node_modules/@lexical/mark": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.17.1.tgz", + "integrity": "sha512-V82SSRjvygmV+ZMwVpy5gwgr2ZDrJpl3TvEDO+G5I4SDSjbgvua8hO4dKryqiDVlooxQq9dsou0GrZ9Qtm6rYg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/@lexical/markdown": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.17.1.tgz", + "integrity": "sha512-uexR9snyT54jfQTrbr/GZAtzX+8Oyykr4p1HS0vCVL1KU5MDuP2PoyFfOv3rcfB2TASc+aYiINhU2gSXzwCHNg==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "@lexical/code": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/rich-text": "0.17.1", + "@lexical/text": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "node_modules/@lexical/offset": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.17.1.tgz", + "integrity": "sha512-fX0ZSIFWwUKAjxf6l21vyXFozJGExKWyWxA+EMuOloNAGotHnAInxep0Mt8t/xcvHs7luuyQUxEPw7YrTJP7aw==", "dev": true, "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "lexical": "0.17.1" } }, - "node_modules/diff": { - "version": "4.0.2", + "node_modules/@lexical/overflow": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.17.1.tgz", + "integrity": "sha512-oElVDq486R3rO2+Zz0EllXJGpW3tN0tfcH+joZ5h36+URKuNeKddqkJuDRvgSLOr9l8Jhtv3+/YKduPJVKMz6w==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "dependencies": { + "lexical": "0.17.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/@lexical/plain-text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.17.1.tgz", + "integrity": "sha512-CSvi4j1a4ame0OAvOKUCCmn2XrNsWcST4lExGTa9Ei/VIh8IZ+a97h4Uby8T3lqOp10x+oiizYWzY30pb9QaBg==", "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "dependencies": { + "@lexical/clipboard": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", + "node_modules/@lexical/react": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.17.1.tgz", + "integrity": "sha512-DI4k25tO0E1WyozrjaLgKMOmLjOB7+39MT4eZN9brPlU7g+w0wzdGbTZUPgPmFGIKPK+MSLybCwAJCK97j8HzQ==", "dev": true, - "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "@lexical/clipboard": "0.17.1", + "@lexical/code": "0.17.1", + "@lexical/devtools-core": "0.17.1", + "@lexical/dragon": "0.17.1", + "@lexical/hashtag": "0.17.1", + "@lexical/history": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/mark": "0.17.1", + "@lexical/markdown": "0.17.1", + "@lexical/overflow": "0.17.1", + "@lexical/plain-text": "0.17.1", + "@lexical/rich-text": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/table": "0.17.1", + "@lexical/text": "0.17.1", + "@lexical/utils": "0.17.1", + "@lexical/yjs": "0.17.1", + "lexical": "0.17.1", + "react-error-boundary": "^3.1.4" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": ">=17.x", + "react-dom": ">=17.x" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/@lexical/rich-text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.17.1.tgz", + "integrity": "sha512-T3kvj4P1OpedX9jvxN3WN8NP1Khol6mCW2ScFIRNRz2dsXgyN00thH1Q1J/uyu7aKyGS7rzcY0rb1Pz1qFufqQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "@lexical/clipboard": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.646", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.646.tgz", - "integrity": "sha512-vThkQ0JuF45qT/20KbRgM56lV7IuGt7SjhawQ719PDHzhP84KAO1WJoaxgCoAffKHK47FmVKP1Fqizx7CwK1SA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/@lexical/selection": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.17.1.tgz", + "integrity": "sha512-qBKVn+lMV2YIoyRELNr1/QssXx/4c0id9NCB/BOuYlG8du5IjviVJquEF56NEv2t0GedDv4BpUwkhXT2QbNAxA==", "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "dependencies": { + "lexical": "0.17.1" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", + "node_modules/@lexical/table": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.17.1.tgz", + "integrity": "sha512-2fUYPmxhyuMQX3MRvSsNaxbgvwGNJpHaKx1Ldc+PT2MvDZ6ALZkfsxbi0do54Q3i7dOon8/avRp4TuVaCnqvoA==", "dev": true, - "license": "MIT" + "dependencies": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } }, - "node_modules/end-of-stream": { - "version": "1.4.4", + "node_modules/@lexical/text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.17.1.tgz", + "integrity": "sha512-zD2pAGXaMfPpT8PeNrx3+n0+jGnQORHyn0NEBO+hnyacKfUq5z5sI6Gebsq5NwH789bRadmJM5LvX5w8fsuv6w==", "dev": true, - "license": "MIT", "dependencies": { - "once": "^1.4.0" + "lexical": "0.17.1" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/@lexical/utils": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.17.1.tgz", + "integrity": "sha512-jCQER5EsvhLNxKH3qgcpdWj/necUb82Xjp8qWQ3c0tyL07hIRm2tDRA/s9mQmvcP855HEZSmGVmR5SKtkcEAVg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" + "@lexical/list": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/table": "0.17.1", + "lexical": "0.17.1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/@lexical/yjs": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.17.1.tgz", + "integrity": "sha512-9mn5PDtaH5uLMH6hQ59EAx5FkRzmJJFcVs3E6zSIbtgkG3UASR3CFEfgsLKTjl/GC5NnTGuMck+jXaupDVBhOg==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@lexical/offset": "0.17.1", + "lexical": "0.17.1" + }, + "peerDependencies": { + "yjs": ">=13.5.22" } }, - "node_modules/envinfo": { - "version": "7.10.0", + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" }, "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/error-ex": { - "version": "1.3.2", + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, - "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" + "universalify": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "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==", + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">= 10.0.0" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/@mdn/browser-compat-data": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.6.4.tgz", + "integrity": "sha512-bOOF4GGzn0exmvNHpSWmTfOXB9beTpIFCm2KPY2UVoCdn1YVfr8heuHr1C++BYI9Tun8REgi5TNVdKbBs249CA==", + "dev": true + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "@types/mdx": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, + "node_modules/@mui/base": { + "version": "5.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", + "integrity": "sha512-6A8fYiXgjqTO6pgj31Hc8wm1M3rFYCxDRh09dBVk0L0W4cb2lnurRJa3cAyic6hHY+we1S58OdGYRbKmOsDpGQ==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "dev": true, - "license": "MIT" + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", + "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, + "node_modules/@mui/icons-material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.10.tgz", + "integrity": "sha512-9cF8oUHZKo9oQ7EQ3pxPELaZuZVmphskU4OI6NiJNDVN7zcuvrEsuWjYo1Zh4fLiC39Nrvm30h/B51rcUjvSGA==", "dependencies": { - "es-errors": "^1.3.0" + "@babel/runtime": "^7.23.9" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "node": ">=12.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, + "node_modules/@mui/material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.10.tgz", + "integrity": "sha512-YJJGHjwDOucecjDEV5l9ISTCo+l9YeWrho623UajzoHRYxuKUmwrGVYOW4PKwGvCx9SU9oklZnbbi2Clc5XZHw==", "dependencies": { - "hasown": "^2.0.0" + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.36", + "@mui/core-downloads-tracker": "^5.15.10", + "@mui/system": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", + "node_modules/@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/escalade": { - "version": "3.1.1", - "dev": true, - "license": "MIT", + "node_modules/@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, "engines": { - "node": ">=6" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/@mui/system": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "node_modules/@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" }, - "bin": { - "eslint": "bin/eslint.js" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "license": "MIT", "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" + "node": ">= 8" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "dev": true, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "license": "MIT", "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "node": ">= 8" } }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "license": "ISC", "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/eslint-config-erb": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz", - "integrity": "sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ==", + "node_modules/@npmcli/move-file": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jest": "^27.4.0", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16.x.x" - }, - "peerDependencies": { - "eslint": ">=7 || >=8", - "jest": ">=27.0.0", - "react": ">=17.0.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/eslint-config-erb/node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/eslint-config-erb/node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=10" } }, - "node_modules/eslint-config-erb/node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", "dev": true, + "license": "ISC", "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, + "glob": "^7.1.3" + }, "bin": { - "eslint-config-prettier": "bin/cli.js" + "rimraf": "bin.js" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", "dev": true, "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "node": ">= 10.13" }, "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" }, "peerDependenciesMeta": { - "eslint-plugin-import": { + "@types/webpack": { "optional": true }, - "eslint-plugin-import-x": { + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { "optional": true } } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "debug": "^3.2.7" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=4" + "node": ">= 12.13.0" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", "dependencies": { - "ms": "^2.1.1" + "@babel/runtime": "^7.13.10" } }, - "node_modules/eslint-plugin-compat": { - "version": "4.2.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", "dependencies": { - "@mdn/browser-compat-data": "^5.3.13", - "ast-metadata-inferer": "^0.8.0", - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001524", - "find-up": "^5.0.0", - "lodash.memoize": "^4.1.2", - "semver": "^7.5.4" + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, - "engines": { - "node": ">=14.x" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", "peerDependencies": { - "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-compat/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-compat/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", "dependencies": { - "lru-cache": "^6.0.0" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-compat/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "dev": true, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" + "@radix-ui/react-slot": "1.1.0" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "ms": "^2.1.1" + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "dependencies": { - "minimist": "^1.2.0" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "bin": { - "json5": "lib/cli.js" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { + "@types/react": { "optional": true }, - "jest": { + "@types/react-dom": { "optional": true } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dependencies": { + "@babel/runtime": "^7.13.10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, "peerDependenciesMeta": { - "typescript": { + "@types/react": { "optional": true } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", + "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-menu": "2.0.6", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", "dependencies": { - "yallist": "^4.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", "dependencies": { - "lru-cache": "^6.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" }, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", - "dev": true, + "node_modules/@radix-ui/react-label": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", + "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" + "node_modules/@radix-ui/react-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", + "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-no-null": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=5.0.0" + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" }, "peerDependencies": { - "eslint": ">=3.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-no-type-assertion": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0", - "yarn": "^1.13.0" + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "@types/eslint": { + "@types/react": { "optional": true }, - "eslint-config-prettier": { + "@types/react-dom": { "optional": true } } }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", - "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", - "dev": true, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", "dependencies": { - "esutils": "^2.0.2" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@radix-ui/react-slot": "1.1.0" }, - "bin": { - "resolve": "bin/resolve" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "dependencies": { - "color-convert": "^2.0.1" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" }, "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "type-fest": "^0.20.2" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", "dependencies": { - "has-flag": "^4.0.0" + "@radix-ui/rect": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz", + "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, - "engines": { - "node": ">=0.10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">=4.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/events": { - "version": "3.3.0", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", "license": "MIT", - "engines": { - "node": ">=0.8.x" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", "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" + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/execa/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, - "peer": true - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "peer": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/external-editor": { - "version": "3.1.0", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "license": "MIT", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=8.6.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "dev": true, - "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "peer": true, - "dependencies": { - "bser": "2.1.1" + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/figures": { - "version": "3.2.0", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-select": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", + "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@radix-ui/react-primitive": "2.0.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/flat-cache": { - "version": "3.1.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">=12.0.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "is-callable": "^1.1.3" + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "node_modules/@radix-ui/react-slider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", + "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": 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==", - "dev": true, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "dependencies": { - "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": ">= 0.4" + "@radix-ui/react-slot": "1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=10.13.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "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/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/global-modules": { - "version": "2.0.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", "dependencies": { - "global-prefix": "^3.0.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=6" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "bin": { - "which": "bin/which" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/globalthis": { - "version": "1.0.3", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "dependencies": { - "define-properties": "^1.1.3" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/globjoin": { - "version": "0.1.4", - "dev": true, - "license": "MIT" + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/gopd": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" + "node_modules/@radix-ui/react-toast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", + "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", "license": "MIT" }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">= 0.4.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "peer": true - }, - "node_modules/html-tags": { - "version": "3.3.1", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "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, - "peer": true, - "engines": { - "node": ">=10.17.0" + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", "peerDependencies": { - "postcss": "^8.1.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "consulting", - "url": "https://feross.org/support" + "@types/react-dom": { + "optional": true } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.3.4", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", + "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/import-local": { - "version": "3.1.0", - "dev": true, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz", + "integrity": "sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==", "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-toggle": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", "license": "MIT", - "engines": { - "node": ">=0.8.19" + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/inquirer": { - "version": "8.2.6", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">=12.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "@radix-ui/react-slot": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", "dependencies": { - "has-bigints": "^1.0.1" + "@babel/runtime": "^7.13.10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", - "dev": true, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", "dependencies": { - "hasown": "^2.0.2" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-data-view": { + "node_modules/@radix-ui/react-use-previous": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", "dependencies": { - "is-typed-array": "^1.1.13" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "dev": true, - "license": "MIT", + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", "dependencies": { - "has-tostringtag": "^1.0.0" + "@radix-ui/react-use-layout-effect": "1.1.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/@radix-ui/react-use-size/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", "dependencies": { - "call-bind": "^1.0.2" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@senojs/rollup-plugin-style-inject": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@senojs/rollup-plugin-style-inject/-/rollup-plugin-style-inject-0.2.3.tgz", + "integrity": "sha512-3/spt7JG2iHMW1YdtFbDafWa4IYNkJ99tibY7oDe5LXVTq2JxBpOsdRmJyCCqI5I4kBoUUYWS2yEG/FKwrLy/A==", "dev": true, - "peer": true, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/@shikijs/core": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.17.4.tgz", + "integrity": "sha512-d2RqLWGJDPGThosjMs472B+NLVRUbQSAez/UV9d9rKE/zLbSmPQ73me308ofPSALKwUv2RkuX8umkIdl97boig==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@shikijs/engine-javascript": "1.17.4", + "@shikijs/engine-oniguruma": "1.17.4", + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.2" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/@shikijs/engine-javascript": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.17.4.tgz", + "integrity": "sha512-qWulwA32cbvVxdthAB1w4DIeXn2+HC1Q5rO0KChnVkFA9xzmy2VH1W3CvmMGEyXo0GjQerovhREcxZh1FlgJ1A==", "dev": true, - "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "@shikijs/types": "1.17.4", + "oniguruma-to-js": "0.4.0" } }, - "node_modules/is-interactive": { - "version": "1.0.0", + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.17.4.tgz", + "integrity": "sha512-7yLBEwkwrr3zYF17tJk56SXHl+0GIMeb0dSKW9jxOsYPfjIU+19nHogURpr5r9Ey03m73i3pj2cthqj5Ui8MNg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/@shikijs/types": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.17.4.tgz", + "integrity": "sha512-gh2PuD5wmqVlWWIyCpLpmVyl0PuN8IEBc86Mvj89g6LiEsqFOsCCdvk6znd0spRu+0y78aP0PA8mQV58RA3igA==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", + "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==", + "dev": true + }, + "node_modules/@sillsdev/scripture": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@sillsdev/scripture/-/scripture-2.0.2.tgz", + "integrity": "sha512-fCsCm7xnPfzlYpk3yEb8UA45YWZLFzhP1fj1kRZhz/B+eoYkRYVJIDU22PGs4x4/SOuP5M3ZjDTCKoCAiurV9A==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", + "node_modules/@storybook/addon-actions": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.4.tgz", + "integrity": "sha512-1y0yD3upKcyzNwwA6loAGW2cRDqExwl4oAT7GJQA4tmabI+fNwmANSgU/ezLvvSUf4Qo0eJHg2Zcn8y+Apq2eA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/is-regex": { - "version": "1.1.4", + "node_modules/@storybook/addon-backgrounds": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.4.tgz", + "integrity": "sha512-o3nl7cN3x8erJNxLEv8YptanEQAnbqnaseOAsvSC6/nnSAcRYBSs3BvekKvo4CcpS2mxn7F5NJTBFYnCXzy8EA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/@storybook/addon-controls": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.4.tgz", + "integrity": "sha512-qQcaK6dczsb6wXkzGZKOjUYNA7FfKBewRv6NvoVKYY6LfhllGOkmUAtYpdtQG8adsZWTSoZaAOJS2vP2uM67lw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/@storybook/addon-docs": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.4.tgz", + "integrity": "sha512-TWauhqF/gJgfwPuWeM6KM3LwC+ErCOM+K2z16w3vgao9s67sij8lnrdAoQ0hjA+kw2/KAdCakFS6FyciG81qog==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.3.4", + "@storybook/csf-plugin": "8.3.4", + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "8.3.4", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "fs-extra": "^11.1.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "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==", + "node_modules/@storybook/addon-docs/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.14" } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/@storybook/addon-docs/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "universalify": "^2.0.0" }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/addon-docs/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.0.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/@storybook/addon-essentials": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.4.tgz", + "integrity": "sha512-C3+3hpmSn/8zdx5sXEP0eE6zMzxgRosHVZYfe9nBcMiEDp6UKVUyHVetWxEULOEgN46ysjcpllZ0bUkRYxi2IQ==", "dev": true, - "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@storybook/addon-actions": "8.3.4", + "@storybook/addon-backgrounds": "8.3.4", + "@storybook/addon-controls": "8.3.4", + "@storybook/addon-docs": "8.3.4", + "@storybook/addon-highlight": "8.3.4", + "@storybook/addon-measure": "8.3.4", + "@storybook/addon-outline": "8.3.4", + "@storybook/addon-toolbars": "8.3.4", + "@storybook/addon-viewport": "8.3.4", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/@storybook/addon-highlight": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.4.tgz", + "integrity": "sha512-rxZTeuZyZ7RnU+xmRhS01COFLbGnVEmlUNxBw8ArsrTEZKW5PbKpIxNLTj9F0zdH8H0MfryJGP+Aadcm0oHWlw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "@storybook/global": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", + "node_modules/@storybook/addon-interactions": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.3.4.tgz", + "integrity": "sha512-ORxqe35wUmF7EDHo45mdDHiju3Ryk2pZ1vO9PyvW6ZItNlHt/IxAr7T/TysGejZ/eTBg6tMZR3ExGky3lTg/CQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.4", + "@storybook/test": "8.3.4", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/@storybook/addon-links": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.4.tgz", + "integrity": "sha512-R1DjARmxRIKJDGIG6uxmQ1yFNyoQbb+QIPUFjgWCak8+AdLJbC7W+Esvo9F5hQfh6czyy0piiM3qj5hpQJVh3A==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, - "node_modules/is-weakref": { - "version": "1.0.2", + "node_modules/@storybook/addon-measure": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.4.tgz", + "integrity": "sha512-IJ6WKEbqmG+r7sukFjo+bVmPB2Zry04sylGx/OGyOh7zIhhqAqpwOwMHP0uQrc3tLNnUM6qB/o83UyYX79ql+A==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "node_modules/@storybook/addon-outline": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.4.tgz", + "integrity": "sha512-kRRJTTLKM8gMfeh/e83djN5XLlc0hFtr9zKWxuZxaXt9Hmr+9tH/PRFtVK/S4SgqnBDoXk49Wgv6raiwj5/e3A==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", + "node_modules/@storybook/addon-toolbars": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.4.tgz", + "integrity": "sha512-Km1YciVIxqluDbd1xmHjANNFyMonEOtnA6e4MrnBnC9XkPXSigeFlj0JvxyI/zjBsLBoFRmQiwq55W6l3hQ9sA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/@storybook/addon-viewport": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.4.tgz", + "integrity": "sha512-fU4LdXSSqIOLbCEh2leq/tZUYlFliXZBWr/+igQHdUoU7HY8RIImXqVUaR9wlCaTb48WezAWT60vJtwNijyIiQ==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "node_modules/@storybook/addon-webpack5-compiler-babel": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz", + "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==", "dev": true, - "peer": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "@babel/core": "^7.23.7", + "babel-loader": "^9.1.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@storybook/blocks": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.4.tgz", + "integrity": "sha512-1g4aCrd5CcN+pVhF2ATu9ZRVvAIgBMb2yF9KkCuTpdvqKDuDNK3sGb0CxjS7jp3LOvyjJr9laTOQsz8v8MQc5A==", "dev": true, - "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.10", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.4.5", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node_modules/@storybook/builder-webpack5": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.4.tgz", + "integrity": "sha512-EI6ULxRap5f4YSHf5xKUQqkoNGm4MVxJR/+GImx8K5fuZ+xYw2SdYdTu6dG8V+zTh1WZ4MDwmRb6aEbXvRcrFw==", + "dev": true, + "dependencies": { + "@storybook/core-webpack": "8.3.4", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.2", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.6.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "storybook": "^8.3.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, - "peer": true + "dependencies": { + "undici-types": "~6.19.2" + } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, - "peer": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, - "node_modules/istanbul-lib-report/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==", + "node_modules/@storybook/builder-webpack5/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/builder-webpack5/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/@storybook/builder-webpack5/node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@storybook/builder-webpack5/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=10" + "node": ">= 10.0.0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", + "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", "dev": true, - "peer": true, "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "node_modules/@storybook/components": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.4.tgz", + "integrity": "sha512-iQzLJd87uGbFBbYNqlrN/ABrnx3dUrL0tjPCarzglzshZoPCNOsllJeJx5TJwB9kCxSZ8zB9TTOgr7NXl+oyVA==", "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@storybook/core": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.4.tgz", + "integrity": "sha512-4PZB91JJpuKfcjeOR2LXj3ABaPLLSd2P/SfYOKNCygrDstsQa/yay3/yN5Z9yi1cIG84KRr6/sUW+0x8HsGLPg==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/@storybook/core-webpack": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.4.tgz", + "integrity": "sha512-Ftsk/8RANt46roiHT0hTyqfMPUO2/jV7EvlOR5H2XKhSbssA9njK04O2ry+BbfgKItIDIx0LTiz/I575qBCCnQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "@types/node": "^22.0.0", + "ts-dedent": "^2.0.0" }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "storybook": "^8.3.4" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/@storybook/core-webpack/node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, - "peer": true, "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "undici-types": "~6.19.2" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "node_modules/@storybook/core-webpack/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@storybook/csf": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "type-fest": "^2.19.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/csf-plugin": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.4.tgz", + "integrity": "sha512-ZMFWYxeTN4GxCn8dyIH4roECyLDy29yv/QKM+pHM3AC5Ny2HWI35SohWao4fGBAFxPQFbR5hPN8xa6ofHPSSTg==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "unplugin": "^1.3.1" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/csf/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@storybook/global": { + "version": "5.0.0", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/jest-circus/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==", + "node_modules/@storybook/icons": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz", + "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/instrumenter": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.3.4.tgz", + "integrity": "sha512-jVhfNOPekOyJmta0BTkQl9Z6rgRbFHlc0eV4z1oSrzaawSlc9TFzAeDCtCP57vg3FuBX8ydDYAvyZ7s4xPpLyg==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.0.5", + "util": "^0.12.4" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/@storybook/manager-api": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.4.tgz", + "integrity": "sha512-tBx7MBfPUrKSlD666zmVjtIvoNArwCciZiW/UJ8IWmomrTJRfFBnVvPVM2gp1lkDIzRHYmz5x9BHbYaEDNcZWQ==", "dev": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "bin": { - "jest": "bin/jest.js" + "peerDependencies": { + "storybook": "^8.3.4" + } + }, + "node_modules/@storybook/preset-react-webpack": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.3.4.tgz", + "integrity": "sha512-aNbozlcBhuX71anW5+2Ujj+vtXHPsYLf5RKOL82lMkCc1q2CzeMuhUB2BoSsU4R4GVnXVpgRPq+3+qLAQMwr6Q==", + "dev": true, + "dependencies": { + "@storybook/core-webpack": "8.3.4", + "@storybook/react": "8.3.4", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "semver": "^7.3.7", + "tsconfig-paths": "^4.2.0", + "webpack": "5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4" }, "peerDependenciesMeta": { - "node-notifier": { + "typescript": { "optional": true } } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "undici-types": "~6.19.2" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.14" } }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@storybook/preset-react-webpack/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=7.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "node_modules/@storybook/preset-react-webpack/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true }, - "node_modules/jest-cli/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==", + "node_modules/@storybook/preset-react-webpack/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/preview-api": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.4.tgz", + "integrity": "sha512-/YKQ3QDVSHmtFXXCShf5w0XMlg8wkfTpdYxdGv1CKFV8DU24f3N7KWulAgeWWCWQwBzZClDa9kzxmroKlQqx3A==", "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "peerDependencies": { + "storybook": "^8.3.4" + } + }, + "node_modules/@storybook/react": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.3.4.tgz", + "integrity": "sha512-PA7iQL4/9X2/iLrv+AUPNtlhTHJWhDao9gQIT1Hef39FtFk+TU9lZGbv+g29R1H9V3cHP5162nG2aTu395kmbA==", + "dev": true, + "dependencies": { + "@storybook/components": "^8.3.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "^8.3.4", + "@storybook/preview-api": "^8.3.4", + "@storybook/react-dom-shim": "8.3.4", + "@storybook/theming": "^8.3.4", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^22.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "@storybook/test": "8.3.4", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4", + "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { - "@types/node": { + "@storybook/test": { "optional": true }, - "ts-node": { + "typescript": { "optional": true } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/react-docgen-typescript-plugin": { + "version": "1.0.6--canary.9.0c3f3b7.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", + "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "typescript": ">= 4.x", + "webpack": ">= 4" } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/react-dom-shim": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.4.tgz", + "integrity": "sha512-L4llDvjaAzqPx6h4ddZMh36wPr75PrI2S8bXy+flLqAeVRYnRt4WNKGuxqH0t0U6MwId9+vlCZ13JBfFuY7eQQ==", "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4" } }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@storybook/react-webpack5": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.3.4.tgz", + "integrity": "sha512-N8dAu9fBsWaa4cw5GTo7z6ANes+PA57oK020RLdt9KSAv5qO9zZYnysC2oq5o9q8W9D+L8wCOBpy6jEQPAyiTQ==", "dev": true, - "peer": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@storybook/builder-webpack5": "8.3.4", + "@storybook/preset-react-webpack": "8.3.4", + "@storybook/react": "8.3.4", + "@types/node": "^22.0.0" }, "engines": { - "node": "*" + "node": ">=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.4", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/jest-config/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==", + "node_modules/@storybook/react-webpack5/node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "undici-types": "~6.19.2" } }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/react-webpack5/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "undici-types": "~6.19.2" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "node_modules/@storybook/react/node_modules/acorn": { + "version": "7.4.1", "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.4.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/react/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/react/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@storybook/test": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.3.4.tgz", + "integrity": "sha512-HRiUenitln8QPHu6DEWUg9s9cEoiGN79lMykzXzw9shaUvdEIhWCsh82YKtmB3GJPj6qcc6dZL/Aio8srxyGAg==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.4", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5", + "util": "^0.12.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@storybook/theming": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.4.tgz", + "integrity": "sha512-D4XVsQgTtpHEHLhwkx59aGy1GBwOedVr/mNns7hFrH8FjEpxrrWCuZQASq1ZpCl8LXlh7uvmT5sM2rOdQbGuGg==", "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "storybook": "^8.3.4" } }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-diff/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==", + "node_modules/@stylistic/stylelint-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.0.tgz", + "integrity": "sha512-NU2XR6i1x163KdyDj3zqblA13890fBzHNZYqZ13aor/sB3Yq8kU/0NKCudv5pfl9Kb/UAteo/D7vKMHtaror/A==", "dev": true, - "peer": true, + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "is-plain-object": "^5.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "style-search": "^0.1.0", + "stylelint": "^16.8.2" + }, "engines": { - "node": ">=8" + "node": "^18.12 || >=20.9" + }, + "peerDependencies": { + "stylelint": "^16.8.0" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.1" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-tokenizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@stylistic/stylelint-plugin/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, "engines": { - "node": ">=7.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "dev": true, - "peer": true + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/jest-each/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==", + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "peer": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, - "peer": true, "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, - "peer": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-matcher-utils/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, - "peer": true, - "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@swc/core": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.11.tgz", + "integrity": "sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==", "dev": true, - "peer": true, + "hasInstallScript": true, "dependencies": { - "has-flag": "^4.0.0" + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.11", + "@swc/core-darwin-x64": "1.4.11", + "@swc/core-linux-arm-gnueabihf": "1.4.11", + "@swc/core-linux-arm64-gnu": "1.4.11", + "@swc/core-linux-arm64-musl": "1.4.11", + "@swc/core-linux-x64-gnu": "1.4.11", + "@swc/core-linux-x64-musl": "1.4.11", + "@swc/core-win32-arm64-msvc": "1.4.11", + "@swc/core-win32-ia32-msvc": "1.4.11", + "@swc/core-win32-x64-msvc": "1.4.11" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.11.tgz", + "integrity": "sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.11.tgz", + "integrity": "sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=10" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.11.tgz", + "integrity": "sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.11.tgz", + "integrity": "sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-message-util/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==", + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.11.tgz", + "integrity": "sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "peer": true, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.11.tgz", + "integrity": "sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.11.tgz", + "integrity": "sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.11.tgz", + "integrity": "sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "peer": true, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "node": ">=10" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.11.tgz", + "integrity": "sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "peer": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.11.tgz", + "integrity": "sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + "node_modules/@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", "dependencies": { - "color-convert": "^2.0.1" + "@tanstack/table-core": "8.20.5" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@teamsupercell/typings-for-css-modules-loader": { + "version": "2.5.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "camelcase": "^5.3.1", + "loader-utils": "^1.4.2", + "schema-utils": "^2.0.1" }, - "engines": { - "node": ">=7.0.0" + "optionalDependencies": { + "prettier": "*" } }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@teamsupercell/typings-for-css-modules-loader/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, - "peer": 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/jest-resolve/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==", + "node_modules/@teamsupercell/typings-for-css-modules-loader/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, - "peer": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@teamsupercell/typings-for-css-modules-loader/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/@teamsupercell/typings-for-css-modules-loader/node_modules/json5": { + "version": "1.0.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "minimist": "^1.2.0" }, - "engines": { - "node": ">=8" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/loader-utils": { + "version": "1.4.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4.0.0" } }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/schema-utils": { + "version": "2.7.1", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 8.9.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "dequal": "^2.0.3" } }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-runner/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==", + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, - "peer": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@testing-library/react": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12", + "npm": ">=6" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@tootallnate/once": { + "version": "2.0.0", "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10" } }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=10.13.0" } }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "devOptional": true, + "license": "MIT" }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "peer": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/jest-runtime/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==", + "node_modules/@types/babel__generator": { + "version": "7.6.4", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/babel__template": { + "version": "7.4.1", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "peer": true, "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@babel/types": "^7.20.7" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/body-parser": { + "version": "1.19.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/node": "*" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/cacheable-request": { + "version": "6.0.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" } }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jest-snapshot/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==", + "node_modules/@types/connect": { + "version": "3.4.35", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, - "peer": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, - "peer": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@types/ms": "*" } }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true + }, + "node_modules/@types/electron-devtools-installer": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.5.tgz", + "integrity": "sha512-DhH8z0dadKuDolvH4TiW40Vp7H3VyZbOoZv98hhBaUfnxmvvcXTjkZjzw/54xvAmuG4KFzExOGAiVLg3jM2ojQ==", + "dev": true + }, + "node_modules/@types/escodegen": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.4.1", "dev": true, + "license": "MIT", + "optional": true, "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@types/estree": { + "version": "0.0.51", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/node": "*" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/node": "*" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/unist": "*" } }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/jest-util/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==", + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.8", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", "dev": true, - "peer": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/jest": { + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.5.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/jsdom": { + "version": "20.0.1", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" } }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, - "node_modules/jest-validate/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, - "peer": true, - "engines": { - "node": ">=8" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/keyv": { + "version": "3.1.4", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "node_modules/@types/lodash": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, - "peer": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@types/unist": "*" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.16.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", + "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "devOptional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "undici-types": "~6.19.2" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/node": "*" } }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/node-localstorage": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/node-localstorage/-/node-localstorage-1.3.3.tgz", + "integrity": "sha512-Wkn5g4eM5x10UNV9Xvl9K6y6m0zorocuJy4WjB5muUdyMZuPbZpSJG3hlhjGHe1HGxbOQO7RcB+jlHcNwkh+Jw==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/node": "*" } }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "devOptional": true }, - "node_modules/jest-watcher/node_modules/has-flag": { + "node_modules/@types/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT" + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" } }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", "dev": true, - "peer": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "peer": true, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@types/react": "*" } }, - "node_modules/jest-worker/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==", + "node_modules/@types/react-test-renderer": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz", + "integrity": "sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "@types/react": "*" } }, - "node_modules/jest-worker/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, - "peer": true, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "@types/react": "*" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true }, - "node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/@types/responselike": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" + "@types/node": "*" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/express": "*" + } }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, - "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" + "@types/node": "*" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/@types/source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==", "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "source-map": "^0.6.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", + "node_modules/@types/source-map-support/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, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/@types/stack-utils": { + "version": "2.0.1", "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "license": "MIT" + }, + "node_modules/@types/terser-webpack-plugin": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "terser-webpack-plugin": "*" } }, - "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", "dev": true }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", + "node_modules/@types/verror": { + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", + "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", "dev": true, - "license": "MIT" + "optional": true }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/@types/webpack": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", "dev": true, - "license": "MIT", "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" + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/@types/webpack-bundle-analyzer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==", "dev": true, - "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/levn": { - "version": "0.4.1", + "node_modules/@types/yargs": { + "version": "17.0.10", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "@types/yargs-parser": "*" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", + "node_modules/@types/yargs-parser": { + "version": "21.0.0", "dev": true, "license": "MIT" }, - "node_modules/loader-runner": { - "version": "4.3.0", + "node_modules/@types/yauzl": { + "version": "2.10.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.11.5" + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/locate-path": { - "version": "6.0.0", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=10" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": ">=10" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, - "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=8" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=7.0.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "peer": true, "dependencies": { - "yallist": "^3.0.2" + "balanced-match": "^1.0.0" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "peer": true, "dependencies": { - "semver": "^7.5.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, - "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node": "^16.0.0 || >=18.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, - "peer": true, "dependencies": { - "tmpl": "1.0.5" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@types/mdast": "^4.0.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/mdn-data": { - "version": "2.0.30", + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "CC0-1.0" + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/merge-stream": { - "version": "2.0.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT" + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/merge2": { - "version": "1.4.1", + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" } }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "node_modules/@vitest/pretty-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-symbol": "^2.0.0" + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "node_modules/@vitest/utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@vitest/pretty-format": "2.1.1", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-symbol": "^2.0.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "dependencies": { + "@xtuc/long": "4.2.2" + } }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-symbol": "^2.0.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-types": "^2.0.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" + "node": ">=14.15.0" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "node": ">=14.15.0" }, - "engines": { - "node": "*" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/minimist": { - "version": "1.2.8", + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10.0.0" } }, - "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==", + "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/mute-stream": { - "version": "0.0.8", - "dev": true, - "license": "ISC" + "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/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } + "license": "BSD-2-Clause" }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true }, - "node_modules/neo-async": { - "version": "2.6.2", + "node_modules/abab": { + "version": "2.0.6", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "node_modules/abbrev": { + "version": "1.1.1", "dev": true, - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "license": "ISC" }, - "node_modules/normalize-path": { - "version": "3.0.0", + "node_modules/accepts": { + "version": "1.3.8", "dev": true, "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "8.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "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==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/object-keys": { - "version": "1.1.1", + "node_modules/acorn-walk": { + "version": "7.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.4.0" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.0.0" } }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "node_modules/agent-base": { + "version": "6.0.2", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "debug": "4" }, "engines": { - "node": ">= 0.4" + "node": ">= 6.0.0" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "node_modules/agentkeepalive": { + "version": "4.2.1", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8.0.0" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/once": { - "version": "1.4.0", + "node_modules/ajv-formats": { + "version": "2.1.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "wrappy": "1" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/onetime": { - "version": "5.1.2", + "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, - "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/optionator": { - "version": "0.9.3", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora": { - "version": "5.4.1", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, "engines": { "node": ">=10" }, @@ -11217,9 +12887,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -11231,430 +12930,502 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/app-builder-lib/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "debug": "^4.3.4", + "sax": "^1.2.4" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/p-limit": { - "version": "3.1.0", + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/app-builder-lib/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 10.0.0" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "node_modules/papi-dts": { - "resolved": "../paranext-core/lib/papi-dts", - "link": true + "node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "license": "ISC" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/parse-json": { - "version": "5.2.0", + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/path-exists": { - "version": "4.0.0", + "node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/are-we-there-yet": { + "version": "3.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/path-key": { - "version": "3.1.1", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", "dev": true, "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "dev": true, + "node_modules/arg": { + "version": "4.1.3", + "devOptional": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "tslib": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", + "node_modules/aria-query": { + "version": "5.1.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" } }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/array-union": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/platform-bible-react": { - "resolved": "../paranext-core/lib/platform-bible-react", - "link": true - }, - "node_modules/platform-bible-utils": { - "resolved": "../paranext-core/lib/platform-bible-utils", - "link": true - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=12" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "node_modules/ast-metadata-inferer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz", + "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "@mdn/browser-compat-data": "^5.2.34" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "tslib": "^2.0.1" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=8" } }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", - "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=0.12.0" } }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -11662,541 +13433,645 @@ }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" + "url": "https://tidelift.com/funding/github/npm/autoprefixer" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, "engines": { - "node": ">=12.0" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "postcss": "^8.4.29" + "postcss": "^8.1.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=4" + } }, - "node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">=14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/prettier-plugin-jsdoc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.0.tgz", - "integrity": "sha512-cQm8xIa0fN9ieJFMXACQd6JPycl+8ouOijAqUqu44EF/s4fXL3Wi9sKXuEaodsEWgCN42Xby/bNhqgM1iWx4uw==", + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "binary-searching": "^2.0.5", - "comment-parser": "^1.4.0", - "mdast-util-from-markdown": "^2.0.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=14.13.1 || >=16.0.0" + "node": ">=14.16" }, - "peerDependencies": { - "prettier": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "peer": true, + "dependencies": { + "p-locate": "^6.0.0" + }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "peer": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prop-types": { - "version": "15.8.1", + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "license": "MIT" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, - "node_modules/punycode": { - "version": "2.3.0", + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, - "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "peer": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "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/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "loose-envify": "^1.1.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": ">= 6" + "node": ">=10", + "npm": ">=6" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "minimatch": "^5.1.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/readdirp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", - "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dev": true, - "engines": { - "node": ">= 14.16.0" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/rechoir": { - "version": "0.8.0", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, - "engines": { - "node": ">= 10.13.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "open": "^8.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12.0.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", + "node_modules/big.js": { + "version": "5.2.2", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, + "node_modules/binary-extensions": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/resolve": { - "version": "1.22.4", + "node_modules/binary-searching": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-searching/-/binary-searching-2.0.5.tgz", + "integrity": "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA==", + "dev": true + }, + "node_modules/bl": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "bluebird": "^3.5.5" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=4" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "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, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "engines": { + "node": ">= 0.8" } }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "node_modules/body-parser/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/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "peer": true, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", + "node_modules/body-parser/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, - "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, - "license": "ISC" + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } }, - "node_modules/reusify": { - "version": "1.0.4", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/boolean": { + "version": "3.2.0", "dev": true, "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/rimraf": { - "version": "3.0.2", + "node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fill-range": "^7.1.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/run-async": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } + "node_modules/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/rxjs": { - "version": "7.8.1", + "node_modules/browserslist-config-erb": { + "version": "0.0.3", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "license": "MIT", + "peerDependencies": { + "electron": ">=12.0.0" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "node_modules/bs-logger": { + "version": "0.2.6", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "fast-json-stable-stringify": "2.x" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", "dev": true, "funding": [ { @@ -12212,1837 +14087,1724 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/buffer-crc32": { + "version": "0.2.13", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", + "node_modules/buffer-from": { + "version": "1.1.2", "dev": true, "license": "MIT" }, - "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "node_modules/builder-util": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", "dev": true, "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", + "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" }, "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" } }, - "node_modules/sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "node_modules/builder-util/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, "dependencies": { - "neo-async": "^2.6.2" + "debug": "^4.3.4", + "sax": "^1.2.4" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">=12.0.0" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "peer": true, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, "dependencies": { - "loose-envify": "^1.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "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==", + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "universalify": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">= 10.0.0" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", + "node_modules/bytes": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/cacache": { + "version": "16.1.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "shebang-regex": "^3.0.0" + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/shell-quote": { - "version": "1.8.1", + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signal-exit": { - "version": "4.1.0", + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", "dev": true, "license": "ISC", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", "dev": true, - "peer": true + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/slash": { - "version": "3.0.0", + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", "dev": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=10" + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/cacache/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/cacache/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=7.0.0" + "node": "*" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "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==", + "node_modules/cacheable-lookup": { + "version": "5.0.4", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10.6.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/cacheable-request": { + "version": "7.0.2", "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, - "peer": true, "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/camelcase": { + "version": "5.3.1", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "peer": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, + "node_modules/caniuse-lite": { + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=10" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.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" }, "engines": { - "node": ">= 0.4" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/chownr": { + "version": "2.0.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.8.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", "dependencies": { - "ansi-regex": "^5.0.1" + "clsx": "2.0.0" }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "source-map": "~0.6.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/clean-css/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, - "peer": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "node_modules/clean-stack": { + "version": "2.2.0", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/cli-cursor": { + "version": "3.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "node_modules/stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - }, - { - "type": "github", - "url": "https://github.com/sponsors/stylelint" - } - ], "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "@csstools/selector-specificity": "^4.0.0", - "@dual-bundle/import-meta-resolve": "^4.1.0", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", - "fast-glob": "^3.3.2", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.3.2", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.34.0", - "mathml-tag-names": "^2.1.3", - "meow": "^13.2.0", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.1", - "postcss": "^8.4.41", - "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.1.0", - "svg-tags": "^1.0.0", - "table": "^6.8.2", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "stylelint": "bin/stylelint.mjs" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=8" } }, - "node_modules/stylelint-config-recommended": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", - "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "node_modules/cli-spinners": { + "version": "2.7.0", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - }, - { - "type": "github", - "url": "https://github.com/sponsors/stylelint" - } - ], + "license": "MIT", "engines": { - "node": ">=18.12.0" + "node": ">=6" }, - "peerDependencies": { - "stylelint": "^16.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-config-sass-guidelines": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-12.1.0.tgz", - "integrity": "sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==", + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, + "optional": true, "dependencies": { - "@stylistic/stylelint-plugin": "^3.0.1", - "postcss-scss": "^4.0.9", - "stylelint-scss": "^6.2.1" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=8" }, - "peerDependencies": { - "postcss": "^8.4.21", - "stylelint": "^16.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-scss": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz", - "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==", + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, - "dependencies": { - "known-css-properties": "^0.29.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.15", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "stylelint": "^16.0.2" + "node": ">= 10" } }, - "node_modules/stylelint-scss/node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "MIT" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "node_modules/stylelint/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/clone": { + "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.8" + } }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", - "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "node_modules/clone-deep": { + "version": "4.0.1", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^5.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/stylelint/node_modules/flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "node_modules/clone-response": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" + "mimic-response": "^1.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/stylelint/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", + "node_modules/cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=7.0.0" } }, - "node_modules/stylelint/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" }, - "node_modules/stylelint/node_modules/write-file-atomic": { - "version": "5.0.1", + "node_modules/color-support": { + "version": "1.1.3", "dev": true, "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "color-support": "bin.js" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/colord": { + "version": "2.9.3", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/supports-hyperlinks/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==", + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 12.0.0" } }, - "node_modules/svg-tags": { - "version": "1.0.0", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/swc-loader": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", - "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, - "dependencies": { - "@swc/counter": "^0.1.3" - }, - "peerDependencies": { - "@swc/core": "^1.2.147", - "webpack": ">=2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", "dev": true, "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">= 10" } }, - "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">= 6" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/compressible": { + "version": "2.0.18", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "mime-db": ">= 1.43.0 < 2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.6" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/table/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/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/compression": { + "version": "1.7.4", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/tapable": { - "version": "2.2.1", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/tar-stream": { - "version": "2.2.0", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", + "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" }, "bin": { - "terser": "bin/terser" + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "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 - } + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" + "balanced-match": "^1.0.0" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/terser/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==", + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-table": { - "version": "0.2.0", + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/through": { - "version": "2.3.8", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", "dev": true, "license": "MIT" }, - "node_modules/tmp": { - "version": "0.0.33", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=0.8" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/console-control-strings": { + "version": "1.1.0", "dev": true, - "peer": true + "license": "ISC" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "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==", + "node_modules/content-disposition": { + "version": "0.5.4", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=8.0" + "node": ">= 0.6" } }, - "node_modules/tree-kill": { - "version": "1.2.2", + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "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==", "dev": true, "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">= 0.6" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, + "node_modules/convert-source-map": { + "version": "1.8.0", + "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "safe-buffer": "~5.1.1" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.1.0", + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">=10.13.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", "dev": true, - "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "browserslist": "^4.23.3" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", + "node_modules/core-js-pure": { + "version": "3.29.1", "dev": true, + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/tslib": { - "version": "2.6.2", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, + "node_modules/cosmiconfig": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "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==", + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, - "peer": true, - "engines": { - "node": ">=4" + "optional": true, + "dependencies": { + "buffer": "^5.1.0" } }, - "node_modules/type-fest": { - "version": "0.21.3", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "bin": { + "crc32": "bin/crc32.njs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.8" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 10" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "create-jest": "bin/create-jest.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "node_modules/create-require": { + "version": "1.1.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "cross-spawn": "^7.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" }, "engines": { - "node": ">=14.17" + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, "engines": { - "node": ">=18" + "node": "^14 || ^16 || >=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "node_modules/css-functions-list": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=12 || >=16" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, - "bin": { - "update-browserslist-db": "cli.js" + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "browserslist": ">= 4.21.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/uri-js": { - "version": "4.4.1", + "node_modules/css-minimizer-webpack-plugin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz", + "integrity": "sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT" + "@jridgewell/trace-mapping": "^0.3.25", + "cssnano": "^7.0.1", + "jest-worker": "^29.7.0", + "postcss": "^8.4.38", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10.12.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "peer": true, "dependencies": { - "makeerror": "1.0.12" + "@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/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "node_modules/css-minimizer-webpack-plugin/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, "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/wcwidth": { - "version": "1.0.1", + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, - "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "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.11", - "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.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=10.13.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/webpack-cli": { - "version": "5.1.4", + "node_modules/css.escape": { + "version": "1.5.1", "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, "bin": { - "webpack-cli": "bin/cli.js" + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=14.15.0" + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", + "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^7.0.6", + "lilconfig": "^3.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "webpack": "5.x.x" + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", + "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.2", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.4", + "postcss-discard-comments": "^7.0.3", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.4", + "postcss-merge-rules": "^7.0.4", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.4", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", + "node_modules/cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=14" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", + "node_modules/cssnano/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=10.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=18.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } + "license": "MIT" }, - "node_modules/which": { - "version": "2.0.2", + "node_modules/cssstyle": { + "version": "2.3.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "cssom": "~0.3.6" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14051,16 +15813,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14069,17 +15830,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14088,9804 +15847,37569 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">=12" + "node": ">=0.11" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/decompress-response": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/deep-equal": { + "version": "2.2.0", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/default-browser/node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/defaults": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "clone": "^1.0.2" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrappy": { - "version": "1.0.2", + "node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "peer": true, "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/write-file-atomic/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, - "peer": true - }, - "node_modules/y18n": { - "version": "5.0.8", + "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, - "license": "ISC", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "peer": true - }, - "node_modules/yargs": { - "version": "17.7.2", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", + "node_modules/delayed-stream": { + "version": "1.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/delegates": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", + "node_modules/depd": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", + "node_modules/dequal": { + "version": "2.0.3", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/yn": { - "version": "3.1.1", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/zip-build": { - "version": "1.8.0", + "node_modules/detect-libc": { + "version": "2.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "inquirer": "^8.2.5", - "yargs": "^16.2.0", - "zip-folder-promise": "^1.2.0" - }, - "bin": { - "zip-build": "lib/index.js" + "license": "Apache-2.0", + "engines": { + "node": ">=8" } }, - "node_modules/zip-build/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/zip-build/node_modules/cliui": { - "version": "7.0.4", + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/zip-build/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "dequal": "^2.0.0" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=7.0.0" + "node": ">=0.3.1" } }, - "node_modules/zip-build/node_modules/color-name": { - "version": "1.1.4", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/zip-build/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, - "license": "MIT" + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } }, - "node_modules/zip-build/node_modules/string-width": { - "version": "4.2.3", + "node_modules/dir-glob": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/zip-build/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dmg-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "optionalDependencies": { + "dmg-license": "^1.0.11" } }, - "node_modules/zip-build/node_modules/yargs": { - "version": "16.2.0", + "node_modules/dmg-builder/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "debug": "^4.3.4", + "sax": "^1.2.4" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" } }, - "node_modules/zip-folder-promise": { - "version": "1.2.0", + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { - "archiver": "^5.3.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/zip-stream": { - "version": "4.1.0", + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" + "universalify": "^2.0.0" }, - "engines": { - "node": ">= 10" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "engines": { + "node": ">= 10.0.0" } }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" } }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "peer": true - }, - "@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "node_modules/dmg-license/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, - "peer": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "optional": 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" } }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "node_modules/dmg-license/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, - "peer": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } + "optional": true }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "peer": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/doctrine": { + "version": "3.0.0", "dev": true, - "peer": true + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/dom-accessibility-api": { + "version": "0.5.13", "dev": true, - "peer": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } + "license": "MIT" }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/dom-align": { + "version": "1.12.4", + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.22.5" + "dependencies": { + "utila": "~0.4" } }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.22.15" + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "peer": true + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.22.5" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/domexception": { + "version": "4.0.0", "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.22.5" + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "peer": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "peer": true + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } }, - "@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, - "peer": true, - "requires": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/dts-bundle-generator": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz", + "integrity": "sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "dependencies": { + "typescript": ">=5.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "dts-bundle-generator": "dist/bin/dts-bundle-generator.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "node_modules/duplexer": { + "version": "0.1.2", "dev": true, - "peer": true + "license": "MIT" }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/electron": { + "version": "27.3.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.3.3.tgz", + "integrity": "sha512-tl50Cy82Qr+2KK+cPMjfAdM4lvgUkA3L2uLEpgA9/wgtdCfo5xTnDupl+wImo9jzNdFm66HvLl6uoQ/gjDDq5g==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/electron-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", "dev": true, "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": ">= 10.0.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/electron-builder/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">= 10.0.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/electron-debug": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "electron-is-dev": "^1.1.0", + "electron-localshortcut": "^3.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/electron-devtools-installer": { + "version": "3.2.0", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "tslib": "^2.1.0", + "unzip-crx-3": "^0.2.0" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "node_modules/electron-devtools-installer/node_modules/rimraf": { + "version": "3.0.2", "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" + "node_modules/electron-is-accelerator": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/electron-is-dev": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/electron-localshortcut": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "debug": "^4.0.1", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", + "keyboardevents-areequal": "^0.2.1" } }, - "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "node_modules/electron-log": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.0.3.tgz", + "integrity": "sha512-jUgAuRjfpCD9tmH1F6fb195YsFfM/DkqkZLhFeo0VAAstantn11bxmgx63uE6KG/JljHG7sIkgM2QEjDimJI0g==", + "engines": { + "node": ">= 14" } }, - "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "node_modules/electron-publish": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" } }, - "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "node_modules/electron-publish/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "peer": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "peer": true + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "requires": {} + "engines": { + "node": ">= 10.0.0" + } }, - "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", - "dev": true + "node_modules/electron-to-chromium": { + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==" }, - "@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "node_modules/electron-updater": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.4.tgz", + "integrity": "sha512-uZUo7p1Y53G4tl6Cgw07X1yF8Jlz6zhaL7CQJDZ1fVVkOaBfE2cWtx80avwDVi8jHp+I/FWawrMgTAeCCNIfAg==", + "dependencies": { + "builder-util-runtime": "9.2.5", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.6.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-window-state": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "18.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.9.tgz", + "integrity": "sha512-oZFKlC8l5YtzGQNT4zC2PiSSKzQVZ8bAwwd+EYdPLtyk0nSEq6O16SkK+rkkT2eflDAbormJgEF3QnH3oDrTSw==", "dev": true, - "requires": {} + "dependencies": { + "undici-types": "~5.26.4" + } }, - "@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "node_modules/electronmon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/electronmon/-/electronmon-2.0.3.tgz", + "integrity": "sha512-vpsNupi9sCzOCvx8GACbSHKEImkNF2a6pU5Io2yabARbJeQ/8ZuY7t/43LilF6Qw0nZ0MbKQt4sO3x0F3drpQQ==", "dev": true, - "requires": {} + "dependencies": { + "chalk": "^3.0.0", + "import-from": "^3.0.0", + "runtime-required": "^1.1.0", + "watchboy": "^0.4.3" + }, + "bin": { + "electronmon": "bin/cli.js" + }, + "engines": { + "node": ">=10.0.0" + } }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true + "node_modules/electronmon/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", - "dev": true + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "@eslint-community/regexpp": { - "version": "4.8.0", - "dev": true + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/encoding": { + "version": "0.1.13", "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", + "optional": true, "dependencies": { - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } + "iconv-lite": "^0.6.2" } }, - "@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" } }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/enhanced-resolve/node_modules/tapable": { + "version": "0.1.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "engines": { + "node": ">=0.12" }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/env-paths": { + "version": "2.2.1", "dev": true, - "peer": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", + "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.16", + "@esbuild/android-arm64": "0.18.16", + "@esbuild/android-x64": "0.18.16", + "@esbuild/darwin-arm64": "0.18.16", + "@esbuild/darwin-x64": "0.18.16", + "@esbuild/freebsd-arm64": "0.18.16", + "@esbuild/freebsd-x64": "0.18.16", + "@esbuild/linux-arm": "0.18.16", + "@esbuild/linux-arm64": "0.18.16", + "@esbuild/linux-ia32": "0.18.16", + "@esbuild/linux-loong64": "0.18.16", + "@esbuild/linux-mips64el": "0.18.16", + "@esbuild/linux-ppc64": "0.18.16", + "@esbuild/linux-riscv64": "0.18.16", + "@esbuild/linux-s390x": "0.18.16", + "@esbuild/linux-x64": "0.18.16", + "@esbuild/netbsd-x64": "0.18.16", + "@esbuild/openbsd-x64": "0.18.16", + "@esbuild/sunos-x64": "0.18.16", + "@esbuild/win32-arm64": "0.18.16", + "@esbuild/win32-ia32": "0.18.16", + "@esbuild/win32-x64": "0.18.16" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-config-erb": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz", + "integrity": "sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jest": "^27.4.0", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "engines": { + "node": ">=16.x.x" + }, + "peerDependencies": { + "eslint": ">=7 || >=8", + "jest": ">=27.0.0", + "react": ">=17.0.0 || >=18.0.0" + } + }, + "node_modules/eslint-config-erb/node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/eslint-config-erb/node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-erb/node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-config-erb/node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/eslint-config-erb/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript/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/eslint-import-resolver-webpack": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.9.tgz", + "integrity": "sha512-yGngeefNiHXau2yzKKs2BNON4HLpxBabY40BGL/vUSKZtqzjlVsTTZm57jhHULhm+mJEwKsEIIN3NXup5AiiBQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "hasown": "^2.0.0", + "interpret": "^1.4.0", + "is-core-module": "^2.13.1", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^2.0.0-next.5", + "semver": "^5.7.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "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/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-compat": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", + "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==", + "dev": true, + "dependencies": { + "@mdn/browser-compat-data": "^5.3.13", + "ast-metadata-inferer": "^0.8.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001524", + "find-up": "^5.0.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "dev": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-no-null": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz", + "integrity": "sha512-uRDiz88zCO/2rzGfgG15DBjNsgwWtWiSo4Ezy7zzajUgpnFIqd1TjepKeRmJZHEfBGu58o2a8S0D7vglvvhkVA==", + "dev": true, + "engines": { + "node": ">=5.0.0" + }, + "peerDependencies": { + "eslint": ">=3.0.0" + } + }, + "node_modules/eslint-plugin-no-type-assertion": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-type-assertion/-/eslint-plugin-no-type-assertion-1.3.0.tgz", + "integrity": "sha512-04wuuIP5ptNzp969tTt0gf/Jsw4G0T5md2/nbgv3dRL/HySSNU7H4vIKNjkuno9T+6h2daj1T9Aki6bDgmXDEw==", + "dev": true, + "engines": { + "node": ">=12.0.0", + "yarn": "^1.13.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", + "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-storybook": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.9.0.tgz", + "integrity": "sha512-qOT/2vQBo0VqrG/BhZv8IdSsKQiyzJw+2Wqq+WFCiblI/PfxLSrGkF/buiXF+HumwfsCyBdaC94UhqhmYFmAvA==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/estree-walker/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evil": { + "resolved": "extensions/src/evil", + "link": true + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "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/execa/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": 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==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/fkill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fkill/-/fkill-9.0.0.tgz", + "integrity": "sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==", + "dev": true, + "dependencies": { + "aggregate-error": "^5.0.0", + "execa": "^8.0.1", + "pid-port": "^1.0.0", + "process-exists": "^5.0.0", + "ps-list": "^8.1.1", + "taskkill": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fkill/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/fkill/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fkill/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fkill/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "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": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "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/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-agent": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.2.tgz", + "integrity": "sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hello-someone": { + "resolved": "extensions/src/hello-someone", + "link": true + }, + "node_modules/hello-world": { + "resolved": "extensions/src/hello-world", + "link": true + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "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" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "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/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "dev": true, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "dev": true, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "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==" + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyboardevent-from-electron-accelerator": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/keyboardevents-areequal": { + "version": "0.2.2", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/legacy-comment-manager": { + "resolved": "extensions/src/legacy-comment-manager", + "link": true + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lexical": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.17.1.tgz", + "integrity": "sha512-72/MhR7jqmyqD10bmJw8gztlCm4KDDT+TPtU4elqXrEvHoO5XENi34YAEUD9gIkPfqSwyLa9mwAX1nKzIr5xEA==", + "dev": true + }, + "node_modules/lib0": { + "version": "0.2.97", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.97.tgz", + "integrity": "sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==", + "dev": true, + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lucide-react": { + "version": "0.367.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.367.0.tgz", + "integrity": "sha512-3FWiBaJiqMrx5a1sjH3CVdPqWnw/Z/PTVeeTDmOeILSs+8Ah+VhCd4FQMeHo6Z0WxHcm9piIOtilQwvceiCCKQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "devOptional": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-to-jsx": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz", + "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "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/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "license": "MIT" + }, + "node_modules/minipass": { + "version": "3.3.4", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/next-themes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", + "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", + "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/node-localstorage": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-3.0.5.tgz", + "integrity": "sha512-GCwtK33iwVXboZWYcqQHu3aRvXEBwmPkAMRBLeaX86ufhqslyUkLGsi4aW3INEfdQYpUB5M9qtYf3eHvAk2VBg==", + "dependencies": { + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", + "dev": true + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-js": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.0.tgz", + "integrity": "sha512-GwNFPQygkpDjO9MOr54Rqi01dGS+h9VAS//Qxz9lTN5B09CxqiIc7rydvdV+Ex2Z8Vk+zqfHH7hU6ePn8uf+Mg==", + "dev": true, + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "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/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/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/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/papi-dts": { + "resolved": "lib/papi-dts", + "link": true + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/paranext-extensions": { + "resolved": "extensions", + "link": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/patch-package/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.3.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pid-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-1.0.0.tgz", + "integrity": "sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==", + "dev": true, + "dependencies": { + "execa": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/pid-port/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/pid-port/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pid-port/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pid-port/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/platform-bible-react": { + "resolved": "lib/platform-bible-react", + "link": true + }, + "node_modules/platform-bible-utils": { + "resolved": "lib/platform-bible-utils", + "link": true + }, + "node_modules/platform-scripture": { + "resolved": "extensions/src/platform-scripture", + "link": true + }, + "node_modules/platform-scripture-editor": { + "resolved": "extensions/src/platform-scripture-editor", + "link": true + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", + "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", + "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", + "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", + "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "dev": true, + "dependencies": { + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", + "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.0.tgz", + "integrity": "sha512-cQm8xIa0fN9ieJFMXACQd6JPycl+8ouOijAqUqu44EF/s4fXL3Wi9sKXuEaodsEWgCN42Xby/bNhqgM1iWx4uw==", + "dev": true, + "dependencies": { + "binary-searching": "^2.0.5", + "comment-parser": "^1.4.0", + "mdast-util-from-markdown": "^2.0.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.1.tgz", + "integrity": "sha512-AnbeYZu0WGj+QgKciUgdMnRxrqcxltleZPgdwfA5104BHM3siBLONN/HLW1yS2HvzSNkzpQ/JAj+LN0jcJO+0w==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-5.0.0.tgz", + "integrity": "sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA==", + "dev": true, + "dependencies": { + "ps-list": "^8.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ps-list": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", + "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quick-verse": { + "resolved": "extensions/src/quick-verse", + "link": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "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/raw-body/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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc-align": { + "version": "4.0.15", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dock": { + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/rc-dock/-/rc-dock-3.2.19.tgz", + "integrity": "sha512-onjYMYw4IEzf5LbQyQt+a2mSJ58oxAgpu29CD8/rexR5IWjTsa3amxyF+CxHy2+wtqCDzi/qsDsJglH/k6Bx9g==", + "dependencies": { + "classnames": "^2.5.1", + "lodash": "^4.17.21", + "rc-dropdown": "~4.0.1", + "rc-menu": "~9.8.4", + "rc-new-window": "^0.1.13", + "rc-tabs": "~11.16.1" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-menu": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz", + "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.6.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-new-window": { + "version": "0.1.13", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.10.1", + "bowser": "^2.11.0", + "classnames": "2.x", + "lodash": "^4.17.20" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "11.16.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.6.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.5.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs/node_modules/rc-menu": { + "version": "9.6.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.0", + "rc-trigger": "^5.1.2", + "rc-util": "^5.12.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-trigger": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.28.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-data-grid": { + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/react-data-grid/-/react-data-grid-7.0.0-beta.42.tgz", + "integrity": "sha512-N5ToEOxMlQGkRYhed3ahFz34fgJTccrCA9PZqIGVoO1vsZADNISXk6ywODJOdCz/1yB78MLu+T7q6cnJd2024A==", + "dependencies": { + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^18.0", + "react-dom": "^18.0" + } + }, + "node_modules/react-docgen": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", + "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "dev": true, + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "dependencies": { + "@remix-run/router": "1.19.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "dependencies": { + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-test-renderer": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", + "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", + "dev": true, + "dependencies": { + "react-is": "^18.3.1", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/read-config-file/node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-config-file/node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "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" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/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/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", + "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz", + "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/replace-in-file": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.1.0.tgz", + "integrity": "sha512-1uZmJ78WtqNYCSuPC9IWbweXkGxPOtk2rKuar8diTw7naVIQZiE3Tm8ACx2PCMXDtVH6N+XxwaRY2qZ2xHPqXw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "glob": "^8.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/replace-in-file/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/replace-in-file/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "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-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-script-os": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "bin": { + "run-os": "index.js", + "run-script-os": "index.js" + } + }, + "node_modules/runtime-required": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", + "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "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/schema-utils/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/schema-utils/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/schema-utils/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/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/send/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/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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" + }, + "engines": { + "node": ">=4" + } + }, + "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/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "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/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sonner": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", + "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.4.tgz", + "integrity": "sha512-nzvuK5TsEgJwcWGLGgafabBOxKn37lfJVv7ZoUVPgJIjk2mNRyJDFwYRJzUZaD37eiR/c/lQ6MoaeqlGwiXoxw==", + "dev": true, + "dependencies": { + "@storybook/core": "8.3.4" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "dev": true, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.27.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylehacks": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", + "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylelint": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.41", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-sass-guidelines": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-12.1.0.tgz", + "integrity": "sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==", + "dev": true, + "dependencies": { + "@stylistic/stylelint-plugin": "^3.0.1", + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.4.21", + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-tailwindcss": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/stylelint-config-tailwindcss/-/stylelint-config-tailwindcss-0.0.7.tgz", + "integrity": "sha512-n2dCWH+0ppr0/by4EYCLWW7g5LU+l4UzUIsYS7xbVHqvm9UWa7UhltNdNiz5NmLF/FmbJR4Yd/v9DuUGvLw1Tg==", + "dev": true, + "peerDependencies": { + "stylelint": ">=13.13.1", + "tailwindcss": ">=2.2.16" + } + }, + "node_modules/stylelint-scss": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz", + "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==", + "dev": true, + "dependencies": { + "known-css-properties": "^0.29.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.15", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-tokenizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.1.0" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/known-css-properties": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "dev": true + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/postcss-safe-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/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/svgo/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/swc-loader": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + }, + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tailwind-merge": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.2.tgz", + "integrity": "sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==", + "dependencies": { + "@babel/runtime": "^7.24.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/taskkill": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-5.0.0.tgz", + "integrity": "sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==", + "dev": true, + "dependencies": { + "execa": "^6.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/taskkill/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/taskkill/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/telejson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "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.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "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_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "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/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/enhanced-resolve": { + "version": "5.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ts-mockito": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.5" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tsconfck": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz", + "integrity": "sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/enhanced-resolve": { + "version": "5.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.7.tgz", + "integrity": "sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typedoc/node_modules/shiki": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.17.4.tgz", + "integrity": "sha512-cuezOGFn2AA9b+ItofDOB6/ap3AosrgV7Wqxeo9c5L4Df0+HtiGt0WlBrM4gtWK5cR96+5Ef17syu4FDL9/Acg==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.17.4", + "@shikijs/engine-javascript": "1.17.4", + "@shikijs/engine-oniguruma": "1.17.4", + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/typedoc/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unixify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", + "dev": true, + "dependencies": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/unzip-crx-3": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchboy": { + "version": "0.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash.difference": "^4.5.0", + "micromatch": "^4.0.2", + "pify": "^4.0.1", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "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.11", + "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.10", + "watchpack": "^2.4.1", + "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-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "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-dev-server": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "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-hot-middleware": { + "version": "2.25.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/webpack/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/webpack/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/webpack/node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/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/webpack/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, + "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/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "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", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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 + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaku": { + "version": "0.16.7", + "dev": true, + "license": "MIT" + }, + "node_modules/yalc": { + "version": "1.0.0-pre.53", + "resolved": "https://registry.npmjs.org/yalc/-/yalc-1.0.0-pre.53.tgz", + "integrity": "sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "detect-indent": "^6.0.0", + "fs-extra": "^8.0.1", + "glob": "^7.1.4", + "ignore": "^5.0.4", + "ini": "^2.0.0", + "npm-packlist": "^2.1.5", + "yargs": "^16.1.1" + }, + "bin": { + "yalc": "src/yalc.js" + } + }, + "node_modules/yalc/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yalc/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yalc/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yjs": { + "version": "13.6.18", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.18.tgz", + "integrity": "sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==", + "dev": true, + "dependencies": { + "lib0": "^0.2.86" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-build": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/zip-build/-/zip-build-1.8.0.tgz", + "integrity": "sha512-4wYrsrYyme1RTeNCCXg9AwseQFRpj3n7qjiIfaq9qtOAYevgbhtktCzxK7CL0KDZyz/tA9Yxqrn1HismAiJ/eg==", + "dev": true, + "dependencies": { + "inquirer": "^8.2.5", + "yargs": "^16.2.0", + "zip-folder-promise": "^1.2.0" + }, + "bin": { + "zip-build": "lib/index.js" + } + }, + "node_modules/zip-build/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/zip-build/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/zip-folder-promise": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-folder-promise/-/zip-folder-promise-1.2.0.tgz", + "integrity": "sha512-SwD7SJfZZTr8/0s1adZx80oReGFIuEnyqYLU1XtCqNwSDeEOcB8OnjPBuOh7WujPGffP4wrjVSFi8k62vTgnyw==", + "dev": true, + "dependencies": { + "archiver": "^5.3.1" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "requires": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "dev": true + }, + "@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "requires": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "requires": { + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "dev": true, + "requires": { + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==" + }, + "@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==" + }, + "@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "dev": true, + "requires": { + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dev": true, + "requires": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "requires": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "requires": { + "@babel/types": "^7.25.7" + } + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.25.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", + "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", + "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.25.7" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", + "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/preset-env": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", + "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-react-display-name": "^7.25.7", + "@babel/plugin-transform-react-jsx": "^7.25.7", + "@babel/plugin-transform-react-jsx-development": "^7.25.7", + "@babel/plugin-transform-react-pure-annotations": "^7.25.7" + } + }, + "@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + } + }, + "@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "requires": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + } + }, + "@base2/pretty-print-object": { + "version": "1.0.1", + "dev": true + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@biblionexus-foundation/platform-editor": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@biblionexus-foundation/platform-editor/-/platform-editor-0.6.3.tgz", + "integrity": "sha512-adC0d28g30CYmka6a02w2C/uMEPzBX63ovta0ZAxLNRsbD7YHmiJfGuM79pvv3RGKyL1yfPe1foCr/3V8HjNyQ==", + "dev": true, + "requires": { + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@lexical/react": "^0.17.1", + "@lexical/selection": "^0.17.1", + "@lexical/text": "^0.17.1", + "@lexical/utils": "^0.17.1", + "@lexical/yjs": "^0.17.1", + "fast-equals": "^5.0.1", + "lexical": "^0.17.1", + "yjs": "^13.6.15" + } + }, + "@biblionexus-foundation/scripture-utilities": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@biblionexus-foundation/scripture-utilities/-/scripture-utilities-0.0.4.tgz", + "integrity": "sha512-EslK90TulsLaePMRhcJV/lClFC7NTdbQXbNCXbMN4rR07ES9ZSqKRKaMelNOtWh0eZgXa+glBf7mPC2vdwM6uQ==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.10" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "devOptional": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "devOptional": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "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-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": {} + }, + "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 + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true + }, + "@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, + "@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + } + }, + "@electron/get": { + "version": "2.0.2", + "dev": true, + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "dev": true + } + } + }, + "@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "requires": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@electron/rebuild": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.2.tgz", + "integrity": "sha512-fTSoWdbrPTmQOwvct4VnJH45aJg79WRabuNqt7cAWIno5kTXv1QD6qVmR2e8wmHi/xryaiVINl1gcEhKGjREVw==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "dependencies": { + "@malept/cross-spawn-promise": { + "version": "2.0.0", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "fs-extra": { + "version": "10.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "dev": true + } + } + }, + "@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "requires": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", + "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", + "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", + "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", + "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", + "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", + "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", + "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", + "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", + "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", + "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", + "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", + "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", + "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", + "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", + "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", + "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", + "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", + "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", + "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", + "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", + "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "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" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "requires": { + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "requires": { + "@floating-ui/dom": "^1.6.1" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "@gar/promisify": { + "version": "1.1.3", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "dev": true + }, + "@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "dependencies": { + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + } + } + }, + "@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "requires": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" + } + }, + "@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "dependencies": { + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + } + } + }, + "@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "dependencies": { + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + } + } + }, + "@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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" + } + } + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } + } + }, + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@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/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "requires": {} + }, + "@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dev": true, + "requires": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + } + }, + "@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", + "dev": true, + "requires": {} + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "@lexical/clipboard": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.17.1.tgz", + "integrity": "sha512-OVqnEfWX8XN5xxuMPo6BfgGKHREbz++D5V5ISOiml0Z8fV/TQkdgwqbBJcUdJHGRHWSUwdK7CWGs/VALvVvZyw==", + "dev": true, + "requires": { + "@lexical/html": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/code": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.17.1.tgz", + "integrity": "sha512-ZspfTm6g6dN3nAb4G5bPp3SqxzdkB/bjGfa0uRKMU6/eBKtrMUgZsGxt0a8JRZ1eq2TZrQhx+l1ceRoLXii/bQ==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1", + "prismjs": "^1.27.0" + } + }, + "@lexical/devtools-core": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.17.1.tgz", + "integrity": "sha512-SzL1EX9Rt5GptIo87t6nDxAc9TtYtl6DyAPNz/sCltspdd69KQgs23sTRa26/tkNFCS1jziRN7vpN3mlnmm5wA==", + "dev": true, + "requires": { + "@lexical/html": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/mark": "0.17.1", + "@lexical/table": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/dragon": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.17.1.tgz", + "integrity": "sha512-lhBRKP7RlhiVCLtF0qiNqmMhEO6cQB43sMe7d4bvuY1G2++oKY/XAJPg6QJZdXRrCGRQ6vZ26QRNhRPmCxL5Ng==", + "dev": true, + "requires": { + "lexical": "0.17.1" + } + }, + "@lexical/hashtag": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.17.1.tgz", + "integrity": "sha512-XtP0BI8vEewAe7tzq9MC49UPUvuChuNJI/jqFp+ezZlt/RUq0BClQCOPuSlrTJhluvE2rWnUnOnVMk8ILRvggQ==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/history": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.17.1.tgz", + "integrity": "sha512-OU/ohajz4FXchUhghsWC7xeBPypFe50FCm5OePwo767G7P233IztgRKIng2pTT4zhCPW7S6Mfl53JoFHKehpWA==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/html": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.17.1.tgz", + "integrity": "sha512-yGG+K2DXl7Wn2DpNuZ0Y3uCHJgfHkJN3/MmnFb4jLnH1FoJJiuy7WJb/BRRh9H+6xBJ9v70iv+kttDJ0u1xp5w==", + "dev": true, + "requires": { + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/link": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.17.1.tgz", + "integrity": "sha512-qFJEKBesZAtR8kfJfIVXRFXVw6dwcpmGCW7duJbtBRjdLjralOxrlVKyFhW9PEXGhi4Mdq2Ux16YnnDncpORdQ==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/list": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.17.1.tgz", + "integrity": "sha512-k9ZnmQuBvW+xVUtWJZwoGtiVG2cy+hxzkLGU4jTq1sqxRIoSeGcjvhFAK8JSEj4i21SgkB1FmkWXoYK5kbwtRA==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/mark": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.17.1.tgz", + "integrity": "sha512-V82SSRjvygmV+ZMwVpy5gwgr2ZDrJpl3TvEDO+G5I4SDSjbgvua8hO4dKryqiDVlooxQq9dsou0GrZ9Qtm6rYg==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/markdown": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.17.1.tgz", + "integrity": "sha512-uexR9snyT54jfQTrbr/GZAtzX+8Oyykr4p1HS0vCVL1KU5MDuP2PoyFfOv3rcfB2TASc+aYiINhU2gSXzwCHNg==", + "dev": true, + "requires": { + "@lexical/code": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/rich-text": "0.17.1", + "@lexical/text": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/offset": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.17.1.tgz", + "integrity": "sha512-fX0ZSIFWwUKAjxf6l21vyXFozJGExKWyWxA+EMuOloNAGotHnAInxep0Mt8t/xcvHs7luuyQUxEPw7YrTJP7aw==", + "dev": true, + "requires": { + "lexical": "0.17.1" + } + }, + "@lexical/overflow": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.17.1.tgz", + "integrity": "sha512-oElVDq486R3rO2+Zz0EllXJGpW3tN0tfcH+joZ5h36+URKuNeKddqkJuDRvgSLOr9l8Jhtv3+/YKduPJVKMz6w==", + "dev": true, + "requires": { + "lexical": "0.17.1" + } + }, + "@lexical/plain-text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.17.1.tgz", + "integrity": "sha512-CSvi4j1a4ame0OAvOKUCCmn2XrNsWcST4lExGTa9Ei/VIh8IZ+a97h4Uby8T3lqOp10x+oiizYWzY30pb9QaBg==", + "dev": true, + "requires": { + "@lexical/clipboard": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/react": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.17.1.tgz", + "integrity": "sha512-DI4k25tO0E1WyozrjaLgKMOmLjOB7+39MT4eZN9brPlU7g+w0wzdGbTZUPgPmFGIKPK+MSLybCwAJCK97j8HzQ==", + "dev": true, + "requires": { + "@lexical/clipboard": "0.17.1", + "@lexical/code": "0.17.1", + "@lexical/devtools-core": "0.17.1", + "@lexical/dragon": "0.17.1", + "@lexical/hashtag": "0.17.1", + "@lexical/history": "0.17.1", + "@lexical/link": "0.17.1", + "@lexical/list": "0.17.1", + "@lexical/mark": "0.17.1", + "@lexical/markdown": "0.17.1", + "@lexical/overflow": "0.17.1", + "@lexical/plain-text": "0.17.1", + "@lexical/rich-text": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/table": "0.17.1", + "@lexical/text": "0.17.1", + "@lexical/utils": "0.17.1", + "@lexical/yjs": "0.17.1", + "lexical": "0.17.1", + "react-error-boundary": "^3.1.4" + } + }, + "@lexical/rich-text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.17.1.tgz", + "integrity": "sha512-T3kvj4P1OpedX9jvxN3WN8NP1Khol6mCW2ScFIRNRz2dsXgyN00thH1Q1J/uyu7aKyGS7rzcY0rb1Pz1qFufqQ==", + "dev": true, + "requires": { + "@lexical/clipboard": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/selection": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.17.1.tgz", + "integrity": "sha512-qBKVn+lMV2YIoyRELNr1/QssXx/4c0id9NCB/BOuYlG8du5IjviVJquEF56NEv2t0GedDv4BpUwkhXT2QbNAxA==", + "dev": true, + "requires": { + "lexical": "0.17.1" + } + }, + "@lexical/table": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.17.1.tgz", + "integrity": "sha512-2fUYPmxhyuMQX3MRvSsNaxbgvwGNJpHaKx1Ldc+PT2MvDZ6ALZkfsxbi0do54Q3i7dOon8/avRp4TuVaCnqvoA==", + "dev": true, + "requires": { + "@lexical/utils": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/text": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.17.1.tgz", + "integrity": "sha512-zD2pAGXaMfPpT8PeNrx3+n0+jGnQORHyn0NEBO+hnyacKfUq5z5sI6Gebsq5NwH789bRadmJM5LvX5w8fsuv6w==", + "dev": true, + "requires": { + "lexical": "0.17.1" + } + }, + "@lexical/utils": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.17.1.tgz", + "integrity": "sha512-jCQER5EsvhLNxKH3qgcpdWj/necUb82Xjp8qWQ3c0tyL07hIRm2tDRA/s9mQmvcP855HEZSmGVmR5SKtkcEAVg==", + "dev": true, + "requires": { + "@lexical/list": "0.17.1", + "@lexical/selection": "0.17.1", + "@lexical/table": "0.17.1", + "lexical": "0.17.1" + } + }, + "@lexical/yjs": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.17.1.tgz", + "integrity": "sha512-9mn5PDtaH5uLMH6hQ59EAx5FkRzmJJFcVs3E6zSIbtgkG3UASR3CFEfgsLKTjl/GC5NnTGuMck+jXaupDVBhOg==", + "dev": true, + "requires": { + "@lexical/offset": "0.17.1", + "lexical": "0.17.1" + } + }, + "@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@mdn/browser-compat-data": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.6.4.tgz", + "integrity": "sha512-bOOF4GGzn0exmvNHpSWmTfOXB9beTpIFCm2KPY2UVoCdn1YVfr8heuHr1C++BYI9Tun8REgi5TNVdKbBs249CA==", + "dev": true + }, + "@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "dev": true, + "requires": { + "@types/mdx": "^2.0.0" + } + }, + "@mui/base": { + "version": "5.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", + "integrity": "sha512-6A8fYiXgjqTO6pgj31Hc8wm1M3rFYCxDRh09dBVk0L0W4cb2lnurRJa3cAyic6hHY+we1S58OdGYRbKmOsDpGQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", + "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==" + }, + "@mui/icons-material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.10.tgz", + "integrity": "sha512-9cF8oUHZKo9oQ7EQ3pxPELaZuZVmphskU4OI6NiJNDVN7zcuvrEsuWjYo1Zh4fLiC39Nrvm30h/B51rcUjvSGA==", + "requires": { + "@babel/runtime": "^7.23.9" + } + }, + "@mui/material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.10.tgz", + "integrity": "sha512-YJJGHjwDOucecjDEV5l9ISTCo+l9YeWrho623UajzoHRYxuKUmwrGVYOW4PKwGvCx9SU9oklZnbbi2Clc5XZHw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.36", + "@mui/core-downloads-tracker": "^5.15.10", + "@mui/system": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + } + }, + "@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "requires": {} + }, + "@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true + }, + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", + "dev": true, + "requires": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "requires": {} + } + } + }, + "@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + } + }, + "@radix-ui/react-dropdown-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", + "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-menu": "2.0.6", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + } + }, + "@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + } + }, + "@radix-ui/react-label": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", + "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "@radix-ui/react-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", + "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "requires": {} + }, + "@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "requires": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "requires": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + } + } + }, + "@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "requires": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "dependencies": { + "@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "requires": { + "@radix-ui/react-primitive": "2.0.0" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "requires": { + "@radix-ui/rect": "1.1.0" + } + }, + "@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + } + } + }, + "@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + } + }, + "@radix-ui/react-radio-group": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz", + "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "requires": {} + }, + "@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "requires": {} + } + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + } + }, + "@radix-ui/react-select": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", + "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "requires": { + "@radix-ui/react-primitive": "2.0.0" + }, + "dependencies": { + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + } + } + }, + "@radix-ui/react-slider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", + "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", + "requires": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "dependencies": { + "@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "requires": {} + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "requires": {} + } + } + }, + "@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + } + }, + "@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "requires": {} + } + } + }, + "@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" + } + }, + "@radix-ui/react-toast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", + "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "requires": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "requires": { + "@radix-ui/react-primitive": "2.0.0" + } + } + } + }, + "@radix-ui/react-toggle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", + "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + } + } + }, + "@radix-ui/react-toggle-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz", + "integrity": "sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-toggle": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "dependencies": { + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "requires": {} + }, + "@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.0" + } + }, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "requires": { + "@radix-ui/react-slot": "1.1.0" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "requires": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + } + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "dependencies": { + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + } + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==" + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "dev": true, + "optional": true + }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "@senojs/rollup-plugin-style-inject": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@senojs/rollup-plugin-style-inject/-/rollup-plugin-style-inject-0.2.3.tgz", + "integrity": "sha512-3/spt7JG2iHMW1YdtFbDafWa4IYNkJ99tibY7oDe5LXVTq2JxBpOsdRmJyCCqI5I4kBoUUYWS2yEG/FKwrLy/A==", + "dev": true + }, + "@shikijs/core": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.17.4.tgz", + "integrity": "sha512-d2RqLWGJDPGThosjMs472B+NLVRUbQSAez/UV9d9rKE/zLbSmPQ73me308ofPSALKwUv2RkuX8umkIdl97boig==", + "dev": true, + "requires": { + "@shikijs/engine-javascript": "1.17.4", + "@shikijs/engine-oniguruma": "1.17.4", + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.2" + } + }, + "@shikijs/engine-javascript": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.17.4.tgz", + "integrity": "sha512-qWulwA32cbvVxdthAB1w4DIeXn2+HC1Q5rO0KChnVkFA9xzmy2VH1W3CvmMGEyXo0GjQerovhREcxZh1FlgJ1A==", + "dev": true, + "requires": { + "@shikijs/types": "1.17.4", + "oniguruma-to-js": "0.4.0" + } + }, + "@shikijs/engine-oniguruma": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.17.4.tgz", + "integrity": "sha512-7yLBEwkwrr3zYF17tJk56SXHl+0GIMeb0dSKW9jxOsYPfjIU+19nHogURpr5r9Ey03m73i3pj2cthqj5Ui8MNg==", + "dev": true, + "requires": { + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2" + } + }, + "@shikijs/types": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.17.4.tgz", + "integrity": "sha512-gh2PuD5wmqVlWWIyCpLpmVyl0PuN8IEBc86Mvj89g6LiEsqFOsCCdvk6znd0spRu+0y78aP0PA8mQV58RA3igA==", + "dev": true, + "requires": { + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "@shikijs/vscode-textmate": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", + "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==", + "dev": true + }, + "@sillsdev/scripture": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@sillsdev/scripture/-/scripture-2.0.2.tgz", + "integrity": "sha512-fCsCm7xnPfzlYpk3yEb8UA45YWZLFzhP1fj1kRZhz/B+eoYkRYVJIDU22PGs4x4/SOuP5M3ZjDTCKoCAiurV9A==" + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@sindresorhus/is": { + "version": "4.6.0", + "dev": true + }, + "@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@storybook/addon-actions": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.4.tgz", + "integrity": "sha512-1y0yD3upKcyzNwwA6loAGW2cRDqExwl4oAT7GJQA4tmabI+fNwmANSgU/ezLvvSUf4Qo0eJHg2Zcn8y+Apq2eA==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true + } + } + }, + "@storybook/addon-backgrounds": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.4.tgz", + "integrity": "sha512-o3nl7cN3x8erJNxLEv8YptanEQAnbqnaseOAsvSC6/nnSAcRYBSs3BvekKvo4CcpS2mxn7F5NJTBFYnCXzy8EA==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-controls": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.4.tgz", + "integrity": "sha512-qQcaK6dczsb6wXkzGZKOjUYNA7FfKBewRv6NvoVKYY6LfhllGOkmUAtYpdtQG8adsZWTSoZaAOJS2vP2uM67lw==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-docs": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.4.tgz", + "integrity": "sha512-TWauhqF/gJgfwPuWeM6KM3LwC+ErCOM+K2z16w3vgao9s67sij8lnrdAoQ0hjA+kw2/KAdCakFS6FyciG81qog==", + "dev": true, + "requires": { + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.3.4", + "@storybook/csf-plugin": "8.3.4", + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "8.3.4", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "fs-extra": "^11.1.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@storybook/addon-essentials": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.4.tgz", + "integrity": "sha512-C3+3hpmSn/8zdx5sXEP0eE6zMzxgRosHVZYfe9nBcMiEDp6UKVUyHVetWxEULOEgN46ysjcpllZ0bUkRYxi2IQ==", + "dev": true, + "requires": { + "@storybook/addon-actions": "8.3.4", + "@storybook/addon-backgrounds": "8.3.4", + "@storybook/addon-controls": "8.3.4", + "@storybook/addon-docs": "8.3.4", + "@storybook/addon-highlight": "8.3.4", + "@storybook/addon-measure": "8.3.4", + "@storybook/addon-outline": "8.3.4", + "@storybook/addon-toolbars": "8.3.4", + "@storybook/addon-viewport": "8.3.4", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-highlight": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.4.tgz", + "integrity": "sha512-rxZTeuZyZ7RnU+xmRhS01COFLbGnVEmlUNxBw8ArsrTEZKW5PbKpIxNLTj9F0zdH8H0MfryJGP+Aadcm0oHWlw==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0" + } + }, + "@storybook/addon-interactions": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.3.4.tgz", + "integrity": "sha512-ORxqe35wUmF7EDHo45mdDHiju3Ryk2pZ1vO9PyvW6ZItNlHt/IxAr7T/TysGejZ/eTBg6tMZR3ExGky3lTg/CQ==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.4", + "@storybook/test": "8.3.4", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + } + }, + "@storybook/addon-links": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.4.tgz", + "integrity": "sha512-R1DjARmxRIKJDGIG6uxmQ1yFNyoQbb+QIPUFjgWCak8+AdLJbC7W+Esvo9F5hQfh6czyy0piiM3qj5hpQJVh3A==", + "dev": true, + "requires": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-measure": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.4.tgz", + "integrity": "sha512-IJ6WKEbqmG+r7sukFjo+bVmPB2Zry04sylGx/OGyOh7zIhhqAqpwOwMHP0uQrc3tLNnUM6qB/o83UyYX79ql+A==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + } + }, + "@storybook/addon-outline": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.4.tgz", + "integrity": "sha512-kRRJTTLKM8gMfeh/e83djN5XLlc0hFtr9zKWxuZxaXt9Hmr+9tH/PRFtVK/S4SgqnBDoXk49Wgv6raiwj5/e3A==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-toolbars": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.4.tgz", + "integrity": "sha512-Km1YciVIxqluDbd1xmHjANNFyMonEOtnA6e4MrnBnC9XkPXSigeFlj0JvxyI/zjBsLBoFRmQiwq55W6l3hQ9sA==", + "dev": true, + "requires": {} + }, + "@storybook/addon-viewport": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.4.tgz", + "integrity": "sha512-fU4LdXSSqIOLbCEh2leq/tZUYlFliXZBWr/+igQHdUoU7HY8RIImXqVUaR9wlCaTb48WezAWT60vJtwNijyIiQ==", + "dev": true, + "requires": { + "memoizerific": "^1.11.3" + } + }, + "@storybook/addon-webpack5-compiler-babel": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz", + "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==", + "dev": true, + "requires": { + "@babel/core": "^7.23.7", + "babel-loader": "^9.1.3" + } + }, + "@storybook/blocks": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.4.tgz", + "integrity": "sha512-1g4aCrd5CcN+pVhF2ATu9ZRVvAIgBMb2yF9KkCuTpdvqKDuDNK3sGb0CxjS7jp3LOvyjJr9laTOQsz8v8MQc5A==", + "dev": true, + "requires": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.10", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.4.5", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/builder-webpack5": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.4.tgz", + "integrity": "sha512-EI6ULxRap5f4YSHf5xKUQqkoNGm4MVxJR/+GImx8K5fuZ+xYw2SdYdTu6dG8V+zTh1WZ4MDwmRb6aEbXvRcrFw==", + "dev": true, + "requires": { + "@storybook/core-webpack": "8.3.4", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.2", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.6.0" + }, + "dependencies": { + "@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "requires": {} + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "webpack-dev-middleware": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", + "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + } + } + }, + "@storybook/components": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.4.tgz", + "integrity": "sha512-iQzLJd87uGbFBbYNqlrN/ABrnx3dUrL0tjPCarzglzshZoPCNOsllJeJx5TJwB9kCxSZ8zB9TTOgr7NXl+oyVA==", + "dev": true, + "requires": {} + }, + "@storybook/core": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.4.tgz", + "integrity": "sha512-4PZB91JJpuKfcjeOR2LXj3ABaPLLSd2P/SfYOKNCygrDstsQa/yay3/yN5Z9yi1cIG84KRr6/sUW+0x8HsGLPg==", + "dev": true, + "requires": { + "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" + } + }, + "@storybook/core-webpack": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.4.tgz", + "integrity": "sha512-Ftsk/8RANt46roiHT0hTyqfMPUO2/jV7EvlOR5H2XKhSbssA9njK04O2ry+BbfgKItIDIx0LTiz/I575qBCCnQ==", + "dev": true, + "requires": { + "@types/node": "^22.0.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + } + } + }, + "@storybook/csf": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", + "dev": true, + "requires": { + "type-fest": "^2.19.0" + }, + "dependencies": { + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + } + } + }, + "@storybook/csf-plugin": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.4.tgz", + "integrity": "sha512-ZMFWYxeTN4GxCn8dyIH4roECyLDy29yv/QKM+pHM3AC5Ny2HWI35SohWao4fGBAFxPQFbR5hPN8xa6ofHPSSTg==", + "dev": true, + "requires": { + "unplugin": "^1.3.1" + } + }, + "@storybook/global": { + "version": "5.0.0", + "dev": true + }, + "@storybook/icons": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz", + "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==", + "dev": true, + "requires": {} + }, + "@storybook/instrumenter": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.3.4.tgz", + "integrity": "sha512-jVhfNOPekOyJmta0BTkQl9Z6rgRbFHlc0eV4z1oSrzaawSlc9TFzAeDCtCP57vg3FuBX8ydDYAvyZ7s4xPpLyg==", + "dev": true, + "requires": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.0.5", + "util": "^0.12.4" + } + }, + "@storybook/manager-api": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.4.tgz", + "integrity": "sha512-tBx7MBfPUrKSlD666zmVjtIvoNArwCciZiW/UJ8IWmomrTJRfFBnVvPVM2gp1lkDIzRHYmz5x9BHbYaEDNcZWQ==", + "dev": true, + "requires": {} + }, + "@storybook/preset-react-webpack": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.3.4.tgz", + "integrity": "sha512-aNbozlcBhuX71anW5+2Ujj+vtXHPsYLf5RKOL82lMkCc1q2CzeMuhUB2BoSsU4R4GVnXVpgRPq+3+qLAQMwr6Q==", + "dev": true, + "requires": { + "@storybook/core-webpack": "8.3.4", + "@storybook/react": "8.3.4", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "semver": "^7.3.7", + "tsconfig-paths": "^4.2.0", + "webpack": "5" + }, + "dependencies": { + "@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@storybook/preview-api": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.4.tgz", + "integrity": "sha512-/YKQ3QDVSHmtFXXCShf5w0XMlg8wkfTpdYxdGv1CKFV8DU24f3N7KWulAgeWWCWQwBzZClDa9kzxmroKlQqx3A==", + "dev": true, + "requires": {} + }, + "@storybook/react": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.3.4.tgz", + "integrity": "sha512-PA7iQL4/9X2/iLrv+AUPNtlhTHJWhDao9gQIT1Hef39FtFk+TU9lZGbv+g29R1H9V3cHP5162nG2aTu395kmbA==", + "dev": true, + "requires": { + "@storybook/components": "^8.3.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "^8.3.4", + "@storybook/preview-api": "^8.3.4", + "@storybook/react-dom-shim": "8.3.4", + "@storybook/theming": "^8.3.4", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^22.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "acorn": { + "version": "7.4.1", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + } + } + }, + "@storybook/react-docgen-typescript-plugin": { + "version": "1.0.6--canary.9.0c3f3b7.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", + "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0" + } + }, + "@storybook/react-dom-shim": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.4.tgz", + "integrity": "sha512-L4llDvjaAzqPx6h4ddZMh36wPr75PrI2S8bXy+flLqAeVRYnRt4WNKGuxqH0t0U6MwId9+vlCZ13JBfFuY7eQQ==", + "dev": true, + "requires": {} + }, + "@storybook/react-webpack5": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.3.4.tgz", + "integrity": "sha512-N8dAu9fBsWaa4cw5GTo7z6ANes+PA57oK020RLdt9KSAv5qO9zZYnysC2oq5o9q8W9D+L8wCOBpy6jEQPAyiTQ==", + "dev": true, + "requires": { + "@storybook/builder-webpack5": "8.3.4", + "@storybook/preset-react-webpack": "8.3.4", + "@storybook/react": "8.3.4", + "@types/node": "^22.0.0" + }, + "dependencies": { + "@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + } + } + }, + "@storybook/test": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.3.4.tgz", + "integrity": "sha512-HRiUenitln8QPHu6DEWUg9s9cEoiGN79lMykzXzw9shaUvdEIhWCsh82YKtmB3GJPj6qcc6dZL/Aio8srxyGAg==", + "dev": true, + "requires": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.4", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5", + "util": "^0.12.4" + } + }, + "@storybook/theming": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.4.tgz", + "integrity": "sha512-D4XVsQgTtpHEHLhwkx59aGy1GBwOedVr/mNns7hFrH8FjEpxrrWCuZQASq1ZpCl8LXlh7uvmT5sM2rOdQbGuGg==", + "dev": true, + "requires": {} + }, + "@stylistic/stylelint-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.0.tgz", + "integrity": "sha512-NU2XR6i1x163KdyDj3zqblA13890fBzHNZYqZ13aor/sB3Yq8kU/0NKCudv5pfl9Kb/UAteo/D7vKMHtaror/A==", + "dev": true, + "requires": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "is-plain-object": "^5.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "style-search": "^0.1.0", + "stylelint": "^16.8.2" + }, + "dependencies": { + "@csstools/css-parser-algorithms": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "requires": {} + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + } + }, + "@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + } + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + } + }, + "@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "requires": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + } + } + }, + "@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + } + }, + "@swc/core": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.11.tgz", + "integrity": "sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.4.11", + "@swc/core-darwin-x64": "1.4.11", + "@swc/core-linux-arm-gnueabihf": "1.4.11", + "@swc/core-linux-arm64-gnu": "1.4.11", + "@swc/core-linux-arm64-musl": "1.4.11", + "@swc/core-linux-x64-gnu": "1.4.11", + "@swc/core-linux-x64-musl": "1.4.11", + "@swc/core-win32-arm64-msvc": "1.4.11", + "@swc/core-win32-ia32-msvc": "1.4.11", + "@swc/core-win32-x64-msvc": "1.4.11", + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.11.tgz", + "integrity": "sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-darwin-x64": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.11.tgz", + "integrity": "sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.11.tgz", + "integrity": "sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.11.tgz", + "integrity": "sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.11.tgz", + "integrity": "sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.11.tgz", + "integrity": "sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.11.tgz", + "integrity": "sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.11.tgz", + "integrity": "sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.11.tgz", + "integrity": "sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.11.tgz", + "integrity": "sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "requires": { + "@tanstack/table-core": "8.20.5" + } + }, + "@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==" + }, + "@teamsupercell/typings-for-css-modules-loader": { + "version": "2.5.2", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "loader-utils": "^1.4.2", + "prettier": "*", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "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-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": {} + }, + "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 + }, + "json5": { + "version": "1.0.2", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + } + } + }, + "@testing-library/react": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "requires": {} + }, + "@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "devOptional": true + }, + "@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cacheable-request": { + "version": "6.0.2", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true + }, + "@types/electron-devtools-installer": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.5.tgz", + "integrity": "sha512-DhH8z0dadKuDolvH4TiW40Vp7H3VyZbOoZv98hhBaUfnxmvvcXTjkZjzw/54xvAmuG4KFzExOGAiVLg3jM2ojQ==", + "dev": true + }, + "@types/escodegen": { + "version": "0.0.6", + "dev": true + }, + "@types/eslint": { + "version": "8.4.1", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "dev": true + }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.8", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + }, + "pretty-format": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "@types/jsdom": { + "version": "20.0.1", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.4", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", + "dev": true + }, + "@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "20.16.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", + "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "devOptional": true, + "requires": { + "undici-types": "~6.19.2" + }, + "dependencies": { + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "devOptional": true + } + } + }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node-localstorage": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/node-localstorage/-/node-localstorage-1.3.3.tgz", + "integrity": "sha512-Wkn5g4eM5x10UNV9Xvl9K6y6m0zorocuJy4WjB5muUdyMZuPbZpSJG3hlhjGHe1HGxbOQO7RcB+jlHcNwkh+Jw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/parse-json": { + "version": "4.0.0" + }, + "@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "@types/qs": { + "version": "6.9.7", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "dev": true + }, + "@types/react": { + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-test-renderer": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz", + "integrity": "sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true + }, + "@types/responselike": { + "version": "1.0.0", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==", + "dev": true, + "requires": { + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "dev": true + }, + "@types/terser-webpack-plugin": { + "version": "5.2.0", + "dev": true, + "requires": { + "terser-webpack-plugin": "*" + } + }, + "@types/tough-cookie": { + "version": "4.0.2", + "dev": true + }, + "@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "@types/verror": { + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", + "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", + "dev": true, + "optional": true + }, + "@types/webpack": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", + "dev": true, + "requires": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "@types/webpack-bundle-analyzer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==", + "dev": true, + "requires": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.10", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.0", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vitejs/plugin-react": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", + "dev": true, + "requires": { + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + } + }, + "@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "requires": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "dependencies": { + "@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "requires": { + "tinyrainbow": "^1.2.0" + } + }, + "@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "requires": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + } + } + } + }, + "@vitest/pretty-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", + "dev": true, + "requires": { + "tinyrainbow": "^1.2.0" + } + }, + "@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "requires": { + "tinyspy": "^3.0.0" + } + }, + "@vitest/utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", + "dev": true, + "requires": { + "@vitest/pretty-format": "2.1.1", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} + }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true + }, + "@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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true + }, + "7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "devOptional": true + }, + "acorn-globals": { + "version": "7.0.1", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "dev": true + } + } + }, + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "dev": true + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "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" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1" + }, + "ansi-styles": { + "version": "4.3.0", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.2", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "app-builder-lib": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "dev": true, + "requires": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "aproba": { + "version": "2.0.0", + "dev": true + }, + "archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, + "are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "arg": { + "version": "4.1.3", + "devOptional": true + }, + "argparse": { + "version": "2.0.1" + }, + "aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "aria-query": { + "version": "5.1.3", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "dev": true + }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + }, + "assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true + }, + "ast-metadata-inferer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz", + "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==", + "dev": true, + "requires": { + "@mdn/browser-compat-data": "^5.2.34" + } + }, + "ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "requires": { + "tslib": "^2.4.0" + } + }, + "asynckit": { + "version": "0.4.0", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "dev": true + }, + "autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "requires": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true + }, + "axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "requires": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2" + }, + "base64-js": { + "version": "1.5.1", + "dev": true + }, + "batch": { + "version": "0.6.1", + "dev": true + }, + "better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dev": true, + "requires": { + "open": "^8.0.4" + } + }, + "big.js": { + "version": "5.2.2", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0" + }, + "binary-searching": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-searching/-/binary-searching-2.0.5.tgz", + "integrity": "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5" + } + }, + "body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "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 + }, + "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" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "boolean": { + "version": "3.2.0", + "dev": true, + "optional": true + }, + "bowser": { + "version": "2.11.0" + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true + }, + "browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "requires": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + } + }, + "browserslist-config-erb": { + "version": "0.0.3", + "dev": true, + "requires": {} + }, + "bs-logger": { + "version": "0.2.6", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "dev": true + }, + "buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "dev": true + }, + "builder-util": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "dev": true, + "requires": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + }, + "dependencies": { + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "builder-util-runtime": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", + "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "requires": { + "run-applescript": "^7.0.0" + } + }, + "bytes": { + "version": "3.0.0", + "dev": true + }, + "cacache": { + "version": "16.1.3", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "minimatch": { + "version": "5.1.6", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + } + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "5.3.1", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true + }, + "chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "requires": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "dev": true + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "ci-info": { + "version": "3.8.0", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "requires": { + "clsx": "2.0.0" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + } + } + }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "clean-stack": { + "version": "2.2.0", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.7.0", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" + }, + "cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", + "requires": { + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4" + }, + "color-support": { + "version": "1.1.3", + "dev": true + }, + "colord": { + "version": "2.9.3", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true + }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "compressible": { + "version": "2.0.18", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "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": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "dev": true + }, + "concurrently": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", + "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "requires": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "confusing-browser-globals": { + "version": "1.0.11", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "dev": true + }, + "copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "requires": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "dependencies": { + "globby": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "dev": true, + "requires": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + } + }, + "path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true + } + } + }, + "core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "dev": true + }, + "core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dev": true, + "requires": { + "browserslist": "^4.23.3" + } + }, + "core-js-pure": { + "version": "3.29.1", + "dev": true + }, + "core-util-is": { + "version": "1.0.3" + }, + "cosmiconfig": { + "version": "7.1.0", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + } + } + }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } + }, + "create-require": { + "version": "1.1.1", + "devOptional": true + }, + "cross-env": { + "version": "7.0.3", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "requires": {} + }, + "css-functions-list": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "dev": true + }, + "css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + } + }, + "css-minimizer-webpack-plugin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz", + "integrity": "sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "cssnano": "^7.0.1", + "jest-worker": "^29.7.0", + "postcss": "^8.4.38", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "dependencies": { + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "peer": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "peer": true, "requires": { - "p-locate": "^4.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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, - "peer": true, "requires": { - "p-try": "^2.0.0" + "has-flag": "^4.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==", + } + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "dev": true + }, + "cssesc": { + "version": "3.0.0" + }, + "cssnano": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", + "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "dev": true, + "requires": { + "cssnano-preset-default": "^7.0.6", + "lilconfig": "^3.1.2" + }, + "dependencies": { + "lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true + } + } + }, + "cssnano-preset-default": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", + "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.2", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.4", + "postcss-discard-comments": "^7.0.3", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.4", + "postcss-merge-rules": "^7.0.4", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.4", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.3" + } + }, + "cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "requires": { + "css-tree": "~2.2.0" + }, + "dependencies": { + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "peer": true, "requires": { - "p-limit": "^2.2.0" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" } }, - "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, - "peer": true + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + } + } + }, + "cssom": { + "version": "0.5.0", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "dev": true + }, + "data-urls": { + "version": "3.0.2", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "dev": true + }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "requires": { + "character-entities": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "dev": true } } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "deep-equal": { + "version": "2.2.0", "dev": true, - "peer": true, "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "isarray": { + "version": "2.0.5", + "dev": true } } }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "deep-is": { + "version": "0.1.4", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, - "peer": true, "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true } } }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "defaults": { + "version": "1.0.4", "dev": true, - "peer": true, "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "clone": "^1.0.2" } }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "defer-to-connect": { + "version": "2.0.1", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "peer": true, "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "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 + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "peer": true, "requires": { - "jest-get-type": "^29.6.3" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "dev": true + }, + "depd": { + "version": "1.1.2", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-libc": { + "version": "2.0.1", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "dev": true + }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "4" } }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "requires": { + "dequal": "^2.0.0" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff": { + "version": "4.0.2", + "devOptional": true + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, - "peer": true, "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" } }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dir-glob": { + "version": "3.0.1", "dev": true, - "peer": true, "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "path-type": "^4.0.0" } }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dmg-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", "dev": true, - "peer": true, "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "dmg-license": "^1.0.11", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "debug": "^4.3.4", + "sax": "^1.2.4" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "requires": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "peer": true, + "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "optional": true } } }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "peer": true, "requires": { - "@sinclair/typebox": "^0.27.8" + "@leichtgewicht/ip-codec": "^2.0.1" } }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "doctrine": { + "version": "3.0.0", "dev": true, - "peer": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "esutils": "^2.0.2" } }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dom-accessibility-api": { + "version": "0.5.13", + "dev": true + }, + "dom-align": { + "version": "1.12.4" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, - "peer": true, "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "utila": "~0.4" } }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dom-helpers": { + "version": "5.2.1", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "peer": true, "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } } }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "4.0.0", "dev": true, - "peer": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dts-bundle-generator": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz", + "integrity": "sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==", + "dev": true, + "requires": { + "typescript": ">=5.0.2", + "yargs": "^17.6.0" + } + }, + "duplexer": { + "version": "0.1.2", + "dev": true + }, + "eastasianwidth": { + "version": "0.2.0" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron": { + "version": "27.3.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.3.3.tgz", + "integrity": "sha512-tl50Cy82Qr+2KK+cPMjfAdM4lvgUkA3L2uLEpgA9/wgtdCfo5xTnDupl+wImo9jzNdFm66HvLl6uoQ/gjDDq5g==", + "dev": true, + "requires": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "@types/node": { + "version": "18.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.9.tgz", + "integrity": "sha512-oZFKlC8l5YtzGQNT4zC2PiSSKzQVZ8bAwwd+EYdPLtyk0nSEq6O16SkK+rkkT2eflDAbormJgEF3QnH3oDrTSw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + } + } + }, + "electron-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "dev": true, + "requires": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "dependencies": { + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "peer": true, + "requires": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "peer": true, "requires": { - "color-name": "~1.1.4" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + } + } + }, + "electron-debug": { + "version": "3.2.0", + "requires": { + "electron-is-dev": "^1.1.0", + "electron-localshortcut": "^3.1.0" + } + }, + "electron-devtools-installer": { + "version": "3.2.0", + "dev": true, + "requires": { + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "tslib": "^2.1.0", + "unzip-crx-3": "^0.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "glob": "^7.1.3" } } } }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "electron-is-accelerator": { + "version": "0.1.2" + }, + "electron-is-dev": { + "version": "1.2.0" + }, + "electron-localshortcut": { + "version": "3.2.1", + "requires": { + "debug": "^4.0.1", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", + "keyboardevents-areequal": "^0.2.1" + } + }, + "electron-log": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.0.3.tgz", + "integrity": "sha512-jUgAuRjfpCD9tmH1F6fb195YsFfM/DkqkZLhFeo0VAAstantn11bxmgx63uE6KG/JljHG7sIkgM2QEjDimJI0g==" + }, + "electron-publish": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", "dev": true, - "peer": true, "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "debug": "^4.3.4", + "sax": "^1.2.4" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==" + }, + "electron-updater": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.4.tgz", + "integrity": "sha512-uZUo7p1Y53G4tl6Cgw07X1yF8Jlz6zhaL7CQJDZ1fVVkOaBfE2cWtx80avwDVi8jHp+I/FWawrMgTAeCCNIfAg==", + "requires": { + "builder-util-runtime": "9.2.5", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.6.3", + "tiny-typed-emitter": "^2.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "has-flag": "^4.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" } } }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", + "electron-window-state": { + "version": "5.0.3", + "requires": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + } + }, + "electronmon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/electronmon/-/electronmon-2.0.3.tgz", + "integrity": "sha512-vpsNupi9sCzOCvx8GACbSHKEImkNF2a6pU5Io2yabARbJeQ/8ZuY7t/43LilF6Qw0nZ0MbKQt4sO3x0F3drpQQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "chalk": "^3.0.0", + "import-from": "^3.0.0", + "runtime-required": "^1.1.0", + "watchboy": "^0.4.3" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, - "@jridgewell/set-array": { - "version": "1.1.2", + "emoji-regex": { + "version": "9.2.2" + }, + "emojis-list": { + "version": "3.0.0", "dev": true }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "encoding": { + "version": "0.1.13", "dev": true, + "optional": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "iconv-lite": "^0.6.2" } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "end-of-stream": { + "version": "1.4.4", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "once": "^1.4.0" } }, - "@mdn/browser-compat-data": { - "version": "5.3.14", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", + "endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", + "enhanced-resolve": { + "version": "0.9.1", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "dependencies": { + "tapable": { + "version": "0.1.10", + "dev": true + } } }, - "@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true + "env-paths": { + "version": "2.2.1", + "dev": true }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "envinfo": { + "version": "7.8.1", "dev": true }, - "@rtsao/scc": { + "environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.7", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, - "@sillsdev/scripture": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@sillsdev/scripture/-/scripture-2.0.2.tgz", - "integrity": "sha512-fCsCm7xnPfzlYpk3yEb8UA45YWZLFzhP1fj1kRZhz/B+eoYkRYVJIDU22PGs4x4/SOuP5M3ZjDTCKoCAiurV9A==" + "es-get-iterator": { + "version": "1.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "dev": true + } + } }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, - "peer": true + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } }, - "@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "es-module-lexer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "peer": true, "requires": { - "type-detect": "4.0.8" + "es-errors": "^1.3.0" } }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "peer": true, "requires": { - "@sinonjs/commons": "^3.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, - "@stylistic/stylelint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.0.tgz", - "integrity": "sha512-NU2XR6i1x163KdyDj3zqblA13890fBzHNZYqZ13aor/sB3Yq8kU/0NKCudv5pfl9Kb/UAteo/D7vKMHtaror/A==", + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "is-plain-object": "^5.0.0", - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "hasown": "^2.0.0" } }, - "@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "es-to-primitive": { + "version": "1.2.1", "dev": true, "requires": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26", - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "es6-error": { + "version": "4.1.1", "dev": true, "optional": true }, - "@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "esbuild": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", + "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.16", + "@esbuild/android-arm64": "0.18.16", + "@esbuild/android-x64": "0.18.16", + "@esbuild/darwin-arm64": "0.18.16", + "@esbuild/darwin-x64": "0.18.16", + "@esbuild/freebsd-arm64": "0.18.16", + "@esbuild/freebsd-x64": "0.18.16", + "@esbuild/linux-arm": "0.18.16", + "@esbuild/linux-arm64": "0.18.16", + "@esbuild/linux-ia32": "0.18.16", + "@esbuild/linux-loong64": "0.18.16", + "@esbuild/linux-mips64el": "0.18.16", + "@esbuild/linux-ppc64": "0.18.16", + "@esbuild/linux-riscv64": "0.18.16", + "@esbuild/linux-s390x": "0.18.16", + "@esbuild/linux-x64": "0.18.16", + "@esbuild/netbsd-x64": "0.18.16", + "@esbuild/openbsd-x64": "0.18.16", + "@esbuild/sunos-x64": "0.18.16", + "@esbuild/win32-arm64": "0.18.16", + "@esbuild/win32-ia32": "0.18.16", + "@esbuild/win32-x64": "0.18.16" + } + }, + "esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, - "optional": true + "requires": { + "debug": "^4.3.4" + } }, - "@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", - "dev": true, - "optional": true + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, - "@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", - "dev": true, - "optional": true + "escape-html": { + "version": "1.0.3", + "dev": true }, - "@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", - "dev": true, - "optional": true + "escape-string-regexp": { + "version": "4.0.0" }, - "@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "optional": true + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true, + "optional": true + } + } }, - "@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, - "optional": true + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "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" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } }, - "@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "eslint-config-airbnb": { + "version": "19.0.4", "dev": true, - "optional": true + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } }, - "@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "eslint-config-airbnb-base": { + "version": "15.0.0", "dev": true, - "optional": true + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } }, - "@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", "dev": true, - "optional": true - }, - "@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true + "requires": { + "eslint-config-airbnb-base": "^15.0.0" + } }, - "@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "eslint-config-erb": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz", + "integrity": "sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ==", "dev": true, "requires": { - "@swc/counter": "^0.1.3" + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jest": "^27.4.0", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "dependencies": { + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + } + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "@tsconfig/node10": { - "version": "1.0.9", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, + "optional": true, "peer": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "eslint-import-resolver-typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", "dev": true, - "peer": true, "requires": { - "@babel/types": "^7.0.0" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" + }, + "dependencies": { + "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" + } + } } }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "eslint-import-resolver-webpack": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.9.tgz", + "integrity": "sha512-yGngeefNiHXau2yzKKs2BNON4HLpxBabY40BGL/vUSKZtqzjlVsTTZm57jhHULhm+mJEwKsEIIN3NXup5AiiBQ==", "dev": true, - "peer": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "hasown": "^2.0.0", + "interpret": "^1.4.0", + "is-core-module": "^2.13.1", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^2.0.0-next.5", + "semver": "^5.7.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } } }, - "@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, - "peer": true, "requires": { - "@babel/types": "^7.20.7" + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "eslint-plugin-compat": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", + "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==", "dev": true, "requires": { - "@types/ms": "*" + "@mdn/browser-compat-data": "^5.3.13", + "ast-metadata-inferer": "^0.8.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001524", + "find-up": "^5.0.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.5.4" } }, - "@types/eslint": { - "version": "8.44.2", + "eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, - "optional": true, - "peer": true, "requires": { - "@types/estree": "*", - "@types/json-schema": "*" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } } }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, - "peer": true, "requires": { - "@types/node": "*" + "@typescript-eslint/utils": "^5.10.0" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "peer": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", "dev": true, - "peer": true, "requires": { - "@types/istanbul-lib-coverage": "*" + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "dependencies": { + "axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true + } } }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "eslint-plugin-no-null": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz", + "integrity": "sha512-uRDiz88zCO/2rzGfgG15DBjNsgwWtWiSo4Ezy7zzajUgpnFIqd1TjepKeRmJZHEfBGu58o2a8S0D7vglvvhkVA==", "dev": true, - "peer": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.12", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "requires": {} }, - "@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "eslint-plugin-no-type-assertion": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-type-assertion/-/eslint-plugin-no-type-assertion-1.3.0.tgz", + "integrity": "sha512-04wuuIP5ptNzp969tTt0gf/Jsw4G0T5md2/nbgv3dRL/HySSNU7H4vIKNjkuno9T+6h2daj1T9Aki6bDgmXDEw==", "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "requires": {} }, - "@types/node": { - "version": "20.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", - "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "requires": { - "undici-types": "~6.19.2" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" } }, - "@types/prop-types": { - "version": "15.7.5", - "dev": true - }, - "@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } + "requires": {} }, - "@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "eslint-plugin-react": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", + "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", "dev": true, "requires": { - "@types/react": "*" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "peer": true - }, - "@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true + "requires": {} }, - "@types/webpack": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", - "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", + "eslint-plugin-storybook": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.9.0.tgz", + "integrity": "sha512-qOT/2vQBo0VqrG/BhZv8IdSsKQiyzJw+2Wqq+WFCiblI/PfxLSrGkF/buiXF+HumwfsCyBdaC94UhqhmYFmAvA==", "dev": true, "requires": { - "@types/node": "*", - "tapable": "^2.2.0", - "webpack": "^5" + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@storybook/csf": { + "version": "0.0.1", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + } } }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "eslint-scope": { + "version": "5.1.1", "dev": true, - "peer": true, "requires": { - "@types/yargs-parser": "*" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "dev": true + } } }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "peer": true + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true }, - "@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "dev": true - } + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, - "@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "esprima": { + "version": "4.0.1", + "dev": true + }, + "esquery": { + "version": "1.5.0", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" + "estraverse": "^5.1.0" } }, - "@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "esrecurse": { + "version": "4.3.0", "dev": true, "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "estraverse": "^5.2.0" } }, - "@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@types/estree": "^1.0.0" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + } } }, - "@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "esutils": { + "version": "2.0.3", "dev": true }, - "@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "dev": true + }, + "events": { + "version": "3.3.0", + "dev": true + }, + "evil": { + "version": "file:extensions/src/evil", + "requires": { + "typescript": "^5.4.5" + } + }, + "execa": { + "version": "5.1.1", "dev": true, "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "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" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } + "get-stream": { + "version": "6.0.1", + "dev": true + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + } + }, + "express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "dev": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "debug": { + "version": "2.6.9", "dev": true, "requires": { - "yallist": "^4.0.0" + "ms": "2.0.0" } }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "ms": { + "version": "2.0.0", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, - "@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "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": { - "yallist": "^4.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "os-tmpdir": "~1.0.2" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "extract-zip": { + "version": "2.0.1", "dev": true, "requires": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" } }, - "@ungap/structured-clone": { + "extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "optional": 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==" + }, + "fast-diff": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, + "fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==" + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "requires": { + "is-glob": "^4.0.1" + } + } } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", "dev": true }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "fast-json-stable-stringify": { + "version": "2.1.0", "dev": true }, - "@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "fast-levenshtein": { + "version": "2.0.6", "dev": true }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, + "fastest-levenshtein": { + "version": "1.0.16", + "dev": true + }, + "fastq": { + "version": "1.13.0", "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "reusify": "^1.0.4" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "faye-websocket": { + "version": "0.11.4", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "websocket-driver": ">=0.5.1" } }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { - "@xtuc/long": "4.2.2" + "bser": "2.1.1" } }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "fd-slicer": { + "version": "1.1.0", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "pend": "~1.2.0" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } } }, - "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "file-entry-cache": { + "version": "6.0.1", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "flat-cache": "^3.0.4" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "file-loader": { + "version": "6.2.0", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" } }, - "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, - "@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "requires": {} + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } }, - "@webpack-cli/info": { - "version": "2.0.2", + "finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "requires": {} + "requires": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "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" + } + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } }, - "@webpack-cli/serve": { - "version": "2.0.5", + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "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 + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } }, - "acorn": { - "version": "8.10.0", - "dev": true + "find-root": { + "version": "1.1.0" }, - "acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "find-up": { + "version": "5.0.0", "dev": true, - "requires": {} + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "find-yarn-workspace-root": { + "version": "2.0.0", "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "dev": true + "requires": { + "micromatch": "^4.0.2" + } }, - "ajv": { - "version": "6.12.6", + "fkill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fkill/-/fkill-9.0.0.tgz", + "integrity": "sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==", "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" + "aggregate-error": "^5.0.0", + "execa": "^8.0.1", + "pid-port": "^1.0.0", + "process-exists": "^5.0.0", + "ps-list": "^8.1.1", + "taskkill": "^5.0.0" + }, + "dependencies": { + "aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "requires": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + } + }, + "clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } } }, - "ajv-formats": { - "version": "2.1.1", + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { - "ajv": "^8.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "dependencies": { - "ajv": { - "version": "8.12.0", + "rimraf": { + "version": "3.0.2", "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" + "glob": "^7.1.3" } - }, - "json-schema-traverse": { - "version": "1.0.0", - "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-escapes": { - "version": "4.3.2", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true }, - "anymatch": { - "version": "3.1.3", + "for-each": { + "version": "0.3.3", "dev": true, - "peer": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "is-callable": "^1.1.3" } }, - "archiver": { - "version": "5.3.2", - "dev": true, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } } }, - "archiver-utils": { - "version": "2.1.0", + "fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" }, "dependencies": { - "glob": { - "version": "7.2.3", + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "isarray": { - "version": "1.0.0", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "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" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "safe-buffer": { - "version": "5.1.2", + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "arg": { - "version": "4.1.3", + "form-data": { + "version": "4.0.0", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", "dev": true }, - "argparse": { - "version": "2.0.1", + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "aria-query": { - "version": "5.3.0", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "fs-extra": { + "version": "8.1.0", "dev": true, "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "fs-minipass": { + "version": "2.1.0", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "minipass": "^3.0.0" } }, - "array-union": { - "version": "2.1.0", + "fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, - "array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } + "fs.realpath": { + "version": "1.0.0", + "dev": true }, - "array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "functions-have-names": "^1.2.3" } }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "functions-have-names": { + "version": "1.2.3", + "dev": true + }, + "gauge": { + "version": "4.0.4", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, - "array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "gensync": { + "version": "1.0.0-beta.2", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true + }, + "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==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "get-package-type": { + "version": "0.1.0", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, - "ast-metadata-inferer": { - "version": "0.8.0", + "get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, "requires": { - "@mdn/browser-compat-data": "^5.2.34" + "resolve-pkg-maps": "^1.0.0" } }, - "ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "astral-regex": { + "github-slugger": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { - "possible-typed-array-names": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "glob-parent": { + "version": "6.0.2", + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", "dev": true }, - "axobject-query": { - "version": "3.2.1", + "global-agent": { + "version": "3.0.0", "dev": true, + "optional": true, "requires": { - "dequal": "^2.0.3" + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" } }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "global-modules": { + "version": "2.0.0", "dev": true, - "peer": true, "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "global-prefix": "^3.0.0" } }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "global-prefix": { + "version": "3.0.0", "dev": true, - "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "which": { + "version": "1.3.1", "dev": true, - "peer": true, "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "isexe": "^2.0.0" } } } }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "peer": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "globalthis": { + "version": "1.0.3", "dev": true, - "peer": true, "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "define-properties": "^1.1.3" } }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "globby": { + "version": "11.1.0", "dev": true, - "peer": true, "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, - "balanced-match": { - "version": "1.0.2", - "dev": true - }, - "base64-js": { - "version": "1.5.1", + "globjoin": { + "version": "0.1.4", "dev": true }, - "binary-searching": { - "version": "2.0.5", + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, - "bl": { - "version": "4.1.0", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "gopd": { + "version": "1.0.1", "dev": true, - "peer": true, "requires": { - "node-int64": "^0.4.0" + "get-intrinsic": "^1.1.3" } }, - "buffer": { - "version": "5.7.1", + "got": { + "version": "11.8.6", "dev": true, "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, - "buffer-crc32": { - "version": "0.2.13", - "dev": true + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "buffer-from": { - "version": "1.1.2", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + }, + "gzip-size": { + "version": "6.0.0", "dev": true, "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "duplexer": "^0.1.2" } }, - "callsites": { - "version": "3.1.0", + "handle-thing": { + "version": "2.0.1", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true - }, - "caniuse-lite": { - "version": "1.0.30001666", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", - "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", + "harmony-reflect": { + "version": "1.6.2", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "has": { + "version": "1.0.3", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } + "function-bind": "^1.1.1" } }, - "char-regex": { + "has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0" + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "peer": true + "requires": { + "es-define-property": "^1.0.0" + } }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, - "chardet": { - "version": "0.7.0", + "has-symbols": { + "version": "1.0.3", "dev": true }, - "chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "readdirp": "^4.0.1" + "has-symbols": "^1.0.3" } }, - "chrome-trace-event": { - "version": "1.0.3", + "has-unicode": { + "version": "2.0.1", "dev": true }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "peer": true + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", "dev": true, - "peer": true + "requires": { + "@types/hast": "^3.0.0" + } }, - "cli-cursor": { - "version": "3.1.0", + "hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "@types/hast": "^3.0.0" } }, - "cli-spinners": { - "version": "2.9.0", - "dev": true + "hast-util-to-html": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.2.tgz", + "integrity": "sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==", + "dev": true, + "requires": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + } + }, + "hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "requires": { + "@types/hast": "^3.0.0" + } }, - "cli-width": { + "hast-util-whitespace": { "version": "3.0.0", - "dev": true - }, - "cliui": { - "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "@types/hast": "^3.0.0" } }, - "clone": { - "version": "1.0.4", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "dev": true, + "hello-someone": { + "version": "file:extensions/src/hello-someone", "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } + }, + "hello-world": { + "version": "file:extensions/src/hello-world", + "requires": { + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "requires": { + "react-is": "^16.7.0" }, "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "react-is": { + "version": "16.13.1" } } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "peer": true + "requires": { + "lru-cache": "^6.0.0" + } }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "hpack.js": { + "version": "2.1.6", "dev": true, - "peer": true + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "html-encoding-sniffer": { + "version": "3.0.0", "dev": true, "requires": { - "color-name": "1.1.3" + "whatwg-encoding": "^2.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true }, - "colord": { - "version": "2.9.3", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "colorette": { - "version": "2.0.20", - "dev": true + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "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==", + "html-tags": { + "version": "3.3.1", "dev": true }, - "comment-parser": { - "version": "1.4.1", + "html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true }, - "compress-commons": { - "version": "4.1.1", + "html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" } }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "concurrently": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", - "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "requires": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "confusing-browser-globals": { - "version": "1.0.11", + "http-cache-semantics": { + "version": "4.1.1", "dev": true }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "peer": true + "http-deceiver": { + "version": "1.2.7", + "dev": true }, - "copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "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==", "dev": true, "requires": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "ajv": { - "version": "8.12.0", - "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", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "dev": true - }, - "path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "schema-utils": { - "version": "4.2.0", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, - "core-util-is": { + "http-parser-js": { + "version": "0.5.6", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.4", + "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" + } + }, + "http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "http2-wrapper": { "version": "1.0.3", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", "dev": true }, - "cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "humanize-ms": { + "version": "1.2.1", "dev": true, "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "ms": "^2.0.0" } }, - "crc-32": { - "version": "1.2.2", + "husky": { + "version": "8.0.3", "dev": true }, - "crc32-stream": { - "version": "4.0.2", + "hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true + }, + "iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, + "optional": true, "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" } }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "iconv-lite": { + "version": "0.6.3", "dev": true, - "peer": true, "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "dev": true + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" } }, - "create-require": { - "version": "1.1.1", + "immediate": { + "version": "3.0.6" + }, + "immutable": { + "version": "4.0.0", "dev": true }, - "cross-env": { - "version": "7.0.3", + "import-fresh": { + "version": "3.3.0", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "3.0.0", "dev": true, "requires": { - "cross-spawn": "^7.0.1" + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "dev": true + } } }, - "cross-spawn": { - "version": "7.0.3", + "import-local": { + "version": "3.1.0", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, - "css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "imurmurhash": { + "version": "0.1.4" + }, + "indent-string": { + "version": "4.0.0", "dev": true }, - "css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "infer-owner": { + "version": "1.0.4", + "dev": true + }, + "inflight": { + "version": "1.0.6", "dev": true, "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "ini": { + "version": "1.3.8", + "dev": true + }, + "inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "dev": true } } }, - "css-tree": { - "version": "2.3.1", + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "interpret": { + "version": "1.4.0", "dev": true }, - "csstype": { - "version": "3.1.2", + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + } + }, + "ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true }, - "damerau-levenshtein": { - "version": "1.0.8", + "is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", "dev": true }, - "data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "is-arguments": { + "version": "1.1.1", "dev": true, "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" } }, - "data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "is-arrayish": { + "version": "0.2.1" + }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "is-bigint": { + "version": "1.0.4", "dev": true, "requires": { - "ms": "^2.1.3" + "has-bigints": "^1.0.1" } }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "is-binary-path": { + "version": "2.1.0", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", "dev": true, "requires": { - "character-entities": "^2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", "dev": true, - "peer": true, - "requires": {} + "requires": { + "semver": "^7.6.3" + } }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "is-callable": { + "version": "1.2.7", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" } }, - "deep-is": { - "version": "0.1.4", + "is-docker": { + "version": "2.2.1", "dev": true }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "peer": true + "is-extglob": { + "version": "2.1.1" }, - "defaults": { - "version": "1.0.4", + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "requires": { - "clone": "^1.0.2" + "call-bind": "^1.0.2" } }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "is-fullwidth-code-point": { + "version": "3.0.0" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "is-glob": { + "version": "4.0.3", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "is-docker": "^3.0.0" + }, + "dependencies": { + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + } } }, - "dequal": { + "is-interactive": { + "version": "1.0.0", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "dev": true + }, + "is-map": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "peer": true + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true }, - "devlop": { + "is-network-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", "dev": true, "requires": { - "dequal": "^2.0.0" + "has-tostringtag": "^1.0.0" } }, - "diff": { - "version": "4.0.2", + "is-path-inside": { + "version": "3.0.3", "dev": true }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "peer": true + "is-plain-obj": { + "version": "3.0.0", + "dev": true }, - "dir-glob": { - "version": "3.0.1", + "is-plain-object": { + "version": "2.0.4", "dev": true, "requires": { - "path-type": "^4.0.0" + "isobject": "^3.0.1" } }, - "doctrine": { - "version": "3.0.0", + "is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true + }, + "is-regex": { + "version": "1.1.4", "dev": true, "requires": { - "esutils": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.646", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.646.tgz", - "integrity": "sha512-vThkQ0JuF45qT/20KbRgM56lV7IuGt7SjhawQ719PDHzhP84KAO1WJoaxgCoAffKHK47FmVKP1Fqizx7CwK1SA==", + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "peer": true + "requires": { + "call-bind": "^1.0.7" + } }, - "emoji-regex": { - "version": "9.2.2", + "is-stream": { + "version": "2.0.1", "dev": true }, - "end-of-stream": { - "version": "1.4.4", + "is-string": { + "version": "1.0.7", "dev": true, "requires": { - "once": "^1.4.0" + "has-tostringtag": "^1.0.0" } }, - "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "is-symbol": { + "version": "1.0.4", "dev": true, "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "has-symbols": "^1.0.2" } }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-unicode-supported": { + "version": "0.1.0", "dev": true }, - "envinfo": { - "version": "7.10.0", + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true }, - "error-ex": { - "version": "1.3.2", + "is-weakref": { + "version": "1.0.2", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "call-bind": "^1.0.2" } }, - "es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "get-intrinsic": "^1.2.4" + } + }, + "is-wsl": { + "version": "2.2.0", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0" + }, + "isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "dev": true + }, + "isexe": { + "version": "2.0.0" + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { - "get-intrinsic": "^1.2.4" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + } } }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "requires": { - "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "es-module-lexer": { - "version": "1.3.0", - "dev": true + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } }, - "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "requires": { - "es-errors": "^1.3.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" } }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" } }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { - "hasown": "^2.0.0" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" } }, - "es-to-primitive": { - "version": "1.2.1", + "jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "requires": {} + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } } }, - "escalade": { - "version": "3.1.1", - "dev": true - }, - "escape-string-regexp": { - "version": "5.0.0", - "dev": true + "jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + } }, - "eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, - "eslint-scope": { - "version": "7.2.2", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } + } + } + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true }, - "globals": { - "version": "13.21.0", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "type-fest": "^0.20.2" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } - }, - "has-flag": { - "version": "4.0.0", + } + } + }, + "jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, - "supports-color": { - "version": "7.2.0", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } - }, - "type-fest": { - "version": "0.20.2", - "dev": true } } }, - "eslint-config-airbnb": { - "version": "19.0.4", + "jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "dependencies": { + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + } } }, - "eslint-config-airbnb-base": { - "version": "15.0.0", + "jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "dependencies": { + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + } } }, - "eslint-config-airbnb-typescript": { - "version": "17.1.0", + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true + }, + "jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^15.0.0" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "dependencies": { + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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" + } + } } }, - "eslint-config-erb": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz", - "integrity": "sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ==", + "jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jest": "^27.4.0", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "dependencies": { - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, - "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } + } + } + }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "language-subtag-registry": "~0.3.2" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } } } }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { - "debug": { - "version": "3.2.7", + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } } } }, - "eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true + }, + "jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" } }, - "eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" } }, - "eslint-plugin-compat": { - "version": "4.2.0", + "jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@mdn/browser-compat-data": "^5.3.13", - "ast-metadata-inferer": "^0.8.0", - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001524", - "find-up": "^5.0.0", - "lodash.memoize": "^4.1.2", - "semver": "^7.5.4" + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { - "yallist": "^4.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" } }, - "semver": { - "version": "7.5.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.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "yallist": { - "version": "4.0.0", - "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" + } } } }, - "eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "requires": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { - "minimist": "^1.2.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + } + } + }, + "jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } } } }, - "eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { - "@typescript-eslint/utils": "^5.10.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "dependencies": { - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "supports-color": { + "version": "8.1.1", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "has-flag": "^4.0.0" } - }, - "axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true } } }, - "eslint-plugin-no-null": { - "version": "1.0.2", - "dev": true, - "requires": {} + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" }, - "eslint-plugin-no-type-assertion": { - "version": "1.3.0", - "dev": true, - "requires": {} + "js-tokens": { + "version": "4.0.0" }, - "eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, + "js-yaml": { + "version": "4.1.0", "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "argparse": "^2.0.1" } }, - "eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "dev": true, - "requires": {} + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true }, - "eslint-plugin-react": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", - "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true + }, + "jsdom": { + "version": "20.0.3", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + }, + "json-buffer": { + "version": "3.0.1", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1" + }, + "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==" + }, + "json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dev": true, "requires": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" }, "dependencies": { - "doctrine": { - "version": "2.1.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true } } }, - "eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "requires": {} + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "optional": true + }, + "json5": { + "version": "2.2.3", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } }, - "eslint-scope": { - "version": "5.1.1", + "keyboardevent-from-electron-accelerator": { + "version": "2.0.0" + }, + "keyboardevents-areequal": { + "version": "0.2.2" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "dev": true - } + "json-buffer": "3.0.1" } }, - "eslint-visitor-keys": { - "version": "3.4.3", + "kind-of": { + "version": "6.0.3", "dev": true }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "klaw-sync": { + "version": "6.0.0", "dev": true, "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "graceful-fs": "^4.1.11" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "peer": true + "requires": { + "language-subtag-registry": "^0.3.20" + } }, - "esquery": { - "version": "1.5.0", + "launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "requires": { - "estraverse": "^5.1.0" + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, - "esrecurse": { - "version": "4.3.0", + "lazy-val": { + "version": "1.0.5" + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "requires": { - "estraverse": "^5.2.0" + "readable-stream": "^2.0.5" } }, - "estraverse": { - "version": "5.3.0", + "legacy-comment-manager": { + "version": "file:extensions/src/legacy-comment-manager", + "requires": { + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.3.3", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, - "esutils": { - "version": "2.0.3", + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lexical": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.17.1.tgz", + "integrity": "sha512-72/MhR7jqmyqD10bmJw8gztlCm4KDDT+TPtU4elqXrEvHoO5XENi34YAEUD9gIkPfqSwyLa9mwAX1nKzIr5xEA==", "dev": true }, - "events": { + "lib0": { + "version": "0.2.97", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.97.tgz", + "integrity": "sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==", + "dev": true, + "requires": { + "isomorphic.js": "^0.2.4" + } + }, + "lie": { "version": "3.3.0", - "dev": true + "requires": { + "immediate": "~3.0.5" + } }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "lilconfig": { + "version": "2.1.0" + }, + "lines-and-columns": { + "version": "1.2.4" + }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, - "peer": 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" + "uc.micro": "^2.0.0" + } + }, + "lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "requires": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" }, "dependencies": { - "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==", + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, - "peer": true + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, - "peer": true + "requires": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + } + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + } + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, + "loader-runner": { + "version": "4.2.0", + "dev": true }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "loader-utils": { + "version": "2.0.4", "dev": true, - "peer": true, "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "external-editor": { - "version": "3.1.0", + "locate-path": { + "version": "6.0.0", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "p-locate": "^5.0.0" } }, - "fast-deep-equal": { - "version": "3.1.3", + "lodash": { + "version": "4.17.21" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } + "lodash.difference": { + "version": "4.5.0", + "dev": true }, - "fast-json-stable-stringify": { - "version": "2.1.0", + "lodash.escaperegexp": { + "version": "4.1.2" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", + "lodash.isequal": { + "version": "4.5.0" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, - "fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "lodash.memoize": { + "version": "4.1.2", "dev": true }, - "fastest-levenshtein": { - "version": "1.0.16", + "lodash.merge": { + "version": "4.6.2", "dev": true }, - "fastq": { - "version": "1.15.0", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", "dev": true, - "peer": true, "requires": { - "bser": "2.1.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, - "figures": { - "version": "3.2.0", + "log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", + "ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "requires": { + "environment": "^1.0.0" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "requires": { + "restore-cursor": "^5.0.0" + } + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.0.0" + } + }, + "onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "requires": { + "mimic-function": "^5.0.0" + } + }, + "restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "requires": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true + }, + "slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + } + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } } } }, - "file-entry-cache": { - "version": "6.0.1", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.1.0", - "dev": true, - "requires": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "dev": true, + "loose-envify": { + "version": "1.4.0", "requires": { - "is-callable": "^1.1.3" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "foreground-child": { + "loupe": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "get-func-name": "^2.0.1" } }, - "fs-constants": { - "version": "1.0.0", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true, - "peer": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" } }, - "functions-have-names": { - "version": "1.2.3", + "lowercase-keys": { + "version": "2.0.0", "dev": true }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "lru-cache": { + "version": "6.0.0", "dev": true, - "peer": true + "requires": { + "yallist": "^4.0.0" + } }, - "get-caller-file": { - "version": "2.0.5", + "lucide-react": { + "version": "0.367.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.367.0.tgz", + "integrity": "sha512-3FWiBaJiqMrx5a1sjH3CVdPqWnw/Z/PTVeeTDmOeILSs+8Ah+VhCd4FQMeHo6Z0WxHcm9piIOtilQwvceiCCKQ==", + "requires": {} + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true + }, + "magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "peer": true + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "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, - "peer": true + "make-error": { + "version": "1.3.6", + "devOptional": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } + } }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "tmpl": "1.0.5" } }, - "get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true + }, + "markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "requires": { - "resolve-pkg-maps": "^1.0.0" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" } }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "markdown-to-jsx": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz", + "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==", + "dev": true, + "requires": {} + }, + "matcher": { + "version": "3.0.0", "dev": true, + "optional": true, "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "escape-string-regexp": "^4.0.0" } }, - "glob-parent": { - "version": "6.0.2", + "mathml-tag-names": { + "version": "2.1.3", + "dev": true + }, + "mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" } }, - "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==", + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, - "global-modules": { + "mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "global-prefix": "^3.0.0" + "fs-monkey": "^1.0.4" } }, - "global-prefix": { - "version": "3.0.0", + "memoize-one": { + "version": "6.0.0" + }, + "memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", "dev": true, "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "map-or-similar": "^1.5.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true + "memory-fs": { + "version": "0.2.0", + "dev": true }, - "globalthis": { + "merge-descriptors": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "dev": true + }, + "merge2": { + "version": "1.4.1" + }, + "methods": { + "version": "1.1.2", + "dev": true + }, + "micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "dev": true, "requires": { - "define-properties": "^1.1.3" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "globby": { - "version": "11.1.0", + "micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true + }, + "micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "globjoin": { - "version": "0.1.4", + "micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "dev": true }, - "gopd": { - "version": "1.0.1", - "dev": true, + "micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "get-intrinsic": "^1.1.3" + "braces": "^3.0.3", + "picomatch": "^2.3.1" } }, - "graceful-fs": { - "version": "4.2.11", + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, - "graphemer": { - "version": "1.4.0", + "mime-db": { + "version": "1.52.0", "dev": true }, - "has": { - "version": "1.0.3", + "mime-types": { + "version": "2.1.35", "dev": true, "requires": { - "function-bind": "^1.1.1" + "mime-db": "1.52.0" } }, - "has-bigints": { - "version": "1.0.2", + "mimic-fn": { + "version": "2.1.0", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "mimic-response": { + "version": "1.0.1", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "dev": true + }, + "minimatch": { + "version": "3.1.2", "dev": true, "requires": { - "es-define-property": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true + "minimist": { + "version": "1.2.6" }, - "has-symbols": { - "version": "1.0.3", - "dev": true + "minipass": { + "version": "3.3.4", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } }, - "has-tostringtag": { + "minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.3" + "minipass": "^3.0.0" } }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "minipass-fetch": { + "version": "2.1.2", "dev": true, "requires": { - "function-bind": "^1.1.2" + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "minipass-flush": { + "version": "1.0.5", "dev": true, - "peer": true - }, - "html-tags": { - "version": "3.3.1", - "dev": true + "requires": { + "minipass": "^3.0.0" + } }, - "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==", + "minipass-pipeline": { + "version": "1.2.4", "dev": true, - "peer": true + "requires": { + "minipass": "^3.0.0" + } }, - "iconv-lite": { - "version": "0.4.24", + "minipass-sized": { + "version": "1.0.3", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "minipass": "^3.0.0" } }, - "icss-utils": { - "version": "5.1.0", + "minizlib": { + "version": "2.1.2", "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "dev": true + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true + "mkdirp": { + "version": "0.5.6", + "requires": { + "minimist": "^1.2.6" + } }, - "immutable": { - "version": "4.3.4", + "mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } + "ms": { + "version": "2.1.2" }, - "import-local": { - "version": "3.1.0", + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" } }, - "imurmurhash": { - "version": "0.1.4", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "inflight": { - "version": "1.0.6", - "dev": true, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "inherits": { - "version": "2.0.4", + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + }, + "natural-compare": { + "version": "1.4.0", "dev": true }, - "ini": { - "version": "1.3.8", + "negotiator": { + "version": "0.6.3", "dev": true }, - "inquirer": { - "version": "8.2.6", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } + "neo-async": { + "version": "2.6.2", + "dev": true }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } + "next-themes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", + "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", + "requires": {} }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "semver": "^7.3.5" } }, - "is-arrayish": { - "version": "0.2.1", + "node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } + "optional": true }, - "is-bigint": { - "version": "1.0.4", + "node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", "dev": true, "requires": { - "has-bigints": "^1.0.1" + "semver": "^7.3.5" } }, - "is-boolean-object": { - "version": "1.1.2", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true }, - "is-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "node-gyp": { + "version": "9.3.1", "dev": true, "requires": { - "semver": "^7.6.3" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, - "is-callable": { - "version": "1.2.7", + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "node-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", + "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", "dev": true, "requires": { - "hasown": "^2.0.2" + "loader-utils": "^2.0.0" } }, - "is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "node-localstorage": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-3.0.5.tgz", + "integrity": "sha512-GCwtK33iwVXboZWYcqQHu3aRvXEBwmPkAMRBLeaX86ufhqslyUkLGsi4aW3INEfdQYpUB5M9qtYf3eHvAk2VBg==", + "requires": { + "write-file-atomic": "^5.0.1" + } + }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", "dev": true, "requires": { - "is-typed-array": "^1.1.13" + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "is-date-object": { - "version": "1.0.5", + "nopt": { + "version": "6.0.0", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "abbrev": "^1.0.0" } }, - "is-extglob": { - "version": "2.1.1", + "normalize-path": { + "version": "3.0.0" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-url": { + "version": "6.1.0", "dev": true }, - "is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "npm-normalize-package-bin": "^1.0.1" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", "dev": true, - "peer": true + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "npm-run-path": { + "version": "4.0.1", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "path-key": "^3.0.0" } }, - "is-glob": { - "version": "4.0.3", + "npmlog": { + "version": "6.0.2", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" } }, - "is-interactive": { - "version": "1.0.0", - "dev": true - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "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-number-object": { - "version": "1.0.7", + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "boolbase": "^1.0.0" } }, - "is-path-inside": { - "version": "3.0.3", + "nwsapi": { + "version": "2.2.2", "dev": true }, - "is-plain-object": { - "version": "5.0.0", - "dev": true + "object-assign": { + "version": "4.1.1" }, - "is-regex": { - "version": "1.1.4", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "object-is": { + "version": "1.1.5", "dev": true, "requires": { - "call-bind": "^1.0.7" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "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, - "peer": true + "object-keys": { + "version": "1.1.1", + "dev": true }, - "is-string": { - "version": "1.0.7", + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "is-symbol": { - "version": "1.0.4", + "object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "which-typed-array": "^1.1.14" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, - "is-unicode-supported": { - "version": "0.1.0", - "dev": true - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, - "is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "isarray": { - "version": "2.0.5", - "dev": true - }, - "isexe": { - "version": "2.0.0", + "objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", "dev": true }, - "isobject": { - "version": "3.0.1", + "obuf": { + "version": "1.1.2", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "peer": true - }, - "istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "peer": true, "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - } + "ee-first": "1.1.1" } }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "on-headers": { + "version": "1.0.2", + "dev": true + }, + "once": { + "version": "1.4.0", "dev": true, - "peer": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "requires": { + "wrappy": "1" } }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "onetime": { + "version": "5.1.2", "dev": true, - "peer": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "mimic-fn": "^2.1.0" } }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "oniguruma-to-js": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.0.tgz", + "integrity": "sha512-GwNFPQygkpDjO9MOr54Rqi01dGS+h9VAS//Qxz9lTN5B09CxqiIc7rydvdV+Ex2Z8Vk+zqfHH7hU6ePn8uf+Mg==", "dev": true, - "peer": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "regex": "^4.3.2" } }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "opener": { + "version": "1.5.2", + "dev": true + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" } }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "ora": { + "version": "5.4.1", "dev": true, - "peer": true, "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" } }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "os-tmpdir": { + "version": "1.0.2", + "dev": true + }, + "p-cancelable": { + "version": "2.1.1", + "dev": true + }, + "p-limit": { + "version": "3.1.0", "dev": true, - "peer": true, "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "yocto-queue": "^0.1.0" } }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "p-locate": { + "version": "5.0.0", "dev": true, - "peer": true, "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "p-limit": "^3.0.2" } }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "p-map": { + "version": "4.0.0", "dev": true, - "peer": true, "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "requires": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true } } }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "peer": true, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "pako": { + "version": "1.0.11" + }, + "papi-dts": { + "version": "file:lib/papi-dts", "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "escape-string-regexp": "^5.0.0", + "platform-bible-utils": "file:../platform-bible-utils", + "rimraf": "^6.0.1", + "typedoc": "^0.26.7", + "typescript": "^5.4.5" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "paranext-extensions": { + "version": "file:extensions", + "requires": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.10", + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "glob": "^10.3.12", + "papi-dts": "file:../lib/papi-dts", + "platform-bible-react": "file:../lib/platform-bible-react", + "platform-bible-utils": "file:../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "replace-in-file": "^7.1.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.7.1", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-folder-promise": "^1.2.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "balanced-match": "^1.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true }, "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, - "peer": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" } }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "brace-expansion": "^2.0.1" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, + "stylelint-config-sass-guidelines": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", + "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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, - "peer": true, "requires": { - "color-name": "~1.1.4" + "has-flag": "^4.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" } } } }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "parent-module": { + "version": "1.0.1", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.2", "dev": true, - "peer": true, "requires": { - "detect-newline": "^3.0.0" + "entities": "^4.4.0" } }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "parseurl": { + "version": "1.3.3", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, - "peer": true, "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "fs-extra": { + "version": "9.1.0", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "jsonfile": { + "version": "6.1.0", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "open": { + "version": "7.4.2", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "rimraf": { + "version": "2.7.1", "dev": true, - "peer": true + "requires": { + "glob": "^7.1.3" + } }, - "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, - "peer": true + "slash": { + "version": "2.0.0", + "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "tmp": { + "version": "0.0.33", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "os-tmpdir": "~1.0.2" } + }, + "universalify": { + "version": "2.0.0", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "dev": true } } }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true + "path-exists": { + "version": "4.0.0", + "dev": true }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } + "path-is-absolute": { + "version": "1.0.1", + "dev": true }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "peer": true, + "path-key": { + "version": "3.1.1" + }, + "path-parse": { + "version": "1.0.7" + }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" + }, + "minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==" + } } }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true + }, + "path-type": { + "version": "4.0.0" + }, + "pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "dev": true + }, + "picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "picomatch": { + "version": "2.3.1" + }, + "pid-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-1.0.0.tgz", + "integrity": "sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==", "dev": true, - "peer": true, "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "execa": "^8.0.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "path-key": "^4.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "mimic-fn": "^4.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { + "path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true } } }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "pidtree": { + "version": "0.6.0", + "dev": true + }, + "pify": { + "version": "4.0.1", + "dev": true + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, + "pkg-dir": { + "version": "4.2.0", "dev": true, - "peer": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "find-up": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "find-up": { + "version": "4.1.0", "dev": true, - "peer": true, "requires": { - "color-convert": "^2.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "locate-path": { + "version": "5.0.0", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-locate": "^4.1.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "p-limit": { + "version": "2.3.0", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "p-try": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "p-locate": { + "version": "4.1.0", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "p-limit": "^2.2.0" } } } }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "peer": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "peer": true, + "platform-bible-react": { + "version": "file:lib/platform-bible-react", "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "@babel/preset-env": "^7.25.7", + "@babel/preset-react": "^7.25.7", + "@babel/preset-typescript": "^7.25.7", + "@emotion/react": ">=11.11.4", + "@emotion/styled": ">=11.11.0", + "@mui/icons-material": "^5.15.10", + "@mui/material": ">=5.15.10", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-radio-group": "^1.2.0", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.1.0", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.2.1", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-toggle-group": "^1.1.0", + "@senojs/rollup-plugin-style-inject": "^0.2.3", + "@tanstack/react-table": "^8.19.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.13", + "@types/react": "^18.3.11", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react": "^4.3.2", + "autoprefixer": "^10.4.19", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "cmdk": "^1.0.0", + "dts-bundle-generator": "^9.5.1", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "lucide-react": "^0.367.0", + "next-themes": "^0.3.0", + "platform-bible-utils": "file:../platform-bible-utils", + "prettier": "^3.3.3", + "prettier-plugin-jsdoc": "^1.3.0", + "prettier-plugin-tailwindcss": "^0.6.1", + "react-data-grid": ">=7.0.0-beta.42", + "sonner": "^1.5.0", + "stylelint": "^16.9.0", + "stylelint-config-recommended": "^14.0.1", + "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-tailwindcss": "^0.0.7", + "tailwind-merge": "^2.2.2", + "tailwindcss": "^3.4.3", + "tailwindcss-animate": "^1.0.7", + "tailwindcss-scoped-preflight": "^2.1.0", + "ts-jest": "^29.2.5", + "tslib": "^2.7.0", + "typedoc": "^0.26.7", + "typescript": "^5.4.5", + "vite": "^4.5.5", + "vite-tsconfig-paths": "^4.3.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } + "@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, + "@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "requires": {} + }, + "@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, + "@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", "requires": { - "color-name": "~1.1.4" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true + "@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "requires": {} }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, + "@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", "requires": { - "has-flag": "^4.0.0" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "peer": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + }, + "@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "requires": { - "color-convert": "^2.0.1" + "@radix-ui/react-use-layout-effect": "1.1.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, + "@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, + "@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", "requires": { - "color-name": "~1.1.4" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, + "@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "requires": { - "has-flag": "^4.0.0" + "@radix-ui/react-slot": "1.1.0" } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + }, + "@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "requires": { - "color-convert": "^2.0.1" + "@radix-ui/react-compose-refs": "1.1.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@radix-ui/react-use-callback-ref": "1.1.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, + "@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "requires": { - "color-name": "~1.1.4" + "@radix-ui/react-use-callback-ref": "1.1.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "requires": {} + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "peer": true + "requires": {} }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, - "peer": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.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==", + "react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "requires": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "stylelint-config-sass-guidelines": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", + "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", "dev": true, - "peer": true + "requires": { + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" } + }, + "tailwindcss-scoped-preflight": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss-scoped-preflight/-/tailwindcss-scoped-preflight-2.2.0.tgz", + "integrity": "sha512-OfFjMrB1fyDPgujX21pw4EwVMT/WIJdxpVq2AKTkTzAYdu5nuVxP0OFxz7UVCVTKOoY3KYKJ3fKHPvx1METt1w==", + "dev": true, + "requires": {} } } }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "peer": true, + "platform-bible-utils": { + "version": "file:lib/platform-bible-utils", "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "@types/jest": "^29.5.13", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "async-mutex": "^0.4.1", + "dts-bundle-generator": "^9.5.1", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "prettier-plugin-jsdoc": "^1.3.0", + "stringz": "^2.1.0", + "tslib": "^2.7.0", + "typedoc": "^0.26.7", + "typescript": "^5.4.5", + "vite": "^5.4.8" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } + "optional": true }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "optional": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } + "optional": true }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "dev": true, - "peer": true + "optional": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "dev": true, - "peer": true + "optional": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } + "optional": true }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } + "optional": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "optional": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "dev": true, - "peer": true - } - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } + "optional": true }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "optional": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } + "optional": true }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "dev": true, - "peer": true + "optional": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "dev": true, - "peer": true + "optional": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } + "optional": true }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "dev": true, - "peer": true + "optional": true }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, - "peer": true, "requires": { - "color-name": "~1.1.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, - "peer": true + "requires": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@types/estree": "1.0.6", + "fsevents": "~2.3.2" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, - "peer": true + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "vite": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, - "peer": true, "requires": { - "has-flag": "^4.0.0" + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" } } } }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "platform-scripture": { + "version": "file:extensions/src/platform-scripture", + "requires": { + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } + }, + "platform-scripture-editor": { + "version": "file:extensions/src/platform-scripture-editor", + "requires": { + "@biblionexus-foundation/platform-editor": "^0.6.3", + "@biblionexus-foundation/scripture-utilities": "^0.0.4", + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } + }, + "plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "polished": { + "version": "4.2.2", + "dev": true, + "requires": { + "@babel/runtime": "^7.17.8" + } + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + } + }, + "postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", + "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", + "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.2" + } + }, + "postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true, - "peer": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "dev": true, + "requires": {} + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "peer": true, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "dependencies": { - "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, - "peer": true + "lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==" }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } + "yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==" } } }, - "js-tokens": { - "version": "4.0.0" + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true }, - "js-yaml": { - "version": "4.1.0", + "postcss-merge-longhand": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", + "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", "dev": true, "requires": { - "argparse": "^2.0.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.4" } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "postcss-merge-rules": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", "dev": true, - "peer": true + "requires": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.2" + } }, - "json-buffer": { - "version": "3.0.1", - "dev": true + "postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true + "postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "dev": true, + "requires": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true + "postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true + "postcss-minify-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", + "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.2" + } }, - "json5": { - "version": "2.2.3", - "dev": true + "postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "requires": {} }, - "jsx-ast-utils": { - "version": "3.3.5", + "postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "requires": { - "json-buffer": "3.0.1" + "postcss-selector-parser": "^6.0.4" } }, - "kind-of": { - "version": "6.0.3", - "dev": true + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", "dev": true, - "peer": true + "requires": {} }, - "known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true + "postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true + "postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } }, - "language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", "dev": true, "requires": { - "language-subtag-registry": "^0.3.20" + "postcss-value-parser": "^4.2.0" } }, - "lazystream": { - "version": "1.0.1", + "postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", "dev": true, "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "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", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", "dev": true, - "peer": true + "requires": { + "postcss-value-parser": "^4.2.0" + } }, - "levn": { - "version": "0.4.1", + "postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", "dev": true, "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "postcss-value-parser": "^4.2.0" } }, - "lines-and-columns": { - "version": "1.2.4", - "dev": true + "postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "dev": true, + "requires": { + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } }, - "loader-runner": { - "version": "4.3.0", - "dev": true + "postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + } }, - "locate-path": { - "version": "6.0.0", + "postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", "dev": true, "requires": { - "p-locate": "^5.0.0" + "postcss-value-parser": "^4.2.0" } }, - "lodash": { - "version": "4.17.21", + "postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, - "lodash.defaults": { - "version": "4.2.0", - "dev": true + "postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "requires": {} }, - "lodash.difference": { - "version": "4.5.0", - "dev": true + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } }, - "lodash.flatten": { - "version": "4.4.0", - "dev": true + "postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + } }, - "lodash.isplainobject": { - "version": "4.0.6", - "dev": true + "postcss-unique-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", + "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.2" + } }, - "lodash.memoize": { - "version": "4.1.2", - "dev": true + "postcss-value-parser": { + "version": "4.2.0" }, - "lodash.merge": { - "version": "4.6.2", + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true }, - "lodash.union": { - "version": "4.6.0", - "dev": true + "prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } }, - "log-symbols": { - "version": "4.1.0", + "prettier-plugin-jsdoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.0.tgz", + "integrity": "sha512-cQm8xIa0fN9ieJFMXACQd6JPycl+8ouOijAqUqu44EF/s4fXL3Wi9sKXuEaodsEWgCN42Xby/bNhqgM1iWx4uw==", "dev": true, "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "binary-searching": "^2.0.5", + "comment-parser": "^1.4.0", + "mdast-util-from-markdown": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", + "mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" } }, - "chalk": { - "version": "4.1.2", + "mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/mdast": "^4.0.0" } }, - "color-convert": { + "micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "dev": true, + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "dev": true, + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "dev": true, + "requires": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "micromark-util-symbol": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "dev": true + "micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } }, - "has-flag": { - "version": "4.0.0", + "micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "dev": true }, - "supports-color": { - "version": "7.2.0", + "micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "dev": true, + "requires": { + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } } } }, - "loose-envify": { - "version": "1.4.0", + "prettier-plugin-tailwindcss": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.1.tgz", + "integrity": "sha512-AnbeYZu0WGj+QgKciUgdMnRxrqcxltleZPgdwfA5104BHM3siBLONN/HLW1yS2HvzSNkzpQ/JAj+LN0jcJO+0w==", + "dev": true, + "requires": {} + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, - "peer": true, "requires": { - "yallist": "^3.0.2" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-5.0.0.tgz", + "integrity": "sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA==", + "dev": true, + "requires": { + "ps-list": "^8.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1" + }, + "progress": { + "version": "2.0.3", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "peer": true, + "prop-types": { + "version": "15.8.1", "requires": { - "semver": "^7.5.3" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "react-is": { + "version": "16.13.1" } } }, - "make-error": { - "version": "1.3.6", + "property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "dev": true }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "proxy-addr": { + "version": "2.0.7", "dev": true, - "peer": true, "requires": { - "tmpl": "1.0.5" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "dev": true + } } }, - "mathml-tag-names": { - "version": "2.1.3", + "ps-list": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", + "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", "dev": true }, - "mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "psl": { + "version": "1.9.0", + "dev": true + }, + "pstree.remy": { + "version": "1.1.8", + "dev": true + }, + "pump": { + "version": "3.0.0", "dev": true, "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "punycode": { + "version": "2.1.1", + "dev": true + }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, + "pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true + }, + "qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "@types/mdast": "^4.0.0" + "side-channel": "^1.0.6" } }, - "mdn-data": { - "version": "2.0.30", + "querystringify": { + "version": "2.2.0", "dev": true }, - "meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "dev": true + "queue-microtask": { + "version": "1.2.3" }, - "merge-stream": { - "version": "2.0.0", + "quick-lru": { + "version": "5.1.1", "dev": true }, - "merge2": { - "version": "1.4.1", - "dev": true + "quick-verse": { + "version": "file:extensions/src/quick-verse", + "requires": { + "@sillsdev/scripture": "^2.0.1", + "@swc/core": "^1.4.11", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^6.10.0", + "escape-string-regexp": "^5.0.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "glob": "^10.3.12", + "papi-dts": "file:../../../lib/papi-dts", + "platform-bible-react": "file:../../../lib/platform-bible-react", + "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "prettier": "^3.2.5", + "prettier-plugin-jsdoc": "^1.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "stylelint": "^16.3.1", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-sass-guidelines": "^11.1.0", + "swc-loader": "^0.2.6", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.4.5", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "zip-build": "^1.8.0" + } }, - "micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "randombytes": { + "version": "2.1.0", "dev": true, "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "safe-buffer": "^5.1.0" } }, - "micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "range-parser": { + "version": "1.2.1", + "dev": true + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "requires": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "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 + }, + "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" + } + } } }, - "micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "dev": true, + "rc-align": { + "version": "4.0.15", "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" } }, - "micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "dev": true, + "rc-dock": { + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/rc-dock/-/rc-dock-3.2.19.tgz", + "integrity": "sha512-onjYMYw4IEzf5LbQyQt+a2mSJ58oxAgpu29CD8/rexR5IWjTsa3amxyF+CxHy2+wtqCDzi/qsDsJglH/k6Bx9g==", "requires": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "classnames": "^2.5.1", + "lodash": "^4.17.21", + "rc-dropdown": "~4.0.1", + "rc-menu": "~9.8.4", + "rc-new-window": "^0.1.13", + "rc-tabs": "~11.16.1" } }, - "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "dev": true, + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" } }, - "micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "dev": true, + "rc-menu": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz", + "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==", "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" } }, - "micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "dev": true, + "rc-motion": { + "version": "2.6.3", "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" } }, - "micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", - "dev": true, + "rc-new-window": { + "version": "0.1.13", "requires": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/runtime": "^7.10.1", + "bowser": "^2.11.0", + "classnames": "2.x", + "lodash": "^4.17.20" + } + }, + "rc-overflow": { + "version": "1.2.8", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-resize-observer": { + "version": "1.3.1", + "requires": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-tabs": { + "version": "11.16.1", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.6.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.5.0" + }, + "dependencies": { + "rc-menu": { + "version": "9.6.4", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.0", + "rc-trigger": "^5.1.2", + "rc-util": "^5.12.0", + "shallowequal": "^1.1.0" + } + } + } + }, + "rc-trigger": { + "version": "5.3.4", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-util": { + "version": "5.28.0", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1" + } + } + }, + "react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "requires": { + "loose-envify": "^1.1.0" } }, - "micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", "dev": true, + "requires": {} + }, + "react-data-grid": { + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/react-data-grid/-/react-data-grid-7.0.0-beta.42.tgz", + "integrity": "sha512-N5ToEOxMlQGkRYhed3ahFz34fgJTccrCA9PZqIGVoO1vsZADNISXk6ywODJOdCz/1yB78MLu+T7q6cnJd2024A==", "requires": { - "micromark-util-symbol": "^2.0.0" + "clsx": "^2.0.0" } }, - "micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "react-docgen": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", + "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", "dev": true, "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "dependencies": { + "strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "requires": { + "min-indent": "^1.0.1" + } + } } }, - "micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", "dev": true, + "requires": {} + }, + "react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "requires": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" } }, - "micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "react-element-to-jsx-string": { + "version": "15.0.0", "dev": true, "requires": { - "micromark-util-symbol": "^2.0.0" + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "dev": true + }, + "react-is": { + "version": "18.1.0", + "dev": true + } } }, - "micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", "dev": true, "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@babel/runtime": "^7.12.5" } }, - "micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "dev": true + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, - "micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true }, - "micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "dev": true, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", "requires": { - "micromark-util-symbol": "^2.0.0" + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" } }, - "micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "dev": true, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", "requires": { - "micromark-util-types": "^2.0.0" + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" } }, - "micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "dev": true, + "react-router": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@remix-run/router": "1.19.2" } }, - "micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", - "dev": true, + "react-router-dom": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" } }, - "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true - }, - "micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "react-shallow-renderer": { + "version": "16.15.0", "dev": true, "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, - "mime-db": { - "version": "1.52.0", - "dev": true + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + } }, - "mime-types": { - "version": "2.1.35", + "react-test-renderer": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", + "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", "dev": true, "requires": { - "mime-db": "1.52.0" + "react-is": "^18.3.1", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.2" } }, - "mimic-fn": { - "version": "2.1.0", - "dev": true + "react-transition-group": { + "version": "4.4.5", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } }, - "minimatch": { - "version": "3.1.2", + "read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "debug": "^4.3.4" } }, - "minimist": { - "version": "1.2.8", - "dev": true - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "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 + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } }, - "mute-stream": { - "version": "0.0.8", - "dev": true + "read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "requires": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + } + } }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true + "readable-stream": { + "version": "2.3.7", + "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" + } }, - "natural-compare": { - "version": "1.4.0", - "dev": true + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, - "neo-async": { - "version": "2.6.2", - "dev": true + "readdirp": { + "version": "3.6.0", + "requires": { + "picomatch": "^2.2.1" + } }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, - "peer": true + "requires": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "dependencies": { + "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 + } + } }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "rechoir": { + "version": "0.8.0", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } }, - "normalize-path": { + "redent": { "version": "3.0.0", - "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, - "peer": true, "requires": { - "path-key": "^3.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "object-assign": { - "version": "4.1.1", - "dev": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "requires": { "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" } }, - "object-keys": { - "version": "1.1.1", + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "regenerate": "^1.4.2" } }, - "object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "@babel/runtime": "^7.8.4" } }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "regex": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", + "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "regjsparser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz", + "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "jsesc": "~3.0.2" } }, - "once": { - "version": "1.4.0", + "rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", "dev": true, "requires": { - "wrappy": "1" + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" } }, - "onetime": { - "version": "5.1.2", + "rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" } }, - "optionator": { - "version": "0.9.3", + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, - "ora": { - "version": "5.4.1", + "replace-in-file": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.1.0.tgz", + "integrity": "sha512-1uZmJ78WtqNYCSuPC9IWbweXkGxPOtk2rKuar8diTw7naVIQZiE3Tm8ACx2PCMXDtVH6N+XxwaRY2qZ2xHPqXw==", "dev": true, "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "chalk": "^4.1.2", + "glob": "^8.1.0", + "yargs": "^17.7.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "balanced-match": "^1.0.0" } }, - "color-convert": { - "version": "2.0.1", + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.2.0", + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "brace-expansion": "^2.0.1" } } } }, - "os-tmpdir": { - "version": "1.0.2", + "require-directory": { + "version": "2.1.1", "dev": true }, - "p-limit": { - "version": "3.1.0", - "dev": true, + "require-from-string": { + "version": "2.0.2" + }, + "requireindex": { + "version": "1.2.0", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "yocto-queue": "^0.1.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, - "p-locate": { - "version": "5.0.0", + "resolve-alpn": { + "version": "1.2.1", + "dev": true + }, + "resolve-cwd": { + "version": "3.0.0", "dev": true, "requires": { - "p-limit": "^3.0.2" + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "dev": true + } } }, - "p-try": { - "version": "2.2.0", + "resolve-from": { + "version": "4.0.0" + }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, - "papi-dts": { - "version": "file:../paranext-core/lib/papi-dts", + "responselike": { + "version": "2.0.1", + "dev": true, "requires": { - "escape-string-regexp": "^5.0.0", - "platform-bible-utils": "file:../platform-bible-utils", - "rimraf": "^6.0.1", - "typedoc": "^0.26.7", - "typescript": "^5.4.5" - }, - "dependencies": { - "@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "6.0.1", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "dev": true - }, - "escape-string-regexp": { - "version": "5.0.0", - "dev": true - }, - "foreground-child": { - "version": "3.1.1", + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.12.0", + "dev": true + }, + "reusify": { + "version": "1.0.4" + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "requires": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "balanced-match": "^1.0.0" } }, "glob": { - "version": "10.3.3", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, "jackspeak": { - "version": "2.2.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "@isaacs/cliui": "^8.0.2" } }, "lru-cache": { - "version": "10.0.0", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", "dev": true }, "minimatch": { - "version": "9.0.3", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { - "version": "7.0.2", - "dev": true - }, - "path-key": { - "version": "3.1.1", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, "path-scurry": { - "version": "1.10.1", - "dev": true, - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - } - }, - "platform-bible-utils": { - "version": "file:../paranext-core/lib/platform-bible-utils", - "requires": { - "@types/jest": "^29.5.13", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "async-mutex": "^0.4.1", - "dts-bundle-generator": "^9.5.1", - "escape-string-regexp": "^5.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", - "prettier": "^3.3.3", - "prettier-plugin-jsdoc": "^1.3.0", - "stringz": "^2.1.0", - "tslib": "^2.7.0", - "typedoc": "^0.26.7", - "typescript": "^5.4.5", - "vite": "^5.4.8" - } - }, - "rimraf": { - "version": "5.0.1", - "dev": true, - "requires": { - "glob": "^10.2.5" - } - }, - "shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "signal-exit": { - "version": "4.0.2", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "7.1.0", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "dev": true - } + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" } - }, - "typescript": { - "version": "5.1.6", + } + } + }, + "roarr": { + "version": "2.15.4", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, + "rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-script-os": { + "version": "1.1.6", + "dev": true + }, + "runtime-required": { + "version": "1.1.0", + "dev": true + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "8.1.0", + } + } + }, + "safe-buffer": { + "version": "5.1.2" + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", + "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "6.0.0", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "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": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } + "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": {} + }, + "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 } } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } + "select-hose": { + "version": "2.0.0", + "dev": true }, - "parse-json": { - "version": "5.2.0", + "selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" } }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, - "path-parse": { - "version": "1.0.7", - "dev": true + "semver-compare": { + "version": "1.0.0", + "dev": true, + "optional": true }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.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" }, "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "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 + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, - "path-type": { - "version": "4.0.0", - "dev": true - }, - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "dev": true + "serialize-error": { + "version": "7.0.1", + "dev": true, + "optional": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "dev": true, + "optional": true + } + } }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "peer": true + "requires": { + "randombytes": "^2.1.0" + } }, - "pkg-dir": { - "version": "4.2.0", + "serve-index": { + "version": "1.9.1", "dev": true, "requires": { - "find-up": "^4.0.0" + "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": { - "find-up": { - "version": "4.1.0", + "debug": { + "version": "2.6.9", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ms": "2.0.0" } }, - "locate-path": { - "version": "5.0.0", + "http-errors": { + "version": "1.6.3", "dev": true, "requires": { - "p-locate": "^4.1.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } + "inherits": { + "version": "2.0.3", + "dev": true }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "ms": { + "version": "2.0.0", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "dev": true } } }, - "platform-bible-react": { - "version": "file:../paranext-core/lib/platform-bible-react", + "serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "requires": { - "@babel/preset-env": "^7.25.7", - "@babel/preset-react": "^7.25.7", - "@babel/preset-typescript": "^7.25.7", - "@emotion/react": ">=11.11.4", - "@emotion/styled": ">=11.11.0", - "@mui/icons-material": "^5.15.10", - "@mui/material": ">=5.15.10", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-radio-group": "^1.2.0", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.0", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.1.0", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.2.1", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@senojs/rollup-plugin-style-inject": "^0.2.3", - "@tanstack/react-table": "^8.19.2", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.5.0", - "@testing-library/react": "^16.0.1", - "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.13", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "@vitejs/plugin-react": "^4.3.2", - "autoprefixer": "^10.4.19", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "cmdk": "^1.0.0", - "dts-bundle-generator": "^9.5.1", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "lucide-react": "^0.367.0", - "next-themes": "^0.3.0", - "platform-bible-utils": "file:../platform-bible-utils", - "prettier": "^3.3.3", - "prettier-plugin-jsdoc": "^1.3.0", - "prettier-plugin-tailwindcss": "^0.6.1", - "react-data-grid": ">=7.0.0-beta.42", - "sonner": "^1.5.0", - "stylelint": "^16.9.0", - "stylelint-config-recommended": "^14.0.1", - "stylelint-config-sass-guidelines": "^11.1.0", - "stylelint-config-tailwindcss": "^0.0.7", - "tailwind-merge": "^2.2.2", - "tailwindcss": "^3.4.3", - "tailwindcss-animate": "^1.0.7", - "tailwindcss-scoped-preflight": "^2.1.0", - "ts-jest": "^29.2.5", - "tslib": "^2.7.0", - "typedoc": "^0.26.7", - "typescript": "^5.4.5", - "vite": "^4.5.5", - "vite-tsconfig-paths": "^4.3.2" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "dependencies": { + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "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", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallowequal": { + "version": "1.1.0" + }, + "shebang-command": { + "version": "2.0.0", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, - "platform-bible-utils": { - "version": "file:../paranext-core/lib/platform-bible-utils", + "signal-exit": { + "version": "3.0.7", + "dev": true + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "requires": { - "@types/jest": "^29.5.13", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "async-mutex": "^0.4.1", - "dts-bundle-generator": "^9.5.1", - "escape-string-regexp": "^5.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", - "prettier": "^3.3.3", - "prettier-plugin-jsdoc": "^1.3.0", - "stringz": "^2.1.0", - "tslib": "^2.7.0", - "typedoc": "^0.26.7", - "typescript": "^5.4.5", - "vite": "^5.4.8" + "semver": "^7.5.3" } }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "slash": { + "version": "3.0.0", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "optional": true, "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "smart-buffer": { + "version": "4.2.0", "dev": true }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, - "requires": {} + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, - "postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "sockjs": { + "version": "0.3.24", "dev": true, "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" } }, - "postcss-modules-values": { - "version": "4.0.0", + "socks-proxy-agent": { + "version": "7.0.0", "dev": true, "requires": { - "icss-utils": "^5.0.0" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" } }, - "postcss-resolve-nested-selector": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", - "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "sonner": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", + "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "requires": {} + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, - "postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + }, + "source-map-support": { + "version": "0.5.21", "dev": true, - "requires": {} + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } }, - "postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "spdy": { + "version": "4.0.2", "dev": true, - "requires": {} + "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" + } }, - "postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "spdy-transport": { + "version": "3.0.0", "dev": true, "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "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": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, - "postcss-value-parser": { - "version": "4.2.0", + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, - "prelude-ls": { + "ssri": { + "version": "9.0.1", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stack-utils": { + "version": "2.0.6", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "dev": true + } + } + }, + "stackframe": { "version": "1.2.1", "dev": true }, - "prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true }, - "prettier-linter-helpers": { + "statuses": { + "version": "1.5.0", + "dev": true + }, + "stop-iteration-iterator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "requires": { - "fast-diff": "^1.1.2" + "internal-slot": "^1.0.4" } }, - "prettier-plugin-jsdoc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.0.tgz", - "integrity": "sha512-cQm8xIa0fN9ieJFMXACQd6JPycl+8ouOijAqUqu44EF/s4fXL3Wi9sKXuEaodsEWgCN42Xby/bNhqgM1iWx4uw==", + "storybook": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.4.tgz", + "integrity": "sha512-nzvuK5TsEgJwcWGLGgafabBOxKn37lfJVv7ZoUVPgJIjk2mNRyJDFwYRJzUZaD37eiR/c/lQ6MoaeqlGwiXoxw==", "dev": true, "requires": { - "binary-searching": "^2.0.5", - "comment-parser": "^1.4.0", - "mdast-util-from-markdown": "^2.0.0" + "@storybook/core": "8.3.4" } }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, + "string_decoder": { + "version": "1.1.1", "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true - } + "safe-buffer": "~5.1.0" } }, - "process-nextick-args": { - "version": "2.0.1", + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "peer": true, "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" } }, - "prop-types": { - "version": "15.8.1", - "dev": true, + "string-width": { + "version": "4.2.3", "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "dependencies": { - "react-is": { - "version": "16.13.1", - "dev": true + "emoji-regex": { + "version": "8.0.0" + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" } } }, - "punycode": { - "version": "2.3.0", - "dev": true - }, - "pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, - "peer": true - }, - "queue-microtask": { - "version": "1.2.3", - "dev": true + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "requires": { - "safe-buffer": "^5.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, "requires": { - "loose-envify": "^1.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, - "react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "peer": true + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } }, - "readable-stream": { - "version": "3.6.2", + "stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" } }, - "readdir-glob": { - "version": "1.1.3", + "stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", "dev": true, "requires": { - "minimatch": "^5.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "char-regex": "^1.0.2" } }, - "readdirp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", - "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", - "dev": true - }, - "rechoir": { - "version": "0.8.0", - "dev": true, + "strip-ansi": { + "version": "6.0.1", "requires": { - "resolve": "^1.20.0" + "ansi-regex": "^5.0.1" } }, - "reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "ansi-regex": "^5.0.1" } }, - "regenerator-runtime": { - "version": "0.14.0", + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "strip-final-newline": { + "version": "2.0.0", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", "dev": true, "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "min-indent": "^1.0.0" } }, - "require-directory": { - "version": "2.1.1", + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "require-from-string": { - "version": "2.0.2", + "style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "dev": true, + "requires": {} + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true }, - "resolve": { - "version": "1.22.4", + "stylehacks": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", + "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", "dev": true, "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.2" } }, - "resolve-cwd": { - "version": "3.0.0", + "stylelint": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", "dev": true, "requires": { - "resolve-from": "^5.0.0" + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.41", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" }, "dependencies": { + "@csstools/css-parser-algorithms": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "requires": {} + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "balanced-match": { + "version": "2.0.0", + "dev": true + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "requires": { + "flat-cache": "^5.0.0" + } + }, + "flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "requires": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + } + }, + "is-plain-object": { + "version": "5.0.0", + "dev": true + }, + "known-css-properties": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "dev": true + }, + "meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true + }, + "postcss-safe-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "dev": true, + "requires": {} + }, "resolve-from": { "version": "5.0.0", "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } } } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "requires": {} }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true + "stylelint-config-sass-guidelines": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-12.1.0.tgz", + "integrity": "sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==", + "dev": true, + "requires": { + "@stylistic/stylelint-plugin": "^3.0.1", + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" + } }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "stylelint-config-tailwindcss": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/stylelint-config-tailwindcss/-/stylelint-config-tailwindcss-0.0.7.tgz", + "integrity": "sha512-n2dCWH+0ppr0/by4EYCLWW7g5LU+l4UzUIsYS7xbVHqvm9UWa7UhltNdNiz5NmLF/FmbJR4Yd/v9DuUGvLw1Tg==", "dev": true, - "peer": true + "requires": {} }, - "restore-cursor": { - "version": "3.1.0", + "stylelint-scss": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz", + "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "signal-exit": { - "version": "3.0.7", - "dev": true - } + "known-css-properties": "^0.29.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.15", + "postcss-value-parser": "^4.2.0" } }, - "reusify": { - "version": "1.0.4", - "dev": true + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "rimraf": { - "version": "3.0.2", - "dev": true, + "sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "requires": { - "glob": "^7.1.3" - }, - "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "glob": { - "version": "7.2.3", - "dev": true, + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "requires": { + "brace-expansion": "^2.0.1" } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" } } }, - "run-async": { - "version": "2.4.1", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", + "sumchecker": { + "version": "3.0.1", "dev": true, "requires": { - "queue-microtask": "^1.2.2" + "debug": "^4.1.0" } }, - "rxjs": { - "version": "7.8.1", - "dev": true, + "supports-color": { + "version": "7.2.0", "requires": { - "tslib": "^2.1.0" + "has-flag": "^4.0.0" } }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } + "supports-preserve-symlinks-flag": { + "version": "1.0.0" }, - "safer-buffer": { - "version": "2.1.2", + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "dev": true }, - "sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", - "dev": true, - "requires": { - "chokidar": "^4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } + "svg-tags": { + "version": "1.0.0", + "dev": true }, - "sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "requires": { - "neo-async": "^2.6.2" - } - }, - "scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "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 + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + } } }, - "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==", + "swc-loader": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@swc/counter": "^0.1.3" } }, - "semver": { - "version": "6.3.1", + "symbol-tree": { + "version": "3.2.4", "dev": true }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", "dev": true, "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" } }, - "shallow-clone": { - "version": "3.0.1", + "table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } } }, - "shebang-command": { - "version": "2.0.0", - "dev": true, + "tailwind-merge": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.2.tgz", + "integrity": "sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==", "requires": { - "shebang-regex": "^3.0.0" + "@babel/runtime": "^7.24.0" } }, - "shebang-regex": { - "version": "3.0.0", - "dev": true + "tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + } + } }, - "shell-quote": { - "version": "1.8.1", + "tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "requires": {} + }, + "tapable": { + "version": "2.2.1", "dev": true }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + } } }, - "signal-exit": { - "version": "4.1.0", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, - "peer": true - }, - "slash": { - "version": "3.0.0", - "dev": true + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "taskkill": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-5.0.0.tgz", + "integrity": "sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "execa": "^6.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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 + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "path-key": "^4.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true } } }, - "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-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "telejson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", "dev": true, - "peer": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "memoizerific": "^1.11.3" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, - "peer": true + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, - "peer": true, "requires": { - "escape-string-regexp": "^2.0.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true + "commander": { + "version": "2.20.3", + "dev": true } } }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "internal-slot": "^1.0.4" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, - "string_decoder": { - "version": "1.3.0", + "test-exclude": { + "version": "6.0.0", "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "text-table": { + "version": "0.2.0", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, - "peer": true, + "requires": {} + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true + }, + "tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true + }, + "tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true + }, + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true + }, + "tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "requires": { + "tmp": "^0.2.0" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0" + }, + "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==", "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "is-number": "^7.0.0" } }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "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 + }, + "totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true + }, + "touch": { + "version": "3.1.0", "dev": true, "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "nopt": "~1.0.10" }, "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "nopt": { + "version": "1.0.10", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "abbrev": "1" } } } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "tough-cookie": { + "version": "4.1.3", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "universalify": { + "version": "0.2.0", "dev": true } } }, - "string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - } - }, - "string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "tr46": { + "version": "3.0.0", "dev": true, "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "punycode": "^2.1.1" } }, - "string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } + "requires": {} }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } + "tree-kill": { + "version": "1.2.2", + "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "utf8-byte-length": "^1.0.1" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "peer": true - }, - "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==", + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "peer": true - }, - "strip-json-comments": { - "version": "3.1.1", - "dev": true + "requires": {} }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "ts-dedent": { + "version": "2.2.0", "dev": true }, - "stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", - "dev": true, - "requires": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "@csstools/selector-specificity": "^4.0.0", - "@dual-bundle/import-meta-resolve": "^4.1.0", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", - "fast-glob": "^3.3.2", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.3.2", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.34.0", - "mathml-tag-names": "^2.1.3", - "meow": "^13.2.0", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.1", - "postcss": "^8.4.41", - "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.1.0", - "svg-tags": "^1.0.0", - "table": "^6.8.2", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "file-entry-cache": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", - "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", - "dev": true, - "requires": { - "flat-cache": "^5.0.0" - } - }, - "flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", - "dev": true, - "requires": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" - } - }, - "resolve-from": { - "version": "5.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - } - } - }, - "write-file-atomic": { - "version": "5.0.1", + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "requires": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + } + }, + "ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.9.2", "dev": true, "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } } } }, - "stylelint-config-recommended": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", - "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", - "dev": true, - "requires": {} - }, - "stylelint-config-sass-guidelines": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-12.1.0.tgz", - "integrity": "sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==", + "ts-mockito": { + "version": "2.6.1", "dev": true, "requires": { - "@stylistic/stylelint-plugin": "^3.0.1", - "postcss-scss": "^4.0.9", - "stylelint-scss": "^6.2.1" + "lodash": "^4.17.5" } }, - "stylelint-scss": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz", - "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==", - "dev": true, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, "requires": { - "known-css-properties": "^0.29.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.15", - "postcss-value-parser": "^4.2.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "dependencies": { - "known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true + "acorn-walk": { + "version": "8.2.0", + "devOptional": true } } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "tsconfck": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz", + "integrity": "sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "dev": true + } } }, - "supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" }, "dependencies": { - "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 - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "enhanced-resolve": { + "version": "5.12.0", "dev": true, "requires": { - "has-flag": "^4.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } } } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "dev": true - }, - "swc-loader": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", - "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", - "dev": true, - "requires": { - "@swc/counter": "^0.1.3" - } + "tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "tsutils": { + "version": "3.21.0", "dev": true, "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "dev": true + } } }, - "table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", "dev": true, "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "esbuild": "~0.23.0", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.5" }, "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } + "optional": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "dev": true, + "optional": true }, - "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 + "@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "dev": true, + "optional": true }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } } } }, - "tapable": { - "version": "2.2.1", + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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==", "dev": true }, - "tar-stream": { - "version": "2.2.0", + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "optional": true, + "peer": 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" + } + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, - "terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "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" - } - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "typedoc": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.7.tgz", + "integrity": "sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" }, "dependencies": { - "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 + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } }, - "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==", + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "brace-expansion": "^2.0.1" } }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "shiki": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.17.4.tgz", + "integrity": "sha512-cuezOGFn2AA9b+ItofDOB6/ap3AosrgV7Wqxeo9c5L4Df0+HtiGt0WlBrM4gtWK5cR96+5Ef17syu4FDL9/Acg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "@shikijs/core": "1.17.4", + "@shikijs/engine-javascript": "1.17.4", + "@shikijs/engine-oniguruma": "1.17.4", + "@shikijs/types": "1.17.4", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" } + }, + "yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true } } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true + }, + "uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", "dev": true, - "peer": true, "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" } }, - "text-table": { - "version": "0.2.0", + "undefsafe": { + "version": "2.0.5", "dev": true }, - "through": { - "version": "2.3.8", + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "tmp": { - "version": "0.0.33", + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, + "unique-filename": { + "version": "2.0.1", "dev": true, - "peer": true + "requires": { + "unique-slug": "^3.0.0" + } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "unique-slug": { + "version": "3.0.0", "dev": true, - "peer": true + "requires": { + "imurmurhash": "^0.1.4" + } }, - "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==", + "unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "requires": { - "is-number": "^7.0.0" + "@types/unist": "^3.0.0" } }, - "tree-kill": { - "version": "1.2.2", - "dev": true + "unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "requires": { + "@types/unist": "^3.0.0" + } }, - "ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, - "requires": {} + "requires": { + "@types/unist": "^3.0.0" + } }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" } }, - "tsconfig-paths": { - "version": "4.2.0", + "unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "dev": true - } + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" } }, - "tsconfig-paths-webpack-plugin": { - "version": "4.1.0", + "universalify": { + "version": "0.1.2", + "dev": true + }, + "unixify": { + "version": "1.0.0", "dev": true, "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" + "normalize-path": "^2.1.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.2.0", + "normalize-path": { + "version": "2.1.1", "dev": true, "requires": { - "has-flag": "^4.0.0" + "remove-trailing-separator": "^1.0.1" } } } }, - "tslib": { - "version": "2.6.2", - "dev": true + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unplugin": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", + "dev": true, + "requires": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + } + }, + "unzip-crx-3": { + "version": "0.2.0", + "dev": true, + "requires": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + } + }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "uri-js": { + "version": "4.4.1", "dev": true, "requires": { - "tslib": "^1.8.1" + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "requires": { + "punycode": "^1.4.1", + "qs": "^6.12.3" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true } } }, - "type-check": { - "version": "0.4.0", + "url-loader": { + "version": "4.1.1", "dev": true, "requires": { - "prelude-ls": "^1.2.1" + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" } }, - "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==", - "dev": true, - "peer": true - }, - "type-fest": { - "version": "0.21.3", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "url-parse": { + "version": "1.5.10", "dev": true, "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "tslib": "^2.0.0" } }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" } }, - "typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "util-deprecate": { + "version": "1.0.2" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, - "unbox-primitive": { - "version": "1.0.2", + "utils-merge": { + "version": "1.0.1", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "devOptional": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" } }, - "undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true - }, - "unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "vary": { + "version": "1.1.2", "dev": true }, - "unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, + "optional": true, "requires": { - "@types/unist": "^3.0.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + } } }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" } }, - "uri-js": { - "version": "4.4.1", + "vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, "requires": { - "punycode": "^2.1.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "dev": true + "vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true + "vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + } }, - "v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "w3c-xmlserializer": { + "version": "4.0.0", "dev": true, - "peer": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "xml-name-validator": "^4.0.0" } }, "walker": { @@ -23893,11 +53417,20 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, "requires": { "makeerror": "1.0.12" } }, + "watchboy": { + "version": "0.4.3", + "dev": true, + "requires": { + "lodash.difference": "^4.5.0", + "micromatch": "^4.0.2", + "pify": "^4.0.1", + "unixify": "^1.0.0" + } + }, "watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -23908,6 +53441,13 @@ "graceful-fs": "^4.1.2" } }, + "wbuf": { + "version": "1.7.3", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, "wcwidth": { "version": "1.0.1", "dev": true, @@ -23915,6 +53455,10 @@ "defaults": "^1.0.3" } }, + "webidl-conversions": { + "version": "7.0.0", + "dev": true + }, "webpack": { "version": "5.95.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", @@ -23944,10 +53488,103 @@ "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "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-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": {} + }, + "enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "dev": true + }, + "commander": { + "version": "7.2.0", + "dev": true + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "requires": {} + } } }, "webpack-cli": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", @@ -23967,25 +53604,153 @@ "dependencies": { "commander": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "interpret": { "version": "3.1.1", "dev": true }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "memfs": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", + "dev": true, + "requires": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "dependencies": { + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "is-inside-container": "^1.0.0" + } + }, + "open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "requires": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } } } }, + "webpack-hot-middleware": { + "version": "2.25.3", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, "webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -24001,9 +53766,46 @@ "version": "3.2.3", "dev": true }, + "webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "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", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "dev": true + }, + "whatwg-url": { + "version": "11.0.0", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "which": { "version": "2.0.2", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -24037,6 +53839,14 @@ "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.2", "which-typed-array": "^1.1.15" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } } }, "which-collection": { @@ -24064,96 +53874,36 @@ "has-tostringtag": "^1.0.2" } }, + "wide-align": { + "version": "1.1.5", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "7.0.0", "dev": true, "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrap-ansi-cjs": { "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } } }, "wrappy": { @@ -24161,35 +53911,100 @@ "dev": true }, "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "peer": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "requires": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "dependencies": { "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, - "peer": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" } } }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "dev": true + }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "dev": true + }, "y18n": { "version": "5.0.8", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "yaku": { + "version": "0.16.7", + "dev": true + }, + "yalc": { + "version": "1.0.0-pre.53", + "resolved": "https://registry.npmjs.org/yalc/-/yalc-1.0.0-pre.53.tgz", + "integrity": "sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==", "dev": true, - "peer": true + "requires": { + "chalk": "^4.1.0", + "detect-indent": "^6.0.0", + "fs-extra": "^8.0.1", + "glob": "^7.1.4", + "ignore": "^5.0.4", + "ini": "^2.0.0", + "npm-packlist": "^2.1.5", + "yargs": "^16.1.1" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yaml": { + "version": "1.10.2" }, "yargs": { "version": "17.7.2", @@ -24204,32 +54019,41 @@ "yargs-parser": "^21.1.1" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", + "cliui": { + "version": "8.0.1", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" } - }, - "yargs-parser": { - "version": "21.1.1", - "dev": true } } }, "yargs-parser": { - "version": "20.2.9", + "version": "21.1.1", "dev": true }, + "yauzl": { + "version": "2.10.0", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yjs": { + "version": "13.6.18", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.18.tgz", + "integrity": "sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==", + "dev": true, + "requires": { + "lib0": "^0.2.86" + } + }, "yn": { "version": "3.1.1", - "dev": true + "devOptional": true }, "yocto-queue": { "version": "0.1.0", @@ -24237,6 +54061,8 @@ }, "zip-build": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/zip-build/-/zip-build-1.8.0.tgz", + "integrity": "sha512-4wYrsrYyme1RTeNCCXg9AwseQFRpj3n7qjiIfaq9qtOAYevgbhtktCzxK7CL0KDZyz/tA9Yxqrn1HismAiJ/eg==", "dev": true, "requires": { "inquirer": "^8.2.5", @@ -24244,57 +54070,10 @@ "zip-folder-promise": "^1.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -24305,24 +54084,71 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } }, "zip-folder-promise": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-folder-promise/-/zip-folder-promise-1.2.0.tgz", + "integrity": "sha512-SwD7SJfZZTr8/0s1adZx80oReGFIuEnyqYLU1XtCqNwSDeEOcB8OnjPBuOh7WujPGffP4wrjVSFi8k62vTgnyw==", "dev": true, "requires": { "archiver": "^5.3.1" } }, "zip-stream": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", "dev": true, "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", "readable-stream": "^3.6.0" + }, + "dependencies": { + "archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "requires": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } + }, + "zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true } } } diff --git a/package.json b/package.json index df3898af4a..a8a37287bd 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,178 @@ { - "name": "paranext-extension-template", - "private": true, - "version": "0.0.1", - "main": "src/main.js", - "types": "src/types/paranext-extension-template.d.ts", - "author": "Paranext", + "description": "Extensible Bible translation software", + "keywords": [ + "electron", + "boilerplate", + "react", + "typescript", + "ts", + "sass", + "webpack", + "hot", + "reload" + ], + "homepage": "https://github.com/paranext/paranext-core#readme", + "bugs": { + "url": "https://github.com/paranext/paranext-core/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/paranext/paranext-core.git" + }, "license": "MIT", + "author": { + "name": "Paranext", + "url": "https://github.com/paranext/" + }, + "contributors": [ + { + "name": "Ira J Hopkinson", + "url": "https://github.com/irahopkinson" + }, + { + "name": "Tim Steenwyk", + "url": "https://github.com/FoolRunning" + }, + { + "name": "TJ Couch", + "email": "tj_couch@sil.org", + "url": "https://github.com/tjcouch-sil" + } + ], + "main": "./src/main/main.ts", "scripts": { - "build:web-view": "webpack --config ./webpack/webpack.config.web-view.ts", - "build:main": "webpack --config ./webpack/webpack.config.main.ts", - "build": "webpack", - "watch": "npm run build -- --watch", - "build:production": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=false webpack", - "watch:production": "npm run build:production -- --watch", - "zip": "zip-build dist release --template '%NAME%_%VERSION%.%EXT%' --override", - "package": "npm run build:production && npm run zip", - "package:debug": "cross-env DEBUG_PROD=true npm run package", - "start:core": "cd ../paranext-core && npm run start", - "start": "cross-env MAIN_ARGS=\"--extensions $INIT_CWD/dist\" concurrently \"npm:watch\" \"npm:start:core\"", - "start:production": "cross-env MAIN_ARGS=\"--extensions $INIT_CWD/dist\" concurrently \"npm:watch:production\" \"npm:start:core\"", - "lint": "npm run lint:scripts && npm run lint:styles", - "lint:scripts": "eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", + "build": "concurrently --kill-others-on-fail \"npm:build:main\" \"npm:build:extension-host\" \"npm:build:renderer\" \"npm:build:types\" \"npm:build:extensions\" \"npm:build:data-release\"", + "build:dll": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", + "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", + "build:extension-host": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.extension-host.prod.ts", + "build:extensions": "cd extensions && npm run build", + "build:extensions:production": "cd extensions && npm run build:production", + "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", + "build:data": "dotnet build c-sharp/ParanextDataProvider.sln", + "build:data-release": "run-script-os", + "build:data-release:windows": "dotnet publish c-sharp/ParanextDataProvider.csproj -r win-x64 -o ./c-sharp/bin/Release/net8.0/publish/win-x64/", + "build:data-release:linux": "dotnet publish c-sharp/ParanextDataProvider.csproj -r linux-x64 -o ./c-sharp/bin/Release/net8.0/publish/linux-x64/", + "build:data-release:macos": "dotnet publish c-sharp/ParanextDataProvider.csproj -r osx-x64 -o ./c-sharp/bin/Release/net8.0/publish/osx-x64/ && dotnet publish c-sharp/ParanextDataProvider.csproj -r osx-arm64 -o ./c-sharp/bin/Release/net8.0/publish/osx-arm64/", + "build:types": "cd lib/papi-dts && npm run build", + "build:platform-bible-react": "cd lib/platform-bible-react && npm run build", + "build:platform-bible-utils": "cd lib/platform-bible-utils && npm run build", + "csharp:tool:restore": "cd c-sharp && dotnet tool restore", + "editor:link": "yalc link @biblionexus-foundation/platform-editor --no-pure", + "editor:update": "yalc update @biblionexus-foundation/platform-editor", + "editor:unlink": "yalc remove @biblionexus-foundation/platform-editor && npm i --ignore-scripts", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "cross-env NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:types && npm run lint:scripts && npm run lint:styles && cd lib/papi-dts && npm run lint && cd ../../extensions && npm run lint", + "lint:scripts": "cross-env NODE_ENV=development eslint --ext .cjs,.js,.jsx,.ts,.tsx --cache .", "lint:styles": "stylelint **/*.{css,scss}", - "lint-fix": "npm run lint-fix:scripts && npm run lint:styles -- --fix", - "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts" + "lint-fix": "npm run build:types && npm run lint-fix:scripts && npm run lint-fix:styles && cd lib/papi-dts && npm run lint-fix && cd ../../extensions && npm run lint-fix", + "lint-fix:scripts": "prettier --write \"**/*.{ts,tsx,js,jsx,cjs}\" && npm run lint:scripts", + "lint-fix:styles": "npm run lint:styles -- --fix", + "lint:config": "cross-env NODE_ENV=development eslint --print-config .eslintrc.js > .eslintConfig.json", + "lint:staged": "npm run build:types && lint-staged -q && cd lib/papi-dts && npm run lint:staged && cd ../../extensions && npm run lint:staged", + "ncu:group": "npx npm-check-updates --interactive --format group", + "package": "tsx ./.erb/scripts/clean.js dist && npm run build && npm run build:extensions:production && electron-builder build --publish never && npm run build:dll", + "package:debug": "cross-env DEBUG_PROD=true npm run package", + "postinstall": "patch-package && tsx .erb/scripts/check-native-dep.js && electron-builder install-app-deps && npm run build:dll && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", + "prepare": "husky install && npm run csharp:tool:restore", + "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", + "start": "tsx ./.erb/scripts/check-port-in-use.js && npm run start:renderer", + "start:main": "cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only .", + "start:extension-host": "cross-env NODE_ENV=development nodemon --transpile-only ./src/extension-host/extension-host.ts", + "start:extensions": "cd extensions && npm run watch", + "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", + "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", + "start:data": "dotnet watch --project c-sharp/ParanextDataProvider.csproj", + "stop": "tsx stop-processes.mjs", + "test:core": "jest --silent", + "test": "npm run test:core && npm run test --workspaces --if-present", + "storybook": "storybook dev -p 6006", + "storybook:build": "storybook build" }, - "browserslist": [], - "peerDependencies": { - "react": ">=18.3.1", - "react-dom": ">=18.3.1" + "lint-staged": { + "*.{cjs,js,jsx,ts,tsx}": ["prettier --write", "cross-env NODE_ENV=development eslint --cache"], + "*.json": ["prettier --parser json --write"], + "*.{css,scss}": ["stylelint --fix --allow-empty-input"], + "*.{html,md,yml}": ["prettier --single-quote --write"] }, + "browserslist": [], "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.10", + "@mui/material": "^5.15.10", "@sillsdev/scripture": "^2.0.2", - "platform-bible-utils": "file:../paranext-core/lib/platform-bible-utils" + "ajv": "^8.17.1", + "chalk": "^4.1.2", + "chokidar": "^3.6.0", + "electron-debug": "^3.2.0", + "electron-log": "^5.0.3", + "electron-updater": "^6.3.4", + "electron-window-state": "^5.0.3", + "fast-equals": "^5.0.1", + "http-status-codes": "^2.3.0", + "jszip": "^3.10.1", + "memoize-one": "^6.0.0", + "node-localstorage": "^3.0.5", + "platform-bible-react": "file:./lib/platform-bible-react", + "platform-bible-utils": "file:./lib/platform-bible-utils", + "rc-dock": "^3.2.19", + "react": "^18.3.1", + "react-data-grid": "^7.0.0-beta.42", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2", + "ws": "^8.18.0" }, "devDependencies": { - "@swc/core": "^1.7.26", + "@babel/preset-env": "^7.25.7", + "@babel/preset-react": "^7.25.7", + "@babel/preset-typescript": "^7.25.7", + "@electron/notarize": "^2.2.1", + "@electron/rebuild": "^3.6.2", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@storybook/addon-essentials": "^8.3.4", + "@storybook/addon-interactions": "^8.3.4", + "@storybook/addon-links": "^8.3.4", + "@storybook/addon-webpack5-compiler-babel": "^3.0.3", + "@storybook/blocks": "^8.3.4", + "@storybook/preview-api": "^8.3.4", + "@storybook/react": "^8.3.4", + "@storybook/react-webpack5": "^8.3.4", + "@storybook/test": "^8.3.4", + "@svgr/webpack": "^8.1.0", + "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@types/electron-devtools-installer": "^2.2.5", + "@types/jest": "^29.5.13", "@types/node": "^20.16.10", + "@types/node-localstorage": "^1.3.3", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", - "@types/webpack": "^5.28.5", + "@types/react-test-renderer": "^18.3.0", + "@types/source-map-support": "^0.5.10", + "@types/terser-webpack-plugin": "^5.2.0", + "@types/webpack-bundle-analyzer": "^4.7.0", + "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "browserslist-config-erb": "^0.0.3", "concurrently": "^9.0.1", - "copy-webpack-plugin": "^12.0.2", + "core-js": "^3.38.1", "cross-env": "^7.0.3", "css-loader": "^6.11.0", - "escape-string-regexp": "^5.0.0", + "css-minimizer-webpack-plugin": "^7.0.0", + "detect-port": "^1.6.1", + "electron": "^27.3.3", + "electron-builder": "^24.13.3", + "electron-devtools-installer": "^3.2.0", + "electronmon": "^2.0.3", "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", + "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-compat": "^4.2.0", "eslint-plugin-import": "^2.30.0", "eslint-plugin-jest": "^27.9.0", @@ -60,26 +182,59 @@ "eslint-plugin-promise": "^6.6.0", "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", - "glob": "^10.4.5", - "papi-dts": "file:../paranext-core/lib/papi-dts", - "platform-bible-react": "file:../paranext-core/lib/platform-bible-react", + "eslint-plugin-storybook": "^0.9.0", + "file-loader": "^6.2.0", + "fkill": "^9.0.0", + "html-webpack-plugin": "^5.6.0", + "husky": "^8.0.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "lint-staged": "^15.2.10", + "mini-css-extract-plugin": "^2.9.1", + "node-loader": "^2.0.0", + "nodemon": "^3.1.7", + "patch-package": "^8.0.0", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", + "react-refresh": "^0.14.2", + "react-test-renderer": "^18.3.1", + "rimraf": "^6.0.1", + "run-script-os": "^1.1.6", "sass": "^1.78.0", "sass-loader": "^14.2.1", + "storybook": "^8.3.4", + "style-loader": "^4.0.0", "stylelint": "^16.9.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", - "swc-loader": "^0.2.6", + "terser-webpack-plugin": "^5.3.10", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-mockito": "^2.6.1", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.19.1", + "typedoc": "^0.26.7", "typescript": "^5.4.5", + "url-loader": "^4.1.1", "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.1.0", "webpack-merge": "^6.0.1", - "zip-build": "^1.8.0" + "yalc": "^1.0.0-pre.53" + }, + "devEngines": { + "node": ">=18.12.x", + "npm": ">=7.x" + }, + "electronmon": { + "patterns": ["!**/**", "src/main/**", "src/node/**", "src/shared/**"], + "logLevel": "quiet" }, + "workspaces": ["lib/*", "extensions", "extensions/src/*"], "volta": { "node": "20.11.1" } diff --git a/patches/rc-dock+3.2.19.patch b/patches/rc-dock+3.2.19.patch new file mode 100644 index 0000000000..3cb29ffeeb --- /dev/null +++ b/patches/rc-dock+3.2.19.patch @@ -0,0 +1,228 @@ +diff --git a/node_modules/rc-dock/README.md b/node_modules/rc-dock/README.md +index 2a7a4bc..ad0da92 100644 +--- a/node_modules/rc-dock/README.md ++++ b/node_modules/rc-dock/README.md +@@ -122,7 +122,7 @@ dockMove(source: TabData | PanelData, target: string | TabData | PanelData | Box + find PanelData or TabData by id + + ```typescript +-find(id: string): PanelData | TabData; ++find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + ``` + + ### updateTab [🗎](https://ticlo.github.io/rc-dock/classes/docklayout.docklayout-1.html#updatetab) +diff --git a/node_modules/rc-dock/es/Algorithm.d.ts b/node_modules/rc-dock/es/Algorithm.d.ts +index e886078..f6db041 100644 +--- a/node_modules/rc-dock/es/Algorithm.d.ts ++++ b/node_modules/rc-dock/es/Algorithm.d.ts +@@ -16,7 +16,7 @@ export declare enum Filter { + AnyTabPanel = 123, + All = 127 + } +-export declare function find(layout: LayoutData, id: string, filter?: Filter): PanelData | TabData | BoxData | undefined; ++export declare function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + export declare function addNextToTab(layout: LayoutData, source: TabData | PanelData, target: TabData, direction: DropDirection): LayoutData; + export declare function addTabToPanel(layout: LayoutData, source: TabData | PanelData, panel: PanelData, idx?: number): LayoutData; + export declare function converToPanel(source: TabData | PanelData): PanelData; +diff --git a/node_modules/rc-dock/es/Algorithm.js b/node_modules/rc-dock/es/Algorithm.js +index c93e88f..d03bd19 100644 +--- a/node_modules/rc-dock/es/Algorithm.js ++++ b/node_modules/rc-dock/es/Algorithm.js +@@ -60,13 +60,16 @@ export function nextZIndex(current) { + } + return ++_zCount; + } ++function compareFindId(item, id) { ++ return item && (typeof id === 'function' ? id(item) : item.id === id); ++} + function findInPanel(panel, id, filter) { +- if (panel.id === id && (filter & Filter.Panel)) { ++ if (compareFindId(panel, id) && (filter & Filter.Panel)) { + return panel; + } + if (filter & Filter.Tab) { + for (let tab of panel.tabs) { +- if (tab.id === id) { ++ if (compareFindId(tab, id)) { + return tab; + } + } +@@ -75,7 +78,7 @@ function findInPanel(panel, id, filter) { + } + function findInBox(box, id, filter) { + let result; +- if ((filter | Filter.Box) && (box === null || box === void 0 ? void 0 : box.id) === id) { ++ if ((filter | Filter.Box) && compareFindId(box, id)) { + return box; + } + if (!(box === null || box === void 0 ? void 0 : box.children)) { +diff --git a/node_modules/rc-dock/es/DockData.d.ts b/node_modules/rc-dock/es/DockData.d.ts +index 89b1506..65e58e0 100644 +--- a/node_modules/rc-dock/es/DockData.d.ts ++++ b/node_modules/rc-dock/es/DockData.d.ts +@@ -290,7 +290,7 @@ export interface DockContext { + /** + * Find PanelData or TabData by id + */ +- find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined; ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + /** + * Update a tab with new TabData + * @param id tab id to update +diff --git a/node_modules/rc-dock/es/DockLayout.d.ts b/node_modules/rc-dock/es/DockLayout.d.ts +index d951ae7..e13b0d8 100644 +--- a/node_modules/rc-dock/es/DockLayout.d.ts ++++ b/node_modules/rc-dock/es/DockLayout.d.ts +@@ -111,7 +111,7 @@ export declare class DockLayout extends DockPortalManager implements DockContext + */ + dockMove(source: TabData | PanelData, target: string | TabData | PanelData | BoxData | null, direction: DropDirection, floatPosition?: FloatPosition): void; + /** @inheritDoc */ +- find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined; ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined; + /** @ignore */ + getLayoutSize(): LayoutSize; + /** @inheritDoc */ +diff --git a/node_modules/rc-dock/lib/Algorithm.d.ts b/node_modules/rc-dock/lib/Algorithm.d.ts +index e886078..f6db041 100644 +--- a/node_modules/rc-dock/lib/Algorithm.d.ts ++++ b/node_modules/rc-dock/lib/Algorithm.d.ts +@@ -16,7 +16,7 @@ export declare enum Filter { + AnyTabPanel = 123, + All = 127 + } +-export declare function find(layout: LayoutData, id: string, filter?: Filter): PanelData | TabData | BoxData | undefined; ++export declare function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + export declare function addNextToTab(layout: LayoutData, source: TabData | PanelData, target: TabData, direction: DropDirection): LayoutData; + export declare function addTabToPanel(layout: LayoutData, source: TabData | PanelData, panel: PanelData, idx?: number): LayoutData; + export declare function converToPanel(source: TabData | PanelData): PanelData; +diff --git a/node_modules/rc-dock/lib/Algorithm.js b/node_modules/rc-dock/lib/Algorithm.js +index 5f22efa..6f547b8 100644 +--- a/node_modules/rc-dock/lib/Algorithm.js ++++ b/node_modules/rc-dock/lib/Algorithm.js +@@ -66,13 +66,16 @@ function nextZIndex(current) { + return ++_zCount; + } + exports.nextZIndex = nextZIndex; ++function compareFindId(item, id) { ++ return item && (typeof id === 'function' ? id(item) : item.id === id); ++} + function findInPanel(panel, id, filter) { +- if (panel.id === id && (filter & Filter.Panel)) { ++ if (compareFindId(panel, id) && (filter & Filter.Panel)) { + return panel; + } + if (filter & Filter.Tab) { + for (let tab of panel.tabs) { +- if (tab.id === id) { ++ if (compareFindId(tab, id)) { + return tab; + } + } +@@ -81,7 +84,7 @@ function findInPanel(panel, id, filter) { + } + function findInBox(box, id, filter) { + let result; +- if ((filter | Filter.Box) && (box === null || box === void 0 ? void 0 : box.id) === id) { ++ if ((filter | Filter.Box) && compareFindId(box, id)) { + return box; + } + if (!(box === null || box === void 0 ? void 0 : box.children)) { +diff --git a/node_modules/rc-dock/lib/DockData.d.ts b/node_modules/rc-dock/lib/DockData.d.ts +index 89b1506..65e58e0 100644 +--- a/node_modules/rc-dock/lib/DockData.d.ts ++++ b/node_modules/rc-dock/lib/DockData.d.ts +@@ -290,7 +290,7 @@ export interface DockContext { + /** + * Find PanelData or TabData by id + */ +- find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined; ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + /** + * Update a tab with new TabData + * @param id tab id to update +diff --git a/node_modules/rc-dock/lib/DockLayout.d.ts b/node_modules/rc-dock/lib/DockLayout.d.ts +index d951ae7..e13b0d8 100644 +--- a/node_modules/rc-dock/lib/DockLayout.d.ts ++++ b/node_modules/rc-dock/lib/DockLayout.d.ts +@@ -111,7 +111,7 @@ export declare class DockLayout extends DockPortalManager implements DockContext + */ + dockMove(source: TabData | PanelData, target: string | TabData | PanelData | BoxData | null, direction: DropDirection, floatPosition?: FloatPosition): void; + /** @inheritDoc */ +- find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined; ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined; + /** @ignore */ + getLayoutSize(): LayoutSize; + /** @inheritDoc */ +diff --git a/node_modules/rc-dock/src/Algorithm.ts b/node_modules/rc-dock/src/Algorithm.ts +index f0844eb..9f2e63b 100644 +--- a/node_modules/rc-dock/src/Algorithm.ts ++++ b/node_modules/rc-dock/src/Algorithm.ts +@@ -79,14 +79,18 @@ export function nextZIndex(current?: number): number { + return ++_zCount; + } + ++function compareFindId(item: PanelData | TabData | BoxData, id: string | ((item: PanelData | TabData | BoxData) => boolean)): boolean { ++ return item && (typeof id === 'function' ? id(item) : item.id === id); ++} ++ + +-function findInPanel(panel: PanelData, id: string, filter: Filter): PanelData | TabData | undefined { +- if (panel.id === id && (filter & Filter.Panel)) { ++function findInPanel(panel: PanelData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter): PanelData | TabData | undefined { ++ if (compareFindId(panel, id) && (filter & Filter.Panel)) { + return panel; + } + if (filter & Filter.Tab) { + for (let tab of panel.tabs) { +- if (tab.id === id) { ++ if (compareFindId(tab, id)) { + return tab; + } + } +@@ -94,9 +98,9 @@ function findInPanel(panel: PanelData, id: string, filter: Filter): PanelData | + return undefined; + } + +-function findInBox(box: BoxData | undefined, id: string, filter: Filter): PanelData | TabData | BoxData | undefined { ++function findInBox(box: BoxData | undefined, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter): PanelData | TabData | BoxData | undefined { + let result: PanelData | TabData | BoxData | undefined; +- if ((filter | Filter.Box) && box?.id === id) { ++ if ((filter | Filter.Box) && compareFindId(box, id)) { + return box; + } + if (!box?.children) { +@@ -133,7 +137,7 @@ export enum Filter { + } + + +-export function find(layout: LayoutData, id: string, filter: Filter = Filter.AnyTabPanel): PanelData | TabData | BoxData | undefined { ++export function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter = Filter.AnyTabPanel): PanelData | TabData | BoxData | undefined { + let result: PanelData | TabData | BoxData | undefined; + + if (filter & Filter.Docked) { +diff --git a/node_modules/rc-dock/src/DockData.ts b/node_modules/rc-dock/src/DockData.ts +index b71c201..7dd9cb9 100644 +--- a/node_modules/rc-dock/src/DockData.ts ++++ b/node_modules/rc-dock/src/DockData.ts +@@ -369,7 +369,7 @@ export interface DockContext { + /** + * Find PanelData or TabData by id + */ +- find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined; ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined; + + /** + * Update a tab with new TabData +diff --git a/node_modules/rc-dock/src/DockLayout.tsx b/node_modules/rc-dock/src/DockLayout.tsx +index fcaea36..472c6b6 100644 +--- a/node_modules/rc-dock/src/DockLayout.tsx ++++ b/node_modules/rc-dock/src/DockLayout.tsx +@@ -277,7 +277,7 @@ export class DockLayout extends DockPortalManager implements DockContext { + } + + /** @inheritDoc */ +- find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined { ++ find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined { + return Algorithm.find(this.getLayout(), id, filter); + } + diff --git a/release/app/package-lock.json b/release/app/package-lock.json new file mode 100644 index 0000000000..33d3a073c1 --- /dev/null +++ b/release/app/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "platform.bible", + "version": "0.3.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "platform.bible", + "version": "0.3.0", + "hasInstallScript": true, + "license": "MIT" + } + } +} diff --git a/release/app/package.json b/release/app/package.json new file mode 100644 index 0000000000..08de947c02 --- /dev/null +++ b/release/app/package.json @@ -0,0 +1,20 @@ +{ + "name": "platform.bible", + "version": "0.3.0", + "description": "Extensible Bible translation software", + "license": "MIT", + "author": { + "name": "Platform", + "url": "https://github.com/paranext/" + }, + "main": "./dist/main/main.js", + "scripts": { + "rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js", + "postinstall": "npm run rebuild && npm run link-modules", + "link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts" + }, + "dependencies": {}, + "volta": { + "extends": "../../package.json" + } +} diff --git a/src/@types/README.md b/src/@types/README.md new file mode 100644 index 0000000000..bb1e9e958f --- /dev/null +++ b/src/@types/README.md @@ -0,0 +1,13 @@ +# Project Types + +This folder contains TypeScript types for local JavaScript files and overrides of npm packages. + +Name the file for the package, i.e. `.d.ts`. If you need supporting files in a folder then use `/index.d.ts`. + +In the file: + +```typescript +declare module '' { + // add additions and overrides here +} +``` diff --git a/src/__tests__/app.component.test.tsx b/src/__tests__/app.component.test.tsx new file mode 100644 index 0000000000..b0db2cbae2 --- /dev/null +++ b/src/__tests__/app.component.test.tsx @@ -0,0 +1,43 @@ +import '@testing-library/jest-dom'; +import { render } from '@testing-library/react'; +import { ProcessType } from '@shared/global-this.model'; +import { PlatformEventEmitter } from 'platform-bible-utils'; +import App from '@renderer/app.component'; + +// #region globalThis setup + +globalThis.processType = ProcessType.Renderer; +globalThis.isPackaged = false; +globalThis.resourcesPath = 'resources://'; + +// #endregion + +jest.mock('@shared/services/network.service', () => ({ + createRequestFunction: + (requestType: string) => + async (...args: unknown[]) => + `Mocked ${requestType} request with args ${args.join(', ')}`, + createNetworkEventEmitter: () => { + return new PlatformEventEmitter(); + }, + papiNetworkService: { + createNetworkEventEmitter: () => { + return new PlatformEventEmitter(); + }, + onDidClientConnect: new PlatformEventEmitter().event, + }, +})); +jest.mock('@renderer/components/docking/platform-dock-layout.component', () => ({ + __esModule: true, + default: /** ParanextDockLayout Mock */ () => undefined, +})); +jest.mock('@renderer/components/platform-bible-toolbar', () => ({ + __esModule: true, + default: /** PlatformBibleToolbar Mock */ () =>
    , +})); + +describe('App', () => { + it('should render', async () => { + expect(render()).toBeTruthy(); + }); +}); diff --git a/src/client/services/client-network-connector.service.ts b/src/client/services/client-network-connector.service.ts new file mode 100644 index 0000000000..97526917a7 --- /dev/null +++ b/src/client/services/client-network-connector.service.ts @@ -0,0 +1,459 @@ +import { + ConnectionStatus, + CONNECTOR_INFO_DISCONNECTED, + InternalEvent, + InternalNetworkEventHandler, + InternalRequest, + InternalRequestHandler, + InternalResponse, + NetworkConnectorInfo, + RequestRouter, +} from '@shared/data/internal-connection.model'; +import { + deserialize, + serialize, + Unsubscriber, + getErrorMessage, + PlatformEventEmitter, +} from 'platform-bible-utils'; +import INetworkConnector from '@shared/services/network-connector.interface'; +import { + InitClient, + Message, + MessageType, + WebSocketEvent, + WebSocketRequest, + WebSocketResponse, + WEBSOCKET_ATTEMPTS_MAX, + WEBSOCKET_ATTEMPTS_WAIT, + WEBSOCKET_PORT, +} from '@shared/data/network-connector.model'; +import logger from '@shared/services/logger.service'; +import { createWebSocket } from '@client/services/web-socket.factory'; +import { IWebSocket } from '@client/services/web-socket.interface'; + +// #region local variables + +// TODO: implement request timeout logic +/** Holds promises for a request */ +type LiveRequest = { + requestId: number; + resolve: (value: InternalResponse | PromiseLike>) => void; + reject: (reason?: unknown) => void; +}; + +/** `localStorage` key to store the current clientGuid */ +const CLIENT_GUID_KEY = 'client-network-connector:clientGuid'; + +// #endregion + +/** Handles the connection from the client to the server */ +export default class ClientNetworkConnector implements INetworkConnector { + // #region INetworkConnector members + + connectorInfo: NetworkConnectorInfo = CONNECTOR_INFO_DISCONNECTED; + connectionStatus: ConnectionStatus = ConnectionStatus.Disconnected; + + // #endregion + + // #region private members + + /** The webSocket connected to the server */ + private webSocket?: IWebSocket; + + /** + * All message subscriptions - emitters that emit an event each time a message with a specific + * message type comes in + */ + private messageEmitters = new Map>(); + + /** + * Promise that resolves when the connection is finished or rejects if disconnected before the + * connection finishes + */ + private connectPromise?: Promise; + + /** Function that removes this initClient handler from the connection */ + private unsubscribeHandleInitClientMessage?: Unsubscriber; + /** Function that removes this response handler from the connection */ + private unsubscribeHandleResponseMessage?: Unsubscriber; + /** Function that removes this handleRequest from the connection */ + private unsubscribeHandleRequestMessage?: Unsubscriber; + /** Function that removes this handleEvent from the connection */ + private unsubscribeHandleEventMessage?: Unsubscriber; + + /** + * Function to call when we receive a request that is registered on this connector. Handles + * requests from the connection and returns a response to send back + */ + private localRequestHandler?: InternalRequestHandler; + /** + * Function to call when we are sending a request. Returns a clientId to which to send the request + * based on the requestType + */ + private requestRouter?: RequestRouter; + /** + * Function to call when we receive an event. Handles events from the connection by emitting the + * event locally + */ + private localEventHandler?: InternalNetworkEventHandler; + + /** All requests that are waiting for a response */ + // Disabled no-explicit-any because assigning a request with generic type to LiveRequest gave error + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private requests = new Map>(); + + /** Unique Guid associated with this connection. Used to verify certain things with server */ + private clientGuid: string | undefined; + + // #endregion + + // #region INetworkConnector methods + + connect = async ( + localRequestHandler: InternalRequestHandler, + requestRouter: RequestRouter, + localEventHandler: InternalNetworkEventHandler, + ) => { + // NOTE: This does not protect against sending two different request handlers. See ConnectionService for that + // We don't need to run this more than once + if (this.connectPromise) return this.connectPromise; + + this.connectionStatus = ConnectionStatus.Connecting; + this.localRequestHandler = localRequestHandler; + this.requestRouter = requestRouter; + this.localEventHandler = localEventHandler; + + /** Function that resolves the connection promise to be run after receiving a client id */ + let resolveConnect: (value: NetworkConnectorInfo | PromiseLike) => void; + /** Function that rejects the connection promise */ + let rejectConnect: (reason?: string) => void; + + /** The promise that resolves when the service is finished connecting */ + this.connectPromise = new Promise((resolve, reject) => { + resolveConnect = resolve; + rejectConnect = reject; + }); + + // Set up subscriptions that the service needs to work + // Get the client id from the server on new connections + this.unsubscribeHandleInitClientMessage = this.subscribe( + MessageType.InitClient, + ({ connectorInfo: newConnectorInfo, clientGuid }: InitClient) => { + this.connectorInfo = Object.freeze(newConnectorInfo); + this.clientGuid = clientGuid; + + if (!this.webSocket) { + rejectConnect('webSocket is gone!'); + return; + } + + // Listen for responses from the server and resolve the request promise + this.unsubscribeHandleResponseMessage = this.subscribe( + MessageType.Response, + this.handleResponseMessage, + ); + + // Listen for requests from the server and run the request handler + this.unsubscribeHandleRequestMessage = this.subscribe( + MessageType.Request, + (requestMessage: WebSocketRequest) => this.handleRequestMessage(requestMessage, true), + ); + + this.unsubscribeHandleEventMessage = this.subscribe( + MessageType.Event, + (eventMessage: WebSocketEvent) => this.handleEventMessage(eventMessage), + ); + + // Finished setting up WebSocketService and connecting! Resolve the promise + this.connectionStatus = ConnectionStatus.Connected; + resolveConnect(this.connectorInfo); + }, + ); + + // Connect the webSocket - try a few times + let attempts = 0; + const tryConnectWebSocket = async () => { + if (attempts < WEBSOCKET_ATTEMPTS_MAX) { + attempts += 1; + this.webSocket = await createWebSocket(`ws://localhost:${WEBSOCKET_PORT}`); + + // Attach event listeners + this.webSocket.addEventListener('message', this.onMessage); + this.webSocket.addEventListener('close', this.disconnect); + + // Remove event listeners and try connecting again + const retry = (e: Event & { error?: Error }) => { + logger.warn( + `ClientNetworkConnector WebSocket did not connect on attempt ${attempts}. Trying again. Error: ${getErrorMessage( + e.error, + )}`, + ); + if (this.webSocket) { + this.webSocket.removeEventListener('message', this.onMessage); + this.webSocket.removeEventListener('close', this.disconnect); + this.webSocket.removeEventListener('error', retry); + } + setTimeout(tryConnectWebSocket, WEBSOCKET_ATTEMPTS_WAIT); + }; + + this.webSocket.addEventListener('error', retry); + + // When we have successfully connected, remove retry-related listeners + const finishConnecting = () => { + if (this.webSocket) { + this.webSocket.removeEventListener('error', retry); + this.webSocket.removeEventListener('open', finishConnecting); + } + }; + + this.webSocket.addEventListener('open', finishConnecting); + } else { + throw new Error( + `ClientNetworkConnector WebSocket was not able to connect after ${attempts} attempts.`, + ); + } + }; + tryConnectWebSocket(); + + return this.connectPromise; + }; + + notifyClientConnected = async () => { + // Check if this client is reconnecting (such as if the browser refreshed) and tell the server so it can remove all request registrations associated with the old clientId + const reconnectingClientGuid = localStorage.getItem(CLIENT_GUID_KEY); + + this.sendMessage({ + type: MessageType.ClientConnect, + senderId: this.connectorInfo.clientId, + reconnectingClientGuid: reconnectingClientGuid ?? undefined, + }); + + // Save the new clientGuid so we can check it when reconnecting + if (this.clientGuid) localStorage.setItem(CLIENT_GUID_KEY, this.clientGuid); + else localStorage.removeItem(CLIENT_GUID_KEY); + + // In webSocket land, we do not receive a response from the server when we notify client connected + // TODO: change the clientConnected into a request that resolves properly. Then we can also know if we reconnected, I suppose + return Promise.resolve(); + }; + + disconnect = () => { + if (this.connectionStatus !== ConnectionStatus.Connected) + throw new Error('Web socket closed without connecting'); + + this.connectionStatus = ConnectionStatus.Disconnected; + this.localRequestHandler = undefined; + this.requestRouter = undefined; + this.localEventHandler = undefined; + this.connectPromise = undefined; + this.connectorInfo = CONNECTOR_INFO_DISCONNECTED; + if (this.unsubscribeHandleInitClientMessage) this.unsubscribeHandleInitClientMessage(); + if (this.unsubscribeHandleResponseMessage) this.unsubscribeHandleResponseMessage(); + if (this.unsubscribeHandleRequestMessage) this.unsubscribeHandleRequestMessage(); + if (this.unsubscribeHandleEventMessage) this.unsubscribeHandleEventMessage(); + + if (this.webSocket) { + this.webSocket.removeEventListener('message', this.onMessage); + this.webSocket.removeEventListener('close', this.disconnect); + this.webSocket.close(); + this.webSocket = undefined; + } + }; + + request = async ( + requestType: string, + request: InternalRequest, + ): Promise> => { + // Set up a promise we can resolve later + let liveRequest: LiveRequest | undefined; + const requestPromise = new Promise>((resolve, reject) => { + liveRequest = { + requestId: request.requestId, + resolve, + reject, + }; + }); + + if (!liveRequest) + throw new Error(`Live request was not created for requestId ${request.requestId}`); + + // Save the live request to resolve when we get the response + this.requests.set(request.requestId, liveRequest); + + // Send the request corresponding to the live request promise + this.handleRequestMessage( + { + type: MessageType.Request, + requestType, + ...request, + }, + false, + ); + + return requestPromise; + }; + + emitEventOnNetwork = async (eventType: string, event: InternalEvent) => { + // TODO: implement some kind of waiting for a connection? This method is async for hopeful forward compatibility + this.sendMessage({ + type: MessageType.Event, + eventType, + ...event, + }); + }; + + // #endregion + + // #region private methods + + /** + * Send a message to the server via webSocket. Throws if not connected + * + * @param message Message to send + */ + private sendMessage = (message: Message): void => { + // TODO: add message queueing + if (this.connectionStatus !== ConnectionStatus.Connected || !this.webSocket) + throw new Error(`Trying to send message when not connected! Message ${message}`); + + if ( + message.type === MessageType.Response && + this.connectorInfo.clientId === message.requesterId + ) { + // This message is from us and for us. Handle the message as if we just received it + this.onMessage( + // Fake enough of the message event to handle it. + /* eslint-disable no-type-assertion/no-type-assertion */ + { + data: message as unknown as string, + } as MessageEvent, + /* eslint-enable */ + true, + ); + } else { + // This message is for someone else. Send the message + this.webSocket.send(serialize(message)); + } + }; + + /** + * Receives and appropriately publishes server webSocket messages + * + * @param event WebSocket message information + * @param fromSelf Whether this message is from this connector instead of from someone else + */ + private onMessage = (event: MessageEvent, fromSelf = false) => { + // Assert our specific message type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + const data: Message = fromSelf ? (event.data as unknown as Message) : deserialize(event.data); + + const emitter = this.messageEmitters.get(data.type); + emitter?.emit(data); + }; + + /** + * Subscribes a function to run on webSocket messages of a particular type + * + * @param messageType The type of message on which to subscribe the function + * @param callback Function to run with the contents of the webSocket message + * @returns Unsubscriber function to run to stop calling the passed-in function on webSocket + * messages + */ + private subscribe = ( + messageType: MessageType, + // Any is here because I dunno how to narrow Message type to a specific message type in parameters of a function + // TODO: investigate this further another time + // eslint-disable-next-line @typescript-eslint/no-explicit-any + callback: (eventData: Message | any) => void, + ): Unsubscriber => { + let emitter = this.messageEmitters.get(messageType); + if (!emitter) { + emitter = new PlatformEventEmitter(); + this.messageEmitters.set(messageType, emitter); + } + return emitter.subscribe(callback); + }; + + /** + * Function that handles webSocket messages of type Response. Resolves the request associated with + * the received response message + * + * @param response Response message to resolve + */ + private handleResponseMessage = (response: WebSocketResponse) => { + const { requesterId, senderId, requestId } = response; + if (this.connectorInfo.clientId !== requesterId) + throw new Error( + `Received response from responder senderId ${senderId} with wrong requesterId ${requesterId}!`, + ); + + const liveRequest = this.requests.get(requestId); + if (!liveRequest) + throw new Error( + `Received response from responder senderId ${senderId} for nonexistent requestId ${requestId}`, + ); + + // Remove the request from the requests because it is receiving a response + this.requests.delete(requestId); + + // Run the request's response function with the response + liveRequest.resolve(response); + }; + + /** + * Function that handles incoming webSocket messages and locally sent messages of type Request. + * Runs the requestHandler provided in connect() and sends a message with the response + * + * @param requestMessage Request message to handle + * @param isIncoming Whether this message is coming from the server and we should definitely + * handle it locally or if it is a locally sent request and we should send to the server if we + * don't have a local handler + */ + private handleRequestMessage = async ( + requestMessage: WebSocketRequest, + isIncoming: boolean, + ) => { + if (!this.requestRouter) + throw new Error(`Received a request but cannot route it without a requestRouter`); + + // Figure out if we can handle this request or if we need to send it + // We should handle it here if it came from the server (which means the server thinks we have a handler for it) + // or if we actually have a handler for it. Otherwise send the request to the server + if ( + isIncoming || + this.connectorInfo.clientId === this.requestRouter(requestMessage.requestType) + ) { + // This request is ours. Handle the request + if (!this.localRequestHandler) throw new Error('Handling request without a requestHandler!'); + + // Run the request handler for this request + const response = await this.localRequestHandler(requestMessage.requestType, requestMessage); + + // Send the response to this request + this.sendMessage({ + type: MessageType.Response, + requestType: requestMessage.requestType, + ...response, + }); + } else { + // This request is for someone else. Send the request to the server to handle/forward + this.sendMessage(requestMessage); + } + }; + + /** + * Function that handles incoming webSocket messages of type Event. Runs the eventHandler provided + * in connect() + * + * @param eventMessage Event message to handle + */ + private handleEventMessage = (eventMessage: WebSocketEvent) => { + if (!this.localEventHandler) + throw new Error(`Received an event but cannot handle it without an eventHandler`); + + this.localEventHandler(eventMessage.eventType, eventMessage); + }; + + // #endregion +} diff --git a/src/client/services/web-socket.factory.ts b/src/client/services/web-socket.factory.ts new file mode 100644 index 0000000000..221b984de3 --- /dev/null +++ b/src/client/services/web-socket.factory.ts @@ -0,0 +1,25 @@ +/** + * Creates a WebSocket from the node ws library or from the browser WebSocket depending on if we're + * in node or browser. + */ + +import { isRenderer } from '@shared/utils/internal-util'; +import { IWebSocket } from './web-socket.interface'; + +/** + * Creates a WebSocket for the renderer or extension host depending on where you're running + * + * @returns WebSocket + */ +// eslint-disable-next-line import/prefer-default-export +export const createWebSocket = async (url: string): Promise => { + if (isRenderer()) { + const Ws = (await import('@renderer/services/renderer-web-socket.service')).default; + return new Ws(url); + } + const Ws = (await import('@extension-host/services/extension-host-web-socket.model')).default; + // Assert the return type. Note: this web socket is missing the `dispatchEvent` property that the + // renderer type has. + // eslint-disable-next-line no-type-assertion/no-type-assertion + return new Ws(url) as unknown as IWebSocket; +}; diff --git a/src/client/services/web-socket.interface.ts b/src/client/services/web-socket.interface.ts new file mode 100644 index 0000000000..90bf477cec --- /dev/null +++ b/src/client/services/web-socket.interface.ts @@ -0,0 +1,8 @@ +/** + * Interface that defines the webSocket functionality the extension host and the renderer must + * implement. Used by WebSocketFactory to supply the right kind of WebSocket to + * ClientNetworkConnector. For now, we are just using the browser WebSocket type. We may need + * specific functionality that don't line up between the ws library's implementation and the browser + * implementation. We can adjust as needed at that point. + */ +export type IWebSocket = WebSocket; diff --git a/src/declarations/README.md b/src/declarations/README.md new file mode 100644 index 0000000000..cf4092ded7 --- /dev/null +++ b/src/declarations/README.md @@ -0,0 +1,9 @@ +# paranext-core/src/declarations + +A special folder with type declarations shared between core and extensions + +Files in this folder should only be `.ts` files that contain declarations of types that core and extensions need to share and use together. The contents of these files are bundled into `papi.d.ts`. These files should be `.ts` files as opposed to `.d.ts` files because TypeScript creates `reference` imports to `.d.ts` files instead of bundling them into `papi.d.ts`, but we want `papi.d.ts` to be one independent file. + +For example, `papi-shared-types.ts` contains an interface that defines command handlers. Core and extensions both define and use each others' command handlers, so they both `declare module 'papi-shared-types'` and extend the `CommandHandlers` interface. That way, both core and extensions can use each others' command handler types. + +All new type declaration names should start with `@papi` or `papi-` to inherit some ESLint rules that ignore unnecessary errors. diff --git a/src/declarations/papi-shared-types.ts b/src/declarations/papi-shared-types.ts new file mode 100644 index 0000000000..9c0d438344 --- /dev/null +++ b/src/declarations/papi-shared-types.ts @@ -0,0 +1,529 @@ +declare module 'papi-shared-types' { + import type { ScriptureReference, UnsubscriberAsync } from 'platform-bible-utils'; + import type { + DataProviderDataType, + DataProviderDataTypes, + DataProviderSubscriberOptions, + DataProviderUpdateInstructions, + } from '@shared/models/data-provider.model'; + import type { + MandatoryProjectDataTypes, + PROJECT_INTERFACE_PLATFORM_BASE, + WithProjectDataProviderEngineExtensionDataMethods, + } from '@shared/models/project-data-provider.model'; + import type { IDisposableDataProvider } from '@shared/models/data-provider.interface'; + import type IDataProvider from '@shared/models/data-provider.interface'; + import type ExtractDataProviderDataTypes from '@shared/models/extract-data-provider-data-types.model'; + + // #region Commands + + // TODO: Adding an index type removes type checking on the key :( How do we make sure extensions provide only functions? + /** + * Function types for each command available on the papi. Each extension can extend this interface + * to add commands that it registers on the papi with `papi.commands.registerCommand`. + * + * Note: Command names must consist of two strings separated by at least one period. We recommend + * one period and lower camel case in case we expand the api in the future to allow dot notation. + * + * An extension can extend this interface to add types for the commands it registers by adding the + * following to its `.d.ts` file: + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface CommandHandlers { + * 'myExtension.myCommand1': (foo: string, bar: number) => string; + * 'myExtension.myCommand2': (foo: string) => Promise; + * } + * } + * ``` + */ + export interface CommandHandlers { + // These commands are provided in `main.ts`. They are only here because I needed them to use in + // other places, but building `papi-dts` wasn't working because it didn't see `main.ts` + 'test.echo': (message: string) => string; + 'test.echoExtensionHost': (message: string) => Promise; + 'test.throwError': (message: string) => void; + 'platform.restartExtensionHost': () => Promise; + 'platform.quit': () => Promise; + 'platform.openProjectSettings': (webViewId: string) => Promise; + 'platform.openUserSettings': () => Promise; + // These commands are provided in `extension-host.ts`. They are only here because I needed them to + // use in other places, but building `papi-dts` wasn't working because it didn't see + // `extension-host.ts` + 'test.addMany': (...nums: number[]) => number; + 'test.throwErrorExtensionHost': (message: string) => void; + } + + /** + * Names for each command available on the papi. + * + * Automatically includes all extensions' commands that are added to {@link CommandHandlers}. + * + * @example 'platform.quit'; + */ + export type CommandNames = keyof CommandHandlers; + + // #endregion + + // #region User Settings + + /** + * Types corresponding to each user setting available in Platform.Bible. Keys are setting names, + * and values are setting data types. Extensions can add more user setting types with + * corresponding user setting IDs by adding details to their `.d.ts` file. + * + * Note: Setting names must consist of two strings separated by at least one period. We recommend + * one period and lower camel case in case we expand the api in the future to allow dot notation. + * + * An extension can extend this interface to add types for the user settings it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `myExtension.highlightColor` setting): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface SettingTypes { + * 'myExtension.highlightColor': string | { r: number; g: number; b: number }; + * } + * } + * ``` + */ + export interface SettingTypes { + /** + * Current Verse Reference for Scroll Group A. Deprecated - please use `papi.scrollGroups` and + * `useWebViewScrollGroupScrRef` + */ + 'platform.verseRef': ScriptureReference; + /** + * List of locales to use when localizing the interface. First in the list receives highest + * priority. Please always add 'en' (English) at the end when using this setting so everything + * localizes to English if it does not have a localization in a higher-priority locale. + */ + 'platform.interfaceLanguage': string[]; + /** + * Mementos managed in the dotnet process and used for interacting with PtxUtils. Mementos are + * persisted objects containing some data. They are stored as xml strings. + */ + 'platform.ptxUtilsMementoData': { [key: string]: string }; + /** + * Tracking last S/R registry data cache time managed in the dotnet process and used for + * interacting with ParatextData. + */ + 'platform.paratextDataLastRegistryDataCachedTimes': { [key: string]: string }; + } + + /** + * Names for each user setting available on the papi. + * + * Automatically includes all extensions' user settings that are added to {@link SettingTypes}. + * + * @example 'platform.verseRef' + */ + export type SettingNames = keyof SettingTypes; + + // #endregion + + // #region Project Settings + + /** + * Types corresponding to each project setting available in Platform.Bible. Keys are project + * setting names, and values are project setting data types. Extensions can add more project + * setting types with corresponding project setting IDs by adding details to their `.d.ts` file. + * + * Note: Project setting names must consist of two strings separated by at least one period. We + * recommend one period and lower camel case in case we expand the api in the future to allow dot + * notation. + * + * An extension can extend this interface to add types for the project settings it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `myExtension.highlightColor` project setting): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export interface ProjectSettingTypes { + * 'myExtension.highlightColor': string | { r: number; g: number; b: number }; + * } + * } + * ``` + */ + export interface ProjectSettingTypes { + /** + * Localized name of the language in which this project is written. This will be displayed + * directly in the UI. + * + * @example 'English' + */ + 'platform.language': string; + /** + * Short name of the project (not necessarily unique). This will be displayed directly in the + * UI. + * + * @example 'WEB' + */ + 'platform.name': string; + /** + * Localized full name of the project. This will be displayed directly in the UI. + * + * @example 'World English Bible' + */ + 'platform.fullName': string; + /** + * Whether or not the project is editable. This is a general "editable", not necessarily that it + * is editable by the current user. + * + * Projects that are not editable are sometimes called "resources". + */ + 'platform.isEditable': boolean; + } + + /** + * Names for each user setting available on the papi. + * + * Automatically includes all extensions' user settings that are added to + * {@link ProjectSettingTypes}. + * + * @example 'platform.fullName' + */ + export type ProjectSettingNames = keyof ProjectSettingTypes; + + // #endregion + + // #region Project Data Provider + + /** + * The `Setting` methods required for a Project Data Provider Engine to fulfill the requirements + * of {@link MandatoryProjectDataTypes}'s `Setting` data type. + */ + export type WithProjectDataProviderEngineSettingMethods< + TProjectDataTypes extends DataProviderDataTypes, + > = { + /** + * Set the value of the specified project setting on this project. + * + * Note for implementing: `setSetting` must call `papi.projectSettings.isValid` before allowing + * the setting change. + * + * @param key The string id of the project setting to change + * @param newSetting The value that is to be set to the project setting. + * @returns Information that papi uses to interpret whether to send out updates. Defaults to + * `true` (meaning send updates only for this data type). + * @throws If the setting validator failed. + * @see {@link DataProviderUpdateInstructions} for more info on what to return + */ + setSetting: ( + key: ProjectSettingName, + newSetting: ProjectSettingTypes[ProjectSettingName], + ) => Promise>; + /** + * Get the value of the specified project setting. + * + * Note: This is good for retrieving a project setting once. If you want to keep the value + * up-to-date, use `subscribeSetting` instead, which can immediately give you the value and keep + * it up-to-date. + * + * Note for implementing: `getSetting` must call `papi.projectSettings.getDefault` if this + * project does not have a value for this setting + * + * @param key The string id of the project setting to get + * @returns The value of the specified project setting. Returns default setting value if the + * project setting does not exist on the project. + * @throws If no default value is available for the setting. + */ + getSetting: ( + key: ProjectSettingName, + ) => Promise; + /** + * Deletes the specified project setting, setting it back to its default value. + * + * Note for implementing: `resetSetting` should remove the value for this setting for this + * project such that calling `getSetting` later would cause it to call + * `papi.projectSettings.getDefault` and return the default value. + * + * @param key The string id of the project setting to reset + * @returns `true` if successfully reset the project setting, `false` otherwise + */ + resetSetting: ( + key: ProjectSettingName, + ) => Promise; + }; + + /** + * An object on the papi for interacting with that project data. Created by the papi and layers + * over an {@link IProjectDataProviderEngine} provided by an extension. Returned from getting a + * project data provider with `papi.projectDataProviders.get`. + * + * Project Data Providers are a specialized version of {@link IDataProvider} that work with + * projects by exposing methods according to a set of `projectInterface`s. For each project + * available, a Project Data Provider Factory that supports that project with some set of + * `projectInterface`s creates a new instance of a PDP with the supported `projectInterface`s. + * + * Often, these objects are Layering PDPs, meaning they manipulate data provided by Base PDPs + * which actually control the saving and loading of the data. Base PDPs must implement + * {@link IBaseProjectDataProvider}, which imposes additional requirements. + * + * See more information, including the difference between Base and Layering PDPs, at + * {@link ProjectDataProviderInterfaces}. + */ + export type IProjectDataProvider = + IDataProvider; + + /** + * An object on the papi for interacting with that project data. Created by the papi and layers + * over an {@link IBaseProjectDataProviderEngine} provided by an extension. Sometimes returned from + * getting a project data provider with `papi.projectDataProviders.get` (depending on if the PDP + * supports the `platform.base` `projectInterface`). + * + * Project Data Providers are a specialized version of {@link IDataProvider} that work with + * projects by exposing methods according to a set of `projectInterface`s. For each project + * available, a Project Data Provider Factory that supports that project with some set of + * `projectInterface`s creates a new instance of a PDP with the supported `projectInterface`s. + * + * Every Base PDP **must** fulfill the requirements of this interface in order to support the + * methods the PAPI requires for interacting with project data. + * + * See more information, including the difference between Base and Layering PDPs, at + * {@link ProjectDataProviderInterfaces}. + */ + export type IBaseProjectDataProvider = + IProjectDataProvider & + WithProjectDataProviderEngineSettingMethods & + WithProjectDataProviderEngineExtensionDataMethods & { + /** + * Subscribe to receive updates to the specified project setting. + * + * Note: By default, this `subscribeSetting` function automatically retrieves the current + * project setting value and runs the provided callback as soon as possible. That way, if + * you want to keep your data up-to-date, you do not also have to run `getSetting`. You can + * turn this functionality off in the `options` parameter. + * + * @param key The string id of the project setting for which to listen to changes + * @param callback Function to run with the updated project setting value + * @param options Various options to adjust how the subscriber emits updates + * @returns Unsubscriber to stop listening for updates + */ + subscribeSetting: ( + key: ProjectSettingName, + callback: (value: ProjectSettingTypes[ProjectSettingName]) => void, + options: DataProviderSubscriberOptions, + ) => Promise; + }; + + /** This is just a simple example so we have more than one. It's not intended to be real. */ + export type NotesOnlyProjectDataTypes = MandatoryProjectDataTypes & { + Notes: DataProviderDataType; + }; + + /** + * {@link IProjectDataProvider} types for each `projectInterface` supported by PAPI. Extensions can + * add more Project Data Providers with corresponding `projectInterface`s by adding details to + * their `.d.ts` file and registering a Project Data Provider factory with the corresponding + * `projectInterface`. + * + * There are two types of Project Data Providers (and Project Data Provider Factories that serve + * them): + * + * 1. Base Project Data Provider - provides project data via some `projectInterface`s for its own + * projects with **its own unique project ids**. These PDPs **must support the `platform.base` + * `projectInterface` by implementing {@link IBaseProjectDataProvider}**. More information + * below. + * 2. Layering Project Data Provider - layers over other PDPs and provides additional + * `projectInterface`s for projects on other PDPs. Likely **does not provide its own unique + * project ids** but rather layers over base PDPs' project ids. These PDPs **do not need to + * support the `platform.base` `projectInterface` and should instead implement + * {@link IProjectDataProvider}**. Instead of providing projects themselves, they likely use the + * `ExtensionData` data type exposed via the `platform.base` `projectInterface` on Base PDPs to + * provide additional project data on top of Base PDPs. + * + * All Base Project Data Provider Interfaces' data types **must** implement + * {@link IBaseProjectDataProvider} (which extends {@link MandatoryProjectDataTypes}) like in the + * following example. Please see its documentation for information on how Project Data Providers + * can implement this interface. + * + * Note: The keys of this interface are the `projectInterface`s for the associated Project Data + * Provider Interfaces. `projectInterface`s represent standardized sets of methods on a PDP. + * + * WARNING: Each Base Project Data Provider **must** fulfill certain requirements for its + * `getSetting`, `setSetting`, `resetSetting`, `getExtensionData`, and `setExtensionData` methods. + * See {@link IBaseProjectDataProvider} and {@link MandatoryProjectDataTypes} for more information. + * + * An extension can extend this interface to add types for the Project Data Provider Interfaces + * its registered factory provides by adding the following to its `.d.ts` file (in this example, + * we are adding a Base Project Data Provider interface for the `MyExtensionBaseProjectInterface` + * `projectInterface` and a Layering Project Data Provider interface for the + * `MyExtensionLayeringProjectInterface` `projectInterface`): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export type MyBaseProjectDataTypes = { + * MyProjectData: DataProviderDataType; + * }; + * + * export type MyLayeringProjectDataTypes = { + * MyOtherProjectData: DataProviderDataType; + * }; + * + * export interface ProjectDataProviderInterfaces { + * // Note that the base PDP implements `I**Base**ProjectDataProvider` + * MyExtensionBaseProjectInterface: IBaseProjectDataProvider; + * // Note that the layering PDP only implements `IProjectDataProvider` because the base PDP already + * // provides the `platform.base` data types + * MyExtensionLayeringProjectInterface: IProjectDataProvider; + * } + * } + * ``` + */ + export interface ProjectDataProviderInterfaces { + /** + * Base `projectInterface` that all PDPs that expose their own unique project ids must + * implement. + * + * There should be a PDP that provides `platform.base` for all available project ids. + */ + [PROJECT_INTERFACE_PLATFORM_BASE]: IBaseProjectDataProvider; + 'platform.notesOnly': IProjectDataProvider; + 'platform.placeholder': IProjectDataProvider; + } + + /** + * Names for each `projectInterface` available on the papi. `projectInterface`s represent + * standardized sets of methods on a PDP. Extensions can register a Project Data Provider Factory + * with one or more `projectInterface`s to indicate that factory provides Project Data Providers + * that have the methods associated with those `projectInterface`s. + * + * Automatically includes all extensions' `projectInterface`s that are added to + * {@link ProjectDataProviderInterfaces}. + * + * @example 'platform.notesOnly' + */ + export type ProjectInterfaces = keyof ProjectDataProviderInterfaces; + + /** + * `DataProviderDataTypes` for each Project Data Provider Interface supported by PAPI. These are + * the data types served by Project Data Providers for each `projectInterface`. + * + * Automatically includes all extensions' `projectInterface`s that are added to + * {@link ProjectDataProviderInterfaces}. + * + * Note: The keys of this interface are the `projectInterface`s for the associated project data + * provider interface data types. `projectInterface`s represent standardized sets of methods on a + * PDP. + * + * @example + * + * ```typescript + * ProjectInterfaceDataTypes['MyExtensionProjectInterfaceName'] => MandatoryProjectDataTypes & { + * MyProjectData: DataProviderDataType; + * } + * ``` + */ + export type ProjectInterfaceDataTypes = { + [ProjectInterface in ProjectInterfaces]: ExtractDataProviderDataTypes< + ProjectDataProviderInterfaces[ProjectInterface] + >; + }; + + // #endregion + + // #region Data Provider + + type StuffDataTypes = { Stuff: DataProviderDataType }; + + type PlaceholderDataTypes = { + Placeholder: DataProviderDataType<{ thing: number }, string[], number>; + }; + + /** + * {@link IDataProvider} types for each data provider supported by PAPI. Extensions can add more + * data providers with corresponding data provider IDs by adding details to their `.d.ts` file and + * registering a data provider engine in their `activate` function with + * `papi.dataProviders.registerEngine`. + * + * Note: Data Provider names must consist of two strings separated by at least one period. We + * recommend one period and lower camel case in case we expand the api in the future to allow dot + * notation. + * + * An extension can extend this interface to add types for the data provider it registers by + * adding the following to its `.d.ts` file (in this example, we are adding the + * `'helloSomeone.people'` data provider types): + * + * @example + * + * ```typescript + * declare module 'papi-shared-types' { + * export type PeopleDataTypes = { + * Greeting: DataProviderDataType; + * Age: DataProviderDataType; + * People: DataProviderDataType; + * }; + * + * export type PeopleDataMethods = { + * deletePerson(name: string): Promise; + * testRandomMethod(things: string): Promise; + * }; + * + * export type PeopleDataProvider = IDataProvider & PeopleDataMethods; + * + * export interface DataProviders { + * 'helloSomeone.people': PeopleDataProvider; + * } + * } + * ``` + */ + export interface DataProviders { + 'platform.stuff': IDataProvider; + 'platform.placeholder': IDataProvider; + } + + /** + * Names for each data provider available on the papi. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + * + * @example 'platform.placeholder' + */ + export type DataProviderNames = keyof DataProviders; + + /** + * `DataProviderDataTypes` for each data provider supported by PAPI. These are the data types + * served by each data provider. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + * + * @example + * + * ```typescript + * DataProviderTypes['helloSomeone.people'] => { + * Greeting: DataProviderDataType; + * Age: DataProviderDataType; + * People: DataProviderDataType; + * } + * ``` + */ + export type DataProviderTypes = { + [DataProviderName in DataProviderNames]: ExtractDataProviderDataTypes< + DataProviders[DataProviderName] + >; + }; + + /** + * Disposable version of each data provider type supported by PAPI. These objects are only + * returned from `papi.dataProviders.registerEngine` - only the one who registers a data provider + * engine is allowed to dispose of the data provider. + * + * Automatically includes all extensions' data providers that are added to {@link DataProviders}. + */ + export type DisposableDataProviders = { + [DataProviderName in DataProviderNames]: IDisposableDataProvider< + DataProviders[DataProviderName] + >; + }; + + // #endregion +} diff --git a/src/extension-host/data/core-project-settings-info.data.ts b/src/extension-host/data/core-project-settings-info.data.ts new file mode 100644 index 0000000000..f468a70e38 --- /dev/null +++ b/src/extension-host/data/core-project-settings-info.data.ts @@ -0,0 +1,56 @@ +import { + AllProjectSettingsValidators, + ProjectSettingValidator, +} from '@shared/services/project-settings.service-model'; +import { ProjectSettingsContribution } from 'platform-bible-utils'; + +/** Info about all project settings built into core. Does not contain info for extensions' settings */ +export const platformProjectSettings: ProjectSettingsContribution = { + label: '%project_settings_platform_group1_label%', + description: '%project_settings_platform_group1_description%', + properties: { + 'platform.name': { + label: '%project_settings_platform_name_label%', + default: '%project_name_missing%', + }, + 'platform.fullName': { + label: '%project_settings_platform_fullName_label%', + default: '%project_full_name_missing%', + }, + 'platform.language': { + label: '%project_settings_platform_language_label%', + default: '%project_language_missing%', + }, + 'platform.isEditable': { + label: '%project_settings_platform_isEditable_label%', + description: '%project_settings_platform_isEditable_description%', + default: true, + }, + }, +}; + +const nonEmptyStringValidator = async (newValue: string) => { + return typeof newValue === 'string' && newValue.length > 0; +}; + +const nameValidator: ProjectSettingValidator<'platform.name'> = nonEmptyStringValidator; +const fullNameValidator: ProjectSettingValidator<'platform.fullName'> = nonEmptyStringValidator; + +// TODO: Validate that strings in the array to match BCP 47 values once the i18n code is ready +const languageValidator: ProjectSettingValidator<'platform.language'> = async ( + newValue: string, +): Promise => { + return typeof newValue === 'string'; +}; + +const isEditableValidator: ProjectSettingValidator<'platform.isEditable'> = async ( + newValue: boolean, +) => typeof newValue === 'boolean'; + +/** Info about all settings built into core. Does not contain info for extensions' settings */ +export const coreProjectSettingsValidators: Partial = { + 'platform.name': nameValidator, + 'platform.fullName': fullNameValidator, + 'platform.language': languageValidator, + 'platform.isEditable': isEditableValidator, +}; diff --git a/src/extension-host/data/core-settings-info.data.ts b/src/extension-host/data/core-settings-info.data.ts new file mode 100644 index 0000000000..081c82d5cb --- /dev/null +++ b/src/extension-host/data/core-settings-info.data.ts @@ -0,0 +1,72 @@ +import { AllSettingsValidators, SettingValidator } from '@shared/services/settings.service-model'; +import { isString, ScriptureReference, SettingsContribution } from 'platform-bible-utils'; + +/** Contribution of all settings built into core. Does not contain info for extensions' settings */ +export const platformSettings: SettingsContribution = { + label: '%settings_platform_group1_label%', + description: '%settings_platform_group1_description%', + properties: { + 'platform.verseRef': { + label: '%settings_platform_verseRef_label%', + description: '%settings_platform_verseRef_description%', + default: { bookNum: 1, chapterNum: 1, verseNum: 1 }, + }, + 'platform.interfaceLanguage': { + label: '%settings_platform_interfaceLanguage_label%', + description: '%settings_platform_interfaceLanguage_description%', + default: ['eng'], + }, + 'platform.ptxUtilsMementoData': { + label: '%settings_platform_ptxUtilsMementoData_label%', + default: {}, + }, + 'platform.paratextDataLastRegistryDataCachedTimes': { + label: '%settings_platform_paratextDataLastRegistryDataCachedTimes_label%', + default: {}, + }, + }, +}; + +// TODO: Add range checking of BCV numbers given the current versification +export const verseRefSettingsValidator: SettingValidator<'platform.verseRef'> = async ( + newValue: ScriptureReference, +): Promise => { + return ( + 'bookNum' in newValue && + 'chapterNum' in newValue && + 'verseNum' in newValue && + typeof newValue.bookNum === 'number' && + typeof newValue.chapterNum === 'number' && + typeof newValue.verseNum === 'number' && + newValue.bookNum >= 0 && + newValue.chapterNum >= 0 && + newValue.verseNum >= 0 + ); +}; + +// TODO: Validate that strings in the array to match BCP 47 values once the i18n code is ready +const interfaceLanguageValidator: SettingValidator<'platform.interfaceLanguage'> = async ( + newValue: string[], +): Promise => { + return ( + typeof newValue === 'object' && + Array.isArray(newValue) && + newValue.length > 0 && + typeof newValue[0] === 'string' + ); +}; + +// TODO: validate that the values are xml strings. Maybe move this validator to dotnet? +const serializableStringDictionarySettingValidator: SettingValidator< + 'platform.ptxUtilsMementoData' | 'platform.paratextDataLastRegistryDataCachedTimes' +> = async (newValue) => { + return typeof newValue === 'object' && Object.values(newValue).every((value) => isString(value)); +}; + +/** Info about all settings built into core. Does not contain info for extensions' settings */ +export const coreSettingsValidators: Partial = { + 'platform.verseRef': verseRefSettingsValidator, + 'platform.interfaceLanguage': interfaceLanguageValidator, + 'platform.ptxUtilsMementoData': serializableStringDictionarySettingValidator, + 'platform.paratextDataLastRegistryDataCachedTimes': serializableStringDictionarySettingValidator, +}; diff --git a/src/extension-host/data/menu.data.json b/src/extension-host/data/menu.data.json new file mode 100644 index 0000000000..6b720f1f59 --- /dev/null +++ b/src/extension-host/data/menu.data.json @@ -0,0 +1,118 @@ +{ + "mainMenu": { + "columns": { + "platform.project": { "label": "%mainMenu_project%", "order": 1 }, + "platform.window": { "label": "%mainMenu_window%", "order": 2 }, + "platform.layout": { "label": "%mainMenu_layout%", "order": 3 }, + "platform.help": { "label": "%mainMenu_help%", "order": 4 }, + "isExtensible": true + }, + "groups": { + "platform.projectProjects": { + "column": "platform.project", + "order": 1, + "isExtensible": true + }, + "platform.projectResources": { + "column": "platform.project", + "order": 2, + "isExtensible": true + }, + "platform.projectSettings": { "column": "platform.project", "order": 3 }, + "platform.projectMisc": { "column": "platform.project", "order": 4 }, + "platform.windowGroup": { "column": "platform.window", "order": 1 }, + "platform.layoutGroup": { "column": "platform.layout", "order": 1 }, + "platform.helpMisc": { "column": "platform.help", "order": 1 } + }, + "items": [ + { + "label": "%mainMenu_downloadSlashInstallResources%", + "localizeNotes": "Application main menu > Project > Download/Install Resources", + "group": "platform.projectResources", + "order": 1, + "command": "platform.downloadAndInstallResources" + }, + { + "label": "%mainMenu_settings%", + "localizeNotes": "Application main menu > Project > Settings", + "group": "platform.projectSettings", + "order": 1, + "command": "platform.openUserSettings" + }, + { + "label": "%mainMenu_exit%", + "localizeNotes": "Application main menu > Project > Exit", + "group": "platform.projectMisc", + "order": 999999999, + "command": "platform.quit" + }, + { + "label": "%mainMenu_visitSupportBible%", + "localizeNotes": "Application main menu > Help > Visit Support.Bible", + "group": "platform.helpMisc", + "order": 1, + "command": "platform.visitSupportPage" + }, + { + "label": "%mainMenu_about%", + "localizeNotes": "Application main menu > Help > About (Platform.Bible or Software white-label name)", + "group": "platform.helpMisc", + "order": 2, + "command": "platform.about" + } + ] + }, + "defaultWebViewTopMenu": { + "columns": { + "platform.project": { "label": "%webView_project%", "order": 1 }, + "platform.edit": { "label": "%webView_edit%", "order": 2, "isExtensible": true } + }, + "groups": { + "platform.projectTop": { "column": "platform.project", "order": 1, "isExtensible": true }, + "platform.manageBooks": { "column": "platform.project", "order": 2 }, + "platform.deleteProject": { "column": "platform.project", "order": 3 }, + "platform.projectDetails": { "column": "platform.project", "order": 4, "isExtensible": true }, + "platform.undoRedo": { "column": "platform.edit", "order": 1 }, + "platform.cutCopyPaste": { "column": "platform.edit", "order": 2 } + }, + "items": [ + { + "label": "%webView_projectAssignmentsAndProgress%", + "localizeNotes": "Web view main menu > Project > Assignments and progress...", + "group": "platform.projectTop", + "order": 2, + "command": "platform.assignments" + }, + { + "label": "%webView_openProjectSettings%", + "localizeNotes": "Web view main menu > Project > Open Project Settings...", + "group": "platform.projectTop", + "order": 3, + "command": "platform.openProjectSettings" + } + ] + }, + "defaultWebViewContextMenu": { + "groups": { + "platform.insert": { "order": 1, "isExtensible": true }, + "platform.wordList": { "order": 2, "isExtensible": true } + }, + "items": [ + { + "label": "%insertNote%", + "localizeNotes": "Web view context menu > Insert note...", + "group": "platform.insert", + "order": 1, + "command": "platform.insertNote" + }, + { + "label": "%wordList%", + "localizeNotes": "Web view context menu > Word list...", + "group": "platform.wordList", + "order": 1, + "command": "platform.openWordList" + } + ] + }, + "webViewMenus": {} +} diff --git a/src/extension-host/extension-host.ts b/src/extension-host/extension-host.ts new file mode 100644 index 0000000000..a029832b83 --- /dev/null +++ b/src/extension-host/extension-host.ts @@ -0,0 +1,154 @@ +import '@extension-host/global-this.model'; +import { isClient } from '@shared/utils/internal-util'; +import * as networkService from '@shared/services/network.service'; +import * as extensionService from '@extension-host/services/extension.service'; +import { fetch as papiFetch } from '@extension-host/services/papi-backend.service'; +import logger from '@shared/services/logger.service'; +import networkObjectService from '@shared/services/network-object.service'; +import dataProviderService from '@shared/services/data-provider.service'; +import extensionAssetService from '@shared/services/extension-asset.service'; +import { getErrorMessage, isString, substring } from 'platform-bible-utils'; +import { CommandNames } from 'papi-shared-types'; +import { registerCommand } from '@shared/services/command.service'; +import { initialize as initializeMenuData } from '@extension-host/services/menu-data.service-host'; +import { initialize as initializeSettingsService } from '@extension-host/services/settings.service-host'; +import { startProjectSettingsService } from '@extension-host/services/project-settings.service-host'; +import { initialize as initializeLocalizationService } from '@extension-host/services/localization.service-host'; +import { gracefulShutdownMessage } from '@node/models/interprocess-messages.model'; +import { killChildProcessesFromExtensions } from './services/create-process.service'; + +logger.info( + `Starting extension-host${globalThis.isNoisyDevModeEnabled ? ' in noisy dev mode' : ''}`, +); +logger.info(`Extension host process.env.NODE_ENV = ${process.env.NODE_ENV}`); + +// Make a graceful way to tear down the process since Windows and POSIX operating systems handle it differently +process.on('message', (message) => { + if (isString(message) && message === gracefulShutdownMessage) { + logger.info('Shutting down process due to graceful shutdown message'); + process.exit(); + } +}); + +// Try to kill child processes that extensions created +process.on('exit', () => { + killChildProcessesFromExtensions(); +}); + +// #region Services setup + +(async () => { + try { + // The network service has to be running before anything else + await networkService.initialize(); + + // Prepare all services that need to be running because extensions might rely on them + await Promise.all([ + extensionAssetService.initialize(), + initializeLocalizationService(), + initializeMenuData(), + initializeSettingsService(), + startProjectSettingsService(), + ]); + + // The extension service locks down importing other modules, so be careful what runs after it + await extensionService.initialize(); + } catch (error) { + logger.error(error); + } +})(); + +// #endregion + +// #region Noisy dev tests + +if (globalThis.isNoisyDevModeEnabled) { + logger.info(`Extension host is${isClient() ? '' : ' not'} client`); + logger.warn('Extension host example warning'); + + // `extension-host.ts`'s command handler declarations are in `command.service.ts` so they can be + // picked up by papi-dts + // This map should allow any functions because commands can be any function type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const commandHandlers: { [commandName: string]: (...args: any[]) => any } = { + // Set up test handlers + 'test.addMany': async (...nums: number[]) => { + return nums.reduce((acc, current) => acc + current, 0); + }, + 'test.throwErrorExtensionHost': async (message: string) => { + throw new Error(`Test Error thrown in throwErrorExtensionHost command: ${message}`); + }, + }; + + (async () => { + await Promise.all( + Object.entries(commandHandlers).map(async ([commandName, handler]) => { + // Re-assert type after passing through `map`. + // eslint-disable-next-line no-type-assertion/no-type-assertion + await registerCommand(commandName as CommandNames, handler); + }), + ); + })(); + + (async () => { + const testEH = await networkObjectService.set('testExtensionHost', { + getVerse: async () => { + try { + const exampleData = await (await papiFetch('https://www.example.com')).text(); + const results = `testExtensionHost got data: ${substring(exampleData, 0, 100)}`; + logger.debug(results); + return results; + } catch (e) { + logger.error(`testExtensionHost.getVerse() threw ${e}`); + return getErrorMessage(e); + } + }, + }); + + if (testEH) { + testEH.onDidDispose(() => { + logger.info('testExtensionHost disposed in extension-host'); + }); + } + + setTimeout(testEH.dispose, 10000); + })(); + + setTimeout(async () => { + let testMain = await networkObjectService.get<{ + doStuff: (stuff: string) => Promise; + }>('testMain'); + if (testMain) { + testMain?.onDidDispose(async () => { + logger.debug('testMain disposed in extension-host'); + testMain = undefined; + }); + } else logger.error('Could not get testMain from extension host'); + + logger.debug(`do stuff: ${await testMain?.doStuff('extension host things')}`); + }, 5000); + + // This is just testing dispose on data providers + (async () => { + const testDP = { + setPlaceholder: () => { + throw new Error('I am a bad data provider'); + }, + getPlaceholder: () => { + throw new Error('I am a bad data provider'); + }, + dispose: async () => { + logger.debug('Inside testDP dispose'); + return Promise.resolve(true); + }, + }; + + const realDP = await dataProviderService.registerEngine('platform.placeholder', testDP); + realDP.onDidDispose(() => { + logger.debug('testDP onDidDispose ran'); + }); + setTimeout(realDP.dispose, 3000); + })(); +} + +// #endregion diff --git a/src/extension-host/extension-types/extension-activation-context.model.ts b/src/extension-host/extension-types/extension-activation-context.model.ts new file mode 100644 index 0000000000..433549cc5d --- /dev/null +++ b/src/extension-host/extension-types/extension-activation-context.model.ts @@ -0,0 +1,29 @@ +import { ExecutionToken } from '@node/models/execution-token.model'; +import { UnsubscriberAsyncList } from 'platform-bible-utils'; +import { + ElevatedPrivileges, + // Needed for documentation links to work + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ElevatedPrivilegeNames, +} from '@shared/models/elevated-privileges.model'; + +/** An object of this type is passed into `activate()` for each extension during initialization */ +export type ExecutionActivationContext = { + /** Canonical name of the extension */ + name: string; + /** Used to save and load data by the storage service. */ + executionToken: ExecutionToken; + /** + * Objects that provide special capabilities required by an extension based on the + * `elevatedPrivileges` values listed in its manifest. For example, if an extension needs to be + * able to manage other extensions, then it should include `manageExtensions` in the + * `elevatedPrivileges` array in `manifest.json`. Then when the extension is activated this + * {@link ElevatedPrivileges} object will have the `manageExtensions` property set to an object + * with functions used to manage extensions. + * + * See {@link ElevatedPrivilegeNames} for the full list of elevated privileges available. + */ + elevatedPrivileges: ElevatedPrivileges; + /** Tracks all registrations made by an extension so they can be cleaned up when it is unloaded */ + registrations: UnsubscriberAsyncList; +}; diff --git a/src/extension-host/extension-types/extension-manifest.model.ts b/src/extension-host/extension-types/extension-manifest.model.ts new file mode 100644 index 0000000000..a5acab1085 --- /dev/null +++ b/src/extension-host/extension-types/extension-manifest.model.ts @@ -0,0 +1,50 @@ +import { ElevatedPrivilegeNames } from '@shared/models/elevated-privileges.model'; + +/** Information about an extension provided by the extension developer. */ +export type ExtensionManifest = { + /** Name of the extension */ + name: string; + /** + * Extension version - expected to be [semver](https://semver.org/) like `"0.1.3"`. + * + * Note: semver may become a hard requirement in the future, so we recommend using it now. + */ + version: string; + /** + * Path to the JavaScript file to run in the extension host. Relative to the extension's root + * folder. + * + * Must be specified. Can be an empty string if the extension does not have any JavaScript to run. + */ + main: string; + /** List of special permissions required by the extension to work as intended */ + elevatedPrivileges: `${ElevatedPrivilegeNames}`[]; + /** + * Path to the TypeScript type declaration file that describes this extension and its interactions + * on the PAPI. Relative to the extension's root folder. + * + * If not provided, Platform.Bible will look in the following locations: + * + * 1. `.d.ts` + * 2. `.d.ts` + * 3. `index.d.ts` + * + * See [Extension Anatomy - Type Declaration + * Files](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#type-declaration-files-dts) + * for more information about extension type declaration files. + */ + types?: string; + /** Path to the JSON file that defines the menu items this extension is adding. */ + menus?: string; + /** Path to the JSON file that defines the settings this extension is adding. */ + settings?: string; + /** Path to the JSON file that defines the project settings this extension is adding. */ + projectSettings?: string; + /** Path to the JSON file that defines the localized strings this extension is adding. */ + localizedStrings?: string; + /** + * List of events that occur that should cause this extension to be activated. Not yet + * implemented. + */ + activationEvents: string[]; +}; diff --git a/src/extension-host/extension-types/extension.interface.ts b/src/extension-host/extension-types/extension.interface.ts new file mode 100644 index 0000000000..426b536b73 --- /dev/null +++ b/src/extension-host/extension-types/extension.interface.ts @@ -0,0 +1,21 @@ +import { UnsubscriberAsync } from 'platform-bible-utils'; +import { ExecutionActivationContext } from '@extension-host/extension-types/extension-activation-context.model'; + +/** Interface for all extensions to implement */ +export interface IExtension { + /** + * Sets up this extension! Runs when paranext wants this extension to activate. For example, + * activate() should register commands for this extension + * + * @param context Data and utilities that are specific to this particular extension + */ + activate: (context: ExecutionActivationContext) => Promise; + + /** + * Deactivate anything in this extension that is not covered by the registrations in the context + * object given to activate(). + * + * @returns Promise that resolves to true if successfully deactivated + */ + deactivate?: UnsubscriberAsync; +} diff --git a/src/extension-host/global-this.model.ts b/src/extension-host/global-this.model.ts new file mode 100644 index 0000000000..92f6a92b90 --- /dev/null +++ b/src/extension-host/global-this.model.ts @@ -0,0 +1,39 @@ +/** Module to set up globalThis and polyfills in the extension host */ + +import { LogLevel } from 'electron-log'; +import polyfillLocalStorage from '@node/polyfills/local-storage.polyfill'; +import { + COMMAND_LINE_ARGS, + getCommandLineArgument, + getCommandLineSwitch, +} from '@node/utils/command-line.util'; +import { ProcessType } from '@shared/global-this.model'; +import { isNoisyDevModeEnvVariableSet } from '@node/utils/util'; + +// #region command-line arguments + +const isPackaged = getCommandLineSwitch(COMMAND_LINE_ARGS.Packaged); +const resourcesPath = getCommandLineArgument(COMMAND_LINE_ARGS.ResourcesPath) ?? 'resources://'; +const logLevel = + // Assert the extracted type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + (getCommandLineArgument(COMMAND_LINE_ARGS.LogLevel) as LogLevel) ?? + (isPackaged ? 'error' : 'info'); +globalThis.isNoisyDevModeEnabled = isNoisyDevModeEnvVariableSet(); + +// #endregion + +// #region globalThis setup + +globalThis.processType = ProcessType.ExtensionHost; +globalThis.isPackaged = isPackaged; +globalThis.resourcesPath = resourcesPath; +globalThis.logLevel = logLevel; + +// #endregion + +// #region polyfills + +polyfillLocalStorage(); + +// #endregion diff --git a/src/extension-host/services/asset-retrieval.service.ts b/src/extension-host/services/asset-retrieval.service.ts new file mode 100644 index 0000000000..e69fc9ac9f --- /dev/null +++ b/src/extension-host/services/asset-retrieval.service.ts @@ -0,0 +1,13 @@ +import { readFileBinary } from '@node/services/node-file-system.service'; +import { buildExtensionPathFromName } from '@extension-host/services/extension-storage.service'; +import { startsWith } from 'platform-bible-utils'; + +export type GetAsset = typeof getAsset; + +export default async function getAsset(extensionName: string, assetName: string): Promise { + if (!startsWith(assetName, 'assets/') && !startsWith(assetName, 'assets\\')) { + throw Error('Requests are limited to files in the "assets" directory'); + } + const pathToAsset = buildExtensionPathFromName(extensionName, assetName); + return readFileBinary(pathToAsset); +} diff --git a/src/extension-host/services/create-process.service.ts b/src/extension-host/services/create-process.service.ts new file mode 100644 index 0000000000..a9b11386b0 --- /dev/null +++ b/src/extension-host/services/create-process.service.ts @@ -0,0 +1,71 @@ +import { logger } from '@extension-host/services/papi-backend.service'; +import { PlatformFork, PlatformSpawn } from '@shared/models/create-process-privilege.model'; +import { + ChildProcess, + ChildProcessByStdio, + fork, + ForkOptions, + spawn, + SpawnOptionsWithStdioTuple, + StdioPipe, +} from 'child_process'; +import { Readable, Writable } from 'stream'; +import { buildExtensionPathFromName } from '@extension-host/services/extension-storage.service'; +import { getPathFromUri } from '@node/utils/util'; +import { ExtensionBasicData } from '@shared/models/extension-basic-data.model'; +import executionTokenService from '@node/services/execution-token.service'; +import { ExecutionToken } from '@node/models/execution-token.model'; + +const childProcesses: ChildProcess[] = []; + +export const wrappedSpawn: PlatformSpawn = ( + executionToken: ExtensionBasicData, + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, +): ChildProcessByStdio => { + // Can't specify the argument as ExecutionToken because it would create cyclical type dependencies + // eslint-disable-next-line no-type-assertion/no-type-assertion + if (!executionTokenService.tokenIsValid(executionToken as ExecutionToken)) + throw new Error('Invalid execution token'); + const extensionRootUri = buildExtensionPathFromName(executionToken.name, '/'); + const extensionRootPath = getPathFromUri(extensionRootUri); + options.cwd = extensionRootPath; + const childProcess = spawn(command, args, options); + childProcesses.push(childProcess); + return childProcess; +}; + +export const wrappedFork: PlatformFork = ( + executionToken: ExtensionBasicData, + modulePath: string, + args?: readonly string[], + options?: ForkOptions, +): ChildProcess => { + // Can't specify the argument as ExecutionToken because it would create cyclical type dependencies + // eslint-disable-next-line no-type-assertion/no-type-assertion + if (!executionTokenService.tokenIsValid(executionToken as ExecutionToken)) + throw new Error('Invalid execution token'); + const extensionRootUri = buildExtensionPathFromName(executionToken.name, '/'); + const extensionRootPath = getPathFromUri(extensionRootUri); + if (options) options.cwd = extensionRootPath; + const childProcess = fork(modulePath, args, options ?? { cwd: extensionRootPath }); + childProcesses.push(childProcess); + return childProcess; +}; + +/** Hard kills all child processes that were created by {@link wrappedSpawn} and {@link wrappedFork} */ +export const killChildProcessesFromExtensions = () => { + childProcesses.forEach((process) => { + // Need an explicit 'null' check here since non-null (including 0) has a different meaning + // Non-null means the process is no longer running + // eslint-disable-next-line no-null/no-null + if (process.exitCode !== null) return; + + // On POSIX systems, SIGKILL should immediately terminate the process by the OS. + // On Windows the signal is ignored. Node.js tries to hard kill the process in some other way. + const processInfo = `child process '${process.spawnfile}' (PID ${process.pid})`; + if (!process.kill('SIGKILL')) logger.warn(`Could not send kill signal to ${processInfo}`); + else logger.info(`Sent kill signal to ${processInfo}`); + }); +}; diff --git a/src/extension-host/services/extension-host-web-socket.model.ts b/src/extension-host/services/extension-host-web-socket.model.ts new file mode 100644 index 0000000000..adb7eff66c --- /dev/null +++ b/src/extension-host/services/extension-host-web-socket.model.ts @@ -0,0 +1,7 @@ +import ws from 'ws'; +/** + * Extension-host client uses ws as its WebSocket client, but the renderer can't use it. So we need + * to exclude it from the renderer webpack bundle like this. + */ + +export default ws; diff --git a/src/extension-host/services/extension-storage.service.test.ts b/src/extension-host/services/extension-storage.service.test.ts new file mode 100644 index 0000000000..19d19fe27b --- /dev/null +++ b/src/extension-host/services/extension-storage.service.test.ts @@ -0,0 +1,71 @@ +import fs from 'fs'; +import path from 'path'; +import { createUuid } from '@node/utils/crypto-util'; +import { getAppDir } from '@node/utils/util'; +import { ExecutionToken } from '@node/models/execution-token.model'; +import executionTokenService from '@node/services/execution-token.service'; +import extensionStorageService, { setExtensionUris } from './extension-storage.service'; + +const extensionName = 'storageTestExtName'; +const extensionsBasePath = path.join(getAppDir(), 'test-extensions'); +const thisExtensionBasePath = path.join(extensionsBasePath, 'extensions', extensionName); +const thisUserBasePath = path.join(getAppDir(), extensionName); + +const resourcesUri = 'resources://extensions'; +const testData = 'TEST DATA'; + +const token: ExecutionToken = executionTokenService.registerExtension(extensionName); + +beforeAll(() => { + globalThis.resourcesPath = extensionsBasePath; + fs.mkdirSync(thisExtensionBasePath, { recursive: true }); + fs.mkdirSync(thisUserBasePath, { recursive: true }); + + setExtensionUris(new Map([[extensionName, `${resourcesUri}/${extensionName}`]])); +}); + +afterAll(() => { + try { + fs.rmSync(extensionsBasePath, { recursive: true }); + } catch (error) { + // do nothing + } + try { + fs.rmSync(thisUserBasePath, { recursive: true }); + } catch (error) { + // do nothing + } +}); + +beforeEach(() => { + try { + fs.rmSync(path.join(thisExtensionBasePath, '*.*'), { recursive: false }); + } catch (error) { + // do nothing + } + try { + fs.rmSync(path.join(thisUserBasePath, '*.*'), { recursive: false }); + } catch (error) { + // do nothing + } +}); + +test('Reading extension data works', async () => { + fs.writeFileSync(path.join(thisExtensionBasePath, 'foo.txt'), 'hello, world!'); + const data = await extensionStorageService.readTextFileFromInstallDirectory(token, 'foo.txt'); + expect(data).toEqual('hello, world!'); +}); + +test('reading and writing user data works', async () => { + const key = createUuid(); + await extensionStorageService.writeUserData(token, key, testData); + const data = await extensionStorageService.readUserData(token, key); + expect(data).toEqual(testData); +}); + +test('erasing user data works', async () => { + const key = createUuid(); + await extensionStorageService.writeUserData(token, key, testData); + await extensionStorageService.deleteUserData(token, key); + await expect(extensionStorageService.readUserData(token, key)).rejects.toBeTruthy(); +}); diff --git a/src/extension-host/services/extension-storage.service.ts b/src/extension-host/services/extension-storage.service.ts new file mode 100644 index 0000000000..d9c1e41d85 --- /dev/null +++ b/src/extension-host/services/extension-storage.service.ts @@ -0,0 +1,178 @@ +import { joinUriPaths } from '@node/utils/util'; +import { + readFileText, + readFileBinary, + writeFile, + deleteFile, +} from '@node/services/node-file-system.service'; +import { ExecutionToken } from '@node/models/execution-token.model'; +import executionTokenService from '@node/services/execution-token.service'; +import { Buffer } from 'buffer'; +import { stringLength, includes } from 'platform-bible-utils'; + +// #region Functions that need to be called by other services to initialize this service + +let registeredUrisPerExtension: Map = new Map(); + +/** + * This is only intended to be called by the extension service. This service cannot call into the + * extension service or it causes a circular dependency. + */ +export function setExtensionUris(urisPerExtension: Map) { + registeredUrisPerExtension = urisPerExtension; +} + +// #endregion + +// #region Helper functions + +/** Allow alphanumeric characters and the following: -_.()/\ */ +function isValidFileOrDirectoryName(name: string): boolean { + // Regex with no match returns null + // eslint-disable-next-line no-null/no-null + return name.match(/^[\w\d-_.()/\\]*$/) !== null; +} + +/** Replace any characters that are not alphanumeric or one of the following: -_.() */ +function sanitizeDirectoryName(str: string): string { + return str.replace(/[^\w\d-_.()]/g, '-').trim(); +} + +/** Return a path to the specified file within the extension's installation directory */ +function buildExtensionPathFromToken(token: ExecutionToken, fileName: string): string { + if (!executionTokenService.tokenIsValid(token)) throw new Error('Invalid token'); + return buildExtensionPathFromName(token.name, fileName); +} + +/** Return a path to the specified file within the extension's installation directory */ +export function buildExtensionPathFromName(extensionName: string, fileName: string): string { + const baseUri: string | undefined = registeredUrisPerExtension.get(extensionName); + if (!baseUri) throw new Error(`Extension directory for ${extensionName} is not known`); + + // TODO: If we really care about the potential to jump into other directories, this probably + // needs some work. For example, this doesn't detect symlinks. There might be many other holes. + if (!isValidFileOrDirectoryName(fileName)) throw new Error(`Invalid file name: ${fileName}`); + if (includes(fileName, '..')) throw new Error('Cannot include ".." in the file name'); + + return joinUriPaths(baseUri, fileName); +} + +/** + * Return a path to a file unique to: + * + * 1. The extension identified by the token, + * 2. The current user (as identified by the OS), and + * 3. The key provided by the extension + */ +function buildUserDataPath(token: ExecutionToken, key: string): string { + if (!executionTokenService.tokenIsValid(token)) throw new Error('Invalid token'); + const subDir: string = sanitizeDirectoryName(token.name); + if (!subDir || stringLength(subDir) === 0) throw new Error('Bad extension name'); + + // From https://base64.guru/standards/base64url, the purpose of "base64url" encoding is + // "the ability to use the encoding result as filename or URL address" + const encodedKey: string = Buffer.from(key, 'utf-8').toString('base64url'); + + return joinUriPaths('app://extensions', subDir, 'user-data', encodedKey); +} + +// #endregion + +// #region Functions to be exported + +// TODO: Add functions to read/write to project files once we have something to represent projects + +/** + * Read a text file from the the extension's installation directory + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param fileName Name of the file to be read + * @returns Promise for a string with the contents of the file + */ +async function readTextFileFromInstallDirectory( + token: ExecutionToken, + fileName: string, +): Promise { + return readFileText(buildExtensionPathFromToken(token, fileName)); +} + +/** + * Read a binary file from the the extension's installation directory + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param fileName Name of the file to be read + * @returns Promise for a Buffer with the contents of the file + */ +async function readBinaryFileFromInstallDirectory( + token: ExecutionToken, + fileName: string, +): Promise { + return readFileBinary(buildExtensionPathFromToken(token, fileName)); +} + +/** + * Read data specific to the user (as identified by the OS) and extension (as identified by the + * ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @returns Promise for a string containing the data + */ +async function readUserData(token: ExecutionToken, key: string): Promise { + // This could be changed to some store other than the file system + return readFileText(buildUserDataPath(token, key)); +} + +/** + * Write data specific to the user (as identified by the OS) and extension (as identified by the + * ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @param data Data to be written + * @returns Promise that will resolve if the data is written successfully + */ +async function writeUserData(token: ExecutionToken, key: string, data: string): Promise { + // This could be changed to some store other than the file system + return writeFile(buildUserDataPath(token, key), data); +} + +/** + * Delete data previously written that is specific to the user (as identified by the OS) and + * extension (as identified by the ExecutionToken) + * + * @param token ExecutionToken provided to the extension when `activate()` was called + * @param key Unique identifier of the data + * @returns Promise that will resolve if the data is deleted successfully + */ +async function deleteUserData(token: ExecutionToken, key: string): Promise { + return deleteFile(buildUserDataPath(token, key)); +} + +// #endregion + +// Declare an interface for the object we're exporting so that JSDoc comments propagate +export interface ExtensionStorageService { + readTextFileFromInstallDirectory: typeof readTextFileFromInstallDirectory; + readBinaryFileFromInstallDirectory: typeof readBinaryFileFromInstallDirectory; + readUserData: typeof readUserData; + writeUserData: typeof writeUserData; + deleteUserData: typeof deleteUserData; +} + +/** + * JSDOC SOURCE extensionStorageService + * + * This service provides extensions in the extension host the ability to read/write data based on + * the extension identity and current user (as identified by the OS). This service will not work + * within the renderer. + */ +const extensionStorageService: ExtensionStorageService = { + readTextFileFromInstallDirectory, + readBinaryFileFromInstallDirectory, + readUserData, + writeUserData, + deleteUserData, +}; + +export default extensionStorageService; diff --git a/src/extension-host/services/extension.service.ts b/src/extension-host/services/extension.service.ts new file mode 100644 index 0000000000..490fcaab9a --- /dev/null +++ b/src/extension-host/services/extension.service.ts @@ -0,0 +1,1203 @@ +/** Handles setting up activation of and running of extensions */ + +import chokidar from 'chokidar'; +import JSZip from 'jszip'; +import path from 'path'; +import { IExtension } from '@extension-host/extension-types/extension.interface'; +import * as nodeFS from '@node/services/node-file-system.service'; +import { FILE_PROTOCOL, getPathFromUri, joinUriPaths } from '@node/utils/util'; +import { Uri } from '@shared/data/file-system.model'; +import { getModuleSimilarApiMessage } from '@shared/utils/util'; +import Module from 'module'; +import * as SillsdevScripture from '@sillsdev/scripture'; +import * as platformBibleUtils from 'platform-bible-utils'; +import logger from '@shared/services/logger.service'; +import { getCommandLineArgumentsGroup, COMMAND_LINE_ARGS } from '@node/utils/command-line.util'; +import { setExtensionUris } from '@extension-host/services/extension-storage.service'; +import papi, { network, fetch as papiFetch } from '@extension-host/services/papi-backend.service'; +import executionTokenService from '@node/services/execution-token.service'; +import { ExecutionActivationContext } from '@extension-host/extension-types/extension-activation-context.model'; +import { + debounce, + UnsubscriberAsync, + UnsubscriberAsyncList, + deserialize, + endsWith, + includes, + stringLength, + startsWith, + slice, + JsonDocumentLike, +} from 'platform-bible-utils'; +import LogError from '@shared/log-error.model'; +import { ExtensionManifest } from '@extension-host/extension-types/extension-manifest.model'; +import { menuDocumentCombiner } from '@extension-host/services/menu-data.service-host'; +import menuDataService from '@shared/services/menu-data.service'; +import { localizedStringsDocumentCombiner } from '@extension-host/services/localization.service-host'; +import { settingsDocumentCombiner } from '@extension-host/services/settings.service-host'; +import { PLATFORM_NAMESPACE } from '@shared/data/platform.data'; +import { projectSettingsDocumentCombiner } from '@extension-host/services/project-settings.service-host'; +import { + ElevatedPrivilegeNames, + ElevatedPrivileges, +} from '@shared/models/elevated-privileges.model'; +import { generateHashFromBuffer } from '@node/utils/crypto-util'; +import { + ExtensionIdentifier, + HashValues, + InstalledExtensions, + ManageExtensions, +} from '@shared/models/manage-extensions-privilege.model'; +import { CreateProcess } from '@shared/models/create-process-privilege.model'; +import { wrappedFork, wrappedSpawn } from '@extension-host/services/create-process.service'; +import os from 'os'; + +/** + * The way to use `require` directly - provided by webpack because they overwrite normal `require`. + * https://webpack.js.org/api/module-variables/#**non_webpack_require**-webpack-specific + */ +// eslint-disable-next-line camelcase, no-underscore-dangle +declare const __non_webpack_require__: typeof require; + +/** These are names of extensions that should only be loaded if "noisy dev mode" is enabled */ +const TEST_EXTENSION_NAMES = [ + 'c-sharp-provider-test', + 'evil', + 'helloSomeone', + 'helloWorld', + 'quickVerse', +]; + +/** + * Information about an extension and extra metadata about it that we generate + * + * This is a transformed and frozen version of the extension's {@link ExtensionManifest} + */ +type ExtensionInfo = Readonly< + ExtensionManifest & { + /** + * Uri to this extension's directory. Not provided in actual manifest, but added while parsing + * the manifest + */ + dirUri: Uri; + } +>; + +/** Information about an active extension */ +type ActiveExtension = { + info: ExtensionInfo; + registrations: UnsubscriberAsyncList; +}; + +/** + * A dynamically imported extension module which could be an ES Module or a CommonJS module. + * + * Using webpack's 'commonjs-static' library type as we use in our extensions, the import is the + * extension module with its exports directly in the object; there is no need to go into `default`. + * However, it probably doesn't hurt to support multiple shapes of modules. + */ +type AmbiguousExtensionModule = IExtension | { default: IExtension }; + +/** Information about a DTS file needed for copying it properly */ +type DtsInfo = { + /** Uri to the `.d.ts` file */ + uri: Uri; + /** File name including `.d.ts` */ + base: string; +}; + +/** + * Name of the file describing the extension and its capabilities. Provided by the extension + * developer + */ +const MANIFEST_FILE_NAME = 'manifest.json'; + +/** List of all forbidden extension names. Extensions with these names will not work */ +const FORBIDDEN_EXTENSION_NAMES = ['', PLATFORM_NAMESPACE]; + +/** Save the original `require` function. */ +const requireOriginal = Module.prototype.require; + +// eslint-disable-next-line camelcase +const systemRequire = globalThis.isPackaged ? __non_webpack_require__ : require; + +/** The location where installed extensions are stored. Created if it does not exist for ease of use */ +const installedExtensionsUri: Uri = `app://installed-extensions`; +nodeFS.createDir(installedExtensionsUri); + +/** + * The location where installed extensions may be moved if they are disabled. Created if it does not + * exist for ease of use + */ +const disabledExtensionsUri: Uri = `app://disabled-extensions`; +nodeFS.createDir(disabledExtensionsUri); + +/** The location where we will store decompressed extension ZIP files */ +const userUnzippedExtensionsCacheUri: Uri = 'cache://extensions'; + +/** + * The location where we will copy extension type declaration files for extensions to use in + * development + */ +const userExtensionTypesCacheUri: Uri = 'cache://extension-types'; + +/** Map of extension name to extension that is currently active and running */ +const activeExtensions = new Map(); + +/** Whether this service has finished setting up */ +let isInitialized = false; + +/** Promise that resolves when this service is finished initializing */ +let initializePromise: Promise | undefined; + +/** + * Extensions that are available to us excluding extensions that do not have a JavaScript `main` + * file to run + */ +let availableExtensions: ExtensionInfo[]; + +/** + * Event emitter to tell any extension listening that the extensions finished reloading. The boolean + * indicates whether it succeeded. + */ +let reloadFinishedEventEmitter: platformBibleUtils.PlatformEventEmitter; + +/** Parse string extension manifest into an object and perform any transformations needed */ +function parseManifest(extensionManifestJson: string): ExtensionManifest { + const extensionManifest: ExtensionManifest = deserialize(extensionManifestJson); + + if (includes(extensionManifest.name, '..')) + throw new Error('Extension name must not include `..`!'); + if (FORBIDDEN_EXTENSION_NAMES.some((forbiddenName) => forbiddenName === extensionManifest.name)) + throw new Error(`Extension name '${extensionManifest.name}' forbidden!`); + + if (extensionManifest.main?.toLowerCase().endsWith('.ts')) + // Replace ts with js so people can list their source code ts name but run the transpiled js + extensionManifest.main = `${extensionManifest.main.slice(0, -3)}.js`; + + return extensionManifest; +} + +/** + * The directories we will search for extension directories and zips. + * + * Command-line-provided directories are given priority, so they are provided in this order: + * + * 1. `--extensionDirs`-provided directories + * 2. Installed extensions directory + * + * - In development: `paranext-core/dev-appdata/installed-extensions` + * - In production: `/.platform.bible/installed-extensions` + * 3. Core extensions directory + * + * - In development: `paranext-core/extensions/dist` + * - In production: `resources/extensions` + */ +const extensionRootDirectories: Uri[] = [ + ...getCommandLineArgumentsGroup(COMMAND_LINE_ARGS.ExtensionsDir).map( + (extensionDirPath) => `${FILE_PROTOCOL}${path.resolve(extensionDirPath)}`, + ), + installedExtensionsUri, + `resources://extensions${globalThis.isPackaged ? '' : '/dist'}`, +]; + +/** Individual extension folders and/or zips to load as provided by command-line `--extensions` */ +const commandLineExtensionDirectories: string[] = getCommandLineArgumentsGroup( + COMMAND_LINE_ARGS.Extensions, +).map((extensionPath) => `${FILE_PROTOCOL}${path.resolve(extensionPath)}`); + +/** + * Contents of `nodeFS.readDir()` for all parent folders of extensions. This is expected to be a + * mixture of directories and ZIP files. + * + * Command-line-provided directories are given priority, so they are provided in this order: + * + * 1. `--extensionDirs`-provided directories + * 2. Installed extensions directory + * + * - In development: `paranext-core/dev-appdata/installed-extensions` + * - In production: `/.platform.bible/installed-extensions` + * 3. Core extensions directory + * + * - In development: `paranext-core/extensions/dist` + * - In production: `resources/extensions` + */ +async function getExtensionRootDirectoryContents() { + return Promise.all(extensionRootDirectories.map((extensionUri) => nodeFS.readDir(extensionUri))); +} + +/** + * All of the URIs of ZIP files for extensions we want to load + * + * Command-line-provided extensions are given priority, so they are provided in this order: + * + * 1. `--extensions`-provided extensions + * 2. Extensions in `--extensionDirs`-provided directories + * 3. Extensions in installed extensions directory + * + * - In development: `paranext-core/dev-appdata/installed-extensions` + * - In production: `/.platform.bible/installed-extensions` + * 4. Extensions in core extensions directory + * + * - In development: `paranext-core/extensions/dist` + * - In production: `resources/extensions` + */ +async function getExtensionZipUris(): Promise { + return commandLineExtensionDirectories + .concat( + (await getExtensionRootDirectoryContents()) + .flatMap((dirEntries) => dirEntries[nodeFS.EntryType.File]) + .filter((extensionFileUri) => extensionFileUri), + ) + .filter((extensionFileUri) => endsWith(extensionFileUri.toLowerCase(), '.zip')); +} + +/** + * All of the URIs of extensions to load + * + * Command-line-provided extensions are given priority, so they are provided in this order: + * + * 1. `--extensions`-provided extensions + * 2. Extensions in `--extensionDirs`-provided directories + * 3. Extensions in installed extensions directory + * + * - In development: `paranext-core/dev-appdata/installed-extensions` + * - In production: `/.platform.bible/installed-extensions` + * 4. Extensions in core extensions directory + * + * - In development: `paranext-core/extensions/dist` + * - In production: `resources/extensions` + * 5. Unzipped extensions in the extension cache + * + * Note that all zips have lower priority than all directories instead of being lower than only the + * directories within their categories. This means directory extensions will always be run instead + * of zipped extensions of the same name. + */ +async function getExtensionUrisToLoad(): Promise { + // Get all subdirectories for command line ARG_EXTENSION_DIRS values and bundled extensions + let extensionFolders: Uri[] = (await getExtensionRootDirectoryContents()) + .flatMap((dirEntries) => dirEntries[nodeFS.EntryType.Directory]) + .filter((extensionDirUri) => extensionDirUri); + + // Add in all directories explicitly provided by the ARG_EXTENSIONS command line arguments and + // filter out files + const extensionFolderPromises = commandLineExtensionDirectories + .map((extensionDirPath) => { + const extensionFolder = extensionDirPath.endsWith(MANIFEST_FILE_NAME) + ? extensionDirPath.slice(0, -MANIFEST_FILE_NAME.length) + : extensionDirPath; + return extensionFolder; + }) + .concat(extensionFolders) + .map(async (extensionFolder) => { + return (await nodeFS.getStats(extensionFolder))?.isFile() ? '' : extensionFolder; + }); + + // Remove any explicitly provided ARG_EXTENSIONS values that were files instead of directories + extensionFolders = (await Promise.all(extensionFolderPromises)).filter( + (extensionFolder) => extensionFolder, + ); + + // Now add in the cache directories for all ZIP files + return extensionFolders.concat( + (await getExtensionZipUris()).map((zipUri) => + joinUriPaths(userUnzippedExtensionsCacheUri, path.parse(zipUri).name), + ), + ); +} + +/** + * Process all ZIP file extensions we can find. It might be nice to store unzipped extensions in + * memory, but the ESM loader doesn't make that easy. Store them in the file system. + */ +async function unzipCompressedExtensionFiles(): Promise { + const zipUris = await getExtensionZipUris(); + await Promise.all( + zipUris.map(async (zipUri) => { + try { + await unzipCompressedExtensionFile(zipUri); + } catch (error) { + logger.error(`Failed to unpack extension ZIP file "${zipUri}": ${error}`); + } + }), + ); +} + +/** Unpack a single ZIP file into a known location so we can try to load an extension from it */ +async function unzipCompressedExtensionFile(zipUri: Uri): Promise { + logger.info(`Unpacking zipped extension: ${zipUri}`); + const parsedZipUri: path.ParsedPath = path.parse(zipUri); + const zipData: Buffer = await nodeFS.readFileBinary(zipUri); + const zip: JSZip = await JSZip.loadAsync(zipData); + const zipEntries = Object.entries(zip.files).filter(([, zipObj]) => !zipObj.dir); + + // Make sure there is a manifest.json file present and nothing tries to walk up the directory tree + let zipEntriesInProperDirectory: boolean = true; + let foundManifestFile: boolean = false; + await Promise.all( + zipEntries.map(async ([fileName]) => { + const parsedPath = path.parse(fileName); + if (includes(fileName, '..')) { + logger.warn(`Invalid extension ZIP file entry in "${zipUri}": ${fileName}`); + zipEntriesInProperDirectory = false; + } + if (parsedPath.base === MANIFEST_FILE_NAME) foundManifestFile = true; + }), + ); + if (!zipEntriesInProperDirectory) return; + if (!foundManifestFile) { + logger.warn(`Ignoring extension ZIP file without a manifest: ${zipUri}`); + return; + } + + // Ensure all files from "abc.zip" match corresponding files under "/abc" in the output directory + await Promise.all( + zipEntries.map(async ([fileName, file]) => { + const outputUri = joinUriPaths(userUnzippedExtensionsCacheUri, parsedZipUri.name, fileName); + const outputFileStats = await nodeFS.getStats(outputUri); + if (outputFileStats && BigInt(file.date.getTime()) === outputFileStats.mtimeMs) return; + // The file modify timestamp is different, so just overwrite the file with the one in the ZIP + // We could compare the file size first, but then we would need to hold a big buffer in memory + await nodeFS.writeFile(outputUri, await file.async('nodebuffer')); + await nodeFS.touch(outputUri, new Date(file.date.getTime())); + logger.info(`Wrote extension file to ${outputUri}`); + }), + ); +} + +/** + * Get information for all unique extensions present. + * + * Command-line-provided extensions are given priority, so they are provided in this order: + * + * 1. `--extensions`-provided extensions + * 2. Extensions in `--extensionDirs`-provided directories + * 3. Extensions in installed extensions directory + * + * - In development: `paranext-core/dev-appdata/installed-extensions` + * - In production: `/.platform.bible/installed-extensions` + * 4. Extensions in core extensions directory + * + * - In development: `paranext-core/extensions/dist` + * - In production: `resources/extensions` + * 5. Unzipped extensions in the extension cache + * + * Note that all zips have lower priority than all directories instead of being lower than only the + * directories within their categories. This means directory extensions will always be run instead + * of zipped extensions of the same name. + */ +// TODO: figure out if we can share this code with webpack.util.ts +async function getExtensions(): Promise { + const extensionUris = await getExtensionUrisToLoad(); + const allExtensionInfos = ( + await Promise.allSettled( + extensionUris.map(async (extensionUri) => { + try { + const extensionManifestJson = await nodeFS.readFileText( + joinUriPaths(extensionUri, MANIFEST_FILE_NAME), + ); + // Assert the return type after freeze. + // eslint-disable-next-line no-type-assertion/no-type-assertion + return Object.freeze({ + ...parseManifest(extensionManifestJson), + dirUri: extensionUri, + }) as ExtensionInfo; + } catch (e) { + const error = new Error(`Extension folder ${extensionUri} failed to load. Reason: ${e}`); + logger.warn(error); + throw error; + } + }), + ) + ) + .filter((settled) => { + // Ignore failed to load manifest issues - already logged those issues + if (settled.status !== 'fulfilled') return false; + // Completely ignore extensions that do not have `main` at all as a hint to developers + if (settled.value.main === undefined) { + logger.error( + `Extension ${settled.value.name} failed to load. Must provide property \`main\` in \`manifest.json\`. If you do not have JavaScript code to run, provide \`"main": ""\``, + ); + return false; + } + if (!globalThis.isNoisyDevModeEnabled && TEST_EXTENSION_NAMES.includes(settled.value.name)) + return false; + return true; + }) + // Assert the fulfilled type since the unfulfilled ones have been filtered out. + // eslint-disable-next-line no-type-assertion/no-type-assertion + .map((fulfilled) => (fulfilled as PromiseFulfilledResult).value); + + // Filter out duplicate extensions. Only the first extension encountered in order is used + const extensionInfos: ExtensionInfo[] = []; + allExtensionInfos.forEach((extensionInfo) => { + if ( + !extensionInfos.some((finalExtensionInfo) => finalExtensionInfo.name === extensionInfo.name) + ) + extensionInfos.push(extensionInfo); + }); + + // TODO: Properly sort the order of extensions for activation based on their stated dependencies + // All embedded extensions should probably also be given priority over others. If we want to be + // "fancy" we could use a tree instead of a list and activate functions all on the same level + // concurrently instead of sequentially. For now, manually prioritize some extensions. + extensionInfos.sort((extA, extB) => { + if (extA.name === 'platformScripture') return -1; + if (extB.name === 'platformScripture') return 1; + if (extA.name === 'platformScriptureEditor') return -1; + if (extB.name === 'platformScriptureEditor') return 1; + const extAIsPT = extA.name.startsWith('paratext'); + const extBIsPT = extB.name.startsWith('paratext'); + if (extAIsPT && !extBIsPT) return -1; + if (extBIsPT && !extAIsPT) return 1; + return extA.name < extB.name ? -1 : 1; + }); + + return extensionInfos; +} + +/** + * Creates a `DtsInfo` from a Uri + * + * @param declarationUri The uri to the dts file + * @returns `DtsInfo` for the declaration file at the uri specified + */ +function createDtsInfoFromUri(declarationUri: Uri): DtsInfo { + return { + uri: declarationUri, + base: path.parse(declarationUri).base, + }; +} + +/** + * Caches type declaration files for each extension. Gets the type declaration file from each + * extension and copies it to `extension-types//index.d.ts` + * because that is the path that works. If the extension's type declaration file does not start with + * ``, the folder created will be named `` instead of the name of + * the extension type declaration file name. + * + * We look first at the location provided by the extension manifest's `types` property. If one is + * not provided, we look for files according to the specification in the JSDoc for + * {@link ExtensionManifest}'s `types` property order and copy over the first one found. + * + * @param extensionInfos Extension info for extensions whose types to cache + */ +async function cacheExtensionTypeDeclarations(extensionInfos: ExtensionInfo[]) { + return Promise.all( + extensionInfos.map(async (extensionInfo) => { + /** The default assumed name for the dts file including `.d.ts` */ + const extensionDtsBaseDefault = `${extensionInfo.name}.d.ts`; + /** The declaration file uri we are copying for this extension */ + let extensionDtsInfo: DtsInfo | undefined; + /** The declaration file name we are creating for this extension including `.d.ts` */ + let extensionDtsBaseDestination = extensionDtsBaseDefault; + + // Try using the path to the type declaration file specified in the extension manifest + if (extensionInfo.types) { + const providedDtsUri = joinUriPaths(extensionInfo.dirUri, extensionInfo.types); + const providedDtsStats = await nodeFS.getStats(providedDtsUri); + if (providedDtsStats?.isFile()) { + // The extension's specified dts exists, so use it + extensionDtsInfo = createDtsInfoFromUri(providedDtsUri); + } else + logger.warn( + `Extension ${extensionInfo.name} specified its type declaration file was at ${extensionInfo.types}, but this path does not seem to exist. Trying other options`, + ); + } + + // If the extension manifest's specified types didn't work out for some reason, try to find a + // dts file elsewhere + if (!extensionDtsInfo) { + // Get a list of all the dts files in the extension's root + // Note: checking if the file exists before copying it is generally not great practice as + // it can lead to problems with race conditions. If this ever becomes a problem, we can fix + // this code. + const dtsInfos = ( + await nodeFS.readDir(extensionInfo.dirUri, (entryName) => endsWith(entryName, '.d.ts')) + )[nodeFS.EntryType.File].map(createDtsInfoFromUri); + + if (dtsInfos.length <= 0) { + logger.debug( + `Extension ${extensionInfo.name} does not seem to have any .d.ts files in its root`, + ); + return; + } + + // Try using a dts file whose name matches the name of the extension + if (!extensionDtsInfo) + extensionDtsInfo = dtsInfos.find((dtsInfo) => dtsInfo.base === extensionDtsBaseDefault); + + // Try using a dts file whose name starts with the name of the extension in case they suffixed + // with version number or something + if (!extensionDtsInfo) + extensionDtsInfo = dtsInfos.find((dtsInfo) => + startsWith(dtsInfo.base, extensionInfo.name), + ); + + // Try using a dts file whose name is `index.d.ts` + if (!extensionDtsInfo) + extensionDtsInfo = dtsInfos.find((dtsInfo) => dtsInfo.base === 'index.d.ts'); + + if (!extensionDtsInfo) { + logger.debug( + `Could not find a type declaration file for extension ${extensionInfo.name}. If you are trying to provide one, try specifying its path relative to your extension root folder in your \`manifest.json\`'s \`types\` or naming it \`${extensionInfo.name}.d.ts\` or \`index.d.ts\``, + ); + return; + } + } + + // If the dts file has stuff after the extension name, we want to use it so they can suffix a + // version number or something + if (startsWith(extensionDtsInfo.base, extensionInfo.name)) + extensionDtsBaseDestination = extensionDtsInfo.base; + + // Put the extension's dts in the types cache in its own folder + // Without being put in its own folder, it was being lazy loaded by Intellisense, so its types + // weren't being discovered for some reason. So put it in its own folder whose name is the + // same as the .d.ts file's name so the module name matches. And call it `index.d.ts` because + // naming it something else makes TypeScript lose track of where it is without making a + // package.json for each folder too + const extensionDtsUriDestination = joinUriPaths( + userExtensionTypesCacheUri, + // Folder name must match module name which we are assuming is the same as the name of the + // .d.ts file, so get the .d.ts file's name and use it as the folder name + slice(extensionDtsBaseDestination, 0, -stringLength('.d.ts')), + 'index.d.ts', + ); + + // We found a dts file! Copy it to the appropriate destination + logger.debug( + `Copying Extension ${extensionInfo.name}'s type declaration file ${getPathFromUri( + extensionDtsInfo.uri, + )} to ${getPathFromUri(extensionDtsUriDestination)}`, + ); + await nodeFS.copyFile(extensionDtsInfo.uri, extensionDtsUriDestination); + }), + ); +} + +/** Watch for changes in the extension directories */ +function watchForExtensionChanges(): UnsubscriberAsync { + const reloadExtensionsDebounced = debounce(async (shouldDeactivateExtensions) => { + try { + logger.debug('Reload extensions from watching'); + await reloadExtensions(shouldDeactivateExtensions); + reloadFinishedEventEmitter.emit(true); + } catch (e) { + reloadFinishedEventEmitter.emit(false); + throw new LogError(`Reload extensions from watching failed. Investigate: ${e}`); + } + }); + + const watcher = chokidar + .watch( + extensionRootDirectories + .concat(commandLineExtensionDirectories) + .map((uri) => getPathFromUri(uri)), + { ignoreInitial: true, awaitWriteFinish: true }, + ) + .on('all', async (eventType) => { + let shouldDeactivateExtensions: boolean = true; + if (eventType === 'add' || eventType === 'addDir') shouldDeactivateExtensions = false; + reloadExtensionsDebounced(shouldDeactivateExtensions); + }); + + return async () => { + watcher.close(); + return true; + }; +} + +/** + * Returns a URI we can use with `nodeFS` calls that is an expected filename given a base URI, + * extension name, and extension version. This is not that useful for packaged extensions but is + * important for all other extensions, both enabled and disabled. + */ +function getExtensionUri(baseUri: string, extensionName: string, extensionVersion: string): string { + return `${baseUri}/${extensionName}_${extensionVersion}.zip`; +} + +/** + * Provides extension identifier information based on extension ZIP files names given the naming + * convention used in {@link getExtensionUri} + */ +function extractExtensionDetailsFromFileNames(fileUris: string[]): ExtensionIdentifier[] { + return fileUris.map((fileUri: string) => { + // Splits by either a forward-slash or back-slash to support Windows as well + const fileName = fileUri.split(path.sep).pop(); + if (!fileName?.endsWith('.zip')) throw new Error(`Not a ZIP file: ${fileName}`); + const lastDashIndex = fileName.lastIndexOf('_'); + const extensionName = fileName.substring(0, lastDashIndex); + const extensionVersion = fileName.substring(lastDashIndex + 1, fileName.length - 4); + return { extensionName, extensionVersion }; + }); +} + +/** Extracts extension identifier information from a buffer containing an extension ZIP file */ +async function extractExtensionDetailsFromZip(zipData: Buffer): Promise { + const zip: JSZip = await JSZip.loadAsync(zipData); + const zippedManifest = zip.file(MANIFEST_FILE_NAME); + if (!zippedManifest) throw new Error('no manifest file found in ZIP data'); + // Assert the extracted manifest.json data as the associated type + // eslint-disable-next-line no-type-assertion/no-type-assertion + const manifest = JSON.parse(await zippedManifest.async('string')) as ExtensionManifest; + return { extensionName: manifest.name, extensionVersion: manifest.version }; +} + +/** + * IMPORTANT: ONLY RUN THIS BEFORE EXTENSIONS ARE ACTIVATED + * + * Ensures extension file names match the extension names and versions in their manifest files. This + * only looks at locations where downloaded extensions reside. Packaged extensions and those pointed + * to directly from the command line are unaffected. + */ +async function normalizeExtensionFileNames(): Promise { + const enabledExtensionZipUris = ( + await nodeFS.readDir(installedExtensionsUri, (uri) => uri?.toLowerCase().endsWith('zip')) + ).file; + const enabledExtensionPromises = enabledExtensionZipUris.map(async (enabledZipUri) => { + await normalizeExtensionFileName(installedExtensionsUri, enabledZipUri); + }); + + const disabledExtensionZipUris = ( + await nodeFS.readDir(disabledExtensionsUri, (uri) => uri?.toLowerCase().endsWith('zip')) + ).file; + const disabledExtensionPromises = disabledExtensionZipUris.map(async (disabledZipUri) => { + await normalizeExtensionFileName(disabledExtensionsUri, disabledZipUri); + }); + + await Promise.all(enabledExtensionPromises.concat(disabledExtensionPromises)); +} + +async function normalizeExtensionFileName(baseUri: string, zipUri: string) { + try { + const zipBuffer = await nodeFS.readFileBinary(zipUri); + const { extensionName, extensionVersion } = await extractExtensionDetailsFromZip(zipBuffer); + const expectedUri = getExtensionUri(baseUri, extensionName, extensionVersion); + if (zipUri !== expectedUri) { + await nodeFS.moveFile(zipUri, expectedUri); + logger.info(`Renamed '${extensionName}' ZIP file from ${zipUri} to ${expectedUri}`); + } + } catch (error) { + logger.warn(`Failed to normalize extension file for ${zipUri}: ${error}`); + } +} + +// #region Extension management privileges + +async function installExtension( + extensionUrlToDownload: string, + fileSize: number, + fileHashes: HashValues, +): Promise { + // Make sure a supported hash value was provided + let hashAlgo: string; + let expectedHashValue: string; + if (fileHashes.sha512) { + hashAlgo = 'sha512'; + expectedHashValue = fileHashes.sha512; + } else if (fileHashes.sha256) { + hashAlgo = 'sha256'; + expectedHashValue = fileHashes.sha256; + } else throw new Error(`Missing known hash algorithms from ${JSON.stringify(fileHashes)}`); + + // Download the file and make sure the size and hash values match + const response = await fetch(extensionUrlToDownload); + const extensionBuffer = Buffer.from(await response.arrayBuffer()); + if (extensionBuffer.byteLength !== fileSize) + throw new Error( + `file size mismatch, expected ${JSON.stringify(fileSize)}, actual ${JSON.stringify(extensionBuffer.byteLength)}`, + ); + const hashValue = generateHashFromBuffer(hashAlgo, 'base64', extensionBuffer); + if (expectedHashValue !== hashValue) + throw new Error(`file hash mismatch, expected ${expectedHashValue}, actual ${hashValue}`); + + // Extract information needed from the extension + const { extensionName, extensionVersion } = await extractExtensionDetailsFromZip(extensionBuffer); + if (FORBIDDEN_EXTENSION_NAMES.find((forbiddenName) => extensionName === forbiddenName)) + throw new Error(`Forbidden extension name: ${extensionName}`); + + // Save the extension file in a location where it will be automatically installed + const extensionUri = getExtensionUri(installedExtensionsUri, extensionName, extensionVersion); + if (await nodeFS.getStats(extensionUri)) + logger.warn(`Attempting to overwrite extension ZIP file: ${extensionUri}`); + await nodeFS.writeFile(extensionUri, extensionBuffer); + logger.info(`Installed ${extensionName} ${extensionVersion} from ${extensionUrlToDownload}`); +} + +async function enableExtension(extensionId: ExtensionIdentifier) { + const { extensionName, extensionVersion } = extensionId; + const sourceUri = getExtensionUri(disabledExtensionsUri, extensionName, extensionVersion); + if (!(await nodeFS.getStats(sourceUri))) + throw new Error(`'${extensionName} ${extensionVersion}' is not disabled`); + const destinationUri = getExtensionUri(installedExtensionsUri, extensionName, extensionVersion); + if (await nodeFS.getStats(destinationUri)) + throw new Error(`'${extensionName} ${extensionVersion}' is already enabled`); + await nodeFS.moveFile(sourceUri, destinationUri); + logger.info(`Enabled ${extensionName} ${extensionVersion}`); +} + +async function disableExtension(extensionId: ExtensionIdentifier) { + const { extensionName, extensionVersion } = extensionId; + const sourceUri = getExtensionUri(installedExtensionsUri, extensionName, extensionVersion); + if (!(await nodeFS.getStats(sourceUri))) + throw new Error(`'${extensionName} ${extensionVersion}' does not exist or is not enabled`); + const destinationUri = getExtensionUri(disabledExtensionsUri, extensionName, extensionVersion); + if (await nodeFS.getStats(destinationUri)) + logger.warn(`Attempting to overwrite extension ZIP file: ${destinationUri}`); + await nodeFS.moveFile(sourceUri, destinationUri); + logger.info(`Disabled ${extensionName} ${extensionVersion}`); +} + +async function getInstalledExtensions(): Promise { + // "Enabled" extensions are all the ones in the "installed" directory + const installedExtensionZips = ( + await nodeFS.readDir(installedExtensionsUri, (uri) => uri?.toLowerCase().endsWith('zip')) + ).file; + const enabled = extractExtensionDetailsFromFileNames(installedExtensionZips); + + // "Disabled" extensions are all the ones in the "disabled" directory that aren't also "enabled" + const disabledExtensionZips = ( + await nodeFS.readDir(disabledExtensionsUri, (uri) => uri?.toLowerCase().endsWith('zip')) + ).file; + const disabled = extractExtensionDetailsFromFileNames(disabledExtensionZips).filter( + (disabledId) => + !enabled.find((enabledId) => enabledId.extensionName === disabledId.extensionName), + ); + + // "Packaged" extensions are all the running extensions that aren't "enabled" + const packaged = [...activeExtensions.values()] + .map((active) => { + const packagedId: ExtensionIdentifier = { + extensionName: active.info.name, + extensionVersion: active.info.version, + }; + + return enabled.find((enabledId) => enabledId.extensionName === packagedId.extensionName) + ? undefined + : packagedId; + }) + .filter((identifier) => !!identifier); + + return { + enabled, + disabled, + packaged, + }; +} + +// #endregion + +function prepareElevatedPrivileges(manifest: ExtensionManifest): Readonly { + const retVal: ElevatedPrivileges = { + createProcess: undefined, + manageExtensions: undefined, + }; + if (manifest.elevatedPrivileges?.find((p) => p === ElevatedPrivilegeNames.createProcess)) { + const createProcess: CreateProcess = { + fork: wrappedFork, + spawn: wrappedSpawn, + osData: { + platform: os.platform(), + type: os.type(), + release: os.release(), + }, + }; + Object.freeze(createProcess); + retVal.createProcess = createProcess; + } + if (manifest.elevatedPrivileges?.find((p) => p === ElevatedPrivilegeNames.manageExtensions)) { + const manageExtensions: ManageExtensions = { + installExtension, + enableExtension, + disableExtension, + getInstalledExtensions, + }; + Object.freeze(manageExtensions); + retVal.manageExtensions = manageExtensions; + } + Object.freeze(retVal); + return retVal; +} + +/** + * Loads an extension and runs its activate function. + * + * WARNING: This does not shim functionality out of extensions! Do not run this alone. Only run + * wrapped in activateExtensions(). + * + * @param extension - Extension info for the extension to activate. + * @returns Unsubscriber that deactivates the extension. + */ +async function activateExtension(extension: ExtensionInfo): Promise { + // Import the extension file. Tell webpack to ignore it because extension files are not in the + // bundle and should not be looked up in the bundle. Assert a more ambiguous type. + // DO NOT REMOVE THE webpackIgnore COMMENT. It is a webpack "Magic Comment" https://webpack.js.org/api/module-methods/#magic-comments + // eslint-disable-next-line no-type-assertion/no-type-assertion + const extensionModuleAmbiguous = systemRequire( + /* webpackIgnore: true */ getPathFromUri(extension.dirUri), + ) as AmbiguousExtensionModule; + // Some modules import with their exports directly on the module object, while others put their + // exports in a `default` member on the module. Let's use the module object itself if `activate` + // is on it, and let's go into `default` otherwise. + const extensionModule = + 'activate' in extensionModuleAmbiguous + ? extensionModuleAmbiguous + : extensionModuleAmbiguous.default; + + // IMPORTANT: Only give the token to the extension when it is activated. Don't store it or its + // nonce anywhere else. It is okay to give the token's getHash() value to something for purposes + // of unregistering the extension later. + const executionToken = executionTokenService.registerExtension(extension.name); + const tokenName: string = executionToken.name; + const tokenHash: string = executionToken.getHash(); + + // Build up the context for this particular extension + const context: ExecutionActivationContext = { + name: extension.name, + elevatedPrivileges: prepareElevatedPrivileges(extension), + executionToken, + registrations: new UnsubscriberAsyncList(extension.name), + }; + Object.freeze(context); + + // Activate the extension + await extensionModule.activate(context); + + // Add registrations that the extension didn't explicitly make itself + if (extensionModule.deactivate) context.registrations.add(extensionModule.deactivate); + context.registrations.add(() => executionTokenService.unregisterExtension(tokenName, tokenHash)); + context.registrations.add(() => activeExtensions.delete(extension.name)); + + // Store information about our newly activated extension + const activeExtension: ActiveExtension = { + info: extension, + registrations: context.registrations, + }; + activeExtensions.set(extension.name, activeExtension); + return activeExtension; +} + +/** + * Load extensions and runs their activate functions. + * + * @param extensions Extension info for the extensions we want to activate + * @returns Unsubscriber that deactivates the extension + */ +async function activateExtensions(extensions: ExtensionInfo[]): Promise { + // Filter out the extensions that are already activated, so when new ones are added only the new extension is activated + const extensionsToActivate = + activeExtensions.size > 0 + ? extensions.filter((extension) => activeExtensions.get(extension.name) === undefined) + : extensions; + + /** Include whether that extension has already been imported */ + const extensionsWithCheck = extensionsToActivate.map((extension) => ({ + extension, + hasBeenImported: false, + })); + + // Shim out require so extensions can use it only as prescribed. + // Assert the specific type. + // eslint-disable-next-line no-type-assertion/no-type-assertion + Module.prototype.require = ((moduleName: string) => { + // Allow the extension to import papi and some other things + if (moduleName === '@papi/backend') return papi; + if (moduleName === '@sillsdev/scripture') return SillsdevScripture; + if (moduleName === 'platform-bible-utils') return platformBibleUtils; + + // Figure out if we are doing the import for the extension file in activateExtension + const extensionFile = extensionsWithCheck.find( + (extensionToCheck) => + !extensionToCheck.hasBeenImported && + getPathFromUri(extensionToCheck.extension.dirUri) === moduleName, + ); + + if (extensionFile) { + // The file that is being imported is the extension file, so this hopefully means we are + // importing the extension file in activateExtension. Allow this and mark the extension as + // imported. + // TODO: an extension can probably import another extension's file and mess this up. Maybe try to find a better way + extensionFile.hasBeenImported = true; + return requireOriginal(moduleName); + } + + // Disallow any imports within the extension + // Tell the extension dev if there is an api similar to what they want to import + const message = `Requiring other than papi is not allowed in extensions! ${getModuleSimilarApiMessage( + moduleName, + )}`; + throw new Error(message); + }) as typeof Module.prototype.require; + + // Delete ways to execute arbitrary code https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#unsafe_eval_expressions + // Note: node does not allow strings in setTimeout, setInterval, or setImmediate, so we don't need + // to monkey-patch them https://nodejs.org/api/timers.html#scheduling-timers + // @ts-expect-error we want to remove eval because it can create code from strings + // eslint-disable-next-line no-eval + delete globalThis.eval; + // @ts-expect-error we want to remove Function because it can create code from strings + delete globalThis.Function; + + // Replace fetch with papi.fetch. + // eslint-disable-next-line no-global-assign + globalThis.fetch = papiFetch; + + // @ts-expect-error we want to remove XMLHttpRequest + // eslint-disable-next-line no-global-assign + globalThis.XMLHttpRequest = function XMLHttpRequestForbidden() { + throw new Error('Cannot use XMLHttpRequest! Try using papi.fetch'); + }; + + // @ts-expect-error we want to remove WebSocket + // eslint-disable-next-line no-global-assign + globalThis.WebSocket = function WebSocketForbidden() { + throw new Error('Cannot use WebSocket!'); + }; + + // Import the extensions and run their activate() functions + const extensionsActive: ActiveExtension[] = []; + // This is a case where we want to run through the array in order sequentially + // eslint-disable-next-line no-restricted-syntax + for (const extensionWithCheck of extensionsWithCheck) { + try { + // eslint-disable-next-line no-await-in-loop + const extension = await activateExtension(extensionWithCheck.extension); + extensionsActive.push(extension); + } catch (e) { + logger.error(`Extension '${extensionWithCheck.extension.name}' threw while activating! ${e}`); + } + } + + return extensionsActive; +} + +/** + * Deactivates an active extension. + * + * @param extensionName - Name of the extension. + * @returns `true` if the extension deactivates, `false` if at least one deactivation fails, + * `undefined` otherwise, e.g. not active, not registered. + */ +async function deactivateExtension(extension: ExtensionInfo): Promise { + const activeExtension = activeExtensions.get(extension.name); + + if (!activeExtension) logger.error(`Extension '${extension.name}' has no active extension data.`); + else if (!activeExtension.registrations) + logger.error( + `Extension '${extension.name}' does not have a registrations object to unregister.`, + ); + + const isUnsubscribed = await activeExtension?.registrations?.runAllUnsubscribers(); + if (!isUnsubscribed) + logger.error(`Extension '${extension.name}' was not successfully unsubscribed!`); + + // Delete the extension module from Node's module cache if we previously loaded it. + const moduleKey = systemRequire.resolve(getPathFromUri(extension.dirUri)); + if (moduleKey in systemRequire.cache) delete systemRequire.cache[moduleKey]; + else logger.warn(`Extension '${extension.name}' not found in the module cache to be removed!`); + + return isUnsubscribed; +} + +/** + * Deactivate all given extensions. + * + * @param extensions - Extension info for the extensions we want to deactivate. + * @returns An array of the deactivation results - `true`, `false`, or `undefined`. + */ +async function deactivateExtensions(extensions: ExtensionInfo[]): Promise { + // We want to deactivate extensions sequentially in opposite order of which they were activated + // eslint-disable-next-line no-restricted-syntax + for (const extension of [...extensions].reverse()) { + try { + // eslint-disable-next-line no-await-in-loop + const isDeactivated = await deactivateExtension(extension); + if (!isDeactivated) logger.error(`Extension '${extension.name}' failed to deactivate.`); + } catch (e) { + logger.error(`Extension '${extension.name}' threw while deactivating! ${e}`); + } + } +} + +async function resyncContributions( + extensionsToAdd: Readonly[], +) { + menuDocumentCombiner.deleteAllContributions(); + settingsDocumentCombiner.deleteAllContributions(); + projectSettingsDocumentCombiner.deleteAllContributions(); + localizedStringsDocumentCombiner.deleteAllContributions(); + + // Load up all the extension contributions asynchronously + const extensionsContributions = await Promise.all( + extensionsToAdd.map(async (extension) => { + let localizedStringsDocument: JsonDocumentLike | undefined; + if (extension.localizedStrings) { + try { + // TODO: Provide a way to make sure extensions don't tell us to read files outside their dir + const localizedStringsJson = await nodeFS.readFileText( + joinUriPaths(extension.dirUri, extension.localizedStrings), + ); + localizedStringsDocument = JSON.parse(localizedStringsJson); + } catch (error) { + logger.warn( + `Could not load localized strings contribution for ${extension.name}: ${error}`, + ); + } + } + let menuDocument: JsonDocumentLike | undefined; + if (extension.menus) { + try { + // TODO: Provide a way to make sure extensions don't tell us to read files outside their dir + const menuJson = await nodeFS.readFileText( + joinUriPaths(extension.dirUri, extension.menus), + ); + menuDocument = JSON.parse(menuJson); + } catch (error) { + logger.warn(`Could not load menu contribution for ${extension.name}: ${error}`); + } + } + let settingsDocument: JsonDocumentLike | undefined; + if (extension.settings) { + try { + // TODO: Provide a way to make sure extensions don't tell us to read files outside their dir + const settingsJson = await nodeFS.readFileText( + joinUriPaths(extension.dirUri, extension.settings), + ); + settingsDocument = JSON.parse(settingsJson); + } catch (error) { + logger.warn(`Could not load settings contribution for ${extension.name}: ${error}`); + } + } + let projectSettingsDocument: JsonDocumentLike | undefined; + if (extension.projectSettings) { + try { + // TODO: Provide a way to make sure extensions don't tell us to read files outside their dir + const projectSettingsJson = await nodeFS.readFileText( + joinUriPaths(extension.dirUri, extension.projectSettings), + ); + projectSettingsDocument = JSON.parse(projectSettingsJson); + } catch (error) { + logger.warn( + `Could not load project settings contribution for ${extension.name}: ${error}`, + ); + } + } + + return { + name: extension.name, + localizedStringsDocument, + menuDocument, + settingsDocument, + projectSettingsDocument, + }; + }), + ); + + // Load contributions in the order in which the extensions are loaded + extensionsContributions.forEach( + ({ + name, + localizedStringsDocument, + menuDocument, + settingsDocument, + projectSettingsDocument, + }) => { + if (localizedStringsDocument) + try { + localizedStringsDocumentCombiner.addOrUpdateContribution(name, localizedStringsDocument); + } catch (error) { + logger.warn(`Could not add localized strings contribution for ${name}: ${error}`); + } + if (menuDocument) + try { + menuDocumentCombiner.addOrUpdateContribution(name, menuDocument); + } catch (error) { + logger.warn(`Could not add menu contribution for ${name}: ${error}`); + } + if (settingsDocument) + try { + settingsDocumentCombiner.addOrUpdateContribution(name, settingsDocument); + } catch (error) { + logger.warn(`Could not add settings contribution for ${name}: ${error}`); + } + if (projectSettingsDocument) + try { + projectSettingsDocumentCombiner.addOrUpdateContribution(name, projectSettingsDocument); + } catch (error) { + logger.warn(`Could not add project settings contribution for ${name}: ${error}`); + } + }, + ); + + await menuDataService.rebuildMenus(); +} + +async function reloadExtensions(shouldDeactivateExtensions: boolean): Promise { + if (shouldDeactivateExtensions && availableExtensions) { + await deactivateExtensions(availableExtensions); + } + + await unzipCompressedExtensionFiles(); + + // Get a list of all extensions found + const allExtensions = await getExtensions(); + + // Cache type declarations in development + if (!globalThis.isPackaged) + try { + await cacheExtensionTypeDeclarations(allExtensions); + } catch (e) { + logger.warn(`Could not cache extension type declarations: ${e}`); + } + + // Save extensions that have JavaScript to run + // If main is an empty string, having no JavaScript is intentional. Do not load this extension + availableExtensions = allExtensions.filter((extension) => extension.main); + + // Store their base URIs in the extension storage service + const uriMap: Map = new Map(); + availableExtensions.forEach((extensionInfo) => { + uriMap.set(extensionInfo.name, extensionInfo.dirUri); + logger.info(`Extension ${extensionInfo.name} loaded from ${extensionInfo.dirUri}`); + }); + setExtensionUris(uriMap); + + // Update the menus, settings, etc. - all json contributions the extensions make + await resyncContributions(allExtensions); + + // Active the extensions + await activateExtensions(availableExtensions); +} + +/** + * Sets up the ExtensionService. Runs only once + * + * WARNING: import everything needed before this initialize as `require` becomes limited after. + */ +export const initialize = () => { + if (initializePromise) return initializePromise; + + initializePromise = (async (): Promise => { + if (isInitialized) return; + + reloadFinishedEventEmitter = network.createNetworkEventEmitter( + 'platform.onDidReloadExtensions', + ); + + await normalizeExtensionFileNames(); + + await reloadExtensions(false); + + watchForExtensionChanges(); + + isInitialized = true; + })(); + + return initializePromise; +}; + +/** Get a list of names of all active extensions */ +export const getActiveExtensions = () => { + return [...activeExtensions.keys()]; +}; diff --git a/src/extension-host/services/localization.service-host.test.ts b/src/extension-host/services/localization.service-host.test.ts new file mode 100644 index 0000000000..7f1686d504 --- /dev/null +++ b/src/extension-host/services/localization.service-host.test.ts @@ -0,0 +1,207 @@ +import { testingLocalizationService } from '@extension-host/services/localization.service-host'; +import logger from '@shared/services/logger.service'; +import { SettingNames } from 'papi-shared-types'; +import { LocalizeKey } from 'platform-bible-utils'; + +const MOCK_FILES: { [uri: string]: string } = { + 'resources://assets/localization/en.json': `{ + "%some_localization_key%": "This is the English text for %some_localization_key%.", + "%submitButton%": "Submit" + }`, + 'resources://assets/localization/fr.json': `{ + "%some_localization_key%": "Ceci est le texte en français pour %some_localization_key%.", + "%submitButton%": "Soumettre" + }`, + 'resources://assets/localization/metadata.json': `{ + "%yes%": { + "notes": "A confirmation word used in many places. For example, this may be used as the label on a button on a dialog.", + "fallbackKey": "%confirm%" + }, + "%submit%": { + "fallbackKey": "%yes%" + } + }`, +}; + +jest.mock('@shared/services/settings.service', () => ({ + __esModule: true, + default: { + get(key: SettingName) { + if (key === 'platform.interfaceLanguage') return ['en']; + return undefined; + }, + }, +})); + +jest.mock('@node/services/node-file-system.service', () => ({ + readDir: () => { + const entries: Readonly<{ + file: string[]; + directory: string[]; + unknown: string[]; + }> = { + file: Object.keys(MOCK_FILES), + directory: [], + unknown: [], + }; + return Promise.resolve(entries); + }, + readFileText: (uri: string) => { + const stringContentsOfFile: string = MOCK_FILES[uri]; + return Promise.resolve(stringContentsOfFile); + }, +})); + +jest.mock('@shared/services/logger.service', () => ({ + __esModule: true, + default: { + warn: jest.fn(() => {}), + }, +})); + +let localizationDataProviderEngine: Awaited< + ReturnType +>; +beforeAll(async () => { + localizationDataProviderEngine = + await testingLocalizationService.implementLocalizationDataProviderEngine(); +}); +afterEach(() => { + jest.restoreAllMocks(); +}); + +test('Correct localized value returned to match single localizeKey', async () => { + const LOCALIZE_KEY = '%submitButton%'; + const response = await localizationDataProviderEngine.getLocalizedString({ + localizeKey: LOCALIZE_KEY, + locales: ['fr'], + }); + expect(response).toEqual('Soumettre'); +}); + +test('Correct localized values returned to match array of localizeKeys', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%submitButton%', '%some_localization_key%']; + const response = await localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + locales: ['fr'], + }); + expect(response).toEqual({ + '%submitButton%': 'Soumettre', + '%some_localization_key%': 'Ceci est le texte en français pour %some_localization_key%.', + }); +}); + +test('Key returned with localizeKey that does not exist', async () => { + const LOCALIZE_KEY = '%the_wrong_key%'; + expect( + await localizationDataProviderEngine.getLocalizedString({ + localizeKey: LOCALIZE_KEY, + locales: ['fr'], + }), + ).toEqual('%the_wrong_key%'); + expect(logger.warn).toHaveBeenCalledWith( + 'No localizations found for key or fallback key in any of the given languages for localize key: %the_wrong_key%', + ); +}); + +test('Keys returned with localizeKeys that do not exist', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%the_wrong_key%', '%the_other_wrong_key%']; + expect( + await localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + locales: ['fr'], + }), + ).toEqual({ + '%the_wrong_key%': '%the_wrong_key%', + '%the_other_wrong_key%': '%the_other_wrong_key%', + }); + expect(logger.warn).toHaveBeenCalledWith( + 'No localizations found for key or fallback key in any of the given languages for localize key: %the_wrong_key%', + ); + expect(logger.warn).toHaveBeenCalledWith( + 'No localizations found for key or fallback key in any of the given languages for localize key: %the_other_wrong_key%', + ); +}); + +test('Strings and keys returned with localizeKeys where one exists but the other does not', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%submitButton%', '%the_wrong_key%']; + expect( + await localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + locales: ['fr'], + }), + ).toEqual({ + '%submitButton%': 'Soumettre', + '%the_wrong_key%': '%the_wrong_key%', + }); + expect(logger.warn).toHaveBeenCalledWith( + 'No localizations found for key or fallback key in any of the given languages for localize key: %the_wrong_key%', + ); +}); + +test('Error returned with localizeKey and incorrectly formatted language code', async () => { + const LOCALIZE_KEY = '%submitButton%'; // irrelevant because it will throw for language code before it accesses key/value pairs + await expect( + localizationDataProviderEngine.getLocalizedString({ + localizeKey: LOCALIZE_KEY, + locales: ['IncorrectlyFormattedLang001'], + }), + ).rejects.toThrow('Incorrect locale information provided'); + expect(logger.warn).toHaveBeenCalledWith( + 'getCanonicalLocales failed for IncorrectlyFormattedLang001 with error RangeError: Incorrect locale information provided', + ); +}); + +test('Error returned with localizeKeys and incorrect language code', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%submitButton%', '%some_localization_key%']; // irrelevant because it will throw for language code before it accesses key/value pairs + await expect( + localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + locales: ['Incorrect locale information provided001'], + }), + ).rejects.toThrow('Incorrect locale information provided'); + expect(logger.warn).toHaveBeenCalledWith( + 'getCanonicalLocales failed for Incorrect locale information provided001 with error RangeError: Incorrect locale information provided', + ); +}); + +test('Default language is english when no language provided with localizeKey', async () => { + const LOCALIZE_KEY = '%submitButton%'; + const response = await localizationDataProviderEngine.getLocalizedString({ + localizeKey: LOCALIZE_KEY, + }); + await expect(response).toEqual('Submit'); +}); + +test('Default language is english when no language provided with localizeKeys', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%submitButton%', '%some_localization_key%']; + const response = await localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + }); + expect(response).toEqual({ + '%some_localization_key%': 'This is the English text for %some_localization_key%.', + '%submitButton%': 'Submit', + }); +}); + +test('Good key and missing but valid language code return default English', async () => { + const LOCALIZE_KEY = '%submitButton%'; + globalThis.isPackaged = true; + const response = await localizationDataProviderEngine.getLocalizedString({ + localizeKey: LOCALIZE_KEY, + locales: ['qya-Latn'], + }); + expect(response).toEqual('Submit'); +}); + +test('Good keys and missing but valid language code return default English', async () => { + const LOCALIZE_KEYS: LocalizeKey[] = ['%submitButton%', '%some_localization_key%']; + const response = await localizationDataProviderEngine.getLocalizedStrings({ + localizeKeys: LOCALIZE_KEYS, + locales: ['qya-Latn'], + }); + expect(response).toEqual({ + '%some_localization_key%': 'This is the English text for %some_localization_key%.', + '%submitButton%': 'Submit', + }); +}); diff --git a/src/extension-host/services/localization.service-host.ts b/src/extension-host/services/localization.service-host.ts new file mode 100644 index 0000000000..f53f2a22d3 --- /dev/null +++ b/src/extension-host/services/localization.service-host.ts @@ -0,0 +1,354 @@ +import { + ILocalizationService, + localizationServiceProviderName, + LocalizationData, + LocalizationDataDataTypes, + LocalizationSelector, + LocalizationSelectors, + localizationServiceObjectToProxy, +} from '@shared/services/localization.service-model'; +import dataProviderService from '@shared/services/data-provider.service'; +import IDataProviderEngine, { DataProviderEngine } from '@shared/models/data-provider-engine.model'; +import { DataProviderUpdateInstructions } from '@shared/models/data-provider.model'; +import * as nodeFS from '@node/services/node-file-system.service'; +import { + deserialize, + createSyncProxyForAsyncObject, + LocalizedStringDataContribution, + StringsMetadata, + LocalizeKey, + getCurrentLocale, +} from 'platform-bible-utils'; +import logger from '@shared/services/logger.service'; +import { joinUriPaths } from '@node/utils/util'; +import path from 'path'; +import settingsService from '@shared/services/settings.service'; +import LocalizedStringsDocumentCombiner from '@shared/utils/localized-strings-document-combiner'; + +const LOCALIZATION_ROOT_URI = joinUriPaths('resources://', 'assets', 'localization'); +// BCP 47 validation regex from https://stackoverflow.com/questions/7035825/regular-expression-for-a-language-tag-as-defined-by-bcp47 +const LANGUAGE_CODE_REGEX = + /^(?(?:en-GB-oed|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|t(?:a[oy]|su))|sgn-(?:BE-(?:FR|NL)|CH-DE))|(?:art-lojban|cel-gaulish|no-(?:bok|nyn)|zh-(?:guoyu|hakka|min(?:-nan)?|xiang)))|(?:(?(?:[A-Za-z]{2,3}(?:-(?[A-Za-z]{3}(?:-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-(? + + `; + specificSrcPolicy = `'nonce-${srcNonce}'`; + break; + } + } + + /** + * Content security policy header for the webview - controls what resources scripts and other + * things can access. + * + * Design decisions and guiding principles at + * https://github.com/paranext/paranext/wiki/Content-Security-Policy-Design + * + * DO NOT CHANGE THIS WITHOUT A SERIOUS REASON + * + * Please uncomment the image creation arbitrary code execution in `evil.js`'s WebView when you + * make changes so we can double check it is still successfully blocked. + */ + // default-src 'none' so things can't happen unless we allow them + // script-src-elem allows script tags but not in-line attribute scripts. Using this instead of + // just `script-src` for lower chance of arbitrary code execution (and because index.ejs CSP has + // it) + // 'self' so scripts can be loaded from us + // 'wasm-unsafe-eval' because webview iframes want to use wasm + // papi-extension: so scripts can be loaded from installed extensions + // TODO: this probably doesn't work right now because it is purposely not included in the CSP + // in index.ejs. Test this once we fix webview code to be retrieved from the backend paranext-core#89 + // ${specificSrcPolicy} so we can load the specific scripts needed from the iframe + // style-src allows them to use style/link tags and style attributes on tags + // 'self' so styles can be loaded from us + // papi-extension: so scripts can be loaded from installed extensions + // 'unsafe-inline' because that's how bundled libraries' styles are loaded in :( like MUI + // frame-src determines what iframes can be loaded + // This is derived from the WebViewDefinition's `allowedFrameSources`. WebViews must specify + // the host values they want to be listed here. Since this CSP inherits from the `index.ejs` + // CSP, these values must be within 'self', papi-extension:, and https: + // See `index.ejs` for more info on why these sources are allowed + // object-src 'none' to prevent insecure object and embed until we have a reason to use them + // worker-src determines from where they can run web workers + // 'none' - we can consider changing if someone gives us a reason to run workers in the renderer + // manifest-src determines what manifest can be loaded for this iframe + // for now, inherit 'none' from default-src - not sure why they would need a manifest + // connect-src only communicate over the network through JS APIs as we allow + // 'self' so the iframe can only communicate over the internet with us and not outside the + // iframe + // Note: because webview iframes are on same origin as parent window, they can still use things + // that are imported to their script via the imports string above and can call the parent + // window's objects directly. Objects passed through from the parent window still have full + // internet access. We must essentially assume they can find a way to access the internet + // through the same connect-src as index.ejs. However, it is probably best for them to use only + // things we give them from parent, so might as well keep it restricted here. + // img-src load images + // 'self' so images can be loaded from us + // papi-extension: so images can be loaded from installed extensions + // https: so they can load images over secure connections + // data: so they can load data urls + // media-src load audio, video, etc + // 'self' so media can be loaded from us + // papi-extension: so media can be loaded from installed extensions + // https: so media can be loaded over secure connections + // data: so they can load data urls + // font-src load fonts + // 'self' so fonts can be loaded from us + // papi-extension: so fonts can be loaded from installed extensions + // https: so fonts can be loaded over secure connections + // data: so they can load data urls + // form-action 'self' lets the form submit to us + // TODO: not sure if this is needed. If we can attach handlers to forms, we can probably remove + // this + // navigate-to 'none' prevents them from redirecting this iframe somewhere else + // WARNING: This is experimental and does not work as of July 2023! It is here for future + // compatibility in case they add support for it + const contentSecurityPolicy = ``; + + // Add a script at the start of the head to give access to papi + const headStart = indexOf(webViewContent, '', headStart); + + // Inject the CSP and import scripts into the html if it is not a URL iframe + if (contentType !== WebViewContentType.URL) + webViewContent = `${substring(webViewContent, 0, headEnd + 1)} + ${contentSecurityPolicy} + ${substring(webViewContent, headEnd + 1)}`; + + const finalWebView: WebViewTabProps = { + ...webView, + contentType, + content: webViewContent, + allowScripts, + allowSameOrigin, + allowedFrameSources, + }; + + const finalLayout = (await getDockLayout()).addWebViewToDock(finalWebView, layout); + + // If we received a layout (meaning it created a new webview instead of updating an existing one), + // inform web view consumers that we added a new web view + if (finalLayout) + onDidAddWebViewEmitter.emit({ + webView: convertWebViewDefinitionToSaved(finalWebView), + layout: finalLayout, + }); + else + onDidUpdateWebViewEmitter.emit({ + webView: convertWebViewDefinitionToSaved(finalWebView), + }); + + return webView.id; +}; + +// #endregion + +// #region Initialization + +/** Whether this service has finished setting up */ +let isInitialized = false; + +/** Promise that resolves when this service is finished initializing */ +let initializePromise: Promise | undefined; + +/** Sets up the WebViewService. Runs only once */ +export const initialize = () => { + if (initializePromise) return initializePromise; + + initializePromise = (async (): Promise => { + if (isInitialized) return; + + // Set up subscriptions that the service needs to work + + // We do not want iframes to be able to create their own iframes and scripts in the main window + // context so they cannot execute arbitrary scripts without sandboxing. This prevents them from + // showing modals, navigating to different pages, etc. + // These methods work as of July 2023 + + // Create a MutationObserver that watches the document for added iframes that do not have + // permission to be running and removes them before they execute any code. + const observer = new MutationObserver(removeForbiddenElements); + // We want the observer to watch for all elements added or removed in this document + // This does not pay attention to elements in iframes. They already have sandboxing, so there + // is no need + // We also want to watch the 'src' and 'srcdoc' attributes on iframes to catch forbidden + // iframes + // We don't need to watch the sandbox attribute to make sure it doesn't change because sandbox + // doesn't update unless an iframe is removed and added + // https://stackoverflow.com/a/16135502/8535752 + observer.observe(document, { + subtree: true, + childList: true, + attributeFilter: ['src', 'srcdoc'], + }); + + // #region delete some things on `window` for a quick prevention for same-origin child iframes + // like HTML and React WebViews from doing things we don't want them to do + // We can change these to monkey patches with validation that they are coming from the + // renderer if we need them in the renderer or we can save out variables and use those + + // Following are a number of deletions that correspond to various iframe sandbox values + // as noted in comments. HTML and React WebView iframes have access to these through + // `window.top` because they are on the same origin, so we must prevent access in addition to + // sandboxing + + // Remove the ability to do presentations + // Corresponds to iframe sandbox `allow-presentation` + // `window.navigator` does not have a setter but is configurable, so we redefine the property + Object.defineProperty(window, 'navigator', { + writable: false, + value: new Proxy(globalThis.navigator, { + get(obj, prop) { + if (prop === 'presentation') return undefined; + // Get the property on the object - doesn't matter what it is + // eslint-disable-next-line no-type-assertion/no-type-assertion + return obj[prop as keyof typeof obj]; + }, + }), + }); + + // Remove the ability to show modals + // Corresponds to iframe sandbox `allow-modals` + // @ts-expect-error we want to remove the ability to show modals + delete globalThis.alert; + // @ts-expect-error we want to remove the ability to show modals + delete globalThis.confirm; + // @ts-expect-error we want to remove the ability to show modals + delete globalThis.print; + // @ts-expect-error we want to remove the ability to show modals + delete globalThis.prompt; + + // TODO: Remove the ability to change the screen orientation? https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation/lock + // Corresponds to iframe sandbox `allow-orientation-lock` + + // TODO: Remove the ability to lock the pointer? https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API + // Corresponds to iframe sandbox `allow-pointer-lock` + + // Remove the ability to create popups + // Corresponds to iframe sandbox `allow-popups` + // @ts-expect-error we want to remove the ability to create popups + delete globalThis.open; + // @ts-expect-error we want to remove the ability to create popups + delete globalThis.showModalDialog; + + // #endregion + + // #region monkey patches on `window` to prevent same-origin child iframes like HTML and React + // WebViews from doing things we don't want them to do + // WARNING: calling these requires us to generate a call stack, so all of these things should + // be used as sparingly as possible since they are now less performant than usual + + // Monkey-patch document.createElement so new script tags cannot be added by anything but our + // code (since we load renderer files in chunks) + const createElementOriginal = document.createElement.bind(document); + // If we name this function, we will need to change the regex testing the stack traces, and we + // may also have trouble with minifying production code. Leaving this function unnamed keeps + // things simpler + // eslint-disable-next-line func-names + document.createElement = function (...args: Parameters) { + const [tagNameCaps] = args; + + const tagName = tagNameCaps.toLowerCase(); + if (FORBIDDEN_HTML_TAGS.includes(tagName) || RESTRICTED_HTML_TAGS.includes(tagName)) { + const stackTrace = Error().stack ?? ''; + const isInRenderer = getRendererScriptRegex().test(stackTrace); + if (isInRenderer) { + logger.debug( + `Allowed ${tagName} on renderer document. If this isn't recognized, this is a very serious security violation.\nStack: ${stackTrace}`, + ); + } else { + const message = `Rejected creating new ${tagName} tag on renderer document! Not allowed.\nStack: ${stackTrace}`; + // LogError puts an error in the console and throws an error. We don't want to scare + // anyone with the script and iframe tags evil adds to test this feature, so let's not + // log an error in development. But no exceptions when packaged + if (globalThis.isPackaged || !stackTrace.includes('at evil.web-view.html')) + throw new LogError(message); + throw new Error(message); + } + } + return createElementOriginal(...args); + }; + + // #endregion + + isInitialized = true; + })(); + + return initializePromise; +}; + +// #endregion + +const papiWebViewService: WebViewServiceType = { + onDidAddWebView, + onDidUpdateWebView, + getWebView, + getSavedWebViewDefinition, +}; + +async function openProjectSettingsTab(webViewId: string): Promise { + const settingsTabId = newGuid(); + const projectIdFromWebView = (await getSavedWebViewDefinition(webViewId))?.projectId; + + if (!projectIdFromWebView) return undefined; + + return addTab( + { + id: settingsTabId, + tabType: TAB_TYPE_PROJECT_SETTINGS_TAB, + data: { + projectId: projectIdFromWebView, + }, + }, + { + type: 'float', + position: 'center', + floatSize: { height: 400, width: 500 }, + }, + ); +} + +async function openUserSettingsTab(): Promise { + const settingsTabId = newGuid(); + + return addTab( + { + id: settingsTabId, + tabType: TAB_TYPE_USER_SETTINGS_TAB, + data: {}, + }, + { + type: 'float', + position: 'center', + floatSize: { height: 400, width: 500 }, + }, + ); +} + +/** Register the network object that backs the PAPI webview service */ +// To use this service, you should use `web-view.service.ts` +export async function startWebViewService(): Promise { + await initialize(); + await networkObjectService.set( + NETWORK_OBJECT_NAME_WEB_VIEW_SERVICE, + papiWebViewService, + ); + + // This map should allow any functions because commands can be any function type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const commandHandlers: { [commandName: string]: (...args: any[]) => any } = { + 'platform.openProjectSettings': openProjectSettingsTab, + 'platform.openUserSettings': openUserSettingsTab, + }; + + Object.entries(commandHandlers).forEach(([commandName, handler]) => { + // Re-assert type after passing through `forEach`. + // eslint-disable-next-line no-type-assertion/no-type-assertion + registerCommand(commandName as CommandNames, handler); + }); +} diff --git a/src/renderer/styles/_vars.scss b/src/renderer/styles/_vars.scss new file mode 100644 index 0000000000..a3e834b618 --- /dev/null +++ b/src/renderer/styles/_vars.scss @@ -0,0 +1,27 @@ +/* COLOR */ +$color--platform-bible: #a70e13; +$color--paratext-bible: #89ae26; + +$color--pt9-lightgreen: #b8d432; +$color--pt9-darkgreen: #3f511e; +$color--pt9-darkgray: #4c4c4c; + +$color--text: hsl(var(--foreground)); +$color--shadow: var(--divider, rgba(0, 0, 0, 0.5)); + +$color--background: hsl(var(--muted)); +$color--active-tab: hsl(var(--background)); +$color--inactive-tab: $color--background; + +$color--border: var(--divider, rgba(0, 0, 0, 0.12)); + +/* SPACING */ +$space--xxs: 2px; +$space--xs: 4px; +$space--s: 8px; +$space--m: 16px; +$space--l: 36px; + +/* OTHER */ +$border-width: 1px; +$font-family: 'Roboto medium', sans-serif; diff --git a/src/renderer/testing/about-panel.component.tsx b/src/renderer/testing/about-panel.component.tsx new file mode 100644 index 0000000000..6e2491dc06 --- /dev/null +++ b/src/renderer/testing/about-panel.component.tsx @@ -0,0 +1,48 @@ +import { useLocalizedStrings } from '@renderer/hooks/papi-hooks'; +import { SavedTabInfo, TabInfo } from '@shared/models/docking-framework.model'; +import { ReactComponent as InlineLogoAndName } from '@assets/Lockup Inline.svg'; +import { formatReplacementString, LocalizeKey } from 'platform-bible-utils'; +import PackageInfo from '../../../release/app/package.json'; + +export const TAB_TYPE_ABOUT = 'about'; + +const STRING_KEYS: LocalizeKey[] = [ + '%product_name%', + '%about_versionLabel_format%', + '%about_licenseLabel_format%', +]; + +export default function AboutPanel() { + const [ + { + '%product_name%': productName, + '%about_versionLabel_format%': versionLabelFormat, + '%about_licenseLabel_format%': licenseLabelFormat, + }, + ] = useLocalizedStrings(STRING_KEYS); + + // logger.info()); + + return ( +
    +
    + +

    {productName}

    +

    Copyright © 2022-2024 SIL International

    +

    {formatReplacementString(versionLabelFormat, PackageInfo)}

    +

    {formatReplacementString(licenseLabelFormat, PackageInfo)}

    +

    {PackageInfo.description}

    +
    +
    + ); +} + +export function loadAboutTab(savedTabInfo: SavedTabInfo): TabInfo { + return { + ...savedTabInfo, + tabTitle: 'About', + content: , + minWidth: 230, + minHeight: 230, + }; +} diff --git a/src/renderer/testing/lorem-ipsum.ts b/src/renderer/testing/lorem-ipsum.ts new file mode 100644 index 0000000000..4c2db08eb9 --- /dev/null +++ b/src/renderer/testing/lorem-ipsum.ts @@ -0,0 +1,21 @@ +const LOREM_IPSUM = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam convallis aliquet justo vitae vehicula. Vestibulum tincidunt porttitor urna, non scelerisque nibh commodo quis. Nunc vel porta nisl, in maximus massa. Donec convallis sem in magna iaculis, ut sagittis lectus semper. Aliquam pellentesque orci et scelerisque egestas. Sed ac vehicula arcu. Etiam rutrum sapien risus, a venenatis urna accumsan sit amet. In vel turpis vitae risus tristique tincidunt. Aenean et leo vel lacus venenatis bibendum. Donec semper libero sed purus efficitur, condimentum lacinia odio rhoncus. Proin et quam magna. Cras risus arcu, dictum vel sapien a, accumsan lacinia est. Pellentesque sit amet dolor nec ex pellentesque aliquam. Mauris eget libero gravida, egestas orci sed, feugiat erat. + +Fusce eget mattis eros. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean consectetur turpis urna, ut ullamcorper tortor ultricies non. Phasellus nec bibendum quam, eget rutrum dolor. Integer vel tempor neque. Suspendisse id mollis nisl. Nunc finibus ac enim sed congue. Vivamus ac accumsan turpis. + +Aliquam eu tempor nibh. Curabitur scelerisque tortor purus, volutpat efficitur magna pellentesque sit amet. Curabitur id pulvinar sem, vel porta eros. Maecenas nunc urna, imperdiet nec lobortis eget, rutrum a neque. Suspendisse eu vulputate lorem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam dictum at ante ut dignissim. Sed tempor tempus odio id varius. Praesent eu neque leo. Mauris bibendum dui sollicitudin, imperdiet justo ut, porttitor justo. Nulla feugiat mi id dictum feugiat. Duis feugiat arcu risus, a tincidunt ex faucibus sed. Donec egestas lectus sit amet tincidunt maximus. Mauris scelerisque, mauris suscipit dapibus pretium, nisi nulla dignissim metus, elementum tincidunt massa ipsum vel velit. + +Donec sit amet felis leo. Duis vitae sem id libero sodales iaculis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis eu dolor condimentum, pretium libero quis, ornare sapien. Nullam efficitur ornare ipsum nec tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla iaculis ultrices lacus in sagittis. Maecenas facilisis fringilla turpis ac cursus. Duis commodo fringilla dui. + +Fusce convallis massa nec lectus venenatis vulputate vel id justo. Donec vel mauris orci. Suspendisse finibus accumsan lacus a feugiat. Pellentesque interdum pellentesque orci, at ultrices ipsum aliquam a. Curabitur scelerisque, diam nec commodo vestibulum, neque nisl feugiat lorem, et iaculis nisl mi sit amet dui. Mauris ut nisl viverra, mollis felis id, aliquet tellus. Praesent ullamcorper faucibus lectus, maximus pellentesque mi vehicula et. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas metus felis, interdum nec urna sed, sodales ornare eros. Quisque volutpat justo sed sem aliquet, in fermentum lectus feugiat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Integer quis ultricies lacus, euismod placerat dolor. Donec tempor ullamcorper ex, sit amet euismod ligula pharetra sed. Fusce sagittis molestie odio et iaculis. Nullam id dolor aliquet risus venenatis congue eget id erat. Ut eget vulputate est, nec luctus quam. + +Mauris nec condimentum nulla, eu malesuada lectus. Integer blandit tellus eu sem gravida aliquam. Donec convallis lacinia ante in porta. Aliquam nec felis suscipit, efficitur mi non, convallis diam. Etiam in mollis nisi. Cras pellentesque luctus justo, vel convallis elit eleifend ut. Ut pulvinar nisl urna, in volutpat dui facilisis a. Sed in imperdiet ligula. Praesent feugiat neque nibh, non eleifend ex vestibulum in. + +Mauris auctor nibh at magna posuere commodo. Maecenas sit amet fermentum lorem, eu rhoncus augue. Aenean eu urna ultricies, consequat augue nec, eleifend libero. Nunc eu diam sagittis, condimentum quam quis, vestibulum leo. Pellentesque nec ante in purus lacinia luctus. In non gravida tellus. Duis quam erat, faucibus at pharetra eu, blandit a nunc. Sed felis quam, bibendum a orci id, sodales facilisis mauris. Fusce feugiat nisi nulla, ut vehicula mauris pulvinar in. Aliquam scelerisque faucibus risus et dignissim. Suspendisse ut finibus mi. Proin finibus aliquet feugiat. Sed et tortor vestibulum, pharetra libero in, facilisis quam. Etiam bibendum efficitur ligula id congue. Suspendisse sit amet sapien ac nisl maximus ullamcorper id eget ante. + +Aliquam consequat elit et rhoncus porttitor. Sed condimentum pulvinar lorem, at varius ante laoreet ut. Suspendisse egestas euismod lorem, quis pretium odio iaculis eu. Aliquam erat volutpat. Cras faucibus, elit quis scelerisque vestibulum, est justo pharetra urna, et sodales augue magna a leo. Fusce eu massa convallis, commodo sapien quis, sagittis ex. Ut quis mattis erat. Ut purus massa, varius sit amet tempus efficitur, cursus eleifend velit. Aliquam a ipsum eu velit dictum semper. Nulla dignissim at tellus nec interdum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse sed ultrices dui. Sed rhoncus turpis elit, eget pharetra ligula pharetra ut. + +Quisque quis est nec orci aliquet dictum id vulputate turpis. Ut nisl sapien, aliquam sed pulvinar sed, dignissim ac ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Fusce auctor odio facilisis purus porta ullamcorper. Morbi tincidunt lorem ac orci hendrerit, eget sollicitudin metus sagittis. Nunc pellentesque justo quis massa interdum congue. Praesent a ultrices justo. + +Suspendisse laoreet metus a malesuada laoreet. Aliquam erat volutpat. Nam sagittis mattis rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc eget tempor felis. Sed ultricies justo vitae lorem elementum, sit amet tincidunt lorem imperdiet. Maecenas id porta mauris, eu auctor augue. Vestibulum ultrices erat at augue tempus malesuada. Aliquam facilisis urna at lectus feugiat, sit amet porta erat sagittis. Nulla interdum condimentum leo vitae dictum. Donec semper suscipit auctor. Nunc a nibh arcu. Integer vehicula magna vel augue scelerisque tempus. Aenean hendrerit sem et mi sollicitudin, vel dignissim libero fringilla. Nam at interdum elit.`; + +export default LOREM_IPSUM; diff --git a/src/renderer/testing/test-buttons-panel.component.css b/src/renderer/testing/test-buttons-panel.component.css new file mode 100644 index 0000000000..94006a27c2 --- /dev/null +++ b/src/renderer/testing/test-buttons-panel.component.css @@ -0,0 +1,27 @@ +.buttons-panel { + overflow-y: auto; +} + +.test-button { + background-color: white; + padding: 10px 20px; + border-radius: 10px; + border: 0; + appearance: none; + font-size: 1.3rem; + box-shadow: + 0 8px 28px -6px rgba(24, 39, 75, 0.12), + 0 18px 88px -4px rgba(24, 39, 75, 0.14); + transition: all ease-in 0.1s; + cursor: pointer; + opacity: 0.9; +} + +.test-button:hover { + transform: scale(1.05); + opacity: 1; +} + +.scr-verse-text-area { + width: 85%; +} diff --git a/src/renderer/testing/test-buttons-panel.component.tsx b/src/renderer/testing/test-buttons-panel.component.tsx new file mode 100644 index 0000000000..1d4a977938 --- /dev/null +++ b/src/renderer/testing/test-buttons-panel.component.tsx @@ -0,0 +1,313 @@ +import './test-buttons-panel.component.css'; +import { Button, TextField, useEvent } from 'platform-bible-react'; +import { useCallback, useMemo, useState } from 'react'; +import * as networkService from '@shared/services/network.service'; +import * as commandService from '@shared/services/command.service'; +import { debounce, getErrorMessage, isString, serialize } from 'platform-bible-utils'; +import logger from '@shared/services/logger.service'; +import { SavedTabInfo, TabInfo } from '@shared/models/docking-framework.model'; +import useData from '@renderer/hooks/papi-hooks/use-data.hook'; +import useDataProvider from '@renderer/hooks/papi-hooks/use-data-provider.hook'; + +export const TAB_TYPE_BUTTONS = 'buttons'; + +const testBase: (message: string) => Promise = + networkService.createRequestFunction('electronAPI:env.test'); + +const test = async () => { + /* const start = performance.now(); */ + const result = await testBase('stuff'); + /* logger.info(`Test took ${performance.now() - start} ms`); */ + return result; +}; + +const addOne = async (num: number) => commandService.sendCommand('test.addOne', num); + +const echo = commandService.createSendCommandFunction('test.echo'); + +const echoExtensionHost = commandService.createSendCommandFunction('test.echoExtensionHost'); + +const addMany = commandService.createSendCommandFunction('test.addMany'); + +const helloWorld = commandService.createSendCommandFunction('helloWorld.helloWorld'); + +const throwErrorHelloWorld = commandService.createSendCommandFunction('helloWorld.helloException'); + +const helloSomeone = commandService.createSendCommandFunction('helloSomeone.helloSomeone'); + +const throwError = commandService.createSendCommandFunction('test.throwError'); + +const throwErrorExtensionHost = commandService.createSendCommandFunction( + 'test.throwErrorExtensionHost', +); + +const executeMany = async (fn: () => Promise) => { + const numRequests = 10000; + const requests = new Array>(numRequests); + const requestTime = new Array(numRequests); + const start = performance.now(); + for (let i = 0; i < numRequests; i++) { + requestTime[i] = performance.now(); + requests[i] = fn() + .then((response) => { + requestTime[i] = performance.now() - requestTime[i]; + return response; + }) + .catch(logger.error); + } + + try { + const responses = await Promise.all(requests); + const finish = performance.now(); + + const avgResponseTime = requestTime.reduce((sum, time) => sum + time, 0) / numRequests; + const maxTime = requestTime.reduce((max, time) => Math.max(max, time), 0); + const minTime = requestTime.reduce((min, time) => Math.min(min, time), Number.MAX_VALUE); + logger.debug( + `Of ${numRequests} requests:\n\tAvg response time: ${avgResponseTime} ms\n\tMax response time: ${maxTime} ms\n\tMin response time: ${minTime}\n\tTotal time: ${ + finish - start + }`, + ); + logger.debug(responses[responses.length - 1]); + } catch (e) { + logger.error(e); + } +}; + +export default function TestButtonsPanel() { + const [promiseReturn, setPromiseReturn] = useState('Click a button.'); + const updatePromiseReturn = useCallback( + (state: unknown) => setPromiseReturn(isString(state) ? state : serialize(state)), + [], + ); + + const [addOneResult, setAddOneResult] = useState(0); + + const runPromise = useCallback( + async (asyncFn: () => Promise) => { + try { + const result = await asyncFn(); + logger.debug(result); + updatePromiseReturn(result); + return result; + } catch (e) { + logger.error(e); + updatePromiseReturn(`Error: ${getErrorMessage(e)}`); + return undefined; + } + }, + [updatePromiseReturn], + ); + + useEvent( + networkService.onDidClientConnect, + useCallback( + ({ clientId, didReconnect }) => { + const result = `Client with id ${clientId} ${didReconnect ? 're' : ''}connected!`; + logger.debug(result); + updatePromiseReturn(result); + }, + [updatePromiseReturn], + ), + ); + + const [verseRef, setVerseRef] = useState('JHN 11:35'); + // Displayed verse ref while debouncing the actual verse ref + const [verseRefIntermediate, setVerseRefIntermediate] = useState(verseRef); + const setVerseRefDebounced = useMemo( + () => + debounce((newVerseRef: string) => { + setVerseRef(newVerseRef); + setVerseRefIntermediate(newVerseRef); + }, 250), + [], + ); + const updateVerseRef = useCallback( + (newVerseRef: string) => { + setVerseRefDebounced(newVerseRef); + setVerseRefIntermediate(newVerseRef); + }, + [setVerseRefDebounced], + ); + + // Test a method on a data provider engine that isn't on the interface to see if you can actually do this + const [hasTestedRandomMethod, setHasTestedRandomMethod] = useState(false); + const peopleDataProvider = useDataProvider('helloSomeone.people'); + if (!hasTestedRandomMethod && peopleDataProvider) { + setHasTestedRandomMethod(true); + (async () => { + try { + const result = await peopleDataProvider.testRandomMethod('from test buttons panel'); + logger.debug(result); + } catch (e) { + logger.error(e); + } + + try { + // Test to make sure we literally can't run updates from outside the data provider + // @ts-ignore ts(2339) + const result = await peopleDataProvider.notifyUpdate(); + logger.error(`Remote notify update succeeded! Bad ${result}`); + } catch (e) { + // No need to log good stuff unless we're testing + // logger.info(`Remote notify update failed! Good ${e}`); + } + })(); + } + + // We need to tell the useData.Verse hook what types we are using, so we get the Verse data types + // from the quick verse data types + const [verseText, setVerseText, verseTextIsLoading] = useData('quickVerse.quickVerse').Verse( + verseRef, + 'Verse text goes here', + ); + + return ( +
    +
    + { + updateVerseRef(e.target.value); + }} + /> + {verseTextIsLoading ? 'Loading verse' : 'Finished loading verse'} +